一。混杂设备驱动模型
1. 混杂设备驱动描述
在Linux系统中,存在一类字符设备,它们拥有相同的主设备号(10),但次设备号不同,我们称这类设备为混杂设备(miscdevice)。
所有的混杂设备形成一个链表,对设备访问时内核根据次设备号查找到相应的混杂设备。
Linux中使用struct miscdevice来描述一个混杂设备。
struct miscdevice
{
int minor; /* 次设备号*/
const char *name; /* 设备名*
const struct file_operations *fops; /*文件操作*/
struct list_head list;
struct device *parent;
struct device *this_device;
}
2. 混杂设备驱动注册
Linux中使用misc_register函数来注册一个混杂设备驱动。
int misc_register(struct miscdevice * misc)
3. 范例驱动设计
混杂设备驱动设计
二。 中断处理程序
1. 裸机中断处理流程回顾
1. 中断统一入口
2. 实现注册中断处理程序
3. 根据中断源编号,调用中断处理程序
2. Linux中断处理流程分析
1. irq_svc 中断入口
2. 拿到产生中断源的中断号
3. 根据中断号找到相应的 irq_dese
4. 取出事先注册好的处理函数
3. Linux中断处理程序设计
1. 注册中断
request_irq函数用于注册中断。
int request_irq(unsigned intirq,
void (*handler)(int, void*, struct pt_regs *),
unsigned long flags,
const char *devname, void *dev_id)
返回0表示成功,或者返回一个错误码
#unsigned intirq中断号。
#void (*handler)(int,void *)中断处理函数。
#unsigned longflags与中断管理有关的各种选项。
#const char * devname设备名
#void *dev_id共享中断时使用。
在flags参数中,可以选择一些与中断管理有关的选项,如:
•IRQF_DISABLED(SA_INTERRUPT)
如果设置该位,表示是一个“快速”中断处理程序;
如果没有设置这位,那么是一个“慢速”中断处理程序。
快/慢速中断的主要区别在于:快速中断保证中断处理的原子性(不被打断),而慢速中断则不保证。
换句话说,也就是“开启中断”标志位(处理器IF)在运行快速中断处理程序时是关闭的,
因此在服务该中断时,不会被其他类型的中断打断;
而调用慢速中断处理时,其它类型的中断仍可以得到服务。
•IRQF_SHARED(SA_SHIRQ)
该位表明该中断号是多个设备共享的。
2. 中断处理
1.中断处理程序的特别之处是在中断上下文中运行的,它的行为受到某些限制:
1.不能使用可能引起阻塞的函数
2.不能使用可能引起调度的函数
2. 中断处理程序
1. 检查设备是否产生了中断
2. 清除中断产生的中断
3. 相应的硬件操作
3. 注销中断
当设备不再需要使用中断时(通常在驱动卸载时), 应当把它们注销, 使用函数:
void free_irq(unsigned int irq, void *dev_id)
三 。按键驱动硬件操作实现