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

📄 usbd_if.c

📁 epson usb2.0 控制芯片 S1R72V05 固件程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
		}

		if (!(enable == USBD_IF_ENABLE || enable == USBD_IF_DISABLE)) {
			/* When argument is wrong */
			retValue = STATUS_INVALID_PARAMETER;
			break;
		}

		if (number == USBD_IF_EP0_IN) {
			rTemp = RegRead(REG08_D_EP0ControlIN);
		} else if (number == USBD_IF_EP0_OUT) {
			rTemp = RegRead(REG08_D_EP0ControlOUT);
		} else {
			rTemp = RegRead(REG08_D_EPxControl(number - 1));
		}
		if (enable == USBD_IF_ENABLE) {
			SET_BIT(rTemp,BIT_ForceNAK);
		} else {
			CLR_BIT(rTemp,BIT_ForceNAK);
		}

		if (number == USBD_IF_EP0_IN) {
			RegWrite(REG08_D_EP0ControlIN,rTemp);
		} else if (number == USBD_IF_EP0_OUT) {
			RegWrite(REG08_D_EP0ControlOUT,rTemp);
		} else {
			rTemp2 = RegRead(REG08_D_EPxControl(number - 1));
			RegWrite(REG08_D_EPxControl(number - 1),rTemp);
			bCpuState = OS_SnsLoc();
			if (bCpuState != OS_TRUE ) {
				/* If CPU has not been locked, lock it */
				OS_LocCpu();
			}
			do {
				rTemp = RegRead(REG08_D_EPxControl(number - 1));
				if (enable == USBD_IF_DISABLE) {
					/* Process for waiting until ForceNAK be cleared */
					if (IS_BIT(rTemp,BIT_ForceNAK) == FALSE) {
						break;
					}
					/*
					 * Because ForceNAK will be set automatically after receiving ShortPacket,
					 * so wait for toggle be refreshed here
					 */
					rTemp = RegRead(REG08_D_EPxControl(number - 1));
					if ((rTemp & BIT_ToggleStat_ToggleSet) != (rTemp2 & BIT_ToggleStat_ToggleSet)) {
						break;
					}
				} else {
					/* Process for waiting until ForceNAK be set */
					if (IS_BIT(rTemp,BIT_ForceNAK) == TRUE) {
						break;
					}
				}
			} while (1);
			if (bCpuState != OS_TRUE ) {
				/* If CPU has been locked, release it */
				OS_UnlCpu();
			}
		}
	} while (0);

	return retValue;
}
/* =============================================================================
// Function_Name: USBD_IFGetEPxShortPktEnable
// description	: Get setting of Enable/Disable for transfer of short packet
// argument		: number	Endpoint number
//				  enable	Pointer to return status
// return		: STATUS_SUCCESS			Finished normally
//				  STATUS_NOT_OPENED			Not be opened yet
//				  STATUS_INVALID_PARAMETER	Parameter error
// flag			:
// global		:
// =============================================================================
*/
LONG USBD_IFGetEPxShortPktEnable(UCHAR number,UCHAR *enable)
{
	LONG retValue;
	UCHAR rTemp;

	retValue = STATUS_SUCCESS;

	do { /* Don't loop */

		if ((number & 0x7F) >= MAX_ENDPOINT) {
			retValue = STATUS_INVALID_PARAMETER;
			break;
		}
		if (number == 0) {
			retValue = STATUS_INVALID_PARAMETER;
			break;
		}

		*enable = USBD_IF_DISABLE;
		if (number == USBD_IF_EP0_IN) {
			rTemp = RegRead(REG08_D_EP0ControlIN);
		} else if (number == USBD_IF_EP0_OUT) {
			rTemp = RegRead(REG08_D_EP0ControlOUT);
		} else {
			rTemp = RegRead(REG08_D_EPxControl(number - 1));
		}

		if (IS_BIT(rTemp,BIT_EnShortPkt)) {
			*enable = USBD_IF_ENABLE;
		}

	} while (0);

	return retValue;
}
/* =============================================================================
// Function_Name: USBD_IFSetEPxShortPktEnable
// description	: Set the Enable/Disable for transfer of short packet
// argument		: number	Endpoint number
//				  enable	Status to be set
//				  forceNAK	Specify the setting of ForceNAK
//				  nakEnable	Specify Enable/Disable of ForceNAK
// return		: STATUS_SUCCESS			Finished normally
//				  STATUS_NOT_OPENED			Not be opened yet
//				  STATUS_INVALID_PARAMETER	Parameter error
// flag			:
// global		:
// =============================================================================
*/
LONG USBD_IFSetEPxShortPktEnable(UCHAR number,UCHAR enable,UCHAR forceNAK,UCHAR nakEnable)
{
	LONG retValue;
	UCHAR rTemp,rTemp2;
	OS_BOOL bCpuState;	// State of CPU lock
	retValue = STATUS_SUCCESS;

	do { /* Don't loop */
		if (number == 0x00 || ((number != 0x80) && number >= MAX_ENDPOINT)) {
			/* When Endpoint doesn't exist */
			retValue = STATUS_INVALID_PARAMETER;
			break;
		}

		if ((number & 0x7F) > 0x00 && (RegRead(REG08_D_EPxConfig_0(number - 1)) & MASK_INxOUT) == BIT_INxOUT_OUT) {
			retValue = STATUS_INVALID_PARAMETER;
			break;
		}

		if (!(enable == USBD_IF_ENABLE || enable == USBD_IF_DISABLE)) {
			/* When argument is wrong */
			retValue = STATUS_INVALID_PARAMETER;
			break;
		}

		if (number == USBD_IF_EP0_IN) {
			rTemp = RegRead(REG08_D_EP0ControlIN);
		} else {
			rTemp = RegRead(REG08_D_EPxControl(number - 1));
		}

		if (enable == USBD_IF_ENABLE) {
			SET_BIT(rTemp,BIT_EnShortPkt);
		} else {
			CLR_BIT(rTemp,BIT_EnShortPkt);
		}
		if (forceNAK == USBD_IF_ENABLE) {
			if (nakEnable == USBD_IF_ENABLE) {
				SET_BIT(rTemp,BIT_ForceNAK);
			} else {
				CLR_BIT(rTemp,BIT_ForceNAK);
			}
		}
		if (number == USBD_IF_EP0_IN) {
			RegWrite(REG08_D_EP0ControlIN,rTemp);
		} else {
			rTemp2 = RegRead(REG08_D_EPxControl(number - 1));
			RegWrite(REG08_D_EPxControl(number - 1),rTemp);
			if (forceNAK == USBD_IF_ENABLE) {
				/* Do following process when ForceNAK has been changed */
				bCpuState = OS_SnsLoc();
				if (bCpuState != OS_TRUE ) {
					/* If CPU has not been locked, lock it */
					OS_LocCpu();
				}
				do {
					rTemp = RegRead(REG08_D_EPxControl(number - 1));
					if (nakEnable == USBD_IF_DISABLE) {
						/* Process for waiting until ForceNAK be cleared */
						if (IS_BIT(rTemp,BIT_ForceNAK) == FALSE) {
							break;
						}
						/*
						 * Because ForceNAK will be set automatically after receiving ShortPacket,
						 * so wait for toggle be refreshed here
						 */
						rTemp = RegRead(REG08_D_EPxControl(number - 1));
						if ((rTemp & BIT_ToggleStat_ToggleSet) != (rTemp2 & BIT_ToggleStat_ToggleSet)) {
							break;
						}
					} else {
						/* Process for waiting until ForceNAK be set */
						if (IS_BIT(rTemp,BIT_ForceNAK) == TRUE) {
							break;
						}
					}
				} while (1);
				if (bCpuState != OS_TRUE ) {
					/* If CPU has been locked, release it */
					OS_UnlCpu();
				}
			}
		}
	} while (0);

	return retValue;
}
/* =============================================================================
// Function_Name: USBD_IFGetEPxForceStallEnable
// description	: Return the setting for STALL reply of Endpoint
// argument		: number	Endpoint number
//				  enable	Pointer to return status
// return		: STATUS_SUCCESS			Finished normally
//				  STATUS_NOT_OPENED			Not be opened yet
//				  STATUS_INVALID_PARAMETER	Parameter error
// flag			:
// global		:
// =============================================================================
*/
LONG USBD_IFGetEPxForceStallEnable(UCHAR number,UCHAR *enable)
{
	LONG retValue;
	UCHAR rTemp;

	retValue = STATUS_SUCCESS;

	do { /* Don't loop */

		if ((number != 0x80 && number >= MAX_ENDPOINT)) {
			retValue = STATUS_INVALID_PARAMETER;
			break;
		}
		if (number == USBD_IF_EP0_IN) {
			rTemp = RegRead(REG08_D_EP0ControlIN);
		} else if (number == USBD_IF_EP0_OUT) {
			rTemp = RegRead(REG08_D_EP0ControlOUT);
		} else {
			rTemp = RegRead(REG08_D_EPxControl(number - 1));
		}

		*enable = USBD_IF_DISABLE;
		if (IS_BIT(rTemp,BIT_ForceSTALL)) {
			*enable = USBD_IF_ENABLE;
		}

	} while (0);

	return retValue;
}
/* =============================================================================
// Function_Name: USBD_IFSetEPxForceStallEnable
// description	: Set STALL reply of Endpoint
// argument		: number	Endpoint number
//				  enable	Status to be set
// return		: STATUS_SUCCESS			Finished normally
//				  STATUS_NOT_OPENED			Not be opened yet
//				  STATUS_INVALID_PARAMETER	Parameter error
// flag			:
// global		:
// =============================================================================
*/
LONG USBD_IFSetEPxForceStallEnable(UCHAR number,UCHAR enable)
{
	LONG retValue;
	UCHAR rTemp;

	retValue = STATUS_SUCCESS;

	do { /* Don't loop */

		if ((number & 0x7F) >= MAX_ENDPOINT) {
			/* When Endpoint doesn't exist */
			retValue = STATUS_INVALID_PARAMETER;
			break;
		}

		if (!(enable == USBD_IF_ENABLE || enable == USBD_IF_DISABLE)) {
			/* When argument is wrong */
			retValue = STATUS_INVALID_PARAMETER;
			break;
		}

		if (number == USBD_IF_EP0_IN) {
			rTemp = RegRead(REG08_D_EP0ControlIN);
		} else if (number == USBD_IF_EP0_OUT) {
			rTemp = RegRead(REG08_D_EP0ControlOUT);
		} else {
			rTemp = RegRead(REG08_D_EPxControl(number - 1));
		}
		if (enable == USBD_IF_ENABLE) {
			SET_BIT(rTemp,BIT_ForceSTALL);
		} else {
			CLR_BIT(rTemp,BIT_ForceSTALL);
		}

		if (number == USBD_IF_EP0_IN) {
			RegWrite(REG08_D_EP0ControlIN,rTemp);
		} else if (number == USBD_IF_EP0_OUT) {
			RegWrite(REG08_D_EP0ControlOUT,rTemp);
		} else {
			RegWrite(REG08_D_EPxControl(number - 1),rTemp);
		}

	} while (0);

	return retValue;
}
/* =============================================================================
// Function_Name: USBD_IFGetDataToggle
// description	: Return status of Toggle bit of Endpoint
// argument		: number	Endpoint number
//				  toggle	Pointer to return status of Toggle bit
// return		: STATUS_SUCCESS			Finished normally
//				  STATUS_NOT_OPENED			Not be opened yet
//				  STATUS_INVALID_PARAMETER	Parameter error
// flag			:
// global		:
// =============================================================================
*/
LONG USBD_IFGetDataToggle(UCHAR number,UCHAR *toggle)
{
	LONG retValue;
	UCHAR rTemp;

	retValue = STATUS_SUCCESS;

	do { /* Don't loop */

		if ((number & 0x7F) >= MAX_ENDPOINT) {
			retValue = STATUS_INVALID_PARAMETER;
			break;
		}


		if (number == USBD_IF_EP0_IN) {
			rTemp = RegRead(REG08_D_EP0ControlIN);
		} else if (number == USBD_IF_EP0_OUT) {
			rTemp = RegRead(REG08_D_EP0ControlOUT);
		} else {
			rTemp = RegRead(REG08_D_EPxControl(number - 1));
		}
		*toggle = 0;
		if (IS_BIT(rTemp,BIT_ToggleStat_ToggleSet)) {
			*toggle = 1;
		}
	} while (0);

	return retValue;
}
/* =============================================================================
// Function_Name: USBD_IFSetDataToggle
// description	: Set status of Toggle bit of Endpoint
// argument		: number	Endpoint number
//				  toggle	Status to be set
// return		: STATUS_SUCCESS			Finished normally
//				  STATUS_NOT_OPENED			Not be opened yet
//				  STATUS_INVALID_PARAMETER	Parameter error
// flag			:
// global		:
// =============================================================================
*/
LONG USBD_IFSetDataToggle(UCHAR number,UCHAR toggle)
{
	LONG retValue;
	UCHAR rTemp;

	retValue = STATUS_SUCCESS;

	do { /* Don't loop */

		if ((number & 0x7F) >= MAX_ENDPOINT) {
			/* When Endpoint doesn't exist */
			retValue = STATUS_INVALID_PARAMETER;
			break;
		}

		if (!(toggle == USBD_IF_ENABLE || toggle == USBD_IF_DISABLE)) {
			/* When argument is wrong */
			retValue = STATUS_INVALID_PARAMETER;
			break;
		}

		if (number == USBD_IF_EP0_IN) {
			rTemp = RegRead(REG08_D_EP0ControlIN);
		} else if (number == USBD_IF_EP0_OUT) {
			rTemp = RegRead(REG08_D_EP0ControlOUT);
		} else {
			rTemp = RegRead(REG08_D_EPxControl(number - 1));
		}
		if (toggle == USBD_IF_ENABLE) {
			SET_BIT(rTemp,BIT_ToggleSet);
		} else {
			SET_BIT(rTemp,BIT_ToggleClr);
		}

		if (number == USBD_IF_EP0_IN) {
			RegWrite(REG08_D_EP0ControlIN,rTemp);
		} else if (number == USBD_IF_EP0_OUT) {
			RegWrite(REG08_D_EP0ControlOUT,rTemp);
		} else {
			RegWrite(REG08_D_EPxControl(number - 1),rTemp);
		}
	} while (0);

	return retValue;
}
/* =============================================================================
// Function_Name: USBD_IFEP0GetNotifyPacketXferStatus
// description	: Return the setting of notification for interrupt status of EP0
// argument		: statusType	Pointer to return the setting of notification
// return		: STATUS_SUCCESS			Finished normally
//				  STATUS_NOT_OPENED			Not be opened yet
// flag			:
// global		:
// =============================================================================

⌨️ 快捷键说明

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