linux iic驅動體系分三部分。
struct i2c_adapter 用來描述I2C控制器的,只和主機有關係。換一顆SoC則需要修改該結構體。
struct i2c_client I2C從機設備信息
struct i2c_driver I2C(從機)設備驅動
- I2C總線上有2條分支:i2c_client鏈和i2c_driver鏈;
- 當任何一個driver或者client去註冊時,I2C總線都會調用match函數去對client.name和driver.id_table.name進行循環匹配。
- 如果driver.id_table中所有的id都匹配不上則說明client並沒有找到一個對應的driver;
- 如果匹配上了則標明client和driver是適用的,那麼I2C總線會調用自身的probe函數,自身的probe函數又會調用driver中提供的probe函數,driver中的probe函數會對設備進行硬件初始化和後續工作。
(1)i2c_add_adapter/i2c_add_numbered_adapter:註冊adapter的,比如i2c-s3c2410.c中就使用此函數來註冊一個adapter。
(2)i2c_add_driver:註冊driver的
(3)i2c_new_device:註冊client的
(4)i2c_register_board_info()函數用於往__i2c_board_list 這條鏈表添加一條i2c設備信息,在i2c adapter註冊的時候,會掃描 __i2c_board_list鏈表, 然後調用i2c_new_device()函數來註冊i2c設備,
注意,要先於i2c adapter註冊之前就添加好i2c設備信息,否則會出現調用了i2c_register_board_info()函數,
而設備不能註冊的情況。
(5)I2C總線的i2c_client的提供是內核通過i2c_add_adapter/i2c_add_numbered_adapter接口調用時自動生成的,生成的原料是 mach-x210.c中的i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));