From 0115ff15b2b1323c36e613a6234b7fd9921c3d7d Mon Sep 17 00:00:00 2001 From: Andrey Mironov Date: Mon, 23 Jul 2018 23:31:42 +0300 Subject: [PATCH 1/2] Fixed init order of MAX7456 DisplayPort --- src/main/drivers/max7456.c | 7 ++++--- src/main/drivers/max7456.h | 2 +- src/main/io/displayport_max7456.c | 11 ++++++++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/drivers/max7456.c b/src/main/drivers/max7456.c index 98add73dfc..e237b44b7b 100644 --- a/src/main/drivers/max7456.c +++ b/src/main/drivers/max7456.c @@ -415,18 +415,18 @@ void max7456ReInit(void) // Here we init only CS and try to init MAX for first time. // Also detect device type (MAX v.s. AT) -void max7456Init(const max7456Config_t *max7456Config, const vcdProfile_t *pVcdProfile, bool cpuOverclock) +bool max7456Init(const max7456Config_t *max7456Config, const vcdProfile_t *pVcdProfile, bool cpuOverclock) { max7456HardwareReset(); if (!max7456Config->csTag) { - return; + return false; } busdev->busdev_u.spi.csnPin = IOGetByTag(max7456Config->csTag); if (!IOIsFreeOrPreinit(busdev->busdev_u.spi.csnPin)) { - return; + return false; } IOInit(busdev->busdev_u.spi.csnPin, OWNER_OSD_CS, 0); @@ -489,6 +489,7 @@ void max7456Init(const max7456Config_t *max7456Config, const vcdProfile_t *pVcdP #endif // Real init will be made later when driver detect idle. + return true; } /** diff --git a/src/main/drivers/max7456.h b/src/main/drivers/max7456.h index 95b55695cf..c5327ddfaa 100644 --- a/src/main/drivers/max7456.h +++ b/src/main/drivers/max7456.h @@ -31,7 +31,7 @@ extern uint16_t maxScreenSize; struct vcdProfile_s; void max7456HardwareReset(void); struct max7456Config_s; -void max7456Init(const struct max7456Config_s *max7456Config, const struct vcdProfile_s *vcdProfile, bool cpuOverclock); +bool max7456Init(const struct max7456Config_s *max7456Config, const struct vcdProfile_s *vcdProfile, bool cpuOverclock); void max7456Invert(bool invert); void max7456Brightness(uint8_t black, uint8_t white); void max7456DrawScreen(void); diff --git a/src/main/io/displayport_max7456.c b/src/main/io/displayport_max7456.c index f865c2b997..accf9abd74 100644 --- a/src/main/io/displayport_max7456.c +++ b/src/main/io/displayport_max7456.c @@ -166,12 +166,17 @@ static const displayPortVTable_t max7456VTable = { displayPort_t *max7456DisplayPortInit(const vcdProfile_t *vcdProfile) { - displayInit(&max7456DisplayPort, &max7456VTable); #ifdef USE_OSD_SLAVE - max7456Init(max7456Config(), vcdProfile, false); + if (!max7456Init(max7456Config(), vcdProfile, false)) #else - max7456Init(max7456Config(), vcdProfile, systemConfig()->cpu_overclock); + if (!max7456Init(max7456Config(), vcdProfile, systemConfig()->cpu_overclock)) #endif + { + return NULL; + } + + displayInit(&max7456DisplayPort, &max7456VTable); + resync(&max7456DisplayPort); return &max7456DisplayPort; } From 65bff6b7d78ecc1507288b54def0d33477fdc410 Mon Sep 17 00:00:00 2001 From: Andrey Mironov Date: Tue, 24 Jul 2018 11:54:37 +0300 Subject: [PATCH 2/2] Added a condition for enabling OSD task --- src/main/fc/fc_tasks.c | 4 ++-- src/main/io/displayport_max7456.c | 7 ++++--- src/main/io/osd.c | 5 +++++ src/main/io/osd.h | 1 + src/main/io/osd_slave.c | 5 +++++ src/main/io/osd_slave.h | 1 + 6 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/main/fc/fc_tasks.c b/src/main/fc/fc_tasks.c index fef1bd0c55..14325e5e32 100644 --- a/src/main/fc/fc_tasks.c +++ b/src/main/fc/fc_tasks.c @@ -265,7 +265,7 @@ void fcTasksInit(void) #endif #ifdef USE_OSD_SLAVE - setTaskEnabled(TASK_OSD_SLAVE, true); + setTaskEnabled(TASK_OSD_SLAVE, osdSlaveInitialized()); #else if (sensors(SENSOR_GYRO)) { rescheduleTask(TASK_GYROPID, gyro.targetLooptime); @@ -319,7 +319,7 @@ void fcTasksInit(void) setTaskEnabled(TASK_TRANSPONDER, feature(FEATURE_TRANSPONDER)); #endif #ifdef USE_OSD - setTaskEnabled(TASK_OSD, feature(FEATURE_OSD)); + setTaskEnabled(TASK_OSD, feature(FEATURE_OSD) && osdInitialized()); #endif #ifdef USE_BST setTaskEnabled(TASK_BST_MASTER_PROCESS, true); diff --git a/src/main/io/displayport_max7456.c b/src/main/io/displayport_max7456.c index accf9abd74..b76497e611 100644 --- a/src/main/io/displayport_max7456.c +++ b/src/main/io/displayport_max7456.c @@ -166,12 +166,13 @@ static const displayPortVTable_t max7456VTable = { displayPort_t *max7456DisplayPortInit(const vcdProfile_t *vcdProfile) { + if ( #ifdef USE_OSD_SLAVE - if (!max7456Init(max7456Config(), vcdProfile, false)) + !max7456Init(max7456Config(), vcdProfile, false) #else - if (!max7456Init(max7456Config(), vcdProfile, systemConfig()->cpu_overclock)) + !max7456Init(max7456Config(), vcdProfile, systemConfig()->cpu_overclock) #endif - { + ) { return NULL; } diff --git a/src/main/io/osd.c b/src/main/io/osd.c index 4889d6a237..6fd374bc09 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -1131,6 +1131,11 @@ void osdInit(displayPort_t *osdDisplayPortToUse) resumeRefreshAt = micros() + (4 * REFRESH_1S); } +bool osdInitialized(void) +{ + return osdDisplayPort; +} + void osdUpdateAlarms(void) { // This is overdone? diff --git a/src/main/io/osd.h b/src/main/io/osd.h index 6addd762b2..0130f5a63c 100644 --- a/src/main/io/osd.h +++ b/src/main/io/osd.h @@ -201,6 +201,7 @@ extern timeUs_t resumeRefreshAt; struct displayPort_s; void osdInit(struct displayPort_s *osdDisplayPort); +bool osdInitialized(void); void osdResetAlarms(void); void osdUpdate(timeUs_t currentTimeUs); void osdStatSetState(uint8_t statIndex, bool enabled); diff --git a/src/main/io/osd_slave.c b/src/main/io/osd_slave.c index 6f6a7bd534..1ec4bacacd 100644 --- a/src/main/io/osd_slave.c +++ b/src/main/io/osd_slave.c @@ -120,6 +120,11 @@ void osdSlaveInit(displayPort_t *osdDisplayPortToUse) displayResync(osdDisplayPort); } +bool osdSlaveInitialized(void) +{ + return osdDisplayPort; +} + bool osdSlaveCheck(timeUs_t currentTimeUs, timeDelta_t currentDeltaTimeUs) { UNUSED(currentTimeUs); diff --git a/src/main/io/osd_slave.h b/src/main/io/osd_slave.h index 8c5287b516..b6fd0b6a4c 100644 --- a/src/main/io/osd_slave.h +++ b/src/main/io/osd_slave.h @@ -29,6 +29,7 @@ extern bool osdSlaveIsLocked; // init void osdSlaveInit(struct displayPort_s *osdDisplayPort); +bool osdSlaveInitialized(void); // task api bool osdSlaveCheck(timeUs_t currentTimeUs, timeDelta_t currentDeltaTimeUs);