view FC-handset-spec @ 57:020e6428c248

FC-handset-spec: firmware approach to vibrating alert documented
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 13 Jun 2021 02:22:25 +0000
parents a39269dddca4
children e6a1d1699ebb
line wrap: on
line source

FreeCalypso Handset Specification
=================================

The purpose of this document is two-fold:

1) This document serves as the principal design specification for the
   FreeCalypso Libre Dumbphone handset hardware which I, Mother Mychaela,
   seek to build.

2) This document also defines the scope of functionality to be supported in
   FreeCalypso handset firmware, including support for additional hardware
   targets beyond the primary FC handset hw target.

1. FC handset hardware specification

1.1. Basic features

The Mother's goal is to produce a replacement for the proprietary Pirelli DP-L10
phone, or more specifically, for the GSM-only subset of this Pirelli phone which
the Mother actually uses, *without* Pirelli's key differentiating feature of
non-GSM WiFi operation, and without Pirelli's camera.  The following hardware
features are to be included:

* 176x220 pixel color display (no touch)
* 21-button main keypad
* 3 side buttons for volume control and an auxiliary function
* hands-free loudspeaker
* vibrator
* USB port that combines charging and computer interface
* wired analog headset jack
* single SIM slot

The following features which are commonly found in mainstream proprietary
phones, particularly more recent ones, will NOT be included:

* camera
* Bluetooth
* FM radio
* TV receiver
* GPS receiver
* dual SIM slot
* torch light beyond LCD and keypad backlights

1.2. RF band capability

Our FC handset needs to be quadband GSM; this quadband capability will be
achieved by copying the RF section and the core PCB layout around it from the
reverse-engineered iWOW TR-800 modem module, which is itself a very direct
(almost verbatim) derivative of TI's Leonardo+ quadband reference design.

1.3. RAM and flash

The Mother's intent is to use Spansion S71PL064JA0 flash+RAM MCP on the final
handset motherboard, providing 8 MiB of flash and 2 MiB of XRAM in a 7x9 mm
footprint.  This flash and RAM capacity is already known to be fully sufficient
for our FreeCalypso handset firmware in maximal feature configuration, hence
any larger capacity would be excessive.  However, on our FC Venus development
board we may use the larger S71PL129NC0 MCP, same as used on FCDEV3B V2.

1.4. Liquid crystal display

1.4.1. Display size

The size of the display for our FC Libre Dumbphone handset design is fixed at
176x220 pixels, 16-bit color, following TI's D-Sample platform and the starting
point UI code that was developed for it.  Thoughts of changing to a different
display size have been considered and rejected:

* If we were to change to a smaller display size, we would have to do extra work
  on the firmware to shrink the UI to the smaller size, and we would reduce the
  amount of information that can be displayed at once.  We would incur extra
  work and a functional loss, but gain absolutely nothing in return.

* If we were to change to a larger display size (240x320 pixels seems to be the
  largest reasonable size for dumbphones, used in high-end Nokia models), we
  would be venturing into uncertain territory - the greatest uncertainty would
  be the extra CPU load on Calypso to draw the larger UI and to refresh the
  larger framebuffer, which is done with PIO on Calypso, without any DMA
  assistance.  The D-Sample LCD size of 176x220 pixels already appears to be a
  strain in some drawing code paths, hence the Mother's decision is to play it
  safe and stick with the known working display size.  Expanding the UI to make
  sensible use of larger screen real estate would also entail additional work.

176x220 is the display size in pixels, and this resolution number by itself says
nothing about the physical display size in inches or mm.  However, most readily
available LCDs that are made for this pixel resolution are made in 2.0" diagonal
physical size, with 31.68x39.60 mm active area and 0.180 mm dot pitch, hence
this physical size is the one we are going to use.

1.4.2. Specific LCD module selection

As of this writing, the specific LCD module to be used has not been firmly
selected yet.  We are actively looking for an LCD module that fits all of the
following requirements:

* TFT color LCD, 2.0" diagonal, 176x220 pixel resolution;

* 16-bit microprocessor bus interface;

* 6:00 viewing direction as appropriate for cellular handsets;

* backlight consisting of 3 white LEDs in parallel, joined at the anode,
  with separately brought-out cathodes;

* mechanical design that supports mounting with the FPC tail folded under the
  module, either by way of direct solder termination (no connector) or by way
  of raised sides that create sufficient vertical space to accommodate the FPC
  connector.

The requirement of 16-bit microprocessor bus interface stems from the desire to
interface this LCD to the Calypso in exactly the same way how TI did it on the
D-Sample, the 6:00 viewing direction and mechanical mounting requirements stem
naturally from the target application (cellular phone handset), and the
backlight LED wiring requirement stems from the constraints of our chosen
MAX1916 backlight LED driver chip - see section 1.4.4.

1.4.3. Backlight and readability considerations

Out of the various pre-existing mobile phones which I (Mychaela) have
experienced, there have been 3 different kinds of LCDs in terms of how display
operation and readability interacts with the backlight:

1) older phones with black&white LCDs: on all phones of this type which I've
   ever used, the display is perfectly readable without the backlight given
   ordinary ambient lighting, be it natural daylight or room lighting.  Such
   LCDs are called transflective: primarily reflective, but can also operate in
   transmissive mode when the optional backlight is turned on.  With these B&W
   displays, you only need to turn on the backlight if you need to operate the
   phone in darkness, such as outdoors at night or inside with all lights off.
   The firmware in such phones is typically designed to leave the actual display
   functional and updated at all times, with only the backlight subject to
   on/off control.

2) most newer phones with color displays, of which Pirelli DP-L10 is a
   representative case, have transmissive LCDs that are not designed to be
   readable without the backlight at all - backlight required for readability
   (BLRR) is another way to describe such LCDs.  Because the display is not
   readable at all without the backlight, phone firmware is typically designed
   to turn off the entire display (not just the backlight) when the screen goes
   dark, and operation visible to the user is display on/off, rather than
   backlight on/off.  It is a good firmware design practice to "swallow" the
   initial keypress that turns on the display from dark state, i.e., to block
   the regular action of whatever button was pressed to "wake up" the display.

3) The color display on Motorola C139 phones is an odd intermediate case: this
   display is NOT practically readable with the backlight off, yet the firmware
   is designed as if the display were readable in this condition: the actual
   display (unsure if it is CSTN or TFT) remains on and updated, and when you
   press some button to "wake up" the display, that button still takes its
   regular action, which is really bad for usability.  How do we know that the
   actual CSTN or TFT display remains on and actively updated when it is not
   readable with the backlight off?  Answer: the non-backlit display can be made
   readable by shining a flashlight directly at it - but this trick requires a
   directly pointed flashlight; no amount of ordinary ambient light is enough
   to make the display readable.

Because our FC Libre Dumbphone handset will have a color display (contemporary
TFT) and because we are sane, not copying the monumental design mistake of Mot
C139, our display will fall into class 2 by the above classification: backlight
required for readability, full display on/off rather than just backlight on/off,
firmware operating like Pirelli's in terms of wake-up keypress swallowing.

1.4.3.1. Backlight dimming mode

Because our LCD is of BLRR type and because we seek to fully replicate Pirelli's
logic in terms of when keypresses are swallowed and when they are not, we need
to implement a dimming mode for our LCD backlight.  In Pirelli's design which we
are copying, when you are playing with phone menus or composing SMS etc, but are
not in an active call, the display switches between full brightness and totally
off - it goes fully off on timeout, and when you press a button to wake it up,
it switches on at full brightness, together with the keypad backlight.  But when
you are in a call, when the timer expires (and it's a shorter timer, 10 s
instead of 30 s), the display goes dim instead of fully off, and in this dimmed
(but still readable) state keypresses are NOT swallowed.

