ARM Linux 驱动Input子系统之按键驱动测试

发布时间:2017-7-1 10:55:06编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"ARM Linux 驱动Input子系统之按键驱动测试 ",主要涉及到ARM Linux 驱动Input子系统之按键驱动测试 方面的内容,对于ARM Linux 驱动Input子系统之按键驱动测试 感兴趣的同学可以参考一下。

上一篇已经谈过,在现内核的中引入设备树之后对于内核驱动的编写,主要集中在硬件接口的配置上了即xxxx.dts文件的编写。

在自己的开发板上移植按键驱动:

1、根据开发板的原理图

确定按键的硬件接口为:GPIO2_2、GPIO2_3、GPIO2_5、GPIO0_30。

修改dts文件使其与原理图的按键接口一致。

gpio_buttons: gpio_buttons@0 {        compatible = "gpio-keys";        #address-cells = <1>;        #size-cells = <0>;        switch@1 {            label = "button0";            linux,code = <0x100>;            gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>;        };        switch@2 {            label = "button1";            linux,code = <0x101>;            gpios = <&gpio2 2 GPIO_ACTIVE_HIGH>;        };        switch@3 {            label = "button2";            linux,code = <0x102>;            gpios = <&gpio0 30 GPIO_ACTIVE_HIGH>;            gpio-key,wakeup;        };        switch@4 {            label = "button3";            linux,code = <0x103>;            gpios = <&gpio2 5 GPIO_ACTIVE_HIGH>;        };    };
gpio_keys_s0: gpio_keys_s0 {        pinctrl-single,pins = <            0x94 (PIN_INPUT_PULLDOWN | MUX_MODE7)    /* gpmc_oen_ren.gpio2_3 */            0x90 (PIN_INPUT_PULLDOWN | MUX_MODE7)    /* gpmc_advn_ale.gpio2_2 */            0x70 (PIN_INPUT_PULLDOWN | MUX_MODE7)    /* gpmc_wait0.gpio0_30 */            0x9c (PIN_INPUT_PULLDOWN | MUX_MODE7)    /* gpmc_ben0_cle.gpio2_5 */        >;    };

保存编译生成zyr-am335x-evmsk.dtb

在内核中确保xxx/linux3.14.65/drivers/input/keyboard/gpio_key.c被编译进去(可以通过各层的Makefile与Kconfig还有menuconfig来实现)

编译好的内核和dtb文件下载到开发板中查看按键的事件类型:

[root@zyr-am335x mnt]#cd[root@zyr-am335x ]#cat /proc/bus/input/devicesI: Bus=0019 Vendor=0001 Product=0001 Version=0100N: Name="gpio_buttons.7"P: Phys=gpio-keys/input0S: Sysfs=/devices/gpio_buttons.7/input/input0U: Uniq=H: Handlers=event0B: PROP=0B: EV=3B: KEY=f 0 0 0 0 0 0 0 0[root@zyr-am335x ]#

可以看到按键的事件或者是用户接口吧为event0.。知道了用户的按键接口就可以编写测试程序了。

测试程序目的:实现一个按键对应一个LED灯,按键按一次LED灯的状态变化一次(前提是led子系统对应的LED驱动已经加载入内核中):

#include <stdio.h>#include <linux/input.h>#include <fcntl.h>#include <sys/time.h>#include <unistd.h>void keyboard_test(){    int count_sw1 = 0;    int count_sw2 = 0;    int count_sw3 = 0;    int count_sw4 = 0;    int fd=open("/dev/input/event0",O_RDWR);    if( fd <= 0 )    {        printf("Can not open keyboard input file\n");    }        struct input_event *event;    char buf[128] = {0};    fd_set rfds;    FD_ZERO(&rfds);    FD_SET(fd, &rfds);        while(1)    {        int ret = select(fd + 1,&rfds, NULL,NULL,NULL);        if(ret < 0)            continue;        if( FD_ISSET(fd, &rfds) )        {            int readn = read(fd, buf, sizeof(struct input_event));            if (readn <= 0)            {                printf("uart read error %d\n", readn);                continue;            }                        struct input_event *my_event=(struct input_event*)buf;            if(my_event->type == EV_KEY)            {                switch( my_event->code )                {                    case 256:                        printf("This is a button:%d %d\n", my_event->code,my_event->value);                        count_sw1++;                        if(count_sw1==1)                        {                            system("echo 1 > /sys/class/leds/zyrD1:green:usr0/brightness");                        }                        else if(count_sw1==4)                        {                            system("echo 0 > /sys/class/leds/zyrD1:green:usr0/brightness");                            count_sw1=0;                        }                        break;                    case 257:                        printf("This is a button:%d %d\n", my_event->code,my_event->value);                        count_sw2++;                        if(count_sw2==1)                        {                            system("echo 1 > /sys/class/leds/zyrD2:green:usr1/brightness");                        }                        else if(count_sw2==4)                        {                            system("echo 0 > /sys/class/leds/zyrD2:green:usr1/brightness");                            count_sw2=0;                        }                        break;                    case 258:                        printf("This is a button:%d %d\n", my_event->code,my_event->value);                        count_sw3++;                        if(count_sw3==1)                        {                            system("echo 1 > /sys/class/leds/zyrD3:green:heartbeat/brightness");                        }                        else if(count_sw3==4)                        {                            system("echo 0 > /sys/class/leds/zyrD3:green:heartbeat/brightness");                            count_sw3=0;                        }                        break;                    case 259:                        printf("This is a button:%d %d\n", my_event->code,my_event->value);                        count_sw4++;                        if(count_sw4==1)                        {                            system("echo 1 > /sys/class/leds/zyrD4:green:mmc0/brightness");                        }                        else if(count_sw4==4)                        {                            system("echo 0 > /sys/class/leds/zyrD4:green:mmc0/brightness");                            count_sw4=0;                        }                        break;                    default:


上一篇:MyBatis3错误:Parameter 'id' not found. Available parameters are [arg2, arg1, arg0, param3, param1, param2]或者Parameter '0' not found. Available parameters are [arg2, arg1, arg0, param3, param1, param2]
下一篇:博客园文章个性签名

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款