Table of Contents
U-Boot
Mtk uboot: https://github.com/mtk-openwrt/u-boot
Mtk atf: https://github.com/mtk-openwrt/arm-trusted-firmware
building
Uboot needs to build into atf bl33.
So basicly do these in both branches (first uboot then atf)
./build.sh importconfig ./build.sh
Then flash build/mt7986/release/ bl2.img to bl2-partition and fip.bin to fip-partition
sudo dd if=build/mt7986/release/bl2.img of=/dev/sdb1 sudo dd if=build/mt7986/release/fip.bin of=/dev/sdb4
ATF branch contains gpt file (gpt_sdmmc_100m6g.img) for flashing first and script to create basic image with bootchain
./build.sh createimg
booting kernel
setenv kaddr 0x46000000 ls mmc 0:5 fatload mmc 0:5 ${kaddr} bpi-r3-5.19.0-rc1-r3.itb #setenv bootargs "earlycon=uart8250,mmio32,0x11002000 console=ttyS0" bootm ${kaddr}
board seems to hang in 5.19-rc1 when console=ttyS0 is passed
with my environment it is easy to boot kernel from usb
BPI-R3> usb start BPI-R3> setenv device usb #was mmc before BPI-R3> setenv partition 0:1 #was 0:5 before for mmc BPI-R3> setenv fit bpi-r3-sfp.itb #change filename if needed BPI-R3> run newboot #will load bpi-r3.itb
load fip with alternate dtb (like from my current 5.19-r3 branch, second config contains emmc dtb)
BPI-R3> fatload usb 0:1 $loadaddr bpi-r3.itb 17032308 bytes read in 1427 ms (11.4 MiB/s) BPI-R3> bootm ${loadaddr}#conf-2
load external initrd (run before “run newboot”):
BPI-R3> setenv rdaddr 0x48000000 BPI-R3> setenv root "/dev/ram0 rw" BPI-R3> setenv bootopts "debug=7 initrd=${rdaddr},20M" BPI-R3> fatload usb 0:1 ${rdaddr} rootfs.cpio.zst
latest uboot with usb, initrd and bootconf
BPI-R3> run useusb BPI-R3> setenv initrd rootfs.cpio.zst BPI-R3> setenv fit bpi-r3-sfp-no-rd.itb BPI-R3> setenv bootconf "#conf-2" # BPI-R3> run newboot
#using dt-overlay config BPI-R3> setenv bootconf "#conf-sd-nor" #conf-sd-nor=sd base dts + nor dt overlay
setenv buildargs 'setenv bootargs "board=${board} earlycon=uart8250,mmio32,0x11002000 ${bootopts} root=${root}"'
bootmedium selection
top | bottom | |||
sw1/A | sw2/B (spi/mmc) | sw5/C (nor/nand) | sw6/D (sd/emmc) | |
spim-nor | low | low | low | x |
spim-nand | high | low | high | x |
emmc | low | high | x | low |
sd | high | high | x | high |
To access emmc you need to go over spi-nand/nor:
Bootup with sdcard (put spi-nand bl2 + fip with emmc-and usb-support as files on card) and flash them like described here then boot from spi (sw2 to boot from spi-nand + change sw6 to have access to emmc) and then flash emmc. Finally change sw2 back to boot from emmc and sw1 has to be changed too.
nand flash
BPI-R3> ls mmc 0:5 17019020 bpi-r3.itb 579401 fip_nand.bin 217712 bl2_nand.img 3 file(s), 0 dir(s) BPI-R3> mtd list List of MTD devices: * spi-nand0 - device: spi_nand@1 - parent: spi@1100a000 - driver: spi_nand - path: /spi@1100a000/spi_nand@1 - type: NAND flash - block size: 0x20000 bytes - min I/O: 0x800 bytes - OOB size: 64 bytes - OOB available: 24 bytes - 0x000000000000-0x000008000000 : "spi-nand0" * nmbm0 - type: Unknown - block size: 0x20000 bytes - min I/O: 0x800 bytes - OOB size: 64 bytes - OOB available: 24 bytes - 0x000000000000-0x000007800000 : "nmbm0" - 0x000000000000-0x000000100000 : "bl2" - 0x000000100000-0x000000180000 : "u-boot-env" - 0x000000180000-0x000000380000 : "factory" - 0x000000380000-0x000000580000 : "fip" - 0x000000580000-0x000004580000 : "ubi" BPI-R3> printenv loadaddr loadaddr=0x46000000 BPI-R3> mtd erase spi-nand0 Erasing 0x00000000 ... 0x07ffffff (1024 eraseblock(s)) BPI-R3> fatload mmc 0:5 $loadaddr bl2_nand.img 217712 bytes read in 24 ms (8.7 MiB/s) BPI-R3> mtd write spi-nand0 $loadaddr 0x0 0x100000 Writing 1048576 byte(s) (512 page(s)) at offset 0x00000000 BPI-R3> fatload mmc 0:5 $loadaddr fip_nand.bin 579401 bytes read in 60 ms (9.2 MiB/s) BPI-R3> mtd write spi-nand0 $loadaddr 0x380000 0x200000 Writing 2097152 byte(s) (1024 page(s)) at offset 0x00380000
usb (easier as it does not require changing sdcard):
BPI-R3> mtd erase spi-nand0 spi-nand: spi_nand spi_nand@1: Winbond SPI NAND was found. spi-nand: spi_nand spi_nand@1: 128 MiB, block size: 128 KiB, page size: 2048, OOB size: 64 jedec_spi_nor spi_nor@0: unrecognized JEDEC id bytes: 00, ef, aa Could not find a valid device for nmbm0 Erasing 0x00000000 ... 0x07ffffff (1024 eraseblock(s)) BPI-R3> load usb 0:1 $loadaddr bpi-r3_spim-nand_2024.04_bl2.img 205560 bytes read in 521 ms (384.8 KiB/s) BPI-R3> mtd write spi-nand0 $loadaddr 0x0 0x100000 jedec_spi_nor spi_nor@0: unrecognized JEDEC id bytes: ff, ef, aa Writing 1048576 byte(s) (512 page(s)) at offset 0x00000000 BPI-R3> load usb 0:1 $loadaddr bpi-r3_emmc_2024.04_fip.bin 276781 bytes read in 28 ms (9.4 MiB/s) BPI-R3> mtd write spi-nand0 $loadaddr 0x380000 0x200000 jedec_spi_nor spi_nor@0: unrecognized JEDEC id bytes: ff, ef, aa Writing 2097152 byte(s) (1024 page(s)) at offset 0x00380000 BPI-R3>
then change bootstrap pins to 1010 to boot from spi-nand with emmc access
nor flash
MT7986> sf probe SF: Detected w25q256 with page size 256 Bytes, erase size 4 KiB, total 32 MiB MT7986> sf erase 0 0x180000 SF: 1572864 bytes @ 0x0 Erased: OK MT7986> fatload usb 0:1 ${loadaddr} 2023.04/bpi-r3_nor_bl2.img 202160 bytes read in 21 ms (9.2 MiB/s) MT7986> sf write ${loadaddr} 0 0x40000 device 0 offset 0x0, size 0x40000 SF: 262144 bytes @ 0x0 Written: OK MT7986> fatload usb 0:1 ${loadaddr} 2023.04/bpi-r3_nor_fip.bin 255509 bytes read in 25 ms (9.7 MiB/s) MT7986> sf write ${loadaddr} 0x100000 0x80000 device 0 offset 0x100000, size 0x80000 SF: 524288 bytes @ 0x100000 Written: OK
if you get this error on bootup
NOTICE: BL31: Built : 20:24:28, Apr 5 2023 No valid device tree binary found at 0000000041e92f20 initcall sequence 0000000041e621a8 failed at call 0000000041e57800 (err=-2) ### ERROR ### Please RESET the board ###
you need to compress bl31
xz -f -e -k -9 -C crc32 u-boot.bin
and use the resulting u-boot.bin.xz as BL33
kernel/initrd
currently untested…
label = "recovery"; //initrd max 10MB reg = <0x180000 0xa80000>; label = "fit"; //kernel max 20MB reg = <0xc00000 0x1400000>;
MT7986> sf probe SF: Detected w25q256 with page size 256 Bytes, erase size 4 KiB, total 32 MiB MT7986> sf erase 0x180000 0xa80000 SF: 11010048 bytes @ 0x180000 Erased: OK MT7986> fatload usb 0:1 ${loadaddr} rootfs_bpi-r3.cpio.zst 9501203 bytes read in 798 ms (11.4 MiB/s) MT7986> sf write ${loadaddr} 0x180000 ${filesize} device 0 offset 0x180000, size 0x90fa13 SF: 9501203 bytes @ 0x180000 Written: OK MT7986> sf erase 0xc00000 0x1400000 SF: 20971520 bytes @ 0xc00000 Erased: OK MT7986> fatload usb 0:1 ${loadaddr} bpi-r3-6.1.itb 8424540 bytes read in 708 ms (11.3 MiB/s) MT7986> sf write ${loadaddr} 0xc00000 ${filesize} device 0 offset 0xc00000, size 0x808c5c SF: 8424540 bytes @ 0xc00000 Written: OK
loading it:
MT7986> setenv useinitrd 'setenv root "/dev/ram0 rw";setenv bootopts "${bootopts} initrd=${rdaddr},20M";' MT7986> sf read ${rdaddr} 0x180000 0xa80000 device 0 offset 0x180000, size 0xa80000 SF: 11010048 bytes @ 0x180000 Read: OK MT7986> sf read ${kaddr} 0xc00000 0x1400000 device 0 offset 0xc00000, size 0x1400000 SF: 20971520 bytes @ 0xc00000 Read: OK MT7986> setenv bootnor 'run useinitrd;run setbootconf; run buildargs; bootm ${kaddr}${bootconf};' MT7986> run bootnor
usb
BPI-R3> usb start starting USB... Bus xhci@11200000: xhci-mtk xhci@11200000: hcd: 0x0000000011200000, ippc: 0x0000 xhci-mtk xhci@11200000: ports disabled mask: u3p-0x0, u2p-0x0 xhci-mtk xhci@11200000: u2p:2, u3p:1 Register 300010f NbrPorts 3 Starting the controller USB XHCI 1.10 scanning bus xhci@11200000 for devices... 3 USB Device(s) found scanning usb for storage devices... 1 Storage Device(s) found BPI-R3> ls usb 0:1 efi/ 1023582 ramdisk.img 1365903 initrd.img 2956137 install.img 456908800 system.sfs 4767728 kernel 5 file(s), 1 dir(s) BPI-R3>
from testing usb-sockets near gpio-header (connected to an usb2-hub):
BPI-R3> usb tree USB device tree: 1 Hub (5 Gb/s, 0mA) | U-Boot XHCI Host Controller | +-2 Hub (480 Mb/s, 100mA) | USB 2.0 Hub | +-3 Mass Storage (480 Mb/s, 200mA) USB Flash Disk 906B030002F4
writing emmc
newest atf for mediatek needs gpt with fip partition so it must be created first (maybe copy first 1M from sdcard to emmc).
get emmc/gpt information:
load gpt file and flash it
BPI-R3> usb start starting USB... Bus xhci@11200000: xhci-mtk xhci@11200000: hcd: 0x0000000011200000, ippc: 0x0000 xhci-mtk xhci@11200000: ports disabled mask: u3p-0x0, u2p-0x0 xhci-mtk xhci@11200000: u2p:2, u3p:1 Register 300010f NbrPorts 3 Starting the controller USB XHCI 1.10 scanning bus xhci@11200000 for devices... 3 USB Device(s) found scanning usb for storage devices... 1 Storage Device(s) found BPI-R3> ls usb 0:1 efi/ 1365903 initrd.img 2956137 install.img 4767728 kernel 606240 uboot_mtk_emmc_usb.bin 217712 bl2_snand_usb.img 631937 fip_snand_usb.bin 634345 fip_emmc_usb.bin 601344 uboot_emmc_usb.bin 17408 gpt_emmc_100m6g.img 200072 bl2_emmc_usb.img 17032308 bpi-r3.itb 11 file(s), 1 dir(s) BPI-R3> fatload usb 0:1 $loadaddr gpt_emmc_100m6g.img 17408 bytes read in 4 ms (4.2 MiB/s) BPI-R3> mmc erase 0x0 0x400;mmc write ${loadaddr} 0x0 0x400 MMC erase: dev # 0, block # 0, count 1024 ... 1024 blocks erased: OK MMC write: dev # 0, block # 0, count 1024 ... 1024 blocks written: OK
verify gpt is changed (kernel is now 100MiB - 32 before, rootfs 6144MiB - 256 before):
now flash bl2 to boot0 block and fip to fip partition
short way using my environment:
run useusb #to set device to usb and partition to 0:1 if you want to load uboot-files from there MT7986> setenv bl2file 2023.04/bpi-r3_emmc_bl2.img MT7986> setenv fipfile 2023.04/bpi-r3_emmc_fip.bin MT7986> run wremmc bl2file=2023.04/bpi-r3_emmc_bl2.img 195976 bytes read in 20 ms (9.3 MiB/s) MMC erase: dev # 0, block # 0, count 1024 ... 1024 blocks erased: OK MMC write: dev # 0, block # 0, count 1024 ... 1024 blocks written: OK fipfile=2023.04/bpi-r3_emmc_fip.bin 645001 bytes read in 58 ms (10.6 MiB/s) MMC erase: dev # 0, block # 13312, count 4096 ... 4096 blocks erased: OK MMC write: dev # 0, block # 13312, count 4096 ... 4096 blocks written: OK
manual way:
If boot from emmc does not work,maybe bootbus needs to be changed to 0:
mmc bootbus 0 0 0 0
instead of writing the gpt image file you can bootup a linux with initrd
you get all files here: https://drive.google.com/drive/folders/1ZsJ2jsOieg_6HM4LHWUimROX5p5Kx7vo?usp=share_link
BPI-R3> run useusb BPI-R3> setenv initrd rootfs.cpio.zst BPI-R3> setenv fit bpi-r3.itb BPI-R3> run newboot
and create gpt like i do it for sdcard, original gpt uses same values for partitions and use a partition named gpt (0..33) instead of bl2 (34..8191)
sudo sgdisk -o ${LDEV} #sudo sgdisk -a 1 -n 1:34:8191 -A 1:set:2 -t 1:8300 -c 1:"bl2" ${LDEV} #sdcard only sudo sgdisk -a 1 -n 1:0:33 -A 1:set:2 -t 1:8300 -c 1:"gpt" ${LDEV} #emmc only sudo sgdisk -a 1 -n 2:8192:9215 -t 2:8300 -c 2:"u-boot-env" ${LDEV} sudo sgdisk -a 1 -n 3:9216:13311 -t 3:8300 -c 3:"factory" ${LDEV} sudo sgdisk -a 1 -n 4:13312:17407 -t 4:8300 -c 4:"fip" ${LDEV} sudo sgdisk -a 1024 -n 5:17408:${bootend} -t 5:8300 -c 5:"boot" ${LDEV} sudo sgdisk -a 1024 -n 6:${rootstart}:${rootend} -t 6:8300 -c 6:"rootfs" ${LDEV}
chainload uboot
u-boot.bin (without mtk header and not fip) can be chainloaded from another uboot for testing uboot-features without flashing
BPI-R3> fatload usb 0:1 $loadaddr uboot_emmc_usb.bin 601344 bytes read in 52 ms (11 MiB/s) BPI-R3> go $loadaddr ## Starting application at 0x46000000 ... U-Boot 2022.04-00557-g726479add2f1 (Jul 05 2022 - 18:14:31 +0200)