We only need to implement two different intensity levels for the LCD backlight:
full brightness and in-call dimmed.  The backlight intensity level in the dimmed
state will need to be chosen on this principle: use the lowest backlight LED
current (to conserve battery power and allow longest talk time on one charge) at
which the display is still readable, similarly to Pirelli's in-call dimmed
state.

In the user-actively-poking state, as opposed to the long-call dimmed state,
there is no need to provide different configurable backlight levels - see
section 1.4.5.

1.4.4. Backlight circuit implementation

In all candidate TFT LCD modules that are being considered (see section 1.4.2),
the backlight consists of 3 white LEDs wired in parallel, joined either at the
anode or at the cathode - although as we shall see momentarily, we require an
LCD module where the 3 LEDs are joined at the anode, with the 3 cathodes brought
out separately.  LCD module datasheets call for 15 mA current through each LED
at maximum intensity, for 45 mA total, and the LED forward drop voltage (Vf) at
this rated current seems to range between 2.9 V (what I actually measured on one
candidate LCD module) to 3.2 V (what the datasheets list as typical) to perhaps
as high as 3.4 V (what one datasheet lists as the maximum).

Given the parallel (as opposed to series) wiring of the 3 LEDs and the
relatively low Vf, there is no need to use any kind of boost converter as part
of the LED driver circuit for this backlight - any boost converter will only add
inefficiency (more current will be drawn from the battery for the same LED
current), hence we need to avoid using such.

Regardless of whether a given phone design uses a boost converter or not (it
seems that older designs do use boost converters, either because older white
LEDs have higher Vf or because 2 or 3 LEDs are wired in series), all traditional
phone designs seem to share the quality where the display backlight brightness
remains the same as the battery discharges and as Vbat goes down - this quality
was directly observed on the Pirelli DP-L10 (unknown circuit design) and
inferred from the available schematics for Mot C139 and C155, with both of the
latter boost-converting to fixed 5.0 V.  In our case, even though we choose to
not use a boost converter for efficiency reasons, we still need to achieve the
quality of the display brightness remaining the same through the discharge range
of our Li-ion battery - having the display dim in half as the battery discharges
from 4.2 V peak to 3.6-3.7 V plateau is simply not acceptable.

The simplest possible LED driving circuit would be one where a current limiting
resistor is inserted in series with each LED, and then the 3 parallel
LED+resistor sets are connected across battery terminals, with a transistor
inserted somewhere to act as the on/off switch.  However, this trivial circuit
is not suitable in our application because it would produce unacceptably large
variation in display brightness as the battery discharges - hence we need a more
intelligent LED driving circuit.  Our Luna LCD carrier board from the spring of
2020 features an LDO bringing Vbat down to fixed 3.5 V, followed by very low-
value resistors in series with each LED - but this approach is not good for
production either, as it makes the LED current extremely sensitive to any slight
variations in Vf.

Fortunately, I was able to find a specialized white LED driver chip that is just
perfect for our application, or more precisely, a specialized chip that acts as
a constant current sink for such LEDs - Maxim MAX1916, design from 2001, just
the right time frame for the kind of phone we are seeking to build.  This
special chip takes the place of "dumb" ballast resistors: connect Vbat (battery
positive terminal) directly to the common anode of the 3 LEDs, but instead of
series resistors, connect each cathode to the corresponding LEDn pin of MAX1916
- *without* any resistors or transistors!  FETs inside the MAX1916 take the
place of resistors as current-limiting elements, and the chip's global on/off
control (which will be driven with a Calypso GPIO) takes the place of a separate
switching transistor.

The special quality of MAX1916 is that it produces constant current through each
LED (based on a set reference current and 230x current multiplication circuit
inside the chip) regardless of variations in both Vbat and Vf!  Of course the
requested current can only be sustained as long as Vbat >= Vf + Vds, where Vds
is the lowest drop voltage of the FETs inside MAX1916, and once Vbat falls below
this point, the LED current will begin to decline.  However, the beauty of this
design is that no arbitrary artificial turnover points (like the 3.5 V point in
our hacky design from the spring of 2020) need to be set: the battery discharge
point at which the LED current begins to decline will be whatever it comes to be
naturally, based on Vf (perhaps depending on temperature) and MAX1916 Vds, and
the decline is expected to be gradual.

1.4.4.1. Backlight current selection and dimming

In the simplest MAX1916-based design, a fixed LED current is set by connecting
a resistor of appropriately computed value between MAX1916 SET pin and whatever
regulated fixed voltage rail happens to be available in the system.  However,
in our application (see section 1.4.3.1) we need at least two different display
brightness levels, and thus at least two switchable LED currents.  At first the
problem seems difficult, but an elegant solution has been found.

LCD backlight LED current will be selected by way of two Calypso GPIO pins
configured as outputs, and a 74LVC2G125 dual tristate buffer.  Each tristate
buffer's A input will be tied high, and the two Calypso GPIO outputs will be
connected to buffer output enable inputs.  There will be two resistors with
different carefully computed values, each connected between one of the two
tristate buffer outputs and MAX1916 SET pin.  One resistor will provide a small
current, the other will provide a large current, and each of these two currents
will be switchable on/off by Calypso GPIO signals switching the buffer outputs
between driving high (2.7-2.8 V) and Hi-Z.  Resistor values will be chosen such
that the sum of both currents will be the 15 mA limit (the current is reckoned
per LED), whereas the small current alone will be whatever we need for the
battery-saving long-call dimmed mode.

1.4.5. Slight regression relative to Pirelli DP-L10

The actual LCD backlight LED driving circuit inside the Pirelli phone is not
known, but reverse engineering of Pirelli's firmware followed by experimentation
reveals that backlight intensity variation is achieved via a form of PWM, using
Calypso PWL output - although PWL is used in an inverted sense, such that the
backlight intensity increases with more 0s being put out on PWL, as opposed to
more 1s.  Thus regardless of the unknown actual circuit implementation, the
backlight intensity appears to be continuously variable from 1/255 to 255/255,
which is certainly a much richer control than our crude selection of just 3
possible LED currents.

In terms of what Pirelli's fw offers to end users, the backlight intensity in
the dimmed in-call state is always set to 1/255, without any way to change it,
whereas the backlight intensity in the active interaction state is selectable
via a menu among 5 levels; the 5 offered levels turn into 1/255, 64/255,
128/255, 192/255 and 255/255 in the resulting PWL programming.

So in terms of both hardware capabilities and end user offering via the
firmware, Pirelli's LCD backlight level control is richer than what we are
proposing for our FC Libre Dumbphone.  However, engineering is all about
trade-offs and compromises, and in the Mother's opinion, this slight reduction
in the richness of functionality is sufficiently offset by the efficiency of
our MAX1916-based approach: aside from the theoretical possibility of a
switching buck converter, which I've never seen used for LED driving
applications, our choice of MAX1916 is the most battery-efficient way to drive
our backlight LEDs.  Furthermore, when dimming is effected by switching the
actual regulated LED current, as in our case, as opposed to applying PWM, our
backlight becomes more resilient to even lower battery voltages.

