Add option to write eeprom
[libftdi] / examples / eeprom.c
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
14 int 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     unsigned short value;
29
30     if ((ftdi = ftdi_new()) == 0)
31     {
32        fprintf(stderr, "Failed to allocate ftdi structure :%s \n", 
33                    ftdi_get_error_string(ftdi));
34         return EXIT_FAILURE;
35     }
36
37     while ((i = getopt(argc, argv, "d::ev:p:l:P:S:w")) != -1)
38     {
39         switch (i)
40         {
41         case 'd':
42             use_defaults = 1;
43             if(optarg)
44                 large_chip = 0x66; 
45             break;
46         case 'e':
47             erase = 1;
48             break;
49         case 'v':
50                 vid = strtoul(optarg, NULL, 0);
51                 break;
52         case 'p':
53                 pid = strtoul(optarg, NULL, 0);
54                 break;
55         case 'P':
56                 desc = optarg;
57                 break;
58         case 'S':
59                 serial = optarg;
60                 break;
61         case 'w':
62                 do_write  = 1;
63                 break;
64         default:
65                 fprintf(stderr, "usage: %s [options]\n", *argv);
66                 fprintf(stderr, "\t-d[num] Work with default valuesfor 128 Byte "
67                         "EEPROM or for 256 Byte EEPROm if some [num] is given\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 }