中断号和中断的申请
中断号的添加-----定义设备节点,描述当前设备
通过设备树文件获取
/dts/xxxx.dts文件中进行设备的设置
在dts设备树文件中进行设备的定义,包括继承的设备,中断号的设置
需要对我们的dts设备树文件进行编译,然后重启开发板,在proc目录下device-tree目录下可以找到我们添加的设备
中断号的申请-----在驱动中通过代码获取中断号,申请中断
驱动代码的框架
中断号申请流程
1、获取到设备树中的节点
2、通过节点去获取中断号
加载驱动模块:insomd xxxx.ko
卸载驱动模块:rmmod xxxx.ko
申请中断
int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char * name, void * dev)
参数一:中断号
参数二:中断处理函数
参数三:触发方式(上升沿,下降沿,高电平,低电平)
参数四:中断描述 cat /proc/interrupts 查看当前的中断信息,
参数五:传递给中断处理函数指针的值
释放中断
void free_irq(unsigned_int irq, void *dev)
参数一:中断号
参数二:和申请中断中第五个参数一致即可
实现字符设备驱动的框架
设定一个全局的设备对象-----描述设备信息
然后对该设备对象分配空间
申请主设备号
参数一:动态申请
参数二:设备名称
参数三:file_operations
创建设备节点文件
class_create(owner, name)
参数一:所有者
参数二:设备名称
struct device *device_create(struct class *cls, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...);
参数一:与逻辑设备相关的逻辑类
参数二:当前逻辑设备的父设备的指针
参数三:逻辑设备的设备号,需要用MKDEV(主设备号进行映射)
参数四:中断处理函数的参数
参数五:逻辑设备的设备名
硬件的初始化------地址映射或者中断申请
驱动将硬件产生的数据传递给用户
硬件如何获取数据
读取硬件对应的GPIO口的状态,来判断硬件的动作。
是通过读取对应GPIO的数据寄存器来获取状态的
通过ioremap将物理地址GPXDATA_RED宏定义对应的实际物理地址映射到设备虚拟空间data_reg_base中
通过readl将data_reg_base中的数据读4字节出来
驱动如何将数据传递给用户
在中断处理函数中将event(事先定义好的结构体)进行填充
然后通过copy_to_user()函数传递给用户
用户如何拿到数据------编写应用程序
在用户空间调用read函数,会执行驱动中的key_drv_read驱动函数,将key_event结构体中的数据读出来,之后对数据在用户层面进行处理。