stm32: Allow disabling double buffering transmit in usbfs.c
Some checks failed
Build test / build (push) Has been cancelled

Only enable double buffering transmit if
CONFIG_STM32_USB_DOUBLE_BUFFER_TX is set.

Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
Kevin O'Connor 2025-12-14 13:32:38 -05:00
parent c3b660dfbe
commit dc622f4ac3

View file

@ -242,8 +242,9 @@ usb_read_bulk_out(void *data, uint_fast8_t max_len)
static uint32_t bulk_in_push_pos, bulk_in_pop_flag;
#define BI_START 2
int_fast8_t
usb_send_bulk_in(void *data, uint_fast8_t len)
// Send bulk packet to host with double buffering optimization
static int_fast8_t
usb_send_bulk_in_double_buffer(void *data, uint_fast8_t len)
{
if (readl(&bulk_in_pop_flag))
// No buffer space available
@ -275,6 +276,21 @@ usb_send_bulk_in(void *data, uint_fast8_t len)
return len;
}
// Send bulk usb packet to host
int_fast8_t
usb_send_bulk_in(void *data, uint_fast8_t len)
{
if (CONFIG_STM32_USB_DOUBLE_BUFFER_TX)
return usb_send_bulk_in_double_buffer(data, len);
uint32_t ep = USB_CDC_EP_BULK_IN, epr = USB_EPR[ep];
if ((epr & USB_EPTX_STAT) != USB_EP_TX_NAK)
// No buffer space available
return -1;
btable_write_packet(ep, BUFTX, data, len);
USB_EPR[ep] = calc_epr_bits(epr, USB_EPTX_STAT, USB_EP_TX_VALID);
return len;
}
int_fast8_t
usb_read_ep0(void *data, uint_fast8_t max_len)
{
@ -333,9 +349,10 @@ usb_set_configure(void)
bulk_out_pop_count = 0;
USB_EPR[ep] = calc_epr_bits(USB_EPR[ep], USB_EPRX_STAT, USB_EP_RX_VALID);
ep = USB_CDC_EP_BULK_IN;
bulk_in_push_pos = BI_START;
writel(&bulk_in_pop_flag, 0);
if (CONFIG_STM32_USB_DOUBLE_BUFFER_TX) {
bulk_in_push_pos = BI_START;
writel(&bulk_in_pop_flag, 0);
}
}
@ -360,9 +377,12 @@ usb_reset(void)
bulk_out_push_flag = USB_EP_DTOG_TX;
ep = USB_CDC_EP_BULK_IN;
USB_EPR[ep] = (USB_CDC_EP_BULK_IN | USB_EP_BULK | USB_EP_KIND
| USB_EP_TX_NAK);
bulk_in_pop_flag = USB_EP_DTOG_RX;
uint32_t bi_epr_flags = USB_CDC_EP_BULK_IN | USB_EP_BULK | USB_EP_TX_NAK;
if (CONFIG_STM32_USB_DOUBLE_BUFFER_TX) {
bi_epr_flags |= USB_EP_KIND;
bulk_in_pop_flag = USB_EP_DTOG_RX;
}
USB_EPR[ep] = bi_epr_flags;
USB->CNTR = USB_CNTR_CTRM | USB_CNTR_RESETM;
USB->DADDR = USB_DADDR_EF;
@ -382,9 +402,12 @@ USB_IRQHandler(void)
bulk_out_push_flag = 0;
usb_notify_bulk_out();
} else if (ep == USB_CDC_EP_BULK_IN) {
USB_EPR[ep] = (calc_epr_bits(epr, USB_EP_CTR_RX | USB_EP_CTR_TX, 0)
| bulk_in_pop_flag);
bulk_in_pop_flag = 0;
uint32_t ne = calc_epr_bits(epr, USB_EP_CTR_RX | USB_EP_CTR_TX, 0);
if (CONFIG_STM32_USB_DOUBLE_BUFFER_TX) {
ne |= bulk_in_pop_flag;
bulk_in_pop_flag = 0;
}
USB_EPR[ep] = ne;
usb_notify_bulk_in();
} else if (ep == 0) {
USB_EPR[ep] = calc_epr_bits(epr, USB_EP_CTR_RX | USB_EP_CTR_TX, 0);