📄 usbd_if.c
字号:
}
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 + -