first commit

This commit is contained in:
Alejandro Guerrero 2026-09-27 17:21:39 +02:00
commit e6a42e28e9
4355 changed files with 4626605 additions and 0 deletions

View file

@ -0,0 +1,112 @@
#pragma once
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
/*\
*
Description: Display from the popular JYETech DSO138 Oscilloscope
Platform: ESP32-S2
Panel: ILI9341
Resolution: 320x240
Bus Mode: 8 bits Parallel
Resources:
- http://www.jyetech.com/Products/LcdScope/UserManual_138.pdf
- https://www.elecrow.com/download/Schematic%20of%20the%20LCD%20board.pdf
- https://dl.espressif.com/dl/schematics/ESP32-S2-Kaluga-1_V1.3-Pin-Mapping-v0.1.xlsx
- https://tomeko.net/projects/dso138/index.php?lang=en
- https://docs.rs-online.com/784d/0900766b8120b293.pdf
- https://www.iot-experiments.com/dso138-assembly/
- https://www.reddit.com/r/arduino/comments/3hpxov/is_it_possible_to_use_this_tft_lcd_with_an/
Notes:
- IM0_JP5 is HIGH and IM3_JP6 is LOW to select parallel 8 bits mode, your mileage may vary.
- LED_K* pins can be spread over 4 pulled down pins for brightness control.
ESP32S2 | DSO138 LCD HEADER | ESP32S2
----------+--------------------------------------+----------
| |
| /--------------\ |
| x | 1 2 | x |
| x | 3 4 | x |
GND <-> GND | 5 6 | +3.3v <-> 3.3v
IO37 <-> TFT_CS | 7 8 | TFT_RS <-> IO36
IO35 <-> TFT_WR | 9 10 | TFT_RD <-> IO34
3.3v <-> IM0_JP5 | 11 12 | x |
| x | 13 14 | x |
| x | 15 16 | LED_A <-> 5v
GND <-> LED_K1 | 17 18 | LED_K2 <-> GND
GND <-> LED_K3 | 19 20 | LED_K4 <-> GND
GND <-> IM3_JP6 | 21 22 | x |
IO7 <-> D0 | 23 24 | D1 <-> IO8
IO6 <-> D2 | 25 26 | D3 <-> IO9
IO5 <-> D4 | 27 28 | D5 <-> IO10
IO4 <-> D6 | 29 30 | D7 <-> IO11
IO38 <-> TFT_RST | 31 32 | +3.3v <-> 3.3v
3.3v <-> +3.3v | 33 34 | GND <-> GND
| x | 35 36 | x |
| x | 37 38 | x |
| x | 39 40 | x |
| \--------------/ |
| |
----------+--------------------------------------+----------
*
\*/
class LGFX : public lgfx::LGFX_Device {
lgfx::Panel_ILI9341 _panel_instance;
lgfx::Bus_Parallel8 _bus_instance;
public:
LGFX(void)
{
{
auto cfg = _bus_instance.config();
cfg.freq_write = 30000000; // used 16MHz and 20MHz during testing
cfg.pin_wr = 35;
cfg.pin_rd = 34;
cfg.pin_rs = 36;
cfg.pin_d0 = 7; // D0
cfg.pin_d1 = 8; // D1
cfg.pin_d2 = 6; // D2
cfg.pin_d3 = 9; // D3
cfg.pin_d4 = 5; // D4
cfg.pin_d5 = 10; // D5
cfg.pin_d6 = 4; // D6
cfg.pin_d7 = 11; // D7
_bus_instance.config(cfg);
_panel_instance.setBus(&_bus_instance);
}
{
auto cfg = _panel_instance.config();
cfg.pin_cs = 37;
cfg.pin_rst = 38;
cfg.pin_busy = -1;
cfg.panel_width = 240;
cfg.panel_height = 320;
cfg.readable = true;
cfg.invert = false;
cfg.rgb_order = false;
cfg.dlen_16bit = false;
cfg.bus_shared = true; // SD = true
_panel_instance.config(cfg);
}
setPanel(&_panel_instance);
}
};

View file

@ -0,0 +1,127 @@
#pragma once
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
#include <driver/i2c.h>
// LGFX for Makerfabs ESP32-S2-Parallel-TFT-with-Touch
// https://github.com/Makerfabs/Makerfabs-ESP32-S2-Parallel-TFT-with-Touch/
class LGFX : public lgfx::LGFX_Device
{
static constexpr int I2C_PORT_NUM = I2C_NUM_0;
static constexpr int I2C_PIN_SDA = 38;
static constexpr int I2C_PIN_SCL = 39;
static constexpr int I2C_PIN_INT = 40;
lgfx::Bus_Parallel16 _bus_instance;
lgfx::Panel_ILI9488 _panel_instance;
lgfx::Light_PWM _light_instance;
lgfx::ITouch* _touch_instance_ptr = nullptr;
/// Detects and configures the touch panel during initialization;
bool init_impl(bool use_reset, bool use_clear) override
{
if (_touch_instance_ptr == nullptr)
{
lgfx::ITouch::config_t cfg;
lgfx::i2c::init(I2C_PORT_NUM, I2C_PIN_SDA, I2C_PIN_SCL);
if (lgfx::i2c::beginTransaction(I2C_PORT_NUM, 0x38, 400000, false).has_value()
&& lgfx::i2c::endTransaction(I2C_PORT_NUM).has_value())
{
_touch_instance_ptr = new lgfx::Touch_FT5x06();
cfg = _touch_instance_ptr->config();
cfg.i2c_addr = 0x38;
cfg.x_max = 320;
cfg.y_max = 480;
}
else
if (lgfx::i2c::beginTransaction(I2C_PORT_NUM, 0x48, 400000, false).has_value()
&& lgfx::i2c::endTransaction(I2C_PORT_NUM).has_value())
{
_touch_instance_ptr = new lgfx::Touch_NS2009();
cfg = _touch_instance_ptr->config();
cfg.i2c_addr = 0x48;
cfg.x_min = 368;
cfg.y_min = 212;
cfg.x_max = 3800;
cfg.y_max = 3800;
}
if (_touch_instance_ptr != nullptr)
{
cfg.i2c_port = I2C_PORT_NUM;
cfg.pin_sda = I2C_PIN_SDA;
cfg.pin_scl = I2C_PIN_SCL;
cfg.pin_int = I2C_PIN_INT;
cfg.freq = 400000;
cfg.bus_shared = false;
_touch_instance_ptr->config(cfg);
_panel_instance.touch(_touch_instance_ptr);
}
}
return lgfx::LGFX_Device::init_impl(use_reset, use_clear);
}
public:
LGFX(void)
{
{
auto cfg = _bus_instance.config();
cfg.freq_write = 40000000;
cfg.pin_wr = 35;
cfg.pin_rd = 34;
cfg.pin_rs = 36;
cfg.pin_d0 = 33;
cfg.pin_d1 = 21;
cfg.pin_d2 = 14;
cfg.pin_d3 = 13;
cfg.pin_d4 = 12;
cfg.pin_d5 = 11;
cfg.pin_d6 = 10;
cfg.pin_d7 = 9;
cfg.pin_d8 = 3;
cfg.pin_d9 = 8;
cfg.pin_d10 = 16;
cfg.pin_d11 = 15;
cfg.pin_d12 = 7;
cfg.pin_d13 = 6;
cfg.pin_d14 = 5;
cfg.pin_d15 = 4;
_bus_instance.config(cfg);
_panel_instance.bus(&_bus_instance);
}
{
auto cfg = _panel_instance.config();
cfg.pin_cs = 37;
cfg.pin_rst = -1;
cfg.pin_busy = -1;
cfg.offset_rotation = 0;
cfg.readable = true;
cfg.invert = false;
cfg.rgb_order = false;
cfg.dlen_16bit = true;
cfg.bus_shared = false;
_panel_instance.config(cfg);
}
{
auto cfg = _light_instance.config();
cfg.pin_bl = 45;
cfg.invert = false;
cfg.freq = 44100;
cfg.pwm_channel = 7;
_light_instance.config(cfg);
_panel_instance.light(&_light_instance);
}
setPanel(&_panel_instance);
}
};

View file

@ -0,0 +1,110 @@
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
#include <lgfx/v1/platforms/esp32s3/Panel_RGB.hpp>
#include <lgfx/v1/platforms/esp32s3/Bus_RGB.hpp>
#include <driver/i2c.h>
class LGFX : public lgfx::LGFX_Device
{
public:
lgfx::Bus_RGB _bus_instance;
lgfx::Panel_RGB _panel_instance;
lgfx::Light_PWM _light_instance;
lgfx::Touch_GT911 _touch_instance;
LGFX(void)
{
{
auto cfg = _panel_instance.config();
cfg.memory_width = 800;
cfg.memory_height = 480;
cfg.panel_width = 800;
cfg.panel_height = 480;
cfg.offset_x = 0;
cfg.offset_y = 0;
_panel_instance.config(cfg);
}
{
auto cfg = _panel_instance.config_detail();
cfg.use_psram = 1;
_panel_instance.config_detail(cfg);
}
{
auto cfg = _bus_instance.config();
cfg.panel = &_panel_instance;
cfg.pin_d0 = GPIO_NUM_8; // B0
cfg.pin_d1 = GPIO_NUM_3; // B1
cfg.pin_d2 = GPIO_NUM_46; // B2
cfg.pin_d3 = GPIO_NUM_9; // B3
cfg.pin_d4 = GPIO_NUM_1; // B4
cfg.pin_d5 = GPIO_NUM_5; // G0
cfg.pin_d6 = GPIO_NUM_6; // G1
cfg.pin_d7 = GPIO_NUM_7; // G2
cfg.pin_d8 = GPIO_NUM_15; // G3
cfg.pin_d9 = GPIO_NUM_16; // G4
cfg.pin_d10 = GPIO_NUM_4; // G5
cfg.pin_d11 = GPIO_NUM_45; // R0
cfg.pin_d12 = GPIO_NUM_48; // R1
cfg.pin_d13 = GPIO_NUM_47; // R2
cfg.pin_d14 = GPIO_NUM_21; // R3
cfg.pin_d15 = GPIO_NUM_14; // R4
cfg.pin_henable = GPIO_NUM_40;
cfg.pin_vsync = GPIO_NUM_41;
cfg.pin_hsync = GPIO_NUM_39;
cfg.pin_pclk = GPIO_NUM_42;
cfg.freq_write = 14000000;
cfg.hsync_polarity = 0;
cfg.hsync_front_porch = 8;
cfg.hsync_pulse_width = 4;
cfg.hsync_back_porch = 16;
cfg.vsync_polarity = 0;
cfg.vsync_front_porch = 4;
cfg.vsync_pulse_width = 4;
cfg.vsync_back_porch = 4;
cfg.pclk_idle_high = 1;
_bus_instance.config(cfg);
}
_panel_instance.setBus(&_bus_instance);
{
auto cfg = _light_instance.config();
cfg.pin_bl = GPIO_NUM_2;
_light_instance.config(cfg);
}
_panel_instance.light(&_light_instance);
{
auto cfg = _touch_instance.config();
cfg.x_min = 0;
cfg.x_max = 800;
cfg.y_min = 0;
cfg.y_max = 480;
cfg.pin_int = GPIO_NUM_18;
cfg.bus_shared = false;
cfg.offset_rotation = 0;
// I2C接続
cfg.i2c_port = I2C_NUM_1;
cfg.pin_sda = GPIO_NUM_19;
cfg.pin_scl = GPIO_NUM_20;
cfg.freq = 400000;
cfg.i2c_addr = 0x14; // 0x5D , 0x14
_touch_instance.config(cfg);
_panel_instance.setTouch(&_touch_instance);
}
setPanel(&_panel_instance);
}
};

View file

