android 修改按键驱动


Note 01 android 按键驱动研究 这部分的研究主要是 android 按键驱动的改写。 1) Android 使用标准的 linux 输入事件设备(/dev/input/)和驱动按键定义在 linux 内核 include/linux/input.h 中,按键 的定义形式如下: /*     * Keys and buttons     *     * Most of the keys/buttons are modeled after USB HUT 1.12   * (see http://www.usb.org/developers/hidpage).     * Abbreviations in the comments:     * AC ‐ Application Control     * AL ‐ Application Launch Button     * SC ‐ System Control     */  #define KEY_ZENKAKUHANKAKU  85    #define KEY_102ND    86    #define KEY_F11     87    #define KEY_F12     88    #define KEY_RO     89    #define KEY_KATAKANA    90    #define KEY_HIRAGANA    91    #define KEY_HENKAN    92    #define KEY_KATAKANAHIRAGANA   93   #define KEY_MUHENKAN    94    #define KEY_KPJPCOMMA    95    #define KEY_KPENTER    96    #define KEY_RIGHTCTRL    97    #define KEY_KPSLASH    98    #define KEY_SYSRQ    99    #define KEY_RIGHTALT    100    #define KEY_LINEFEED    101    #define KEY_HOME    102    #define KEY_UP     103    #define KEY_PAGEUP    104    #define KEY_LEFT    105    #define KEY_RIGHT    106    #define KEY_END     107    #define KEY_DOWN    108    #define KEY_PAGEDOWN    109    #define KEY_INSERT    110    #define KEY_DELETE    111    #define KEY_MACRO    112    #define KEY_MUTE    113    #define KEY_VOLUMEDOWN    114    2) 由 UT-S5PC100 底板原理图按键部分如下: 核心板原理图按键接口部分如下: 内核中(drivers/input/keyboard/s3c_botton.c)按键的驱动程序如下 /*     * Driver for keys on GPIO lines.     *     * Copyright 2009 jiangjianjun      *     * This program is free software; you can redistribute it and/or modify     * it under the terms of the GNU General Public License version 2 as     * published by the Free Software Foundation.     */       #include     #include     #include     #include     #include     #include     #include     #include     #include     #include     #include     #include     #include     #include     #include     #include         #define MAX_BUTTON_CNT     (6)       static struct timer_list timer;    static struct input_dev * input;       static int ut_s5pc100_key_gpio_list[MAX_BUTTON_CNT] =       {1, 2, 3, 4, 6, 7}; //UT‐S5PC100 using GPH group    static int s3c_Keycode[MAX_BUTTON_CNT] =       {KEY_UP, KEY_LEFT, KEY_RIGHT, KEY_DOWN, KEY_ESC, KEY_ENTER};   //UT‐S5PC100    static int s3c_button_history[MAX_BUTTON_CNT] = { 0, 0, 0, 0, 0, 0};       static void s3cbutton_timer_handler(unsigned long data)    {       int flag;       int i;       for(i = 0; i < MAX_BUTTON_CNT; i++)       {        flag = gpio_get_value(S5PC1XX_GPH0(ut_s5pc100_key_gpio_list[i]));        if(flag != s3c_button_history[i])        {         if(flag)          input_report_key(input, s3c_Keycode[i], 0);         else          input_report_key(input, s3c_Keycode[i], 1);         s3c_button_history[i] = flag;        }       }       /* Kernel Timer restart */       mod_timer(&timer,jiffies + HZ/100);    }       static int s3c_button_probe(struct platform_device *pdev)    {       int i;          for(i = 0; i < MAX_BUTTON_CNT; i++)       {        s3c_gpio_setpull(S5PC1XX_GPH0(ut_s5pc100_key_gpio_list[i]), S3C_GPIO_PULL_UP);        gpio_direction_input(S5PC1XX_GPH0(ut_s5pc100_key_gpio_list[i]));       }          input = input_allocate_device();       if(!input)        return ‐ENOMEM;          set_bit(EV_KEY, input‐>evbit);       //set_bit(EV_REP, input‐>evbit); /* Repeat Key */          for(i = 0; i < MAX_BUTTON_CNT; i++)        set_bit(s3c_Keycode[i], input‐>keybit);          input‐>name = "s3c‐button";       input‐>phys = "s3c‐button/input0";          input‐>id.bustype = BUS_HOST;       input‐>id.vendor = 0x0001;       input‐>id.product = 0x0001;       input‐>id.version = 0x0100;          input‐>keycode = s3c_Keycode;          if(input_register_device(input) != 0)       {        printk("s3c‐button input register device fail!!\n");           input_free_device(input);        return ‐ENODEV;       }          /* Scan timer init */       init_timer(&timer);       timer.function = s3cbutton_timer_handler;          timer.expires = jiffies + (HZ/100);       add_timer(&timer);          printk("s3c button Initialized!!\n");          return 0;    } ?end s3c_button_probe ?        static int s3c_button_remove(struct platform_device *pdev)    {       input_unregister_device(input);       del_timer(&timer);              return  0;    }        #ifdef CONFIG_PM    static int s3c_button_suspend(struct platform_device *pdev, pm_message_t state)    {       return 0;    }       static int s3c_button_resume(struct platform_device *pdev)    {       return 0;    }    #else    #define s3c_button_suspend  NULL    #define s3c_button_resume   NULL    #endif       static struct platform_driver s3c_button_device_driver = {       .probe    = s3c_button_probe,       .remove    = s3c_button_remove,       .suspend =   s3c_button_suspend,       .resume    = s3c_button_resume,       .driver    = {        .name =   "s3c‐button",        .owner =  THIS_MODULE,       }    };          static struct platform_device s3c_device_button = {       .name =   "s3c‐button",       .id    = ‐1,    };       static int __init s3c_button_init(void)    {       platform_device_register(&s3c_device_button);       return platform_driver_register(&s3c_button_device_driver);    }       static void __exit s3c_button_exit(void)    {       platform_driver_unregister(&s3c_button_device_driver);       platform_device_unregister(&s3c_device_button);    }       module_init(s3c_button_init);    module_exit(s3c_button_exit);       MODULE_LICENSE("GPL");    MODULE_AUTHOR("jerry jianjun ");    MODULE_DESCRIPTION("Keyboard driver for s3c button.");    MODULE_ALIAS("platform:s3c‐button");   3) 有以上驱动程序就实现了从硬件 GPIO 口到内核标准按键的映射,但是 android 系统没有直接使用映射后的值,而 是对其再进行了一次映射。从内核标准键值到 android 所用的键值映射表定义在 android 文件系统的 /system/usr/keylayout 目录下。Android 标准的键值映射表文件为 qwerty.kl,定义如下: key 399   GRAVE  key 2     1  key 3     2  key 4     3  key 5     4  key 6     5  key 7     6  key 8     7  key 9     8  key 10    9  key 11    0  key 1     BACK              WAKE_DROPPED  key 158   BACK              WAKE_DROPPED  key 230   SOFT_RIGHT        WAKE  key 60    SOFT_RIGHT        WAKE  key 107   ENDCALL           WAKE_DROPPED  key 62    ENDCALL           WAKE_DROPPED  key 229   MENU              WAKE_DROPPED  key 139   MENU              WAKE_DROPPED  key 59    MENU              WAKE_DROPPED  key 127   SEARCH            WAKE_DROPPED  key 217   SEARCH            WAKE_DROPPED  key 228   POUND  key 227   STAR  key 231   CALL              WAKE_DROPPED  key 61    CALL              WAKE_DROPPED  key 232   DPAD_CENTER       WAKE_DROPPED  key 108   DPAD_DOWN         WAKE_DROPPED  key 103   DPAD_UP           WAKE_DROPPED  key 102   HOME              WAKE  key 105   DPAD_LEFT         WAKE_DROPPED  key 106   DPAD_RIGHT        WAKE_DROPPED  key 115   VOLUME_UP  key 114   VOLUME_DOWN  key 116   POWER             WAKE  key 212   CAMERA    key 16    Q  key 17    W  key 18    E  key 19    R  key 20    T  key 21    Y  key 22    U  key 23    I  key 24    O  key 25    P  key 26    LEFT_BRACKET  key 27    RIGHT_BRACKET  key 43    BACKSLASH    key 30    A  key 31    S  key 32    D  key 33    F  key 34    G  key 35    H  key 36    J  key 37    K  key 38    L  key 39    SEMICOLON  key 40    APOSTROPHE  key 14    DEL            key 44    Z  key 45    X  key 46    C  key 47    V  key 48    B  key 49    N  key 50    M  key 51    COMMA  key 52    PERIOD  key 53    SLASH  key 28    ENTER            key 56    ALT_LEFT  key 100   ALT_RIGHT  key 42    SHIFT_LEFT  key 54    SHIFT_RIGHT  key 15    TAB  key 57    SPACE  key 150   EXPLORER  key 155   ENVELOPE            key 12    MINUS  key 13    EQUALS  key 215   AT 4) Android 系统对底层按键的处理方法 Android 按键的处理是由 Window Manager 负责,主要的键值映射转换实现是在 android 源代码 frameworks/base/libs/ui/EventHub.cpp 此文件处理来自底层的所有输入事件,并根据来源对事件进行分类处理,对于按 键事件处理过程如下: a) 记录驱动名称(例如上面的驱动程序的驱动名称为:s3c-button) b) 获取环境变量 ANDROID_ROOT 为系统路径(默认是/system,在 android 源代码 system/core/rootdir/init.rc 文 件中) c) 查找路径为“系统路径/usr/keylayout/驱动名称.kl”的按键映射文件,如果该文件(“驱动名称.kl”)不存在, 则默认用路径为“系统路径/usr/keylayout/qwerty.kl”文件中的键值映射表。 5) 举例说明 在上面驱动程序中可以得到 EINT1 中断 GPIO 口被按下时,程序解析到的就是 s3c_Keycode 中 KEY_UP 值,查看 Linux 内核中 include/linux/input.h 文件中定义的值 #define KEY_UP     103    按键被按下时,Linux 用户空间检测到的就是 103 这个值,然后这个值在 android 系统中对应的映射表 qwerty.kl 值为 key 103   DPAD_UP           WAKE_DROPPED  即向上键,这样就实现了 android 系统中检测到向上键。 以上过程是利用了 android 系统默认的 qwerty.kl 映射表。如果需要自己建立“驱动名称.kl”文件,则可以按照 qwerty.kl 文件的样式自己建立,把“驱动名称.kl”文件放放置在 android 文件系统中/system/usr/keylayout 目录下即可。如果想再 android 源码编译过程中将“驱动名称.kl”编译到文件系统中,则只需将文件放置到 android 源码 /vender/sec/sec_proprietary/utc100/keychars 目录中,并修改该目录下的 Android.mk 文件。(修改内容可以参考其内容中 qwerty.kl 文件的配置部分)。
还剩7页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

xiaobai1q

贡献于2013-07-09

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf