From ba73f3e832f400b9fd423787b29d6c42251adf73 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Fri, 7 Jun 2024 17:01:24 +0200 Subject: [PATCH] uboot: HTTP netboot support If we receive an option 67 (bootfile) matching http://IP/rootfs.itb, use U-Boot's wget implementation to download the file. The web server must listen on port 80. tftp:// is also supported. Without a protocol prefix, assume that the bootfile should be fetched using TFTP from ${serverip}. --- board/common/uboot/extras.config | 4 +++ board/common/uboot/scripts/ixprepdhcp.sh | 34 ++++++++++++++++-------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/board/common/uboot/extras.config b/board/common/uboot/extras.config index a7487766..331412e6 100644 --- a/board/common/uboot/extras.config +++ b/board/common/uboot/extras.config @@ -26,6 +26,10 @@ CONFIG_CMD_MMC=y CONFIG_FS_SQUASHFS=y CONFIG_CMD_SQUASHFS=y +CONFIG_PROT_TCP=y +CONFIG_PROT_TCP_SACK=y +CONFIG_CMD_WGET=y + CONFIG_USE_PREBOOT=y CONFIG_CMD_BOOTMENU=y CONFIG_CMD_PAUSE=y diff --git a/board/common/uboot/scripts/ixprepdhcp.sh b/board/common/uboot/scripts/ixprepdhcp.sh index e3248d05..ef4f6629 100644 --- a/board/common/uboot/scripts/ixprepdhcp.sh +++ b/board/common/uboot/scripts/ixprepdhcp.sh @@ -1,16 +1,28 @@ -if dhcp ${ramdisk_addr_r}; then +setenv autoload no - setenv old_fdt_addr ${fdt_addr} - if fdt addr ${ramdisk_addr_r}; then - fdt get value sqoffs /images/rootfs data-position - fdt get value sqsize /images/rootfs data-size - fdt addr ${old_fdt_addr} +if dhcp; then + setenv proto tftp + setenv dltool tftpboot - setexpr sqaddr ${ramdisk_addr_r} + ${sqoffs} - setexpr sqblkcnt ${sqsize} / 0x200 - setexpr sqkbsize ${sqsize} / 0x400 + if setexpr proto sub "^(http|tftp)://.*" "\\1" "${bootfile}" && setexpr bootfile sub "^(http|tftp)://([^/]+?)/(.*)" "\2:\3"; then + if test "${proto}" = "http"; then + setenv dltool wget + fi + fi - setenv bootargs_root "root=/dev/ram0 ramdisk_size=0x${sqkbsize} initrd=0x${sqaddr},${sqsize}" - setenv prepared ok + if ${dltool} ${ramdisk_addr_r} "${bootfile}"; then + setenv old_fdt_addr ${fdt_addr} + if fdt addr ${ramdisk_addr_r}; then + fdt get value sqoffs /images/rootfs data-position + fdt get value sqsize /images/rootfs data-size + fdt addr ${old_fdt_addr} + + setexpr sqaddr ${ramdisk_addr_r} + ${sqoffs} + setexpr sqblkcnt ${sqsize} / 0x200 + setexpr sqkbsize ${sqsize} / 0x400 + + setenv bootargs_root "root=/dev/ram0 ramdisk_size=0x${sqkbsize} initrd=0x${sqaddr},${sqsize}" + setenv prepared ok + fi fi fi