Skip to content

Commit f2edf9c

Browse files
committed
Split boot_detect into mp15 and mp13
1 parent 5d18100 commit f2edf9c

File tree

6 files changed

+183
-128
lines changed

6 files changed

+183
-128
lines changed

Makefile

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ SERIESDIR := ${SRCDIR}/mp15x
1818
HALDIR := $(EXTLIBDIR)/STM32MP1xx_HAL_Driver
1919
endif
2020

21-
SD_DISK_STEM ?= /dev/disk4s
21+
SD_DISK_STEM ?=
2222

2323
SOURCES = $(SERIESDIR)/startup.s \
2424
$(SRCDIR)/main.cc \
@@ -31,23 +31,23 @@ SOURCES = $(SERIESDIR)/startup.s \
3131
$(SRCDIR)/drivers/norflash/qspi_ll.c \
3232
$(SRCDIR)/drivers/norflash/qspi_norflash_read.c \
3333
$(SRCDIR)/gpt/gpt.cc \
34-
$(SERIESDIR)/systeminit.c \
3534
$(HALDIR)/Src/stm32mp1xx_ll_usart.c \
3635
$(HALDIR)/Src/stm32mp1xx_ll_rcc.c \
3736
$(HALDIR)/Src/stm32mp1xx_hal.c \
3837
$(HALDIR)/Src/stm32mp1xx_ll_sdmmc.c \
3938
$(HALDIR)/Src/stm32mp1xx_hal_sd.c \
39+
$(SERIESDIR)/systeminit.c \
4040
$(SERIESDIR)/drivers/ddr/stm32mp1_ram.cc
4141

4242

4343
INCLUDES = -I. \
4444
-I$(SRCDIR) \
4545
-I$(SRCDIR)/board_conf \
46-
-I$(EXTLIBDIR)/CMSIS/Core_A/Include \
4746
-I$(SRCDIR)/uboot-port/include \
4847
-I$(SRCDIR)/uboot-port/arch/arm/include \
49-
-I$(SERIESDIR) \
5048
-I$(HALDIR)/Inc \
49+
-I$(SERIESDIR) \
50+
-I$(EXTLIBDIR)/CMSIS/Core_A/Include \
5151
-I$(EXTLIBDIR)/CMSIS/Device/ST/STM32MP1xx/Include
5252

5353
ifeq ($(SERIES),stm32mp13x)

src/boot_detect.hh

Lines changed: 46 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -2,128 +2,53 @@
22
#include <cstdint>
33
#include <string_view>
44

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+
};
9022

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";
9449
}
50+
}
9551

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();
10053

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

src/boot_media_loader.hh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#pragma once
22
#include "boot_ddr.hh"
3-
#include "boot_detect.hh"
3+
#include "boot_detect_addr.hh"
44
#include "boot_image_def.hh"
55
#include "boot_nor.hh"
66
#include "boot_sd.hh"

src/main.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@
33
#include "boot_media_loader.hh"
44
#include "delay.h"
55
#include "drivers/clocks.hh"
6+
#include "drivers/ddr/stm32mp1_ram.h"
67
#include "drivers/leds.hh"
78
#include "drivers/pmic.hh"
89
#include "drivers/ram_tests.hh"
910
#include "drivers/uart.hh"
1011
#include "print.hh"
1112
#include "systeminit.h"
1213

13-
#include "drivers/ddr/stm32mp1_ram.h"
14-
1514
void main()
1615
{
1716
Board::RedLED red_led;

src/mp13x/boot_detect_addr.hh

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#pragma once
2+
#include "boot_detect.hh"
3+
#include <cstdint>
4+
#include <string_view>
5+
6+
namespace BootDetect
7+
{
8+
// between 0x30001638 and +4096 2638
9+
static constexpr uint32_t BOOTROM_TRACE_BEGIN = 0x3001638;
10+
static constexpr uint32_t BOOTROM_TRACE_END = 0x3002638;
11+
static constexpr uint32_t START_WORD = 0xFFDDBB00;
12+
13+
inline BootMethod read_boot_method()
14+
{
15+
// Scan for:
16+
// 0x30000011 : "SD_FsblsFound"
17+
// 0x80000006 : QSPI_FoundMagicAtDefaultLocation or
18+
// 0x80000005 : "QSPI_FoundGpt",
19+
20+
uint32_t word = BOOTROM_TRACE_BEGIN;
21+
while (word < BOOTROM_TRACE_END - 16) {
22+
auto val = *reinterpret_cast<uint32_t *>(word);
23+
24+
// Scan for the START_WORD
25+
if (val == START_WORD) {
26+
// Skip size, timestamp, level
27+
word += 16;
28+
29+
auto val = *reinterpret_cast<uint32_t *>(word);
30+
if (val == 0x80000006 || val == 0x80000005) {
31+
return BootMethod::BOOT_NOR;
32+
}
33+
34+
if (val == 0x30000011) {
35+
return BootMethod::BOOT_SDCARD;
36+
}
37+
}
38+
39+
word += 4;
40+
}
41+
42+
return BootMethod::BOOT_UNKNOWN;
43+
}
44+
45+
}; // namespace BootDetect

src/mp15x/boot_detect_addr.hh

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
#pragma once
2+
#include "boot_detect.hh"
3+
#include <cstdint>
4+
#include <string_view>
5+
6+
namespace BootDetect
7+
{
8+
// boot interface from Bootrom
9+
// - boot instance = bit 31:16
10+
// - boot device = bit 15:0
11+
//
12+
static constexpr uint32_t BOOTROM_PARAM_ADDR = 0x2FFC0078;
13+
static constexpr uint32_t BOOTROM_MODE_MASK = 0x0000FFFF;
14+
static constexpr uint32_t BOOTROM_MODE_SHIFT = 0;
15+
static constexpr uint32_t BOOTROM_INSTANCE_MASK = 0xFFFF0000;
16+
static constexpr uint32_t BOOTROM_INSTANCE_SHIFT = 16;
17+
static constexpr uint32_t BOOT_TYPE_MASK = 0xF0;
18+
static constexpr uint32_t BOOT_TYPE_SHIFT = 4;
19+
static constexpr uint32_t BOOT_INSTANCE_MASK = 0x0F;
20+
static constexpr uint32_t BOOT_INSTANCE_SHIFT = 0;
21+
22+
inline uint32_t read_raw_bootrom_itf() { return *reinterpret_cast<volatile uint32_t *>(BOOTROM_PARAM_ADDR); }
23+
24+
inline BootMethod read_boot_method()
25+
{
26+
uint32_t bootrom_itf = read_raw_bootrom_itf();
27+
uint32_t bootrom_device = (bootrom_itf & BOOTROM_MODE_MASK) >> BOOTROM_MODE_SHIFT;
28+
29+
auto boot_method = static_cast<BootMethod>(bootrom_device & 0x0F);
30+
return (boot_method < NUM_BOOT_METHODS) ? boot_method : BOOT_UNKNOWN;
31+
}
32+
33+
// More detailed boot information:
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+
inline BootDeviceInstance read_boot_device()
74+
{
75+
uint32_t bootrom_itf = read_raw_bootrom_itf();
76+
uint32_t bootrom_device = (bootrom_itf & BOOTROM_MODE_MASK) >> BOOTROM_MODE_SHIFT;
77+
uint32_t bootrom_instance = (bootrom_itf & BOOTROM_INSTANCE_MASK) >> BOOTROM_INSTANCE_SHIFT;
78+
uint32_t boot_device = ((bootrom_device << BOOT_TYPE_SHIFT) & BOOT_TYPE_MASK) |
79+
((bootrom_instance << BOOT_INSTANCE_SHIFT) & BOOT_INSTANCE_MASK);
80+
81+
auto boot_device_instance = static_cast<BootDeviceInstance>(boot_device);
82+
return (boot_device < NUM_BOOT_DEVICE_INSTANCES && boot_device > BOOT_DEVICE_UNKNOWN) ? boot_device_instance :
83+
BOOT_DEVICE_UNKNOWN;
84+
}
85+
86+
}; // namespace BootDetect

0 commit comments

Comments
 (0)