背景

  • 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
    ```dts
    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中提取)