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