驱动开发
一、 驱动开发框架
驱动框架:
0、声明实现入口函数(module_init、module_exit)
1、申请设备号(register_chrdev)
2、创建设备节点(class_create、device_create)
3、硬件初始化
ioremap地址映射
中断申请
4、实现文件IO接口
二、中断
中断分上下两个部分:
中断的下半部分:
1、softirq:软中断,处理级别比较高,在内核机制中,需要修改内核源码功能
2、tasklet:实际上就是内部调用了softirq
3、workqueue:工作队列
三、iic
I2C(IIC)属于两线式串行总线,串行时钟线(SCL)和串行数据线(SDA)
由飞利浦公司开发用于微控制器(MCU)和外围设备(从设备)进行通信的一种总线
属于一主多从(一个主设备(Master),多个从设备(Slave))的总线结构
总线上的每个设备都有一个特定的设备地址,以区分同一I2C总线上的其他设备。
I
ii2主要有四个部分:起始信号、停止信号、应答信号、以及数据有效性。
起始信号:
停止信号:
数据有效性:
IIC子系统
将设备添加到设备树:
硬件信息-----device设备----添加到设备树
模板:
在内核 arch/arm/boot/dts/exynos4.dtsi
i2c_5: i2c@138B0000 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "samsung,s3c2440-i2c";
reg = <0x138B0000 0x100>;
interrupts = <0 63 0>;
clocks = <&clock 322>;
clock-names = "i2c";
status = "disabled";
};
i2c@13860000 {
#address-cells = <1>;
#size-cells = <0>;
samsung,i2c-sda-delay = <100>;
samsung,i2c-max-bus-freq = <20000>;
pinctrl-0 = <&i2c0_bus>;
pinctrl-names = "default";
status = "okay";
s5m8767_pmic@66 {
compatible = "samsung,s5m8767-pmic";
reg = <0x66>;
}
}
总结
驱动开发首先确定驱动框架(声明出入口,注册设备,创建设备节点、初始化硬件信息、),主要对要操作的设备地址进行查找,各种通信协议,设备树中没有的需要自己将设备信息添加至设备树。IIC通信注意数据有效性,时钟信号SCL为高电平期间,数据线SDA上的数据必须保持稳定,只有在时钟线SCL上的信号为低电平期间,数据线SDA上的高电平或低电平状态才允许变化。