Squishy Rev2 Bootloader¶
Bootloader Protocol¶
Squishy Rev2 has a little bit of a complicated boot protocol due to the use of a platform supervisor, the protocol between the FPGA in either the applet of bootloader state and the supervisor must be well defined to avoid any potential problems.
Applet Mode¶
When the FPGA is hosting an applet, we can request to drop into the bootloader as follows:
FPGA raises
~SU_IRQ
with the IRQ register valueDFU
set to1
Supervisor resets the FPGA configuration and loads the bootloader bitstream
Supervisor then waits for the next IRQ event
Supervisor then checks the IRQ register to make sure it is
in_boot
Bootloader Mode¶
Upon the FPGA entering the bootloader:
FPGA waits for a DFU upload, and if done stuffs it into the PSRAM
FPGA Holds
bus_hold
high until DFU upload is completeFPGA sticks the destination slot for the DFU payload into the
dest_slot
half of theslots
registerFPGA writes the DFU payload size into the
txlen
register
FPGA sets the IRQ Reason to
in_boot
FPGA raises the
~SU_IRQ
line to notify the supervisor we are in the bootloaderSupervisor reads the
slots
andtxlen
registers
If the destination slot is not ephemeral:
Supervisor erases the flash region mapped to that slot
Supervisor write the contents of the PSRAM for
txlen
into the target flash slotSupervisor then writes into the FPGA control register that the erase/flash cycle is done
Supervisor waits for the FPGA to tell it to reboot into a given slot
FPGA triggers reboot on DFU detach to last written slot?
If the destination slot is ephemeral:
Supervisor resets the FPGA into configuration mode
Read a block into our SPI buffer from the PSRAM
While we have not written the full bitstream:
Read at most buffers worth of bitstream data from PSRAM
Dump buffer into FPGA configuration
Check FPGA configuration status
let the FPGA boot into new bitstream
- class squishy.gateware.bootloader.rev2.Rev2(*args: Any, src_loc_at: int = 0, **kwargs: Any)¶
- Parameters:
fifo (AsyncFIFO | None) – The storage FIFO.
- Variables:
trigger_reboot (Signal) – FPGA reboot trigger from DFU.
slot_selection (Signal(2)) – Flash slot destination from DFU alt-mode.
dl_start (Signal) – Input: Start of a DFU transfer.
dl_finish (Signal) – Input: An acknowledgement of the dl_done signal
dl_ready (Signal) – Output: If the backing storage is ready for data.
dl_done (Signal) – Output: When the backing storage is done storing the data.
dl_reset_slot (Signal) – Input: Signals to the storage to reset the active slot.
dl_size (Signal(16)) – Input: The size of the DFU transfer into the the FIFO
slot_changed (Signal) – Input: Raised when the DFU alt-mode is changed.
slot_ack (Signal) – Output: When the slot_changed signal was acted on.