arch/samv7: fix unaligned address write for progmem interface

Signed-off-by: Petro Karashchenko <petro.karashchenko@gmail.com>
This commit is contained in:
Petro Karashchenko 2021-11-27 14:25:04 +02:00 committed by Xiang Xiao
parent 5da9dbe57a
commit fae27cc945
2 changed files with 7 additions and 7 deletions

View file

@ -806,7 +806,7 @@ ssize_t up_progmem_write(size_t address, const void *buffer, size_t buflen)
/* Write the page buffer */
for (i = 0; i < (SAMD5E5_PAGE_SIZE / sizeof(uint32_t)); i++)
for (i = 0; i < SAMD5E5_PAGE_WORDS; i++)
{
*dest++ = *src++;
}
@ -830,7 +830,7 @@ ssize_t up_progmem_write(size_t address, const void *buffer, size_t buflen)
/* Compare page data */
for (i = 0; i < (SAMD5E5_PAGE_SIZE / sizeof(uint32_t)); i++)
for (i = 0; i < SAMD5E5_PAGE_WORDS; i++)
{
if (*dest != *src)
{
@ -852,7 +852,7 @@ ssize_t up_progmem_write(size_t address, const void *buffer, size_t buflen)
address += xfrsize;
dest = (FAR uint32_t *)address;
buffer = (FAR void *)((uint8_t *)buffer + xfrsize);
buffer = (FAR void *)((uintptr_t)buffer + xfrsize);
buflen -= xfrsize;
offset = 0;
page++;

View file

@ -539,7 +539,7 @@ ssize_t up_progmem_write(size_t address, const void *buffer, size_t buflen)
/* Loop until all of the data has been written */
dest = (FAR uint32_t *)address;
dest = (FAR uint32_t *)(address & ~SAMV7_PAGE_MASK);
written = 0;
while (buflen > 0)
@ -579,15 +579,15 @@ ssize_t up_progmem_write(size_t address, const void *buffer, size_t buflen)
/* Write the page */
for (i = 0; i < (SAMV7_PAGE_SIZE / sizeof(uint32_t)); i++)
for (i = 0; i < SAMV7_PAGE_WORDS; i++)
{
*dest++ = *src++;
ARM_DMB();
}
/* Flush the data cache to memory */
up_clean_dcache(address, address + SAMV7_PAGE_SIZE);
up_clean_dcache(address & ~SAMV7_PAGE_MASK,
(address & ~SAMV7_PAGE_MASK) + SAMV7_PAGE_SIZE);
/* Send the write command */