嵌入式Linux之我行——按键驱动在2440上的实例开发(带去抖动)

2019-07-13 08:10发布



4.将按键驱动代码部署到内核中。   #cp -f my2440_buttons./linux-2.6.30.4/drivers/char //把驱动源码复制到内核驱动的字符设备下
#gedit /linux-2.6.30.4/drivers/char/Kconfig //添加按键设备配置 config MY2440_BUTTONS
    tristate "My2440 Buttons Device"
    depends on ARCH_S3C2440
    default y
    ---help---
      My2440 User Buttons


#gedit /linux-2.6.30.4/drivers/char/Makefile //添加按键设备配置 obj-$(CONFIG_MY2440_BUTTONS) += my2440_buttons.o
5.配置内核,选择按键设备选项 #make menuconfig Device Drivers --->
    Character devices ---> 
        <*> My2440 Buttons Device (NEW)

6. 编译内核并下载到开发板上,查看已加载的设备:#cat /proc/devices,可以看到my2440_buttons的主设备号为232 7.编写应用程序测试按键驱动,文件名:buttons_test.c #include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main(int argc, char **argv)
{
    int fd;
    int key_status[6];

    //以阻塞方式打开设备文件,非阻塞时flags=O_NONBLOCK
    fd = open("/dev/my2440_buttons", 0);

    if(fd < 0)
    {
        printf("Open Buttons Device Faild! ");
        exit(1);
    }

    while(1)
    {
        int i;
        int ret;
        fd_set rds;
        
        FD_ZERO(&rds);
        FD_SET(fd, &rds);
        
        //应用程序进行轮询,查询是否可对设备进行访问
        ret = select(fd + 1, &rds, NULL, NULL, NULL);
        
        if(ret < 0)
        {
            printf("Read Buttons Device Faild! ");
            exit(1);
        }
        
        if(ret == 0)
        {
            printf("Read Buttons Device Timeout! ");
        }
        else if(FD_ISSET(fd, &rds))
        {
            //读设备
            ret = read(fd, key_status, sizeof(key_status));

            if(ret != sizeof(key_status))
            {
                if(errno != EAGAIN)
                {
                    printf("Read Button Device Faild! ");
                }

                continue;
            }
            else
            {
                for(= 0; i < 6; i++)
                {
                    //对应驱动中按键的状态,为0即按键被按下
                    if(key_status[i] == 0)
                    {
                        printf("Key%d DOWN ", i + 1);
                    }
                }
            }
        }
    }

    close(fd);

    return 0;
}

8.在开发主机上交叉编译测试应用程序,并复制到文件系统的/usr/sbin目录下,然后重新编译文件系统下载到开发板上 #arm-linux-gcc -o buttons_test buttons_test.c
9. 在开发板上的文件系统中创建一个按键设备的节点,然后运行测试程序,效果图如下,观测按开发板上的按键时,在串口工具中会输出对应按键被按下的信息,也不会出现抖动现象(即按某个按键时,不会多次产生该按键按下的情况) 三、补充问题 1.当我们启动开发板后,按键驱动就会被自动加载,这个时候,我们执行#cat /proc/interrupts命令查看系统当前使用的中断情况,没有发现有按键的中断,这是为什么?看看我们的驱动代码就知道了,原来,按键驱动中的中断申请是在设备打开里面,这个时候设备只加载了还没有打开,所以这里还没有 2.修改驱动代码,把中断的申请放到设备初始化加载里面(即将open中所有的代码移到button_init中),再来看看系统中断使用的情况,按键的中断就出现了。52、55、57、58、59、63分别为6个按键的中断号,KEY0~KEY5按键名称就是驱动中提到注意的地方(注意这个名称,在后面的一个现象中会出现),就是在这里出现了   4.将按键驱动代码部署到内核中。   #cp -f my2440_buttons./linux-2.6.30.4/drivers/char //把驱动源码复制到内核驱动的字符设备下
#gedit /linux-2.6.30.4/drivers/char/Kconfig //添加按键设备配置 config MY2440_BUTTONS
    tristate "My2440 Buttons Device"
    depends on ARCH_S3C2440
    default y
    ---help---
      My2440 User Buttons


