Mouse code for the MacroRat
Diff: mbed-dev/targets/TARGET_NUVOTON/TARGET_NUC472/device/StdDriver/nuc472_usbd.h
- Revision:
- 18:6a4db94011d3
diff -r f713758f6238 -r 6a4db94011d3 mbed-dev/targets/TARGET_NUVOTON/TARGET_NUC472/device/StdDriver/nuc472_usbd.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-dev/targets/TARGET_NUVOTON/TARGET_NUC472/device/StdDriver/nuc472_usbd.h Sun May 14 23:18:57 2017 +0000 @@ -0,0 +1,395 @@ +/**************************************************************************//** + * @file usbd.h + * @version V1.00 + * $Revision: 21 $ + * $Date: 14/10/06 1:29p $ + * @brief NUC472/NUC442 USBD driver header file + * + * @note + * Copyright (C) 2014 Nuvoton Technology Corp. All rights reserved. + *****************************************************************************/ +#ifndef __USBD_H__ +#define __USBD_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** @addtogroup NUC472_442_Device_Driver NUC472/NUC442 Device Driver + @{ +*/ + +/** @addtogroup NUC472_442_USBD_Driver USBD Driver + @{ +*/ + +/** @addtogroup NUC472_442_USBD_EXPORTED_CONSTANTS USBD Exported Constants + @{ +*/ +/// @cond HIDDEN_SYMBOLS +#define USBD_MAX_EP 12 + +#define Maximum(a,b) (a)>(b) ? (a) : (b) +#define Minimum(a,b) (a)<(b) ? (a) : (b) + + +#define CEP 0xff /*!< Control Endpoint \hideinitializer */ +#define EPA 0 /*!< Endpoint A \hideinitializer */ +#define EPB 1 /*!< Endpoint B \hideinitializer */ +#define EPC 2 /*!< Endpoint C \hideinitializer */ +#define EPD 3 /*!< Endpoint D \hideinitializer */ +#define EPE 4 /*!< Endpoint E \hideinitializer */ +#define EPF 5 /*!< Endpoint F \hideinitializer */ +#define EPG 6 /*!< Endpoint G \hideinitializer */ +#define EPH 7 /*!< Endpoint H \hideinitializer */ +#define EPI 8 /*!< Endpoint I \hideinitializer */ +#define EPJ 9 /*!< Endpoint J \hideinitializer */ +#define EPK 10 /*!< Endpoint K \hideinitializer */ +#define EPL 11 /*!< Endpoint L \hideinitializer */ + +/* USB Request Type */ +#define REQ_STANDARD 0x00 +#define REQ_CLASS 0x20 +#define REQ_VENDOR 0x40 + +/* USB Standard Request */ +#define USBD_GET_STATUS 0x00 +#define USBD_CLEAR_FEATURE 0x01 +#define USBD_SET_FEATURE 0x03 +#define USBD_SET_ADDRESS 0x05 +#define USBD_GET_DESCRIPTOR 0x06 +#define USBD_SET_DESCRIPTOR 0x07 +#define USBD_GET_CONFIGURATION 0x08 +#define USBD_SET_CONFIGURATION 0x09 +#define USBD_GET_INTERFACE 0x0A +#define USBD_SET_INTERFACE 0x0B +#define USBD_SYNC_FRAME 0x0C + +/* USB Descriptor Type */ +#define DESC_DEVICE 0x01 +#define DESC_CONFIG 0x02 +#define DESC_STRING 0x03 +#define DESC_INTERFACE 0x04 +#define DESC_ENDPOINT 0x05 +#define DESC_QUALIFIER 0x06 +#define DESC_OTHERSPEED 0x07 +#define DESC_IFPOWER 0x08 +#define DESC_OTG 0x09 + +/* USB HID Descriptor Type */ +#define DESC_HID 0x21 +#define DESC_HID_RPT 0x22 + +/* USB Descriptor Length */ +#define LEN_DEVICE 18 +#define LEN_QUALIFIER 10 +#define LEN_CONFIG 9 +#define LEN_INTERFACE 9 +#define LEN_ENDPOINT 7 +#define LEN_OTG 5 +#define LEN_HID 9 + +/* USB Endpoint Type */ +#define EP_ISO 0x01 +#define EP_BULK 0x02 +#define EP_INT 0x03 + +#define EP_INPUT 0x80 +#define EP_OUTPUT 0x00 + +/* USB Feature Selector */ +#define FEATURE_DEVICE_REMOTE_WAKEUP 0x01 +#define FEATURE_ENDPOINT_HALT 0x00 +/// @endcond HIDDEN_SYMBOLS +/********************* Bit definition of CEPCTL register **********************/ +#define USB_CEPCTL_NAKCLR ((uint32_t)0x00000000) /*!<NAK clear \hideinitializer */ +#define USB_CEPCTL_STALL ((uint32_t)0x00000002) /*!<Stall \hideinitializer */ +#define USB_CEPCTL_ZEROLEN ((uint32_t)0x00000004) /*!<Zero length packet \hideinitializer */ +#define USB_CEPCTL_FLUSH ((uint32_t)0x00000008) /*!<CEP flush \hideinitializer */ + +/********************* Bit definition of EPxRSPCTL register **********************/ +#define USB_EP_RSPCTL_FLUSH ((uint32_t)0x00000001) /*!<Buffer Flush \hideinitializer */ +#define USB_EP_RSPCTL_MODE_AUTO ((uint32_t)0x00000000) /*!<Auto-Validate Mode \hideinitializer */ +#define USB_EP_RSPCTL_MODE_MANUAL ((uint32_t)0x00000002) /*!<Manual-Validate Mode \hideinitializer */ +#define USB_EP_RSPCTL_MODE_FLY ((uint32_t)0x00000004) /*!<Fly Mode \hideinitializer */ +#define USB_EP_RSPCTL_MODE_MASK ((uint32_t)0x00000006) /*!<Mode Mask \hideinitializer */ +#define USB_EP_RSPCTL_TOGGLE ((uint32_t)0x00000008) /*!<Clear Toggle bit \hideinitializer */ +#define USB_EP_RSPCTL_HALT ((uint32_t)0x00000010) /*!<Endpoint halt \hideinitializer */ +#define USB_EP_RSPCTL_ZEROLEN ((uint32_t)0x00000020) /*!<Zero length packet IN \hideinitializer */ +#define USB_EP_RSPCTL_SHORTTXEN ((uint32_t)0x00000040) /*!<Packet end \hideinitializer */ +#define USB_EP_RSPCTL_DISBUF ((uint32_t)0x00000080) /*!<Disable buffer \hideinitializer */ + +/********************* Bit definition of EPxCFG register **********************/ +#define USB_EP_CFG_VALID ((uint32_t)0x00000001) /*!<Endpoint Valid \hideinitializer */ +#define USB_EP_CFG_TYPE_BULK ((uint32_t)0x00000002) /*!<Endpoint type - bulk \hideinitializer */ +#define USB_EP_CFG_TYPE_INT ((uint32_t)0x00000004) /*!<Endpoint type - interrupt \hideinitializer */ +#define USB_EP_CFG_TYPE_ISO ((uint32_t)0x00000006) /*!<Endpoint type - isochronous \hideinitializer */ +#define USB_EP_CFG_TYPE_MASK ((uint32_t)0x00000006) /*!<Endpoint type mask \hideinitializer */ +#define USB_EP_CFG_DIR_OUT ((uint32_t)0x00000000) /*!<OUT endpoint \hideinitializer */ +#define USB_EP_CFG_DIR_IN ((uint32_t)0x00000008) /*!<IN endpoint \hideinitializer */ + + +/*@}*/ /* end of group NUC472_442_USBD_EXPORTED_CONSTANTS */ + +/** @addtogroup NUC472_442_USBD_EXPORTED_STRUCT USBD Exported Struct + @{ +*/ + + +typedef struct USBD_CMD_STRUCT { + uint8_t bmRequestType; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; + +} S_USBD_CMD_T; /*!<USB Setup Packet Structure */ + + + + +typedef struct s_usbd_info { + uint8_t *gu8DevDesc; + uint8_t *gu8ConfigDesc; + uint8_t *gu8StrLangDesc; + uint8_t *gu8StrVendorDesc; + uint8_t *gu8StrProductDesc; + uint8_t *gu8QualDesc; + uint8_t *gu8OtherConfigDesc; + uint8_t *gu8HidReportDesc[3]; + uint32_t gu32HidReportSize[3]; + +} S_USBD_INFO_T; /*!<USB Information Structure */ + + +/*@}*/ /* end of group NUC472_442_USBD_EXPORTED_STRUCT */ + +/// @cond HIDDEN_SYMBOLS +extern uint32_t volatile g_usbd_DmaDone; +extern uint32_t g_usbd_UsbAddr; +extern uint32_t g_usbd_CtrlInSize; +extern uint32_t g_usbd_ShortPacket; +extern uint32_t g_usbd_CtrlZero; +extern uint8_t g_usbd_EpHalt[]; +extern S_USBD_INFO_T gsInfo; +extern S_USBD_CMD_T gUsbCmd; +extern uint32_t g_usbd_Configured; +/// @endcond /* HIDDEN_SYMBOLS */ + +/** @addtogroup NUC472_442_USBD_EXPORTED_MACROS USBD Exported Macros + @{ +*/ + +#define USBD_ENABLE_USB() ((uint32_t)(USBD->PHYCTL |= (USBD_PHYCTL_PHYEN_Msk|USBD_PHYCTL_DPPUEN_Msk))) /*!<Enable USB \hideinitializer */ +#define USBD_DISABLE_USB() ((uint32_t)(USBD->PHYCTL &= ~USBD_PHYCTL_DPPUEN_Msk)) /*!<Disable USB \hideinitializer */ +#define USBD_ENABLE_PHY() ((uint32_t)(USBD->PHYCTL |= USBD_PHYCTL_PHYEN_Msk)) /*!<Enable PHY \hideinitializer */ +#define USBD_DISABLE_PHY() ((uint32_t)(USBD->PHYCTL &= ~USBD_PHYCTL_PHYEN_Msk)) /*!<Disable PHY \hideinitializer */ +#define USBD_SET_SE0() ((uint32_t)(USBD->PHYCTL &= ~USBD_PHYCTL_DPPUEN_Msk)) /*!<Enable SE0, Force USB PHY Transceiver to Drive SE0 \hideinitializer */ +#define USBD_CLR_SE0() ((uint32_t)(USBD->PHYCTL |= USBD_PHYCTL_DPPUEN_Msk)) /*!<Disable SE0 \hideinitializer */ +#define USBD_SET_ADDR(addr) (USBD->FADDR = (addr)) /*!<Set USB address \hideinitializer */ +#define USBD_GET_ADDR() ((uint32_t)(USBD->FADDR)) /*!<Get USB address \hideinitializer */ +#define USBD_ENABLE_USB_INT(intr) (USBD->GINTEN = (intr)) /*!<Enable USB Interrupt \hideinitializer */ +#define USBD_ENABLE_BUS_INT(intr) (USBD->BUSINTEN = (intr)) /*!<Enable BUS Interrupt \hideinitializer */ +#define USBD_GET_BUS_INT_FLAG() (USBD->BUSINTSTS) /*!<Clear Bus interrupt flag \hideinitializer */ +#define USBD_CLR_BUS_INT_FLAG(flag) (USBD->BUSINTSTS = flag) /*!<Clear Bus interrupt flag \hideinitializer */ +#define USBD_ENABLE_CEP_INT(intr) (USBD->CEPINTEN = (intr)) /*!<Enable CEP Interrupt \hideinitializer */ +#define USBD_CLR_CEP_INT_FLAG(flag) (USBD->CEPINTSTS = flag) /*!<Clear CEP interrupt flag \hideinitializer */ +#define USBD_SET_CEP_STATE(flag) (USBD->CEPCTL = flag) /*!<Set CEP state \hideinitializer */ +#define USBD_START_CEP_IN(size) (USBD->CEPTXCNT = size) /*!<Start CEP IN Transfer \hideinitializer */ +#define USBD_SET_MAX_PAYLOAD(ep, size) (*((__IO uint32_t *) ((uint32_t)&USBD->EPAMPS + (uint32_t)((ep)*0x28))) = (size)) /*!<Set EPx Maximum Packet Size \hideinitializer */ +#define USBD_ENABLE_EP_INT(ep, intr) (*((__IO uint32_t *) ((uint32_t)&USBD->EPAINTEN + (uint32_t)((ep)*0x28))) = (intr)) /*!<Enable EPx Interrupt \hideinitializer */ +#define USBD_GET_EP_INT_FLAG(ep) (*((__IO uint32_t *) ((uint32_t)&USBD->EPAINTSTS + (uint32_t)((ep)*0x28)))) /*!<Get EPx interrupt flag \hideinitializer */ +#define USBD_CLR_EP_INT_FLAG(ep, flag) (*((__IO uint32_t *) ((uint32_t)&USBD->EPAINTSTS + (uint32_t)((ep)*0x28))) = (flag)) /*!<Clear EPx interrupt flag \hideinitializer */ +#define USBD_SET_DMA_LEN(len) (USBD->DMACNT = len) /*!<Set DMA transfer length \hideinitializer */ +#define USBD_SET_DMA_ADDR(addr) (USBD->DMAADDR = addr) /*!<Set DMA transfer address \hideinitializer */ +#define USBD_SET_DMA_READ(epnum) (USBD->DMACTL = (USBD->DMACTL & ~USBD_DMACTL_EPNUM_Msk) | USBD_DMACTL_DMARD_Msk | epnum) /*!<Set DMA transfer type to read \hideinitializer */ +#define USBD_SET_DMA_WRITE(epnum) (USBD->DMACTL = (USBD->DMACTL & ~(USBD_DMACTL_EPNUM_Msk | USBD_DMACTL_DMARD_Msk)) | epnum) /*!<Set DMA transfer type to write \hideinitializer */ +#define USBD_ENABLE_DMA() (USBD->DMACTL |= USBD_DMACTL_DMAEN_Msk) /*!<Enable DMA transfer \hideinitializer */ +#define USBD_IS_ATTACHED() ((uint32_t)(USBD->PHYCTL & USBD_PHYCTL_VBUSDET_Msk)) /*!<Check cable connect state \hideinitializer */ + + +/*@}*/ /* end of group NUC472_442_USBD_EXPORTED_MACROS */ + +/** @addtogroup NUC472_442_USBD_EXPORTED_FUNCTIONS USBD Exported Functions + @{ +*/ +/** + * @brief USBD_memcpy, Copy bytes hardware limitation + * @param[in] u8Dst Destination pointer. + * @param[in] u8Src Source pointer. + * @param[in] i32Size Copy size. + * @retval None. + */ +static __INLINE void USBD_MemCopy(uint8_t *u8Dst, uint8_t *u8Src, int32_t i32Size) +{ + while (i32Size--) *u8Dst++ = *u8Src++; +} + +/** + * @brief USBD_ResetDMA + * @param None + * @retval None. + */ +static __INLINE void USBD_ResetDMA(void) +{ + USBD->DMACNT = 0; + USBD->DMACTL = 0x80; + USBD->DMACTL = 0x00; +} +/** + * @brief USBD_SetEpBufAddr, Set Endpoint buffer address + * @param[in] u32Ep Endpoint Number + * @param[in] u32Base Buffer Start Address + * @param[in] u32Len Buffer length + * @retval None. + */ +static __INLINE void USBD_SetEpBufAddr(uint32_t u32Ep, uint32_t u32Base, uint32_t u32Len) +{ + if (u32Ep == CEP) { + USBD->CEPBUFSTART = u32Base; + USBD->CEPBUFEND = u32Base + u32Len - 1; + } else { + *((__IO uint32_t *) ((uint32_t)&USBD->EPABUFSTART + (uint32_t)(u32Ep*0x28))) = u32Base; + *((__IO uint32_t *) ((uint32_t)&USBD->EPABUFEND + (uint32_t)(u32Ep*0x28))) = u32Base + u32Len - 1; + } +} + +/** + * @brief USBD_ConfigEp, Config Endpoint + * @param[in] u32Ep USB endpoint + * @param[in] u32EpNum Endpoint number + * @param[in] u32EpType Endpoint type + * @param[in] u32EpDir Endpoint direction + * @retval None. + */ +static __INLINE void USBD_ConfigEp(uint32_t u32Ep, uint32_t u32EpNum, uint32_t u32EpType, uint32_t u32EpDir) +{ + if (u32EpType == USB_EP_CFG_TYPE_BULK) + *((__IO uint32_t *)((uint32_t)&USBD->EPARSPCTL+(uint32_t)(u32Ep*0x28)))=(USB_EP_RSPCTL_FLUSH|USB_EP_RSPCTL_MODE_AUTO); + else if (u32EpType == USB_EP_CFG_TYPE_INT) + *((__IO uint32_t *)((uint32_t)&USBD->EPARSPCTL+(uint32_t)(u32Ep*0x28)))=(USB_EP_RSPCTL_FLUSH|USB_EP_RSPCTL_MODE_MANUAL); + else if (u32EpType == USB_EP_CFG_TYPE_ISO) + *((__IO uint32_t *)((uint32_t)&USBD->EPARSPCTL+(uint32_t)(u32Ep*0x28)))=(USB_EP_RSPCTL_FLUSH|USB_EP_RSPCTL_MODE_FLY); + + *((__IO uint32_t *)((uint32_t)&USBD->EPACFG+(uint32_t)(u32Ep*0x28)))=(u32EpType|u32EpDir|USB_EP_CFG_VALID|(u32EpNum << 4)); +} + +/** + * @brief Set USB endpoint stall state + * + * @param[in] u32Ep USB endpoint + * @return None + * + * @details Set USB endpoint stall state, endpoint will return STALL token. + */ +static __INLINE void USBD_SetStall(uint32_t u32Ep) +{ + uint32_t u32CfgAddr; + uint32_t u32Cfg; + int i; + + if (u32Ep == 0) + USBD_SET_CEP_STATE(USB_CEPCTL_STALL); + else { + for (i=0; i<USBD_MAX_EP; i++) { + u32CfgAddr = (uint32_t)&USBD->EPACFG + (uint32_t)(i * 0x28); + u32Cfg = *((__IO uint32_t *) (u32CfgAddr)); + + if (((u32Cfg & 0xf0) >> 4) == u32Ep) + { + u32CfgAddr = (uint32_t)&USBD->EPARSPCTL + (uint32_t)(i * 0x28); + u32Cfg = *((__IO uint32_t *) (u32CfgAddr)) & 0xf7; /* avoid clear TOGGLE bit */ + *((__IO uint32_t *) (u32CfgAddr)) = (u32Cfg | USB_EP_RSPCTL_HALT); + } + } + } +} + +/** + * @brief Clear USB endpoint stall state + * + * @param[in] u32Ep USB endpoint + * @return None + * + * @details Clear USB endpoint stall state, endpoint will return ACK/NAK token. + */ +static __INLINE void USBD_ClearStall(uint32_t u32Ep) +{ + uint32_t u32CfgAddr; + uint32_t u32Cfg; + int i; + + for (i=0; i<USBD_MAX_EP; i++) { + u32CfgAddr = (uint32_t)&USBD->EPACFG + (uint32_t)(i * 0x28); + u32Cfg = *((__IO uint32_t *) (u32CfgAddr)); + + if (((u32Cfg & 0xf0) >> 4) == u32Ep) + { + u32CfgAddr = (uint32_t)&USBD->EPARSPCTL + (uint32_t)(i * 0x28); + *((__IO uint32_t *) (u32CfgAddr)) = USB_EP_RSPCTL_TOGGLE; + } + } +} + +/** + * @brief Get USB endpoint stall state + * + * @param[in] u32Ep USB endpoint + * @retval 0: USB endpoint is not stalled. + * @retval non-0: USB endpoint is stalled. + * + * @details Get USB endpoint stall state. + */ +static __INLINE uint32_t USBD_GetStall(uint32_t u32Ep) +{ + uint32_t u32CfgAddr; + uint32_t u32Cfg; + int i; + + for (i=0; i<USBD_MAX_EP; i++) { + u32CfgAddr = (uint32_t)&USBD->EPACFG + (uint32_t)(i * 0x28); + u32Cfg = *((__IO uint32_t *) (u32CfgAddr)); + + if (((u32Cfg & 0xf0) >> 4) == u32Ep) + { + u32CfgAddr = (uint32_t)&USBD->EPARSPCTL + (uint32_t)(i * 0x28); + return ((*((__IO uint32_t *) (u32CfgAddr))) & USB_EP_RSPCTL_HALT); + } + } + return 0; +} + + +/*-------------------------------------------------------------------------------------------*/ +typedef void (*VENDOR_REQ)(void); /*!<USB Vendor request callback function */ +typedef void (*CLASS_REQ)(void); /*!<USB Class request callback function */ +typedef void (*SET_INTERFACE_REQ)(uint32_t u32AltInterface); /*!<USB Standard request "Set Interface" callback function */ + +void USBD_Open(S_USBD_INFO_T *param, CLASS_REQ pfnClassReq, SET_INTERFACE_REQ pfnSetInterface); +void USBD_Start(void); +void USBD_ProcessSetupPacket(void); +void USBD_StandardRequest(void); +void USBD_UpdateDeviceState(void); +void USBD_PrepareCtrlIn(uint8_t *pu8Buf, uint32_t u32Size); +void USBD_CtrlIn(void); +void USBD_CtrlOut(uint8_t *pu8Buf, uint32_t u32Size); +void USBD_SwReset(void); +void USBD_SetVendorRequest(VENDOR_REQ pfnVendorReq); + + + +/*@}*/ /* end of group NUC472_442_USBD_EXPORTED_FUNCTIONS */ + +/*@}*/ /* end of group NUC472_442_USBD_Driver */ + +/*@}*/ /* end of group NUC472_442_Device_Driver */ + +#ifdef __cplusplus +} +#endif + +#endif //__USBD_H__ + +/*** (C) COPYRIGHT 2013 Nuvoton Technology Corp. ***/