diff --git a/components/bus/spi_bus.c b/components/bus/spi_bus.c index f9503ce..cecb862 100644 --- a/components/bus/spi_bus.c +++ b/components/bus/spi_bus.c @@ -183,7 +183,7 @@ esp_err_t spi_bus_transfer_byte(spi_bus_device_handle_t dev_handle, uint8_t data esp_err_t spi_bus_transfer_bytes(spi_bus_device_handle_t dev_handle, const uint8_t *data_out, uint8_t *data_in, uint32_t data_len) { esp_err_t ret; -#ifdef CONFIG_IDF_TARGET_ESP32S3 +#if 1 #define MIN(a,b) (((a)<(b))?(a):(b)) uint32_t remain = data_len; while (remain > 0) { diff --git a/components/esp-code-scanner/.project b/components/esp-code-scanner/.project new file mode 100644 index 0000000..35e4cdc --- /dev/null +++ b/components/esp-code-scanner/.project @@ -0,0 +1,11 @@ + + + esp-code-scanner + + + + + + + + diff --git a/components/esp-code-scanner/CMakeLists.txt b/components/esp-code-scanner/CMakeLists.txt new file mode 100644 index 0000000..5b8339a --- /dev/null +++ b/components/esp-code-scanner/CMakeLists.txt @@ -0,0 +1,22 @@ +idf_build_get_property(target IDF_TARGET) + +if(${IDF_TARGET} STREQUAL "esp32") + set(links "-L ${CMAKE_CURRENT_SOURCE_DIR}/lib/esp32" "-L ${CMAKE_CURRENT_SOURCE_DIR}/lib") + +elseif(${IDF_TARGET} STREQUAL "esp32s2") + set(links "-L ${CMAKE_CURRENT_SOURCE_DIR}/lib/esp32s2" "-L ${CMAKE_CURRENT_SOURCE_DIR}/lib") + +elseif(${IDF_TARGET} STREQUAL "esp32s3") + set(links "-L ${CMAKE_CURRENT_SOURCE_DIR}/lib/esp32s3" "-L ${CMAKE_CURRENT_SOURCE_DIR}/lib") + +endif() + +set(COMPONENT_ADD_INCLUDEDIRS include) + +register_component() + +target_link_libraries(${COMPONENT_TARGET} INTERFACE ${links}) + +set(lib libesp-code-scanner.a + libnewlib_iconv.a) +target_link_libraries(${COMPONENT_TARGET} INTERFACE ${lib}) \ No newline at end of file diff --git a/components/esp-code-scanner/include/esp_code_scanner.h b/components/esp-code-scanner/include/esp_code_scanner.h new file mode 100644 index 0000000..b9ef576 --- /dev/null +++ b/components/esp-code-scanner/include/esp_code_scanner.h @@ -0,0 +1,102 @@ +#pragma once + +#include "esp_err.h" + + + +struct esp_image_scanner_s; +/** opaque image scanner object. */ +typedef struct esp_image_scanner_s esp_image_scanner_t; + + + +typedef enum{ + ESP_CODE_SCANNER_MODE_FAST = 0, + /* more mode */ +}esp_code_scanner_mode_t; + +typedef enum{ + ESP_CODE_SCANNER_IMAGE_GRAY = 0, + ESP_CODE_SCANNER_IMAGE_RGB565, + ESP_CODE_SCANNER_IMAGE_YUV422, + /* more image format*/ +}esp_code_scanner_image_format_t; + +typedef struct +{ + esp_code_scanner_mode_t mode; + esp_code_scanner_image_format_t fmt; + uint32_t width; /*!< iamge width */ + uint32_t height; /*!< iamge height */ + /* more config */ +} esp_code_scanner_config_t; + +typedef enum{ + ESP_CODE_SCANNER_SYMBOL_CODE39, + ESP_CODE_SCANNER_SYMBOL_CODE128, + ESP_CODE_SCANNER_SYMBOL_QR +}esp_code_scanner_symbol_type_t; + + +typedef struct esp_code_scanner_symbol_t esp_code_scanner_symbol_t; +struct esp_code_scanner_symbol_t +{ + const char *type_name; + const char *data; + uint32_t datalen; + esp_code_scanner_symbol_t* next; +}; + + +/** + * @brief Start a code_scanner + * This function must be the first function to call, + * and it returns a esp_image_scanner_t pointer that you must use as input to other functions in the interface. + * This call MUST have a corresponding call to esp_code_scanner_cleanup when the operation is complete. + * + * @return + * - `esp_image_scanner_t` + * - NULL if any errors + */ +esp_image_scanner_t* esp_code_scanner_create(); + +/** + * @brief Set config of code_scanner + * + * @param[in] config The configurations, see `esp_code_scanner_config_t` + * + * @return + * - ESP_OK + * - ESP_FAIL if any errors + */ +esp_err_t esp_code_scanner_set_config(esp_image_scanner_t* scanner, const esp_code_scanner_config_t config); + +/** + * @brief Scan image data + * + * @param[in] scanner The esp_image_scanner_t + * @param[in] image_data The image data, only supports grayscale images + * + * @return + * - number of decoded symbol + */ +int esp_code_scanner_scan_image(esp_image_scanner_t* scanner, const uint8_t *image_data); + +/** + * @brief Release resources: including the instance and configuration + * + * @param[in] scanner The esp_code_scanner_handle_t + * + */ +void esp_code_scanner_destroy(esp_image_scanner_t* scanner); + +/** + * @brief Get scan results + * + * @param[in] scanner The esp_code_scanner_handle_t + * + * @return + * - `const esp_code_scanner_symbol_t` + * - Returns NULL if no data is recognized + */ +const esp_code_scanner_symbol_t esp_code_scanner_result(esp_image_scanner_t* scanner); \ No newline at end of file diff --git a/components/esp-code-scanner/lib/esp32/libesp-code-scanner.a b/components/esp-code-scanner/lib/esp32/libesp-code-scanner.a new file mode 100644 index 0000000..e0672a4 Binary files /dev/null and b/components/esp-code-scanner/lib/esp32/libesp-code-scanner.a differ diff --git a/components/esp-code-scanner/lib/esp32s2/libesp-code-scanner.a b/components/esp-code-scanner/lib/esp32s2/libesp-code-scanner.a new file mode 100644 index 0000000..2e31f28 Binary files /dev/null and b/components/esp-code-scanner/lib/esp32s2/libesp-code-scanner.a differ diff --git a/components/esp-code-scanner/lib/esp32s3/libesp-code-scanner.a b/components/esp-code-scanner/lib/esp32s3/libesp-code-scanner.a new file mode 100644 index 0000000..c5f3365 Binary files /dev/null and b/components/esp-code-scanner/lib/esp32s3/libesp-code-scanner.a differ diff --git a/components/esp-code-scanner/lib/libnewlib_iconv.a b/components/esp-code-scanner/lib/libnewlib_iconv.a new file mode 100644 index 0000000..ed12a90 Binary files /dev/null and b/components/esp-code-scanner/lib/libnewlib_iconv.a differ diff --git a/examples/code_recognition/CMakeLists.txt b/examples/code_recognition/CMakeLists.txt new file mode 100644 index 0000000..8883cce --- /dev/null +++ b/examples/code_recognition/CMakeLists.txt @@ -0,0 +1,8 @@ +# The following lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.5) + +set(EXTRA_COMPONENT_DIRS ../../components) +add_compile_options(-fdiagnostics-color=always) +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(esp-code-recognition) diff --git a/examples/code_recognition/README.md b/examples/code_recognition/README.md new file mode 100644 index 0000000..ddfc64c --- /dev/null +++ b/examples/code_recognition/README.md @@ -0,0 +1,49 @@ +# Code recognition Example + +This example demonstrates how to decode 1D/2D barcode. Currectly, the formats that can be decoded by [esp_code_scanner](./../../components/esp-code-scanner) are: +- 1D barcode: + - code39 + - code128 +- 2D barcode: + - QR code + +## How to Use Example + +Before project configuration and build, be sure to set the correct chip target using `idf.py set-target `. + +### Hardware Required + +* A development board with ESP32/ESP32-S2/ESP32-S3 SoC (e.g., ESP-EYE, ESP-WROVER-KIT, ESPS3-EYE etc.) +* A USB cable for Power supply and programming +* A Camera Module: OV2640/OV3660/GC0308/GC032A image sensor(recommended focal range: 5cm-20cm) +* A LCD(optional): ST7789/... + +Note: the default OV2640 camera on the development board may not be suitable for this example. + +### Configure the Project + +Some default settings have been set based on the development board using `sdkconfig.defaults.` + + +### Build and Flash + +Run `idf.py -p PORT flash monitor` to build, flash and monitor the project. + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +Please make sure the code can be clearly captured. +If a qrcode can be succesfully decoded, you will be able to see information displayed as below: + +``` +I (11164) APP_CODE_SCANNER: Decode time in 70 ms. +I (11164) APP_CODE_SCANNER: Decoded QR-Code symbol "测试" +``` + + +## Troubleshooting + +For any technical queries, please open an [issue](https://github.com/espressif/esp-who/issues) on GitHub. We will get back to you soon. \ No newline at end of file diff --git a/examples/code_recognition/main/CMakeLists.txt b/examples/code_recognition/main/CMakeLists.txt new file mode 100644 index 0000000..b779e24 --- /dev/null +++ b/examples/code_recognition/main/CMakeLists.txt @@ -0,0 +1,6 @@ +idf_component_register( SRCS + app_peripherals.c + app_main.c + INCLUDE_DIRS + include + ) \ No newline at end of file diff --git a/examples/code_recognition/main/app_main.c b/examples/code_recognition/main/app_main.c new file mode 100644 index 0000000..fabed41 --- /dev/null +++ b/examples/code_recognition/main/app_main.c @@ -0,0 +1,69 @@ +#include +#include +#include +#include "esp_log.h" +#include "esp_system.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "app_peripherals.h" + +#include "esp_code_scanner.h" + +static const char *TAG = "APP_CODE_SCANNER"; + +static void decode_task() +{ + if(ESP_OK != app_camera_init()) { + vTaskDelete(NULL); + return; + } + + #ifdef LCD_CONTROLLER + int USE_LCD = 0; + scr_driver_t g_lcd; + if (ESP_OK == app_lcd_init(&g_lcd)) + USE_LCD = 1; + #endif + + camera_fb_t *fb = NULL; + int64_t time1, time2; + while (1) + { + fb = esp_camera_fb_get(); + if(fb == NULL){ + ESP_LOGI(TAG, "camera get failed\n"); + continue; + } + + time1 = esp_timer_get_time(); + // Decode Progress + esp_image_scanner_t *esp_scn = esp_code_scanner_create(); + esp_code_scanner_config_t config = {ESP_CODE_SCANNER_MODE_FAST, ESP_CODE_SCANNER_IMAGE_RGB565, fb->width, fb->height}; + esp_code_scanner_set_config(esp_scn, config); + int decoded_num = esp_code_scanner_scan_image(esp_scn, fb->buf); + + if(decoded_num){ + esp_code_scanner_symbol_t result = esp_code_scanner_result(esp_scn); + time2 = esp_timer_get_time(); + ESP_LOGI(TAG, "Decode time in %lld ms.", (time2 - time1) / 1000); + ESP_LOGI(TAG, "Decoded %s symbol \"%s\"\n", result.type_name, result.data); + } + esp_code_scanner_destroy(esp_scn); + + + #ifdef LCD_CONTROLLER + if(USE_LCD){ + g_lcd.draw_bitmap(0, 0, fb->width, fb->height, (uint16_t *)fb->buf); + } + #endif + + esp_camera_fb_return(fb); + vTaskDelay(10 / portTICK_PERIOD_MS); + } +} + + +void app_main() +{ + xTaskCreatePinnedToCore(decode_task, TAG, 4 * 1024, NULL, 6, NULL, 0); +} \ No newline at end of file diff --git a/examples/code_recognition/main/app_peripherals.c b/examples/code_recognition/main/app_peripherals.c new file mode 100644 index 0000000..eda33fd --- /dev/null +++ b/examples/code_recognition/main/app_peripherals.c @@ -0,0 +1,140 @@ +#include "app_peripherals.h" +#include "esp_log.h" +#include "esp_system.h" +#include "st7789.h" + +static const char *TAG = "app_peripherals"; + +esp_err_t app_camera_init() +{ + ESP_LOGI(TAG, "Camera module is %s", CAMERA_MODULE_NAME); + +#if CONFIG_CAMERA_MODEL_ESP_EYE || CONFIG_CAMERA_MODEL_ESP32_CAM_BOARD + /* IO13, IO14 is designed for JTAG by default, + * to use it as generalized input, + * firstly declair it as pullup input */ + gpio_config_t conf; + conf.mode = GPIO_MODE_INPUT; + conf.pull_up_en = GPIO_PULLUP_ENABLE; + conf.pull_down_en = GPIO_PULLDOWN_DISABLE; + conf.intr_type = GPIO_INTR_DISABLE; + conf.pin_bit_mask = 1LL << 13; + gpio_config(&conf); + conf.pin_bit_mask = 1LL << 14; + gpio_config(&conf); +#endif + + camera_config_t config; + config.ledc_channel = LEDC_CHANNEL_0; + config.ledc_timer = LEDC_TIMER_0; + config.pin_d0 = CAMERA_PIN_D0; + config.pin_d1 = CAMERA_PIN_D1; + config.pin_d2 = CAMERA_PIN_D2; + config.pin_d3 = CAMERA_PIN_D3; + config.pin_d4 = CAMERA_PIN_D4; + config.pin_d5 = CAMERA_PIN_D5; + config.pin_d6 = CAMERA_PIN_D6; + config.pin_d7 = CAMERA_PIN_D7; + config.pin_xclk = CAMERA_PIN_XCLK; + config.pin_pclk = CAMERA_PIN_PCLK; + config.pin_vsync = CAMERA_PIN_VSYNC; + config.pin_href = CAMERA_PIN_HREF; + config.pin_sscb_sda = CAMERA_PIN_SIOD; + config.pin_sscb_scl = CAMERA_PIN_SIOC; + config.pin_pwdn = CAMERA_PIN_PWDN; + config.pin_reset = CAMERA_PIN_RESET; + config.xclk_freq_hz = XCLK_FREQ_HZ; + config.pixel_format = CAMERA_PIXFORMAT; + config.frame_size = CAMERA_FRAME_SIZE; + config.jpeg_quality = 12; + config.fb_count = CAMERA_FB_COUNT; + config.fb_location = CAMERA_FB_IN_PSRAM; + config.grab_mode = CAMERA_GRAB_WHEN_EMPTY; + + // camera init + esp_err_t err = esp_camera_init(&config); + if (err != ESP_OK) + { + ESP_LOGE(TAG, "Camera init failed with error 0x%x", err); + return ESP_FAIL; + } + + sensor_t *s = esp_camera_sensor_get(); + if (s->id.PID == OV3660_PID || s->id.PID == OV2640_PID) + s->set_vflip(s, 1); //flip it back + else if (s->id.PID == GC0308_PID){ + s->set_hmirror(s, 0); + } + else if (s->id.PID == GC032A_PID){ + s->set_vflip(s, 1); + // s->set_hmirror(s, 0); //something wrong + } + + if (s->id.PID == OV3660_PID) + { + s->set_brightness(s, 2); + s->set_contrast(s, 3); + } + + return ESP_OK; +} + + +#ifdef LCD_CONTROLLER +esp_err_t app_lcd_init(scr_driver_t *g_lcd){ + static scr_info_t g_lcd_info; + + spi_config_t bus_conf = { + .miso_io_num = LCD_MISO, + .mosi_io_num = LCD_MOSI, + .sclk_io_num = LCD_SCLK, + .max_transfer_sz = 2 * LCD_WIDTH * LCD_HEIGHT + 10, + }; + spi_bus_handle_t spi_bus = spi_bus_create(SPI2_HOST, &bus_conf); + + scr_interface_spi_config_t spi_lcd_cfg = { + .spi_bus = spi_bus, + .pin_num_cs = LCD_CS, + .pin_num_dc = LCD_DC, + .clk_freq = 40 * 1000000, + .swap_data = 0, + }; + + scr_interface_driver_t *iface_drv; + scr_interface_create(SCREEN_IFACE_SPI, &spi_lcd_cfg, &iface_drv); + esp_err_t ret = scr_find_driver(LCD_CONTROLLER, g_lcd); + if (ESP_OK != ret) + { + ESP_LOGE(TAG, "screen find failed"); + return ESP_FAIL; + } + + scr_controller_config_t lcd_cfg = { + .interface_drv = iface_drv, + .pin_num_rst = LCD_RST, + .pin_num_bckl = LCD_BCKL, + .rst_active_level = 0, + .bckl_active_level = 0, + .offset_hor = 0, + .offset_ver = 0, + .width = LCD_WIDTH, + .height = LCD_HEIGHT, + .rotate = LCD_ROTATE, + }; + ret = g_lcd->init(&lcd_cfg); + if (ESP_OK != ret) + { + ESP_LOGE(TAG, "screen initialize failed"); + return ESP_FAIL; + } + + #if CONFIG_CAMERA_MODULE_ESP_S2_KALUGA + lcd_st7789_set_invert(false); + #endif + + g_lcd->get_info(&g_lcd_info); + ESP_LOGI(TAG, "Screen name:%s | width:%d | height:%d", g_lcd_info.name, g_lcd_info.width, g_lcd_info.height); + + return ESP_OK; +} +#endif \ No newline at end of file diff --git a/examples/code_recognition/main/include/app_peripherals.h b/examples/code_recognition/main/include/app_peripherals.h new file mode 100644 index 0000000..d769821 --- /dev/null +++ b/examples/code_recognition/main/include/app_peripherals.h @@ -0,0 +1,249 @@ +#pragma once + +#include "freertos/FreeRTOS.h" +#include "freertos/queue.h" +#include "freertos/task.h" +#include "freertos/semphr.h" + +#include "esp_camera.h" +#include "screen_driver.h" + + +// camera pins +#if CONFIG_CAMERA_MODULE_WROVER_KIT +#define CAMERA_MODULE_NAME "Wrover Kit" +#define CAMERA_PIN_PWDN -1 +#define CAMERA_PIN_RESET -1 +#define CAMERA_PIN_XCLK 21 +#define CAMERA_PIN_SIOD 26 +#define CAMERA_PIN_SIOC 27 + +#define CAMERA_PIN_D7 35 +#define CAMERA_PIN_D6 34 +#define CAMERA_PIN_D5 39 +#define CAMERA_PIN_D4 36 +#define CAMERA_PIN_D3 19 +#define CAMERA_PIN_D2 18 +#define CAMERA_PIN_D1 5 +#define CAMERA_PIN_D0 4 +#define CAMERA_PIN_VSYNC 25 +#define CAMERA_PIN_HREF 23 +#define CAMERA_PIN_PCLK 22 + +#elif CONFIG_CAMERA_MODULE_ESP_EYE +#define CAMERA_MODULE_NAME "ESP-EYE" +#define CAMERA_PIN_PWDN -1 +#define CAMERA_PIN_RESET -1 +#define CAMERA_PIN_XCLK 4 +#define CAMERA_PIN_SIOD 18 +#define CAMERA_PIN_SIOC 23 + +#define CAMERA_PIN_D7 36 +#define CAMERA_PIN_D6 37 +#define CAMERA_PIN_D5 38 +#define CAMERA_PIN_D4 39 +#define CAMERA_PIN_D3 35 +#define CAMERA_PIN_D2 14 +#define CAMERA_PIN_D1 13 +#define CAMERA_PIN_D0 34 +#define CAMERA_PIN_VSYNC 5 +#define CAMERA_PIN_HREF 27 +#define CAMERA_PIN_PCLK 25 + +#elif CONFIG_CAMERA_MODULE_ESP_S2_KALUGA +#define CAMERA_MODULE_NAME "ESP-S2-KALUGA" +#define CAMERA_PIN_PWDN -1 +#define CAMERA_PIN_RESET -1 +#define CAMERA_PIN_XCLK 1 +#define CAMERA_PIN_SIOD 8 +#define CAMERA_PIN_SIOC 7 + +#define CAMERA_PIN_D7 38 +#define CAMERA_PIN_D6 21 +#define CAMERA_PIN_D5 40 +#define CAMERA_PIN_D4 39 +#define CAMERA_PIN_D3 42 +#define CAMERA_PIN_D2 41 +#define CAMERA_PIN_D1 37 +#define CAMERA_PIN_D0 36 +#define CAMERA_PIN_VSYNC 2 +#define CAMERA_PIN_HREF 3 +#define CAMERA_PIN_PCLK 33 + +#elif CONFIG_CAMERA_MODULE_ESP_S3_EYE +#define CAMERA_MODULE_NAME "ESP-S3-EYE" +#define CAMERA_PIN_PWDN -1 +#define CAMERA_PIN_RESET -1 + +#define CAMERA_PIN_VSYNC 6 +#define CAMERA_PIN_HREF 7 +#define CAMERA_PIN_PCLK 13 +#define CAMERA_PIN_XCLK 15 + +#define CAMERA_PIN_SIOD 4 +#define CAMERA_PIN_SIOC 5 + +#define CAMERA_PIN_D0 11 +#define CAMERA_PIN_D1 9 +#define CAMERA_PIN_D2 8 +#define CAMERA_PIN_D3 10 +#define CAMERA_PIN_D4 12 +#define CAMERA_PIN_D5 18 +#define CAMERA_PIN_D6 17 +#define CAMERA_PIN_D7 16 + +#elif CONFIG_CAMERA_MODEL_ESP32_CAM_BOARD +#define CAMERA_MODULE_NAME "ESP-DEVCAM" +#define CAMERA_PIN_PWDN 32 +#define CAMERA_PIN_RESET 33 + +#define CAMERA_PIN_XCLK 4 +#define CAMERA_PIN_SIOD 18 +#define CAMERA_PIN_SIOC 23 + +#define CAMERA_PIN_D7 36 +#define CAMERA_PIN_D6 19 +#define CAMERA_PIN_D5 21 +#define CAMERA_PIN_D4 39 +#define CAMERA_PIN_D3 35 +#define CAMERA_PIN_D2 14 +#define CAMERA_PIN_D1 13 +#define CAMERA_PIN_D0 34 +#define CAMERA_PIN_VSYNC 5 +#define CAMERA_PIN_HREF 27 +#define CAMERA_PIN_PCLK 25 + +#elif CONFIG_CAMERA_MODULE_M5STACK_PSRAM +#define CAMERA_MODULE_NAME "M5STACK-PSRAM" +#define CAMERA_PIN_PWDN -1 +#define CAMERA_PIN_RESET 15 + +#define CAMERA_PIN_XCLK 27 +#define CAMERA_PIN_SIOD 25 +#define CAMERA_PIN_SIOC 23 + +#define CAMERA_PIN_D7 19 +#define CAMERA_PIN_D6 36 +#define CAMERA_PIN_D5 18 +#define CAMERA_PIN_D4 39 +#define CAMERA_PIN_D3 5 +#define CAMERA_PIN_D2 34 +#define CAMERA_PIN_D1 35 +#define CAMERA_PIN_D0 32 +#define CAMERA_PIN_VSYNC 22 +#define CAMERA_PIN_HREF 26 +#define CAMERA_PIN_PCLK 21 + +#elif CONFIG_CAMERA_MODULE_M5STACK_WIDE +#define CAMERA_MODULE_NAME "M5STACK-WIDE" +#define CAMERA_PIN_PWDN -1 +#define CAMERA_PIN_RESET 15 +#define CAMERA_PIN_XCLK 27 +#define CAMERA_PIN_SIOD 22 +#define CAMERA_PIN_SIOC 23 + +#define CAMERA_PIN_D7 19 +#define CAMERA_PIN_D6 36 +#define CAMERA_PIN_D5 18 +#define CAMERA_PIN_D4 39 +#define CAMERA_PIN_D3 5 +#define CAMERA_PIN_D2 34 +#define CAMERA_PIN_D1 35 +#define CAMERA_PIN_D0 32 +#define CAMERA_PIN_VSYNC 25 +#define CAMERA_PIN_HREF 26 +#define CAMERA_PIN_PCLK 21 + +#elif CONFIG_CAMERA_MODULE_AI_THINKER +#define CAMERA_MODULE_NAME "AI-THINKER" +#define CAMERA_PIN_PWDN 32 +#define CAMERA_PIN_RESET -1 +#define CAMERA_PIN_XCLK 0 +#define CAMERA_PIN_SIOD 26 +#define CAMERA_PIN_SIOC 27 + +#define CAMERA_PIN_D7 35 +#define CAMERA_PIN_D6 34 +#define CAMERA_PIN_D5 39 +#define CAMERA_PIN_D4 36 +#define CAMERA_PIN_D3 21 +#define CAMERA_PIN_D2 19 +#define CAMERA_PIN_D1 18 +#define CAMERA_PIN_D0 5 +#define CAMERA_PIN_VSYNC 25 +#define CAMERA_PIN_HREF 23 +#define CAMERA_PIN_PCLK 22 + +#elif CONFIG_CAMERA_MODULE_CUSTOM +#define CAMERA_MODULE_NAME "CUSTOM" +#define CAMERA_PIN_PWDN CONFIG_CAMERA_PIN_PWDN +#define CAMERA_PIN_RESET CONFIG_CAMERA_PIN_RESET +#define CAMERA_PIN_XCLK CONFIG_CAMERA_PIN_XCLK +#define CAMERA_PIN_SIOD CONFIG_CAMERA_PIN_SIOD +#define CAMERA_PIN_SIOC CONFIG_CAMERA_PIN_SIOC + +#define CAMERA_PIN_D7 CONFIG_CAMERA_PIN_Y9 +#define CAMERA_PIN_D6 CONFIG_CAMERA_PIN_Y8 +#define CAMERA_PIN_D5 CONFIG_CAMERA_PIN_Y7 +#define CAMERA_PIN_D4 CONFIG_CAMERA_PIN_Y6 +#define CAMERA_PIN_D3 CONFIG_CAMERA_PIN_Y5 +#define CAMERA_PIN_D2 CONFIG_CAMERA_PIN_Y4 +#define CAMERA_PIN_D1 CONFIG_CAMERA_PIN_Y3 +#define CAMERA_PIN_D0 CONFIG_CAMERA_PIN_Y2 +#define CAMERA_PIN_VSYNC CONFIG_CAMERA_PIN_VSYNC +#define CAMERA_PIN_HREF CONFIG_CAMERA_PIN_HREF +#define CAMERA_PIN_PCLK CONFIG_CAMERA_PIN_PCLK +#endif + +#define XCLK_FREQ_HZ 20000000 +#define CAMERA_PIXFORMAT PIXFORMAT_RGB565 +#define CAMERA_FRAME_SIZE FRAMESIZE_240X240 +#define CAMERA_FB_COUNT 2 + + + +// lcd pins and setting +#if CONFIG_CAMERA_MODULE_ESP_S3_EYE +#define LCD_CONTROLLER SCREEN_CONTROLLER_ST7789 + +#define LCD_MOSI 46 +#define LCD_MISO -1 +#define LCD_SCLK 21 +#define LCD_CS 44 +#define LCD_DC 47 +#define LCD_RST -1 +#define LCD_BCKL 48 + +#define LCD_WIDTH 240 +#define LCD_HEIGHT 240 +#define LCD_ROTATE 0 +#elif CONFIG_CAMERA_MODULE_ESP_S2_KALUGA +#define LCD_CONTROLLER SCREEN_CONTROLLER_ST7789 + +#define LCD_MOSI 9 +#define LCD_MISO -1 +#define LCD_SCLK 15 +#define LCD_CS 11 +#define LCD_DC 13 +#define LCD_RST 16 +#define LCD_BCKL 6 + +// LCD display width and height +#define LCD_WIDTH 240 +#define LCD_HEIGHT 320 +#define LCD_ROTATE SCR_SWAP_XY|SCR_MIRROR_X +#endif + + + + +#ifdef __cplusplus +extern "C" +{ +#endif + + esp_err_t app_camera_init(); + esp_err_t app_lcd_init(); +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/examples/code_recognition/sdkconfig.defaults b/examples/code_recognition/sdkconfig.defaults new file mode 100644 index 0000000..d53e9f4 --- /dev/null +++ b/examples/code_recognition/sdkconfig.defaults @@ -0,0 +1,6 @@ +CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y + +CONFIG_ESPTOOLPY_FLASHFREQ_80M=y +CONFIG_ESPTOOLPY_FLASHMODE_QIO=y + +CONFIG_SPIRAM_SPEED_80M=y \ No newline at end of file diff --git a/examples/code_recognition/sdkconfig.defaults.esp32 b/examples/code_recognition/sdkconfig.defaults.esp32 new file mode 100644 index 0000000..ecc2d87 --- /dev/null +++ b/examples/code_recognition/sdkconfig.defaults.esp32 @@ -0,0 +1,4 @@ +CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP32_SPIRAM_SUPPORT=y + +CONFIG_CAMERA_MODULE_ESP_EYE=y \ No newline at end of file diff --git a/examples/code_recognition/sdkconfig.defaults.esp32s2 b/examples/code_recognition/sdkconfig.defaults.esp32s2 new file mode 100644 index 0000000..93fe3e9 --- /dev/null +++ b/examples/code_recognition/sdkconfig.defaults.esp32s2 @@ -0,0 +1,8 @@ +CONFIG_ESP32S2_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP32S2_SPIRAM_SUPPORT=y + +CONFIG_ESP32S2_DATA_CACHE_16KB=y +ESP32S2_DATA_CACHE_LINE_32B=y + +CONFIG_CAMERA_MODULE_ESP_S2_KALUGA=y +CONFIG_LCD_DRIVER_SCREEN_CONTROLLER_ST7789=y \ No newline at end of file diff --git a/examples/code_recognition/sdkconfig.defaults.esp32s3 b/examples/code_recognition/sdkconfig.defaults.esp32s3 new file mode 100644 index 0000000..42be7ab --- /dev/null +++ b/examples/code_recognition/sdkconfig.defaults.esp32s3 @@ -0,0 +1,11 @@ +CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240=y +CONFIG_ESP32S3_SPIRAM_SUPPORT=y + +CONFIG_ESP32S3_DATA_CACHE_64KB=y +CONFIG_ESP32S3_DATA_CACHE_8WAYS=y +CONFIG_ESP32S3_DATA_CACHE_LINE_64B=y + +CONFIG_CAMERA_MODULE_ESP_S3_EYE=y +CONFIG_LCD_DRIVER_SCREEN_CONTROLLER_ST7789=y +CONFIG_ESPTOOLPY_NO_STUB=y +CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y