// Author(s): Oliver Munz
// Contributors: om, asl
// Date: 2006-02-21
-// Purpose:
-// Description:
-//
+// Purpose:
+// Description:
+//
// This code is part of RedBoot (tm).
//
//####DESCRIPTIONEND####
static int flash_block_size;
-static cyg_uint8 * current_flash_page;
+static cyg_uint8 *current_flash_page;
/* Allocation of the flash-sector size RAM-buffer is done */
-static bool init_done = false;
+static bool init_done = false;
/* We have initialized the current page ready for writing */
-static bool flash_page_init = false;
+static bool flash_page_init = false;
static cyg_uint8 *flash_buffer;
// If the io flash code outputs when erasing/writing it will upset the
// download over the communications channel. So we install a dummy
// print function.
-static int dummy_printf(const char *fmt, ...){
- return 0;
+static int dummy_printf(const char *fmt, ...)
+{
+ return 0;
}
// Calculate the address of the first byte in a flash block
-static cyg_uint8 * flash_block_begin(cyg_uint32 addr)
+static cyg_uint8 *flash_block_begin(cyg_uint32 addr)
{
- return (cyg_uint8 *)
- ((addr / flash_block_size) * flash_block_size);
+ return (cyg_uint8 *)
+ ((addr / flash_block_size) * flash_block_size);
}
// Initialize the loading process
void flash_load_start(void)
{
- flash_init(dummy_printf);
-
- init_done = true;
- flash_page_init = false;
+ flash_init(dummy_printf);
+
+ init_done = true;
+ flash_page_init = false;
}
// Write a byte into flash. We maintain a copy in RAM of the FLASH
// or the flash_load_finish function is called.
void flash_load_write(cyg_uint8 *flash_addr, cyg_uint8 value)
{
-
- cyg_uint32 retcode = FLASH_ERR_OK;
- void * err_addr;
- cyg_uint32 addr = (cyg_uint32)flash_addr;
- cyg_uint32 offset;
-
- if (!flash_page_init) {
- /* First Byte for the current flash block. Read the current contents */
- current_flash_page = flash_block_begin(addr);
- flash_read(flash_buffer, current_flash_page, flash_block_size, &err_addr);
- flash_page_init = true;
- }
- if (flash_block_begin(addr) != current_flash_page) {
- /* We have moved into the next flash page. Write the current
- page so we can move on */
- retcode = flash_erase(current_flash_page, flash_block_size, &err_addr);
- if (retcode != FLASH_ERR_OK){ /* Flash ERROR */
- diag_printf("Error erase at %p: %s\n", err_addr, flash_errmsg(retcode));
- return;
- }
-
- retcode = flash_program(current_flash_page, flash_buffer,
- flash_block_size, &err_addr);
- if (retcode != FLASH_ERR_OK){
- diag_printf("Error writing at %p: %s\n",
- err_addr, flash_errmsg(retcode));
- return;
- }
- current_flash_page = flash_block_begin(addr);
- flash_read(flash_buffer, current_flash_page, flash_block_size, &err_addr);
- }
-
- offset = flash_addr - current_flash_page;
- CYG_ASSERT(offset < flash_block_size, "offset not inside flash block");
-
- flash_buffer[offset] = value;
+
+ cyg_uint32 retcode = FLASH_ERR_OK;
+ void *err_addr;
+ cyg_uint32 addr = (cyg_uint32)flash_addr;
+ cyg_uint32 offset;
+
+ if (!flash_page_init) {
+ /* First Byte for the current flash block. Read the current contents */
+ current_flash_page = flash_block_begin(addr);
+ flash_read(flash_buffer, current_flash_page, flash_block_size, &err_addr);
+ flash_page_init = true;
+ }
+ if (flash_block_begin(addr) != current_flash_page) {
+ /* We have moved into the next flash page. Write the current
+ page so we can move on */
+ retcode = flash_erase(current_flash_page, flash_block_size, &err_addr);
+ if (retcode != FLASH_ERR_OK){ /* Flash ERROR */
+ diag_printf("Error erase at %p: %s\n", err_addr, flash_errmsg(retcode));
+ return;
+ }
+
+ retcode = flash_program(current_flash_page, flash_buffer,
+ flash_block_size, &err_addr);
+ if (retcode != FLASH_ERR_OK){
+ diag_printf("Error writing at %p: %s\n",
+ err_addr, flash_errmsg(retcode));
+ return;
+ }
+ current_flash_page = flash_block_begin(addr);
+ flash_read(flash_buffer, current_flash_page, flash_block_size, &err_addr);
+ }
+
+ offset = flash_addr - current_flash_page;
+ CYG_ASSERT(offset < flash_block_size, "offset not inside flash block");
+
+ flash_buffer[offset] = value;
}
// Program the current page into flash.
void flash_load_finish(void)
{
- cyg_uint32 retcode = FLASH_ERR_OK;
- void * err_addr;
-
- if (init_done && flash_page_init) {
- flash_page_init = false;
-
- retcode = flash_erase(current_flash_page, flash_block_size, &err_addr);
- if (retcode != FLASH_ERR_OK){
- diag_printf("Error erase at %p: %s\n", err_addr, flash_errmsg(retcode));
- } else {
- retcode = flash_program(current_flash_page, flash_buffer,
- flash_block_size, &err_addr);
- if (retcode != FLASH_ERR_OK){
- diag_printf("Error writing at %p: %s\n",
- err_addr, flash_errmsg(retcode));
- }
- }
- }
- flash_init(diag_printf);
+ cyg_uint32 retcode = FLASH_ERR_OK;
+ void *err_addr;
+
+ if (init_done && flash_page_init) {
+ flash_page_init = false;
+
+ retcode = flash_erase(current_flash_page, flash_block_size, &err_addr);
+ if (retcode != FLASH_ERR_OK){
+ diag_printf("Error erase at %p: %s\n", err_addr, flash_errmsg(retcode));
+ } else {
+ retcode = flash_program(current_flash_page, flash_buffer,
+ flash_block_size, &err_addr);
+ if (retcode != FLASH_ERR_OK){
+ diag_printf("Error writing at %p: %s\n",
+ err_addr, flash_errmsg(retcode));
+ }
+ }
+ }
+ flash_init(diag_printf);
}
// This is called during redboot start up. We allocate a buffer the
void
flash_load_init(void)
{
- int flash_blocks;
+ int flash_blocks;
- flash_get_block_info(&flash_block_size, &flash_blocks);
- workspace_end -= flash_block_size;
-
- flash_buffer = workspace_end;
+ flash_get_block_info(&flash_block_size, &flash_blocks);
+ workspace_end -= flash_block_size;
+
+ flash_buffer = workspace_end;
}
// Register this initialization function in the table
RedBoot_init(flash_load_init, RedBoot_INIT_LAST);
-
-
-