summaryrefslogtreecommitdiff
path: root/firmware/doc/dfu.txt
blob: 78fe5a678650e26080c624e20960753b1294eb53 (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
120
121
122
123
124
125
126
127
128
129
130
131
- data that is needed from both app and dfu mode
- code that is needed from both app and dfu mode
	- function pointers
	- copy code to RAM in case of DFU switch
- data that is only needed in DFU mode
	- can be overwritten in case of reset-to-application
- data that is only needed in app mode
	- can be overwritten with DFU data in case of DFU switch
- code that is only needed in DFU mode
	- has to be copied to ram in case of DFU switch
- code that is only needed in app mode
	- can be read from flash, no action required


=> abandoned that complicated idea.  
now all DFU functions are __ramfunc's and thus always present.


interaction between app and dfu code:

- dfu_switch(void)
- dfu_status (can be put in accessor function, if required)
- dfu_cfg_descriptor
- dfu_dev_descriptor
- dfu_ep0_handler()


order of events at boot;

- start at reset vector in flash
	- AT91F_LowLevelInit()
- setup stack for each mode
- relocate 'data' of bootloader, including ramfunc/vectram
- clear 'bss' of bootloader
- call remap command
	- call usb initialization (irq, clock)
	- if keypress,
		- call dfu_main()
			- wait for ep0 / busreset interrupt
	- else call main()


memory layout:

0: lowlevel startup code
	Cstartup.o	0x00bc
	Cstartup_SAM7.o	0x0100
	dfufunc		0x1dcc
	dfustruct	0x0038

	text		text	0x0070
data		data	0x0000
bss		bss	0x000c

flash 	= text + data  (= 8k)
ram/rel	= data + bss (12 bytes)


If we drop the DFU-can-flash-DFU requirement, we can leave all DFU related code
in flash. no need for  any function to be permanently in RAM.  However, not
preventing this feature in some future version, we shouldn't do that.


Function			DFU	runtime
udp_init			x	x	RAM
udp_ep0_send_data		x	x	RAM
udp_ep0_send_zlp		x	x	RAM
udp_sp0_send_stall		x	x	RAM
handle_dnload			x	-	flash/relocated
handle_upload			x	-	flash/relocated
handle_getstatus		x	-	flash/relocated
handle_getstate			x	-	flash/relocated
dfu_ep0_handler			x	x	RAM

dfu_dev_descriptor		x	-	flash/relocated
dfu_cfg_descriptor		x	-	flash/relocated
dfu_udp_ep0_handler		x	-	flash/relocated
dfu_udp_irq			x	-	flash/relocated
dfu_switch			-	x	RAM
dfu_main			x	-	flash/relocated
vectram				x	x	flash/relocated/switched
IRQ_Handler_EntryR		x	x	flash/relocated/switched
_remap				x	-	flash/reloaded

dfu_api				x	x	flash (const anyway)
dfu_state			x	x	RAM


preconditions:
	- dfu code assumes to be loaded to address zero to make it work from both ram and rom

startup:
	- exception vectors (in flash)
	- call lowlevel_init
	- setup user/supervisor/FIQ/IRQ stack
	- relocate dfu_state
	- if DFU switch is pressed
		- jump to dfu_main in flash
			- relocate all of DFU .text/.data into ram (including exception vectors)
			- initialize DFU .bss
			- remap RAM to address zero

	- if DFU switch is not pressed jump to entry address of app
		- Cstartup_app.S
			- relocate application .data
			- initialize application .bss
			- jump to appliction main 
			- application uses dfu_api in flash, pointing to in-flash data
			- application calls dfu_switch()
				- disable all interupts but USB
				- relocate all of DFU .text/.data into ram (including exception vectors)
				- remap RAM to address zero
				- check whether app has already remapped RAM before !?!

memory map:

load_addr	run_Addr
0x00100000	0x00000000	exception vectors (DFU Cstartup)
				Cstartup_SAM7

		0x00200000	


DFU constants:
_etext:
_data:	0x200000
_edata:

APP contants:
_data: _edata_dfu

personal git repositories of Harald Welte. Your mileage may vary