?? usbtargrbclib.c
字號:
/* init CSW ERP on Bulk-in pipe and submit */ if (usbMsBulkInErpInit(pData, dSize, erpCallback, NULL) != OK) goto EXIT_ERROR; } } else { /* set CSW Status 0x2 (phase error) */ pCsw->status = USB_CSW_PHASE_ERROR; pData = (UINT8 *)pCsw; dSize = sizeof(USB_BULK_CSW); erpCallback = bulkInErpCallbackCSW; /* init CSW ERP on Bulk-in pipe and submit */ if (usbMsBulkInErpInit(pData, dSize, erpCallback, NULL) != OK) goto EXIT_ERROR; } } else { /* set CSW Status 0x2 (phase error) */ pCsw->status = USB_CSW_PHASE_ERROR; pData = (UINT8 *)pCsw; dSize = sizeof(USB_BULK_CSW); erpCallback = bulkInErpCallbackCSW; /* init CSW ERP on Bulk-in pipe and submit */ if (usbMsBulkInErpInit(pData, dSize, erpCallback, NULL) != OK) goto EXIT_ERROR; } } else if (rbcDataOut == TRUE) { if (cbwDataXferLgth > 0) { if (cbwDataDir == CBW_DATA_OUT) { if (cbwDataXferLgth == dSize) { pCsw->dataResidue = 0x0; /* init Bulk-Out ERP and submit to TCD */ if (usbMsBulkOutErpInit(pData, dSize, erpCallback,NULL) != OK) goto EXIT_ERROR; } else if (cbwDataXferLgth > dSize) { pCsw->dataResidue = cbwDataXferLgth - dSize; /* set stall flag on Bulk-Out Endpoint */ g_bulkOutStallFlag = TRUE; /* init Data Out ERP on Bulk-Out Pipe and submit */ if (usbMsBulkOutErpInit(pData, dSize, erpCallback, NULL) != OK) goto EXIT_ERROR; } else { /* set CSW Status 0x2 (phase error) */ pCsw->status = USB_CSW_PHASE_ERROR; pData = (UINT8 *)pCsw; dSize = sizeof(USB_BULK_CSW); erpCallback = bulkInErpCallbackCSW; /* init CSW ERP on Bulk-in pipe and submit */ if (usbMsBulkInErpInit(pData, dSize, erpCallback, NULL) != OK) goto EXIT_ERROR; } } else { /* set CSW Status 0x2 (phase error) */ pCsw->status = USB_CSW_PHASE_ERROR; pData = (UINT8 *)pCsw; dSize = sizeof(USB_BULK_CSW); erpCallback = bulkInErpCallbackCSW; /* init CSW ERP on Bulk-in pipe and submit */ if (usbMsBulkInErpInit(pData, dSize, erpCallback, NULL) != OK) goto EXIT_ERROR; } } else { /* set CSW Status 0x2 (phase error) */ pCsw->status = USB_CSW_PHASE_ERROR; pData = (UINT8 *)pCsw; dSize = sizeof(USB_BULK_CSW); erpCallback = bulkInErpCallbackCSW; /* init CSW ERP on Bulk-in pipe and submit */ if (usbMsBulkInErpInit (pData, dSize, erpCallback, NULL) != OK) goto EXIT_ERROR; } } else { if (cbwDataXferLgth == 0) { /* init CSW ERP on Bulk-in pipe submit ERP */ pCsw->dataResidue = 0x0; pData = (UINT8 *)pCsw; dSize = sizeof(USB_BULK_CSW); erpCallback = bulkInErpCallbackCSW; /* init CSW ERP on Bulk-in pipe and submit */ if (usbMsBulkInErpInit(pData, dSize, erpCallback, NULL) != OK) goto EXIT_ERROR; } else { /* set CSW residue size, dSize = 0 */ pCsw->dataResidue = cbwDataXferLgth; if (cbwDataDir == CBW_DATA_IN) { /* set stall flag on Bulk-In Pipe */ g_bulkInStallFlag = TRUE; /* * init Data In ERP on Bulk-In pipe and submit * to TCD */ if (usbMsBulkInErpInit(pData,dSize, erpCallback,NULL) != OK) goto EXIT_ERROR; } else { /* set stall flag on Bulk-In Pipe */ g_bulkOutStallFlag = TRUE; /* init Data In ERP on Bulk-In pipe and submit to TCD */ if (usbMsBulkOutErpInit(pData, dSize, erpCallback,NULL) != OK) goto EXIT_ERROR; } } } } else { /* set CSW Status 0x1 (command failed) */ pCsw->status = USB_CSW_STATUS_FAIL; pData = (UINT8 *)pCsw; dSize = sizeof(USB_BULK_CSW); erpCallback = bulkInErpCallbackCSW; /* init CSW ERP on Bulk-in pipe and submit */ if (usbMsBulkInErpInit(pData, dSize, erpCallback, NULL) != OK) goto EXIT_ERROR; } } else { goto EXIT_ERROR; } return;EXIT_ERROR: usbMsBulkInStall(); usbMsBulkOutStall(); return; }/********************************************************************************* bulkInErpCallbackCSW - send the CSW on bulk-in pipe** This routine sends the CSW (Command Status Wrapper) back to the host following* execution of the CBW.** RETURNS: N/A* * ERRNO:* none*/void bulkInErpCallbackCSW ( pVOID erp /* USB_ERP endpoint request packet */ ) { UINT8 *pData; /* data buffer */ UINT32 dSize; /* size */ USB_ERP *pErp = (USB_ERP *)erp; /* USB_ERP */ usbDbgPrint("bulkInErpCallbackCSW: Enter...\n"); /* signal that bulk in ERP is complete */ usbMsBulkInErpInUseFlagSet (FALSE); /* if a reset ocurred, we are no longer configured */ if (usbMsIsConfigured () == FALSE) return; /* verify data is valid */ if (pErp->result != OK) return; pData = (UINT8 *)usbMsCBWInit(); dSize = sizeof (USB_BULK_CBW); /* init bulk-out ERP w/bulkOutErpCallbackCBW() callback */ if (usbMsBulkOutErpInit(pData, dSize, bulkOutErpCallbackCBW, NULL) != OK) usbMsBulkOutStall(); return; }/********************************************************************************* bulkInErpCallbackData - process end of data phase on bulk-in pipe** This routine is invoked following a data IN phase to the host.** RETURNS: N/A* * ERRNO:* none*/void bulkInErpCallbackData ( pVOID erp /* USB_ERP endpoint request packet */ ) { USB_ERP *pErp = (USB_ERP *)erp; /* USB_ERP */ USB_BULK_CBW *pCbw; /* USB_BULK_CBW */ USB_BULK_CSW *pCsw; /* USB_BULK_CSW */ UINT8 opCode; /* operation code */ UINT8 *pData; /* pointer to buffer */ UINT32 dSize; /* size */ usbDbgPrint("bulkInErpCallbackData: Enter...\n"); /* FIXME_JAC */ /* signal that bulk in ERP is complete */ usbMsBulkInErpInUseFlagSet (FALSE); /* if a reset ocurred, we are no longer configured */ if (usbMsIsConfigured() == FALSE) return; /* verify data is valid */ if (pErp->result != OK) return; if (g_bulkInStallFlag == TRUE) usbMsBulkInStall(); else { pCsw = usbMsCSWGet(); pCbw = usbMsCBWGet(); opCode = pCbw->CBD[0]; switch(opCode) { /* place any user specific code here */ case RBC_CMD_FORMAT: case RBC_CMD_READ10: case RBC_CMD_READCAPACITY: case RBC_CMD_STARTSTOPUNIT: case RBC_CMD_SYNCCACHE: case RBC_CMD_VERIFY10: case RBC_CMD_WRITE10: case RBC_CMD_INQUIRY: case RBC_CMD_MODESELECT6: case RBC_CMD_MODESENSE6: case RBC_CMD_PERSISTANTRESERVIN: case RBC_CMD_PERSISTANTRESERVOUT: case RBC_CMD_PRVENTALLOWMEDIUMREMOVAL: case RBC_CMD_RELEASE6: case RBC_CMD_REQUESTSENSE: case RBC_CMD_RESERVE6: case RBC_CMD_TESTUNITREADY: case RBC_CMD_WRITEBUFFER: default: break; } /* init CSW ERP on Bulk-in pipe and submit */ pData = (UINT8 *)pCsw; dSize = sizeof(USB_BULK_CSW); /* init CSW ERP on Bulk-in pipe and submit */ if (usbMsBulkInErpInit(pData, dSize, bulkInErpCallbackCSW, NULL) != OK) usbMsBulkInStall(); } return; }/********************************************************************************* bulkOutErpCallbackData - process end of data phase on bulk-out pipe** This routine is invoked following a data OUT phase from the host.** RETURNS: N/A* * ERRNO:* none*/void bulkOutErpCallbackData ( pVOID erp /* USB_ERP endpoint request packet */ ) { USB_ERP *pErp = (USB_ERP *)erp; /* USB_ERP */ USB_BULK_CBW *pCbw; /* USB_BULK_CBW */ USB_BULK_CSW *pCsw; /* USB_BULK_CSW */ UINT8 opCode; /* operation code */ UINT8 *pData; /* pointer to buffer */ UINT32 dSize; /* size */ UINT32 blkNum; /* block nubmer */ UINT16 numBlks; /* number of blocks */ usbDbgPrint("Enter bulkOutErpCallbackData\n"); /* signal that bulk out ERP is complete */ usbMsBulkOutErpInUseFlagSet(FALSE); /* if a reset ocurred, we are no longer configured */ if (usbMsIsConfigured() == FALSE) return; /* verify data is valid */ if (pErp->result != OK) return; if (g_bulkOutStallFlag == TRUE) usbMsBulkOutStall(); else { pCsw = usbMsCSWGet(); pCbw = usbMsCBWGet(); opCode = pCbw->CBD[0]; switch(opCode) { /* place any user specific code here */ case RBC_CMD_FORMAT: break; case RBC_CMD_READ10: break; case RBC_CMD_READCAPACITY: break; case RBC_CMD_STARTSTOPUNIT: break; case RBC_CMD_SYNCCACHE: break; case RBC_CMD_VERIFY10: break; case RBC_CMD_WRITE10: { CBIO_DEV_ID cbio; STATUS retVal; cookie_t cookie; cbio = (CBIO_DEV_ID)usbTargRbcBlockDevGet(); /* get starting LBA from arg[2] - arg[5] of WRITE CBW */ blkNum = (pCbw->CBD[2] << 24) | (pCbw->CBD[3] << 16) | (pCbw->CBD[4] << 8) | (pCbw->CBD[5]); /* get transfer length from WRITE CBW */ numBlks = (pCbw->CBD[7] << 8) | (pCbw->CBD[8]); retVal = cbioBlkRW (cbio, blkNum, numBlks, (addr_t)pErp->bfrList [0].pBfr, CBIO_WRITE, &cookie ); if (retVal == ERROR) { usbMsBulkOutStall(); } } break; case RBC_CMD_INQUIRY: case RBC_CMD_MODESELECT6: case RBC_CMD_MODESENSE6: case RBC_CMD_PERSISTANTRESERVIN: case RBC_CMD_PERSISTANTRESERVOUT: case RBC_CMD_PRVENTALLOWMEDIUMREMOVAL: case RBC_CMD_RELEASE6: case RBC_CMD_REQUESTSENSE: case RBC_CMD_RESERVE6: case RBC_CMD_TESTUNITREADY: case RBC_CMD_WRITEBUFFER: default: break; } /* init CSW ERP on Bulk-in pipe and submit */ pData = (UINT8 *)pCsw; dSize = sizeof(USB_BULK_CSW); /* init CSW ERP on Bulk-in pipe and submit */ if (usbMsBulkInErpInit(pData,dSize, bulkInErpCallbackCSW, NULL) != OK) usbMsBulkInStall(); } return; }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -