« | July 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | |
| 公告 |
☆★☆★☆★☆★☆★☆ 生活的点点记录,以及一些体会...........
喜欢是淡淡的爱,爱是深深的喜欢.
时间会见证一切.......................
欢迎大家指出错误,共同进步..........
期待中..............................
☆★☆★☆★☆★☆★☆ |
Blog信息 |
blog名称: 日志总数:162 评论数量:312 留言数量:0 访问次数:939735 建立时间:2005年5月17日 |

| |
[wince study]2410 UDC driver 分析1 文章收藏
oceanblue 发表于 2008/5/20 13:44:32 |
在 USB Function Controller 的MDD层 有函数 GetClientFunctions( PUFN_FUNCTIONS pUfnFunctions)调用者通过传入 PUFN_FUNCTIONS 类型的指针变量 来获得 USB Function Controller MDD层的所有操作函数.
USB Function Controller 的MDD层的函数 UFN_Init( LPCTSTR pszContext )中 会创建一个PUFN_MDD_CONTEXT pContext指针变量这个变量包括了MDD层的所有属性,这个变量还包括了一个指向 PDD层的指针变量UFN_PDD_INTERFACE_INFO PddInfo;PDD层的这个UFN_PDD_INTERFACE_INFO PddInfo里又包含了PDD层的一些属性和PDD层的所有操作函数指针,这样在UFN_Init()函数中创建了一个 new CUfnBus(pszContext, pContext)USB总线对象,同时将包含MDD层所有属性的pContext指针变量作为参数,传给CUfnBus类对象的构造函数,在它的构造函数中pContext指针对象被赋给了CUfnBus类对象的指针成员变量m_pContext(m_pContext=pContext),之后在UFN_Init()函数中又调用PDD层的UfnPdd_InitUfnPdd_Init()函数,并将pContext指针变量中的指向PDD层的指针变量PddInfo作为参数传给UfnPdd_InitUfnPdd_Init(),这样在UfnPdd_InitUfnPdd_Init() 函数中来实现对PddInfo指针变量的PDD层属性和操作函数指针的赋值。因为整个过程中都是通过指针来赋值,所以CUfnBus类对象的m_pContext指针变量就能访问MDD层的属性,PDD层的属性,PDD层的所有操作函数。
在USB Function Client驱动中的CUsbFn::Init() 函数里 调用UfnInitializeInterface()函数,并传入一些指定的指针变量参数,在UfnInitializeInterface()函数中又 调用BusIoControl(...,IOCTL_UFN_GET_CLIENT_DATA,...) USB总线操作函数,在BusIoControl()函数中的 CASE: IOCTL_UFN_GET_CLIENT_DATA 处理函数中 调用USB Function MDD层的全局函数GetClientFunctions(),将返回值赋给UfnInitializeInterface()传入的参数,同时也将CUfnBus类对象的m_pContext指针变量也赋给UfnInitializeInterface()传入的参数,这样在USB Function Client驱动程序中就可以操作的USB Function Controller驱动的MDD和PDD层所有功能。
UfnMdd_Notify -> SendDeviceNotification(pContext->lpDeviceNotify,pContext->pvDeviceNotifyParameter, dwMsg, dwParam);USB Function Controller 的PDD层的函数UfnPdd_Init()中执行pContext->pfnNotify = pMddInterfaceInfo->pfnNotify;这样PFN_UFN_MDD_NOTIFY pfnNotify指向UfnMdd_Notify函数指针(在UfnPdd_Init函数中执行pContext->pfnNotify = pMddInterfaceInfo->pfnNotify;);UfnMdd_Notify函数再调用SendDeviceNotification()函数,在SendDeviceNotification()函数中最终执行(通过指针参数传入)USB Function Controller 的MDD层的LPUFN_NOTIFY lpDeviceNotify 函数,而MDD层的lpDeviceNotify指针是在USB Function Client驱动的函数 CUsbFn::Init()中调用dwRet = m_pUfnFuncs->lpStart(m_hDevice, DeviceNotifyStub, this, &m_hDefaultPipe);来将USB Function Client驱动中定义的DeviceNotifyStub函数和USB Function Controller中的PDD层的pfnNotify来建立联系的
CUsbFn::DeviceNotify()->CableAttached()->OpenBulkIn()/OpenBulkOut() ->OpenPipe()->new CUsbFuncPipe ->CUsbFuncPipe::ThreadRun()->m_pSerialFn->EndpointNotification(this)->NotifyPDDInterrupt()->SerialEventHandler(m_pMdd);
CUsbFuncPipe::ThreadRun()线程通过下面两个事件rgh[0] = m_pTransferArray[m_dwCompleteIndex]->GetCompleteEventHandle(); //GetCompleteEventHandle() { return m_hCompleteEvent; };rgh[1] = m_TerminateEvent;来监测USB Function Controller端的USB中断事件,当截获中断事件后 再通过SerialEventHandler(m_pMdd)函数来处理中断事件。
CUsbFuncTransfer::CompleteNotificationStub()->CUsbFuncTransfer::CompleteNotification()->SetEvent(m_hCompleteEvent);USB Function Controller 的MDD层的函数lpIssueTransfer()//注释:在一个管道上建立一个传输(CUsbFuncTransfer::CompleteNotificationStub是其中一个参数)lpIssueTransfer()->CPipe::IssueTransfer()->lpIssueTransfer()->CUfnMddTransfer::Init()-> CUfnMddTransfer::m_lpNotifyRoutine = CUsbFuncTransfer::CompleteNotificationStub(); 函数指针赋值
在USB Function Controller 的PDD层的完成USB数据传输的中断处理程序中 ->CompleteTransfer()//sc2410pdd.cpp ->pContext->pfnNotify(...,UFN_MSG_TRANSFER_COMPLETE,...)->UfnMdd_Notify(...,dwMsg,...)//在dwMsg == UFN_MSG_TRANSFER_COMPLETE时 ->CPipe::TransferComplete()->CUfnMddTransfer::CallCompletionRoutine()->(*CUfnMddTransfer::m_lpNotifyRoutine)(m_pvNotifyContext);
纵上分析可知在在USB Function Controller 的PDD层的完成USB数据传输后会执行CUsbFuncTransfer::CompleteNotificationStub(),并设置事件m_hCompleteEvent为通知状态,这样来启动CUsbFuncPipe::ThreadRun()线程的执行,进而执行m_pSerialFn->EndpointNotification(this),最终调用SerialEventHandler(m_pMdd);来根据具体的中断在USB Function Client驱动中完成相应的中断处理。如将数据从USB的硬件BUFFER中拷贝到USB Function Client驱动所开辟的软件BUFFER中,这样以后应用程序就直接从USB Function Client驱动的软件BUFFER中拷贝数据。在这当中函数USBSerialFn::EndpointNotification()将USB的中断类型转换为 Serial所能认识的interruptType |= INTR_TX / interruptType |= INTR_RX类型
USB Host获取描述符:HandleEndpoint0Event()->pContext->pfnNotify(pContext->pvMddContext, UFN_MSG_SETUP_PACKET, (DWORD) &udr);->UfnMdd_Notify()->(response = ProcessRequest(pContext, *pUdr, dwMsg))//在CASE: UFN_MSG_PREPROCESSED_SETUP_PACKET中调用 ->ProcessGetDescriptor()/ProcessGetConfiguration()/ProcessGetInterface()/ProcessSetAddress()/ProcessSetConfiguration()/ProcessSetInterface()等函数结构体udr中存放的是具体的从USB Host主机接受的USB标准命令,在ProcessRequest()函数中将根据具体的udr来进行发送或设置描述符数值 |
|
|