阅读:1427回复:8
我的程序停了,不知道为什么(有原码)
0 in: 80 6 0 1 0 0 40 0
1 out: 12 1 10 1 0 0 0 10 76 c 5 0 0 1 0 0 0 in: 0 5 1 0 0 0 0 0 1 out: 1 out: 0 in: 80 6 0 1 0 0 12 0 1 out: 12 1 10 1 0 0 0 10 76 c 5 0 0 1 0 0 1 out: 0 1 0 in: 80 6 0 2 0 0 9 0 1 out: 9 2 20 0 1 1 0 a0 32 0 in: 80 6 0 1 0 0 12 0 1 out: 12 1 10 1 0 0 0 10 76 c 5 0 0 1 0 0 1 out: 0 1 0 in: 80 6 0 2 0 0 9 0 1 out: 9 2 20 0 1 1 0 a0 32 0 in: 80 6 0 2 0 0 20 0 1 out: 9 2 20 0 1 1 0 a0 32 9 4 0 0 2 3 1 1 out: 2 0 7 5 81 2 10 0 a 7 5 1 2 10 0 a 不知道为什么排举到上面就停了,请大虾指点一下 下面是原码: #include \"stdio.h\" #include \"dos.h\" #include \"conio.h\" char databuf[51210]; typedef struct { unsigned char DeviceRequest[8]; unsigned char out; unsigned char in; unsigned long wLength; unsigned long wCount; unsigned char *pData; } CONTROL_XFER; typedef union _RBCCommandBuf { struct _read{ unsigned char OperationCode; unsigned char Reserved; unsigned long BlockAddress; unsigned char Reserved1; unsigned int TransferLength; unsigned char Control; }ReadCommand; struct _write{ unsigned char OperationCode; unsigned char Reserved1; unsigned long BlockAddress; unsigned char Reserved2; unsigned int TransferLength; unsigned char Control; }WriteCommand; struct _readcapacity{ unsigned char OperationCode; unsigned char Received[8]; unsigned char control; }ReadCapacity; unsigned char DataBuf[16]; }RBC_COMMANDBUF; CONTROL_XFER ControlData; RBC_COMMANDBUF RbcCommandBuf; #define USB_DEVICE_CLASS_RESERVED 0x00 #define USB_DEVICE_CLASS_AUDIO 0x01 #define USB_DEVICE_CLASS_COMMUNICATIONS 0x02 #define USB_DEVICE_CLASS_HUMAN_INTERFACE 0x03 #define USB_DEVICE_CLASS_MONITOR 0x04 #define USB_DEVICE_CLASS_PHYSICAL_INTERFACE 0x05 #define USB_DEVICE_CLASS_POWER 0x06 #define USB_DEVICE_CLASS_PRINTER 0x07 #define USB_DEVICE_CLASS_STORAGE 0x08 #define USB_DEVICE_CLASS_HUB 0x09 #define USB_DEVICE_CLASS_VENDOR_SPECIFIC 0xFF char DeviceDescr[] = { 0x12, 0x01, 0x10, 0x01, 0x00,/*0x01*/ 0x00, 0x00, 0x10, 0x76, 0x0C, 0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01 }; char ConfigDescr[] = { 0x09, 0x02, 0x20,0x00 , 0x01, 0x01, 0x00, 0xa0, 0x32 }; char InterfaceDescr[]={ 0x09, 0x04, 0x00, 0x00, 0x02, 0x03, 0x01, 0x02, 0x00 }; char Endpoint_Descr_i[]={ 0x07, 0x05, 0x81, 0x02, 0x10,0x00, 0x0A }; char Endpoint_Descr_o[]={ 0x07, 0x05, 0x01, 0x02, 0x10,0x00, 0x0A }; char USBStringLanguageDescription[] = { /*sizeof(USBStringLanguageDescription),*/ 0x04, 0x03, 0x09, 0x04 }; char USBStringDescription1[] = { /*sizeof(USBStringDescription1),*/ 0x0F, 0x03, \'C\',0,\'y\',0,\'p\',0,\'r\',0,\'e\',0,\'s\',0,\'s\',0,\' \' }; char USBStringDescription2[] = { /*sizeof(USBStringDescription2),*/ 0x0F, 0x03, \'C\',0,\'y\',0,\'p\',0,\'r\',0,\'e\',0,\'s\',0,\'s\',0,\' \' }; /*#define D12CS P17 #define D12A0 P34 #define D12SUSPD P16 #define D12INT P33 ////////// #define D12_COMMAND XBYTE[0x00003] #define D12_DATA XBYTE[0x00002] //////////// /////////// #define DISABLE EA=0 #define ENABLE EA=1 */ void init_com(void); void SETUP_read(void); void HandleSetup(void); void D12_SetMode(unsigned char bConfig, unsigned char bClkDiv); void reconnect_USB(void); void received_out(char num); void received_in(char num); void USB_submit(void); void ep1rxdone(); void RBCRead(); void RBCReadCapacity(); void RBCWrite(); void reserved(void); void get_status(void); void set_address(void); /*void get_configuration(void);*/ void set_configuration(void); void get_descriptor(void); void (*StandardDeviceRequest[])(void) = { get_status, reserved,/*clear_feature,*/ reserved, reserved,/*set_feature,*/ reserved, set_address, get_descriptor, reserved, reserved,/*get_configuration,*/ set_configuration, reserved,/*get_interface,*/ reserved,/*set_interface,*/ reserved, reserved, reserved, reserved }; /* code void (*VendorDeviceRequest[])(void) = { reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved, reserved,//read_write_register, reserved, reserved, reserved }; */ #define com 0x3f8 void sendchar(unsigned char data){ outp(com,data); } char receivechar(unsigned char *data,unsigned char isstop){ unsigned int i=0; while(!(inp(com+5)&0x01) && (i<100000 || !isstop))i++; if(inp(com+5)&0x01){ *data=inp(com); return 1; } else { *data=\'f\'; return 0; } } void sendpacket(unsigned char data1,unsigned char data2){ char temp; do{ sendchar(0x00); receivechar(&temp,1); }while(temp!=\'r\'); sendchar(data1); receivechar(&temp,0); sendchar(data2); } void sendcommand(unsigned char data){ unsigned char temp; sendpacket(0x01,data); receivechar(&temp,0); /* printf(\"in: %2x %2x :command\\n\",0x01,data);*/ } void senddata(unsigned char data){ unsigned char temp; sendpacket(0x02,data); receivechar(&temp,0); /* printf(\"out:%2x %2x :write data\\n\",0x02,data);*/ } unsigned char readdata(){ unsigned char temp; sendpacket(0x03,0x00); receivechar(&temp,0); /* printf(\"out:%2x %2x :read data\\n\",0x03,0x00);*/ /* printf(\"in: %2x :\\n\",temp);*/ return temp; } unsigned char GetIsInt(){ char temp; sendpacket(0x00,0x00); receivechar(&temp,0); return temp; } void setIsInt(unsigned char dat) { char temp; if(dat)sendpacket(0x10,0x00); else sendpacket(0x20,00); receivechar(&temp,0); } void setD12CS(unsigned char dat) { char temp; if(dat)sendpacket(0x05,0x00); else sendpacket(0x04,0x00); receivechar(&temp,0); } void setD12A0(unsigned char dat) { char temp; if(dat)sendpacket(0x07,0x00); else sendpacket(0x06,0x00); receivechar(&temp,0); } void setD12SUSPD(unsigned char dat) { char temp; if(dat)sendpacket(0x09,0x00); else sendpacket(0x08,0x00); receivechar(&temp,0); } main() { char temp; ControlData.out = 0x00; ControlData.in = 0x01; clrscr(); init_com(); getch(); reconnect_USB(); while(1){ temp=GetIsInt(); if(temp) { sendcommand(0xf4); ControlData.DeviceRequest[0] = readdata(); if(ControlData.DeviceRequest[0] & 0x80) { setD12SUSPD(0); sendcommand(0xf6); setD12SUSPD(1); } else { if(ControlData.DeviceRequest[0] & 0x15) received_out(ControlData.DeviceRequest[0]); else if(ControlData.DeviceRequest[0] & 0x2a) received_in(ControlData.DeviceRequest[0]); } } } } void received_out(char num) { if(num & 0x01) { sendcommand(0x40); if(readdata() & 0x20) { SETUP_read(); HandleSetup(); } } else if(num & 0x04) { printf(\"\\n***************** 01 *****************\\n\"); ep1rxdone(); switch(RbcCommandBuf.DataBuf[0]){ case 0x28:RBCRead();break; case 0x25:RBCReadCapacity();break; case 0x2a:RBCWrite();break; } } else if(num & 0x10) {printf(\"asdf\");sendcommand(0x44);} } void received_in(char num) { if(num & 0x02)ControlData.in = 1; else if(num & 0x08)ControlData.in = 3; else if(num & 0x20)ControlData.in = 5; sendcommand(ControlData.in | 0x40); if(readdata() & 0x01 ) { USB_submit(); } } void ep1rxdone(){ unsigned char i,j;printf(\"adf\"); sendcommand(0x02); sendcommand(0xf0); j=readdata(); j=readdata(); printf(\"2 in: \"); if(j>16)j=16;/*判断是否超出缓冲区*/ for(i=0;i<j;i++) RbcCommandBuf.DataBuf=readdata(); printf(\"%2x \",RbcCommandBuf.DataBuf); printf(\"\\n\"); sendcommand(0xf2); } void SETUP_read(){ char i; sendcommand(0x00); sendcommand(0xf0); ControlData.DeviceRequest[0] = readdata(); ControlData.DeviceRequest[1] = readdata(); printf(\"0 in: \"); for(i=0;i<8;i++) { ControlData.DeviceRequest = readdata(); printf(\"%2x \",ControlData.DeviceRequest); } printf(\"\\n\"); sendcommand( 0xf1); sendcommand( 0xf2); } void USB_submit(void) { unsigned char i; if(ControlData.wLength>ControlData.wCount) ControlData.wLength = ControlData.wCount; sendcommand(ControlData.in); sendcommand(0xf0); senddata(0x00); senddata(ControlData.wLength); printf(\"%1d out: \",ControlData.in); for(i=0;i<ControlData.wLength ;i++) { printf(\"%2x \",*(ControlData.pData)); senddata(*(ControlData.pData++)); } printf(\"\\n\"); ControlData.wCount-=ControlData.wLength; if(ControlData.in == 1)sendcommand(0xf1); sendcommand(0xfa); } void HandleSetup(void){ if(ControlData.DeviceRequest[0] & 0x20) { if (ControlData.DeviceRequest[1] <= 0x0B) { /*(*ClassFunctionTable[ControlData.DeviceRequest[1]])();*/ printf(\"\\nsadf\\n\"); return; } } else { if ((ControlData.DeviceRequest[1] & 0x0f)<= 0x0B) { if (ControlData.DeviceRequest[1] == 15) { set_configuration(); }else { (*StandardDeviceRequest[ControlData.DeviceRequest[1]])(); } } return; } } void reserved(void) { sendcommand(0x40); senddata(0x01); sendcommand(0x41); senddata(0x01); sendcommand(0xf1); } void get_status(void) { switch (ControlData.DeviceRequest[0]) { case 0x80: ControlData.DeviceRequest[0] = 0x02; ControlData.DeviceRequest[1] = 0x00; break; case 0x81: ControlData.DeviceRequest[0] = 0x00; ControlData.DeviceRequest[1] = 0x00; break; case 0x82: ControlData.DeviceRequest[0] = 0x00; ControlData.DeviceRequest[1] = 0x00; break; } ControlData.wLength = 2; ControlData.wCount = 2; ControlData.pData = ControlData.DeviceRequest; USB_submit(); } void set_address(void) { sendcommand(0xD0); senddata(0x80 | ControlData.DeviceRequest[2]); ControlData.wLength = 0; USB_submit(); } void get_descriptor(void) { ControlData.wLength=16; switch ( ControlData.DeviceRequest[3]) { case 0x01: ControlData.wCount = sizeof(DeviceDescr); ControlData.pData = DeviceDescr; break; case 0x02: ControlData.wCount = ConfigDescr[2]; ControlData.pData = ConfigDescr; if(ControlData.DeviceRequest[6]<16)ControlData.wCount = ControlData.DeviceRequest[6]; break; case 0x03: switch(ControlData.DeviceRequest[2]) { case 0x00 : ControlData.wCount = sizeof(USBStringLanguageDescription); ControlData.pData = USBStringLanguageDescription; break; case 0x01 : ControlData.wCount= sizeof(USBStringDescription1); ControlData.pData = USBStringDescription1; break; case 0x02 : ControlData.wCount = sizeof(USBStringDescription2); ControlData.pData = USBStringDescription2; break; default: reserved(); return; } break; default : reserved(); return; } USB_submit(); } void set_configuration(void) { if (ControlData.DeviceRequest[0] == 0x00) { ControlData.wLength = 0; USB_submit(); sendcommand(0xD8); if(ControlData.DeviceRequest[2] == 0x00) { senddata(0x00); }else if(ControlData.DeviceRequest[2] == 0x01) { senddata(0x01); } }else reserved(); } /****************************************************************************/ void RBCReadCapacity() { ControlData.DeviceRequest[0] = 0x00; ControlData.DeviceRequest[1] = 0x00; ControlData.DeviceRequest[2] = 0x00; ControlData.DeviceRequest[3] = 0x64; ControlData.DeviceRequest[4] = 0x00; ControlData.DeviceRequest[5] = 0x00; ControlData.DeviceRequest[6] = 0x02; ControlData.DeviceRequest[7] = 0x00; ControlData.wLength = 8; ControlData.wCount = 8; ControlData.pData = ControlData.DeviceRequest; USB_submit(); } void RBCRead(){ ControlData.wLength =16; ControlData.wCount = RbcCommandBuf.ReadCommand.TransferLength*512; ControlData.pData = &databuf[RbcCommandBuf.ReadCommand.BlockAddress*512]; } void RBCWrite(){ } /****************************************************************************/ void reconnect_USB(void){ int i=0,j=0; /* printf(\"reconnect_usb:\\n\");*/ setD12CS(0); setD12A0(0); setD12SUSPD(1); sendcommand(0xf3); senddata(0x06); senddata(0x03); sendcommand(0xd0); senddata(0x80); sendcommand(0xD8); senddata(0x01); for(;i<10000;i++)for(;j<800;j++); sendcommand(0xf3); senddata(0x16); sendcommand(0xf4); readdata(); /* printf(\"\\nreconnect_use_finish\\n\");*/ } void init_com(void) { outp(com+3,0x80); outp(com,0x06); outp(com+1,0x00); outp(com+3,0x03); outp(com+4,0x03); outp(com+1,0x00); } |
|
沙发#
发布于:2003-01-29 15:47
查看你的主机驱动程序,它接收到配置描述符后没有给你进一步的命令,可能它认为你的描述符不对。
看你程序里用的是RBC协议,但你的类是人机接口类设备,而不是海量存储设备。 |
|
板凳#
发布于:2003-01-29 15:53
查看你的主机驱动程序,它接收到配置描述符后没有给你进一步的命令,可能它认为你的描述符不对。 海量存储设备的类是什么 ,谢谢 RBC command 通过那个端点接受, CTL 23 00 10 00 - 01 00 00 00 怎样回应 下面的应怎样改 char DeviceDescr[] = { 0x12, 0x01, 0x10, 0x01, 0x00,/*0x01*/ 0x00, 0x00, 0x10, 0x76, 0x0C, 0x05, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01 }; char ConfigDescr[] = { 0x09, 0x02, 0x20,0x00 , 0x01, 0x01, 0x00, 0xa0, 0x32 }; char InterfaceDescr[]={ 0x09, 0x04, 0x00, 0x00, 0x02, 0x03, 0x01, 0x02, 0x00 }; [编辑 - 1/29/03 by nter0] |
|
地板#
发布于:2003-01-29 17:20
在你的程序里就有,即mass storage class = 08h
根据你端点描述符,应该是通过双向端点1来处理RBC的命令。 23应该是Read Capacity之类的命令,具体我记布清了,你可以参考协议。 |
|
地下室#
发布于:2003-01-29 20:10
在你的程序里就有,即mass storage class = 08h 我收到的不像是RBC,是下面的东西,我不知道是什么,请帮帮忙 55 53 42 43 - a8 c9 d3 80 USBC.... 165us 22.1.0 24 00 00 00 - 80 00 06 12 $....... 22.1.8 00 00 00 24 - 00 00 00 00 ...$.... 22.1.16 00 00 00 00 - 00 00 00 ....... 22.1.24 [编辑 - 1/29/03 by nter0] |
|
5楼#
发布于:2003-02-05 23:41
最后3行
0 in: 80 6 0 2 0 0 20 0 ////将20该为2E 1 out: 9 2 20 0 1 1 0 a0 32 9 4 0 0 2 3 1 1 out: 2 0 7 5 81 2 10 0 a 7 5 1 2 10 0 a 描述符长度是47字节,你没有发完 |
|
6楼#
发布于:2003-02-07 19:26
现在碰到了新的问题,我受到了read10,在返回1格逻辑单元数据(512)没有问题,但是在返回8个逻辑单元数据是出错了,只传输了一半不知道为什么?是不是因为超时?我自己做的测试电路是通过串口传输控制信息的
6 USTS 00 00 01 c0 canceled 9.5sc 109.2.0 |
|
7楼#
发布于:2003-02-08 15:37
我找到答案了,是超时了
|
|
8楼#
发布于:2003-02-12 16:09
请问楼上的老兄,你做上述枚举时使用的自己的驱动,还是操作系统自带的驱动?
|
|