天天看點

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