Linux虛擬i2c控制器實現---適用於無開發板學習i2c driver

       在之前分析mdio子系統時,我們提到系統實現了fixed-mii_bus,從而爲mac2mac提供虛擬mii_bus和虛擬phy_device,實現對虛擬phy_device的模擬。受此啓發,我打算實現一個虛擬的i2c adapter,並基於該i2c adapter掛載一個虛擬的i2c device,並基於虛擬i2c adapter、i2c device搭建一個虛擬的i2c controller即i2c設備,以便爲需要學習linux i2c驅動模型的童鞋可以方便的練習i2c device driver。

本篇文章的目的如下:

  1. 當你沒有開發板,又想學習i2c驅動模型,並想進行linux i2c device driver的練習時;
  2. 當你完成了i2c device driver,在硬件開發板出來之前進行i2c device driver的驗證時。

 

若對linux i2c驅動模型不熟悉時,可參考我之前寫的文章:

 

一、 virtual i2c adapter的實現分析

我們知道linux系統針對i2c controller抽象了數據結構i2c_adapter,因此我們在進行虛擬i2c

controller的實現,也就是實現一個i2c_adapter類型的變量,並將其註冊至i2c子系統中。

 

數據結構定義及關聯

因我們需要模擬的是一個虛擬的i2c controller,以及多個依附於虛擬i2c controller的i2c

device,所以我們定義而定數據結構包含i2c controller、i2c device兩部分的內容。

我們定義了數據結構體virtual_i2c_bus_t,該結構體中包含了i2c_adapter類型的成員和virtual_i2c_adapter_info_t類型的成員,其中:

  1. i2c_adapter類型的成員中,我們需要實現i2c_adapter->algo,因我們抽象的是i2c ,因此我們需要實現master_xfer接口和functionality接口;
  2. 而virtual_i2c_adapter_info_t結構體則主要包含了一個雙向鏈表頭list,和一個互斥量。list鏈表用於將所有虛擬i2c設備連接在一起,虛擬i2c設備對應的數據結構爲virtual_i2c_dev_info_t,該數據結構包括node節點、virtual i2c device的地址addr,virtual i2c device對應的寄存器等。

 

如下即爲virtual_i2c_bus_t、virtual_i2c_adapter_info_t、virtual_i2c_dev_info_t、

i2c_adapter、i2c_algorithm數據結構之間的關聯圖。而我們在virtual i2c controller的probe接口中,即是用來實現這些數據結構之間的關聯,從而織成如下的關聯圖。

 

 

如下即爲virtual_i2c_bus_t、virtual_i2c_adapter_info_t、virtual_i2c_dev_info_t的定義。

 

二、virtual controller driver實現流程說明

針對virtual controller driver的實現,主要包括如下幾個步驟(我們還是藉助platform驅動模型實現virtual controller driver):

  1. 創建一個platform device,用於實現與virtual controller driver對應的platform driver進行匹配;
  2. 創建一個platform driver,在該driver的probe接口中實現如下功能:
    1. 申請virtual_i2c_bus_t類型的內存空間,並設置virtual_i2c_bus_t->adapter.algo,主要設置master_xfer(virtual_i2c_master_xfer)、functionality;
    2. 調用i2c_add_adapter接口,將virtual_i2c_bus_t->adapter註冊至i2c子系統中;
    3. 調用i2c_new_device接口,創建virtual i2c device,並依附於上述a中創建的adapter;
    4. 針對接口virtual_i2c_master_xfer,針對傳遞i2c_msg,將其與已註冊至virtual_i2c_bus_t->virtual_dev_info中的virtual i2c device進行對比,若找到i2c 地址相同的virtual i2c device,則進行寄存器的設置/讀取寄存器的值等。

 

三、 i2c device driver的實現流程說明

通過以上兩步已經實現了virtual i2c adapter、virtual i2c device,現在我們就可以實現i2c

device driver,進行i2c device driver的聯繫了。實現的流程如下:

  1. 定義struct i2c_driver類型的變量,並實現 struct i2c_device_id、struct of_device_id類型變量的設置,並賦值給struct i2c_driver中對應的成員變量;並實現struct i2c_driver中的probe接口、remove接口;
  2. 在上述1中實現的probe接口中,我們可以實現該i2c device對應的字符設備,從而應用程序即可通過操作字符設備文件,從而完成與virtual i2c device的通信。

 

四、i2c device字符設備文件的訪問

當完成以上內容後,我們即可以在應用層中,通過訪問字符設備文件,從而完成與virtual i2c device的訪問。

 

 

本文主要簡要說明了virtual i2c controller、virtual i2c device的實現,用於進行i2c模塊的練習(尤其在身邊沒有開發板,又想學習linux i2c驅動時),至於本章的代碼,已經上傳至csdn上,稍後會把鏈接發送出來(鏈接如下virtual i2c controller driver)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章