From dfa0a38d1f4d5bbac768569e3769ae4438a57e73 Mon Sep 17 00:00:00 2001 From: Daniel Golle Date: Sat, 27 Feb 2021 14:17:09 +0000 Subject: [PATCH] mediatek: rework support for BananaPi BPi-R64 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **What's new** * Bring support for the Bananapi BPi-R64 to the level desirable for a nice hackable routerboard. * Use ARM Trusted Firmware A from source. (goodbye binary preloader) * Use Das U-Boot from source. (see previous commit) * Assemble SD-card image using OpenWrt image-commands. (no gen_sd_cruz_foo.sh added, this is not Raspbian) * Updated kernel options to support root filesystem. * Updated DTS to match OpenWrt LAN ports, known LEDs, buttons, ... * Detect root device, handle sysupgrade, config restore, ... * Wire up (known) LEDs and buttons in OpenWrt-fashion. * Build one set of images from SD-card and eMMC. * Hopefully provide a good example of how things can be done right from scratch. **Installation and images** * Have an empty SD-card at hand * Write stuff to the card, as root (card device is /dev/mmcblkX) - write header, gpt, bl2, atf, u-boot and recovery kernel: `cat *bpi-r64-boot-sdcard.img *bpi-r64-initramfs-recovery.fit > /dev/mmcblkX` - rescan partitions: `blockdev --rereadpt /dev/mmcblkX` - write main system to production partition: `cat *bpi-r64-squashfs-sysupgrade.fit > /dev/mmcblkXp5` * Installation to eMMC works using SD-card bootloader via TFTP When running OpenWrt of SD-card, issue this to trigger installation to eMMC: `fw_setenv bootcmd run emmc_init` Be prepared to serve the content of bin/targets/mediatek/mt7622 on TFTP server address 192.168.1.254. **What's missing** * The red LED is always on, probably a hardware bug. * AHCI (probably needs DTS changes) * Ship SD-card image ready with every needed for eMMC install. * The eMMC has a second, currently unused boot partition. This would be ideal to store the WiFi EEPROM and Ethernet MAC address(es). @sinovoip ideas? Thanks to Thomas Hühn @thuehn for providing the hardware! Signed-off-by: Daniel Golle --- .../dts/mt7622-bananapi-bpi-r64-rootdisk.dts | 18 ----- .../mediatek/image/gen_mt7622_emmc_img.sh | 19 ------ target/linux/mediatek/image/mt7622.mk | 65 +++++++++++++------ .../mt7622/base-files/etc/board.d/02_network | 1 - .../mt7622/base-files/lib/upgrade/platform.sh | 63 ++++++++++++++---- target/linux/mediatek/mt7622/config-5.10 | 1 + target/linux/mediatek/mt7622/target.mk | 2 +- .../112-dts-fix-bpi64-lan-names.patch | 29 +++++++++ .../112-dts-fix-bpi64-leds-and-buttons.patch | 56 ++++++++++++++++ ...ek-Split-PCIe-node-for-MT2712-MT7622.patch | 2 +- 10 files changed, 183 insertions(+), 73 deletions(-) delete mode 100644 target/linux/mediatek/dts/mt7622-bananapi-bpi-r64-rootdisk.dts delete mode 100755 target/linux/mediatek/image/gen_mt7622_emmc_img.sh create mode 100644 target/linux/mediatek/patches-5.10/112-dts-fix-bpi64-lan-names.patch create mode 100644 target/linux/mediatek/patches-5.10/112-dts-fix-bpi64-leds-and-buttons.patch diff --git a/target/linux/mediatek/dts/mt7622-bananapi-bpi-r64-rootdisk.dts b/target/linux/mediatek/dts/mt7622-bananapi-bpi-r64-rootdisk.dts deleted file mode 100644 index 911b3dd5b4..0000000000 --- a/target/linux/mediatek/dts/mt7622-bananapi-bpi-r64-rootdisk.dts +++ /dev/null @@ -1,18 +0,0 @@ -// SPDX-License-Identifier: (GPL-2.0-only OR MIT) -/* - * Copyright (c) 2018 MediaTek Inc. - * Author: Ryder Lee - */ - -/dts-v1/; - -#include "mt7622-bananapi-bpi-r64.dts" -/ { - model = "Bananapi BPI-R64"; - compatible = "bananapi,bpi-r64-rootdisk", "mediatek,mt7622"; - - chosen { - stdout-path = "serial0:115200n8"; - bootargs = "earlycon=uart8250,mmio32,0x11002000 console=ttyS0,115200n1 swiotlb=512 root=/dev/mmcblk0p7 rootfstype=squashfs,f2fs"; - }; -}; diff --git a/target/linux/mediatek/image/gen_mt7622_emmc_img.sh b/target/linux/mediatek/image/gen_mt7622_emmc_img.sh deleted file mode 100755 index d74068c7b1..0000000000 --- a/target/linux/mediatek/image/gen_mt7622_emmc_img.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh - -OUTPUT_FILE=$1 -KERNEL_FILE=$2 -RECOVERY_FILE=$3 -ROOTFS_FILE=$4 - -BS=512 - -#RECOVERY_OFFSET= kernel size / BS = 20M / 512 (blocks) -RECOVERY_OFFSET=40960 - -#ROOTFS_OFFSET = RECOVERY_OFFSET + (RECOVERY_SIZE / BS) -# = 40960 + (10M / 512) (blocks) -ROOTFS_OFFSET=61440 -dd bs="$BS" of="$OUTPUT_FILE" if="$KERNEL_FILE" -dd bs="$BS" of="$OUTPUT_FILE" if="$RECOVERY_FILE" seek="$RECOVERY_OFFSET" -dd bs="$BS" of="$OUTPUT_FILE" if="$ROOTFS_FILE" seek="$ROOTFS_OFFSET" -dd if=/dev/zero of="$OUTPUT_FILE" bs=128k count=1 oflag=append conv=notrunc diff --git a/target/linux/mediatek/image/mt7622.mk b/target/linux/mediatek/image/mt7622.mk index e113939e17..3fe9700ae0 100644 --- a/target/linux/mediatek/image/mt7622.mk +++ b/target/linux/mediatek/image/mt7622.mk @@ -6,35 +6,58 @@ else KERNEL_LOADADDR := 0x44000000 endif +define Build/mmc-header + dd if=$(STAGING_DIR_IMAGE)/mt7622-header_$1.bin bs=512 count=1 of=$@ conv=notrunc +endef + define Build/bl2 - $(CP) $(STAGING_DIR_IMAGE)/mt7622-$1-bl2.img $@ + cat $(STAGING_DIR_IMAGE)/mt7622-$1-bl2.img >> $@ endef define Build/bl31-uboot - $(CP) $(STAGING_DIR_IMAGE)/mt7622_$1-u-boot.fip $@ + cat $(STAGING_DIR_IMAGE)/mt7622_$1-u-boot.fip >> $@ endef -define Device/bpi_bananapi-r64 - DEVICE_VENDOR := Bpi - DEVICE_MODEL := Banana Pi R64 +define Build/mt7622-gpt + ptgen -g -o $@ -h 4 -s 31 -a 1 -l 1024 -g \ + -t 0xef \ + $(if $(findstring sdmmc,$1), \ + -N bl2 -r -p 512k@512k \ + ) \ + -N fip -r -p 1M@2M \ + -N ubootenv -r -p 1M@4M \ + -N recovery -r -p 32M@6M \ + $(if $(findstring sdmmc,$1), \ + -t 0x2e -N production -p 216M@40M \ + ) \ + $(if $(findstring emmc,$1), \ + -t 0x2e -N production -p 980M@40M \ + ) +endef + +define Device/bananapi_bpi-r64 + DEVICE_VENDOR := Bananapi + DEVICE_MODEL := BPi-R64 DEVICE_DTS := mt7622-bananapi-bpi-r64 - SUPPORTED_DEVICES := bananapi,bpi-r64 - DEVICE_PACKAGES := kmod-usb-ohci kmod-usb2 kmod-usb3 kmod-ata-ahci-mtk + DEVICE_PACKAGES := kmod-usb-ohci kmod-usb2 kmod-usb3 kmod-ata-ahci-mtk \ + kmod-mt7615e kmod-mt7615-firmware \ + uboot-mt7622_bananapi_bpi-r64-emmc \ + uboot-mt7622_bananapi_bpi-r64-sdmmc \ + e2fsprogs mkf2fs f2fsck \ + kmod-nls-cp437 kmod-nls-iso8859-1 kmod-vfat blockd + ARTIFACTS := boot-sdcard.img boot-emmc.img bl2-emmc.bin bl31-emmc.bin header-emmc.bin + IMAGES := sysupgrade.itb + KERNEL_INITRAMFS_SUFFIX := -recovery.itb + ARTIFACT/boot-sdcard.img := mt7622-gpt sdmmc | mmc-header sdmmc | pad-to 512k | bl2 sdmmc-2ddr | pad-to 2M | bl31-uboot bananapi_bpi-r64-sdmmc | pad-to 6M + ARTIFACT/boot-emmc.img := mt7622-gpt emmc | mmc-header emmc | pad-to 2M | bl31-uboot bananapi_bpi-r64-emmc | pad-to 6M + ARTIFACT/header-emmc.bin := mt7622-gpt emmc | mmc-header emmc + ARTIFACT/bl31-emmc.bin := bl31-uboot bananapi_bpi-r64-emmc + ARTIFACT/bl2-emmc.bin := bl2 emmc-2ddr + KERNEL := kernel-bin | gzip + KERNEL_INITRAMFS := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb with-initrd | pad-to 128k + IMAGE/sysupgrade.itb := append-kernel | fit gzip $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb external-static-with-rootfs | append-metadata endef -TARGET_DEVICES += bpi_bananapi-r64 - -define Device/bpi_bananapi-r64-rootdisk - DEVICE_VENDOR := Bpi - DEVICE_MODEL := Banana Pi R64 (rootdisk) - DEVICE_DTS := mt7622-bananapi-bpi-r64-rootdisk - DEVICE_DTS_DIR := ../dts - SUPPORTED_DEVICES := bananapi,bpi-r64 - DEVICE_PACKAGES := kmod-fs-vfat kmod-nls-cp437 kmod-nls-iso8859-1 \ - mkf2fs e2fsprogs kmod-usb-ohci kmod-usb2 kmod-usb3 kmod-ata-ahci-mtk - IMAGES := sysupgrade-emmc.bin.gz - IMAGE/sysupgrade-emmc.bin.gz := sysupgrade-emmc | gzip | append-metadata -endef -TARGET_DEVICES += bpi_bananapi-r64-rootdisk +TARGET_DEVICES += bananapi_bpi-r64 define Device/elecom_wrc-2533gent DEVICE_VENDOR := Elecom diff --git a/target/linux/mediatek/mt7622/base-files/etc/board.d/02_network b/target/linux/mediatek/mt7622/base-files/etc/board.d/02_network index 1e4b1273a1..f0d28c9312 100755 --- a/target/linux/mediatek/mt7622/base-files/etc/board.d/02_network +++ b/target/linux/mediatek/mt7622/base-files/etc/board.d/02_network @@ -9,7 +9,6 @@ mediatek_setup_interfaces() local board="$1" case $board in - bananapi,bpi-r64-rootdisk|\ bananapi,bpi-r64|\ linksys,e8450|\ linksys,e8450-ubi|\ diff --git a/target/linux/mediatek/mt7622/base-files/lib/upgrade/platform.sh b/target/linux/mediatek/mt7622/base-files/lib/upgrade/platform.sh index 2cea6ce378..07efe13363 100755 --- a/target/linux/mediatek/mt7622/base-files/lib/upgrade/platform.sh +++ b/target/linux/mediatek/mt7622/base-files/lib/upgrade/platform.sh @@ -1,15 +1,52 @@ -RAMFS_COPY_BIN='fw_printenv fw_setenv' +RAMFS_COPY_BIN='fw_printenv fw_setenv blockdev' RAMFS_COPY_DATA='/etc/fw_env.config /var/lock/fw_printenv.lock' +get_cmdline_var() { + local var=$1 + local cmdlinevar tmp + local cmdline="$(cat /proc/cmdline)" + + for cmdlinevar in $cmdline; do + tmp=${cmdlinevar##${var}} + [ "=" = "${tmp:0:1}" ] && echo ${tmp:1} + done +} + +get_rootdev() { + local rootvol rootdev + rootvol=$(get_cmdline_var root) + rootvol=$(basename $rootvol) + [ -e /sys/class/block/$rootvol/partition ] || { + echo $rootvol + return + } + rootdev=$(busybox readlink -f /sys/class/block/$rootvol) + rootdev=$(basename ${rootdev%%/${rootvol}}) + [ -e /sys/class/block/$rootdev ] && echo $rootdev +} + +get_partition() { + for partname in /sys/class/block/$1/*/name; do + [ "$(cat ${partname})" = "$2" ] && { + basename ${partname%%/name} + break + } + done +} + platform_do_upgrade() { local board=$(board_name) local file_type=$(identify $1) case "$board" in - bananapi,bpi-r64-rootdisk) - #2097152=0x200000 is the offset in bytes from the start - #of eMMC and to the location of the kernel - get_image "$1" | dd of=/dev/mmcblk0 bs=2097152 seek=1 conv=fsync + bananapi,bpi-r64) + local rootdev=$(get_rootdev) + local fitpart=$(get_partition $rootdev production) + [ "$fitpart" ] || exit 1 + dd if=/dev/zero of=/dev/$fitpart bs=4096 count=1 2>/dev/null + blockdev --rereadpt /dev/$rootdev + get_image "$1" | dd of=/dev/$fitpart + echo $rootdev > /tmp/sysupgrade.rootdev ;; linksys,e8450-ubi|\ mediatek,mt7622,ubi) @@ -51,18 +88,20 @@ platform_check_image() { return 0 } -platform_copy_config_emmc() { - mkdir -p /recovery - mount -o rw,noatime /dev/mmcblk0p6 /recovery - cp -af "$UPGRADE_BACKUP" "/recovery/$BACKUP_FILE" +platform_copy_config_mmc() { + local rootdev=$(cat /tmp/sysupgrade.rootdev) + blockdev --rereadpt /dev/$rootdev + local datadev=$(get_partition $rootdev rootfs_data) + [ "$datadev" ] || echo "no rootfs_data partition, cannot keep configuration." >&2 + dd if="$UPGRADE_BACKUP" of=/dev/$datadev sync - umount /recovery + sleep 4 } platform_copy_config() { case "$(board_name)" in - bananapi,bpi-r64-rootdisk) - platform_copy_config_emmc + bananapi,bpi-r64) + platform_copy_config_mmc ;; esac } diff --git a/target/linux/mediatek/mt7622/config-5.10 b/target/linux/mediatek/mt7622/config-5.10 index e6283c37c9..dbc68ddf52 100644 --- a/target/linux/mediatek/mt7622/config-5.10 +++ b/target/linux/mediatek/mt7622/config-5.10 @@ -155,6 +155,7 @@ CONFIG_DTC=y CONFIG_DYNAMIC_DEBUG=y CONFIG_EDAC_SUPPORT=y CONFIG_EINT_MTK=y +CONFIG_EXT4_FS=y CONFIG_FIT_PARTITION=y CONFIG_FIXED_PHY=y CONFIG_FIX_EARLYCON_MEM=y diff --git a/target/linux/mediatek/mt7622/target.mk b/target/linux/mediatek/mt7622/target.mk index 24f7ee1ac4..f43a6c4bf4 100644 --- a/target/linux/mediatek/mt7622/target.mk +++ b/target/linux/mediatek/mt7622/target.mk @@ -2,7 +2,7 @@ ARCH:=aarch64 SUBTARGET:=mt7622 BOARDNAME:=MT7622 CPU_TYPE:=cortex-a53 -DEFAULT_PACKAGES += kmod-mt7615e kmod-mt7615-firmware wpad-basic-wolfssl +DEFAULT_PACKAGES += kmod-mt7615e kmod-mt7615-firmware wpad-basic-wolfssl blockdev uboot-envtools KERNELNAME:=Image dtbs KERNEL_PATCHVER:=5.10 diff --git a/target/linux/mediatek/patches-5.10/112-dts-fix-bpi64-lan-names.patch b/target/linux/mediatek/patches-5.10/112-dts-fix-bpi64-lan-names.patch new file mode 100644 index 0000000000..55c84812d0 --- /dev/null +++ b/target/linux/mediatek/patches-5.10/112-dts-fix-bpi64-lan-names.patch @@ -0,0 +1,29 @@ +--- a/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts ++++ b/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts +@@ -160,22 +160,22 @@ + + port@1 { + reg = <1>; +- label = "lan0"; ++ label = "lan1"; + }; + + port@2 { + reg = <2>; +- label = "lan1"; ++ label = "lan2"; + }; + + port@3 { + reg = <3>; +- label = "lan2"; ++ label = "lan3"; + }; + + port@4 { + reg = <4>; +- label = "lan3"; ++ label = "lan4"; + }; + + port@6 { diff --git a/target/linux/mediatek/patches-5.10/112-dts-fix-bpi64-leds-and-buttons.patch b/target/linux/mediatek/patches-5.10/112-dts-fix-bpi64-leds-and-buttons.patch new file mode 100644 index 0000000000..8b6d3d4934 --- /dev/null +++ b/target/linux/mediatek/patches-5.10/112-dts-fix-bpi64-leds-and-buttons.patch @@ -0,0 +1,56 @@ +--- a/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts ++++ b/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts +@@ -18,6 +18,10 @@ + + aliases { + serial0 = &uart0; ++ led-boot = &led_system_green; ++ led-failsafe = &led_system_blue; ++ led-running = &led_system_green; ++ led-upgrade = &led_system_blue; + }; + + chosen { +@@ -41,8 +45,8 @@ + compatible = "gpio-keys"; + + factory { +- label = "factory"; +- linux,code = ; ++ label = "reset"; ++ linux,code = ; + gpios = <&pio 0 GPIO_ACTIVE_HIGH>; + }; + +@@ -56,17 +60,25 @@ + leds { + compatible = "gpio-leds"; + +- green { +- label = "bpi-r64:pio:green"; +- gpios = <&pio 89 GPIO_ACTIVE_HIGH>; ++ led_system_blue: blue { ++ label = "bpi-r64:pio:blue"; ++ gpios = <&pio 85 GPIO_ACTIVE_LOW>; + default-state = "off"; + }; + +- red { +- label = "bpi-r64:pio:red"; +- gpios = <&pio 88 GPIO_ACTIVE_HIGH>; ++ led_system_green: green { ++ label = "bpi-r64:pio:green"; ++ gpios = <&pio 89 GPIO_ACTIVE_HIGH>; + default-state = "off"; + }; ++ ++/* ++ * red { ++ * label = "bpi-r64:pio:red"; ++ * gpios = <&pio 88 GPIO_ACTIVE_HIGH>; ++ * default-state = "off"; ++ * }; ++ */ + }; + + memory { diff --git a/target/linux/mediatek/patches-5.10/602-arm64-dts-mediatek-Split-PCIe-node-for-MT2712-MT7622.patch b/target/linux/mediatek/patches-5.10/602-arm64-dts-mediatek-Split-PCIe-node-for-MT2712-MT7622.patch index fa4a6ce2db..a680cf0149 100644 --- a/target/linux/mediatek/patches-5.10/602-arm64-dts-mediatek-Split-PCIe-node-for-MT2712-MT7622.patch +++ b/target/linux/mediatek/patches-5.10/602-arm64-dts-mediatek-Split-PCIe-node-for-MT2712-MT7622.patch @@ -253,7 +253,7 @@ Signed-off-by: chuanjia.liu #interrupt-cells = <1>; --- a/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts +++ b/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts -@@ -257,18 +257,16 @@ +@@ -269,18 +269,16 @@ }; };