Merge pull request #1091 from hathach/esp32sx-compliance
Esp32sx compliance
This commit is contained in:
		@@ -380,7 +380,7 @@ static inline const char* tu_lookup_find(tu_lookup_table_t const* p_table, uint3
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // not found return the key value in hex
 | 
			
		||||
  sprintf(not_found, "0x%08lX", key);
 | 
			
		||||
  sprintf(not_found, "0x%08lX", (unsigned long) key);
 | 
			
		||||
 | 
			
		||||
  return not_found;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -42,10 +42,6 @@
 | 
			
		||||
 | 
			
		||||
#include "device/dcd.h"
 | 
			
		||||
 | 
			
		||||
// Since TinyUSB doesn't use SOF for now, and this interrupt too often (1ms interval)
 | 
			
		||||
// We disable SOF for now until needed later on
 | 
			
		||||
#define USE_SOF     0
 | 
			
		||||
 | 
			
		||||
// Max number of bi-directional endpoints including EP0
 | 
			
		||||
// Note: ESP32S2 specs say there are only up to 5 IN active endpoints include EP0
 | 
			
		||||
// We should probably prohibit enabling Endpoint IN > 4 (not done yet)
 | 
			
		||||
@@ -92,11 +88,12 @@ static void bus_reset(void)
 | 
			
		||||
    USB0.out_ep_reg[ep_num].doepctl |= USB_DO_SNAK0_M; // DOEPCTL0_SNAK
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  USB0.dcfg &= ~USB_DEVADDR_M; // reset address
 | 
			
		||||
  // clear device address
 | 
			
		||||
  USB0.dcfg &= ~USB_DEVADDR_M;
 | 
			
		||||
 | 
			
		||||
  USB0.daintmsk |= USB_OUTEPMSK0_M | USB_INEPMSK0_M;
 | 
			
		||||
  USB0.doepmsk |= USB_SETUPMSK_M | USB_XFERCOMPLMSK;
 | 
			
		||||
  USB0.diepmsk |= USB_TIMEOUTMSK_M | USB_DI_XFERCOMPLMSK_M /*| USB_INTKNTXFEMPMSK_M*/;
 | 
			
		||||
  USB0.daintmsk = USB_OUTEPMSK0_M | USB_INEPMSK0_M;
 | 
			
		||||
  USB0.doepmsk  = USB_SETUPMSK_M | USB_XFERCOMPLMSK;
 | 
			
		||||
  USB0.diepmsk  = USB_TIMEOUTMSK_M | USB_DI_XFERCOMPLMSK_M /*| USB_INTKNTXFEMPMSK_M*/;
 | 
			
		||||
 | 
			
		||||
  // "USB Data FIFOs" section in reference manual
 | 
			
		||||
  // Peripheral FIFO architecture
 | 
			
		||||
@@ -193,9 +190,6 @@ void dcd_init(uint8_t rhport)
 | 
			
		||||
  USB0.gintsts = ~0U; //clear pending ints
 | 
			
		||||
  USB0.gintmsk = USB_OTGINTMSK_M   |
 | 
			
		||||
                 USB_MODEMISMSK_M  |
 | 
			
		||||
          #if USE_SOF
 | 
			
		||||
                 USB_SOFMSK_M      |
 | 
			
		||||
          #endif
 | 
			
		||||
                 USB_RXFLVIMSK_M   |
 | 
			
		||||
                 USB_ERLYSUSPMSK_M |
 | 
			
		||||
                 USB_USBSUSPMSK_M  |
 | 
			
		||||
@@ -220,8 +214,17 @@ void dcd_remote_wakeup(uint8_t rhport)
 | 
			
		||||
{
 | 
			
		||||
  (void)rhport;
 | 
			
		||||
 | 
			
		||||
  // TODO must manually clear this bit after 1-15 ms
 | 
			
		||||
  // USB0.DCTL |= USB_RMTWKUPSIG_M;
 | 
			
		||||
  // set remote wakeup
 | 
			
		||||
  USB0.dctl |= USB_RMTWKUPSIG_M;
 | 
			
		||||
 | 
			
		||||
  // enable SOF to detect bus resume
 | 
			
		||||
  USB0.gintsts = USB_SOF_M;
 | 
			
		||||
  USB0.gintmsk |= USB_SOFMSK_M;
 | 
			
		||||
 | 
			
		||||
  // Per specs: remote wakeup signal bit must be clear within 1-15ms
 | 
			
		||||
  vTaskDelay(pdMS_TO_TICKS(1));
 | 
			
		||||
 | 
			
		||||
  USB0.dctl &= ~USB_RMTWKUPSIG_M;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// connect by enabling internal pull-up resistor on D+/D-
 | 
			
		||||
@@ -260,9 +263,10 @@ bool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const *desc_edpt)
 | 
			
		||||
  xfer->max_size = desc_edpt->wMaxPacketSize.size;
 | 
			
		||||
 | 
			
		||||
  if (dir == TUSB_DIR_OUT) {
 | 
			
		||||
    out_ep[epnum].doepctl |= USB_USBACTEP0_M |
 | 
			
		||||
                             desc_edpt->bmAttributes.xfer << USB_EPTYPE0_S |
 | 
			
		||||
                             desc_edpt->wMaxPacketSize.size << USB_MPS0_S;
 | 
			
		||||
    out_ep[epnum].doepctl |= USB_USBACTEP1_M |
 | 
			
		||||
                             desc_edpt->bmAttributes.xfer << USB_EPTYPE1_S |
 | 
			
		||||
                             (desc_edpt->bmAttributes.xfer != TUSB_XFER_ISOCHRONOUS ? USB_DO_SETD0PID1_M : 0) |
 | 
			
		||||
                             desc_edpt->wMaxPacketSize.size << USB_MPS1_S;
 | 
			
		||||
    USB0.daintmsk |= (1 << (16 + epnum));
 | 
			
		||||
  } else {
 | 
			
		||||
    // "USB Data FIFOs" section in reference manual
 | 
			
		||||
@@ -315,7 +319,25 @@ bool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const *desc_edpt)
 | 
			
		||||
void dcd_edpt_close_all(uint8_t rhport)
 | 
			
		||||
{
 | 
			
		||||
  (void) rhport;
 | 
			
		||||
  // TODO implement dcd_edpt_close_all()
 | 
			
		||||
 | 
			
		||||
  usb_out_endpoint_t *out_ep = &(USB0.out_ep_reg[0]);
 | 
			
		||||
  usb_in_endpoint_t *in_ep = &(USB0.in_ep_reg[0]);
 | 
			
		||||
 | 
			
		||||
  // Disable non-control interrupt
 | 
			
		||||
  USB0.daintmsk = USB_OUTEPMSK0_M | USB_INEPMSK0_M;
 | 
			
		||||
 | 
			
		||||
  for(uint8_t n = 1; n < EP_MAX; n++)
 | 
			
		||||
  {
 | 
			
		||||
    // disable OUT endpoint
 | 
			
		||||
    out_ep[n].doepctl = 0;
 | 
			
		||||
    xfer_status[n][TUSB_DIR_OUT].max_size = 0;
 | 
			
		||||
 | 
			
		||||
    // disable IN endpoint
 | 
			
		||||
    in_ep[n].diepctl = 0;
 | 
			
		||||
    xfer_status[n][TUSB_DIR_IN].max_size = 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _allocated_fifos = 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes)
 | 
			
		||||
@@ -367,49 +389,6 @@ bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t to
 | 
			
		||||
bool dcd_edpt_xfer_fifo (uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes)
 | 
			
		||||
{
 | 
			
		||||
  (void)rhport;
 | 
			
		||||
 | 
			
		||||
  // USB buffers always work in bytes so to avoid unnecessary divisions we demand item_size = 1
 | 
			
		||||
  TU_ASSERT(ff->item_size == 1);
 | 
			
		||||
 | 
			
		||||
  uint8_t const epnum = tu_edpt_number(ep_addr);
 | 
			
		||||
  uint8_t const dir   = tu_edpt_dir(ep_addr);
 | 
			
		||||
 | 
			
		||||
  xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, dir);
 | 
			
		||||
  xfer->buffer       = NULL;
 | 
			
		||||
  xfer->ff           = ff;
 | 
			
		||||
  xfer->total_len    = total_bytes;
 | 
			
		||||
  xfer->queued_len   = 0;
 | 
			
		||||
  xfer->short_packet = false;
 | 
			
		||||
 | 
			
		||||
  uint16_t num_packets = (total_bytes / xfer->max_size);
 | 
			
		||||
  uint8_t short_packet_size = total_bytes % xfer->max_size;
 | 
			
		||||
 | 
			
		||||
  // Zero-size packet is special case.
 | 
			
		||||
  if (short_packet_size > 0 || (total_bytes == 0)) {
 | 
			
		||||
    num_packets++;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ESP_LOGV(TAG, "Transfer <-> EP%i, %s, pkgs: %i, bytes: %i",
 | 
			
		||||
           epnum, ((dir == TUSB_DIR_IN) ? "USB0.HOST (in)" : "HOST->DEV (out)"),
 | 
			
		||||
           num_packets, total_bytes);
 | 
			
		||||
 | 
			
		||||
  // IN and OUT endpoint xfers are interrupt-driven, we just schedule them
 | 
			
		||||
  // here.
 | 
			
		||||
  if (dir == TUSB_DIR_IN) {
 | 
			
		||||
    // A full IN transfer (multiple packets, possibly) triggers XFRC.
 | 
			
		||||
    USB0.in_ep_reg[epnum].dieptsiz = (num_packets << USB_D_PKTCNT0_S) | total_bytes;
 | 
			
		||||
    USB0.in_ep_reg[epnum].diepctl |= USB_D_EPENA1_M | USB_D_CNAK1_M; // Enable | CNAK
 | 
			
		||||
 | 
			
		||||
    // Enable fifo empty interrupt only if there are something to put in the fifo.
 | 
			
		||||
    if(total_bytes != 0) {
 | 
			
		||||
      USB0.dtknqr4_fifoemptymsk |= (1 << epnum);
 | 
			
		||||
    }
 | 
			
		||||
  } else {
 | 
			
		||||
    // Each complete packet for OUT xfers triggers XFRC.
 | 
			
		||||
    USB0.out_ep_reg[epnum].doeptsiz |= USB_PKTCNT0_M | ((xfer->max_size & USB_XFERSIZE0_V) << USB_XFERSIZE0_S);
 | 
			
		||||
    USB0.out_ep_reg[epnum].doepctl  |= USB_EPENA0_M | USB_CNAK0_M;
 | 
			
		||||
  }
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -754,8 +733,8 @@ static void _dcd_int_handler(void* arg)
 | 
			
		||||
  (void) arg;
 | 
			
		||||
  uint8_t const rhport = 0;
 | 
			
		||||
 | 
			
		||||
  const uint32_t int_status = USB0.gintsts;
 | 
			
		||||
  //const uint32_t int_msk = USB0.gintmsk;
 | 
			
		||||
  const uint32_t int_msk = USB0.gintmsk;
 | 
			
		||||
  const uint32_t int_status = USB0.gintsts & int_msk;
 | 
			
		||||
 | 
			
		||||
  if (int_status & USB_USBRST_M) {
 | 
			
		||||
    // start of reset
 | 
			
		||||
@@ -808,12 +787,15 @@ static void _dcd_int_handler(void* arg)
 | 
			
		||||
    USB0.gotgint = otg_int;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
#if USE_SOF
 | 
			
		||||
  if (int_status & USB_SOF_M) {
 | 
			
		||||
    USB0.gintsts = USB_SOF_M;
 | 
			
		||||
    dcd_event_bus_signal(rhport, DCD_EVENT_SOF, true); // do nothing actually
 | 
			
		||||
 | 
			
		||||
    // Disable SOF interrupt since currently only used for remote wakeup detection
 | 
			
		||||
    USB0.gintmsk &= ~USB_SOFMSK_M;
 | 
			
		||||
 | 
			
		||||
    dcd_event_bus_signal(rhport, DCD_EVENT_SOF, true);
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  if (int_status & USB_RXFLVI_M) {
 | 
			
		||||
    // RXFLVL bit is read-only
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user