12.29.2006

USBFN - MDD -PDD

Driver 要export的funciton 有
  • Init
  • -PreDeInit
  • DeInit
  • Open
  • -PreClose
  • Close
  • PowerUp
  • PowerDown
  • IOControl
但是Driver分成MDD, PDD兩部份,MDD是MS寫好的,PDD要vendor自己寫。
MDD和PDD最後會Link啟程成為Dll。
最後Dll name和export function 在PDD的build file中定義 *.def。
因為MDD在上層,是MS為了統一driver interface所寫的,所以export funciton 也通常會是implement在MDD中。

MDD, PDD 雖然是Link在一起,但是溝通並不是直接使用funcion name,
而是透過function table (array)。

在MDD呼叫PDD的Init function時,MDD, PDD 互傳需要的function array。

( 既然PDD_Init都直接call了,為甚麼其他的就要透過function array ?
又不兩個DLL,動態load,沒辦法直接call..)



UfnPdd_Init(
LPCTSTR pszActiveKey,
PVOID pvMddContext,
PUFN_MDD_INTERFACE_INFO pMddInterfaceInfo,
PUFN_PDD_INTERFACE_INFO pPddInterfaceInfo
)
pszActiveKey : 好像是registry Key
pvMddContext : 指向使用Mdd Class ?
pMddInterfaceInfo : 只是一個version string 和一個function pointer - PUFN_MDD_INTERFACE_INFO. Callback funciton.
pPddInterfaceInfo : Init Function 就是要把這個function table 都填好,給Mdd使用。


Ufn_Init 從registry 中取出chip access memory base address, range, isrname, 做好access chip 的準備。
create需要的event, critical section, thread. BusAccessHandle
安裝isr : KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR...)

USB 的Pdd 好像只需要MDD的一個function : Notify。
PDD則要準備好 PUFN_PDD_INTERFACE_INFO 內的20個function,供MDD使用:

MDD呼叫的順序是
  • DllEntry
  • Init
  • IOControl
  • IsConfigurationSupportable
  • IsEndpointSupportable x 3
  • RegisterDevice
  • InitEndpoint
  • IOControl
  • Start
之後就是usb data傳輸動作,在插入PC後才會有.
enumeration process:
  • IssueTransfer
  • SendControlStatusHandshake
  • SetAddress
  • SendControlStatusHandshake
  • IssueTransfer
  • SendControlStatusHandshake
反覆以上"IssueTransfer" - "SendControlStatusHandshake" N次
之後
  • InitialEndpoint
  • ClearEndpointStall
以上重複兩次,
  • IssueTransfer
  • SendControlStatusHandshake
重複兩次,之後,就都是 IssueTransfer..

沒有留言: