OBC OpenBikeComputer / docs

Display protocol

The device uses a Sharp LS021B7DD02 reflective memory-in-pixel LCD. The panel has 240 × 320 pixels.

Each subpixel has a one-bit latch. The panel retains the image without scan traffic.

The framebuffer uses RGB222. Each channel has four levels, and each pixel has 64 possible colors.

The FLPR writes pixels through a six-bit parallel bus. The M33 generates the continuous polarity waveform.

Signal paths

Two independent signal paths Path A · image write — intermittent gate scan GSP · GCK · GEN · INTB source shift BSP · BCK · R/G/B[0:1] write 1 bit subpixel latch one bit, on glass held without a scan selects a rail Path B · polarity — ~60 Hz VCOM VB VA VB in phase with VCOM · VA inverse → drives the LC (never DC)
Path A writes the pixel latches. Path B continuously drives the liquid crystal at approximately 60 Hz. A stored bit selects the VA or VB rail.

Do not stop VCOM, VA, or VB while the panel has power. A DC bias can damage the liquid crystal.

The hardware timer generates this waveform independently of the scan operation.

Pixel encoding

The panel makes four levels with area gradation. Each subpixel contains a large block and a small block.

One pixel cell — three stacked bands R G B MSB band LSB band MSB band MSB plane 2/3 area · top + bottom LSB plane 1/3 area · middle
The connected MSB bands cover two-thirds of the subpixel. The LSB band covers one-third. The two bits give four visible levels.

Each two-bit channel has this mapping:

Level l(MSB, LSB)Lit areaAppears as
0(0, 0)0black
1(0, 1)1/3LSB / middle band
2(1, 0)2/3MSB / top + bottom
3(1, 1)3/3full (channel on)

Use msb = (l >> 1) & 1 and lsb = l & 1. The packer does not need a lookup table.

Source-bus interleave

The six data lines carry one bit for each channel of two adjacent pixels.

LinesPixelChannel
R[0] G[0] B[0]even columnR / G / B
R[1] G[1] B[1]odd columnR / G / B

Each BCK edge clocks one pixel pair. Thus, 120 pairs require 60 BCK cycles.

Present a new pair before each rising and falling edge. Do not hold one pair for a complete cycle.

Gate scan

The display has one gate line for each of its 320 rows. Write both area planes to the same gate line.

  • GCK HIGH selects the two-thirds MSB block.
  • GCK LOW selects the one-third LSB block.

One GCK period writes one row. The rising edge advances the gate. The falling edge keeps the same gate selected.

One pixel row = one GCK period GCK MSB phase · GCK HIGH shift MSB plane → 2/3 block LSB phase · GCK LOW shift LSB plane → 1/3 block GEN latch 2/3 latch 1/3 advance + MSB next row one gate advance per pixel row · two GEN pulses per row
Send the MSB plane while GCK is high. Send the LSB plane while GCK is low. Pulse GEN after each plane.

Writing a frame

A frame scans the 320 rows. Keep INTB high for the complete scan.

INTB = HIGH
GSP = pulse
send two leading dummy gate periods
for each row:
    set GCK HIGH
    shift the MSB plane
    pulse GEN
    set GCK LOW
    shift the LSB plane
    pulse GEN
send six trailing dummy gate periods
INTB = LOW
  • INTB LOW holds the current image.
  • One GCK period advances one row.
  • Each row uses two GEN pulses.
  • Each plane uses 120 data words and four dummy words.
  • Pulse GSP at the start. Release it on the first GCK edge.

Partial update

The presenter compares row hashes and sends changed row spans to the FLPR. The FLPR advances past unchanged rows without GEN pulses.

The FLPR writes all 240 columns of each changed row. It stops after the last changed row.

Thus, the scan time depends mainly on the number and position of changed rows.

Power-on, power-off, and retention

  • During power-on, write a black frame. Wait at least 30 µs, and then start the COM waveform.
  • During power-off, write the safe state before you stop the COM waveform.
  • Refresh a static image at least once every two days.

Signal & timing reference

Pins

SignalGroupRailRole
GSPGateVDD2 (~5.0 V)Gate start pulse — once per frame
GCKGateVDD2Gate clock and MSB/LSB phase select (HIGH = MSB/⅔, LOW = LSB/⅓); one period per row
GENGateVDD2Gate output enable — pulsed once per phase to latch the selected block
INTBGateVDD2Frame envelope — HIGH for the whole frame; LOW = Hold (no write)
BSPSourceVDD1 (~3.2 V)Sub-line (start-of-line) pulse
BCKSourceVDD1Source shift clock; 124 edge words per plane
R[0] G[0] B[0]Source dataVDD1Even-column R/G/B bit
R[1] G[1] B[1]Source dataVDD1Odd-column R/G/B bit
VCOMCOMCommon AC reference (free-running ~60 Hz)
VBCOMIn phase with VCOM — the "black" rail
VACOMInverse of VCOM — the "white" rail

Timing

ParameterValueNotes
BCK max frequency0.758 MHzSource/shift clock ceiling
BCK minimum high / low660 ns eachDatasheet limit
COM frequency54–66 Hz (60 typ)48–52 % duty
COM edge (rise/fall)≤ 100 µsInto ~56–77 nF per line; high-drive GPIO / buffer as needed
GCKGEN setup & hold≥ 16.37 µsKeep GEN clear of GCK edges
GEN high width≥ 24.56 µsValid-output / latch window
Power-on settle (black → COM)≥ 30 µsSee power-on order above
Current full-frame scan44.1 msMeasured on one development panel

The current FLPR uses approximately 210 ns for each BCK half-period. This gives a 420 ns period and approximately 2.38 MHz. It exceeds the 0.758 MHz maximum and violates the 660 ns minimum high and low times.

This timing passed a visual test on one panel at room temperature. It is not production validation. See the timing record.

Power

The datasheet gives these typical module values. The values exclude COM capacitive-load current.

StatePower
Hold / static≈ 32 µW
1 Hz update≈ 45 µW
30 Hz update≈ 290 µW

Power increases with the update rate. Partial updates reduce the number of rows that the FLPR writes.

Implementation