comparison doc/FTDI-EEPROM-tools @ 35:f548ae912622

doc/FTDI-EEPROM-tools: update for 2023 sans-libftdi version
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 10 Sep 2023 00:18:20 +0000
parents f5fbcf1ff032
children 9cfe3223fbf8
comparison
equal deleted inserted replaced
34:f5fbcf1ff032 35:f548ae912622
37 * if the goal is to generate a new EEPROM config from scratch, as opposed to 37 * if the goal is to generate a new EEPROM config from scratch, as opposed to
38 restoring a saved backup, we currently have generators only for FT2232C/D, 38 restoring a saved backup, we currently have generators only for FT2232C/D,
39 for FT2232H and for FT232R, with the last one considered experimental and not 39 for FT2232H and for FT232R, with the last one considered experimental and not
40 proven. 40 proven.
41 41
42 libftdi dependency 42 No more libftdi dependency!
43 ================== 43 ===========================
44 44
45 We use libftdi (which is in turn layered on libusb) to issue the special USB 45 Our initial implementation of fteeprom-* tools was based on libftdi; more
46 control pipe commands to FTDI chips which are needed to read and write their 46 specifically, one had to use an old libftdi-0.x version, as these old versions
47 EEPROMs. We use old-style libftdi-0.x (-lftdi on the link line) as opposed to 47 were the only ones that allowed writing to the EEPROM directly with
48 libftdi1 (-lftdi1) because the new versions took away the ability to write to 48 ftdi_write_eeprom_location() API calls. However, the present version has been
49 the EEPROM directly with ftdi_write_eeprom_location() calls, forcing users to 49 reimplemented to NOT use libftdi at all - instead we have our own minilibs,
50 go through libftdi1's own EEPROM smarts, which we don't want to do - our tools 50 maintained as part of fc-usbser-tools package, that are built on top of
51 are all about more direct user empowerment at the lowest level. 51 libusb-0.x API. (The version of libftdi we used previously was also built on
52 top of the same libusb-0.x API, hence no change in that dependency.) The
53 libusb-0.x API we use consists of <usb.h> include header and -lusb link library
54 pull-in; on "modern" systems these pieces will typically be provided by
55 libusb-compat-0.1 package wrapping around libusb-1.x, but in the spirit of Holy
56 retrocomputing, really old systems can be used with native libusb-0.1.
52 57
53 Selecting the device to operate on 58 Selecting the device to operate on
54 ================================== 59 ==================================
55 60
56 Our fteeprom-read, fteeprom-prog and fteeprom-erase tools take a device selector 61 Our fteeprom-read, fteeprom-prog and fteeprom-erase tools take a device selector
57 argument, selecting the device to operate on. This required argument is the 62 argument, selecting the device to operate on. The design of this device
58 string to be passed to the ftdi_usb_open_string() function in libftdi, allowing 63 selector mechanism has been copied from libftdi; while we no longer use libftdi,
59 the device to be operated on to be selected in one of several ways. Copying 64 we found its device selector mechanism to be a really good design and we have
60 from libftdi documentation, the available formats are: 65 fully reimplemented it. The device selector argument is a string in one of the
61 66 following formats (some wording copied from libftdi documentation):
62 d:<devicenode> - path of bus and device-node (e.g. "003/001") within usb device 67
63 tree (usually at /proc/bus/usb/) 68 d:<devicenode> - path of bus and device-node (e.g. "003/001") within USB device
69 tree as enumerated via libusb-0.x API. Libftdi documentation said
70 /proc/bus/usb, but at least on Mother's Slackware 14.2 system, the observed
71 location of this device tree is /dev/bus/usb.
64 72
65 i:<vendor>:<product> - first device with given vendor and product id, ids can 73 i:<vendor>:<product> - first device with given vendor and product id, ids can
66 be decimal, octal (preceded by "0") or hex (preceded by "0x") 74 be decimal, octal (preceded by "0") or hex (preceded by "0x")
67 75
68 i:<vendor>:<product>:<index> - as above with index being the number of the 76 i:<vendor>:<product>:<index> - as above with index being the number of the
110 118
111 The output of fteeprom-read is in the same format as the input to fteeprom-prog, 119 The output of fteeprom-read is in the same format as the input to fteeprom-prog,
112 thus you can redirect the output to a file and get a restorable backup copy of 120 thus you can redirect the output to a file and get a restorable backup copy of
113 your EEPROM. 121 your EEPROM.
114 122
115 It also needs to be noted that if the FTDI device has the kernel's ftdi_sio 123 Change from previous version
116 driver attached to it (ttyUSB device present) when you run fteeprom-read (same 124 ----------------------------
117 for fteeprom-prog and fteeprom-erase), the act of running any of our EEPROM 125
118 tools will cause it to unbind, i.e., the ttyUSB device will disappear. If the 126 In the original libftdi-based implementation of fteeprom-read, the act of
119 device being operated on is a dual-channel FT2232x, then only the ttyUSB device 127 reading the EEPROM was invasive: libftdi's open function would unbind the
120 corresponding to Channel A will disappear, while the Channel B ttyUSB device 128 kernel's ftdi_sio driver (Channel A ttyUSB device disappears) and
121 will stay. 129 reset/reinitialize the SIO channel itself. However, it turns out that these
130 invasive steps aren't needed if the goal is only to read the EEPROM - the
131 necessary USB control endpoint transactions can be done while the kernel's
132 ftdi_sio driver remains attached with ttyUSBx devices intact on all channels.
133 The current version of fteeprom-read has been fixed to be non-invasive in this
134 regard: you can now freely read the EEPROM of any connected FTDI device
135 *without* bumping off that device's ttyUSB.
122 136
123 Programming the EEPROM 137 Programming the EEPROM
124 ====================== 138 ======================
125 139
126 In terms of the primitives provided over USB, writing to EEPROMs sitting behind 140 In terms of the primitives provided over USB, writing to EEPROMs sitting behind
210 what does one need a bigger EEPROM for... 224 what does one need a bigger EEPROM for...
211 225
212 For the format of config files read by our ftee-gen2232[ch] tools and what 226 For the format of config files read by our ftee-gen2232[ch] tools and what
213 settings can be tweaked, read the source code. 227 settings can be tweaked, read the source code.
214 228
229 Installation directory for EEPROM config files
230 ----------------------------------------------
231
232 If the name of the config file passed to ftee-gen* does not contain any '/'
233 characters, the named file is sought first in an installation directory
234 (/opt/freecalypso/ftdi) and then in the current directory. To suppress this
235 search path and read EEPROM config files only from the current directory,
236 specify your config file as ./name - filenames (pathnames) containing slashes
237 are read as-is.
238
239 This installation directory and search mechanism have been added in order to
240 allow standard (usually developed at FreeCalypso HQ) FTDI EEPROM configs which
241 end users can then program into their boards by executing a fixed command line
242 given in a manual.
243
244 FT232R differences
245 ==================
246
247 The EEPROM generator tool for FT232R is ftee-gen232r; it works on the same
248 principle as ftee-gen2232[ch] for FT2232x. However, when you run fteeprom-prog
249 to program FT232R's internal EEPROM (whether you are restoring a backup or
250 programming the output of ftee-gen232r), you need to add -r option before the
251 device selector string. This option tells fteeprom-prog to execute the
252 FT232R-specific magic sequence (documented in FT232R-notes) before proceeding
253 to actual EEPROM writes - without this option the EEPROM content will be garbage
254 (bitwise AND of old and new EEPROM images), producing the appearance of a
255 bricked chip.
256
257 In the previous libftdi-based version of fteeprom-prog the magic sequence in
258 question was executed unconditionally - however, because it is needed only for
259 FT232R and because we could simplify our new sans-libftdi code by implementing
260 it in an FT232R-only manner (no support for different "index" values for
261 multichannel FTDI devices), we've changed it from unconditional to -r option.
262
263 Experiments show that fteeprom-prog -r option appears to be harmless (though
264 unnecessary) on FT2232D and FT2232H - however, Mother's recommendation is to
265 use it only on FT232R devices.
266
215 Erasing the EEPROM (making it blank) 267 Erasing the EEPROM (making it blank)
216 ==================================== 268 ====================================
217 269
218 If you are playing with a "generic" FT2232x breakout board that is made for 270 If you are playing with a "generic" FT2232x breakout board that is made for
219 tinkering, as opposed to a more finished product, such boards are typically 271 tinkering, as opposed to a more finished product, such boards are typically
239 pipelines: 291 pipelines:
240 292
241 ftee-mkblank | fteeprom-prog <device-selector> -- blank a 93C46 EEPROM 293 ftee-mkblank | fteeprom-prog <device-selector> -- blank a 93C46 EEPROM
242 ftee-mkblank -b | fteeprom-prog <device-selector> -- blank a 93C56 EEPROM 294 ftee-mkblank -b | fteeprom-prog <device-selector> -- blank a 93C56 EEPROM
243 ftee-mkblank -B | fteeprom-prog <device-selector> -- blank a 93C66 EEPROM 295 ftee-mkblank -B | fteeprom-prog <device-selector> -- blank a 93C66 EEPROM
296
297 USB replug after EEPROM programming or erasure
298 ==============================================
299
300 Unlike fteeprom-read, our fteeprom-prog and fteeprom-erase utilities do command
301 the kernel's ftdi_sio driver to unbind. On single-channel devices the effect
302 is that the sole ttyUSB character device associated with the given USB device
303 disappears; on multichannel devices the effect is that ttyUSB corresponding to
304 Channel A disappears, while Channel B ttyUSB device remains. In order to bring
305 back the bumped-off ttyUSB device, and in order to make the FTDI chip itself
306 reread and apply the new EEPROM config, you have to physically unplug and replug
307 the USB device.
308
309 Why is physical plug/unplug manipulation needed, why can't we command the needed
310 effect via software? As it turns out, there are no *valid* reasons why it can't
311 be done - but we are not currently able to do so because Linux kernel USB
312 maintainers are being pricks and won't support functionality that doesn't fit
313 into their worldview. Given that Harald Welte discovered this problem back in
314 2017:
315
316 https://laforge.gnumonks.org/blog/20170524-usb-port-powercycle/
317 https://marc.info/?l=linux-usb&m=149557709602259&w=2
318
319 (the thread shows Harald's good-faith attempt to reason with those pricks and
320 their dismissive responses) and given my own (Mother Mychaela's) sour experience
321 with trying to get a simple patch into ftdi_sio (adding support for a quirk-
322 requiring FT2232x-based hardware device), the situation with Linux currently
323 looks hopeless.