[X]关闭

驱动之interrupt代码编写

文档创建者:ぉ沙皮狗的忧伤
浏览次数:5272
最后更新:2019-11-21
本帖最后由 ぉ沙皮狗的忧伤 于 2020-2-18 15:56 编辑

第一步、先看手册,了解中断,下面是我认为的比较重要的基本部分






第二步,配置vivado生成.bit文件cp到SD卡



生成.bit文件重命名为system.bit.bin放入SD卡中

第三步、驱动代码编写
申请主设备,创建类,创建设备,硬件初始化这些都不用说了
接下来就是在上一帖子里面讲的,申请GPIO,设置GPIO模式并上拉,




重点来了

重点一:
获取中断,根据在开发板执行代码等到irq返回的中断号并不是GPIO口的中断ID52,于是我便多申请了几个,


通过串口,打印出获取的中断ID


困惑之际去查看cat /proc/interrupt文件


通过查阅资料,终于知道为啥获取的中断irq不是GPIO中断ID52了




重点二:
剖析request_irq这个函数

参数一是获取的irq中断ID
参数二是对应的入口函数

中断入口函数真的是irq_handler_t型的吗
看代码


typedef定义一个函数指针,irq_handler_t相当于取irqreturn_t (* )(int, void *);类型函数指针别名

这里就很好理解了irq_handler_t handler是什么

是一个指向irqreturn_t 类型的函数指针

所以中断的入口函数应该这样写
static irqreturn_t key_irq_handler(int irqe, void *dev_id)

这是我写代码遇到的一个问题

接下来还有一个地方值得注意

很多学过单片机的同学很熟悉第四个写法,这里不能这么干
我的理解是每个GPIO在内核中存在对应的设备节点,你如果按位或起来,最终那个值无法使他寻找到对应的内核节点,具体还是得自己去看代码

最后就是编写中断入口函数和卸载函数了,也没啥好说的,就是遵循至下而上的原则释放之前申请过的东西


每按一次按键,都会执行一次中断函数


总结:
第一、虽然很少会用到寄存器,但还是得去看它是怎么配置的,有助于理解代码

第二、多跟内核源码,多看多敲


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则