added delayed error message when hackrf cpld initialization fails (#1887)

* added delayed error message when hackrf cpld initialization fails

* refactoring
This commit is contained in:
Bernd Herzog 2024-02-13 13:06:47 +01:00 committed by GitHub
parent 1139b22141
commit 918ec0574f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 45 additions and 19 deletions

View File

@ -44,6 +44,8 @@ using namespace lpc43xx;
#include "ui_navigation.hpp" #include "ui_navigation.hpp"
static int delayed_error = 0;
extern "C" { extern "C" {
CH_IRQ_HANDLER(M4Core_IRQHandler) { CH_IRQ_HANDLER(M4Core_IRQHandler) {
@ -161,6 +163,10 @@ void EventDispatcher::dispatch(const eventmask_t events) {
} }
if (events & EVT_MASK_RTC_TICK) { if (events & EVT_MASK_RTC_TICK) {
// delay error message by 2 seconds to wait for LCD being ready
if (portapack::init_error != nullptr && ++delayed_error > 1)
draw_guru_meditation(CORTEX_M4, portapack::init_error);
handle_rtc_tick(); handle_rtc_tick();
} }

View File

@ -170,13 +170,16 @@ int main(void) {
config_mode_set(); config_mode_set();
first_if.init(); /* To avoid initial short Ant_DC_Bias pulse ,we need quick set up GP01_RFF507X =1 */ first_if.init(); /* To avoid initial short Ant_DC_Bias pulse ,we need quick set up GP01_RFF507X =1 */
if (portapack::init()) {
switch (portapack::init()) {
case portapack::init_status_t::INIT_HACKRF_CPLD_FAILED:
portapack::init_error = "HACKRF CPLD FAILED";
[[fallthrough]];
case portapack::init_status_t::INIT_SUCCESS:
portapack::display.init(); portapack::display.init();
config_mode_clear(); config_mode_clear();
// sdcStart(&SDCD1, nullptr); // Commented out as now happens in portapack.cpp
// controls_init(); // Commented out as now happens in portapack.cpp
lcd_frame_sync_configure(); lcd_frame_sync_configure();
rtc_interrupt_enable(); rtc_interrupt_enable();
@ -186,8 +189,12 @@ int main(void) {
sdcStop(&SDCD1); sdcStop(&SDCD1);
portapack::shutdown(); portapack::shutdown();
} else { break;
case portapack::init_status_t::INIT_NO_PORTAPACK:
case portapack::init_status_t::INIT_PORTAPACK_CPLD_FAILED:
config_mode_clear(); config_mode_clear();
break;
} }
m4_init(portapack::spi_flash::image_tag_hackrf, portapack::memory::map::m4_code_hackrf, true); m4_init(portapack::spi_flash::image_tag_hackrf, portapack::memory::map::m4_code_hackrf, true);

View File

@ -53,6 +53,8 @@ using asahi_kasei::ak4951::AK4951;
namespace portapack { namespace portapack {
const char* init_error = nullptr;
portapack::IO io{ portapack::IO io{
portapack::gpio_dir, portapack::gpio_dir,
portapack::gpio_lcd_rdx, portapack::gpio_lcd_rdx,
@ -389,7 +391,7 @@ static void shutdown_base() {
* everything else = IRC * everything else = IRC
*/ */
bool init() { init_status_t init() {
set_idivc_base_clocks(cgu::CLK_SEL::IDIVC); set_idivc_base_clocks(cgu::CLK_SEL::IDIVC);
i2c0.start(i2c_config_boot_clock); i2c0.start(i2c_config_boot_clock);
@ -481,7 +483,7 @@ bool init() {
chThdSleepMilliseconds(10); chThdSleepMilliseconds(10);
if (i2c0.transmit(0x12 /* ak4951 */, ak4951_init_command, 2, timeout) == false) { if (i2c0.transmit(0x12 /* ak4951 */, ak4951_init_command, 2, timeout) == false) {
shutdown_base(); shutdown_base();
return false; return init_status_t::INIT_NO_PORTAPACK;
} }
} }
@ -506,12 +508,14 @@ bool init() {
// Mode center (autodetect), up (R1) and down (R2,H2,H2+) will go into hackrf mode after failing CPLD update // Mode center (autodetect), up (R1) and down (R2,H2,H2+) will go into hackrf mode after failing CPLD update
if (load_config() != 3 /* left */ && load_config() != 4 /* right */) { if (load_config() != 3 /* left */ && load_config() != 4 /* right */) {
shutdown_base(); shutdown_base();
return false; return init_status_t::INIT_PORTAPACK_CPLD_FAILED;
} }
} }
init_status_t return_code = init_status_t::INIT_SUCCESS;
if (!hackrf::cpld::load_sram()) { if (!hackrf::cpld::load_sram()) {
chSysHalt(); return_code = init_status_t::INIT_HACKRF_CPLD_FAILED;
} }
chThdSleepMilliseconds(10); // This delay seems to solve white noise audio issues chThdSleepMilliseconds(10); // This delay seems to solve white noise audio issues
@ -523,7 +527,7 @@ bool init() {
audio::init(portapack_audio_codec()); audio::init(portapack_audio_codec());
return true; return return_code;
} }
void shutdown(const bool leave_screen_on) { void shutdown(const bool leave_screen_on) {

View File

@ -41,6 +41,15 @@
* guardrails on setting properties. */ * guardrails on setting properties. */
namespace portapack { namespace portapack {
enum class init_status_t {
INIT_SUCCESS,
INIT_NO_PORTAPACK,
INIT_PORTAPACK_CPLD_FAILED,
INIT_HACKRF_CPLD_FAILED,
};
extern const char* init_error;
extern portapack::IO io; extern portapack::IO io;
extern lcd::ILI9341 display; extern lcd::ILI9341 display;
@ -65,7 +74,7 @@ extern TemperatureLogger temperature_logger;
void set_antenna_bias(const bool v); void set_antenna_bias(const bool v);
bool get_antenna_bias(); bool get_antenna_bias();
bool init(); init_status_t init();
void shutdown(const bool leave_screen_on = false); void shutdown(const bool leave_screen_on = false);
void setEventDispatcherToUSBSerial(EventDispatcher* evt); void setEventDispatcherToUSBSerial(EventDispatcher* evt);