日期:2014-05-16  浏览次数:20788 次

【求教】Linux I2C设备驱动开发流程
我的ARM平台是 Cortex A9,MSP430G2231通过P1.6、P1.7与ARM核I2C总线通信,ARM上跑的是Linux系统,Linux内核有I2C总线驱动。
所以我除了MSP430端的程序外,ARM端我还需要做MSP430的Linux设备驱动程序。问题:
(1)芯片的I2C总线驱动内核上已有,那我是否可以在应用程序中使用内核的设备驱动i2c-dev.c中的open、read、write等接口,而不需要重新开发一个设备驱动程序?
(2)若需要,那该如何进行开发相应的设备驱动程序呢中Linux应用层接口open,release,read,write?是否可以参照i2c_dev.c这个文件中的函数,只修改几个外部文件操作接口即可?或是有什么可供参照程序?或有做过的例程帮忙发下最好...
(3)请问我如何获得MSP430这个设备在I2C总线上的地址?

首次做Linux I2C驱动,整个开发流程也有点混乱,请指导,谢谢!!


------解决方案--------------------
1、这就是所谓的用户态驱动程序,是可行的。不同于一般的内核态i2c设备驱动。
2、这种用户态的驱动程序,可以参照Documentation/i2c/dev-interface

3、我不知道你的MSP430G2231是否能够配成i2c从。i2c操作都是由主设备发起的,所以只能有一个主设备。
从设备的i2c地址看数据手册得到。
------解决方案--------------------
lz这样说,让i2c总线控制器驱动情何以堪
发送正确的i2c地址以及检查ACK,都是i2c总线控制器驱动干的事情

内核态i2c设备驱动只需要关心 读/写 以及读写的个数,使用
int i2c_master_recv(struct i2c_client *client, char *buf, int count)
int i2c_master_send(struct i2c_client *client, const char *buf, int count)
其中client 就已经包含了i2c控制器 和 i2c设备地址的信息,这个client参数也是i2c设备probe成功后自动就得到的

用户态i2c设备驱动,
则需要ioctl(file, I2C_SLAVE, addr) 告知i2c设备地址
之后的读写操作同普通的read write,见Documentation/i2c/dev-interface