i2c core之介面卡驅動註冊(4)

2021-05-26 15:06:21 字數 2821 閱讀 6923

在i2c-core架構中struct i2c_adapter和struct i2c_algorithm是為介面卡服務的,也就是i2c匯流排控制器驅動。註冊乙個介面卡驅動就是要把乙個struct i2c_adapter 加入到核心中,前面我們說過i2c-core中的i2c_adapter_idr是專門用來管理註冊到i2c-core中的struct i2c_adapter結構的。struct i2c_adapter中有指向具體struct i2c_algorithm的指標。struct i2c_algorithm是i2c的具體操作方法函式。核心中提供了兩個adapter註冊介面,分別為i2c_add_adapter()和i2c_add_numbered_adapter().由於在系統中可能存在多個adapter,因為將每一條i2c匯流排對應乙個編號,下文中稱為i2c匯流排號.這個匯流排號的pci中的匯流排號不同.它和硬體無關,只是軟體上便於區分而已。當在實現的具體struct i2c_algorithm中一般也提供了相類似的介面i2c_***_add_numbered_adapter和i2c_***_add_adapter。  對於i2c_add_adapter()而言,它使用的是動態匯流排號,即由系統給其分析乙個匯流排號,而i2c_add_numbered_adapter()則是自己指定匯流排號,如果這個匯流排號非法或者是被占用,就會註冊失敗.分別來看一下這兩個函式的**:

int i2c_add_adapter(struct i2c_adapter *adapter)

adapter->nr = id;

return i2c_register_adapter(adapter);

} int i2c_add_numbered_adapter(struct i2c_adapter *adap)

mutex_unlock(&core_lock);

if (status == -eagain)

goto retry;

if (status == 0)

status = i2c_register_adapter(adap);

return status;

} 至於idr的使用方法,在前節中已經介紹。對比兩個**的區別在於前者沒有指定adap->nr,而是從某一起始數字開始動態分配而後者直接指定了nr,如果分配的id不和指定的相等,便返回錯誤。接著我們繼續追蹤i2c_register_adapter。

static int i2c_register_adapter(struct i2c_adapter *adap)

sprintf(adap->dev.bus_id, "i2c-%d", adap->nr);

adap->dev.release = &i2c_adapter_dev_release;

adap->dev.class = &i2c_adapter_class;

res = device_register(&adap->dev);

if (res)

goto out_list;

dev_dbg(&adap->dev, "adapter [%s] registered\n", adap->name);

//介面卡驅動註冊進核心後,對系統中現有的兩種裝置進行繫結。

/* create pre-declared device nodes for new-style drivers */

if (adap->nr < __i2c_first_dynamic_bus_num)

i2c_scan_static_board_info(adap);

/* notify drivers */

dummy = bus_for_each_drv(&i2c_bus_type, null, adap,

i2c_do_add_adapter);

out_unlock:

mutex_unlock(&core_lock);

return res;

out_list:

idr_remove(&i2c_adapter_idr, adap->nr);

goto out_unlock;

} 核心中i2c裝置的加入有兩種方式,一種是在soc上板級是利用i2c_register_board_info註冊在__i2c_board_list鍊錶上的i2c裝置(由__i2c_board保護)。另外一種就是通過i2c_driver驅動加入的裝置。下面我們分別看看兩種情況

static void i2c_scan_static_board_info(struct i2c_adapter *adapter)

mutex_unlock(&__i2c_board_lock);

} 第一種是對&__i2c_board_list中的每個struct i2c_devinfo對比,若busnum與介面卡編號相同則呼叫i2c_new_device把裝置繫結到介面卡。

對第二種通過裝置驅動註冊進的裝置呼叫的函式為bus_for_each_drv(&i2c_bus_type, null, adap,i2c_do_add_adapter)對i2c匯流排上的每個驅動呼叫i2c_do_add_adapter(drv,adap)函式,下面我們看看i2c_do_add_adapter函式。

static int i2c_do_add_adapter(struct device_driver *d, void *data)

return 0;

} 第二方式應對的是以驅動方式註冊進系統的i2c裝置,因為i2c驅動由兩種方式因此這裡有有兩種應對方式,而且新舊兩種方式中實現的對應函式也有所不同,新中以probe函式為代表,而舊中以attach_adapter和detach_adapter為代表(舊方法我們在這裡不再追蹤)。

----------------------------未完待續

介面卡模式2

介面卡模式 物件的介面卡模式 當希望將乙個物件 source 轉換為s滿足乙個介面 targetable 的新物件 adapter 時,建立乙個類 adapter 實現介面,該類持有乙個原物件 source 並在實現方法中呼叫例項source的方法 public class adapter impl...

STL之介面卡

注意 需包含標頭檔案 functional 步驟 bind2nd 或者 bind1st 將兩個引數進行繫結 bind2nd 繫結順序是一致 類繼承 binary function 型別1 型別2 返回值型別 加 const 寫法 class myprint public binary functio...

STL之介面卡

摘要 本文主要講了介面卡的一些內容,重要的是了解介面卡使用的步驟。1 include2 include3 include 4 include5 include 67 using namespace std 89 第一步 繫結 資料 bind2nd 10 繼承類 binary function 引數型...