diff --git a/driver/camera.c b/driver/camera.c index 33a15ad..e29d68e 100755 --- a/driver/camera.c +++ b/driver/camera.c @@ -840,6 +840,20 @@ esp_err_t camera_probe(const camera_config_t* config, camera_model_t* out_camera ESP_LOGD(TAG, "Initializing SSCB"); SCCB_Init(config->pin_sscb_sda, config->pin_sscb_scl); + + if(config->pin_pwdn >= 0) { + ESP_LOGD(TAG, "Resetting camera by power down line"); + gpio_config_t conf = { 0 }; + conf.pin_bit_mask = 1LL << config->pin_pwdn; + conf.mode = GPIO_MODE_OUTPUT; + gpio_config(&conf); + + // 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); + vTaskDelay(10 / portTICK_PERIOD_MS); + } if(config->pin_reset >= 0) { ESP_LOGD(TAG, "Resetting camera"); diff --git a/driver/include/esp_camera.h b/driver/include/esp_camera.h index 4b23789..fddff1b 100755 --- a/driver/include/esp_camera.h +++ b/driver/include/esp_camera.h @@ -15,6 +15,7 @@ * Example Use * static camera_config_t camera_example_config = { + .pin_pwdn = PIN_PWDN, .pin_reset = PIN_RESET, .pin_xclk = PIN_XCLK, .pin_sscb_sda = PIN_SIOD, @@ -76,6 +77,7 @@ extern "C" { * @brief Configuration structure for camera initialization */ 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 */