Start changes - not yet finished
This commit is contained in:
		| @@ -1188,6 +1188,35 @@ bool usbd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | bool usbd_edpt_ISO_xfer(uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes) | ||||||
|  | { | ||||||
|  |   uint8_t const epnum = tu_edpt_number(ep_addr); | ||||||
|  |   uint8_t const dir   = tu_edpt_dir(ep_addr); | ||||||
|  |  | ||||||
|  |   TU_LOG2("  Queue ISO EP %02X with %u bytes ... ", ep_addr, total_bytes); | ||||||
|  |  | ||||||
|  |   // Attempt to transfer on a busy endpoint, sound like an race condition ! | ||||||
|  |   TU_ASSERT(_usbd_dev.ep_status[epnum][dir].busy == 0); | ||||||
|  |  | ||||||
|  |   // Set busy first since the actual transfer can be complete before dcd_edpt_xfer() could return | ||||||
|  |   // and usbd task can preempt and clear the busy | ||||||
|  |   _usbd_dev.ep_status[epnum][dir].busy = true; | ||||||
|  |  | ||||||
|  |   if ( dcd_edpt_ISO_xfer(rhport, ep_addr, ff, total_bytes) ) | ||||||
|  |   { | ||||||
|  |     TU_LOG2("OK\r\n"); | ||||||
|  |     return true; | ||||||
|  |   }else | ||||||
|  |   { | ||||||
|  |     // DCD error, mark endpoint as ready to allow next transfer | ||||||
|  |     _usbd_dev.ep_status[epnum][dir].busy = false; | ||||||
|  |     _usbd_dev.ep_status[epnum][dir].claimed = 0; | ||||||
|  |     TU_LOG2("failed\r\n"); | ||||||
|  |     TU_BREAKPOINT(); | ||||||
|  |     return false; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
| bool usbd_edpt_busy(uint8_t rhport, uint8_t ep_addr) | bool usbd_edpt_busy(uint8_t rhport, uint8_t ep_addr) | ||||||
| { | { | ||||||
|   (void) rhport; |   (void) rhport; | ||||||
|   | |||||||
| @@ -72,6 +72,9 @@ void usbd_edpt_close(uint8_t rhport, uint8_t ep_addr); | |||||||
| // Submit a usb transfer | // Submit a usb transfer | ||||||
| bool usbd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes); | bool usbd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes); | ||||||
|  |  | ||||||
|  | // Submit a usb ISO transfer by use of a FIFO (ring buffer) | ||||||
|  | bool usbd_edpt_ISO_xfer(uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes); | ||||||
|  |  | ||||||
| // Claim an endpoint before submitting a transfer. | // Claim an endpoint before submitting a transfer. | ||||||
| // If caller does not make any transfer, it must release endpoint for others. | // If caller does not make any transfer, it must release endpoint for others. | ||||||
| bool usbd_edpt_claim(uint8_t rhport, uint8_t ep_addr); | bool usbd_edpt_claim(uint8_t rhport, uint8_t ep_addr); | ||||||
|   | |||||||
| @@ -28,6 +28,7 @@ | |||||||
|  */ |  */ | ||||||
|  |  | ||||||
| #include "tusb_option.h" | #include "tusb_option.h" | ||||||
|  | #include "tusb_fifo.h" | ||||||
|  |  | ||||||
| // Since TinyUSB doesn't use SOF for now, and this interrupt too often (1ms interval) | // Since TinyUSB doesn't use SOF for now, and this interrupt too often (1ms interval) | ||||||
| // We disable SOF for now until needed later on | // We disable SOF for now until needed later on | ||||||
| @@ -134,6 +135,7 @@ static TU_ATTR_ALIGNED(4) uint32_t _setup_packet[2]; | |||||||
|  |  | ||||||
| typedef struct { | typedef struct { | ||||||
|   uint8_t * buffer; |   uint8_t * buffer; | ||||||
|  |   tu_fifo_t * ff; | ||||||
|   uint16_t total_len; |   uint16_t total_len; | ||||||
|   uint16_t max_size; |   uint16_t max_size; | ||||||
|   uint8_t interval; |   uint8_t interval; | ||||||
| @@ -659,6 +661,38 @@ bool dcd_edpt_xfer (uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t | |||||||
|   return true; |   return true; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | bool dcd_edpt_ISO_xfer (uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes) | ||||||
|  | { | ||||||
|  |   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;                                 // Indicates a FIFO shall be used | ||||||
|  |   xfer->ff          = ff; | ||||||
|  |   xfer->total_len   = total_bytes; | ||||||
|  |  | ||||||
|  |   // EP0 can only handle one packet | ||||||
|  |   if(epnum == 0) { | ||||||
|  |     ep0_pending[dir] = total_bytes; | ||||||
|  |     // Schedule the first transaction for EP0 transfer | ||||||
|  |     edpt_schedule_packets(rhport, epnum, dir, 1, ep0_pending[dir]); | ||||||
|  |     return true; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   uint16_t num_packets = (total_bytes / xfer->max_size); | ||||||
|  |   uint8_t const short_packet_size = total_bytes % xfer->max_size; | ||||||
|  |  | ||||||
|  |   // Zero-size packet is special case. | ||||||
|  |   if(short_packet_size > 0 || (total_bytes == 0)) { | ||||||
|  |     num_packets++; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // Schedule packets to be sent within interrupt | ||||||
|  |   edpt_schedule_packets(rhport, epnum, dir, num_packets, total_bytes); | ||||||
|  |  | ||||||
|  |   return true; | ||||||
|  | } | ||||||
|  |  | ||||||
| static void dcd_edpt_disable (uint8_t rhport, uint8_t ep_addr, bool stall) | static void dcd_edpt_disable (uint8_t rhport, uint8_t ep_addr, bool stall) | ||||||
| { | { | ||||||
|   (void) rhport; |   (void) rhport; | ||||||
| @@ -849,6 +883,9 @@ static void handle_rxflvl_ints(uint8_t rhport, USB_OTG_OUTEndpointTypeDef * out_ | |||||||
|     { |     { | ||||||
|       xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, TUSB_DIR_OUT); |       xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, TUSB_DIR_OUT); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |       // TODO: TAKE CARE OF ISO FIFO! | ||||||
|  |  | ||||||
|       // Read packet off RxFIFO |       // Read packet off RxFIFO | ||||||
|       read_fifo_packet(rhport, xfer->buffer, bcnt); |       read_fifo_packet(rhport, xfer->buffer, bcnt); | ||||||
|  |  | ||||||
| @@ -960,6 +997,8 @@ static void handle_epin_ints(uint8_t rhport, USB_OTG_DeviceTypeDef * dev, USB_OT | |||||||
|             break; |             break; | ||||||
|           } |           } | ||||||
|  |  | ||||||
|  |           // TODO: TAKE CARE OF ISO FIFO! | ||||||
|  |  | ||||||
|           // Push packet to Tx-FIFO |           // Push packet to Tx-FIFO | ||||||
|           write_fifo_packet(rhport, n, xfer->buffer, packet_size); |           write_fifo_packet(rhport, n, xfer->buffer, packet_size); | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Reinhard Panhuber
					Reinhard Panhuber