From e5d9e7898574a3f99bae4e3867b8ba48933de608 Mon Sep 17 00:00:00 2001 From: rick Date: Sat, 11 May 2024 17:39:43 +0200 Subject: [PATCH] first commit --- README.md | 3 + firmware/firmware.ino | 383 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 386 insertions(+) create mode 100644 README.md create mode 100644 firmware/firmware.ino diff --git a/README.md b/README.md new file mode 100644 index 0000000..b1c79ee --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +PSRAM !! + +ESP32 - OV2640 - GC9A01A diff --git a/firmware/firmware.ino b/firmware/firmware.ino new file mode 100644 index 0000000..57b933a --- /dev/null +++ b/firmware/firmware.ino @@ -0,0 +1,383 @@ +/* caméra : https://github.com/espressif/esp32-camera + * écran : https://github.com/sbcshop/Round-LCD-HAT/blob/main/lib/GC9A01A%20Datasheet.pdf + * https://esp32.com/viewtopic.php?t=14376 + */ + +// TODO refactor / cleanup + +#include +#include "esp_camera.h" + +#define BOARD_ESP32CAM_AITHINKER +#define CAMERA_MODEL_AI_THINKER + +#define RST 2 +#define DC 12 +#define CS 15 +#define CLK 14 +#define MOSI 13 + +#define SPI_HZ 62500000 +#define MY_MODE SPI_MODE3 +#define MY_BYTE MSBFIRST + +SPIClass *hspi = NULL; +camera_config_t my_cam_config; + +int16_t screen[240]; +int16_t tmp[240]; +byte test_tmp[480]; + +void send_cmd(SPIClass *spi, byte datas) { + digitalWrite(DC, LOW); + digitalWrite(CS, LOW); + spi->beginTransaction(SPISettings(SPI_HZ, MY_BYTE, MY_MODE)); + spi->transfer(datas); + spi->endTransaction(); + digitalWrite(CS, HIGH); +} + +void send_data(SPIClass *spi, byte datas) { + digitalWrite(DC, HIGH); + digitalWrite(CS, LOW); + spi->beginTransaction(SPISettings(SPI_HZ, MY_BYTE, MY_MODE)); + spi->transfer(datas); + spi->endTransaction(); + digitalWrite(CS, HIGH); +} + +void send_buffer(SPIClass *spi, int16_t *datas, int size) { + digitalWrite(DC, HIGH); + digitalWrite(CS, LOW); + spi->beginTransaction(SPISettings(SPI_HZ, MY_BYTE, MY_MODE)); + spi->transfer(datas, size); + spi->endTransaction(); + digitalWrite(CS, HIGH); +} + +void send_buffer_tmp(SPIClass *spi, uint8_t *datas, int size) { + digitalWrite(DC, HIGH); + digitalWrite(CS, LOW); + spi->beginTransaction(SPISettings(SPI_HZ, MY_BYTE, MY_MODE)); + spi->transfer(datas, size); + spi->endTransaction(); + digitalWrite(CS, HIGH); +} + +void setup() { + Serial.begin(9600); + Serial.setDebugOutput(true); + + hspi = new SPIClass(HSPI); + hspi->begin(); + + pinMode(hspi->pinSS(), OUTPUT); + pinMode(RST, OUTPUT); + pinMode(DC, OUTPUT); + + digitalWrite(RST, HIGH); + delay(10); + digitalWrite(RST, LOW); + delay(10); + digitalWrite(RST, HIGH); + delay(20); + + send_cmd(hspi, 0xEF); + send_cmd(hspi, 0xEB); + send_data(hspi, 0x14); + send_cmd(hspi, 0xFE); + send_cmd(hspi, 0xEF); + send_cmd(hspi, 0xEB); + send_data(hspi, 0x14); + + send_cmd(hspi, 0x84); + send_data(hspi, 0x40); + send_cmd(hspi, 0x85); + send_data(hspi, 0xFF); + send_cmd(hspi, 0x86); + send_data(hspi, 0xFF); + send_cmd(hspi, 0x87); + send_data(hspi, 0xFF); + send_cmd(hspi, 0x88); + send_data(hspi, 0x0A); + send_cmd(hspi, 0x89); + send_data(hspi, 0x21); + send_cmd(hspi, 0x8A); + send_data(hspi, 0x00); + send_cmd(hspi, 0x8B); + send_data(hspi, 0x80); + send_cmd(hspi, 0x8C); + send_data(hspi, 0x01); + send_cmd(hspi, 0x8D); + send_data(hspi, 0x01); + send_cmd(hspi, 0x8E); + send_data(hspi, 0xFF); + send_cmd(hspi, 0x8F); + send_data(hspi, 0xFF); + send_cmd(hspi, 0xB6); + send_data(hspi, 0x00); + send_data(hspi, 0x00); + send_cmd(hspi, 0x36); + send_data(hspi, 0x08); + //send_data(hspi, 0x48); + + send_cmd(hspi, 0x3A); + send_data(hspi, 0x05); + //send_data(hspi, 0x66); + //send_data(hspi, 0x60); + + send_cmd(hspi, 0x90); + send_data(hspi, 0x08); + send_data(hspi, 0x08); + send_data(hspi, 0x08); + send_data(hspi, 0x08); + send_cmd(hspi, 0xBD); + send_data(hspi, 0x06); + send_cmd(hspi, 0xBC); + send_data(hspi, 0x00); + send_cmd(hspi, 0xFF); + send_data(hspi, 0x60); + send_data(hspi, 0x01); + send_data(hspi, 0x04); + send_cmd(hspi, 0xC3); + send_data(hspi, 0x13); + send_cmd(hspi, 0xC4); + send_data(hspi, 0x13); + send_cmd(hspi, 0xC9); + send_data(hspi, 0x22); + send_cmd(hspi, 0xBE); + send_data(hspi, 0x11); + send_cmd(hspi, 0xE1); + send_data(hspi, 0x10); + send_data(hspi, 0x0E); + send_cmd(hspi, 0xDF); + send_data(hspi, 0x21); + send_data(hspi, 0x0C); + send_data(hspi, 0x02); + send_cmd(hspi, 0xF0); + send_data(hspi, 0x45); + send_data(hspi, 0x09); + send_data(hspi, 0x08); + send_data(hspi, 0x08); + send_data(hspi, 0x26); + send_data(hspi, 0x2A); + send_cmd(hspi, 0xF1); + send_data(hspi, 0x43); + send_data(hspi, 0x70); + send_data(hspi, 0x72); + send_data(hspi, 0x36); + send_data(hspi, 0x37); + send_data(hspi, 0x6F); + send_cmd(hspi, 0xF2); + send_data(hspi, 0x45); + send_data(hspi, 0x09); + send_data(hspi, 0x08); + send_data(hspi, 0x08); + send_data(hspi, 0x26); + send_data(hspi, 0x2A); + send_cmd(hspi, 0xF3); + send_data(hspi, 0x43); + send_data(hspi, 0x70); + send_data(hspi, 0x72); + send_data(hspi, 0x36); + send_data(hspi, 0x37); + send_data(hspi, 0x6F); + send_cmd(hspi, 0xED); + send_data(hspi, 0x1B); + send_data(hspi, 0x0B); + send_cmd(hspi, 0xAE); + send_data(hspi, 0x77); + send_cmd(hspi, 0xCD); + send_data(hspi, 0x63); + /* + send_(hspi, 0x70,COMMAND); + send_(hspi, 0x07,PARAM); + send_(hspi, 0x07,PARAM); + send_(hspi, 0x04,PARAM); + send_(hspi, 0x0E,PARAM); + send_(hspi, 0x0F,PARAM); + send_(hspi, 0x09,PARAM); + send_(hspi, 0x07,PARAM); + send_(hspi, 0x08,PARAM); + send_(hspi, 0x03,PARAM); + */ + send_cmd(hspi, 0xE8); + send_data(hspi, 0x34); + send_cmd(hspi, 0x62); + send_data(hspi, 0x18); + send_data(hspi, 0x0D); + send_data(hspi, 0x71); + send_data(hspi, 0xED); + send_data(hspi, 0x70); + send_data(hspi, 0x70); + send_data(hspi, 0x18); + send_data(hspi, 0x0F); + send_data(hspi, 0x71); + send_data(hspi, 0xEF); + send_data(hspi, 0x70); + send_data(hspi, 0x70); + send_cmd(hspi, 0x63); + send_data(hspi, 0x18); + send_data(hspi, 0x11); + send_data(hspi, 0x71); + send_data(hspi, 0xF1); + send_data(hspi, 0x70); + send_data(hspi, 0x70); + send_data(hspi, 0x18); + send_data(hspi, 0x13); + send_data(hspi, 0x71); + send_data(hspi, 0xF3); + send_data(hspi, 0x70); + send_data(hspi, 0x70); + send_cmd(hspi, 0x64); + send_data(hspi, 0x28); + send_data(hspi, 0x29); + send_data(hspi, 0xF1); + send_data(hspi, 0x01); + send_data(hspi, 0xF1); + send_data(hspi, 0x00); + send_data(hspi, 0x07); + send_cmd(hspi, 0x66); + send_data(hspi, 0x3C); + send_data(hspi, 0x00); + send_data(hspi, 0xCD); + send_data(hspi, 0x67); + send_data(hspi, 0x45); + send_data(hspi, 0x45); + send_data(hspi, 0x10); + send_data(hspi, 0x00); + send_data(hspi, 0x00); + send_data(hspi, 0x00); + send_cmd(hspi, 0x67); + send_data(hspi, 0x00); + send_data(hspi, 0x3C); + send_data(hspi, 0x00); + send_data(hspi, 0x00); + send_data(hspi, 0x00); + send_data(hspi, 0x01); + send_data(hspi, 0x54); + send_data(hspi, 0x10); + send_data(hspi, 0x32); + send_data(hspi, 0x98); + send_cmd(hspi, 0x74); + send_data(hspi, 0x10); + send_data(hspi, 0x85); + send_data(hspi, 0x80); + send_data(hspi, 0x00); + send_data(hspi, 0x00); + send_data(hspi, 0x4E); + send_data(hspi, 0x00); + send_cmd(hspi, 0x98); + send_data(hspi, 0x3E); + send_data(hspi, 0x07); + send_cmd(hspi, 0x35); + send_cmd(hspi, 0x21); + send_cmd(hspi, 0x11); + + delay(150); + send_cmd(hspi, 0x29); + delay(150); + + send_cmd(hspi, 0x2A); + send_data(hspi, 0x00); + send_data(hspi, 0x00); + send_data(hspi, 0x00); + send_data(hspi, 0xEF); + send_cmd(hspi, 0x2B); + send_data(hspi, 0x00); + send_data(hspi, 0x00); + send_data(hspi, 0x00); + send_data(hspi, 0xEF); + + my_cam_config.ledc_channel = LEDC_CHANNEL_0; + my_cam_config.ledc_timer = LEDC_TIMER_0; + my_cam_config.pin_d0 = 5; + my_cam_config.pin_d1 = 18; + my_cam_config.pin_d2 = 19; + my_cam_config.pin_d3 = 21; + my_cam_config.pin_d4 = 36; + my_cam_config.pin_d5 = 39; + my_cam_config.pin_d6 = 34; + my_cam_config.pin_d7 = 35; + my_cam_config.pin_xclk = 0; + my_cam_config.pin_pclk = 22; + my_cam_config.pin_vsync = 25; + my_cam_config.pin_href = 23; + my_cam_config.pin_sccb_sda = 26; + my_cam_config.pin_sccb_scl = 27; + my_cam_config.pin_pwdn = 32; + //my_cam_config.xclk_freq_hz = 12000000; + my_cam_config.xclk_freq_hz = 20000000; + my_cam_config.pin_reset = -1; + my_cam_config.pixel_format = PIXFORMAT_RGB565; + my_cam_config.frame_size = FRAMESIZE_240X240; + //my_cam_config.jpeg_quality = 40; + my_cam_config.fb_count = 4; + my_cam_config.grab_mode = CAMERA_GRAB_LATEST; + + esp_err_t err = esp_camera_init(&my_cam_config); + if (err != ESP_OK) { + Serial.printf("Camera init failed with error 0x%x", err); + return; + + } + + sensor_t *my_sensor = esp_camera_sensor_get(); + /* + my_sensor->set_whitebal(my_sensor, 0); + my_sensor->set_awb_gain(my_sensor, 0); + my_sensor->set_exposure_ctrl(my_sensor, 0); + my_sensor->set_gain_ctrl(my_sensor, 0); + my_sensor->set_wpc(my_sensor, 0); + my_sensor->set_raw_gma(my_sensor, 0); + my_sensor->set_lenc(my_sensor, 0); + my_sensor->set_dcw(my_sensor, 0); + my_sensor->set_special_effect(my_sensor, 4); + */ + + Serial.print("===== fin !! ====="); + + for(int i = 0; i < 240; i++) { + screen[i] = 0x0000; + } + + send_cmd(hspi, 0x2C); + for (int i= 0; i<240; i++) + { + memcpy(tmp, screen, 240 * 2); + send_buffer(hspi, screen, 240 * 2); + } +} + +void loop() { + /* + for(int i = 0; i < 240; i++) { + screen[i] = 0xFC00; + //screen[i] = 0x00; + //screen[i] = 0x0F; + //screen[i] = 0x07E0; + //screen[i] = 0xFFFF; + } + + send_cmd(hspi, 0x2C); + for (int i= 0; i<240; i++) + { + memcpy(tmp, screen, 240 * 2); + send_buffer(hspi, tmp, 240 * 2); + } + */ + + camera_fb_t *fb = esp_camera_fb_get(); + // TODO check si tout est bon + + send_cmd(hspi, 0x2C); + for (int i= 0; i<240; i++) + { + memcpy(test_tmp, (fb->buf + i * 240 * 2), 240 * 2); + send_buffer_tmp(hspi, test_tmp, 240 * 2); + } + + esp_camera_fb_return(fb); + + delay(10); +}