最近切换新base的时候遇到home按键功能错乱的问题,着实浪费了一些时间去找原因。下面简单说下分析的过程。
实验环境:
平台--展讯SC8810,LINUX 2.3.5
实验步骤:
1. 按照小板设计需求,正确配置HOME按键的行数和列数,采用的是矩阵键盘的设计模式。
2.开机测试,home键有音量下键的功能,偶现home键的功能。
3.和硬件的人员确保了硬件上没有问题。
4.抓log进行问题的分析。
实验内容:
1、通过adb抓取按键时的log分析抓取的键值(这里介绍两种方法):
1)第一种:开机后,利用usb连接到电脑,打开cmd,输入adb shell后若连接正常,输入cat /proc/kmsg即可抓取相应的log,按下HOME键:测得的log发现home的键值<4>[ 3403.651000] 115D、<4>[ 3404.102000] 65535D、<4>[ 3404.103000] 114D即音量上下键和错误值。
2)第二种:开机后,利用usb连接到电脑,打开cmd,输入adb shell后若连接正常,输入getevent即可。点击home键测得键值:
/dev/input/event0: 00010072 00000000
/dev/input/event0: 0000 0000 00000000
/dev/input/event5: 0003 0000 00000017
/dev/input/event5: 0003 0001 00000016
/dev/input/event0: 00010073 00000000
/dev/input/event0: 0000 0000 00000000
/dev/input/event5: 0003 0000 00000017
/dev/input/event5: 0003 0001 00000016
由测得可知为十六进制的音量上下键的键值115、114.
通常在配置home键的功能时,会涉及到一下几个文件的设定。
2.code/customize/customer_cfg/sp6820gb_trout2/kernel/kpd/kpd_cfg.c文件
#define CUSTOM_KEYPAD_ROWS 7
#define CUSTOM_KEYPAD_COLS 7
用于定义矩阵键盘的行数和列数。
static const unsigned int sprd_keymap[] = {
// 0 row
KEYVAL(0, 0, ANDROID_KEY_VOLUME_DOWN),
KEYVAL(6, 0, ANDROID_KEY_HOME),
// 1 row
KEYVAL(1, 0, ANDROID_KEY_VOLUME_UP),
};
这个地方一定要配对,每个项目可能都会有所不同,具体参照小板原理图,或问硬件人员也可以。
3.code/customize/customer_cfg/sp6820gb_trout2/res/sprd-keypad.kl文件
#KEY_POWER
key 116 POWER WAKE
#KEY_VOLUMEUP
key 115 VOLUME_UP
#KEY_VOLUMEDOWN
key 114 VOLUME_DOWN
#KEY_HOME
key 102 HOME WAKE
102,114,115等值指的是键值,后面的WAKE表示该键有唤醒功能。
4.此外还要保证pinmap设定正确。code/customize/customer_cfg/sp6820gb_trout2/kernel/pinmap/pinmap_cfg.c文件中
MFP_CFG_X(KEYOUT0, AF0, DS1,F_PULL_NONE,S_PULL_NONE,IO_OE),
MFP_CFG_X(KEYOUT1, AF0, DS1,F_PULL_NONE,S_PULL_NONE,IO_OE),
MFP_CFG_X(KEYOUT2, AF0, DS1,F_PULL_NONE,S_PULL_NONE,IO_ OE),
MFP_CFG_X(KEYOUT3, AF0, DS1,F_PULL_NONE,S_PULL_NONE,IO_ OE),
MFP_CFG_X(KEYOUT4, AF0, DS1,F_PULL_NONE,S_PULL_NONE,IO_ OE),
MFP_CFG_X(KEYOUT5, AF0, DS1,F_PULL_NONE,S_PULL_NONE,IO_ OE),
MFP_CFG_X(KEYOUT6, AF0, DS1,F_PULL_NONE,S_PULL_ NONE,IO_ OE),
MFP_CFG_X(KEYOUT7, AF0, DS1,F_PULL_NONE,S_PULL_ NONE,IO_ OE),
MFP_CFG_X(KEYIN0, AF0, DS1,F_PULL_UP,S_PULL_UP,IO_IE),
MFP_CFG_X(KEYIN1, AF0, DS1,F_PULL_UP,S_PULL_UP,IO_IE),
MFP_CFG_X(KEYIN2, AF0, DS1,F_PULL_UP,S_PULL_UP,IO_IE),
MFP_CFG_X(KEYIN3, AF0, DS1,F_PULL_UP,S_PULL_UP,IO_ IE),
MFP_CFG_X(KEYIN4, AF0, DS1,F_PULL_UP,S_PULL_UP,IO_ IE),
MFP_CFG_X(KEYIN5, AF0, DS1,F_PULL_UP,S_PULL_UP,IO_IE),
MFP_CFG_X(KEYIN6, AF0, DS1,F_PULL_ UP,S_PULL_UP,IO_ IE),
MFP_CFG_X(KEYIN7, AF0, DS1,F_PULL_ UP,S_PULL_UP,IO_ IE),
是关于矩阵键盘行和列的设定
pinmap配置
#define MFP_CFG_X(pin, af, drv, func_updown, sleep_updown, io) \
(MFP_SET_ALL |\
(MFP_PIN(PIN_##pin) | MFP_##af | MFP_##drv |\
MFP_##func_updown | MFP_##sleep_updown| MFP_##io))
AF0~AF3用于选择pin的复用功能
DS指pin的驱动能力
F_PULL_NONE,F_PULL_UP,F_PULL_DOWN指在工作模式下pin的上拉和下拉等
S_PULL_NONE,S_PULL_UP,S_PULL_DOWN指在睡眠模式下pin的上拉和下拉等
IO_OE,IO_IE,IO_Z指在睡眠模式下的pin的输出,输入和高阻。
此次对于home键失效的问题,问题是在pinmap的配置上。之前的项目用的3行3列的矩阵键盘。而新base用的矩阵键盘是7行7列的。pinmap中后面的几行几列没有配置好。