#gedit /linux-2.6.30.4/drivers/char/Makefile //添加按键设备配置 obj-$(CONFIG_MY2440_BUTTONS) += my2440_buttons.o
5.配置内核,选择按键设备选项 #make menuconfig Device Drivers --->
    Character devices ---> 
        <*> My2440 Buttons Device (NEW)

6. 编译内核并下载到开发板上,查看已加载的设备:#cat /proc/devices,可以看到my2440_buttons的主设备号为232 7.编写应用程序测试按键驱动,文件名:buttons_test.c #include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main(int argc, char **argv)
{
    int fd;
    int key_status[6];

    //以阻塞方式打开设备文件,非阻塞时flags=O_NONBLOCK
    fd = open("/dev/my2440_buttons", 0);

    if(fd < 0)
    {
        printf("Open Buttons Device Faild! ");
        exit(1);
    }

    while(1)
    {
        int i;
        int ret;
        fd_set rds;
        
        FD_ZERO(&rds);
        FD_SET(fd, &rds);
        
        //应用程序进行轮询,查询是否可对设备进行访问
        ret = select(fd + 1, &rds, NULL, NULL, NULL);
        
        if(ret < 0)
        {
            printf("Read Buttons Device Faild! ");
            exit(1);
        }
        
        if(ret == 0)
        {
            printf("Read Buttons Device Timeout! ");
        }
        else if(FD_ISSET(fd, &rds))
        {
            //读设备
            ret = read(fd, key_status, sizeof(key_status));

            if(ret != sizeof(key_status))
            {
                if(errno != EAGAIN)
                {
                    printf("Read Button Device Faild! ");
                }

                continue;
            }
            else
            {
                for(= 0; i < 6; i++)
                {
                    //对应驱动中按键的状态,为0即按键被按下
                    if(key_status[i] == 0)
                    {
                        printf("Key%d DOWN ", i + 1);
                    }
                }
            }
        }
    }

    close(fd);

    return 0;
}

8.在开发主机上交叉编译测试应用程序,并复制到文件系统的/usr/sbin目录下,然后重新编译文件系统下载到开发板上 #arm-linux-gcc -o buttons_test buttons_test.c
9. 在开发板上的文件系统中创建一个按键设备的节点,然后运行测试程序,效果图如下,观测按开发板上的按键时,在串口工具中会输出对应按键被按下的信息,也不会出现抖动现象(即按某个按键时,不会多次产生该按键按下的情况) 三、补充问题 1.当我们启动开发板后,按键驱动就会被自动加载,这个时候,我们执行#cat /proc/interrupts命令查看系统当前使用的中断情况,没有发现有按键的中断,这是为什么?看看我们的驱动代码就知道了,原来,按键驱动中的中断申请是在设备打开里面,这个时候设备只加载了还没有打开,所以这里还没有 2.修改驱动代码,把中断的申请放到设备初始化加载里面(即将open中所有的代码移到button_init中),再来看看系统中断使用的情况,按键的中断就出现了。52、55、57、58、59、63分别为6个按键的中断号,KEY0~KEY5按键名称就是驱动中提到注意的地方(注意这个名称,在后面的一个现象中会出现),就是在这里出现了  


4.将按键驱动代码部署到内核中。   #cp -f my2440_buttons./linux-2.6.30.4/drivers/char //把驱动源码复制到内核驱动的字符设备下
#gedit /linux-2.6.30.4/drivers/char/Kconfig //添加按键设备配置 config MY2440_BUTTONS
    tristate "My2440 Buttons Device"
    depends on ARCH_S3C2440
    default y
    ---help---
      My2440 User Buttons


#gedit /linux-2.6.30.4/drivers/char/Makefile //添加按键设备配置 obj-$(CONFIG_MY2440_BUTTONS) += my2440_buttons.o
5.配置内核,选择按键设备选项 #make menuconfig Device Drivers --->
    Character devices ---> 
        <*> My2440 Buttons Device (NEW)

6. 编译内核并下载到开发板上,查看已加载的设备:#cat /proc/devices,可以看到my2440_buttons的主设备号为232 7.编写应用程序测试按键驱动,文件名:buttons_test.c #include <stdio.h>
#include <stdlib.h>
#include <errno.h>