X-Git-Url: http://developer.intra2net.com/git/?p=libftdi;a=blobdiff_plain;f=ftdi_eeprom%2Fmain.c;h=72c1fa7a877f426ca604e6d5d892035a7a768810;hp=32d7119b23d1eeecf84fe0c7c9951753424a4b71;hb=5b110dec90393f6951624fe9a9e58c9ae9e43127;hpb=bc7a46d1c11abacb94dc68067314d1a6d86285bb diff --git a/ftdi_eeprom/main.c b/ftdi_eeprom/main.c index 32d7119..72c1fa7 100644 --- a/ftdi_eeprom/main.c +++ b/ftdi_eeprom/main.c @@ -4,6 +4,7 @@ begin : Mon Apr 7 12:05:22 CEST 2003 copyright : (C) 2003-2014 by Intra2net AG and the libftdi developers email : opensource@intra2net.com + SPDX-License-Identifier: GPL-2.0-only ***************************************************************************/ /*************************************************************************** @@ -36,6 +37,7 @@ #include #include #include +#include #include #include @@ -64,6 +66,27 @@ static int parse_cbus(cfg_t *cfg, cfg_opt_t *opt, const char *value, void *resul return -1; } +static int parse_group0_drive(cfg_t *cfg, cfg_opt_t *opt, const char *value, void *result) +{ + static const char* options[] = + { + "4MA", "8MA", "12MA", "16MA" + }; + + int i; + for (i=0; itype == TYPE_230X) { @@ -517,6 +547,51 @@ int main(int argc, char *argv[]) eeprom_set_value(ftdi, CHANNEL_C_RS485, cfg_getbool(cfg, "chc_rs485")); eeprom_set_value(ftdi, CHANNEL_D_RS485, cfg_getbool(cfg, "chd_rs485")); + /* Arbitrary user data */ + eeprom_set_value(ftdi, USER_DATA_ADDR, cfg_getint(cfg, "user_data_addr")); + user_data_file = cfg_getstr(cfg, "user_data_file"); + if (user_data_file && strlen(user_data_file) > 0) + { + int data_size; + struct stat st; + + printf("User data file: %s\n", user_data_file); + /* Allocate a buffer for the user data */ + user_data_buffer = (char *)malloc(max_eeprom_size); + if (user_data_buffer == NULL) + { + fprintf(stderr, "Malloc failed, aborting\n"); + goto cleanup; + } + + if (stat(user_data_file, &st)) + { + printf ("Can't stat user data file %s.\n", user_data_file); + exit (-1); + } + if (st.st_size > max_eeprom_size) + printf("Warning: %s is too big, only reading %d bytes\n", + user_data_file, max_eeprom_size); + /* Read the user data file, no more than max_eeprom_size bytes */ + FILE *fp = fopen(user_data_file, "rb"); + if (fp == NULL) + { + printf ("Can't open user data file %s.\n", user_data_file); + exit (-1); + } + data_size = fread(user_data_buffer, 1, max_eeprom_size, fp); + fclose(fp); + if (data_size < 1) + { + printf ("Can't read user data file %s.\n", user_data_file); + exit (-1); + } + printf("User data size: %d\n", data_size); + + ftdi_set_eeprom_user_data(ftdi, user_data_buffer, data_size); + } + + if (command == COMMAND_ERASE) { printf("FTDI erase eeprom: %d\n", ftdi_erase_eeprom(ftdi)); @@ -527,7 +602,7 @@ int main(int argc, char *argv[]) if (size_check == -1) { - printf ("Sorry, the eeprom can only contain 128 bytes.\n"); + printf ("Sorry, the eeprom can only contain %d bytes.\n", my_eeprom_size); goto cleanup; } else if (size_check < 0) @@ -561,7 +636,15 @@ int main(int argc, char *argv[]) exit (-1); } + printf("Flashing raw eeprom from file %s (%d bytes)\n", + filename, my_eeprom_size); + ftdi_set_eeprom_buf(ftdi, eeprom_buf, my_eeprom_size); + } else + { + printf ("ERROR: flash_raw mode enabled, but no eeprom filename " + "given in config file.\n"); + exit (-1); } } printf ("FTDI write eeprom: %d\n", ftdi_write_eeprom(ftdi)); @@ -591,6 +674,8 @@ int main(int argc, char *argv[]) cleanup: if (eeprom_buf) free(eeprom_buf); + if (user_data_buffer) + free(user_data_buffer); if (command > 0) { printf("FTDI close: %d\n", ftdi_usb_close(ftdi));