fixed usb serial not working after reconnect (#2196)

* fixed usb serial not working after reconnect

* added restart for sd over usb disconnect

* improved usb serial fix

* fixed formatting
This commit is contained in:
Bernd Herzog 2024-07-17 11:17:42 +02:00 committed by GitHub
parent 048359fb0e
commit 19eb6b44d5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 25 additions and 5 deletions

View File

@ -49,6 +49,7 @@ void USBSerial::on_channel_opened() {
} }
void USBSerial::on_channel_closed() { void USBSerial::on_channel_closed() {
reset_transfer_queues();
connected = false; connected = false;
} }

View File

@ -42,6 +42,10 @@ CH_IRQ_HANDLER(USB0_IRQHandler) {
chSysUnlockFromIsr(); chSysUnlockFromIsr();
} }
if (status & USB0_USBSTS_D_SLI) {
on_channel_closed();
}
CH_IRQ_EPILOGUE(); CH_IRQ_EPILOGUE();
} }
@ -131,11 +135,7 @@ usb_request_status_t usb_get_line_coding_request(usb_endpoint_t* const endpoint,
} }
usb_request_status_t usb_set_control_line_state_request(usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage) { usb_request_status_t usb_set_control_line_state_request(usb_endpoint_t* const endpoint, const usb_transfer_stage_t stage) {
if (stage == USB_TRANSFER_STAGE_SETUP) { if (stage == USB_TRANSFER_STAGE_SETUP) {
// if (endpoint->setup.value == 3) {
on_channel_opened(); on_channel_opened();
//} else {
// on_channel_closed();
//}
usb_transfer_schedule_ack(endpoint->in); usb_transfer_schedule_ack(endpoint->in);
} }

View File

@ -54,6 +54,14 @@ void init_host_to_device() {
thread_usb_event = chThdSelf(); thread_usb_event = chThdSelf();
} }
void reset_transfer_queues() {
while (usb_bulk_buffer_queue.empty() == false)
usb_bulk_buffer_queue.pop();
while (usb_bulk_buffer_spare.empty() == false)
usb_bulk_buffer_spare.pop();
}
void schedule_host_to_device_transfer() { void schedule_host_to_device_transfer() {
if (usb_bulk_buffer_queue.size() >= 8) if (usb_bulk_buffer_queue.size() >= 8)
return; return;

View File

@ -27,6 +27,7 @@
#define USB_BULK_BUFFER_SIZE 64 #define USB_BULK_BUFFER_SIZE 64
void init_host_to_device(); void init_host_to_device();
void reset_transfer_queues();
void serial_bulk_transfer_complete(void* user_data, unsigned int bytes_transferred); void serial_bulk_transfer_complete(void* user_data, unsigned int bytes_transferred);
void schedule_host_to_device_transfer(); void schedule_host_to_device_transfer();
void complete_host_to_device_transfer(); void complete_host_to_device_transfer();

View File

@ -22,13 +22,23 @@
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include <libopencm3/lpc43xx/usb.h>
extern "C" { extern "C" {
void start_usb(void); void start_usb(void);
void irq_usb(void); void irq_usb(void);
void usb_transfer(void); void usb_transfer(void);
extern volatile bool scsi_running;
CH_IRQ_HANDLER(Vector60) { CH_IRQ_HANDLER(Vector60) {
const uint32_t status = USB0_USBSTS_D & USB0_USBINTR_D;
if (status & USB0_USBSTS_D_SLI) {
// USB reset received.
if (scsi_running) {
LPC_RGU->RESET_CTRL[0] = (1 << 0);
}
}
irq_usb(); irq_usb();
} }
} }

View File

@ -23,7 +23,7 @@
#include "sd_over_usb.h" #include "sd_over_usb.h"
#include "scsi.h" #include "scsi.h"
bool scsi_running = false; volatile bool scsi_running = false;
usb_request_status_t report_max_lun( usb_request_status_t report_max_lun(
usb_endpoint_t* const endpoint, usb_endpoint_t* const endpoint,