linux I2C 驅動之----i2c_client 的註冊
我們知道,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的註冊。