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



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!\n");
        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!\n");
            exit(1);
        }
        
        if(ret == 0)
        {
            printf("Read Buttons Device Timeout!\n");
        }
        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!\n");
                }

                continue;
            }
            else
            {
                for(= 0; i < 6; i++)
                {
                    //对应驱动中按键的状态,为0即按键被按下
                    if(key_status[i] == 0)
                    {
                        printf("Key%d DOWN\n", 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!\n");
        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!\n");
            exit(1);
        }
        
        if(ret == 0)
        {
            printf("Read Buttons Device Timeout!\n");
        }
        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!\n");
                }

                continue;
            }
            else
            {
                for(= 0; i < 6; i++)
                {
                    //对应驱动中按键的状态,为0即按键被按下
                    if(key_status[i] == 0)
                    {
                        printf("Key%d DOWN\n", 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!\n");
        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!\n");
            exit(1);
        }
        
        if(ret == 0)
        {
            printf("Read Buttons Device Timeout!\n");
        }
        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!\n");
                }

                continue;
            }
            else
            {
                for(= 0; i < 6; i++)
                {
                    //对应驱动中按键的状态,为0即按键被按下
                    if(key_status[i] == 0)
                    {
                        printf("Key%d DOWN\n", 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!\n");
        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!\n");
            exit(1);
        }
        
        if(ret == 0)
        {
            printf("Read Buttons Device Timeout!\n");
        }
        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!\n");
                }

                continue;
            }
            else
            {
                for(= 0; i < 6; i++)
                {
                    //对应驱动中按键的状态,为0即按键被按下
                    if(key_status[i] == 0)
                    {
                        printf("Key%d DOWN\n", 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!\n");
        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!\n");
            exit(1);
        }
        
        if(ret == 0)
        {
            printf("Read Buttons Device Timeout!\n");
        }
        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!\n");
                }

                continue;
            }
            else
            {
                for(= 0; i < 6; i++)
                {
                    //对应驱动中按键的状态,为0即按键被按下
                    if(key_status[i] == 0)
                    {
                        printf("Key%d DOWN\n", 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!\n");
        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!\n");
            exit(1);
        }
        
        if(ret == 0)
        {
            printf("Read Buttons Device Timeout!\n");
        }
        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!\n");
                }

                continue;
            }
            else
            {
                for(= 0; i < 6; i++)
                {
                    //对应驱动中按键的状态,为0即按键被按下
                    if(key_status[i] == 0)
                    {
                        printf("Key%d DOWN\n", 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.c /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!\n");
        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!\n");
            exit(1);
        }
        
        if(ret == 0)
        {
            printf("Read Buttons Device Timeout!\n");
        }
        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!\n");
                }


                continue;
            }
            else
            {
                for(i = 0; i < 6; i++)
                {
                    //对应驱动中按键的状态,为0即按键被按下
                    if(key_status[i] == 0)
                    {
                        printf("Key%d DOWN\n", 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!\n");
        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!\n");
            exit(1);
        }
        
        if(ret == 0)
        {
            printf("Read Buttons Device Timeout!\n");
        }
        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!\n");
                }

                continue;
            }
            else
            {
                for(= 0; i < 6; i++)
                {
                    //对应驱动中按键的状态,为0即按键被按下
                    if(key_status[i] == 0)
                    {
                        printf("Key%d DOWN\n", 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!\n");
        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!\n");
            exit(1);
        }
        
        if(ret == 0)
        {
            printf("Read Buttons Device Timeout!\n");
        }
        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!\n");
                }

                continue;
            }
            else
            {
                for(= 0; i < 6; i++)
                {
                    //对应驱动中按键的状态,为0即按键被按下
                    if(key_status[i] == 0)
                    {
                        printf("Key%d DOWN\n", 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!\n");
        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!\n");
            exit(1);
        }
        
        if(ret == 0)
        {
            printf("Read Buttons Device Timeout!\n");
        }
        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!\n");
                }

                continue;
            }
            else
            {
                for(= 0; i < 6; i++)
                {
                    //对应驱动中按键的状态,为0即按键被按下
                    if(key_status[i] == 0)
                    {
                        printf("Key%d DOWN\n", 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!\n");
        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!\n");
            exit(1);
        }
        
        if(ret == 0)
        {
            printf("Read Buttons Device Timeout!\n");
        }
        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!\n");
                }

                continue;
            }
            else
            {
                for(= 0; i < 6; i++)
                {
                    //对应驱动中按键的状态,为0即按键被按下
                    if(key_status[i] == 0)
                    {
                        printf("Key%d DOWN\n", 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!\n");
        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!\n");
            exit(1);
        }
        
        if(ret == 0)
        {
            printf("Read Buttons Device Timeout!\n");
        }
        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!\n");
                }

                continue;
            }
            else
            {
                for(= 0; i < 6; i++)
                {
                    //对应驱动中按键的状态,为0即按键被按下
                    if(key_status[i] == 0)
                    {
                        printf("Key%d DOWN\n", 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!\n");
        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!\n");
            exit(1);
        }
        
        if(ret == 0)
        {
            printf("Read Buttons Device Timeout!\n");
        }
        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!\n");
                }

                continue;
            }
            else
            {
                for(= 0; i < 6; i++)
                {
                    //对应驱动中按键的状态,为0即按键被按下
                    if(key_status[i] == 0)
                    {
                        printf("Key%d DOWN\n", 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按键名称就是驱动中提到注意的地方(注意这个名称,在后面的一个现象中会出现),就是在这里出现了

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值