⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbd_protstorage.c

📁 epson usb2.0 控制芯片 S1R72V05 固件程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
					/* 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 + -