Fixed buffers alignment problem on STM32 USBv1.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@8283 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
parent
006c771612
commit
fe349ebe3a
|
@ -127,15 +127,25 @@ static uint32_t usb_pm_alloc(USBDriver *usbp, size_t size) {
|
||||||
*/
|
*/
|
||||||
static void usb_packet_read_to_buffer(stm32_usb_descriptor_t *udp,
|
static void usb_packet_read_to_buffer(stm32_usb_descriptor_t *udp,
|
||||||
uint8_t *buf, size_t n) {
|
uint8_t *buf, size_t n) {
|
||||||
stm32_usb_pma_t *pmap= USB_ADDR2PTR(udp->RXADDR0);
|
stm32_usb_pma_t *pmap;
|
||||||
|
uint32_t w;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
n = (n + 1) / 2;
|
pmap = USB_ADDR2PTR(udp->RXADDR0);
|
||||||
while (n > 0) {
|
|
||||||
/* Note, this line relies on the Cortex-M3/M4 ability to perform
|
i = 0;
|
||||||
unaligned word accesses.*/
|
w = 0; /* Useless but silences a warning.*/
|
||||||
*(uint16_t *)buf = (uint16_t)*pmap++;
|
while (i < n) {
|
||||||
buf += 2;
|
if ((i & 1) == 0){
|
||||||
n--;
|
w = *pmap;
|
||||||
|
*buf = (uint8_t)w;
|
||||||
|
pmap++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*buf = (uint8_t)(w >> 8);
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
buf++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,16 +206,32 @@ static void usb_packet_read_to_queue(stm32_usb_descriptor_t *udp,
|
||||||
static void usb_packet_write_from_buffer(stm32_usb_descriptor_t *udp,
|
static void usb_packet_write_from_buffer(stm32_usb_descriptor_t *udp,
|
||||||
const uint8_t *buf,
|
const uint8_t *buf,
|
||||||
size_t n) {
|
size_t n) {
|
||||||
stm32_usb_pma_t *pmap = USB_ADDR2PTR(udp->TXADDR0);
|
uint32_t w;
|
||||||
|
size_t i;
|
||||||
|
stm32_usb_pma_t *pmap;
|
||||||
|
|
||||||
|
pmap = USB_ADDR2PTR(udp->TXADDR0);
|
||||||
udp->TXCOUNT0 = (stm32_usb_pma_t)n;
|
udp->TXCOUNT0 = (stm32_usb_pma_t)n;
|
||||||
n = (n + 1) / 2;
|
|
||||||
while (n > 0) {
|
/* Pushing all complete words.*/
|
||||||
/* Note, this line relies on the Cortex-M3/M4 ability to perform
|
i = 0;
|
||||||
unaligned word accesses.*/
|
w = 0; /* Useless but silences a warning.*/
|
||||||
*pmap++ = (stm32_usb_pma_t)*(const uint16_t *)buf;
|
while (i < n) {
|
||||||
buf += 2;
|
if ((i & 1) == 0) {
|
||||||
n--;
|
w = (uint32_t)*buf;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
w |= (uint32_t)*buf << 8;
|
||||||
|
*pmap = (stm32_usb_pma_t)w;
|
||||||
|
pmap++;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
buf++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remaining byte.*/
|
||||||
|
if ((i & 1) != 0) {
|
||||||
|
*pmap = (stm32_usb_pma_t)w;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -73,7 +73,7 @@
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
|
|
||||||
*** 3.1.0 ***
|
*** 3.1.0 ***
|
||||||
- HAL: STM32 OTG buffers and queues do not more require to be aligned in
|
- HAL: STM32 USB/OTG buffers and queues do not more require to be aligned in
|
||||||
position and size.
|
position and size.
|
||||||
- VAR: Improved GCC rules.ld, now it is possible to assign the heap to any
|
- VAR: Improved GCC rules.ld, now it is possible to assign the heap to any
|
||||||
of the available RAM regions.
|
of the available RAM regions.
|
||||||
|
|
Loading…
Reference in New Issue