This is the mail archive of the ecos-discuss@sourceware.org mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Unaligned flash writes


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]