最近需要做个唤醒功能,当按键的时候android系统唤醒并点亮屏,在长按键中,系统不能在进入睡眠。

  1. 驱动方面:
  2. 1:在平台设备文件中添加 一个按键,定义为唤醒源!
  3. \arch\arm\mach-s5pv210
  4. static struct gpio_keys_button gpio_buttons[] = {
  5. {
  6. .gpio  = S5PV210_GPH1(3),
  7. .code  = KEY_F22,  //对应 192
  8. .desc  = "F22",
  9. .active_low = 1,
  10. .wakeup  = 1,
  11. .debounce_interval =100, //去抖动
  12. },
  13. }
  14. static struct gpio_keys_platform_data gpio_button_data = {
  15. .buttons = gpio_buttons,
  16. .nbuttons = ARRAY_SIZE(gpio_buttons),
  17. };
  18. static struct platform_device s3c_device_gpio_button = {
  19. .name  = "gpio-keys",
  20. .id  = -1,
  21. .num_resources = 0,
  22. .dev  = {
  23. .platform_data = &gpio_button_data,
  24. }
  25. };
  26. platform_add_devices(smdkc110_devices, ARRAY_SIZE(smdkc110_devices));
  27. 2:添加驱动\kernel-v.20120620\drivers\input\keyboard\s3c-gpio-keys.c
  28. struct s3c_gpio_key{
  29. int pin;
  30. int eint;
  31. int eintcfg;
  32. int inputcfg;
  33. };
  34. struct s3c_gpio_key s3c_gpio_keys[]=
  35. {
  36. ///*
  37. {
  38. .pin = S5PV210_GPH1(3), //at base wake up
  39. .eintcfg = 0X0f<<12,
  40. .inputcfg = 0<<12,
  41. .eint = IRQ_EINT11,
  42. },
  43. // */
  44. };
驱动方面:
1:在平台设备文件中添加 一个按键,定义为唤醒源!
\arch\arm\mach-s5pv210
static struct gpio_keys_button gpio_buttons[] = { {
.gpio = S5PV210_GPH1(3),
.code = KEY_F22, //对应 192
.desc = "F22",
.active_low = 1,
.wakeup = 1,
.debounce_interval =100, //去抖动
}, } static struct gpio_keys_platform_data gpio_button_data = {
.buttons = gpio_buttons,
.nbuttons = ARRAY_SIZE(gpio_buttons),
}; static struct platform_device s3c_device_gpio_button = {
.name = "gpio-keys",
.id = -1,
.num_resources = 0,
.dev = {
.platform_data = &gpio_button_data,
}
}; platform_add_devices(smdkc110_devices, ARRAY_SIZE(smdkc110_devices)); 2:添加驱动\kernel-v.20120620\drivers\input\keyboard\s3c-gpio-keys.c
struct s3c_gpio_key{
int pin;
int eint;
int eintcfg;
int inputcfg;
}; struct s3c_gpio_key s3c_gpio_keys[]=
{
///*
{
.pin = S5PV210_GPH1(3), //at base wake up
.eintcfg = 0X0f<<12,
.inputcfg = 0<<12,
.eint = IRQ_EINT11,
}, // */
};

//申请中断为上/下沿出发方式。

  1. error = request_irq(s3c_gpio_keys[i].eint, gpio_keys_isr,
  2. IRQF_SAMPLE_RANDOM | IRQF_TRIGGER_RISING |
  3. IRQF_TRIGGER_FALLING,
  4. button->desc ? button->desc : "gpio_keys",
  5. bdata);
		error = request_irq(s3c_gpio_keys[i].eint, gpio_keys_isr,
IRQF_SAMPLE_RANDOM | IRQF_TRIGGER_RISING |
IRQF_TRIGGER_FALLING,
button->desc ? button->desc : "gpio_keys",
bdata);
  1. static void gpio_keys_report_event(struct gpio_button_data *bdata)
  2. {
  3. struct gpio_keys_button *button = bdata->button;
  4. struct input_dev *input = bdata->input;
  5. unsigned int type = button->type ?: EV_KEY;
  6. int state = (gpio_get_value(button->gpio) ? 1 : 0) ^ button->active_low;
  7. //add by xiao@2012-0620:for wake up mid when it on base.
  8. //上报事件处理下,因会发生系统唤醒后,又马上进入睡眠,造成一种假唤醒状态,所以当按键时,不时上报此事件来唤醒系统
  9. if(button->code == 192){
  10. if(state)
  11. mod_timer(&bdata->timer,
  12. jiffies + msecs_to_jiffies(button->debounce_interval + 300));
  13. }
  14. input_event(input, type, button->code, !!state);
  15. input_sync(input);
  16. #ifdef key_debug
  17. printk("gpio_keys_report_event->code =%d, state = %d\n",button->code,state);
  18. #endif
  19. }
static void gpio_keys_report_event(struct gpio_button_data *bdata)
{
struct gpio_keys_button *button = bdata->button;
struct input_dev *input = bdata->input;
unsigned int type = button->type ?: EV_KEY; int state = (gpio_get_value(button->gpio) ? 1 : 0) ^ button->active_low;
//add by xiao@2012-0620:for wake up mid when it on base.
//上报事件处理下,因会发生系统唤醒后,又马上进入睡眠,造成一种假唤醒状态,所以当按键时,不时上报此事件来唤醒系统
if(button->code == 192){
if(state)
mod_timer(&bdata->timer,
jiffies + msecs_to_jiffies(button->debounce_interval + 300));
}
input_event(input, type, button->code, !!state);
input_sync(input);
#ifdef key_debug
printk("gpio_keys_report_event->code =%d, state = %d\n",button->code,state);
#endif
}

驱动按键添加完成,内核能唤醒,但是android系统屏并不会点亮,所以需要修改源码,让系统服务获取到此按键并作一些处理。

1:首先看下键值表:\out\target\product\smdkv210\system\usr\keylayout

qwerty.kl

# On an AT keyboard: ESC, F10
key 1     BACK              WAKE_DROPPED
key 68    MENU              WAKE_DROPPED

# on base wake up mid
key 192     NULL         WAKE_DROPPED   //需要添加的键NULL。WAKE_DROPPED:唤醒并点亮屏。

第一列:key
第二列: SCANCODE是一个整数,是驱动里面定义的,在文件./kernel/include/linux/input.h
第三列: KEYCODE 是一个字串,定义在你描述的布局文件frameworks/base/include/ui/KeycodeLabels.h
另外可以设置相关的FLAGS:
SHIFT: 当按下,自动加上SHIFT键值
ALT:当按下,自动加上ALT
CAPS:当按下,自动带上CAPS大写
WAKE:当按下,当设备进入睡眠的时候,按下这个键将唤醒,而且发送消息给应用层。
WAKE_DROPPED:当按下,且设备正处于睡眠,设备被唤醒,但是不发送消息给应用层。

2:./frameworks/base/include/ui/keycodeLabels.h

static const KeycodeLabel KEYCODES[] = {
    { "BUTTON_MODE", 110 },
    { "NULL", 111 }, //在最后添加NULL按键, 键值为111 ,后续android根据键值来映射。    
    // NOTE: If you add a new keycode here you must also add it to several other files.
    //       Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.

{ NULL, 0 }
};

3: ./ frameworks/base/native/include/android/Keycodes.h

enum {
    AKEYCODE_BUTTON_MODE     = 110,
    AKEYCODE_NULL     = 111, //     当keyevent处理按键事件时,isSystemKey 判断是否为系统按键才会继续上报上层,所以需要添加进去。
    // NOTE: If you add a new keycode here you must also add it to several other files.
    //       Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
};

./frameworks/base/libs/ui/input.java

同时 isSystemKey() 也要添加:

bool KeyEvent::isSystemKey(int32_t keyCode) {
    switch (keyCode) {
        case AKEYCODE_FOCUS:
        case AKEYCODE_SEARCH:
  case AKEYCODE_NULL: // add by xiao@2012-06-20
            return true;
    }
   
    return false;
}

4: ./frameworks/base/core/java/android/view/KeyEvent.java

//根据键值 映射 为 KEYCODE_BUTTON_NULL  ,为PhoneWindowManager.java 提供按键目标。
    public static final int KEYCODE_BUTTON_NULL     = 111;

同时 这也修改:

private static final int LAST_KEYCODE           = KEYCODE_BUTTON_NULL;

5:./frameworks/base/core/res/res/values/attrs.xml
        <enum name="KEYCODE_BUTTON_MODE" value="110" />
        <enum name="KEYCODE_BUTTON_NULL" value="111" />

通过以上的更改,新的键值就添加上去了,由于更改了 KeyEvent,影响到了API, 所以需要make update-api

这样系统就会获取到这个NULL按键,并能够点亮屏幕了。

如果对新键值进行处理,可以通过获取相应的keycode,对它进行处理;对于按键事件的处理一般如下文件中
 frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java

interceptKeyBeforeQueueing 函数中处理,

  1. public int interceptKeyBeforeQueueing(long whenNanos, int keyCode, boolean down,
  2. int policyFlags, boolean isScreenOn) {
  3. //add by xiao@2012-06-20 :wakeup mid when it on base,
  4. else if(keyCode == KeyEvent.KEYCODE_BUTTON_NULL){ //获取NULL按键,不让系统进入睡眠状态,释放按键时,进入可睡眠。
  5. if(down){
  6. if(IS_MID_ONBASE == false)
  7. {
  8. IS_MID_ONBASE = true;
  9. mBroadcastWakeLock.acquire();
  10. Log.e(TAG,"MID WAKE UP button: DOwn");
  11. }
  12. }else{
  13. IS_MID_ONBASE = false;
  14. mBroadcastWakeLock.release();
  15. Log.e(TAG,"MID WAKE UP button: release");
  16. }
  17. }
  18. }
 public int interceptKeyBeforeQueueing(long whenNanos, int keyCode, boolean down,
int policyFlags, boolean isScreenOn) { //add by xiao@2012-06-20 :wakeup mid when it on base,
else if(keyCode == KeyEvent.KEYCODE_BUTTON_NULL){ //获取NULL按键,不让系统进入睡眠状态,释放按键时,进入可睡眠。
if(down){
if(IS_MID_ONBASE == false)
{
IS_MID_ONBASE = true;
mBroadcastWakeLock.acquire();
Log.e(TAG,"MID WAKE UP button: DOwn");
}
}else{
IS_MID_ONBASE = false;
mBroadcastWakeLock.release();
Log.e(TAG,"MID WAKE UP button: release");
}
} }

android2.3 -添加自定义按键:作唤醒功能 .的更多相关文章

  1. Android4.4.2系统添加自定义按键【转】

    本文转载自:http://developer.t-firefly.com/thread-251-1-1.html 网上存在一些关于Android系统添加自定义按键的文章,但大多针对Android2.3 ...

  2. [Android6.0][RK3399] 修改默认按键 KEY-PAD 的功能【转】

    本文转载自:http://m.blog.csdn.net/dearsq/article/details/70175637 Platform: RK3399 OS: Android 6.0 Kernel ...

  3. android 开发 讯飞语音唤醒功能

    场景:进入程序后处于语音唤醒状态,当说到某个关键词的时候打开某个子界面(如:语音识别界面) 技术要点: 1. // 设置唤醒一直保持,直到调用stopListening,传入0则完成一次唤醒后,会话立 ...

  4. firefox 屏蔽Backspace按键的后退功能

    直接上图

  5. Ubuntu 16.04安装Guake Terminal终端(使用一键唤醒功能)

    安装: sudo apt-get install guake-indicator sudo apt-get install guake 使用: 先启动guake-indicator,再启动guake. ...

  6. TI AM335X处理器介绍

    AM335X是美国TI(德州仪器)公司基于 ARM Cortex-A8内核的AM335X微处理器,在图像.图形处理.外设方面进行了增强,并全面支持诸如 EtherCAT 和 PROFIBUS等工业接口 ...

  7. 阻塞和唤醒线程——LockSupport功能简介及原理浅析

    目录 1.LockSupport功能简介 1.1 使用wait,notify阻塞唤醒线程 1.2 使用LockSupport阻塞唤醒线程 2. LockSupport的其他特色 2.1 可以先唤醒线程 ...

  8. STM32之待机唤醒

    前段时间我稍微涉及节能减排大赛..倡导节能的社会..没错了.你真是太聪明了..知道了我今天要讲关于STM32节能方面的模块..没错..这标题已经告诉你了是吧..哦,对,标题有写..所以..言归正传.至 ...

  9. 【Android休眠】之PowerKey唤醒源实现【转】

    转自:https://blog.csdn.net/u013686019/article/details/53677531 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...

随机推荐

  1. Codevs 1078 ==Poj 1258 Agri-Net

      Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 53270   Accepted: 22140 Description D ...

  2. Repost: Set Delivery Block on SO

    If SO is incomplete, then automatically set the delivery block on the SO header. as suggested by ear ...

  3. ubuntu下安装 Source insight

    习惯了在source insight下编辑阅读源码,在linux下用vi总是用不好 ,还是在ubuntu上用回熟悉的source insight. 在ubuntu中,安装windows程序用wine, ...

  4. VC 2010下安装OpenCV2.4.4

    说明: 安装平台:32位XP,VS2010: OpenCV 2.4.4不支持VC 6.0: 网上有很多用CMake编译OpenCV的安装教程,这里建议先不要自己编译,如果使用预编译好的库有问题,再尝试 ...

  5. Zencart 国家排序及中文名称的扩展

    最终实现效果如上 具体步骤: 1. 手动或SQL修改数据表,增加2个字段 ) ) '; 2. 修改admin/countries.php文件,增加表单插入编辑功能, 共计7处,此处忽略具体代码. 3. ...

  6. JS预览图像将本地图片显示到浏览器上的代码

    js代码实现: 从file域获取本地图片url并将本地图片显示到浏览器上. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitio ...

  7. ajax 设置Access-Control-Allow-Origin实现跨域访问

    ajax跨域访问是一个老问题了,解决方法很多,比较常用的是JSONP方法,JSONP方法是一种非官方方法,而且这种方法只支持GET方式,不如POST方式安全. 即使使用jquery的jsonp方法,t ...

  8. RTC搭建android下三层应用程序访问服务器MsSql-客户端

    android下stringgrid已知问题: 通过点击时获取对应行的值有问题,在win下调试正常,在android下出现定位不准 二.客户端开发 1,新建工程 2,添加相关客户端控件TRtcHttp ...

  9. 社区发现算法问题&&NetworkX&&Gephi

    在做东西的时候用到了社区发现,因此了解了一下有关社区发现的一些问题 1,社区发现算法 (1)SCAN:一种基于密度的社团发现算法 Paper: <SCAN: A Structural Clust ...

  10. Oracle中的日期

    --1.日期字符转换函数的用法 /****************************TO_CHAR********************************/ -------------- ...