阅读:1148回复:8
d12调试:关于setup包
耽误了很久还没有完成枚举,对程序流程不太清楚,求助斑竹和大虾们。以下是我的理解:
比如主机发送了get descriptor,程序先进入中断,执行ep2_rxdone()接收数据,完了就跳出中断,然后执行主程序里的control_handler(),执行标准请求处理中的get_descriptor(). 是这样的吗,望知道的人回答!!不胜感激!!! |
|
沙发#
发布于:2004-08-04 08:33
主机发送了get descriptor,D12进入中断,你的CPU读取中断寄存器,判断中断来源,然后判断终点状态,看是否在缓冲区内有成功的数据,然后读取缓冲区,然后确认缓冲区,再开始分析数据是什么命令。
|
|
板凳#
发布于:2004-08-04 09:52
看来你对流程确实不太了解,具体流程如下:
主机发送Setup包,你在ep0 setup中断里收到Setup包,分析命令原因,例如如果是Get_Descriptor,那么在Request_Handler()里就发送Descr描述符给主机,主机收到后会有Ep0rx中断给你。 因此在收到Setup包之后就要接着处理命令,然后等待下一个命令。 |
|
地板#
发布于:2004-08-04 09:55
首先感谢回答,我的分不多,给您的也不多。我还有几个问题。
还以get descriptor为例, 判断中断来源是端点0out中断。执行ep2_rxdone(),您所提到的这几条:1) 看是否在缓冲区内有成功的数据;2)然后读取缓冲区;3)然后确认缓冲区;4)再开始分析数据是什么命令。 我并没在程序中看到呀。程序如下: void ep0_rxdone(void) { unsigned char ep_last, i; ep_last = D12_ReadLastTransactionStatus(0); if (ep_last & D12_SETUPPACKET) { ControlData.wLength = 0; ControlData.wCount = 0; if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest), (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) { D12_SetEndpointStatus(0, 1); D12_SetEndpointStatus(1, 1); bEPPflags.bits.control_state = USB_IDLE; return; } 。 。 。 程序的一开始就在分析受到的是否setup包了,至于以上提到的1), 2), 3),是用那些程序实现的?什么时候实现的? 谢谢! |
|
地下室#
发布于:2004-08-04 10:35
谢谢任,:)
其实在ep0_rxdone() ,做的就是把端点的数据保存下来和把bEPPflags.bits.setup_packet 置1,进入Request_Handler()发送Descr描述符给主机,对吗? |
|
5楼#
发布于:2004-08-05 10:56
我用的是汇编语言,所以要分几步,你用的C语言就要简单,但不直观,我对C语言不熟悉。C语言垃圾代码太多,会牺牲大量的硬件资源,如果不考虑移植,最好用汇编。
|
|
6楼#
发布于:2004-08-05 16:26
谢谢任,:) 应该是在SetupToken_Handler接收Setup包,如果Setup包有效则执行DeviceRequest_Handler发送数据给主机,ep0rxdone是在主机收到数据后才会给你的!在此之前数据已经发送完了。 |
|
7楼#
发布于:2004-08-08 15:04
谢谢,:)有些明白了,请把SetupToken_Handler这些例程给我好
吗,wylhh555@yahoo.com.cn,再次谢谢 |
|
8楼#
发布于:2004-08-12 15:17
to zengyon:
你用的是d12吗,能把你的固件程序发给我参考以下吗,我现在也在调汇编的程序,固件调试总是不成功,过程不是差不多一样的吗,为什么不行呢。真是急死了。邮箱如上。 |
|