# MIPI DSI abstraction
[](https://components.espressif.com/components/nicolaielectronics/esp32-component-mipi-dsi-abstraction)
Abstraction layer for quickly experimenting with MIPI DSI displays.
| LCD controller | Component name |
| :------------: | :-------------------------------: |
| EK79007 | esp_lcd_ek79007 |
| ILI9981C | esp_lcd_ili9981c |
| ST7701 | nicolaielectronics/esp_lcd_st7701 |
## Add to project
Packages from this repository are uploaded to [Espressif's component service](https://components.espressif.com/).
You can add them to your project via `idf.py add-dependancy`, e.g.
```
idf.py add-dependency "nicolaielectronics/mipi-dsi-abstraction"
```
Alternatively, you can create `idf_component.yml`. More is in [Espressif's documentation](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/tools/idf-component-manager.html).
## Example
```
/*
* SPDX-FileCopyrightText: 2024 Nicolai Electronics
* SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: CC0-1.0
*/
#include <stdio.h>
#include <string.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
#include "esp_timer.h"
#include "esp_lcd_panel_ops.h"
#include "esp_lcd_mipi_dsi.h"
#include "esp_ldo_regulator.h"
#include "driver/gpio.h"
#include "esp_err.h"
#include "esp_log.h"
#include "dsi_panel_espressif_ek79007.h"
#include "dsi_panel_espressif_ili9881c.h"
#include "dsi_panel_nicolaielectronics_st7701.h"
static const char *TAG = "example";
#define PANEL_MIPI_DSI_PHY_PWR_LDO_CHAN 3 // LDO_VO3 is connected to VDD_MIPI_DPHY
#define PANEL_MIPI_DSI_PHY_PWR_LDO_VOLTAGE_MV 2500
#define EXAMPLE_LCD_BK_LIGHT_ON_LEVEL 1
#define EXAMPLE_LCD_BK_LIGHT_OFF_LEVEL !EXAMPLE_LCD_BK_LIGHT_ON_LEVEL
#define EXAMPLE_PIN_NUM_BK_LIGHT 26
#define EXAMPLE_PIN_NUM_LCD_RST 27
void example_bsp_enable_dsi_phy_power(void) {
// Turn on the power for MIPI DSI PHY, so it can go from "No Power" state to "Shutdown" state
esp_ldo_channel_handle_t ldo_mipi_phy = NULL;
#ifdef PANEL_MIPI_DSI_PHY_PWR_LDO_CHAN
esp_ldo_channel_config_t ldo_mipi_phy_config = {
.chan_id = PANEL_MIPI_DSI_PHY_PWR_LDO_CHAN,
.voltage_mv = PANEL_MIPI_DSI_PHY_PWR_LDO_VOLTAGE_MV,
};
ESP_ERROR_CHECK(esp_ldo_acquire_channel(&ldo_mipi_phy_config, &ldo_mipi_phy));
ESP_LOGI(TAG, "MIPI DSI PHY Powered on");
#endif
}
static void example_bsp_init_lcd_backlight(void)
{
#if EXAMPLE_PIN_NUM_BK_LIGHT >= 0
gpio_config_t bk_gpio_config = {
.mode = GPIO_MODE_OUTPUT,
.pin_bit_mask = 1ULL << EXAMPLE_PIN_NUM_BK_LIGHT
};
ESP_ERROR_CHECK(gpio_config(&bk_gpio_config));
#endif
}
static void example_bsp_set_lcd_backlight(uint32_t level)
{
#if EXAMPLE_PIN_NUM_BK_LIGHT >= 0
gpio_set_level(EXAMPLE_PIN_NUM_BK_LIGHT, level);
#endif
}
typedef enum _display_type {
DISPLAY_TYPE_EK79007 = 0,
DISPLAY_TYPE_ILI9881C,
DISPLAY_TYPE_ST7701,
} display_type_t;
void app_main(void)
{
example_bsp_enable_dsi_phy_power();
example_bsp_init_lcd_backlight();
example_bsp_set_lcd_backlight(EXAMPLE_LCD_BK_LIGHT_OFF_LEVEL);
esp_lcd_panel_handle_t mipi_dpi_panel = NULL;
size_t h_res = 0;
size_t v_res = 0;
lcd_color_rgb_pixel_format_t color_fmt = LCD_COLOR_PIXEL_FORMAT_RGB565;
display_type_t display_type = DISPLAY_TYPE_ST7701;
switch (display_type) {
case DISPLAY_TYPE_EK79007:
ek79007_initialize(EXAMPLE_PIN_NUM_LCD_RST);
mipi_dpi_panel = ek79007_get_panel();
ek79007_get_parameters(&h_res, &v_res, &color_fmt);
break;
case DISPLAY_TYPE_ILI9881C:
ili9881c_initialize(EXAMPLE_PIN_NUM_LCD_RST);
mipi_dpi_panel = ili9881c_get_panel();
ili9881c_get_parameters(&h_res, &v_res, &color_fmt);
break;
case DISPLAY_TYPE_ST7701:
st7701_initialize(EXAMPLE_PIN_NUM_LCD_RST);
mipi_dpi_panel = st7701_get_panel();
st7701_get_parameters(&h_res, &v_res, &color_fmt);
break;
default:
ESP_LOGE(TAG, "Invalid display type");
return;
}
uint8_t bytes_per_pixel = 0;
switch (color_fmt) {
case LCD_COLOR_PIXEL_FORMAT_RGB565:
bytes_per_pixel = 2;
break;
case LCD_COLOR_PIXEL_FORMAT_RGB666:
bytes_per_pixel = 3;
break;
case LCD_COLOR_PIXEL_FORMAT_RGB888:
bytes_per_pixel = 3;
break;
default:
ESP_LOGE(TAG, "Unsupported color format");
return;
}
size_t draw_buffer_sz = h_res * v_res * bytes_per_pixel;
uint8_t* buf1 = (uint8_t*) heap_caps_malloc(draw_buffer_sz, MALLOC_CAP_SPIRAM);
assert(buf1);
memset(buf1, 0xFF, draw_buffer_sz);
if (bytes_per_pixel == 2) {
for (size_t i = 0; i < draw_buffer_sz; i+=bytes_per_pixel) {
buf1[i+0] = 0x07;
buf1[i+1] = 0xe0;
}
} else if (bytes_per_pixel == 3) {
for (size_t i = 0; i < draw_buffer_sz; i+=bytes_per_pixel) {
buf1[i+0] = 0;
buf1[i+1] = 0;
buf1[i+2] = 0xff;
}
}
esp_lcd_panel_draw_bitmap(mipi_dpi_panel, 0, 0, h_res - 1, v_res - 1, buf1);
example_bsp_set_lcd_backlight(EXAMPLE_LCD_BK_LIGHT_ON_LEVEL);
}
```
bed57b83696979726f44d5b6aa7617b0b582f5a3
idf.py add-dependency "nicolaielectronics/mipi_dsi_abstraction^0.0.1"