;;
esac
;;
-xiaomi,redmi-router-ax6000)
+xiaomi,redmi-router-ax6000|\
+xiaomi,redmi-router-ax6000-stock)
ubootenv_add_uci_config "/dev/mtd1" "0x0" "0x10000" "0x20000"
ubootenv_add_uci_sys_config "/dev/mtd2" "0x0" "0x10000" "0x20000"
;;
--- /dev/null
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+
+/dts-v1/;
+#include "mt7986a-xiaomi-redmi-router-ax6000.dtsi"
+
+/ {
+ model = "Xiaomi Redmi Router AX6000 (stock layout)";
+ compatible = "xiaomi,redmi-router-ax6000-stock", "mediatek,mt7986a";
+};
+
+&partitions {
+ partition@600000 {
+ label = "ubi_kernel";
+ reg = <0x600000 0x1e00000>;
+ };
+
+ partition@2400000 {
+ label = "ubi";
+ reg = <0x2400000 0x5000000>;
+ };
+};
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
/dts-v1/;
-#include <dt-bindings/input/input.h>
-#include <dt-bindings/gpio/gpio.h>
-#include <dt-bindings/leds/common.h>
-
-#include "mt7986a.dtsi"
+#include "mt7986a-xiaomi-redmi-router-ax6000.dtsi"
/ {
model = "Xiaomi Redmi Router AX6000";
compatible = "xiaomi,redmi-router-ax6000", "mediatek,mt7986a";
-
- aliases {
- serial0 = &uart0;
- led-boot = &led_status_rgb;
- led-failsafe = &led_status_rgb;
- led-running = &led_status_rgb;
- led-upgrade = &led_status_rgb;
- };
-
- chosen {
- stdout-path = "serial0:115200n8";
- };
-
- memory {
- reg = <0 0x40000000 0 0x20000000>;
- };
-
- keys {
- compatible = "gpio-keys";
-
- reset {
- label = "reset";
- gpios = <&pio 9 GPIO_ACTIVE_LOW>;
- linux,code = <KEY_RESTART>;
- };
-
- mesh {
- label = "mesh";
- gpios = <&pio 10 GPIO_ACTIVE_LOW>;
- linux,code = <BTN_9>;
- linux,input-type = <EV_SW>;
- };
- };
-};
-
-ð {
- status = "okay";
-
- gmac0: mac@0 {
- compatible = "mediatek,eth-mac";
- reg = <0>;
- phy-mode = "2500base-x";
-
- nvmem-cells = <&macaddr_factory_4>;
- nvmem-cell-names = "mac-address";
- mac-address-increment = <(-1)>;
-
- fixed-link {
- speed = <2500>;
- full-duplex;
- pause;
- };
- };
-
- mdio: mdio-bus {
- #address-cells = <1>;
- #size-cells = <0>;
- };
-};
-
-&mdio {
- switch: switch@0 {
- compatible = "mediatek,mt7531";
- reg = <31>;
- reset-gpios = <&pio 5 GPIO_ACTIVE_HIGH>;
- interrupt-controller;
- #interrupt-cells = <1>;
- interrupt-parent = <&pio>;
- interrupts = <66 IRQ_TYPE_LEVEL_HIGH>;
- };
};
-&pio {
- spi_flash_pins: spi-flash-pins-33-to-38 {
- mux {
- function = "spi";
- groups = "spi0", "spi0_wp_hold";
- };
- conf-pu {
- pins = "SPI2_CS", "SPI2_HOLD", "SPI2_WP";
- drive-strength = <8>;
- mediatek,pull-up-adv = <0>; /* bias-disable */
- };
- conf-pd {
- pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO";
- drive-strength = <8>;
- mediatek,pull-down-adv = <0>; /* bias-disable */
- };
- };
-
- spi_led_pins: spic-pins-29-to-32 {
- mux {
- function = "spi";
- groups = "spi1_2";
- };
+&partitions {
+ /* ubi partition is the result of squashing
+ * consecutive stock partitions:
+ * - ubi
+ * - ubi1
+ * - overlay
+ */
+ partition@600000 {
+ label = "ubi";
+ reg = <0x600000 0x6e00000>;
};
- wf_2g_5g_pins: wf_2g_5g-pins {
- mux {
- function = "wifi";
- groups = "wf_2g", "wf_5g";
- };
- conf {
- pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4",
- "WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6",
- "WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10",
- "WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1",
- "WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0",
- "WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8",
- "WF1_TOP_CLK", "WF1_TOP_DATA";
- drive-strength = <4>;
- };
- };
-};
-
-&spi0 {
- pinctrl-names = "default";
- pinctrl-0 = <&spi_flash_pins>;
- cs-gpios = <0>, <0>;
- status = "okay";
-
- flash@0 {
- compatible = "spi-nand";
- #address-cells = <1>;
- #size-cells = <1>;
- reg = <0>;
-
- mediatek,nmbm;
- mediatek,bmt-max-ratio = <1>;
- mediatek,bmt-max-reserved-blocks = <64>;
-
- spi-max-frequency = <20000000>;
- spi-tx-buswidth = <4>;
- spi-rx-buswidth = <4>;
-
- partitions {
- compatible = "fixed-partitions";
- #address-cells = <1>;
- #size-cells = <1>;
-
- partition@0 {
- label = "BL2";
- reg = <0x0 0x100000>;
- read-only;
- };
-
- partition@100000 {
- label = "Nvram";
- reg = <0x100000 0x40000>;
- };
-
- partition@140000 {
- label = "Bdata";
- reg = <0x140000 0x40000>;
- };
-
- factory: partition@180000 {
- label = "Factory";
- reg = <0x180000 0x200000>;
- read-only;
-
- compatible = "nvmem-cells";
- #address-cells = <1>;
- #size-cells = <1>;
-
- macaddr_factory_4: macaddr@4 {
- reg = <0x4 0x6>;
- };
- };
-
- partition@380000 {
- label = "FIP";
- reg = <0x380000 0x200000>;
- read-only;
- };
-
- partition@580000 {
- label = "crash";
- reg = <0x580000 0x40000>;
- read-only;
- };
-
- partition@5c0000 {
- label = "crash_log";
- reg = <0x5c0000 0x40000>;
- read-only;
- };
-
- /* ubi partition is the result of squashing
- * consecutive stock partitions:
- * - ubi
- * - ubi1
- * - overlay
- */
- partition@600000 {
- label = "ubi";
- reg = <0x600000 0x6e00000>;
- };
-
- /* last 12 MiB is reserved for NMBM bad block table */
- };
- };
-};
-
-&spi1 {
- pinctrl-names = "default";
- pinctrl-0 = <&spi_led_pins>;
- status = "okay";
-
- ws2812b@0 {
- #address-cells = <1>;
- #size-cells = <0>;
- compatible = "worldsemi,ws2812b";
- reg = <0>;
- spi-max-frequency = <3000000>;
-
- led_status_rgb: led@0 {
- reg = <0>;
- label = "rgb:status";
- color-index = <LED_COLOR_ID_RED LED_COLOR_ID_GREEN LED_COLOR_ID_BLUE>;
- };
-
- led_network_rgb: led@1 {
- reg = <1>;
- label = "rgb:network";
- color-index = <LED_COLOR_ID_RED LED_COLOR_ID_GREEN LED_COLOR_ID_BLUE>;
- };
- };
-};
-
-&switch {
- ports {
- #address-cells = <1>;
- #size-cells = <0>;
-
- port@1 {
- reg = <1>;
- label = "lan4";
- };
-
- port@2 {
- reg = <2>;
- label = "lan3";
- };
-
- port@3 {
- reg = <3>;
- label = "lan2";
- };
-
- port@4 {
- reg = <4>;
- label = "wan";
- };
-
- port@6 {
- reg = <6>;
- label = "cpu";
- ethernet = <&gmac0>;
- phy-mode = "2500base-x";
-
- fixed-link {
- speed = <2500>;
- full-duplex;
- pause;
- };
- };
- };
-};
-
-&wmac {
- status = "okay";
- pinctrl-names = "default";
- pinctrl-0 = <&wf_2g_5g_pins>;
-
- mediatek,mtd-eeprom = <&factory 0x0>;
-};
-
-&uart0 {
- status = "okay";
+ /* last 12 MiB is reserved for NMBM bad block table */
};
--- /dev/null
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+
+/dts-v1/;
+#include <dt-bindings/input/input.h>
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/leds/common.h>
+
+#include "mt7986a.dtsi"
+
+/ {
+ aliases {
+ serial0 = &uart0;
+ led-boot = &led_status_rgb;
+ led-failsafe = &led_status_rgb;
+ led-running = &led_status_rgb;
+ led-upgrade = &led_status_rgb;
+ };
+
+ chosen {
+ stdout-path = "serial0:115200n8";
+ };
+
+ memory {
+ reg = <0 0x40000000 0 0x20000000>;
+ };
+
+ keys {
+ compatible = "gpio-keys";
+
+ reset {
+ label = "reset";
+ gpios = <&pio 9 GPIO_ACTIVE_LOW>;
+ linux,code = <KEY_RESTART>;
+ };
+
+ mesh {
+ label = "mesh";
+ gpios = <&pio 10 GPIO_ACTIVE_LOW>;
+ linux,code = <BTN_9>;
+ linux,input-type = <EV_SW>;
+ };
+ };
+};
+
+ð {
+ status = "okay";
+
+ gmac0: mac@0 {
+ compatible = "mediatek,eth-mac";
+ reg = <0>;
+ phy-mode = "2500base-x";
+
+ nvmem-cells = <&macaddr_factory_4>;
+ nvmem-cell-names = "mac-address";
+ mac-address-increment = <(-1)>;
+
+ fixed-link {
+ speed = <2500>;
+ full-duplex;
+ pause;
+ };
+ };
+
+ mdio: mdio-bus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ };
+};
+
+&mdio {
+ switch: switch@0 {
+ compatible = "mediatek,mt7531";
+ reg = <31>;
+ reset-gpios = <&pio 5 GPIO_ACTIVE_HIGH>;
+ interrupt-controller;
+ #interrupt-cells = <1>;
+ interrupt-parent = <&pio>;
+ interrupts = <66 IRQ_TYPE_LEVEL_HIGH>;
+ };
+};
+
+&pio {
+ spi_flash_pins: spi-flash-pins-33-to-38 {
+ mux {
+ function = "spi";
+ groups = "spi0", "spi0_wp_hold";
+ };
+ conf-pu {
+ pins = "SPI2_CS", "SPI2_HOLD", "SPI2_WP";
+ drive-strength = <8>;
+ mediatek,pull-up-adv = <0>; /* bias-disable */
+ };
+ conf-pd {
+ pins = "SPI2_CLK", "SPI2_MOSI", "SPI2_MISO";
+ drive-strength = <8>;
+ mediatek,pull-down-adv = <0>; /* bias-disable */
+ };
+ };
+
+ spi_led_pins: spic-pins-29-to-32 {
+ mux {
+ function = "spi";
+ groups = "spi1_2";
+ };
+ };
+
+ wf_2g_5g_pins: wf_2g_5g-pins {
+ mux {
+ function = "wifi";
+ groups = "wf_2g", "wf_5g";
+ };
+ conf {
+ pins = "WF0_HB1", "WF0_HB2", "WF0_HB3", "WF0_HB4",
+ "WF0_HB0", "WF0_HB0_B", "WF0_HB5", "WF0_HB6",
+ "WF0_HB7", "WF0_HB8", "WF0_HB9", "WF0_HB10",
+ "WF0_TOP_CLK", "WF0_TOP_DATA", "WF1_HB1",
+ "WF1_HB2", "WF1_HB3", "WF1_HB4", "WF1_HB0",
+ "WF1_HB5", "WF1_HB6", "WF1_HB7", "WF1_HB8",
+ "WF1_TOP_CLK", "WF1_TOP_DATA";
+ drive-strength = <4>;
+ };
+ };
+};
+
+&spi0 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&spi_flash_pins>;
+ cs-gpios = <0>, <0>;
+ status = "okay";
+
+ flash@0 {
+ compatible = "spi-nand";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ reg = <0>;
+
+ mediatek,nmbm;
+ mediatek,bmt-max-ratio = <1>;
+ mediatek,bmt-max-reserved-blocks = <64>;
+
+ spi-max-frequency = <20000000>;
+ spi-tx-buswidth = <4>;
+ spi-rx-buswidth = <4>;
+
+ partitions: partitions {
+ compatible = "fixed-partitions";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ partition@0 {
+ label = "BL2";
+ reg = <0x0 0x100000>;
+ read-only;
+ };
+
+ partition@100000 {
+ label = "Nvram";
+ reg = <0x100000 0x40000>;
+ };
+
+ partition@140000 {
+ label = "Bdata";
+ reg = <0x140000 0x40000>;
+ };
+
+ factory: partition@180000 {
+ label = "Factory";
+ reg = <0x180000 0x200000>;
+ read-only;
+
+ compatible = "nvmem-cells";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ macaddr_factory_4: macaddr@4 {
+ reg = <0x4 0x6>;
+ };
+ };
+
+ partition@380000 {
+ label = "FIP";
+ reg = <0x380000 0x200000>;
+ read-only;
+ };
+
+ partition@580000 {
+ label = "crash";
+ reg = <0x580000 0x40000>;
+ read-only;
+ };
+
+ partition@5c0000 {
+ label = "crash_log";
+ reg = <0x5c0000 0x40000>;
+ read-only;
+ };
+ };
+ };
+};
+
+&spi1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&spi_led_pins>;
+ status = "okay";
+
+ ws2812b@0 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ compatible = "worldsemi,ws2812b";
+ reg = <0>;
+ spi-max-frequency = <3000000>;
+
+ led_status_rgb: led@0 {
+ reg = <0>;
+ label = "rgb:status";
+ color-index = <LED_COLOR_ID_RED LED_COLOR_ID_GREEN LED_COLOR_ID_BLUE>;
+ };
+
+ led_network_rgb: led@1 {
+ reg = <1>;
+ label = "rgb:network";
+ color-index = <LED_COLOR_ID_RED LED_COLOR_ID_GREEN LED_COLOR_ID_BLUE>;
+ };
+ };
+};
+
+&switch {
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@1 {
+ reg = <1>;
+ label = "lan4";
+ };
+
+ port@2 {
+ reg = <2>;
+ label = "lan3";
+ };
+
+ port@3 {
+ reg = <3>;
+ label = "lan2";
+ };
+
+ port@4 {
+ reg = <4>;
+ label = "wan";
+ };
+
+ port@6 {
+ reg = <6>;
+ label = "cpu";
+ ethernet = <&gmac0>;
+ phy-mode = "2500base-x";
+
+ fixed-link {
+ speed = <2500>;
+ full-duplex;
+ pause;
+ };
+ };
+ };
+};
+
+&wmac {
+ status = "okay";
+ pinctrl-names = "default";
+ pinctrl-0 = <&wf_2g_5g_pins>;
+
+ mediatek,mtd-eeprom = <&factory 0x0>;
+};
+
+&uart0 {
+ status = "okay";
+};
board_config_update
case $board in
-xiaomi,redmi-router-ax6000)
+xiaomi,redmi-router-ax6000|\
+xiaomi,redmi-router-ax6000-stock)
ucidef_set_led_netdev "wan" "wan" "rgb:network" "wan"
;;
esac
ucidef_set_interfaces_lan_wan "lan1 lan2 lan3 lan4 sfp2" "eth1 wan"
ucidef_set_interface_macaddr "wan" "$(macaddr_add $(cat /sys/class/net/eth0/address) 1)"
;;
- xiaomi,redmi-router-ax6000)
+ xiaomi,redmi-router-ax6000|\
+ xiaomi,redmi-router-ax6000-stock)
ucidef_set_interfaces_lan_wan "lan2 lan3 lan4" wan
;;
*)
local label_mac=""
case $board in
- xiaomi,redmi-router-ax6000)
+ xiaomi,redmi-router-ax6000|\
+ xiaomi,redmi-router-ax6000-stock)
wan_mac=$(mtd_get_mac_ascii Bdata ethaddr_wan)
label_mac=$wan_mac
;;
REQUIRE_IMAGE_METADATA=1
+redmi_ax6000_initial_setup()
+{
+ # initialize UBI and setup uboot-env if it's running on initramfs
+ [ "$(rootfs_type)" = "tmpfs" ] || return 0
+
+ local mtdnum="$( find_mtd_index ubi )"
+ if [ ! "$mtdnum" ]; then
+ echo "unable to find mtd partition ubi"
+ return 1
+ fi
+
+ local kern_mtdnum="$( find_mtd_index ubi_kernel )"
+ if [ ! "$kern_mtdnum" ]; then
+ echo "unable to find mtd partition ubi_kernel"
+ return 1
+ fi
+
+ ubidetach -m "$mtdnum"
+ ubiformat /dev/mtd$mtdnum -y
+
+ ubidetach -m "$kern_mtdnum"
+ ubiformat /dev/mtd$kern_mtdnum -y
+
+ if ! fw_printenv -n flag_try_sys2_failed &>/dev/null; then
+ echo "failed to access u-boot-env. skip env setup."
+ return 0
+ fi
+
+ fw_setenv boot_wait on
+ fw_setenv uart_en 1
+ fw_setenv flag_boot_rootfs 0
+ fw_setenv flag_last_success 1
+ fw_setenv flag_boot_success 1
+ fw_setenv flag_try_sys1_failed 8
+ fw_setenv flag_try_sys2_failed 8
+ fw_setenv mtdparts "nmbm0:1024k(bl2),256k(Nvram),256k(Bdata),2048k(factory),2048k(fip),256k(crash),256k(crash_log),30720k(ubi),30720k(ubi1),51200k(overlay)"
+}
+
platform_do_upgrade() {
local board=$(board_name)
;;
esac
;;
+ xiaomi,redmi-router-ax6000-stock)
+ CI_KERN_UBIPART=ubi_kernel
+ CI_ROOT_UBIPART=ubi
+ nand_do_upgrade "$1"
+ ;;
*)
nand_do_upgrade "$1"
;;
;;
esac
}
+
+platform_pre_upgrade() {
+ local board=$(board_name)
+
+ case "$board" in
+ xiaomi,redmi-router-ax6000-stock)
+ redmi_ax6000_initial_setup
+ ;;
+ esac
+}
IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
endef
TARGET_DEVICES += xiaomi_redmi-router-ax6000
+
+define Device/xiaomi_redmi-router-ax6000-stock
+ DEVICE_VENDOR := Xiaomi
+ DEVICE_MODEL := Redmi Router AX6000 (stock layout)
+ DEVICE_DTS := mt7986a-xiaomi-redmi-router-ax6000-stock
+ DEVICE_DTS_DIR := ../dts
+ DEVICE_PACKAGES := kmod-leds-ws2812b
+ KERNEL_LOADADDR := 0x48000000
+ UBINIZE_OPTS := -E 5
+ BLOCKSIZE := 128k
+ PAGESIZE := 2048
+ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),)
+ ARTIFACTS := initramfs-factory.ubi
+ ARTIFACT/initramfs-factory.ubi := append-image-stage initramfs-kernel.bin | ubinize-kernel
+endif
+ IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
+endef
+TARGET_DEVICES += xiaomi_redmi-router-ax6000-stock