nter0
驱动牛犊
驱动牛犊
  • 注册日期2002-12-10
  • 最后登录2008-11-17
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1427回复:8

我的程序停了,不知道为什么(有原码)

楼主#
更多 发布于:2003-01-29 12:01
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);
}
iamchine
驱动小牛
驱动小牛
  • 注册日期2002-11-18
  • 最后登录2005-11-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-01-29 15:47
查看你的主机驱动程序,它接收到配置描述符后没有给你进一步的命令,可能它认为你的描述符不对。
看你程序里用的是RBC协议,但你的类是人机接口类设备,而不是海量存储设备。
nter0
驱动牛犊
驱动牛犊
  • 注册日期2002-12-10
  • 最后登录2008-11-17
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-01-29 15:53
查看你的主机驱动程序,它接收到配置描述符后没有给你进一步的命令,可能它认为你的描述符不对。
看你程序里用的是RBC协议,但你的类是人机接口类设备,而不是海量存储设备。


海量存储设备的类是什么 ,谢谢
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]
iamchine
驱动小牛
驱动小牛
  • 注册日期2002-11-18
  • 最后登录2005-11-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-01-29 17:20
在你的程序里就有,即mass storage class = 08h
根据你端点描述符,应该是通过双向端点1来处理RBC的命令。
23应该是Read Capacity之类的命令,具体我记布清了,你可以参考协议。
nter0
驱动牛犊
驱动牛犊
  • 注册日期2002-12-10
  • 最后登录2008-11-17
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-01-29 20:10
在你的程序里就有,即mass storage class = 08h
根据你端点描述符,应该是通过双向端点1来处理RBC的命令。
23应该是Read Capacity之类的命令,具体我记布清了,你可以参考协议。


我收到的不像是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]
majingsong
驱动牛犊
驱动牛犊
  • 注册日期2002-04-02
  • 最后登录2007-05-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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字节,你没有发完

nter0
驱动牛犊
驱动牛犊
  • 注册日期2002-12-10
  • 最后登录2008-11-17
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-02-07 19:26
现在碰到了新的问题,我受到了read10,在返回1格逻辑单元数据(512)没有问题,但是在返回8个逻辑单元数据是出错了,只传输了一半不知道为什么?是不是因为超时?我自己做的测试电路是通过串口传输控制信息的

6  USTS   00 00 01 c0                                            canceled          9.5sc       109.2.0    
nter0
驱动牛犊
驱动牛犊
  • 注册日期2002-12-10
  • 最后登录2008-11-17
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-02-08 15:37
我找到答案了,是超时了
jinghuiren
驱动巨牛
驱动巨牛
  • 注册日期2002-06-01
  • 最后登录2008-10-27
  • 粉丝0
  • 关注0
  • 积分291分
  • 威望460点
  • 贡献值0点
  • 好评度428点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-02-12 16:09
请问楼上的老兄,你做上述枚举时使用的自己的驱动,还是操作系统自带的驱动?
游客

返回顶部