最近幾天一直在看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
分析的非常透徹,敬仰兩位樓主的精神!