Consider what happens when Vbat falls below the point at which the design-
intended LED current can be maintained - what happens then?  If no PWM is
applied, or if PWM is set to maximum, then display brightness will be whatever
maximum is possible at this low battery voltage.  But if PWM is applied,
especially very low duty cycles as in the case of Pirelli's dimmed state, then
the display that has already been dimmed by low Vbat will be *further* dimmed
by this aggressive PWM, likely producing an unreadable display at this point.
It may be possible to compensate via extra complexity in the firmware, by
turning PWM up when Vbat (as measured via Iota MADC) falls too low - but then
we would be getting really messy, whereas switching the regulated current is so
much more elegant.  With our approach, low-battery-induced dimming in the "full
brightness" mode will happen at the same discharge point as it would if we had
used PWM (and set PWM to maximum in this "full brightness" mode), but in the
in-call dimmed state, further dimming due to low Vbat will probably happen at a
lower discharge point (if Vf decreases with decreasing current), and when it
does happen, there won't be a combination of both natural and artificially-
induced reductions, just the natural one.

Thus based on all of the above considerations, I feel justified in my design
choice of foregoing PWM control of backlight intensity in favor of fixed current
switching with much more limited selection.

1.5. Main keypad

The main keypad on our FC Libre Dumbphone handset will have the following
21-button arrangement:

left soft key	 ^	right soft key
		<O>
green call	 V	red power/hang-up
button			button

1		2	3
4		5	6
7		8	9
*		0	#

The top section above the traditional numeric dial buttons (12) consists of left
and right soft keys, green and red buttons (classically called SEND/END), and a
5-way navigation button group (left, right, up, down and center), for a total of
9 buttons in this section.  The red hang-up button is also the hardware power-on
button; having the same button effect power-off when held down for some time is
a firmware function.

This 21-button main keypad arrangement is exactly the same as featured on
Motorola C1xx and Pirelli DP-L10 phones, on TI's D-Sample development platform,
and also on many other phones (non-Calypso) from the appropriate era, such as
Samsung E2232.

1.5.1. Keypad backlight

All traditional phones including Mot C1xx and Pirelli DP-L10 feature keypad
backlights, hence we need to include one as well.  The exact structure of this
backlight won't be known until we enter the mechanical design phase for the
actual handset (as opposed to intermediate development boards), which will be
much later in the project, but the Mother's understanding is that keypad
backlights are made up of some number of LEDs (2 on Pirelli DP-L10, unknown
number on Mot C139) and some kind of light diffuser.

Given the discovery of MAX1916 constant-current-sink LED driver chip (see
section 1.4.4), the optimal electrical design of the keypad backlight becomes
clear: use 3 LEDs, and drive them using another MAX1916 chip, separate from the
one used for the LCD backlight.

Backlight intensity: neither Mot C139 nor Pirelli DP-L10 provides any way to
vary keypad backlight intensity, and no such variability is deemed necessary.
In the long-call state when the LCD backlight is dimmed, the keypad backlight
is fully off.  We shall use a fixed LED current setting for our keypad
backlight, set with a single fixed resistor between the keypad MAX1916 chip's
SET pin and the V-IO rail, and the actual current value will be determined in a
much later phase of the project, when we have the actual keypad backlight LEDs
and a better idea of the mechanical design.

Backlight color: Mot C139 uses blue LEDs, Pirelli DP-L10 uses white LEDs.
Because blue and white LEDs have very similar electrical characteristics
(current needed for appropriate brightness, Vf at this current), the choice
between the two can be made in a much later project phase, based on input from
other team members who are better at aesthetics.

1.5.1.1. Comparison with Mot C139 and Pirelli DP-L10

Both of these two pre-existing reference phones feature keypad backlights that
are switched on/off via Iota LEDB; the actual circuit design is unknown.
However, in our design we forego Iota LEDB altogether (it won't be used for
anything), and use two MAX1916 chips for our LCD and keypad backlights, with
each chip's on/off control being a Calypso GPIO.

The actual workings of the LEDB driver or switch inside the Iota chip are a
mystery.  On the one hand it appears to be nothing more than a "dumb" transistor
on/off switch, no different from an external "digital transistor" (BJT with bias
resistors) controlled by a Calypso GPIO: a resistor still seems to be required
for current control, and at least on the Pirelli DP-L10 the keypad backlight
intensity visibly varies with Vbat ranging over the Li-ion discharge range.  But
on the other hand, LEDB requires the 13 MHz clock to be running, and the light
goes out when this clock is stopped.  Why in the world would any kind of clock
be required if the circuit is only a transistor on/off switch controlled by a
static register bit?  Other parts of TI's Iota datasheet describe its LEDA, LEDB
and LEDC as "current drivers" - but in the absence of any way to actually set
the desired current without depending on Vbat or Vf variations, whatever the
Iota chip actually provides can't be anything like MAX1916.

Poorly documented, non-understood mystery hardware is best avoided, hence we are
not going to use Iota LEDB, and shall only use MAX1916 instead.  We also gain a
functional improvement over Pirelli DP-L10 by using MAX1916: our keypad
backlight intensity will remain the same over the battery discharge range.

1.6. Side buttons

In addition to the 21-button main keypad, our FC Libre Dumbphone handset will
include 3 side buttons: two on the left side, intended for volume up/down
control, and one on the right side, serving auxiliary functions.  This side
button arrangement is identical to TI's D-Sample and similar to Pirelli DP-L10:
the only difference between our arrangement (matching D-Sample) and Pirelli's
is that Pirelli moved the 3rd side button to the left and designated it as the
camera button.  However, we (FreeCalypso) have no interest in ever implementing
any kind of camera on our phones, hence we are moving the 3rd side button back
to where it was in TI's original design (on the right), and we will use it for
purposes of our own invention.

The starting point UI code we got from TI does not do anything with the right
side button (even though this button exists and works on the D-Sample platform
on which this code was originally developed), hence we have full freedom to
invent our own uses for it.  The following uses are envisioned:

* Long press of this button may be our way of turning the hands-free loudspeaker
  on and off, a function that does not exist in the starting point UI code from
  TI.

* When the phone is in its normal idle standby operation (not in a call and not
  being poked at by the user, but registered to a GSM network and ready to
  accept incoming calls or SMS), the display will be off.  Users often desire
  to check the time and other status (check coverage, see if they missed any
  calls or SMS), which will require pressing any button to turn on the display.
  At that point a 30 s timer kicks in, which will turn the display back off
  after 30 s of inactivity.  However, an argument can be made that keeping the
  display on for 30 s if the user only wanted to quickly glance at the time is
  a waste of battery.  Here is one proposed solution: we can implement a
  function where a short press of the right side button when the phone is on its
  idle screen will cause the display to turn off immediately and activate the
  keyguard.  The user can then press the right side button once to turn on the
  display and look at it, and then press the same button again to turn it back
  off.

* When we are in a long call, the LCD backlight does not turn off completely,
  instead it will go dim - but still readable.  Any button presses in this state
  are NOT swallowed - they take their regular actions.  However, the keypad
  backlight turns off fully in this state, and under certain conditions (like
  out at night) the user may not be able to see the keypad.  If a short press
  of the right side button invokes no other action besides switching on full
  display brightness and the keypad backlight, this right side button can be
  found by touch, and thus solve this particular problem case.

1.7. Audio routing

3 different audio routing modes will be supported on our FC Libre Dumbphone
handset:

* Default mode: there will be a 32 ohm earpiece speaker physically mounted in
  the usual place, on the front bezel above the display, to match up with the
  user's ear in handheld operation.  There will also be a microphone toward the
  front bottom of the phone, again in the usual place.

* Hands-free mode: there will be an 8 ohm loudspeaker physically separate from
  the 32 ohm earpiece speaker, physical location in the handset TBD.  In the
  hands-free mode, the downlink audio will be switched from the earpiece speaker
  to the loudspeaker, while the microphone input for the uplink will remain the
  same.

* There will be a wired analog headset jack with plug insertion detection; when
  a headset is inserted, both audio input and output will be redirected to this
  headset interface.

1.7.1. Earpiece and loudspeaker separation

