驱动学习
IIC同步通信
IIC是一种两线式的串行总线,是半双工同步通信。
IIC开始信号
时钟线为高电平阶段,由主设备把数据线从高电平变为低电平就是开始。
IIC结束信号
时钟线为高电平阶段,把数据线从低电平变为高电平就是结束。
IIC数据有效性
在时钟线为高电平阶段,保持数据线数据稳定,在数据线数据的高低电平只能在时钟线为低电平才能修改。
IIC数据传输格式
写过程
主机产生起始信号---->发送从机设备地址和W—>从及设备产生应答(---->主机发送从机内部地址---->从机产生应答)---->主机发送数据---->从机产生应答---->直到结束
读过程
主机产生起始信号---->发送从机设备地址和R---->从及设备产生应答---->从机发送数据---->主机产生应答---->直到结束
主机产生起始信号---->发送从机设备地址和W—>从及设备产生应答---->主机发送从机内部地址---->从机产生应答---->主机产生起始信号---->发送从机设备地址和R---->从及设备产生应答---->从机发送数据---->主机产生应答---->直到结束
中断下半部分
中断处理时间长度不宜过长,处理耗时操作就会启用下半部分,将中断中的耗时操作延后处理,方式有softirq,tasklet,workqueue。
1、softirq:软中断,处理级别比较高,在内核机制中,需要修改内核源码功能
2、tasklet:实际上就是内部调用了softirq
3、workqueue:工作队列
tasklet
1、初始化
初始化任务队列
void tasklet_init(struct tasklet_struct * t,void(* func)(unsigned long),unsigned long data)
参数1:
struct tasklet_struct * t :任务队列头节点
参数2:
void(* func)(unsigned long):下半部分的实现逻辑
参数3:
unsigned long data:参数2函数的参数
2、在中断上半部分中,启动下半部分(放入内核线程中)
tasklet_schedule(struct tasklet_struct * t)
如:
tasklet_schedule(&(key.t));
workqueue
1、初始化
初始化工作队列
INIT_WORK(struct work_struct *work,void (*work_func_t)(struct work_struct *work));
参数1:
struct work_struct *work:初始化的工作队列对象(头节点)
参数2:
void (*work_func_t)(struct work_struct *work):工作队列下半部分实现的逻辑
2、在中断上半部分中,启动下半部分(放入内核线程中)–启动
schedule_work(struct work_struct *work);
如:
schedule_work(&(key.mywork));