From 2db3a766fd94a852d95f46efadf3a0dacccd29f5 Mon Sep 17 00:00:00 2001 From: Uwe Bonnes Date: Fri, 10 Sep 2010 22:54:39 +0200 Subject: [PATCH] Example for the EEPROM API --- examples/CMakeLists.txt | 2 + examples/eeprom.c | 176 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 178 insertions(+), 0 deletions(-) create mode 100644 examples/eeprom.c diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index af7f57a..d8be6f5 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -21,6 +21,7 @@ if (EXAMPLES) add_executable(serial_read serial_read.c) add_executable(baud_test baud_test.c) add_executable(stream_test stream_test.c) + add_executable(eeprom eeprom.c) # Linkage target_link_libraries(simple ftdi) @@ -32,6 +33,7 @@ if (EXAMPLES) target_link_libraries(serial_read ftdi) target_link_libraries(baud_test ftdi) target_link_libraries(stream_test ftdi) + target_link_libraries(eeprom ftdi) # libftdi++ examples if(FTDI_BUILD_CPP) diff --git a/examples/eeprom.c b/examples/eeprom.c new file mode 100644 index 0000000..6be43f6 --- /dev/null +++ b/examples/eeprom.c @@ -0,0 +1,176 @@ +/* LIBFTDI EEPROM access example + + This program is distributed under the GPL, version 2 +*/ + +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char **argv) +{ + struct ftdi_context ftdic; + struct ftdi_eeprom eeprom; + unsigned char buf[2048]; + int size; + int f, i, j; + int vid = 0x0403; + int pid = 0x6010; + char const *desc = 0; + char const *serial = 0; + int erase = 0; + int use_defaults; + int large_chip = 0; + + while ((i = getopt(argc, argv, "d::ev:p:P:S:")) != -1) + { + switch (i) + { + case 'd': + use_defaults = 1; + if(optarg) + large_chip = 0x66; + break; + case 'e': + erase = 1; + break; + case 'v': + vid = strtoul(optarg, NULL, 0); + break; + case 'p': + pid = strtoul(optarg, NULL, 0); + break; + case 'P': + desc = optarg; + break; + case 'S': + serial = optarg; + break; + default: + fprintf(stderr, "usage: %s [options]\n", *argv); + fprintf(stderr, "\t-d[num] Work with default valuesfor 128 Byte " + "EEPROM or for 256 Byte EEPROm if some [num] is given\n"); + fprintf(stderr, "\t-e erase\n"); + fprintf(stderr, "\t-v verbose decoding\n"); + fprintf(stderr, "\t-p Search for device with PID == number\n"); + fprintf(stderr, "\t-v Search for device with VID == number\n"); + fprintf(stderr, "\t-P chip == -1) + fprintf(stderr, "No EEPROM\n"); + else if (ftdic.eeprom->chip == 0) + fprintf(stderr, "Internal EEPROM\n"); + else + fprintf(stderr, "Found 93x%02x\n",ftdic.eeprom->chip); + return 0; + } + + size = 2048; + memset(buf,0, size); + ftdic.eeprom = &eeprom; + if(use_defaults) + { + ftdi_eeprom_initdefaults(&ftdic); + ftdic.eeprom->manufacturer="IKDA"; + ftdic.eeprom->product="CPS-CONN"; + ftdic.eeprom->serial="0001"; + ftdic.eeprom->chip= large_chip; + ftdic.eeprom->cbus_function[0]= CBUS_BB_RD; + ftdic.eeprom->cbus_function[1]= CBUS_CLK48; + ftdic.eeprom->cbus_function[2]= CBUS_IOMODE; + ftdic.eeprom->cbus_function[3]= CBUS_BB; + ftdic.eeprom->cbus_function[4]= CBUS_CLK6; + f=(ftdi_eeprom_build(&ftdic, buf)); + if (f < 0) + { + fprintf(stderr, "ftdi_eeprom_build: %d (%s)\n", + f, ftdi_get_error_string(&ftdic)); + exit(-1); + } + } + else + { + f = ftdi_read_eeprom(&ftdic, buf); + if (f < 0) + { + fprintf(stderr, "ftdi_read_eeprom: %d (%s)\n", + f, ftdi_get_error_string(&ftdic)); + exit(-1); + } + } + fprintf(stderr, "Chip type %d ftdi_eeprom_size: %d\n", ftdic.type, ftdic.eeprom->size); + for(i=0; i < ftdic.eeprom->size; i += 16) + { + fprintf(stdout,"0x%03x:", i); + + for (j = 0; j< 8; j++) + fprintf(stdout," %02x", buf[i+j]); + fprintf(stdout," "); + for (; j< 16; j++) + fprintf(stdout," %02x", buf[i+j]); + fprintf(stdout," "); + for (j = 0; j< 8; j++) + fprintf(stdout,"%c", isprint(buf[i+j])?buf[i+j]:'.'); + fprintf(stdout," "); + for (; j< 16; j++) + fprintf(stdout,"%c", isprint(buf[i+j])?buf[i+j]:'.'); + fprintf(stdout,"\n"); + } + + f = ftdi_eeprom_decode(&ftdic,buf, size, 1); + { + fprintf(stderr, "ftdi_eeprom_decode: %d (%s)\n", + f, ftdi_get_error_string(&ftdic)); + exit(-1); + } + + + ftdi_usb_close(&ftdic); + ftdi_deinit(&ftdic); +} -- 1.7.1