//----------------------------------------------------------------------------- static void target_read(char *name) { uint32_t flash_size = device->flash_size * device->n_planes; uint32_t size = flash_size; uint32_t addr = device->flash_start; uint32_t offs = 0; uint8_t *buf; buf = buf_alloc(flash_size); verbose("Reading..."); while (size) { dap_read_block(addr, &buf[offs], device->page_size); addr += device->page_size; offs += device->page_size; size -= device->page_size; verbose("."); } save_file(name, buf, flash_size); buf_free(buf); verbose(" done.\n"); }
//----------------------------------------------------------------------------- static void target_cm0p_read(char *name) { uint32_t size = device->flash_size; uint32_t addr = device->flash_start; uint32_t offs = 0; uint8_t *buf; if (dap_read_word(DSU_CTRL_STATUS) & 0x00010000) error_exit("devices is locked, unable to read"); buf = buf_alloc(device->flash_size); verbose("Reading..."); while (size) { dap_read_block(addr, &buf[offs], device->row_size); addr += device->row_size; offs += device->row_size; size -= device->row_size; verbose("."); } save_file(name, buf, device->flash_size); buf_free(buf); verbose(" done.\n"); }
//----------------------------------------------------------------------------- static void target_cm7_read(char *name) { uint32_t size = device->flash_size; uint32_t addr = device->flash_start; uint32_t offs = 0; uint8_t *buf; buf = buf_alloc(device->flash_size); verbose("Reading..."); while (size) { for (uint32_t sector = 0; sector < device->page_size / SECTOR_SIZE; sector++) { dap_read_block(addr, &buf[offs], SECTOR_SIZE); addr += SECTOR_SIZE; offs += SECTOR_SIZE; size -= SECTOR_SIZE; } verbose("."); } save_file(name, buf, device->flash_size); buf_free(buf); verbose(" done.\n"); }
//----------------------------------------------------------------------------- static void target_cm0p_verify(char *name) { uint32_t addr = device->flash_start; uint32_t size, block_size; uint32_t offs = 0; uint8_t *bufa, *bufb; if (dap_read_word(DSU_CTRL_STATUS) & 0x00010000) error_exit("devices is locked, unable to verify"); bufa = buf_alloc(device->flash_size); bufb = buf_alloc(device->row_size); size = load_file(name, bufa, device->flash_size); verbose("Verification..."); while (size) { dap_read_block(addr, bufb, device->row_size); block_size = (size > device->row_size) ? device->row_size : size; for (int i = 0; i < (int)block_size; i++) { if (bufa[offs + i] != bufb[i]) { verbose("\nat address 0x%x expected 0x%02x, read 0x%02x\n", addr + i, bufa[offs + i], bufb[i]); free(bufa); free(bufb); error_exit("verification failed"); } } addr += device->row_size; offs += device->row_size; size -= block_size; verbose("."); } free(bufa); free(bufb); verbose(" done.\n"); }
//----------------------------------------------------------------------------- static void target_verify(char *name) { uint32_t addr = device->flash_start; uint32_t flash_size = device->flash_size * device->n_planes; uint32_t size, block_size; uint32_t offs = 0; uint8_t *bufa, *bufb; bufa = buf_alloc(flash_size); bufb = buf_alloc(device->page_size); size = load_file(name, bufa, flash_size); verbose("Verification..."); while (size) { dap_read_block(addr, bufb, device->page_size); block_size = (size > device->page_size) ? device->page_size : size; for (int i = 0; i < (int)block_size; i++) { if (bufa[offs + i] != bufb[i]) { verbose("\nat address 0x%x expected 0x%02x, read 0x%02x\n", addr + i, bufa[offs + i], bufb[i]); free(bufa); free(bufb); error_exit("verification failed"); } } addr += device->page_size; offs += device->page_size; size -= block_size; verbose("."); } free(bufa); free(bufb); verbose(" done.\n"); }
//----------------------------------------------------------------------------- static void target_read(void) { uint32_t addr = target_device.flash_start + target_options.offset; uint32_t offs = 0; uint8_t *buf = target_options.file_data; uint32_t size = target_options.size; while (size) { dap_read_block(addr, &buf[offs], target_device.page_size); addr += target_device.page_size; offs += target_device.page_size; size -= target_device.page_size; verbose("."); } save_file(target_options.name, buf, target_options.size); }
//----------------------------------------------------------------------------- static void target_verify(void) { uint32_t addr = target_device.flash_start + target_options.offset; uint32_t block_size; uint32_t offs = 0; uint8_t *bufb; uint8_t *bufa = target_options.file_data; uint32_t size = target_options.file_size; bufb = buf_alloc(target_device.page_size); while (size) { dap_read_block(addr, bufb, target_device.page_size); block_size = (size > target_device.page_size) ? target_device.page_size : size; for (int i = 0; i < (int)block_size; i++) { if (bufa[offs + i] != bufb[i]) { verbose("\nat address 0x%x expected 0x%02x, read 0x%02x\n", addr + i, bufa[offs + i], bufb[i]); buf_free(bufb); error_exit("verification failed"); } } addr += target_device.page_size; offs += target_device.page_size; size -= block_size; verbose("."); } buf_free(bufb); }