先留下,有時間看看。首先給出乙個ed和td的鍊錶結構圖,相信有了這個圖對**的理解就容易多了!
headptr-->ed-->ed-->ed-->ed
ed-->td-->td-->td...
根據ohci spec:每個ed(endpoint descriptor)描述usb裝置的乙個端點的所有資料傳輸,所有的ed被連線在一起;而td(transfer descriptor)描述的才是最終要在usb匯流排上傳輸的資料報,屬於同乙個usb裝置端點的td被連線在一起,並掛在相應的ed上。
1)ohcd.c
該檔案在platform下,可替代wince自帶的system.c檔案(在public/common/oak/drivers/usb/hcd/ohc/下)。該檔案中的函式被hcddrv.c檔案中的hcd_流形式介面函式呼叫。
2)hcddrv.cpp
該檔案在public/common/oak/drivers/usb/hcd/common下面,檔案中的具體設定函式:
hcdmdd_creatememoryobject
hcdmdd_createhcdobject
hcdmdd_destroymemoryobject
hcdmdd_destroyhcdobject
hcdmdd_poweron
hcdmdd_powerdown
hcdmdd_setcapability
又被ohcd.c中的函式呼叫
cuhcd-->chw-->chcd(繼承關係,cuhcd的例項被建立)
初始化函式呼叫流程
1)hcd_init()[hcddrv.cpp]
2)hcdpdd_init()[ohcd.c]
3)initializeohci()[ohcd.c]
配置iobase,irq。可讀取登錄檔,也可以通過程式自配
4)hcdmdd_creatememoryobject();hcdmdd_createhcdobject()[hcddrv.cpp]
hcdmdd_creatememoryobject()==>cphysmem->inittedok()[usb/hcd/common/cphysmem.hpp]
hcdmdd_createhcdobject()==>chcd->deviceinitialize()[usb/hcd/ohcd2/cuhcd.cpp]
chcd:
1)cdeviceglobal::initialize()[usb/hcd/common/cdevice.cpp]
載入usbd.dll,並呼叫其中的hcdattach()[usb/usbd/usbddrv.cpp]用hcddrv.cpp中的gc_hcdfuncs來設定usbd層的功能函式[phcd->phcdfuncs]
2)chw::initialize()[usb/hcd/ohcd2/chw.cpp]
初始化硬體,控制器暫存器,並建立執行緒用於處理hc的ist,並呼叫signalcheckfordonetransfer()來偵聽傳輸的完成
3)chccarea::initialize()[usb/hcd/ohcd2/cpipe.cpp]
初始化cpipe的靜態變數,建立乙個禎鍊錶的空調度,同時建立中斷queue head樹,建立執行緒用於處理傳輸完成。
ioportbase = usb_base 以及sys_irq的初始化流程
1)hcdpdd_init()[ohcd.c]
2)initializeohci()[ohcd.c]
3)configureohcicard()[ohcd.c]:在此配置;hcdmdd_createhcdobject()[hcddrv.cpp]
4)createhcdobject()[cuhcd.cpp]:在此new cuhcd並初始化其父類chw,在chw初始化時初始化其成員變數m_portbase[chw.cpp]
transfer流程
所有的issuetransfer最終都要呼叫cpipe::issuetransfer()[cpipe.cpp]
1)new stransfer並配置
2)拷貝client buffer到out transfer
3)addtransfer:設定tds鍊錶並加到相應的ed下
4)scheduletransfer
5)chw:
[以下以bulk為例]
1)在chw::initialize()中有
chw::m_pbulkhead = &m_portbase->hcbulkheaded;
2)在各pipe類的::openpipe()中有
*(chw::m_pbulkhead) = (pa)m_ped;
故此:傳輸過程由hc根據各ed值來讀寫指定記憶體,具體資料在各ed下的tds鍊錶中的各td中,過程由hccontrol和hccommandstatus暫存器的各相應位來控制。
wince下usb驅動攻堅戰
首先給出乙個ed和td的鍊錶結構圖,相信有了這個圖對 的理解就容易多了!headptr ed ed ed ed ed td td td.根據ohci spec 每個ed endpoint descriptor 描述usb裝置的乙個端點的所有資料傳輸,所有的ed被連線在一起 而td transfer ...
通過陣地攻堅戰談專案調研的方法
通過陣地攻堅戰談專案調研的方法 有過做資訊管理軟體經驗的人,可能都有這樣感受,專案客戶總是滿意,總是不停的提需求,總改不完,出現這樣的原因,可能很多,但有至少專案調研沒有做的足夠好。那麼怎麼才做好專案調研呢?做乙個專案就好比一場,陣地攻堅戰,上峰要求以最快速度,最少 拿下。看到電影中有經驗的指揮員,...
WINCE下的USB驅動開發
首先usb載入式流介面驅動要點分析 為了支援不同型別的外圍裝置,wince平台提供了具有定製介面的流介面驅動程式模型。因為大部分usb外圍裝置由於功能性更適合流介面驅動的結構,所以一般都採用載入式流介面驅動程式模型來開發usb裝置驅動程式。1 usb系統結構分析 wince下usb系統軟體由兩層組成...