1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
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.
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 support
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 is
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, end of RAM
Data: board identification
Routines: board specific
board independent
and here is the list of all.
* Internal routines
reset entry
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 ...
--
|