MTK Android Driver :add a new key

本文档详细介绍了如何在Android ICS系统上添加新按键,包括修改源代码、键码定义、Java识别等步骤,并提供了完整的流程说明。
参照:[FAQ04495][Keypad]How to add a new key on android ICS\ICS2

1.在DCT tool keypad list 文件增加新按键的选项
alps\mediatek\source\dct\Keypad_YuSu.cmp中添加新键,如SMS快捷键
KEY_SYM
KEY_SMS
KEY_0

2.打开DCT tool 在keypad矩阵中在相应定义的按键位中添加新按键,如SMS,然后Save

3.修改linux 键盘码文件input.h
由于preloader\uboot\kernel\factory 等情况分开使用,相应的文件路径下的input.h都应该修改为新按键增加键码值
kernel\include\linux\input.h
bionic\libc\kernel\common\linux\input.h
external\kernel-headers\original\linux\input.h
external\qemu\linux_keycodes.h
mediatek\plaform\mt6575\preloader\src\drivers\inc\linux\input.h
Mediatek\plaform\mt6575\uboot\inc\linux\input.h
如KEY_SMS
#define KEY_SMS 252

4.增加keypad layout文件键盘映射,linux和android key映射
mediatek\config\<project name>\mt6575-kpd.kl
如:
key 252 SMS 
其中252 是linux键码,SMS是android识别key值 如果是需要唤醒系统,还需要增加WAKE
如果新按键是全键盘的一些生僻字符,修改: mediatek\config\<project name>\mt6575-kpd.kcm

5.修改Java识别keycode
framework/base/include/ui/KeyCodelabels.h
KEYCODES数据结构后面增加
{"SMS",220}
framework/base/native/include/android/KeyCodes.h
在按键定义项增加AKEYCODE_SMS = 220;

6.修改Java 键盘事件
framework/base/core/java/android/view/keyevent.java
/**
*@hide
*/
public static final int KEYCODE_SMS =220;
最后的按键为新增的
private static final int LAST_KEYCODE ==KEYCODE_SMS;
以上/**/注释的code是android 非开放API或变量定义的时候,需要添加Java Doc的识别,否则要运行make update-api才能build通过.
如果是系统按键,修改framework/base/libs/ui/input.cpp
isSystemKey()增加case AKEYCODE_SMS:

7.修改XML文件描述符framework/base/core/res/res/values/attr.xml
<enum name="KEYCODE_SMS" value="220" />

