X-Git-Url: http://developer.intra2net.com/git/?p=libftdi;a=blobdiff_plain;f=ftdi_eeprom%2Fmain.c;h=72c1fa7a877f426ca604e6d5d892035a7a768810;hp=edcfad70d0a9d42c2fd88aa3fc3158165f83f428;hb=5b110dec90393f6951624fe9a9e58c9ae9e43127;hpb=190fca12fae231e8015f64953e51205ea3996bdf diff --git a/ftdi_eeprom/main.c b/ftdi_eeprom/main.c index edcfad7..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 ***************************************************************************/ /*************************************************************************** @@ -35,6 +36,8 @@ #include #include #include +#include +#include #include #include @@ -63,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; i::\n"); fprintf(stderr, " s:::\n"); fprintf(stderr, "--read-eeprom Read eeprom and write to -filename- from config-file\n"); + fprintf(stderr, "--build-eeprom Build eeprom image\n"); fprintf(stderr, "--erase-eeprom Erase eeprom\n"); fprintf(stderr, "--flash-eeprom Flash eeprom\n"); } @@ -233,6 +258,7 @@ int main(int argc, char *argv[]) CFG_INT_CB("cbusx1", -1, 0, parse_cbusx), CFG_INT_CB("cbusx2", -1, 0, parse_cbusx), CFG_INT_CB("cbusx3", -1, 0, parse_cbusx), + CFG_INT_CB("group0_drive", -1, 0, parse_group0_drive), CFG_BOOL("invert_txd", cfg_false, 0), CFG_BOOL("invert_rxd", cfg_false, 0), CFG_BOOL("invert_rts", cfg_false, 0), @@ -251,6 +277,9 @@ int main(int argc, char *argv[]) CFG_BOOL("chb_rs485", cfg_false, 0), CFG_BOOL("chc_rs485", cfg_false, 0), CFG_BOOL("chd_rs485", cfg_false, 0), + CFG_FUNC("include", &cfg_include), + CFG_INT("user_data_addr", 0x18, 0), + CFG_STR("user_data_file", "", 0), CFG_END() }; cfg_t *cfg; @@ -261,10 +290,13 @@ int main(int argc, char *argv[]) enum { COMMAND_READ = 1, COMMAND_ERASE, - COMMAND_FLASH + COMMAND_FLASH, + COMMAND_BUILD } command = 0; const char *cfg_filename = NULL; const char *device_description = NULL; + const char *user_data_file = NULL; + char *user_data_buffer = NULL; const int max_eeprom_size = 256; int my_eeprom_size = 0; @@ -305,6 +337,10 @@ int main(int argc, char *argv[]) { command = COMMAND_FLASH; } + else if (!strcmp(argv[i], "--build-eeprom")) + { + command = COMMAND_BUILD; + } else { usage(argv[0]); @@ -395,10 +431,15 @@ int main(int argc, char *argv[]) } if (filename != NULL && strlen(filename) > 0) { - FILE *fp = fopen (filename, "wb"); - fwrite (eeprom_buf, 1, my_eeprom_size, fp); - fclose (fp); + + if(fp) + { + fwrite(eeprom_buf, 1, my_eeprom_size, fp); + fclose(fp); + } + else + fprintf(stderr, "Could not open output file %s: %s\n", filename, strerror(errno)); } else { @@ -461,6 +502,8 @@ int main(int argc, char *argv[]) eeprom_set_value(ftdi, CBUS_FUNCTION_8, cfg_getint(cfg, "cbush8")); if (cfg_getint(cfg, "cbush9") != -1) eeprom_set_value(ftdi, CBUS_FUNCTION_9, cfg_getint(cfg, "cbush9")); + if (cfg_getint(cfg, "group0_drive") != -1) + eeprom_set_value(ftdi, GROUP0_DRIVE, cfg_getint(cfg, "group0_drive")); } else if (ftdi->type == TYPE_230X) { @@ -504,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)); @@ -514,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) @@ -548,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)); @@ -578,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));