74 lines
3.1 KiB
ReStructuredText
74 lines
3.1 KiB
ReStructuredText
=============================
|
|
ILI9341 LCD Controller driver
|
|
=============================
|
|
|
|
Overview
|
|
--------
|
|
|
|
The `ILI9341 <https://www.buydisplay.com/download/ic/ILI9341.pdf>`__ is a 262,144-color single-chip SOC driver for a-TFT liquid crystal display with resolution of 240RGBx320
|
|
dots, comprising a 720-channel source driver, a 320-channel gate driver, 172,800 bytes GRAM for graphic
|
|
display data of 240RGBx320 dots, and power supply circuit.
|
|
ILI9341 supports parallel 8-/9-/16-/18-bit data bus MCU interface, 6-/16-/18-bit data bus RGB interface and
|
|
3-/4-line serial peripheral interface (SPI).
|
|
|
|
The ILI9341 LCD controller `driver <https://github.com/lvgl/lvgl/src/drivers/display/ili9341>`__ is a platform-agnostic driver, based on the `generic MIPI driver <https://github.com/lvgl/lvgl/doc/integration/drivers/display/gen_mipi.rst>`__.
|
|
It implements display initialization, supports display rotation and implements the display flush callback. The user needs to implement only two platform-specific functions to send
|
|
a command or pixel data to the controller via SPI or parallel bus. Typically these are implemented by calling the appropriate SDK library functions on the given platform.
|
|
|
|
Prerequisites
|
|
-------------
|
|
|
|
There are no prerequisites.
|
|
|
|
Configuring the driver
|
|
----------------------
|
|
|
|
Enable the ILI9341 driver support in lv_conf.h, by cmake compiler define or by KConfig
|
|
|
|
.. code:: c
|
|
|
|
#define LV_USE_ILI9341 1
|
|
|
|
Usage
|
|
-----
|
|
|
|
You need to implement two platform-dependent functions:
|
|
|
|
.. code:: c
|
|
|
|
/* Send short command to the LCD. This function shall wait until the transaction finishes. */
|
|
int32_t my_lcd_send_cmd(lv_display_t *disp, const uint8_t *cmd, size_t cmd_size, const uint8_t *param, size_t param_size)
|
|
{
|
|
...
|
|
}
|
|
|
|
/* Send large array of pixel data to the LCD. If necessary, this function has to do the byte-swapping. This function can do the transfer in the background. */
|
|
int32_t my_lcd_send_color(lv_display_t *disp, const uint8_t *cmd, size_t cmd_size, uint8_t *param, size_t param_size)
|
|
{
|
|
...
|
|
}
|
|
|
|
To create an ILI9341-based display use the function
|
|
|
|
.. code:: c
|
|
|
|
/**
|
|
* Create an LCD display with ILI9341 driver
|
|
* @param hor_res horizontal resolution
|
|
* @param ver_res vertical resolution
|
|
* @param flags default configuration settings (mirror, RGB ordering, etc.)
|
|
* @param send_cmd platform-dependent function to send a command to the LCD controller (usually uses polling transfer)
|
|
* @param send_color platform-dependent function to send pixel data to the LCD controller (usually uses DMA transfer: must implement a 'ready' callback)
|
|
* @return pointer to the created display
|
|
*/
|
|
lv_display_t * lv_ili9341_create(uint32_t hor_res, uint32_t ver_res, lv_lcd_flag_t flags,
|
|
lv_ili9341_send_cmd_cb_t send_cmd_cb, lv_ili9341_send_color_cb_t send_color_cb);
|
|
|
|
|
|
For additional details and a working example see the `generic MIPI driver documentation <https://github.com/lvgl/lvgl/doc/integration/drivers/display/gen_mipi.rst>`__.
|
|
|
|
.. note::
|
|
|
|
You can find a step-by-step guide and the actual implementation of the callbacks on an STM32F746 using STM32CubeIDE and the ST HAL libraries here: :ref:`lcd_stm32_guide`
|
|
|