QortalOS Brooklyn for Raspberry Pi 4
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

239 lines
5.7 KiB

Consideration about SYS and the first pages of flash ROM
========================================================
Now, I'm developing something like SYS for Kinetis L MCU, so, I write
this document.
* Compatibility
SYS 1.0: The first verson
SYS 2.0: Added clock_init, gpio_init
SYS 2.1: Added sys_board_id, sys_board_name
SYS 3.0: Don't setup NVIC priority by usb_lld_sys_init
* Macro definition by DEFS in Makefile
- USE_SYS_CLOCK_GPIO_SETTING
Define this macro to ask chopstx/entry.c (the runtime code before
MAIN function) to use function entries in SYS for clock_init and
gpio_init.
If not defined, entry.c includes the code for clock_init and
gpio_init which might be different to a board, and use them (entries
in SYS will not be used). This works well with the ROM of SYS
1.0.
Note that SYS entries of clock_init and gpio_init were introduced
in SYS 2.0. So, enable this macro only if the ROM is SYS 2.0 or
later.
- USE_SYS_BOARD_ID
Define this macro in a driver to get "sys_board_id" in SYS, so
that the driver can support various boards at runtime by changing
the settings according to the board.
A simple driver could only support a single board, by the compile
time (BOARD_ID in board-*.h) choice of of a settings.
Note that SYS entries of sys_board_id and sys_board_name were
introduced in SYS 2.1. So, enable this macro only if the ROM is
SYS 2.1 or later.
- USE_SYS3
By defining this, it will have same effect of defining both of
USE_SYS_CLOCK_GPIO_SETTING and USE_SYS_BOARD_ID internally.
About SYS on STM32F103
======================
In the development of Gnuk, we developed:
SYS: The system predefined routines for STM32F103
It is now maintained as example-cdc/sys.c.
There is another version in example-led/sys.c, which also supports
STM32F030, as well as STM32F103. But, it wouldn't be useful for
STM32F030. In fact, the file example-fsm-55/sys.c has name sys.c
but it doesn't include any system routines.
The original issue was:
(1) When it's protected, STM32F103 can't change the first 4KiB of
flash ROM at run time.
(2) We want to support firmware upgrade through its USB.
Later on, we add another point.
(3) It is good if the executable of Gnuk could be shared among
different boards.
For (1) and (2), we decided put some useful routines and data which are
not need to be changed.
Now, the first 4KiB of flash ROM consists of:
1KiB: SYS
3KiB: 3/4 of AES forward tables
SYS consists of:
Internal: reset entry, address of the end of RAM
Data: board identification
Routines: board specific
board independent
and here is the list of all.
* Internal routines
reset entry
address of the end of RAM
* Board identification
sys_version
sys_board_id
sys_board_name
* Board specific routines
* led
set_led
* mcu/board lower level
clock_init
gpio_init
* usb
usb_lld_sys_init
usb_lld_sys_shutdown
* Board independent routines
* flash ROM access routines
unlock
write halfword
erase page
brank check
write page
protect
erase_all & exec to ram
* system reset routine
nvic_system_reset
The routines of clock_init and gpio_init are here because of some
historical reasons. (We could design a system with no such exported
routines: by defining: those things done internally after reset and
before calling the application.)
Those are exported as entries of SYS, and it is the responsibility of
the application which do initialize clock and GPIO, calling those
routines.
USB routines are needed because of hardware practice of STM32F103.
With STM32F103, each board has different way for handling the pull up
of USB D+ and how the device asks re-enumeration to host PC. In my
opinion, if it's defined as full speed device and it's OK for us not
to use high impedance (but asserting to LOW, instead) of D+ to ask
re-enumeration, we can just pull up D+ always. And we wouldn't need
such routines in SYS.
About SYS on Kinetis L
======================
For Kinetis L, because it's ROM has the original firmware upgrade
support by the vendor (though USB HID), all that we needed for
firmware upgrade would be just erasing to factory settings.
And it has no limitation like STM32F103's first 4KiB flash ROM.
All pages can be updated at run time.
Nevertheless, the first two pages (2KiB) of KL27Z is still difficult
to use.
So, I decide to introduce something like SYS for Kinetis L.
* Layout
Three pages (3KiB) usage:
------------ The first page
End of RAM <-- not used but hardware defines this
Address of reset entry
sys_version
sys_board_info (id, name)
sys_vector
other SYS routines and data...
------------ The second page
FLASH CONFIG: 16-byte
Reset entry function
flash routines
CRC-32 routines
CRC-32 table (768-byte of CRC-32 table)
------------ The third page
MAGIC 256-byte (256-byte of the last part of CRC-32 table)
...
vectors (initial MSP, reset, ...)
...
* data: Board identification
sys_version
sys_board_id
sys_board_name ; null terminated
* Board specific routines
* mcu/board lower level
clock_init
gpio_init
* led
set_led
* data: Board independent routines
* flash ROM access code to be loaded on to RAM
* system reset routine???
nvic_system_reset
* data: vectors for routines and data
sys_version
sys_board_id
address of sys_board_name
address of set_led
address of clock_init
address of gpio_init
address of ...
An Example of No-use of SYS
===========================
See example-fsm-55 for an example of no use of SYS.
While chopstx/entry.c defines vectors in ROM and RAM, those are simply
discarded by example-fsm-55/hacker-emblem.ld.
--