WINCE6.0+S3C2443下的usb function(功能)驱动
********************************LoongEmbedded************************
作者:LoongEmbedded(kandi)
時(shí)間:2011.03.16
類別:WINCE驅(qū)動(dòng)開發(fā)
********************************LoongEmbedded************************
?
注:這里提到的MDD層和PDD層是對(duì)于usb function controller driver來說的
主要基于activesync功能的實(shí)現(xiàn)來學(xué)習(xí),也即Serial:用于支持USB Device作為串口設(shè)備。
?
1.?????? usb function驅(qū)動(dòng)架構(gòu)
圖1
Architecturally, a USB function client driver is above a USB function controller driver. A USB function client driver interfaces with a USB function controller driver through the USB function controller driver's hardware independent MDD. The USB function controller driver's MDD and all USB function client drivers are hardware platform independent. Multiple USB function client drivers interface with the same USB function controller driver. Each client interfaces with the USB function controller driver through the USB function controller driver's MDD. Along with the MDD, a USB function controller driver is also comprised of a PDD, which is architecturally below the MDD. The PDD interfaces directly with the USB function controller hardware.
?
從架構(gòu)上來說,USB function client驅(qū)動(dòng)位于USB function controller驅(qū)動(dòng)的之上,USB function controller驅(qū)動(dòng)的MDD層是USB function client驅(qū)動(dòng)和USB function controller驅(qū)動(dòng)之間的接口,多個(gè)USB function client驅(qū)動(dòng)共用可以同一個(gè)USB function controller驅(qū)動(dòng),USB function controller驅(qū)動(dòng)的PDD層直接和USB function controller hardware打交道。
?
2.?????? usb function驅(qū)動(dòng)組件
下圖是WINCE6.0中usb function
圖2
3.?????? usb function硬件設(shè)計(jì)
圖3
?
?
4.?????? usb function驅(qū)動(dòng)的實(shí)現(xiàn)
4.1?? USB設(shè)備端點(diǎn)的概念
每個(gè)端點(diǎn)都是一個(gè)簡(jiǎn)單的連接點(diǎn),或者支持?jǐn)?shù)據(jù)流進(jìn)設(shè)備,或者支持其流出設(shè)備,兩者不可兼得?;?/span>PnP機(jī)制,設(shè)備被枚舉時(shí),它必須向主機(jī)報(bào)告各個(gè)端點(diǎn)的特性,包括端點(diǎn)號(hào),通信方向,端點(diǎn)支持的最大包大小,帶寬要求等(其中端點(diǎn)支持的最大包大小叫做數(shù)據(jù)有效負(fù)載)。每個(gè)設(shè)備必須有端點(diǎn)0,它用于設(shè)備枚舉和對(duì)設(shè)備進(jìn)行一些基本的控制功能。除了端點(diǎn)0,其余的端點(diǎn)在設(shè)備配置之前不能與主機(jī)通信,只有向主機(jī)報(bào)告這些端點(diǎn)的特性并被確認(rèn)后才能被激活。
?
特別地,缺省控制通道也是一個(gè)消息通道。當(dāng)客戶程序通過USB管道發(fā)送或接收數(shù)據(jù)時(shí),它首先調(diào)用Win32 APl,調(diào)用最終將使功能驅(qū)動(dòng)程序收到一個(gè)IRP。而驅(qū)動(dòng)程序的工作就是把客戶的請(qǐng)求引導(dǎo)到有正確端點(diǎn)的管道上。它把請(qǐng)求提交到總線驅(qū)動(dòng)程序,總線驅(qū)動(dòng)程序再把請(qǐng)求分解成多個(gè)事務(wù),然后這些事務(wù)被送往總線。總線上的信息流以每毫秒一幀數(shù)據(jù)的形式流動(dòng)??偩€驅(qū)動(dòng)程序必須安排好多個(gè)事務(wù)以使它們能被裝入同一幀中。在主機(jī)和設(shè)備的端口之間,可視為一個(gè)通道。USB中有一個(gè)特殊的通道一缺省控制通道,它屬于消息通道,設(shè)備一啟動(dòng)即存在,從而為設(shè)備的設(shè)置、狀態(tài)查詢和輸入控制信息提供一個(gè)入口。
?
端點(diǎn)有三個(gè)狀態(tài):空閑,數(shù)據(jù)流入和數(shù)據(jù)流出。
?
?
?
4.2?? USB function client驅(qū)動(dòng)總線接口
USB function controller驅(qū)動(dòng)的MDD層實(shí)現(xiàn)并導(dǎo)出了總線接口,這樣就可以利用這個(gè)接口來加載USB function client驅(qū)動(dòng)。IOCTL的初始化之后,USB function controller驅(qū)動(dòng)的MDD層根據(jù)注冊(cè)表項(xiàng)HKEY_LOCAL_MACHINE/Drivers/USB/FunctionDrivers下面的鍵值來加載默認(rèn)的USB function client驅(qū)動(dòng),比如加了Device Drivers->USB Function->USB Function Clients->serial組件之后在common.reg中有此client驅(qū)動(dòng)對(duì)應(yīng)的注冊(cè)表項(xiàng)
[HKEY_LOCAL_MACHINE/Drivers/USB/FunctionDrivers]
?? "DefaultClientDriver"=- ; erase previous default
[HKEY_LOCAL_MACHINE/Drivers/USB/FunctionDrivers]
?? "DefaultClientDriver"="Serial_Class"
如果此鍵值不存在,那么在IOCTL的初始化也會(huì)成功,但不能使能function controller。當(dāng)然應(yīng)用程序可以稍后增加這個(gè)注冊(cè)表項(xiàng),并且調(diào)用MDD層的IOCTL_BUS_ACTIVATE_CHILD來加載client驅(qū)動(dòng)。
?
為了增加我們應(yīng)用的靈活性,可以在platform.reg中增加注冊(cè)表項(xiàng)HKEY_LOCAL_MACHINE/Drivers/USB/FunctionDrivers來替代common.reg中相應(yīng)的內(nèi)容,下面是我們的platform.reg中的相關(guān)注冊(cè)表信息
圖4
享有特權(quán)的應(yīng)用程序可以通過DeviceIoControl函數(shù)獲取MDD層總線接口的句柄,并且通過IOCTL_BUS_UFN_ENUMERATE_AVAILABLE_CLIENTS可以枚舉不同的客戶端程序,當(dāng)然也可以獲取當(dāng)前的客戶程序的名字,可以下載當(dāng)前的客戶程序并且加載新的客戶程序等等,關(guān)于USB function controller驅(qū)動(dòng)的IO控制碼,見下面的描述
圖5
對(duì)上面IOCTLs的支持和實(shí)現(xiàn)是在MDD層的Ufnbus.cpp下面的CUfnBus::IOControl()來實(shí)現(xiàn)的,
在此需要注意的是MDD層支持的總線訪問IOCTLs不包含IOCTL_BUS_GET_CONFIGURE_DATA 和IOCTL_BUS_SET_CONFIGURE_DATA。
?
4.3?? USB function controller驅(qū)動(dòng)MDD層及DDI接口
MDD層和client的接口函數(shù)如下,在public/common/oak/inc/usbfntypes.h下定義
圖6
既然是MDD層提供給Client調(diào)用的接口函數(shù),就必須在MDD層來實(shí)現(xiàn)這些函數(shù)并且填充些個(gè)函數(shù)指針,先看MDD層的UFN_Init()函數(shù)中下面部分:
圖7
而CUfnBus類主要是用于加載client驅(qū)動(dòng)并且處理USB function controller驅(qū)動(dòng)的IOCTLs,見圖5,創(chuàng)建CUfnBus后會(huì)調(diào)用其成員函數(shù)CUfnBus::PostInit()
圖8
Client驅(qū)動(dòng)被加載后,此后此client就是usb bus下的一個(gè)child,接著client會(huì)調(diào)用ufnclient.cpp下面的函數(shù)UfnInitializeInterface()向usb bus發(fā)出IOCTL_UFN_GET_CLIENT_DATA_EX請(qǐng)求
圖9
下面就來看CUfnBus::IOControl()函數(shù)對(duì)這個(gè)case的處理
圖10
下面看看GetClientFunctions()函數(shù)
圖11
到這里client就獲取到MDD層為其提供的函數(shù)接口了,后面就可以調(diào)用這些函數(shù)了。
?
MDD層的主要工作如下:
4.3.1根據(jù)usb描述符來注冊(cè)usb設(shè)備(在此指WINCE的usb function接口)
這里先來了解一下usb描述符,USB采用USB標(biāo)準(zhǔn)描述符說明一個(gè)USB設(shè)備,這些描述符包括設(shè)備描述符、配置描述符、接口描述符、端點(diǎn)描述符和字符串描述符。
(1)設(shè)備描述符 (Device Descriptor)用于指出USB設(shè)備的總體信息,其內(nèi)容對(duì)該設(shè)備中同一傳輸模式下的所有配置都有效。一個(gè)設(shè)備只能有一個(gè)設(shè)備描述符,但是一個(gè)設(shè)備允許多個(gè)配置描述符。設(shè)備描述符的結(jié)構(gòu)體如下:
typedef struct _USB_DEVICE_DESCRIPTOR {
??? UCHAR bLength;
??? UCHAR bDescriptorType;
??? USHORT bcdUSB;
??? UCHAR bDeviceClass;
??? UCHAR bDeviceSubClass;
??? UCHAR bDeviceProtocol;
??? UCHAR bMaxPacketSize0;
?
??? USHORT idVendor;
??? USHORT idProduct;
??? USHORT bcdDevice;
??? UCHAR iManufacturer;
??? UCHAR iProduct;
??? UCHAR iSerialNumber;
??? UCHAR bNumConfigurations;
} USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR;
?
(2)配置描述符? (Configuration Descriptor)為USB設(shè)備的配置指出其配置信息。USB設(shè)備的一個(gè)配置可以包含一個(gè)或者多個(gè)接口,且每個(gè)接口都可以相互獨(dú)立工作,所有的USB設(shè)備都至少支持一個(gè)配置描述符,每個(gè)配置都必須有自己的配置描述符。當(dāng)主機(jī)請(qǐng)求配置描述符時(shí),其所有相關(guān)的接口描述符和端點(diǎn)描述符都將被返回。
typedef struct _USB_CONFIGURATION_DESCRIPTOR {
??? UCHAR bLength;
??? UCHAR bDescriptorType;
??? USHORT wTotalLength;
??? UCHAR bNumInterfaces;
??? UCHAR bConfigurationValue;
??? UCHAR iConfiguration;
??? UCHAR bmAttributes;
??? UCHAR MaxPower;
} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR;
?
(3)接口描述符(interface DescriPtor)用于指定usB設(shè)備中各個(gè)接口的特性,設(shè)備的每個(gè)接口都必須有一個(gè)描述符。USB設(shè)備的接口是一個(gè)端點(diǎn)的集合,負(fù)責(zé)完成設(shè)備的特定功能,接口可以包含一個(gè)或者多個(gè)可替換配置,它們能夠在USB設(shè)備處于配置狀態(tài)時(shí),改變當(dāng)前接口所含端點(diǎn)的個(gè)數(shù)和特性。USB設(shè)備同一配置的各個(gè)接口間不能使用相同的端點(diǎn),但是同一接口的各個(gè)可替換配置間可以使用相同的端點(diǎn)。
typedef struct _USB_INTERFACE_DESCRIPTOR {
??? UCHAR bLength;
??? UCHAR bDescriptorType;
??? UCHAR bInterfaceNumber;
??? UCHAR bAlternateSetting;
??? UCHAR bNumEndpoints;
??? UCHAR bInterfaceClass;
??? UCHAR bInterfaceSubClass;
??? UCHAR bInterfaceProtocol;
??? UCHAR iInterface;
} USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR;
?
(4)端點(diǎn)描述符(EndPointDescriptor)用于指出usB設(shè)備端點(diǎn)的特性,如其所支持的傳輸類型、傳輸方向等信息。除端點(diǎn)O外,USB設(shè)備的每個(gè)端點(diǎn)都必須有一個(gè)端點(diǎn)描述符。
???????? typedef struct _USB_ENDPOINT_DESCRIPTOR {
??? UCHAR bLength;
??? UCHAR bDescriptorType;
??? UCHAR bEndpointAddress;
??? UCHAR bmAttributes;
??? USHORT wMaxPacketSize;
??? UCHAR bInterval;
} USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR;
????? (5)字符串描述符(stringDescriptor)用于保存一些文本信息,它是可選的。在USB設(shè)備的其他描述符中,可以含有指向字符串描述符的索引值。
???????? typedef struct _USB_STRING_DESCRIPTOR {
??? UCHAR bLength;
??? UCHAR bDescriptorType;
??? WCHAR bString[1];
} USB_STRING_DESCRIPTOR, *PUSB_STRING_DESCRIPTOR;
?
USB function clients調(diào)用lpRegisterDevice函數(shù)(最終會(huì)調(diào)用MDD層的UfnMdd_RegisterDevice())把預(yù)先填充的描述符傳遞給MDD層,這些描述符包含端點(diǎn)數(shù)據(jù)包(endpoint packet)期望的最大包大小(在此為字節(jié)數(shù))。MDD和PDD層在client指定的最大限制條件下協(xié)調(diào)使用的端點(diǎn)數(shù)據(jù)大小,MDD和PDD層可以使用小于端點(diǎn)本身供給的包大小,但不能大于。Client通過使用調(diào)整后的包長(zhǎng)度來打開管道到端點(diǎn)的通道。
?
為了處理注冊(cè)過程,client提供總線速度最大可能的端點(diǎn)大小,比如,對(duì)于USB1.1來說,支持的大塊端點(diǎn)數(shù)據(jù)包是64個(gè)字節(jié),而USB2.0支持的大塊端點(diǎn)數(shù)據(jù)包是512個(gè)字節(jié),這樣允許MDD和PDD層可以靈活指定其大小。
?
4.3.2 處理client的枚舉請(qǐng)求
對(duì)于USB1.1和2.0,client驅(qū)動(dòng)傳遞usb描述符給MDD和PDD,除非PDD先處理標(biāo)準(zhǔn)的枚舉的請(qǐng)求,否從由MDD來處理這些請(qǐng)求。當(dāng)枚舉完成后,MDD或PDD傳遞一個(gè)枚舉完成事件給client,然后,client就適當(dāng)?shù)爻跏蓟它c(diǎn)。MDD需要處理下面的設(shè)置請(qǐng)求(setup request)
⑴Get device descriptor
⑵Get device qualifier
⑶Get high speed configuration descriptor, if the MDD is on a high speed bus
⑷Get Full Speed Configuration Descriptor, if the MDD is on a full speed bus
⑸Get string descriptor
⑹Set address
?
下面是help文檔中對(duì)MDD層的描述,為避免誤導(dǎo)大家,故貼出來稍加談?wù)勛约旱睦斫狻?/span>
Before interacting with the host(PC的usb host端), a function driver(usb function controller driver) must configure the underlying(下面的) USB function controller to support the function that it implements. The model device driver (MDD) must provide a mounted function driver(在此為總線驅(qū)動(dòng),見/PUBLIC/COMMON/OAK/DRIVERS/USBFN/CONTROLLER/MDD/ufnbus.cpp) with a way to configure the underlying USB function controller through a USB descriptor set. In addition, a mounted function driver must address a logical endpoint or pipe, through the endpoint address specified in a USB endpoint descriptor(通過端點(diǎn)描述符的bEndpointAddress為端點(diǎn)或通道編址). The MDD must provide a mapping between a pipe and a physical endpoint.
?
MDD functions wrap most of the similarly named PDD functions(這些函數(shù)見下圖). This indirection provides the function driver with the ability to access logical endpoints or pipes. The indirection allows the MDD to map the specified pipe to a physical endpoint.
圖12
The MDD provides functions to activate a particular configuration or interface. These functions handle configuration and pipe access.
?
The following steps show how the USB function driver is configured and how pipe access is set up:
⑴The function driver initializes the MDD, which initializes the PDD.
調(diào)用UfnPdd_Init()來初始化PDD,見圖7
⑵The function driver registers a configuration with the MDD.
這個(gè)在UfnMdd_RegisterDevice函數(shù)中實(shí)現(xiàn)。
By querying the capabilities of the USB function controller, through the PDD, the MDD determines whether the supplied configuration can be supported.
在UfnPdd_Init函數(shù)中實(shí)現(xiàn)
?
⑶The function driver starts the USB function controller if the configuration can be supported.
主要是通過調(diào)用UfnPdd_Start函數(shù)來實(shí)現(xiàn),在這里會(huì)創(chuàng)建線程ISTMain來檢測(cè)usb function中斷。
?
⑷The function driver specifies notification functions for device events and default pipe events.
?
⑸The PDD maps the interrupt to a USB event when an interrupt occurs, and then the PDD notifies the device associated with the interrupt.
?
In other words, the function driver starts the interrupt service thread (IST) of the USB function controller, and supplies the PDD with a set of functions to call on the when an interrupt occurs(中斷發(fā)生的時(shí)候,MDD層調(diào)用PDD層為其提供的函數(shù)集). Handle USB events generated by the USB function controller as interrupts(在PDD層的HandleUSBEvent函數(shù)處理), and handle notification functions as interrupt service routines (ISRs).
?
?
⑺The USB function controller driver begins to service interrupts when the USB function controller is running and the default pipe is open.
默認(rèn)控制管道是一個(gè)消息管道,用于在主機(jī)和USB設(shè)備的端點(diǎn)0之間傳送控制和狀態(tài)信息。
?
⑻The PDD calls the notification functions during USB enumeration.
These functions are supplied by the function driver in response to USB events. The notification function associated with the default pipe is required to read and parse setup token packets and respond to the associated USB standard requests associated with USB enumeration.
?
4.4?? USB function controller驅(qū)動(dòng)PDD層及DDI接口
圖13
PDD主要的主要工作如下:
⑴為mounted function driver(usb總線驅(qū)動(dòng))呈現(xiàn)抽象的USB function controller,這樣可以保證mounted function driver訪問不同的USB function controller時(shí)可以移植過來。
?
⑵PDD層有能力檢查USB function controller的,并且允許usb function controller driver驅(qū)動(dòng)(準(zhǔn)確來說應(yīng)該是其MDD層)配置和分配端點(diǎn)。
?
⑶USB總線事件發(fā)生的時(shí)候通知mounted function driver,并且允許function driver處理和關(guān)閉此事件。
?
4.5?? USB function controller驅(qū)動(dòng)PDD層的實(shí)現(xiàn)
4.5.1????????? USB function controller驅(qū)動(dòng)PDD層用到的中斷及對(duì)應(yīng)的線程的概述
⑴檢測(cè)是否插入usb device線的中斷及線程
根據(jù)圖3可知是用GPF2/EINT2來檢測(cè)WINCE設(shè)備是否和PC端接入usb device線,檢測(cè)到之后由線程PLUG_IST函數(shù)來處理,具體的處理見下面的描述。
?
⑵檢測(cè)usb device中斷及處理線程
線程ISTMain函數(shù)用于檢測(cè)并處理usb deivce中斷,具體處理見下面的描述。
?
4.5.2????????? PDD層的初始化函數(shù)UfnPdd_Init
⑴初始化MDD層和PDD層的接口
圖14
⑵讀取注冊(cè)表項(xiàng)中FunctionDrivers的內(nèi)容來獲取usb function client driver的信息
比如讀取到下面的內(nèi)容
[HKEY_LOCAL_MACHINE/Drivers/USB/FunctionDrivers]
???????? ?? "DefaultClientDriver"=- ; erase previous default
???????? ?? "DefaultClientDriver"="Serial_Class"
然后確定client驅(qū)動(dòng)
?
⑶設(shè)置端口的信息
圖15
這里涉及到端口的結(jié)構(gòu),如下
// Transfer structure passed to the PDD from the MDD in IssueTransfer.
typedef struct _STransfer {
??? DWORD?????????????? dwFlags;
??? PVOID?????????????? pvBuffer;
??? DWORD?????????????? dwBufferPhysicalAddress;
??? DWORD?????????????? cbBuffer;
??? DWORD?????????????? cbTransferred;
??? DWORD?????????????? dwUsbError; // Possible values are in usbfntypes.h
?
??? PVOID?????????????? pvPddData; // PDD can do whatever it likes with this
??? PVOID?????????????? pvPddTransferInfo; // Specific to PDD from client
} STransfer, *PSTransfer;
需要傳輸?shù)臄?shù)量,已經(jīng)傳輸?shù)臄?shù)量
typedef struct EP_STATUS {
??? DWORD????????????????? ?dwEndpointNumber;
??? DWORD?????????????????? dwDirectionAssigned;
??? DWORD?????????????????? dwPacketSizeAssigned;
??? BOOL??????????????????? fInitialized;
??? DWORD?????????????????? dwEndpointType;
??? PSTransfer????????????? pTransfer;
??? CRITICAL_SECTION??????? cs;
} *PEP_STATUS;
這個(gè)結(jié)構(gòu)體保存著一個(gè)端點(diǎn)傳輸中的基本信息:端點(diǎn)的Index號(hào),傳輸方向,每次最大傳輸數(shù)量,端點(diǎn)的類型,此次傳輸?shù)臄?shù)據(jù)存放內(nèi)存首地址
?
⑷調(diào)用DDKReg_GetWindowInfo()和DDKReg_GetIsrInfo()來讀取注冊(cè)表項(xiàng)[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/SC2443USBFN]下保存的IRQ、SysIntr、IoBase、IoLen、等信息。
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/SC2443USBFN]
?? "Dll"="sc2443usbfn.dll"
?? "Prefix"="UFN"
?? "Priority256"=dword:64
?? "IoBase"=dword:B0B00000
?? "IoLen"=dword:1000??????? ; Use one page
?? "Irq"=dword:19
?? "BusIoctl"=dword:2a0048
?? "IClass"=multi_sz:"{E2BDC372-598F-4619-BC50-54B3F7848D35}=%b","{6F40791D-300E-44E4-BC38-E0E63CA8375C}=%b"
?
⑸創(chuàng)建訪問總線放入句柄pContext->hBusAccess,調(diào)用MapRegisterSet將USB device controller register地址映射到虛擬地址空間.,然后設(shè)置attachedState為UFN_DETACH,調(diào)用ResetDevice函數(shù)復(fù)位usb function device和端點(diǎn)。
圖16
?
⑹傳遞MDD層和PDD層的接口,創(chuàng)建usb device線插拔的事件,中斷及IST。
圖17
下面來學(xué)習(xí)檢測(cè)usb device線的插拔的線程PLUG_IST
圖18
?
4.5.3????????? 處理USB device中斷的ISTMain()
CUsbFn::Init()->CUsbFn::StartUSBFunction()->UfnMdd_Start()->UfnPdd_Start(),ISTMain在UfnPdd_Start()被創(chuàng)建,先來看這個(gè)IST的函數(shù)體的前面部分
圖19
下面來看后部分
圖20
下面來學(xué)習(xí)HandleUSBEvent()
圖21
接著分別介紹HandleUSBEvent函數(shù)中調(diào)用到的主要函數(shù)
⑴ HandleUSBBusIrq()
介紹這個(gè)函數(shù)之前先來認(rèn)識(shí)一下USB2.0 function的系統(tǒng)狀態(tài)寄存器(SSR),
圖22
HandleUSBBusIrq()函數(shù)主要是處理來usb總線中斷,記得當(dāng)系統(tǒng)狀態(tài)的改變導(dǎo)致的中斷發(fā)生后,要對(duì)SSR寄存器相應(yīng)的位置1來清除相應(yīng)的位。如果是下面幾種usb總線中斷時(shí),如果處于已連接的狀態(tài),就需要告訴MDD層來做相應(yīng)的處理
圖23
比如當(dāng)檢查到host發(fā)送過來的suspend信號(hào),這時(shí)先要判斷usb device是否處于連接的狀態(tài),如果是就要告訴MDD層來處理,
圖24
這樣就可以調(diào)用UfnMdd_Notify函數(shù)來處理這個(gè)總線中斷請(qǐng)求,其他總線中斷請(qǐng)求的處理可做類似的分析
圖25
?
⑵ HandleEndpoint0Event()
先來看端點(diǎn)0相關(guān)寄存器
端點(diǎn)0中斷寄存器(EIR)
圖26
?
端點(diǎn)0狀態(tài)寄存器(ESR)
圖27
端點(diǎn)0控制寄存器(ECR)
圖28
下面來看HandleEndpoint0Event的函數(shù)體部分
圖29
圖30
上面部分的主要工作是準(zhǔn)備發(fā)送配置包,讀取要發(fā)送包的字節(jié)數(shù),獲得USB Device Request指針,讀取FIFO數(shù)據(jù)(EP0 Buffer Register)到pbUdr中。然后對(duì)讀到的數(shù)據(jù)進(jìn)行解析,如果數(shù)據(jù)長(zhǎng)度大于0,獲得傳輸方向,如果數(shù)據(jù)長(zhǎng)度為0,設(shè)置sendDataEnd為TRUE表示數(shù)據(jù)傳輸完成.
圖31
上面部分是根據(jù)圖30中準(zhǔn)備發(fā)送的數(shù)據(jù)包獲得是發(fā)出數(shù)據(jù)還是接收數(shù)據(jù)狀態(tài),調(diào)用不同的處理流程
圖32
?
⑶HandleEndpointEvent()
圖33
?
圖34
?
圖35
?
?
?
CreateBusAccessHandle(LPCTSTR lpActiveRegPath)
該函數(shù)用于創(chuàng)建一個(gè)可以訪問Bus設(shè)備驅(qū)動(dòng)的句柄,一個(gè)客戶端驅(qū)動(dòng)(Client Driver)會(huì)在它的XXX_Init函數(shù)中調(diào)用該函數(shù)來獲得Bus設(shè)備的句柄。lpActiveRegPath為Bus設(shè)備的注冊(cè)表路徑,返回值為句柄。pszActiveKey=Drivers/Active/51
?
?
?
?
Windows CE USB Function Driver驅(qū)動(dòng)簡(jiǎn)析(1)-
http://blog.csdn.net/shevsten/archive/2010/07/15/5736889.aspx
?
2410 UDC driver 分析1
http://www.cevx.com/Bbs/viewthread.php?tid=13370
?
usb驅(qū)動(dòng)
http://www.188928.com/sqd1/20110217/15727.htm
?
USB 軟件、端點(diǎn)和管道
http://blog.csdn.net/Augusdi/archive/2009/05/13/4170026.aspx
?
wince USB設(shè)備驅(qū)動(dòng)程序?qū)ёx
http://yzcyn.blog.163.com/blog/static/38484300200831834045507/
?
WinCE系統(tǒng)USB Mass Storage實(shí)現(xiàn)
http://www.docin.com/p-55309404.html
?
WinCE USB驅(qū)動(dòng)開發(fā)
http://blog.sina.com.cn/s/blog_4ad0a9940100g11a.html
?
WinCE系統(tǒng)USB功能定制
http://blog.csdn.net/nanjianhui/archive/2009/08/12/4438599.aspx
?
有關(guān)OHCI、UHCI、EHCI的知識(shí)
http://zhuairlunjj.blog.163.com/blog/static/8005094520107203058470/
?
?
?
總結(jié)
以上是生活随笔為你收集整理的WINCE6.0+S3C2443下的usb function(功能)驱动的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WinCE CEDDK之Bus操作函数
- 下一篇: 关键字static、const、vola