uint32_t write_data (uint32_t cclk, uint32_t flash_address, uint32_t *flash_data_buf, uint32_t count)
{
uint32_t i, ret, interrupts;
disable_interrupts(interrupts);
for (i = USER_START_SECTOR; i <= MAX_USER_SECTOR; i++)
{
if (flash_address < sector_end_map)
{
if (flash_address == sector_start_map)
{
if ((ret = prepare_sector(i,i,cclk)) != 0)
{
printf("prepare for erase failed (%d)\n", ret);
while(1);
}
WaitUs(1000 * 250); // not needed
if ((ret = erase_sector(i,i,cclk)) != 0)
{
printf("erase sector failed (%d)\n", ret);
while(1);
}
}
if ((ret = prepare_sector(i,i,cclk)) != 0)
{
printf("prepare for write failed (%d)\n", ret);
while(1);
}
break;
}
}
param_table[0] = COPY_RAM_TO_FLASH;
param_table[1] = flash_address;
param_table[2] = (uint32_t) flash_data_buf;
param_table[3] = count;
param_table[4] = cclk;
iap_entry(param_table,result_table);
enable_interrupts(interrupts);
return result_table[0];
}
uint32_t erase_sector (uint32_t start_sector,uint32_t end_sector,uint32_t cclk)
{
param_table[0] = ERASE_SECTOR;
param_table[1] = start_sector;
param_table[2] = end_sector;
param_table[3] = cclk;
param_table[4] = FLASH_BANK;
iap_entry(param_table,result_table);
return result_table[0];
}
uint32_t prepare_sector (uint32_t start_sector,uint32_t end_sector,uint32_t cclk)
{
disable_interrupts(0);
param_table[0] = PREPARE_SECTOR_FOR_WRITE;
param_table[1] = start_sector;
param_table[2] = end_sector;
param_table[3] = FLASH_BANK;
iap_entry(param_table,result_table);
enable_interrupts(0);
return result_table[0];
}
|