8.增加测试验证log在android
framework\base\policy\src\com\android\internal\polidy\impl\phoneWindowManager.java
在interceptKeyBeforeDispatching()增加
if(keycode== KeyEvent.KEYCODE_SMS){
log.d(TAG, "interceptKeyTi KEYCODE_SMS keyCode="+ keyCode + " down=" + down + "
repeatCount=" + repeatCount + “ keyguardOn=” + keyguardOn + “ mHomePressed=” +
mHomePressed + “ cancled=” + canceled)

9.增加按键全局功能响应:
framework\base\policy\src\com\android\internal\polidy\impl\phoneWindow.java
分别在onKeyDown()、onKeyUp()增加对应代码
if(keycode== KeyEvent.KEYCODE_SMS){}
修正過後device booting 還是沒有執行tpd_local_init,下面log沒有看到"TPD init device driver" 這會跟tpd_device_init 比較後出現有關嗎? [ 1.313635] <1>.(1)[1:swapper/0][tpd_em_log] :register device successfully [ 1.314494] <1>.(1)[1:swapper/0]ilitek_touch_driver_init_printk123 [ 1.315311] <1>.(1)[1:swapper/0] ILITEK INFO line = 44 ilitek_data_init : ilitek_log_level_value = 3. [ 1.316656] <1>.(1)[1:swapper/0]mtk-tpd:[tpd_get_dts_info:66] [tpd]We find touch compatible custom node mediatek,ilitek_touch [ 1.318068] <1>.(1)[1:swapper/0]mtk-tpd:[tpd_get_dts_info:74] [tpd]use-tpd-button = 0 [ 1.319061] <1>.(1)[1:swapper/0]mtk-tpd:[tpd_get_dts_info:147] [tpd]tpd-filter-enable = 1, pixel_density = 124 [ 1.320309] <1>.(1)[1:swapper/0] ILITEK INFO line = 218 ilitek_touch_driver_init : ilitek_tpd_get_dts_info after. [ 1.321589] <1>.(1)[1:swapper/0]mtk-tpd:[tpd_driver_add:499] tpd_device_name[1]=ilitek_ts [ 1.322609] <1>.(1)[1:swapper/0]mtk-tpd:[tpd_driver_add:502] tpd_local_init[1]=144595168 [ 1.323625] <1>.(1)[1:swapper/0]mtk-tpd:[tpd_driver_add:517] tpd_driver_add return=0 [ 1.324592] <1>.(1)[1:swapper/0] ILITEK INFO line = 226 ilitek_touch_driver_init : ilitek TPD ini success111. [ 3.338385] <0>.(0)[1:swapper/0]mtk-tpd:[tpd_device_init:748] [tpd]tpd_device_init. [ 3.339558] <0>.(0)[1:swapper/0]mtk-tpd:[tpd_device_init:751] [tpd]tpd_init_work_callback. [ 3.340601] <0>.(0)[1:swapper/0]mtk-tpd:[tpd_device_init:753] [tpd]tpd_init_workqueue. [ 3.340676] <2>.(2)[147:kworker/u8:1]mtk-tpd:[tpd_init_work_callback:741] MediaTek touch panel driver init static int tpd_local_init(void) { tp_log_info("TPD init device driver\n"); printk("TPD init device driver aaa\n"); if (i2c_add_driver(&tpd_i2c_driver) != 0) { tp_log_err("Unable to add i2c driver.\n"); return -1; } if (tpd_load_status == 0) { tp_log_err("Add error touch panel driver.\n"); i2c_del_driver(&tpd_i2c_driver); return -1; } tpd_button_setting(TPD_KEY_COUNT, tpd_keys_local, tpd_keys_dim_local); // initialize tpd button data tpd_type_cap = 1; tp_log_info("TPD init done\n"); return TPD_OK; } void tpd_get_dts_info(void) { struct device_node *node1 = NULL; int key_dim_local[16] = {0}, i = 0; node1 = of_find_matching_node(node1, touch_of_match); if (node1) { TPD_DMESG("[tpd]We find touch compatible custom node mediatek,ilitek_touch\n"); of_property_read_u32(node1, "tpd-max-touch-num", &tpd_dts_data.touch_max_num); of_property_read_u32(node1, "use-tpd-button", &tpd_dts_data.use_tpd_button); pr_debug("[tpd]use-tpd-button = %d\n", tpd_dts_data.use_tpd_button); TPD_DMESG("[tpd]use-tpd-button = %d\n", tpd_dts_data.use_tpd_button); if (of_property_read_u32_array(node1, "tpd-resolution", tpd_dts_data.tpd_resolution, ARRAY_SIZE(tpd_dts_data.tpd_resolution))) { pr_debug("[tpd] resulution is %d %d", tpd_dts_data.tpd_resolution[0], tpd_dts_data.tpd_resolution[1]); } if (tpd_dts_data.use_tpd_button) { of_property_read_u32(node1, "tpd-key-num", &tpd_dts_data.tpd_key_num); if (of_property_read_u32_array(node1, "tpd-key-local", tpd_dts_data.tpd_key_local, ARRAY_SIZE(tpd_dts_data.tpd_key_local))) pr_debug("tpd-key-local: %d %d %d %d", tpd_dts_data.tpd_key_local[0], tpd_dts_data.tpd_key_local[1], tpd_dts_data.tpd_key_local[2], tpd_dts_data.tpd_key_local[3]); if (of_property_read_u32_array(node1, "tpd-key-dim-local", key_dim_local, ARRAY_SIZE(key_dim_local))) { memcpy(tpd_dts_data.tpd_key_dim_local, key_dim_local, sizeof(key_dim_local)); for (i = 0; i < 4; i++) { pr_debug("[tpd]key[%d].key_x = %d\n", i, tpd_dts_data .tpd_key_dim_local[i] .key_x); pr_debug("[tpd]key[%d].key_y = %d\n", i, tpd_dts_data .tpd_key_dim_local[i] .key_y); pr_debug("[tpd]key[%d].key_W = %d\n", i, tpd_dts_data .tpd_key_dim_local[i] .key_width); pr_debug("[tpd]key[%d].key_H = %d\n", i, tpd_dts_data .tpd_key_dim_local[i] .key_height); } } } of_property_read_u32(node1, "tpd-filter-enable", &tpd_dts_data.touch_filter.enable); if (tpd_dts_data.touch_filter.enable) { of_property_read_u32(node1, "tpd-filter-pixel-density", &tpd_dts_data.touch_filter.pixel_density); if (of_property_read_u32_array(node1, "tpd-filter-custom-prameters", (u32 *)tpd_dts_data.touch_filter.W_W, ARRAY_SIZE(tpd_dts_data.touch_filter.W_W))) pr_debug("get tpd-filter-custom-parameters"); if (of_property_read_u32_array(node1, "tpd-filter-custom-speed", tpd_dts_data.touch_filter.VECLOCITY_THRESHOLD, ARRAY_SIZE(tpd_dts_data .touch_filter .VECLOCITY_THRESHOLD))) pr_debug("get tpd-filter-custom-speed"); } memcpy(&tpd_filter, &tpd_dts_data.touch_filter, sizeof(tpd_filter)); pr_debug("[tpd]tpd-filter-enable = %d, pixel_density = %d\n", tpd_filter.enable, tpd_filter.pixel_density); tpd_dts_data.tpd_use_ext_gpio = of_property_read_bool(node1, "tpd-use-ext-gpio"); of_property_read_u32(node1, "tpd-rst-ext-gpio-num", &tpd_dts_data.rst_ext_gpio_num); TPD_DMESG("[tpd]tpd-filter-enable = %d, pixel_density = %d\n", tpd_filter.enable, tpd_filter.pixel_density); } else { TPD_DMESG("can't find touch compatible custom node\n"); } } static struct tpd_driver_t tpd_device_driver = { .tpd_device_name = ILITEK_TS_NAME, .tpd_local_init = tpd_local_init, .suspend = tpd_suspend, .resume = tpd_resume, .tpd_have_button = 1, //.tpd_have_button = 0, }; static int __init ilitek_touch_driver_init(void) { printk("ilitek_touch_driver_init_printk123\n"); if(ilitek_data_init() < 0) { return ILITEK_FAIL; } tpd_get_dts_info(); tp_log_info("ilitek_tpd_get_dts_info after.\n"); if (tpd_driver_add(&tpd_device_driver) < 0) { tp_log_err("ilitek TPD add TP driver failed\n"); } tp_log_info("ilitek TPD ini success111.\n"); return 0; } static void tpd_init_work_callback(struct work_struct *work) { TPD_DEBUG("MediaTek touch panel driver init\n"); if (platform_driver_register(&tpd_driver) != 0) TPD_DMESG("unable to register touch panel driver.\n"); } static int __init tpd_device_init(void) { int res = 0; TPD_DMESG("[tpd]tpd_device_init.\n"); tpd_init_workqueue = create_singlethread_workqueue("mtk-tpd"); INIT_WORK(&tpd_init_work, tpd_init_work_callback); TPD_DMESG("[tpd]tpd_init_work_callback.\n"); res = queue_work(tpd_init_workqueue, &tpd_init_work); TPD_DMESG("[tpd]tpd_init_workqueue.\n"); if (!res) { pr_info("tpd : touch device init failed res:%d\n", res); TPD_DMESG("tpd : touch device init failed res:%d\n", res); } return 0; }
07-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值