1、应用读取驱动四种基本方式:阻塞、非阻塞、poll、异步通知
驱动构造file_operation结构体,里面有open、read、wirte等函数
查询:相当于应用程序非阻塞方式, O_NONBLOCK
休眠–唤醒:相当于应用程序阻塞方式
poll方式:相当于应用程序的poll方式
使用休眠–唤醒方式等待时,可能等待时间久,可以加上一个超时时间,就可以使用poll机制:
app先调用poll函数查询驱动是否有数据,有的话立即返回,没的话就休眠一下,当有数据时唤醒app,超时时间到了也唤醒app
异步通知方式:相当于应用程序异步通知方式
内核给app发信号,SIGIO,app给信号SIGIO注册自己的处理函数,app调用 fcntl 函数,驱动中断触发之后给进程PID发送SIGIO信号,然后app会被打断,先执行信号处理函数
2、gpio和pinctrl:
操作GPIO引脚,先要把引脚配置为GPIO功能,通过Pinctrl子系统实现
Pintctrl用于引脚配置,配置为GPIO还是复用为I2C等其他外设的引脚
GPIO用于标记使用哪些IO、配置引脚方向和引脚配置为输入输出等功能
gpio子系统两套接口: gpiod_xxx 、gpio_xxx
带d的是基于gpio_desc来确定哪一个gpio的,不带d的是基于gpio号的
建议使用devm_gpiod_xxx
3、中断方式:
中断控制器 GIC 统一接管所有外设中断信号,当有外设向CPU发出中断信号时,GIC根据其优先级选出一路信号送达CPU,然后CPU跳转到异常向量表中的中断处理函数,然后进行现场保护、跳转处理函数、从中断退出、恢复现场
中断不同类型:
软件触发中断 (SGI):常用于CPU核间通信; 中断号 0–15保留用于SGI的中断号
私有外设中断 (PPI):中断号为 16 – 31 ;标识CPU核私有的中断源,独立于另一个核上的相同中断源, 比如 每个核的计时器 timer
共享外设中断 (SPI):外设生成,GIC可以将其路由到多个核,中断号 32–1020
硬件中断处理原则:
不能嵌套:防止中断嵌套时栈空间猛增等原因; 即当前中断A没处理完之前,不会响应另一个中断B
越快越好:中断处理过程中,该CPU不能进行进程调度的,所以越快越好 —— 因为进程调度靠定时器实现,中断慢的话,系统卡
4、高低电平触发、边沿触发:
电平触发中断,在电平没有恢复之前,中断会不断触发的
电平触发是即时的,如果外部中断信号申请期间,CPU来不及响应此中断,可能会把此次中断申请漏掉
想要电平触发中断也进行一次,可以中断进入后就关闭中断响应,后面需要时再打开
边沿触发是锁存中断信号的,由D触发器记忆,即:即使当时CPU来不及响应中断,外部中断信号撤销后,由于D触发器的记忆作用,消失的中断信号仍然有效,直到中断被响应并进入中断ISR,记忆的中断信号才会由硬件清除,这也是边沿触发只能触发一次的原因
由于单片机的中断引脚,如果另一端接的VCC则需要设置成上升沿或者高电平触发,接GND可以设置成下降沿或低电平触发
5、中断dts定义、中断申请:
定义interrupt-controller节点一般是bsp dts写好的
要用哪个IO作为 irq,在自己设备节点中使用 interrupt-parent = <&外设>引用即可,然后interrupt = <信号脚 RISING/BOTH>,声明这个外设的具体哪个信号线和是什么电平触发
用某个IO作