背景

  • Platform: M55S
  • OS: Linux
  • Kernel: 4

需求:

项目需要添加一个类似电话机的那种矩阵键盘,开始打算自己写个扫描算法,后面发现内核自带。

过程

matrix-keypad(内核自带驱动): drivers/input/keyboard/

matrix-keypad的GPIO口上拉:

Godshand -w -a 0xB3F000B0 -v 0x55555000 

注: 这个需要根据自己的硬件平台添加, 这个很重要,可能会导致键值不对或乱码

内核menuconfig添加驱动:

DeviceDrivers --->         
   Inputdevice support  --->         
       <*>   Event interface             
           Keyboards  --->         
                <*>   GPIO driven matrix keypad support    

DTS配置

说明见下面注释,也可查看doc

matrix_keypad: matrix-keypad {
    status = "disable";
    compatible = "gpio-matrix-keypad";
    keypad,num-rows = <4>;
    keypad,num-columns = <4>;

    /* 根据实际硬件配置引脚 */
    col-gpios = <&gpio2 19 1
        &gpio2 16 1
        &gpio2 22 1
        &gpio2 21 1
    >;
    row-gpios = <&gpio2 15 1
        &gpio2 20 1
        &gpio2 17 1
        &gpio2 18 1
    >;

    /* sample keymap 键值*/
    /* row << 24 | column << 16 | key-code */
    linux,keymap = <
        0x0000004f /* row 0, col 0, KEY_KP1 */
        0x0001004b /* row 0, col 1, KEY_KP4 */
        0x00020047 /* row 0, col 2, KEY_KP7*/
        0x0003003c /* row 0, col 3,  */
        0x01000050 /* row 1, col 0, KEY_KP2 */
        0x0101004c /* row 1, col 1, KEY_KP5*/
        0x01020048 /* row 1, col 2, KEY_KP8*/
        0x01030052 /* row 1, col 3, KEY_KP0*/
        0x02000051 /* row 2, col 0, KEY_KP3 */
        0x0201004d /* row 2, col 1, KEY_KP6 */
        0x02020049 /* row 2, col 2, KEY_KP9*/
        0x0203003b /* row 2, col 3, # */
        0x0300001f /* row 3, col 0, S */
        0x0301003e /* row 3, col 1,  */
        0x0302001e /* row 3, col 2, A */
        0x03030013 /* row 3, col 3, R */
    >;

gpio-activelow;
    /*wakeup-source;*/
    debounce-delay-ms = <30>;
    col-scan-delay-us = <100>;
    linux,no-autorepeat;
};

测试

  1. 自己写测试代码
  2. 使用input event事件分析工具: evtestgetevent(android中提取)