xref: /haiku/build/jam/images/MMCImage (revision 87f4776937505e3014251c9c3434be78ae29d7d0)
1# Set anyboot file name and directory defaults.
2HAIKU_MMC_NAME ?= $(HAIKU_DEFAULT_MMC_NAME) ;
3HAIKU_MMC_DIR ?= $(HAIKU_DEFAULT_MMC_DIR) ;
4HAIKU_MMC = $(HAIKU_MMC_NAME) ;
5HAIKU_MMC_LABEL ?= $(HAIKU_DEFAULT_MMC_LABEL) ;
6
7# SD/mmc image rule
8# Files must be in this order:
9#  out : mbrtool fatshell os_image loader floppyboot everything_else
10rule BuildSDImage image : files
11{
12	local mbrtool = <build>mbrtool ;
13	local fatshell = <build>fat_shell ;
14
15	Depends $(image) : $(files) $(TARGET_DEVICE_TREES) ;
16	Depends $(image) : $(HAIKU_IMAGE_NAME) ;
17	Depends $(image) : $(mbrtool) ;
18	Depends $(image) : $(fatshell) ;
19
20	SDIMAGE_OS_SIZE on $(image) = $(HAIKU_IMAGE_SIZE) ;
21	SDIMAGE_BEGIN on $(image) = $(HAIKU_BOOT_SDIMAGE_BEGIN:E=63) ;
22
23	if $(TARGET_BOOT_PLATFORM) = efi {
24		switch $(TARGET_ARCH) {
25			case x86_64 :
26				EFINAME on $(image) = "BOOTX64.EFI" ;
27			case arm :
28				EFINAME on $(image) = "BOOTARM.EFI" ;
29			case arm64 :
30				EFINAME on $(image) = "BOOTAA64.EFI" ;
31			case riscv32 :
32				EFINAME on $(image) = "BOOTRISCV32.EFI" ;
33			case riscv64 :
34				EFINAME on $(image) = "BOOTRISCV64.EFI" ;
35			case * :
36				Exit "Error: Unknown EFI architecture!" ;
37		}
38		BuildEfiSDImage1 $(image) : $(mbrtool) $(fatshell) $(files) ;
39	} else {
40		BuildUBootSDImage1 $(image) : $(mbrtool) $(fatshell) $(files) ;
41	}
42}
43
44# Usage:
45#  out : mbrtool fatshell os_image loader floppyboot everything_else
46actions BuildUBootSDImage1
47{
48	$(RM) $(1)
49
50	export $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR)
51
52	# in KiB
53	EFI_SIZE=32768
54	BOOT_SIZE=`expr ${EFI_SIZE} + $(SDIMAGE_BEGIN)`
55	MMC_SIZE=`expr $(SDIMAGE_OS_SIZE) \* 1024 + ${BOOT_SIZE}`
56
57	# Build "boot" disk
58	dd if=/dev/zero of=$(1) bs=1K count=${BOOT_SIZE}
59
60	# generate u-boot environment variables
61	echo 'os=haiku' > uEnv.txt
62	echo 'platform=u-boot' >> uEnv.txt
63	echo "loader=haiku_loader.ub" >> uEnv.txt
64
65	# Lay down partition map
66	OS_LENGTH=`expr ${MMC_SIZE} - ${BOOT_SIZE}`
67
68	# EFI System Partition
69	$(2[1]) $(1) 0 0xef $(SDIMAGE_BEGIN) ${EFI_SIZE}
70	# OS Partition
71	$(2[1]) $(1) 1 0xeb ${BOOT_SIZE} ${OS_LENGTH}
72
73	FATFS="$(2[2]) --start-offset `expr $(SDIMAGE_BEGIN) \* 1024`"
74
75	# format the image
76	${FATFS} --end-offset `expr ${BOOT_SIZE} \* 1024` \
77		--initialize "$(1)" 'Haiku Boot'
78
79	# populate
80	for i in $(2[4-]) ; do
81		echo "cp :${i} myfs/" | ${FATFS} $(1)
82	done
83
84	echo "cp :uEnv.txt myfs/" | ${FATFS} $(1)
85
86	# lay down FDT's
87	echo "mkdir myfs/fdt" | ${FATFS} $(1)
88	for i in $(TARGET_DEVICE_TREES[1-]) ; do
89		echo "cp :${i} myfs/fdt/" | ${FATFS} $(1)
90	done
91
92	# list content
93	echo "ls myfs" | ${FATFS} $(1)
94
95	# cleanup
96	$(RM) uEnv.txt
97	$(RM) boot.scr
98
99	# Add haiku partition to MMC image
100	cat $(2[3-3]) >> $(1)
101}
102
103
104# Usage:
105#  out : mbrtool fatshell os_image loader floppyboot everything_else
106actions BuildEfiSDImage1
107{
108	$(RM) $(1)
109
110	export $(HOST_ADD_BUILD_COMPATIBILITY_LIB_DIR)
111
112	# in KiB
113	EFI_SIZE=32768
114	BOOT_SIZE=`expr ${EFI_SIZE} + $(SDIMAGE_BEGIN)`
115	MMC_SIZE=`expr $(SDIMAGE_OS_SIZE) \* 1024 + ${BOOT_SIZE}`
116
117	# Build "boot" disk
118	dd if=/dev/zero of=$(1) bs=1K count=${BOOT_SIZE}
119
120	# generate u-boot environment variables
121	echo 'os=haiku' > uEnv.txt
122	echo 'platform=efi' >> uEnv.txt
123	echo "loader=EFI/BOOT/$(EFINAME)" >> uEnv.txt
124
125	# Lay down partition map
126	OS_LENGTH=`expr ${MMC_SIZE} - ${BOOT_SIZE}`
127
128	# EFI System Partition
129	$(2[1]) $(1) 0 0xef $(SDIMAGE_BEGIN) ${EFI_SIZE}
130	# OS Partition
131	$(2[1]) $(1) 1 0xeb ${BOOT_SIZE} ${OS_LENGTH}
132
133	FATFS="$(2[2]) --start-offset `expr $(SDIMAGE_BEGIN) \* 1024`"
134
135	# format the image
136	${FATFS} --end-offset `expr ${BOOT_SIZE} \* 1024` \
137		--initialize "$(1)" 'Haiku Boot'
138
139	# populate
140	echo "mkdir -p myfs/EFI/BOOT" | ${FATFS} $(1)
141	echo "cp :$(2[4-4]) myfs/EFI/BOOT/$(EFINAME)" | ${FATFS} $(1)
142
143	# copy misc files
144	for i in $(2[5-]) ; do
145		echo "cp :${i} myfs/" | ${FATFS} $(1)
146	done
147	echo "cp :uEnv.txt myfs/" | ${FATFS} $(1)
148
149	# lay down FDT's
150	echo "mkdir myfs/fdt" | ${FATFS} $(1)
151	for i in $(TARGET_DEVICE_TREES[1-]) ; do
152		echo "cp :${i} myfs/fdt/" | ${FATFS} $(1)
153	done
154
155	# list content
156	echo "ls myfs" | ${FATFS} $(1)
157
158	# cleanup
159	$(RM) uEnv.txt
160	$(RM) boot.scr
161
162	# Add haiku partition to MMC image
163	cat $(2[3-3]) >> $(1)
164}
165
166for platform in [ MultiBootSubDirSetup ] {
167	on $(platform) {
168		# SD/mmc image targets
169		if $(TARGET_BOOT_PLATFORM) = efi {
170			if $(TARGET_ARCH) = arm || $(TARGET_ARCH) = arm64 || $(TARGET_ARCH) = riscv64 {
171				# These EFI platforms need u-boot to get them going
172				BuildSDImage $(HAIKU_MMC_NAME) : $(HAIKU_IMAGE)
173					haiku_loader.$(TARGET_BOOT_PLATFORM)
174					boot.scr ;
175			} else {
176				BuildSDImage $(HAIKU_MMC_NAME) : $(HAIKU_IMAGE)
177					haiku_loader.$(TARGET_BOOT_PLATFORM) ;
178			}
179		} else {
180			BuildSDImage $(HAIKU_MMC_NAME) :
181				$(HAIKU_IMAGE) haiku_loader.$(TARGET_BOOT_PLATFORM) haiku-floppyboot.tgz.$(TARGET_BOOT_PLATFORM) boot.scr ;
182		}
183	}
184}
185
186#BlessSDImage haiku-$(TARGET_KERNEL_ARCH).mmc ;
187NotFile haiku-mmc-image ;
188Depends haiku-mmc-image : $(HAIKU_MMC_NAME) ;
189