xous-core/docs/flash.md
2021-05-02 23:45:39 +08:00

105 lines
4.9 KiB
Markdown

# FLASH memory layout
Xous is designed to operate from a SPI FLASH filesystem. The key properties assumed of the
underlying implementation are as follows:
- XIP-capable
- Memory-mapped
- 4kiB erase sectors (same as page size)
- Transparent bad block mechanism
- ~100k erase/program cycles per sector
The FLASH memory used in the Precursor implementation is a Macronix MX66UM1G45G, which
is a 128MiB part, upgradable to higher capacities.
In Precursor, FLASH memory is located at a base of 0x2000_0000, which is the constant
`HW_SPIFLASH_MEM` in the `utra`, and the length is coded as `HW_SPIFLASH_MEM_LEN`.
Below is a map of the FLASH memory. For completeness, note that the hardware
boots from location 0x0000_0000, from 32kiB a non-Xous boot ROM that is compiled into
the FPGA binary image itself. This ROM currently consists of just a few instructions
to jump to the Xous loader, but eventually this will need to house the code that does
public key signature verification of the Xous kernel itself before jumping to it.
Also note that main SRAM is, by default, battery-backed, so during shutdown, the RAM
image stays resident. This means no space is allocated in FLASH for hibernation or standby.
Finally, everything in the memory layout up until the PDDB is considered to be largely
static data, only written during firmware and software updates. Therefore, no provision
exists for sector-sparing or weare levelling; we instead rely on the 100k-cycle write
endurance of the underlying hardware. The PDDB itself will have to implement some form
of wear leveling, however.
```
+-----------+----------------------------------------+
+ 2000_0000 | Primary FPGA bitstream |
+ 2021_7287 | 2,192,008 bytes |
+-----------+----------------------------------------+
+ 2021_7288 | Padding |
+ 2027_7FFF | |
+-----------+----------------------------------------+
+ 2027_8000 | csr.csv corresponding to bitstream |
+ 2027_FFFF | (32kiB max, see below) |
+-----------+----------------------------------------+
+ 2028_0000 | Reserved for backup bitstream |
+ 204F_FFFF | |
+-----------+----------------------------------------+
+ 2050_0000 | loader.bin - Xous loader |
+ 2050_FFFF | |
+-----------+----------------------------------------+
+ 2051_0000 | Font planes |
+ 2097_FFFF | |
+-----------+----------------------------------------+
+ 2098_0000 | Xous kernel plus |
+ 20AF_FFFF | Initial/trusted server set |
+-----------+----------------------------------------+
+ 20B0_0000 | Reserved |
+ 20CF_FFFF | |
+-----------+----------------------------------------+
+ 20D0_0000 | PDDB 'filesystem' |
+ 27F7_FFFF | |
+-----------+----------------------------------------+
+ 27F8_0000 | 512k reserved space for EC image |
+ 27FF_FFFF | Split into 300k wf200 + 200k EC fw |
+-----------+----------------------------------------+
```
The csr.csv block is further structured as follows:
```
+-----------+----------------------------------------+
+ 2027_8000 | Length of csr.csv data |
+ 2027_8003 | 4 bytes, little-endian |
+-----------+----------------------------------------+
+ 2027_8004 | csr.csv data (variable length) |
+ 2027_8xxx | Typically ~12kiB, byte ordered |
+-----------+----------------------------------------+
+ 2027_8xxx | padding to 0xFF |
+ 2027_FFBF | padding included in sha512 |
+-----------+----------------------------------------+
+ 2027_FFC0 | sha512 of 2027_8000:2027_FFBF |
+ 2027_FFFF | 64 bytes, network order |
+-----------+----------------------------------------+
```
## Testing Structures
Prior to the creation of the PDDB, some hard-coded audio data is loaded for development purposes.
This documents their location in FLASH. The samples are shorter than the allocated regions, but the WAV headers encode their actual lenth.
```
+-----------+----------------------------------------+
+ 2600_0000 | 8khz short sample (WAV/<512kiB) |
+ 2607_FFFF | 16-bit stereo PCM ~16s long |
+-----------+----------------------------------------+
+ 2608_0000 | 44.1khz short sample (WAV/<2,816kiB) |
+ 2633_FFFF | 16-bit stereo PCM ~16s long |
+-----------+----------------------------------------+
+ 2634_0000 | 8khz short sample (WAV/<28,928kiB) |
+ 2707_FFFF | 16-bit stereo PCM ~330s long |
+-----------+----------------------------------------+
+ 27F8_0000 | Start of EC region (do not use) |
+-----------+----------------------------------------+
```