Skip to content

Commit

Permalink
fixed usb serial not working after reconnect (#2196)
Browse files Browse the repository at this point in the history
* fixed usb serial not working after reconnect

* added restart for sd over usb disconnect

* improved usb serial fix

* fixed formatting
  • Loading branch information
bernd-herzog committed Jul 17, 2024
1 parent 048359f commit 19eb6b4
Show file tree
Hide file tree
Showing 6 changed files with 25 additions and 5 deletions.
1 change: 1 addition & 0 deletions firmware/application/usb_serial.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ void USBSerial::on_channel_opened() {
}

void USBSerial::on_channel_closed() {
reset_transfer_queues();
connected = false;
}

Expand Down
8 changes: 4 additions & 4 deletions firmware/application/usb_serial_cdc.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ CH_IRQ_HANDLER(USB0_IRQHandler) {
chSysUnlockFromIsr();
}

if (status & USB0_USBSTS_D_SLI) {
on_channel_closed();
}

CH_IRQ_EPILOGUE();
}

Expand Down Expand Up @@ -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) {
if (stage == USB_TRANSFER_STAGE_SETUP) {
// if (endpoint->setup.value == 3) {
on_channel_opened();
//} else {
// on_channel_closed();
//}

usb_transfer_schedule_ack(endpoint->in);
}
Expand Down
8 changes: 8 additions & 0 deletions firmware/application/usb_serial_host_to_device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,14 @@ void init_host_to_device() {
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() {
if (usb_bulk_buffer_queue.size() >= 8)
return;
Expand Down
1 change: 1 addition & 0 deletions firmware/application/usb_serial_host_to_device.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#define USB_BULK_BUFFER_SIZE 64

void init_host_to_device();
void reset_transfer_queues();
void serial_bulk_transfer_complete(void* user_data, unsigned int bytes_transferred);
void schedule_host_to_device_transfer();
void complete_host_to_device_transfer();
10 changes: 10 additions & 0 deletions firmware/baseband/sd_over_usb/proc_sd_over_usb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,23 @@

#include "ch.h"
#include "hal.h"
#include <libopencm3/lpc43xx/usb.h>

extern "C" {
void start_usb(void);
void irq_usb(void);
void usb_transfer(void);

extern volatile bool scsi_running;

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();
}
}
Expand Down
2 changes: 1 addition & 1 deletion firmware/baseband/sd_over_usb/sd_over_usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
#include "sd_over_usb.h"
#include "scsi.h"

bool scsi_running = false;
volatile bool scsi_running = false;

usb_request_status_t report_max_lun(
usb_endpoint_t* const endpoint,
Expand Down

0 comments on commit 19eb6b4

Please sign in to comment.