wince下usb驅動攻堅戰

2021-05-09 22:10:17 字數 2484 閱讀 7014

首先給出乙個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::deviceinitialize()過程

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::listcontrol()

[以下以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暫存器的各相應位來控制。

本文出自 「bluefish

」 部落格,請務必保留此出處http://bluefish.blog.51cto.com/214870/72920

wince下usb驅動攻堅戰

先留下,有時間看看。首先給出乙個ed和td的鍊錶結構圖,相信有了這個圖對 的理解就容易多了!headptr ed ed ed ed ed td td td.根據ohci spec 每個ed endpoint descriptor 描述usb裝置的乙個端點的所有資料傳輸,所有的ed被連線在一起 而td...

通過陣地攻堅戰談專案調研的方法

通過陣地攻堅戰談專案調研的方法 有過做資訊管理軟體經驗的人,可能都有這樣感受,專案客戶總是滿意,總是不停的提需求,總改不完,出現這樣的原因,可能很多,但有至少專案調研沒有做的足夠好。那麼怎麼才做好專案調研呢?做乙個專案就好比一場,陣地攻堅戰,上峰要求以最快速度,最少 拿下。看到電影中有經驗的指揮員,...

WINCE下的USB驅動開發

首先usb載入式流介面驅動要點分析 為了支援不同型別的外圍裝置,wince平台提供了具有定製介面的流介面驅動程式模型。因為大部分usb外圍裝置由於功能性更適合流介面驅動的結構,所以一般都採用載入式流介面驅動程式模型來開發usb裝置驅動程式。1 usb系統結構分析 wince下usb系統軟體由兩層組成...