Most current mainstream phones (in fact, all that I am familiar with) have
physically separate speaker transducers for the earpiece function (hold up to
ear to talk) and the loudspeaker+ringer function.  The earpiece speaker is a 32
ohm load, and the loudspeaker is an 8 ohm load.  In a Calypso+Iota design, an
external amplifier chip is needed to drive the 8 ohm loudspeaker, whereas the
little 32 ohm earpiece speaker can be driven directly by Iota EAR output.

However, a very different design was implemented by TI on their D-Sample and
Leonardo boards.  They have only one speaker, one of 8 ohm kind, that is
physically mounted in the position where the earpiece speaker would normally go.
In order to not overwhelm the user's ear in handheld operation, they have
peculiar circuit wiring where the analog signal from Iota to the loudspeaker
amplifier goes through different resistor values depending on whether EAR or AUX
output from Iota is used, and when the EAR output is selected, the high resistor
values produce attenuation, such that the sound pressure level produced by the
pressed-to-ear loudspeaker becomes comparable to that produced by a more
traditional 32 ohm earpiece speaker.

Furthermore, TI's single speaker design was not limited to their development
boards.  Some years ago I found schematics for some very old LG phone (called
A316 or B1200, not sure of the correct designation), this phone is from early
TI era (pre-Calypso, using Ulysse/Nausica/Clara chipset), and it has the same
arrangement as D-Sample and Leonardo.

For our own FC Libre Dumbphone, I am going with the separate speakers
architecture, using physically separate earpiece and loudspeaker transducers.
This architecture feels more native to me, and it will allow for independent
tuning of the two audio paths.  In my defense, all current mainstream phones
seem to use the same architecture - the other approach with a single loudspeaker
in the earpiece physical position seems very uncommon.

1.7.2. Loudspeaker implementation

The external amplifier chip for driving the 8 ohm loudspeaker will be TI
TPA6203A1, copied from Leonardo schematics and proven good on FCDEV3B.  On
FCDEV3B this amplifier is fed with signal from Iota EAR output, but on the final
handset and on the Venus development board this amplifier will be fed with
signal from Iota AUX output instead.

The loudspeaker amplifier has an on/off control by way of a Calypso GPIO; in
order to save battery, this amplifier needs to be off normally, and only turn on
when a loudspeaker call is in progress or when a ringtone melody is played.

1.7.3. Wired analog headset jack

The analog headset jack on our FC Libre Dumbphone handset will be of 2.5 mm
TRRS type, using pinout copied from iWOW DSK.  The headset needs to be wired as
follows:

* 32 ohm earpiece speaker connected between Tip and Ring2;
* electret condenser microphone, positive connected to Ring1;
* Sleeve is ground, should be needed only for the microphone.

The advantage of this TRRS headset specification, as opposed to the simpler kind
with a TRS plug and a common ground for the earpiece and the mic, is that our
TRRS headset can be driven with either single-ended or differential earpiece
driver outputs.  On the final handset, the wired headset interface will be
connected to the Iota headset channel (HSMICBIAS, HSMICP, HSO) and thus the
headset earpiece driver will be single-ended (HSO and GND), but the same headset
can also be plugged into other FreeCalypso devices in which the jack is wired
to the main Iota audio channel, with Iota EARP & EARN driving Tip and Ring2 on
the TRRS headset jack.

1.8. Ringtone generation

In terms of the physical sound-emitting element, there are two principal ways
in which cellphone ringing sounds can be produced:

1) The oldest and most classic way is to use a magnetic buzzer controlled by
   Calypso BU/PWT digital output.  The buzzer is driven with raw battery voltage
   being switched with a "digital transistor" (BJT with bias resistors), and the
   control input going to the base of the BJT is Calypso BU/PWT output.  This
   method is standard in older phones that don't have hands-free loudspeakers:
   since there is no loudspeaker for that other purpose, some loud noise-making
   element needs to be implemented just for ringing, and old-style buzzers are
   the traditional choice.  Motorola C1xx lower subfamilies (C11x/12x and
   C139/140) use such buzzers for ringing.

2) In phones that feature a loudspeaker for hands-free operation, the same
   loudspeaker is also used for ringtone sounding, and the buzzer is eliminated.
   Apparently hands-free loudspeakers weren't popular in the Calypso era, thus
   Pirelli DP-L10 is the only known Calypso phone that features one.  There is
   also a more bizarre possibility: some phones have replaced the ringing buzzer
   with a loudspeaker, but that speaker is used *only* for playing ringtone
   melodies - no hands-free call feature is offered.  This situation exists on
   Motorola C155/156 phones.

Furthermore, if the physical sound-emitting element is a loudspeaker and not an
old-fashioned buzzer, and if the chipset is Calypso, as opposed to various newer
chipsets, then a further distinction arises:

2a) Most historical commercial phones that are based on Calypso and use a
    loudspeaker for ringtone sounding, also contain a special ringtone generator
    chip that drives this speaker when a ringtone is played - in other words,
    their loudspeaker ringtones do NOT go through the same voice audio path that
    is used for hands-free calls, if the latter feature is offered at all.  The
    speciai ringtone generator chip is typically a combined MIDI player and
    loudspeaker driver.

2b) The much less popular approach is to not implement any extra hardware at all
    that is specifically for ringtone generation, use only the same loudspeaker
    audio path hardware that is already needed for hands-free calls (a simple
    loudspeaker amplifier), generate ringtone melodies in the Calypso DSP
    (Melody E1 or E2), and play them through the regular voice audio path,
    routed to the loudspeaker.

Approach 2b is the least popular one among historical commercial Calypso phones,
but it is the one which I (Mother Mychaela) have selected for our FC Libre
Dumbphone handset.  But let us nonetheless examine the pros and cons of
different approaches, and see why I have settled on option 2b.

Buzzer melodies (option 1) are monophonic (the signal carrying the melody to
the buzzer is a digital square wave, and there is no way to create multiple
overlapping notes in such a signal), but a decent range of tone frequencies is
available: the magnetic buzzer hardware can easily produce frequencies all the
way up to the limit of human hearing, while Calypso PWT produces musical notes
from F4 through E8 in the scientific pitch notation, or 349 to 5274 Hz.  In
contrast, any tones produced through the 8000 samples/s voice audio path have
to be below the Nyquist frequency of 4 kHz - according to TI's document, Melody
E1 notes go from E4 (330 Hz) up to G#7 or 3322 Hz.

In terms of the richness of possible ringtone melodies that can be played,
option 2a (external MIDI player chip that drives the loudspeaker directly,
without going through Calypso+Iota voice audio path) is the absolute best.
These specialized ringtone generator chips implement full MIDI (128 instruments,
47 drums, up to 64 simultaneous notes, according to one datasheet), and the
available ringtone melodies for these MIDI chips are very rich - just take a
Pirelli DP-L10 phone and listen through various ringtone melodies it offers.
All of Pirelli's melodies are stored as *.mid files in their FFS, thus we could
very easily copy them if we were to adopt a MIDI player chip similar to theirs.

However, the problem for us with adopting option 2a is that this option would
introduce significant extra complexity and adversely affect our already long-
overdue project schedule.  There is only one MIDI ringtone player chip for which
we have enough documentation to attempt such a feat: this chip is Winbond
W56964, a slightly more capable sibling of the W56940 used in the Pirelli phone.
However, just because we have what at first glance appears to be reasonably
complete documentation does not mean that it would be a slam dunk!  We would
have to build a separate test board for this chip, connect it to a Caramel2
motherboard (it needs to connect to Calypso MEMIF), and then spend significant
time climbing the learning curve and getting this chip to actually work: getting
it to play melodies, and just as important, getting it into and out of sleep
modes.  In other words, a lot of extra work and time spent just for this part,
not advancing any other project needs - whereas option 2b eliminates all of this
extra work.

