comparison fteeprom/ftee-gen232r.c @ 0:11b8a30333b3

fteeprom: initial import from freecalypso-hwlab
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 03 Sep 2023 18:08:22 +0000
parents
children b2c891299e83
comparison
equal deleted inserted replaced
-1:000000000000 0:11b8a30333b3
1 #include <sys/types.h>
2 #include <ctype.h>
3 #include <string.h>
4 #include <strings.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7
8 u_short vid = 0x0403, pid = 0x6001;
9 char *manuf, *product;
10 u_char byte00 = 0x00, byte01 = 0x40;
11 u_char byte08 = 0x80, byte0A = 0x00, byte0B = 0x00;
12 unsigned maxpower = 90;
13 u_short usb_version = 0x0200;
14 u_char cbusconf[5] = {3, 2, 0, 1, 5};
15
16 u_short eeprom[64];
17 unsigned eeprom_string_ptr = 0x0C;
18
19 read_config_file(filename)
20 char *filename;
21 {
22 FILE *inf;
23 char linebuf[1024];
24 int lineno;
25 char *cp, *np;
26
27 inf = fopen(filename, "r");
28 if (!inf) {
29 perror(filename);
30 exit(1);
31 }
32 for (lineno = 1; fgets(linebuf, sizeof linebuf, inf); lineno++) {
33 cp = index(linebuf, '\n');
34 if (!cp) {
35 fprintf(stderr,
36 "%s line %d: too long or unterminated\n",
37 filename, lineno);
38 exit(1);
39 }
40 *cp = '\0';
41 for (cp = linebuf; isspace(*cp); cp++)
42 ;
43 if (*cp == '\0' || *cp == '#')
44 continue;
45 for (np = cp; *cp && !isspace(*cp); cp++)
46 ;
47 if (*cp)
48 *cp++ = '\0';
49 while (isspace(*cp))
50 cp++;
51 if (*cp == '\0' || *cp == '#') {
52 fprintf(stderr,
53 "%s line %d: \"%s\" setting without argument\n",
54 filename, lineno, np);
55 exit(1);
56 }
57 if (!strcmp(np, "vid"))
58 vid = strtoul(cp, 0, 16);
59 else if (!strcmp(np, "pid"))
60 pid = strtoul(cp, 0, 16);
61 else if (!strcmp(np, "manuf"))
62 manuf = strdup(cp);
63 else if (!strcmp(np, "product"))
64 product = strdup(cp);
65 else if (!strcmp(np, "byte00"))
66 byte00 = strtoul(cp, 0, 16);
67 else if (!strcmp(np, "byte01"))
68 byte01 = strtoul(cp, 0, 16);
69 else if (!strcmp(np, "byte08"))
70 byte08 = strtoul(cp, 0, 16);
71 else if (!strcmp(np, "byte0A"))
72 byte0A = strtoul(cp, 0, 16);
73 else if (!strcmp(np, "byte0B"))
74 byte0B = strtoul(cp, 0, 16);
75 else if (!strcmp(np, "maxpower"))
76 maxpower = strtoul(cp, 0, 10);
77 else if (!strcmp(np, "usbver"))
78 usb_version = strtoul(cp, 0, 16);
79 else if (!strcmp(np, "cbus0"))
80 cbusconf[0] = strtoul(cp, 0, 16);
81 else if (!strcmp(np, "cbus1"))
82 cbusconf[1] = strtoul(cp, 0, 16);
83 else if (!strcmp(np, "cbus2"))
84 cbusconf[2] = strtoul(cp, 0, 16);
85 else if (!strcmp(np, "cbus3"))
86 cbusconf[3] = strtoul(cp, 0, 16);
87 else if (!strcmp(np, "cbus4"))
88 cbusconf[4] = strtoul(cp, 0, 16);
89 else {
90 fprintf(stderr, "%s line %d: unknown \"%s\" setting\n",
91 filename, lineno, np);
92 exit(1);
93 }
94 }
95 fclose(inf);
96 if (!manuf) {
97 fprintf(stderr, "error: manuf not set in %s\n", filename);
98 exit(1);
99 }
100 if (!product) {
101 fprintf(stderr, "error: product not set in %s\n", filename);
102 exit(1);
103 }
104 }
105
106 write_string(str)
107 char *str;
108 {
109 unsigned longlen, startptr;
110
111 if (63 - eeprom_string_ptr < strlen(str) + 1) {
112 fprintf(stderr, "error: strings are too long\n");
113 exit(1);
114 }
115 longlen = strlen(str) * 2 + 2;
116 startptr = eeprom_string_ptr;
117 eeprom[eeprom_string_ptr++] = 0x0300 | longlen;
118 while (*str)
119 eeprom[eeprom_string_ptr++] = *str++;
120 return (longlen << 8) | 0x80 | (startptr << 1);
121 }
122
123 fill_eeprom(serial)
124 char *serial;
125 {
126 u_char byte09;
127
128 if (serial)
129 byte0A |= 0x08;
130 else
131 byte0A &= 0xF7;
132 byte09 = maxpower / 2;
133 eeprom[0] = (byte01 << 8) | byte00;
134 eeprom[1] = vid;
135 eeprom[2] = pid;
136 eeprom[3] = 0x0600;
137 eeprom[4] = (byte09 << 8) | byte08;
138 eeprom[5] = (byte0B << 8) | byte0A;
139 eeprom[6] = usb_version;
140 eeprom[7] = write_string(manuf);
141 eeprom[8] = write_string(product);
142 if (serial)
143 eeprom[9] = write_string(serial);
144 else
145 eeprom[9] = 0;
146 eeprom[10] = (cbusconf[3] << 12) | (cbusconf[2] << 8) |
147 (cbusconf[1] << 4) | cbusconf[0];
148 eeprom[11] = cbusconf[4];
149 }
150
151 do_checksum()
152 {
153 u_short chksum = 0xAAAA;
154 unsigned n;
155
156 for (n = 0; n < 63; n++) {
157 chksum ^= eeprom[n];
158 chksum = (chksum << 1) | (chksum >> 15);
159 }
160 eeprom[63] = chksum;
161 }
162
163 emit_output()
164 {
165 unsigned n, col;
166
167 for (n = 0; n < 64; n++) {
168 col = n & 7;
169 if (col == 0)
170 printf("%02X:", n * 2);
171 printf(" %04X", eeprom[n]);
172 if (col == 7)
173 putchar('\n');
174 }
175 }
176
177 main(argc, argv)
178 char **argv;
179 {
180 if (argc < 2 || argc > 3) {
181 fprintf(stderr, "usage: %s config-file [serial-num]\n",
182 argv[0]);
183 exit(1);
184 }
185 read_config_file(argv[1]);
186 fill_eeprom(argv[2]);
187 do_checksum();
188 emit_output();
189 exit(0);
190 }