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