📄 usbhcd.c
字号:
Ctl_Setup->bmRequestType = 0x80;
Ctl_Setup->bRequest = 0x06;
Ctl_Setup->wValue = 0x0200;
Ctl_Setup->wIndex = 0x0000;
Ctl_Setup->wLength = Length;
ehci_Ctl_TD1->hw_next = 0x01;
ehci_Ctl_TD1->hw_alt_next = 0x01;
ehci_Ctl_TD1->hw_buf[0] = (UpperAddr(Ctl_Setup) << 16) + LowerAddr(Ctl_Setup);
ehci_Ctl_TD1->hw_token = 0x80000L|QTD_CERR_3|QTD_PID_SETUP|QTD_STS_ACTIVE;
//Data Stage
Ctl_Data = (char *)cfg_des;
ehci_Ctl_TD2->hw_next = 0x01;
ehci_Ctl_TD2->hw_alt_next = 0x01;
ehci_Ctl_TD2->hw_buf[0] = (UpperAddr(Ctl_Data) << 16) + LowerAddr(Ctl_Data);
temp = Length;
ehci_Ctl_TD2->hw_token = QTD_TOGGLE|(temp << 16)|QTD_CERR_3|QTD_PID_IN|QTD_STS_ACTIVE;
ehci_Ctl_TD1->hw_next = (UpperAddr(ehci_Ctl_TD2) << 16) + LowerAddr(ehci_Ctl_TD2);
//Status Stage
ehci_Ctl_TD3->hw_next = 0x01;
ehci_Ctl_TD3->hw_alt_next = 0x01;
ehci_Ctl_TD3->hw_buf[0] = 0;
ehci_Ctl_TD3->hw_token = QTD_TOGGLE|QTD_IOC|QTD_CERR_3|QTD_PID_OUT|QTD_STS_ACTIVE;
ehci_Ctl_TD2->hw_next = (UpperAddr(ehci_Ctl_TD3) << 16) + LowerAddr(ehci_Ctl_TD3);
//Write TD to QH, valid TD
Do_TD_Complete = 0;
ehci_Ep0->hw_qtd_next = (UpperAddr(ehci_Ctl_TD1) << 16) + LowerAddr(ehci_Ctl_TD1);
do{} while(Do_TD_Complete == 0);
//Sten
if(((ehci_Ctl_TD1->hw_token & 0x7E) != 0) ||
((ehci_Ctl_TD2->hw_token & 0x7E) != 0) || ((ehci_Ctl_TD3->hw_token & 0x7E) != 0))
//return FALSE;
Err_Cnt++;
/*p = (char *) cfg_des;
q = (char *) UDisk_cfg_des;
i = sizeof(std_cfg_des);
for(i=0;i<sizeof(std_cfg_des);i++)
if(*p++ != *q++)
return FALSE;
if(Length > sizeof(std_cfg_des))
{
p = (char *) if_des;
q = (char *) UDisk_if_des;
for(i=0;i<sizeof(std_if_des);i++)
if(*p++ != *q++)
return FALSE;
p = (char *) edp_des1;
q = (char *) UDisk_edp_des1;
for(i=0;i<sizeof(std_edp_des);i++)
if(*p++ != *q++)
return FALSE;
p = (char *) edp_des2;
q = (char *) UDisk_edp_des2;
for(i=0;i<sizeof(std_edp_des);i++)
if(*p++ != *q++)
return FALSE;
p = (char *) edp_des3;
q = (char *) UDisk_edp_des3;
for(i=0;i<sizeof(std_edp_des);i++)
if(*p++ != *q++)
return FALSE;
}*/
return TRUE;
}
BOOL Get_String_Desc(int num)
{
//int i;
int temp;
//char *p, *q;
if(num == 0)
LANGID[0] = 0;
else if(num == 1)
String1[0] = 0;
else if(num == 2)
String2[0] = 0;
else if(num == 3)
String3[0] = 0;
//Setup Stage
Ctl_Setup->bmRequestType = 0x80;
Ctl_Setup->bRequest = 0x06;
Ctl_Setup->wValue = 0x0300 | num;
if(num == 0)
Ctl_Setup->wIndex = 0x0000;
else {
temp = (LANGID[3] << 8) + LANGID[2];
Ctl_Setup->wIndex = temp;
}
Ctl_Setup->wLength = 0x00FF;
ehci_Ctl_TD1->hw_next = 0x01;
ehci_Ctl_TD1->hw_alt_next = 0x01;
ehci_Ctl_TD1->hw_buf[0] = (UpperAddr(Ctl_Setup) << 16) + LowerAddr(Ctl_Setup);
ehci_Ctl_TD1->hw_token = 0x80000L|QTD_CERR_3|QTD_PID_SETUP|QTD_STS_ACTIVE;
//Data Stage
if(num == 0)
Ctl_Data = (char *)LANGID;
else if(num == 1)
Ctl_Data = (char *)String1;
else if(num == 2)
Ctl_Data = (char *)String2;
else if(num == 3)
Ctl_Data = (char *)String3;
ehci_Ctl_TD2->hw_next = 0x01;
ehci_Ctl_TD2->hw_alt_next = 0x01;
ehci_Ctl_TD2->hw_buf[0] = (UpperAddr(Ctl_Data) << 16) + LowerAddr(Ctl_Data);
ehci_Ctl_TD2->hw_token = QTD_TOGGLE|0xFF0000L|QTD_CERR_3|QTD_PID_IN|QTD_STS_ACTIVE;
ehci_Ctl_TD1->hw_next = (UpperAddr(ehci_Ctl_TD2) << 16) + LowerAddr(ehci_Ctl_TD2);
//Status Stage
ehci_Ctl_TD3->hw_next = 0x01;
ehci_Ctl_TD3->hw_alt_next = 0x01;
ehci_Ctl_TD3->hw_buf[0] = 0;
ehci_Ctl_TD3->hw_token = QTD_TOGGLE|QTD_IOC|QTD_CERR_3|QTD_PID_OUT|QTD_STS_ACTIVE;
ehci_Ctl_TD2->hw_next = (UpperAddr(ehci_Ctl_TD3) << 16) + LowerAddr(ehci_Ctl_TD3);
//Write TD to QH, valid TD
Do_TD_Complete = 0;
ehci_Ep0->hw_qtd_next = (UpperAddr(ehci_Ctl_TD1) << 16) + LowerAddr(ehci_Ctl_TD1);
do{} while(Do_TD_Complete == 0);
//Sten
if(((ehci_Ctl_TD1->hw_token & 0x7E) != 0) ||
((ehci_Ctl_TD2->hw_token & 0x7E) != 0) || ((ehci_Ctl_TD3->hw_token & 0x7E) != 0))
//return FALSE;
Err_Cnt++;
/*if(num == 0)
{
p = (char *) LANGID;
q = (char *) UDisk_LANGID;
for(i=0;i<sizeof(LANGID);i++)
if(*p++ != *q++)
return FALSE;
}
else if(num == 2)
{
p = (char *) String2;
q = (char *) UDisk_String2;
//for(i=0;i<sizeof(String2);i++)
for(i=0;i<34;i++)
if(*p++ != *q++)
return FALSE;
//Clear others
for(i=0;i<50;i++)
*p++ = ' ';
}
else if(num == 3)
{
p = (char *) String3;
q = (char *) UDisk_String3;
//for(i=0;i<sizeof(String3);i++)
for(i=0;i<34;i++)
if(*p++ != *q++)
return FALSE;
}*/
return TRUE;
}
BOOL Set_Configuration(int num)
{
//Setup Stage
Ctl_Setup->bmRequestType = 0x00;
Ctl_Setup->bRequest = 0x09;
Ctl_Setup->wValue = num;
Ctl_Setup->wIndex = 0x0000;
Ctl_Setup->wLength = 0x0000;
ehci_Ctl_TD1->hw_next = 0x01;
ehci_Ctl_TD1->hw_alt_next = 0x01;
ehci_Ctl_TD1->hw_buf[0] = (UpperAddr(Ctl_Setup) << 16) + LowerAddr(Ctl_Setup);
ehci_Ctl_TD1->hw_token = 0x80000L|QTD_CERR_3|QTD_PID_SETUP|QTD_STS_ACTIVE;
//Status Stage
ehci_Ctl_TD3->hw_next = 0x01;
ehci_Ctl_TD3->hw_alt_next = 0x01;
ehci_Ctl_TD3->hw_buf[0] = 0;
ehci_Ctl_TD3->hw_token = QTD_TOGGLE|QTD_IOC|QTD_CERR_3|QTD_PID_IN|QTD_STS_ACTIVE;
ehci_Ctl_TD1->hw_next = (UpperAddr(ehci_Ctl_TD3) << 16) + LowerAddr(ehci_Ctl_TD3);
Do_TD_Complete = 0;
ehci_Ep0->hw_qtd_next = (UpperAddr(ehci_Ctl_TD1) << 16) + LowerAddr(ehci_Ctl_TD1);
do{} while(Do_TD_Complete == 0);
//Sten
if(((ehci_Ctl_TD1->hw_token & 0x7E) != 0) || ((ehci_Ctl_TD3->hw_token & 0x7E) != 0))
{
inport(0x6000);
//return FALSE;
Err_Cnt++;
};
return TRUE;
}
BOOL DoControlTransfer()
{
static char buf[30];
char buf1[26]={"Doing Control transfer..."};
char *p, *q;
int i;
dev_des->bLength=0x12;
//Get device descriptor
if(Get_Device_Descriptor(dev_des->bLength) == FALSE)
return FALSE;
//Get Configuration descriptor, initial Mass storage device just have one configuration
if(dev_des->bNumConfigurations != 0)
if(Get_Configuration_Desc(0x09) == FALSE)
return FALSE;
//Get LANGID String Descriptor
if((dev_des->iManufacturer != 0) || (dev_des->iProduct != 0) ||(dev_des->iSerialNumber != 0))
if(Get_String_Desc(0) == FALSE)
return FALSE;
//Get String 3 Descriptor
if(dev_des->iSerialNumber != 0)
if(Get_String_Desc(dev_des->iSerialNumber) == FALSE)
return FALSE;
//Get Configuration, interface, endpoint descriptor
if(dev_des->bNumConfigurations != 0)
if(Get_Configuration_Desc(0xFF) == FALSE)
return FALSE;
//Get LANGID String Descriptor
if((dev_des->iManufacturer != 0) || (dev_des->iProduct != 0) ||(dev_des->iSerialNumber != 0))
if(Get_String_Desc(0) == FALSE)
return FALSE;
//Get String 2 Descriptor
if(dev_des->iProduct != 0)
if(Get_String_Desc(dev_des->iProduct) == FALSE)
return FALSE;
//Get LANGID String Descriptor
if((dev_des->iManufacturer != 0) || (dev_des->iProduct != 0) ||(dev_des->iSerialNumber != 0))
if(Get_String_Desc(0) == FALSE)
return FALSE;
//Get String 2 Descriptor
if(dev_des->iProduct != 0)
if(Get_String_Desc(dev_des->iProduct) == FALSE)
return FALSE;
//Get String 2 Descriptor
if(dev_des->iManufacturer != 0)
if(Get_String_Desc(dev_des->iManufacturer) == FALSE)
return FALSE;
//Get device descriptor
if(Get_Device_Descriptor(dev_des->bLength) == FALSE)
return FALSE;
//Get Configuration descriptor
if(dev_des->bNumConfigurations != 0)
if(Get_Configuration_Desc(0x09) == FALSE)
return FALSE;
//Get Configuration descriptor
if(dev_des->bNumConfigurations != 0)
if(Get_Configuration_Desc(cfg_des->wTotalLength) == FALSE)
return FALSE;
//Set Configuration
if(Set_Configuration(cfg_des->bConfigurationValue) == FALSE)
return FALSE;
ControlCnt++;
if(ControlCnt == 0x0000){
p=buf;
q=buf1;
for(i=0;i<sizeof(buf1);i++)
*p++ = *q++;
*p++ = 10;
*p++ = 13;
UART_SendData(buf, sizeof(buf));
}
return TRUE;
}
void SendDesc2UART()
{
static char buf[40];
char buf1[28] = {"Control transfer times : 0x"};
char *p, *q;
int i;
//Send descriptor to UART 1
UART_Device_Descriptor(dev_des);
if(dev_des->bNumConfigurations != 0)
UART_Configuration_Descriptor(cfg_des);
if(cfg_des->bNumInterfaces != 0)
UART_Interface_Descriptor(if_des);
if(if_des->bNumEndpoints > 0)
UART_Endpoint_Descriptor(edp_des1,1);
if(if_des->bNumEndpoints > 1)
UART_Endpoint_Descriptor(edp_des2,2);
if(if_des->bNumEndpoints > 2)
UART_Endpoint_Descriptor(edp_des3,3);
if((dev_des->iManufacturer != 0) || (dev_des->iProduct != 0) ||(dev_des->iSerialNumber != 0))
UART_String_Descriptor(LANGID, 0, sizeof(LANGID));
if(dev_des->iManufacturer != 0)
{
switch(dev_des->iManufacturer)
{
case 1:
UART_String_Descriptor(String1, 1, sizeof(String1)); break;
case 2:
UART_String_Descriptor(String2, 2, sizeof(String2)); break;
case 3:
UART_String_Descriptor(String3, 3, sizeof(String3)); break;
}
}
if(dev_des->iProduct != 0)
{
switch(dev_des->iProduct)
{
case 1:
UART_String_Descriptor(String1, 1, sizeof(String1)); break;
case 2:
UART_String_Descriptor(String2, 2, sizeof(String2)); break;
case 3:
UART_String_Descriptor(String3, 3, sizeof(String3)); break;
}
}
if(dev_des->iSerialNumber != 0)
{
switch(dev_des->iSerialNumber)
{
case 1:
UART_String_Descriptor(String1, 1, sizeof(String1)); break;
case 2:
UART_String_Descriptor(String2, 2, sizeof(String2)); break;
case 3:
UART_String_Descriptor(String3, 3, sizeof(String3)); break;
}
}
p=buf;
q=buf1;
*p++ = 10;
*p++ = 13;
for(i=0;i<sizeof(buf1);i++)
*p++ = *q++;
p = Num_ASCII_W(p, ControlCnt, FALSE);
*p++ = 10;
*p++ = 13;
UART_SendData(buf, sizeof(buf));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -