- CDC: the way responding on the notification element changed
This commit is contained in:
parent
4df8912593
commit
a9d0e99d7b
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user