lhaih
驱动小牛
驱动小牛
  • 注册日期2004-04-28
  • 最后登录2007-10-19
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
阅读:1149回复:8

d12调试:关于setup包

楼主#
更多 发布于:2004-08-03 15:56
耽误了很久还没有完成枚举,对程序流程不太清楚,求助斑竹和大虾们。以下是我的理解:
比如主机发送了get descriptor,程序先进入中断,执行ep2_rxdone()接收数据,完了就跳出中断,然后执行主程序里的control_handler(),执行标准请求处理中的get_descriptor().

是这样的吗,望知道的人回答!!不胜感激!!!
lhaih
驱动小牛
驱动小牛
  • 注册日期2004-04-28
  • 最后登录2007-10-19
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-12 15:17
to  zengyon:
  你用的是d12吗,能把你的固件程序发给我参考以下吗,我现在也在调汇编的程序,固件调试总是不成功,过程不是差不多一样的吗,为什么不行呢。真是急死了。邮箱如上。
lhaih
驱动小牛
驱动小牛
  • 注册日期2004-04-28
  • 最后登录2007-10-19
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-08 15:04
谢谢,:)有些明白了,请把SetupToken_Handler这些例程给我好
吗,wylhh555@yahoo.com.cn,再次谢谢


jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-08-05 16:26
谢谢任,:)
 其实在ep0_rxdone() ,做的就是把端点的数据保存下来和把bEPPflags.bits.setup_packet 置1,进入Request_Handler()发送Descr描述符给主机,对吗?  


应该是在SetupToken_Handler接收Setup包,如果Setup包有效则执行DeviceRequest_Handler发送数据给主机,ep0rxdone是在主机收到数据后才会给你的!在此之前数据已经发送完了。
zengyon
驱动牛犊
驱动牛犊
  • 注册日期2001-04-27
  • 最后登录2009-09-08
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望91点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-08-05 10:56
我用的是汇编语言,所以要分几步,你用的C语言就要简单,但不直观,我对C语言不熟悉。C语言垃圾代码太多,会牺牲大量的硬件资源,如果不考虑移植,最好用汇编。
lhaih
驱动小牛
驱动小牛
  • 注册日期2004-04-28
  • 最后登录2007-10-19
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-08-04 10:35
谢谢任,:)
 其实在ep0_rxdone() ,做的就是把端点的数据保存下来和把bEPPflags.bits.setup_packet 置1,进入Request_Handler()发送Descr描述符给主机,对吗?  
lhaih
驱动小牛
驱动小牛
  • 注册日期2004-04-28
  • 最后登录2007-10-19
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
6楼#
发布于: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),是用那些程序实现的?什么时候实现的?

谢谢!

jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-08-04 09:52
看来你对流程确实不太了解,具体流程如下:
主机发送Setup包,你在ep0 setup中断里收到Setup包,分析命令原因,例如如果是Get_Descriptor,那么在Request_Handler()里就发送Descr描述符给主机,主机收到后会有Ep0rx中断给你。

因此在收到Setup包之后就要接着处理命令,然后等待下一个命令。
zengyon
驱动牛犊
驱动牛犊
  • 注册日期2001-04-27
  • 最后登录2009-09-08
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望91点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-08-04 08:33
主机发送了get descriptor,D12进入中断,你的CPU读取中断寄存器,判断中断来源,然后判断终点状态,看是否在缓冲区内有成功的数据,然后读取缓冲区,然后确认缓冲区,再开始分析数据是什么命令。
游客

返回顶部