view Calypso-PWM-light @ 105:72a272083f46

Linux-DTR-RTS-flaw: link to new fc-linux-patch repository
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 11 Dec 2023 19:02:01 +0000
parents 1cdd0f0a6e70
children
line wrap: on
line source

The Calypso chip has a PWM light output called LT/PWL - a digital output pin
that can be configured as either LT or PWL.  The documentation we got from TI
is not exhaustively complete in describing the exact behaviour and output
waveforms of these two modes, thus I (Mother Mychaela) did a little bit of lab
experimentation to complete the picture.  All experimental observations were
made with an oscilloscope probe placed on the LT/PWL signal on a FreeCalypso
Caramel2 board.

LT mode
=======

LT functionality of the LT/PWL output is implemented in the ARMIO block,
together with GPIO and keypad functions.  LT output stays at constant low level
(zero light) only when the LIGHT bit in BUZZ_LIGHT_REG (FFFE:480E) is cleared;
if the LIGHT bit is set, then a small amount of light will be emitted even if
LIGHT_LEVEL_REG is set to 0, contrary to CAL207 document saying "no light" in
this case.  Light levels 0 through 63 as written into LIGHT_LEVEL_REG really
correspond to 1/64 through 64/64 in terms of the actual emitted PWM duty cycles.
If the register is written with the maximum light level of 63, then LT output
is a continuous high level, with no o'scope-observable PWM activity.  If the
register is written with any other value, then PWM activity becomes visible on
an oscilloscope, with each full cycle period equal to 64 periods of CLK13M,
i.e., PWM frequency equals 203.125 kHz, the master 13 MHz clock divided by 64.
The shape of this PWM output is totally straightforward: if LIGHT_LEVEL_REG is
set to 0, LT output is high for one CLK13M period and low for 63 periods, then
repeat; if LIGHT_LEVEL_REG is set to 1, LT output is high for 2 CLK13M periods
and low for 62 periods, and so forth, with LIGHT_LEVEL_REG set to 63 resulting
in LT being high in all 64 slots, i.e., continuous high output with no visible
PWM activity.

PWL mode
========

The description of PWL in the CAL207 document is reasonably good; only a few
additional notes need to be made:

* By the fundamental principles of how all LFSRs work, an LFSR of N bits CANNOT
  have a period of 2**N, instead the greatest period that can be achieved with
  careful choice of polynomial is 2**N-1.  Calypso PWL block features an 8-bit
  LFSR, TI's choice of polynomial (hard-wired in the silicon) is a proper one,
  thus the period is 255.

* Two alternate hw implementations are possible: XOR implementation would
  produce an LFSR with valid values [1,255], whereas XNOR implementation would
  produce an LFSR with valid values [0,254].  Obviously we have no way to look
  inside Calypso silicon, but the visible behaviour with different comparator
  values suggests that the internal LFSR runs in the [1,255] range.  There must
  be some reset logic in the hw that prevents a stuck value of 0.

* The visible output on the PWL pin repeats every 255 cycles of CLK32K, and the
  average light intensity ranges from 0/255 to 254/255 in 1/255 steps.  If
  PWL_LEVEL_REG is set to either 0 or 1, PWL output is continuous low; if the
  register is set to 2, PWL output is 1/255 (on for just one CLK32K cycle out of
  255), and if the register is set to maximum of 255, PWL output is NOT
  continuous high as CAL207 claims, but instead it is 254/255, i.e., on for 254
  out of every 255 CLK32K periods.

Deep sleep interaction
======================

LT mode uses CLK13M, thus it is incompatible with deep sleep.  PWL uses CLK32K
instead, thus deep sleep is perfectly OK with this light on.