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!
");
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(i = 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.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!
");
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(i = 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.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>