我們知道,linux的裝置模型将裝置分成了driver,device兩大部分,driver即是裝置的驅動,device即是硬體裝置的具體描述,比如說:裝置所擁有的中斷,位址等,這裡分析一下I2C驅動中device,也即i2c_client的注冊。
(注:這裡所說明的是linux 系統i2c裝置新采用的方法。)
在注冊i2c驅動的時候,會去linux系統中的全局變量_i2c_board_list連結清單中去比對i2c_client,比對的條件是:名字和i2c的位址。是以,在注冊i2c裝置驅動的時候要先注冊好i2c裝置。注冊的方法如下:
首先,定義一個 i2c_board_info 的變量,i2c_board_info 是i2c系統定義的一個結構體,其定義如下:(include\linux\i2c.h)
struct i2c_board_info {
char type[I2C_NAME_SIZE];
unsigned short flags;
unsigned short addr;
void *platform_data;
struct dev_archdata *archdata;
struct device_node *of_node;
int irq;
};
其中最重要是type和addr,前者是名字,後者是位址,至于其他的不需要的話可以不用管他,給一個例子:struct i2c_board_info __initdata xxx_ls_cm3212 =
{
I2C_BOARD_INFO("cm3212",0x90),
// I2C_BOARD_INFO是個簡單的宏:.type="cm3212",.addr=0x90.
};
然後,在闆級系統初始化的時候注冊:
i2c_register_board_info(int busnum,struct i2c_board_info const *info, unsigned len)
其中busnum表示你對應系統的那個 i2c 控制(adapter),len表示你注冊的info的個數。
這樣,系統中就存在了一個名字為type,位址為addr的i2c_client,當注冊對應的驅動時,就會比對成功,進而調用驅動的probe函數。
嗯,今天就到這,下次再說一下i2c_driver的注冊。