static int print_image_metadata(struct cli_state *s, struct params *p, const char *argv0) { int status = 0; struct bladerf_image *image; char datetime[64]; struct tm *timeval; time_t time_tmp; int i; image = bladerf_alloc_image(BLADERF_IMAGE_TYPE_INVALID, 0, 0); if (!image) { return CMD_RET_MEM; } status = bladerf_image_read(image, p->img_file); if (status == 0) { printf("\n"); printf("Checksum: "); for (i = 0; i < BLADERF_IMAGE_CHECKSUM_LEN; i++) { printf("%02x", image->checksum[i]); } printf("\nImage format version: %d.%d.%d\n", image->version.major, image->version.minor, image->version.patch); time_tmp = image->timestamp; timeval = localtime(&time_tmp); if (timeval) { memset(datetime, 0, sizeof(datetime)); strftime(datetime, sizeof(datetime) - 1, "%Y-%m-%d %H:%M:%S", timeval); } else { strncpy(datetime, "Invalid value", sizeof(datetime)); } printf("Timestamp: %s\n", datetime); printf("Serial #: %s\n", image->serial); switch (image->type) { case BLADERF_IMAGE_TYPE_RAW: printf("Image type: Raw\n"); break; case BLADERF_IMAGE_TYPE_CALIBRATION: printf("Image type: Calibration data\n"); break; case BLADERF_IMAGE_TYPE_FIRMWARE: printf("Image type: Firmware\n"); break; case BLADERF_IMAGE_TYPE_FPGA_40KLE: printf("Image type: 40 kLE FPGA metadata and bitstream\n"); break; case BLADERF_IMAGE_TYPE_FPGA_115KLE: printf("Image type: 115 kLE FPGA metadata and bitstream\n"); break; default: printf("Type: Unknown\n"); break; } printf("Address: 0x%08" PRIx32 "\n", image->address); printf("Length: 0x%08" PRIx32 "\n", image->length); printf("\n"); } else { if (status == BLADERF_ERR_INVAL) { cli_err(s, argv0, "Image contains invalid fields or data."); status = CMD_RET_INVPARAM; } s->last_lib_error = status; status = CMD_RET_LIBBLADERF; } bladerf_free_image(image); return status; }
int cmd_flash_restore(struct cli_state *state, int argc, char **argv) { int rv; struct bladerf_image *image = NULL; struct options opt; uint32_t addr, len; memset(&opt, 0, sizeof(opt)); rv = parse_argv(state, argc, argv, &opt); if (rv < 0) return rv; rv = flash_check_state(state, argv[0]); if (rv != 0) { goto cmd_flash_restore_out; } image = bladerf_alloc_image(BLADERF_IMAGE_TYPE_INVALID, 0, 0); if (!image) { rv = CMD_RET_MEM; goto cmd_flash_restore_out; } rv = bladerf_image_read(image, opt.file); if (rv < 0) { rv_error(rv, "Failed to read flash image from file."); goto cmd_flash_restore_out; } if (opt.override_defaults) { addr = opt.address; len = u32_min(opt.len, image->length); if (len < opt.len) { printf(" Warning: Reduced length because only %u bytes are in " "the image.\n", opt.len); } } else { addr = image->address; len = image->length; } rv = bladerf_program_flash_unaligned(state->dev, addr, image->data, len); if (rv < 0) { cli_err(state, argv[0], "Failed to restore flash region.\n" "\n" "Flash contents may be corrupted. If the device fails to boot at successive\n" "power-ons, see the following wiki page for recovery instructions:" " https://github.com/Nuand/bladeRF/wiki/Upgrading-bladeRF-firmware" ); goto cmd_flash_restore_out; } rv = CMD_RET_OK; cmd_flash_restore_out: free(opt.file); bladerf_free_image(image); return rv; }