pinebuds/platform/hal/hal_usb.h
2022-08-15 17:20:27 +08:00

232 lines
6.2 KiB
C

/***************************************************************************
*
* Copyright 2015-2019 BES.
* All rights reserved. All unpublished rights reserved.
*
* No part of this work may be used or reproduced in any form or by any
* means, or stored in a database or retrieval system, without prior written
* permission of BES.
*
* Use of this work is governed by a license granted by BES.
* This work contains confidential and proprietary information of
* BES. which is protected by copyright, trade secret,
* trademark and other intellectual property rights.
*
****************************************************************************/
#ifndef __HAL_USB_H__
#define __HAL_USB_H__
#ifdef __cplusplus
extern "C" {
#endif
#include "stdint.h"
#include "stdbool.h"
#define USB_MAX_PACKET_SIZE_CTRL 64
#ifdef USB_HIGH_SPEED
#define USB_MAX_PACKET_SIZE_BULK 512
#define USB_MAX_PACKET_SIZE_INT 1024
#define USB_MAX_PACKET_SIZE_ISO 1024
#define USB_FIFO_MPS_ISO_SEND 800
#else
#define USB_MAX_PACKET_SIZE_BULK 64
#define USB_MAX_PACKET_SIZE_INT 64
#define USB_MAX_PACKET_SIZE_ISO 1023
#define USB_FIFO_MPS_ISO_SEND 768
#endif
// H/w register bit field width limitation
#define EPN_MAX_PKTCNT ((1 << 10) - 1)
#define EPN_MAX_XFERSIZE ((1 << 19) - 1)
#define EPNUM 6
#define CTRL_EPNUM 2
#define USB_L1_LIGHT_SLEEP_BESL USB_BESL_125US
#define USB_L1_DEEP_SLEEP_BESL USB_BESL_6000US
enum HAL_USB_API_MODE {
HAL_USB_API_NONBLOCKING,
HAL_USB_API_BLOCKING,
};
enum EP_DIR {
EP_OUT,
EP_IN,
};
enum CTRL_STAGE {
NONE_STAGE,
WAIT_SETUP_STAGE,
SETUP_STAGE,
DATA_OUT_STAGE,
DATA_IN_STAGE,
STATUS_OUT_STAGE,
STATUS_IN_STAGE,
};
enum ZLP_STATE {
ZLP_AUTO,
ZLP_DISABLED,
};
enum XFER_COMPL_STATE {
XFER_COMPL_SUCCESS,
XFER_COMPL_ERROR,
};
enum HAL_USB_STATE_EVENT {
HAL_USB_EVENT_RESET, // RESET event should be processed as quickly as possible
HAL_USB_EVENT_DISCONNECT,
HAL_USB_EVENT_SUSPEND,
HAL_USB_EVENT_L1_DEEP_SLEEP,
HAL_USB_EVENT_RESUME,
HAL_USB_EVENT_STALL,
HAL_USB_EVENT_UNSTALL,
HAL_USB_EVENT_QTY
};
enum USB_BESL_T {
USB_BESL_125US = 0,
USB_BESL_150US,
USB_BESL_200US,
USB_BESL_300US,
USB_BESL_400US,
USB_BESL_500US,
USB_BESL_1000US,
USB_BESL_2000US,
USB_BESL_3000US,
USB_BESL_4000US,
USB_BESL_5000US,
USB_BESL_6000US,
USB_BESL_7000US,
USB_BESL_8000US,
USB_BESL_9000US,
USB_BESL_10000US,
};
enum USB_BESL_HIRD_T {
USB_BESL_HIRD_75US,
USB_BESL_HIRD_100US,
USB_BESL_HIRD_150US,
USB_BESL_HIRD_250US,
USB_BESL_HIRD_350US,
USB_BESL_HIRD_450US,
USB_BESL_HIRD_950US,
USB_BESL_HIRD_1950US,
USB_BESL_HIRD_2950US,
USB_BESL_HIRD_3950US,
USB_BESL_HIRD_4950US,
USB_BESL_HIRD_5950US,
USB_BESL_HIRD_6950US,
USB_BESL_HIRD_7950US,
USB_BESL_HIRD_8950US,
USB_BESL_HIRD_9950US,
};
enum USB_HIRD_T {
USB_HIRD_50US,
USB_HIRD_125US,
USB_HIRD_200US,
USB_HIRD_275US,
USB_HIRD_350US,
USB_HIRD_425US,
USB_HIRD_500US,
USB_HIRD_575US,
USB_HIRD_650US,
USB_HIRD_725US,
USB_HIRD_800US,
USB_HIRD_875US,
USB_HIRD_950US,
USB_HIRD_1025US,
USB_HIRD_1100US,
USB_HIRD_1175US,
};
struct SETUP_PACKET {
struct {
uint8_t recipient : 5;
uint8_t type : 2;
uint8_t direction : 1;
} bmRequestType;
uint8_t bRequest;
uint16_t wValue;
uint16_t wIndex;
uint16_t wLength;
};
struct EP0_TRANSFER {
enum CTRL_STAGE stage;
uint8_t *data;
uint16_t length;
uint16_t trx_len;
struct SETUP_PACKET setup_pkt;
};
typedef const uint8_t *(*HAL_USB_GET_DESCRIPTOR_CALLBACK)(uint8_t);
typedef bool (*HAL_USB_SETUPRECV_CALLBACK)(struct EP0_TRANSFER *);
typedef bool (*HAL_USB_DATARECV_CALLBACK)(struct EP0_TRANSFER *);
typedef bool (*HAL_USB_SETCFG_CALLBACK)(uint8_t);
typedef bool (*HAL_USB_SETITF_CALLBACK)(uint16_t, uint16_t);
typedef void (*HAL_USB_REMOTE_WAKEUP_CALLBACK)(int enable);
typedef void (*HAL_USB_STATE_CHANGE_CALLBACK)(enum HAL_USB_STATE_EVENT, uint32_t);
typedef bool (*HAL_USB_RECV_COMPL_CALLBACK)(const uint8_t *, uint32_t, enum XFER_COMPL_STATE);
typedef bool (*HAL_USB_SEND_COMPL_CALLBACK)(const uint8_t *, uint32_t, enum XFER_COMPL_STATE);
struct HAL_USB_CALLBACKS {
HAL_USB_GET_DESCRIPTOR_CALLBACK device_desc;
HAL_USB_GET_DESCRIPTOR_CALLBACK cfg_desc;
HAL_USB_GET_DESCRIPTOR_CALLBACK string_desc;
HAL_USB_SETUPRECV_CALLBACK setuprecv;
HAL_USB_DATARECV_CALLBACK datarecv;
HAL_USB_SETCFG_CALLBACK setcfg;
HAL_USB_SETITF_CALLBACK setitf;
HAL_USB_REMOTE_WAKEUP_CALLBACK set_remote_wakeup;
HAL_USB_STATE_CHANGE_CALLBACK state_change;
HAL_USB_RECV_COMPL_CALLBACK epn_recv_compl[EPNUM - 1];
HAL_USB_SEND_COMPL_CALLBACK epn_send_compl[EPNUM - 1];
};
int hal_usb_open(const struct HAL_USB_CALLBACKS *c, enum HAL_USB_API_MODE m);
int hal_usb_reopen(const struct HAL_USB_CALLBACKS *c, uint8_t dcfg, uint8_t alt, uint16_t itf);
void hal_usb_close(void);
int hal_usb_remote_wakeup(int signal);
void hal_usb_detect_disconn(void);
void hal_usb_lpm_sleep_enable(void);
void hal_usb_lpm_sleep_disable(void);
int hal_usb_configured(void);
int hal_usb_suspended(void);
uint32_t hal_usb_calc_hshb_ep_mps(uint32_t pkt_size);
int hal_usb_activate_epn(enum EP_DIR dir, uint8_t ep, uint8_t type, uint16_t mps);
int hal_usb_deactivate_epn(enum EP_DIR dir, uint8_t ep);
int hal_usb_update_recv_epn_mps(uint8_t ep, uint16_t mps);
int hal_usb_update_send_epn_mc(uint8_t ep, uint8_t mc);
void hal_usb_disable_ep(enum EP_DIR dir, uint8_t ep);
void hal_usb_stall_ep(enum EP_DIR dir, uint8_t ep);
void hal_usb_unstall_ep(enum EP_DIR dir, uint8_t ep);
int hal_usb_get_ep_stall_state(enum EP_DIR dir, uint8_t ep);
void hal_usb_stop_ep(enum EP_DIR dir, uint8_t ep);
int hal_usb_recv_epn(uint8_t ep, uint8_t *buffer, uint32_t size);
int hal_usb_send_epn(uint8_t ep, const uint8_t *buffer, uint32_t size, enum ZLP_STATE zlp);
uint32_t hal_usb_get_soffn(void);
#ifdef __cplusplus
}
#endif
#endif