mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-15 17:02:53 +08:00
400 lines
12 KiB
C
400 lines
12 KiB
C
/*
|
|
* Copyright 2021 MindMotion Microelectronics Co., Ltd.
|
|
* All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#ifndef __HAL_USB_H__
|
|
#define __HAL_USB_H__
|
|
|
|
#include "hal_common.h"
|
|
#include "hal_usb_bdt.h"
|
|
|
|
/*!
|
|
* @addtogroup USB
|
|
* @{
|
|
*/
|
|
|
|
/*!
|
|
* @brief USB driver version number.
|
|
*/
|
|
#define USB_DRIVER_VERSION 0u /*!< USB_0. */
|
|
|
|
|
|
/*!
|
|
* @addtogroup USB_INT
|
|
* @brief USB_INT mask codes
|
|
* @{
|
|
*/
|
|
#define USB_INT_RESET USB_FSINTSTAT_USBRST_MASK /*!< USB Interrupt: USB bus reset. */
|
|
#define USB_INT_ERROR USB_FSINTSTAT_ERROR_MASK /*!< USB Interrupt: Error happend. */
|
|
#define USB_INT_SOFTOK USB_FSINTSTAT_SOFTOK_MASK /*!< USB Interrupt: Recv a SOF_Tok. */
|
|
#define USB_INT_TOKENDONE USB_FSINTSTAT_TOKDNE_MASK /*!< USB Interrupt: Token done. */
|
|
#define USB_INT_SLEEP USB_FSINTSTAT_SLEEP_MASK /*!< USB Interrupt: Sleep. */
|
|
#define USB_INT_RESUME USB_FSINTSTAT_RESUME_MASK /*!< USB Interrupt: Resume. */
|
|
#define USB_INT_ATTACH USB_FSINTSTAT_ATTACH_MASK /*!< USB Interrupt: Attach. */
|
|
#define USB_INT_STALL USB_FSINTSTAT_STALL_MASK /*!< USB Interrupt: Stall. */
|
|
/*!
|
|
* @}
|
|
*/
|
|
|
|
/*!
|
|
* @addtogroup USB_INT_ERR
|
|
* @brief USB_INT_ERR mask codes
|
|
* @{
|
|
*/
|
|
#define USB_INT_ERR_PID USB_FSERRSTAT_PIDERR_MASK /*!< USB Error: PID check error. */
|
|
#define USB_INT_ERR_CRC5 USB_FSERRSTAT_CRC5EOF_MASK /*!< USB Error: CRC5 check failed. */
|
|
#define USB_INT_ERR_EOF USB_FSERRSTAT_CRC5EOF_MASK /*!< USB Error: EOF Error. */
|
|
#define USB_INT_ERR_CRC16 USB_FSERRSTAT_CRC16_MASK /*!< USB Error: CRC16 check failed. */
|
|
#define USB_INT_ERR_DFN8 USB_FSERRSTAT_DFN8_MASK /*!< USB Error: Data not 8bit. */
|
|
#define USB_INT_ERR_BTO USB_FSERRSTAT_BTOERR_MASK /*!< USB Error: BTO error. */
|
|
#define USB_INT_ERR_DMA USB_FSERRSTAT_DMAERR_MASK /*!< USB Error: DMA error. */
|
|
#define USB_INT_ERR_BTS USB_FSERRSTAT_BTSERR_MASK /*!< USB Error: Bit stuff error. */
|
|
/*!
|
|
* @}
|
|
*/
|
|
|
|
/*!
|
|
* @addtogroup USB_EP
|
|
* @brief USB_EP mask codes
|
|
* @{
|
|
*/
|
|
#define USB_EP_0 (1u << 0u ) /*!< EndPoint 0. */
|
|
#define USB_EP_1 (1u << 1u ) /*!< EndPoint 1. */
|
|
#define USB_EP_2 (1u << 2u ) /*!< EndPoint 2. */
|
|
#define USB_EP_3 (1u << 3u ) /*!< EndPoint 3. */
|
|
#define USB_EP_4 (1u << 4u ) /*!< EndPoint 4. */
|
|
#define USB_EP_5 (1u << 5u ) /*!< EndPoint 5. */
|
|
#define USB_EP_6 (1u << 6u ) /*!< EndPoint 6. */
|
|
#define USB_EP_7 (1u << 7u ) /*!< EndPoint 7. */
|
|
#define USB_EP_8 (1u << 8u ) /*!< EndPoint 8. */
|
|
#define USB_EP_9 (1u << 9u ) /*!< EndPoint 9. */
|
|
#define USB_EP_10 (1u << 10u) /*!< EndPoint 10. */
|
|
#define USB_EP_11 (1u << 11u) /*!< EndPoint 11. */
|
|
#define USB_EP_12 (1u << 12u) /*!< EndPoint 12. */
|
|
#define USB_EP_13 (1u << 13u) /*!< EndPoint 13. */
|
|
#define USB_EP_14 (1u << 14u) /*!< EndPoint 14. */
|
|
#define USB_EP_15 (1u << 15u) /*!< EndPoint 15. */
|
|
/*!
|
|
* @}
|
|
*/
|
|
|
|
/*!
|
|
* @brief USB TokenPid type.
|
|
*/
|
|
typedef enum
|
|
{
|
|
USB_TokenPid_OUT = 0x1u, /*!< USB Token Pid: OUT. */
|
|
USB_TokenPid_IN = 0x9u, /*!< USB Token Pid: IN. */
|
|
USB_TokenPid_SETUP = 0xDu, /*!< USB Token Pid: SETUP. */
|
|
} USB_TokenPid_Type;
|
|
|
|
/*!
|
|
* @brief USB Direction type.
|
|
*/
|
|
typedef enum
|
|
{
|
|
USB_Direction_OUT = 0x0u, /*!< USB Direstion: IN. */
|
|
USB_Direction_IN = 0x1u, /*!< USB Direstion: OUT. */
|
|
USB_Direction_NULL, /*!< USB Direstion: NULL. */
|
|
} USB_Direction_Type;
|
|
|
|
/*!
|
|
* @brief USB BufDesp OddEven type.
|
|
*/
|
|
typedef enum
|
|
{
|
|
USB_BufDesp_OddEven_Even = 0x0u, /*!< Buffer Descriptor OddEven: Even. */
|
|
USB_BufDesp_OddEven_Odd = 0x1u, /*!< Buffer Descriptor OddEven: Odd. */
|
|
} USB_BufDesp_OddEven_Type;
|
|
|
|
/*!
|
|
* @brief USB EndPoint Mode.
|
|
*/
|
|
typedef enum
|
|
{
|
|
USB_EndPointMode_Control = 1u, /*!< USB EndPoint Mode: Control xfer. */
|
|
USB_EndPointMode_Bulk = 2u, /*!< USB EndPoint Mode: Bulk xfer. */
|
|
USB_EndPointMode_Interrupt = 3u, /*!< USB EndPoint Mode: Interrupt xfer. */
|
|
USB_EndPointMode_Isochronous = 4u, /*!< USB EndPoint Mode: isoch xfer. */
|
|
USB_EndPointMode_NULL, /*!< USB EndPoint Mode: NULL. */
|
|
} USB_EndPointMode_Type;
|
|
|
|
/*!
|
|
* @brief This type of structure instance is used to keep the settings when calling the @ref USB_InitDevice() to initialize the USB module.
|
|
*/
|
|
typedef struct
|
|
{
|
|
uint32_t BufDespTable_Addr; /*!< BufDespTable addr. */
|
|
} USB_Device_Init_Type;
|
|
|
|
/*!
|
|
* @brief Initialize the USB module.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @param init Pointer to the initialization structure. See to @ref USB_Device_Init_Type.
|
|
* @return None.
|
|
*/
|
|
void USB_InitDevice(USB_Type * USBx, USB_Device_Init_Type * init);
|
|
|
|
/*!
|
|
* @brief Enable interrupts of the USB module.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @param interrupts Interrupt code masks. See to @ref USB_INT.
|
|
* @param enable 'true' to enable the indicated interrupts, 'false' to disable the indicated interrupts.
|
|
* @return None.
|
|
*/
|
|
void USB_EnableInterrupts(USB_Type * USBx, uint32_t interrupts, bool enable);
|
|
|
|
/*!
|
|
* @brief Get the enabled interrupts status flags of the USB module.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @return Interrupt status flags. See to @ref USB_INT.
|
|
*/
|
|
uint32_t USB_GetEnabledInterrupts(USB_Type * USBx);
|
|
|
|
/*!
|
|
* @brief Get the interrupts status flags of the USB module.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @return Interrupt status flags. See to @ref USB_INT.
|
|
*/
|
|
uint32_t USB_GetInterruptStatus(USB_Type * USBx);
|
|
|
|
/*!
|
|
* @brief Clear the interrupts status flags of the USB module.
|
|
|
|
* @param USBx USB instance.
|
|
* @param interrupts Interrupt status flags. See to @ref USB_INT.
|
|
* @return None.
|
|
*/
|
|
void USB_ClearInterruptStatus(USB_Type * USBx, uint32_t interrupts);
|
|
|
|
/*!
|
|
* @brief Enable error interrupts of the USB module.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @param interrupts Error Interrupt code masks. See to @ref USB_INT_ERR.
|
|
* @param enable 'true' to enable the indicated interrupts, 'false' to disable the indicated interrupts.
|
|
* @return None.
|
|
*/
|
|
void USB_EnableErrInterrupts(USB_Type * USBx, uint32_t interrupts, bool enable);
|
|
|
|
/*!
|
|
* @brief Get the enabled error interrupts status flags of the USB module.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @return Interrupt status flags. See to @ref USB_INT_ERR.
|
|
*/
|
|
uint32_t USB_GetEnabledErrInterrupts(USB_Type * USBx);
|
|
|
|
/*!
|
|
* @brief Get the error interrupts status flags of the USB module.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @return Interrupt status flags. See to @ref USB_INT_ERR.
|
|
*/
|
|
uint32_t USB_GetErrInterruptStatus(USB_Type * USBx);
|
|
|
|
/*!
|
|
* @brief Clear the error interrupts status flags of the USB module.
|
|
|
|
* @param USBx USB instance.
|
|
* @param interrupts Interrupt status flags. See to @ref USB_INT_ERR.
|
|
* @return None.
|
|
*/
|
|
void USB_ClearErrInterruptStatus(USB_Type * USBx, uint32_t interrupts);
|
|
|
|
/*!
|
|
* @brief Enable USB.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @param enable 'true' to enable the module, 'false' to disable the module.
|
|
* @return None.
|
|
*/
|
|
void USB_Enable(USB_Type * USBx, bool enable);
|
|
|
|
/*!
|
|
* @brief Enable USB BufDesp ODD_EVEN Reset, and make only even BufDesp can be used.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @param enable 'true' to enable the feature, 'false' to disable the feature.
|
|
* @return None.
|
|
*/
|
|
void USB_EnableOddEvenReset(USB_Type * USBx, bool enable);
|
|
|
|
/*!
|
|
* @brief Enable USB Resume signal.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @param enable 'true' to enable the resume signal, 'false' to disable the resume signal.
|
|
* @return None.
|
|
*/
|
|
void USB_EnableResumeSignal(USB_Type * USBx, bool enable);
|
|
|
|
/*!
|
|
* @brief Enable USB Suspend.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @param enable 'true' to enable suspend, 'false' to disable suspend.
|
|
* @return None.
|
|
*/
|
|
void USB_EnableSuspend(USB_Type * USBx, bool enable);
|
|
|
|
/*!
|
|
* @brief Set Device address. This address is distribute by host.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @param addr The Device address.
|
|
* @return None.
|
|
*/
|
|
void USB_SetDeviceAddr(USB_Type * USBx, uint8_t addr);
|
|
|
|
/*!
|
|
* @brief Get Device address.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @return The Device address.
|
|
*/
|
|
uint8_t USB_GetDeviceAddr(USB_Type * USBx);
|
|
|
|
/*!
|
|
* @brief Get buffer descriptor table address.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @return The BufDespTable address.
|
|
*/
|
|
uint32_t USB_GetBufDespTableAddr(USB_Type * USBx);
|
|
|
|
/*!
|
|
* @brief Get the USB Frame Number.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @return The USB Frame Number.
|
|
*/
|
|
uint32_t USB_GetFrameNumber(USB_Type * USBx);
|
|
|
|
/*!
|
|
* @brief Get BufDesp after USB_INT_TOKENDONE interrupt happened and before clear USB_INT_TOKENDONE interrupt status.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @return BufDesp address.
|
|
*/
|
|
USB_BufDesp_Type * USB_GetBufDesp(USB_Type * USBx);
|
|
|
|
/*!
|
|
* @brief Get Token Pid from BufDesp before the BufDesp Reset.
|
|
*
|
|
* @param bd BufDesp addr.
|
|
* @return Token Pid.
|
|
*/
|
|
USB_TokenPid_Type USB_BufDesp_GetTokenPid(USB_BufDesp_Type * bd);
|
|
|
|
/*!
|
|
* @brief Get packet addr from BufDesp before the BufDesp Reset.
|
|
*
|
|
* @param bd BufDesp addr.
|
|
* @return Packet addrress.
|
|
*/
|
|
uint32_t USB_BufDesp_GetPacketAddr(USB_BufDesp_Type * bd);
|
|
|
|
/*!
|
|
* @brief Get packet size from BufDesp before the BufDesp Reset.
|
|
*
|
|
* @param bd BufDesp addr.
|
|
* @return Packet size.
|
|
*/
|
|
uint32_t USB_BufDesp_GetPacketSize(USB_BufDesp_Type * bd);
|
|
|
|
/*!
|
|
* @brief Reset BufDesp.
|
|
*
|
|
* @param bd BufDesp addr.
|
|
* @return None.
|
|
*/
|
|
void USB_BufDesp_Reset(USB_BufDesp_Type * bd);
|
|
|
|
/*!
|
|
* @brief Get EndPoint index after USB_INT_TOKENDONE interrupt happened and before clear USB_INT_TOKENDONE interrupt status.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @return EndPoint index.
|
|
*/
|
|
uint32_t USB_GetEndPointIndex(USB_Type * USBx);
|
|
|
|
/*!
|
|
* @brief Get Xfer Direction after USB_INT_TOKENDONE interrupt happened and before clear USB_INT_TOKENDONE interrupt status.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @return Xfer Direction, See to @ref USB_Direction_Type.
|
|
*/
|
|
USB_Direction_Type USB_GetXferDirection(USB_Type * USBx);
|
|
|
|
/*!
|
|
* @brief Get BufDesp OddEven after USB_INT_TOKENDONE interrupt happened and before clear USB_INT_TOKENDONE interrupt status.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @return BufDesp OddEven.
|
|
*/
|
|
USB_BufDesp_OddEven_Type USB_GetBufDespOddEven(USB_Type * USBx);
|
|
|
|
/*!
|
|
* @brief Enable the end point.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @param index endpoint index.
|
|
* @param mode End point mode, See to @ref USB_EndPointMode_Type.
|
|
* @param enable 'true' to enable the EndPoint, 'false' to disable the EndPoint.
|
|
* @return None.
|
|
*/
|
|
void USB_EnableEndPoint(USB_Type * USBx, uint32_t index, USB_EndPointMode_Type mode, bool enable);
|
|
|
|
/*!
|
|
* @brief Stall EndPoint n.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @param ep_mask EndPoint mask, see to @ref USB_EP mask codes.
|
|
* @param enable 'true' to enable the EndPoint stall, 'false' to disable the EndPoint stall.
|
|
* @return None.
|
|
*/
|
|
void USB_EnableEndPointStall(USB_Type * USBx, uint32_t ep_mask, bool enable);
|
|
|
|
/*!
|
|
* @brief Get Enabled EndPoint stall status.
|
|
*
|
|
* @param USBx USB instance.
|
|
* @return stall status, see to @ref USB_EP mask codes.
|
|
*/
|
|
uint32_t USB_GetEnabledEndPointStall(USB_Type * USBx);
|
|
|
|
/*!
|
|
* @brief Xfer data by usb.
|
|
*
|
|
* @param bd BufDesp.
|
|
* @param data_n DATAn packet, n equal 0 or 1.
|
|
* @param data the address of data.
|
|
* @param len Data length.
|
|
* @return 'true': BufDesp can be xfer data, 'false': BufDesp is busy.
|
|
*/
|
|
bool USB_BufDesp_Xfer(USB_BufDesp_Type * bd, uint32_t data_n, uint8_t * data, uint32_t len);
|
|
|
|
/*!
|
|
* @brief Check whether BufDesp is busy.
|
|
*
|
|
* @param bd BufDesp addr.
|
|
* @return 'true': BufDesp is busy, 'false': BufDesp is not busy.
|
|
*/
|
|
bool USB_BufDesp_IsBusy(USB_BufDesp_Type * bd);
|
|
|
|
|
|
/*!
|
|
*@}
|
|
*/
|
|
|
|
#endif /* __HAL_USB_H__ */
|
|
|