Finally, a philosophical argument can be made that FreeCalypso should be all
about simplicity, producing a phone that does its job: implement just what is
needed for a functional phone, and omit unnecessary baggage.  An extra hardware
circuit (a chip connected to Calypso memory bus, no less) and associated
software complexity that serves absolutely no other purpose except to produce
ringtones that are "richer" than what the Calypso can produce on its own, and
does not assist in any way with hands-free loudspeaker operation for calls (it
is more of a hindrance in that mode), can be seen as an unwelcome burden similar
to other unwelcome burdens which we are already eliminating, like the camera.

In contrast, with our chosen option 2b, we have exactly zero extra hardware
that is just for ringing: our loudspeaker and its associated driver circuit
(simple amplifier) is primarily for hands-free calls, and the ability to use
the same audio path to play ringtone melodies comes literally "for free" with
the Melody E1 feature built into our Calypso DSP.  We already have a selection
of nice-sounding ringtone melodies in E1 format, lifted from the legendary TSM30
source, and software complexity is minimal: the melody playing engine has
already been implemented by TI, we only need to call RiViera Audio Service API
functions.

1.9. Vibrator

All traditional cellphones include a vibrator, and ours needs to include one
too.  Our firmware will need to offer the options of being silent, vibrating
only, ringing only, or ringing and vibrating on an incoming call or SMS - all
of these options are genuinely useful to a heavy-duty phone user in different
situations.

In terms of functionality, the vibrator is envisioned as a simple on/off control
in the hardware, with higher-level "pulse train" functionality implemented in
the firmware.  As far as end user experience goes, the Mother's plan is to copy
the way the vibrator works on the Pirelli DP-L10.  On this to-be-replaced or
to-be-recreated reference phone, the vibrator works as follows: when an incoming
call arrives in vibrating alert mode, the firmware turns the vibrator on for
500 ms, then turns it off for 500 ms, and the cycle endlessly repeats until the
call is either answered or dropped.  This 500 ms on/off cycling is purely a
firmware function, the hardware control is an on/off switch.

Looking at the hardware implementation of the vibrator driving circuit in the
Motorola C1xx family and in the Pirelli DP-L10, both designs support a form of
"analog" control of the vibrator beyond simple on/off.  In the Mot C1xx family
the vibrator is controlled by the output of Iota auxiliary DAC, whereas in the
Pirelli DP-L10 Calypso BU output has been repurposed to control the vibrator,
allowing either full-on or PWM driving.  However, Pirelli's firmware appears to
never operate the vibrator in any way other than fully on, and there is no
evidence of Mot C1xx firmwares applying any analog control to their vibrator
either.

The Mother's tentative plan for our FC Libre Dumbphone handset is to copy
Pirelli's approach in both hardware and firmware: repurpose Calypso BU output
for vibrator control (we won't have a buzzer, see section 1.8), allowing the
possibility of PWM, but have our firmware only use fully-on and fully-off
states, at least initially.  However, because we won't have a vibrator on our
Venus development board, only in the final handset, this decision does not have
to be made right now.

Because our firmware will be designed for a simple on/off vibrator control,
during fw development on the Venus board it will be trivial to use a LED to
simulate the vibrator on/off state.

1.10. Battery

The battery in our FC Libre Dumbphone handset will be single-cell Li-ion.  It
goes without saying that this battery will be freely removable and replaceable
by end users.  The specific size, form factor and mAh capacity of this battery
won't be addressed until later in the project, when we get closer to building
the actual handset.

Our Calypso+Iota chipset dates from the era when the cellular handset industry
was transitioning from NiMH to Li-ion batteries, and the Battery Charger
Interface (BCI) block in the Iota chip supports both battery types, or at least
TI's documentation claims so.  Given that we are going against the mainstream
society's ideas in so many other ways, I have given thought to the possibility
of using a NiMH battery instead of Li-ion.  However, the problem with using a
NiMH battery is that we would be going into completely uncharted territory
without any guidance.  In the case of Li-ion batteries the charging process is
well-understood in both theory and practice, and our FCHG logic based on reverse
engineering of Pirelli's firmware works well both on the same Pirelli and on
Motorola C1xx family.  In contrast, if we went with NiMH, we would have
absolutely no guidance in implementing the necessary charging control logic
(TI's LCC code is useless), causing a huge risk to the project.  Furthermore,
determining the state of charge from Vbat for the purpose of the bars icon is
already somewhat challenging even with Li-ion, given the relatively flat middle
part of the discharge curve - and with NiMH we can only expect the problem to be
even worse, as their discharge curve is said to be even flatter.  For these
reasons, we are going to play it safe and stick with Li-ion.

1.11. Charging circuit

Our FC Libre Dumbphone will feature a USB port (mini-B, device role only, no
OTG) that combines two logically separate functions: battery charging and
computer interface.  The basic idea of this dual-function USB port comes from
Pirelli DP-L10, but we are applying significant refinements of our own to this
general idea, as the following description will make clear.  This section
describes the charging function; the computer interface function is described
in section 1.12.

One highly non-standard innovation that will appear on our FC handset will be a
user-visible mechanical slide switch that will turn the charging circuit on or
off.  The purpose of this charging on/off switch is to make it possible to
connect USB and have the two ttyUSB devices appear (see section 1.12) without
presenting a 'charger plug' boot condition to the Calypso+Iota core chipset.
From an end user perspective, if you only use the USB port for charging and
don't care about the computer interface function, then leave the charging switch
always on - USB plug/unplug will mean charger plug/unplug like on any
conventional phone.  Similarly, if you do use the computer interface function to
connect your phone to a host computer in regular operation, with the firmware
up and running normally, but you don't mind having the phone also charge from
your computer every time you connect USB, then likewise leave the charging
switch always on.  However, if you are going to reflash phone firmware or do
other advanced manipulations using the computer interface, then you will need
to turn the charging switch off.  With the switch off, the USB port becomes a
computer interface only, without charging.

Past the switch, the battery charging circuit using USB +5V as the charging
power source will be the most classic one depicted in Figure 4-10 in the Iota
chip datasheet (TWL3025_SWRS021.pdf), same as in Pirelli DP-L10 and Motorola
C1xx phones.  Presentation of USB +5V to Iota VCHG terminal past the charging
on/off switch is what will cause the chipset to boot in the 'charger plug' mode,
or to activate charging functions in the firmware if the phone is already on.

1.12. Computer interface

Our Calypso chip has no native USB, instead the host computer interface of all
Calypso-based systems consists of two UARTs.  On our development boards starting
with FCDEV3B, we got used to interfacing to both of these UARTs by way of
FT2232x adapters, a USB to serial adapter that goes from one USB device to two
UARTs, presenting two ttyUSB devices to a Linux host.  For low-level operations
like flash programming, having just one Calypso UART is sufficient (either of
the two), but once our regular firmware is up and running, then having both
Calypso UARTs gives maximum user empowerment: Modem UART carries a classic AT
command interface complete with CSD, GPRS and GSM 07.10 MUX capabilities, while
the other UART (IrDA) carries TI's RVTMUX debug and development interface.

Before arriving at our current radical approach with the charging on/off switch,
for many years previously I was considering a more conservative approach.  My
original idea was to bring out the two Calypso UARTs in very different ways: my
thought was to bring only the Modem UART to the built-in USB port (by way of a
built-in single-channel USB-serial chip), and have plugged-in USB always present
VCHG to the chipset, but route the debug UART (the one most useful in low-level
development and bring-up) to a special FPC connector that would interface to a
special debug board, just like Openmoko did on their Neo.  Serious development
work would then require having that debug board attached, while more casual
users would be able to talk AT commands to the phone via the built-in USB port,
charging the battery at the same time.

What made me change my mind about this design was the realization that I, as the
most principal user and developer, would end up wanting to have the debug board
attached all the time, and the need to have it hanging externally, or perhaps
glued or taped to the back of the phone, would be a huge blemish and
inconvenience.  Back in the days of Openmoko, someone must have had a similar
experience, as I remember reading about a hack where someone built a debug board
functional equivalent that fits inside the Neo, in some otherwise unused space.

Hence the new design for our planned FC Libre Dumbphone handset: the USB port
will have a built-in FT2232D (or perhaps FT2232H) subsystem (USB to two UARTs)
connected to it, interfacing to both Calypso UARTs, while the charging on/off
switch will make it possible to use this interface for low-level development
and bring-up without presenting VCHG to the chipset.  In this architecture this
FT2232x subsystem should be considered the primary "owner" of the handset's USB
port, while the charging function is secondary and optional, enabled or disabled
with a switch.  To put it another way, if our USB port is connected to a regular
USB host (as opposed to a Dedicated Charging Port power-only source), that USB
host will always enumerate the FT2232x and see two ttyUSB devices, whereas
charging may or may not take place depending on the switch setting.

1.12.1. Set of UART signals

The set of signals to be connected between Calypso and FT2232x for the Modem
UART is almost complete:

USB UART
DTE signal	Calypso signal
------------------------------
TxD		RX_MODEM
RxD		TX_MODEM
RTS		CTS_MODEM
CTS		RTS_MODEM
DTR		GPIO3
DCD		GPIO2
RI		GPIO8

Only DSR is omitted for the Modem UART channel, all others are included.  The
second debug UART channel is only two wires:

USB UART
DTE signal	Calypso signal
------------------------------
TxD2		RX_IRDA
RxD2		TX_IRDA

However, as shown in the next section, these signals cannot be simply connected
between Calypso and FT2232x, instead a more complicated scheme needs to be
implemented.

1.12.2. USB and mobile power domains

Our FC Libre Dumbphone handset will have two principal power domains in it: the
main battery-powered mobile domain, and the USB domain.  This power domain
situation presents some very significant challenges, a problem generally
referred to as "partial power-down".  There are two PPD scenarios to be
concerned about:

1) In normal operation the phone is mobile and not connected to USB.  In this
   state the mobile power domain is on, whereas USB-powered circuits in the
   FT2232x subsystem have no power.  The two challenges in this state are:

1a) We need to ensure that no currents flow from the powered-on mobile domain
    into powered-down USB domain circuits, as any such currents would be an
    unacceptable drain on the battery.

1b) Calypso UART inputs that come from the USB domain when the latter is active
    need to have defined logic levels on them when the USB domain has no power:
    no floating, no mid-way levels that would cause higher currents in CMOS
    input structures, and furthermore, some Calypso inputs need to be high in
    this state, while others need to be low.

2) A reverse PPD scenario occurs when the USB domain has power, but the
   Calypso+Iota chipset is in its switched-off state per Iota VRPC.  This
   scenario can occur when the charging switch is set to off, or when the
   battery is critically low and undergoing precharge.  The main concern in
   this state is to avoid feeding power from the USB domain into the Calypso
   chipset's V-IO rail - our experience on Caramel2 boards conclusively
   demonstrates that Calypso does not like this condition and can behave oddly,
   erratically feeding current into its outputs that are supposed to be low or
   Hi-Z, and thereby erratically turning on various peripherals.

If we were to naively connect our UART signals between Calypso and FT2232x, the
result would be bad: all of the above concerns would be violated.  Instead we
need to insert carefully designed isolating buffer circuits in both directions.

1.12.2.1. Calypso to FT2232x signal direction

If these signals were connected directly, significant current (in the mA range)
would flow from Calypso outputs into powered-down FT2232x inputs, which is not
acceptable.  Our solution is to insert an LVC buffer (probably 74LVC541A, for
the 5 signals that are needed) between Calypso outputs and FT2232x inputs, with
the buffer powered from USB domain 3.3V supply.  With mobile on and USB power
absent, the LVC buffer's Ioff spec will apply, which is listed in Nexperia's
74LVC541A datasheet as 0.1 uA typical, 10 uA maximum.

An unfortunate consequence of this design is that in the opposite PPD scenario
(USB connected to a host, charging switch off, mobile chipset in its off state)
the inputs to the LVC buffer will float, with FT2232x inputs receiving garbage
as a result.  Adding pull-up resistors to a USB-domain supply would cause other
problems, hence the Mother's position is that we'll just live with a few
floating inputs in this particular condition - and it is a condition that
should not persist for extended lengths of time.  There is also a software
consideration stemming from this floating input situation: when you are doing
low-level programming and development operations in this state, don't open the
Modem UART ttyUSB device, and only operate via the other debug UART.  The latter
is a 2-wire UART without any flow control or modem control signals, hence there
will be less bogosity for the Linux host to see in this state.

1.12.2.2. FT2232x to Calypso signal direction

This direction is even more difficult, and we will need to insert two chained
LVC buffers: the signals will first pass through an LVC buffer powered from the
USB domain, and then through another LVC buffer powered from the Calypso+Iota
chipset's V-IO rail.  There will be pull resistors inserted between the two
buffers: either pull-up to VBAT (raw battery positive rail) or pull-down to GND,
depending on the needed signal sense.

The LVC buffer powered from Calypso V-IO is needed in order to prevent current
feeding into Calypso when the mobile is switched off - the buffer's Ioff spec
will apply.  Pull-up and pull-down resistors in front of this buffer are needed
so that Calypso inputs will receive the desired states when no USB host is
connected.  Pull-ups are being made to VBAT instead of V-IO to eliminate the
possibility of current feeding into V-IO through these resistors.  (Feeding
from 3.3V logic signals into the battery can't happen when the battery is above
3.3 V, and if the battery is below 3.3 V, then we are only adding a little to
the precharge current.)

The other LVC buffer (the one powered from USB-domain 3.3V) is needed because
in the absence of this buffer, current will flow through pull-up resistors and
into powered-down FT2232x output pins, the resulting pull-down resistance will
be lower than the pull-up, and the next buffer won't receive the desired logic
level, not to mention unwanted current flowing.  With the other LVC buffer
added, that buffer's Ioff spec will apply.

The value of pull-up resistors to VBAT will be 22 kOhm.  With maximum 15 uA
current flowing through each resistor (worst-case Ioff of one buffer plus
worst-case Ii of the other buffer), the maximum voltage drop on the 22 kOhm
resistor will be 330 mV.  In order for the LVC buffer's input structure to not
draw extra current, the input voltage needs to be 2.8 V or higher - thus with
22 kOhm resistors we'll keep satisfying this condition until the battery falls
to about 3.1 V, which is below the operational range for switched-on mobile.

One downside of having pull-ups to VBAT (which can be as high as 4.2 V) on
signals that are output from a 3.3V-powered buffer is that when the buffer
output is high, there may be current flowing into that high output (not sourcing
out of it as normally expected), which is a bad condition for CMOS outputs.
However, this current will be limited to a maximum of about 40 uA
((4.2-3.3 V) / 22 kOhm), and my feeling is that such small current won't hurt
Nexperia LVC buffers.

1.12.2.2.1. Signal pull-up/down directions

