aboutsummaryrefslogtreecommitdiff
path: root/example-fs-bb48/ABOUT-SYS
blob: d3c79b04ed0f464dc143d782f61622441029a2a4 (plain)
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
Consideration about SYS and the first pages of flash ROM
========================================================

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.

Now, I'm developing something like SYS for Kinetis L MCU, so, I write
this document.


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 word
    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.



--