@ -0,0 +1,114 @@
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
#include <lgfx/v1/platforms/esp32s3/Panel_RGB.hpp>
#include <lgfx/v1/platforms/esp32s3/Bus_RGB.hpp>
#include <driver/i2c.h>
class LGFX : public lgfx::LGFX_Device
{
public:
lgfx::Bus_RGB _bus_instance;
lgfx::Panel_ST7701 _panel_instance;
lgfx::Touch_GT911 _touch_instance;
// lgfx::Light_PWM _light_instance;
LGFX(void)
{
{
auto cfg = _panel_instance.config();
cfg.memory_width = 480;
cfg.memory_height = 480;
cfg.panel_width = 480;
cfg.panel_height = 480;
cfg.offset_x = 0;
cfg.offset_y = 0;
_panel_instance.config(cfg);
}
{
auto cfg = _panel_instance.config_detail();
cfg.pin_cs = 1;
cfg.pin_sclk = 12;
cfg.pin_mosi = 11;
_panel_instance.config_detail(cfg);
}
{
auto cfg = _bus_instance.config();
cfg.panel = &_panel_instance;
cfg.pin_d0 = GPIO_NUM_6; // B0
cfg.pin_d1 = GPIO_NUM_7; // B1
cfg.pin_d2 = GPIO_NUM_15; // B2
cfg.pin_d3 = GPIO_NUM_16; // B3
cfg.pin_d4 = GPIO_NUM_8; // B4
cfg.pin_d5 = GPIO_NUM_0; // G0
cfg.pin_d6 = GPIO_NUM_9; // G1
cfg.pin_d7 = GPIO_NUM_14; // G2
cfg.pin_d8 = GPIO_NUM_47; // G3
cfg.pin_d9 = GPIO_NUM_48; // G4
cfg.pin_d10 = GPIO_NUM_3; // G5
cfg.pin_d11 = GPIO_NUM_39; // R0
cfg.pin_d12 = GPIO_NUM_40; // R1
cfg.pin_d13 = GPIO_NUM_41; // R2
cfg.pin_d14 = GPIO_NUM_42; // R3
cfg.pin_d15 = GPIO_NUM_2; // R4
cfg.pin_henable = GPIO_NUM_45;
cfg.pin_vsync = GPIO_NUM_4;
cfg.pin_hsync = GPIO_NUM_5;
cfg.pin_pclk = GPIO_NUM_21;
cfg.freq_write = 14000000;
cfg.hsync_polarity = 0;
cfg.hsync_front_porch = 10;
cfg.hsync_pulse_width = 8;
cfg.hsync_back_porch = 50;
cfg.vsync_polarity = 0;
cfg.vsync_front_porch = 10;
cfg.vsync_pulse_width = 8;
cfg.vsync_back_porch = 20;
cfg.pclk_idle_high = 0;
cfg.de_idle_high = 1;
_bus_instance.config(cfg);
}
_panel_instance.setBus(&_bus_instance);
{
auto cfg = _touch_instance.config();
cfg.x_min = 0;
cfg.x_max = 480;
cfg.y_min = 0;
cfg.y_max = 480;
cfg.bus_shared = false;
cfg.offset_rotation = 0;
cfg.i2c_port = I2C_NUM_1;
cfg.pin_int = GPIO_NUM_NC;
cfg.pin_sda = GPIO_NUM_17;
cfg.pin_scl = GPIO_NUM_18;
cfg.pin_rst = GPIO_NUM_38;
cfg.freq = 400000;
_touch_instance.config(cfg);
_panel_instance.setTouch(&_touch_instance);
}
// {
// auto cfg = _light_instance.config();
// cfg.pin_bl = GPIO_NUM_44;
// _light_instance.config(cfg);
// }
// _panel_instance.light(&_light_instance);
setPanel(&_panel_instance);
}
};

View file

@ -0,0 +1,118 @@
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
#include <lgfx/v1/platforms/esp32s3/Panel_RGB.hpp>
#include <lgfx/v1/platforms/esp32s3/Bus_RGB.hpp>
#include <driver/i2c.h>
class LGFX : public lgfx::LGFX_Device
{
public:
lgfx::Bus_RGB _bus_instance;
lgfx::Panel_RGB _panel_instance;
lgfx::Light_PWM _light_instance;
lgfx::Touch_GT911 _touch_instance;
LGFX(void)
{
{
auto cfg = _panel_instance.config();
cfg.memory_width = 800;
cfg.memory_height = 480;
cfg.panel_width = 800;
cfg.panel_height = 480;
cfg.offset_x = 0;
cfg.offset_y = 0;
_panel_instance.config(cfg);
}
{
auto cfg = _panel_instance.config_detail();
cfg.use_psram = 1;
_panel_instance.config_detail(cfg);
}
{
auto cfg = _bus_instance.config();
cfg.panel = &_panel_instance;
cfg.pin_d0 = GPIO_NUM_8; // B0
cfg.pin_d1 = GPIO_NUM_3; // B1
cfg.pin_d2 = GPIO_NUM_46; // B2
cfg.pin_d3 = GPIO_NUM_9; // B3
cfg.pin_d4 = GPIO_NUM_1; // B4
cfg.pin_d5 = GPIO_NUM_5; // G0
cfg.pin_d6 = GPIO_NUM_6; // G1
cfg.pin_d7 = GPIO_NUM_7; // G2
cfg.pin_d8 = GPIO_NUM_15; // G3
cfg.pin_d9 = GPIO_NUM_16; // G4
cfg.pin_d10 = GPIO_NUM_4; // G5
cfg.pin_d11 = GPIO_NUM_45; // R0
cfg.pin_d12 = GPIO_NUM_48; // R1
cfg.pin_d13 = GPIO_NUM_47; // R2
cfg.pin_d14 = GPIO_NUM_21; // R3
cfg.pin_d15 = GPIO_NUM_14; // R4
cfg.pin_henable = GPIO_NUM_40;
cfg.pin_vsync = GPIO_NUM_41;
cfg.pin_hsync = GPIO_NUM_39;
cfg.pin_pclk = GPIO_NUM_42;
cfg.freq_write = 14000000;
cfg.hsync_polarity = 0;
cfg.hsync_front_porch = 8;
cfg.hsync_pulse_width = 4;
cfg.hsync_back_porch = 16;
cfg.vsync_polarity = 0;
cfg.vsync_front_porch = 4;
cfg.vsync_pulse_width = 4;
cfg.vsync_back_porch = 4;
cfg.pclk_idle_high = 1;
_bus_instance.config(cfg);
}
_panel_instance.setBus(&_bus_instance);
{
auto cfg = _light_instance.config();
cfg.pin_bl = GPIO_NUM_2;
_light_instance.config(cfg);
}
_panel_instance.light(&_light_instance);
{
auto cfg = _touch_instance.config();
cfg.x_min = 0;
cfg.y_min = 0;
cfg.bus_shared = false;
cfg.offset_rotation = 0;
// I2C接続
cfg.i2c_port = I2C_NUM_1;
cfg.pin_sda = GPIO_NUM_17;
cfg.pin_scl = GPIO_NUM_18;
// for Board v1.3
cfg.pin_int = GPIO_NUM_NC;
cfg.pin_rst = GPIO_NUM_38;
cfg.x_max = 800;
cfg.y_max = 480;
/*
// for Board v1.1 / v1.2
cfg.pin_int = GPIO_NUM_38;
cfg.pin_rst = GPIO_NUM_NC;
cfg.x_max = 480;
cfg.y_max = 272;
//*/
cfg.freq = 400000;
_touch_instance.config(cfg);
_panel_instance.setTouch(&_touch_instance);
}
setPanel(&_panel_instance);
}
};

View file

@ -0,0 +1,88 @@
#pragma once
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
// LGFX for wywy ESP32-S3-HMI-DevKit
// https://github.com/W00ng/ESP32-S3-HMI-DevKit/
class LGFX : public lgfx::LGFX_Device
{
lgfx::Panel_RM68120 _panel_instance;
lgfx::Bus_Parallel16 _bus_instance;
lgfx::Touch_FT5x06 _touch_instance;
public:
LGFX(void)
{
{
auto cfg = _bus_instance.config();
cfg.freq_write = 30000000;
cfg.pin_wr = 17;
cfg.pin_rd = 21;
cfg.pin_rs = 38;
cfg.pin_d0 = 1;
cfg.pin_d1 = 9;
cfg.pin_d2 = 2;
cfg.pin_d3 = 10;
cfg.pin_d4 = 3;
cfg.pin_d5 = 11;
cfg.pin_d6 = 4;
cfg.pin_d7 = 12;
cfg.pin_d8 = 5;
cfg.pin_d9 = 13;
cfg.pin_d10 = 6;
cfg.pin_d11 = 14;
cfg.pin_d12 = 7;
cfg.pin_d13 = 15;
cfg.pin_d14 = 8;
cfg.pin_d15 = 16;
_bus_instance.config(cfg);
_panel_instance.setBus(&_bus_instance);
}
{
auto cfg = _panel_instance.config();
cfg.pin_cs = -1;
cfg.pin_rst = 18;
cfg.pin_busy = -1;
cfg.dlen_16bit = true;
cfg.rgb_order = true;
cfg.memory_width = 480;
cfg.memory_height = 800;
cfg.panel_width = 480;
cfg.panel_height = 800;
cfg.readable = true;
_panel_instance.config(cfg);
}
{
auto cfg = _touch_instance.config();
cfg.i2c_addr = 0x38;
cfg.x_min = 0;
cfg.y_min = 0;
cfg.x_max = 479;
cfg.y_max = 799;
cfg.i2c_port = 0;
cfg.pin_sda = GPIO_NUM_40;
cfg.pin_scl = GPIO_NUM_39;
cfg.pin_int = -1;
cfg.freq = 400000;
cfg.bus_shared = false;
_touch_instance.config(cfg);
_panel_instance.touch(&_touch_instance);
}
setPanel(&_panel_instance);
}
};

View file

