/************************************************************************
* 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. JSP 页面打印

    <HTML><HEAD><TITLE>javascript打印-打印页面设置-打印预览代码</TITLE> <META http-equiv=Co ...

  2. 十大技巧优化Android App性能

    无论锤子还是茄子手机的不断冒出,Android系统的手机市场占有率目前来说还是最大的,因此基于Android开发的App数量也是很庞大的. 那么,如何能开发出更高性能的Android App?相信是软 ...

  3. C# 给数据库传入当前时间

    DateTime time=DateTime.Now; // 存储过程中用一个 @addTime DateTime --接收DateTime 类型接收

  4. .Net知识点总结(一)

    1.文件上传:Jquery.uploadify  它依赖于flash  舍去起上传   功能  改用SWFupload  他是第三方的插件 2.验证码激活的时候,邮箱开始是写死的,但是为了以后更改邮箱 ...

  5. HDU5569/BestCoder Round #63 (div.2) C.matrix DP

    matrix Problem Description Given a matrix with n rows and m columns ( n+m is an odd number ), at fir ...

  6. java编译做了哪些事?

    Javac编译器,主要做了如下的事情:1.解析与填充符号表:    2.注解处理器:    3.语义分析与字节码生成:        3.1.标注检查        3.2.数据及控制流分析      ...

  7. C#中毫米与像素的换算方法

    C#中以像素作为尺寸单位,像素是一种相对的尺寸概念,与毫米的转换与当前显示器的分辨率有关.在不同分辨率下转换的系数不同. 借助GDI可以完成毫米至像素的转换. public static double ...

  8. ios--集成支付宝钱包支付iOS SDK的方法与经验

    文/胖花花(简书作者)原文链接:http://www.jianshu.com/p/fe56e122663e著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 没想到,支付宝的SDK是我目前 ...

  9. Drozer安装

    (1)JDK安装 http://www.cnblogs.com/linbc/p/4319509.html http://blog.csdn.net/qq_31988895/article/detail ...

  10. 120条Photoshop新手必看技巧

    Photoshop越来越强大了!试图掌控它的全部特性是不现实的(更何况有那么多隐藏的功能!),那么我们不妨收藏一下大神们总结的这120个PS技巧,偶尔翻看一下,让自己的设计更强大更高效! 这120款技 ...