📄 usbd_protstorage.c
字号:
/* Reset Wait */
bBitMask = USBD_FUNC_CE_STALLMODE;
USBD_FuncSetEPxControl(epNumber,bBitMask,USBD_FUNC_FLAG_CLR);
if (PrvBulkEPInfo[PRV_BULKIN].bEPNumber == epNumber) {
/* Bulk IN */
PrvBulkEPInfo[PRV_BULKIN].bState = PRV_IDLE_STATE;
}
if (PrvBulkEPInfo[PRV_BULKOUT].bEPNumber == epNumber) {
/* Bulk OUT */
PrvBulkEPInfo[PRV_BULKOUT].bState = PRV_IDLE_STATE;
}
}
}
retValue = STATUS_SUCCESS;
}
break;};
return retValue;
}
/* =============================================================================
// Function_Name: USBD_ProtStorageConfigured
// description : Callback is done when it is Configured state
// argument :
// return : Finished normally STATUS_SUCCESS
// Finished abnormally STATUS_NOT_IMPLEMENTED
// flag :
// global :
// =============================================================================
*/
LONG USBD_ProtStorageConfigured(ULONG lParam0,ULONG lParam1,void *pParam)
{
/* Set flag that means it has become to Configured state */
SET_BIT(PrvInternalStatus,PRV_IR_CONFIGURED);
return STATUS_SUCCESS;
}
/* =============================================================================
// Function_Name: USBD_ProtStorageDeconfigured
// description : Callback is done when it is Deconfigured state
// argument : lParam0 Endpoint Number
//
// return : Finished normally STATUS_SUCCESS
// Finished abnormally STATUS_NOT_IMPLEMENTED
// flag :
// global :
// =============================================================================
*/
LONG USBD_ProtStorageDeconfigured(ULONG lParam0,ULONG lParam1,void *pParam)
{
/* Set to show that it has become to Deconfigured state */
SET_BIT(PrvInternalStatus,PRV_IR_DECONFIGURED);
return STATUS_SUCCESS;
}
/* =============================================================================
// Function_Name: USBD_ProtStorageAlternateChanged
// description : Callback is done when it is Alternate Setting changed
// argument :
// return : Finished normally STATUS_SUCCESS
// Finished abnormally STATUS_NOT_IMPLEMENTED
// flag :
// global :
// =============================================================================
*/
LONG USBD_ProtStorageAlternateChanged(ULONG lParam0,ULONG lParam1,void *pParam)
{
if (lParam1 == PrvInterfaceNumber) {
/* Set to the Alternate Setting changed */
SET_BIT(PrvInternalStatus,PRV_IR_ALTERNATE_CHANGED);
}
return STATUS_SUCCESS;
}
/* =============================================================================
// Function_Name: PrvInitVariables
// description : Initialize variables
// argument : None
// return : Finished normally STATUS_SUCCESS
// flag :
// global :
// =============================================================================
*/
static LONG PrvInitVariables(void)
{
PrvAllocId = 0;
PrvInterfaceNumber = 0;
PrvMaxLUN = 0;
PrvBulkOnlyStatus = 0;
PrvInternalStatus = 0;
memset(&PrvBulkEPInfo[0],0x00,sizeof (PRV_BULKEPINFO));
memset(&PrvBulkEPInfo[1],0x00,sizeof (PRV_BULKEPINFO));
PrvStorageEventCallback = 0;
PrvStorageXferEventCallback = 0;
return STATUS_SUCCESS;
}
/* =============================================================================
// Function_Name: PrvEP0_DataInEndCallback
// description : Callback is done from lower layer, by completion of Data Stage
// argument : lEPNum Endpoint Number
// lActualXferSize Number that has been transferred
// return : Finished normally STATUS_SUCCESS
// flag :
// global :
// =============================================================================
*/
static LONG PrvEP0_DataInEndCallback( ULONG lEPNum, ULONG lActualXferSize, void *pParam )
{
SET_BIT(PrvInternalStatus,PRV_IR_EP0_DATAIN_END);
return STATUS_SUCCESS;
}
/* =============================================================================
// Function_Name: PrvEP0_StatusStageEndCallback
// description : Callback is done from lower layer, by completion of Status Stage
// argument : lResult Result of Status Stage
// return : Finished normally STATUS_SUCCESS
// flag :
// global :
// =============================================================================
*/
static LONG PrvEP0_StatusStageEndCallback( ULONG lResult, ULONG lParam1, void *pParam )
{
SET_BIT(PrvInternalStatus,PRV_IR_EP0_STATUSSTAGE_END);
return STATUS_SUCCESS;
}
/* =============================================================================
// Function_Name: PrvBulkInPIOTransferEndCallback
// description : Callback is done from lower layer, by completion of Data Stage
// argument : lEPNum Endpoint Number
// lActualXferSize Number that has been transferred
// return : Finished normally STATUS_SUCCESS
// flag :
// global :
// =============================================================================
*/
static LONG PrvBulkInPIOTransferEndCallback( ULONG lEPNum, ULONG lActualXferSize, void *pParam )
{
SET_BIT(PrvInternalStatus,PRV_IR_BULKIN_TRANSFER_END);
PrvBulkEPInfo[PRV_BULKIN].dwActXferSize = lActualXferSize;
return STATUS_SUCCESS;
}
/* =============================================================================
// Function_Name: PrvBulkOutPIOTransferEndCallback
// description : Callback is done from lower layer, by completion of Data Stage
// argument : lEPNum Endpoint Number
// lActualXferSize Number that has been transferred
// return : Finished normally STATUS_SUCCESS
// flag :
// global :
// =============================================================================
*/
static LONG PrvBulkOutPIOTransferEndCallback( ULONG lEPNum, ULONG lActualXferSize, void *pParam )
{
SET_BIT(PrvInternalStatus,PRV_IR_BULKOUT_TRANSFER_END);
PrvBulkEPInfo[PRV_BULKOUT].dwActXferSize = lActualXferSize;
return STATUS_SUCCESS;
}
/* =============================================================================
// Function_Name: PrvBulkTransferShortPktEventCallback
// description : Check event of completion for Receiving/Transmission of ShortPkt in Bulk transfer
// argument : lEvent Kind of event to notify
// lEPNum Endpoint Number
// return :
// flag :
// global :
// =============================================================================
*/
static LONG PrvBulkTransferShortPktCallback(ULONG lEvent,ULONG lEPNum,void *pParam)
{
ULONG dwRemain;
if (lEPNum == PrvBulkEPInfo[PRV_BULKIN].bEPNumber && (lEvent & USBD_FUNC_IE_FIFOEMPTY) == USBD_FUNC_IE_FIFOEMPTY) {
/* Check for Bulk IN transfer */
USBD_FuncGetEPxPIODataRemain(PrvBulkEPInfo[PRV_BULKIN].bEPNumber,&dwRemain);
if (dwRemain == 0) {
/* Finish the transfer, if FIFO is empty */
SET_BIT(PrvInternalStatus,PRV_IR_BULKIN_TRANSFER_END);
PrvPollingProc();
}
}
if (lEPNum == PrvBulkEPInfo[PRV_BULKOUT].bEPNumber && (lEvent & USBD_FUNC_IE_OUT_SHORT_ACK) == USBD_FUNC_IE_OUT_SHORT_ACK) {
/* Set flag that mean ShortPkt had been ceceived */
PrvBulkEPInfo[PRV_BULKOUT].bShortPkt = 1;
SET_BIT(PrvInternalStatus,PRV_IR_BULKOUT_TRANSFER_END);
}
return STATUS_SUCCESS;
}
/* =============================================================================
// Function_Name: PrvBulkOnlyEventCallback
// description : Callback function for occurence of event of CBW receiving, CSW transmission
// argument :
// return :
// flag :
// global :
// =============================================================================
*/
static LONG PrvBulkOnlyEventCallback(ULONG lEvent,ULONG lParam1,void *pParam)
{
LONG retValue;
UCHAR bEPxControl;
switch (lEvent) {
case USBD_FUNC_CSW_ERR_EVENT:
if (PrvBulkEPInfo[PRV_BULKIN].bState == PRV_CSW_STATE) {
/* CSW Err */
}
break;
case USBD_FUNC_CSW_CMP_EVENT:
if (PrvBulkEPInfo[PRV_BULKIN].bState == PRV_CSW_STATE) {
/* CSW Cmp */
SET_BIT(PrvInternalStatus,PRV_IR_BULKIN_TRANSFER_END);
PrvBulkEPInfo[PRV_BULKIN].dwActXferSize = 13;
} else {
/* Bug of software */
}
break;
case USBD_FUNC_CBW_ERR_EVENT:
/* CBW Error */
retValue = USBD_FuncGetEPxControl(PrvBulkEPInfo[PRV_BULKOUT].bEPNumber,&bEPxControl);
if (retValue != STATUS_SUCCESS) {
/* Bug of software */
}
if ((bEPxControl & USBD_FUNC_CE_STALLMODE) == 0) {
/* CBW Transaction Error */
} else {
/* Mode of STALL reply */
}
break;
case USBD_FUNC_CBW_CMP_EVENT:
/* Receive CBW */
if (PrvBulkEPInfo[PRV_BULKOUT].bState == PRV_CBW_STATE) {
SET_BIT(PrvInternalStatus,PRV_IR_BULKOUT_TRANSFER_END);
/* Use the support function of CBW of the IC, to get CBW */
USBD_FuncGetBulkOnlyCBW(PrvCBW);
PrvBulkEPInfo[PRV_BULKOUT].dwActXferSize = 31;
LED_On(2); /* (Toya ARM CPU BOARD LED 2) */
/* Start to process CBW command */
} else {
/* Bug of software */
}
break;
case USBD_FUNC_CBW_LENERR_EVENT:
/* CBW Length Error */
if (PrvBulkEPInfo[PRV_BULKOUT].bState == PRV_CBW_STATE) {
SET_BIT(PrvInternalStatus,PRV_IR_BULKOUT_TRANSFER_END);
PrvBulkEPInfo[PRV_BULKOUT].dwActXferSize = 32; /* Set to value more than 31 */
} else {
/* Bug of software */
}
break;
default:
break;
}
return STATUS_SUCCESS;
}
/* =============================================================================
// Function_Name: PrvRcvRequestCallback
// description : Callback is done from lower layer, while receiving request
// argument : lReqData Request to receive
// return : Finished normally STATUS_SUCCESS
// Not be supported STATUS_NOT_IMPLEMENTED
// flag :
// global :
// =============================================================================
*/
static LONG PrvRcvRequestCallback( ULONG lReqData, ULONG lParam1, void *pParam )
{
UCHAR bmRequest, bRequest;
/**************************************************/
/* Check whether the request is supported by this Module */
/**************************************************/
bRequest = LOBYTE(LOWORD(lReqData));
bmRequest = HIBYTE(LOWORD(lReqData));
if ((bmRequest & PRV_BMREQ_TYPE_MASK) != PRV_TYPE_CLASS ) {
/* Besides Class request */
return STATUS_NOT_IMPLEMENTED;
}
if (bRequest == PRV_BULKONLYRESET) {
;
} else if (bRequest == PRV_GETMAXLUN) {
;
} else {
return STATUS_NOT_IMPLEMENTED;
}
SET_BIT(PrvInternalStatus,PRV_IR_RCVSETUP);
return STATUS_SUCCESS;
}
/* =============================================================================
// Function_Name: PrvPollingProc
// description : Do process for polling
// argument : None
// return : Finished normally STATUS_SUCCESS
// flag :
// global :
// =============================================================================
*/
static LONG PrvPollingProc( void )
{
USBD_FUNC_BULKONLY bulkOnlyParam;
LONG retValue,tempRet;
volatile ULONG size;
ULONG lp0,lp1;
void *pp;
UCHAR epx;
ULONG dwParam[2];
retValue = STATUS_UNSUCCESSFUL;
while (1) {
if (PrvInternalStatus == 0) {
retValue = STATUS_SUCCESS;
break; /* Don't process it, if it is not the case */
}
if (IS_BIT(PrvInternalStatus,PRV_IR_RCVSETUP) == TRUE) {
/* Clear Bulk Only Status */
CLR_BIT(PrvBulkOnlyStatus,USBD_PROT_STORAGE_BULKONLYRESET);
CLR_BIT(PrvBulkOnlyStatus,USBD_PROT_STORAGE_GETMAXLUN);
/* Clear the internal flag */
CLR_BIT(PrvInternalStatus,PRV_IR_RCVSETUP);
CLR_BIT(PrvInternalStatus,PRV_IR_EP0_DATAIN_END);
CLR_BIT(PrvInternalStatus,PRV_IR_EP0_STATUSSTAGE_END);
/* Get the request received */
tempRet = USBD_FuncGetSETUPPacket(&PrvRequest);
if (tempRet != STATUS_SUCCESS) {
break;
}
/* Explain and process the request received */
tempRet = PrvDecodeRequest();
if (tempRet == STATUS_SUCCESS) {
/* Request Success */
if (PrvStorageEventCallback != NULL) {
if (IS_BIT(PrvBulkOnlyStatus,USBD_PROT_STORAGE_BULKONLYRESET) == TRUE) {
/* Mass Storage Bulk Only Reset */
/* Call it, if callback had been registered */
lp0 = USBD_PROT_STORAGE_BULKONLYRESET_EVENT;
lp1 = 0;
pp = NULL;
PrvStorageEventCallback(lp0,lp1,pp);
}
if (IS_BIT(PrvBulkOnlyStatus,USBD_PROT_STORAGE_GETMAXLUN) == TRUE) {
/* GetMaxLUN */
/* Call it, if callback had been registered */
lp0 = USBD_PROT_STORAGE_GETMAXLUN_EVENT;
lp1 = 0;
pp = NULL;
PrvStorageEventCallback(lp0,lp1,pp);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -