微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式Linux设备驱动开发之:按键驱动程序实例

嵌入式Linux设备驱动开发之:按键驱动程序实例

时间:09-13 来源:互联网 点击:

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top