2014年8月14日 星期四

TQ210 Keypad Android Kernel 增加外部按鍵

Driver 核心支持
Device Driver
   -> Input device support
              -> Keyboards
                           =>   <*>s3c gpio keypad support
                           =>   <*>   GPIO Buttons
Map Tree
input.h
掃描值
(linux kernel)
/linux_3.0.8_tq210/include/linux
定義了linux kernel已有的鍵值;input.h的數值和qwerty.kl中的key的數值是相同的;input.h中的字串提供給linux使用。
qwerty.kl
鍵盤布局
(file system)
/android_4.0.4_tq210/frameworks/base/data/keyboards
qwerty.kl就是將input.h中的數值(即.code,掃描值,linux kernel)和keycodeLabels.h中的字串(即.desc)進行映射。將其連結掃描碼keycode的轉換關係。
KeycodeLabels.h
將字串轉成value的整形值
(file system)
/android_4.0.4_tq210/frameworks/base/include/ui/
即轉換到keycode值(在keycode.h中),keycode值提供給android調用。
Keycode.h
(file system)
/android_4.0.4_tq210/frameworks/base/native/android/
Keycode.h中的數值和KeycodeLabels.h中的數值是相同;是將KeycodeLabels.h中的數值賦值給字符。
KeyEvent.java
(file system)
/android_4.0.4_tq210/frameworks/base/core/java/android/view/
KeyEvent.java中的數值和Keycode.h、KeycodeLabels.h中的數值相同;KeyEvent.java的字符值提供給java應用層來使用,即在eclipse中寫的應用程序和這個字符值相對應。
a. Gpio-keys驅動增加  
PATH: /linux_3.0.8_tq210/drivers/input/keyboard/s3c-gpio-keys.c
{
   .pin = S5PV210_GPH2(2),  // 選擇GPIO的GPH2_2腳
   .eintcfg = 0X0f<<8,      // 配置GPH2_3為 1111 = EXT_INT[2]
   .inputcfg = 0<<8,               // 配置GPH2_2腳為輸入
   .eint = IRQ_EINT16_31,   //  配置中斷
},
   {
   .pin = S5PV210_GPH2(3),   // 選擇GPIO口的GPH2_3腳
   .eintcfg = 0X0f<<12,       // 配置GPH2_4口為 1111 = EXT_INT[3]
   .inputcfg = 0<<12,               // 配置GPH2_3腳為輸入
   .eint = IRQ_EINT16_31,       //配置中斷
 },
{
   .pin = S5PV210_GPH3(0),  // 選擇GPIO的GPH3_0腳
   .eintcfg = 0X0f<<0,      // 配置GPH3_0為 1111 = EXT_INT[0]
   .inputcfg = 0<<0,               // 配置GPH3_0腳為輸入
   .eint = IRQ_EINT16_31,   //  配置中斷
},
   {
   .pin = S5PV210_GPH3(3),   // 選擇GPIO口的GPH3_3腳
   .eintcfg = 0X0f<<12,       // 配置GPH3_3口為 1111 = EXT_INT[3]
   .inputcfg = 0<<12,               // 配置GPH3_3腳為輸入
   .eint = IRQ_EINT16_31,       //配置中斷
 },
  
b. 支援於Android核心原始碼
PATH: /linux_3.0.8_tq210/arch/arm/mach-s5pv210/mach-tq210.c
(1)利用platfrom_device 定義設備:
static struct platform_device s3c_device_gpio_button = {
     .name             = "gpio-keys",
     .id               = -1,
     .num_resources    = 0,
     .dev              = {
             .platform_data   = &gpio_button_data,
     }
};
    
(2) 其中gpio_button_data加入核心,建立了一個platform_device 模組,然後把KEY的platform_device增加到這個模組中.  line 1226 原本已存在
static struct platform_device *tq210_devices[] __initdata = {
……………
#ifdef CONFIG_KEYBOARD_S3C_GPIO
     &s3c_device_gpio_button,
#endif
…………
};

(3) platform_device 模組註冊到核心中  line 2171  原本已經存在
static void __init tq210_machine_init(void)
{
………………………
platform_add_devices(tq210_devices, ARRAY_SIZE(tq210_devices));//註冊到核心
………………………
}
以上是增加platform_device 註冊到核心的過程。

c. 查看linux核心已有的按鍵Code定義
  PATH: /linux_3.0.8_tq210/include/linux/input.h
 #define BTN_A     0x130 //16進制130(16) 轉⇒ 10進制304(10)
 #define BTN_B     0x131 //16進制131(16) 轉⇒ 10進制305(10)
#define KEY_HOME                102
 在Android中找到,查看相應的按鍵名稱   
 PATH: /android_4.0.4_tq210/frameworks/base/include/ui/KeycodeLabels.h
{ "BUTTON_A", 96 },
{ "BUTTON_B", 97 },
{ "1", 8 },
{ "2", 9 },
{ "3", 10 },
{ "4", 11 },
"SPACE"
{ "HOME", 3 },
所以在 /linux_3.0.8_tq210/arch/arm/mach-s5pv210/mach-tq210.c文件中增加按鍵的註冊訊息:
static struct gpio_keys_button gpio_buttons[]中增加如下內容:line 1072
(其中.code的值定義在input.h   .desc描述值定義在KeycodeLabels.h
     {
            .gpio           = S5PV210_GPH2(3),
            .code           = 304,
            .desc           = "BUTTON_A",
            .active_low     = 1,
            .wakeup         = 0,
     },          
     {
            .gpio              = S5PV210_GPH2(4),
            .code             = 305,
            .desc              = "BUTTON_B",
            .active_low     = 1,
            .wakeup         = 0,
            .debounce_interval = 100, //消除抖動
     },
        {
              .gpio           = S5PV210_GPH2(2),
            .code           = 2,
            .desc           = "1",
            .active_low     = 1,
            .wakeup         = 0,
     },
     {
            .gpio              = S5PV210_GPH2(3),
            .code             = 3,
            .desc              = "2",
            .active_low     = 1,
            .wakeup         = 0,
            .debounce_interval = 100, //消除抖動
     },
       {
            .gpio           = S5PV210_GPH3(0),
            .code           = 4,
            .desc           = "3",
            .active_low     = 1,
            .wakeup         = 0,
     },
     {
            .gpio              = S5PV210_GPH3(3),
            .code             = 5,
            .desc              = "4",
            .active_low     = 1,
            .wakeup         = 0,
            .debounce_interval = 100, //消除抖動
     },
在qwerty.kl(/android_4.0.4_tq210/frameworks/base/data/keyboards/qwerty.kl)中增加連結關係:
key 304   BUTTON_A
key 305   BUTTON_B
key 2     1
key 3     2
key 4     3
key 5     4
然後進行編譯核心uImage,編譯Android的system.img 燒入開發板

透過實體按鈕輸入”1” “2” “3” “4” 字元

Linux源碼:Platform  http://www.linuxidc.com/Linux/2012-12/76196.htm


沒有留言:

張貼留言