本帖最后由 ぉ沙皮狗的忧伤 于 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在内核中存在对应的设备节点,你如果按位或起来,最终那个值无法使他寻找到对应的内核节点,具体还是得自己去看代码
最后就是编写中断入口函数和卸载函数了,也没啥好说的,就是遵循至下而上的原则释放之前申请过的东西
每按一次按键,都会执行一次中断函数
总结:
第一、虽然很少会用到寄存器,但还是得去看它是怎么配置的,有助于理解代码
第二、多跟内核源码,多看多敲
|