xflash_layout.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /**
  2. * @file
  3. * @author leptun
  4. */
  5. /** \ingroup xflash_layout */
  6. //! This is the layout of the XFLASH (external SPI flash) in Prusa firmware (dynamically generated from doxygen).
  7. /** @defgroup xflash_layout XFLASH Layout
  8. *
  9. ---------------------------------------------------------------------------------
  10. The XFLASH has the following alignment requirements:
  11. - Block erase of 64KB. This is what the second bootloader uses. If anything even starts writing to a block, the entire block is erased by the bootloader. It will cause loss of crash dump on firmware upload. Nothing more than that.
  12. - Block erase of 32KB. Not used.
  13. - Sector erase of 4KB. Used by the xflash_dump. This is the minimum size for erasing and as such the dump is 4KB aligned as to not erase other stuff unintentionally.
  14. - Page write of 256B. Lower access can be used, but care must be used since the address wraps at the page boundary when writing.
  15. - Read has no alignment requirements.
  16. The following items are found in the xflash:
  17. ### 1. Languages (R)
  18. This is a variable size region that is built by the lang build scripts. More info can be found in those scripts.
  19. It is aligned at the beginning of xflash, offset 0.
  20. ### 2. MMU Firmware update files (64KB, R)
  21. This space is reserved for the two MMU firmware files:
  22. - The MMU firmware v2.0.0+.
  23. - The Bootloader self update file.
  24. It is aligned at the end of xflash, before xflash_dump
  25. ### 3. xflash_dump (12KB, RW)
  26. The crash dump structure is defined as dump_t.
  27. It composes of:
  28. - A header with some information such as crash reason and what info was dumped.
  29. - The dump itself. This is composed of the entire memory space from address 0 to the end of SRAM. So it includes also the registers (useless), the IO and extended IO (useful) and all RAM.
  30. Even though the dump needs around 9KB of storage, 12KB is used because of the sector erase size.
  31. It is aligned at the end of xflash.
  32. */
  33. // XFLASH memory layout
  34. #pragma once
  35. #include <stdint.h>
  36. #include "bootapp.h" // for RAMSIZE
  37. #include "config.h"
  38. #define XFLASH_SIZE 0x40000ul // size of XFLASH
  39. #define DUMP_MAGIC 0x55525547ul
  40. struct dump_header_t
  41. {
  42. // start with a magic value to indicate the presence of a dump, so that clearing
  43. // a single page is sufficient for resetting the state
  44. uint32_t magic;
  45. uint8_t regs_present; // true when the lower segment containing registers is present
  46. uint8_t crash_reason; // uses values from dump_crash_source
  47. uint32_t pc; // PC nearby the crash location
  48. uint16_t sp; // SP nearby the crash location
  49. };
  50. struct dump_data_t
  51. {
  52. // contiguous region containing all addressable ranges
  53. uint8_t regs[RAMSTART];
  54. uint8_t sram[RAMSIZE];
  55. };
  56. struct dump_t
  57. {
  58. struct dump_header_t header;
  59. // data is page aligned (no real space waste, due to the larger
  60. // alignment required for the whole dump)
  61. struct dump_data_t __attribute__((aligned(256))) data;
  62. };
  63. #define DUMP_OFFSET ((XFLASH_SIZE - sizeof(dump_t)) & ~0xFFFul) // dump offset must be aligned to lower 4kb sector boundary
  64. #define MMU_BOOTLOADER_UPDATE_OFFSET (DUMP_OFFSET - 32768) // 32KB of MMU bootloader self update.
  65. #define MMU_FW_UPDATE_OFFSET (MMU_BOOTLOADER_UPDATE_OFFSET - 32768) // 32KB of MMU fw.
  66. #define LANG_OFFSET 0x0 // offset for language data
  67. #define LANG_SIZE (MMU_FW_UPDATE_OFFSET - LANG_OFFSET) // available language space
  68. #define DUMP_SIZE (XFLASH_SIZE - DUMP_OFFSET) // effective dump size area