I2C 设备驱动程序 标准实现

    技术2022-05-20  46

       前段时间在写驱动,是个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 找到一个结构体

    struct i2c_board_info XX_i2c_info[] = { ... { .type = "xxx_name", .addr = 0x39 , //这个就是你从设备地址 .irq = XX_IRQ, .platform_data = XXX_data, //这个里面可以放一些硬件资源什么,到具体的驱动程序会被用到,没有就算了 }, ... }   

    type_name 一定要和你等会驱动中的名字相对应,后面再说.

    下面就是platform_data了,比如:

    static struct XXX_platform_data tsl2771_u802_data = { .irq = XXX, //硬件资源可以放在这个里面 }

     

    okay 平台初试化文件搞定了.

     

    接下来开始具体设备了.一般如果是I2C设备的,比较喜欢在/driver/i2c/chips下开发,看个人爱好了.

     

    开始搭建基本的驱动框架构,这个不用说了吧 什么module_init module_exit

    不用多说了吧.

    驱动一般开始于__init函数

     

    在这个函数之前,我们先要申明一个结构体

    static struct i2c_driver XXX_i2c_driver = { .probe = XXX_probe, .remove = XXX_remove, .id_table = XXX_id, .driver = { .name = "XXX_name", //这个就是和上面提到那个type的字符串相对应的 }, };

     

    进入__init函数

    i2c_add_driver(&XXX_i2c_driver);//这个类似于platform_diver_register,无非就是在总线上匹配下驱动和设备,然后probe

     

     

    好了,匹配完了,该干活了,进入probe

    static int __devinit XXX_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct XXX_platform_data *pdata;//这个结构体是自己定义的,平台和初始化文件中的那个platform_data的结构一致. pdata = client->dev.platform_data;//这个用来获取你的硬件资源 }

    完成了.什么?还有呢?好吧,如果还有无非就是一些字符设备注册,如何在/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)等等.

     

     

    打完收工,希望对大家有点帮助吧.呵呵

     


    最新回复(0)