uTasker Bootloader Porting Guide

Document created by Shubham Paul on Nov 16, 2015Last modified by Shubham Paul on Nov 30, 2015
Version 2Show Document
  • View in full screen mode

INTRODUCTION

 

Hi everyone,

Making/Developing/Porting a Bootloader is a tedious task for newbies (even for professionals) and inexperienced hobbyists who wish to use them on their custom hardware for rapid prototyping.

 

After searching a lot on different forums I came to a conclusion that I cant develop a bootloader just like that so my next option was porting ,that too wasnt easy if you are going with old bootloaders with limited support.

 

I then found a very easy and efficient way of rapid software development platform that can be used on almost any IDE (Keil,Codewarrior,KDS,etc.) and can be used to develop softwares like USB MSD Bootloaders,Serial Bootloaders and other applications for almost all Freedom Development Boards ,Freescale Kinetis MCUs (on a Custom Development Board ) with minimal ARM Programming Knowledge, which is perfect for newbies like me who are just starting with ARM Development using freescale or other boards.See Welcome to the homepage of the µTasker operating system with integrated TCP/IP stack, USB and target device simulator

 

Now my project was to make custom board using MK22DX256VLF5 (48 LQFP) MCU ,my board is a rather a simple one using basic filtering circuits for powering the MCU and almost all the pinouts given as hardware pins on the dev board.Somehow I was able to flash my first blink code using Keil IDE using the OpenSDA circuitry of FRDM-KL25Z (J-11 trace cut ) with CMSIS-DAP firmware (OpenSDA app ) loaded on to it using SWD Programming.

 

With the steps mentioned below I'll show you how to port a Mass Storage Device (MSD) Bootloader using uTasker project from scratch.

 

REQUIREMENTS

 

  • Programmer(Hardware) or Emulated Programmer(OpenSDA apps): Segger Jlink, P&E Multilink ,OpenSDA Emulators (Jlink-SDA, CMSIS-DAP,USBDM )

  • IDE :Keil,Codewarrior, Kinetis Design Studio etc. (I prefer CW 10.6 )
  • Target MCU: Choose any MCU between Kinetis,Coldfire V2,STM32  (I am using Freescale Kinetis MK22DX256VLF5 ,48 LQFP ) refer - http://www.utasker.com/

 

PROCEDURE

 

