<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Kinetis Microcontrollers中的主题 Re: Bootloader for Kinetis K64 (Cortex M4)</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385668#M20751</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Josh&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I am still not really fully clear about your set up:&lt;/P&gt;&lt;P&gt;- IDE (KDS I believe)&lt;/P&gt;&lt;P&gt;- Debugger ( Multilink I believe)&lt;/P&gt;&lt;P&gt;- Processor (K22 or K64?)&lt;/P&gt;&lt;P&gt;- Board (evaluation board or custom board?)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Is the problem that KDS doesn't support CMSIS-DAP? (Since I don't think that it does) I believe that it only works with P&amp;amp;E OpenOCD mode. I expect that the debugger has different modes (may be needs a different firmware loaded to it?)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have only worked with CMSIS-DAP with Rowely Crossworks. You could get the evaluation version from them to see.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mark&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 03 Dec 2014 21:02:56 GMT</pubDate>
    <dc:creator>mjbcswitzerland</dc:creator>
    <dc:date>2014-12-03T21:02:56Z</dc:date>
    <item>
      <title>Bootloader for Kinetis K64 (Cortex M4)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385648#M20731</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I´m currently working on a bootloader for Kinetis K64. The reason that we don´t use the Kinetis bootloader is beacuse we nedded to have a custom protocol.&lt;/P&gt;&lt;P&gt;I never done this before so i tought i will make the bootloader in the 4 following steps:&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;1) Make a simple Hello-World program resident in memory at adress: 0x00C28CB0&lt;/P&gt;&lt;P&gt;2) Debug and start the Hello-World program to make sure it is located at the correct memory adress&lt;/P&gt;&lt;P&gt;3) Make a simple "Hello-World application", to be able to jump between to the Hello-World program.&lt;/P&gt;&lt;P&gt;4) Get the new application and write it into flash.&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Im stuck at 2) and 3) since the program always starts up at adress 0x0, not where i put my second vector table for the "Hello World program" It also ends up in Reset_Handler at 0x0 when i try to jump between bootloader and application.&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I use different linking files for bootloader and application but the same startup code are used ( See attached files)&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;When i try to jump from the bootloader to the application i use the following code:&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE class="plain" name="code"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Test to go to application &amp;nbsp;&amp;nbsp;&amp;nbsp; static void (*JumpToApp)(void) = 0; &amp;nbsp;&amp;nbsp;&amp;nbsp; JumpToApp = (void (*)(void))APP_ADRESS;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // Set the VTOR to the application vector table address. &amp;nbsp;&amp;nbsp;&amp;nbsp; SCB-&amp;gt;VTOR = (uint32_t)APP_VECTOR_TABLE;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // Set stack pointers to the application stack pointer. &amp;nbsp;&amp;nbsp;&amp;nbsp; __set_MSP(APP_STACK_PTR_DEF); &amp;nbsp;&amp;nbsp;&amp;nbsp; __set_PSP(APP_STACK_PTR_DEF);&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // Jump to the application. &amp;nbsp;&amp;nbsp;&amp;nbsp; JumpToApp();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/PRE&gt;&lt;DIV style="display:none;"&gt; &lt;/DIV&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I use the following defines:&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE class="plain" name="code"&gt;#define&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; APP_ADRESS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x00C28CB0 #define&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; APP_VECTOR_TABLE APP_ADRESS #define&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; APP_STACK_PTR_DEF APP_ADRESS&lt;/PRE&gt;&lt;DIV style="display:none;"&gt; &lt;/DIV&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Im grateful for help,&lt;/P&gt;&lt;P style="min-height: 8pt; padding: 0px;"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/ Anders&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Original Attachment has been moved to: &lt;A _jive_internal="true" href="https://community.nxp.com/docs/DOC-337697" rel="nofollow noopener noreferrer" target="_blank"&gt;K64FN1Mxxx12_flash.ld.zip&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Original Attachment has been moved to: &lt;A _jive_internal="true" href="https://community.nxp.com/docs/DOC-337697" rel="nofollow noopener noreferrer" target="_blank"&gt;K64FN1Mxxx12_flash_bootloader.ld.zip&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Original Attachment has been moved to: &lt;A _jive_internal="true" href="https://community.nxp.com/docs/DOC-337697" rel="nofollow noopener noreferrer" target="_blank"&gt;startup_MK64F12.S.txt.zip&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 02 Dec 2014 08:41:20 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385648#M20731</guid>
      <dc:creator>andersbergström</dc:creator>
      <dc:date>2014-12-02T08:41:20Z</dc:date>
    </item>
    <item>
      <title>Re: Bootloader for Kinetis K64 (Cortex M4)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385649#M20732</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I'm having similar problems.&amp;nbsp; The multilink debugger always erases entire flash even when you uncheck the erase flash checkbox so you cannot load two programs that take up different memory areas.&amp;nbsp; Maybe your application jump code is working but you cannot load both programs at the same time.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Seems like a lot of non-default options are still broken in kds.&amp;nbsp; -fPIC broken.&amp;nbsp; Firmware image binary broken (it generates a 536mb file for a 512kb device) so that will have to be fixed before I can generate the binary that will be written to flash by the bootloader.&amp;nbsp; Interrupt vectors in ram option is broken, anything with this option enabled will not run at all.&amp;nbsp; I've written bootloaders before without half as many problems, its starting to get comical!&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 02 Dec 2014 13:44:03 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385649#M20732</guid>
      <dc:creator>robotjosh</dc:creator>
      <dc:date>2014-12-02T13:44:03Z</dc:date>
    </item>
    <item>
      <title>Re: Bootloader for Kinetis K64 (Cortex M4)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385650#M20733</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Josh&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If the the tools restrict loading two images seperately you can combine them into one and load that. This can be done with various tools or manually by adding two SREC files together.&lt;/P&gt;&lt;P&gt;The uTasker project contains&lt;SPAN style="text-decoration: underline;"&gt; boot loader utilities&lt;/SPAN&gt; which has such a tool (&lt;SPAN class="bbc_u"&gt;&lt;STRONG&gt;uTaskerCombine&lt;/STRONG&gt;&lt;/SPAN&gt;) - it can be downloaded at &lt;A href="http://www.utasker.com/forum/index.php?topic=1445.0" title="http://www.utasker.com/forum/index.php?topic=1445.0"&gt;uTasker Utilities&lt;/A&gt; and allows combining binaries specifically for such purposes.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mark&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 02 Dec 2014 14:23:51 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385650#M20733</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2014-12-02T14:23:51Z</dc:date>
    </item>
    <item>
      <title>Re: Bootloader for Kinetis K64 (Cortex M4)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385651#M20734</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Anders&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The uTasker serial loader project provides a complete boot loader framework (for the K64) which can be simply adapted to any futher protocol that needs to be developed. In case of further complications this would allow you to immediately concentrate on your loader protocol rather than first have to develop such an infrastructure.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Note that you can't start an initial program from any other address than the reset vector so you need to first have a boot loader installed (booting from the reset vector) and then test an offset application which is jumped to by that boot loader. The following code can, for example, be used for the jump on a K64:&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_text_macro jive_macro_code _jivemacro_uid_14175306421791934" jivemacro_uid="_14175306421791934"&gt;
