/* * This function tries to shove new bytes from the USB host into the queue for * consumption elsewhere. It is invoked either by a HW interrupt (telling us we * have new bytes from the USB host), or by whoever is reading bytes out of the * other end of the queue (telling us that there's now more room in the queue * if we still have bytes to shove in there). */ int rx_stream_handler(struct usb_stream_config const *config) { /* * The HW FIFO buffer (rx_ram) is always filled from [0] by the * hardware. The rx_in_fifo variable counts how many bytes of that * buffer are actually valid, and is calculated from the HW DMA * descriptor table. The descriptor is updated by the hardware, and it * and rx_ram remains valid and unchanged until software tells the * the hardware engine to accept more input. */ int rx_in_fifo, rx_left; /* * The rx_handled variable tracks how many of the bytes in the HW FIFO * we've copied into the incoming queue. The queue may not accept all * of them at once, so we have to keep track of where we are so that * the next time this function is called we can try to shove the rest * of the HW FIFO bytes into the queue. */ static int rx_handled; /* If the HW FIFO isn't ready, then we're waiting for more bytes */ if (!rx_fifo_is_ready(config)) return 0; /* * How many of the HW FIFO bytes have we not yet handled? We need to * know both where we are in the buffer and how many bytes we haven't * yet enqueued. One can be calculated from the other as long as we * know rx_in_fifo, but we need at least one static variable. */ rx_in_fifo = config->rx_size - (config->out_desc->flags & DOEPDMA_RXBYTES_MASK); rx_left = rx_in_fifo - rx_handled; /* If we have some, try to shove them into the queue */ if (rx_left) { size_t added = QUEUE_ADD_UNITS( config->producer.queue, config->rx_ram + rx_handled, rx_left); rx_handled += added; rx_left -= added; } /* * When we've handled all the bytes in the queue ("rx_in_fifo == * rx_handled" and "rx_left == 0" indicate the same thing), we can * reenable the USB HW to go fetch more. */ if (!rx_left) { rx_handled = 0; usb_enable_rx(config, config->rx_size); } return rx_handled; }
static void ep_reset(void) { epN_reset(USB_EP_CONSOLE); is_reset = 1; /* Flush any queued data */ hook_call_deferred(&tx_fifo_handler_data, 0); hook_call_deferred(&rx_fifo_handler_data, 0); usb_enable_rx(USB_MAX_PACKET_SIZE); }
/* * This function tries to shove new bytes from the USB host into the queue for * consumption elsewhere. It is invoked either by a HW interrupt (telling us we * have new bytes from the USB host), or by whoever is reading bytes out of the * other end of the queue (telling us that there's now more room in the queue * if we still have bytes to shove in there). */ static void rx_fifo_handler(void) { /* * The HW FIFO buffer (ep_buf_rx) is always filled from [0] by the * hardware. The rx_in_fifo variable counts how many bytes of that * buffer are actually valid, and is calculated from the HW DMA * descriptor table. The descriptor is updated by the hardware, and it * and ep_buf_rx remains valid and unchanged until software tells the * the hardware engine to accept more input. */ int rx_in_fifo, rx_left; /* * The rx_handled variable tracks how many of the bytes in the HW FIFO * we've copied into the incoming queue. The queue may not accept all * of them at once, so we have to keep track of where we are so that * the next time this function is called we can try to shove the rest * of the HW FIFO bytes into the queue. */ static int rx_handled; /* If the HW FIFO isn't ready, then we're waiting for more bytes */ if (!rx_fifo_is_ready()) return; /* * How many of the HW FIFO bytes have we not yet handled? We need to * know both where we are in the buffer and how many bytes we haven't * yet enqueued. One can be calculated from the other as long as we * know rx_in_fifo, but we need at least one static variable. */ rx_in_fifo = USB_MAX_PACKET_SIZE - (ep_out_desc.flags & DOEPDMA_RXBYTES_MASK); rx_left = rx_in_fifo - rx_handled; /* If we have some, try to shove them into the queue */ if (rx_left) { size_t added = put_bytes_to_blob(ep_buf_rx + rx_handled, rx_left); rx_handled += added; rx_left -= added; } /* * When we've handled all the bytes in the queue ("rx_in_fifo == * rx_handled" and "rx_left == 0" indicate the same thing), we can * reenable the USB HW to go fetch more. */ if (!rx_left) { rx_handled = 0; usb_enable_rx(USB_MAX_PACKET_SIZE); } }
static void rx_fifo_handler(void) { struct dwc_usb_ep *ep = &ep_console_ctl; int rx_in_fifo; size_t added; if (!rx_fifo_is_ready()) return; rx_in_fifo = ep->out_pending; added = QUEUE_ADD_UNITS(&rx_q, ep->out_databuffer, rx_in_fifo); if (added != rx_in_fifo) CPRINTF("DROP CONSOLE: %d/%d process\n", added, rx_in_fifo); /* wake-up the console task */ console_has_input(); usb_enable_rx(USB_MAX_PACKET_SIZE); }