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

📄 usbd_if.c

📁 epson usb2.0 控制芯片 S1R72V05 固件程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
*/
LONG USBD_IFEP0GetNotifyPacketXferStatus(USHORT *statusType)
{
	LONG retValue;
	UCHAR rTemp;

	retValue = STATUS_SUCCESS;

	do { /* Don't loop */

		rTemp = RegRead(REG08_D_EP0IntEnb);
		/* Initial value */
		*statusType = 0x00;
		if (IS_BIT(rTemp,BIT_EnOUT_ShortACK)) {
			*statusType |= USBD_IF_XFER_STATUS_OUT_SHORTACK;
		}
		if (IS_BIT(rTemp,BIT_EnIN_TranACK)) {
			*statusType |= USBD_IF_XFER_STATUS_IN_ACK;
		}
		if (IS_BIT(rTemp,BIT_EnOUT_TranACK)) {
			*statusType |= USBD_IF_XFER_STATUS_OUT_ACK;
		}
		if (IS_BIT(rTemp,BIT_EnIN_TranNAK)) {
			*statusType |= USBD_IF_XFER_STATUS_IN_NAK;
		}
		if (IS_BIT(rTemp,BIT_EnOUT_TranNAK)) {
			*statusType |= USBD_IF_XFER_STATUS_OUT_NAK;
		}
		if (IS_BIT(rTemp,BIT_EnIN_TranErr)) {
			*statusType |= USBD_IF_XFER_STATUS_IN_STALL;
		}
		if (IS_BIT(rTemp,BIT_EnOUT_TranErr)) {
			*statusType |= USBD_IF_XFER_STATUS_OUT_STALL;
		}
	} while (0);

	return retValue;
}
/* =============================================================================
// Function_Name: USBD_IFEP0SetNotifyPacketXferStatus
// description	: Set state of notification for interrupt status of EP0
// argument		: statusType	The setting value of interrupt status for notification
// return		: STATUS_SUCCESS			Finished normally
//				  STATUS_NOT_OPENED			Not be opened yet
// flag			:
// global		:
// =============================================================================
*/
LONG USBD_IFEP0SetNotifyPacketXferStatus(USHORT statusType)
{
	LONG retValue;
	UCHAR rTemp;

	retValue = STATUS_SUCCESS;

	do { /* Don't loop */

		/* Initial value */
		rTemp = RegRead(REG08_D_EP0IntEnb) & BIT_DescriptorCmp;

		if (IS_BIT(statusType,USBD_IF_XFER_STATUS_IN_ACK)) {
			/* IN ACK */
			SET_BIT(rTemp,BIT_EnIN_TranACK);
		}

		if (IS_BIT(statusType,USBD_IF_XFER_STATUS_OUT_ACK)) {
			/* OUT ACK */
			SET_BIT(rTemp,BIT_EnOUT_TranACK);
		}

		if (IS_BIT(statusType,USBD_IF_XFER_STATUS_IN_NAK)) {
			/* IN NAK */
			SET_BIT(rTemp,BIT_EnIN_TranNAK);
		}

		if (IS_BIT(statusType,USBD_IF_XFER_STATUS_OUT_NAK)) {
			/* OUT NAK */
			SET_BIT(rTemp,BIT_EnOUT_TranNAK);
		}

		if (IS_BIT(statusType,USBD_IF_XFER_STATUS_IN_STALL)) {
			/* IN ERROR */
			SET_BIT(rTemp,BIT_EnIN_TranErr);
		}

		if (IS_BIT(statusType,USBD_IF_XFER_STATUS_OUT_STALL)) {
			/* OUT ERROR */
			SET_BIT(rTemp,BIT_EnOUT_TranErr);
		}

#ifdef DEBUG_C
		SET_BIT(rTemp,BIT_EnIN_TranErr);
		SET_BIT(rTemp,BIT_EnOUT_TranErr);
#endif

		RegWrite(REG08_D_EP0IntStat,rTemp);			/* Clear status */
		RegWrite(REG08_D_EP0IntEnb,rTemp);			/* Set IntEnb */
	} while (0);

	return retValue;
}
/* =============================================================================
// Function_Name: USBD_IFEPxGetNotifyPacketXferStatus
// description	: Return the setting of notification for interrupt status of Endpoint
// argument		: number		Endpoint number
//				  statusType	Pointer to return the setting of notification
// return		: STATUS_SUCCESS			Finished normally
//				  STATUS_NOT_OPENED			Not be opened yet
// flag			:
// global		:
// =============================================================================
*/
LONG USBD_IFEPxGetNotifyPacketXferStatus(UCHAR number,USHORT *statusType)
{
	LONG retValue;
	UCHAR rTemp;

	retValue = STATUS_SUCCESS;

	do { /* Don't loop */

		if (number == 0 || number >= MAX_ENDPOINT) {
			/* When Endpoint which can't be acquired is specified */
			retValue = STATUS_INVALID_PARAMETER;
			break;
		}

		/* Initial value */
		rTemp = RegRead(REG08_D_EPxIntEnb(number - 1));

		/* Initial value */
		*statusType = 0x00;
		if (IS_BIT(rTemp,BIT_EnOUT_ShortACK)) {
			*statusType |= USBD_IF_XFER_STATUS_OUT_SHORTACK;
		}
		if (IS_BIT(rTemp,BIT_EnIN_TranACK)) {
			*statusType |= USBD_IF_XFER_STATUS_IN_ACK;
		}
		if (IS_BIT(rTemp,BIT_EnOUT_TranACK)) {
			*statusType |= USBD_IF_XFER_STATUS_OUT_ACK;
		}
		if (IS_BIT(rTemp,BIT_EnIN_TranNAK)) {
			*statusType |= USBD_IF_XFER_STATUS_IN_NAK;
		}
		if (IS_BIT(rTemp,BIT_EnOUT_TranNAK)) {
			*statusType |= USBD_IF_XFER_STATUS_OUT_NAK;
		}
		if (IS_BIT(rTemp,BIT_EnIN_TranErr)) {
			*statusType |= USBD_IF_XFER_STATUS_IN_STALL;
		}
		if (IS_BIT(rTemp,BIT_EnOUT_TranErr)) {
			*statusType |= USBD_IF_XFER_STATUS_OUT_STALL;
		}
	} while (0);

	return retValue;
}
/* =============================================================================
// Function_Name: USBD_IFEPxSetNotifyPacketXferStatus
// description	: Set notification for interrupt status of Endpoint
// argument		: number		Endpoint number
//				  statusType	The setting value of interrupt for notification
// return		: STATUS_SUCCESS			Finished normally
//				  STATUS_NOT_OPENED			Not be opened yet
//				  STATUS_INVALID_PARAMETER	Parameter error
// flag			:
// global		:
// =============================================================================
*/
LONG USBD_IFEPxSetNotifyPacketXferStatus(UCHAR number,USHORT statusType)
{
	LONG retValue;
	UCHAR rTemp;

	retValue = STATUS_SUCCESS;

	do { /* Don't loop */

		if (number == 0 || number >= MAX_ENDPOINT) {
			/* When Endpoint which can't be set is specified */
			retValue = STATUS_INVALID_PARAMETER;
			break;
		}
		/* Initial value */
		rTemp = 0x00;
		if (IS_BIT(statusType,USBD_IF_XFER_STATUS_OUT_SHORTACK)) {
			/* OUT SHORT ACK */
			SET_BIT(rTemp,BIT_EnOUT_ShortACK);
		}

		if (IS_BIT(statusType,USBD_IF_XFER_STATUS_IN_ACK)) {
			/* IN ACK */
			SET_BIT(rTemp,BIT_EnIN_TranACK);
		}

		if (IS_BIT(statusType,USBD_IF_XFER_STATUS_OUT_ACK)) {
			/* OUT ACK */
			SET_BIT(rTemp,BIT_EnOUT_TranACK);
		}

		if (IS_BIT(statusType,USBD_IF_XFER_STATUS_IN_NAK)) {
			/* IN NAK */
			SET_BIT(rTemp,BIT_EnIN_TranNAK);
		}

		if (IS_BIT(statusType,USBD_IF_XFER_STATUS_OUT_NAK)) {
			/* OUT NAK */
			SET_BIT(rTemp,BIT_EnOUT_TranNAK);
		}

		if (IS_BIT(statusType,USBD_IF_XFER_STATUS_IN_STALL)) {
			/* IN ERROR */
			SET_BIT(rTemp,BIT_EnIN_TranErr);
		}

		if (IS_BIT(statusType,USBD_IF_XFER_STATUS_OUT_STALL)) {
			/* OUT ERROR */
			SET_BIT(rTemp,BIT_EnOUT_TranErr);
		}

#ifdef DEBUG_C
		SET_BIT(rTemp,BIT_EnIN_TranErr);
		SET_BIT(rTemp,BIT_EnOUT_TranErr);
#endif

		RegWrite(REG08_D_EPxIntStat(number - 1),rTemp);	/* Clear interrupt status */
		RegWrite(REG08_D_EPxIntEnb(number - 1),rTemp);	/* Set IntEnb */
	} while (0);

	return retValue;
}
/* =============================================================================
// Function_Name: USBD_IFEPxIsUseDMA
// description	: Return information which means whether DMA can be used in Endpoint
// argument		: number	Endpoint number
//				  result	USBD_IF_EPX_USEDMA		Can be used
//							USBD_IF_EPX_NOT_USEDMA	Can not be used
// return		: STATUS_SUCCESS			Finished normally
//				  STATUS_NOT_OPENED			Not be opened yet
//				  STATUS_INVALID_PARAMETER	Parameter error
// flag			:
// global		:
// =============================================================================
*/
LONG USBD_IFEPxIsUseDMA(UCHAR number,UCHAR *result)
{
	LONG retValue;

	retValue = STATUS_SUCCESS;

	do { /* Don't loop */

		if ((EPxCapabirity[number].type & EPX_CAP_DMA) != 0) {
			/* When DMA transfer is supported in this Endpoint */
			*result = USBD_IF_EPX_USEDMA;
		} else {
			/* When DMA transfer is not supported in this Endpoint */
			*result = USBD_IF_EPX_NOT_USEDMA;
		}

	} while (0);

	return retValue;
}
/* =============================================================================
// Function_Name: USBD_IFSetAutoEnShort(UCHAR dmaCh,UCHAR enable)
// description	: Set AutoEnShort mode for DMA
// argument		: dmaCh		Number of DMA
//				  enable	USBD_IF_ENABLE		Enable
//							USBD_IF_DISABLE		Disable
// return		: STATUS_SUCCESS			Finished normally
//				  STATUS_NOT_OPENED			Not be opened yet
//				  STATUS_INVALID_PARAMETER	Parameter error
// flag			:
// global		:
// =============================================================================
*/
LONG USBD_IFSetAutoEnShort(UCHAR dmaCh,UCHAR enable)
{
	LONG retValue;

	retValue = STATUS_INVALID_PARAMETER;

	do { /* Don't loop */
		if (!(dmaCh == USBD_IF_DMACH1 || dmaCh == USBD_IF_DMACH2)) {
			/* Unable to set */
			break;
		}
		if (!(enable == USBD_IF_ENABLE || enable == USBD_IF_DISABLE)) {
			break;
		}

		if (dmaCh == USBD_IF_DMACH1) {
			RegModify(REG08_D_DMA0_FIFO_Control,MASK_AutoEnShort,enable);
		} else if (dmaCh == USBD_IF_DMACH2) {
			RegModify(REG08_D_DMA1_FIFO_Control,MASK_AutoEnShort,enable);
		}

		retValue = STATUS_SUCCESS;

	} while (0);

	return retValue;
}
/* =============================================================================
// Function_Name: USBD_IFRegisterCBRBusChange
// description	: Register callback for notifying change of VBUS status
// argument		: pfnCallback	Pointer of callback function
// return		: STATUS_SUCCESS			Finished normally
//				  STATUS_NOT_OPENED			Not be opened yet
//				  STATUS_UNABLE_TO_REGISTER	Unable to register
// flag			:
// global		:
// =============================================================================
*/
LONG USBD_IFRegisterCBRBusChange(const CALLBACK_PROC pfnCallback)
{
	LONG retValue;

	retValue = STATUS_SUCCESS;

	do { /* Don't loop */

		if (CallbackTable[CBINF_VBUS] != NULL) {
			/* Unable to register */
			retValue = STATUS_UNABLE_TO_REGISTER;
			break;
		}

		/* Register the callback function */
		CallbackTable[CBINF_VBUS] = pfnCallback;

		/* Enable the interrupt(also clear interrupt status) */
		RegWrite(REG08_DeviceIntStat,BIT_VBUS_Changed);
		CLR_BIT(IntStat[IS_DEVICE_INT_STAT],BIT_VBUS_Changed);
		RegSet(REG08_MainIntEnb,BIT_EnDeviceIntStat);
		RegSet(REG08_DeviceIntEnb,BIT_EnVBUS_Changed);
	} while (0);

	return retValue;
}
/* =============================================================================
// Function_Name: USBD_IFUnregisterCBRBusChange
// description	: Delete callback function which is registered in USBD_IFRegisterCBRBusChange()
// argument		: pfnCallback	Pointer of callback function to delete
// return		: STATUS_SUCCESS			Finished normally
//				  STATUS_NOT_OPENED			Not be opened yet
//				  STATUS_UNREGISTERED		Unable to delete
// flag			:
// global		:
// =============================================================================
*/
LONG USBD_IFUnregisterCBRBusChange(const CALLBACK_PROC pfnCallback)
{
	LONG retValue;

	retValue = STATUS_SUCCESS;

	do { /* Don't loop */
		if (CallbackTable[CBINF_VBUS] == pfnCallback) {
			/* Delete the callback function */
			CallbackTable[CBINF_VBUS] = NULL;
		} else {
			/* Unable to delete */
			retValue = STATUS_UNREGISTERED;
		}
		/* Disable the interrupt(also clear interrupt status) */
		RegWrite(REG08_DeviceIntStat,BIT_VBUS_Changed);			/* VBUS Changed */
		RegClear(REG08_DeviceIntEnb,BIT_EnVBUS_Changed);
	} while (0);

	return retValue;
}
/* =============================================================================
// Function_Name: USBD_IFRegisterCBRDPDMState
// description	: Register callback for notifying change of state of Suspend,Reset,Resume,ChirpCmp,ResumeCmp
// argument		: pfnCallback	Pointer of callback function
// return		: STATUS_SUCCESS			Finished normally
//				  STATUS_NOT_OPENED			Not be opened yet
//				  STATUS_UNABLE_TO_REGISTER	Unable to register
// flag			:
// global		:
// =============================================================================
*/
LONG USBD_IFRegisterCBRDPDMState(const CALLBACK_PROC pfnCallback)
{
	LONG retValue;

	retValue = STATUS_SUCCESS;

	do { /* Don't loop */

		if (CallbackTable[CBINF_DPDM] != NULL) {
			/* Unable to register */
			retValue = STATUS_UNABLE_TO_REGISTER;
			break;
		}

		/* Register the callback function */
		CallbackTable[CBINF_DPDM] = pfnCallback;

		/* Enable the interrupt(also clear interrupt status) */
		RegWrite(REG08_D_SIE_IntStat,BIT_NonJ | BIT_DetectRESET | BIT_DetectSUSPEND | BIT_ChirpCmp | BIT_RestoreCmp);
		CLR_BIT(IntStat[IS_SIE_INT_STAT],BIT_NonJ | BIT_DetectRESET | BIT_DetectSUSPEND | BIT_ChirpCmp | BIT_RestoreCmp);
		RegSet(REG08_MainIntEnb,BIT_EnDeviceIntStat);
		RegSet(REG08_DeviceIntEnb,BIT_EnD_SIE_IntStat);
		RegSet(REG08_D_SIE_IntEnb,BIT_EnDetectRESET);
		RegSet(REG08_D_SIE_IntEnb,BIT_EnDetectSUSPEND);
		RegSet(REG08_D_SIE_IntEnb,BIT_EnChirpCmp);
		RegSet(REG08_D_SIE_IntEnb,BIT_EnRestoreCmp);
	} while (0);

	return retValue;
}
/* =============================================================================
// Function_Name: USBD_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -