前段时间在写驱动,是个I2C总线的设备.所以在这里就简单的谈下关于I2C的设备驱动的一点简单的经验之谈.相信网上也有很多这样的文章啦. 我就算是添点砖吧.
废话不多说,开始入正题.
I2C的协议在这里我就不多做介绍了,就是个有两根线的半双工的串线,SDA-数据线,SCL-时钟线.
SCL高的时候,SDA数据有效(说白了就是能被接受,人家知道你是什么,如果SCL低,你跳高跳低,接受方都认为你是个屁)
SCL SDA都高,表示总线处于等待状态.
SCL高 SDA由高向低,表示传输开始,反之则表示传输结束.
SDA每传输1个字节的数据,必须在第9位有个ACK,ACK低表示应答okay,高表示失败.
I2C现在分7位地址 和10位地址, 无非就是挂的设备多点.
今天主要就7位地址的设备开发,罗嗦1下.
开始吧
1 一开始需要查看硬件的设计电路图,看下你的I2C从设备的读写地址是多少.一般这个读写地址是8位的,比如0x72 0x73分别是读写地址,那么你的I2C的设备的地址去掉最后位的读写标记位0/1,就是0x39.
2 找到你的内核中的平台初始化文件在/kernel/arch/arm/XX/xxx.c 找到一个结构体
type_name 一定要和你等会驱动中的名字相对应,后面再说.
下面就是platform_data了,比如:
okay 平台初试化文件搞定了.
接下来开始具体设备了.一般如果是I2C设备的,比较喜欢在/driver/i2c/chips下开发,看个人爱好了.
开始搭建基本的驱动框架构,这个不用说了吧 什么module_init module_exit
不用多说了吧.
驱动一般开始于__init函数
在这个函数之前,我们先要申明一个结构体
进入__init函数
i2c_add_driver(&XXX_i2c_driver);//这个类似于platform_diver_register,无非就是在总线上匹配下驱动和设备,然后probe
好了,匹配完了,该干活了,进入probe
完成了.什么?还有呢?好吧,如果还有无非就是一些字符设备注册,如何在/dev下自动注册设备接点呢,比如/dev/XXX
1 XX_class = class_create(THIS_MODULE, "XXX); //这个是在sysfs的class中注册你的设备
2 dev = MKDEV();
2 device_create(XX_class, NULL, dev, NULL, "XXX", minor);好了这就搞定了。
至于i2C读写 不用我教了吧.i2c_smbus_read_byte_data(client, register)
i2c_smbus_write_byte_data(client, register, value)等等.
打完收工,希望对大家有点帮助吧.呵呵