int main(int argc, char **argv) { void *hnd; int ret = 1; int flags; /* Parse command line options */ flags = parse_parameters(argc, argv); /* Open the USB device */ hnd = open_ftdi_device(usb_vid, usb_pid, usb_interface, usb_serial); if (hnd == NULL) return 1; /* Trigger embedded monitor detection */ if (send_special_waveform(hnd) < 0) goto terminate; if (config_i2c(hnd) < 0) goto terminate; if (check_chipid(hnd) < 0) goto terminate; if (flags & FLAG_UNPROTECT) command_write_unprotect(hnd); if (flags & FLAG_ERASE || output_filename) command_erase(hnd, flash_size, 0); if (input_filename) { ret = read_flash(hnd, input_filename, 0, flash_size); if (ret) goto terminate; } if (output_filename) { ret = write_flash(hnd, output_filename, 0); if (ret) goto terminate; } /* Normal exit */ ret = 0; terminate: /* Close the FTDI USB handle */ ftdi_usb_close(hnd); ftdi_free(hnd); return ret; }
int main(int argc, char **argv) { int ser; struct stm32_def *chip; int ret = 1; int flags; /* Parse command line options */ flags = parse_parameters(argc, argv); if (i2c_adapter == INVALID_I2C_ADAPTER) { /* Open the serial port tty */ ser = open_serial(serial_port); } else { ser = open_i2c(i2c_adapter); } if (ser < 0) return 1; /* Trigger embedded monitor detection */ if (init_monitor(ser) < 0) goto terminate; chip = command_get_id(ser); if (!chip) goto terminate; command_get_commands(ser, chip); if (flags & FLAG_READ_UNPROTECT) command_read_unprotect(ser); if (flags & FLAG_UNPROTECT) command_write_unprotect(ser); if (flags & FLAG_ERASE || output_filename) { if (!strcmp("STM32L15", chip->name)) { /* Mass erase is not supported on STM32L15xx */ /* command_ext_erase(ser, ERASE_ALL, 0); */ int i, page_count = chip->flash_size / chip->page_size; for (i = 0; i < page_count; i += 128) { int count = MIN(128, page_count - i); ret = erase(ser, count, i); if (ret) goto terminate; } } else { ret = erase(ser, 0xFFFF, 0); if (ret) goto terminate; } } if (input_filename) { ret = read_flash(ser, chip, input_filename, 0, chip->flash_size); if (ret) goto terminate; } if (output_filename) { ret = write_flash(ser, chip, output_filename, 0); if (ret) goto terminate; } /* Run the program from flash */ if (flags & FLAG_GO) command_go(ser, chip->flash_start); /* Normal exit */ ret = 0; terminate: /* Close serial port */ close(ser); return ret; }