From: Keith Packard Date: Sun, 7 Jan 2018 19:51:07 +0000 (-0800) Subject: altos/stmf0: Stop shadowing USB tx buffers in system RAM X-Git-Tag: 1.8.5~1^2~2^2~13 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=eead259673c6594d41cfab796c8674c8bf1863cc altos/stmf0: Stop shadowing USB tx buffers in system RAM Use the 16-bit USB memory directly, avoiding the buffer space and the copy Signed-off-by: Keith Packard --- diff --git a/src/stmf0/ao_usb_stm.c b/src/stmf0/ao_usb_stm.c index 0f395123..0595c2b8 100644 --- a/src/stmf0/ao_usb_stm.c +++ b/src/stmf0/ao_usb_stm.c @@ -99,12 +99,9 @@ static uint16_t ao_usb_int_tx_offset; /* Pointer to bulk data tx/rx buffers in USB memory */ #if AO_USB_HAS_IN -static uint16_t ao_usb_in_tx_offset; -static uint16_t *ao_usb_in_tx_buffer; - -/* System ram shadow of USB buffer; writing individual bytes is - * too much of a pain (sigh) */ -static uint8_t ao_usb_tx_buffer[AO_USB_IN_SIZE]; +static uint16_t ao_usb_in_tx_offset[2]; +static uint16_t *ao_usb_in_tx_buffer[2]; +static uint8_t ao_usb_in_tx_which; static uint8_t ao_usb_tx_count; #endif @@ -119,12 +116,9 @@ static uint8_t ao_usb_rx_count, ao_usb_rx_pos; #endif #if AO_USB_HAS_IN2 -static uint16_t ao_usb_in2_tx_offset; -static uint16_t *ao_usb_in2_tx_buffer; - -/* System ram shadow of USB buffer; writing individual bytes is - * too much of a pain (sigh) */ -static uint8_t ao_usb_tx2_buffer[AO_USB_IN_SIZE]; +static uint16_t ao_usb_in2_tx_offset[2]; +static uint16_t *ao_usb_in2_tx_buffer[2]; +static uint8_t ao_usb_in_tx2_which; static uint8_t ao_usb_tx2_count; #endif @@ -378,29 +372,44 @@ ao_usb_alloc_buffers(void) #if AO_USB_HAS_INT + sram_addr += (sram_addr & 1); ao_usb_int_tx_offset = sram_addr; sram_addr += AO_USB_INT_SIZE; #endif #if AO_USB_HAS_OUT + sram_addr += (sram_addr & 1); ao_usb_out_rx_buffer = ao_usb_packet_buffer_addr(sram_addr); ao_usb_out_rx_offset = sram_addr; sram_addr += AO_USB_OUT_SIZE; #endif #if AO_USB_HAS_IN - ao_usb_in_tx_buffer = ao_usb_packet_buffer_addr(sram_addr); - ao_usb_in_tx_offset = sram_addr; + sram_addr += (sram_addr & 1); + ao_usb_in_tx_buffer[0] = ao_usb_packet_buffer_addr(sram_addr); + ao_usb_in_tx_offset[0] = sram_addr; + sram_addr += AO_USB_IN_SIZE; + ao_usb_in_tx_buffer[1] = ao_usb_packet_buffer_addr(sram_addr); + ao_usb_in_tx_offset[1] = sram_addr; sram_addr += AO_USB_IN_SIZE; + ao_usb_in_tx_which = 0; #endif #if AO_USB_HAS_IN2 - ao_usb_in2_tx_buffer = ao_usb_packet_buffer_addr(sram_addr); - ao_usb_in2_tx_offset = sram_addr; + sram_addr += (sram_addr & 1); + ao_usb_in2_tx_buffer[0] = ao_usb_packet_buffer_addr(sram_addr); + ao_usb_in2_tx_offset[0] = sram_addr; sram_addr += AO_USB_IN_SIZE; + + sram_addr += (sram_addr & 1); + ao_usb_in2_tx_buffer[1] = ao_usb_packet_buffer_addr(sram_addr); + ao_usb_in2_tx_offset[1] = sram_addr; + sram_addr += AO_USB_IN_SIZE; + ao_usb_in2_tx_which = 0; #endif #if AO_USB_DIRECTIO + sram_addr += (sram_addr & 1); ao_usb_sram_addr = sram_addr; #endif } @@ -489,7 +498,7 @@ ao_usb_set_configuration(void) #if AO_USB_HAS_IN /* Set up the IN end point */ - ao_usb_bdt[AO_USB_IN_EPR].single.addr_tx = ao_usb_in_tx_offset; + ao_usb_bdt[AO_USB_IN_EPR].single.addr_tx = 0; ao_usb_bdt[AO_USB_IN_EPR].single.count_tx = 0; ao_usb_init_ep(AO_USB_IN_EPR, @@ -501,7 +510,7 @@ ao_usb_set_configuration(void) #if AO_USB_HAS_IN2 /* Set up the IN2 end point */ - ao_usb_bdt[AO_USB_IN2_EPR].single.addr_tx = ao_usb_in2_tx_offset; + ao_usb_bdt[AO_USB_IN2_EPR].single.addr_tx = 0; ao_usb_bdt[AO_USB_IN2_EPR].single.count_tx = 0; ao_usb_init_ep(AO_USB_IN2_EPR, @@ -568,6 +577,16 @@ ao_usb_copy_rx(uint8_t *dst, uint16_t *base, uint16_t bytes) *dst = *base; } +static uint8_t +ao_usb_tx_byte(uint16_t *base, uint8_t tx_count, char byte) +{ + if (tx_count & 1) + base[tx_count >> 1] |= ((uint16_t) byte) << 8; + else + base[tx_count >> 1] = (uint16_t) (uint8_t) byte; + return tx_count + 1; +} + /* Send an IN data packet */ static void ao_usb_ep0_flush(void) @@ -984,10 +1003,10 @@ _ao_usb_in_send(void) ao_usb_in_pending = 1; if (ao_usb_tx_count != AO_USB_IN_SIZE) ao_usb_in_flushed = 1; - ao_usb_copy_tx(ao_usb_tx_buffer, ao_usb_in_tx_buffer, ao_usb_tx_count); - ao_usb_bdt[AO_USB_IN_EPR].single.addr_tx = ao_usb_in_tx_offset; + ao_usb_bdt[AO_USB_IN_EPR].single.addr_tx = ao_usb_in_tx_offset[ao_usb_in_tx_which]; ao_usb_bdt[AO_USB_IN_EPR].single.count_tx = ao_usb_tx_count; ao_usb_tx_count = 0; + ao_usb_in_tx_which = 1 - ao_usb_in_tx_which; _ao_usb_set_stat_tx(AO_USB_IN_EPR, STM_USB_EPR_STAT_TX_VALID); _tx_dbg0("in_send end"); } @@ -1041,7 +1060,7 @@ ao_usb_putchar(char c) _ao_usb_in_wait(); ao_usb_in_flushed = 0; - ao_usb_tx_buffer[ao_usb_tx_count++] = (uint8_t) c; + ao_usb_tx_count = ao_usb_tx_byte(ao_usb_in_tx_buffer[ao_usb_in_tx_which], ao_usb_tx_count, c); /* Send the packet when full */ if (ao_usb_tx_count == AO_USB_IN_SIZE) { @@ -1065,10 +1084,10 @@ _ao_usb_in2_send(void) ao_usb_in2_pending = 1; if (ao_usb_tx2_count != AO_USB_IN_SIZE) ao_usb_in2_flushed = 1; - ao_usb_copy_tx(ao_usb_tx2_buffer, ao_usb_in2_tx_buffer, ao_usb_tx2_count); - ao_usb_bdt[AO_USB_IN2_EPR].single.addr_tx = ao_usb_in_tx_offset; - ao_usb_bdt[AO_USB_IN2_EPR].single.count_tx = ao_usb_tx_count; + ao_usb_bdt[AO_USB_IN2_EPR].single.addr_tx = ao_usb_in2_tx_offset[ao_usb_in2_tx_which]; + ao_usb_bdt[AO_USB_IN2_EPR].single.count_tx = ao_usb_tx2_count; ao_usb_tx2_count = 0; + ao_usb_in2_tx_which = 1 - ao_usb_in2_tx_which; _ao_usb_set_stat_tx(AO_USB_IN2_EPR, STM_USB_EPR_STAT_TX_VALID); _tx_dbg0("in2_send end"); } @@ -1122,7 +1141,7 @@ ao_usb_putchar2(char c) _ao_usb_in2_wait(); ao_usb_in2_flushed = 0; - ao_usb_tx2_buffer[ao_usb_tx2_count++] = (uint8_t) c; + ao_usb_tx2_count = ao_usb_tx_byte(ao_usb_in2_tx_buffer[ao_usb_in2_tx_which], ao_usb_tx2_count, c); /* Send the packet when full */ if (ao_usb_tx2_count == AO_USB_IN_SIZE) {