嵌入式系统嵌入式系统/ARM技术中的技术中的FS2410开发板上的按键驱动程序开发板上的按键驱动程序
((2)续)续
作者:赵老师,华清远见嵌入式学院讲师。 按键字符设备的file_operations结构定义为: static struct
file_operations button_fops = { .owner = THIS_MODULE, .ioctl = button_ioctl, .open =
button_open, .read = button_read, .release = button_release, }; 以下为open和release函数接口的实
现。 /* 打开文件, 申请中断 *
作者:作者:赵老师,华清远见嵌入式学院讲师。
按键字符设备的file_operations结构定义为:
static struct file_operations button_fops =
{
.owner = THIS_MODULE,
.ioctl = button_ioctl,
.open = button_open,
.read = button_read,
.release = button_release,
};
以下为open和release函数接口的实现。
/* 打开文件, 申请中断 */
static int button_open(struct inode *inode,struct file *filp)
{
int ret = nonseekable_open(inode, filp);
if (ret < 0)
{
return ret;
}
init_gpio(); /* 相关GPIO端口的初始化*/
request_irqs(); /* 申请4个中断 */
if (ret < 0)
{
return ret;
}
init_keybuffer(); /* 初始化按键缓冲数据结构 */
return ret;
}
/* 关闭文件, 屏蔽中断 */
static int button_release(struct inode *inode,struct file *filp)
{
free_irqs(); /* 屏蔽中断 */
return 0;
}
在open函数接口中,进行了GPIO端口的初始化、申请硬件中断以及按键缓冲的初始化等工作。在以前的章节中提过,中
断端口是比较宝贵而且数量有限的资源。因此需要注意,最好要在第一次打开设备时申请(调用request_irq函数)中断端口,
而不是在驱动模块加载的时候申请。如果已加载的设备驱动占用而在一定时间段内不使用某些中断资源,则这些资源不会被其
他驱动所使用,只能白白浪费掉。而在打开设备的时候(调用open函数接口)申请中断,则不同的设备驱动可以共享这些宝
贵的中断资源。
以下为中断申请和释放的部分以及中断处理函数。
/* 中断处理函数,其中irq为中断号 */
static irqreturn_t button_irq(int irq, void *dev_id, struct pt_regs *regs)
{
unsigned char ucKey = 0;
disable_irqs(); /* 屏蔽中断 */
/* 延迟50毫秒, 屏蔽按键毛刺 */
udelay(50000);
ucKey = button_scan(irq); /* 扫描按键,获得进行操作的按键的ID */
if ((ucKey >= 1) && (ucKey <= 16))
{
/* 如果缓冲区已满, 则不添加 */
if (((key_buffer.head + 1) & (MAX_KEY_COUNT - 1)) != key_buffer.tail)