SDIO驅動 3 sdio匯流排誕生記

2021-07-31 16:48:32 字數 1699 閱讀 9636

linux定義了形形色色的匯流排i2c,usb,pci還有我們這裡要說的sdio等等等等,所謂匯流排,簡單理解就是實現

乙個規範(specification),用來支援

規範中定義的操作時序、讀寫方式、命令集合等,滿足spec定義的裝置或驅動就可以掛載上面由core(usb core,mmc core)進行管理。

對於sdio匯流排,它的定義如下:

static struct bus_type sdio_bus_type = ;
"sdio"是我們給匯流排起的名字。

dev_attrs是乙個struct device_attribute型別的指標,用來指定匯流排上裝置的屬性。如果用陣列賦值,則最後乙個元素必須為null,表示陣列的結束,如這裡的陣列sdio_dev_attrs:

static struct device_attribute sdio_dev_attrs = ;
其中__attr_ro是乙個巨集,我們結合

struct device_attribute結構體來理解:

#define __attr_null  }

#define __attr_ro(_name) , \

.show = _name##_show, \

}struct device_attribute ;

顯而易見,這裡就是定義指定name的屬性並設定屬性讀取函式(0444-唯讀屬性)。各個屬性檔案對應唯讀函式函式實現:

/* show configuration fields */

#define sdio_config_attr(field, format_string) \

static ssize_t field##_show(struct device *dev, struct device_attribute *attr, char *buf) \

sdio_config_attr(class, "0x%02x\n");

sdio_config_attr(vendor, "0x%04x\n");

sdio_config_attr(device, "0x%04x\n");

一目了然。

sdio匯流排註冊方式:

int sdio_register_bus(void)

由於mmc/sd/sdio之間的千絲萬縷的關係,它們在mmc core

統一註冊,sdio_register_bus()的呼叫:

subsys_initcall(mmc_init);

static int __init mmc_init(void)

mmc_register_bus,註冊"mmc"匯流排,成功後在sys檔案系統就會出現/sys/bus/mmc/目錄。

mmc_register_host_class,註冊"mmc_host"類(class),,

成功後在sys檔案系統就會出現/sys/class/mmc_host/目錄;出錯的話說明mmc子系統出現故障,然後呼叫mmc_unregister_bus卸掉上面註冊的mmc匯流排。

sdio_register_bus,這個就是我們的"sdio"匯流排註冊,如果出錯卸掉前面的註冊結果。註冊成功後在sys檔案系統就會出現/sys/bus/sdio/目錄。

SDIO匯流排協議

sdio採用host device模式,所有通訊都由host端發命令,device裝置只要解析host命令就可與host進行通訊。sdio匯流排的幾根線 1.clk訊號 host給device的時鐘訊號.2.cmd訊號 雙向的訊號,用於傳送命令和反應。3.dat0 dat3 訊號 四條用於傳送的資料...

SDIO匯流排協議

sdio採用host device模式,所有通訊都由host端發命令,device裝置只要解析host命令就可與host進行通訊。sdio匯流排的幾根線 1.clk訊號 host給device的時鐘訊號.2.cmd訊號 雙向的訊號,用於傳送命令和反應。3.dat0 dat3 訊號 四條用於傳送的資料...

37 SDIO裝置驅動

sd secure digital memory card io 卡是在sd 記憶體卡介面基礎之上發展起來的介面。sdio 協議類似於 usb匯流排協議。和usb總路線類似,sdio總路線也有兩端,一端是host端,另外一端是device端,所有指令都是由host端發出指令開始,在device端只要...