pub struct DisplayMemory<const W: usize, const H: usize, const B: usize> where
    [(); { _ }]: Sized
{ /* private fields */ }
Expand description

Backing storage for the framebuffers

Memory layout

The pixel buffer is organized in a way way so that transmiting the content of it requires no manipulation on the PIO.

PIO reads the pixel buffer one byte at a time from low to high, then shifts out the pixels from left to right.

Pixel tuple

At the lowest level, every byte in the buffer contains a so called pixel tuple. Within a tuple you will find the nth bit of the R/G/B-componts of two colors. The reason for packing two colors together is the scan rate of the display. The display this library is targetting is has a 1:16 scan rate, which means that when you are addressing a pixel at row 0, you are at the same time addressing a pixel in the same column at row 16.

The tuple has the following structure:

XXBGRBGR
--222111

Currently we are wasting two bits per tuple (byte) – marked as X above.

Buffer structure

The diagram below attempts to visualize the structure of the buffer for a 64x32 display configured for 24 bit color depth. X, Y are the pixel coordinates on the screen and N stands for the big-endian position of the bit in the color to be displayed.

  N           8                                               1             0
  X   |      63|   |       3        2|       1|       0|      63|   |       0|
Y   0 |XXBGRBGR|...|XXBGRBGR|XXBGRBGR|XXBGRBGR|XXBGRBGR|XXBGRBGR|...|XXBGRBGR|
      |XX222111|...|XX222111|XX222111|XX222111|XX222111|XX222111|...|XX222111|
      |XX000000|...|XX000000|XX000000|XX000000|XX000000|XX000000|...|XX000000|
      |--------|...|--------|--------|--------|--------|--------|...|--------|
Y   1 |XXBGRBGR|...|XXBGRBGR|XXBGRBGR|XXBGRBGR|XXBGRBGR|XXBGRBGR|...|XXBGRBGR|
      |XX222111|...|XX222111|XX222111|XX222111|XX222111|XX222111|...|XX222111|
      |XX000000|...|XX000000|XX000000|XX000000|XX000000|XX000000|...|XX000000|
      |--------|...|--------|--------|--------|--------|--------|...|--------|
      .................................................|.....................|
      .................................................|.....................|
      .................................................|.....................|
Y  15 |XXBGRBGR|...|XXBGRBGR|XXBGRBGR|XXBGRBGR|XXBGRBGR|XXBGRBGR|...|XXBGRBGR|
      |XX222111|...|XX222111|XX222111|XX222111|XX222111|XX222111|...|XX222111|
      |XX000000|...|XX000000|XX000000|XX000000|XX000000|XX000000|...|XX000000|
      |--------|...|--------|--------|--------|--------|--------|...|--------|

Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Casts the value.

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Casts the value.

Casts the value.

Casts the value.

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Casts the value.

Casts the value.

Casts the value.

Casts the value.

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.

Casts the value.

Casts the value.

Casts the value.

Casts the value.