Hi everybody, I currently use John's TCP Bootloader on my EK-TM4C1294XL board. It's simply great. Here is the link to his post:
Now, I would like to slightly modify the bootloader so that after a firmware update, the BOOTLOADING location in the EEPROM is not written by the bootloader itself, but it will be writte by the main app only when it is proven to be stable and ok.
This way, if by mistake I update the Board with a main app that doesn't work and gets stuck, I do not have to manually (i.e. connecting locally to the board with USB and use LM Flash Programmer, or Energia, or any other flashing tool) reprogram the BOOTLOADING location in the EEPROM, but a simple switch OFF - switch ON of the board (or Watchdog expiration) is sufficient to bring it into the bootloader and allow to update a new firmware.
So, within John's function read_localClient, after the firmware transfer in the flash memory at address 0x00010000, I commented out the code which writes BOOTLOADING with 0 and issues an endless loop, and added instead the same code fragment which is contained in the setup function to jump to the main app:
HWREG(0xE000E000 + (0xD08)) = (0x10000 & 0xFFFFF); // Update vector table offset register
asm(" MOVW r0, #0x0000"); // Load r0-Low with low-part of the address, 2-bytes
asm(" MOVT r0, #0x0001"); // Load r0-High with high-part of the address, 2-bytes
asm(" ldr sp, [r0]"); // Load app vector address into SP
asm(" ldr r0, [r0, #4]"); // Prepare jump to starting address + 4
asm(" bx r0"); // Make the jump
But unfortunately, when I try to flash a firmware, the file is completely transferred from TCP client to the board by means of the BL, but the jump to main app does not succeed: the board resets and the BL is started.
Attached you can find a compare between John's original code (on the left) and my modification.
What am I doing wrong with the modifications?
regards
Simone
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <style> .AlignLeft { text-align: left; } .AlignCenter { text-align: center; } .AlignRight { text-align: right; } body { font-family: sans-serif; font-size: 11pt; } td { vertical-align: top; padding-left: 4px; padding-right: 4px; } tr.SectionGap td { font-size: 4px; border-left: none; border-top: none; border-bottom: 1px solid Black; border-right: 1px solid Black; } tr.SectionAll td { border-left: none; border-top: none; border-bottom: 1px solid Black; border-right: 1px solid Black; } tr.SectionBegin td { border-left: none; border-top: none; border-right: 1px solid Black; } tr.SectionEnd td { border-left: none; border-top: none; border-bottom: 1px solid Black; border-right: 1px solid Black; } tr.SectionMiddle td { border-left: none; border-top: none; border-right: 1px solid Black; } tr.SubsectionAll td { border-left: none; border-top: none; border-bottom: 1px solid Gray; border-right: 1px solid Black; } tr.SubsectionEnd td { border-left: none; border-top: none; border-bottom: 1px solid Gray; border-right: 1px solid Black; } table.fc { border-top: 1px solid Black; border-left: 1px solid Black; width: 100%; font-family: monospace; font-size: 10pt; } td.TextItemInsigAdd { color: #000000; background-color: #EEEEFF; } td.TextItemInsigDel { color: #000000; background-color: #EEEEFF; text-decoration: line-through; } td.TextItemInsigMod { color: #000000; background-color: #EEEEFF; } td.TextItemInsigOrphan { color: #000000; background-color: #FAEEFF; } td.TextItemNum { color: #696969; background-color: #F0F0F0; } td.TextItemSame { color: #000000; background-color: #FFFFFF; } td.TextItemSigAdd { color: #000000; background-color: #FFE3E3; } td.TextItemSigDel { color: #000000; background-color: #FFE3E3; text-decoration: line-through; } td.TextItemSigMod { color: #000000; background-color: #FFE3E3; } td.TextItemSigOrphan { color: #000000; background-color: #F1E3FF; } .TextSegInsigDiff { color: #0000FF; } .TextSegReplacedDiff { color: #0000FF; font-style: italic; } .TextSegSigDiff { color: #FF0000; } </style> <title>Text Compare</title> </head> <body> <table class="fc" cellspacing="0" cellpadding="0"> <tr class="SectionMiddle"> <td class="TextItemSame"> Serial.print(" END ");</td> <td class="AlignCenter"> </td> <td class="TextItemSame"> Serial.print(" END ");</td> </tr> <tr class="SectionMiddle"> <td class="TextItemSame"> Serial.print(last_part);</td> <td class="AlignCenter"> </td> <td class="TextItemSame"> Serial.print(last_part);</td> </tr> <tr class="SectionMiddle"> <td class="TextItemSame"> Serial.println(" bytes of Final-Block transfered.............. ");</td> <td class="AlignCenter"> </td> <td class="TextItemSame"> Serial.println(" bytes of Final-Block transfered.............. ");</td> </tr> <tr class="SectionMiddle"> <td class="TextItemSame"> Serial.println("");</td> <td class="AlignCenter"> </td> <td class="TextItemSame"> Serial.println("");</td> </tr> <tr class="SectionMiddle"> <td class="TextItemSame"> </td> <td class="AlignCenter"> </td> <td class="TextItemSame"> </td> </tr> <tr class="SectionEnd"> <td class="TextItemSame"> digitalWrite(PN_1, LOW);</td> <td class="AlignCenter"> </td> <td class="TextItemSame"> digitalWrite(PN_1, LOW);</td> </tr> <tr class="SectionBegin"> <td class="TextItemSame"> </td> <td class="AlignCenter"><></td> <td class="TextItemSigMod"><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">#if</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">0</span></td> </tr> <tr class="SectionEnd"> <td class="TextItemInsigMod"><span class="TextSegInsigDiff"> </span>EEPROM.write(BOOTLOADING, 0);</td> <td class="AlignCenter"> </td> <td class="TextItemInsigMod"><span class="TextSegInsigDiff"> </span>EEPROM.write(BOOTLOADING, 0);</td> </tr> <tr class="SectionBegin"> <td class="TextItemSame"> delay(500);</td> <td class="AlignCenter">=</td> <td class="TextItemSame"> delay(500);</td> </tr> <tr class="SectionMiddle"> <td class="TextItemSame"> Serial.println(">>>>>>>>>>>>> IoT module will now REBOOT in main_application in 6 seconds <<<<<<<<<<<<<");</td> <td class="AlignCenter"> </td> <td class="TextItemSame"> Serial.println(">>>>>>>>>>>>> IoT module will now REBOOT in main_application in 6 seconds <<<<<<<<<<<<<");</td> </tr> <tr class="SectionMiddle"> <td class="TextItemSame"> while (1) /// Watchdog0 will issue a rebboot in 6 seconds</td> <td class="AlignCenter"> </td> <td class="TextItemSame"> while (1) /// Watchdog0 will issue a rebboot in 6 seconds</td> </tr> <tr class="SectionMiddle"> <td class="TextItemSame"> {</td> <td class="AlignCenter"> </td> <td class="TextItemSame"> {</td> </tr> <tr class="SectionMiddle"> <td class="TextItemSame"> </td> <td class="AlignCenter"> </td> <td class="TextItemSame"> </td> </tr> <tr class="SectionEnd"> <td class="TextItemSame"> }</td> <td class="AlignCenter"> </td> <td class="TextItemSame"> }</td> </tr> <tr class="SectionBegin"> <td class="TextItemSame"> </td> <td class="AlignCenter">-+</td> <td class="TextItemSigMod"><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">#endif</span></td> </tr> <tr class="SectionMiddle"> <td class="TextItemSame"> </td> <td class="AlignCenter"> </td> <td class="TextItemInsigMod"><span class="TextSegInsigDiff"> </span></td> </tr> <tr class="SectionMiddle"> <td class="TextItemSame"> </td> <td class="AlignCenter"> </td> <td class="TextItemSigMod"><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">#if</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">1</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">//Simone:</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">go</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">to</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">main</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">app</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">after</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">FLASH</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">update</span></td> </tr> <tr class="SectionMiddle"> <td class="TextItemSame"> </td> <td class="AlignCenter"> </td> <td class="TextItemSigMod"><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">system_watchdog_feed();</span></td> </tr> <tr class="SectionMiddle"> <td class="TextItemSame"> </td> <td class="AlignCenter"> </td> <td class="TextItemSigMod"><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">HWREG(0xE000E000</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">+</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">(0xD08))</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">=</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">(0x10000</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">&</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">0xFFFFF);</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">//</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">Update</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">vector</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">table</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">offset</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">register</span></td> </tr> <tr class="SectionMiddle"> <td class="TextItemSame"> </td> <td class="AlignCenter"> </td> <td class="TextItemSigMod"><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">asm("</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">MOVW</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">r0,</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">#0x0000");</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">//</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">Load</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">r0-Low</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">with</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">low-part</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">of</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">the</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">address,</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">2-bytes</span></td> </tr> <tr class="SectionMiddle"> <td class="TextItemSame"> </td> <td class="AlignCenter"> </td> <td class="TextItemSigMod"><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">asm("</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">MOVT</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">r0,</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">#0x0001");</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">//</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">Load</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">r0-High</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">with</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">high-part</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">of</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">the</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">address,</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">2-bytes</span></td> </tr> <tr class="SectionMiddle"> <td class="TextItemSame"> </td> <td class="AlignCenter"> </td> <td class="TextItemSigMod"><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">asm("</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">ldr</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">sp,</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">[r0]");</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">//</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">Load</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">app</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">vector</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">address</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">into</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">SP</span></td> </tr> <tr class="SectionMiddle"> <td class="TextItemSame"> </td> <td class="AlignCenter"> </td> <td class="TextItemSigMod"><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">asm("</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">ldr</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">r0,</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">[r0,</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">#4]");</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">//</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">Prepare</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">jump</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">to</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">starting</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">address</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">+</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">4</span></td> </tr> <tr class="SectionMiddle"> <td class="TextItemSame"> </td> <td class="AlignCenter"> </td> <td class="TextItemSigMod"><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">asm("</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">bx</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">r0");</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">//</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">Make</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">the</span><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">jump</span></td> </tr> <tr class="SectionMiddle"> <td class="TextItemSame"> </td> <td class="AlignCenter"> </td> <td class="TextItemSigMod"><span class="TextSegInsigDiff"> </span><span class="TextSegSigDiff">#endif</span></td> </tr> <tr class="SectionEnd"> <td class="TextItemSame"> </td> <td class="AlignCenter"> </td> <td class="TextItemInsigMod"><span class="TextSegInsigDiff"> </span></td> </tr> <tr class="SectionBegin"> <td class="TextItemSame">}</td> <td class="AlignCenter">=</td> <td class="TextItemSame">}</td> </tr> <tr class="SectionMiddle"> <td class="TextItemSame"> </td> <td class="AlignCenter"> </td> <td class="TextItemSame"> </td> </tr> </table> <br/> </body> </html>