I.MX6 shutdown by software
/************************************************************************
* 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的更多相关文章
- Windows Registry Security Check
catalog . Windows注册表 . Windows注册表包含的攻击向量 . 注册表安全配置基线标定 1. Windows注册表 注册表(Registry,繁体中文版Windows称之为登录档 ...
- 入侵检测中需要监控的注册表路径研究(Windows Registry Security Check)
1. Windows注册表简介 注册表(Registry,繁体中文版Windows称之为登录档)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息.早在Wind ...
- 如何设置ESXi中的虚拟机随主机一同启动?
笔者新装了几台ESXi的主机, 其中一台上面运行着一台安装了vCenter的虚拟机. 笔者一路默认, 也没改什么设置. 在试图解决其他问题的过程中, 笔者重启了ESXi. 后来发现vCente登不进 ...
- I.MX6 android shutdown 内核崩溃
/**************************************************************************** * I.MX6 android shutdo ...
- I.MX6 android 移除shutdown功能
/************************************************************************ * I.MX6 android 移除shutdown ...
- I.MX6 Android shutdown shell command
/******************************************************************************* * I.MX6 Android shu ...
- ora-01033:oracle initialization or shutdown in progress 解决方法
今天研究Oracle遇到了这个问题ora-01033:oracle initialization or shutdown in progress,经过分析研究终于解决了,写下来纪念一下.我的库是ora ...
- I.MX6 Ethernet UI patch failed
/*********************************************************************** * I.MX6 Ethernet UI patch f ...
- I.MX6 Linux udev porting
/*********************************************************************** * I.MX6 Linux udev porting ...
随机推荐
- POJ 2195
#include<iostream>//by Chengdacaizi #include<stdio.h> #include<vector> #include< ...
- ***RESTful API 设计指南(阮一峰)
网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). 因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信.这导致AP ...
- hdu 3886 Final Kichiku “Lanlanshu” 数位DP
思路: dp[i][j][k]:满足在字符串的j位,前一位数字是k. 代码如下: #include<iostream> #include<cstdio> #include< ...
- LINUX输入输出与文件——续
1 目录操作 改变目录或文件的访问权限 #include <sys/stat.h> int chmod(const char *path, mode_t mode); //mode形如07 ...
- Ajax的进阶学习(二)
JSON和JSONP 如果在同一个域下,$.ajax()方法只要设置dataType属性即可加载JSON文件.而在非同域下,可以使用JSONP,但也是有条件的. Ajax进阶.html: <!D ...
- The absolute uri: http://struts.apache.org/tags-bean cannot be resolved in either web.xml or the jar files deployed with this application
在一个tomcat中部署了一个struts-1.3.10的web项目,但是没有吧struts-1.3.10的lib中的jar包放进tomcat/lib中,所以导致了这个错误(访问该项目的页面时)
- [Spring Boot 系列] 集成maven和Spring boot的profile功能
由于项目的需要, 今天给spirng boot项目添加了profile功能.再网上搜索了一圈,也没有找到满意的参考资料,其实配置并不难,就是没有一个one stop(一站式)讲解的地方,所以有了写这篇 ...
- ace-min.css
textarea,input[type="text"],input[type="password"],input[type="datetime&quo ...
- spring springmvc mybatis 整合
环境 apache-tomcat-8.0.33.jdk1.8.0_05 maven Dynamic Web Module 2.5 1.各个xml配置文件的配置 (1)pom.xml 配置清单文件 连接 ...
- mysql union和union all
UNION 操作符用于合并两个或多个 SELECT 语句的结果集.UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型. union 是对数据进行并集操作,不包括重复 ...