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

173 lines
4.4 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"
#ifdef USB_HIGH_SPEED
#define MAX_USBHOST_PACKET_SIZE 512
#else
#define MAX_USBHOST_PACKET_SIZE 64
#endif
#define USBHOST_EPNUM 6
#define HAL_USBHOST_CHAN_NONE 0xFF
enum HAL_USBHOST_EP_TYPE_T {
HAL_USBHOST_EP_CTRL,
HAL_USBHOST_EP_ISO,
HAL_USBHOST_EP_BULK,
HAL_USBHOST_EP_INT,
HAL_USBHOST_EP_QTY
};
enum HAL_USBHOST_PID_TYPE_T {
HAL_USBHOST_PID_DATA0 = 0,
HAL_USBHOST_PID_DATA2 = 1,
HAL_USBHOST_PID_DATA1 = 2,
HAL_USBHOST_PID_MDATA = 3,
HAL_USBHOST_PID_SETUP = 3,
HAL_USBHOST_PID_QTY,
HAL_USBHOST_PID_AUTO = 0xFF,
};
enum HAL_USBHOST_PORT_EVENT_T {
HAL_USBHOST_PORT_CONN,
HAL_USBHOST_PORT_EN_LS,
HAL_USBHOST_PORT_EN_FS,
HAL_USBHOST_PORT_EN_HS,
HAL_USBHOST_PORT_EN_BAD,
HAL_USBHOST_PORT_DISCONN,
HAL_USBHOST_PORT_QTY
};
enum HAL_USBHOST_SETUP_STAGE_T {
HAL_USBHOST_SETUP_DATA_IN,
HAL_USBHOST_SETUP_DATA_OUT,
HAL_USBHOST_SETUP_STATUS_IN,
HAL_USBHOST_SETUP_STATUS_OUT,
HAL_USBHOST_SETUP_DONE,
HAL_USBHOST_SETUP_ERROR,
HAL_USBHOST_SETUP_STAGE_QTY
};
enum HAL_USBHOST_XFER_ERR_T {
HAL_USBHOST_XFER_ERR_NONE,
HAL_USBHOST_XFER_ERR_AHB,
HAL_USBHOST_XFER_ERR_STALL,
HAL_USBHOST_XFER_ERR_TRANSACTION,
HAL_USBHOST_XFER_ERR_BABBLE,
HAL_USBHOST_XFER_ERR_FRAME_OVERRUN,
HAL_USBHOST_XFER_ERR_DATA_TOGGLE,
HAL_USBHOST_XFER_ERR_TIMEOUT,
HAL_USBHOST_XFER_ERR_DISCONN,
HAL_USBHOST_XFER_ERR_QTY
};
struct HAL_USBHOST_SETUP_XFER_T;
typedef void (*HAL_USBHOST_DELAY_FUNC)(uint32_t ms);
typedef void (*HAL_USBHOST_PORT_HANDLER)(enum HAL_USBHOST_PORT_EVENT_T evt);
typedef void (*HAL_USBHOST_XFER_COMPL_HANDLER)(uint8_t chan, uint8_t *buf, uint32_t len, enum HAL_USBHOST_XFER_ERR_T error);
typedef void (*HAL_USBHOST_SETUP_COMPL_HANDLER)(struct HAL_USBHOST_SETUP_XFER_T *setup, int error);
enum HAL_USBHOST_PLUG_STATUS_T {
HAL_USBHOST_PLUG_UNKNOWN,
HAL_USBHOST_PLUG_IN,
HAL_USBHOST_PLUG_OUT,
};
typedef void (*HAL_USBHOST_PLUG_HANDLER)(enum HAL_USBHOST_PLUG_STATUS_T status);
struct HAL_USBHOST_CHAN_TYPE_T {
uint16_t mps;
uint8_t ep_num;
uint8_t ep_in;
enum HAL_USBHOST_EP_TYPE_T ep_type;
uint8_t dev_addr;
};
struct HAL_USBHOST_XFER_T {
uint8_t *buf;
uint32_t size;
uint8_t multi_cnt;
enum HAL_USBHOST_PID_TYPE_T pid;
HAL_USBHOST_XFER_COMPL_HANDLER handler;
};
struct HAL_USBHOST_SETUP_PKT_T {
uint8_t bmRequestType;
uint8_t bRequest;
uint16_t wValue;
uint16_t wIndex;
uint16_t wLength;
};
struct HAL_USBHOST_SETUP_XFER_T {
struct HAL_USBHOST_SETUP_PKT_T setup_pkt;
enum HAL_USBHOST_SETUP_STAGE_T next_stage;
HAL_USBHOST_SETUP_COMPL_HANDLER handler;
uint8_t *data_buf;
uint8_t chan_out;
uint8_t chan_in;
};
int hal_usbhost_open(HAL_USBHOST_PORT_HANDLER port_cb, HAL_USBHOST_DELAY_FUNC delay_fn);
void hal_usbhost_close(void);
void hal_usbhost_halt_chan(uint8_t chan);
void hal_usbhost_port_reset(uint32_t ms);
int hal_usbhost_get_chan(uint8_t *chan);
int hal_usbhost_free_chan(uint8_t chan);
int hal_usbhost_init_chan(uint8_t chan, const struct HAL_USBHOST_CHAN_TYPE_T *type);
int hal_usbhost_update_chan_dev_addr(uint8_t chan, uint8_t dev_addr);
int hal_usbhost_update_chan_mps(uint8_t chan, uint16_t mps);
int hal_usbhost_start_xfer(uint8_t chan, const struct HAL_USBHOST_XFER_T *xfer);
int hal_usbhost_start_setup_xfer(const struct HAL_USBHOST_SETUP_XFER_T *setup, uint32_t *recv_len);
void hal_usbhost_detect(enum HAL_USBHOST_PLUG_STATUS_T status, HAL_USBHOST_PLUG_HANDLER handler);
void hal_usbhost_sleep(void);
void hal_usbhost_wakeup(void);
#ifdef __cplusplus
}
#endif
#endif