From 528c97a8723f154caf7797aa860ade4845e06a06 Mon Sep 17 00:00:00 2001 From: apiesse Date: Thu, 14 May 2020 09:48:09 +0200 Subject: [PATCH 1/4] Fixed "gpio_install_isr_service(410): GPIO isr service already installed" --- driver/camera.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/driver/camera.c b/driver/camera.c index d2ac7a3..06c18d7 100755 --- a/driver/camera.c +++ b/driver/camera.c @@ -1256,8 +1256,13 @@ esp_err_t camera_init(const camera_config_t* config) vsync_intr_disable(); 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; + if (err != ESP_ERR_INVALID_STATE) { + ESP_LOGE(TAG, "gpio_install_isr_service failed (%x)", err); + goto fail; + } + else { + ESP_LOGW(TAG, "gpio_install_isr_service already installed"); + } } err = gpio_isr_handler_add(s_state->config.pin_vsync, &vsync_isr, NULL); if (err != ESP_OK) { From d109e5cc190fbe70d43882b42b74d134b0aca00d Mon Sep 17 00:00:00 2001 From: apiesse Date: Thu, 14 May 2020 11:31:45 +0200 Subject: [PATCH 2/4] SCCB configured externally --- driver/camera.c | 4 ++-- driver/include/esp_camera.h | 10 ++++++---- driver/private_include/sccb.h | 4 ++-- driver/sccb.c | 29 ++++++++++++++--------------- 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/driver/camera.c b/driver/camera.c index 06c18d7..c799211 100755 --- a/driver/camera.c +++ b/driver/camera.c @@ -959,7 +959,7 @@ esp_err_t camera_probe(const camera_config_t* config, camera_model_t* out_camera camera_enable_out_clock(config); ESP_LOGD(TAG, "Initializing SSCB"); - SCCB_Init(config->pin_sscb_sda, config->pin_sscb_scl); + SCCB_Init(config->pin_sccb_sda, config->pin_sccb_scl, config->sccb_external); if(config->pin_pwdn >= 0) { ESP_LOGD(TAG, "Resetting camera by power down line"); @@ -968,7 +968,7 @@ esp_err_t camera_probe(const camera_config_t* config, camera_model_t* out_camera conf.mode = GPIO_MODE_OUTPUT; gpio_config(&conf); - // carefull, logic is inverted compared to reset pin + // careful, logic is inverted compared to reset pin gpio_set_level(config->pin_pwdn, 1); vTaskDelay(10 / portTICK_PERIOD_MS); gpio_set_level(config->pin_pwdn, 0); diff --git a/driver/include/esp_camera.h b/driver/include/esp_camera.h index dadd0c0..139cf5c 100755 --- a/driver/include/esp_camera.h +++ b/driver/include/esp_camera.h @@ -18,8 +18,8 @@ .pin_pwdn = PIN_PWDN, .pin_reset = PIN_RESET, .pin_xclk = PIN_XCLK, - .pin_sscb_sda = PIN_SIOD, - .pin_sscb_scl = PIN_SIOC, + .pin_sccb_sda = PIN_SIOD, + .pin_sccb_scl = PIN_SIOC, .pin_d7 = PIN_D7, .pin_d6 = PIN_D6, .pin_d5 = PIN_D5, @@ -81,8 +81,8 @@ typedef struct { int pin_pwdn; /*!< GPIO pin for camera power down line */ int pin_reset; /*!< GPIO pin for camera reset line */ int pin_xclk; /*!< GPIO pin for camera XCLK line */ - int pin_sscb_sda; /*!< GPIO pin for camera SDA line */ - int pin_sscb_scl; /*!< GPIO pin for camera SCL line */ + int pin_sccb_sda; /*!< GPIO pin for camera SDA line */ + int pin_sccb_scl; /*!< GPIO pin for camera SCL line */ int pin_d7; /*!< GPIO pin for camera D7 line */ int pin_d6; /*!< GPIO pin for camera D6 line */ int pin_d5; /*!< GPIO pin for camera D5 line */ @@ -105,6 +105,8 @@ typedef struct { int jpeg_quality; /*!< Quality of JPEG output. 0-63 lower means higher quality */ size_t fb_count; /*!< Number of frame buffers to be allocated. If more than one, then each frame will be acquired (double speed) */ + + int sccb_external; /*!< Hardware SCCB interface configured externally */ } camera_config_t; /** diff --git a/driver/private_include/sccb.h b/driver/private_include/sccb.h index 4d5b5b4..42f43e8 100755 --- a/driver/private_include/sccb.h +++ b/driver/private_include/sccb.h @@ -9,8 +9,8 @@ #ifndef __SCCB_H__ #define __SCCB_H__ #include -int SCCB_Init(int pin_sda, int pin_scl); -uint8_t SCCB_Probe(); +int SCCB_Init(int pin_sda, int pin_scl, int external); +uint8_t SCCB_Probe(void); uint8_t SCCB_Read(uint8_t slv_addr, uint8_t reg); uint8_t SCCB_Write(uint8_t slv_addr, uint8_t reg, uint8_t data); uint8_t SCCB_Read16(uint8_t slv_addr, uint16_t reg); diff --git a/driver/sccb.c b/driver/sccb.c index 30e725c..7254f18 100755 --- a/driver/sccb.c +++ b/driver/sccb.c @@ -19,8 +19,6 @@ static const char* TAG = "sccb"; #endif -//#undef CONFIG_SCCB_HARDWARE_I2C - #define LITTLETOBIG(x) ((x<<8)|(x>>8)) #ifdef CONFIG_SCCB_HARDWARE_I2C @@ -43,28 +41,29 @@ static uint8_t ESP_SLAVE_ADDR = 0x3c; #include "twi.h" #endif -int SCCB_Init(int pin_sda, int pin_scl) +int SCCB_Init(int pin_sda, int pin_scl, int external) { - ESP_LOGI(TAG, "pin_sda %d pin_scl %d\n", pin_sda, pin_scl); + ESP_LOGI(TAG, "pin_sda %d pin_scl %d external %d \n", pin_sda, pin_scl, external); #ifdef CONFIG_SCCB_HARDWARE_I2C - //log_i("SCCB_Init start"); - i2c_config_t conf; - conf.mode = I2C_MODE_MASTER; - conf.sda_io_num = pin_sda; - conf.sda_pullup_en = GPIO_PULLUP_ENABLE; - conf.scl_io_num = pin_scl; - conf.scl_pullup_en = GPIO_PULLUP_ENABLE; - conf.master.clk_speed = SCCB_FREQ; + if (external == 0) { + i2c_config_t conf; + conf.mode = I2C_MODE_MASTER; + conf.sda_io_num = pin_sda; + conf.sda_pullup_en = GPIO_PULLUP_ENABLE; + conf.scl_io_num = pin_scl; + conf.scl_pullup_en = GPIO_PULLUP_ENABLE; + conf.master.clk_speed = SCCB_FREQ; - i2c_param_config(SCCB_I2C_PORT, &conf); - i2c_driver_install(SCCB_I2C_PORT, conf.mode, 0, 0, 0); + i2c_param_config(SCCB_I2C_PORT, &conf); + i2c_driver_install(SCCB_I2C_PORT, conf.mode, 0, 0, 0); + } #else twi_init(pin_sda, pin_scl); #endif return 0; } -uint8_t SCCB_Probe() +uint8_t SCCB_Probe(void) { #ifdef CONFIG_SCCB_HARDWARE_I2C uint8_t slave_addr = 0x0; From f69786ba7529a731c254cbf1646cedd16d3e1f5b Mon Sep 17 00:00:00 2001 From: apiesse Date: Thu, 14 May 2020 13:25:12 +0200 Subject: [PATCH 3/4] reverted "SCCB configured externally" --- driver/camera.c | 13 ++++--------- driver/include/esp_camera.h | 10 ++++------ driver/private_include/sccb.h | 4 ++-- driver/sccb.c | 29 +++++++++++++++-------------- 4 files changed, 25 insertions(+), 31 deletions(-) diff --git a/driver/camera.c b/driver/camera.c index c799211..d2ac7a3 100755 --- a/driver/camera.c +++ b/driver/camera.c @@ -959,7 +959,7 @@ esp_err_t camera_probe(const camera_config_t* config, camera_model_t* out_camera camera_enable_out_clock(config); ESP_LOGD(TAG, "Initializing SSCB"); - SCCB_Init(config->pin_sccb_sda, config->pin_sccb_scl, config->sccb_external); + SCCB_Init(config->pin_sscb_sda, config->pin_sscb_scl); if(config->pin_pwdn >= 0) { ESP_LOGD(TAG, "Resetting camera by power down line"); @@ -968,7 +968,7 @@ esp_err_t camera_probe(const camera_config_t* config, camera_model_t* out_camera conf.mode = GPIO_MODE_OUTPUT; gpio_config(&conf); - // careful, logic is inverted compared to reset pin + // carefull, logic is inverted compared to reset pin gpio_set_level(config->pin_pwdn, 1); vTaskDelay(10 / portTICK_PERIOD_MS); gpio_set_level(config->pin_pwdn, 0); @@ -1256,13 +1256,8 @@ esp_err_t camera_init(const camera_config_t* config) vsync_intr_disable(); err = gpio_install_isr_service(ESP_INTR_FLAG_LEVEL1 | ESP_INTR_FLAG_IRAM); if (err != ESP_OK) { - if (err != ESP_ERR_INVALID_STATE) { - ESP_LOGE(TAG, "gpio_install_isr_service failed (%x)", err); - goto fail; - } - else { - ESP_LOGW(TAG, "gpio_install_isr_service already installed"); - } + 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) { diff --git a/driver/include/esp_camera.h b/driver/include/esp_camera.h index 139cf5c..dadd0c0 100755 --- a/driver/include/esp_camera.h +++ b/driver/include/esp_camera.h @@ -18,8 +18,8 @@ .pin_pwdn = PIN_PWDN, .pin_reset = PIN_RESET, .pin_xclk = PIN_XCLK, - .pin_sccb_sda = PIN_SIOD, - .pin_sccb_scl = PIN_SIOC, + .pin_sscb_sda = PIN_SIOD, + .pin_sscb_scl = PIN_SIOC, .pin_d7 = PIN_D7, .pin_d6 = PIN_D6, .pin_d5 = PIN_D5, @@ -81,8 +81,8 @@ typedef struct { int pin_pwdn; /*!< GPIO pin for camera power down line */ int pin_reset; /*!< GPIO pin for camera reset line */ int pin_xclk; /*!< GPIO pin for camera XCLK line */ - int pin_sccb_sda; /*!< GPIO pin for camera SDA line */ - int pin_sccb_scl; /*!< GPIO pin for camera SCL line */ + int pin_sscb_sda; /*!< GPIO pin for camera SDA line */ + int pin_sscb_scl; /*!< GPIO pin for camera SCL line */ int pin_d7; /*!< GPIO pin for camera D7 line */ int pin_d6; /*!< GPIO pin for camera D6 line */ int pin_d5; /*!< GPIO pin for camera D5 line */ @@ -105,8 +105,6 @@ typedef struct { int jpeg_quality; /*!< Quality of JPEG output. 0-63 lower means higher quality */ size_t fb_count; /*!< Number of frame buffers to be allocated. If more than one, then each frame will be acquired (double speed) */ - - int sccb_external; /*!< Hardware SCCB interface configured externally */ } camera_config_t; /** diff --git a/driver/private_include/sccb.h b/driver/private_include/sccb.h index 42f43e8..4d5b5b4 100755 --- a/driver/private_include/sccb.h +++ b/driver/private_include/sccb.h @@ -9,8 +9,8 @@ #ifndef __SCCB_H__ #define __SCCB_H__ #include -int SCCB_Init(int pin_sda, int pin_scl, int external); -uint8_t SCCB_Probe(void); +int SCCB_Init(int pin_sda, int pin_scl); +uint8_t SCCB_Probe(); uint8_t SCCB_Read(uint8_t slv_addr, uint8_t reg); uint8_t SCCB_Write(uint8_t slv_addr, uint8_t reg, uint8_t data); uint8_t SCCB_Read16(uint8_t slv_addr, uint16_t reg); diff --git a/driver/sccb.c b/driver/sccb.c index 7254f18..0347a8f 100755 --- a/driver/sccb.c +++ b/driver/sccb.c @@ -19,6 +19,8 @@ static const char* TAG = "sccb"; #endif +//#undef CONFIG_SCCB_HARDWARE_I2C + #define LITTLETOBIG(x) ((x<<8)|(x>>8)) #ifdef CONFIG_SCCB_HARDWARE_I2C @@ -41,29 +43,28 @@ static uint8_t ESP_SLAVE_ADDR = 0x3c; #include "twi.h" #endif -int SCCB_Init(int pin_sda, int pin_scl, int external) +int SCCB_Init(int pin_sda, int pin_scl { - ESP_LOGI(TAG, "pin_sda %d pin_scl %d external %d \n", pin_sda, pin_scl, external); + ESP_LOGI(TAG, "pin_sda %d pin_scl %d \n", pin_sda, pin_scl); #ifdef CONFIG_SCCB_HARDWARE_I2C - if (external == 0) { - i2c_config_t conf; - conf.mode = I2C_MODE_MASTER; - conf.sda_io_num = pin_sda; - conf.sda_pullup_en = GPIO_PULLUP_ENABLE; - conf.scl_io_num = pin_scl; - conf.scl_pullup_en = GPIO_PULLUP_ENABLE; - conf.master.clk_speed = SCCB_FREQ; + //log_i("SCCB_Init start"); + i2c_config_t conf; + conf.mode = I2C_MODE_MASTER; + conf.sda_io_num = pin_sda; + conf.sda_pullup_en = GPIO_PULLUP_ENABLE; + conf.scl_io_num = pin_scl; + conf.scl_pullup_en = GPIO_PULLUP_ENABLE; + conf.master.clk_speed = SCCB_FREQ; - i2c_param_config(SCCB_I2C_PORT, &conf); - i2c_driver_install(SCCB_I2C_PORT, conf.mode, 0, 0, 0); - } + i2c_param_config(SCCB_I2C_PORT, &conf); + i2c_driver_install(SCCB_I2C_PORT, conf.mode, 0, 0, 0); #else twi_init(pin_sda, pin_scl); #endif return 0; } -uint8_t SCCB_Probe(void) +uint8_t SCCB_Probe() { #ifdef CONFIG_SCCB_HARDWARE_I2C uint8_t slave_addr = 0x0; From 8d80a9c8dd3ac3f52137614dad90dff2ec922c80 Mon Sep 17 00:00:00 2001 From: apiesse Date: Thu, 14 May 2020 13:26:37 +0200 Subject: [PATCH 4/4] fixed code --- driver/camera.c | 9 +++++++-- driver/sccb.c | 4 ++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/driver/camera.c b/driver/camera.c index d2ac7a3..06c18d7 100755 --- a/driver/camera.c +++ b/driver/camera.c @@ -1256,8 +1256,13 @@ esp_err_t camera_init(const camera_config_t* config) vsync_intr_disable(); 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; + if (err != ESP_ERR_INVALID_STATE) { + ESP_LOGE(TAG, "gpio_install_isr_service failed (%x)", err); + goto fail; + } + else { + ESP_LOGW(TAG, "gpio_install_isr_service already installed"); + } } err = gpio_isr_handler_add(s_state->config.pin_vsync, &vsync_isr, NULL); if (err != ESP_OK) { diff --git a/driver/sccb.c b/driver/sccb.c index 0347a8f..30e725c 100755 --- a/driver/sccb.c +++ b/driver/sccb.c @@ -43,9 +43,9 @@ static uint8_t ESP_SLAVE_ADDR = 0x3c; #include "twi.h" #endif -int SCCB_Init(int pin_sda, int pin_scl +int SCCB_Init(int pin_sda, int pin_scl) { - ESP_LOGI(TAG, "pin_sda %d pin_scl %d \n", pin_sda, pin_scl); + ESP_LOGI(TAG, "pin_sda %d pin_scl %d\n", pin_sda, pin_scl); #ifdef CONFIG_SCCB_HARDWARE_I2C //log_i("SCCB_Init start"); i2c_config_t conf;