diff --git a/firmware/application/portapack.cpp b/firmware/application/portapack.cpp index 6a4a18dc..9d0fd50f 100644 --- a/firmware/application/portapack.cpp +++ b/firmware/application/portapack.cpp @@ -489,12 +489,20 @@ bool init() { chThdSleepMilliseconds(10); - if( !portapack::cpld::update_if_necessary(portapack_cpld_config()) ) { - chThdSleepMilliseconds(10); - // If using a "2021/12 QFP100", press and hold the left button while booting. Should only need to do once. - if (load_config() != 3 && load_config() != 4){ - shutdown_base(); - return false; + auto pp_config = portapack_cpld_config(); + auto cpld_update_possible = portapack::cpld::update_possible(); //QFP100 CPLD fails this check. skip CPLD update + auto cpld_update_necessary = cpld_update_possible && portapack::cpld::update_necessary(pp_config); + if ( cpld_update_necessary ) { + auto ok = portapack::cpld::update(pp_config); + + if( !ok ) { + chThdSleepMilliseconds(10); + // Mode left (R1) and right (R2,H2,H2+) bypass going 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 */){ + shutdown_base(); + return false; + } } } diff --git a/firmware/common/cpld_update.cpp b/firmware/common/cpld_update.cpp index 3055eb3d..6eae8f00 100644 --- a/firmware/common/cpld_update.cpp +++ b/firmware/common/cpld_update.cpp @@ -33,9 +33,7 @@ namespace portapack { namespace cpld { -bool update_if_necessary( - const Config config -) { +bool update_possible() { jtag::GPIOTarget target { portapack::gpio_cpld_tck, portapack::gpio_cpld_tms, @@ -65,13 +63,40 @@ bool update_if_necessary( return false; } + return true; +} + +bool update_necessary( + const Config config +) { + jtag::GPIOTarget target { + portapack::gpio_cpld_tck, + portapack::gpio_cpld_tms, + portapack::gpio_cpld_tdi, + portapack::gpio_cpld_tdo + }; + jtag::JTAG jtag { target }; + CPLD cpld { jtag }; + /* Verify CPLD contents against current bitstream. */ auto ok = cpld.verify(config.block_0, config.block_1); + return !ok; +} + +bool update( + const Config config +) { + jtag::GPIOTarget target { + portapack::gpio_cpld_tck, + portapack::gpio_cpld_tms, + portapack::gpio_cpld_tdi, + portapack::gpio_cpld_tdo + }; + jtag::JTAG jtag { target }; + CPLD cpld { jtag }; /* CPLD verifies incorrectly. Erase and program with current bitstream. */ - if( !ok ) { - ok = cpld.program(config.block_0, config.block_1); - } + auto ok = cpld.program(config.block_0, config.block_1); /* If programming OK, reset CPLD to user mode. Otherwise leave it in * passive (ISP) state. diff --git a/firmware/common/cpld_update.hpp b/firmware/common/cpld_update.hpp index 36c87a1b..f16ed993 100644 --- a/firmware/common/cpld_update.hpp +++ b/firmware/common/cpld_update.hpp @@ -27,7 +27,13 @@ namespace portapack { namespace cpld { -bool update_if_necessary( +bool update_possible(); + +bool update_necessary( + const Config config +); + +bool update( const Config config );