Of the 4 UART signals going from FT2232x to Calypso (see section 1.12.1), TxD
and TxD2 MUST be sensed high by Calypso when no USB host is connected, hence
they will need the two chained LVC buffers with pull-ups to VBAT in between, as
described above.  RTS and DTR are less critical in that either high or low level
would be acceptable, as long as it is stable and not floating.  However, it is
slightly preferable to have DTR pulled up like TxD (to be sensed as logically
negated), and to have RTS (flow control signal going to CTS_MODEM) pulled down,
to be sensed as logically asserted.

The approach chosen by the Mother is to have TxD, TxD2 and DTR pulled up to VBAT
as described above, and to have RTS pulled down to GND.  The value of the pull-
down resistor to GND will be 47 kOhm, and the USB-side-powered LVC buffer can be
skipped for this signal - that buffer is only needed in order to work correctly
with the pull-up to VBAT.

With only 3 FT2232x-to-Calypso signals needing to go through a USB-side-powered
LVC buffer, and with 3 slots remaining available in the 74LVC541A buffer from
section 1.12.2.1, that one 74LVC541A IC can serve both signal directions (5
signals from Calypso to FT2232x and 3 signals going the other way), reducing the
component count.

1.12.3. Boot control by USB host

Our DUART28C adapter (DUART28 hardware, EEPROM in the 'C' configuration) has a
nifty feature in the form of CTL1 and CTL2 open drain outputs, intended for
triggering Iota VRPC boot control signals on Calypso devices, i.e., boot control
signals from the {PWON, RPWON, nTESTRESET} set.  So far none of our FreeCalypso
development boards bring out RPWON, but both FCDEV3B and Caramel2 feature PWON
and nTESTRESET controls, and we have an established convention for driving them
with CTL1 and CTL2 from a DUART28C.  The end effect for the developer-operator
is that one can run operations based on Calypso boot ROM loading path (fc-iram,
fc-loadtool etc) purely from the host command line, without needing to press any
buttons on the development board: adding -Prts to the command line is equivalent
to pressing PWON, or adding -Pdtr is equivalent to pressing RESET.  rvinterf can
also be run with the same options, allowing flashed firmware to be booted in a
similar no-buttons-needed manner.

It is the Mother's intent to replicate this boot control feature on our FC Libre
Dumbphone handset as well, i.e., make FT2232x Channel B RTS and DTR outputs
(otherwise unused) act as host-driven boot control triggers.  In hardware terms,
this addition consists of just one tiny IC (74LVC2G07) and two pull-up resistors
on the BDBUS[24] lines from FT2232x to this OD buffer.  FT2232x EEPROM will be
programmed with the same custom USB ID as DUART28C, and the Linux kernel
ftdi_sio driver will need to have our DUART28C support patch added to it.

There will be one change from our previous convention, however: the OD buffer
output controlled with Channel B RTS will be wired to RPWON rather than PWON;
the other OD buffer output controlled with Channel B DTR will still be wired to
nTESTRESET like before.  The reason for this change is that our handset firmware
has more complex logic that treats different boot causes differently (as
required for standard expected handset functionality), and Iota PWON is now
reserved solely for the end user power-on button.  Host-commanded boot needs to
be different from this end user power-on button (no long press is required, and
the firmware should enter its misc boot state that behaves like an ACI build),
hence we are changing the wiring so that -Prts will trigger RPWON rather than
PWON.  The same boot effect can still be achieved with -Pdtr triggering
nTESTRESET, but it is a bigger hammer (reset of RTC can be unwanted), hence
-Prts will be recommended as the gentler option, leaving -Pdtr for times when
recovery from runaway code is needed.

2. FC handset firmware functional scope specification

FreeCalypso handset firmware will always run (perhaps with subset functionality)
on more hardware targets than just our main-goal FC Libre Dumbphone handset.  It
already does: our firmware currently runs on our Luna development platform, and
prior to FC it ran on TI's original D-Sample platform.  A very restricted
functional subset also runs on Motorola C139 hardware.

If we consider only the main goal of FC Libre Dumbphone handset, then our
firmware evolution can be seen as strictly linear: we start with what we got
from TI, and we morph it toward what will be needed to operate our handset,
adding functionality and peripheral support which we need for our FC handset,
but which is not present in the starting point code from TI.  However, we also
have side-branch functionality: at times when the code from TI supports
something which we don't need for our own FC handset, but which may be useful
for alien hardware targets, a moral imperative can be made for keeping and at
least minimally maintaining that functionality as a kind of side-branch feature,
a permitted configuration that is not needed for our own FC handset but needed
for others.  Similarly, when we add support for entirely new peripherals that
are planned for our FC handset (such as the loudspeaker), we should make the
firmware change in such a way that targets without the extra feature can still
be supported.  Finally, when we are changing the firmware in ways that
significantly depart from TI's original, it may sometimes be prudent to preserve
TI's original way as a lorekeeping option.

The following sections will spell out what we support and what we don't support
in FreeCalypso handset firmware, and how these scoping decisions relate to our
starting point from TI, to our main goal of FC Libre Dumbphone handset, and to
secondary objectives of alien target support and lorekeeping.

2.1. Display support

2.1.1. Support for different display sizes

By the very nature of the problem, any phone handset UI design will always be
quite specific to a particular display size in pixels, and also to the display
type as in color or black&white.  The starting point code we got from TI
supports 3 different UI configurations in terms of size and coloration:

* 176x220 pixel, 16-bit color;
* 176x220 pixel B&W;
* 84x48 pixel B&W.

In FreeCalypso we have made two changes to this set of possible UI
configurations:

1) The large (176x220 pixel) B&W option has been removed.  In TI's delivery this
   option was nothing more than a quick&dirty hack to extend their small (84x48
   pixel) B&W UI to the large D-Sample screen, and this configuration offers
   nothing useful - any real display of such large size will always be color.

2) The small B&W configuration has been extended from 84x48 to 96x64 pixels.
   Why 96x64?  Because it is the size in pixels of Motorola C139 LCD, and it is
   the smallest LCD size found among those alien Calypso phones whose existence
   is known to us and for which we have at least minimal support.  Extending
   this UI configuration from 84x48 to 96x64 pixels was an easy change because
   it is an increase in screen real estate (not a decrease), and it is a fairly
   small increment, such that UI design choices which were sensible for an 84x48
   pixel display are still sensible for 96x64.

The main principal difference between our approach in FreeCalypso and what a
conventional commercial phone manufacturer would have done is that we are
retaining TI's smallbw configuration and keeping it supported, as opposed to
disregarding it and working only on the bigcolor UI config for our own planned
hardware product.  We keep this smallbw UI configuration around, in the extended
96x64 pixel size, for two reasons:

1) Lorekeeping: unlike TI's 176x220 pixel B&W config that was totally
   uninteresting, TI's old smallbw UI (from the days of C-Sample) is
   sufficiently interesting and unique (and naturally quite different from the
   bigcolor version) to be worth preserving.

2) By keeping this configuration around (not discarding it and not allowing it
   to bitrot beyond repair), we keep the door open for the possibility of a
   minimally usable FreeCalypso Lite aftermarket firmware for Motorola C139.

Both UI configurations can be built for our current Luna platform, and both of
them display on our Luna LCD.  The virtual framebuffer of 96x64 pix B&W in the
smallbw config is displayed in the center of our physical 176x220 pixel color
LCD, surrounded by a pale magenta border.  The same ability to run both configs
will continue on our next development board (Venus).

2.1.2. Backlight readability paradigm

(See theoretical background in section 1.4.3.)

Our actively maintained FC handset firmware has been paradigmatically redesigned
to assume a display which is NOT readable without the backlight.  Our logical
primitives with respect to display control are display on/off, rather than
backlight on/off, and we swallow the initial keypress that turns on the display.

