<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>

    曙海教育集團(tuán)論壇Win CE 專區(qū)WinCE系統(tǒng)定制與驅(qū)動開發(fā) → wince下usb驅(qū)動攻堅(jiān)戰(zhàn)


      共有7505人關(guān)注過本帖樹形打印

    主題:wince下usb驅(qū)動攻堅(jiān)戰(zhàn)

    美女呀,離線,留言給我吧!
    wangxinxin
      1樓 個(gè)性首頁 | 博客 | 信息 | 搜索 | 郵箱 | 主頁 | UC


    加好友 發(fā)短信
    等級:青蜂俠 帖子:1393 積分:14038 威望:0 精華:0 注冊:2010-11-12 11:08:23
    wince下usb驅(qū)動攻堅(jiān)戰(zhàn)  發(fā)帖心情 Post By:2010-11-26 14:08:26

    首先給出一個(gè)ED和TD的鏈表結(jié)構(gòu)圖,相信有了這個(gè)圖對代碼的理解就容易多了!
    HeadPtr-->ED-->ED-->ED-->ED
    ED-->TD-->TD-->TD...

        根據(jù)OHCI spec:每個(gè)ED(Endpoint Descriptor)描述USB設(shè)備的一個(gè)端點(diǎn)的所有數(shù)據(jù)傳輸,所有的ED被連接在一起;而TD(Transfer Descriptor)描述的才是最終要在USB總線上傳輸?shù)臄?shù)據(jù)包,屬于同一個(gè)USB設(shè)備端點(diǎn)的TD被連接在一起,并掛在相應(yīng)的ED上。
    1)ohcd.c
    該文件在platform下,可替代wince自帶的system.c文件(在public/common/oak/drivers/usb/hcd/ohc/下)。該文件中的函數(shù)被hcddrv.c文件中的HCD_流形式接口函數(shù)調(diào)用。
    2)hcddrv.cpp
    該文件在public/common/oak/drivers/usb/hcd/common下面,文件中的具體設(shè)置函數(shù):
    HcdMdd_CreateMemoryObject
    HcdMdd_CreateHcdObject
    HcdMdd_DestroyMemoryObject
    HcdMdd_DestroyHcdObject
    HcdMdd_PowerOn
    HcdMdd_PowerDown
    HcdMdd_SetCapability
    又被ohcd.c中的函數(shù)調(diào)用
    CUHcd-->CHW-->CHcd(繼承關(guān)系,CUHcd的實(shí)例被創(chuàng)建)
     
    初始化函數(shù)調(diào)用流程
    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,并調(diào)用其中的HcdAttach()[usb/usbd/usbddrv.cpp]用hcddrv.cpp中的gc_HcdFuncs來設(shè)置usbd層的功能函數(shù)[pHcd->pHcdFuncs]
    2)CHW::Initialize()[usb/hcd/ohcd2/chw.cpp]
    初始化硬件,控制器寄存器,并創(chuàng)建線程用于處理HC的IST,并調(diào)用SignalCheckForDoneTransfer()來偵聽傳輸?shù)耐瓿?br/>3)CHCCArea::Initialize()[usb/hcd/ohcd2/cpipe.cpp]
    初始化CPipe的靜態(tài)變量,建立一個(gè)禎鏈表的空調(diào)度,同時(shí)建立中斷Queue Head樹,創(chuàng)建線程用于處理傳輸完成。
     
    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初始化時(shí)初始化其成員變量m_portBase[chw.cpp]
     
    Transfer流程
    所有的IssueTransfer最終都要調(diào)用CPipe::IssueTransfer()[cpipe.cpp]
    1)new STransfer并配置
    2)拷貝client buffer到out transfer
    3)AddTransfer:設(shè)置TDs鏈表并加到相應(yīng)的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根據(jù)各ED值來讀寫指定內(nèi)存,具體數(shù)據(jù)在各ED下的TDS鏈表中的各TD中,過程由HcControl和HcCommandStatus寄存器的各相應(yīng)位來控制。

    支持(0中立(0反對(0單帖管理 | 引用 | 回復(fù) 回到頂部

    返回版面帖子列表

    wince下usb驅(qū)動攻堅(jiān)戰(zhàn)








    簽名