From 72308b90e73e8ea86f2baab4e3d973cadc3508bc Mon Sep 17 00:00:00 2001 From: William Emfinger Date: Tue, 14 Nov 2023 08:16:27 -0600 Subject: [PATCH 1/4] submodule(espp): update --- components/espp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/espp b/components/espp index da6c92e..3f13896 160000 --- a/components/espp +++ b/components/espp @@ -1 +1 @@ -Subproject commit da6c92e24cdf2eab37d7736a76a406c029879f23 +Subproject commit 3f1389615644e47e1b7f40296bc7982257d11034 From 9af0bacf12dd2d9f9b040650893fc9094f94512b Mon Sep 17 00:00:00 2001 From: William Emfinger Date: Tue, 14 Nov 2023 08:50:50 -0600 Subject: [PATCH 2/4] feat(hal): add support for Box-3 and LilyGo T-Deck (in addition to refactoring support for Box). Select one of the three hardware configurations via menuconfig. --- CMakeLists.txt | 2 +- main/Kconfig.projbuild | 13 +++++ main/box.hpp | 75 +++++++++++++++++++++++++ main/box_3.hpp | 75 +++++++++++++++++++++++++ main/lcd.cpp | 122 ++++++++++++++++++++--------------------- main/lcd.hpp | 3 - main/main.cpp | 5 -- main/tdeck.hpp | 83 ++++++++++++++++++++++++++++ 8 files changed, 307 insertions(+), 71 deletions(-) create mode 100644 main/box.hpp create mode 100644 main/box_3.hpp create mode 100644 main/tdeck.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 7d1d8ab..9bb4c39 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,7 @@ add_compile_definitions(BOARD_HAS_PSRAM) set( COMPONENTS - "main esptool_py esp_psram jpegdec task format monitor display_drivers wifi socket rtsp mdns" + "main esptool_py esp_psram jpegdec task format monitor i2c display_drivers input_drivers gt911 tt21100 wifi socket rtsp mdns" CACHE STRING "List of components to include" ) diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index 613f80c..df8c8e2 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -1,5 +1,18 @@ menu "Camera Display Configuration" + choice + prompt "Hardware Configuration" + default HARDWARE_BOX + help + Select the dev-kit / hardware you're using. + config HARDWARE_BOX + bool "ESP BOX" + config HARDWARE_BOX_3 + bool "ESP BOX 3" + config HARDWARE_TDECK + bool "LILYGO T DECK" + endchoice + config ESP_WIFI_SSID string "WiFi SSID" default "myssid" diff --git a/main/box.hpp b/main/box.hpp new file mode 100644 index 0000000..1cd38cf --- /dev/null +++ b/main/box.hpp @@ -0,0 +1,75 @@ +#pragma once + +#include "hal/spi_types.h" +#include "driver/gpio.h" +#include "driver/i2s_std.h" +#include "driver/spi_master.h" + +#include "i2c.hpp" +#include "st7789.hpp" +#include "touchpad_input.hpp" +#include "tt21100.hpp" + +namespace hal { + +static constexpr std::string_view dev_kit = "ESP32-S3-BOX"; + +// internal i2c (touchscreen, audio codec) +static constexpr auto internal_i2c_port = I2C_NUM_0; +static constexpr auto internal_i2c_clock_speed = 400 * 1000; +static constexpr gpio_num_t internal_i2c_sda = GPIO_NUM_8; +static constexpr gpio_num_t internal_i2c_scl = GPIO_NUM_18; + +// external I2c (peripherals) +static constexpr auto external_i2c_port = I2C_NUM_1; +static constexpr auto external_i2c_clock_speed = 400 * 1000; +static constexpr gpio_num_t external_i2c_sda = GPIO_NUM_41; +static constexpr gpio_num_t external_i2c_scl = GPIO_NUM_40; + +// LCD +static constexpr int lcd_clock_speed = 60 * 1000 * 1000; +static constexpr auto lcd_spi_num = SPI2_HOST; +static constexpr gpio_num_t lcd_cs = GPIO_NUM_5; +static constexpr gpio_num_t lcd_mosi = GPIO_NUM_6; +static constexpr gpio_num_t lcd_sclk = GPIO_NUM_7; +static constexpr gpio_num_t lcd_reset = GPIO_NUM_48; +static constexpr gpio_num_t lcd_dc = GPIO_NUM_4; +static constexpr gpio_num_t backlight = GPIO_NUM_45; +static constexpr size_t display_width = 320; +static constexpr size_t display_height = 240; +static constexpr bool backlight_value = true; +static constexpr bool reset_value = false; +static constexpr bool invert_colors = true; +static constexpr auto rotation = espp::Display::Rotation::LANDSCAPE; +static constexpr bool mirror_x = true; +static constexpr bool mirror_y = true; +using DisplayDriver = espp::St7789; + +// touch +static constexpr bool touch_swap_xy = false; +static constexpr bool touch_invert_x = true; +static constexpr bool touch_invert_y = false; +static constexpr gpio_num_t touch_interrupt = GPIO_NUM_3; +using TouchDriver = espp::Tt21100; + #define TOUCH_DRIVER_USE_WRITE 0 + #define TOUCH_DRIVER_USE_READ 1 + #define TOUCH_DRIVER_USE_WRITE_READ 0 + +// sound +static constexpr gpio_num_t sound_power_pin = GPIO_NUM_46; +static constexpr auto i2s_port = I2S_NUM_0; +static constexpr gpio_num_t i2s_mck_io = GPIO_NUM_2; +static constexpr gpio_num_t i2s_bck_io = GPIO_NUM_17; +static constexpr gpio_num_t i2s_ws_io = GPIO_NUM_47; +static constexpr gpio_num_t i2s_do_io = GPIO_NUM_15; +static constexpr gpio_num_t i2s_di_io = GPIO_NUM_16; +static constexpr gpio_num_t mute_pin = GPIO_NUM_1; + +// uSD card +static constexpr gpio_num_t sdcard_cs = GPIO_NUM_10; +static constexpr gpio_num_t sdcard_mosi = GPIO_NUM_11; +static constexpr gpio_num_t sdcard_miso = GPIO_NUM_13; +static constexpr gpio_num_t sdcard_sclk = GPIO_NUM_12; +static constexpr auto sdcard_spi_num = SPI3_HOST; + +} // namespace box_hal diff --git a/main/box_3.hpp b/main/box_3.hpp new file mode 100644 index 0000000..3d65335 --- /dev/null +++ b/main/box_3.hpp @@ -0,0 +1,75 @@ +#pragma once + +#include "hal/spi_types.h" +#include "driver/gpio.h" +#include "driver/i2s_std.h" +#include "driver/spi_master.h" + +#include "i2c.hpp" +#include "st7789.hpp" +#include "touchpad_input.hpp" +#include "gt911.hpp" + +namespace hal { + +static constexpr std::string_view dev_kit = "ESP32-S3-BOX-3"; + +// internal i2c (touchscreen, audio codec) +static constexpr auto internal_i2c_port = I2C_NUM_0; +static constexpr auto internal_i2c_clock_speed = 400 * 1000; +static constexpr gpio_num_t internal_i2c_sda = GPIO_NUM_8; +static constexpr gpio_num_t internal_i2c_scl = GPIO_NUM_18; + +// external I2c (peripherals) +static constexpr auto external_i2c_port = I2C_NUM_1; +static constexpr auto external_i2c_clock_speed = 400 * 1000; +static constexpr gpio_num_t external_i2c_sda = GPIO_NUM_41; +static constexpr gpio_num_t external_i2c_scl = GPIO_NUM_40; + +// LCD +static constexpr int lcd_clock_speed = 60 * 1000 * 1000; +static constexpr auto lcd_spi_num = SPI2_HOST; +static constexpr gpio_num_t lcd_cs = GPIO_NUM_5; +static constexpr gpio_num_t lcd_mosi = GPIO_NUM_6; +static constexpr gpio_num_t lcd_sclk = GPIO_NUM_7; +static constexpr gpio_num_t lcd_reset = GPIO_NUM_48; +static constexpr gpio_num_t lcd_dc = GPIO_NUM_4; +static constexpr gpio_num_t backlight = GPIO_NUM_47; // was 45 on ESP32-S3-BOX +static constexpr size_t display_width = 320; +static constexpr size_t display_height = 240; +static constexpr bool backlight_value = true; +static constexpr bool reset_value = true; // was false on ESP32-S3-BOX +static constexpr bool invert_colors = true; +static constexpr auto rotation = espp::Display::Rotation::LANDSCAPE; +static constexpr bool mirror_x = false; +static constexpr bool mirror_y = true; +using DisplayDriver = espp::St7789; + +// touch +static constexpr bool touch_swap_xy = false; +static constexpr bool touch_invert_x = false; +static constexpr bool touch_invert_y = false; +static constexpr gpio_num_t touch_interrupt = GPIO_NUM_3; +using TouchDriver = espp::Gt911; + #define TOUCH_DRIVER_USE_WRITE 1 + #define TOUCH_DRIVER_USE_READ 0 + #define TOUCH_DRIVER_USE_WRITE_READ 1 + +// sound +static constexpr gpio_num_t sound_power_pin = GPIO_NUM_46; +static constexpr auto i2s_port = I2S_NUM_0; +static constexpr gpio_num_t i2s_mck_io = GPIO_NUM_2; +static constexpr gpio_num_t i2s_bck_io = GPIO_NUM_17; +static constexpr gpio_num_t i2s_ws_io = GPIO_NUM_45; // was 47 on ESP32-S3-BOX +static constexpr gpio_num_t i2s_do_io = GPIO_NUM_15; +static constexpr gpio_num_t i2s_di_io = GPIO_NUM_16; +static constexpr gpio_num_t mute_pin = GPIO_NUM_1; + +// uSD card +static constexpr gpio_num_t sdcard_cs = GPIO_NUM_10; +static constexpr gpio_num_t sdcard_mosi = GPIO_NUM_11; +static constexpr gpio_num_t sdcard_miso = GPIO_NUM_13; +static constexpr gpio_num_t sdcard_sclk = GPIO_NUM_12; +static constexpr auto sdcard_spi_num = SPI3_HOST; + +} // namespace box_hal diff --git a/main/lcd.cpp b/main/lcd.cpp index 7c1217b..7e1b967 100644 --- a/main/lcd.cpp +++ b/main/lcd.cpp @@ -4,46 +4,49 @@ #include "driver/spi_master.h" #include "display.hpp" -#include "st7789.hpp" + +#if CONFIG_HARDWARE_BOX +#include "box.hpp" +#elif CONFIG_HARDWARE_BOX_3 +#include "box_3.hpp" +#elif CONFIG_HARDWARE_TDECK +#include "tdeck.hpp" +#else +#error "Invalid hardware configuration selected!" +#endif + +using namespace hal; static spi_device_handle_t spi; static constexpr size_t NUM_ROWS_IN_FRAME_BUFFER = 50; -static constexpr size_t display_width = 320; -static constexpr size_t display_height = 240; -static constexpr size_t pixel_buffer_size = display_width*NUM_ROWS_IN_FRAME_BUFFER; +static constexpr size_t pixel_buffer_size = display_width * NUM_ROWS_IN_FRAME_BUFFER; std::shared_ptr display; -static const int spi_queue_size = 7; +static const int spi_queue_size = 6; static spi_transaction_t ts_[spi_queue_size]; -static size_t ts_index = 0; static size_t num_queued_trans = 0; -static constexpr size_t frame_buffer_size = (((320) * 2) * 240); -static uint8_t *frame_buffer0; -static uint8_t *frame_buffer1; - // the user flag for the callbacks does two things: // 1. Provides the GPIO level for the data/command pin, and // 2. Sets some bits for other signaling (such as LVGL FLUSH) static constexpr int FLUSH_BIT = (1 << (int)espp::display_drivers::Flags::FLUSH_BIT); static constexpr int DC_LEVEL_BIT = (1 << (int)espp::display_drivers::Flags::DC_LEVEL_BIT); -static constexpr int DC_PIN_NUM = 4; // This function is called (in irq context!) just before a transmission starts. // It will set the D/C line to the value indicated in the user field // (DC_LEVEL_BIT). -static void IRAM_ATTR lcd_spi_pre_transfer_callback(spi_transaction_t *t) +static void lcd_spi_pre_transfer_callback(spi_transaction_t *t) { uint32_t user_flags = (uint32_t)(t->user); bool dc_level = user_flags & DC_LEVEL_BIT; - gpio_set_level((gpio_num_t)DC_PIN_NUM, dc_level); + gpio_set_level(lcd_dc, dc_level); } // This function is called (in irq context!) just after a transmission ends. It // will indicate to lvgl that the next flush is ready to be done if the // FLUSH_BIT is set. -static void IRAM_ATTR lcd_spi_post_transfer_callback(spi_transaction_t *t) +static void lcd_spi_post_transfer_callback(spi_transaction_t *t) { uint16_t user_flags = (uint32_t)(t->user); bool should_flush = user_flags & FLUSH_BIT; @@ -53,7 +56,7 @@ static void IRAM_ATTR lcd_spi_post_transfer_callback(spi_transaction_t *t) } } -extern "C" void IRAM_ATTR lcd_write(const uint8_t *data, size_t length, uint32_t user_data) { +extern "C" void lcd_write(const uint8_t *data, size_t length, uint32_t user_data) { if (length == 0) { return; } @@ -104,17 +107,17 @@ void IRAM_ATTR lcd_send_lines(int xs, int ys, int xe, int ye, const uint8_t *dat trans[i].flags=SPI_TRANS_USE_TXDATA; } size_t length = (xe-xs+1)*(ye-ys+1)*2; - trans[0].tx_data[0]=(uint8_t)espp::St7789::Command::caset; + trans[0].tx_data[0]=(uint8_t)DisplayDriver::Command::caset; trans[1].tx_data[0]=(xs)>> 8; trans[1].tx_data[1]=(xs)&0xff; trans[1].tx_data[2]=(xe)>>8; trans[1].tx_data[3]=(xe)&0xff; - trans[2].tx_data[0]=(uint8_t)espp::St7789::Command::raset; + trans[2].tx_data[0]=(uint8_t)DisplayDriver::Command::raset; trans[3].tx_data[0]=(ys)>>8; trans[3].tx_data[1]=(ys)&0xff; trans[3].tx_data[2]=(ye)>>8; trans[3].tx_data[3]=(ye)&0xff; - trans[4].tx_data[0]=(uint8_t)espp::St7789::Command::ramwr; + trans[4].tx_data[0]=(uint8_t)DisplayDriver::Command::ramwr; trans[5].tx_buffer=data; trans[5].length=length*8; // undo SPI_TRANS_USE_TXDATA flag @@ -146,55 +149,50 @@ uint16_t* get_vram1() { return display->vram1(); } -uint8_t* get_frame_buffer0() { - return frame_buffer0; -} - -uint8_t* get_frame_buffer1() { - return frame_buffer1; -} +void lcd_init() { + static bool initialized = false; + if (initialized) { + return; + } + esp_err_t ret; -static spi_bus_config_t buscfg = { - .mosi_io_num=GPIO_NUM_6, - .miso_io_num=-1, - .sclk_io_num=GPIO_NUM_7, - .quadwp_io_num=-1, - .quadhd_io_num=-1, - .max_transfer_sz=display_width * display_height * 2 + 8 -}; -static spi_device_interface_config_t devcfg = { - .mode=0, - .clock_speed_hz=60*1000*1000, - .input_delay_ns=0, - .spics_io_num=GPIO_NUM_5, - .queue_size=spi_queue_size, - .pre_cb=lcd_spi_pre_transfer_callback, - .post_cb=lcd_spi_post_transfer_callback, -}; + spi_bus_config_t buscfg; + memset(&buscfg, 0, sizeof(buscfg)); + buscfg.mosi_io_num = lcd_mosi; + buscfg.miso_io_num = -1; + buscfg.sclk_io_num = lcd_sclk; + buscfg.quadwp_io_num = -1; + buscfg.quadhd_io_num = -1; + buscfg.max_transfer_sz = display_width * display_height * 2 + 8; + + spi_device_interface_config_t devcfg; + memset(&devcfg, 0, sizeof(devcfg)); + devcfg.mode = 0; + devcfg.clock_speed_hz = lcd_clock_speed; + devcfg.input_delay_ns = 0; + devcfg.spics_io_num = lcd_cs; + devcfg.queue_size = spi_queue_size; + devcfg.pre_cb = lcd_spi_pre_transfer_callback; + devcfg.post_cb = lcd_spi_post_transfer_callback; -void lcd_init() { - static bool initialized = false; - if (initialized) { - return; - } - esp_err_t ret; //Initialize the SPI bus - ret=spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO); + ret = spi_bus_initialize(lcd_spi_num, &buscfg, SPI_DMA_CH_AUTO); ESP_ERROR_CHECK(ret); //Attach the LCD to the SPI bus - ret=spi_bus_add_device(SPI2_HOST, &devcfg, &spi); + ret = spi_bus_add_device(lcd_spi_num, &devcfg, &spi); ESP_ERROR_CHECK(ret); // initialize the controller - espp::St7789::initialize(espp::display_drivers::Config{ + DisplayDriver::initialize(espp::display_drivers::Config{ .lcd_write = lcd_write, .lcd_send_lines = lcd_send_lines, - .reset_pin = (gpio_num_t)48, - .data_command_pin = (gpio_num_t)DC_PIN_NUM, - .backlight_pin = (gpio_num_t)45, - .backlight_on_value = true, - .invert_colors = true, - .mirror_x = true, - .mirror_y = false, + .reset_pin = lcd_reset, + .data_command_pin = lcd_dc, + .backlight_pin = backlight, + .backlight_on_value = backlight_value, + .reset_value = reset_value, + .invert_colors = invert_colors, + .mirror_x = mirror_x, + .mirror_y = mirror_y, }); // initialize the display / lvgl using namespace std::chrono_literals; @@ -202,14 +200,14 @@ void lcd_init() { .width = display_width, .height = display_height, .pixel_buffer_size = pixel_buffer_size, - .flush_callback = espp::St7789::flush, + .flush_callback = DisplayDriver::flush, .update_period = 5ms, .double_buffered = true, .allocation_flags = MALLOC_CAP_8BIT | MALLOC_CAP_DMA, - .rotation = espp::Display::Rotation::LANDSCAPE, + .rotation = rotation, .software_rotation_enabled = true, }); - // frame_buffer0 = (uint8_t*)heap_caps_malloc(frame_buffer_size, MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM); - // frame_buffer1 = (uint8_t*)heap_caps_malloc(frame_buffer_size, MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM); + // clear the display + DisplayDriver::clear(0, 0, display_width, display_height); initialized = true; } diff --git a/main/lcd.hpp b/main/lcd.hpp index a08c295..06fc85d 100644 --- a/main/lcd.hpp +++ b/main/lcd.hpp @@ -5,7 +5,4 @@ void lcd_init(); uint16_t* get_vram0(); uint16_t* get_vram1(); -uint8_t* get_frame_buffer0(); -uint8_t* get_frame_buffer1(); void lcd_send_lines(int xs, int ys, int xe, int ye, const uint8_t *data, uint32_t user_data); -// std::shared_ptr get_display(); diff --git a/main/main.cpp b/main/main.cpp index 62865b6..4ca2828 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -8,10 +8,6 @@ #include "freertos/task.h" #include "driver/gpio.h" -#include "driver/i2c.h" -#include "driver/spi_master.h" -#include "esp_heap_caps.h" -#include "hal/spi_types.h" #include "mdns.h" #include "nvs_flash.h" @@ -24,7 +20,6 @@ #include "tcp_socket.hpp" #include "udp_socket.hpp" #include "wifi_sta.hpp" -#include "st7789.hpp" #include "lcd.hpp" diff --git a/main/tdeck.hpp b/main/tdeck.hpp new file mode 100644 index 0000000..9ece72a --- /dev/null +++ b/main/tdeck.hpp @@ -0,0 +1,83 @@ +#pragma once + +#include "hal/spi_types.h" +#include "driver/gpio.h" +#include "driver/i2s_std.h" +#include "driver/spi_master.h" + +#include "i2c.hpp" +#include "st7789.hpp" +#include "touchpad_input.hpp" +#include "gt911.hpp" + +namespace hal { + +static constexpr std::string_view dev_kit = "LILYGO T-DECK"; + +// internal i2c (touchscreen, audio codec) +static constexpr auto internal_i2c_port = I2C_NUM_0; +static constexpr auto internal_i2c_clock_speed = 400 * 1000; +static constexpr gpio_num_t internal_i2c_sda = GPIO_NUM_18; +static constexpr gpio_num_t internal_i2c_scl = GPIO_NUM_8; + +#if 0 +// TODO: figure out what these are for T-DECK: +// external I2c (peripherals) +static constexpr auto external_i2c_port = I2C_NUM_1; +static constexpr auto external_i2c_clock_speed = 400 * 1000; +static constexpr gpio_num_t external_i2c_sda = GPIO_NUM_41; +static constexpr gpio_num_t external_i2c_scl = GPIO_NUM_40; +#endif + +// LCD +static constexpr int lcd_clock_speed = 60 * 1000 * 1000; +static constexpr auto lcd_spi_num = SPI2_HOST; +static constexpr gpio_num_t lcd_cs = GPIO_NUM_12; +static constexpr gpio_num_t lcd_mosi = GPIO_NUM_41; +static constexpr gpio_num_t lcd_sclk = GPIO_NUM_40; +static constexpr gpio_num_t lcd_reset = GPIO_NUM_NC; +static constexpr gpio_num_t lcd_dc = GPIO_NUM_11; +static constexpr gpio_num_t backlight = GPIO_NUM_42; +static constexpr size_t display_width = 320; +static constexpr size_t display_height = 240; +static constexpr bool backlight_value = true; +static constexpr bool reset_value = false; +static constexpr bool invert_colors = false; +static constexpr auto rotation = espp::Display::Rotation::LANDSCAPE; +static constexpr bool mirror_x = false; +static constexpr bool mirror_y = true; +using DisplayDriver = espp::St7789; + +// touch +static constexpr bool touch_swap_xy = true; +static constexpr bool touch_invert_x = true; +static constexpr bool touch_invert_y = false; +#if 0 +// TODO: figure out what these are for T-DECK: +static constexpr gpio_num_t touch_interrupt = GPIO_NUM_3; +#endif +using TouchDriver = espp::Gt911; + #define TOUCH_DRIVER_USE_WRITE 1 + #define TOUCH_DRIVER_USE_READ 0 + #define TOUCH_DRIVER_USE_WRITE_READ 1 + +#if 0 +// TODO: figure out what these are for T-DECK: +// sound +static constexpr gpio_num_t sound_power_pin = GPIO_NUM_46; +static constexpr auto i2s_port = I2S_NUM_0; +static constexpr gpio_num_t i2s_mck_io = GPIO_NUM_2; +static constexpr gpio_num_t i2s_bck_io = GPIO_NUM_17; +static constexpr gpio_num_t i2s_ws_io = GPIO_NUM_45; // was 47 on ESP32-S3-BOX +static constexpr gpio_num_t i2s_do_io = GPIO_NUM_15; +static constexpr gpio_num_t i2s_di_io = GPIO_NUM_16; +static constexpr gpio_num_t mute_pin = GPIO_NUM_1; + +// uSD card +static constexpr gpio_num_t sdcard_cs = GPIO_NUM_10; +static constexpr gpio_num_t sdcard_mosi = GPIO_NUM_11; +static constexpr gpio_num_t sdcard_miso = GPIO_NUM_13; +static constexpr gpio_num_t sdcard_sclk = GPIO_NUM_12; +static constexpr auto sdcard_spi_num = SPI3_HOST; +#endif +} // namespace box_hal From 71042dc02b552ce817cabed7a71082fea7318110 Mon Sep 17 00:00:00 2001 From: William Emfinger Date: Tue, 14 Nov 2023 08:55:11 -0600 Subject: [PATCH 3/4] readme: update --- README.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 43a226f..c03d44b 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,12 @@ # camera-display Example for [ESP32-S3-BOX](https://www.adafruit.com/product/5290) -([docs](https://github.com/espressif/esp-box)) which receives an MJPEG camera stream -from the [camera-streamer app](https://github.com/esp-cpp/camera-streamer) over -WiFi and displays them on the screen. +([docs](https://github.com/espressif/esp-box)), +[ESP32-S3-BOX-3](https://www.espressif.com/en/news/ESP32-S3-BOX-3)([mouser](https://www.mouser.com/ProductDetail/Espressif-Systems/ESP32-S3-BOX-3?qs=HoCaDK9Nz5chOY9AUo%2F%2FvA%3D%3D)), +and [LilyGo T-Deck](https://www.lilygo.cc/products/t-deck) which receives an +MJPEG camera stream from the [camera-streamer +app](https://github.com/esp-cpp/camera-streamer) over WiFi and displays them on +the screen. To facilitate discovery, this sample uses mDNS to find the camera-streamer app (or any RTSP server that advertises itself as `_rtsp._tcp.local`). @@ -12,8 +15,8 @@ https://user-images.githubusercontent.com/213467/236601479-fcd982f5-80b1-4ce5-ae ## Hardware -This sample is designed to run on the ESP32-S3-BOX which has a 320x240 LCD (over -SPI) running on a ESP32-S3. +This sample is designed to run on the ESP32-S3-BOX, ESP32-S3-BOX-3, and LilyGo +T-Deck all of which have a 320x240 LCD (over SPI) running on a ESP32-S3. ## Software From 60fb80e31d731233b8840be7870233f4fa619a9c Mon Sep 17 00:00:00 2001 From: William Emfinger Date: Tue, 14 Nov 2023 09:06:58 -0600 Subject: [PATCH 4/4] readme: update --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index c03d44b..7d54e55 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,9 @@ To facilitate discovery, this sample uses mDNS to find the camera-streamer app https://user-images.githubusercontent.com/213467/236601479-fcd982f5-80b1-4ce5-aef6-ab2b90f3d0b8.mp4 +![image](https://github.com/esp-cpp/camera-display/assets/213467/3b08febf-433b-42e1-b139-132d64e35a07) +![image](https://github.com/esp-cpp/camera-display/assets/213467/cc179d89-6083-4324-af5e-05003beeda72) + ## Hardware This sample is designed to run on the ESP32-S3-BOX, ESP32-S3-BOX-3, and LilyGo