mirror of
https://github.com/portapack-mayhem/mayhem-firmware.git
synced 2024-11-27 12:05:34 +00:00
Created Boot Process (markdown)
parent
ca4de1b054
commit
626fab56cf
86
Boot-Process.md
Normal file
86
Boot-Process.md
Normal file
@ -0,0 +1,86 @@
|
||||
The boot process is a bit of madness, but justifiable madness.
|
||||
|
||||
### Overview
|
||||
|
||||
The LPC4320 bootloader initializes the Cortex-M4F core to boot from the start of external SPI flash. The M0 core stays in reset. The [bootstrap code](https://github.com/sharebrained/portapack-hackrf/blob/master/firmware/bootstrap/bootstrap.c) runs from SPI flash, on the Cortex-M4F. The bootstrap initializes the Cortex-M0 to execute the application code from SPI flash, then sleeps. The application code copies the baseband code into RAM, configures the Cortex-M4F to run from RAM, then resets the Cortex-M4F to begin baseband execution.
|
||||
|
||||
(TODO: A diagram would be helpful, showing the M4F and M0 activities vs. time.)
|
||||
|
||||
### Bootstrap
|
||||
|
||||
In the PortaPack image, the Cortex-M4F "bootstrap" image is located at the start of SPI flash. It's executed by the LPC4320 built-in bootloader. The M4 clock is already set to 96MHz. The bootstrap code configures SPIFI to run at (approximately) maximum speed. Then, it initializes the Cortex-M0's memory map to point at the "application" image in SPI flash, and releases the Cortex-M0 from reset. The bootstrap then sleeps the Cortex-M4 until the M0 application needs to run baseband firmware on it.
|
||||
|
||||
### Application
|
||||
|
||||
On the Cortex-M0 core, boot time looks like this:
|
||||
|
||||
ResetHandler:
|
||||
Initialize process stack pointer
|
||||
Initialize stack RAM regions (fill with pattern)
|
||||
__early_init()
|
||||
Enable extra processor exceptions for debugging
|
||||
Init data segment (copy SPI flash -> data region in RAM)
|
||||
Initialize BSS (fill RAM region with 0)
|
||||
__late_init()
|
||||
reset()
|
||||
Reset most peripherals -- not SCU, SPIFI, or M0APP
|
||||
halInit()
|
||||
hal_lld_init()
|
||||
Init timer 3 as cycle counter (no DWT on M0)
|
||||
Init RIT as SysTick (no SysTick on M0)
|
||||
palInit()
|
||||
gptInit()
|
||||
i2cInit()
|
||||
sdcInit()
|
||||
spiInit()
|
||||
rtcInit()
|
||||
boardInit()
|
||||
chSysInit()
|
||||
port_init()
|
||||
_scheduler_init()
|
||||
_vt_init()
|
||||
_core_init()
|
||||
_heap_init()
|
||||
chSysEnable()
|
||||
chThdCreateStatic(_idle_thread_wa, ...)
|
||||
Constructors
|
||||
main()
|
||||
Destructors
|
||||
_default_exit()
|
||||
while(1);
|
||||
|
||||
### Baseband
|
||||
|
||||
On the Cortex-M4F core, these are the stages a baseband image moves through:
|
||||
|
||||
ResetHandler:
|
||||
Initialize process stack pointer
|
||||
Initialize FPU
|
||||
Initialize stack RAM regions (fill with pattern)
|
||||
__early_init()
|
||||
Enable extra processor exceptions for debugging
|
||||
Init data segment (copy SPI flash -> data region in RAM)
|
||||
Initialize BSS (fill RAM region with 0)
|
||||
__late_init()
|
||||
halInit()
|
||||
hal_lld_init()
|
||||
Init SysTick
|
||||
Init DWT as cycle counter
|
||||
# Baseband controls no hardware, so no hardware init here.
|
||||
boardInit()
|
||||
chSysInit()
|
||||
port_init()
|
||||
_scheduler_init()
|
||||
_vt_init()
|
||||
_core_init()
|
||||
_heap_init()
|
||||
chSysEnable()
|
||||
chThdCreateStatic(_idle_thread_wa, ...)
|
||||
Constructors
|
||||
main()
|
||||
Destructors
|
||||
_default_exit()
|
||||
while(1);
|
||||
|
||||
##
|
||||
Original Wiki by sharebrained at [Boot Process](https://github.com/sharebrained/portapack-hackrf/wiki/Boot-Process)
|
Loading…
Reference in New Issue
Block a user