1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

Merge pull request #17154 from maribu/cpu/stm32/periph_usb

cpu/stm32/periph/usbdev: fix alignment issues
This commit is contained in:
Koen Zandberg 2021-11-16 11:20:34 +01:00 committed by GitHub
commit 76215adef1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 3 deletions

View File

@ -63,6 +63,10 @@ extern "C" {
#define STM32_USB_OTG_BUF_SPACE USBDEV_EP_BUF_SPACE
#endif
#if (STM32_USB_OTG_BUF_SPACE % 4) != 0
#error "STM32_USB_OTG_BUF_SPACE needs to be a multiple of 4"
#endif
/**
* @brief Number of endpoints available with the OTG FS peripheral
* including the control endpoint

View File

@ -479,6 +479,16 @@ static void _configure_fifo(stm32_usb_otg_fshs_t *usbdev)
usbdev->fifo_pos = (rx_size + STM32_USB_OTG_FIFO_MIN_WORD_SIZE);
}
size_t _round_up_to_multiple_of_four(size_t unaligned)
{
size_t misalignment = unaligned & 0x03;
if (misalignment) {
unaligned += 4 - misalignment;
}
return unaligned;
}
static usbdev_ep_t *_usbdev_new_ep(usbdev_t *dev, usb_ep_type_t type,
usb_ep_dir_t dir, size_t buf_len)
{
@ -513,6 +523,7 @@ static usbdev_ep_t *_usbdev_new_ep(usbdev_t *dev, usb_ep_type_t type,
ep->dev = dev;
ep->len = buf_len;
usbdev->occupied += buf_len;
usbdev->occupied = _round_up_to_multiple_of_four(usbdev->occupied);
if (ep->dir == USB_EP_DIR_IN && ep->num != 0) {
_configure_tx_fifo(usbdev, ep->num, ep->len);
}
@ -955,7 +966,9 @@ static int _usbdev_ep_ready(usbdev_ep_t *ep, size_t len)
if (len > 0 && !_uses_dma(conf)) {
/* The FIFO requires 32 bit word reads/writes */
size_t words = (len + 3) / 4;
uint32_t *ep_buf = (uint32_t *)ep->buf;
/* buffer is gets aligned in _usbdev_new_ep(). Use intermediate
* cast to uintptr_t to silence -Wcast-align*/
uint32_t *ep_buf = (uint32_t *)(uintptr_t)ep->buf;
__O uint32_t *fifo = _tx_fifo(conf, ep->num);
for (size_t i = 0; i < words; i++) {
fifo[i] = ep_buf[i];
@ -988,8 +1001,9 @@ static int _usbdev_ep_ready(usbdev_ep_t *ep, size_t len)
static void _copy_rxfifo(stm32_usb_otg_fshs_t *usbdev, uint8_t *buf, size_t len)
{
/* The FIFO requires 32 bit word reads/writes */
uint32_t *buf32 = (uint32_t *)buf;
/* The FIFO requires 32 bit word reads/writes. This is only called with
* usbdev_ep_t::buf, which is aligned to four bytes in _usbdev_new_ep() */
uint32_t *buf32 = (uint32_t *)(uintptr_t)buf;
__I uint32_t *fifo32 = _rx_fifo(usbdev->config);
size_t count = (len + 3) / 4;