gk7205v200-uboot/drivers/usb/gadget/udc3/usb3_drv.h
2025-08-07 17:13:54 +08:00

251 lines
6.6 KiB
C
Executable File

#ifndef __USB3_DRIVER_H__
#define __USB3_DRIVER_H__
#include "sys.h"
#include "usb3.h"
#include "usb3_hw.h"
#include "debug.h"
/* time limit of waiting for key enents */
#define USB_WAIT_FOR_ENUM_DONE_TIME_MS (300 * 1000)
#define USB_WAIT_FOR_RX_NEXT_TIME_MS (60 * 1000)
enum usb_error_type {
USB_RX_NEXT_TIMEOUT = -5,
USB_ENUM_DONE_TIMEOUT = -3,
USB_PROCESS_ERR = -1,
USB_NO_ERR = 0,
};
struct usb_data_handle {
UINT32 uFileType;
UINT32 uFileAddress;
UINT32 uFileLength;
UINT32 IsRxStart;
UINT32 InitTimeStamp;
UINT32 RxTimeStamp;
};
#define USB_DEBUG
#ifdef USB_DEBUG
#define dbg(format, arg...) \
do { \
debug_printf("[%s]", __func__); \
debug_printf(format, ##arg); \
} while(0);
#else
#define dbg(format, arg...)
#endif
#define usb_info(format, arg...) debug_printf("[USBINFO]"format, ##arg);
#define usb_err(format, arg...) debug_printf("[USBERR]"format, ##arg);
typedef enum pcd_state {
USB3_STATE_UNCONNECTED, /* no host */
USB3_STATE_DEFAULT,
USB3_STATE_ADDRESSED,
USB3_STATE_CONFIGURED,
} pcdstate_e;
typedef enum ep0_state {
EP0_IDLE,
EP0_IN_DATA_PHASE,
EP0_OUT_DATA_PHASE,
EP0_IN_WAIT_NRDY,
EP0_OUT_WAIT_NRDY,
EP0_IN_STATUS_PHASE,
EP0_OUT_STATUS_PHASE,
EP0_STALL,
} ep0state_e;
typedef union usb_setup_pkt {
usb_device_request_t req;
uint32_t d32[2];
uint8_t d8[8];
} usb_setup_pkt_t;
typedef struct usb3_pcd_req {
usb3_dma_desc_t *trb;
phys_addr_t trbdma;
uint32_t length;
uint32_t actual;
// void *bufdma;
uint8_t *bufdma;
void (*complete)(void *);
} usb3_pcd_req_t;
typedef struct usb3_pcd_ep {
struct usb3_pcd *pcd;
usb3_dev_ep_regs_t *out_ep_reg;
usb3_dev_ep_regs_t *in_ep_reg;
uint8_t phys;
uint8_t num;
uint8_t type;
uint8_t maxburst;
uint16_t maxpacket;
/* Tx FIFO # for IN EPs */
uint8_t tx_fifo_num;
/* The Transfer Resource Index from the Start Transfer command */
uint8_t tri_out;
uint8_t tri_in;
uint8_t stopped;
/* Send ZLP */
uint8_t send_zlp;
/* True if 3-stage control transfer */
uint8_t three_stage;
/* True if transfer has been started on EP */
uint8_t xfer_started;
/* EP direction 0 = OUT */
uint8_t is_in;
/* True if endpoint is active */
uint8_t active;
/* Initial data pid of bulk endpoint */
uint8_t data_pid_start;
/* ep_desc (excluding ep0) */
usb3_dma_desc_t *ep_desc;
/* TRB descriptor must be aligned to 16 bytes */
uint8_t epx_desc[32];
/* request (excluding ep0) */
usb3_pcd_req_t req;
} usb3_pcd_ep_t;
typedef struct usb3_pcd {
struct usb3_device *usb3_dev;
int32_t link_state;
pcdstate_e state;
uint8_t new_config;
ep0state_e ep0state;
uint32_t eps_enabled;
uint32_t ltm_enable;
usb3_pcd_ep_t ep0;
usb3_pcd_ep_t out_ep;
usb3_pcd_ep_t in_ep;
usb3_dev_global_regs_t *dev_global_regs;
usb3_dev_ep_regs_t *out_ep_regs;
usb3_dev_ep_regs_t *in_ep_regs;
usb3_pcd_req_t ep0_req;
uint8_t speed;
usb3_dma_desc_t *ep0_setup_desc;
usb3_dma_desc_t *ep0_in_desc;
usb3_dma_desc_t *ep0_out_desc;
/* TRB descriptor must be aligned to 16 bytes */
uint8_t ep0_setup[32];
uint8_t ep0_in[32];
uint8_t ep0_out[32];
usb_setup_pkt_t ep0_setup_pkt[5];
#define USB3_STATUS_BUF_SIZE 512
uint8_t ep0_status_buf[USB3_STATUS_BUF_SIZE];
#define USB3_BULK_BUF_SIZE 512
uint8_t ss_bulk_buf[USB3_BULK_BUF_SIZE];
uint32_t file_type;
uint32_t file_address;
uint32_t file_capacity;
uint32_t file_total_frame;
uint32_t file_curr_frame;
uint32_t file_next_frame;
uint32_t file_received;
uint32_t file_complete;
} usb3_pcd_t;
#define usb3_pcd_ep_to_pcd(pcd_ep) ((pcd_ep)->usb3_pcd_ep_t.pcd)
#define usb3_pcd_ep_num(pcd_ep) ((pcd_ep)->usb3_pcd_ep_t.num)
#define usb3_pcd_ep_type(pcd_ep) ((pcd_ep)->usb3_pcd_ep_t.type)
#define usb3_pcd_ep_is_in(pcd_ep) ((pcd_ep)->usb3_pcd_ep_t.is_in)
#define dwc_usb3_is_hwo(desc) ((desc)->control & USB3_DSCCTL_HWO_BIT)
#define dwc_usb3_is_ioc(desc) ((desc)->control & USB3_DSCCTL_IOC_BIT)
#define usb3_get_xfercnt(desc) \
(((desc)->status >> USB3_DSCSTS_XFRCNT_SHIFT) & \
(USB3_DSCSTS_XFRCNT_BITS >> USB3_DSCSTS_XFRCNT_SHIFT))
#define usb3_get_xfersts(desc) \
(((desc)->status >> USB3_DSCSTS_TRBRSP_SHIFT) & \
(USB3_DSCSTS_TRBRSP_BITS >> USB3_DSCSTS_TRBRSP_SHIFT))
#define map_to_dma_addr(addr) \
((addr))
// ((addr) + (REG_BASE_LP_RAM_ACORE - REG_BASE_LP_RAM))
typedef struct usb3_device {
volatile uint8_t *base;
void *dev_desc;
uint8_t string_manu[32];
uint8_t string_prod[32];
uint32_t string_manu_len;
uint32_t string_prod_len;
usb3_pcd_t pcd;
uint32_t snpsid;
usb3_core_global_regs_t *core_global_regs;
#define USB3_EVENT_BUF_SIZE 256
uint32_t event_buf[USB3_EVENT_BUF_SIZE];
uint32_t *event_ptr;
struct usb_data_handle *p_handle;
} usb3_device_t;
void usb3_memset(void *buf, uint8_t value, uint32_t size);
void usb3_memcpy(void *dst, void *src, uint32_t size);
uint32_t usb3_rd32(volatile uint32_t *addr);
void usb3_wr32(volatile uint32_t *addr, uint32_t val);
void usb3_set_address(usb3_pcd_t *pcd, uint32_t addr);
void usb3_accept_u1(usb3_pcd_t *pcd);
void usb3_accept_u2(usb3_pcd_t *pcd);
void usb3_enable_u1(usb3_pcd_t *pcd);
void usb3_enable_u2(usb3_pcd_t *pcd);
void usb3_disable_u1(usb3_pcd_t *pcd);
void usb3_disable_u2(usb3_pcd_t *pcd);
uint32_t usb3_u1_enabled(usb3_pcd_t *pcd);
uint32_t usb3_u2_enabled(usb3_pcd_t *pcd);
void usb3_dep_cstall(usb3_pcd_t *pcd,
usb3_dev_ep_regs_t *ep_reg);
void usb3_dep_sstall(usb3_pcd_t *pcd,
usb3_dev_ep_regs_t *ep_reg);
uint32_t handshake(usb3_device_t *dev, volatile uint32_t *ptr,
uint32_t mask, uint32_t done);
void usb3_fill_desc(usb3_dma_desc_t *desc, phys_addr_t dma_addr,
uint32_t dma_len, uint32_t stream, uint32_t type,
uint32_t ctrlbits, int own);
void usb3_dep_startnewcfg(usb3_pcd_t *pcd,
usb3_dev_ep_regs_t *ep_reg, uint32_t rsrcidx);
void usb3_dep_cfg(usb3_pcd_t *pcd, usb3_dev_ep_regs_t *ep_reg,
uint32_t depcfg0, uint32_t depcfg1, uint32_t depcfg2);
void usb3_dep_xfercfg(usb3_pcd_t *pcd,
usb3_dev_ep_regs_t *ep_reg, uint32_t depstrmcfg);
uint8_t usb3_dep_startxfer(usb3_pcd_t *pcd, usb3_dev_ep_regs_t *ep_reg,
phys_addr_t dma_addr, uint32_t stream_or_uf);
void usb3_dep_updatexfer(usb3_pcd_t *pcd,
usb3_dev_ep_regs_t *ep_reg,
uint32_t tri);
void usb3_ep_activate(usb3_pcd_t *pcd, usb3_pcd_ep_t *ep);
void usb3_ep0_out_start(usb3_pcd_t *pcd);
void usb3_ep0_start_transfer(usb3_pcd_t *pcd, usb3_pcd_req_t *req);
void usb3_resume_usb2_phy(usb3_pcd_t *pcd);
//int usb_connected = 0;
#endif /* __USB3_DRIVER_H */