嵌入式Linux设备驱动开发之:按键驱动程序实例
fer.head];
if(tick5000)/*5s*/
break;
key_buffer.buf[key_buffer.head]=0;
key_buffer.jiffy[key_buffer.head]=0;
key_buffer.head++;
key_buffer.head=(MAX_KEY_COUNT-1);
}
spin_unlock_irq(buffer_lock);/*释放自旋锁*/
}
/*读键盘*/
staticssize_tbutton_read(structfile*filp,
char*buffer,size_tcount,loff_t*f_pos)
{
ssize_tret=0;
remove_timeoutkey();/*删除过时的按键操作信息*/
spin_lock_irq(buffer_lock);
while((key_buffer.head!=key_buffer.tail)(((size_t)ret)count))
{
put_user((char)(key_buffer.buf[key_buffer.head]),buffer[ret]);
key_buffer.buf[key_buffer.head]=0;
key_buffer.jiffy[key_buffer.head]=0;
key_buffer.head++;
key_buffer.head=(MAX_KEY_COUNT-1);
ret++;
}
spin_unlock_irq(buffer_lock);
returnret;
}
以上介绍了按键驱动程序中的主要内容。
11.6.3按键驱动的测试程序
按键驱动程序的测试程序所下所示。在测试程序中,首先打开按键设备文件和gpio设备(包括4个LED和蜂鸣器)文件,接下来,根据按键的输入值(按键ID)的二进制形式,LEDD9~D12发亮(例如,按下11号按键,则D9、D10和D12会发亮),而蜂鸣器当每次按键时发出声响。
/*butt_test.c*/
#includesys/stat.h>
#includefcntl.h>
#includestdio.h>
#includesys/time.h>
#includesys/types.h>
#includeunistd.h>
#includeasm/delay.h>
#includebutt_drv.h
#includegpio_drv.h
main()
{
intbutt_fd,gpios_fd,i;
unsignedcharkey=0x0;
butt_fd=open(BUTTONS_DEVICE_FILENAME,O_RDWR);/*打开按钮设备*/
if(butt_fd==-1)
{
printf(Openbuttondevicebuttonerrr!\n);
return0;
}
gpios_fd=open(GPIO_DEVICE_FILENAME,O_RDWR);/*打开GPIO设备*/
if(gpios_fd==-1)
{
printf(Openbuttondevicebuttonerrr!\n);
return0;
}
ioctl(butt_fd,0);/*清空键盘缓冲区,后面参数没有意义*/
printf(PressNo.16keytoexit\n);
do
{
if(read(butt_fd,key,1)=0)/*读键盘设备,得到相应的键值*/
{
continue;
}
printf(KeyValue=%d\n,key);
for(i=0;iLED_NUM;i++)
{
if((key(1i))!=0)
{
ioctl(gpios_fd,LED_D09_SWT+i,LED_SWT_ON);/*LED发亮*/
}
}
ioctl(gpios_fd,BEEP_SWT,BEEP_SWT_ON);/*发声*/
sleep(1);
for(i=0;iLED_NUM;i++)
{
ioctl(gpios_fd,LED_D09_SWT+i,LED_SWT_OFF);/*LED熄灭*/
}
ioctl(gpios_fd,BEEP_SWT,BEEP_SWT_OFF);
}while(key!=16);/*按16号键则退出*/
close(gpios_fd);
close(butt_fd);
return0;
}
首先编译和加载按键驱动程序,而且要创建设备文件节点。
$makeclean;make/*驱动程序的编译*/
$insmodbutt_dev.ko/*加载buttons设备驱动*/
$cat/proc/devices/*通过这个命令可以查到buttons设备的主设备号*/
$mknod/dev/buttonsc2520/*假设主设备号为252,创建设备文件节点*/
接下来,编译和加载GPIO驱动程序,而且要创建设备文件节点。
$makeclean;make/*驱动程序的编译*/
$insmodgpio_drv.ko/*加载GPIO驱动*/
$cat/proc/devices/*通过这个命令可以查到GPIO设备的主设备号*/
$mknod/dev/gpioc2510/*假设主设备号为251,创建设备文件节点*/
然后编译并运行驱动测试程序。
$arm-linux-gcc–obutt_testbutt_test.c
$./butt_test
嵌入式Linux 设备驱动 按键驱动程序 操作系统 相关文章:
- 嵌入式Linux技术在工业控制网络中的应用(10-30)
- 基于嵌入式Linux的组态软件实时数据库的设计(02-01)
- 基于ARM+DSP的嵌入式Linux数控系统设计(11-18)
- 基于嵌入式Linux的细胞特征提取算法设计(11-19)
- 基于S3C2410的嵌入式Linux系统构建(03-02)
- 嵌入式Linux网络编程之:网络基础编程(08-13)