1. 程式人生 > >linux I2C 驅動之----i2c_client 的註冊

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的註冊。