Enumerate all handled EEPROM values Provide ftdi_get|set_eeprom_value to access these...
[libftdi] / examples / eeprom.c
... / ...
CommitLineData
1/* LIBFTDI EEPROM access example
2
3 This program is distributed under the GPL, version 2
4*/
5
6#include <stdio.h>
7#include <stdlib.h>
8#include <string.h>
9#include <ctype.h>
10#include <unistd.h>
11#include <getopt.h>
12#include <ftdi.h>
13
14int main(int argc, char **argv)
15{
16 struct ftdi_context *ftdi;
17 unsigned char *buf;
18 int f, i, j;
19 int vid = 0x0403;
20 int pid = 0x6010;
21 char const *desc = 0;
22 char const *serial = 0;
23 int erase = 0;
24 int use_defaults = 0;
25 int large_chip = 0;
26 int do_write = 0;
27 int size;
28
29 if ((ftdi = ftdi_new()) == 0)
30 {
31 fprintf(stderr, "Failed to allocate ftdi structure :%s \n",
32 ftdi_get_error_string(ftdi));
33 return EXIT_FAILURE;
34 }
35
36 while ((i = getopt(argc, argv, "d::ev:p:l:P:S:w")) != -1)
37 {
38 switch (i)
39 {
40 case 'd':
41 use_defaults = 1;
42 if(optarg)
43 large_chip = 0x66;
44 break;
45 case 'e':
46 erase = 1;
47 break;
48 case 'v':
49 vid = strtoul(optarg, NULL, 0);
50 break;
51 case 'p':
52 pid = strtoul(optarg, NULL, 0);
53 break;
54 case 'P':
55 desc = optarg;
56 break;
57 case 'S':
58 serial = optarg;
59 break;
60 case 'w':
61 do_write = 1;
62 break;
63 default:
64 fprintf(stderr, "usage: %s [options]\n", *argv);
65 fprintf(stderr, "\t-d[num] Work with default valuesfor 128 Byte "
66 "EEPROM or for 256 Byte EEPROm if some [num] is given\n");
67 fprintf(stderr, "\t-w write\n");
68 fprintf(stderr, "\t-e erase\n");
69 fprintf(stderr, "\t-v verbose decoding\n");
70 fprintf(stderr, "\t-p <number> Search for device with PID == number\n");
71 fprintf(stderr, "\t-v <number> Search for device with VID == number\n");
72 fprintf(stderr, "\t-P <string? Search for device with given "
73 "product description\n");
74 fprintf(stderr, "\t-S <string? Search for device with given "
75 "serial number\n");
76 exit(-1);
77 }
78 }
79
80 // Select first interface
81 ftdi_set_interface(ftdi, INTERFACE_ANY);
82
83 // Open device
84 f = ftdi_usb_open_desc(ftdi, vid, pid, desc, serial);
85 if (f < 0)
86 {
87 fprintf(stderr, "Device VID 0x%04x PID 0x%04x", vid, pid);
88 if(desc)
89 fprintf(stderr, " Desc %s", desc);
90 if(serial)
91 fprintf(stderr, " Serial %s", serial);
92 fprintf(stderr, "\n");
93 fprintf(stderr, "unable to open ftdi device: %d (%s)\n",
94 f, ftdi_get_error_string(ftdi));
95
96 exit(-1);
97 }
98
99 if (erase)
100 {
101 f = ftdi_erase_eeprom(ftdi);
102 if (f < 0)
103 {
104 fprintf(stderr, "Erase failed: %s",
105 ftdi_get_error_string(ftdi));
106 return -2;
107 }
108 if (ftdi->eeprom->chip == -1)
109 fprintf(stderr, "No EEPROM\n");
110 else if (ftdi->eeprom->chip == 0)
111 fprintf(stderr, "Internal EEPROM\n");
112 else
113 fprintf(stderr, "Found 93x%02x\n",ftdi->eeprom->chip);
114 return 0;
115 }
116
117 if(use_defaults)
118 {
119 ftdi_eeprom_initdefaults(ftdi, "IKDA", "FTDIJTAF", "0001");
120 ftdi->eeprom->max_power = 500;
121 f=(ftdi_eeprom_build(ftdi));
122 if (f < 0)
123 {
124 fprintf(stderr, "ftdi_eeprom_build: %d (%s)\n",
125 f, ftdi_get_error_string(ftdi));
126 exit(-1);
127 }
128 }
129 else if(do_write)
130 {
131 ftdi_eeprom_initdefaults(ftdi, "IKDA", "FTDIJTAG", "0001");
132 ftdi->eeprom->max_power = 500;
133 f = ftdi_erase_eeprom(ftdi);
134 if (ftdi->eeprom->chip == -1)
135 fprintf(stderr, "No EEPROM\n");
136 else if (ftdi->eeprom->chip == 0)
137 fprintf(stderr, "Internal EEPROM\n");
138 else
139 fprintf(stderr, "Found 93x%02x\n",ftdi->eeprom->chip);
140 f=(ftdi_eeprom_build(ftdi));
141 if (f < 0)
142 {
143 fprintf(stderr, "Erase failed: %s",
144 ftdi_get_error_string(ftdi));
145 return -2;
146 }
147 f = ftdi_write_eeprom(ftdi);
148 {
149 fprintf(stderr, "ftdi_eeprom_decode: %d (%s)\n",
150 f, ftdi_get_error_string(ftdi));
151 exit(-1);
152 }
153 f = ftdi_read_eeprom(ftdi);
154 if (f < 0)
155 {
156 fprintf(stderr, "ftdi_read_eeprom: %d (%s)\n",
157 f, ftdi_get_error_string(ftdi));
158 exit(-1);
159 }
160 }
161 else
162 {
163 f = ftdi_read_eeprom(ftdi);
164 if (f < 0)
165 {
166 fprintf(stderr, "ftdi_read_eeprom: %d (%s)\n",
167 f, ftdi_get_error_string(ftdi));
168 exit(-1);
169 }
170 }
171
172
173 fprintf(stderr, "Chip type %d ftdi_eeprom_size: %d\n", ftdi->type, ftdi->eeprom->size);
174 buf = ftdi->eeprom->buf;
175 if (ftdi->type == TYPE_R)
176 size = 0xa0;
177 else
178 size = ftdi->eeprom->size;
179 for(i=0; i < size; i += 16)
180 {
181 fprintf(stdout,"0x%03x:", i);
182
183 for (j = 0; j< 8; j++)
184 fprintf(stdout," %02x", buf[i+j]);
185 fprintf(stdout," ");
186 for (; j< 16; j++)
187 fprintf(stdout," %02x", buf[i+j]);
188 fprintf(stdout," ");
189 for (j = 0; j< 8; j++)
190 fprintf(stdout,"%c", isprint(buf[i+j])?buf[i+j]:'.');
191 fprintf(stdout," ");
192 for (; j< 16; j++)
193 fprintf(stdout,"%c", isprint(buf[i+j])?buf[i+j]:'.');
194 fprintf(stdout,"\n");
195 }
196
197 f = ftdi_eeprom_decode(ftdi, 1);
198 if (f < 0)
199 {
200 fprintf(stderr, "ftdi_eeprom_decode: %d (%s)\n",
201 f, ftdi_get_error_string(ftdi));
202 exit(-1);
203 }
204
205 ftdi_usb_close(ftdi);
206 ftdi_free(ftdi);
207 return 0;
208}