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
沒有留言:
張貼留言