Merge pull request #6413 from toyowata/lpc1768_flash_fix

LPC176X: Fix flash program size
pull/6507/head
Cruz Monrreal 2018-03-29 00:49:22 -05:00 committed by GitHub
commit f895392374
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 47 additions and 25 deletions

View File

@ -112,42 +112,64 @@ int32_t flash_program_page(flash_t *obj, uint32_t address,
const uint8_t *data, uint32_t size) const uint8_t *data, uint32_t size)
{ {
unsigned long n; unsigned long n;
// always malloc outside critical section const uint32_t copySize = 1024; // should be 256|512|1024|4096
uint8_t *alignedData = malloc(size); uint8_t *alignedData, *source;
alignedData = 0;
source = (uint8_t *)data;
// check word boundary
if (((uint32_t)data % 4) != 0) {
// always malloc outside critical section
alignedData = malloc(copySize);
if (alignedData == 0) {
return (1);
}
}
n = GetSecNum(address); // Get Sector Number n = GetSecNum(address); // Get Sector Number
core_util_critical_section_enter(); core_util_critical_section_enter();
IAP.cmd = 50;// Prepare Sector for Write
IAP.par[0] = n;// Start Sector while (size) {
IAP.par[1] = n;// End Sector if (((uint32_t)data % 4) != 0) {
IAP_Call (&IAP.cmd, &IAP.stat);// Call IAP Command memcpy(alignedData, source, copySize);
if (IAP.stat) { source = alignedData;
return (1); // Command Failed }
/*
Prepare_Sector_for_Write command must be exected before
Copy_RAM_to_Flash command.
*/
IAP.cmd = 50; // Prepare Sector for Write
IAP.par[0] = n; // Start Sector
IAP.par[1] = n; // End Sector
IAP_Call (&IAP.cmd, &IAP.stat); // Call IAP Command
if (IAP.stat) {
return (1); // Command Failed
}
IAP.cmd = 51; // Copy RAM to Flash
IAP.par[0] = address; // Destination Flash Address
IAP.par[1] = (unsigned long)source; // Source RAM Address
IAP.par[2] = copySize; // number of bytes to be written
IAP.par[3] = CCLK; // CCLK in kHz
IAP_Call (&IAP.cmd, &IAP.stat); // Call IAP Command
if (IAP.stat) {
return (1); // Command Failed
}
source += copySize;
size -= copySize;
address += copySize;
} }
IAP.cmd = 51; // Copy RAM to Flash
IAP.par[0] = address;// Destination Flash Address
if ((unsigned long)data%4==0) { // Word boundary
IAP.par[1] = (unsigned long)data;// Source RAM Address
} else {
memcpy(alignedData,data,size);
IAP.par[1] = (unsigned long)alignedData; // Source RAM Address
}
IAP.par[2] = 1024; // Fixed Page Size
IAP.par[3] = CCLK;// CCLK in kHz
IAP_Call (&IAP.cmd, &IAP.stat);// Call IAP Command
core_util_critical_section_exit(); core_util_critical_section_exit();
if(alignedData !=0) { // We allocated our own memory if(alignedData != 0) { // We allocated our own memory
free(alignedData); free(alignedData);
} }
if (IAP.stat) {
return (1); // Command Failed
}
return (0); // Finished without Errors return (0); // Finished without Errors
} }