FreeCalypso > hg > fc-usbser-tools
comparison doc/FTDI-EEPROM-format @ 71:0b37be8b23ca
doc/FTDI-EEPROM-format: document string descriptors
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 24 Sep 2023 22:27:38 +0000 |
parents | 09da7db45dce |
children | 6dc3aa777fd6 |
comparison
equal
deleted
inserted
replaced
70:09da7db45dce | 71:0b37be8b23ca |
---|---|
146 This byte has the same bit assignments across all FTDI chips we work with, | 146 This byte has the same bit assignments across all FTDI chips we work with, |
147 although newer chips don't support some of the older bits: | 147 although newer chips don't support some of the older bits: |
148 | 148 |
149 bit 0: isochronous endpoint control on FT232BM and FT2232C/D | 149 bit 0: isochronous endpoint control on FT232BM and FT2232C/D |
150 bit 1: isochronous endpoint control on FT232BM and FT2232C/D | 150 bit 1: isochronous endpoint control on FT232BM and FT2232C/D |
151 Bit 2: enable suspend mode pull-down on I/O pins (all chips) | 151 bit 2: enable suspend mode pull-down on I/O pins (all chips) |
152 bit 3: 1 means serial number string present, 0 means serial # string absent | 152 bit 3: 1 means serial number string present, 0 means serial # string absent |
153 bit 4: set bcdUSB in device descriptor to EEPROM value (only up to FT2232C/D) | 153 bit 4: set bcdUSB in device descriptor to EEPROM value (only up to FT2232C/D) |
154 bit 5: isochronous endpoint control on FT2232C/D | 154 bit 5: isochronous endpoint control on FT2232C/D |
155 bit 6: isochronous endpoint control on FT2232C/D | 155 bit 6: isochronous endpoint control on FT2232C/D |
156 | 156 |
267 | 267 |
268 Please refer to libftdi source for the codes that go into individual 4-bit | 268 Please refer to libftdi source for the codes that go into individual 4-bit |
269 fields for each CBUSx. | 269 fields for each CBUSx. |
270 | 270 |
271 The strings area of the EEPROM begins with word 12 or byte offset 0x18. | 271 The strings area of the EEPROM begins with word 12 or byte offset 0x18. |
272 | |
273 USB string descriptors | |
274 ====================== | |
275 | |
276 The standard USB device descriptor returned by FTDI chips has iManufacturer set | |
277 to 1 and iProduct set to 2, indicating presence of string descriptors at these | |
278 indices. If byte 0A bit 3 is set, iSerialNumber is set to 3, otherwise | |
279 iSerialNumber is set to 0, indicating absence of serial number string. | |
280 | |
281 The string descriptors themselves, returned upon the host asking for them at | |
282 these indices, are stored verbatim in the strings area of the EEPROM, i.e., in | |
283 the free space following the fixed configuration structure for each chip. | |
284 | |
285 As defined in the USB spec, each string descriptor has the following structure: | |
286 | |
287 1 byte: total number of bytes in the descriptor | |
288 1 byte: constant 0x03, meaning string descriptor | |
289 variable bytes: string body in UCS-2 | |
290 | |
291 The total number of bytes in a string descriptor is the number of UCS-2 | |
292 characters times 2 plus 2; this number is written into the first byte of the | |
293 descriptor itself, in the least-significant half of the first 16-bit word. The | |
294 whole descriptor, consisting of this header word followed by UCS-2 character | |
295 words, can be placed at any EEPROM location that isn't taken or reserved for | |
296 something else, and there is a pointer to each of the 3 possible string | |
297 descriptors from the fixed header structure at the beginning of the EEPROM. | |
298 | |
299 Each of the 3 string pointers is one 16-bit word, structured as follows: | |
300 | |
301 lower byte: EEPROM byte address where the descriptor starts | |
302 upper byte: total number of bytes in the descriptor, same as written | |
303 in the descriptor itself | |
304 | |
305 String placement quirk | |
306 ---------------------- | |
307 | |
308 It should be apparent from the above description that each string descriptor | |
309 can be placed anywhere in the EEPROM, as long as that location doesn't clash | |
310 with something else. The most natural way is to put the manufacturer ID string | |
311 right after the fixed config structure, then the product ID string and then the | |
312 serial number string, if included - but FTDI's official tools *almost* follow | |
313 this principle, with two quirks: | |
314 | |
315 * In the case of 93C56 or 93C66 EEPROMs, FTDI's official tools skip 64 words | |
316 (128 bytes) after the end of the chip-defined config structure and then place | |
317 the manufacturer ID string after this gap. The byte-address pointer to each | |
318 string descriptor always has its high bit set as a result of this quirk. | |
319 | |
320 * In the case of 1024-bit EEPROMs (93C46 or FT232R internal) nothing is skipped, | |
321 but the byte-address pointers to strings are written with the high bit set, | |
322 as if the EEPROM were of 93C56 type. | |
323 | |
324 Our current ftee-gen* tools replicate these quirks, as they are essentially | |
325 harmless. The only downside of this design is that one cannot use a 93C56 | |
326 EEPROM to include longer strings - but designing a product with unnaturally | |
327 long ID strings, so long that FTDI's official tools won't support them, seems | |
328 like a bad idea. |