linux i2c驅動總結

最近幾天一直在看I2C的驅動架構,看到目前的感覺是說明白吧又不是很透徹,說不明白吧又知道點,總之有點不明白。

明白的:

1)adapter驅動,I2C控制器驅動,如果要開發I2C控制器的,這部分是要實現的。這部分要填充struct i2c_adapter

     結構圖和struct alogrithm結構體.

2)設備驅動,I2C從設備驅動,主要填充struct i2c_driver結構體;還要根據從設備的類型,實現從設備的驅動函數(eg:

     char device實現struct file_operations結構體)

3)數據傳輸的過程:應用層的read()/write()->驅動層的read()/write()->i2c_core.c的i2c_transfer()->adapter驅動

     algo->master_xfer()函數。這中間有一個struct i2c_msg結構體,是非常重要的。

 

不明白的地方:

1)在struct i2c_adapter,struct i2c_client,struct i2c_driver是如果關聯起來的,他們的數據結構在內核中的聯繫是什麼

     樣的?在註冊adapter的過程中,相對的不明白的代碼爲i2c_core.c文件中的i2c_register_adpter()函數中的:

     if (adap->nr < __i2c_first_dynamic_bus_num) 
                 i2c_scan_static_board_info(adap);

     dummy = bus_for_each_drv(&i2c_bus_type, NULL, adap,
                     i2c_do_add_adapter);                                           

    //對上面的理解是adapter已註冊進內核,adapter註冊後在總線上尋找此adapter所支持的struct i2c_driver

2)在註冊struct i2c_driver的過程中,相對不明白的是i2c_core.c文件中的i2c_register_driver()函數中的:

     class_for_each_device(&i2c_adapter_class, NULL, driver,
                                          __attach_adapter);

  //對上面的理解是在struct i2c_driver註冊後,在內核中尋找與struct i2c_driver匹配的adapter

3)對於struct i2c_adapter和struct i2c_driver的註冊次序會影響i2c_do_add_adapter()和__attach_adapter()函數

    中i2c_detect()的執行。具體沒有分析明白,只是猜測。

 

分析的體會:

1)分析i2c架構分兩步,第一步:內核已註冊了adapter,當前註冊struct i2c_driver。第二步:內核已註冊了struct i2c_driver,

     當前註冊adapter

2)對linux內核的基本知識還是比較薄弱的,例如driver_register()函數,大概知道此函數是什麼意思,但不知道它到底在內核中

     幹了些什麼事,它註冊進內核後到底有什麼用處呢。

3)感覺厭倦的時候,幹什麼事都是沒有精神的。沒辦法改變現實,那就改變自己的心態。

4)在分析i2c架構的過程中參考了兩篇非常好的文章:

     http://chxxxyg.blog.163.com/blog/static/1502811932010635818167/

     http://www.linuxidc.com/Linux/2011-02/32496p3.htm

    分析的非常透徹,敬仰兩位樓主的精神!

發佈了21 篇原創文章 · 獲贊 5 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章