网站导航:首页 > 论坛 > USB > 帖子浏览
   您正在浏览第 663 号帖子 收藏该帖

楼主 作者:passionyg  发表时间:2010-6-5 16:55:59

关于USB键盘的问题 向高手请教

我是用ISP1362做一个模拟键盘

现在发现有如下些问题和疑问:

1.枚举的前面过程都是正确的,通过device monitor的数据包分析确定前面传送的数据包是正确的,但是当程序到了最后一步,即传送report描述符后程序却进入了bus reset处理,之后就是不停的循环前面过程,一直停不下来。

2.我想知道一个正常的程序如果是传送report描述符以后应当进入什么状态,难道是idle?

请多多指教

回复楼主
第1楼 作者:强强  发表时间:2010-6-6 9:15:44

可能是报告描述符有问题,请仔细检查一下


回复楼主    回复第1楼
第2楼 作者:passionyg  发表时间:2010-6-22 20:45:14

报告描述符我就用的是这个网站上那个例子上的,不会有错吧 很纠结啊


回复楼主    回复第2楼
第3楼 作者:强强  发表时间:2010-6-23 20:31:58

那可能是固件驱动有问题

下位机固件应该对主机的GerReport命令作出正确响应,例如本站USB开源项目的实例代码如下(当然您的接口芯片不同,需要根据实际情况完善)
  1. void get_descriptor(void)       
  2. {       
  3.     INT8U bDescriptor = MSB(ControlData.DeviceRequest.wValue);          //读取请求的描述符类型       
  4.             //wValue的高字节表示描述符的类型,低字节表示描述符的索引值       
  5.            
  6.       
  7.     if (bDescriptor == USB_DEVICE_DESCRIPTOR_TYPE) //获取设备描述符       
  8.     {              
  9.         code_transmit((INT8U *)&DeviceDescr, sizeof(USB_DEVICE_DESCRIPTOR));       
  10.     }       
  11.     else if (bDescriptor == USB_CONFIGURATION_DESCRIPTOR_TYPE) //获取配置描述符       
  12.     {              
  13.         if (ControlData.DeviceRequest.wLength > CONFIG_DESCRIPTOR_LENGTH)       
  14.         {        
  15.             ControlData.DeviceRequest.wLength = CONFIG_DESCRIPTOR_LENGTH;       
  16.         }       
  17.         code_transmit((INT8U *)&(usb_descr.ConfigDescr), ControlData.DeviceRequest.wLength);       
  18.                                                                            
  19.       
  20.     //发送描述符内容       
  21.     }       
  22.     //---------------(added by BH.)------------------------------       
  23.       
  24.     else if(bDescriptor == USB_REPORT_DESCRIPTOR_TYPE)  //获取报告描述符       
  25.     {       
  26.                
  27. //      ControlData.wCount=SWAP16(sizeof(KeyBoardReportDescriptor));       
  28.         ControlData.pData=(INT8U *)(MouseReportDescriptor);       
  29. //      if(ControlData.wLength<ControlData.wCount)       
  30. //          ControlData.wCount = ControlData.wLength;       
  31.                    
  32. //      code_transmit((INT8U *)(KeyBoardReportDescriptor),ControlData.wCount);       
  33.         code_transmit((INT8U *)(MouseReportDescriptor),sizeof(MouseReportDescriptor));       
  34.     }       
  35.            
  36.     else      
  37.     {       
  38.                
  39.         stall_ep0();                    //没有该请求,返回STALL       
  40.       
  41.     }       
  42.     //---------------------------------------------                    
  43. }      


回复楼主    回复第3楼
第4楼 作者:passionyg  发表时间:2010-7-1 16:24:58

枚举

我又看了看我的枚举过程,确定前面需要传送的描述符host均已收到,当传完report描述符后,hos要求获取8 bytes from device.但是device发送给host的是0 byte.所以后面就错了,于是我就尝试在发送report描述符后,强行对数据端点1写入8个字节的键码,但最后抓包的结果显示那一步返回的数据仍然是0字节。不得其解

ps:请问你方便留一个联系方式给我吗?邮箱,QQ号都可以。主要是我这个项目真的很急,谢谢了。我的邮箱:passionyg@163.com

回复楼主    回复第4楼
第5楼 作者:强强  发表时间:2010-7-2 9:34:57

可能是以下情况

端点1正确配置了吗?是否是中断传输,最大包大小是否正确.

协议方面:设备正忙而不能接收数据或暂没有数据传输给我主机时应返回nak握手包,设备收到不支持的命令时返回stall握手包.我也有因没有正确回应nak包而不能在后续操作中不能向主机发送数据的情况

回复楼主    回复第5楼
第6楼 作者:passionyg  发表时间:2010-7-1 21:25:28

re

你好,方便留个你的联系方式吗?

回复楼主    回复第6楼
第7楼 作者:强强  发表时间:2010-7-2 9:49:50

请直接在论坛上留言吧,QQ目前主要用于售后技术支持,请谅解。【图片】

如何不想您的问题被其它人看到,可以发站内短消息:



回复楼主    回复第7楼
第8楼 作者:xlanzi  发表时间:2010-6-13 9:45:30

USB键盘

不断的发送IN包,如果有数据则发送。没有则发送NAK

回复楼主    回复第8楼

 
 
本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4