I2C接口实际上只是一种通信接口,而I2C从设备具备自己的独特功能,这些功能包括EEPROM、视频AD芯片、摄像头芯片、RTC芯片、音频芯片。这就造成了很多I2C从设备虽然依赖I2C驱动,但放到了其他驱动程序代码下面,是一种混合型驱动。本书将在内核中注册的I2C从设备驱动称为个性化I2C从设备驱动,以区别于上面提及的通用I2C从设备驱动。本节以pcf8583芯片为例说明个性化I2C从设备驱动的开发方法。
注册为I2C从设备之后,本驱动可以调用I2C驱动层的函数接口。可见pcf8583_probe函数中注册了一个RTC驱动程序。
pcf8583_rtc_read_time调用了pcf8583_get_datetime函数:
看到了i2c_transfer函数,那就是I2C适配器层的事情了。那么这个pcf8583 I2c从设备是如何挂载到I2C控制器上的呢?在板级的初始化代码中要注册I2C板级设备信息。例如:
i2c_register_board_info函数将I2C板级设备信息添加到__i2c_board_list中。i2c_register_ board_info函数第一个参数就是I2C总线号,这就表示设备会挂载到busnum所对应的I2C总线上。
而在i2c_register_adapter函数中会调用i2c_scan_static_board_info扫描这些静态的板级设备:(www.xing528.com)
当从设备的总线号与适配器的总线号一致时,会调用i2c_new_device函数创建新的i2c_client。有了i2c_client,后面的I2C操作就顺理成章了。除了i2c_transfer函数,还有下面的函数可以读写I2C设备:
s32 i2c_smbus_read_byte(const struct i2c_client*client);
s32 i2c_smbus_write_byte(const struct i2c_client*client,u8 value);
s32 i2c_smbus_read_byte_data(const struct i2c_client*client,u8 command);
s32 i2c_smbus_write_byte_data(const struct i2c_client*client,u8 command,u8 value);
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。