/************************************************************************
* I.MX6 shutdown by software
* 声明:
* 有时候我们的系统可能并没有像手机那样的开关机键,所以我么这个时候
* 需要提供软件关机功能,本文直接通过JNI操作设备节点进行控制,并没有采用
* STUB来控制,当然目前对这块的操作也不熟练。
*
* 2015-12-20 深圳 南山平山村 曾剑锋
***********************************************************************/ \\\\\\\\\\\\\\-*- 目录 -*-///////////////
| 一、参考文档:
| 二、修改按键驱动程序:
| 三、板级文件注册按键设备:
| 四、添加shutdown设备节点,便于控制:
| 五、关闭关机时的提示框:
| 六、关闭watchdog:
| 七、使用JNI进行测试:
| 八、JNI对应的Java文件:
---------------------------------------- 一、参考文档:
Android开发 调用系统隐藏API
http://www.pocketdigi.com/20130519/1058.html
定做Android关机界面
http://233.io/article/1019041.html
Android下实现自动关机的方法总结
http://233.io/article/1019041.html 二、修改按键驱动程序:
cat drivers/input/keyboard/gpio_keys.c
......
//主要是为了能够指向input的设备,我们能够在自己函数里实现单独控制
struct input_dev *this_input;
......
/* 添加这个我们自己的函数,并声明为系统全局符号 */
void this_input_report_event(int mode)
{
unsigned int type = EV_KEY; switch (mode) {
case :
// for power off
input_event(this_input, type, KEY_POWER, );
input_sync(this_input); msleep(); input_event(this_input, type, KEY_POWER, );
input_sync(this_input);
break;
case :
// for stand by
input_event(this_input, type, KEY_POWER, );
input_sync(this_input);
input_event(this_input, type, KEY_POWER, );
input_sync(this_input);
break;
case :
// for stand by and wake up
input_event(this_input, type, KEY_POWER, );
input_sync(this_input);
input_event(this_input, type, KEY_POWER, );
input_sync(this_input);
input_event(this_input, type, KEY_POWER, );
input_sync(this_input);
input_event(this_input, type, KEY_POWER, );
input_sync(this_input);
break;
default:
break;
}
}
EXPORT_SYMBOL(this_input_report_event);
......
static int __devinit gpio_keys_probe(struct platform_device *pdev)
{
......
input = input_allocate_device(); this_input = input; //添加这一行,为了能向上发送按键事件 if (!ddata || !input) {
dev_err(dev, "failed to allocate state\n");
error = -ENOMEM;
goto fail1;
}
......
}
...... 三、板级文件注册按键设备:
cat arch/arm/mach-mx6/board-mx6q_sabresd.c
......
//这里随意改的,只要不和其他引脚有冲突就行
#define SABRESD_POWER_OFF IMX_GPIO_NR(3, 29)
......
static struct gpio_keys_button new_sabresd_buttons[] = {
//GPIO_BUTTON(SABRESD_VOLUME_UP, KEY_VOLUMEUP, 1, "volume-up", 0, 1),
//GPIO_BUTTON(SABRESD_VOLUME_DN, KEY_VOLUMEDOWN, 1, "volume-down", 0, 1),
GPIO_BUTTON(SABRESD_POWER_OFF, KEY_POWER, , "power-key", , ),
};
...... 四、添加shutdown设备节点,便于控制:
cat drivers/input/keyboard/shutdown.c
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/gpio.h>
#include <linux/miscdevice.h> /** switch case are in gpio_key.c */
#define THIS_INPUT_SHUTDOWN_SOFTWARE 1
#define THIS_INPUT_STANBY_SOFTWARE 2
#define THIS_INPUT_STANBY_AND_WAKEUP_SOFTWARE 3 extern void this_input_report_event(int mode); static int shutdown_open(struct inode *inode, struct file *file)
{
return ;
} static int shutdown_close(struct inode *inode, struct file *file)
{
return ;
} static ssize_t shutdown_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
{
return ;
} long shutdown_ioctl(struct file * file, unsigned int cmd, unsigned long arg)
{
this_input_report_event(cmd);
} struct file_operations shutdown_fops = {
.owner = THIS_MODULE,
.open = shutdown_open,
.release = shutdown_close,
.read = shutdown_read,
.unlocked_ioctl = shutdown_ioctl,
}; struct miscdevice shutdown_misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = "shutdown",
.fops = &shutdown_fops,
}; int __init shutdown_init(void)
{
int ret; ret = misc_register(&shutdown_misc);
if(ret)
printk("register shutdown FAILED!\n"); return ret;
} void __exit shutdown_exit(void)
{
misc_deregister(&shutdown_misc);
} module_init(shutdown_init);
module_exit(shutdown_exit); MODULE_LICENSE("GPL"); 五、关闭关机时的提示框:
cat frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
......
public class PhoneWindowManager implements WindowManagerPolicy {
......
private final Runnable mPowerLongPress = new Runnable() {
@Override
public void run() {
// The context isn't read
if (mLongPressOnPowerBehavior < ) {
mLongPressOnPowerBehavior = mContext.getResources().getInteger(
com.android.internal.R.integer.config_longPressOnPowerBehavior);
}
int resolvedBehavior = mLongPressOnPowerBehavior;
if (FactoryTest.isLongPressOnPowerOffEnabled()) {
resolvedBehavior = LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM;
} switch (resolvedBehavior) {
case LONG_PRESS_POWER_NOTHING:
break;
case LONG_PRESS_POWER_GLOBAL_ACTIONS:
mPowerKeyHandled = true;
if (!performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false)) {
performAuditoryFeedbackForAccessibilityIfNeed();
}
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
//注释这一样
//showGlobalActionsDialog();
//添加这一行
mWindowManagerFuncs.shutdown(resolvedBehavior == LONG_PRESS_POWER_SHUT_OFF);
break;
case LONG_PRESS_POWER_SHUT_OFF:
case LONG_PRESS_POWER_SHUT_OFF_NO_CONFIRM:
mPowerKeyHandled = true;
performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
mWindowManagerFuncs.shutdown(resolvedBehavior == LONG_PRESS_POWER_SHUT_OFF);
break;
}
}
};
......
}
...... 六、关闭watchdog:
cat drivers/watchdog/imx2_wdt.c
......
// 这里主要是I.MX6的watchdog是一旦打开,就不能关闭的,所以在这里想了个办法,堵住,看上去堵住了
static void imx2_wdt_shutdown(struct platform_device *pdev)
{
if (test_bit(IMX2_WDT_STATUS_STARTED, &imx2_wdt.status)) {
/* we are running, we need to delete the timer but will give
* max timeout before reboot will take place */
del_timer_sync(&imx2_wdt.timer); //注释这两行
//imx2_wdt_set_timeout(IMX2_WDT_MAX_TIME);
//imx2_wdt_ping(); //添加这两行
printk("imx2_wdt_stop();");
imx2_wdt_stop(); //再次执行上面的流程,主要为因为有时候不是仅仅一次不是很稳定
del_timer_sync(&imx2_wdt.timer);
imx2_wdt_stop(); dev_crit(imx2_wdt_miscdev.parent,
"Device shutdown: Expect reboot!\n");
}
}
...... 七、使用JNI进行测试:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_android_shutdown_Shutdown */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "android/log.h"
#include <sys/reboot.h> static const char *TAG="GPIO_SHUTDOWN";
#define LOGE(fmt, args...) __android_log_print(ANDROID_LOG_ERROR, TAG, fmt, ##args) #define THIS_INPUT_SHUTDOWN_SOFTWARE 1
#define THIS_INPUT_STANBY_SOFTWARE 2
#define THIS_INPUT_STANBY_AND_WAKEUP_SOFTWARE 3 /*
* Class: com_android_shutdown_Shutdown
* Method: shutdown
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_android_shutdown_Shutdown_shutdown
(JNIEnv * env, jobject thiz) { int fd = open("/dev/shutdown", O_RDWR);
if (fd < ) {
perror("shutdown system faild.\n");
} ioctl(fd, THIS_INPUT_SHUTDOWN_SOFTWARE, ); close(fd); } 八、JNI对应的Java文件:
cat shutdown.java
package com.android.shutdown; public class Shutdown {
native static public void shutdown();
static {
System.loadLibrary("shutdown");
}
}

