|
| 1 | +/** |
| 2 | + * @file lvgl_helpers.c |
| 3 | + * |
| 4 | + */ |
| 5 | + |
| 6 | +/********************* |
| 7 | + * INCLUDES |
| 8 | + *********************/ |
| 9 | +#include "sdkconfig.h" |
| 10 | +#include "lvgl_helpers.h" |
| 11 | +#include "esp_log.h" |
| 12 | + |
| 13 | +#include "lvgl_tft/disp_spi.h" |
| 14 | +#include "lvgl_touch/tp_spi.h" |
| 15 | + |
| 16 | +#include "lvgl_spi_conf.h" |
| 17 | +#include "lvgl_i2c_conf.h" |
| 18 | + |
| 19 | +#include "driver/i2c.h" |
| 20 | + |
| 21 | +#include "lvgl/src/lv_core/lv_refr.h" |
| 22 | + |
| 23 | +/********************* |
| 24 | + * DEFINES |
| 25 | + *********************/ |
| 26 | + |
| 27 | + #define TAG "lvgl_helpers" |
| 28 | + |
| 29 | +/********************** |
| 30 | + * TYPEDEFS |
| 31 | + **********************/ |
| 32 | + |
| 33 | +/********************** |
| 34 | + * STATIC PROTOTYPES |
| 35 | + **********************/ |
| 36 | + |
| 37 | +/********************** |
| 38 | + * STATIC VARIABLES |
| 39 | + **********************/ |
| 40 | + |
| 41 | +/********************** |
| 42 | + * MACROS |
| 43 | + **********************/ |
| 44 | + |
| 45 | +/********************** |
| 46 | + * GLOBAL FUNCTIONS |
| 47 | + **********************/ |
| 48 | + |
| 49 | +/* Interface and driver initialization */ |
| 50 | +void lvgl_driver_init(void) |
| 51 | +{ |
| 52 | + ESP_LOGI(TAG, "Display hor size: %d, ver size: %d", LV_HOR_RES_MAX, LV_VER_RES_MAX); |
| 53 | + ESP_LOGI(TAG, "Display buffer size: %d", DISP_BUF_SIZE); |
| 54 | + |
| 55 | +#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) |
| 56 | + ESP_LOGI(TAG, "Initializing SPI master for FT81X"); |
| 57 | + |
| 58 | + lvgl_spi_driver_init(TFT_SPI_HOST, |
| 59 | + DISP_SPI_MISO, DISP_SPI_MOSI, DISP_SPI_CLK, |
| 60 | + SPI_BUS_MAX_TRANSFER_SZ, 1, |
| 61 | + DISP_SPI_IO2, DISP_SPI_IO3); |
| 62 | + |
| 63 | + disp_spi_add_device(TFT_SPI_HOST); |
| 64 | + disp_driver_init(); |
| 65 | + |
| 66 | +#if defined (CONFIG_LV_TOUCH_CONTROLLER_FT81X) |
| 67 | + touch_driver_init(); |
| 68 | +#endif |
| 69 | + |
| 70 | + return; |
| 71 | +#endif |
| 72 | + |
| 73 | +#if defined (SHARED_SPI_BUS) |
| 74 | + ESP_LOGI(TAG, "Initializing shared SPI master"); |
| 75 | + |
| 76 | + lvgl_spi_driver_init(TFT_SPI_HOST, |
| 77 | + TP_SPI_MISO, DISP_SPI_MOSI, DISP_SPI_CLK, |
| 78 | + SPI_BUS_MAX_TRANSFER_SZ, 1, |
| 79 | + -1, -1); |
| 80 | + |
| 81 | + disp_spi_add_device(TFT_SPI_HOST); |
| 82 | + tp_spi_add_device(TOUCH_SPI_HOST); |
| 83 | + |
| 84 | + disp_driver_init(); |
| 85 | + touch_driver_init(); |
| 86 | + |
| 87 | + return; |
| 88 | +#endif |
| 89 | + |
| 90 | +#if defined (SHARED_I2C_BUS) |
| 91 | + ESP_LOGI(TAG, "Initializing shared I2C master"); |
| 92 | + |
| 93 | + lvgl_i2c_driver_init(DISP_I2C_PORT, |
| 94 | + DISP_I2C_SDA, DISP_I2C_SCL, |
| 95 | + DISP_I2C_SPEED_HZ); |
| 96 | + |
| 97 | + disp_driver_init(); |
| 98 | + touch_driver_init(); |
| 99 | + |
| 100 | + return; |
| 101 | +#endif |
| 102 | + |
| 103 | +/* Display controller initialization */ |
| 104 | +#if defined CONFIG_LV_TFT_DISPLAY_PROTOCOL_SPI |
| 105 | + ESP_LOGI(TAG, "Initializing SPI master for display"); |
| 106 | + |
| 107 | + lvgl_spi_driver_init(TFT_SPI_HOST, |
| 108 | + DISP_SPI_MISO, DISP_SPI_MOSI, DISP_SPI_CLK, |
| 109 | + SPI_BUS_MAX_TRANSFER_SZ, 1, |
| 110 | + DISP_SPI_IO2, DISP_SPI_IO3); |
| 111 | + |
| 112 | + disp_spi_add_device(TFT_SPI_HOST); |
| 113 | + |
| 114 | + disp_driver_init(); |
| 115 | +#elif defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_I2C) |
| 116 | + ESP_LOGI(TAG, "Initializing I2C master for display"); |
| 117 | + /* Init the i2c master on the display driver code */ |
| 118 | + lvgl_i2c_driver_init(DISP_I2C_PORT, |
| 119 | + DISP_I2C_SDA, DISP_I2C_SCL, |
| 120 | + DISP_I2C_SPEED_HZ); |
| 121 | + |
| 122 | + disp_driver_init(); |
| 123 | +#else |
| 124 | +#error "No protocol defined for display controller" |
| 125 | +#endif |
| 126 | + |
| 127 | +/* Touch controller initialization */ |
| 128 | +#if CONFIG_LV_TOUCH_CONTROLLER != TOUCH_CONTROLLER_NONE |
| 129 | + #if defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_SPI) |
| 130 | + ESP_LOGI(TAG, "Initializing SPI master for touch"); |
| 131 | + |
| 132 | + lvgl_spi_driver_init(TOUCH_SPI_HOST, |
| 133 | + TP_SPI_MISO, TP_SPI_MOSI, TP_SPI_CLK, |
| 134 | + 0 /* Defaults to 4094 */, 2, |
| 135 | + -1, -1); |
| 136 | + |
| 137 | + tp_spi_add_device(TOUCH_SPI_HOST); |
| 138 | + |
| 139 | + touch_driver_init(); |
| 140 | + #elif defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_I2C) |
| 141 | + ESP_LOGI(TAG, "Initializing I2C master for touch"); |
| 142 | + |
| 143 | + lvgl_i2c_driver_init(TOUCH_I2C_PORT, |
| 144 | + TOUCH_I2C_SDA, TOUCH_I2C_SCL, |
| 145 | + TOUCH_I2C_SPEED_HZ); |
| 146 | + |
| 147 | + touch_driver_init(); |
| 148 | + #elif defined (CONFIG_LV_TOUCH_DRIVER_ADC) |
| 149 | + touch_driver_init(); |
| 150 | + #elif defined (CONFIG_LV_TOUCH_DRIVER_DISPLAY) |
| 151 | + touch_driver_init(); |
| 152 | + #else |
| 153 | + #error "No protocol defined for touch controller" |
| 154 | + #endif |
| 155 | +#else |
| 156 | +#endif |
| 157 | +} |
| 158 | + |
| 159 | +/* Config the i2c master |
| 160 | + * |
| 161 | + * This should init the i2c master to be used on display and touch controllers. |
| 162 | + * So we should be able to know if the display and touch controllers shares the |
| 163 | + * same i2c master. |
| 164 | + */ |
| 165 | +bool lvgl_i2c_driver_init(int port, int sda_pin, int scl_pin, int speed_hz) |
| 166 | +{ |
| 167 | + esp_err_t err; |
| 168 | + |
| 169 | + ESP_LOGI(TAG, "Initializing I2C master port %d...", port); |
| 170 | + ESP_LOGI(TAG, "SDA pin: %d, SCL pin: %d, Speed: %d (Hz)", |
| 171 | + sda_pin, scl_pin, speed_hz); |
| 172 | + |
| 173 | + i2c_config_t conf = { |
| 174 | + .mode = I2C_MODE_MASTER, |
| 175 | + .sda_io_num = sda_pin, |
| 176 | + .sda_pullup_en = GPIO_PULLUP_ENABLE, |
| 177 | + .scl_io_num = scl_pin, |
| 178 | + .scl_pullup_en = GPIO_PULLUP_ENABLE, |
| 179 | + .master.clk_speed = speed_hz, |
| 180 | + }; |
| 181 | + |
| 182 | + ESP_LOGI(TAG, "Setting I2C master configuration..."); |
| 183 | + err = i2c_param_config(port, &conf); |
| 184 | + assert(ESP_OK == err); |
| 185 | + |
| 186 | + ESP_LOGI(TAG, "Installing I2C master driver..."); |
| 187 | + err = i2c_driver_install(port, |
| 188 | + I2C_MODE_MASTER, |
| 189 | + 0, 0 /*I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE */, |
| 190 | + 0 /* intr_alloc_flags */); |
| 191 | + assert(ESP_OK == err); |
| 192 | + |
| 193 | + return ESP_OK != err; |
| 194 | +} |
| 195 | + |
| 196 | +/* Initialize spi bus master */ |
| 197 | +bool lvgl_spi_driver_init(int host, |
| 198 | + int miso_pin, int mosi_pin, int sclk_pin, |
| 199 | + int max_transfer_sz, |
| 200 | + int dma_channel, |
| 201 | + int quadwp_pin, int quadhd_pin) |
| 202 | +{ |
| 203 | +#if defined (CONFIG_IDF_TARGET_ESP32) |
| 204 | + assert((SPI_HOST <= host) && (VSPI_HOST >= host)); |
| 205 | + const char *spi_names[] = { |
| 206 | + "SPI_HOST", "HSPI_HOST", "VSPI_HOST" |
| 207 | + }; |
| 208 | +#elif defined (CONFIG_IDF_TARGET_ESP32S2) |
| 209 | + assert((SPI_HOST <= host) && (HSPI_HOST >= host)); |
| 210 | + const char *spi_names[] = { |
| 211 | + "SPI_HOST", "", "" |
| 212 | + }; |
| 213 | +#endif |
| 214 | + |
| 215 | + ESP_LOGI(TAG, "Configuring SPI host %s (%d)", spi_names[host], host); |
| 216 | + ESP_LOGI(TAG, "MISO pin: %d, MOSI pin: %d, SCLK pin: %d, IO2/WP pin: %d, IO3/HD pin: %d", |
| 217 | + miso_pin, mosi_pin, sclk_pin, quadwp_pin, quadhd_pin); |
| 218 | + |
| 219 | + ESP_LOGI(TAG, "Max transfer size: %d (bytes)", max_transfer_sz); |
| 220 | + |
| 221 | + spi_bus_config_t buscfg = { |
| 222 | + .miso_io_num = miso_pin, |
| 223 | + .mosi_io_num = mosi_pin, |
| 224 | + .sclk_io_num = sclk_pin, |
| 225 | + .quadwp_io_num = quadwp_pin, |
| 226 | + .quadhd_io_num = quadhd_pin, |
| 227 | + .max_transfer_sz = max_transfer_sz |
| 228 | + }; |
| 229 | + |
| 230 | + ESP_LOGI(TAG, "Initializing SPI bus..."); |
| 231 | + esp_err_t ret = spi_bus_initialize(host, &buscfg, dma_channel); |
| 232 | + assert(ret == ESP_OK); |
| 233 | + |
| 234 | + return ESP_OK != ret; |
| 235 | +} |
| 236 | + |
0 commit comments