1. Lets start by downloading the uTasker project/framwork (for Kinetis ) from µTasker Kinetis Developer's Page . Then extract and copy the folder to your CW workspace ,import the project to CodeWarrior IDE, It should look like this. (I am using version 14-9-2015)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.Next Select "uTaskerSerialLoader_Flash" from the Five build configurations (refer http://www.utasker.com/docs/uTasker/uTaskerSerialLoader.PDF  ).uTaskerBM_Loader is described in http://www.utasker.com/docs/uTasker/uTasker_BM_Loader.pdf This is a very small loader alternative that works together with an initial application. uTaskerV1.4_BM_FLASH is the application to build so that it can be loaded to a loader (including the USB-MSD one). uTaskerV1.4 is a 'stand-alone' version of the application that doesn't work together with a loader (and doesn't need a loader).If you want to build application to load using the USB-MSD loader you need to use uTaskerV1.4_BM_FLASH.

 

after that find the files config.h and ap_hw_kinetis.h.These files define the type of MCU you use.

 

3.In config.h Select your board or MCU type or the closest MCU resembling the architecture of your own MCU. My MCU  MK22DX256VLF5 was not there so with a little help from Mark Butcher  I chose TWR_K21D50M Board settings as TWR-K21D50M module is a development board for the Freescale Kinetis K11, K12, K21 and K22 MCUs. (Note : Be sure to remove or comment any other defined boards )

 

After Selecting the Board/MCU scroll down to find USB_INTERFACE and USB_MSD_LOADER and make sure that these two are defined (not commented ).This is necessary to enable USB enumeration as Mass storage device.

 

Also comment the following if already defined :

HID_LOADER

KBOOT_HID_LOADER

USB_MSD_HOST

This is necessary as we are using our Bootloader in MSD Device Mode not in MSD Host Mode. Also we arent using HID_LOADER and KBOOT.

 

Now open  ap_hw_kinetis.h and Find your selected MCU (in my case its TWR_K21D50M ) So, Find the String "TWR_K21D50M" (or whatever your MCU is ) and see if the follwing lines are defined.

 

#define OSC_LOW_GAIN_MODE

#define CRYSTAL_FREQUENCY    8000000 

#define _EXTERNAL_CLOCK      CRYSTAL_FREQUENCY

#define CLOCK_DIV            4

 

                                     or

   #if(..........)

        #define CLOCK_MUL        48                                   

        #define SYSTEM_CLOCK_DIVIDE 2                                 

    #else

        #define CLOCK_MUL        24

#endif

    #define USB_CLOCK_GENERATED_INTERNALLY

 

 

Here comes an integral part of USB MSD Bootloading/Programming.You must be wondering about CRYSTAL_FREQUENCY  8000000 and  CLOCK_DIV   4  .This is the frequency of an external crystal oscillator  (8mhz) connected between EXTAL0 and XTAL0 pins of the Target MCU.If your MCU has an internal oscillator then check whether the latter is defined.

 

refer- https://cache.freescale.com/files/microcontrollers/doc/app_note/AN4905.pdf

 

         http://www.utasker.com/kinetis/MCG.html

 

There are two ways to be able to use USB:

1. Use a crystal between EXTAL0 and XTAL0 - usually 8MHz is used. (with or without load capacitor -both worked for me )

2. Use a 48MHz oscillator on the USB-CLKIN pin.

 

First one is easier and it worked for me.Since my MCU doesnt have an internal oscillator I have used and External 8Mhz crystal. If you want to use a 16Mhz crystal then just make the following changes :

 

#define CRYSTAL_FREQUENCY    8000000

#define _EXTERNAL_CLOCK      CRYSTAL_FREQUENCY

#define CLOCK_DIV            4

 

                                TO

 

#define CRYSTAL_FREQUENCY    16000000

#define _EXTERNAL_CLOCK      CRYSTAL_FREQUENCY

#define CLOCK_DIV            8

 

Note: The CLOCK_DIV should be such that it prescales the crystal frequency to range of 2-4MHz.

 

Here is the clocking diagram of My MCU.The next diagram shows an oscillator crystal connected externally to my dev board.

 

 

Next search for "PIN_COUNT" under your corresponding MCU/Board (mine is TWR_K21D50M).My MCU is 48 LQFP with 256kb flash and 32kb SRAM (you have to change them according to your MCU ).So I have changed the following lines

 

                             from

  #define PIN_COUNT           PIN_COUNT_121_PIN                      

  #define SIZE_OF_FLASH       (512 * 1024)                       

  #define SIZE_OF_RAM          (64 * 1024)

 

                             to

 

  #define PIN_COUNT           PIN_COUNT_48_PIN                   

  #define SIZE_OF_FLASH       (256 * 1024)                           

  #define SIZE_OF_RAM          (32 * 1024) 

 

Next if you search for your MCU/Board (in this case TWR_K21D50M) ,you will find this line :

 

#define UART2_ON_E

 

This defines the alternative port for UART2,since many boards doesnt have PORTE ,it can be chaned to other ports. [its not important though]

 

Note : When building the serial loader for a device with small RAM size reduce the define #define TX_BUFFER_SIZE (5512) to 512 bytes so the buffer can be allocated (the large size was used only for some debugging output on a larger device) [loader version :14.9.2015]

 

Now search for the String "BLINK_LED" under your corresponding MCU/Board ( mine is TWR_K21D50M ) .The uTasker Bootloader has a special function ,whenever it is in MSD/LOADER mode it blinks a test LED on the board.This is not important but it can be used for debugging purposes.I have a test LED on my board at PORTB16 .You can also specify hardare pins to force bootloader mode and to stop watchdog timer if you pull SWITCH_3 and SWITCH_2 down to ground respectively.I am setting SWITCH_3 and SWITCH_2 as PORTD7 and PORTD6 respectively.

 

Now on the toolbars go to Project > Properties > C/C++ Build > Settings > Tool Settings > Target Processor :Change it to your MCU type (mine is cortex-m4 ) .Next go to Linker >General and change the linker script file to match your MCU's flash,RAM,Type.I have set mine to K_256_32.ld (Kinetis K type processor with 256kb flash and 32 kb RAM)

 

 

Apply your changes.Now you are ready to go.

 

4.  Build your project under SerialLoader_FLASH configuration .If there are no compilation errors then you have done it! (if there are then recheck everything with this guide )

 

Now Click the Flash programmer icon a and Select Flash File to Target. (if your not getting the icon switch to "DEBUG" perspective view )

 

Now you may choose your Programmer (or emulated programmer )[connection tab] ,select the correct Flash configuration file ,then browse for the binary file that has been generated under

 

C:\Users\<computer user>\workspace\Kinetis_14-9-2015\Applications\uTaskerSerialBoot\KinetisCodeWarrior\uTaskerSerialBoot_FLASH\uTaskerSerialBoot.bin

 

and Click on "Erase and Program". You may skip Step 5 and go to Step 6.

 

 

5.I am using the OpenSDA circuitry of my FRDM-KL25Z (J-11 trace cut ) as a programmer using J-link OpenSDA app. Download the app from SEGGER - The Embedded Experts for RTOS and Middleware, Debug Probes and Production Programmers - OpenSDA / OpenSDA V2 depending on your OpenSDA version (FRDM KL25Z has OpenSDAv1).

 

Refer - Using the Freedom Board as SWD Programmer | MCU on Eclipse

 

5.1.First Enter bootloader mode and Flash the Jlink sda app into it.Connect the SWD wires from the board to your  Target MCU/Board ,also connect the target board        to the external oscillator.Also connect the FRDM's OpenSDA through USB. (A drive with the name JLINK Should come )

 

                                        

5.2. Go to Flash File to target and under connections tab click new. give any name and click new under Target Tab.Then select the target type (your target MCU ,mine is                      K22DX256M5).Then check Execute Reset under Initialization Tab. Click finish.

 

 

   Now you'll get the option to select connection type ,then choose J-Link/J-Trace for ARM and change the Debug port interface to SWD .If you get the error :connection name is not        unique then just change the name (I have used jlink1).Click Finish.

 

 

 

  Now I have set up my connections so I can flash the MCU with Jlink app on my OpenSDA circuitry.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6. Now to verify USB Enumeration of your Custom Board ,connect it to PC using USB and you should get a drive with the name UPLOAD_DISK.

1 person found this helpful

Attachments

    Outcomes