... | @@ -30,61 +30,107 @@ For what I see, the vendor's bootloader is most used for this MCU. |
... | @@ -30,61 +30,107 @@ For what I see, the vendor's bootloader is most used for this MCU. |
|
Obviously, we can spend days on other bootloaders without practical
|
|
Obviously, we can spend days on other bootloaders without practical
|
|
worth.
|
|
worth.
|
|
|
|
|
|
## Vendor's Bootloader Modes
|
|
## Bootloader Modes
|
|
|
|
|
|
The bootloader has two main modes: *interactive* and *direct*. In the
|
|
The bootloader has two main modes: *interactive* and *direct*.
|
|
*interactive* mode the user can use the serial interface to perform some
|
|
|
|
simple command (read the application note for the commands description).
|
|
- **interactive** mode the user can use the serial interface to
|
|
In the *direct* mode, the bootloader just look for the application and
|
|
perform some simple command (read the application note for the
|
|
run it immediately.
|
|
commands description).
|
|
|
|
- **direct** mode, the bootloader just look for the application at
|
|
|
|
offset `0x8000` and run it immediately.
|
|
|
|
|
|
### Hardware constraints
|
|
### Hardware constraints
|
|
|
|
|
|
The bootloader use the GPIO E10 (TX) and E11 (RX) for the serial
|
|
The bootloader uses the GPIO E10 (TX) and E11 (RX) for the serial
|
|
communication.
|
|
communication.
|
|
|
|
The bootloader uses the GPIO A0 and GPIO C7 to enter the *interactive*
|
|
|
|
mode.
|
|
|
|
|
|
To enter the interactive mode the `SWDCLK` signal must be pulled high on
|
|
## Bootloader Source Code
|
|
reset. If, on reset, the `SDWCLK` signal is low the bootloader runs in
|
|
|
|
the *direct* mode.
|
|
|
|
On the hardware we should use a special button for this purpose, it
|
|
|
|
could be hidden on the back side and pressed with a clip. Alternatively,
|
|
|
|
a combination of the user buttons (e.g. pressing all buttons for
|
|
|
|
interactive mode).
|
|
|
|
|
|
|
|
\> These are the constraints of the Silicon Labs version. Of course, we
|
|
The freewatch bootloader is a modified version of AN0042. You can find
|
|
can modify these constraints and re-compile our version.
|
|
the source code at `sw/bootloader-an0042`
|
|
|
|
([bootloader-an0042](https://www.ohwr.org/project/freewatch/tree/fede-sw-dev/sw/bootloader-an0042)).
|
|
|
|
In order to have a completely free environment we use Make+GCC
|
|
|
|
|
|
## Bootloader Source Code
|
|
By using Simplicity Studio you can download the Application Notes AN0042
|
|
|
|
with the original source code. Everything is thought to be compiled on a
|
|
|
|
windows system with the IAR workbench; Silicon Labs says that the reason
|
|
|
|
is that IAR compiler guarantees the smallest binary.
|
|
|
|
|
|
|
|
### Main Modifications
|
|
|
|
|
|
|
|
- use GCC to compile (it replaces IAR)
|
|
|
|
- use a dedicated linker script (it replaces IAR)
|
|
|
|
- blink before boot to advise the user to press the buttons if he
|
|
|
|
wants to enter the *interactive* mode
|
|
|
|
- use `GPIO A0` and `GPIO C7` to enter *interactive* mode (it replaces
|
|
|
|
the usage of `SWD_CLK`)
|
|
|
|
- disable destructive upload to avoid mistakes
|
|
|
|
- remove the loader-loader step (useless without destructive mode)
|
|
|
|
- bootloader memory size is `0x8000` (it was `0x4000`)
|
|
|
|
|
|
|
|
### How to Compile
|
|
|
|
|
|
|
|
We support only the compilation through Make+GCC. To compile the
|
|
|
|
bootloader:
|
|
|
|
|
|
|
|
cd sw/bootloader-an0042/make-dir
|
|
|
|
# make LINUXCS=/path/to/cross/compiler/directory
|
|
|
|
make LINUXCS=/opt/gcc-arm-none-eabi-4_8-2014q1
|
|
|
|
|
|
|
|
Of course, is not mandatory to specify `LINUXCS` if you placed the
|
|
|
|
toolchain at `/opt/gcc-arm-none-eabi-4_8-2014q1`. But, it is necessary
|
|
|
|
if you placed the toolchain elsewhere.
|
|
|
|
|
|
|
|
The final bootloader binary will be in the
|
|
|
|
`exe/usb_uart_bootloader-rom.bin`.
|
|
|
|
|
|
By using Simplicity Studio you can download the Application Notes AN0003
|
|
### How to Flash
|
|
and AN0042 with the source code. Everything is thought to be compiled on
|
|
|
|
a windows system with the IAR workbench; Silicon Labs says that the
|
|
|
|
reason is that IAR compiler guarantees the smallest binary. Fortunately,
|
|
|
|
someone wrote a Makefile for the AN0042 by copying and adjusting the
|
|
|
|
Silicon Labs examples' Makefiles. You can find all the necessary files
|
|
|
|
on the repository.
|
|
|
|
|
|
|
|
\> NOTE I also copied the liker scripts but maybe they are not necessary
|
|
In the bootloader's `Makefile` there is a dedicated rule to flash the
|
|
|
|
binary bootloader using [OpenOCD](http://openocd.sourceforge.net/)
|
|
|
|
|
|
|
|
cd sw/bootloader-an0042/make-dir
|
|
|
|
# make LINUXCS=/path/to/cross/compiler/directory
|
|
|
|
make LINUXCS=/opt/gcc-arm-none-eabi-4_8-2014q1 flashmain
|
|
|
|
|
|
|
|
Here the [OpenOCD](http://openocd.sourceforge.net/) command line
|
|
|
|
|
|
|
|
cd sw/bootloader-an0042/make-dir
|
|
|
|
openocd -s ../../openocd -f interface/stlink-v2-1.cfg -f init.cfg -c "program exe/usb_uart_bootloader-rom.bin 0 verify reset"
|
|
|
|
|
|
## How to compile an Application to Use with the Bootloader
|
|
## How to compile an Application to Use with the Bootloader
|
|
|
|
|
|
For applications to work with the bootloader they must be created with a
|
|
For applications to work with the bootloader they must be created with a
|
|
starting address of **0x4000**.
|
|
starting address of **0x8000**. To modify the starting address of your
|
|
|
|
application you must change the linker script. For this purpose we
|
|
|
|
provide a linker script at
|
|
|
|
`sw/common/Device/EnergyMicro/EFM32GG/Source/GCC/efm32gg_bootld.ld`
|
|
|
|
([efm32gg\_bootld.ld](https://www.ohwr.org/project/freewatch/tree/fede-sw-dev/)).
|
|
|
|
If you are going to change the bootloader size you have also to update
|
|
|
|
this (or your equivalent) linker script in order to place you
|
|
|
|
application *after* the bootloader in the FLASH. The position in RAM
|
|
|
|
doesn't need to be changed because it's fine that after boot the
|
|
|
|
application overwrite the bootloader in RAM. Remember also that the size
|
|
|
|
of your application cannot exceed the FLASH size (MAX\_APP\_SIZE =
|
|
|
|
MAX\_FLASH\_SIZE - START\_POSITION , e.g. 0xF8000 = 0x100000 - 0x8000).
|
|
|
|
|
|
## How to Upload an Application Using the Bootloader
|
|
## How to Upload an Application Using the Bootloader
|
|
|
|
|
|
To upload your application to the EFM32 you have to:
|
|
To upload your application to the EFM32 you have to:
|
|
|
|
|
|
- connect the serial interface (USB) to the board
|
|
- connect the serial interface (USB) to the board
|
|
- enter interactive mode by pulling DBG\_SWCLK high
|
|
|
|
- reset the MCU
|
|
- reset the MCU
|
|
- send command to enter application upload mode
|
|
- enter interactive mode by pushing Top Buttons (both left and right)
|
|
|
|
- send command '`u`' to enter application upload mode
|
|
- transfer your application with XMODEM-CRC protocol
|
|
- transfer your application with XMODEM-CRC protocol
|
|
- remove the pull up on DBG\_SWCLK
|
|
- send command '`b`'to boot the application, or reset the
|
|
- reset the MCU
|
|
MCU
|
|
|
|
|
|
You can use the `sx` command to upload you application. Configure the
|
|
### Using `stty` and `sx`
|
|
serial port to be used:
|
|
You can use the `sx` command to upload you application. Configure the serial port to be used:
|
|
|
|
|
|
stty -F /dev/ttyUSB0
|
|
stty -F /dev/ttyUSB0
|
|
|
|
|
... | @@ -93,10 +139,11 @@ and transfer your file: |
... | @@ -93,10 +139,11 @@ and transfer your file: |
|
sx -vv application.bin
|
|
sx -vv application.bin
|
|
|
|
|
|
\> NOTE: The `sx` method has not been tested and might not work as a
|
|
\> NOTE: The `sx` method has not been tested and might not work as a
|
|
character has to be sent to put the bootloader in upload mode\!
|
|
character has to be sent to put the bootloader in upload
|
|
|
|
mode\!
|
|
|
|
|
|
Alternatively, you can use the `minicom` interface (which internally use
|
|
### Using `Minicom`
|
|
`sx`):
|
|
Alternatively, you can use the `minicom` interface (which internally use `sx`):
|
|
|
|
|
|
minicom -D /dev/ttyUSB0
|
|
minicom -D /dev/ttyUSB0
|
|
[on minicom] u
|
|
[on minicom] u
|
... | @@ -104,27 +151,6 @@ Alternatively, you can use the `minicom` interface (which internally use |
... | @@ -104,27 +151,6 @@ Alternatively, you can use the `minicom` interface (which internally use |
|
[on minicom] select xmodem
|
|
[on minicom] select xmodem
|
|
[on minicom] choose your file
|
|
[on minicom] choose your file
|
|
|
|
|
|
## How to Compile the Bootloader
|
|
|
|
|
|
|
|
This code *does not* compile with all toolchain versions. For example,
|
|
|
|
it doesn't compile with *gcc-arm-none-eabi-4\_8-2014q1* and
|
|
|
|
*gcc-arm-none-eabi-4\_7-2012q4*.But, it compiles with the *Mentor
|
|
|
|
Graphics* toolchain *arm-2012-09*.
|
|
|
|
|
|
|
|
\> NOTE: at the moment it also require `wine` to complete the build
|
|
|
|
process because of the Windows program `bin2h.exe`. It will be replaced
|
|
|
|
with something that runs on Linux as soon as possible, I found some
|
|
|
|
alternatives but I was looking for the source code of the same program
|
|
|
|
but it is pretty old.
|
|
|
|
|
|
|
|
To compile the bootloader follow these steps:
|
|
|
|
|
|
|
|
cd freewatch/sw/bootloader-an0042/make-dir
|
|
|
|
make LINUXCS=/path/to/toolchain/root/directory INCLUDEBASE=/path/to/enerymicro/root/directory
|
|
|
|
|
|
|
|
\> NOTE: you can edit the Makefile with the path to your toolchain and
|
|
|
|
energymicro directory
|
|
|
|
|
|
|
|
## What to Do On Operating System Boot
|
|
## What to Do On Operating System Boot
|
|
|
|
|
|
\> TODO (sorry) : I wrote some notes but I have to re-think about them
|
|
\> TODO (sorry) : I wrote some notes but I have to re-think about them
|
... | | ... | |