天天看點

Linux 核心列舉裝置和驅動

如果你在編寫總線級别的代碼, 你可能不得不對所有已經注冊到你的總線的裝置或驅動進 行一些操作. 它可能會誘惑人直接進入 bus_type 結構中的各種結構, 但是最好使用已經 提供的幫助函數.

為操作每個對總線已知的裝置, 使用:

int bus_for_each_dev(struct bus_type *bus, struct device *start, void *data, int (*fn)(struct device *, void *));

這個函數列舉總線上的每個裝置, 傳遞關聯的裝置結構給 fn, 連同作為 data 來傳遞的 值. 如果 start 是 NULL, 列舉從總線的第一個裝置開始; 否則列舉從 start 之後的第 一個裝置開始. 如果 fn 傳回一個非零值, 列舉停止并且那個值從 bus_for_each_dev 返 回.

有一個類似的函數來列舉驅動:

int bus_for_each_drv(struct bus_type *bus, struct device_driver *start, void *data, int (*fn)(struct device_driver *, void *));

這個函數就像 buf_for_each_dev, 除了, 當然, 它替之作用于驅動.

應當注意, 這 2 個函數持有總線子系統的讀者/寫者旗标在工作期間. 是以試圖一起使用 這 2 個會死鎖 -- 每個将試圖擷取同一個旗标. 修改總線的操作( 例如登出裝置 )也将 鎖住. 是以, 小心使用 bus_for_each 函數.

繼續閱讀