@ -0,0 +1,213 @@
#pragma once
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
// ESP32でLovyanGFXを独自設定で利用する場合の設定例
/*
このファイルを複製し、新しい名前を付けて、環境に合わせて設定内容を変更してください。
作成したファイルをユーザープログラムからincludeすることで利用可能になります。
複製したファイルはライブラリのlgfx_userフォルダに置いて利用しても構いませんが、
その場合はライブラリのアップデート時に削除される可能性があるのでご注意ください。
安全に運用したい場合はバックアップを作成しておくか、ユーザープロジェクトのフォルダに置いてください。
//*/
/// 独自の設定を行うクラスを、LGFX_Deviceから派生して作成します。
class LGFX : public lgfx::LGFX_Device
{
/*
クラス名は"LGFX"から別の名前に変更しても構いません。
AUTODETECTと併用する場合は"LGFX"は使用されているため、LGFX以外の名前に変更してください。
また、複数枚のパネルを同時使用する場合もそれぞれに異なる名前を付けてください。
※ クラス名を変更する場合はコンストラクタの名前も併せて同じ名前に変更が必要です。
名前の付け方は自由に決めて構いませんが、設定が増えた場合を想定し、
例えばESP32 DevKit-CでSPI接続のILI9341の設定を行った場合、
LGFX_DevKitC_SPI_ILI9341
のような名前にし、ファイル名とクラス名を一致させておくことで、利用時に迷いにくくなります。
//*/
// 接続するパネルの型にあったインスタンスを用意します。
//lgfx::Panel_GC9A01 _panel_instance;
//lgfx::Panel_GDEW0154M09 _panel_instance;
//lgfx::Panel_HX8357B _panel_instance;
//lgfx::Panel_HX8357D _panel_instance;
//lgfx::Panel_ILI9163 _panel_instance;
lgfx::Panel_ILI9341 _panel_instance;
//lgfx::Panel_ILI9342 _panel_instance;
//lgfx::Panel_ILI9481 _panel_instance;
//lgfx::Panel_ILI9486 _panel_instance;
//lgfx::Panel_ILI9488 _panel_instance;
//lgfx::Panel_IT8951 _panel_instance;
//lgfx::Panel_RA8875 _panel_instance;
//lgfx::Panel_SH110x _panel_instance; // SH1106, SH1107
//lgfx::Panel_SSD1306 _panel_instance;
//lgfx::Panel_SSD1327 _panel_instance;
//lgfx::Panel_SSD1331 _panel_instance;
//lgfx::Panel_SSD1351 _panel_instance; // SSD1351, SSD1357
//lgfx::Panel_SSD1963 _panel_instance;
//lgfx::Panel_ST7735 _panel_instance;
//lgfx::Panel_ST7735S _panel_instance;
//lgfx::Panel_ST7789 _panel_instance;
//lgfx::Panel_ST7796 _panel_instance;
// パネルを接続するバスの種類にあったインスタンスを用意します。
lgfx::Bus_SPI _bus_instance; // SPIバスのインスタンス
//lgfx::Bus_I2C _bus_instance; // I2Cバスのインスタンス (ESP32のみ)
//lgfx::Bus_Parallel8 _bus_instance; // 8ビットパラレルバスのインスタンス (ESP32のみ)
// バックライト制御が可能な場合はインスタンスを用意します。(必要なければ削除)
lgfx::Light_PWM _light_instance;
// タッチスクリーンの型にあったインスタンスを用意します。(必要なければ削除)
lgfx::Touch_FT5x06 _touch_instance; // FT5206, FT5306, FT5406, FT6206, FT6236, FT6336, FT6436
//lgfx::Touch_GSL1680E_800x480 _touch_instance; // GSL_1680E, 1688E, 2681B, 2682B
//lgfx::Touch_GSL1680F_800x480 _touch_instance;
//lgfx::Touch_GSL1680F_480x272 _touch_instance;
//lgfx::Touch_GSLx680_320x320 _touch_instance;
//lgfx::Touch_GT911 _touch_instance;
//lgfx::Touch_STMPE610 _touch_instance;
//lgfx::Touch_TT21xxx _touch_instance; // TT21100
//lgfx::Touch_XPT2046 _touch_instance;
public:
// コンストラクタを作成し、ここで各種設定を行います。
// クラス名を変更した場合はコンストラクタも同じ名前を指定してください。
LGFX(void)
{
{ // バス制御の設定を行います。
auto cfg = _bus_instance.config(); // バス設定用の構造体を取得します。
// SPIバスの設定
cfg.spi_host = VSPI_HOST; // 使用するSPIを選択 ESP32-S2,C3 : SPI2_HOST or SPI3_HOST / ESP32 : VSPI_HOST or HSPI_HOST
// ※ ESP-IDFバージョンアップに伴い、VSPI_HOST , HSPI_HOSTの記述は非推奨になるため、エラーが出る場合は代わりにSPI2_HOST , SPI3_HOSTを使用してください。
cfg.spi_mode = 0; // SPI通信モードを設定 (0 ~ 3)
cfg.freq_write = 40000000; // 送信時のSPIクロック (最大80MHz, 80MHzを整数で割った値に丸められます)
cfg.freq_read = 16000000; // 受信時のSPIクロック
cfg.spi_3wire = true; // 受信をMOSIピンで行う場合はtrueを設定
cfg.use_lock = true; // トランザクションロックを使用する場合はtrueを設定
cfg.dma_channel = SPI_DMA_CH_AUTO; // 使用するDMAチャンネルを設定 (0=DMA不使用 / 1=1ch / 2=ch / SPI_DMA_CH_AUTO=自動設定)
// ※ ESP-IDFバージョンアップに伴い、DMAチャンネルはSPI_DMA_CH_AUTO(自動設定)が推奨になりました。1ch,2chの指定は非推奨になります。
cfg.pin_sclk = 18; // SPIのSCLKピン番号を設定
cfg.pin_mosi = 23; // SPIのMOSIピン番号を設定
cfg.pin_miso = 19; // SPIのMISOピン番号を設定 (-1 = disable)
cfg.pin_dc = 27; // SPIのD/Cピン番号を設定 (-1 = disable)
// SDカードと共通のSPIバスを使う場合、MISOは省略せず必ず設定してください。
//*/
/*
// I2Cバスの設定
cfg.i2c_port = 0; // 使用するI2Cポートを選択 (0 or 1)
cfg.freq_write = 400000; // 送信時のクロック
cfg.freq_read = 400000; // 受信時のクロック
cfg.pin_sda = 21; // SDAを接続しているピン番号
cfg.pin_scl = 22; // SCLを接続しているピン番号
cfg.i2c_addr = 0x3C; // I2Cデバイスのアドレス
//*/
/*
// 8ビットパラレルバスの設定
cfg.i2s_port = I2S_NUM_0; // 使用するI2Sポートを選択 (I2S_NUM_0 or I2S_NUM_1) (ESP32のI2S LCDモードを使用します)
cfg.freq_write = 20000000; // 送信クロック (最大20MHz, 80MHzを整数で割った値に丸められます)
cfg.pin_wr = 4; // WR を接続しているピン番号
cfg.pin_rd = 2; // RD を接続しているピン番号
cfg.pin_rs = 15; // RS(D/C)を接続しているピン番号
cfg.pin_d0 = 12; // D0を接続しているピン番号
cfg.pin_d1 = 13; // D1を接続しているピン番号
cfg.pin_d2 = 26; // D2を接続しているピン番号
cfg.pin_d3 = 25; // D3を接続しているピン番号
cfg.pin_d4 = 17; // D4を接続しているピン番号
cfg.pin_d5 = 16; // D5を接続しているピン番号
cfg.pin_d6 = 27; // D6を接続しているピン番号
cfg.pin_d7 = 14; // D7を接続しているピン番号
//*/
_bus_instance.config(cfg); // 設定値をバスに反映します。
_panel_instance.setBus(&_bus_instance); // バスをパネルにセットします。
}
{ // 表示パネル制御の設定を行います。
auto cfg = _panel_instance.config(); // 表示パネル設定用の構造体を取得します。
cfg.pin_cs = 14; // CSが接続されているピン番号 (-1 = disable)
cfg.pin_rst = 33; // RSTが接続されているピン番号 (-1 = disable)
cfg.pin_busy = -1; // BUSYが接続されているピン番号 (-1 = disable)
// ※ 以下の設定値はパネル毎に一般的な初期値が設定されていますので、不明な項目はコメントアウトして試してみてください。
cfg.panel_width = 240; // 実際に表示可能な幅
cfg.panel_height = 320; // 実際に表示可能な高さ
cfg.offset_x = 0; // パネルのX方向オフセット量
cfg.offset_y = 0; // パネルのY方向オフセット量
cfg.offset_rotation = 0; // 回転方向の値のオフセット 0~7 (4~7は上下反転)
cfg.dummy_read_pixel = 8; // ピクセル読出し前のダミーリードのビット数
cfg.dummy_read_bits = 1; // ピクセル以外のデータ読出し前のダミーリードのビット数
cfg.readable = true; // データ読出しが可能な場合 trueに設定
cfg.invert = false; // パネルの明暗が反転してしまう場合 trueに設定
cfg.rgb_order = false; // パネルの赤と青が入れ替わってしまう場合 trueに設定
cfg.dlen_16bit = false; // 16bitパラレルやSPIでデータ長を16bit単位で送信するパネルの場合 trueに設定
cfg.bus_shared = true; // SDカードとバスを共有している場合 trueに設定(drawJpgFile等でバス制御を行います)
// 以下はST7735やILI9163のようにピクセル数が可変のドライバで表示がずれる場合にのみ設定してください。
// cfg.memory_width = 240; // ドライバICがサポートしている最大の幅
// cfg.memory_height = 320; // ドライバICがサポートしている最大の高さ
_panel_instance.config(cfg);
}
//*
{ // バックライト制御の設定を行います。(必要なければ削除)
auto cfg = _light_instance.config(); // バックライト設定用の構造体を取得します。
cfg.pin_bl = 32; // バックライトが接続されているピン番号
cfg.invert = false; // バックライトの輝度を反転させる場合 true
cfg.freq = 44100; // バックライトのPWM周波数
cfg.pwm_channel = 7; // 使用するPWMのチャンネル番号
_light_instance.config(cfg);
_panel_instance.setLight(&_light_instance); // バックライトをパネルにセットします。
}
//*/
//*
{ // タッチスクリーン制御の設定を行います。(必要なければ削除)
auto cfg = _touch_instance.config();
cfg.x_min = 0; // タッチスクリーンから得られる最小のX値(生の値)
cfg.x_max = 239; // タッチスクリーンから得られる最大のX値(生の値)
cfg.y_min = 0; // タッチスクリーンから得られる最小のY値(生の値)
cfg.y_max = 319; // タッチスクリーンから得られる最大のY値(生の値)
cfg.pin_int = 38; // INTが接続されているピン番号
cfg.bus_shared = true; // 画面と共通のバスを使用している場合 trueを設定
cfg.offset_rotation = 0;// 表示とタッチの向きのが一致しない場合の調整 0~7の値で設定
// SPI接続の場合
cfg.spi_host = VSPI_HOST;// 使用するSPIを選択 (HSPI_HOST or VSPI_HOST)
cfg.freq = 1000000; // SPIクロックを設定
cfg.pin_sclk = 18; // SCLKが接続されているピン番号
cfg.pin_mosi = 23; // MOSIが接続されているピン番号
cfg.pin_miso = 19; // MISOが接続されているピン番号
cfg.pin_cs = 5; // CSが接続されているピン番号
// I2C接続の場合
cfg.i2c_port = 1; // 使用するI2Cを選択 (0 or 1)
cfg.i2c_addr = 0x38; // I2Cデバイスアドレス番号
cfg.pin_sda = 23; // SDAが接続されているピン番号
cfg.pin_scl = 32; // SCLが接続されているピン番号
cfg.freq = 400000; // I2Cクロックを設定
_touch_instance.config(cfg);
_panel_instance.setTouch(&_touch_instance); // タッチスクリーンをパネルにセットします。
}
//*/
setPanel(&_panel_instance); // 使用するパネルをセットします。
}
};

View file

@ -0,0 +1,98 @@
#pragma once
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
// LGFX for ESP boy
class LGFX : public lgfx::LGFX_Device
{
struct Panel_ESPboy : public lgfx::Panel_ST7735S
{
static constexpr int i2c_freq = 400000;
static constexpr int pin_sda = 4;
static constexpr int pin_scl = 5;
static constexpr int port = 0;
// for CS control
static constexpr int MCP23017_ADDR = 0x20;
static constexpr int MCP23017_GPIO_B = 0x13;
static constexpr int MCP23017_IODIR_B = 0x01;
// for Backlight control
static constexpr int MCP4725_ADDR = 0x60;
void init_cs(void) override
{
lgfx::i2c::init(port, pin_sda, pin_scl);
// MCP23017 PortB bit0 = CS. set to output.
lgfx::i2c::writeRegister8(port, MCP23017_ADDR, MCP23017_IODIR_B, 0x00, 0xFE, i2c_freq);
cs_control(true);
}
void cs_control(bool level) override
{
// MCP23017 PortB bit0 = CS. set level
lgfx::i2c::writeRegister8(port, MCP23017_ADDR, MCP23017_GPIO_B, level, 0xFE, i2c_freq);
}
void setBrightness(uint8_t brightness) override
{
if (brightness)
{
brightness = (128+brightness) >> 2;
}
uint8_t buf[2];
buf[0] = brightness>>4;
buf[1] = brightness>>4 | brightness<<4;
lgfx::i2c::transactionWrite(port, MCP4725_ADDR, buf, 2, i2c_freq);
}
};
Panel_ESPboy _panel_instance;
lgfx::Bus_SPI _bus_instance;
public:
LGFX(void)
{
{
auto cfg = _bus_instance.config();
cfg.spi_mode = 0;
cfg.spi_3wire = true;
cfg.freq_write = 30000000;
cfg.freq_read = 8000000;
cfg.pin_sclk = 14;
cfg.pin_mosi = 13;
cfg.pin_miso = 12;
cfg.pin_dc = 16;
_bus_instance.config(cfg);
_panel_instance.setBus(&_bus_instance);
}
{
auto cfg = _panel_instance.config();
cfg.memory_width = 132;
cfg.memory_height = 132;
cfg.panel_width = 128;
cfg.panel_height = 128;
cfg.offset_x = 2;
cfg.offset_y = 1;
cfg.offset_rotation = 2;
cfg.dummy_read_pixel = 9;
cfg.dummy_read_bits = 1;
cfg.readable = true;
cfg.bus_shared = false;
_panel_instance.config(cfg);
}
setPanel(&_panel_instance);
}
};

View file

@ -0,0 +1,116 @@
#pragma once
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
// ESP8266でLovyanGFXを独自設定で利用する場合の設定例
/*
このファイルを複製し、新しい名前を付けて、環境に合わせて設定内容を変更してください。
作成したファイルをユーザープログラムからincludeすることで利用可能になります。
複製したファイルはライブラリのlgfx_userフォルダに置いて利用しても構いませんが、
その場合はライブラリのアップデート時に削除される可能性があるのでご注意ください。
安全に運用したい場合はバックアップを作成しておくか、ユーザープロジェクトのフォルダに置いてください。
//*/
/// 独自の設定を行うクラスを、LGFX_Deviceから派生して作成します。
class LGFX : public lgfx::LGFX_Device
{
/*
クラス名は"LGFX"から別の名前に変更しても構いません。
AUTODETECTと併用する場合は"LGFX"は使用されているため、LGFX以外の名前に変更してください。
また、複数枚のパネルを同時使用する場合もそれぞれに異なる名前を付けてください。
※ クラス名を変更する場合はコンストラクタの名前も併せて同じ名前に変更が必要です。
名前の付け方は自由に決めて構いませんが、設定が増えた場合を想定し、
例えばESP8266でSPI接続のILI9341の設定を行った場合、
LGFX_ESP8266_SPI_ILI9341
のような名前にし、ファイル名とクラス名を一致させておくことで、利用時に迷いにくくなります。
//*/
// 接続するパネルの型にあったインスタンスを用意します。
//lgfx::Panel_GC9A01 _panel_instance;
//lgfx::Panel_GDEW0154M09 _panel_instance;
//lgfx::Panel_HX8357B _panel_instance;
//lgfx::Panel_HX8357D _panel_instance;
//lgfx::Panel_ILI9163 _panel_instance;
lgfx::Panel_ILI9341 _panel_instance;
//lgfx::Panel_ILI9342 _panel_instance;
//lgfx::Panel_ILI9481 _panel_instance;
//lgfx::Panel_ILI9486 _panel_instance;
//lgfx::Panel_ILI9488 _panel_instance;
//lgfx::Panel_IT8951 _panel_instance;
//lgfx::Panel_SH110x _panel_instance; // SH1106, SH1107
//lgfx::Panel_SSD1306 _panel_instance;
//lgfx::Panel_SSD1327 _panel_instance;
//lgfx::Panel_SSD1331 _panel_instance;
//lgfx::Panel_SSD1351 _panel_instance; // SSD1351, SSD1357
//lgfx::Panel_SSD1963 _panel_instance;
//lgfx::Panel_ST7735 _panel_instance;
//lgfx::Panel_ST7735S _panel_instance;
//lgfx::Panel_ST7789 _panel_instance;
//lgfx::Panel_ST7796 _panel_instance;
// パネルを接続するバスの種類にあったインスタンスを用意します。
lgfx::Bus_SPI _bus_instance; // SPIバスのインスタンス
public:
// コンストラクタを作成し、ここで各種設定を行います。
// クラス名を変更した場合はコンストラクタも同じ名前を指定してください。
LGFX(void)
{
{ // バス制御の設定を行います。
auto cfg = _bus_instance.config(); // バス設定用の構造体を取得します。
// SPIバスの設定
cfg.spi_mode = 0; // SPI通信モードを設定 (0 ~ 3)
cfg.spi_3wire = false; // 受信をMOSIピンで行う場合はtrueを設定
cfg.freq_write = 40000000; // 送信時のSPIクロック (最大80MHz, 80MHzを整数で割った値に丸められます)
cfg.freq_read = 16000000; // 受信時のSPIクロック
cfg.pin_sclk = 14; // SPIのSCLKピン番号を設定
cfg.pin_mosi = 13; // SPIのMOSIピン番号を設定
cfg.pin_miso = 12; // SPIのMISOピン番号を設定 (-1 = disable)
cfg.pin_dc = 4; // SPIのD/Cピン番号を設定 (-1 = disable)
// SDカードと共通のSPIバスを使う場合、MISOは省略せず必ず設定してください。
_bus_instance.config(cfg); // 設定値をバスに反映します。
_panel_instance.setBus(&_bus_instance); // バスをパネルにセットします。
}
{ // 表示パネル制御の設定を行います。
auto cfg = _panel_instance.config(); // 表示パネル設定用の構造体を取得します。
cfg.pin_cs = 15; // CSが接続されているピン番号 (-1 = disable)
cfg.pin_rst = 16; // RSTが接続されているピン番号 (-1 = disable)
cfg.pin_busy = -1; // BUSYが接続されているピン番号 (-1 = disable)
// ※ 以下の設定値はパネル毎に一般的な初期値が設定されていますので、不明な項目はコメントアウトして試してみてください。
cfg.memory_width = 240; // ドライバICがサポートしている最大の幅
cfg.memory_height = 320; // ドライバICがサポートしている最大の高さ
cfg.panel_width = 240; // 実際に表示可能な幅
cfg.panel_height = 320; // 実際に表示可能な高さ
cfg.offset_x = 0; // パネルのX方向オフセット量
cfg.offset_y = 0; // パネルのY方向オフセット量
cfg.offset_rotation = 0; // 回転方向の値のオフセット 0~7 (4~7は上下反転)
cfg.dummy_read_pixel = 8; // ピクセル読出し前のダミーリードのビット数
cfg.dummy_read_bits = 1; // ピクセル以外のデータ読出し前のダミーリードのビット数
cfg.readable = true; // データ読出しが可能な場合 trueに設定
cfg.invert = false; // パネルの明暗が反転してしまう場合 trueに設定
cfg.rgb_order = false; // パネルの赤と青が入れ替わってしまう場合 trueに設定
cfg.dlen_16bit = false; // データ長を16bit単位で送信するパネルの場合 trueに設定
cfg.bus_shared = true; // SDカードとバスを共有している場合 trueに設定(drawJpgFile等でバス制御を行います)
_panel_instance.config(cfg);
}
setPanel(&_panel_instance); // 使用するパネルをセットします。
}
};

View file

@ -0,0 +1,122 @@
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
#include <lgfx/v1/platforms/esp32s3/Panel_RGB.hpp>
#include <lgfx/v1/platforms/esp32s3/Bus_RGB.hpp>
#include <driver/i2c.h>
class LGFX : public lgfx::LGFX_Device
{
public:
lgfx::Bus_RGB _bus_instance;
lgfx::Panel_RGB _panel_instance;
lgfx::Light_PWM _light_instance;
lgfx::Touch_GT911 _touch_instance;
LGFX(void)
{
{
auto cfg = _panel_instance.config();
#if defined ( LGFX_MAKERFABS_MATOUCH_1024X768 )
cfg.memory_width = 1024;
cfg.panel_width = 1024;
cfg.memory_height = 600;
cfg.panel_height = 600;
#else
cfg.memory_width = 800;
cfg.panel_width = 800;
cfg.memory_height = 480;
cfg.panel_height = 480;
#endif
cfg.offset_x = 0;
cfg.offset_y = 0;
_panel_instance.config(cfg);
}
{
auto cfg = _panel_instance.config_detail();
cfg.use_psram = 1;
_panel_instance.config_detail(cfg);
}
{
auto cfg = _bus_instance.config();
cfg.panel = &_panel_instance;
cfg.pin_d0 = GPIO_NUM_8; // B0
cfg.pin_d1 = GPIO_NUM_3; // B1
cfg.pin_d2 = GPIO_NUM_46; // B2
cfg.pin_d3 = GPIO_NUM_9; // B3
cfg.pin_d4 = GPIO_NUM_1; // B4
cfg.pin_d5 = GPIO_NUM_5; // G0
cfg.pin_d6 = GPIO_NUM_6; // G1
cfg.pin_d7 = GPIO_NUM_7; // G2
cfg.pin_d8 = GPIO_NUM_15; // G3
cfg.pin_d9 = GPIO_NUM_16; // G4
cfg.pin_d10 = GPIO_NUM_4; // G5
cfg.pin_d11 = GPIO_NUM_45; // R0
cfg.pin_d12 = GPIO_NUM_48; // R1
cfg.pin_d13 = GPIO_NUM_47; // R2
cfg.pin_d14 = GPIO_NUM_21; // R3
cfg.pin_d15 = GPIO_NUM_14; // R4
cfg.pin_henable = GPIO_NUM_40;
cfg.pin_vsync = GPIO_NUM_41;
cfg.pin_hsync = GPIO_NUM_39;
cfg.pin_pclk = GPIO_NUM_42;
cfg.freq_write = 16000000;
cfg.hsync_polarity = 0;
cfg.hsync_front_porch = 80;
cfg.hsync_pulse_width = 4;
cfg.hsync_back_porch = 16;
cfg.vsync_polarity = 0;
cfg.vsync_front_porch = 22;
cfg.vsync_pulse_width = 4;
cfg.vsync_back_porch = 4;
cfg.pclk_idle_high = 1;
_bus_instance.config(cfg);
}
_panel_instance.setBus(&_bus_instance);
{
auto cfg = _light_instance.config();
cfg.pin_bl = GPIO_NUM_10;
cfg.invert = true;
_light_instance.config(cfg);
}
_panel_instance.light(&_light_instance);
{
auto cfg = _touch_instance.config();
cfg.x_min = 0;
cfg.y_min = 0;
cfg.bus_shared = false;
cfg.offset_rotation = 0;
// I2C接続
cfg.i2c_port = I2C_NUM_1;
cfg.pin_sda = GPIO_NUM_17;
cfg.pin_scl = GPIO_NUM_18;
cfg.pin_int = GPIO_NUM_NC;
cfg.pin_rst = GPIO_NUM_38;
#if defined ( LGFX_MAKERFABS_MATOUCH_1024X768 )
cfg.x_max = 1024;
cfg.y_max = 768;
#else
cfg.x_max = 800;
cfg.y_max = 480;
#endif
cfg.freq = 400000;
_touch_instance.config(cfg);
_panel_instance.setTouch(&_touch_instance);
}
setPanel(&_panel_instance);
}
};

View file

@ -0,0 +1,56 @@
#pragma once
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
// LGFX for Waveshare RP2040-LCD-0.96
// https://www.waveshare.com/wiki/RP2040-LCD-0.96
class LGFX : public lgfx::LGFX_Device
{
lgfx::Panel_ST7735S _panel_instance;
lgfx::Bus_SPI _bus_instance;
lgfx::Light_PWM _light_instance;
public:
LGFX(void)
{
{
auto cfg = _bus_instance.config();
cfg.spi_host = 1;
cfg.spi_mode = 0;
cfg.freq_write = 80000000;
cfg.pin_sclk = 10;
cfg.pin_miso = -1;
cfg.pin_mosi = 11;
cfg.pin_dc = 8;
_bus_instance.config(cfg);
_panel_instance.setBus(&_bus_instance);
}
{
auto cfg = _panel_instance.config();
cfg.pin_cs = 9;
cfg.pin_rst = 12;
cfg.panel_width = 80;
cfg.panel_height = 160;
cfg.offset_x = 26;
cfg.offset_y = 1;
cfg.invert = true;
cfg.rgb_order = false;
//cfg.offset_rotation = 0;
_panel_instance.config(cfg);
}
{
auto cfg = _light_instance.config();
cfg.pin_bl = 25;
cfg.pwm_channel = 1;
_light_instance.config(cfg);
_panel_instance.setLight(&_light_instance);
}
setPanel(&_panel_instance);
}
};

View file

@ -0,0 +1,132 @@
#pragma once
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
// SAMD21でLovyanGFXを独自設定で利用する場合の設定例
/*
このファイルを複製し、新しい名前を付けて、環境に合わせて設定内容を変更してください。
作成したファイルをユーザープログラムからincludeすることで利用可能になります。
複製したファイルはライブラリのlgfx_userフォルダに置いて利用しても構いませんが、
その場合はライブラリのアップデート時に削除される可能性があるのでご注意ください。
安全に運用したい場合はバックアップを作成しておくか、ユーザープロジェクトのフォルダに置いてください。
//*/
/// 独自の設定を行うクラスを、LGFX_Deviceから派生して作成します。
class LGFX : public lgfx::LGFX_Device
{
/*
クラス名は"LGFX"から別の名前に変更しても構いません。
AUTODETECTと併用する場合は"LGFX"は使用されているため、LGFX以外の名前に変更してください。
また、複数枚のパネルを同時使用する場合もそれぞれに異なる名前を付けてください。
※ クラス名を変更する場合はコンストラクタの名前も併せて同じ名前に変更が必要です。
名前の付け方は自由に決めて構いませんが、設定が増えた場合を想定し、
例えばSeeed XIAOでSPI接続のILI9341の設定を行った場合、
LGFX_XIAO_SPI_ILI9341
のような名前にし、ファイル名とクラス名を一致させておくことで、利用時に迷いにくくなります。
//*/
// 接続するパネルの型にあったインスタンスを用意します。
//lgfx::Panel_GC9A01 _panel_instance;
//lgfx::Panel_GDEW0154M09 _panel_instance;
//lgfx::Panel_HX8357B _panel_instance;
//lgfx::Panel_HX8357D _panel_instance;
//lgfx::Panel_ILI9163 _panel_instance;
lgfx::Panel_ILI9341 _panel_instance;
//lgfx::Panel_ILI9342 _panel_instance;
//lgfx::Panel_ILI9481 _panel_instance;
//lgfx::Panel_ILI9486 _panel_instance;
//lgfx::Panel_ILI9488 _panel_instance;
//lgfx::Panel_IT8951 _panel_instance;
//lgfx::Panel_SH110x _panel_instance; // SH1106, SH1107
//lgfx::Panel_SSD1306 _panel_instance;
//lgfx::Panel_SSD1327 _panel_instance;
//lgfx::Panel_SSD1331 _panel_instance;
//lgfx::Panel_SSD1351 _panel_instance; // SSD1351, SSD1357
//lgfx::Panel_SSD1963 _panel_instance;
//lgfx::Panel_ST7735 _panel_instance;
//lgfx::Panel_ST7735S _panel_instance;
//lgfx::Panel_ST7789 _panel_instance;
//lgfx::Panel_ST7796 _panel_instance;
// パネルを接続するバスの種類にあったインスタンスを用意します。
lgfx::Bus_SPI _bus_instance; // SPIバスのインスタンス
//lgfx::Bus_I2C _bus_instance; // I2Cバスのインスタンス (ESP32のみ)
//lgfx::Bus_Parallel8 _bus_instance; // 8ビットパラレルバスのインスタンス (ESP32のみ)
public:
// コンストラクタを作成し、ここで各種設定を行います。
// クラス名を変更した場合はコンストラクタも同じ名前を指定してください。
LGFX(void)
{
{ // バス制御の設定を行います。
auto cfg = _bus_instance.config(); // バス設定用の構造体を取得します。
// SPIバスの設定
cfg.sercom_index = 0; // 使用するSERCOMの番号を指定
cfg.spi_mode = 0; // SPI通信モードを設定 (0 ~ 3)
cfg.freq_write = 24000000; // 送信時のSPIクロック (最大24MHz, 24MHzを整数で割った値に丸められます)
cfg.freq_read = 12000000; // 受信時のSPIクロック
cfg.pin_sclk = lgfx::samd21::PORT_A | 7; // SPIのSCLKピン番号を設定
cfg.pin_mosi = lgfx::samd21::PORT_A | 6; // SPIのMOSIピン番号を設定
cfg.pin_miso = lgfx::samd21::PORT_A | 5; // SPIのMISOピン番号を設定 (-1 = disable)
cfg.pin_dc = lgfx::samd21::PORT_A | 4; // SPIのD/Cピン番号を設定 (-1 = disable)
// SDカードと共通のSPIバスを使う場合、MISOは省略せず必ず設定してください。
// ※ ピン番号の設定は、Arduino互換用のピン番号ではなく、"PA07" 等の実際のMCUのポート番号を指定します。
// ※ SERCOMのPAD設定は不要です。LGFX内部でSERCOM番号とポート番号を元にPADを自動設定する仕組みになっています。
//*/
/*
// I2Cバスの設定
cfg.sercom_index = 0; // 使用するSERCOMの番号を指定
cfg.freq_write = 400000; // 送信時のクロック
cfg.freq_read = 400000; // 受信時のクロック
cfg.pin_sda = lgfx::samd21::PORT_A | 8; // I2CのSDAをピン番号を設定
cfg.pin_scl = lgfx::samd21::PORT_A | 9; // I2CのSCLをピン番号を設定
cfg.i2c_addr = 0x3C; // I2Cデバイスのアドレス
//*/
_bus_instance.config(cfg); // 設定値をバスに反映します。
_panel_instance.setBus(&_bus_instance); // バスをパネルにセットします。
}
{ // 表示パネル制御の設定を行います。
auto cfg = _panel_instance.config(); // 表示パネル設定用の構造体を取得します。
cfg.pin_cs = lgfx::samd21::PORT_A | 10; // CSが接続されているピン番号 (-1 = disable)
cfg.pin_rst = lgfx::samd21::PORT_A | 11; // RSTが接続されているピン番号 (-1 = disable)
cfg.pin_busy = -1; // BUSYが接続されているピン番号 (-1 = disable)
// ※ 以下の設定値はパネル毎に一般的な初期値が設定されていますので、不明な項目はコメントアウトして試してみてください。
cfg.memory_width = 240; // ドライバICがサポートしている最大の幅
cfg.memory_height = 320; // ドライバICがサポートしている最大の高さ
cfg.panel_width = 240; // 実際に表示可能な幅
cfg.panel_height = 320; // 実際に表示可能な高さ
cfg.offset_x = 0; // パネルのX方向オフセット量
cfg.offset_y = 0; // パネルのY方向オフセット量
cfg.offset_rotation = 0; // 回転方向の値のオフセット 0~7 (4~7は上下反転)
cfg.dummy_read_pixel = 8; // ピクセル読出し前のダミーリードのビット数
cfg.dummy_read_bits = 1; // ピクセル以外のデータ読出し前のダミーリードのビット数
cfg.readable = true; // データ読出しが可能な場合 trueに設定
cfg.invert = false; // パネルの明暗が反転してしまう場合 trueに設定
cfg.rgb_order = false; // パネルの赤と青が入れ替わってしまう場合 trueに設定
cfg.dlen_16bit = false; // データ長を16bit単位で送信するパネルの場合 trueに設定
cfg.bus_shared = true; // SDカードとバスを共有している場合 trueに設定(drawJpgFile等でバス制御を行います)
_panel_instance.config(cfg);
}
setPanel(&_panel_instance); // 使用するパネルをセットします。
}
};

View file

@ -0,0 +1,132 @@
#pragma once
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
// SAMD51でLovyanGFXを独自設定で利用する場合の設定例
/*
このファイルを複製し、新しい名前を付けて、環境に合わせて設定内容を変更してください。
作成したファイルをユーザープログラムからincludeすることで利用可能になります。
複製したファイルはライブラリのlgfx_userフォルダに置いて利用しても構いませんが、
その場合はライブラリのアップデート時に削除される可能性があるのでご注意ください。
安全に運用したい場合はバックアップを作成しておくか、ユーザープロジェクトのフォルダに置いてください。
//*/
/// 独自の設定を行うクラスを、LGFX_Deviceから派生して作成します。
class LGFX : public lgfx::LGFX_Device
{
/*
クラス名は"LGFX"から別の名前に変更しても構いません。
AUTODETECTと併用する場合は"LGFX"は使用されているため、LGFX以外の名前に変更してください。
また、複数枚のパネルを同時使用する場合もそれぞれに異なる名前を付けてください。
※ クラス名を変更する場合はコンストラクタの名前も併せて同じ名前に変更が必要です。
名前の付け方は自由に決めて構いませんが、設定が増えた場合を想定し、
例えばFeatherWing M4でSPI接続のILI9341の設定を行った場合、
LGFX_FEATHER_M4_SPI_ILI9341
のような名前にし、ファイル名とクラス名を一致させておくことで、利用時に迷いにくくなります。
//*/
// 接続するパネルの型にあったインスタンスを用意します。
//lgfx::Panel_GC9A01 _panel_instance;
//lgfx::Panel_GDEW0154M09 _panel_instance;
//lgfx::Panel_HX8357B _panel_instance;
//lgfx::Panel_HX8357D _panel_instance;
//lgfx::Panel_ILI9163 _panel_instance;
lgfx::Panel_ILI9341 _panel_instance;
//lgfx::Panel_ILI9342 _panel_instance;
//lgfx::Panel_ILI9481 _panel_instance;
//lgfx::Panel_ILI9486 _panel_instance;
//lgfx::Panel_ILI9488 _panel_instance;
//lgfx::Panel_IT8951 _panel_instance;
//lgfx::Panel_SH110x _panel_instance; // SH1106, SH1107
//lgfx::Panel_SSD1306 _panel_instance;
//lgfx::Panel_SSD1327 _panel_instance;
//lgfx::Panel_SSD1331 _panel_instance;
//lgfx::Panel_SSD1351 _panel_instance; // SSD1351, SSD1357
//lgfx::Panel_SSD1963 _panel_instance;
//lgfx::Panel_ST7735 _panel_instance;
//lgfx::Panel_ST7735S _panel_instance;
//lgfx::Panel_ST7789 _panel_instance;
//lgfx::Panel_ST7796 _panel_instance;
// パネルを接続するバスの種類にあったインスタンスを用意します。
lgfx::Bus_SPI _bus_instance; // SPIバスのインスタンス
//lgfx::Bus_I2C _bus_instance; // I2Cバスのインスタンス (ESP32のみ)
//lgfx::Bus_Parallel8 _bus_instance; // 8ビットパラレルバスのインスタンス (ESP32のみ)
public:
// コンストラクタを作成し、ここで各種設定を行います。
// クラス名を変更した場合はコンストラクタも同じ名前を指定してください。
LGFX(void)
{
{ // バス制御の設定を行います。
auto cfg = _bus_instance.config(); // バス設定用の構造体を取得します。
// SPIバスの設定
cfg.sercom_index = 1; // 使用するSERCOMの番号を指定
cfg.spi_mode = 0; // SPI通信モードを設定 (0 ~ 3)
cfg.freq_write = 24000000; // 送信時のSPIクロック (CPU動作クロックを整数で割った値に丸められます)
cfg.freq_read = 12000000; // 受信時のSPIクロック
cfg.pin_sclk = lgfx::samd51::PORT_A | 17; // SPIのSCLKピン番号を設定
cfg.pin_mosi = lgfx::samd51::PORT_B | 23; // SPIのMOSIピン番号を設定
cfg.pin_miso = lgfx::samd51::PORT_B | 22; // SPIのMISOピン番号を設定 (-1 = disable)
cfg.pin_dc = lgfx::samd51::PORT_A | 20; // SPIのD/Cピン番号を設定 (-1 = disable)
// SDカードと共通のSPIバスを使う場合、MISOは省略せず必ず設定してください。
// ※ ピン番号の設定は、Arduino互換用のピン番号ではなく、"PA07" 等の実際のMCUのポート番号を指定します。
// ※ SERCOMのPAD設定は不要です。LGFX内部でSERCOM番号とポート番号を元にPADを自動設定する仕組みになっています。
//*/
/*
// I2Cバスの設定
cfg.sercom_index = 2; // 使用するSERCOMの番号を指定
cfg.freq_write = 400000; // 送信時のクロック
cfg.freq_read = 400000; // 受信時のクロック
cfg.pin_sda = lgfx::samd51::PORT_A | 12; // I2CのSDAをピン番号を設定
cfg.pin_scl = lgfx::samd51::PORT_A | 13; // I2CのSCLをピン番号を設定
cfg.i2c_addr = 0x3C; // I2Cデバイスのアドレス
//*/
_bus_instance.config(cfg); // 設定値をバスに反映します。
_panel_instance.setBus(&_bus_instance); // バスをパネルにセットします。
}
{ // 表示パネル制御の設定を行います。
auto cfg = _panel_instance.config(); // 表示パネル設定用の構造体を取得します。
cfg.pin_cs = lgfx::samd51::PORT_A | 19; // CSが接続されているピン番号 (-1 = disable)
cfg.pin_rst = -1; // RSTが接続されているピン番号 (-1 = disable)
cfg.pin_busy = -1; // BUSYが接続されているピン番号 (-1 = disable)
// ※ 以下の設定値はパネル毎に一般的な初期値が設定されていますので、不明な項目はコメントアウトして試してみてください。
cfg.memory_width = 240; // ドライバICがサポートしている最大の幅
cfg.memory_height = 320; // ドライバICがサポートしている最大の高さ
cfg.panel_width = 240; // 実際に表示可能な幅
cfg.panel_height = 320; // 実際に表示可能な高さ
cfg.offset_x = 0; // パネルのX方向オフセット量
cfg.offset_y = 0; // パネルのY方向オフセット量
cfg.offset_rotation = 0; // 回転方向の値のオフセット 0~7 (4~7は上下反転)
cfg.dummy_read_pixel = 8; // ピクセル読出し前のダミーリードのビット数
cfg.dummy_read_bits = 1; // ピクセル以外のデータ読出し前のダミーリードのビット数
cfg.readable = true; // データ読出しが可能な場合 trueに設定
cfg.invert = false; // パネルの明暗が反転してしまう場合 trueに設定
cfg.rgb_order = false; // パネルの赤と青が入れ替わってしまう場合 trueに設定
cfg.dlen_16bit = false; // データ長を16bit単位で送信するパネルの場合 trueに設定
cfg.bus_shared = true; // SDカードとバスを共有している場合 trueに設定(drawJpgFile等でバス制御を行います)
_panel_instance.config(cfg);
}
setPanel(&_panel_instance); // 使用するパネルをセットします。
}
};

View file

@ -0,0 +1,114 @@
#pragma once
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
// SPRESENSEでLovyanGFXを独自設定で利用する場合の設定例
/*
このファイルを複製し、新しい名前を付けて、環境に合わせて設定内容を変更してください。
作成したファイルをユーザープログラムからincludeすることで利用可能になります。
複製したファイルはライブラリのlgfx_userフォルダに置いて利用しても構いませんが、
その場合はライブラリのアップデート時に削除される可能性があるのでご注意ください。
安全に運用したい場合はバックアップを作成しておくか、ユーザープロジェクトのフォルダに置いてください。
//*/
/// 独自の設定を行うクラスを、LGFX_Deviceから派生して作成します。
class LGFX : public lgfx::LGFX_Device
{
/*
クラス名は"LGFX"から別の名前に変更しても構いません。
AUTODETECTと併用する場合は"LGFX"は使用されているため、LGFX以外の名前に変更してください。
また、複数枚のパネルを同時使用する場合もそれぞれに異なる名前を付けてください。
※ クラス名を変更する場合はコンストラクタの名前も併せて同じ名前に変更が必要です。
名前の付け方は自由に決めて構いませんが、設定が増えた場合を想定し、
例えば SPRESENSE でSPI接続のILI9341の設定を行った場合、
LGFX_SPRESENSE_SPI_ILI9341
のような名前にし、ファイル名とクラス名を一致させておくことで、利用時に迷いにくくなります。
//*/
// 接続するパネルの型にあったインスタンスを用意します。
//lgfx::Panel_GC9A01 _panel_instance;
//lgfx::Panel_GDEW0154M09 _panel_instance;
//lgfx::Panel_HX8357B _panel_instance;
//lgfx::Panel_HX8357D _panel_instance;
//lgfx::Panel_ILI9163 _panel_instance;
lgfx::Panel_ILI9341 _panel_instance;
//lgfx::Panel_ILI9342 _panel_instance;
//lgfx::Panel_ILI9481 _panel_instance;
//lgfx::Panel_ILI9486 _panel_instance;
//lgfx::Panel_ILI9488 _panel_instance;
//lgfx::Panel_IT8951 _panel_instance;
//lgfx::Panel_SH110x _panel_instance; // SH1106, SH1107
//lgfx::Panel_SSD1306 _panel_instance;
//lgfx::Panel_SSD1327 _panel_instance;
//lgfx::Panel_SSD1331 _panel_instance;
//lgfx::Panel_SSD1351 _panel_instance; // SSD1351, SSD1357
//lgfx::Panel_SSD1963 _panel_instance;
//lgfx::Panel_ST7735 _panel_instance;
//lgfx::Panel_ST7735S _panel_instance;
//lgfx::Panel_ST7789 _panel_instance;
//lgfx::Panel_ST7796 _panel_instance;
// SPIバスのインスタンスを用意します。
lgfx::Bus_SPI _bus_instance; // SPIバスのインスタンス
public:
// コンストラクタを作成し、ここで各種設定を行います。
// クラス名を変更した場合はコンストラクタも同じ名前を指定してください。
LGFX(void)
{
{ // バス制御の設定を行います。
auto cfg = _bus_instance.config(); // バス設定用の構造体を取得します。
cfg.spi_mode = 0; // SPI通信モードを設定 (0 ~ 3)
cfg.freq_write = 40000000; // 送信時のSPIクロック
cfg.freq_read = 16000000; // 受信時のSPIクロック
cfg.pin_dc = 9; // SPIのD/Cピン番号を設定 (-1 = disable)
cfg.spi_port = 4; // Arduino拡張ボードの場合は 4
_bus_instance.config(cfg); // 設定値をバスに反映します。
_panel_instance.setBus(&_bus_instance); // バスをパネルにセットします。
}
{ // 表示パネル制御の設定を行います。
auto cfg = _panel_instance.config(); // 表示パネル設定用の構造体を取得します。
// cfg.pin_cs = -1; // CSが接続されているピン番号 (-1 = disable) HW CSピンの場合は-1を指定
cfg.pin_rst = 8; // RSTが接続されているピン番号 (-1 = disable)
cfg.pin_busy = -1; // BUSYが接続されているピン番号 (-1 = disable)
// ※ 以下の設定値はパネル毎に一般的な初期値が設定されていますので、不明な項目はコメントアウトして試してみてください。
cfg.panel_width = 240; // 実際に表示可能な幅
cfg.panel_height = 320; // 実際に表示可能な高さ
cfg.offset_x = 0; // パネルのX方向オフセット量
cfg.offset_y = 0; // パネルのY方向オフセット量
cfg.offset_rotation = 0; // 回転方向の値のオフセット 0~7 (4~7は上下反転)
cfg.dummy_read_pixel = 8; // ピクセル読出し前のダミーリードのビット数
cfg.dummy_read_bits = 1; // ピクセル以外のデータ読出し前のダミーリードのビット数
cfg.readable = true; // データ読出しが可能な場合 trueに設定
cfg.invert = false; // パネルの明暗が反転してしまう場合 trueに設定
cfg.rgb_order = false; // パネルの赤と青が入れ替わってしまう場合 trueに設定
cfg.dlen_16bit = false; // データ長を16bit単位で送信するパネルの場合 trueに設定
cfg.bus_shared = true; // SDカードとバスを共有している場合 trueに設定(drawJpgFile等でバス制御を行います)
// 以下はST7735やILI9163のようにピクセル数が変更できるドライバでのみ設定してください。
// cfg.memory_width = 240; // ドライバICがサポートしている最大の幅
// cfg.memory_height = 320; // ドライバICがサポートしている最大の高さ
_panel_instance.config(cfg);
}
setPanel(&_panel_instance); // 使用するパネルをセットします。
}
};

View file

@ -0,0 +1,111 @@
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
#include <lgfx/v1/platforms/esp32s3/Panel_RGB.hpp>
#include <lgfx/v1/platforms/esp32s3/Bus_RGB.hpp>
#include <driver/i2c.h>
class LGFX : public lgfx::LGFX_Device
{
public:
lgfx::Bus_RGB _bus_instance;
lgfx::Panel_RGB _panel_instance;
lgfx::Light_PWM _light_instance;
lgfx::Touch_GT911 _touch_instance;
LGFX(void)
{
{
auto cfg = _panel_instance.config();
cfg.memory_width = 800;
cfg.memory_height = 480;
cfg.panel_width = 800;
cfg.panel_height = 480;
cfg.offset_x = 0;
cfg.offset_y = 0;
_panel_instance.config(cfg);
}
{
auto cfg = _panel_instance.config_detail();
cfg.use_psram = 1;
_panel_instance.config_detail(cfg);
}
{
auto cfg = _bus_instance.config();
cfg.panel = &_panel_instance;
cfg.pin_d0 = GPIO_NUM_15; // B0
cfg.pin_d1 = GPIO_NUM_7; // B1
cfg.pin_d2 = GPIO_NUM_6; // B2
cfg.pin_d3 = GPIO_NUM_5; // B3
cfg.pin_d4 = GPIO_NUM_4; // B4
cfg.pin_d5 = GPIO_NUM_9; // G0
cfg.pin_d6 = GPIO_NUM_46; // G1
cfg.pin_d7 = GPIO_NUM_3; // G2
cfg.pin_d8 = GPIO_NUM_8; // G3
cfg.pin_d9 = GPIO_NUM_16; // G4
cfg.pin_d10 = GPIO_NUM_1; // G5
cfg.pin_d11 = GPIO_NUM_14; // R0
cfg.pin_d12 = GPIO_NUM_21; // R1
cfg.pin_d13 = GPIO_NUM_47; // R2
cfg.pin_d14 = GPIO_NUM_48; // R3
cfg.pin_d15 = GPIO_NUM_45; // R4
cfg.pin_henable = GPIO_NUM_41;
cfg.pin_vsync = GPIO_NUM_40;
cfg.pin_hsync = GPIO_NUM_39;
cfg.pin_pclk = GPIO_NUM_42;
cfg.freq_write = 14000000;
cfg.hsync_polarity = 0;
cfg.hsync_front_porch = 80;
cfg.hsync_pulse_width = 4;
cfg.hsync_back_porch = 16;
cfg.vsync_polarity = 0;
cfg.vsync_front_porch = 22;
cfg.vsync_pulse_width = 4;
cfg.vsync_back_porch = 4;
cfg.pclk_idle_high = 1;
_bus_instance.config(cfg);
}
_panel_instance.setBus(&_bus_instance);
{
auto cfg = _light_instance.config();
cfg.pin_bl = GPIO_NUM_2;
_light_instance.config(cfg);
}
_panel_instance.light(&_light_instance);
{
auto cfg = _touch_instance.config();
cfg.x_min = 0;
cfg.x_max = 800;
cfg.y_min = 0;
cfg.y_max = 480;
cfg.pin_int = GPIO_NUM_NC;
cfg.bus_shared = false;
cfg.offset_rotation = 0;
// I2C接続
cfg.i2c_port = I2C_NUM_1;
cfg.pin_sda = GPIO_NUM_19;
cfg.pin_scl = GPIO_NUM_20;
cfg.pin_rst = GPIO_NUM_38;
cfg.freq = 400000;
cfg.i2c_addr = 0x14; // 0x5D , 0x14
_touch_instance.config(cfg);
_panel_instance.setTouch(&_touch_instance);
}
setPanel(&_panel_instance);
}
};

View file

@ -0,0 +1,177 @@
#pragma once
#if defined ( ESP_PLATFORM )
#include <sdkconfig.h>
#include <soc/efuse_reg.h>
#define LGFX_USE_V1
#include <lgfx/v1/panel/Panel_M5HDMI.hpp>
#include <LovyanGFX.hpp>
#ifndef M5ATOMDISPLAY_LOGICAL_WIDTH
#define M5ATOMDISPLAY_LOGICAL_WIDTH 1280
#endif
#ifndef M5ATOMDISPLAY_LOGICAL_HEIGHT
#define M5ATOMDISPLAY_LOGICAL_HEIGHT 720
#endif
#ifndef M5ATOMDISPLAY_REFRESH_RATE
#define M5ATOMDISPLAY_REFRESH_RATE 0.0f
#endif
#ifndef M5ATOMDISPLAY_OUTPUT_WIDTH
#define M5ATOMDISPLAY_OUTPUT_WIDTH 0
#endif
#ifndef M5ATOMDISPLAY_OUTPUT_HEIGHT
#define M5ATOMDISPLAY_OUTPUT_HEIGHT 0
#endif
#ifndef M5ATOMDISPLAY_SCALE_W
#define M5ATOMDISPLAY_SCALE_W 0
#endif
#ifndef M5ATOMDISPLAY_SCALE_H
#define M5ATOMDISPLAY_SCALE_H 0
#endif
#ifndef M5ATOMDISPLAY_PIXELCLOCK
#define M5ATOMDISPLAY_PIXELCLOCK 74250000
#endif
#ifndef M5ATOMDISPLAY_SPI_DMA_CH
#if __has_include(<esp_idf_version.h>)
#include <esp_idf_version.h>
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 3, 0)
#define M5ATOMDISPLAY_SPI_DMA_CH SPI_DMA_CH_AUTO
#endif
#endif
#ifndef M5ATOMDISPLAY_SPI_DMA_CH
#define M5ATOMDISPLAY_SPI_DMA_CH 1
#endif
#endif
class M5AtomDisplay : public lgfx::LGFX_Device
{
lgfx::Panel_M5HDMI _panel_instance;
lgfx::Bus_SPI _bus_instance;
public:
M5AtomDisplay( uint16_t logical_width = M5ATOMDISPLAY_LOGICAL_WIDTH
, uint16_t logical_height = M5ATOMDISPLAY_LOGICAL_HEIGHT
, float refresh_rate = M5ATOMDISPLAY_REFRESH_RATE
, uint16_t output_width = M5ATOMDISPLAY_OUTPUT_WIDTH
, uint16_t output_height = M5ATOMDISPLAY_OUTPUT_HEIGHT
, uint_fast8_t scale_w = M5ATOMDISPLAY_SCALE_W
, uint_fast8_t scale_h = M5ATOMDISPLAY_SCALE_H
, uint32_t pixel_clock = M5ATOMDISPLAY_PIXELCLOCK
)
{
lgfx::Panel_M5HDMI::config_resolution_t cfg_reso;
cfg_reso.logical_width = logical_width;
cfg_reso.logical_height = logical_height;
cfg_reso.refresh_rate = refresh_rate;
cfg_reso.output_width = output_width;
cfg_reso.output_height = output_height;
cfg_reso.scale_w = scale_w;
cfg_reso.scale_h = scale_h;
cfg_reso.pixel_clock = pixel_clock;
_panel_instance.config_resolution(cfg_reso);
_board = lgfx::board_t::board_M5AtomDisplay;
}
bool init_impl(bool use_reset, bool use_clear) override
{
#if defined (CONFIG_IDF_TARGET_ESP32S3)
// for AtomS3/AtomS3Lite
static constexpr int i2c_port = 1;
static constexpr int i2c_sda = GPIO_NUM_38;
static constexpr int i2c_scl = GPIO_NUM_39;
static constexpr int spi_cs = GPIO_NUM_8;
static constexpr int spi_mosi = GPIO_NUM_6;
static constexpr int spi_miso = GPIO_NUM_5;
static constexpr int spi_sclk = GPIO_NUM_7;
spi_host_device_t spi_host = SPI2_HOST;
#elif !defined (CONFIG_IDF_TARGET) || defined (CONFIG_IDF_TARGET_ESP32)
static constexpr int i2c_port = 1;
static constexpr int i2c_sda = GPIO_NUM_25;
static constexpr int i2c_scl = GPIO_NUM_21;
static constexpr int spi_cs = GPIO_NUM_33;
static constexpr int spi_mosi = GPIO_NUM_19;
static constexpr int spi_miso = GPIO_NUM_22;
spi_host_device_t spi_host = VSPI_HOST;
int spi_sclk = (lgfx::get_pkg_ver() == EFUSE_RD_CHIP_VER_PKG_ESP32PICOD4)
? GPIO_NUM_23 // for ATOM Lite / Matrix
: GPIO_NUM_5 // for ATOM PSRAM
;
#endif
{
auto cfg = _bus_instance.config();
cfg.freq_write = 80000000;
cfg.freq_read = 16000000;
cfg.spi_host = spi_host;
cfg.spi_mode = 3;
cfg.use_lock = true;
cfg.pin_mosi = spi_mosi;
cfg.pin_miso = spi_miso;
cfg.pin_sclk = spi_sclk;
cfg.spi_3wire = false;
cfg.dma_channel = M5ATOMDISPLAY_SPI_DMA_CH;
_bus_instance.config(cfg);
_panel_instance.setBus(&_bus_instance);
}
{
auto cfg = _panel_instance.config_transmitter();
cfg.freq_read = 400000;
cfg.freq_write = 400000;
cfg.pin_scl = i2c_scl;
cfg.pin_sda = i2c_sda;
cfg.i2c_port = i2c_port;
cfg.i2c_addr = 0x39;
cfg.prefix_cmd = 0x00;
cfg.prefix_data = 0x00;
cfg.prefix_len = 0;
_panel_instance.config_transmitter(cfg);
}
{
auto cfg = _panel_instance.config();
cfg.offset_rotation = 3;
cfg.pin_cs = spi_cs;
cfg.readable = false;
cfg.bus_shared = false;
_panel_instance.config(cfg);
_panel_instance.setRotation(1);
}
setPanel(&_panel_instance);
return LGFX_Device::init_impl(use_reset, use_clear);
}
bool setResolution( uint16_t logical_width = M5ATOMDISPLAY_LOGICAL_WIDTH
, uint16_t logical_height = M5ATOMDISPLAY_LOGICAL_HEIGHT
, float refresh_rate = M5ATOMDISPLAY_REFRESH_RATE
, uint16_t output_width = M5ATOMDISPLAY_OUTPUT_WIDTH
, uint16_t output_height = M5ATOMDISPLAY_OUTPUT_HEIGHT
, uint_fast8_t scale_w = M5ATOMDISPLAY_SCALE_W
, uint_fast8_t scale_h = M5ATOMDISPLAY_SCALE_H
, uint32_t pixel_clock = M5ATOMDISPLAY_PIXELCLOCK
)
{
bool res = _panel_instance.setResolution
( logical_width
, logical_height
, refresh_rate
, output_width
, output_height
, scale_w
, scale_h
, pixel_clock
);
setRotation(getRotation());
return res;
}
};
#endif

View file

@ -0,0 +1,198 @@
#pragma once
#if defined ( ESP_PLATFORM )
#include <sdkconfig.h>
#include <soc/efuse_reg.h>
#define LGFX_USE_V1
#include <lgfx/v1/panel/Panel_M5HDMI.hpp>
#include <LovyanGFX.hpp>
#ifndef M5MODULEDISPLAY_LOGICAL_WIDTH
#define M5MODULEDISPLAY_LOGICAL_WIDTH 1280
#endif
#ifndef M5MODULEDISPLAY_LOGICAL_HEIGHT
#define M5MODULEDISPLAY_LOGICAL_HEIGHT 720
#endif
#ifndef M5MODULEDISPLAY_REFRESH_RATE
#define M5MODULEDISPLAY_REFRESH_RATE 0.0f
#endif
#ifndef M5MODULEDISPLAY_OUTPUT_WIDTH
#define M5MODULEDISPLAY_OUTPUT_WIDTH 0
#endif
#ifndef M5MODULEDISPLAY_OUTPUT_HEIGHT
#define M5MODULEDISPLAY_OUTPUT_HEIGHT 0
#endif
#ifndef M5MODULEDISPLAY_SCALE_W
#define M5MODULEDISPLAY_SCALE_W 0
#endif
#ifndef M5MODULEDISPLAY_SCALE_H
#define M5MODULEDISPLAY_SCALE_H 0
#endif
#ifndef M5MODULEDISPLAY_PIXELCLOCK
#define M5MODULEDISPLAY_PIXELCLOCK 74250000
#endif
#ifndef M5MODULEDISPLAY_SPI_DMA_CH
#if __has_include(<esp_idf_version.h>)
#include <esp_idf_version.h>
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 3, 0)
#define M5MODULEDISPLAY_SPI_DMA_CH SPI_DMA_CH_AUTO
#endif
#endif
#ifndef M5MODULEDISPLAY_SPI_DMA_CH
#define M5MODULEDISPLAY_SPI_DMA_CH 1
#endif
#endif
class M5ModuleDisplay : public lgfx::LGFX_Device
{
lgfx::Panel_M5HDMI _panel_instance;
lgfx::Bus_SPI _bus_instance;
public:
M5ModuleDisplay( uint16_t logical_width = M5MODULEDISPLAY_LOGICAL_WIDTH
, uint16_t logical_height = M5MODULEDISPLAY_LOGICAL_HEIGHT
, float refresh_rate = M5MODULEDISPLAY_REFRESH_RATE
, uint16_t output_width = M5MODULEDISPLAY_OUTPUT_WIDTH
, uint16_t output_height = M5MODULEDISPLAY_OUTPUT_HEIGHT
, uint_fast8_t scale_w = M5MODULEDISPLAY_SCALE_W
, uint_fast8_t scale_h = M5MODULEDISPLAY_SCALE_H
, uint32_t pixel_clock = M5MODULEDISPLAY_PIXELCLOCK
)
{
lgfx::Panel_M5HDMI::config_resolution_t cfg_reso;
cfg_reso.logical_width = logical_width;
cfg_reso.logical_height = logical_height;
cfg_reso.refresh_rate = refresh_rate;
cfg_reso.output_width = output_width;
cfg_reso.output_height = output_height;
cfg_reso.scale_w = scale_w;
cfg_reso.scale_h = scale_h;
cfg_reso.pixel_clock = pixel_clock;
_panel_instance.config_resolution(cfg_reso);
_board = lgfx::board_t::board_M5ModuleDisplay;
}
bool init_impl(bool use_reset, bool use_clear) override
{
#if defined (CONFIG_IDF_TARGET_ESP32S3)
// for CoreS3
int i2c_port = 1;
int i2c_sda = GPIO_NUM_12;
int i2c_scl = GPIO_NUM_11;
int spi_cs = GPIO_NUM_7;
int spi_mosi = GPIO_NUM_37;
int spi_miso = GPIO_NUM_35;
int spi_sclk = GPIO_NUM_36;
spi_host_device_t spi_host = SPI2_HOST;
#elif !defined (CONFIG_IDF_TARGET) || defined (CONFIG_IDF_TARGET_ESP32)
int i2c_port = 1;
int i2c_sda = GPIO_NUM_21;
int i2c_scl = GPIO_NUM_22;
int spi_cs = GPIO_NUM_19;
int spi_miso = GPIO_NUM_38;
int spi_mosi = GPIO_NUM_23;
int spi_sclk = GPIO_NUM_18;
spi_host_device_t spi_host = VSPI_HOST;
static constexpr const int axp192_addr = 0x34;
if (0x03 == lgfx::i2c::readRegister8(1, axp192_addr, 0x03, 400000))
{ // M5Stack Core2 / Tough
#if defined ( ESP_LOGD )
ESP_LOGD("LGFX","ModuleDisplay with Core2/Tough");
#endif
// トランスミッタと通信できなければAXP192に外部5V出力を要求
if (lgfx::i2c::beginTransaction(1, 0x39, 400000).has_error()
|| lgfx::i2c::endTransaction(1).has_error())
{
lgfx::i2c::writeRegister8(1, axp192_addr, 0x90, 0x02); // reg90h GPIO0 : enable=LDO
lgfx::i2c::bitOn(1, axp192_addr, 0x12, 1 << 6); // reg12h setExtEn
}
}
else
{ // M5Stack BASIC / FIRE / GO
#if defined ( ESP_LOGD )
ESP_LOGD("LGFX","ModuleDisplay with Core Basic/Fire/Go");
#endif
i2c_port = 0;
spi_cs = GPIO_NUM_13;
spi_miso = GPIO_NUM_19;
}
#endif
{
auto cfg = _bus_instance.config();
cfg.freq_write = 80000000;
cfg.freq_read = 16000000;
cfg.spi_host = spi_host;
cfg.spi_mode = 3;
cfg.use_lock = true;
cfg.pin_mosi = spi_mosi;
cfg.pin_miso = spi_miso;
cfg.pin_sclk = spi_sclk;
cfg.spi_3wire = false;
cfg.dma_channel = M5MODULEDISPLAY_SPI_DMA_CH;
_bus_instance.config(cfg);
_panel_instance.setBus(&_bus_instance);
}
{
auto cfg = _panel_instance.config_transmitter();
cfg.freq_read = 400000;
cfg.freq_write = 400000;
cfg.pin_scl = i2c_scl;
cfg.pin_sda = i2c_sda;
cfg.i2c_port = i2c_port;
cfg.i2c_addr = 0x39;
cfg.prefix_cmd = 0x00;
cfg.prefix_data = 0x00;
cfg.prefix_len = 0;
_panel_instance.config_transmitter(cfg);
}
{
auto cfg = _panel_instance.config();
cfg.offset_rotation = 3;
cfg.pin_cs = spi_cs;
cfg.readable = false;
cfg.bus_shared = false;
_panel_instance.config(cfg);
_panel_instance.setRotation(1);
}
setPanel(&_panel_instance);
return LGFX_Device::init_impl(use_reset, use_clear);
}
bool setResolution( uint16_t logical_width = M5MODULEDISPLAY_LOGICAL_WIDTH
, uint16_t logical_height = M5MODULEDISPLAY_LOGICAL_HEIGHT
, float refresh_rate = M5MODULEDISPLAY_REFRESH_RATE
, uint16_t output_width = M5MODULEDISPLAY_OUTPUT_WIDTH
, uint16_t output_height = M5MODULEDISPLAY_OUTPUT_HEIGHT
, uint_fast8_t scale_w = M5MODULEDISPLAY_SCALE_W
, uint_fast8_t scale_h = M5MODULEDISPLAY_SCALE_H
, uint32_t pixel_clock = M5MODULEDISPLAY_PIXELCLOCK
)
{
bool res = _panel_instance.setResolution
( logical_width
, logical_height
, refresh_rate
, output_width
, output_height
, scale_w
, scale_h
, pixel_clock
);
setRotation(getRotation());
return res;
}
};
#endif

View file

@ -0,0 +1,99 @@
#pragma once
#define LGFX_USE_V1
#include <lgfx/v1/panel/Panel_M5UnitGLASS.hpp>
#include <LovyanGFX.hpp>
#if defined ( ARDUINO )
#include <Arduino.h>
#endif
#if __has_include( <sdkconfig.h> )
#include <sdkconfig.h>
#endif
#ifndef M5UNITGLASS_SDA
#if defined ( ARDUINO )
#define M5UNITGLASS_SDA SDA
#elif defined (CONFIG_IDF_TARGET_ESP32S3)
#define M5UNITGLASS_SDA 2
#elif defined (CONFIG_IDF_TARGET_ESP32C3)
#define M5UNITGLASS_SDA 1
#else
#define M5UNITGLASS_SDA 21
#endif
#endif
#ifndef M5UNITGLASS_SCL
#if defined ( ARDUINO )
#define M5UNITGLASS_SCL SCL
#elif defined (CONFIG_IDF_TARGET_ESP32S3)
#define M5UNITGLASS_SCL 1
#elif defined (CONFIG_IDF_TARGET_ESP32C3)
#define M5UNITGLASS_SCL 0
#else
#define M5UNITGLASS_SCL 22
#endif
#endif
#ifndef M5UNITGLASS_ADDR
#define M5UNITGLASS_ADDR 0x3D
#endif
#ifndef M5UNITGLASS_FREQ
#define M5UNITGLASS_FREQ 400000
#endif
class M5UnitGLASS : public lgfx::LGFX_Device
{
lgfx::Bus_I2C _bus_instance;
lgfx::Panel_M5UnitGlass _panel_instance;
public:
M5UnitGLASS(uint8_t pin_sda = M5UNITGLASS_SDA, uint8_t pin_scl = M5UNITGLASS_SCL, uint32_t i2c_freq = M5UNITGLASS_FREQ, int8_t i2c_port = -1, uint8_t i2c_addr = M5UNITGLASS_ADDR)
{
setup(pin_sda, pin_scl, i2c_freq, i2c_port, i2c_addr);
}
using lgfx::LGFX_Device::init;
bool init(uint8_t pin_sda, uint8_t pin_scl, uint32_t i2c_freq = M5UNITGLASS_FREQ, int8_t i2c_port = -1, uint8_t i2c_addr = M5UNITGLASS_ADDR)
{
setup(pin_sda, pin_scl, i2c_freq, i2c_port, i2c_addr);
return init();
}
void setup(uint8_t pin_sda = M5UNITGLASS_SDA, uint8_t pin_scl = M5UNITGLASS_SCL, uint32_t i2c_freq = M5UNITGLASS_FREQ, int8_t i2c_port = -1, uint8_t i2c_addr = M5UNITGLASS_ADDR)
{
if (i2c_port < 0)
{
i2c_port = 0;
#ifdef _M5EPD_H_
if ((pin_sda == 25 && pin_scl == 32) /// M5Paper
{
i2c_port = 1
}
#endif
}
{
auto cfg = _bus_instance.config();
cfg.freq_write = i2c_freq;
cfg.freq_read = i2c_freq;
cfg.pin_scl = pin_scl;
cfg.pin_sda = pin_sda;
cfg.i2c_port = i2c_port;
cfg.i2c_addr = i2c_addr;
cfg.prefix_len = 0;
_bus_instance.config(cfg);
_panel_instance.bus(&_bus_instance);
}
{
auto cfg = _panel_instance.config();
cfg.offset_rotation = 3;
_panel_instance.config(cfg);
}
setPanel(&_panel_instance);
_board = lgfx::board_t::board_M5UnitGLASS;
}
};

View file

@ -0,0 +1,105 @@
#pragma once
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
#if defined ( ARDUINO )
#include <Arduino.h>
#endif
#if __has_include( <sdkconfig.h> )
#include <sdkconfig.h>
#endif
#ifndef M5UNITLCD_SDA
#if defined ( ARDUINO )
#define M5UNITLCD_SDA SDA
#elif defined (CONFIG_IDF_TARGET_ESP32S3)
#define M5UNITLCD_SDA 2
#elif defined (CONFIG_IDF_TARGET_ESP32C3)
#define M5UNITLCD_SDA 1
#else
#define M5UNITLCD_SDA 21
#endif
#endif
#ifndef M5UNITLCD_SCL
#if defined ( ARDUINO )
#define M5UNITLCD_SCL SCL
#elif defined (CONFIG_IDF_TARGET_ESP32S3)
#define M5UNITLCD_SCL 1
#elif defined (CONFIG_IDF_TARGET_ESP32C3)
#define M5UNITLCD_SCL 0
#else
#define M5UNITLCD_SCL 22
#endif
#endif
#ifndef M5UNITLCD_ADDR
#define M5UNITLCD_ADDR 0x3E
#endif
#ifndef M5UNITLCD_FREQ
#define M5UNITLCD_FREQ 400000
#endif
class M5UnitLCD : public lgfx::LGFX_Device
{
lgfx::Bus_I2C _bus_instance;
lgfx::Panel_M5UnitLCD _panel_instance;
public:
M5UnitLCD(uint8_t pin_sda = M5UNITLCD_SDA, uint8_t pin_scl = M5UNITLCD_SCL, uint32_t i2c_freq = M5UNITLCD_FREQ, int8_t i2c_port = -1, uint8_t i2c_addr = M5UNITLCD_ADDR)
{
setup(pin_sda, pin_scl, i2c_freq, i2c_port, i2c_addr);
}
using lgfx::LGFX_Device::init;
bool init(uint8_t pin_sda, uint8_t pin_scl, uint32_t i2c_freq = M5UNITLCD_FREQ, int8_t i2c_port = -1, uint8_t i2c_addr = M5UNITLCD_ADDR)
{
setup(pin_sda, pin_scl, i2c_freq, i2c_port, i2c_addr);
return init();
}
void setup(uint8_t pin_sda = M5UNITLCD_SDA, uint8_t pin_scl = M5UNITLCD_SCL, uint32_t i2c_freq = M5UNITLCD_FREQ, int8_t i2c_port = -1, uint8_t i2c_addr = M5UNITLCD_ADDR)
{
if (i2c_port < 0)
{
i2c_port = 0;
#ifdef _M5EPD_H_
if ((pin_sda == 25 && pin_scl == 32) /// M5Paper
{
i2c_port = 1
}
#endif
}
{
auto cfg = _bus_instance.config();
cfg.freq_write = i2c_freq;
cfg.freq_read = i2c_freq > 400000 ? 400000 + ((i2c_freq - 400000) >> 1) : i2c_freq;
cfg.pin_scl = pin_scl;
cfg.pin_sda = pin_sda;
cfg.i2c_port = i2c_port;
cfg.i2c_addr = i2c_addr;
cfg.prefix_len = 0;
_bus_instance.config(cfg);
_panel_instance.bus(&_bus_instance);
}
{
auto cfg = _panel_instance.config();
cfg.memory_width = 135;
cfg.memory_height = 240;
cfg.panel_width = 135;
cfg.panel_height = 240;
cfg.offset_x = 0;
cfg.offset_rotation = 0;
_panel_instance.config(cfg);
}
setPanel(&_panel_instance);
_board = lgfx::board_t::board_M5UnitLCD;
}
};

View file

@ -0,0 +1,101 @@
#pragma once
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
#if defined ( ARDUINO )
#include <Arduino.h>
#endif
#if __has_include( <sdkconfig.h> )
#include <sdkconfig.h>
#endif
#ifndef M5UNITOLED_SDA
#if defined ( ARDUINO )
#define M5UNITOLED_SDA SDA
#elif defined (CONFIG_IDF_TARGET_ESP32S3)
#define M5UNITOLED_SDA 2
#elif defined (CONFIG_IDF_TARGET_ESP32C3)
#define M5UNITOLED_SDA 1
#else
#define M5UNITOLED_SDA 21
#endif
#endif
#ifndef M5UNITOLED_SCL
#if defined ( ARDUINO )
#define M5UNITOLED_SCL SCL
#elif defined (CONFIG_IDF_TARGET_ESP32S3)
#define M5UNITOLED_SCL 1
#elif defined (CONFIG_IDF_TARGET_ESP32C3)
#define M5UNITOLED_SCL 0
#else
#define M5UNITOLED_SCL 22
#endif
#endif
#ifndef M5UNITOLED_ADDR
#define M5UNITOLED_ADDR 0x3C
#endif
#ifndef M5UNITOLED_FREQ
#define M5UNITOLED_FREQ 400000
#endif
class M5UnitOLED : public lgfx::LGFX_Device
{
lgfx::Bus_I2C _bus_instance;
lgfx::Panel_SH110x _panel_instance;
public:
M5UnitOLED(uint8_t pin_sda = M5UNITOLED_SDA, uint8_t pin_scl = M5UNITOLED_SCL, uint32_t i2c_freq = M5UNITOLED_FREQ, int8_t i2c_port = -1, uint8_t i2c_addr = M5UNITOLED_ADDR)
{
setup(pin_sda, pin_scl, i2c_freq, i2c_port, i2c_addr);
}
using lgfx::LGFX_Device::init;
bool init(uint8_t pin_sda, uint8_t pin_scl, uint32_t i2c_freq = M5UNITOLED_FREQ, int8_t i2c_port = -1, uint8_t i2c_addr = M5UNITOLED_ADDR)
{
setup(pin_sda, pin_scl, i2c_freq, i2c_port, i2c_addr);
return init();
}
void setup(uint8_t pin_sda = M5UNITOLED_SDA, uint8_t pin_scl = M5UNITOLED_SCL, uint32_t i2c_freq = M5UNITOLED_FREQ, int8_t i2c_port = -1, uint8_t i2c_addr = M5UNITOLED_ADDR)
{
if (i2c_port < 0)
{
i2c_port = 0;
#ifdef _M5EPD_H_
if ((pin_sda == 25 && pin_scl == 32) /// M5Paper
{
i2c_port = 1
}
#endif
}
{
auto cfg = _bus_instance.config();
cfg.freq_write = i2c_freq;
cfg.freq_read = i2c_freq;
cfg.pin_scl = pin_scl;
cfg.pin_sda = pin_sda;
cfg.i2c_port = i2c_port;
cfg.i2c_addr = i2c_addr;
cfg.prefix_len = 1;
cfg.prefix_cmd = 0x00;
cfg.prefix_data = 0x40;
_bus_instance.config(cfg);
_panel_instance.bus(&_bus_instance);
}
{
auto cfg = _panel_instance.config();
cfg.panel_width = 64;
cfg.offset_x = 32;
_panel_instance.config(cfg);
}
setPanel(&_panel_instance);
_board = lgfx::board_t::board_M5UnitOLED;
}
};