嵌入式linux驱动-I2C笔记

2019-07-12 18:45发布

一、开发环境 1、内核:Linux 2.6.22.6; 2、JZ2440v3 3、ubuntu 9.10 二、过程 参考drivers/i2c/chips/eeprom.c,drivers/i2c/chips/ds1374.c。 1.分配一个i2c_driver结构体 2.设置i2c_driver结构体   设置两个重要的成员     .attach_adapter=xxx_adapter   //在函数xxx_adapter会调用  i2c_probe(adap,设备地址addr,发现这个设备后要调用的函数function)     .detach_client=xxx_client  //卸载驱动后,如果之前发现能够支持的设备,则调用它来清理 3.注册上面分配的i2c_driver结构体变量。使用函数i2c_add_driver,在入口函数里注册。注册后,装载驱动时程序会调用xxx_adapter函数,xxx_adapter函数中会调用i2c_probe(adap,addr,function)函数,确认设备地址为addr是否有设备(通过是否会回发ACK信号确认),如果设备存在则执行function函数卸载驱动时会调用xxx_client函数,在xxx_adapter中注册分配的东西要在这卸载释放。 4.构造i2c_client结构体,收发数据会用到。例子中这个i2c_client结构体的变量会在function函数中被设置。function函数还会进行字符设备驱动的操作,包括分配file_operations结构体变量,并设置.read=xxx_read,.write=xxx_write,分配设备号等。 i2c_client结构体重要成员    .address   //设备地址    .adapter   //指向适配器    .driver   //指向i2c_driver结构体 使用:i2c-attach_client(i2c_client结构体变量) 5.编写xxx_read,xxx_write函数。 其中要用到i2c_msg结构体。这个结构体中可以用设置数据传输三要素:源地址、目的地址、长度,操作类型(读、写)等。设置好三要素还有读写,再调用i2c_transfer()函数,就可以完成对数据的读写了。