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端只要...