BangleJS 2 unable to update firmware

Posted on
  • Like the title says - fresh out of the box it was in the black-text-on-white that goes with the firmware update page.

    Attempted to use the app loader, and it failed to find the bangle. Switched to firmware updates, and kept it plugged in, turned on, and while the firmware updater used - first nRF firmware update and then NRF connect, and neither of them threw any errors directly - both 'completed' the firmware update. Tried the web IDE, and the flasher there did something new.

    It kicked over to the "BANK0 INVALID" error, and still failed to update.

    Prior to this, it was caught in the loop of "check storage, no new fw, restarting... check storage[...]." Now, after the first (attempted) firmware update, it will print an "ERROR" after starting the flashing process.

    Trying to figure out what to do next!

  • Final Additional note: It has had "BL 2v24" across the top at the start, which is presumably the existing firmware. But we never saw anything higher-level than that black-on-white screen since the unboxing.

  • I actually had the same error when updating from 2v24.x to 2v25 (My DFU is 2v12) via apploader.
    Reflashing again with the nrf toolbox also let me to the bank0 invalid error. Luckily a 2nd flashing with nrf toolbox was successful. So maybe just try again?

  • It has had "BL 2v24" across the top at the start, which is presumably the existing firmware.

    it is version of bootloader that is built as part of full build from source but there are typically no or very few changes in bootloader code itself between Espruino versions so it is OK to have older BL version than Espruino main firmware.

    "BANK0 INVALID" error

    espruino bootloader is based on standard Nordic DFU bootloader with added update from storage file so it has two separate ways of update. the bank0 invalid is message from Nordic BLE DFU update and says that valid flag (which is typically set after succesful BLE DFU firmware update) is not set.

    The update from storage file done by the update firmware app (or maybe the IDE tries it too?) does not touch this flag https://github.com/espruino/Espruino/blob/master/targets/nrf5x_dfu/flash.c#L310
    However if your watch can't boot into normal firmware and never could, this method cannot be used and never was. So what you probably used from the IDE is the nordic DFU way that failed to send the update correctly so now you have the bank0 invalid message.

    In this state I think the best way is to use Android phone with nrfConnect app and try to upload zip file downloaded to phone from https://www.espruino.com/Download

    You enable the BLE DFU update mode by holding button until it reboots and you see the progress bar, then you release it in the middle and check for the DFUTarg device via nrfconnect, connect to it and use the DFU button that appears to upload the zip file.

    If nordic update from your phone does not fix it then flashing full firmware over SWD probably will (= using charging cable connected to some SWD debugger dongle) but that is a bit complicated so if it never worked then returning it may be easier.

  • BTW overall it is not very clear what was the initial issue you had and what you did and what went wrong before failed update from the IDE (running on PC?) caused the bank0 invalid message.

    fresh out of the box it was in the black-text-on-white that goes with the firmware update page.

    this does not say much. what was the error? it is normal for the watch to boot into this screen from cold boot, and if you powered it on via button press and held the button a bit longer you could have triggered the progress bar that would stay in dfu mode if you then released the button too early.

    Attempted to use the app loader, and it failed to find the bangle. Switched to firmware updates, and kept it plugged in, turned on, and while the firmware updater used - first nRF firmware update and then NRF connect.

    what " Switched to firmware updates" or "turned on, and while the firmware updater used - first nRF firmware update and then NRF connect" means?

    It may not be important now but it would be interesting to know if there was actually some real issue with the watch initially or you simply used the button at startup in a way that it somehow always stayed in update mode and then you tried various methods to update it and never actually let it boot properly.

    It may not be very intuitive so maybe the watch was perfectly fine until you tried DFU from IDE that probably disconnected in the middle and left the firmware corrupted.

  • Hi guys! I'm the owner of the watch, OP is my husband who beat me to the punch posting here.

    I received it yesterday. Took it out of the box, turned it on, and immediately it kept repeating the booting screen:
    LOCKUP
    BL 2V24
    CHECK STORAGE
    NO NEW FW
    BOOTING

    And then repeating that screen - loading in each line of text, flickering, repeat. I downloaded the nRF updater and tried to install the 2v25 firmware and the app suggested that it had worked (no errors, said completed etc) but nothing changed on the watch. We tried this several times, from both my phone (pixel 7a running grapheneos) and my husband's (stock pixel 9 pro), with the same result. Tried using the app loader website but neither my phone nor my husband's could find the watch using the browser Bluetooth connection.

    Later tried using my husband's laptop which has Bluetooth using the Web IDE and I think the watch died during the attempt since it had been doing the screen repeat the whole drive home (first tries were at the Christmas gathering where I'd received the watch) but we didn't realize at first since we assumed it would power cycle during a firmware update. Once we figured that out and got it charged back up it's been on the BANK0 INVALID since then.

    It never got to the initial splash screen. I took it out of the box, turned it on, and it kept repeating the LOCKUP etc screen before we did anything with it.

    Husband is at work now but I'll be able to respond during the day. Any additional details that would help? Should I try using the nRF updater again? Don't mind having to do any resets or anything since I never got far enough to do any customizing.

  • BANK0 INVALID means there is no valid firmware, you need to flash zip from the phone via nrfconnect

    if you succeed and this message goes away and it still reboots in a loop as it did initially, you can try holding a button until it reboots and still holding it while the progress bar goes across the screen and then releasing it when it starts to boot into recovery menu as described here https://www.espruino.com/Bangle.js2#recovery-menu
    There you can erase storage which is probably the cause of the reboot loop.

    however it can also be that erasing storage from recovery menu will not help and some hardware is really faulty and that is what causes the reboot loop.

    Anyway first you need to flash valid firmware zip from your phone so yes try the nrfconnect or nrf toolbox app again.

  • I tried to do the nrfconnect again a few times today (both with standard version 25 and the cutting edge one) but it didn't work, no longer says bank0 but is back to looping the boot screen. I've been trying to get to the recovery menu since I got the thing but I guess I'm not getting the timing right for when to let go of the button :( it just goes back to looping or shuts off depending on how long I hold it.

    Here's what I can get it to do at this time:
    No action - boot loops
    Hold down button indefinitely - progress bar screen, BOOTING appears at the bottom, screen shuts off momentarily, repeat (I've held it down stupid long, until my finger hurts, and nothing else happens)
    Letting go when BOOTING appears - goes back to boot looping
    Letting go when screen shuts off - stays off
    And of course letting go during the progress bar takes me to the DFU screen.

    Husband just tried to put on the new firmware again via nrfconnect, no change in watch behavior, but sent me the logs which I've attached below.


    1 Attachment

  • if you hold for too long it will reboot again, this is to allow rebooting when some app gets stuck, so you definitely need to release the button when you get past the progress bar and it starts booting. if it reboots because of holding too long there is WATCHDOG boot reason message shown briefly in top left corner.

    If you no longer see bank0 invalid and can't get into recovery menu because it reboots earlier then it unfortunately looks like hardware fault and is probably best to return it.

    what you can do now

    • record a video of the boot loop when not holding the button
    • record a video when you are trying to get to recovery menu
    • use nrfconnect to flash some earlier firmware like 2.24 or 2.23 just in case
    • flash special build that is using only flash storage builtin to the cpu and does not use the additional 8MB SPI flash chip. if it works that would mean it is the spi flash that has some issue and would alow you to use the watch with limited storage before you decide to return it. see end of this topic https://forum.espruino.com/conversations/399406/


  • https://youtu.be/dU1rHN0l004?si=Xtk1HIlc4O2XgHfS

    Took a video of it doing everything I can get it to do right now. I have never gotten the WATCHDOG screen, it always says LOCKUP or SW RESET (only on the first time after being turned on). You should be able to hear the button being pressed/released in the video for when I'm holding it.

    I am going to try some of the older firmwares and the alternate storage option later today, I will let you know how it goes.

    And thank you so much for taking the time to help us with this! I'm very excited to get it working (even if it does need to be returned/replaced). Happy new year!

  • Oh, that is interesting. The LOCKUP reason means that the CPU runs into hard fault and locks up. That should not happen. But since the bootloader itself works fine and is relatively stable (=you can upload DFU zip file over Bluetooth and update the firmware = it runs for many seconds without fault including BLE and the display and button working) and only the main firmware crashes, in theory it can be some power optimizations not enabled in bootloader. If you want you can try build from
    https://github.com/fanoush/Espruino/actions/runs/12564223394/artifacts/2375169802 - clicking the link gives you BANGLEJS2.zip file with github build artifact that you need to extract and there is espruino_2v24.3198_banglejs2.zip file inside which is the DFU zip to flash.
    The link to this zip is also in the build output here https://github.com/fanoush/Espruino/actions/runs/12564223394/job/35027073984 when you expand the "Upload BANGLEJS2 build artifact" step.

    It is built from 2.24 release with this commit added https://github.com/fanoush/Espruino/commit/279204a8c1e869802bc196f76ecfe28238331911 or see the history here https://github.com/fanoush/Espruino/commits/f-bangle2/

    It disables some optional stuff that should normally work and save power but if the hardware is missing some optional components on PCB or they are faulty it may help and avoid crashes.

    Trying the build linked previously with SPI flash storage disabled is worth a try too, but if that does not help then this build is worth trying too (but may not help). I am also attaching the DFU zip directly if you have issues with extracting it on your phone.


    1 Attachment

  • YOOOOO!!! That fixed it, thank you so much!

    Does this mean that a normal version will always not work? And is the watch going to behave normally going forward using this version, or do you think it will still need to be replaced? Or did getting it to work normal once mean it will keep acting normal assuming something else doesn't happen?

    Again thank you for the help & your patience with all my questions, this is my first foray into this kind of thing :)

  • YOOOOO!!! That fixed it, thank you so much!

    OK, so it is one of those two features I disabled. If you want to test more, here are two more
    https://github.com/fanoush/Espruino/commits/f-2.25-no-ext32khz/
    this one has only the external low speed oscillator disabled and is forked from latest 2.25 release. To get the build you click the green checkmark on the latest commit, then 'Details' on the "Firmware build / build_dfu (BANGLEJS2) (push)", then expand the "upload BANGLEJS2 build artifact" and the link to zipped build artifact is https://github.com/fanoush/Espruino/actions/runs/12569157706/artifacts/2376029447
    again you need to extract it to get the DFU zip

    Here https://github.com/fanoush/Espruino/commits/f-2.25-no-dcdc/ is the other one disabled
    https://github.com/fanoush/Espruino/actions/runs/12569255154/artifacts/2376043065

    Beware that the zip inside both artifacts has same name as both is one commit on top of same version.

    Does this mean that a normal version will always not work? And is the watch going to behave normally going forward using this version, or do you think it will still need to be replaced?

    Yes, as long as normal version keeps it enabled you would need custom build. It is few clicks on github website to make your own build but still annoying. And you got faulty watch that passed QA by mistake with slightly worse battery life. It is up to you and @Gordon to sort this out. If you can easily get it replaced then I'd go for it. I heard people e.g. in Brazil(?) pay import taxes that makes that cost too high so it depends.

  • As for those two features it is about this
    https://docs.nordicsemi.com/bundle/ps_nrf52840/page/ref_circuitry.html#ariaid-title5 marked in red in attached picture. Both are optional features that some manufacturers do not use in their designs to save costs (if you scroll up in Nordic docs to configuration #3 with DCDCEN marked "No" the part in red is much simpler).
    When the software enables it and the circuit is not working you get crashes/lockups. Why your specific watch may be missing this is a mystery. Maybe they make different versions at the factory for different customers and it got mixed up or maybe it is just one random faulty component on PCB


    1 Attachment

    • refcircuit.PNG
  • Thanks for the thorough explanation! I am going to test drive it this week and if I'm having any issue with it I'll reach out to Gordon when he's back in office. I don't mind a mildly shorter-than-advertised battery life; my old watch was only four days or so, so if it's that or better I think I'm good. It was purchased from adafruit if that makes any difference, not sure if going through a particular seller tends to have more issues than another or something.

  • I don't mind a mildly shorter-than-advertised battery life

    It is hard to estimate but both features are more important when you e.g. run nrf52 based sensor for months from CR2032 battery (or years from bigger battery). With Bangle that is used daily and charged every week or two it may not make practical difference. That's why these are optional in the reference circuit.

    Internal DC/DC when enabled is automatically turned on when the CPU itself draws high current (in mA) and is turned off when it draws uA because at low currents it does not help and possibly make things even worse. With other nrf52840 board I measured that when connected over BLE and running busy loop the CPU was drawing 9 mA from battery when DC/DC is disabled but only 6 mA when enabled. This may look nice but such savings only affect CPU itself, not display or GPS or HR or motion sensors. And most of the time the CPU is sleeping anyway => DC/DC is not helping.

    External 32kHz crystal is supposed to be more accurate than internal 32kHz clock source and is not so sensitive to temperature changes. When it is not present the Bluetooth stack is configured to have larger tolerances to clock drift so the radio is woken up for slightly longer time to not miss data from other devices and also the internal 32kHz clock must be periodically recalibrated so the CPU is waking up to do this. However in reality the effect on battery life of Bangle 2 is again hardly noticeable. So it makes sense to enable these features when we know the watch has the components inside and it definitely saves some battery, but not much.

    So IMO the real issue is a need for custom build and the uncertainty why your watch is different and what else can be wrong with it.

  • Post a reply
    • Bold
    • Italics
    • Link
    • Image
    • List
    • Quote
    • code
    • Preview
About

BangleJS 2 unable to update firmware

Posted by Avatar for user159421 @user159421

Actions