I.MX6 shutdown by software的更多相关文章

  1. Windows Registry Security Check

    catalog . Windows注册表 . Windows注册表包含的攻击向量 . 注册表安全配置基线标定 1. Windows注册表 注册表(Registry,繁体中文版Windows称之为登录档 ...

  2. 入侵检测中需要监控的注册表路径研究(Windows Registry Security Check)

    1. Windows注册表简介 注册表(Registry,繁体中文版Windows称之为登录档)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息.早在Wind ...

  3. 如何设置ESXi中的虚拟机随主机一同启动?

    笔者新装了几台ESXi的主机, 其中一台上面运行着一台安装了vCenter的虚拟机.  笔者一路默认, 也没改什么设置. 在试图解决其他问题的过程中, 笔者重启了ESXi. 后来发现vCente登不进 ...

  4. I.MX6 android shutdown 内核崩溃

    /**************************************************************************** * I.MX6 android shutdo ...

  5. I.MX6 android 移除shutdown功能

    /************************************************************************ * I.MX6 android 移除shutdown ...

  6. I.MX6 Android shutdown shell command

    /******************************************************************************* * I.MX6 Android shu ...

  7. ora-01033:oracle initialization or shutdown in progress 解决方法

    今天研究Oracle遇到了这个问题ora-01033:oracle initialization or shutdown in progress,经过分析研究终于解决了,写下来纪念一下.我的库是ora ...

  8. I.MX6 Ethernet UI patch failed

    /*********************************************************************** * I.MX6 Ethernet UI patch f ...

  9. I.MX6 Linux udev porting

    /*********************************************************************** * I.MX6 Linux udev porting ...

随机推荐

  1. 就地交叉数组元素[a1a2b1b2]->[a1b1a2b2]

    问题描述: If [a1,a2,a3...,an,b1,b2...bn] is given input change this to [a1,b1,a2,b2.....an,bn] , solutio ...

  2. Linux :Can't start up: not enough memory

    http://stackoverflow.com/questions/9634577/linux-cant-start-up-not-enough-memory

  3. php获取网页header信息的4种方法

    php获取网页header信息的方法多种多样,就php语言来说,我知道的方法有4种, 下面逐一献上. 方法一:使用get_headers()函数 推荐指数: ★★★★★ get_header方法最简单 ...

  4. ExtJs之Ext.core.DomQuery

    <!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...

  5. JAVA类型信息——Class对象

    JAVA类型信息——Class对象 一.RTTI概要 1.类型信息RTTI :即对象和类的信息,例如类的名字.继承的基类.实现的接口等. 2.类型信息的作用:程序员可以在程序运行时发现和使用类型信息. ...

  6. java反射机制浅谈

    一.Java的反射机制浅谈 最近研究java研究得很给力,主要以看博文为学习方式.以下是我对java的反射机制所产生的一些感悟,希望各位童鞋看到失误之处不吝指出.受到各位指教之处,如若让小生好好感动, ...

  7. 李洪强iOS开发之OC语言基础知识

    OC语言基础知识 一.面向对象 OC语言是面向对象的,c语言是面向过程的,面向对象和面向过程只是解决问题的两种思考方式,面向过程关注的是解决问题涉及的步骤,面向对象关注的是设计能够实现解决问题所需功能 ...

  8. C. Tourist's Notes

    题目链接 题意:n天内登山,相邻两次登山的高度差的绝对值小于等于1,也就是说每次高度变化只能是:0,1,-1.我们已经知道n天中部分天数人所在的山的高度,求最大的登山高度. 输入: n m  n 是天 ...

  9. unity 脚本(自定义组件)的事件触发关系

  10. 本地替换文件读取MYSQL密码

    Mysql 的密码默认是存储在/data/mysql/下面的三个文件中:user.MYD,user.frm,user.MYI 先把这三个文件下载到本地,然后替换本地的这三个文件 使用net stop ...