692 lines
24 KiB
C
692 lines
24 KiB
C
|
|
#ifndef USB20_DEV_API_H
|
|||
|
|
#define USB20_DEV_API_H
|
|||
|
|
|
|||
|
|
/// include & define here
|
|||
|
|
#include "sys_config.h"
|
|||
|
|
#include "hal/usb_device.h"
|
|||
|
|
#include "dev/usb/hgusb20_v1_base.h"
|
|||
|
|
#include "dev/usb/hgusb20_v1_dev_ep0.h"
|
|||
|
|
#include "osal/work.h"
|
|||
|
|
#include "osal/event.h"
|
|||
|
|
#include "lib/common/rbuffer.h"
|
|||
|
|
|
|||
|
|
#define USB_DEV_DEBUG_ERR_ENABLE 0
|
|||
|
|
#if USB_DEV_DEBUG_ERR_ENABLE
|
|||
|
|
#define USB_DEV_ERR_PRINTF(fmt, args...) os_printf(fmt, ##args)
|
|||
|
|
#else
|
|||
|
|
#define USB_DEV_ERR_PRINTF(fmt, args...)
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
#ifdef __cplusplus
|
|||
|
|
extern "C" {
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
/* speed flags only host */
|
|||
|
|
#define HGUSB20_FLAGS_HIGH_SPEED (0)
|
|||
|
|
#define HGUSB20_FLAGS_FULL_SPEED (30)
|
|||
|
|
|
|||
|
|
#define USBDMA_RX_FLAG_RXING BIT(0)
|
|||
|
|
#define USBDMA_RX_FLAG_OVERFLOW BIT(1)
|
|||
|
|
#define USBDMA_RX_FLAG_FIFOFULL BIT(2)
|
|||
|
|
|
|||
|
|
#define USBDMA_TX_FLAG_TXING BIT(0)
|
|||
|
|
#define USBDMA_TX_FLAG_NULLPACKET BIT(1)
|
|||
|
|
#define USBDMA_TX_FLAG_MODE1 BIT(2)
|
|||
|
|
|
|||
|
|
typedef struct {
|
|||
|
|
uint8 ep0_pkt;
|
|||
|
|
uint16 time_out;
|
|||
|
|
uint8 stall;
|
|||
|
|
} type_usb_host;
|
|||
|
|
|
|||
|
|
typedef struct {
|
|||
|
|
union {
|
|||
|
|
struct {
|
|||
|
|
uint8 dev_hub_addr : 7,
|
|||
|
|
hub_mtt_en : 1;
|
|||
|
|
};
|
|||
|
|
uint8 usb_hub_addr;
|
|||
|
|
} u_usb_hub_addr;
|
|||
|
|
uint8 dev_hub_port;
|
|||
|
|
uint8 dev_addr;
|
|||
|
|
|
|||
|
|
uint8 ep_host : 4,
|
|||
|
|
ep_host_rsv : 4;
|
|||
|
|
|
|||
|
|
#define USB_ENDPOINT_XFERTYPE_MASK 0x03 /* in bmAttributes */
|
|||
|
|
#define USB_ENDPOINT_XFER_CONTROL 0
|
|||
|
|
#define USB_ENDPOINT_XFER_ISOC 1
|
|||
|
|
#define USB_ENDPOINT_XFER_BULK 2
|
|||
|
|
#define USB_ENDPOINT_XFER_INT 3
|
|||
|
|
#define USB_ENDPOINT_SPEED_DEFAULT 0x00
|
|||
|
|
#define USB_ENDPOINT_SPEED_HIGH 0x01
|
|||
|
|
#define USB_ENDPOINT_SPEED_FULL 0x02
|
|||
|
|
#define USB_ENDPOINT_SPEED_LOW 0x03
|
|||
|
|
uint8 ep_dev : 4,
|
|||
|
|
ep_type : 2,
|
|||
|
|
ep_speed : 2;
|
|||
|
|
|
|||
|
|
uint16 max_pkt_size;
|
|||
|
|
} hgusb20_pipe_attr ;
|
|||
|
|
|
|||
|
|
|
|||
|
|
typedef struct {
|
|||
|
|
uint8 offset;
|
|||
|
|
uint8 rx_len;
|
|||
|
|
uint16 rx_total;
|
|||
|
|
} type_ep0_ptr;
|
|||
|
|
|
|||
|
|
|
|||
|
|
typedef enum {
|
|||
|
|
UDISK_DEV = 1,
|
|||
|
|
UVC_DEV
|
|||
|
|
}USB_DEV_TYPE;
|
|||
|
|
|
|||
|
|
|
|||
|
|
struct ep_trx_ctrl {
|
|||
|
|
uint32 addr;
|
|||
|
|
uint32 total_bytes;
|
|||
|
|
uint32 max_packet_size;
|
|||
|
|
uint32 cur_addr;
|
|||
|
|
uint32 cur_counter;
|
|||
|
|
uint32 last_counter;
|
|||
|
|
uint32 tx_null_pkt_en;
|
|||
|
|
uint32 tx_null_pkt_flag;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
struct hgusb20_dev {
|
|||
|
|
struct usb_device dev;
|
|||
|
|
void *usb_hw;
|
|||
|
|
long flags;
|
|||
|
|
usbdev_irq_hdl irq_hdl;
|
|||
|
|
uint8 *rx_buff;
|
|||
|
|
uint32 rx_len;
|
|||
|
|
uint32 irq_data;
|
|||
|
|
|
|||
|
|
struct usb_device_cfg *cfg;
|
|||
|
|
uint8 *p_com_desc; /* usb descriptor */
|
|||
|
|
uint8 *p_config_desc; /* usb descriptor */
|
|||
|
|
uint16 vid; /* usb device VID */
|
|||
|
|
uint16 pid; /* usb device PID */
|
|||
|
|
|
|||
|
|
/* basic */
|
|||
|
|
struct hgusb20_dev_chk usb_chk;
|
|||
|
|
struct hgusb20_dev_ctrl usb_ctrl;
|
|||
|
|
struct hgusb20_dev_info usb_dev;
|
|||
|
|
type_ep0_ptr ep0_ptr;
|
|||
|
|
type_usb_host usb_host;
|
|||
|
|
|
|||
|
|
volatile uint32 usb_dma_int; /* dma intr status reg value */
|
|||
|
|
|
|||
|
|
volatile uint8 usb_rxdma_flag;
|
|||
|
|
volatile uint8 usb_txdma_flag;
|
|||
|
|
|
|||
|
|
uint8 ep_irq_num;
|
|||
|
|
uint8 dma_irq_num;
|
|||
|
|
uint16_t usb_dev_flag;
|
|||
|
|
|
|||
|
|
uint8 usb_ep0_sbuf[8] __attribute__((aligned(4)));
|
|||
|
|
/* case : usb continue send 64byte data, 2nd data NAK */
|
|||
|
|
uint8 usb_ep0_rxbuf[68 + 68] __attribute__((aligned(4)));
|
|||
|
|
|
|||
|
|
uint8 usb_ep0_sta[8];
|
|||
|
|
RBUFFER_DEF_R(rb, uint8);
|
|||
|
|
struct os_work ep0_work;
|
|||
|
|
/* trx_lock[00:15] for EP_IN */
|
|||
|
|
/* trx_lock[15:31] for EP_OUT */
|
|||
|
|
struct os_event trx_lock;
|
|||
|
|
struct os_event trx_done;
|
|||
|
|
|
|||
|
|
struct ep_trx_ctrl ep_trans_ctrl[7];
|
|||
|
|
struct ep_trx_ctrl ep_recevice_ctrl[7];
|
|||
|
|
|
|||
|
|
#ifdef CONFIG_SLEEP
|
|||
|
|
uint32 sys_regs[4];
|
|||
|
|
#endif
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
/* hgusb20_base */
|
|||
|
|
/**
|
|||
|
|
* @brief read usb register
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param ep :
|
|||
|
|
* @param addr : register address offset
|
|||
|
|
* @param data : data return
|
|||
|
|
* @return : TRUE or FLASE
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
bool hgusb20_read_reg(struct hgusb20_dev *p_dev, uint8 ep, uint32 addr, uint32 *data);
|
|||
|
|
/**
|
|||
|
|
* @brief write usb register
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param ep :
|
|||
|
|
* @param addr : register address offset
|
|||
|
|
* @param data : data return
|
|||
|
|
* @return : TRUE or FLASE
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
bool hgusb20_write_reg(struct hgusb20_dev *p_dev, uint8 ep, uint32 addr, uint32 data);
|
|||
|
|
|
|||
|
|
void hgusb20_switch_otg(struct hgusb20_dev *p_dev);
|
|||
|
|
void hgusb20_switch_host(struct hgusb20_dev *p_dev);
|
|||
|
|
void hgusb20_switch_stable_host(struct hgusb20_dev *p_dev);
|
|||
|
|
void hgusb20_switch_stable_device(struct hgusb20_dev *p_dev);
|
|||
|
|
void hgusb20_switch_stable_otg(struct hgusb20_dev *p_dev);
|
|||
|
|
void hgusb20_intr_dis(struct hgusb20_dev *p_dev);
|
|||
|
|
uint8_t hgusb20_connected(struct hgusb20_dev * p_dev);
|
|||
|
|
|
|||
|
|
uint32 hgusb20_get_rx_crc_error_cnt(struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief usb ep rx data kick
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param ep : [1,2]
|
|||
|
|
* @param addr : data address
|
|||
|
|
* @param len : data length
|
|||
|
|
* @return : TRUE or FLASE
|
|||
|
|
* @note use for host & device
|
|||
|
|
*/
|
|||
|
|
bool hgusb20_ep_rx_kick(struct hgusb20_dev *p_dev, uint8 ep, uint32 addr, uint32 len);
|
|||
|
|
/**
|
|||
|
|
* @brief usb ep tx data kick
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param ep : [1,2]
|
|||
|
|
* @param addr : data address
|
|||
|
|
* @param len : data length
|
|||
|
|
* @return : TRUE or FLASE
|
|||
|
|
* @note use for host & device
|
|||
|
|
*/
|
|||
|
|
bool hgusb20_ep_tx_kick(struct hgusb20_dev *p_dev, uint8 ep, uint32 addr, uint32 len);
|
|||
|
|
bool hgusb20_ep_rx_abort(struct hgusb20_dev *p_dev, uint8 ep);
|
|||
|
|
bool hgusb20_ep_tx_abort(struct hgusb20_dev *p_dev, uint8 ep);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief usb ep get rx data length from dma
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param ep : [1,2]
|
|||
|
|
* @return : rx data length
|
|||
|
|
* @note use for host & device
|
|||
|
|
*/
|
|||
|
|
uint32 hgusb20_ep_get_dma_rx_len(struct hgusb20_dev *p_dev, uint8 ep);
|
|||
|
|
/**
|
|||
|
|
* @brief usb ep get rx data length from sie
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param ep : [1,2]
|
|||
|
|
* @return : rx data length
|
|||
|
|
* @note use for host & device
|
|||
|
|
*/
|
|||
|
|
uint32 hgusb20_ep_get_sie_rx_len(struct hgusb20_dev *p_dev, uint8 ep);
|
|||
|
|
/**
|
|||
|
|
* @brief usb ep get tx data length
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param ep : [1,2]
|
|||
|
|
* @return : tx data length (same with len in hgusb20_ep_tx_kick)
|
|||
|
|
* @note use for host & device
|
|||
|
|
*/
|
|||
|
|
uint32 hgusb20_ep_get_tx_len(struct hgusb20_dev *p_dev, uint8 ep);
|
|||
|
|
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief check if usb device online
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return
|
|||
|
|
* - TRUE : online.
|
|||
|
|
* - FALSE : not online.
|
|||
|
|
* @note : For USB Host
|
|||
|
|
*/
|
|||
|
|
bool hgusb20_is_device_online(struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief check if usb host online
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return
|
|||
|
|
* - TRUE : online.
|
|||
|
|
* - FALSE : not online.
|
|||
|
|
* @note : For USB Device
|
|||
|
|
*/
|
|||
|
|
bool hgusb20_is_host_online(struct hgusb20_dev *p_dev);
|
|||
|
|
int32 hgusb20_is_host_mode(struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief suspend usb device .
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return :
|
|||
|
|
* @note : For USB Host
|
|||
|
|
*/
|
|||
|
|
void hgusb20_host_suspend(struct hgusb20_dev *p_dev);
|
|||
|
|
/**
|
|||
|
|
* @brief resume usb device .
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return :
|
|||
|
|
* @note : For USB Host
|
|||
|
|
*/
|
|||
|
|
void hgusb20_host_resume(struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief usb host set address(host address)
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param addr :
|
|||
|
|
* @return
|
|||
|
|
* @note use after usb_host_set_address(device address) cmd
|
|||
|
|
*/
|
|||
|
|
void hgusb20_set_address(struct hgusb20_dev *p_dev, uint8 addr);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief usb host bus reset request
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
uint8 hgusb20_host_reset(struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief remote_wakeup usb host .
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return :
|
|||
|
|
* @note : For USB Device
|
|||
|
|
*/
|
|||
|
|
void hgusb20_dev_remote_wakeup(struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
|
|||
|
|
/* hgusb20_dev_api */
|
|||
|
|
/**
|
|||
|
|
* @brief attach usb device
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param dev_id :
|
|||
|
|
* @return : err_code
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
int32 hgusb20_dev_attach(uint32 dev_id, struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief init usb to device mode .
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return
|
|||
|
|
* - RET_OK : Successfully.
|
|||
|
|
* - RET_ERR : Failed.
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
uint8 hgusb20_dev_init(struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief exit usb to device mode .
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return
|
|||
|
|
* - RET_OK : Successfully.
|
|||
|
|
* - RET_ERR : Failed.
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
void hgusb20_dev_exit(struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief usb device ep0 tx data stage handle:
|
|||
|
|
* addr = p_dev->ep0_ptr; len = p_dev->ep0_len;
|
|||
|
|
* 1、if buf is not NULL(first packet), update p_dev->ep0_ptr & p_dev->ep0_len
|
|||
|
|
* 2、TX one packet
|
|||
|
|
* 3、data end if len != ep0_pkt
|
|||
|
|
* 4、auto called repeat when last tx data done while (p_dev->usb_dev.ep0_state == TRANSER_OVER_STATE)
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param buf : valid when first packet, set NULL when other packet
|
|||
|
|
* @param len : valid when first packet, set 0 when other packet.
|
|||
|
|
* @return
|
|||
|
|
* - RET_OK : Successfully.
|
|||
|
|
* - RET_ERR : Failed.
|
|||
|
|
* @note : weak function, Users can use a strong statement function replace the weak statement function.
|
|||
|
|
*/
|
|||
|
|
bool hgusb20_dev_ep0_tx(struct hgusb20_dev *p_dev, void *buf, uint16_t len);
|
|||
|
|
/**
|
|||
|
|
* @brief usb device ep0 tx one packet only
|
|||
|
|
*/
|
|||
|
|
bool hgusb20_dev_ep0_tx_rtt(struct hgusb20_dev *p_dev, void *buf, uint16_t len);
|
|||
|
|
bool hgusb20_dev_ep0_tx_abort(struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief usb ep rx data stage handle
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param ep : [1,2]
|
|||
|
|
* @param addr : data address
|
|||
|
|
* @param len : data length
|
|||
|
|
* @return : TRUE or FLASE
|
|||
|
|
* @note use for host & device
|
|||
|
|
*/
|
|||
|
|
bool hgusb20_dev_ep0_rx(struct hgusb20_dev *p_dev, void *buf, uint16_t len);
|
|||
|
|
/**
|
|||
|
|
* @brief usb device ep0 rx one packet only
|
|||
|
|
*/
|
|||
|
|
bool hgusb20_dev_ep0_rx_rtt(struct hgusb20_dev *p_dev, void *buf, uint16_t len);
|
|||
|
|
bool hgusb20_dev_ep0_rx_abort(struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief usb device clear_stall_flag
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
void hgusb20_dev_clear_stall_flag(struct hgusb20_dev *p_dev);
|
|||
|
|
/**
|
|||
|
|
* @brief usb device tx zero-packet & rx packet to usb_ep0_rxbuf
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
bool hgusb20_dev_ep0_clrrx_pkt0(struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief usb device bus reset
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
void hgusb20_dev_reset(struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief usb device stall_ep
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param epnum : epnum, set BIT(7) when tx endpiont.
|
|||
|
|
* @return
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
void hgusb20_dev_stall_ep(struct hgusb20_dev *p_dev, uint8 epnum);
|
|||
|
|
/**
|
|||
|
|
* @brief usb device clear stall_ep
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param epnum : epnum, set BIT(7) when tx endpiont.
|
|||
|
|
* @return
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
void hgusb20_dev_clear_ep(struct hgusb20_dev *p_dev, uint8 epnum);
|
|||
|
|
/**
|
|||
|
|
* @brief usb device ep reset all endpiont in ep_cfg
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
void hgusb20_dev_bot_reset(struct hgusb20_dev *p_dev);
|
|||
|
|
/**
|
|||
|
|
* @brief usb device cmd handle :get descriptor
|
|||
|
|
* 1、kick next rx to p_dev->usb_ep0_rxbuf
|
|||
|
|
* 2、tx data(addr = buf, length = len)
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return : TRUE or FLASE
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
bool hgusb20_dev_ep0_descriptor(struct hgusb20_dev *p_dev, void *buf, uint16_t len);
|
|||
|
|
/**
|
|||
|
|
* @brief usb device standard cmd handle
|
|||
|
|
* 1、
|
|||
|
|
* 2、handle DATA(IN or OUT)
|
|||
|
|
* 3、STATUS(zero-len packet)
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return
|
|||
|
|
* @note : weak function, Users can use a strong statement function replace the weak statement function.
|
|||
|
|
* these function is called by func "hgusb20_dev_ep0_standard"
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
uint8 hgusb20_dev_cfg_desc_prepare(struct hgusb20_dev *p_dev);
|
|||
|
|
__weak bool hgusb20_dev_ep0_get_descriptor(struct hgusb20_dev *p_dev);
|
|||
|
|
__weak bool hgusb20_dev_ep0_get_configuration(struct hgusb20_dev *p_dev);
|
|||
|
|
__weak bool hgusb20_dev_ep0_set_configuration(struct hgusb20_dev *p_dev);
|
|||
|
|
__weak bool hgusb20_dev_ep0_get_interface(struct hgusb20_dev *p_dev);
|
|||
|
|
__weak bool hgusb20_dev_ep0_set_interface(struct hgusb20_dev *p_dev);
|
|||
|
|
__weak bool hgusb20_dev_ep0_set_address(struct hgusb20_dev *p_dev, uint8_t address);
|
|||
|
|
__weak bool hgusb20_dev_ep0_get_status(struct hgusb20_dev *p_dev);
|
|||
|
|
__weak bool hgusb20_dev_ep0_clr_feature(struct hgusb20_dev *p_dev);
|
|||
|
|
__weak bool hgusb20_dev_ep0_set_feature(struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief usb device ep0 setup handle (standard cmd)
|
|||
|
|
* 1、
|
|||
|
|
* 2、handle DATA(IN or OUT)
|
|||
|
|
* 3、STATUS(zero-len packet)
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return : TRUE or FLASE
|
|||
|
|
* @note : weak function, Users can use a strong statement function replace the weak statement function.
|
|||
|
|
* the function is called by func "hgusb20_dev_ep0_request"
|
|||
|
|
*/
|
|||
|
|
__weak bool hgusb20_dev_ep0_standard(struct hgusb20_dev *p_dev);
|
|||
|
|
//__weak bool hgusb20_dev_ep0_class_reset(struct hgusb20_dev *p_dev);
|
|||
|
|
//__weak bool hgusb20_dev_ep0_class_get_lun(struct hgusb20_dev *p_dev);
|
|||
|
|
//__weak bool hgusb20_dev_ep0_audio_sample_ctrl(struct hgusb20_dev *p_dev);
|
|||
|
|
//__weak bool hgusb20_dev_ep0_audio_mute_ctrl(struct hgusb20_dev *p_dev);
|
|||
|
|
//__weak bool hgusb20_dev_ep0_audio_volume_ctrl(struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief usb device ep0 setup handle (class cmd)
|
|||
|
|
* 1、
|
|||
|
|
* 2、handle DATA(IN or OUT)
|
|||
|
|
* 3、STATUS(zero-len packet)
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return : TRUE or FLASE
|
|||
|
|
* @note : weak function, Users can use a strong statement function replace the weak statement function.
|
|||
|
|
* the function is called by func "hgusb20_dev_ep0_request"
|
|||
|
|
*/
|
|||
|
|
__weak bool hgusb20_dev_ep0_class(struct hgusb20_dev *p_dev);
|
|||
|
|
/**
|
|||
|
|
* @brief usb device ep0 setup handle (vendor cmd)
|
|||
|
|
* 1、
|
|||
|
|
* 2、handle DATA(IN or OUT)
|
|||
|
|
* 3、STATUS(zero-len packet)
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return : TRUE or FLASE
|
|||
|
|
* @note : weak function, Users can use a strong statement function replace the weak statement function.
|
|||
|
|
* the function is called by func "hgusb20_dev_ep0_request"
|
|||
|
|
*/
|
|||
|
|
__weak bool hgusb20_vendor_cmd(struct hgusb20_dev *p_dev);
|
|||
|
|
/**
|
|||
|
|
* @brief usb device ep0 setup handle
|
|||
|
|
* 1、
|
|||
|
|
* 2、handle DATA(IN or OUT)
|
|||
|
|
* 3、STATUS(zero-len packet)
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return : TRUE or FLASE
|
|||
|
|
* @note : weak function, Users can use a strong statement function replace the weak statement function.
|
|||
|
|
*
|
|||
|
|
*/
|
|||
|
|
__weak bool hgusb20_dev_ep0_request(struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief usb device config state indication
|
|||
|
|
* 1、 p_dev->usb_dev.cur_state = USB_CONFIG_STATE;
|
|||
|
|
* 2、p_dev->flags |= BIT(HGUSB20_FLAGS_READY);
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return :
|
|||
|
|
* @note : weak function, Users can use a strong statement function replace the weak statement function.
|
|||
|
|
*
|
|||
|
|
*/
|
|||
|
|
__weak void hgusb20_dev_state_config(struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
///**
|
|||
|
|
// * @brief usb device ep0 interrupt handle
|
|||
|
|
// * @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
// * @return
|
|||
|
|
// * @note : weak function, Users can use a strong statement function replace the weak statement function.
|
|||
|
|
// * !! Don't recommend a strong statement function
|
|||
|
|
// */
|
|||
|
|
//__weak void hgusb20_dev_ep0_func(struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief usb device endpoint init & deinit
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param ep_addr : ep->ep_desc->bEndpointAddress
|
|||
|
|
* @param max_pkt_size :ep->ep_desc->wMaxPacketSize
|
|||
|
|
* @param attributes : ep->ep_desc->bmAttributes.
|
|||
|
|
* @return :
|
|||
|
|
* @note : weak function, Users can use a strong statement function replace the weak statement function.
|
|||
|
|
*/
|
|||
|
|
void hgusb20_dev_ep_init(struct hgusb20_dev *p_dev, uint8 ep_addr, uint16 max_pkt_size, uint8 attributes);
|
|||
|
|
void hgusb20_dev_ep_deinit(struct hgusb20_dev *p_dev, uint8 ep_addr);
|
|||
|
|
/**
|
|||
|
|
* @brief usb device IN data kick ( tx data )
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param ep : ep_num = ep->ep_desc->bEndpointAddress & 0x7F
|
|||
|
|
* @param buff : word aligned
|
|||
|
|
* @param len :
|
|||
|
|
* @param sync : 1: sync(recommand) 0: async
|
|||
|
|
* @return : error code
|
|||
|
|
* @note : weak function, Users can use a strong statement function replace the weak statement function.
|
|||
|
|
*/
|
|||
|
|
int32 hgusb20_dev_write(struct usb_device *usb, uint8 ep, uint8 *buff, uint32 len, uint8 sync);
|
|||
|
|
int32 hgusb20_dev_read(struct usb_device *p_usb_d, uint8 ep, uint8 *buff, uint32 len, uint8 sync);
|
|||
|
|
int32 hgusb20_dev_close(struct usb_device *p_usb_d);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
/* hgusb20_host_api */
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief attach usb host
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param dev_id :
|
|||
|
|
* @return : err_code
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
int32 hgusb20_host_attach(uint32 dev_id, struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief init usb to host mode .
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return
|
|||
|
|
* - RET_OK : Successfully.
|
|||
|
|
* - RET_ERR : Failed.
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
bool hgusb20_host_init(struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief usb host ep0 cmd request
|
|||
|
|
* 1. SETUP: send setup packet , addr = p_dev->usb_ctrl.cmd, len = 8
|
|||
|
|
* 2. DATA : addr = p_buf, len = p_dev->usb_ctrl.cmd.length for rx/tx(p_dev->usb_ctrl.cmd.rtype & USB_DIR_IN)
|
|||
|
|
3. STA : if DATA tx null packet else rx null packet
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param p_buf : data buffer.
|
|||
|
|
* @return : TRUE or FLASE
|
|||
|
|
* @note Another choice user can realize function by calling "hgusb20_host_ep0_setup" & "hgusb20_host_ep0_rx" & "hgusb20_host_ep0_tx"
|
|||
|
|
*/
|
|||
|
|
bool usb_host_ep0_request(struct hgusb20_dev *p_dev, uint8 *pBuf);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief usb host ep0 send SETUP packet
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
uint32_t hgusb20_host_ep0_setup(struct hgusb20_dev *p_dev);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief usb host ep0 send IN packet & request a data packet
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @return
|
|||
|
|
* @note addr = p_dev->usb_ep0_buf, len = p_dev->ep0_ptr.rx_len
|
|||
|
|
*/
|
|||
|
|
uint32_t hgusb20_host_ep0_rx(struct hgusb20_dev *p_dev, uint8 *pBuf, bool first_pkt);
|
|||
|
|
/**
|
|||
|
|
* @brief usb host ep0 send IN packet & request a data packet
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param len :
|
|||
|
|
* @return
|
|||
|
|
* @note addr = p_dev->usb_ep0_buf, len = p_dev->ep0_ptr.rx_len
|
|||
|
|
*/
|
|||
|
|
uint32_t hgusb20_host_ep0_tx(struct hgusb20_dev *p_dev, uint8 *pBuf, uint8 len);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief usb host endpiont init (TXW81X)
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param ep_host : ep pipe of host
|
|||
|
|
* @param ep_dev : ep pipe of device
|
|||
|
|
* @param ep_type : USB_ENDPOINT_XFERTYPE_MASK @ref usb_ch9.h
|
|||
|
|
* @param max_pkt_size :
|
|||
|
|
* @return
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
void hgusb20_host_tx_ep_init(struct hgusb20_dev *p_dev, uint8 ep_host, uint8 ep_dev, uint8 ep_type, uint16 max_pkt_size);
|
|||
|
|
void hgusb20_host_rx_ep_init(struct hgusb20_dev *p_dev, uint8 ep_host, uint8 ep_dev, uint8 ep_type, uint16 max_pkt_size);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief usb host pipe init (TXW82X)
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param usb_pipe : ep pipe of host
|
|||
|
|
* @return
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
void hgusb20_host_tx_pipe_combine(struct hgusb20_dev *p_dev, hgusb20_pipe_attr *usb_pipe);
|
|||
|
|
void hgusb20_host_rx_pipe_combine(struct hgusb20_dev *p_dev, hgusb20_pipe_attr *usb_pipe);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief hgusb20_host_clear_data_toggle
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param ep_num : [1,2]
|
|||
|
|
* @param ep_type : EndpointDir BIT[7]:IN = 1, OUT = 0
|
|||
|
|
* @return :
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
void hgusb20_host_clear_data_toggle(struct hgusb20_dev *p_dev, uint8 ep_num, uint8 ep_type);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief hgusb20_host_flush_fifo
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param ep_num : [1,2]
|
|||
|
|
* @param ep_type : EndpointDir BIT[7]:IN = 1, OUT = 0
|
|||
|
|
* @return :
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
void hgusb20_host_flush_fifo(struct hgusb20_dev *p_dev, uint8 ep_num, uint8 ep_type);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief usb host get stall status
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param ep_num : [0,2]
|
|||
|
|
* @param ep_type : EndpointDir BIT[7]:IN = 1, OUT = 0
|
|||
|
|
* @return : TRUE or FLASE
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
bool hgusb20_host_is_rx_stall(struct hgusb20_dev *p_dev, uint8 ep_num, uint8 ep_type);
|
|||
|
|
/**
|
|||
|
|
* @brief usb host get xact error status (continous no response three times)
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param ep_num : [0,2]
|
|||
|
|
* @param ep_type : EndpointDir BIT[7]:IN = 1, OUT = 0
|
|||
|
|
* @return : TRUE or FLASE
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
bool hgusb20_host_is_xact_err(struct hgusb20_dev *p_dev, uint8 ep_num, uint8 ep_type);
|
|||
|
|
/**
|
|||
|
|
* @brief usb host get nak timeout status
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param ep_num : [0,2]
|
|||
|
|
* @param ep_type : EndpointDir BIT[7]:IN = 1, OUT = 0
|
|||
|
|
* @return : TRUE or FLASE
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
bool hgusb20_host_is_nak_timeout(struct hgusb20_dev *p_dev, uint8 ep_num, uint8 ep_type);
|
|||
|
|
/**
|
|||
|
|
* @brief usb host get rx crc status
|
|||
|
|
* @param p_dev : hgusb20_dev use @ref dev_get() function to get the handle.
|
|||
|
|
* @param ep_num : [0,2]
|
|||
|
|
* @return : TRUE or FLASE
|
|||
|
|
* @note
|
|||
|
|
*/
|
|||
|
|
bool hgusb20_host_is_crc_err(struct hgusb20_dev *p_dev, uint8 ep_num);
|
|||
|
|
|
|||
|
|
void hgusb20_host_reset_phy(struct hgusb20_dev * p_dev);
|
|||
|
|
|
|||
|
|
int32 hgusb20_host_set_interval(struct hgusb20_dev *p_dev, uint8_t ep_host, uint8_t mode, uint32_t interval);
|
|||
|
|
void hgusb20_host_reset_ep_rxcsr(struct hgusb20_dev *p_dev, uint8 ep_num);
|
|||
|
|
void hgusb20_host_reset_ep_txcsr(struct hgusb20_dev *p_dev, uint8 ep_num);
|
|||
|
|
void hgusb20_host_hub_ep0_mange(struct hgusb20_dev *p_dev, hgusb20_pipe_attr *usb_pipe);
|
|||
|
|
/**
|
|||
|
|
* @}
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @}
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#ifdef __cplusplus
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
#endif /* USB_DEV_API_H */
|