- 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
 | 
					    // initialize buffer
 | 
				
			||||||
    bfifo_create(&fifo, fifo_mem, USB_CDC_FIFO_MEM_SIZE);
 | 
					    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
 | 
					    // from now on CDC is considered initialized
 | 
				
			||||||
    cdcs.initialized = true;
 | 
					    cdcs.initialized = true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -96,7 +100,10 @@ int usb_cdc_process_and_return(USB_CallbackEvent *cbevt) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    case USB_CBEVT_IN: {
 | 
					    case USB_CBEVT_IN: {
 | 
				
			||||||
        if (cbevt->ep == cdcs.ep_assignments.control_ep) { // if notification feeding is requested
 | 
					        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;
 | 
					            ret = 0;
 | 
				
			||||||
        } else if (cbevt->ep == cdcs.ep_assignments.data_ep) { // if data are requested
 | 
					        } 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
 | 
					            // 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_CdcAssignments ep_assignments; // endpoint assignments
 | 
				
			||||||
    USB_Cdc_LineCodingStruct line_coding; // line coding
 | 
					    USB_Cdc_LineCodingStruct line_coding; // line coding
 | 
				
			||||||
    USB_Cdc_ControlLineStateStruct control_line_state; // control line state
 | 
					    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
 | 
					    bool initialized; // CDC is initialized
 | 
				
			||||||
} USB_CdcState;
 | 
					} USB_CdcState;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user