FreeCalypso > hg > fc-small-hw
diff fc-uja/design-spec @ 0:0f9bdd60ce50
fc-small-hw separated from old freecalypso-schem repo
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 21 Oct 2019 00:53:38 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/fc-uja/design-spec Mon Oct 21 00:53:38 2019 +0000 @@ -0,0 +1,536 @@ +FreeCalypso UART+JTAG Adapter +Board design specification + +1. Purpose and scope + +The circuit board described in this specification will be an adapter for +connecting a host PC or laptop (via USB) to the following 3 development +interfaces on FreeCalypso GSM devices: + +* A 3-wire UART interface intended for RVTMUX on Calypso's IrDA UART +* Calypso JTAG +* Iota nTESTRESET + +The core function of interfacing from USB to a UART, JTAG and GPIO will be +performed by an FT2232D chip, but the board described herein has two key +differences from a generic FT2232x board, key differences which necessitate the +development of a custom board: + +* Our board will have 3-state buffers on the JTAG lines and an open drain + driver on the nTESTRESET line, wired in such a way that they cannot be + accidentally turned on while the FT2232D is in its power-up default UART + mode, prior to the software switch into the MPSSE+GPIO mode. + +* The target connection interface will be presented not only on general-purpose + headers, but also on a special FFC connector, to be used with our future + FreeCalypso handset boards that will use the FFC-based development interface + copied from Foxconn's Pirelli DP-L10 phone. + +The gadget to be built is intended to serve the following two purposes, in this +order of importance: + +Application 1: the present adapter will be required to do initial bring-up, +deep development and production-time programming and testing on our upcoming +FreeCalypso handset boards. Calypso's MODEM UART will be wired to the handset's +built-in USB-serial port also acting as the charging power source, but that +interface is intended for end users - deep development, initial bring-up and +production processes will need to be done through the IrDA UART wired to the +FFC interface through the present adapter. JTAG is not expected to be needed, +but is "thrown in for free" - however, the Iota nTESTRESET line will be very +useful for commanding system switch-on that can be distinguished from both the +end user power-on button and the charger plug event, as well as for easy +recovery from any hung state. + +Application 2: it costs us nothing extra to bring the target connection +interface out on generic headers in addition to the FFC connector. If anyone +needs to play with JTAG on our FCDEV3B or on a Motorola C1xx phone hacked up +with little wires, the present adapter will be more robust compared to +unbuffered COTS FT2232x breakout boards thanks to our 3-state buffers +protecting the JTAG lines from FT2232's initial UART mode garbage. + +However, the present FreeCalypso UART+JTAG adapter board is NOT intended to be +used as a generic JTAG adapter for non-Calypso targets. The set of additional +signals needed besides JTAG is quite different between the two: most traditional +(non-GSM) ARM processors and DSPs have TRST and/or SRST signals, and sometimes +also DBGRQ/DBGACK - whereas the Calypso+Iota chipset has no TRST, and the way +Iota's nTESTRESET signal works is quite different. Companies like Tin Can Tools +(Flyswatter2) already provide superb-quality and very cheap FT2232x-based JTAG +adapters for "generic" applications, and there is no point in trying to compete +with them - instead we need a Calypso-specific adapter that provides a UART, +nTESTRESET control and JTAG in this order of priority. + +2. Detailed design + +2.1. FT2232D core block + +The FTDI chip chosen for this adapter board is FT2232D. One of the FT2232x +devices is needed because we need MPSSE for JTAG plus a second channel for the +RVTMUX UART, leaving FT2232C/D/L and FT2232H as the two viable candidates. The +FT2232H high speed device does not offer anything useful for our application, +hence the more basic FT2232D has been chosen on the principle of "bez nadobnosti +nosimyj nabryushnik vreden" (a Russian proverb) - introducing USB high speed +capability (480 Mbps USB signaling) with FT2232H would increase the chances of +USB signal integrity problems due to suboptimal PCB layout or suboptimal USB +cable quality while providing absolutely no useful gain in our application, +whereas FT2232D is inherently safer in this regard by not having that USB high +speed capability in the first place. FT2232D is a direct drop-in for the +earlier FT2232C and FT2232L chips; FT2232D is a currently active part available +from Digi-Key whereas its predecessors are surplus-only parts. + +FT2232C/D devices only support MPSSE on Channel A, hence our FreeCalypso +UART+JTAG adapter will follow the general canon for such adapters in that JTAG +and test reset will be on Channel A, whereas Channel B will be used for the +RVTMUX UART. + +There will be a 93C46 EEPROM connected to the FT2232D chip. This EEPROM is +needed so that we can give our adapter a custom USB ID (out of the range of USB +IDs allocated by FTDI to Falconia Partners LLC); this custom USB ID is needed +for several reasons: + +* We don't want the ftdi_sio driver in the Linux kernel to create two ttyUSBx + devices for both FT2232D channels only to have the first of the pair disappear + when a custom libftdi-based program is run to make use of JTAG and/or reset + functions on Channel A - instead we would like to have this driver create + only one ttyUSBx device for the UART on Channel B. There already exist + several other UART+JTAG adapters whose creators and users had the same need, + and the ftdi_sio driver in Linux supports them. The existing adapters of + this kind are identified by custom USB IDs, and once our own adapter advances + past the vaporware phase, we'll be submitting a one-line patch to the Linux + kernel driver to add our custom USB ID to the list. + +* We will have a custom libftdi-based program for sending nTESTRESET to the + FreeCalypso GSM device target through our adapter; this program will have an + easier time locating our USB device among other potential FTDI-based devices + if we use a custom USB ID. + +* When the time comes to configure OpenOCD to do JTAG through our adapter, + having a custom USB ID will similarly help prevent erroneous binding to other + FTDI-based devices that may be present. + +2.2. Buffering logic for JTAG + +One significant design blemish of the otherwise quite versatile FT2232D is that +"bit" modes like MPSSE cannot be configured in the EEPROM, instead they can only +be entered dynamically on software command from the host. As the result, an +FT2232D channel that is meant to be used for, say, JTAG on a given board will +still operate in its default UART mode when USB power is first applied, and will +remain in this state indefinitely long, until the user runs a program on the +host that issues a software command to enter the "bit" mode - which may never +happen. If an FT2232D channel is wired for JTAG but the chip operates in its +default UART mode, the following problems will occur if the signals are wired +directly without additional buffering logic: + +* The ADBUS0 line which becomes TCK in JTAG mode is TxD in UART mode, and will + thus drive a high level on power-up - even though the quiescent state on TCK + should be low. + +* JTAG TDO line (output from the target) needs to be connected to ADBUS2 - this + signal becomes an input in MPSSE mode - but in the power-up default UART mode + ADBUS2 is an output. Thus this default output can end up fighting with the + target's TDO output, potentially damaging the target, the adapter or both. + +(The other two JTAG signals - TDI and TMS driven from ADBUS1 and ADBUS3 - are + less of a problem because in the power-up default UART mode these FT2232D pins + are inputs with weak internal pull-ups on them.) + +Our solution to this problem is to insert 3-state buffers (unidirectional in +the JTAG signal direction) into all 4 JTAG lines. We shall use 3-state buffers +with active-low enables, and the two enable lines (one for the TCK, TDI and TMS +outputs from the adapter, the other for the TDO input) will come from FT2232D +pins ADBUS5 and ADBUS6. In the MPSSE mode used for JTAG these pins become GPIOs +and will need to be configured as outputs driving low in order to enable JTAG, +but in the power-up default UART mode they are inputs with internal pull-ups, +and we will have additional external pull-ups for safety. The effects will be +as follows: + +* As long as the FT2232D channel is in UART mode, the 3-state buffers can never + be enabled. All JTAG outputs from the adapter will be tristated (i.e., the + same as if the adapter weren't there, presenting the target with its normal + sans-JTAG state), there will be no fighting on ADBUS2, and the UART will sense + all of its inputs as inactive high. + +* As the MPSSE mode is entered on software command, the initial pin direction + mask byte should be 0x01, keeping ADBUS0 as an output, but then an MPSSE GPIO + command should be given, enabling the other outputs along with sensible + initial values. + +* ADBUS6 should be driven low to enable the TDO receiving buffer (it will have + a weak pull-up on the buffer's input in order to not float when there is no + target connected) right after ADBUS2 is switched to being an input, but + ADBUS5 can be driven low or high at any time afterward to enable or disable + the JTAG outputs. + +2.3. Sideband signals alongside JTAG + +2.3.1. Iota nTESTRESET driver + +The test reset line in the Calypso+Iota solution (nTESTRESET) is handled by the +VRPC block in the Iota ABB which is essentially a PMIC. It is always pulled up +inside the GSM device to a non-logic power rail, and this circuit works even +when the mobile is in the switched-off state with all of the main voltage +regulators for regular logic turned off. The raw nTESTRESET line is not meant +to ever be driven by any kind of active push-pull logic driver; instead it is +meant to be shorted to GND to trigger the reset, through either a pushbutton +switch or an OC/OD driver. + +Back when TI made their x-Sample and Leonardo development boards, they +apparently preferred to drive their JTAG+reset test interface (14-pin header in +TI's JTAG pinout) with whatever generic (non-Calypso-specific) JTAG adapter +they already had at the time, and as their 14-pin JTAG interface was defined, +pin 2 (reset) was defined to be TRST with an active push-pull driver in the +JTAG host adapter (or "emulator" as they call it). These x-Sample and Leonardo +boards have a little on-board circuit between this connector pin 2 and the +actual nTESTRESET; this circuit consists of two transistors and has the effect +of protecting the internal nTESTRESET line from whatever the external driver +may be doing: if the external adapter drives a logic low, the transistor circuit +pulls nTESTRESET low via what is effectively an OC driver, otherwise the JTAG +block presents a Hi-Z state to the nTESTRESET line. This circuit has been +copied from Leonardo schematics on our own FCDEV3B, but the current plan is to +not include it on the handset board, instead bringing out nTESTRESET in its +native form on the FFC interface like the Pirelli DP-L10 board appears to do. + +Our FreeCalypso UART+JTAG adapter will drive this nTESTRESET pin with an open +drain driver. This driving arrangement is compatible with both approaches: +either direct nTESTRESET connection or the transistor circuit on FCDEV3B and on +TI's boards. It does, however, make our adapter specific to Calypso+Iota GSM +devices: more generic ARM processors and DSPs will often have more standard +TRST and/or SRST signals instead, possibly needing active push-pull drivers. + +To protect the reset line from FTDI's UART-default bogosity, the input to the +non-inverting open drain driver will come from ADBUS7, which is an input in the +FT2232D's power-up default UART mode. Like ADBUS5 and ADBUS6 controls for the +3-state buffers for JTAG, this ADBUS7 line will have an additional external +pull-up for safety, thus the reset can never be triggered accidentally while +the FT2232D channel is in UART mode - the only way to trigger the test reset +will be to first put the channel into the MPSSE+GPIO mode, then make ADBUS7 an +output driving low. + +2.3.2. Calypso nEMU0 and nEMU1 pins + +The Calypso chip has two JTAG-sideband pins called nEMU0 and nEMU1. They form +some kind of debug/development interface which is not needed in normal product +operation, and all Calypso-based GSM phone and modem product boards known to us +leave them unconnected - even those product boards on which the regular JTAG +pins are brought out (Pirelli DP-L10 and some Mot C1xx variants). TI's +Leonardo schematics leave them unconnected as well, but their more complete +x-Sample boards have them brought out to the 14-pin JTAG connector. Our +FCDEV3B has them brought out as well. + +The problem with these nEMU0 and nEMU1 pins is that they are undocumented: the +docs we have only say that they are bidirectional signals with pull-ups, and +nothing else. We have on-board pull-ups on these two lines on our FCDEV3B +(copied from TI's E-Sample board) strengthening the Calypso chip's supposed +internal pull-ups, but we don't know what will happen if either or both pins +are driven low externally (at boot or any other time), nor do we know if the +Calypso chip itself ever drives or pulses them low as outputs. Common sense +suggests that one of their likely functions is probably to hold the ARM7 core +in the debug halt state directly out of reset, and possibly disable the +watchdog timer which is otherwise enabled and ticking at this time - but we +don't know any of the details. + +Because we don't know exactly how these nEMU0 and nEMU1 pins work, the only +sense in which we can support them is to provide a way to use our FreeCalypso +UART+JTAG adapter as a reverse engineering tool, experimentally playing with +these nEMU[1:0] pins on an FCDEV3B. We are going to make the following simple +provision to facilitate such experimentation: we are going to connect FT2232D +pins ACBUS2 and ACBUS3 to pins 13 and 14 on the 14-pin JTAG header, which are +the pins for nEMU0 and nEMU1. Unlike all other signals, this one will be a +direct connection without any buffering. ACBUS2 and ACBUS3 function as open +drain LED drivers in the power-up default UART mode, and these pins have been +chosen on the reasoning that they are expected to stay non-driving as long as +no one actually opens Channel A as a UART and tries to send something through +it. The following important additional considerations apply: + +* These nEMU0 and nEMU1 signals are NOT included in the FFC interface defined + by Foxconn/Pirelli which we are copying for our FreeCalypso handset boards. + The positive implication is that the development interface for these FC + handset boards will not be adversely affected by the potentially dangerous + unbuffered connection to FT2232D pins; the negative implication is that if we + ever do learn how to use these nEMU[1:0] pins to do whatever they can do, + that ability won't be available on the handset boards. However, the latter + loss is deemed to be acceptable: the most plausible function of these + nEMU[1:0] pins is to enter JTAG debug state directly out of reset, and we + don't need this ability when we have the internal boot ROM enabled via nIBOOT: + we can interrupt and divert the boot process serially, and then enter the + debug state through the regular JTAG scan chain. + +* Anyone using the 14-pin JTAG header interface to connect to a target such as + FCDEV3B that does have nEMU0 and nEMU1 signals on pins 13 and 14 still has + the freedom to connect or not connect these signals as desired. With our + current FCDEV3B certain mechanical constraints practically impose the + requirement of making a custom cable in any case: the spacing between headers + on the FCDEV3B is too tight for standard ribbon cables terminated with IDC + connectors (there is no room for the bulky sides of those IDC connectors), + hence one needs to crimp female terminals onto individual wires and insert + them into a crimp housing instead. In light of these considerations, you + should only connect pins 13 and 14 between our adapter and your target if you + are specifically interested in experimenting with driving or sensing Calypso's + nEMU0 and nEMU1 signals, otherwise leave them unconnected. + +* Our entire "support" for these nEMU[1:0] pins will consist of two PCB traces + connecting FT2232D's ACBUS2 and ACBUS3 pins to two pins on the 14-pin JTAG + header. This arrangement, which could be considered quite risky under + different circumstances, does absolutely nothing and cannot cause any harm if + those two header pins are NOT subsequently connected to an actual Calypso + target. + +2.4. FT2232D I/O pin summary + +Channel A pins will be assigned and connected as follows: + +ADBUS0: JTAG TCK (fixed by FTDI) +ADBUS1: JTAG TDI (fixed by FTDI) +ADBUS2: JTAG TDO (fixed by FTDI) +ADBUS3: JTAG TMS (fixed by FTDI) +ADBUS4: unused and unconnected +ADBUS5: active-low output enable control for JTAG outputs +ADBUS6: active-low output enable control for TDO receiving buffer +ADBUS7: active-low nTESTRESET control + +ACBUS0: unused and unconnected +ACBUS1: unused and unconnected +ACBUS2: wired to JTAG header pin 13 (nEMU0) +ACBUS3: wired to JTAG header pin 14 (nEMU1) + +The 3 pins that are unused and unconnected (ADBUS4, ACBUS0 and ACBUS1) can be +configured as either inputs with internal pull-ups or outputs. For the +remaining pins which do have assigned functions, the following software init +sequence should be adhered to: + +* As the MPSSE mode is entered on software command, the initial pin direction + mask byte should be 0x01. The critical points are to set ADBUS0 as an output + at this point so it never glitches through a non-driving state (it is TxD in + the power-up default UART mode), make ADBUS2 an input as it will need to be + once TDO is enabled, and set ADBUS5-7 as inputs. ADBUS5-7 need to be inputs + at this stage (the connected logic will sense the inactive high level from + pull-up resistors) because the initial output value for initialized-as-output + pins is not defined. + +* MPSSE Set Data Bits High Byte (0x82) command should be given to set ACBUS2 + and ACBUS3 as inputs, leaving nEMU[0:1] pins undisturbed until and unless you + are playing with them. + +* MPSSE Set Data Bits Low Byte (0x80) command should be given to make ADBUS0 + (TCK) an output driving 0, make ADBUS1 (TDI) an output driving 1, keep ADBUS2 + as an input from the MPSSE mode entry step, make ADBUS3 (TMS) an output + driving 1, and make ADBUS6 (TDO receiving buffer control) an output driving 0. + ADBUS5 (JTAG output buffer control) and ADBUS7 (nTESTRESET driver) should be + configured as outputs at this point, but their driving values will depend on + the application. + +Channel B will be used as a data-leads-only UART with standard wiring requiring +no software intervention: + +BDBUS0: TxD (UART output) +BDBUS1: RxD (UART input) +the rest: unused and unconnected + +2.5. Logic voltage levels and buffering + +Many FT2232x-based JTAG adapters have level-translating buffers between FT2232x +pins and the target interface in order to support targets with different logic +voltage levels, usually from 3.3 V down to 1.8 V, or sometimes an even wider +allowed range: for example, the Flyswatter2 adapter from Tin Can Tools supports +target logic voltage levels from 1.6 to 5.0 V. + +In our case such voltage level shifting is not really needed: Calypso is 2.8 V +native, but perfectly tolerant of 3.3 V inputs as well. The following +approaches have been considered for our FreeCalypso UART+JTAG adapter: + +Approach 1: put a 3.3 V regulator on our board, run FT2232D I/O pins at 3.3 V, +run the 3-state buffers for JTAG at 3.3 V as well, and connect the UART lines +to FT2232D Channel B pins directly, without buffering. This approach relies on +Calypso's inputs being tolerant of 3.3 V and Calypso's 2.8 V outputs producing +voltage levels suitable for 3.3 V inputs. In practice this approach has already +been used quite extensively in other contexts: we connect Calypso I/O to 3.3 V +logic when we connect FCDEV3B UARTs to generic off-the-shelf FT2232x adapter +boards, users of headset jack serial adapters for Motorola and Openmoko phones +do likewise, Openmoko connected Calypso's 2.8 V UART to their 3.3 V application +processor, and Foxconn/Pirelli appear to have done likewise with their built-in +USB-serial interface based on a CP2102 chip with 3.3 V I/O. + +Approach 2: put both 3.3 V and 2.8 V regulators on our board, run FT2232D I/O +pins at 3.3 V (the lowest I/O voltage officially supported by FT2232x chips), +have the inputs from the Calypso target go directly to 3.3 V logic like with +Approach 1, but run the 3-state buffers for JTAG outputs plus an always-enabled +buffer for the UART output at 2.8 V. This approach makes the adapter's outputs +2.8 V proper, but at the cost of an extra on-board regulator. + +Approach 3: similar to Approach 2, but omit the on-board 2.8 V regulator and +instead power the 2.8 V output buffers from the target voltage reference pin +provided both on TI's 14-pin JTAG interface (used on development boards, both +TI's and our own FCDEV3B) and on the FFC interface we are copying from +Foxconn/Pirelli. Compared to Approach 2, this approach eliminates the extra +on-board regulator, but would cause some power to be drawn from the target to +power the output buffers. This approach would also create difficulties if a +user wishes to use the generic header interface (as opposed to the highly +specialized FFC interface), and there is no source from which the target +reference voltage pin can be supplied. A compromise approach could be +implemented by putting a 3-pin jumper header on our board, selecting the power +to the output buffers between internal 3.3 V and the external target voltage +reference pin, but having that jumper set to the internal 3.3 V supply would +effectively bring us back to Approach 1. + +Approach 4: do what the "big guys" do in terms of voltage level translation: +use special dual-supply translating buffers in both directions, supporting any +target voltage level at least between 1.8 and 3.3 V or possibly wider. This +approach would be appropriate for a more general-purpose JTAG adapter that needs +to work with, say, 1.8 V targets, but given that our adapter is specific to the +Calypso which has 2.8V-native, 3.3V-tolerant I/O, the extra complexity of +full-blown voltage level translation is not really justifiable. + +Approaches 3 and 4 are excessively complex and cumbersome, and cannot be +justified in our Calypso-specific application. The practical choice is thus +between approaches 1 and 2. My (Mother Mychaela's) initial leaning was toward +Approach 1, but upon further reflection I swayed over to Approach 2. The cost +of the additional on-board 2.8 V regulator in terms of PCB real estate and +layout complexity is not too great, and given that our adapter is very +specifically for the Calypso and no other targets, it makes more sense to put +out Calypso's native voltage levels, rather than merely compatible ones. + +Approach 2 will be used on our FreeCalypso UART+JTAG adapter, with the following +additional nuances: + +* A 74LVC125A output buffer (4 individual buffers in one package) powered from + the 2.8 V regulator will be used for the 4 logic outputs from our adapter: + JTAG outputs TCK, TDI and TMS, and the single UART output. The output enables + for the JTAG outputs will come from ADBUS5, whereas the UART output will be + always enabled. + +* Another similar buffer, but powered from the 3.3 V regulator will be used for + the two logic signals going the other way: JTAG TDO and the UART input. The + buffer for TDO will be enabled by ADBUS6, the UART input will be always + enabled. There will be a pull-up resistor to local 2.8 V on the input + (target interface) side of each buffer. The buffer for TDO is needed for + 3-state control, but an identical buffer will also be used for the UART input + for the sake of symmetry, and to present the target with a pull-up to 2.8 V + rather than FT2232D's internal pull-up to 3.3 V. + +* All pull-ups on the interface between FT2232D pins and the just-described + buffers will be to 3.3 V. + +* A dedicated 3.3 V regulator will be used, instead of trying to use the feeble + one built into the FT2232D, as the datasheet-stated limit of 5 mA seems like + too little margin. + +* The only interface on which the target would ever see 3.3 V rather than 2.8 V + will be the purely experimental provision for Calypso nEMU[1:0] described in + section 2.3.2, to be used only by those who are specifically interested in + that line of experimentation, and not in any other use cases. It makes no + sense to attempt voltage level-translating buffering for these signals when + we don't even know if they are really inputs or outputs, and under what + conditions. + +The target voltage reference pins on the TI-style 14-pin JTAG header connector +and on the Foxconn/Pirelli-style FFC connector will remain unused and +unconnected. One could make an argument that not using the target-provided I/O +voltage reference is wrong, but the issue needs to be seen in context. TI's +14-pin JTAG interface was designed for use in a wide range of applications, +covering I/O voltages at least between 1.8 and 3.3 V, and TI's XDS JTAG adapters +support this wide range of I/O voltages just like the ones made by community +vendors like Amontec and Tin Can Tools. In the case of Foxconn and their +Pirelli DP-L10 design, we can never know for certain, but it is highly plausible +that they weren't making a custom FT2232x-based JTAG adapter of their own like +we are doing, and instead had a passive adapter that connected their FFC +interface to some existing TI XDS JTAG adapter, likely via that very same 14-pin +interface. In that case the existing TI XDS JTAG adapter they were using needed +a target voltage reference pin, and so they included one in their custom FFC +interface. But our circumstances are different: we are making a custom +UART+JTAG adapter for reasons of our own, and because our custom adapter is +very specific to the Calypso, having our own on-board 2.8 V regulator is more +robust than depending on an I/O buffer supply from the target. + +2.6. Target connection interfaces + +2.6.1. Generic header interface + +Our FreeCalypso UART+JTAG adapter will feature two header connectors: a 14-pin +header in TI's pinout for JTAG, nEMU[1:0] and nTESTRESET, and a separate 3-pin +header for the UART. This header interface option will make it possible to use +our adapter with the FCDEV3B, with TI's D-Sample board (JTAG+company 14-pin +interface only) and even with hacked-up C1xx phones with little wires soldered +to JTAG test pads. As explained in section 2.3.2, always give explicit thought +as to whether pins 13 and 14 (nEMU0 and nEMU1) should be connected or not in +your application. + +The UART on FT2232D Channel B will be completely independent of JTAG and other +Channel A functions, and can be used as a completely generic data-leads-only +asynchronous serial interface at 2.8 V. + +2.6.2. FFC interface + +Our upcoming FreeCalypso handset boards will need to use an FFC interface for +development functions. At the very minimum this interface needs to connect the +Calypso's IrDA UART carrying RVTMUX, and do it in such a way that this serial +interface can be connected without applying a "charger present" condition to +the VRPC block in the Iota ABB - hence the need for an interface outside of the +handset's built-in USB-serial port. Furthermore, if we copy the FFC interface +from Foxconn's Pirelli DP-L10 design instead of inventing our own, we get not +only a UART channel, but also JTAG and nTESTRESET on the same interface. There +is very little need for JTAG in FreeCalypso, but it is certainly a nice-to-have. +Having the ability to drive nTESTRESET from the development host will also come +very useful: once we implement proper handset on/off logic in the firmware, +meaning that different switch-on causes will be treated like they should be in +a real handset, switch-on from nTESTRESET will become the development and +production boot mode. + +Our FFC interface is effectively defined by the unpopulated FFC connector +footprint and its wiring found in Pirelli DP-L10 phones. It is a 12-pin FFC +interface with 0.5 mm pitch, the unpopulated connector footprint on Pirelli's +PCB has pin numbers marked on the silk screen, and the pins are assigned as +follows: + +Pin Function +---------------- +1 V-IO rail +2 UART Rx (input to the target) +3 Iota nTESTRESET +4 JTAG TDI +5 JTAG TMS +6 JTAG TCK +7 UART Tx (output from the target) +8 JTAG TDO +9 unused +10 GND +11 unused +12 unused + +At one time we had a plan to add Calypso nEMU[1:0] signals to this interface by +putting them on the last two unused pins, but this addition has been rejected +for the time being: because we have no documentation for what these nEMU[1:0] +pins do and all we can do with them are reverse engineering experiments, these +signals should be kept out of handset products and limited to development boards +like FCDEV3B for the time being. + +There is, however, one critical aspect of this FFC interface which cannot be +recovered from the Pirelli DP-L10 artifacts and instead has to be defined anew: +the question of top vs. bottom orientation. Our decision process in this regard +begins with the availability of FFC jumpers, i.e., the flat flexible piece that +goes between the two boards. The FFC jumper version with same-side contacts is +readily available from Digi-Key as very inexpensive single pieces, but the +version with opposite-side contacts is only available with a prohibitely +expensive MOQ. Having settled on the FFC jumper with same-side contacts, we +are left with two options: have the contacts on both sides face upward, or have +them face downward. The decision between the two is completely arbitrary and +we have no way of knowing which way Foxconn had it back in their day, but we +have to decide one way or the other starting with the design of this adapter +board. The Mother's arbitrary decision is to have the contacts on both sides +of the FFC jumper face upward, meaning that: + +* The FFC connector on the FreeCalypso UART+JTAG Adapter board will need to be + the top-side contacts version. + +* If we are going to populate an FFC connector on a decased Pirelli motherboard + in order to exercise our adapter against that pre-existing target, the top- + side contacts version will need to be used. We'll need to do the same if we + make our own handset board on which the FFC connector is on the side with the + display and the main keypad buttons. + +* If we make our own handset board on which the FFC connector is on the bottom + side of the motherboard (the side opposite the display), which is the current + plan, the connector will need to be the bottom-side contacts version. + +Because pin 1 is on the left on the existing target board with the connector on +the top side (Pirelli DP-L10) and we are using the same-side jumper version that +flips the left/right orientation, pin 1 will need to be on the right in the +connector footprint definition on the adapter board.