📄 ohcihcd.c
字号:
if(Temp == Temp1) {
if((ohci_DataOut_TD->hwINFO & 0xF0000000L) != TD_CC_NOERROR)
return FALSE;
ohci_hcca->done_head = ohci_DataOut_TD->hwNextTD;
TD_Status &= ~St_DataOut_TD;
}
return TRUE;
}
/*-------------------------------------------------------------------------*
* Control Transfer
*-------------------------------------------------------------------------*/
BOOL OHCI_Get_Device_Descriptor(u32 size)
{
//int i;
//char *p, *q;
u32 Temp;
dev_des->bLength = 0;
//Setup Stage
Ctl_Setup->bmRequestType = 0x80;
Ctl_Setup->bRequest = 0x06;
Ctl_Setup->wValue = 0x0100;
Ctl_Setup->wIndex = 0x0000;
Ctl_Setup->wLength = (u16)size;
ohci_Ctl_TD1->hwINFO = TD_DP_SETUP|TD_T_DATA0|TD_DI;//0x02400000L;
ohci_Ctl_TD1->hwNextTD = 0;
ohci_Ctl_TD1->hwCBP = (UpperAddr(Ctl_Setup) << 16) + LowerAddr(Ctl_Setup);
ohci_Ctl_TD1->hwBE = ohci_Ctl_TD1->hwCBP + sizeof(setup_format) - 1;
//Data Stage
Ctl_Data = (char *)dev_des;
ohci_Ctl_TD2->hwINFO = TD_DP_IN|TD_T_DATA1|TD_DI|TD_R;//0x03540000L;
ohci_Ctl_TD2->hwNextTD = 0;
ohci_Ctl_TD2->hwCBP = (UpperAddr(Ctl_Data) << 16) + LowerAddr(Ctl_Data);
ohci_Ctl_TD2->hwBE = ohci_Ctl_TD2->hwCBP + size - 1; //In 18 bytes
//Status Stage
ohci_Ctl_TD3->hwINFO = TD_DP_OUT|TD_T_DATA1|TD_DI;//0x02480000L;
ohci_Ctl_TD3->hwNextTD = 0;
ohci_Ctl_TD3->hwCBP = 0;
ohci_Ctl_TD3->hwBE = 0; //Out 0 bytes
AddingTDtoED(ohci_Ep0, ohci_Ctl_TD3);
AddingTDtoED(ohci_Ep0, ohci_Ctl_TD2);
AddingTDtoED(ohci_Ep0, ohci_Ctl_TD1);
//Set Control_Filled
Temp = ohci_regs->cmdstatus | OHCI_CLF;
DWordWrite(&ohci_regs->cmdstatus, Temp);
do{} while((dev_des->bLength != 0x12) || (DoneHeadClear == FALSE));
/*
p = (char *) dev_des;
q = (char *) UDisk_dev_des;
for(i=0;i<sizeof(std_dev_des);i++)
if(*p++ != *q++)
return FALSE;
*/
return TRUE;
}
BOOL OHCI_Get_Configuration_Desc(int Length)
{
//int i;
//char *p, *q;
u32 Temp;
cfg_des->bLength = 0;
//Setup Stage
Ctl_Setup->bmRequestType = 0x80;
Ctl_Setup->bRequest = 0x06;
Ctl_Setup->wValue = 0x0200;
Ctl_Setup->wIndex = 0x0000;
Ctl_Setup->wLength = Length;
ohci_Ctl_TD1->hwINFO = TD_DP_SETUP|TD_T_DATA0|TD_DI;//0x02400000L;
ohci_Ctl_TD1->hwNextTD = 0;
ohci_Ctl_TD1->hwCBP = (UpperAddr(Ctl_Setup) << 16) + LowerAddr(Ctl_Setup);
ohci_Ctl_TD1->hwBE = ohci_Ctl_TD1->hwCBP + sizeof(setup_format) - 1;
//Data Stage
Ctl_Data = (char *)cfg_des;
ohci_Ctl_TD2->hwINFO = TD_DP_IN|TD_T_DATA1|TD_DI|TD_R;//0x03540000L;
ohci_Ctl_TD2->hwNextTD = 0;
ohci_Ctl_TD2->hwCBP = (UpperAddr(Ctl_Data) << 16) + LowerAddr(Ctl_Data);
ohci_Ctl_TD2->hwBE = ohci_Ctl_TD2->hwCBP + Length - 1; //In 18 bytes
//Status Stage
ohci_Ctl_TD3->hwINFO = TD_DP_OUT|TD_T_DATA1|TD_DI;//0x02480000L;
ohci_Ctl_TD3->hwNextTD = 0;
ohci_Ctl_TD3->hwCBP = 0;
ohci_Ctl_TD3->hwBE = 0; //Out 0 bytes
AddingTDtoED(ohci_Ep0, ohci_Ctl_TD3);
AddingTDtoED(ohci_Ep0, ohci_Ctl_TD2);
AddingTDtoED(ohci_Ep0, ohci_Ctl_TD1);
//Set Control_Filled
Temp = ohci_regs->cmdstatus | OHCI_CLF;
DWordWrite(&ohci_regs->cmdstatus, Temp);
do{} while((cfg_des->bLength != 0x09) || (DoneHeadClear == FALSE));
/*
p = (char *) cfg_des;
q = (char *) UDisk_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;
}
*/
return TRUE;
}
BOOL OHCI_Get_String_Desc(int num)
{
u32 Temp;
if(num == 0)
LANGID[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 = (u16)Temp;
}
Ctl_Setup->wLength = 0x00FF;
ohci_Ctl_TD1->hwINFO = TD_DP_SETUP|TD_T_DATA0|TD_DI;//0x02400000L;
ohci_Ctl_TD1->hwNextTD = 0;
ohci_Ctl_TD1->hwCBP = (UpperAddr(Ctl_Setup) << 16) + LowerAddr(Ctl_Setup);
ohci_Ctl_TD1->hwBE = ohci_Ctl_TD1->hwCBP + sizeof(setup_format) - 1;
//Data Stage
if(num == 0)
Ctl_Data = (char *)LANGID;
else if(num == 2)
Ctl_Data = (char *)String2;
else if(num == 3)
Ctl_Data = (char *)String3;
ohci_Ctl_TD2->hwINFO = TD_DP_IN|TD_T_DATA1|TD_DI|TD_R;//0x03540000L;
ohci_Ctl_TD2->hwNextTD = 0;
ohci_Ctl_TD2->hwCBP = (UpperAddr(Ctl_Data) << 16) + LowerAddr(Ctl_Data);
ohci_Ctl_TD2->hwBE = ohci_Ctl_TD2->hwCBP + 0xFE; //In 256 bytes
//Status Stage
ohci_Ctl_TD3->hwINFO = TD_DP_OUT|TD_T_DATA1|TD_DI;//0x02480000L;
ohci_Ctl_TD3->hwNextTD = 0;
ohci_Ctl_TD3->hwCBP = 0;
ohci_Ctl_TD3->hwBE = 0; //Out 0 bytes
AddingTDtoED(ohci_Ep0, ohci_Ctl_TD3);
AddingTDtoED(ohci_Ep0, ohci_Ctl_TD2);
AddingTDtoED(ohci_Ep0, ohci_Ctl_TD1);
//Set Control_Filled
Temp = ohci_regs->cmdstatus | OHCI_CLF;
DWordWrite(&ohci_regs->cmdstatus, Temp);
do{} while((*Ctl_Data == 0) || (DoneHeadClear == FALSE));
return TRUE;
}
void OHCI_Set_Configuration(int num)
{
u32 Temp;
//Setup Stage
Ctl_Setup->bmRequestType = 0x00;
Ctl_Setup->bRequest = 0x09;
Ctl_Setup->wValue = num;
Ctl_Setup->wIndex = 0x0000;
Ctl_Setup->wLength = 0x0000;
ohci_Ctl_TD1->hwINFO = TD_DP_SETUP|TD_T_DATA0|TD_DI;//0x02400000L;
ohci_Ctl_TD1->hwNextTD = 0;
ohci_Ctl_TD1->hwCBP = (UpperAddr(Ctl_Setup) << 16) + LowerAddr(Ctl_Setup);
ohci_Ctl_TD1->hwBE = ohci_Ctl_TD1->hwCBP + sizeof(setup_format) - 1;
//Status Stage
ohci_Ctl_TD3->hwINFO = TD_DP_IN|TD_T_DATA1|TD_DI;//0x02480000L;
ohci_Ctl_TD3->hwNextTD = 0;
ohci_Ctl_TD3->hwCBP = 0;
ohci_Ctl_TD3->hwBE = 0; //Out 0 bytes
AddingTDtoED(ohci_Ep0, ohci_Ctl_TD3);
AddingTDtoED(ohci_Ep0, ohci_Ctl_TD1);
//Set Control_Filled
Temp = ohci_regs->cmdstatus | OHCI_CLF;
DWordWrite(&ohci_regs->cmdstatus, Temp);
do{} while(DoneHeadClear == FALSE);
}
void OHCI_Init_BulkLoop()
{
u32 Temp;
//Setup Stage
Ctl_Setup->bmRequestType = 0x40;
Ctl_Setup->bRequest = 0x03;
Ctl_Setup->wValue = 0x2EC3;
Ctl_Setup->wIndex = 0x0000;
Ctl_Setup->wLength = 0x0000;
ohci_Ctl_TD1->hwINFO = TD_DP_SETUP|TD_T_DATA0|TD_DI;//0x02400000L;
ohci_Ctl_TD1->hwNextTD = 0;
ohci_Ctl_TD1->hwCBP = (UpperAddr(Ctl_Setup) << 16) + LowerAddr(Ctl_Setup);
ohci_Ctl_TD1->hwBE = ohci_Ctl_TD1->hwCBP + sizeof(setup_format) - 1;
//Status Stage
ohci_Ctl_TD3->hwINFO = TD_DP_IN|TD_T_DATA1|TD_DI;//0x02480000L;
ohci_Ctl_TD3->hwNextTD = 0;
ohci_Ctl_TD3->hwCBP = 0;
ohci_Ctl_TD3->hwBE = 0; //Out 0 bytes
AddingTDtoED(ohci_Ep0, ohci_Ctl_TD3);
AddingTDtoED(ohci_Ep0, ohci_Ctl_TD1);
//Set Control_Filled
Temp = ohci_regs->cmdstatus | OHCI_CLF;
DWordWrite(&ohci_regs->cmdstatus, Temp);
do{} while(DoneHeadClear == FALSE);
}
BOOL DoOHCIControlTransfer()
{
static char buf[30];
char buf1[26]={"Doing Control transfer..."};
char *p, *q;
int i;
//Get device descriptor
if(OHCI_Get_Device_Descriptor(dev_des->bLength) == FALSE)
return FALSE;
//Get Configuration descriptor
if(dev_des->bNumConfigurations != 0)
if(OHCI_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(OHCI_Get_String_Desc(0) == FALSE)
return FALSE;
//Get String 3 Descriptor
if(dev_des->iSerialNumber != 0)
if(OHCI_Get_String_Desc(dev_des->iSerialNumber) == FALSE)
return FALSE;
//Get Configuration, interface, endpoint descriptor
if(dev_des->bNumConfigurations != 0)
if(OHCI_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(OHCI_Get_String_Desc(0) == FALSE)
return FALSE;
//Get String 2 Descriptor
if(dev_des->iProduct != 0)
if(OHCI_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(OHCI_Get_String_Desc(0) == FALSE)
return FALSE;
//Get String 2 Descriptor
if(dev_des->iProduct != 0)
if(OHCI_Get_String_Desc(dev_des->iProduct) == FALSE)
return FALSE;
//Get device descriptor
if(OHCI_Get_Device_Descriptor(dev_des->bLength) == FALSE)
return FALSE;
//Get Configuration descriptor
if(dev_des->bNumConfigurations != 0)
if(OHCI_Get_Configuration_Desc(0x09) == FALSE)
return FALSE;
//Get Configuration, interface, endpoint descriptor
if(dev_des->bNumConfigurations != 0)
if(OHCI_Get_Configuration_Desc(cfg_des->wTotalLength) == FALSE)
return FALSE;
//Set Configuration
//OHCI_Set_Configuration(cfg_des->bConfigurationValue);
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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -