📄 usb_core.c
字号:
USB_StatusOut(); /* Expect the host to abort the data IN stage */
pInformation->ControlState = ControlState;
}/* DataStageIn */
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
NAME: NoData_Setup0
INPUT:
OUTPUT: none
DESCRIPTION:
Proceed the processing of setup request without data stage
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
void NoData_Setup0()
{
DEVICE_INFO *pInfo = pInformation;
RESULT Result;
BYTE RequestNo = pInfo->USBbRequest;
BYTE ControlState;
if (RequestNo == CLEAR_FEATURE)
Result = Standard_ClearFeature();
else if (RequestNo == SET_FEATURE)
Result = Standard_SetFeature();
else if (RequestNo == SET_ADDRESS && Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT) )
Result = SUCCESS;
else
{
Result = UNSUPPORT;
uart_printf("NoData_Setup0 UNSUPPORT %d call",RequestNo);
}
if (Result != SUCCESS) {
Result = (*pProperty->Class_NoData_Setup)(RequestNo);
if (Result == NOT_READY) {
ControlState = PAUSE;
goto exit_NoData_Setup0;
}
}
if (Result != SUCCESS) {
ControlState = STALLED;
goto exit_NoData_Setup0;
}
ControlState = WAIT_STATUS_IN; /* After no data stage SETUP */
USB_StatusIn();
exit_NoData_Setup0:
pInformation->ControlState = ControlState;
return;
} /* NoData_Setup0 */
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
NAME: Data_Setup0
INPUT:
OUTPUT: none
DESCRIPTION:
Proceed the processing of setup request with data stage
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
void Data_Setup0()
{
DEVICE_INFO *pInfo = pInformation;
DEVICE_PROP *pProp = pProperty;
BYTE *(*CopyRoutine)(WORD);
WORD wOffset;
RESULT Result;
BYTE Request_No = pInfo->USBbRequest;
BYTE *pbLen;
WORD wLen;
CopyRoutine = NULL;
wOffset = 0;
if (Request_No == GET_DESCRIPTOR) {
if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) {
BYTE wValue1 = pInfo->USBwValue1;
if (wValue1 == DEVICE_DESCRIPTOR)
CopyRoutine = pProp->GetDeviceDescriptor;
else if (wValue1 == CONFIG_DESCRIPTOR)
CopyRoutine = pProp->GetConfigDescriptor;
else if (wValue1 == STRING_DESCRIPTOR) {
wOffset = pInfo->USBwValue0;
CopyRoutine = pProp->GetStringDescriptor;
} /* End of GET_DESCRIPTOR */
}
}
else if (Request_No == GET_STATUS) {
if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)
|| Type_Recipient == (STANDARD_REQUEST | ENDPOINT_RECIPIENT)) {
CopyRoutine = Standard_GetStatus;
}
}
else if(pInfo->USBbmRequestType ==0xfe)//0xA1 )
{
CopyRoutine = Standard_GetMaxLun;
}
/***************************************************************************
else if (Request_No == GET_CONFIGURATION) {
if ( Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT) )
CopyRoutine = Standard_GetConfiguration;
}
else if (Request_No == GET_INTERFACE) {
if (Type_Recipient == (STANDARD_REQUEST | INTERFACE_RECIPIENT))
CopyRoutine = Standard_GetInterface;
}
else if (Request_No == SET_DESCRIPTOR:) {
if (Type_Recipient == (STANDARD_REQUEST | DEVICE_RECIPIENT)) {
BYTE *SetDeviceDescriptor(WORD Length);
BYTE wValue1 = pInfo->USBwValue1;
if ( wValue1 == DEVICE_DESCRIPTOR)
CopyRoutine = SetDeviceDescriptor;
else if (wValue1 == CONFIG_DESCRIPTOR)
CopyRoutine = SetConfigDescriptor;
else if (wValue1 == STRING_DESCRIPTOR) {
CopyRoutine = SetStringDescriptor;
wOffset = pInfo->USBwValue0;
}
}
}
***************************************************************************/
if (CopyRoutine) {
pInfo->Ctrl_Info.Usb_wOffset = wOffset;
pInfo->Ctrl_Info.CopyData = CopyRoutine;
/* sb in the original the cast to word was directly */
/* now the cast is made step by step */
pbLen = (*CopyRoutine)(0);
wLen = (WORD)((DWORD)pbLen);
pInfo->Ctrl_Info.Usb_wLength = wLen;
Result = SUCCESS;
}
else {
uart_printf("InData_Setup0 UNSUPPORT %d call",Request_No);
Result = (*pProp->Class_Data_Setup)(pInfo->USBbRequest);
if (Result == NOT_READY) {
pInfo->ControlState = PAUSE;
return;
}
}
if (pInfo->Ctrl_Info.Usb_wLength == 0xffff) { /* Data is not ready, wait it */
pInfo->ControlState = PAUSE;
return;
}
if (Result == UNSUPPORT || pInfo->Ctrl_Info.Usb_wLength == 0) {
/* Unsupported request */
pInfo->ControlState = STALLED;
return;
}
if (ValBit(pInfo->USBbmRequestType, 7)) {
/* Device ==> Host */
WORD wLength = pInfo->USBwLength;
/* Restrict the data length to be the one host asks */
if (pInfo->Ctrl_Info.Usb_wLength > wLength)
pInfo->Ctrl_Info.Usb_wLength = wLength;
pInfo->Ctrl_Info.PacketSize = pProp->MaxPacketSize;
DataStageIn();
}
else {
pInfo->ControlState = OUT_DATA;
/* SetEPRxCount(EPindex, STD_MAXPACKETSIZE); */
vSetEPRxStatus(EP_RX_VALID);
/* reenable for next data reception */
}
return;
} /* Data_Setup0 */
/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
NAME: Setup0_Process
INPUT:
OUTPUT: none
DESCRIPTION:
Get the device request data and dispatch to individual process
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
BYTE Setup0_Process()
{
DEVICE_INFO *pInfo = pInformation;
union {
BYTE* b;
WORD* w;
} pBuf;
/* sb pBuf.b = pProperty->RxEP_buffer; */
pBuf.b = PMAAddr + (BYTE *)(_GetEPRxAddr(ENDP0)*2); /* *2 for 32 bits addr */
if (pInfo->ControlState != PAUSE) {
pInfo->USBbmRequestType = *pBuf.b++; /* bmRequestType */
pInfo->USBbRequest = *pBuf.b++; /* bRequest */
pBuf.w++; /* sb word not accessed because of 32 bits addressing */
pInfo->USBwValue = ByteSwap(*pBuf.w++); /* wValue */
pBuf.w++; /* word not accessed because of 32 bits addressing */
pInfo->USBwIndex = ByteSwap(*pBuf.w++); /* wIndex */
pBuf.w++; /* word not accessed because of 32 bits addressing */
/* sb pInfo->USBwLength = ByteSwap(*pBuf.w);*/ /* wLength */
pInfo->USBwLength = *pBuf.w; /* wLength */
}
pInfo->ControlState = SETTING_UP;
/* uart_printf("pInfo->USBbRequest= %d l",pInfo->USBbRequest);
uart_printf("pInfo->USBwValue= %d l",pInfo->USBwValue);
uart_printf("pInfo->USBwIndex= %d l",pInfo->USBwIndex);
uart_printf("pInfo->USBwLength= %d l",pInfo->USBwLength);
*/
if (pInfo->USBwLength == 0)
{ /* No data statge processing */
NoData_Setup0();
}
else { /* Setup with data stage */
Data_Setup0();
}
return Post0_Process();
} /* Setup0_Process */
BYTE Setup1_Process()
{
int i;
ENDPOINT_INFO *pEPinfo ;
//BYTE* pBuf;
union {
BYTE* b;
WORD* w;
} pBuf;
DEVICE_INFO *pInfo = pInformation;
i=0;
pEPinfo = &pInformation->Ctrl_Info;
// uart_printf("Setup1_Process",0);
/* sb pBuf.b = pProperty->RxEP_buffer; */
pBuf.b = PMAAddr + (BYTE *)(_GetEPRxAddr(ENDP2)*2); /* *2 for 32 bits addr */
uart_printf("Setup1_Process setup size cal=%d l", _GetEPRxCount(ENDP2));
if (pInfo->ControlState != PAUSE)
{
pInfo->cbw.dCBWSignature_0 = *pBuf.b++;
pInfo->cbw.dCBWSignature_1 = *pBuf.b++;
pBuf.w++;
pInfo->cbw.dCBWSignature_2 = *pBuf.b++;
pInfo->cbw.dCBWSignature_3 = *pBuf.b++;
pBuf.w++;
pInfo->cbw.dCBWTag_0 = *pBuf.b++;
pInfo->cbw.dCBWTag_1 = *pBuf.b++;
pBuf.w++;
pInfo->cbw.dCBWTag_2 = *pBuf.b++;
pInfo->cbw.dCBWTag_3 = *pBuf.b++;
pBuf.w++;
pInfo->cbw.dCBWDataTransferLength_0 = *pBuf.b++;
pInfo->cbw.dCBWDataTransferLength_1 = *pBuf.b++;
pBuf.w++;
pInfo->cbw.dCBWDataTransferLength_2 = *pBuf.b++;
pInfo->cbw.dCBWDataTransferLength_3 = *pBuf.b++;
pBuf.w++;
pInfo->cbw.bmCBWFlags = *pBuf.b++;
pInfo->cbw.bCBWLUN = *pBuf.b++;
pBuf.w++;
pInfo->cbw.bCBWCBLength = *pBuf.b++;
for(i=0;i<16;i+=2)
{
pInfo->cbw.CBWCB[i] = *pBuf.b++;
pBuf.w++;
pInfo->cbw.CBWCB[i+1] = *pBuf.b++;
}
}
pInfo->pbot_cdb = (T_USBMS_BOT_CDB*)pInfo->cbw.CBWCB;
pInfo->ControlState = OUT_DATA;
uart_printf("pInfo->cbw.dCBWSignature_0= %d l",pInfo->cbw.dCBWSignature_0);
/* uart_printf("pInfo->cbw.dCBWSignature_1= %d l",pInfo->cbw.dCBWSignature_1);
uart_printf("pInfo->cbw.dCBWSignature_2= %d l",pInfo->cbw.dCBWSignature_2);
uart_printf("pInfo->cbw.dCBWSignature_3= %d l",pInfo->cbw.dCBWSignature_3);
uart_printf("pInfo->cbw.dCBWTag_0= %d l",pInfo->cbw.dCBWTag_0);
uart_printf("pInfo->cbw.dCBWTag_1= %d l",pInfo->cbw.dCBWTag_1);
uart_printf("pInfo->cbw.dCBWTag_2= %d l",pInfo->cbw.dCBWTag_2);
uart_printf("pInfo->cbw.dCBWTag_3= %d l",pInfo->cbw.dCBWTag_3);
uart_printf("pInfo->cbw.dCBWDataTransferLength_0=%d",pInfo->cbw.dCBWDataTransferLength_0);
uart_printf("pInfo->cbw.dCBWDataTransferLength_1=%d",pInfo->cbw.dCBWDataTransferLength_1);
uart_printf("pInfo->cbw.dCBWDataTransferLength_2=%d",pInfo->cbw.dCBWDataTransferLength_2);
uart_printf("pInfo->cbw.dCBWDataTransferLength_3=%d",pInfo->cbw.dCBWDataTransferLength_3);
uart_printf("pInfo->cbw.bCBWCBLength %d l",pInfo->cbw.bCBWCBLength);
uart_printf("pInfo->cbw.bCBWLUN= %d l",pInfo->cbw.bCBWLUN);
uart_printf("pInfo->cbw.bmCBWFlags= %d l",pInfo->cbw.bmCBWFlags);
*/
switch (pInfo->pbot_cdb->generic_rbc.operation_code)
{
case INQUIRY://1
uart_printf("INQUIRY call", 0);
uart_printf("inquiry->enable_vpd= %d", pInfo->pbot_cdb->inquiry.enable_vpd);
uart_printf("inquiry->page_code= %d", pInfo->pbot_cdb->inquiry.page_code);
pInfo->senddata[0] = pInfo->inquiry_data.device = 0x00;
pInfo->senddata[1] = pInfo->inquiry_data.removable = 0x80;
pInfo->senddata[2] = pInfo->inquiry_data.version = 0x00;//0x02
pInfo->senddata[3] = pInfo->inquiry_data.rdf_hisup_naca = 0x01;
pInfo->senddata[4] = pInfo->inquiry_data.additionnal_length = 0x1f/*sizeof(T_USBMS_INQUIRY_DATA)-5*/;
pInfo->senddata[5] = pInfo->inquiry_data.protect_tpc_alua_acc_sccs = 0x00;
pInfo->senddata[6] = pInfo->inquiry_data.mchngr_multip_vs_es_bq = 0x00;//0x02
pInfo->senddata[7] = pInfo->inquiry_data.vs_cmdque_linked = 0x00;
pInfo->senddata[8] = pInfo->inquiry_data.vendor_id[0]='h';
pInfo->senddata[9] = pInfo->inquiry_data.vendor_id[1]='h';
pInfo->senddata[10] = pInfo->inquiry_data.vendor_id[2]='h';
pInfo->senddata[11] = pInfo->inquiry_data.vendor_id[3]='h';
pInfo->senddata[12] = pInfo->inquiry_data.vendor_id[4]='h';
pInfo->senddata[13] = pInfo->inquiry_data.vendor_id[5]='h';
pInfo->senddata[14] = pInfo->inquiry_data.vendor_id[6]='\0';
pInfo->senddata[15] = pInfo->inquiry_data.vendor_id[7]='\0';
pInfo->senddata[16] = pInfo->inquiry_data.product_id[0]='U';
pInfo->senddata[17] = pInfo->inquiry_data.product_id[1]='u';
pInfo->senddata[18] = pInfo->inquiry_data.product_id[2]='U';
pInfo->senddata[19] = pInfo->inquiry_data.product_id[3]='u';
pInfo->senddata[20] = pInfo->inquiry_data.product_id[4]='U';
pInfo->senddata[21] = pInfo->inquiry_data.product_id[5]='u';
pInfo->senddata[22] = pInfo->inquiry_data.product_id[6]='U';
pInfo->senddata[23] = pInfo->inquiry_data.product_id[7]='u';
pInfo->senddata[24] = pInfo->inquiry_data.product_id[8]='U';
pInfo->senddata[25] = pInfo->inquiry_data.product_id[9]='u';
pInfo->senddata[26] = pInfo->inquiry_data.product_id[10]='U';
pInfo->senddata[27] = pInfo->inquiry_data.product_id[11]='u';
pInfo->senddata[28] = pInfo->inquiry_data.product_id[12]='U';
pInfo->senddata[29] = pInfo->inquiry_data.product_id[13]='u';
pInfo->senddata[30] = pInfo->inquiry_data.product_id[14]='\0';
pInfo->senddata[31] = pInfo->inquiry_data.product_id[15]='\0';
pInfo->senddata[32] = pInfo->inquiry_data.product_revision_level[0]='1';
pInfo->senddata[33] = pInfo->inquiry_data.product_revision_level[1]='0';
pInfo->senddata[34] = pInfo->inquiry_data.product_revision_level[2]='\0';
pInfo->senddata[35] = pInfo->inquiry_data.product_revision_level[3]='\0';
pInfo->Ctrl_Info.Usb_wLength=24;//pInfo->cbw.dCBWDataTransferLength_0+pInfo->cbw.dCBWDataTransferLength_1<<8+pInfo->cbw.dCBWDataTransferLength_2<<16+pInfo->cbw.dCBWDataTransferLength_3<<24;//sizeof(T_USBMS_INQUIRY_DATA);
pInfo->Ctrl_Info.pData = pInfo->senddata;
pInfo->Ctrl_Info.Usb_wOffset =0;
//pInformation->Ctrl_Info.Endpn = ENDP1;
DataStageIn1();
break;
case MODE_SELECT:
uart_printf("MODE_SELECT call", 0);
break;
case PREVENT_ALLOW_REMOVAL: //just return csw,
uart_printf("PREVENT_ALLOW_REMOVAL call", 0);
break;
case START_STOP_UNIT:
uart_printf("START_STOP_UNIT call", 0);
break;
case READ_CAPACITY:
//-3 T_USBMS_READ_CAPACITY_DATA
uart_printf("READ_CAPACITY call", 0);
pInfo->Ctrl_Info.Usb_wLength=8;//pInfo->cbw.dCBWDataTransferLength_0+pInfo->cbw.dCBWDataTransferLength_1<<8+pInfo->cbw.dCBWDataTransferLength_2<<16+pInfo->cbw.dCBWDataTransferLength_3<<24;//sizeof(T_USBMS_INQUIRY_DATA);
pInfo->Ctrl_Info.pData = B_Read_Capacity;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -