From 0076c3e77e4c677cdd89c14832947b7bfda1ecda Mon Sep 17 00:00:00 2001 From: jjsch-dev Date: Tue, 28 Jan 2020 09:49:18 -0300 Subject: [PATCH] fix headers that require esp32 --- CMakeLists.txt | 2 +- conversions/esp_jpg_decode.c | 10 +++ conversions/to_bmp.c | 12 ++- conversions/to_jpg.cpp | 14 +++- driver/camera.c | 108 ++++++++++++++++++++++--- driver/include/esp_camera.h | 13 +++ driver/include/sensor.h | 2 + driver/private_include/camera_common.h | 17 ++-- driver/sccb.c | 16 ++-- driver/sensor.c | 5 +- driver/xclk.c | 7 +- 11 files changed, 171 insertions(+), 35 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 385c6dc..49d5c1a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,6 +26,6 @@ set(COMPONENT_PRIV_INCLUDEDIRS ) set(COMPONENT_REQUIRES driver) -set(COMPONENT_PRIV_REQUIRES freertos) +set(COMPONENT_PRIV_REQUIRES freertos nvs_flash) register_component() diff --git a/conversions/esp_jpg_decode.c b/conversions/esp_jpg_decode.c index 8cea282..a37878a 100644 --- a/conversions/esp_jpg_decode.c +++ b/conversions/esp_jpg_decode.c @@ -12,7 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. #include "esp_jpg_decode.h" + +#include "esp_system.h" +#ifdef ESP_IDF_VERSION_MAJOR // IDF 4+ +#if CONFIG_IDF_TARGET_ESP32 // ESP32/PICO-D4 #include "esp32/rom/tjpgd.h" +#else +#error Target CONFIG_IDF_TARGET is not supported +#endif +#else // ESP32 Before IDF 4.0 +#include "rom/tjpgd.h" +#endif #if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_ARDUHAL_ESP_LOG) #include "esp32-hal-log.h" diff --git a/conversions/to_bmp.c b/conversions/to_bmp.c index b4ec8f1..5d8d301 100644 --- a/conversions/to_bmp.c +++ b/conversions/to_bmp.c @@ -14,13 +14,23 @@ #include #include #include "img_converters.h" -#include "esp32/spiram.h" #include "soc/efuse_reg.h" #include "esp_heap_caps.h" #include "yuv.h" #include "sdkconfig.h" #include "esp_jpg_decode.h" +#include "esp_system.h" +#ifdef ESP_IDF_VERSION_MAJOR // IDF 4+ +#if CONFIG_IDF_TARGET_ESP32 // ESP32/PICO-D4 +#include "esp32/spiram.h" +#else +#error Target CONFIG_IDF_TARGET is not supported +#endif +#else // ESP32 Before IDF 4.0 +#include "esp_spiram.h" +#endif + #if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_ARDUHAL_ESP_LOG) #include "esp32-hal-log.h" #define TAG "" diff --git a/conversions/to_jpg.cpp b/conversions/to_jpg.cpp index a2fbf14..812ec57 100644 --- a/conversions/to_jpg.cpp +++ b/conversions/to_jpg.cpp @@ -13,7 +13,6 @@ // limitations under the License. #include #include -#include "esp32/spiram.h" #include "esp_attr.h" #include "soc/efuse_reg.h" #include "esp_heap_caps.h" @@ -22,12 +21,23 @@ #include "jpge.h" #include "yuv.h" +#include "esp_system.h" +#ifdef ESP_IDF_VERSION_MAJOR // IDF 4+ +#if CONFIG_IDF_TARGET_ESP32 // ESP32/PICO-D4 +#include "esp32/spiram.h" +#else +#error Target CONFIG_IDF_TARGET is not supported +#endif +#else // ESP32 Before IDF 4.0 +#include "esp_spiram.h" +#endif + #if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_ARDUHAL_ESP_LOG) #include "esp32-hal-log.h" #define TAG "" #else #include "esp_log.h" -static const char* TAG = "to_bmp"; +static const char* TAG = "to_jpg"; #endif static void *_malloc(size_t size) diff --git a/driver/camera.c b/driver/camera.c index 34beff4..0b5e432 100755 --- a/driver/camera.c +++ b/driver/camera.c @@ -28,20 +28,14 @@ #include "driver/rtc_io.h" #include "driver/periph_ctrl.h" #include "esp_intr_alloc.h" +#include "esp_system.h" +#include "nvs_flash.h" +#include "nvs.h" #include "sensor.h" #include "sccb.h" #include "esp_camera.h" #include "camera_common.h" #include "xclk.h" -#ifdef ESP_IDF_VERSION_MAJOR // IDF 4+ - #if CONFIG_IDF_TARGET_ESP32 // ESP32/PICO-D4 - #include "esp32/rom/lldesc.h" - #else - #error Target CONFIG_IDF_TARGET is not supported - #endif -#else - #include "rom/lldesc.h" // ESP32 Before IDF 4.0 -#endif #if CONFIG_OV2640_SUPPORT #include "ov2640.h" #endif @@ -79,6 +73,8 @@ typedef enum { #include "esp_log.h" static const char* TAG = "camera"; #endif +static const char* CAMERA_SENSOR_NVS_KEY = "sensor"; +static const char* CAMERA_PIXFORMAT_NVS_KEY = "pixformat"; typedef void (*dma_filter_t)(const dma_elem_t* src, lldesc_t* dma_desc, uint8_t* dst); @@ -1233,7 +1229,11 @@ esp_err_t camera_init(const camera_config_t* config) } vsync_intr_disable(); - gpio_install_isr_service(ESP_INTR_FLAG_LEVEL1 | ESP_INTR_FLAG_IRAM); + err = gpio_install_isr_service(ESP_INTR_FLAG_LEVEL1 | ESP_INTR_FLAG_IRAM); + if (err != ESP_OK) { + ESP_LOGE(TAG, "gpio_install_isr_service failed (%x)", err); + goto fail; + } err = gpio_isr_handler_add(s_state->config.pin_vsync, &vsync_isr, NULL); if (err != ESP_OK) { ESP_LOGE(TAG, "vsync_isr_handler_add failed (%x)", err); @@ -1402,3 +1402,91 @@ sensor_t * esp_camera_sensor_get() } return &s_state->sensor; } + +esp_err_t esp_camera_save_to_nvs(const char *key) +{ +#ifdef ESP_IDF_VERSION_MAJOR + nvs_handle_t handle; +#else + nvs_handle handle; +#endif + esp_err_t ret = nvs_open(key,NVS_READWRITE,&handle); + + if (ret == ESP_OK) { + sensor_t *s = esp_camera_sensor_get(); + if (s != NULL) { + ret = nvs_set_blob(handle,CAMERA_SENSOR_NVS_KEY,&s->status,sizeof(camera_status_t)); + if (ret == ESP_OK) { + uint8_t pf = s->pixformat; + ret = nvs_set_u8(handle,CAMERA_PIXFORMAT_NVS_KEY,pf); + } + return ret; + } else { + return ESP_ERR_CAMERA_NOT_DETECTED; + } + nvs_close(handle); + return ret; + } else { + return ret; + } +} + +esp_err_t esp_camera_load_from_nvs(const char *key) +{ +#ifdef ESP_IDF_VERSION_MAJOR + nvs_handle_t handle; +#else + nvs_handle handle; +#endif + uint8_t pf; + + esp_err_t ret = nvs_open(key,NVS_READWRITE,&handle); + + if (ret == ESP_OK) { + sensor_t *s = esp_camera_sensor_get(); + camera_status_t st; + if (s != NULL) { + size_t size = sizeof(camera_status_t); + ret = nvs_get_blob(handle,CAMERA_SENSOR_NVS_KEY,&st,&size); + if (ret == ESP_OK) { + s->set_ae_level(s,st.ae_level); + s->set_aec2(s,st.aec2); + s->set_aec_value(s,st.aec_value); + s->set_agc_gain(s,st.agc_gain); + s->set_awb_gain(s,st.awb_gain); + s->set_bpc(s,st.bpc); + s->set_brightness(s,st.brightness); + s->set_colorbar(s,st.colorbar); + s->set_contrast(s,st.contrast); + s->set_dcw(s,st.dcw); + s->set_denoise(s,st.denoise); + s->set_exposure_ctrl(s,st.aec); + s->set_framesize(s,st.framesize); + s->set_gain_ctrl(s,st.agc); + s->set_gainceiling(s,st.gainceiling); + s->set_hmirror(s,st.hmirror); + s->set_lenc(s,st.lenc); + s->set_quality(s,st.quality); + s->set_raw_gma(s,st.raw_gma); + s->set_saturation(s,st.saturation); + s->set_sharpness(s,st.sharpness); + s->set_special_effect(s,st.special_effect); + s->set_vflip(s,st.vflip); + s->set_wb_mode(s,st.wb_mode); + s->set_whitebal(s,st.awb); + s->set_wpc(s,st.wpc); + } + ret = nvs_get_u8(handle,CAMERA_PIXFORMAT_NVS_KEY,&pf); + if (ret == ESP_OK) { + s->set_pixformat(s,pf); + } + } else { + return ESP_ERR_CAMERA_NOT_DETECTED; + } + nvs_close(handle); + return ret; + } else { + ESP_LOGW(TAG,"Error (%d) opening nvs key \"%s\"",ret,key); + return ret; + } +} diff --git a/driver/include/esp_camera.h b/driver/include/esp_camera.h index 071b986..d7034f4 100755 --- a/driver/include/esp_camera.h +++ b/driver/include/esp_camera.h @@ -171,6 +171,19 @@ void esp_camera_fb_return(camera_fb_t * fb); */ sensor_t * esp_camera_sensor_get(); +/** + * @brief Save camera settings to non-volatile-storage (NVS) + * + * @param key A unique nvs key name for the camera settings + */ +esp_err_t esp_camera_save_to_nvs(const char *key); + +/** + * @brief Load camera settings from non-volatile-storage (NVS) + * + * @param key A unique nvs key name for the camera settings + */ +esp_err_t esp_camera_load_from_nvs(const char *key); #ifdef __cplusplus } diff --git a/driver/include/sensor.h b/driver/include/sensor.h index aa4678a..4a65f41 100755 --- a/driver/include/sensor.h +++ b/driver/include/sensor.h @@ -28,10 +28,12 @@ typedef enum { } pixformat_t; typedef enum { + FRAMESIZE_96x96, // 96x96 FRAMESIZE_QQVGA, // 160x120 FRAMESIZE_QQVGA2, // 128x160 FRAMESIZE_QCIF, // 176x144 FRAMESIZE_HQVGA, // 240x176 + FRAMESIZE_240x240, // 240x240 FRAMESIZE_QVGA, // 320x240 FRAMESIZE_CIF, // 400x296 FRAMESIZE_VGA, // 640x480 diff --git a/driver/private_include/camera_common.h b/driver/private_include/camera_common.h index 8c52aeb..f31d045 100755 --- a/driver/private_include/camera_common.h +++ b/driver/private_include/camera_common.h @@ -11,14 +11,15 @@ #include "esp_camera.h" #include "sensor.h" -#ifdef ESP_IDF_VERSION_MAJOR // IDF 4+ - #if CONFIG_IDF_TARGET_ESP32 // ESP32/PICO-D4 - #include "esp32/rom/lldesc.h" - #else - #error Target CONFIG_IDF_TARGET is not supported - #endif -#else - #include "rom/lldesc.h" // ESP32 Before IDF 4.0 +#include "esp_system.h" +#ifdef ESP_IDF_VERSION_MAJOR // IDF 4+ +#if CONFIG_IDF_TARGET_ESP32 // ESP32/PICO-D4 +#include "esp32/rom/lldesc.h" +#else +#error Target CONFIG_IDF_TARGET is not supported +#endif +#else // ESP32 Before IDF 4.0 +#include "rom/lldesc.h" #endif typedef union { diff --git a/driver/sccb.c b/driver/sccb.c index 892eb5b..48e53fc 100755 --- a/driver/sccb.c +++ b/driver/sccb.c @@ -102,7 +102,7 @@ uint8_t SCCB_Read(uint8_t slv_addr, uint8_t reg) esp_err_t ret = ESP_FAIL; i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); - i2c_master_write_byte(cmd, ( ESP_SLAVE_ADDR << 1 ) | WRITE_BIT, ACK_CHECK_EN); + i2c_master_write_byte(cmd, ( slv_addr << 1 ) | WRITE_BIT, ACK_CHECK_EN); i2c_master_write_byte(cmd, reg, ACK_CHECK_EN); i2c_master_stop(cmd); ret = i2c_master_cmd_begin(SCCB_I2C_PORT, cmd, 1000 / portTICK_RATE_MS); @@ -110,13 +110,13 @@ uint8_t SCCB_Read(uint8_t slv_addr, uint8_t reg) if(ret != ESP_OK) return -1; cmd = i2c_cmd_link_create(); i2c_master_start(cmd); - i2c_master_write_byte(cmd, ( ESP_SLAVE_ADDR << 1 ) | READ_BIT, ACK_CHECK_EN); + i2c_master_write_byte(cmd, ( slv_addr << 1 ) | READ_BIT, ACK_CHECK_EN); i2c_master_read_byte(cmd, &data, NACK_VAL); i2c_master_stop(cmd); ret = i2c_master_cmd_begin(SCCB_I2C_PORT, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); if(ret != ESP_OK) { - ESP_LOGE(TAG, "SCCB_Read Failed addr:0x%02x, reg:0x%02x, data:0x%02x, ret:%d", ESP_SLAVE_ADDR, reg, data, ret); + ESP_LOGE(TAG, "SCCB_Read Failed addr:0x%02x, reg:0x%02x, data:0x%02x, ret:%d", slv_addr, reg, data, ret); } return data; #else @@ -144,14 +144,14 @@ uint8_t SCCB_Write(uint8_t slv_addr, uint8_t reg, uint8_t data) esp_err_t ret = ESP_FAIL; i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); - i2c_master_write_byte(cmd, ( ESP_SLAVE_ADDR << 1 ) | WRITE_BIT, ACK_CHECK_EN); + i2c_master_write_byte(cmd, ( slv_addr << 1 ) | WRITE_BIT, ACK_CHECK_EN); i2c_master_write_byte(cmd, reg, ACK_CHECK_EN); i2c_master_write_byte(cmd, data, ACK_CHECK_EN); i2c_master_stop(cmd); ret = i2c_master_cmd_begin(SCCB_I2C_PORT, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); if(ret != ESP_OK) { - ESP_LOGE(TAG, "SCCB_Write Failed addr:0x%02x, reg:0x%02x, data:0x%02x, ret:%d", ESP_SLAVE_ADDR, reg, data, ret); + ESP_LOGE(TAG, "SCCB_Write Failed addr:0x%02x, reg:0x%02x, data:0x%02x, ret:%d", slv_addr, reg, data, ret); } return ret == ESP_OK ? 0 : -1; #else @@ -177,7 +177,7 @@ uint8_t SCCB_Read16(uint8_t slv_addr, uint16_t reg) uint8_t *reg_u8 = (uint8_t *)®_htons; i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); - i2c_master_write_byte(cmd, ( ESP_SLAVE_ADDR << 1 ) | WRITE_BIT, ACK_CHECK_EN); + i2c_master_write_byte(cmd, ( slv_addr << 1 ) | WRITE_BIT, ACK_CHECK_EN); i2c_master_write_byte(cmd, reg_u8[0], ACK_CHECK_EN); i2c_master_write_byte(cmd, reg_u8[1], ACK_CHECK_EN); i2c_master_stop(cmd); @@ -186,7 +186,7 @@ uint8_t SCCB_Read16(uint8_t slv_addr, uint16_t reg) if(ret != ESP_OK) return -1; cmd = i2c_cmd_link_create(); i2c_master_start(cmd); - i2c_master_write_byte(cmd, ( ESP_SLAVE_ADDR << 1 ) | READ_BIT, ACK_CHECK_EN); + i2c_master_write_byte(cmd, ( slv_addr << 1 ) | READ_BIT, ACK_CHECK_EN); i2c_master_read_byte(cmd, &data, NACK_VAL); i2c_master_stop(cmd); ret = i2c_master_cmd_begin(SCCB_I2C_PORT, cmd, 1000 / portTICK_RATE_MS); @@ -226,7 +226,7 @@ uint8_t SCCB_Write16(uint8_t slv_addr, uint16_t reg, uint8_t data) uint8_t *reg_u8 = (uint8_t *)®_htons; i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); - i2c_master_write_byte(cmd, ( ESP_SLAVE_ADDR << 1 ) | WRITE_BIT, ACK_CHECK_EN); + i2c_master_write_byte(cmd, ( slv_addr << 1 ) | WRITE_BIT, ACK_CHECK_EN); i2c_master_write_byte(cmd, reg_u8[0], ACK_CHECK_EN); i2c_master_write_byte(cmd, reg_u8[1], ACK_CHECK_EN); i2c_master_write_byte(cmd, data, ACK_CHECK_EN); diff --git a/driver/sensor.c b/driver/sensor.c index 8bc8b58..ef0b005 100644 --- a/driver/sensor.c +++ b/driver/sensor.c @@ -1,9 +1,11 @@ const int resolution[][2] = { + { 96, 96 }, /* 96x96 */ { 160, 120 }, /* QQVGA */ { 128, 160 }, /* QQVGA2*/ { 176, 144 }, /* QCIF */ { 240, 176 }, /* HQVGA */ + { 240, 240 }, /* 240x240 */ { 320, 240 }, /* QVGA */ { 400, 296 }, /* CIF */ { 640, 480 }, /* VGA */ @@ -13,6 +15,3 @@ const int resolution[][2] = { { 1600, 1200 }, /* UXGA */ { 2048, 1536 }, /* QXGA */ }; - - - diff --git a/driver/xclk.c b/driver/xclk.c index 21db2fc..19a8ebb 100755 --- a/driver/xclk.c +++ b/driver/xclk.c @@ -2,6 +2,7 @@ #include "driver/ledc.h" #include "esp_err.h" #include "esp_log.h" +#include "esp_system.h" #include "xclk.h" #if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_ARDUHAL_ESP_LOG) @@ -15,12 +16,14 @@ esp_err_t camera_enable_out_clock(camera_config_t* config) { periph_module_enable(PERIPH_LEDC_MODULE); - ledc_timer_config_t timer_conf; + ledc_timer_config_t timer_conf = {}; timer_conf.duty_resolution = 2; timer_conf.freq_hz = config->xclk_freq_hz; timer_conf.speed_mode = LEDC_HIGH_SPEED_MODE; timer_conf.timer_num = config->ledc_timer; - timer_conf.clk_cfg = LEDC_USE_APB_CLK; +#ifdef ESP_IDF_VERSION_MAJOR + timer_conf.clk_cfg = LEDC_AUTO_CLK; +#endif esp_err_t err = ledc_timer_config(&timer_conf); if (err != ESP_OK) { ESP_LOGE(TAG, "ledc_timer_config failed, rc=%x", err);