打印

EE_BeagleBone_Cape之矩阵键盘

[复制链接]
503|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Clovee|  楼主 | 2017-10-9 10:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
EE_BeagleBone_Cape之矩阵键盘


1.        概述
这篇文档是关于EE_BeagleBone_Cape  4x4矩阵键盘的设计相关,欢迎大伙拍砖
2.        矩阵键盘硬件连接
具体使用了以下几个管脚:
  • gpio0[15]        Row1
    gpio3[21]        Row2
    gpio0[14]        Row3
    gpio3[19]        Row4
    gpio3[17]        Col1
    gpio3[15]        Col2
    gpio3[16]        Col3
    gpio3[14]        Col4


复制代码
3.        矩阵键盘设计点滴
1.        注意我这个4x4的矩阵键盘没有外接电阻哦,所以作为输入的引脚做好拉地,配置成AM33XX_PIN_INPUT_PULLDOWN
2.        注意Row和Col的引脚输入输出关系不要定义反了,Row为input,Col为output。我开始的时候定义反了搞死都出不来结果。
4.        代码相关
4.1        Pinmux
看看4x4键盘涉及到的几个管脚的定义吧,如下所示:
  • /* Matrix GPIO Keypad Support for profile-0 only: TODO */




/* pinmux for keypad device */
static struct pinmux_config matrix_keypad_pin_mux[] = {
        {"uart1_txd.gpio0_15",        OMAP_MUX_MODE7 | AM33XX_PIN_INPUT_PULLDOWN},
        {"mcasp0_ahclkx.gpio3_21",    OMAP_MUX_MODE7 | AM33XX_PIN_INPUT_PULLDOWN},
        {"uart1_rxd.gpio0_14",        OMAP_MUX_MODE7 | AM33XX_PIN_INPUT_PULLDOWN},
        {"mcasp0_fsr.gpio3_19",       OMAP_MUX_MODE7 | AM33XX_PIN_INPUT_PULLDOWN},


        {"mcasp0_ahclkr.gpio3_17",    OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT},
        {"mcasp0_fsx.gpio3_15",       OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT},
        {"mcasp0_axr0.gpio3_16",      OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT},
        {"mcasp0_aclkx.gpio3_14",     OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT},


        {NULL, 0},
};


/* Keys mapping */
static const uint32_t am335x_evm_matrix_keys[] = {
        KEY(0, 0, KEY_A),
        KEY(1, 0, KEY_3),
        KEY(2, 0, KEY_2),
        KEY(3, 0, KEY_1),


        KEY(0, 1, KEY_B),
        KEY(1, 1, KEY_6),
        KEY(2, 1, KEY_5),
        KEY(3, 1, KEY_4),


        KEY(0, 2, KEY_C),
        KEY(1, 2, KEY_9),
        KEY(2, 2, KEY_8),
        KEY(3, 2, KEY_7),


        KEY(0, 3, KEY_D),
        KEY(1, 3, KEY_OK),
        KEY(2, 3, KEY_0),
        KEY(3, 3, KEY_DELETE),


};


const struct matrix_keymap_data am335x_evm_keymap_data = {
        .keymap      = am335x_evm_matrix_keys,
        .keymap_size = ARRAY_SIZE(am335x_evm_matrix_keys),
};


static const unsigned int am335x_evm_keypad_row_gpios[] = {
        GPIO_TO_PIN(0, 15), GPIO_TO_PIN(3, 21), GPIO_TO_PIN(0, 14), GPIO_TO_PIN(3, 19)
};


static const unsigned int am335x_evm_keypad_col_gpios[] = {
        GPIO_TO_PIN(3, 17), GPIO_TO_PIN(3, 15), GPIO_TO_PIN(3, 16), GPIO_TO_PIN(3, 14)
};


static struct matrix_keypad_platform_data am335x_evm_keypad_platform_data = {
        .keymap_data       = &am335x_evm_keymap_data,
        .row_gpios         = am335x_evm_keypad_row_gpios,
        .num_row_gpios     = ARRAY_SIZE(am335x_evm_keypad_row_gpios),
        .col_gpios         = am335x_evm_keypad_col_gpios,
        .num_col_gpios     = ARRAY_SIZE(am335x_evm_keypad_col_gpios),
        .active_low        = false,
        .debounce_ms       = 5,
        .col_scan_delay_us = 2,
};


static struct platform_device am335x_evm_keyboard = {
        .name  = "matrix-keypad",
        .id    = -1,
        .dev   = {
                .platform_data = &am335x_evm_keypad_platform_data,
        },
};


static void matrix_keypad_init(int evm_id, int profile)
{
        int err;


        setup_pin_mux(matrix_keypad_pin_mux);
        err = platform_device_register(&am335x_evm_keyboard);
        if (err) {
                pr_err("failed to register matrix keypad (4x4) device\n");
        }
}

复制代码4.2        初始化
  • /* Beaglebone Rev A3 and after */
    static struct evm_dev_cfg beaglebone_dev_cfg[] = {
            {tps65217_init,        DEV_ON_BASEBOARD, PROFILE_NONE},
            {mii1_init,        DEV_ON_BASEBOARD, PROFILE_NONE},
            {usb0_init,        DEV_ON_BASEBOARD, PROFILE_NONE},
            {usb1_init,        DEV_ON_BASEBOARD, PROFILE_NONE},
            {mmc0_init,        DEV_ON_BASEBOARD, PROFILE_NONE},
            {i2c1_init,     DEV_ON_BASEBOARD, PROFILE_NONE},
            {i2c2_init,        DEV_ON_BASEBOARD, PROFILE_NONE},
            {lcdc_init,        DEV_ON_BASEBOARD, (PROFILE_0 | PROFILE_1 |
                                                    PROFILE_2 | PROFILE_7) },
            {evm_nand_init, DEV_ON_BASEBOARD,
                    (PROFILE_ALL & ~PROFILE_2 & ~PROFILE_3)},
            {matrix_keypad_init, DEV_ON_BASEBOARD, PROFILE_0},
            {NULL, 0, 0},
    };


复制代码
看看include\linux\Input.h关于键值的定义吧
  • #define KEY_1                        2
    #define KEY_2                        3
    #define KEY_3                        4
    #define KEY_4                        5
    #define KEY_5                        6
    #define KEY_6                        7
    #define KEY_7                        8
    #define KEY_8                        9
    #define KEY_9                        10
    #define KEY_0                        11


复制代码
4.3        测试程序

从网络上找个一个测试程序,能用!

    #include
    #include
    #include
    #include
    #include
    #include
    int fd;
    int loop_flag = 1;
    void exit_loop()
    {
            loop_flag--;
    }
    void deal_int(int signum)
    {
            if(fd > 0)
                    close(fd);
            exit_loop();
    }
    int main()
    {
            struct input_event evt;
            fd = open("/dev/input/event0",O_RDWR);
            if(fd < 0)
                    printf("Can not open\n");
            while(loop_flag > 0)
            {
                    read(fd,&evt,sizeof(struct input_event));
                    switch(evt.type)
                    {
                            case EV_KEY:
                                    printf("Key -->\nCode: %d\nValue: %d\n",evt.code,evt.value);
                            break;
                            case EV_MSC:
                                  printf("MSC -->\nCode: %d\nValue: %d\n",evt.code,evt.value);
                            break;
                            case EV_SYN:
                                    printf("<-- \n");
                            default:
                                    printf("...\n");
                    }
            }
            return 0;
    }


复制代码
4.4        测试结果
  • MSC -->
    Code: 4
    Value: 12
    Key -->
    Code: 2       //  1
    Value: 1
    <--
    ...
    MSC -->
    Code: 4
    Value: 12
    Key -->
    Code: 2
    Value: 0
    <--
    ...
    MSC -->
    Code: 4
    Value: 9
    Key -->
    Code: 6      //  5
    Value: 1
    <--
    ...
    MSC -->
    Code: 4
    Value: 9
    Key -->
    Code: 6
    Value: 0
    <--
    ...
    MSC -->
    Code: 4
    Value: 6
    Key -->
    Code: 10    //  9
    Value: 1
    <--
    ...
    MSC -->
    Code: 4
    Value: 6
    Key -->
    Code: 10
    Value: 0
    <--
    ...





相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

708

主题

1032

帖子

2

粉丝