1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-19 22:35:23 +03:00

Prevent font upload if max7456 is not detected (#9158)

Prevent font upload if max7456 is not detected
This commit is contained in:
Michael Keller 2019-11-11 20:27:03 +13:00 committed by GitHub
commit 229bafee2d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 8 deletions

View file

@ -193,6 +193,7 @@ static displayPortLayer_e activeLayer = DISPLAYPORT_LAYER_FOREGROUND;
busDevice_t max7456BusDevice;
busDevice_t *busdev = &max7456BusDevice;
static bool max7456DeviceDetected = false;
static uint16_t max7456SpiClock = MAX7456_SPI_CLK;
uint16_t maxScreenSize = VIDEO_BUFFER_CHARS_PAL;
@ -450,6 +451,8 @@ void max7456PreInit(const max7456Config_t *max7456Config)
bool max7456Init(const max7456Config_t *max7456Config, const vcdProfile_t *pVcdProfile, bool cpuOverclock)
{
max7456DeviceDetected = false;
// initialize all layers
for (unsigned i = 0; i < MAX7456_SUPPORTED_LAYER_COUNT; i++) {
max7456ClearLayer(i);
@ -484,15 +487,15 @@ bool max7456Init(const max7456Config_t *max7456Config, const vcdProfile_t *pVcdP
uint8_t osdm = max7456Send(MAX7456ADD_OSDM|MAX7456ADD_READ, 0xff);
__spiBusTransactionEnd(busdev);
if (osdm != 0x1B) {
IOConfigGPIO(busdev->busdev_u.spi.csnPin, IOCFG_IPU);
return false;
}
__spiBusTransactionEnd(busdev);
// At this point, we can claim the ownership of the CS pin
max7456DeviceDetected = true;
IOInit(busdev->busdev_u.spi.csnPin, OWNER_OSD_CS, 0);
// Detect device type by writing and reading CA[8] bit at CMAL[6].
@ -822,8 +825,11 @@ void max7456RefreshAll(void)
max7456DrawScreenSlow();
}
void max7456WriteNvm(uint8_t char_address, const uint8_t *font_data)
bool max7456WriteNvm(uint8_t char_address, const uint8_t *font_data)
{
if (!max7456DeviceDetected) {
return false;
}
#ifdef MAX7456_DMA_CHANNEL_TX
while (dmaTransactionInProgress);
#endif
@ -854,6 +860,7 @@ void max7456WriteNvm(uint8_t char_address, const uint8_t *font_data)
while ((max7456Send(MAX7456ADD_STAT, 0x00) & STAT_NVR_BUSY) != 0x00);
__spiBusTransactionEnd(busdev);
return true;
}
#ifdef MAX7456_NRST_PIN
@ -877,4 +884,8 @@ void max7456HardwareReset(void)
#endif
}
bool max7456IsDeviceDetected(void)
{
return max7456DeviceDetected;
}
#endif // USE_MAX7456

View file

@ -37,7 +37,7 @@ bool max7456Init(const struct max7456Config_s *max7456Config, const struct vc
void max7456Invert(bool invert);
void max7456Brightness(uint8_t black, uint8_t white);
void max7456DrawScreen(void);
void max7456WriteNvm(uint8_t char_address, const uint8_t *font_data);
bool max7456WriteNvm(uint8_t char_address, const uint8_t *font_data);
uint8_t max7456GetRowsCount(void);
void max7456Write(uint8_t x, uint8_t y, const char *buff);
void max7456WriteChar(uint8_t x, uint8_t y, uint8_t c);
@ -48,3 +48,4 @@ bool max7456BuffersSynced(void);
bool max7456LayerSupported(displayPortLayer_e layer);
bool max7456LayerSelect(displayPortLayer_e layer);
bool max7456LayerCopy(displayPortLayer_e destLayer, displayPortLayer_e sourceLayer);
bool max7456IsDeviceDetected(void);

View file

@ -44,6 +44,7 @@
#include "common/streambuf.h"
#include "common/utils.h"
#include "config/config.h"
#include "config/config_eeprom.h"
#include "config/feature.h"
@ -67,7 +68,6 @@
#include "drivers/vtx_table.h"
#include "fc/board_info.h"
#include "config/config.h"
#include "fc/controlrate_profile.h"
#include "fc/core.h"
#include "fc/rc.h"
@ -110,6 +110,7 @@
#include "pg/beeper.h"
#include "pg/board.h"
#include "pg/gyrodev.h"
#include "pg/max7456.h"
#include "pg/motor.h"
#include "pg/rx.h"
#include "pg/rx_spi.h"
@ -796,13 +797,19 @@ static bool mspCommonProcessOutCommand(uint8_t cmdMSP, sbuf_t *dst, mspPostProce
#define OSD_FLAGS_RESERVED_1 (1 << 2)
#define OSD_FLAGS_RESERVED_2 (1 << 3)
#define OSD_FLAGS_OSD_HARDWARE_MAX_7456 (1 << 4)
#define OSD_FLAGS_MAX7456_DETECTED (1 << 5)
uint8_t osdFlags = 0;
#if defined(USE_OSD)
osdFlags |= OSD_FLAGS_OSD_FEATURE;
#endif
#ifdef USE_MAX7456
osdFlags |= OSD_FLAGS_OSD_HARDWARE_MAX_7456;
if (max7456Config()->csTag && max7456Config()->spiDevice) {
osdFlags |= OSD_FLAGS_OSD_HARDWARE_MAX_7456;
if (max7456IsDeviceDetected()) {
osdFlags |= OSD_FLAGS_MAX7456_DETECTED;
}
}
#endif
sbufWriteU8(dst, osdFlags);
@ -3281,7 +3288,9 @@ static mspResult_e mspCommonProcessInCommand(mspDescriptor_t srcDesc, uint8_t cm
font_data[i] = sbufReadU8(src);
}
// !!TODO - replace this with a device independent implementation
max7456WriteNvm(addr, font_data);
if (!max7456WriteNvm(addr, font_data)) {
return MSP_RESULT_ERROR;
}
}
break;
#else