INLINE HAL_USB_CALLBACK_RETURN_T boot_UsbCallbackEp(UINT8 ep, HAL_USB_CALLBACK_EP_TYPE_T type, HAL_USB_SETUP_T* setup) { UINT8 epNum; epNum = HAL_USB_EP_NUM(ep); if(epNum < 16 && epNum != 0) { if(HAL_USB_IS_EP_DIRECTION_IN(ep)) { if(g_BootUsbVar.EpInCallback[epNum-1]) { return(g_BootUsbVar.EpInCallback[epNum-1](type, setup)); } } else { if(g_BootUsbVar.EpOutCallback[epNum-1]) { return(g_BootUsbVar.EpOutCallback[epNum-1](type, setup)); } } } return(HAL_USB_CALLBACK_RETURN_KO); }
PRIVATE VOID boot_UsbFlushTxFifo(UINT8 ep) { UINT8 epNum; epNum = HAL_USB_EP_NUM(ep); hwp_usbc->GRSTCTL &= ~USBC_TXFNUM_MASK; hwp_usbc->GRSTCTL |= USBC_TXFNUM(epNum); hwp_usbc->GRSTCTL |= USBC_TXFFLSH; }
PRIVATE VOID boot_UsbEnableEp(UINT8 ep, HAL_USB_EP_TYPE_T type) { UINT8 epNum; UINT8 offset; REG32* diepctl; REG32* doepctl; REG32* ctl; epNum = HAL_USB_EP_NUM(ep); // Select ctl register if(epNum == 0) { diepctl = &hwp_usbc->DIEPCTL0; doepctl = &hwp_usbc->DOEPCTL0; } else { diepctl = &hwp_usbc->DIEPnCONFIG[epNum-1].DIEPCTL; doepctl = &hwp_usbc->DOEPnCONFIG[epNum-1].DOEPCTL; } // Select direction if(HAL_USB_IS_EP_DIRECTION_IN(ep)) { offset = 0; ctl = diepctl; } else { offset = 16; ctl = doepctl; } /* if(*ctl & USBC_USBACTEP) */ /* { */ if(type == HAL_USB_EP_TYPE_ISO) { *ctl = USBC_EPN_MPS(HAL_USB_MPS) | USBC_EPTYPE(type) | USBC_USBACTEP | USBC_EPTXFNUM(epNum) | USBC_NEXTEP(epNum); } else { *ctl = USBC_EPN_MPS(HAL_USB_MPS) | USBC_EPTYPE(type) | USBC_USBACTEP | USBC_EPTXFNUM(epNum) | USBC_SETD0PID | USBC_NEXTEP(epNum); } /* } */ hwp_usbc->DAINTMSK |= (1<<(epNum+offset)); }
PRIVATE VOID boot_UsbDisableEp(UINT8 ep) { UINT8 epNum; UINT8 offset; REG32* diepctl; REG32* doepctl; REG32* ctl; epNum = HAL_USB_EP_NUM(ep); // Select ctl register if(epNum == 0) { diepctl = &hwp_usbc->DIEPCTL0; doepctl = &hwp_usbc->DOEPCTL0; } else { diepctl = &hwp_usbc->DIEPnCONFIG[epNum-1].DIEPCTL; doepctl = &hwp_usbc->DOEPnCONFIG[epNum-1].DOEPCTL; } // Select direction if(HAL_USB_IS_EP_DIRECTION_IN(ep)) { offset = 0; ctl = diepctl; } else { offset = 16; ctl = doepctl; } if(*ctl & USBC_EPENA) { *ctl = USBC_EPDIS | USBC_SNAK; } else { *ctl = USBC_SNAK; } boot_UsbFlushTxFifo(epNum); boot_UsbCancelTransfert(ep); hwp_usbc->DAINT &= ~(1<<(epNum+offset)); }
PRIVATE VOID boot_UsbCancelTransfert(UINT8 ep) { UINT8 epNum; epNum = HAL_USB_EP_NUM(ep); if(HAL_USB_IS_EP_DIRECTION_IN(ep)) { g_BootUsbVar.InTransfert[epNum].size = 0; } else { g_BootUsbVar.OutTransfert[epNum].size = 0; } }
PRIVATE VOID boot_UsbConfigureEp(HAL_USB_EP_DESCRIPTOR_T* ep) { UINT8 epNum; epNum = HAL_USB_EP_NUM(ep->ep); if(HAL_USB_IS_EP_DIRECTION_IN(ep->ep)) { g_BootUsbVar.EpInCallback[epNum-1] = ep->callback; boot_UsbEnableEp(HAL_USB_EP_DIRECTION_IN(epNum), ep->type); } else { g_BootUsbVar.EpOutCallback[epNum-1] = ep->callback; boot_UsbEnableEp(HAL_USB_EP_DIRECTION_OUT(epNum), ep->type); } }
PUBLIC HAL_USB_EP_DESCRIPTOR_T* hal_UsbDescriptorNewBulkEpDescriptor(UINT8 ep, HAL_USB_CALLBACK_T callback) { UINT8 epNum; HAL_USB_EP_DESCRIPTOR_T* ep_desc; epNum = HAL_USB_EP_NUM(ep); if(epNum >= 16 || epNum == 0) { return 0; } ep_desc = (HAL_USB_EP_DESCRIPTOR_T*) sxr_Malloc(sizeof(HAL_USB_EP_DESCRIPTOR_T)); ep_desc->ep = ep; ep_desc->interval = 0; ep_desc->callback = callback; ep_desc->type = HAL_USB_EP_TYPE_BULK; return ep_desc; }
PRIVATE UINT8 boot_UsbContinueTransfert(UINT8 ep) { UINT8 epNum; REG32* regSize; REG32* regCtl; epNum = HAL_USB_EP_NUM(ep); if(HAL_USB_IS_EP_DIRECTION_IN(ep)) { if(g_BootUsbVar.InTransfert[epNum].size <= 0) { return(1); } if(!(g_BootUsbVar.EpFlag & (1<<epNum))) { if(g_BootUsbVar.InTransfert[epNum].size >= HAL_USB_MPS) { if(epNum == 0) { regSize = &hwp_usbc->DIEPTSIZ0; regCtl = &hwp_usbc->DIEPCTL0; } else { regSize = &hwp_usbc->DIEPnCONFIG[epNum-1].DIEPTSIZ; regCtl = &hwp_usbc->DIEPnCONFIG[epNum-1].DIEPCTL; } *regSize = USBC_IEPXFERSIZE(g_BootUsbVar.InTransfert[epNum].size % HAL_USB_MPS) | USBC_IEPPKTCNT(1); *regCtl |= USBC_EPENA | USBC_CNAK; g_BootUsbVar.InTransfert[epNum].size = 1; return(0); } } g_BootUsbVar.InTransfert[epNum].size = 0; } else { if(g_BootUsbVar.OutTransfert[epNum].size <= 0) { return(1); } if(epNum == 0) { regSize = &hwp_usbc->DOEPTSIZ0; } else { regSize = &hwp_usbc->DOEPnCONFIG[epNum-1].DOEPTSIZ; } g_BootUsbVar.OutTransfert[epNum].size -= GET_BITFIELD(*regSize, USBC_OEPXFERSIZE); g_BootUsbVar.OutTransfert[epNum].size = -g_BootUsbVar.OutTransfert[epNum].size; if(g_BootUsbVar.OutTransfert[epNum].size > 0) { g_BootUsbVar.OutTransfert[epNum].size = 0; } } return(1); }
PRIVATE UINT8 boot_UsbStartTransfert(UINT8 ep, VOID *data, UINT16 size, UINT32 flag) { UINT8 epNum; UINT16 nbPacket; REG32* regDma; REG32* regSize; REG32* regCtl; epNum = HAL_USB_EP_NUM(ep); if(HAL_USB_IS_EP_DIRECTION_IN(ep)) { if(g_BootUsbVar.InTransfert[epNum].size > 0) { return(1); } if(epNum == 0) { regDma = &hwp_usbc->DIEPDMA0; regSize = &hwp_usbc->DIEPTSIZ0; regCtl = &hwp_usbc->DIEPCTL0; } else { regDma = &hwp_usbc->DIEPnCONFIG[epNum-1].DIEPDMA; regSize = &hwp_usbc->DIEPnCONFIG[epNum-1].DIEPTSIZ; regCtl = &hwp_usbc->DIEPnCONFIG[epNum-1].DIEPCTL; } g_BootUsbVar.EpFlag &= ~(1<<epNum); if(flag) { g_BootUsbVar.EpFlag |= 1<<epNum; } if(size < HAL_USB_MPS) { *regSize = USBC_IEPXFERSIZE(size) | USBC_IEPPKTCNT(1); } else { nbPacket = size/HAL_USB_MPS; *regSize = USBC_IEPXFERSIZE(nbPacket*HAL_USB_MPS) | USBC_IEPPKTCNT(nbPacket); } g_BootUsbVar.InTransfert[epNum].size = size; } // Out else { if(g_BootUsbVar.OutTransfert[epNum].size > 0) { return(1); } g_BootUsbVar.OutTransfert[epNum].size = size; if(epNum == 0) { regDma = &hwp_usbc->DOEPDMA0; regSize = &hwp_usbc->DOEPTSIZ0; regCtl = &hwp_usbc->DOEPCTL0; } else { regDma = &hwp_usbc->DOEPnCONFIG[epNum-1].DOEPDMA; regSize = &hwp_usbc->DOEPnCONFIG[epNum-1].DOEPTSIZ; regCtl = &hwp_usbc->DOEPnCONFIG[epNum-1].DOEPCTL; } *regSize = USBC_OEPXFERSIZE(size) | USBC_OEPPKTCNT(size/HAL_USB_MPS); } *regDma = (REG32) data; *regCtl |= USBC_EPENA | USBC_CNAK; return(0); }