From ea793f8d1167dfe7ffc1a96e9dcafecab1905553 Mon Sep 17 00:00:00 2001 From: Sven Steudte Date: Tue, 19 Sep 2017 03:36:38 +0200 Subject: [PATCH] Added voltage change when using OV5640 Added I2C Lock around voltage change methods Implemented RBAT sleep methods Fixed I2C init problem, reordered initialization methods --- tracker/software/drivers/ov5640.c | 26 ++++++++++++++++++++++--- tracker/software/drivers/wrapper/padc.c | 6 ++++++ tracker/software/sleep.c | 4 ++-- tracker/software/threads/threads.c | 12 ++++-------- tracker/software/threads/tracking.c | 2 +- 5 files changed, 36 insertions(+), 14 deletions(-) diff --git a/tracker/software/drivers/ov5640.c b/tracker/software/drivers/ov5640.c index 9f2efca..47694a6 100644 --- a/tracker/software/drivers/ov5640.c +++ b/tracker/software/drivers/ov5640.c @@ -10,6 +10,7 @@ #include "board.h" #include "debug.h" #include "ssdv.h" +#include "padc.h" #include struct regval_list { @@ -741,6 +742,7 @@ static bool analyze_image(uint8_t *image, uint32_t image_len) uint8_t pkt[SSDV_PKT_SIZE]; uint8_t *b; uint32_t bi = 0; + uint16_t i = 0; uint8_t c = SSDV_OK; ssdv_enc_init(&ssdv, SSDV_TYPE_NORMAL, "", 0, 7); @@ -755,7 +757,7 @@ static bool analyze_image(uint8_t *image, uint32_t image_len) bi += r; if(r <= 0) { - TRACE_ERROR("CAM > Error in image"); + TRACE_ERROR("CAM > Error in image (Premature end of file %d)", i); return false; } ssdv_enc_feed(&ssdv, b, r); @@ -766,10 +768,11 @@ static bool analyze_image(uint8_t *image, uint32_t image_len) if(c != SSDV_OK) // Error in JPEG image { - TRACE_ERROR("CAM > Error in image"); + TRACE_ERROR("CAM > Error in image (ssdv_enc_get_packet failed: %d %d)", c, i); return false; } + i++; chThdSleepMilliseconds(5); } } @@ -1275,6 +1278,11 @@ void OV5640_SetResolution(resolution_t res) void OV5640_init(void) { + // The camera need 3V for communication + #if !ACTIVATE_3V + boost_voltage(true); + #endif + TRACE_INFO("CAM > Init pins"); OV5640_InitGPIO(); @@ -1294,6 +1302,10 @@ void OV5640_init(void) void OV5640_deinit(void) { + #if !ACTIVATE_3V + boost_voltage(false); + #endif + // Power off OV5640 TRACE_INFO("CAM > Switch off"); @@ -1317,6 +1329,11 @@ void OV5640_deinit(void) bool OV5640_isAvailable(void) { + // The camera need 3V for communication + #if !ACTIVATE_3V + boost_voltage(true); + #endif + // Configure pins OV5640_InitGPIO(); @@ -1328,13 +1345,16 @@ bool OV5640_isAvailable(void) uint8_t val, val2; bool ret; - if(I2C_read8_16bitreg(OV5640_I2C_ADR, 0x300A, &val) && I2C_read8_16bitreg(OV5640_I2C_ADR, 0x300B, &val2)) { ret = val == 0x56 && val2 == 0x40; } else { ret = false; } + #if !ACTIVATE_3V + boost_voltage(false); + #endif + palClearLine(LINE_CAM_EN); // Switch off camera palSetLineMode(LINE_CAM_RESET, PAL_MODE_INPUT); // CAM_RESET diff --git a/tracker/software/drivers/wrapper/padc.c b/tracker/software/drivers/wrapper/padc.c index 6c1fddd..81f0ce8 100644 --- a/tracker/software/drivers/wrapper/padc.c +++ b/tracker/software/drivers/wrapper/padc.c @@ -5,6 +5,7 @@ #include "padc.h" #include "pac1720.h" #include "debug.h" +#include "pi2c.h" #define ADC_NUM_CHANNELS 4 /* Amount of channels (solar, battery, temperature) */ #define VCC_REF_LOW 1850 /* mV */ @@ -117,6 +118,8 @@ uint16_t getSTM32Temperature(void) void boost_voltage(bool boost) { + I2C_Lock(); + if(boost) { @@ -133,5 +136,8 @@ void boost_voltage(bool boost) vcc_ref = VCC_REF_LOW; } + + chThdSleepMilliseconds(1); + I2C_Unlock(); } diff --git a/tracker/software/sleep.c b/tracker/software/sleep.c index 2db9897..9944ba9 100644 --- a/tracker/software/sleep.c +++ b/tracker/software/sleep.c @@ -18,13 +18,13 @@ bool p_sleep(const sleep_conf_t *config) return getBatteryVoltageMV() < config->vbat_thres; case SLEEP_WHEN_RBAT_BELOW_THRES: - return 0 < config->rbat_thres; // FIXME + return getLastTrackPoint()->adc_rbat < config->rbat_thres; // FIXME case SLEEP_WHEN_VBAT_ABOVE_THRES: return getBatteryVoltageMV() > config->vbat_thres; case SLEEP_WHEN_RBAT_ABOVE_THRES: - return 0 > config->rbat_thres; // FIXME + return getLastTrackPoint()->adc_rbat > config->rbat_thres; // FIXME case SLEEP_WHEN_DISCHARGING: case SLEEP_WHEN_CHARGING: diff --git a/tracker/software/threads/threads.c b/tracker/software/threads/threads.c index a1de7a6..eea9e11 100644 --- a/tracker/software/threads/threads.c +++ b/tracker/software/threads/threads.c @@ -10,13 +10,9 @@ systime_t watchdog_tracking; void start_essential_threads(void) { - // Init watchdog - init_watchdog(); - - // Initialize tracking manager (without GPS, GPS is initialized if needed by position thread) - init_tracking_manager(false); - - pi2cInit(); // Initialize I2C - pac1720_init(); // Initialize current measurement + init_watchdog(); // Init watchdog + pi2cInit(); // Initialize I2C + pac1720_init(); // Initialize current measurement + init_tracking_manager(false); // Initialize tracking manager (without GPS, GPS is initialized if needed by position thread) } diff --git a/tracker/software/threads/tracking.c b/tracker/software/threads/tracking.c index ea7f41c..b76ae3f 100644 --- a/tracker/software/threads/tracking.c +++ b/tracker/software/threads/tracking.c @@ -134,7 +134,7 @@ THD_FUNCTION(trackingThread, arg) { (void)arg; uint32_t id = 1; - lastTrackPoint = &trackPoints[0]; // FIXME: That might not work + lastTrackPoint = &trackPoints[0]; // Fill initial values by PAC1720 and BME280 and RTC