本站首页    管理页面    写新日志    退出


«July 2025»
12345
6789101112
13141516171819
20212223242526
2728293031


公告

☆★☆★☆★☆★☆★☆
生活的点点记录,以及一些体会...........

喜欢是淡淡的爱,爱是深深的喜欢.

时间会见证一切.......................

欢迎大家指出错误,共同进步..........

期待中..............................

☆★☆★☆★☆★☆★☆


我的分类(专题)

日志更新

最新评论

留言板

链接

世纪音频

 

 


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来进行发送或设置描述符数值


阅读全文(3965) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144763747 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号