&lt;P&gt;// Allow the jump to a foreign application as if it were a reset (load SP and PC)&lt;/P&gt;
&lt;P&gt;//&lt;/P&gt;
&lt;P&gt;extern void start_application(unsigned long app_link_location)&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; asm(" ldr sp, [r0,#0]"); // load the stack pointer value from the program's reset vector&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; asm(" ldr pc, [r0,#4]"); // load the program counter value from the program's reset vector to cause operation to continue from there&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This allows any application to be jumped to (knowing its offset link address). In your case you would jump using&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;start_application(APP_ADRESS);&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The framework also includes a K64 (real-time) simulator that allows boot loaders to be tested and debugged with VisualStudio (free Express edition adequate), execising peripherals and interrupts and emulating the flash operation. There is a video showing boot loader debugging at &lt;A href="https://www.youtube.com/watch?v=e7JvWodljlc" rel="nofollow noopener noreferrer" title="https://www.youtube.com/watch?v=e7JvWodljlc" target="_blank"&gt;AVR32_boot.wmv - YouTube&lt;/A&gt; (not on the Kinetis but equivalent and using a more complicated encrypted boot loader technology requiring such debugging capabilities more that the standard cases).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mark&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A href="http://www.utasker.com/kinetis.html" rel="nofollow noopener noreferrer" title="http://www.utasker.com/kinetis.html" target="_blank"&gt;µTasker Kinetis support&lt;/A&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 02 Dec 2014 14:42:24 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385651#M20734</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2014-12-02T14:42:24Z</dc:date>
    </item>
    <item>
      <title>Re: Bootloader for Kinetis K64 (Cortex M4)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385652#M20735</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Might have to use __asm for gcc.&amp;nbsp; I tried this and verified that app_link_location value is put into r0 in gcc.&amp;nbsp; It works except that loading the bootloader wipes out the main application and it jumps to a series of 0xffffffff.&amp;nbsp; That AVR32 looks pretty sweet!&amp;nbsp; I'll give utasker a look but am determined to make this bootloader happen in kds/gcc/pex.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 02 Dec 2014 15:51:39 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385652#M20735</guid>
      <dc:creator>robotjosh</dc:creator>
      <dc:date>2014-12-02T15:51:39Z</dc:date>
    </item>
    <item>
      <title>Re: Bootloader for Kinetis K64 (Cortex M4)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385653#M20736</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Did you modify the linker descriptor file to have your application and its vector table start at the new address? The boot loader and Applications linker descriptor files must specify different code addresses from each other. &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;You also need to make sure you are jumping to an odd address when you jump from the boot loader to the application. It should be APP_START+1. The Arm core Uses the Even Vs Odd address to decide which instruction set to run when it gets to the new address. All instructions are on even addresses. A jump to an odd address keeps the MCU in THUMB instruction mode, Jumping to an even address causes a hard fault on the Kinetis since it only supports the Thumb instruction set.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 02 Dec 2014 17:26:50 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385653#M20736</guid>
      <dc:creator>ndavies</dc:creator>
      <dc:date>2014-12-02T17:26:50Z</dc:date>
    </item>
    <item>
      <title>Re: Bootloader for Kinetis K64 (Cortex M4)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385654#M20737</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Josh&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Yes, for GCC there is the define&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;#define asm(x) __asm__(x)&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;asm()&lt;/STRONG&gt; is used directly by some compilers (like IAR) and older GGC versions need&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;#define asm(x) _asm_(x)&lt;/STRONG&gt; (with only one underline for some reason).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;To my defence, I used the AVR32 &lt;SPAN style="text-decoration: underline;"&gt;before&lt;/SPAN&gt; the Kinetis were available. All AVR32 uTasker projects can also run on Kinetis parts (due to its HAL layer) so AVR32 users who preferred to move to Kinetis had almost zero porting work to do.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mark&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 02 Dec 2014 20:45:57 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385654#M20737</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2014-12-02T20:45:57Z</dc:date>
    </item>
    <item>
      <title>Re: Bootloader for Kinetis K64 (Cortex M4)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385655#M20738</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Norm&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;It depends on how the jump is performed. If it is performed using the code that I posted above&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;start_application(APP_ADRESS);&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;is correct where APP_ADRESS is the address where the application is physically linked to.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here is an example of a typical application linked to either 0x00000000 (when workling without a boot loader) or another other address: the first two values at 0x00000000 (or any other address APP_ADRESS) are&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;0x2002fffc 0x00016e55&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;when viewed as long words.&lt;/P&gt;&lt;P&gt;0x2002fffc is the initial stack pointer value (often the top of SRAM)&lt;/P&gt;&lt;P&gt;0x00016e55 is the start address of the application (could be anywhere depending on where the linker puts the startup code - entry point) but it is indeed an odd address.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The code loads the first long word to the SP (exacly as a HW reset does) and sets the second to the PC (exactly as a HW reset does). Where the entry point is (and that it is odd for the Cortex M4) has nothing to do with the linking address and is managed by the compiler/linker.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mark&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 02 Dec 2014 20:54:27 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385655#M20738</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2014-12-02T20:54:27Z</dc:date>
    </item>
    <item>
      <title>Re: Bootloader for Kinetis K64 (Cortex M4)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385656#M20739</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Mark, I was just looking at Anders original code that started this thread. I wasn't sure the jump sequence he used would generate the Odd address function call since he hard coded the jump address. He also stated he was getting a reset when he tried to jump to the application. Possibly a symptom of jumping to an even address. The odd addressing thing cost us some time when we were trying to get our boot loader up.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 02 Dec 2014 21:22:13 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385656#M20739</guid>
      <dc:creator>ndavies</dc:creator>
      <dc:date>2014-12-02T21:22:13Z</dc:date>
    </item>
    <item>
      <title>Re: Bootloader for Kinetis K64 (Cortex M4)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385657#M20740</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Norm&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Yes, then it would be necessary to use the odd address. I don't expect that 0x00C28CB0 was more than a first quick attempts sicne it would need to be the entry point (possibly looked up in the map file) and so either move around on each application build or else need to be fixed by pinning its location down with linker configuration and compiler pragmas and such other nasty things (and less portable) things.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mark&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 02 Dec 2014 21:36:48 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385657#M20740</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2014-12-02T21:36:48Z</dc:date>
    </item>
    <item>
      <title>Re: Re: Bootloader for Kinetis K64 (Cortex M4)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385658#M20741</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Norm,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I modified my linker file. Please see the one I attached for the bootloader. (I never written a linker file either, so there might be something missing in it.)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;To merge the two binary files together, i use the following shell script:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="plain" __jive_macro_name="code" class="jive_text_macro jive_macro_code _jivemacro_uid_14176181179569634" jivemacro_uid="_14176181179569634"&gt;