This change is a significant departure from TI's original.  The LCD on TI's
D-Sample is transflective, and when the backlight is off, the display remains
readable in ambient light.  It is certainly better in this regard than Motorola
C139 LCD.  And if we go back further in TI's history to C-Sample and earlier,
those 84x48 pixel B&W LCDs were the traditional mostly-reflective type,
perfectly readable without the backlight.

This area is one where we are NOT retaining TI's original way as an option in
our actively maintained firmware.  The difference between the two principal
paradigms is too great, and we don't have any active-demand prospective targets
with B&W displays of the old traditional kind.

2.2. Keypad assumptions

The keypad arrangement on our FC handset (see sections 1.5 and 1.6) will be
exactly the same as on TI's D-Sample, thus no principal changes to the firmware
are needed in this regard.  Furthermore, the same 21-button keypad exists on
Motorola C1xx phones, thus no firmware design variations are needed in this
regard for secondary target support.

The only issue of concern is that the 3 side buttons which exist on D-Sample and
Pirelli DP-L10 and will also exist on our FC handset don't exist on Mot C1xx.
Our starting point code from TI does not do anything with these buttons (even
though it was developed on the D-Sample platform where they exist), but when we
do get around to adding support for these side buttons, we will need to take
some extra care in preserving flexibility:

* The original code from TI uses navigation up/down buttons for volume control,
  for both ringer and earpiece volume.  We are going to change the code to drive
  these volume controls with side buttons instead (dedicated volume up/down
  buttons), but when we make this change, we'll need to provide an option of
  restoring the old way for less button-equipped phones like Mot C1xx.

* Whatever functions we assign to the right side button, all of them will be
  our own inventions, as none exist in TI's original code.  However, this right
  side button does not exist on Mot C1xx.  The Mother's idea is to assign the
  right side button to loudspeaker on/off control - this arrangement will work
  well as the same C1xx phones that lack this button also lack the hands-free
  loudspeaker.

2.2.1. No support for 18-button main keypads

Prior to D-Sample, TI's C-Sample and earlier boards had keypads with fewer
buttons, 18 instead of 21, and no side buttons.  The difference between the
C-Sample 18-button main keypad and the 21-button one found on D-Sample, Pirelli
DP-L10 and Motorola C1xx is that the older 18-button keypad has only up and down
navigation buttons in the place where the 21-button version has a 5-way
navigation button group.  In other words, navigation left, right and center keys
don't exist on the 18-button version.

TI's demo/prototype/PoC UI code was originally developed on C-Sample or perhaps
even earlier, thus it was originally designed for the 18-button keypad
arrangement.  For this reason, the code currently makes very little use of
navigation left, right and center keys.  However, some limited use is already
being made of these extra keys (primarily on text and number entry screens, aka
the editor), and our use of all available keys in the UI will keep growing.  As
a matter of project scope, we are NOT supporting backward compatibility with
18-button keypads, given that the lowest-end Mot C1xx family already has
21-button keypads.

2.3. Audio routing

TI's demo/prototype/PoC UI code from TCS211 does not use the audio mode facility
of the RiViera Audio Service: ABB configuration remains the default set in L1
initialization, volume control is done by calling audio_SetAmplf() in the Condat
abstraction layer, which in turn calls ABB_DlVolume().  This design will need to
change in FreeCalypso: we will start using the RiViera Audio Service audio mode
facility, and the use of this facility (including correct audio mode
configuration files under /aud in FFS) will become mandatory on all targets.

The following 3 audio modes are defined for call audio routing and idle
operation (keyclicks etc), as opposed to Melody E1 ringing covered in section
2.4.2:

Mode name	Used for
------------------------
handheld	Default handheld operation and idle state
handfree	Calls in hands-free loudspeaker mode
headset		When a wired analog headset is plugged in

At the minimum, valid /aud/handheld.{cfg,vol} files will need to be created in
FFS on every supported target; other modes can be omitted if they can't be
entered.  /aud/*.vol files maintained by RiViera Audio Service will serve as the
non-volatile volume setting store for each mode.

2.3.1. Loudspeaker inclusion or omission

The Mother's plan is to use a long press of the right side button as the command
for entering or exiting hands-free loudspeaker mode; by this design, if this
right side button does not exist on a given target, then loudspeaker mode cannot
be entered.  Furthermore, our code supporting hands-free loudspeaker mode can be
limited to just bigcolor configuration (conditionalize on LSCREEN preprocessor
symbol), further excluding this mode from ports to alien targets like Mot C1xx
and Pirelli DP-L10.

2.3.2. Headset inclusion or omission

The code supporting wired headset mode will always be included in the firmware,
however, there will be a hardware driver function call to inquire if a headset
is inserted or not.  If the wired headset jack does not exist on a given target,
or more practically if it exists but we don't support it, this headset status
function will always return "no headset" indication, and the headset mode will
never be entered.

2.4. Ringtone generation

See section 1.8 for an overview of possible ways in which ringtone generation
may be accomplished.  The only ring sound generation method supported by TI's
TCS211 version of their demo/prototype/PoC phone UI (the version for Calypso,
as opposed to other chipsets) is the original Calypso buzzer, i.e., Calypso
digital waveform output intended for switching a magnetic buzzer.  The code that
rings this buzzer will execute successfully on every Calypso target, regardless
of whether it actually has a magnetic buzzer or not: if there is no buzzer and
Calypso BU/PWT output is left unconnected, like it is on our Luna platform, the
code will still run and emit the intended tone waveform on BU, but this output
will go nowhere and no audible sound will be made.

As a matter of project scope, in our FreeCalypso handset firmware we shall
support two configurations with regard to ringing:

1) TI's original buzzer configuration will be retained for lorekeeping and to
   keep the door open for the possibility of a minimally usable FreeCalypso Lite
   aftermarket firmware for Motorola C139.

2) For our own FC Libre Dumbphone handset, we will need to implement ringing by
   way of the same loudspeaker that will be used for hands-free calls, using the
   Melody E1 feature of Calypso DSP for ringtone melody generation.

2.4.1. Scope limitation on buzzer melodies

Because the option of ringing via Calypso buzzer output is retained only for
lorekeeping and for minimal-support alien targets, no effort will be expended
toward playing more musical melodies via the buzzer.  Our current code (bugfixed
from TI's original) implements just one buzzer ringing sound, consisting of
alternating 800 Hz and 900 Hz tones, using BU mode rather than PWT, and the
Mother currently has no plans to implement anything more for the buzzer
configuration.

2.4.2. Melody E1 ringer

Our Melody E1 ringer implementation will require melody files in FFS, and we
will also have a separate audio mode (in the RiViera Audio Service sense) that
will be loaded during ringing.  Even though the same physical loudspeaker will
be used for both hands-free calls and ringing, logically the two are separate
modes, and they will be treated as separate for the Audio Service.  Separate
logical modes will provide separate volume files, which is the correct approach:
loudspeaker volume and ringing volume should be separate, just like how ringing
volume is entirely separate when a buzzer is used.

2.5. Vibrating alert

Our FC handset firmware will support both ringing and vibrating alert modes (as
well as a ring+vibrate mode) on all targets.  The vibrator will be modeled as a
simple on/off control (no "analog" control of different vibration intensity
levels, at least initially), and the vibrating alert code path will ultimately
boil down to a driver function call for vibrator on/off.  Therefore, if the
vibrator does not exist on a given target, or if it exists but we don't know how
to operate it, the on/off control function can be empty on that target, and the
firmware will "vibrate" virtually.

On development boards such as FC Venus, the vibrator on/off function can turn a
LED on and off to provide an indication of the UI layers making a vibrating
alert.