An example wave form is show below :
Note this is just an illustration of BCM modulation and control for these panels and is not a cycle accurate representation of the signals generated by this driver.
General principle is :
This driver supports to have a minimum bit length for the BCM to be shorter than the time it takes to shift in the data and it will drive the blanking signal accordingly. The compromise in this case is the light efficiency is slightly reduced in favor of an increased refresh rate.
A tool to compute the timings you can achieve is provided in the sw/
subdirectory. And the length of the minimum BCM plane is controlled by
the cfg_bcm_bit_len
signal of hub75_top
.
A quick list of the modules and what they do :
Frame buffer logic : Described in more details here
hub75_fb_readout
hub75_fb_writein
hub75_framebuffer
hub75_linebuffer
Color Mapping : Converts from BITDEPTH
wide words to actual values used in BCM for each color
hub75_colormap
hub75_gamma
Low-level BCM driver
hub75_bcm
hub75_blanking
hub75_scan
hub75_shift
Top level from driver with frame buffer
hub75_top
The module hub75_top
provides an example on how to use the low level blocks
to make a full driver that uses a frame buffer and exposes a convenient
interface to write data and request frame swap.
It is fully configurable for various geometry of panels using the parameters :
N_BANKS
: How many rows are shifted/displayed in parallelN_ROWS
: The number of rows in each bank (i.e. the number of multiplexed rows)N_COLS
: The total number of columns in the chain of panelsN_CHANS
: How many channels, in general this is 3 for RGB panelsN_PLANES
: How many bitplanes are modulated using BCMBITDEPTH
: The width of each pixel color when fed in and store in the frame bufferThe low level modules can be used independently of the frame buffer if you
need to drive panels without a frame buffer. The way to use and connect them
is illustrated in the hub75_top
module.
You will then need to be able to provide the pixel values on demand. You can also just use a row buffer to make this easier (since the low level driver needs random access in rows without delays, it's easier to at least have a row buffer).
hub75_scan
: This is sort of the high level control and coordinates the
scanning of all the rows in the panel.hub75_bcm
: This controls the BCM modulation for each row following the
commands from the scan
module. It handles shifting the data,
controling the blanking and properly enabling the row driver.hub75_blanking
: This is the submodule that specifically handled the blanking
signal control for each BCM plane.hub75_shift
: This is the submodule that specifically handles the data
shifting.