&lt;P&gt;`cat HELLO_WORLD_BL.bin &amp;gt; bootloader.bin`&lt;/P&gt;
&lt;P&gt;`cat bootloader.bin HELLO_WORLD.bin &amp;gt; combined.bin`&lt;/P&gt;
&lt;P&gt;`rm -f tmp.bin bootloader.bin`&lt;/P&gt;
&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I tried both my function, and the&amp;nbsp; one Mark provided to perform the Jump without any luck.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 03 Dec 2014 14:51:52 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385658#M20741</guid>
      <dc:creator>andersbergström</dc:creator>
      <dc:date>2014-12-03T14:51:52Z</dc:date>
    </item>
    <item>
      <title>Re: Re: Bootloader for Kinetis K64 (Cortex M4)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385659#M20742</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Anders&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If you use the jump code that I posted, don't use your entry address (0x00C28CB0) but instead use the address where you linked your application code to (eg. 0x8000 - it will usually be aligned to a 4k boundary).&lt;/P&gt;&lt;P&gt;When you combine your two binaries make sure that you also have the application locate at the address that it is linked to be at. I think that the cat function you use will simply add the two together which is not suitable since the program MUST be at the correct (physical) address otherwise nothing can work.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If the cat utility doesn't prove to be suitable simply use the uTaskerCombine that I linked to. It can be called with&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;uTaskerCombine bootloader.bin&amp;nbsp; HELLOW_WORLD.bin 0x8000 combined.bin&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;where 0x8000 is the (example) address where the second file should be appended to and the gap between if filled with 0xff.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Another potential problem with combining binaries (if output from CW using metroworks compiler) is that they are sometimes not RAW binary but are in MOTOROLA binary format (that means that they are divided into chunks and each chunk has a small header informing where its address is). Using simple binary tools may result in the output being in a format that can't be loaded using most tools (it will be loaded but the content can't run).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;uTaskerCombine will also recognise MOTOROLA binary format and always generate output file in RAW binary so that it can be loaded to the processor with any tools.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Don't forget that &lt;SPAN style="text-decoration: underline;"&gt;there is already a complete general purpose solution for the K64 in the uTasker serial loader proje&lt;/SPAN&gt;ct &lt;A href="http://www.utasker.com/docs/uTasker/uTaskerSerialLoader.PDF" title="http://www.utasker.com/docs/uTasker/uTaskerSerialLoader.PDF"&gt;http://www.utasker.com/docs/uTasker/uTaskerSerialLoader.PDF&lt;/A&gt; so you could simply use that and then get started with the actual customised protocol. It works out-of-the-box for the K64 with CW, KDS, IAR, Keil, Atollic, Rowley Crossworks, CooCox or standalone GCC and the Kinetis can be simulated (in approx. real-time) in VisualStudio so also custom developments parts are must simpler to develop, test and debug.&lt;BR /&gt;There are all tools and configurations needed as well as Flash drivers, peripheral drivers and communication suites (serial, Ethernet, USB) allowing flexible loaders to be configured or constructed with minimum effort/work/investment (the project is optimised for efficiency of resource usage and so a web server based boot loader, for example, occupies only 18k of Flash).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mark&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 03 Dec 2014 15:26:51 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385659#M20742</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2014-12-03T15:26:51Z</dc:date>
    </item>
    <item>
      <title>Re: Bootloader for Kinetis K64 (Cortex M4)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385660#M20743</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I think you can just cat HELLO_WORLD_BL.bin HELLO_WORLD.bin &amp;gt; combined.bin.&amp;nbsp; If this helps, here are my modifications to the linker scripts in order to be able to cat the two binaries:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;For the main app add to the starting address of each memory location, I added 0x10000 to give the bootloader 64kb of space, and subtract that amount from the section size, and comment out this memory section:&lt;/P&gt;&lt;P&gt;/*&amp;nbsp; m_cfmprotrom&amp;nbsp; (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000010 */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*&lt;/P&gt;&lt;P&gt;&amp;nbsp; .cfmprotect :&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = ALIGN(4);&lt;/P&gt;&lt;P&gt;&amp;nbsp; KEEP(*(.cfmconfig))&lt;/P&gt;&lt;P&gt;&amp;nbsp; . = ALIGN(4);&lt;/P&gt;&lt;P&gt;&amp;nbsp; } &amp;gt; m_cfmprotrom&lt;/P&gt;&lt;P&gt;&amp;nbsp; */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;For the bootloader linker script, it must be changed so that the binary is exactly the size of the bootloader flash space so that the concatenated main app binary starts at the correct address.&amp;nbsp; Change the length of each memory section as if it were a 64kb flash device or however large your bootloader space is. Then add this section so that it generates a binary exactly the right size.&amp;nbsp; .romp is the last section that is added to flash so it is used to calculate the starting address of the fill section.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; .fill LOADADDR(.romp) + SIZEOF(.romp) :&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; FILL(0xAAAAAAAA);&lt;/P&gt;&lt;P&gt;&amp;nbsp; . = ORIGIN(m_text) + LENGTH(m_text) - 1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BYTE(0xAA)&lt;/P&gt;&lt;P&gt;&amp;nbsp; } &amp;gt; m_text&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;You have to turn off linker file generation in processor expert after making these changes.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 03 Dec 2014 15:38:31 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385660#M20743</guid>
      <dc:creator>robotjosh</dc:creator>
      <dc:date>2014-12-03T15:38:31Z</dc:date>
    </item>
    <item>
      <title>Re: Re: Bootloader for Kinetis K64 (Cortex M4)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385661#M20744</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Josh. I will try those modifications tomoroww morning.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Do you have the possibility to attach the modified linker scripts, so I can see them in their whole context? :smileyhappy:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Do i need to set the Entry Point as well in the application linker file? Right now it is set to Reset_Handler.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 03 Dec 2014 15:49:51 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385661#M20744</guid>
      <dc:creator>andersbergström</dc:creator>
      <dc:date>2014-12-03T15:49:51Z</dc:date>
    </item>
    <item>
      <title>Re: Re: Bootloader for Kinetis K64 (Cortex M4)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385662#M20745</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks for the Reply Mark. It works better to merge the files with uTasker Utillities.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I will look into uTasker serial loader, and might use it in the future&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 03 Dec 2014 15:51:10 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385662#M20745</guid>
      <dc:creator>andersbergström</dc:creator>
      <dc:date>2014-12-03T15:51:10Z</dc:date>
    </item>
    <item>
      <title>Re: Re: Bootloader for Kinetis K64 (Cortex M4)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385663#M20746</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;You shouldn't have to change the reset handler, leave defaults in the bootloader.&amp;nbsp; For the main app, those interrupts and reset vector will work the same at location 0x10000 after you set the SCB_VTOR = 0x10000&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;These are default processor expert generated linker scripts with the changes I mentioned.&amp;nbsp; I do not see how to attach the file but I can paste the bootloader linker script. The main app linker script has the simple changes I mentioned.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/* Entry Point */&lt;/P&gt;&lt;P&gt;ENTRY(__thumb_startup)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/* Highest address of the user mode stack */&lt;/P&gt;&lt;P&gt;_estack = 0x20000000;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* end of m_data */&lt;/P&gt;&lt;P&gt;__SP_INIT = _estack;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/* Generate a link error if heap and stack don't fit into RAM */&lt;/P&gt;&lt;P&gt;__heap_size = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* required amount of heap&amp;nbsp; */&lt;/P&gt;&lt;P&gt;__stack_size = 0x0400;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* required amount of stack */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;MEMORY {&lt;/P&gt;&lt;P&gt;&amp;nbsp; m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000198&lt;/P&gt;&lt;P&gt;&amp;nbsp; m_text&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (RX) : ORIGIN = 0x00000410, LENGTH = 0x0000FBF0&lt;/P&gt;&lt;P&gt;&amp;nbsp; m_data&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (RW) : ORIGIN = 0x1FFF0000, LENGTH = 0x00010000&lt;/P&gt;&lt;P&gt;&amp;nbsp; m_data_20000000 (RW) : ORIGIN = 0x20000000, LENGTH = 0x00010000&lt;/P&gt;&lt;P&gt;&amp;nbsp; m_cfmprotrom&amp;nbsp; (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000010&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/* Define output sections */&lt;/P&gt;&lt;P&gt;SECTIONS&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* The startup code goes first into INTERNAL_FLASH */&lt;/P&gt;&lt;P&gt;&amp;nbsp; .interrupts :&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __vector_table = .;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = ALIGN(4);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; KEEP(*(.vectortable)) /* Startup code */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = ALIGN(4);&lt;/P&gt;&lt;P&gt;&amp;nbsp; } &amp;gt; m_interrupts&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; .cfmprotect :&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = ALIGN(4);&lt;/P&gt;&lt;P&gt;&amp;nbsp; KEEP(*(.cfmconfig)) /* Flash Configuration Field (FCF) */&lt;/P&gt;&lt;P&gt;&amp;nbsp; . = ALIGN(4);&lt;/P&gt;&lt;P&gt;&amp;nbsp; } &amp;gt; m_cfmprotrom&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; /* The program code and other data goes into INTERNAL_FLASH */&lt;/P&gt;&lt;P&gt;&amp;nbsp; .text :&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = ALIGN(4);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.text)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* .text sections (code) */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.text*)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* .text* sections (code) */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.rodata)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* .rodata sections (constants, strings, etc.) */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.rodata*)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* .rodata* sections (constants, strings, etc.) */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.glue_7)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* glue arm to thumb code */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.glue_7t)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* glue thumb to arm code */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.eh_frame)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; KEEP (*(.init))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; KEEP (*(.fini))&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = ALIGN(4);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _etext = .;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* define a global symbols at end of code */&lt;/P&gt;&lt;P&gt;&amp;nbsp; } &amp;gt; m_text&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; .ARM.extab&amp;nbsp;&amp;nbsp; : { *(.ARM.extab* .gnu.linkonce.armextab.*) } &amp;gt; m_text&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ARM : {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __exidx_start = .;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.ARM.exidx*)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; __exidx_end = .;&lt;/P&gt;&lt;P&gt;&amp;nbsp; } &amp;gt; m_text&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt; .ctors :&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __CTOR_LIST__ = .;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* gcc uses crtbegin.o to find the start of&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the constructors, so we make sure it is&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; first.&amp;nbsp; Because this is a wildcard, it&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; doesn't matter if the user does not&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; actually link against crtbegin.o; the&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; linker won't look for a file to match a&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wildcard.&amp;nbsp; The wildcard also means that it&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; doesn't matter which directory crtbegin.o&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; is in.&amp;nbsp; */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; KEEP (*crtbegin.o(.ctors))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* We don't want to include the .ctor section from&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from the crtend.o file until after the sorted ctors.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; The .ctor section from the crtend file contains the&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end of ctors marker and it must be last */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; KEEP (*(SORT(.ctors.*)))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; KEEP (*(.ctors))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __CTOR_END__ = .;&lt;/P&gt;&lt;P&gt;&amp;nbsp; } &amp;gt; m_text&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; .dtors :&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __DTOR_LIST__ = .;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; KEEP (*crtbegin.o(.dtors))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; KEEP (*(SORT(.dtors.*)))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; KEEP (*(.dtors))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __DTOR_END__ = .;&lt;/P&gt;&lt;P&gt;&amp;nbsp; } &amp;gt; m_text&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; .preinit_array&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PROVIDE_HIDDEN (__preinit_array_start = .);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; KEEP (*(.preinit_array*))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PROVIDE_HIDDEN (__preinit_array_end = .);&lt;/P&gt;&lt;P&gt;&amp;nbsp; } &amp;gt; m_text&lt;/P&gt;&lt;P&gt;&amp;nbsp; .init_array :&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PROVIDE_HIDDEN (__init_array_start = .);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; KEEP (*(SORT(.init_array.*)))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; KEEP (*(.init_array*))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PROVIDE_HIDDEN (__init_array_end = .);&lt;/P&gt;&lt;P&gt;&amp;nbsp; } &amp;gt; m_text&lt;/P&gt;&lt;P&gt;&amp;nbsp; .fini_array :&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PROVIDE_HIDDEN (__fini_array_start = .);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; KEEP (*(SORT(.fini_array.*)))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; KEEP (*(.fini_array*))&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PROVIDE_HIDDEN (__fini_array_end = .);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; ___ROM_AT = .;&lt;/P&gt;&lt;P&gt;&amp;nbsp; } &amp;gt; m_text&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Initialized data sections goes into RAM, load LMA copy after code */&lt;/P&gt;&lt;P&gt;&amp;nbsp; .data : AT(___ROM_AT)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = ALIGN(4);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _sdata = .;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* create a global symbol at data start */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.data)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* .data sections */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.data*)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* .data* sections */&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = ALIGN(4);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _edata = .;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* define a global symbol at data end */&lt;/P&gt;&lt;P&gt;&amp;nbsp; } &amp;gt; m_data&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; ___data_size = _edata - _sdata;&lt;/P&gt;&lt;P&gt;&amp;nbsp; ___m_data_20000000_ROMStart = ___ROM_AT + SIZEOF(.data);&lt;/P&gt;&lt;P&gt;&amp;nbsp; .m_data_20000000 : AT(___m_data_20000000_ROMStart)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = ALIGN(4);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___m_data_20000000_RAMStart = .;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.m_data_20000000) /* This is an User defined section */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ___m_data_20000000_RAMEnd = .;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = ALIGN(4);&lt;/P&gt;&lt;P&gt;&amp;nbsp; } &amp;gt; m_data_20000000&lt;/P&gt;&lt;P&gt;&amp;nbsp; ___m_data_20000000_ROMSize = ___m_data_20000000_RAMEnd - ___m_data_20000000_RAMStart;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Uninitialized data section */&lt;/P&gt;&lt;P&gt;&amp;nbsp; . = ALIGN(4);&lt;/P&gt;&lt;P&gt;&amp;nbsp; .bss :&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* This is used by the startup in order to initialize the .bss section */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __START_BSS = .;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; PROVIDE ( __bss_start__ = __START_BSS );&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.bss)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(.bss*)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *(COMMON)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = ALIGN(4);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __END_BSS = .;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; PROVIDE ( __bss_end__ = __END_BSS );&lt;/P&gt;&lt;P&gt;&amp;nbsp; } &amp;gt; m_data&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; _romp_at = ___ROM_AT + SIZEOF(.data) +SIZEOF(.m_data_20000000);&lt;/P&gt;&lt;P&gt;&amp;nbsp; .romp : AT(_romp_at)&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __S_romp = _romp_at;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LONG(___ROM_AT);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LONG(_sdata);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LONG(___data_size);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LONG(___m_data_20000000_ROMStart);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LONG(___m_data_20000000_RAMStart);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LONG(___m_data_20000000_ROMSize);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LONG(0);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LONG(0);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LONG(0);&lt;/P&gt;&lt;P&gt;&amp;nbsp; } &amp;gt; m_data&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; /* User_heap_stack section, used to check that there is enough RAM left */&lt;/P&gt;&lt;P&gt;&amp;nbsp; ._user_heap_stack :&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = ALIGN(4);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PROVIDE ( end = . );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PROVIDE ( _end = . );&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __heap_addr = .;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __HeapBase = .;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = . + __heap_size;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __HeapLimit = .;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = . + __stack_size;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; . = ALIGN(4);&lt;/P&gt;&lt;P&gt;&amp;nbsp; } &amp;gt; m_data &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; .ARM.attributes 0 : { *(.ARM.attributes) }&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*&amp;nbsp; .fill 0x2a0c : same as below */&lt;/P&gt;&lt;P&gt;&amp;nbsp; .fill LOADADDR(.romp) + SIZEOF(.romp) :&lt;/P&gt;&lt;P&gt;&amp;nbsp; {&lt;/P&gt;&lt;P&gt;&amp;nbsp; FILL(0xAAAAAAAA);&lt;/P&gt;&lt;P&gt;&amp;nbsp; . = ORIGIN(m_text) + LENGTH(m_text) - 1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BYTE(0xAA)&lt;/P&gt;&lt;P&gt;&amp;nbsp; } &amp;gt; m_text&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 03 Dec 2014 15:57:15 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385663#M20746</guid>
      <dc:creator>robotjosh</dc:creator>
      <dc:date>2014-12-03T15:57:15Z</dc:date>
    </item>
    <item>
      <title>Re: Bootloader for Kinetis K64 (Cortex M4)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385664#M20747</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;But be aware I have not tested my binary yet because I have not found a way to flash a binary using this fancy multilink fx, too fancy to deal with bin files!&amp;nbsp; I'll have to finish the bootloader and test the binary and bootloader at the same time.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 03 Dec 2014 16:00:53 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385664#M20747</guid>
      <dc:creator>robotjosh</dc:creator>
      <dc:date>2014-12-03T16:00:53Z</dc:date>
    </item>
    <item>
      <title>Re: Bootloader for Kinetis K64 (Cortex M4)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385665#M20748</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Josh&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Just drop your binary onto the hard drive that appears when connecting the FRDM-K64F (assuming you are using, it or similar).&lt;/P&gt;&lt;P&gt;You can also convert your binary file into other formats using GCC's objcopy if that makes it easier for the tools.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mark&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 03 Dec 2014 16:14:08 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385665#M20748</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2014-12-03T16:14:08Z</dc:date>
    </item>
    <item>
      <title>Re: Bootloader for Kinetis K64 (Cortex M4)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385666#M20749</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Josh, the Multilink doesn't care what format the executable file is in. It's the Development environment that specifies the file formats. The multilink doesn't know what a file format is. It only accepts the individual commands to physically flash the files onto the target. The development environment accepts various file formats and then converts it into flashing commands for the multilink.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;There is a separate forum for KDS:&lt;/P&gt;&lt;P&gt;&lt;A href="https://community.nxp.com/space/11213"&gt;Kinetis Design Studio&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;And there is a thead on Programming binary files.&lt;/P&gt;&lt;P&gt;&lt;A href="https://community.nxp.com/docs/DOC-100870"&gt;Flash from File: Downloading a file without the sources&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Norm&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 03 Dec 2014 17:47:11 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385666#M20749</guid>
      <dc:creator>ndavies</dc:creator>
      <dc:date>2014-12-03T17:47:11Z</dc:date>
    </item>
    <item>
      <title>Re: Bootloader for Kinetis K64 (Cortex M4)</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385667#M20750</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Yes, I have attempted the procedure outlined in the Flash from File page after adding the kinetis.cfg option mentioned in this page &lt;A href="https://community.nxp.com/docs/DOC-100705"&gt;KDS Debug Configurations (OpenOCD, P&amp;amp;amp;E, Segger)&lt;/A&gt;&lt;/P&gt;&lt;P&gt;I used the elf file since that is in the example and should work.&amp;nbsp; It produces this error:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Open On-Chip Debugger 0.8.0-dev-dirty (2014-08-20-11:07)&lt;/P&gt;&lt;P&gt;Licensed under GNU GPL v2&lt;/P&gt;&lt;P&gt;For bug reports, read&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;&amp;nbsp; &lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="http://openocd.sourceforge.net/doc/doxygen/bugs.html"&gt;http://openocd.sourceforge.net/doc/doxygen/bugs.html&lt;/A&gt;&lt;/P&gt;&lt;P&gt;Info : only one transport option; autoselect 'cmsis-dap'&lt;/P&gt;&lt;P&gt;Error: unable to open CMSIS-DAP device&lt;/P&gt;&lt;P&gt;Error: unable to init CMSIS-DAP driver&lt;/P&gt;&lt;P&gt;Error: Error selecting 'cmsis-dap' as transport&lt;/P&gt;&lt;P&gt;Runtime Error: C:/Freescale/KDS_1.1.1/openocd/bin/..//scripts/kinetis.cfg:3: &lt;/P&gt;&lt;P&gt;in procedure 'script' &lt;/P&gt;&lt;P&gt;at file "embedded:startup.tcl", line 58&lt;/P&gt;&lt;P&gt;in procedure 'interface' called at file "C:/Freescale/KDS_1.1.1/openocd/bin/..//scripts/kinetis.cfg", line 3&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Keep in mind that I want the multilink fx to flash a binary, this procedure appears to require the opensda chip included in the dev kit.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 03 Dec 2014 18:15:01 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Bootloader-for-Kinetis-K64-Cortex-M4/m-p/385667#M20750</guid>
      <dc:creator>robotjosh</dc:creator>
      <dc:date>2014-12-03T18:15:01Z</dc:date>
    </item>
  </channel>
</rss>

