[ECOS] Unaligned flash writes
Simon Kallweit
simon.kallweit@intefo.ch
Tue Apr 7 09:10:00 GMT 2009
Hi
In my current project I have a few code spots which write to NOR flash.
Some of them may write unaligned data (unaligned base address and/or
length of buffer). Most flash drivers don't handle unaligned writes. So
I currently have a little helper function to align the flash writes. I
wonder if it would make sense to add something like that into the flash API.
I attached the code fragment I currently use. When the memory buffer is
kept static, we would have to add a mutex to protect it.
What do you think about this?
Simon
static cyg_uint8 tmp[32]
__attribute__((aligned(CYGNUM_APP_TRIPBOOT_FLASH_ALIGN)));
int cyg_flash_program_unaligned(cyg_flashaddr_t addr, const void *buf,
size_t len, cyg_flashaddr_t *err_address)
{
int ret = CYG_FLASH_ERR_OK;
int ofs;
int chunk = 0;
const cyg_uint8 *src = buf;
if (len <= 0)
goto out;
// Align flash write address
ofs = addr & (CYGNUM_APP_TRIPBOOT_FLASH_ALIGN - 1);
addr -= ofs;
while (chunk < ofs)
tmp[chunk++] = 0xff;
// Write aligned chunks
while (len--) {
tmp[chunk++] = *src++;
if (chunk >= sizeof(tmp)) {
ret = cyg_flash_program(addr, tmp, chunk, err_address);
if (ret != CYG_FLASH_ERR_OK)
goto out;
addr += chunk;
chunk = 0;
}
}
// Write remainder
if (chunk > 0) {
while ((chunk & (CYGNUM_APP_TRIPBOOT_FLASH_ALIGN - 1)) != 0)
tmp[chunk++] = 0xff;
ret = cyg_flash_program(addr, tmp, chunk, err_address);
}
out:
return ret;
}
--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss
More information about the Ecos-discuss
mailing list