diff doc/DUART28-boot-control @ 737:6d97866bad79

first round of documentation for DUART28C boot control addition
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 16 Sep 2020 06:10:39 +0000
parents
children 26daa2720bda
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/DUART28-boot-control	Wed Sep 16 06:10:39 2020 +0000
@@ -0,0 +1,116 @@
+FreeCalypso DUART28 adapter is a new piece of hardware that became available in
+2020-09.  In principal terms it is a drop-in replacement for the PLDkit FT2232D
+adapter we've been using previously, but made specifically for working with
+Calypso targets, rather than generic.  However, in addition to providing this
+drop-in replacement for our previous solution, our DUART28 also provides one
+new optional feature: target boot control.
+
+The target boot control feature of FreeCalypso DUART28 consists of CTL1 and CTL2
+open drain outputs driven by FT2232D Channel B RTS and DTR, respectively, and
+this feature is optional in that you don't have to connect these signals: if you
+leave them unconnected, they won't do anything, and you can completely ignore
+the existence of this additional feature.  However, if you find this new feature
+useful, you can make the necessary wire connections, apply the necessary patch
+to your Linux kernel ftdi_sio driver and reprogram the EEPROM to the DUART28C
+configuration - and then you will gain the ability to control your Calypso
+board's PWON and RESET from your host computer.
+
+Hardware connections
+====================
+
+The official FreeCalypso convention is that DUART28 CTL1 output should be
+connected to PWON on the Calypso board, and CTL2 should be connected to RESET.
+However, these wire connections can be made ONLY if you are going to also apply
+the necessary patch to your Linux kernel ftdi_sio driver and reprogram the
+EEPROM to the DUART28C configuration - if you connect CTL1 and CTL2 to Calypso
+PWON and RESET without doing the other necessary steps, your setup won't work
+at all: the Calypso+Iota chipset will be held down in test reset and thus
+inoperable whenever you open Channel B ttyUSB device for regular serial
+communication.
+
+Linux kernel driver patch
+=========================
+
+FreeCalypso DUART28 adapter is based on the FT2232D chip from FTDI, and all
+FTDI-based USB-serial adapters are supported by the ftdi_sio kernel driver
+under Linux.  This driver contains a table of all supported USB IDs, and this
+table needs to be extended (meaning that the driver needs to be patched)
+whenever a new (previously unknown) USB ID needs to be supported.  The internal
+architecture of this driver and its USB ID table also allows various quirks to
+be associated with specific USB IDs, meaning that the standard behaviour of the
+driver can be modified in special ways for specific ID-distinguishable USB
+devices.
+
+The way in which we have creatively repurposed otherwise unused Channel B RTS
+and DTR outputs into PWON and RESET controls is not compatible with the standard
+unpatched ftdi_sio driver, or rather with the standard unpatched Linux tty
+serial port subsystem in general: the standard Linux tty behaviour (apparently
+stipulated by POSIX) is that whenever any given ttyUSB device is opened, its
+DTR and RTS outputs are immediately asserted, and userspace is not given any
+opportunity to intervene prior to this automatic assertion of DTR & RTS.  On our
+non-standard hardware this standard Linux behaviour would cause an unstoppable
+superdeep reset to be triggered whenever the second serial channel is opened for
+regular communication, which is clearly not acceptable.
+
+Our solution to this problem consists of a custom USB ID that makes the standard
+unpatched ftdi_sio driver not recognize our DUART28C adapter (DUART28 hardware
+with DUART28C EEPROM config) at all, and a custom patch to the ftdi_sio driver
+that teaches it to recognize our custom USB ID *and* apply a special quirk for
+it.  The quirk suppresses automatic assertion of DTR & RTS on ttyUSB device
+open, thereby giving userspace applications full control of these UART outputs
+via TIOCMBIS and TIOCMBIC ioctls.
+
+The patch has been submitted to the ftdi_sio maintainer for inclusion in
+mainline Linux, but we should not set our hopes too high: while the patch should
+be non-controversial given that it adds support for an entirely new USB ID (one
+that was officially allocated to Falconia Partners LLC by FTDI, mind you) and
+does not disrupt anything pre-existing in any way whatsoever, getting ANY kind
+of patch accepted into mainline is generally tantamount to the Seven Circles of
+Hell.  And even if we do get our patch accepted into bleeding-edge mainline
+Linux, it does not help Slackware users running older kernels without updates -
+thus serious FreeCalypso users should be prepared to apply our ftdi_sio driver
+patch locally on their own systems.
+
+The official Slackware-applicable version of the needed ftdi_sio driver patch
+can be found in our freecalypso-hwlab Hg repository.
+
+EEPROM configuration
+====================
+
+In order to make our DUART28 adapter an acceptable replacement for generic "raw"
+FT2232x adapters (or CP2105-based Sysmocom mv-uart) which are supported out of
+the box by standard unpatched ftdi_sio and cp210x drivers, we ship our DUART28
+boards with DUART28S configuration in the EEPROM, rather than DUART28C.  The S
+configuration sets the USB ID to FT2232x default of 0x0403:0x6010, which the
+standard unpatched ftdi_sio driver recognizes as a completely vanilla USB to
+dual UART adapter - but CTL outputs must be left unconnected in this
+configuration, as they cannot function correctly with this unpatched driver.
+
+If you have applied our DUART28C support patch to your ftdi_sio driver, then
+you can reprogram the EEPROM on your board into the C configuration and start
+using CTL outputs.  The necessary EEPROM config files and tools can be found in
+our freecalypso-hwlab Hg repository.
+
+Support in FC host tools
+========================
+
+If you have gone through all of the above, you get the following Calypso target
+boot control capabilities with FC host tools:
+
+* If you run any of our loadtools programs (fc-loadtool, fc-iram, fc-xram etc)
+  or rvinterf on the ttyUSB device corresponding to DUART28 Channel B, which
+  will normally be connected to Calypso IrDA UART, adding a -Prts option will
+  make the tool pulse RTS, triggering PWON, or adding a -Pdtr option will make
+  the tool pulse DTR, triggering RESET.
+
+* Standalone fc-pulse-dtr and fc-pulse-rts utilities are also provided, doing
+  the obvious.
+
+Note the -P option: prior to this DUART28C support addition, the string argument
+to the -P option (boot control name) was an arbitrary user-defined short name
+to be looked up in /opt/freecalypso/bootctrl.conf, a user-created configuration
+file directing our tools to run a user-provided external boot control command.
+The new logic is that -Pdtr and -Prts are special reserved names for the
+built-in DUART28C boot control function, whereas any other name will be looked
+up in the configuration file and the associated user-provided external command
+will be executed.