Change FIFO use indication to ff == NULL to avoid future errors.
This way people don't need to pay attention for the buffer pointer
This commit is contained in:
		@@ -321,6 +321,7 @@ bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t to
 | 
			
		||||
 | 
			
		||||
  xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, dir);
 | 
			
		||||
  xfer->buffer       = buffer;
 | 
			
		||||
  xfer->ff           = NULL;
 | 
			
		||||
  xfer->total_len    = total_bytes;
 | 
			
		||||
  xfer->queued_len   = 0;
 | 
			
		||||
  xfer->short_packet = false;
 | 
			
		||||
@@ -523,7 +524,12 @@ static void receive_packet(xfer_ctl_t *xfer, /* usb_out_endpoint_t * out_ep, */
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Common buffer read
 | 
			
		||||
  if (xfer->buffer)
 | 
			
		||||
  if (xfer->ff)
 | 
			
		||||
  {
 | 
			
		||||
    // Ring buffer
 | 
			
		||||
    tu_fifo_write_n(xfer->ff, (const void *) rx_fifo, to_recv_size);
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    uint8_t to_recv_rem = to_recv_size % 4;
 | 
			
		||||
    uint16_t to_recv_size_aligned = to_recv_size - to_recv_rem;
 | 
			
		||||
@@ -556,12 +562,6 @@ static void receive_packet(xfer_ctl_t *xfer, /* usb_out_endpoint_t * out_ep, */
 | 
			
		||||
        last_32b_bound[2] = (tmp & 0x00FF0000) >> 16;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    // Ring buffer
 | 
			
		||||
    tu_fifo_write_n(xfer->ff, (const void *) rx_fifo, to_recv_size);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  xfer->queued_len += xfer_size;
 | 
			
		||||
@@ -581,7 +581,11 @@ static void transmit_packet(xfer_ctl_t *xfer, volatile usb_in_endpoint_t *in_ep,
 | 
			
		||||
 | 
			
		||||
  uint16_t to_xfer_size = (remaining > xfer->max_size) ? xfer->max_size : remaining;
 | 
			
		||||
 | 
			
		||||
  if (xfer->buffer)
 | 
			
		||||
  if (xfer->ff)
 | 
			
		||||
  {
 | 
			
		||||
    tu_fifo_read_n(xfer->ff, (void *) tx_fifo, to_xfer_size);
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    uint8_t to_xfer_rem = to_xfer_size % 4;
 | 
			
		||||
    uint16_t to_xfer_size_aligned = to_xfer_size - to_xfer_rem;
 | 
			
		||||
@@ -616,10 +620,6 @@ static void transmit_packet(xfer_ctl_t *xfer, volatile usb_in_endpoint_t *in_ep,
 | 
			
		||||
      (*tx_fifo) = tmp;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    tu_fifo_read_n(xfer->ff, (void *) tx_fifo, to_xfer_size);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void read_rx_fifo(void)
 | 
			
		||||
 
 | 
			
		||||
@@ -61,6 +61,7 @@ void xfer_epsize_set(xfer_desc_t* xfer, uint16_t epsize)
 | 
			
		||||
void xfer_begin(xfer_desc_t* xfer, uint8_t * buffer, uint16_t total_bytes)
 | 
			
		||||
{
 | 
			
		||||
  xfer->buffer     = buffer;
 | 
			
		||||
  xfer->ff         = NULL;
 | 
			
		||||
  xfer->total_len  = total_bytes;
 | 
			
		||||
  xfer->actual_len = 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -68,6 +69,7 @@ void xfer_begin(xfer_desc_t* xfer, uint8_t * buffer, uint16_t total_bytes)
 | 
			
		||||
void xfer_end(xfer_desc_t* xfer)
 | 
			
		||||
{
 | 
			
		||||
  xfer->buffer     = NULL;
 | 
			
		||||
  xfer->ff         = NULL;
 | 
			
		||||
  xfer->total_len  = 0;
 | 
			
		||||
  xfer->actual_len = 0;
 | 
			
		||||
}
 | 
			
		||||
@@ -82,7 +84,7 @@ void xfer_packet_done(xfer_desc_t* xfer)
 | 
			
		||||
{
 | 
			
		||||
  uint16_t const xact_len = xfer_packet_len(xfer);
 | 
			
		||||
 | 
			
		||||
  if (xfer->buffer) xfer->buffer += xact_len;
 | 
			
		||||
  xfer->buffer += xact_len;
 | 
			
		||||
  xfer->actual_len += xact_len;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -436,13 +438,13 @@ void dcd_int_handler(uint8_t rhport)
 | 
			
		||||
        if (xact_len)
 | 
			
		||||
        {
 | 
			
		||||
          // write to EP fifo
 | 
			
		||||
          if (xfer->buffer)
 | 
			
		||||
          if (xfer->ff)
 | 
			
		||||
          {
 | 
			
		||||
            xact_ep_write(epnum, xfer->buffer, xact_len);
 | 
			
		||||
            tu_fifo_read_n(ff, (void *) &UDP->UDP_FDR[epnum], xact_len);
 | 
			
		||||
          }
 | 
			
		||||
          else
 | 
			
		||||
          {
 | 
			
		||||
            tu_fifo_read_n(ff, (void *) &UDP->UDP_FDR[epnum], xact_len);
 | 
			
		||||
            xact_ep_write(epnum, xfer->buffer, xact_len);
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          // TX ready for transfer
 | 
			
		||||
@@ -469,13 +471,13 @@ void dcd_int_handler(uint8_t rhport)
 | 
			
		||||
        uint16_t const xact_len = (uint16_t) ((UDP->UDP_CSR[epnum] & UDP_CSR_RXBYTECNT_Msk) >> UDP_CSR_RXBYTECNT_Pos);
 | 
			
		||||
 | 
			
		||||
        // Read from EP fifo
 | 
			
		||||
        if (xfer->buffer)
 | 
			
		||||
        if (xfer->ff)
 | 
			
		||||
        {
 | 
			
		||||
          xact_ep_read(epnum, xfer->buffer, xact_len);
 | 
			
		||||
          tu_fifo_write_n(xfer->ff, (const void *) &UDP->UDP_FDR[epnum], xact_len);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
          tu_fifo_write_n(xfer->ff, (const void *) &UDP->UDP_FDR[epnum], xact_len);
 | 
			
		||||
          xact_ep_read(epnum, xfer->buffer, xact_len);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        xfer_packet_done(xfer);
 | 
			
		||||
 
 | 
			
		||||
@@ -144,13 +144,13 @@ static void dcd_in_xfer(struct xfer_ctl_t *xfer, USBD_EP_T *ep)
 | 
			
		||||
{
 | 
			
		||||
  uint16_t bytes_now = tu_min16(xfer->in_remaining_bytes, xfer->max_packet_size);
 | 
			
		||||
 | 
			
		||||
  if (xfer->data_ptr)
 | 
			
		||||
  if (xfer->ff)
 | 
			
		||||
  {
 | 
			
		||||
    memcpy((uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), xfer->data_ptr, bytes_now);
 | 
			
		||||
    tu_fifo_read_n(xfer->ff, (void *) (USBD_BUF_BASE + ep->BUFSEG), bytes_now);
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    tu_fifo_read_n(xfer->ff, (void *) (USBD_BUF_BASE + ep->BUFSEG), bytes_now);
 | 
			
		||||
    memcpy((uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), xfer->data_ptr, bytes_now);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ep->MXPLD = bytes_now;
 | 
			
		||||
@@ -277,6 +277,7 @@ bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t to
 | 
			
		||||
 | 
			
		||||
  /* store away the information we'll needing now and later */
 | 
			
		||||
  xfer->data_ptr = buffer;
 | 
			
		||||
  xfer->ff       = NULL;
 | 
			
		||||
  xfer->in_remaining_bytes = total_bytes;
 | 
			
		||||
  xfer->total_bytes = total_bytes;
 | 
			
		||||
 | 
			
		||||
@@ -429,14 +430,14 @@ void dcd_int_handler(uint8_t rhport)
 | 
			
		||||
        if (out_ep)
 | 
			
		||||
        {
 | 
			
		||||
          /* copy the data from the PC to the previously provided buffer */
 | 
			
		||||
          if (xfer->data_ptr)
 | 
			
		||||
          if (xfer->ff)
 | 
			
		||||
          {
 | 
			
		||||
            memcpy(xfer->data_ptr, (uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), available_bytes);
 | 
			
		||||
            xfer->data_ptr += available_bytes;
 | 
			
		||||
            tu_fifo_write_n(xfer->ff, (const void *) (USBD_BUF_BASE + ep->BUFSEG), available_bytes);
 | 
			
		||||
          }
 | 
			
		||||
          else
 | 
			
		||||
          {
 | 
			
		||||
            tu_fifo_write_n(xfer->ff, (const void *) (USBD_BUF_BASE + ep->BUFSEG), available_bytes);
 | 
			
		||||
            memcpy(xfer->data_ptr, (uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), available_bytes);
 | 
			
		||||
            xfer->data_ptr += available_bytes;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          xfer->out_bytes_so_far += available_bytes;
 | 
			
		||||
@@ -452,8 +453,7 @@ void dcd_int_handler(uint8_t rhport)
 | 
			
		||||
          /* update the bookkeeping to reflect the data that has now been sent to the PC */
 | 
			
		||||
          xfer->in_remaining_bytes -= available_bytes;
 | 
			
		||||
 | 
			
		||||
          /* increment only if xfer->data_ptr != NULL - if xfer->data_ptr == NULL then a FIFO is used for which xfer->data_ptr MUST STAY ZERO! */
 | 
			
		||||
          if (xfer->data_ptr) xfer->data_ptr += available_bytes;
 | 
			
		||||
          xfer->data_ptr += available_bytes;
 | 
			
		||||
 | 
			
		||||
          /* if more data to send, send it; otherwise, alert TinyUSB that we've finished */
 | 
			
		||||
          if (xfer->in_remaining_bytes)
 | 
			
		||||
 
 | 
			
		||||
@@ -144,13 +144,13 @@ static void dcd_in_xfer(struct xfer_ctl_t *xfer, USBD_EP_T *ep)
 | 
			
		||||
{
 | 
			
		||||
  uint16_t bytes_now = tu_min16(xfer->in_remaining_bytes, xfer->max_packet_size);
 | 
			
		||||
 | 
			
		||||
  if (xfer->data_ptr)
 | 
			
		||||
  if (xfer->ff)
 | 
			
		||||
  {
 | 
			
		||||
    memcpy((uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), xfer->data_ptr, bytes_now);
 | 
			
		||||
    tu_fifo_read_n(xfer->ff, (void *) (USBD_BUF_BASE + ep->BUFSEG), bytes_now);
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    tu_fifo_read_n(xfer->ff, (void *) (USBD_BUF_BASE + ep->BUFSEG), bytes_now);
 | 
			
		||||
    memcpy((uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), xfer->data_ptr, bytes_now);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ep->MXPLD = bytes_now;
 | 
			
		||||
@@ -281,6 +281,7 @@ bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t to
 | 
			
		||||
 | 
			
		||||
  /* store away the information we'll needing now and later */
 | 
			
		||||
  xfer->data_ptr = buffer;
 | 
			
		||||
  xfer->ff       = NULL;
 | 
			
		||||
  xfer->in_remaining_bytes = total_bytes;
 | 
			
		||||
  xfer->total_bytes = total_bytes;
 | 
			
		||||
 | 
			
		||||
@@ -438,14 +439,14 @@ void dcd_int_handler(uint8_t rhport)
 | 
			
		||||
        if (out_ep)
 | 
			
		||||
        {
 | 
			
		||||
          /* copy the data from the PC to the previously provided buffer */
 | 
			
		||||
          if (xfer->data_ptr)
 | 
			
		||||
          if (xfer->ff)
 | 
			
		||||
          {
 | 
			
		||||
            memcpy(xfer->data_ptr, (uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), available_bytes);
 | 
			
		||||
            xfer->data_ptr += available_bytes;
 | 
			
		||||
            tu_fifo_write_n(xfer->ff, (const void *) (USBD_BUF_BASE + ep->BUFSEG), available_bytes);
 | 
			
		||||
          }
 | 
			
		||||
          else
 | 
			
		||||
          {
 | 
			
		||||
            tu_fifo_write_n(xfer->ff, (const void *) (USBD_BUF_BASE + ep->BUFSEG), available_bytes);
 | 
			
		||||
            memcpy(xfer->data_ptr, (uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), available_bytes);
 | 
			
		||||
            xfer->data_ptr += available_bytes;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          xfer->out_bytes_so_far += available_bytes;
 | 
			
		||||
@@ -460,7 +461,7 @@ void dcd_int_handler(uint8_t rhport)
 | 
			
		||||
        {
 | 
			
		||||
          /* update the bookkeeping to reflect the data that has now been sent to the PC */
 | 
			
		||||
          xfer->in_remaining_bytes -= available_bytes;
 | 
			
		||||
          if (xfer->data_ptr) xfer->data_ptr += available_bytes;
 | 
			
		||||
          xfer->data_ptr += available_bytes;
 | 
			
		||||
 | 
			
		||||
          /* if more data to send, send it; otherwise, alert TinyUSB that we've finished */
 | 
			
		||||
          if (xfer->in_remaining_bytes)
 | 
			
		||||
 
 | 
			
		||||
@@ -181,7 +181,11 @@ static void dcd_userEP_in_xfer(struct xfer_ctl_t *xfer, USBD_EP_T *ep)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* provided buffers are thankfully 32-bit aligned, allowing most data to be transfered as 32-bit */
 | 
			
		||||
  if (xfer->data_ptr)
 | 
			
		||||
  if (xfer->ff)
 | 
			
		||||
  {
 | 
			
		||||
    tu_fifo_read_n(xfer->ff, (void *) (ep->EPDAT_BYTE), bytes_now);
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    uint16_t countdown = bytes_now;
 | 
			
		||||
    while (countdown > 3)
 | 
			
		||||
@@ -195,10 +199,6 @@ static void dcd_userEP_in_xfer(struct xfer_ctl_t *xfer, USBD_EP_T *ep)
 | 
			
		||||
    while (countdown--)
 | 
			
		||||
      ep->EPDAT_BYTE = *xfer->data_ptr++;
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
  {
 | 
			
		||||
    tu_fifo_read_n(xfer->ff, (void *) (ep->EPDAT_BYTE), bytes_now);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /* for short packets, we must nudge the peripheral to say 'that's all folks' */
 | 
			
		||||
  if (bytes_now != xfer->max_packet_size)
 | 
			
		||||
@@ -394,6 +394,7 @@ bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t to
 | 
			
		||||
 | 
			
		||||
    /* store away the information we'll needing now and later */
 | 
			
		||||
    xfer->data_ptr = buffer;
 | 
			
		||||
    xfer->ff       = NULL;
 | 
			
		||||
    xfer->in_remaining_bytes = total_bytes;
 | 
			
		||||
    xfer->total_bytes = total_bytes;
 | 
			
		||||
 | 
			
		||||
@@ -656,14 +657,15 @@ void dcd_int_handler(uint8_t rhport)
 | 
			
		||||
#else
 | 
			
		||||
          uint16_t const available_bytes = ep->EPDATCNT & USBD_EPDATCNT_DATCNT_Msk;
 | 
			
		||||
          /* copy the data from the PC to the previously provided buffer */
 | 
			
		||||
          if (xfer->data_ptr)
 | 
			
		||||
          if (xfer->ff)
 | 
			
		||||
          {
 | 
			
		||||
            for (int count = 0; (count < available_bytes) && (xfer->out_bytes_so_far < xfer->total_bytes); count++, xfer->out_bytes_so_far++)
 | 
			
		||||
              *xfer->data_ptr++ = ep->EPDAT_BYTE;
 | 
			
		||||
            tu_fifo_write_n(xfer->ff, (const void *) &ep->EPDAT_BYTE, tu_min16(available_bytes, xfer->total_bytes - xfer->out_bytes_so_far));
 | 
			
		||||
          }
 | 
			
		||||
          else
 | 
			
		||||
          {
 | 
			
		||||
            tu_fifo_write_n(xfer->ff, (const void *) &ep->EPDAT_BYTE, tu_min16(available_bytes, xfer->total_bytes - xfer->out_bytes_so_far));
 | 
			
		||||
            for (int count = 0; (count < available_bytes) && (xfer->out_bytes_so_far < xfer->total_bytes); count++, xfer->out_bytes_so_far++)
 | 
			
		||||
              *xfer->data_ptr++ = ep->EPDAT_BYTE;
 | 
			
		||||
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          /* when the transfer is finished, alert TinyUSB; otherwise, continue accepting more data */
 | 
			
		||||
 
 | 
			
		||||
@@ -646,6 +646,7 @@ bool dcd_edpt_xfer (uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t
 | 
			
		||||
 | 
			
		||||
  xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, dir);
 | 
			
		||||
  xfer->buffer      = buffer;
 | 
			
		||||
  xfer->ff          = NULL;
 | 
			
		||||
  xfer->total_len   = total_bytes;
 | 
			
		||||
 | 
			
		||||
  // EP0 can only handle one packet
 | 
			
		||||
@@ -908,7 +909,12 @@ static void handle_rxflvl_ints(uint8_t rhport, USB_OTG_OUTEndpointTypeDef * out_
 | 
			
		||||
      xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, TUSB_DIR_OUT);
 | 
			
		||||
 | 
			
		||||
      // Read packet off RxFIFO
 | 
			
		||||
      if (xfer->buffer)
 | 
			
		||||
      if (xfer->ff)
 | 
			
		||||
      {
 | 
			
		||||
        // Ring buffer
 | 
			
		||||
        tu_fifo_write_n(xfer->ff, (const void *) rx_fifo, bcnt);
 | 
			
		||||
      }
 | 
			
		||||
      else
 | 
			
		||||
      {
 | 
			
		||||
        // Linear buffer
 | 
			
		||||
        read_fifo_packet(rhport, xfer->buffer, bcnt);
 | 
			
		||||
@@ -916,11 +922,6 @@ static void handle_rxflvl_ints(uint8_t rhport, USB_OTG_OUTEndpointTypeDef * out_
 | 
			
		||||
        // Increment pointer to xfer data
 | 
			
		||||
        xfer->buffer += bcnt;
 | 
			
		||||
      }
 | 
			
		||||
      else
 | 
			
		||||
      {
 | 
			
		||||
        // Ring buffer
 | 
			
		||||
        tu_fifo_write_n(xfer->ff, (const void *) rx_fifo, bcnt);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Truncate transfer length in case of short packet
 | 
			
		||||
      if(bcnt < xfer->max_size) {
 | 
			
		||||
@@ -1028,18 +1029,18 @@ static void handle_epin_ints(uint8_t rhport, USB_OTG_DeviceTypeDef * dev, USB_OT
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          // Push packet to Tx-FIFO
 | 
			
		||||
          if (xfer->buffer)
 | 
			
		||||
          if (xfer->ff)
 | 
			
		||||
          {
 | 
			
		||||
            usb_fifo_t tx_fifo = FIFO_BASE(rhport, n);
 | 
			
		||||
            tu_fifo_read_n(xfer->ff, (void *) tx_fifo, packet_size);
 | 
			
		||||
          }
 | 
			
		||||
          else
 | 
			
		||||
          {
 | 
			
		||||
            write_fifo_packet(rhport, n, xfer->buffer, packet_size);
 | 
			
		||||
 | 
			
		||||
            // Increment pointer to xfer data
 | 
			
		||||
            xfer->buffer += packet_size;
 | 
			
		||||
          }
 | 
			
		||||
          else
 | 
			
		||||
          {
 | 
			
		||||
            usb_fifo_t tx_fifo = FIFO_BASE(rhport, n);
 | 
			
		||||
            tu_fifo_read_n(xfer->ff, (void *) tx_fifo, packet_size);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Turn off TXFE if all bytes are written.
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user