- driver: only poll FIFO free space if transmission size > 0
- CDC: buffer size increased
This commit is contained in:
		
							parent
							
								
									4cf5fb77fe
								
							
						
					
					
						commit
						8ef6249e01
					
				@ -12,11 +12,13 @@
 | 
			
		||||
static USB_CdcState cdcs = { 0 };
 | 
			
		||||
static uint8_t tx_buffer[USB_CDC_PCKT_BUFSIZE];
 | 
			
		||||
 | 
			
		||||
#define USB_CDC_FIFO_MEM_SIZE (2048)
 | 
			
		||||
#define USB_CDC_FIFO_MEM_SIZE (3072) // FIXME: ez vagy a blocking FIFO bugos
 | 
			
		||||
 | 
			
		||||
static uint8_t fifo_mem[USB_CDC_FIFO_MEM_SIZE];
 | 
			
		||||
static BFifo fifo;
 | 
			
		||||
 | 
			
		||||
void usb_cdc_read_callback(const uint8_t * data, uint32_t size);
 | 
			
		||||
 | 
			
		||||
void usb_cdc_init(const USB_CdcAssignments *as) {
 | 
			
		||||
    // clear the structure
 | 
			
		||||
    memset(&cdcs, 0, sizeof(USB_CdcState));
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										15
									
								
								usb_driver.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								usb_driver.c
									
									
									
									
									
								
							@ -267,7 +267,7 @@ void usbdrv_build_fifo() {
 | 
			
		||||
        if (cfg->is_configured) {
 | 
			
		||||
            cfg->fifo_size = CEIL4(MAX(USB_MIN_GROSS_TX_FIFO_SIZE, cfg->max_packet_size)); // correct FIFO size if necessary
 | 
			
		||||
            cfg->fifo_address = next_fifo_addr;                                            // store FIFO address
 | 
			
		||||
            cfg->zlp_next = false;                                                         // clear ZLP next 
 | 
			
		||||
            cfg->zlp_next = false;                                                         // clear ZLP next
 | 
			
		||||
            next_fifo_addr += cfg->fifo_size;                                              // advance next address
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@ -476,8 +476,11 @@ uint32_t usbdrv_arm_IN_endpoint(uint8_t ep, const uint8_t *data, uint16_t len) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // determine final write size
 | 
			
		||||
    uint32_t freeSize = USBINEP[ep].DTXFSTS * sizeof(uint32_t); // get free transmit buffer size
 | 
			
		||||
    uint16_t writeSize = MIN(freeSize, len);                    // limit transmit size to free size
 | 
			
		||||
    uint32_t freeSize = 0;
 | 
			
		||||
    if (len > 0) { // only poll DTXFSTS if (len > 0) (see datasheet)
 | 
			
		||||
        freeSize = USBINEP[ep].DTXFSTS * sizeof(uint32_t); // get free transmit buffer size
 | 
			
		||||
    }
 | 
			
		||||
    uint16_t writeSize = MIN(freeSize, len); // limit transmit size to free size
 | 
			
		||||
 | 
			
		||||
    // calculate packet count based on max packet size
 | 
			
		||||
    uint16_t mps = gs.ep_IN[ep].max_packet_size;
 | 
			
		||||
@ -486,10 +489,10 @@ uint32_t usbdrv_arm_IN_endpoint(uint8_t ep, const uint8_t *data, uint16_t len) {
 | 
			
		||||
        packet_count = writeSize / mps + (((writeSize % mps) > 0) ? 1 : 0);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // set zlp_next if transmission size is integer multiple of max packet size
 | 
			
		||||
    // set zlp_next if transmission size is integer multiple of max packet size6
 | 
			
		||||
    gs.ep_IN[ep].zlp_next = (writeSize > 0) && ((writeSize % mps) == 0);
 | 
			
		||||
 | 
			
		||||
    // program DIEPTSIZ with transfer length (TODO: currently only a single transfer!)
 | 
			
		||||
    // program DIEPTSIZ with transfer length
 | 
			
		||||
    USBINEP[ep].DIEPTSIZ = (packet_count << USB_OTG_DIEPTSIZ_PKTCNT_Pos) | writeSize;
 | 
			
		||||
 | 
			
		||||
    // enable endpoint and cancel responding NAK
 | 
			
		||||
@ -690,7 +693,7 @@ void usbdrv_process_event(uint8_t evt_code, USBDRV_EventData *evt_data) {
 | 
			
		||||
                        // see if a ZLP transmission was queued
 | 
			
		||||
                        if (gs.ep_IN[ep].zlp_next) {
 | 
			
		||||
                            usbdrv_arm_IN_endpoint(ep, NULL, 0); // send ZLP
 | 
			
		||||
                        } else { // no ZLP
 | 
			
		||||
                        } else {                                 // no ZLP
 | 
			
		||||
                            USBMSG("IN [%d]\n", ep);
 | 
			
		||||
 | 
			
		||||
                            cbcpd.code = USB_CBC_IN_DONE;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user