Unit HyperPixel
Return to Unit Reference
Description
Pimoroni HyperPixel TFT Display Driver unit
The HyperPixel is a TFT display produced by Pimoroni for use with the Raspberry Pi. It uses the DPI (Display Parallel Interface) which is directly supported by the VideoCore GPU and means that unlike other TFT displays using SPI or similar interfaces it supports hardware accelerated graphics in the same way as HDMI or DSI displays.
The HyperPixel is available in several versions including a 4.0 inch rectangular, a 4.0 inch square and 2.1 inch round. Each version requires a slightly different set of instructions to initialize it and this unit provides the correct sequence for each of these displays.
To use this unit simply include it in your application and then call the function HyperPixelInitialize() as early as possible passing the appropriate model as the only parameter to the function. Once initialized successfully the HyperPixel display will be available via the standard framebuffer functions and also via the VC4 accelerated graphics options such as OpenVG, OpenGLES, OpenMAX and MMAL.
It is important to remember that no other devices should be enabled while using the HyperPixel display as it consumes almost all of the available GPIO pins. So it is not possible to use UART, I2C, SPI, PWM etc when the HyperPixel is installed.
The touch screen controller varies between models and this unit creates and initializes the appropriate one for the model selected. All touch screen devices are I2C based however as it is not possible to utilize the hardware I2C controller (see note above) a software I2C host is created to provide access to the touch screen.
The touch events generated from the device can be read from the normal touch or mouse API functions in much the same way as any other touch or mouse device.
In order to enable the HyperPixel display you need to add the appropriate settings to your config.txt file as follows:
For HyperPixel 4.0 Rectangular (800 x 480)
enable_dpi_lcd=1 dpi_group=2 dpi_mode=87 dpi_output_format=0x7f216 dpi_timings=480 0 10 16 59 800 0 15 113 15 0 0 0 60 0 32000000 6
For HyperPixel 4.0 Square (720 x 720)
enable_dpi_lcd=1 dpi_group=2 dpi_mode=87 dpi_output_format=0x7f226 dpi_timings=720 0 15 15 15 720 0 10 10 10 0 0 0 60 0 35113500 6
For HyperPixel 4.0 Square (2021 or later) (720 x 720)
enable_dpi_lcd=1 dpi_group=2 dpi_mode=87 dpi_output_format=0x5f026 dpi_timings=720 0 20 20 40 720 0 15 15 15 0 0 0 60 0 36720000 4
For HyperPixel 2.1 Round (480 x 480)
enable_dpi_lcd=1 dpi_group=2 dpi_mode=87 dpi_output_format=0x7f216 dpi_timings=480 0 10 16 55 480 0 15 60 15 0 0 0 60 0 19200000 6
The display can be rotated to the desired position by adding the display_lcd_rotate setting to the config.txt file as below, please see the official documentation at https://www.raspberrypi.com/documentation/computers/config_txt.html for more details.
No Rotation
display_lcd_rotate=0
Rotate 90 degrees clockwise
display_lcd_rotate=1
Rotate 180 degrees clockwise
display_lcd_rotate=2
Rotate 270 degrees clockwise
display_lcd_rotate=3
Horizontal flip
display_lcd_rotate=0x10000
Vertical flip
display_lcd_rotate=0x20000
Constants
HYPERPIXEL*
HYPERPIXEL40_RECTANGLE = 0;
|
|
HYPERPIXEL40_SQUARE = 1;
|
|
HYPERPIXEL40_SQUARE2021 = 2;
|
|
HYPERPIXEL21_ROUND = 3;
|
HYPERPIXEL_GPIO_*
HYPERPIXEL_GPIO_PIN_FUNCTION = GPIO_FUNCTION_ALT2;
|
||
HYPERPIXEL_GPIO_PIN_PULL = GPIO_PULL_NONE;
|
||
HYPERPIXEL_GPIO_PIN_COUNT = 22;
|
||
HYPERPIXEL_GPIO_PINS:array[0..HYPERPIXEL_GPIO_PIN_COUNT - 1] of LongWord = (GPIO_PIN_0, GPIO_PIN_1, GPIO_PIN_2, GPIO_PIN_3, GPIO_PIN_4, GPIO_PIN_5, GPIO_PIN_6, GPIO_PIN_7, GPIO_PIN_8, GPIO_PIN_9, GPIO_PIN_12, GPIO_PIN_13, GPIO_PIN_14, GPIO_PIN_15, GPIO_PIN_16, GPIO_PIN_17, GPIO_PIN_20, GPIO_PIN_21, GPIO_PIN_22, GPIO_PIN_23, GPIO_PIN_24, GPIO_PIN_25);
|
HYPERPIXEL_SPI_*
HYPERPIXEL_SPI_FUNCTION = GPIO_FUNCTION_OUT;
|
|
HYPERPIXEL_SPI_PULL = GPIO_PULL_NONE;
|
|
HYPERPIXEL_SPI_CLK = GPIO_PIN_27;
|
|
HYPERPIXEL_SPI_MOSI = GPIO_PIN_26;
|
|
HYPERPIXEL_SPI_CS = GPIO_PIN_18;
|
|
HYPERPIXEL_SPI_DELAY = 100;
|
Clock pulse time in microseconds |
HYPERPIXEL_SPI_WAIT = 120;
|
Wait time in milliseconds before display on |
HYPERPIXEL_SPI_DELAY_ALT = 10;
|
Clock pulse time in microseconds (Rectangle model) |
HYPERPIXEL_SPI_WAIT_ALT = 200;
|
Wait time in milliseconds before display on (Rectangle model) |
HYPERPIXEL_I2C_*
HYPERPIXEL_I2C_SDA = GPIO_PIN_10;
|
|
HYPERPIXEL_I2C_SCL = GPIO_PIN_11;
|
|
HYPERPIXEL_I2C_DELAY = 4;
|
HYPERPIXEL_BACKLIGHT_*
HYPERPIXEL_BACKLIGHT_FUNCTION = GPIO_FUNCTION_OUT;
|
|
HYPERPIXEL_BACKLIGHT_PULL = GPIO_PULL_NONE;
|
|
HYPERPIXEL_BACKLIGHT_PIN = GPIO_PIN_19;
|
HYPERPIXEL_TOUCH_*
HYPERPIXEL_TOUCH_INTERRUPT_FUNCTION = GPIO_FUNCTION_IN;
|
|
HYPERPIXEL_TOUCH_INTERRUPT_PULL = GPIO_PULL_UP;
|
|
HYPERPIXEL_TOUCH_INTERRUPT_PIN = GPIO_PIN_27;
|
Type definitions
HyperPixel specific types
PHyperPixelData = ^THyperPixelData;
THyperPixelData = record
Software SPI Data | |
Device:PGPIODevice;
|
The GPIO device to use |
FSEL:LongWord;
|
The GPIO function select value |
PULL:LongWord;
|
The GPIO pull select value |
CLK:LongWord;
|
The CLK pin for software SPI |
MOSI:LongWord;
|
The MOSI pin for software SPI |
CS:LongWord;
|
The CS pin for software SPI |
Wait:LongWord;
|
Wait time in milliseconds before display on |
Delay:LongWord;
|
Clock delay time in microseconds |
Public variables
None defined
Function declarations
HyperPixel functions
function HyperPixelInitialize(Model:LongWord):LongWord;
Model | The model of display to be initialized (eg HYPERPIXEL40_SQUARE) |
---|---|
Return | ERROR_SUCCESS on successful completion or another error code on failure |
Note | No attempt is made to determine if the model specified matches with the attached display. It is the users responsibility to specify the correct model. |
HyperPixel helper functions
function HyperPixelSPISetup(Data:PHyperPixelData):LongWord;
Data | A pointer to a THyperPixelData structure containing the configuration |
---|---|
Return | ERROR_SUCCESS on successful completion or another error code on failure |
function HyperPixelSPICleanup(Data:PHyperPixelData):LongWord;
Data | A pointer to the THyperPixelData structure used to configure the SPI |
---|---|
Return | ERROR_SUCCESS on successful completion or another error code on failure |
procedure HyperPixelSPIWriteBit(Data:PHyperPixelData; Value:Byte);
Data | A pointer to the THyperPixelData structure used to configure the SPI |
---|---|
Value | The bit value to write (0 or 1) |
Note | Used primarily for HyperPixel 4.0 Rectangle |
procedure HyperPixelSPIWriteByte(Data:PHyperPixelData; Value:Byte);
Data | A pointer to the THyperPixelData structure used to configure the SPI |
---|---|
Value | The byte value to write |
Note | Used primarily for HyperPixel 4.0 Rectangle |
procedure HyperPixelSPIWriteRegister(Data:PHyperPixelData; Reg,Value:Byte);
Data | A pointer to the THyperPixelData structure used to configure the SPI |
---|---|
Reg | The register to be selected |
Value | The byte value to write |
Note | Used primarily for HyperPixel 4.0 Rectangle |
procedure HyperPixelSPISoftReset(Data:PHyperPixelData);
Data | A pointer to the THyperPixelData structure used to configure the SPI |
---|---|
Note | Used primarily for HyperPixel 4.0 Rectangle |
procedure HyperPixelSPISelectPage(Data:PHyperPixelData; Number:Byte);
Data | A pointer to the THyperPixelData structure used to configure the SPI |
---|---|
Number | The page number to select |
Note | Used primarily for HyperPixel 4.0 Rectangle |
procedure HyperPixelSPIWriteBits(Data:PHyperPixelData; Value,Count:Word);
Data | A pointer to the THyperPixelData structure used to configure the SPI |
---|---|
Value | The value containing the bits to be written |
Count | The number of bits to write |
Note | Used primarily for HyperPixel 2.1 Round and 4.0 Square |
procedure HyperPixelSPIWriteCommand(Data:PHyperPixelData; Command:Word);
Data | A pointer to the THyperPixelData structure used to configure the SPI |
---|---|
Command | The command to be written |
Note | Used primarily for HyperPixel 2.1 Round and 4.0 Square |
Return to Unit Reference