X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=lib%2Fccdbg-flash.c;h=8a586a21ccb4fc076da2886881d9830662736925;hp=aa2c5187f917a9d99e75966e07c2362fec4a5f9f;hb=019456a17d36f8f9f9b72cfbc980492175086d32;hpb=9025eb792861930e6af918d2727c4f5d97a69936 diff --git a/lib/ccdbg-flash.c b/lib/ccdbg-flash.c index aa2c5187..8a586a21 100644 --- a/lib/ccdbg-flash.c +++ b/lib/ccdbg-flash.c @@ -112,16 +112,16 @@ ccdbg_flash_erase_page(struct ccdbg *dbg, uint16_t addr) flash_erase_page[ERASE_PAGE_HIGH] = page_addr >> 8; flash_erase_page[ERASE_PAGE_LOW] = page_addr & 0xff; status = ccdbg_execute(dbg, flash_erase_page); - printf("erase status 0x%02x\n", status); + ccdbg_debug(CC_DEBUG_FLASH, "erase status 0x%02x\n", status); do { status = ccdbg_execute(dbg, flash_read_control); - printf("fctl 0x%02x\n", status); + ccdbg_debug(CC_DEBUG_FLASH, "fctl 0x%02x\n", status); } while (status & FCTL_BUSY); ccdbg_read_memory(dbg, addr, new, 0x10); for (i = 0; i < 0x10; i++) - printf("0x%02x -> 0x%02x\n", old[i], new[i]); + ccdbg_debug(CC_DEBUG_FLASH, "0x%02x -> 0x%02x\n", old[i], new[i]); status = ccdbg_execute(dbg, flash_control_clear); - printf("clear fctl 0x%02x\n", status); + ccdbg_debug(CC_DEBUG_FLASH, "clear fctl 0x%02x\n", status); return 0; } #endif @@ -190,22 +190,22 @@ ccdbg_flash_write_word(struct ccdbg *dbg, uint16_t addr, uint8_t data[2]) flash_write[WRITE_PAGE_LOW] = page_addr & 0xff; flash_write[WRITE_BYTE_0] = data[0]; flash_write[WRITE_BYTE_1] = data[1]; - printf("upload flash write\n"); + ccdbg_debug(CC_DEBUG_FLASH, "upload flash write\n"); ccdbg_write_memory(dbg, 0xf000, flash_write, sizeof(flash_write)); ccdbg_set_pc(dbg, 0xf000); ccdbg_resume(dbg); for (;;) { status = ccdbg_read_status(dbg); - printf("waiting for write 0x%02x\n", status); + ccdbg_debug(CC_DEBUG_FLASH, "waiting for write 0x%02x\n", status); if ((status & CC_STATUS_CPU_HALTED) != 0) break; sleep (1); } status = ccdbg_execute(dbg, flash_control_clear); - printf("clear fctl 0x%02x\n", status); + ccdbg_debug(CC_DEBUG_FLASH, "clear fctl 0x%02x\n", status); ccdbg_read_memory(dbg, addr, check, 2); for (i = 0; i < 2; i++) - printf("0x%02x : 0x%02x\n", data[i], check[i]); + ccdbg_debug(CC_DEBUG_FLASH, "0x%02x : 0x%02x\n", data[i], check[i]); return 0; } #endif @@ -231,7 +231,7 @@ ccdbg_flash_lock(struct ccdbg *dbg, uint8_t lock) ccdbg_read_memory(dbg, 0, old, 1); ccdbg_flash_write_word(dbg, 0, bytes); ccdbg_read_memory(dbg, 0, new, 1); - printf ("flash lock 0x%02x -> 0x%02x\n", old[0], new[0]); + ccdbg_debug(CC_DEBUG_FLASH, "flash lock 0x%02x -> 0x%02x\n", old[0], new[0]); ccdbg_wr_config(dbg, config & ~SEL_FLASH_INFO_PAGE); return 0; } @@ -244,13 +244,16 @@ ccdbg_flash_hex_image(struct ccdbg *dbg, struct hex_image *image) uint16_t flash_prog; uint16_t flash_len; uint8_t fwt; + uint16_t flash_addr; uint16_t flash_word_addr; uint16_t flash_words; + uint8_t flash_words_high, flash_words_low; uint16_t ram_addr; uint16_t pc; uint8_t status; uint16_t remain, this_time, start; uint8_t verify[0x400]; + int times; ccdbg_clock_init(dbg); if (image->address + image->length > 0x8000) { @@ -270,7 +273,7 @@ ccdbg_flash_hex_image(struct ccdbg *dbg, struct hex_image *image) fwt = 0x20; flash_page[FLASH_TIMING] = fwt; - printf("Upload %d flash program bytes to 0x%04x\n", + 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)); @@ -283,55 +286,71 @@ ccdbg_flash_hex_image(struct ccdbg *dbg, struct hex_image *image) offset = ram_addr - (image->address + start); - printf("Upload %d bytes at 0x%04x\n", this_time, ram_addr); + ccdbg_debug(CC_DEBUG_FLASH, "Upload %d bytes at 0x%04x\n", this_time, ram_addr); ccdbg_write_memory(dbg, ram_addr, image->data + start, this_time); - - printf("Verify %d bytes\n", image->length); +#if 0 + ccdbg_debug(CC_DEBUG_FLASH, "Verify %d bytes in ram\n", this_time); ccdbg_read_memory(dbg, ram_addr, verify, this_time); if (memcmp (image->data + start, verify, this_time) != 0) { - fprintf(stderr, "image verify failed\n"); + fprintf(stderr, "ram verify failed\n"); return 1; } +#endif - flash_word_addr = (image->address + start) >> 1; + flash_addr = image->address + start; + flash_word_addr = flash_addr >> 1; flash_len = this_time + (this_time & 1); flash_words = flash_len >> 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); ccdbg_write_uint8(dbg, flash_prog + RAM_ADDR_HIGH, ram_addr >> 8); ccdbg_write_uint8(dbg, flash_prog + RAM_ADDR_LOW, ram_addr & 0xff); - ccdbg_write_uint8(dbg, flash_prog + FLASH_WORDS_HIGH, flash_words >> 8); - ccdbg_write_uint8(dbg, flash_prog + FLASH_WORDS_LOW, flash_words & 0xff); + ccdbg_write_uint8(dbg, flash_prog + FLASH_WORDS_HIGH, flash_words_high); + ccdbg_write_uint8(dbg, flash_prog + FLASH_WORDS_LOW, flash_words_low); ccdbg_set_pc(dbg, flash_prog); pc = ccdbg_get_pc(dbg); - printf("Starting flash program at 0x%04x\n", pc); + ccdbg_debug(CC_DEBUG_FLASH, "Flashing %d bytes at 0x%04x\n", + this_time, flash_addr); status = ccdbg_resume(dbg); - printf("resume status is 0x%02x\n", status); - do { + for (times = 0; times < 10; times++) { status = ccdbg_read_status(dbg); - printf("chip status is 0x%02x\n", status); - sleep(1); - } while ((status & CC_STATUS_CPU_HALTED) == 0); + ccdbg_debug(CC_DEBUG_FLASH, "."); + ccdbg_flush(CC_DEBUG_FLASH); + if ((status & CC_STATUS_CPU_HALTED) != 0) + break; + usleep(10000); + } + ccdbg_debug(CC_DEBUG_FLASH, "\n"); + if (times == 10) { + 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) { + int i; + fprintf(stderr, "flash verify failed\n"); + for (i = 0; i < this_time; i++) { + if (image->data[start + i] != verify[i]) + fprintf(stderr, "0x%04x: 0x%02x != 0x%02x\n", + start + i, image->data[start+i], verify[i]); + } + return 1; + } remain -= this_time; start += this_time; } -#if 1 - printf("Downloading flash to check\n"); - struct hex_image *test_image; - test_image = ccdbg_read_hex_image(dbg, image->address, image->length); - if (!ccdbg_hex_image_equal(image, test_image)) { - int i; - fprintf(stderr, "Image not loaded\n"); - for (i = 0;i < 0x10; i++) - printf ("0x%02x : 0x%02x\n", image->data[i], test_image->data[i]); - return 1; - } - return 0; -#endif return 0; }