132 lines
3.3 KiB
Plaintext
132 lines
3.3 KiB
Plaintext
- 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
|
|
|