8#include "esp_dma_utils.h"
9#include "esp_heap_caps.h"
10#include "usb/core/ep.hpp"
12#if SOC_USB_OTG_SUPPORTED && defined(CONFIG_IDF_TARGET_ESP32S3) && CONFIG_IDF_TARGET_ESP32S3
14#include "soc/usb_dwc_struct.h"
16namespace LibXR::ESPUSBDetail
19inline constexpr uint32_t DWC2_FS_REG_BASE = 0x60080000UL;
20inline constexpr size_t FIFO_BASE_OFFSET = 0x1000U;
21inline constexpr size_t FIFO_STRIDE = 0x1000U;
23inline constexpr uint8_t RX_STATUS_GLOBAL_OUT_NAK = 1U;
24inline constexpr uint8_t RX_STATUS_DATA = 2U;
25inline constexpr uint8_t RX_STATUS_TRANSFER_COMPLETE = 3U;
26inline constexpr uint8_t RX_STATUS_SETUP_DONE = 4U;
27inline constexpr uint8_t RX_STATUS_SETUP_DATA = 6U;
29inline constexpr uint8_t ENUM_SPEED_FULL_30_TO_60_MHZ = 1U;
30inline constexpr uint8_t ENUM_SPEED_FULL_48_MHZ = 3U;
32inline constexpr size_t WORD_SIZE =
sizeof(uint32_t);
33inline constexpr uint8_t FLUSH_ALL_TX_FIFO = 0x10U;
34inline constexpr uint32_t DMA_BURST_INCR4 = 4U;
35inline constexpr uint32_t DMA_MEMORY_CAPS =
36 MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA | MALLOC_CAP_8BIT;
37inline constexpr uint16_t ESP32_SX_FS_DMA_MIN_RX_FIFO_WORDS = 88U;
38inline constexpr uint16_t ESP32_SX_FS_MIN_TX_FIFO_WORDS = 16U;
39inline constexpr uint32_t DISABLE_OUT_WAIT_GUARD = 100000U;
41#if defined(CONFIG_USB_ALIGN_SIZE)
42inline constexpr size_t USB_DMA_ALIGNMENT = CONFIG_USB_ALIGN_SIZE;
43#elif defined(CONFIG_CACHE_L1_CACHE_LINE_SIZE)
44inline constexpr size_t USB_DMA_ALIGNMENT = CONFIG_CACHE_L1_CACHE_LINE_SIZE;
46inline constexpr size_t USB_DMA_ALIGNMENT = 64U;
49constexpr uint32_t PackTxFifoSizeReg(uint16_t start, uint16_t words)
51 return (
static_cast<uint32_t
>(words) << 16U) |
static_cast<uint32_t
>(start);
54bool CacheSyncDmaBuffer(
const void* addr,
size_t size,
bool cache_to_mem,
55 bool allow_unaligned =
false);
56size_t AlignUp(
size_t value,
size_t align);
57esp_dma_mem_info_t UsbDmaMemInfo();
58bool CanUseDirectInDmaBuffer(
const void* ptr,
size_t size);
59bool CanUseDirectOutDmaBuffer(
const void* ptr,
size_t size);
60uint16_t CalcRxFifoWords(uint16_t largest_packet_size, uint8_t ep_count);
61uint16_t CalcConfiguredRxFifoWords(uint16_t largest_packet_size, uint8_t ep_count,
63uint16_t GetHardwareFifoDepthWords();
64uint8_t EncodeEp0Mps(uint16_t packet_size);
66uint16_t CalcTxFifoWords(uint16_t packet_size,
bool dma_enabled);
67volatile uint32_t* GetEndpointFifo(usb_dwc_dev_t* dev, uint8_t ep_num);
68void WriteFifoPacket(
volatile uint32_t* fifo,
const uint8_t* src,
size_t size);
69void ReadFifoPacket(
const volatile uint32_t* fifo, uint8_t* dst,
size_t size);
70uint16_t PacketCount(
size_t size, uint16_t max_packet_size);
71void FlushTxFifo(usb_dwc_dev_t* dev, uint8_t fifo_num);
72void DisableInEndpointAndWait(usb_dwc_dev_t* dev);
73void DisableInEndpointAndWait(usb_dwc_dev_t* dev, uint8_t ep_num);
75template <
typename EpCtl>
76void StartEndpointTransfer(
volatile EpCtl& reg)
87template <
typename DoepCtl>
88void DisableOutEndpointAndWait(
volatile DoepCtl& ctl)
91 disable.val = ctl.val;
93 const bool was_enabled = disable.epena;
98 ctl.val = disable.val;
105 uint32_t guard = DISABLE_OUT_WAIT_GUARD;
106 while (ctl.epena && guard > 0U)