关于USB接口键盘例程的几个问题

hcn: 请问,在USB接口键盘例程中的这么几个函数是否是必须的? set_report(); set_idle(); get_descriptor_x(); 至少我看不出它们有什么用。

这是根据计算机操作键盘的步骤来的,如果不这样操作的话,那么键盘的枚举就有可能不成功


hcn: 这几个函数我先屏蔽掉试试,不行的话再添上。 我通过相关软件抓取的配置描述符(USB键盘)有这样两种: 09 02 3b 00 02 01 00 a0 18 09 02 22 00 01 01 00 a0 18 都是9个字节,wTotalLength一个是59(0x3b),一个是34(0x22),但我不知道应该是哪一种;

我用 request.r.bmRequestType=0x80; request.r.bRequest=0x06; request.r.wValue=0x0002; request.r.wIndx=0x0000; request.r.wLength=0x0900; get_device_derc();//配置描述符 得到的配置描述符为 09 02 3b 00 02 01 00 a0 18 而用 request.r.bmRequestType=0x80; request.r.bRequest=0x06; request.r.wValue=0x0002; request.r.wIndx=0x0000; request.r.wLength=0x0000|((unsigned int)buffer[2]<<8); get_device_derc();//配置描述符 得到的为59个字节的描述符: 09 02 3b 00 02 01 00 a0 18 09 04 00 00 01 03 01 01 00 09 21 10 01 00 01 22 41 00 07 05 81 03 08 ...

请问这是对的吗?


你用BUS HOUND软件抓下你的低速设备的描述符,接着在用你的程序来读取你的设备的描述符,比较下就可以了


hcn:

unsigned char status; void intt0() { unsigned char len_temp,i; unsigned char *BUF=buffer_r; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */ status=CH375_RD_DAT_PORT();//printf("%02x ",(unsigned int)status);printf("\n"); if(status!=USB_INT_SUCCESS)//&&((status&0xf0)==0x20)) {CH375_WR_CMD_PORT( CMD_CLR_STALL );//printf("13\n"); CH375_WR_DAT_PORT(1); /* 如果设备端不是CH37X芯片,那么需要修改端点号 */ toggle_recv(1); issue_token_s(( endp_int << 4 ) | DEF_USB_PID_IN);//发送从中断端点读数据的令牌 } else { len_temp=rd_usb_data(buffer_r); //键盘中断端点数据长度一般为8字节,鼠标为4字节 //for(i=0;i!=8;i++)printf("%02x ",(unsigned int)buffer_r[i]); // printf("\n"); // flag_output=0; tank=((~tank)&0x01); toggle_recv(tank); issue_token_s(( endp_int << 4 ) | DEF_USB_PID_IN);//发送从中断端点读数据的令牌 } }

这段接收数据子函数好象有点问题,不对键盘做任何操作,都可以执行到else后面的大括号里头。不知道为什么?


hcn: 我在检验USB键盘那段例程,前面的步骤都没什么问题,就是最后用intt0();子函数接收不到数据。


hcn: 不管按什么键,我现在从键盘端接收的8个字节全是0,不知为什么?

unsigned char status; void intt0() { unsigned char len_temp,i; unsigned char *BUF=buffer; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 产生操作完成中断, 获取中断状态 */ status=CH375_RD_DAT_PORT(); if(status!=USB_INT_SUCCESS) {CH375_WR_CMD_PORT( CMD_CLR_STALL ); CH375_WR_DAT_PORT(1); /* 如果设备端不是CH37X芯片,那么需要修改端点号 */ toggle_recv(1); issue_token_s(( endp_int << 4 ) | DEF_USB_PID_IN);//发送从中断端点读数据的令牌 } else { len_temp=rd_usb_data(buffer); //键盘中断端点数据长度一般为8字节,鼠标为4字节 tank=((~tank)&0x01); toggle_recv(tank); issue_token_s(( endp_int << 4 ) | DEF_USB_PID_IN);//发送从中断端点读数据的令牌 } }


你用这个程序试下看可以不可以UploadImages/hcn00120067211677.rar


hcn: 不知收到邮件了没有?盼回复。谢!


只有登录才能回复,可以选择微信账号登录