KeyPad使用参考

Version 1.1


1. 概述

为方便用户使用矩阵按键,目前我们开发板专门规划出14个IO口,最大支持7x7键盘共49个按键。由底层硬件直接处理按键信息,减轻cpu去查询按键的负担。


2. Dts配置


2.1. Demo板支持的keypad padmux

表2-1

KeyPad Group Mode GPIO DEV
7x7 1 PAD_KEY0 ~ PAD_KEY13 /dev/input/event0 or /dev/input/event1
4x4 2 PAD_KEY0 ~ PAD_KEY7
3x3 3 PAD_KEY8 ~ PAD_KEY13

2.2. KeyPad的dts配置

  1. Pioneer.dtsi

    1. Standard: 选择使用矩阵键盘大小,

      1. keypad7*7,使用PINMUX_FOR_BT1120_MODE_1

      2. keypad4*4,使用PINMUX_FOR_BT1120_MODE_2

      3. keypad3*3,使用PINMUX_FOR_BT1120_MODE_3

    2. Keypadmode:按键触发中断类型,具体如下:

      1. Occur Irq in key Pressed or release. Keep all press and all release key status.

        release result will be store R17-1e->{64:128}

      2. Occur Irq in key Pressed.Keep current press and last time press status.

        last time pressd result store R17-1e->{64:128}

      3. Occur Irq in key release. Keep current release and last time release status.

        last time relsase result store R17-1e->{64:128}

      4. Occur Irq in key Pressed. Support press single key.(暂不支持使用)

    3. Keypad-rowX: 用户定义键值

  2. Keypad mode设置,修改pioneer3-ssc020a-s01a-demo-padmux.dtsi,三种选择其中一种

    1. 使用7x7键盘,设置mode为PINMUX_FOR_BT1120_MODE_1

    2. 使用4x4键盘,设置mode为PINMUX_FOR_BT1120_MODE_2

    3. 使用3x3键盘,设置mode为PINMUX_FOR_BT1120_MODE_3


3. Kernel配置

打开SStar I2C对Keypad的配置


4. KEYPAD短接帽配置

  • 使用7x7键盘,所有短接帽都靠左接

  • 使用4x4键盘,SW1 ~ SW8靠右接

  • 使用3x3键盘,SW9 ~ SW14靠右接


5. app读取key

使用如下demo验证

//Demo位置:kernel/drivers/sstar/keypad/verify/key.c

#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <linux/input.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc,char *argv[])
{
    int fd;
    struct input_event ev_key;
    if (argc != 2)
    {
        printf("Usage:\n");
        printf("%s /dev/input/event0 or /dev/input/event1\n",argv[0]);
        return 0;
    }
    fd= open(argv[1], O_RDWR);
    if(fd < 0)
    {
        perror("open device buttons");
        exit(1);
    }
    while(1)
    {
        read(fd,&ev_key,sizeof(struct input_event));
        printf("type:%d,code:%d,value:%d\n",ev_key.type,
        ev_key.code,ev_key.value);
    }
    close(fd);
    return 0;
}