| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- /*
- * Copyright (C) 2022-2024, Xiaohua Semiconductor Co., Ltd.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2023-02-14 CDT first version
- */
- #ifndef __DRV_USBD_H__
- #define __DRV_USBD_H__
- /*******************************************************************************
- * Include files
- ******************************************************************************/
- #include <rtthread.h>
- #include "rtdevice.h"
- #include "hc32_ll_usb.h"
- /* C binding of definitions if building with C++ compiler */
- #ifdef __cplusplus
- extern "C"
- {
- #endif
- /*******************************************************************************
- * Global pre-processor symbols/macros ('#define')
- ******************************************************************************/
- /* The bit of the diepint/doepint */
- #define XFER_COMPL (1UL)
- #define EPDISABLED (1UL<<1)
- #define TIME_OUT (1UL<<3)
- #define SETUP_BIT (1UL<<3)
- #define INTKNTXFEMP (1UL<<4)
- #define INEPNAKEFF (1UL<<6)
- #define TXFEMP (1UL<<7)
- /* The bit of the GINTSTS */
- #define MODEMIS_INT (1UL<<1)
- #define SOF_INT (1UL<<3)
- #define RXFLVL_INT (1UL<<4)
- #define USBSUSP_INT (1UL<<11)
- #define USBRST_INT (1UL<<12)
- #define ENUMDONE_INT (1UL<<13)
- #define INEP_INT (1UL<<18)
- #define OUTEP_INT (1UL<<19)
- #define INCOMPLSOIN (1UL<<20)
- #define INCOMPLSOOUT (1UL<<21)
- #define VBUSV_INT (1UL<<30)
- #define WAKEUP_INT (1UL<<31)
- /* Data packet status for device mode */
- #define STS_GOUT_NAK (1U)
- #define STS_DATA_UPDT (2U)
- #define STS_XFER_COMP (3U)
- #define STS_SETUP_COMP (4U)
- #define STS_SETUP_UPDT (6U)
- /* USB EP0 state */
- #define USB_EP0_IDLE (0U)
- #define USB_EP0_SETUP (1U)
- #define USB_EP0_DATA_IN (2U)
- #define USB_EP0_DATA_OUT (3U)
- #define USB_EP0_STATUS_IN (4U)
- #define USB_EP0_STATUS_OUT (5U)
- #define USB_EP0_STALL (6U)
- /*******************************************************************************
- * Global type definitions ('typedef')
- ******************************************************************************/
- typedef enum
- {
- CTRL_START = 0U,
- CTRL_XFRC,
- CTRL_HALTED,
- CTRL_NAK,
- CTRL_STALL,
- CTRL_XACTERR,
- CTRL_BBLERR,
- CTRL_DATATGLERR,
- CTRL_FAIL
- } CTRL_HANDLE_STATUS;
- typedef struct
- {
- uint8_t bmRequest;
- uint8_t bRequest;
- uint16_t wValue;
- uint16_t wIndex;
- uint16_t wLength;
- } USB_SETUP_REQ;
- typedef struct
- {
- uint8_t *(*get_dev_desc)(uint16_t *length);
- uint8_t *(*get_dev_langiddesc)(uint16_t *length);
- uint8_t *(*get_dev_manufacturerstr)(uint16_t *length);
- uint8_t *(*get_dev_productstr)(uint16_t *length);
- uint8_t *(*get_dev_serialstr)(uint16_t *length);
- uint8_t *(*get_dev_configstr)(uint16_t *length);
- uint8_t *(*get_dev_interfacestr)(uint16_t *length);
- } usb_dev_desc_func;
- typedef struct
- {
- void (*class_init)(void *pdev);
- void (*class_deinit)(void *pdev);
- uint8_t (*ep0_setup)(void *pdev, USB_SETUP_REQ *req);
- void (*ep0_datain)(void *pdev);
- void (*ep0_dataout)(void *pdev);
- uint8_t *(*class_getconfigdesc)(uint16_t *length);
- uint8_t (*class_sof)(void *pdev);
- void (*class_datain)(void *pdev, uint8_t epnum);
- void (*class_dataout)(void *pdev, uint8_t epnum);
- void (*class_syn_in_incomplt)(void *pdev);
- void (*class_syn_out_incomplt)(void *pdev);
- } usb_dev_class_func;
- typedef struct
- {
- void (*user_init)(void);
- void (*user_devrst)(void);
- void (*user_devconfig)(void);
- void (*user_devsusp)(void);
- void (*user_devresume)(void);
- void (*user_devconn)(void);
- void (*user_devdisconn)(void);
- } usb_dev_user_func;
- typedef struct
- {
- __IO uint8_t device_config;
- __IO uint8_t device_address;
- __IO uint8_t device_state;
- __IO uint8_t device_old_status;
- __IO uint8_t device_cur_status;
- __IO uint8_t connection_status;
- __IO uint8_t device_remote_wakeup;
- __IO uint8_t test_mode;
- USB_DEV_EP in_ep[USB_MAX_TX_FIFOS];
- USB_DEV_EP out_ep[USB_MAX_TX_FIFOS];
- uint8_t setup_pkt_buf[24];
- usb_dev_class_func *class_callback;
- usb_dev_user_func *user_callback;
- usb_dev_desc_func *desc_callback;
- } USB_DEV_PARAM;
- typedef struct
- {
- USB_CORE_BASIC_CFGS basic_cfgs;
- LL_USB_TypeDef regs;
- #ifdef USE_DEVICE_MODE
- USB_DEV_PARAM dev;
- #endif
- } usb_core_instance;
- typedef struct
- {
- void (* Reset)(usb_core_instance *pdev);
- void (* devctrlconnect)(usb_core_instance *pdev, uint8_t conn);
- void (* Suspend)(usb_core_instance *pdev);
- void (* Resume)(usb_core_instance *pdev);
- void (* SOF)(usb_core_instance *pdev);
- void (* SetupStage)(usb_core_instance *pdev);
- void (* DataOutStage)(usb_core_instance *pdev, uint8_t epnum);
- void (* DataInStage)(usb_core_instance *pdev, uint8_t epnum);
- void (* IsoINIncomplete)(usb_core_instance *pdev);
- void (* IsoOUTIncomplete)(usb_core_instance *pdev);
- } usb_dev_int_cbk_typedef;
- /*******************************************************************************
- Global function prototypes (definition in C source)
- ******************************************************************************/
- /**
- * @brief get the IN Endpoint TxFIFO avail space
- * @param [in] pdev device instance
- * @param [in] epnum endpoint number
- * @retval the avail space in 32-bit words
- */
- __STATIC_INLINE uint16_t usb_rdineptxfspcavail(usb_core_instance *pdev, uint32_t epnum)
- {
- return (uint16_t)(READ_REG32(pdev->regs.INEP_REGS[epnum]->DTXFSTS) & USBFS_DTXFSTS_INEPTFSAV);
- }
- /**
- * @brief set the USB turn around time
- * @param [in] pdev device instance
- * @retval None
- */
- __STATIC_INLINE void usb_setaroundtim(usb_core_instance *pdev)
- {
- SET_REG32_BIT(pdev->regs.GREGS->GUSBCFG, USBFS_GUSBCFG_TRDT);
- }
- #ifdef __cplusplus
- }
- #endif
- #endif /* __DRV_USBD_H__ */
- /*******************************************************************************
- * EOF (not truncated)
- ******************************************************************************/
|