MOV_Rn_data(7), 0,
#define FLASH_WORDS_HIGH 16
-
+
MOV_Rn_data(6), 0,
#define FLASH_WORDS_LOW 18
-
+
MOV_direct_data, FWT, 0x20,
#define FLASH_TIMING 21
static uint8_t flash_erase_page[] = {
3, MOV_direct_data, FADDRH, 0,
#define ERASE_PAGE_HIGH 3
-
+
3, MOV_direct_data, FADDRL, 0,
#define ERASE_PAGE_LOW 7
uint8_t status;
uint8_t old[0x10], new[0x10];
int i;
-
+
ccdbg_read_memory(dbg, addr, old, 0x10);
flash_erase_page[ERASE_PAGE_HIGH] = page_addr >> 8;
flash_erase_page[ERASE_PAGE_LOW] = page_addr & 0xff;
static uint8_t flash_write[] = {
MOV_direct_data, P1DIR, 0x02,
MOV_direct_data, P1, 0xFD,
-
+
MOV_A_direct, FCTL,
JB, ACC(FCTL_BUSY_BIT), 0xf1,
MOV_direct_data, FADDRH, 0,
#define WRITE_PAGE_HIGH 16
-
+
MOV_direct_data, FADDRL, 0,
#define WRITE_PAGE_LOW 19
-
+
MOV_direct_data, FCTL, FCTL_WRITE,
MOV_direct_data, FWDATA, 0,
#define WRITE_BYTE_0 25
}
ram_addr = 0xf000;
-
+
flash_prog = 0xf400;
fwt = 0x20;
ccdbg_debug(CC_DEBUG_FLASH, "Upload %d flash program bytes to 0x%04x\n",
sizeof (flash_page), flash_prog);
ccdbg_write_memory(dbg, flash_prog, flash_page, sizeof(flash_page));
-
+
remain = image->length;
start = 0;
while (remain) {
return 1;
}
#endif
-
+
flash_addr = image->address + start;
flash_word_addr = flash_addr >> 1;
flash_len = this_time + (this_time & 1);
flash_words_low = flash_words & 0xff;
flash_words_high = flash_words >> 8;
-
+
/* The flash code above is lame */
if (flash_words_low)
flash_words_high++;
-
+
ccdbg_write_uint8(dbg, flash_prog + FLASH_ADDR_HIGH, flash_word_addr >> 8);
ccdbg_write_uint8(dbg, flash_prog + FLASH_ADDR_LOW, flash_word_addr & 0xff);
fprintf(stderr, "flash page timed out\n");
return 1;
}
-
+
ccdbg_debug(CC_DEBUG_FLASH, "Verify %d bytes in flash\n", this_time);
ccdbg_read_memory(dbg, flash_addr, verify, this_time);
if (memcmp (image->data + start, verify, this_time) != 0) {