- CDC: the way responding on the notification element changed

This commit is contained in:
Wiesner András 2024-07-11 08:05:29 +02:00
parent 4df8912593
commit a9d0e99d7b
2 changed files with 78 additions and 69 deletions

View File

@ -38,6 +38,10 @@ void usb_cdc_init(const USB_CdcAssignments *as) {
// initialize buffer
bfifo_create(&fifo, fifo_mem, USB_CDC_FIFO_MEM_SIZE);
// initialize an all-0 interrupt
cdcs.interrupt_data = 0;
cdcs.interrupt_pending = true;
// from now on CDC is considered initialized
cdcs.initialized = true;
}
@ -96,7 +100,10 @@ int usb_cdc_process_and_return(USB_CallbackEvent *cbevt) {
case USB_CBEVT_IN: {
if (cbevt->ep == cdcs.ep_assignments.control_ep) { // if notification feeding is requested
usbcore_schedule_transmission(cdcs.ep_assignments.control_ep, NULL, 0); // send ZLP
if (cdcs.interrupt_pending) {
usbcore_schedule_transmission(cdcs.ep_assignments.control_ep, (const uint8_t *)&(cdcs.interrupt_data), sizeof(uint16_t)); // send ZLP
cdcs.interrupt_pending = false;
}
ret = 0;
} else if (cbevt->ep == cdcs.ep_assignments.data_ep) { // if data are requested
// usbcore_schedule_transmission(cdcs.ep_assignments.data_ep, NULL, 0); // send ZLP

View File

@ -50,6 +50,8 @@ typedef struct {
USB_CdcAssignments ep_assignments; // endpoint assignments
USB_Cdc_LineCodingStruct line_coding; // line coding
USB_Cdc_ControlLineStateStruct control_line_state; // control line state
uint16_t interrupt_data; // data sent though the next transfer on the notification element
bool interrupt_pending; // interrupt data is valid and should be send in the next cycle
bool initialized; // CDC is initialized
} USB_CdcState;