请教各位大侠: 我用CH375读取USB键盘,按USB键盘的一般按键都可以读到其按键信息,但是按键盘上的特殊功能键(如‘MUTE’键),CH375就读不到该键的信息。是程式问题呢还是本身CH375就读不出这一类按键的信息的呢?请帮忙回复!非常感谢!!
SUGENG328@YAHOO.COM.CN
请教各位大侠: 我用CH375读取USB键盘,按USB键盘的一般按键都可以读到其按键信息,但是按键盘上的特殊功能键(如‘MUTE’键),CH375就读不到该键的信息。是程式问题呢还是本身CH375就读不出这一类按键的信息的呢?请帮忙回复!非常感谢!!
SUGENG328@YAHOO.COM.CN
把你的USB 键盘的配置描述符贴出来看看.
程序问题,CH375只是一个USB通道而已,功能都是软件来实现的.你的设备可能是一个复合设备,需要修改函数才可以的. 分析配置描述符,看接口号是不是两个. 用BUSHOUND抓取数据,看特殊功能键是用第几个端点来传输的,然后对相应的端点发起IN就可以了.
插入键盘后读到的是以下信息: Wait KB connect Usb 12 01 10 01 00 00 00 08 38 0b 03 00 00 01 00 01 00 01 09 02 3b 00 02 01 00 a0 32 config 2 09 02 3b 00 02 01 00 a0 32 09 04 00 00 01 03 01 01 00 09 21 10 01 00 01 22 41 00 07 05 81 03 08 00 0a 09 04 01 00 01 03 01 02 00 09 21 10 01 00 01 22 98 00 07 05 82 03 04 00 0a set idle report 05 01 09 06 a1 01 05 07 19 e0 29 e7 15 00 25 01 75 01 95 08 81 02 95 01 75 08 81 01 95 03 75 01 05 08 19 01 29 03 91 02 95 05 75 01 91 01 95 06 75 08 15 00 26 00 05 05 07 19 00 2a 00 81 00 00 c0 set report
用BUSHOUND也获取不到‘MUTE’这个静音键的信息,不过我在不断按下这个键的时候电脑的任务栏的音量一直在开/关音量之间切换
红桃六大哥所说的“看特殊功能键是用第几个端点来传输的,然后对相应的端点发起IN就可以了”,在程式是怎样修改呢?我程式如下: ////123 /**************************************** ***************************************** ** Copyright (C) W.ch 1999-2004 ** ** Web: http://www.winchiphead.com ** *** * * * * * * * * * * * * * * * * * *** ** USB 1.1 Host Examples for CH375 ** ** KC7.0@MCS-51 ** ***************************************** ****************************************/
/* 用CH375操作HID设备,比如键盘,鼠标*/ //#include "intrins.h"
#include "reg52.h" #include "stdio.h" #include "CH375INC.H" #include "lcd.h" #include "CH375.H" #include "TABLE.H"
/************************ 十六进制字符 ***********************/ BYTE code aHex[] = "A"; BYTE code bHex[] = "B"; BYTE code cHex[] = "C"; BYTE code dHex[] = "D"; BYTE code eHex[] = "E"; BYTE code fHex[] = "F";
void DsplABCDEF(BYTE DataToABC); int HighBit,LowBit;
/**************************** Checkkey ****************************/ /******************************************************************/ #define BYTE unsigned char bit Checkkey(int StartAdd,BYTE *Table) { int i, flag=1;
for(i=0;i<6;i++) { if(data_buf[i]!=*(Table+StartAdd+i)) flag=0; // if(i==1) // { // CPU2_INT0=0; // delay2us(); // delay2us(); // delay2us(); // delay2us(); // delay2us(); // delay2us(); // delay2us(); // delay2us(); printf("%02x ",(unsigned int)data_buf[i]);//在"%02x"这里之前是" %02x ",表示每位数值空格隔开 // printf("%c ",(unsigned int)data_buf[i]);//在"%02x"这里之前是" %02x ",表示每位数值空格隔开 // CPU2_INT0=1; // } } //printf(" OK\n"); // printf("K\n"); flag_output=0;
return successflag; } /****************************************************************/
void main() { unsigned char i,c; mInitSTDIO( ); delaymsm(100); delaymsm(250); // delaymsm(250); // delaymsm(250); // delaymsm(250); printf("Wait KB connect Usb\n"); set_usb_mode( 6 ); // 设置USB主机模式, 如果设备端是CH37X, 那么5和6均可
while(1) { while ( wait_interrupt()!=USB_INT_CONNECT ); // 等待设备端连接上来 //USB_INT_CONNECT=0X15,为USB连接事件 delaymsm(5); reset_device(); delaymsm(5); CH375_WR_CMD_PORT(0x15); CH375_WR_DAT_PORT(0x07); //复位总线 delaymsm(20); CH375_WR_CMD_PORT(0x15); CH375_WR_DAT_PORT(0x06); //复位完成i set_freq(); //降主频 /***********************************************************/
Request.Req.bmRequestType=0x80; Request.Req.bRequest =0x06; Request.Req.wValue =0x0001; Request.Req.wIndex =0x0000; Request.Req.wLength =0x1200; if(get_descr_ex()==1) { for(i=0;i!=data_buf[0];i++) printf("%02x ",(unsigned int)data_buf[i]); printf("\n"); } else printf("get device descr failed\n");
set_addr(5); //设置地址
printf("config\n"); Request.Req.bmRequestType=0x80; Request.Req.bRequest =0x06; Request.Req.wValue =0x0002; Request.Req.wIndex =0x0000; Request.Req.wLength =0x0900;
if(get_descr_ex()==1) { for(i=0;i!=data_buf[0];i++) printf("%02x ",(unsigned int)data_buf[i]); printf("\n"); if(data_buf[4]!=0x01)flag_interface_2=1;//有多个接口 } else printf("get config descr failed\n");
printf("config 2\n"); if(data_buf[2]>0x09) { flag_config_2=1; Request.Req.bmRequestType=0x80; Request.Req.bRequest =0x06; Request.Req.wValue =0x0002; Request.Req.wIndex =0x0000; Request.Req.wLength =0x0000|((unsigned int)data_buf[2]<<8);
if(get_descr_ex()==1) { for(i=0;i!=data_buf[2];i++) printf("%02x ",(unsigned int)data_buf[i]); printf("\n"); flag_config_2=0; } else printf("get device descr again failed\n"); }
parse_config_descr(); //保存描述符中一些值
set_config(config_value);//设置配置
printf("set idle\n");
if(set_idle()!=1) printf("set idle failed\n");
printf("report\n");
Request.Req.bmRequestType=0x81; Request.Req.bRequest=0x06; Request.Req.wValue =0x0022; Request.Req.wIndex =0x0000; Request.Req.wLength =0x0000|((unsigned int)(report_descr_len+0x40)<<8); if(get_report_descr_ex()==1) { for(i=0;i!=report_cou;i++) printf("%02x ",(unsigned int)data_buf[i]); printf("\n");
} else printf("get report descr failed\n");
printf("set report\n"); //对于键盘这一步,是点亮指示灯 EA=1;
get_int_in(); //发送从中断端点读数据的令牌 printf("YYY");
do{ if (flag_output==1) { for(i=0;i!=4;i++) data_in[i]=data_buf[i]; Checkkey(start*8,CodeTable); }
}while(1); } while ( wait_interrupt()!=USB_INT_DISCONNECT ); }
你这个设备是个复合的设备.两个接口.你只所以没有检测到数据,可能是因为BUSHOUND里面没有选择这个设备.理论上来说肯定有这个设备的. 另外你按照BUSHOUND看一下PC怎么枚举的,先把前面的枚举过程做完.最起码获取HID报表描述要获取两个接口的. 然后在对不同端点发起IN
不过我在BUSHOUND里读其它的键都有信息的,只是这个键没有读得出来,您说在BUSHOUND里面没有选择这个设备,是要选择两个的吗
是的,你看一下设备管理器里面是不是当你插上这个设备的时候,会出现两个设备.选择两个才可以的.
红桃六大哥您说这个是复合设备,那要怎样修改CH375的函数才可以读得到这个键呢
我选上了,现在BUSHOUND里也可以读得出来这个信息了,BUSHOUND里显示的是: 26 DI 01 e2 00 ... 28.1.0 26 DI 01 00 00 ... 28.1.0
发邮件到lht@wch.cn索取操作复合设备的参考程序.
上面BUSHOUND里读出的数据,您能知道它是哪个端口发出的吗?
我已发邮件到lht@wch.cn了,麻烦您发一份操作复合设备的参考程序给我,谢谢
邮件已经给您回复,请注意查收!
哦,有看到邮件了,非常感谢!我先看一下了,有问题再请教.多谢了!