Hi, I missed the ability to create a config file from an eeprom file. So I created a small program. Besides I added a procedure to to free the allocated memory for strings (ftdi_eeprom_free), this could be added to libftdi to clean up.
If this feature is usefull, please tell me if it could be integrated into "ftdi_eeprom" or it should stay as a stand alone application. regards Wilfried --------------------------- /* * Copyright (C) 2010 Wilfried Holzke * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * compile: gcc thisfile.c -lftdi -lconfuse -o ftdi_eeprom_cfg */ #include <stdio.h> #include <string.h> #include <confuse.h> #include <ftdi.h> cfg_opt_t opts[] = { CFG_INT("vendor_id", 0, 0), CFG_INT("product_id", 0, 0), CFG_BOOL("self_powered", cfg_true, 0), CFG_BOOL("remote_wakeup", cfg_true, 0), CFG_BOOL("BM_type_chip", cfg_true, 0), CFG_BOOL("in_is_isochronous", cfg_false, 0), CFG_BOOL("out_is_isochronous", cfg_false, 0), CFG_BOOL("suspend_pull_downs", cfg_false, 0), CFG_BOOL("use_serial", cfg_false, 0), CFG_BOOL("change_usb_version", cfg_false, 0), CFG_INT("usb_version", 0, 0), CFG_INT("max_power", 0, 0), CFG_STR("manufacturer", "Acme Inc.", 0), CFG_STR("product", "USB Serial Converter", 0), CFG_STR("serial", "08-15", 0), CFG_STR("filename", "", 0), CFG_END() }; void ftdi_eeprom_free(struct ftdi_eeprom *eeprom) { if (eeprom->manufacturer != 0) { free(eeprom->manufacturer); eeprom->manufacturer = 0; } if (eeprom->product != 0) { free(eeprom->product); eeprom->product = 0; } if (eeprom->serial != 0) { free(eeprom->serial); eeprom->serial = 0; } } void ftdi_eeprom_print(struct ftdi_eeprom *eeprom) { printf("vendor_id: %#06x\n",eeprom->vendor_id); printf("product_id: %#06x\n",eeprom->product_id); printf("self_powered: %i\n",eeprom->self_powered); printf("remote_wakeup: %i\n",eeprom->remote_wakeup); printf("BM_type_chip: %i\n",eeprom->BM_type_chip); printf("in_is_isochronous: %i\n",eeprom->in_is_isochronous); printf("out_is_isochronous: %i\n",eeprom->out_is_isochronous); printf("suspend_pull_downs: %i\n",eeprom->suspend_pull_downs); printf("use_serial: %i\n",eeprom->use_serial); printf("change_usb_version: %i\n",eeprom->change_usb_version); printf("usb_version: %i\n",eeprom->usb_version); printf("max_power: %i\n",eeprom->max_power); printf("manufacturer: %s\n",eeprom->manufacturer); printf("product: %s\n",eeprom->product); printf("serial: %s\n",eeprom->serial); } void ftdi_eeprom_writeconf(char* filename, struct ftdi_eeprom *eeprom) { cfg_t *cfg=0; cfg = cfg_init(opts, 0); cfg_setint(cfg, "vendor_id",eeprom->vendor_id); cfg_setint(cfg, "product_id",eeprom->product_id); cfg_setbool(cfg, "BM_type_chip",eeprom->BM_type_chip); cfg_setbool(cfg, "self_powered",eeprom->self_powered); cfg_setbool(cfg, "remote_wakeup",eeprom->remote_wakeup); cfg_setint(cfg, "max_power",eeprom->max_power); cfg_setbool(cfg, "in_is_isochronous",eeprom->in_is_isochronous); cfg_setbool(cfg, "out_is_isochronous",eeprom->out_is_isochronous); cfg_setbool(cfg, "suspend_pull_downs",eeprom->suspend_pull_downs); cfg_setbool(cfg, "use_serial",eeprom->use_serial); cfg_setbool(cfg, "change_usb_version",eeprom->change_usb_version); cfg_setint(cfg, "usb_version",eeprom->usb_version); cfg_setstr(cfg, "manufacturer",eeprom->manufacturer); cfg_setstr(cfg, "product",eeprom->product); cfg_setstr(cfg, "serial",eeprom->serial); FILE *fp = fopen(filename, "w"); if (fp != 0) { cfg_print(cfg, fp); fclose(fp); } } char* strcon(char *s1, char *s2) { char *s = strdup(s1); if (s != 0) { char *sf = realloc(s,strlen(s1)+strlen(s2)+1); if (sf != 0) { s = strcat(sf,s2); } else { free(s); s = 0; } } return s; } int main(int argc, char** argv) { if (argc != 2) { printf("usage: ftdi_eeprom_print [eeprom-filename]\n"); } else { FILE *fp = fopen (argv[1], "rb"); if (fp != 0) { unsigned char eeprom_buf[128]; fread (&eeprom_buf, 1, 128, fp); fclose (fp); struct ftdi_eeprom eeprom; if (ftdi_eeprom_decode(&eeprom, eeprom_buf, 128) == 0) { ftdi_eeprom_print(&eeprom); char* filename = strcon(argv[1],".cfg"); if (filename != 0) { ftdi_eeprom_writeconf(filename,&eeprom); free(filename); } ftdi_eeprom_free(&eeprom); } else { printf("error decoding eeprom buffer!\n"); } } } return 0; } -- libftdi - see http://www.intra2net.com/en/developer/libftdi for details. To unsubscribe send a mail to [email protected]
