|
2 | 2 | #include <cstdint> |
3 | 3 | #include <string_view> |
4 | 4 |
|
5 | | -struct BootDetect { |
6 | | - // boot interface from Bootrom |
7 | | - // - boot instance = bit 31:16 |
8 | | - // - boot device = bit 15:0 |
9 | | - // |
10 | | - static constexpr uint32_t BOOTROM_PARAM_ADDR = 0x2FFC0078; |
11 | | - static constexpr uint32_t BOOTROM_MODE_MASK = 0x0000FFFF; |
12 | | - static constexpr uint32_t BOOTROM_MODE_SHIFT = 0; |
13 | | - static constexpr uint32_t BOOTROM_INSTANCE_MASK = 0xFFFF0000; |
14 | | - static constexpr uint32_t BOOTROM_INSTANCE_SHIFT = 16; |
15 | | - static constexpr uint32_t BOOT_TYPE_MASK = 0xF0; |
16 | | - static constexpr uint32_t BOOT_TYPE_SHIFT = 4; |
17 | | - static constexpr uint32_t BOOT_INSTANCE_MASK = 0x0F; |
18 | | - static constexpr uint32_t BOOT_INSTANCE_SHIFT = 0; |
19 | | - |
20 | | - enum BootMethod { |
21 | | - BOOT_UNKNOWN = 0, |
22 | | - BOOT_SDCARD = 1, |
23 | | - BOOT_EMMC = 2, |
24 | | - BOOT_NAND = 3, |
25 | | - BOOT_NOR = 4, |
26 | | - BOOT_UART = 5, |
27 | | - BOOT_USB = 6, |
28 | | - BOOT_SPINAND = 7, |
29 | | - |
30 | | - NUM_BOOT_METHODS = 8, |
31 | | - |
32 | | - BOOT_DDR = 9, |
33 | | - }; |
34 | | - |
35 | | - enum BootDeviceInstance { |
36 | | - BOOT_DEVICE_UNKNOWN = 0x0F, |
37 | | - |
38 | | - BOOT_FLASH_SD = 0x10, |
39 | | - BOOT_FLASH_SD_1 = 0x11, |
40 | | - BOOT_FLASH_SD_2 = 0x12, |
41 | | - BOOT_FLASH_SD_3 = 0x13, |
42 | | - |
43 | | - BOOT_FLASH_EMMC = 0x20, |
44 | | - BOOT_FLASH_EMMC_1 = 0x21, |
45 | | - BOOT_FLASH_EMMC_2 = 0x22, |
46 | | - BOOT_FLASH_EMMC_3 = 0x23, |
47 | | - |
48 | | - BOOT_FLASH_NAND = 0x30, |
49 | | - BOOT_FLASH_NAND_FMC = 0x31, |
50 | | - |
51 | | - BOOT_FLASH_NOR = 0x40, |
52 | | - BOOT_FLASH_NOR_QSPI = 0x41, |
53 | | - |
54 | | - BOOT_SERIAL_UART = 0x50, |
55 | | - BOOT_SERIAL_UART_1 = 0x51, |
56 | | - BOOT_SERIAL_UART_2 = 0x52, |
57 | | - BOOT_SERIAL_UART_3 = 0x53, |
58 | | - BOOT_SERIAL_UART_4 = 0x54, |
59 | | - BOOT_SERIAL_UART_5 = 0x55, |
60 | | - BOOT_SERIAL_UART_6 = 0x56, |
61 | | - BOOT_SERIAL_UART_7 = 0x57, |
62 | | - BOOT_SERIAL_UART_8 = 0x58, |
63 | | - |
64 | | - BOOT_SERIAL_USB = 0x60, |
65 | | - BOOT_SERIAL_USB_OTG = 0x62, |
66 | | - |
67 | | - BOOT_FLASH_SPINAND = 0x70, |
68 | | - BOOT_FLASH_SPINAND_1 = 0x71, |
69 | | - |
70 | | - NUM_BOOT_DEVICE_INSTANCES, |
71 | | - }; |
72 | | - |
73 | | - static BootMethod read_boot_method() |
74 | | - { |
75 | | - return BootMethod::BOOT_SDCARD; |
76 | | - // uint32_t bootrom_itf = read_raw_bootrom_itf(); |
77 | | - // uint32_t bootrom_device = (bootrom_itf & BOOTROM_MODE_MASK) >> BOOTROM_MODE_SHIFT; |
78 | | - |
79 | | - // auto boot_method = static_cast<BootMethod>(bootrom_device & 0x0F); |
80 | | - // return (boot_method < NUM_BOOT_METHODS) ? boot_method : BOOT_UNKNOWN; |
81 | | - } |
82 | | - |
83 | | - static BootDeviceInstance read_boot_device() |
84 | | - { |
85 | | - uint32_t bootrom_itf = read_raw_bootrom_itf(); |
86 | | - uint32_t bootrom_device = (bootrom_itf & BOOTROM_MODE_MASK) >> BOOTROM_MODE_SHIFT; |
87 | | - uint32_t bootrom_instance = (bootrom_itf & BOOTROM_INSTANCE_MASK) >> BOOTROM_INSTANCE_SHIFT; |
88 | | - uint32_t boot_device = ((bootrom_device << BOOT_TYPE_SHIFT) & BOOT_TYPE_MASK) | |
89 | | - ((bootrom_instance << BOOT_INSTANCE_SHIFT) & BOOT_INSTANCE_MASK); |
| 5 | +namespace BootDetect |
| 6 | +{ |
| 7 | + |
| 8 | +enum BootMethod { |
| 9 | + BOOT_UNKNOWN = 0, |
| 10 | + BOOT_SDCARD = 1, |
| 11 | + BOOT_EMMC = 2, |
| 12 | + BOOT_NAND = 3, |
| 13 | + BOOT_NOR = 4, |
| 14 | + BOOT_UART = 5, |
| 15 | + BOOT_USB = 6, |
| 16 | + BOOT_SPINAND = 7, |
| 17 | + |
| 18 | + NUM_BOOT_METHODS = 8, |
| 19 | + |
| 20 | + BOOT_DDR = 9, |
| 21 | +}; |
90 | 22 |
|
91 | | - auto boot_device_instance = static_cast<BootDeviceInstance>(boot_device); |
92 | | - return (boot_device < NUM_BOOT_DEVICE_INSTANCES && boot_device > BOOT_DEVICE_UNKNOWN) ? boot_device_instance : |
93 | | - BOOT_DEVICE_UNKNOWN; |
| 23 | +constexpr std::string_view bootmethod_string(BootMethod method) |
| 24 | +{ |
| 25 | + switch (method) { |
| 26 | + case BOOT_SDCARD: |
| 27 | + return "SD Card"; |
| 28 | + break; |
| 29 | + case BOOT_EMMC: |
| 30 | + return "EMMC"; |
| 31 | + break; |
| 32 | + case BOOT_NAND: |
| 33 | + return "NAND"; |
| 34 | + break; |
| 35 | + case BOOT_NOR: |
| 36 | + return "NOR"; |
| 37 | + break; |
| 38 | + case BOOT_UART: |
| 39 | + return "UART"; |
| 40 | + break; |
| 41 | + case BOOT_USB: |
| 42 | + return "USB"; |
| 43 | + break; |
| 44 | + case BOOT_SPINAND: |
| 45 | + return "SPI NAND"; |
| 46 | + break; |
| 47 | + default: |
| 48 | + return "Unknown"; |
94 | 49 | } |
| 50 | +} |
95 | 51 |
|
96 | | - static uint32_t read_raw_bootrom_itf() |
97 | | - { |
98 | | - return *reinterpret_cast<volatile uint32_t *>(BOOTROM_PARAM_ADDR); |
99 | | - } |
| 52 | +BootMethod read_boot_method(); |
100 | 53 |
|
101 | | - static constexpr std::string_view bootmethod_string(BootMethod method) |
102 | | - { |
103 | | - switch (method) { |
104 | | - case BOOT_SDCARD: |
105 | | - return "SD Card"; |
106 | | - break; |
107 | | - case BOOT_EMMC: |
108 | | - return "EMMC"; |
109 | | - break; |
110 | | - case BOOT_NAND: |
111 | | - return "NAND"; |
112 | | - break; |
113 | | - case BOOT_NOR: |
114 | | - return "NOR"; |
115 | | - break; |
116 | | - case BOOT_UART: |
117 | | - return "UART"; |
118 | | - break; |
119 | | - case BOOT_USB: |
120 | | - return "USB"; |
121 | | - break; |
122 | | - case BOOT_SPINAND: |
123 | | - return "SPI NAND"; |
124 | | - break; |
125 | | - default: |
126 | | - return "Unknown"; |
127 | | - } |
128 | | - } |
129 | | -}; |
| 54 | +}; // namespace BootDetect |
0 commit comments