安卓系统移植之按键移植.docx
《安卓系统移植之按键移植.docx》由会员分享,可在线阅读,更多相关《安卓系统移植之按键移植.docx(7页珍藏版)》请在冰豆网上搜索。
安卓系统移植之按键移植
这一部分主要是移植android的键盘和按键
(1)Android使用标准的linux输入事件设备(/dev/input目录下)和驱动,按键定义在内核include/linux/input.h文件中,
按键定义形式如下:
#defineKEY_ESC1
#defineKEY_12
#defineKEY_23
(2)内核中(我的平台是arch/arm/mach-mmp/merlin.c文件)中按键的定义如下形式:
staticstructgpio_keys_buttonbtn_button_table[]={
[0]={
.code=KEY_F1,
.gpio=MFP_PIN_GPIO2,
.active_low=1,/*0fordown0,up1;1fordown1,up0*/
.desc="H_BTNbutton",
.type=EV_KEY,
/*.wakeup=*/
.debounce_interval=10,/*10msecjitterelimination*/
},
[1]={
.code=KEY_F2,
.gpio=MFP_PIN_GPIO3,
.active_low=1,/*0fordown0,up1;1fordown1,up0*/
.desc="O_BTNbutton",
.type=EV_KEY,
/*.wakeup=*/
.debounce_interval=10,/*10msecjitterelimination*/
},
[2]={
.code=KEY_F4,
.gpio=MFP_PIN_GPIO1,
.active_low=1,/*0fordown0,up1;1fordown1,up0*/
.desc="S_BTNbutton",
.type=EV_KEY,
/*.wakeup=*/
.debounce_interval=10,/*10msecjitterelimination*/
},
};
staticstructgpio_keys_platform_datagpio_keys_data={
.buttons=btn_button_table,
.nbuttons=ARRAY_SIZE(btn_button_table),
};
staticstructplatform_devicegpio_keys={
.name="gpio-keys",
.dev={
.platform_data=&gpio_keys_data,
},
.id=-1,
};
上面定义是将MFP_PIN_GPIO2这个GPIO口的按键映射到Linux的KEY_F1按键,MPF_PIN_GPIO3映射到KEY_F2,MFP_PIN_GPIO1映射到KEY_F4
(3)上面
(2)步实现了从硬件GPIO口到内核标准按键的映射,但是android并没有直接使用映射后的键值,而且对其再进行了一次映射,从内核标准键值
到android所用键值的映射表定义在android文件系统的/system/usr/keylayout目录下。
标准的映射文件为qwerty.kl,定义如下:
key399GRAVE
key21
key32
key43
key54
key65
key76
key87
key98
key109
key110
key158BACKWAKE_DROPPED
key230SOFT_RIGHTWAKE
key60SOFT_RIGHTWAKE
key107ENDCALLWAKE_DROPPED
key62ENDCALLWAKE_DROPPED
key229MENUWAKE_DROPPED
key139MENUWAKE_DROPPED
key59MENUWAKE_DROPPED
key127SEARCHWAKE_DROPPED
key217SEARCHWAKE_DROPPED
key228POUND
key227STAR
key231CALLWAKE_DROPPED
key61CALLWAKE_DROPPED
key232DPAD_CENTERWAKE_DROPPED
key108DPAD_DOWNWAKE_DROPPED
key103DPAD_UPWAKE_DROPPED
key102HOMEWAKE
key105DPAD_LEFTWAKE_DROPPED
key106DPAD_RIGHTWAKE_DROPPED
key115VOLUME_UP
key114VOLUME_DOWN
key116POWERWAKE
key212CAMERA
key16Q
key17W
key18E
key19R
key20T
key21Y
key22U
key23I
key24O
key25P
key26LEFT_BRACKET
key27RIGHT_BRACKET
key43BACKSLASH
key30A
key31S
key32D
key33F
key34G
key35H
key36J
key37K
key38L
key39SEMICOLON
key40APOSTROPHE
key14DEL
key44Z
key45X
key46C
key47V
key48B
key49N
key50M
key51COMMA
key52PERIOD
key53SLASH
key28ENTER
key56ALT_LEFT
key100ALT_RIGHT
key42SHIFT_LEFT
key54SHIFT_RIGHT
key15TAB
key57SPACE
key150EXPLORER
key155ENVELOPE
key12MINUS
key13EQUALS
key215AT
(4)android对底层按键的处理方法
android按键的处理是WindowManager负责,主要的映射转换实现在android源代码frameworks/base/libs/ui/EventHub.cpp
此文件处理来自底层的所有输入事件,并根据来源对事件进行分类处理,对于按键事件,处理过程如下:
(a)记录驱动名称为
(b)获取环境变量ANDROID_ROOT为系统路径(默认是/system,定义在android源代码/system/core/rootdir/init.rc文件中)
(c)查找路径为"系统路径/usr/keylayout/驱动名称.kl"的按键映射文件,如果不存在则默认用路径为"系统路径/usr/keylayout/qwerty.kl"
这个默认的按键映射文件,映射完成后再把经映射得到的android按键码值发给上层应用程序。
所以我们可以在内核中定义多个按键设备,然后为每个设备设定不同的按键映射文件,不定义则会默认用qwerty.kl
(5)举例
上面
(2)步我们在内核中声明了一个名为"gpio-keys"的按键设备,此设备定义在内核drivers/input/keyboard/gpio_keys.c文件中
然后我们在内核启动过程中注册此设备:
platform_device_register(&gpio_keys);然后我们可以自己定义一个名为gpio-keys.kl的android按键映射文件,此文件的定义可以参考querty.kl的内容,比如说我们想将MPF_PIN_GPIO3
对应的按键作android中的MENU键用,首先我们在内核中将MPF_PIN_GPIO3映射到KEY_F2,在内核include/linux/input.h中查找KEY_F2发现
#defineKEY_F260
参照KEY_F2的值我们在gpio-keys.kl中加入如下映射即可
key60MENUWAKE
其它按键也照此添加,完成后将按键表放置到/system/usr/keylayout目录下即可。
补充:
(1)android按键设备的映射关系可以在logcat开机日志中找的到(查找EventHub即可)
(2)android按键设备由WindowManager负责,WindowManager从按键驱动读取内核按键码,然后将内核按键码转换成android按键码,转换完成
后WindowManager会将内核按键码和android按键码一起发给应用程序来使用,这一点一定要注意。
Android系统开发小知识-在android产品开发中添加新的编译模块
Android开发中用户内容定义在vendor目录下,而用户产品的内容都定义在
如果需要添加新的内容,可以在该目录下新建子目录,同时修改AndroidBoard.mk文件即可。
比如说要添加一个按键映射文件:
(2)将我们需要的按键映射文件gpio-keys.kl和power-button.kl复制到keymaps目录下
(3)在keymaps目录下新建一个Android.mk文件,内容如下:
LOCAL_PATH:
=$(callmy-dir)
include$(CLEAR_VARS)
file:
=$(TARGET_OUT_KEYLAYOUT)/gpio-keys.kl
ALL_PREBUILT+=$(file)
$(file):
$(LOCAL_PATH)/gpio-keys.kl|$(ACP)
$(transform-prebuilt-to-target)
file:
=$(TARGET_OUT_KEYLAYOUT)/power-button.kl
ALL_PREBUILT+=$(file)
$(file):
$(LOCAL_PATH)/power-button.kl|$(ACP)
$(transform-prebuilt-to-target)
include$(LOCAL_PATH)/keymaps/Mdroid.mk