[PATCH 2/2] ipq40xx: add support for eero Cento (J010001)

Robert Marko robimarko at gmail.com
Fri Jun 16 02:03:56 PDT 2023


On 17. 05. 2023. 19:47, Connor Northway wrote:
> development/internal name: Cento
> public name: eero (2nd-gen)
> model number: J010001
>
> Hardware Info:
>
>      SoC                 : Qualcomm IPQ4019
>      RAM                 : 512 MB (Hynix NT5CC256M16ER-EK)
>      SPI Flash           : 8 MB (Winbond W25Q64JVSS)
>      eMMC Flash          : 4 GB (Kingston EMMC04G-M627)
>      Wi-Fi               : 2.4 Ghz 2x2 802.11n (IPQ4019)
>      Wi-Fi               : 5 Ghz 2x2 802.11ac (IPQ4019)
>      Ethernet            : 2x 10/100/1000
>      Bluetooth           : 5.0 / BLE (Cypress CYW20704)
>      RGBW LED Controller : Texas Instruments LP5562
>      Buttons             : 1x Reset (bottom of device)
>      UART & SPI header   : see below
>      Power & USB 2       : USB Type-C, requires 15W 5V/3A
>
> Stock Firmware Layout:
>
>      The SPI flash stores U-Boot, U-Boot environment, hardware
>      calibration, and eero-specific information (keys, serial number,
>      MAC address, etc).
>
>      The eMMC is partitioned into an A/B layout with two sets of an ext2
>      kernel and ext4 rootfs partition, plus one cache partition.
>
> MAC Address assignment:
>
>      One base MAC address is stored in SPI flash, with a space of 32
>      allocated. We follow stock layout, though stock FW also uses higher
>      addresses for routing / mesh applications.
>
>      Base / WAN : 48:dd:0c:**:**:xx
>      LAN        : 48:dd:0c:**:**:xx + 1
>      Bluetooth  : 48:dd:0c:**:**:xx + 2
>      Wi-Fi 1    : 48:dd:0c:**:**:xx + 3
>      Wi-Fi 2    : 48:dd:0c:**:**:xx + 4
>
> Other OpenWrt details:
>
>      RGBW LED has been configured to the following:
>        Red: Failsafe
>        Green: Running
>        Blue: Upgrade
>        White: Boot
>
>      Ethernet ports are not labeled. Default config when viewed from
>      back: right port is WAN, left port is LAN.
>
> UART/SPI Header:
>
>      2x5 1.27mm unpopulated SMT header labeled "J2".
>      Silkscreen dot marks pin 1; pins 2, 9, and 10 labeled with number.
>
>      Layout:
>
>          SPI cpu bypass --| 1  2 |-- SPI /CS
>                 SPI CLK --| 3  4 |-- SPI DI
>                  SPI DO --| 5  6 |-- GND
>                    ???? --| 7  8 |-- 3v3
>                 UART RX --| 9 10 |-- UART TX
>
>      To access the SPI flash chip, pull pin 1 high (connect to 3v3)
>      before applying power through USB. This will disconnect the SPI
>      lines from the CPU and allow accessing the SPI bus without
>      contention. As always, do not connect external power to 3v3!
>
>      UART settings: 115200 8n1
>
>      Logic levels for UART and SPI are 3.3V.
>
> OpenWrt Installation:
>
>      Unfortunately, eero has configured U-Boot to autoboot with no delay
>      and no way to abort boot. There does not appear to be any available
>      method to boot from an external source without modifications.
>
>      To change the bootdelay variable, editing the SPI flash contents
>      directly is required:
>      - Use an SPI programmer to make a backup of the flash
>      - Locate the APPSBLENV partition and modify the environment to have
>        a non-zero bootdelay value in both locations
>      - Update the leading CRC32 checksums
>      - Flash image back to the device and reboot
>
>      Details of environment layout:
>          APPSBLENV is at 0x210000. It contains two redundant copies of
>          the following struct, each 0x10000 bytes long.
>
>              struct env {
>                  uint32_t crc; // calculated only over data[]
>                  unsigned char flags;
>                  unsigned char data[0x10000-5];
>              };
>
>      Once access to the U-Boot shell is achieved:
>
>      Use TFTP to load the initramfs image to memory:
>      `tftpboot <initramfs-image>.itb`
>      with a TFTP server at 192.168.1.1
>
>      or use USB:
>      `fatload usb <dev[:part]> 0x84000000 <initramfs-image>.itb`
>      with FAT32 USB drive connected through a powered hub
>      (use `usb part` to view partitions)
>
>      clear the bootargs variable:
>      `setenv bootargs`
>
>      then boot:
>      `bootm`
>
>      Make backups of SPI and eMMC flash!
>
>      Use SSH/SCP to transfer the sysupgrade file and run sysupgrade.
>
>      The upgrade script will determine which of the two dual-partition
>      slots the device is currently booting from. It will install to the
>      inactive slot if installing over stock FW, or the current slot if
>      upgrading OpenWrt. This leaves the most recent stock FW untouched
>      for easier restoration to stock. Don't rely on this as a backup!
>
> Restore Stock Firmware:
>
>      If installed using sysupgrade and one stock partition set remains,
>      replace the U-Boot environment variables `bootargs` and `bootcmd`
>      with the contents of the `*_eero_backup` versions automatically
>      created during install. Stock firmware should overwrite OpenWrt the
>      next time it receives an update.
>
> Signed-off-by: Connor Northway <contact at cnorthway.com>
> ---
>   package/boot/uboot-envtools/files/ipq40xx     |   4 +
>   package/firmware/ipq-wifi/Makefile            |   2 +
>   .../ipq40xx/base-files/etc/board.d/02_network |   5 +
>   .../etc/hotplug.d/firmware/11-ath10k-caldata  |   8 +
>   .../etc/hotplug.d/usb/20-bluetooth-mac        |  21 +
>   .../ipq40xx/base-files/lib/upgrade/eero.sh    |  94 +++++
>   .../base-files/lib/upgrade/platform.sh        |   3 +
>   .../arch/arm/boot/dts/qcom-ipq4019-cento.dts  | 393 ++++++++++++++++++
>   target/linux/ipq40xx/image/generic.mk         |  13 +
>   9 files changed, 543 insertions(+)
>   create mode 100644 target/linux/ipq40xx/base-files/etc/hotplug.d/usb/20-bluetooth-mac
>   create mode 100644 target/linux/ipq40xx/base-files/lib/upgrade/eero.sh
>   create mode 100644 target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-cento.dts
>
> diff --git a/package/boot/uboot-envtools/files/ipq40xx b/package/boot/uboot-envtools/files/ipq40xx
> index 8d993fae36..e8431048eb 100644
> --- a/package/boot/uboot-envtools/files/ipq40xx
> +++ b/package/boot/uboot-envtools/files/ipq40xx
> @@ -56,6 +56,10 @@ aruba,ap-365)
>   buffalo,wtr-m2133hp)
>   	ubootenv_add_uci_config "/dev/mtd8" "0x0" "0x40000" "0x20000"
>   	;;
> +eero,cento)
> +	ubootenv_add_uci_config "/dev/mtd9" "0x0" "0x10000" "0x10000"
> +	ubootenv_add_uci_config "/dev/mtd9" "0x10000" "0x10000" "0x10000"
> +	;;
>   linksys,ea6350v3)
>   	ubootenv_add_uci_config "/dev/mtd7" "0x0" "0x20000" "0x20000"
>   	;;
> diff --git a/package/firmware/ipq-wifi/Makefile b/package/firmware/ipq-wifi/Makefile
> index aeb690e913..f2e670e65c 100644
> --- a/package/firmware/ipq-wifi/Makefile
> +++ b/package/firmware/ipq-wifi/Makefile
> @@ -38,6 +38,7 @@ ALLWIFIBOARDS:= \
>   	edgecore_ecw5410 \
>   	edgecore_oap100 \
>   	edimax_cax1800 \
> +	eero_cento\
>   	extreme-networks_ws-ap3915i \
>   	glinet_gl-a1300 \
>   	glinet_gl-ap1300 \
> @@ -143,6 +144,7 @@ $(eval $(call generate-ipq-wifi-package,edgecore_eap102,Edgecore EAP102))
>   $(eval $(call generate-ipq-wifi-package,edgecore_ecw5410,Edgecore ECW5410))
>   $(eval $(call generate-ipq-wifi-package,edgecore_oap100,Edgecore OAP100))
>   $(eval $(call generate-ipq-wifi-package,edimax_cax1800,Edimax CAX1800))
> +$(eval $(call generate-ipq-wifi-package,eero_cento,Eero Cento))
>   $(eval $(call generate-ipq-wifi-package,extreme-networks_ws-ap3915i,Edgecore OAP100))
>   $(eval $(call generate-ipq-wifi-package,glinet_gl-a1300,GL.iNet GL-A1300))
>   $(eval $(call generate-ipq-wifi-package,glinet_gl-ap1300,GL.iNet GL-AP1300))
> diff --git a/target/linux/ipq40xx/base-files/etc/board.d/02_network b/target/linux/ipq40xx/base-files/etc/board.d/02_network
> index cb318d36a3..e5bd04a56e 100644
> --- a/target/linux/ipq40xx/base-files/etc/board.d/02_network
> +++ b/target/linux/ipq40xx/base-files/etc/board.d/02_network
> @@ -32,6 +32,7 @@ ipq40xx_setup_interfaces()
>   	asus,map-ac2200|\
>   	cilab,meshpoint-one|\
>   	edgecore,ecw5211|\
> +	eero,cento|\
>   	glinet,gl-ap1300|\
>   	glinet,gl-b2200|\
>   	google,wifi|\
> @@ -159,6 +160,10 @@ ipq40xx_setup_macs()
>   		lan_mac=$(mtd_get_mac_ascii bdcfg lanmac)
>   		label_mac=$lan_mac
>   		;;
> +	eero,cento)
> +		wan_mac=$(mtd_get_mac_ascii 0:IDENTITY mac)
> +		lan_mac=$(macaddr_add "$(mtd_get_mac_ascii 0:IDENTITY mac)" 1)
This should be replaced with NVMEM cells instead.
> +		;;
>   	engenius,eap2200|\
>   	engenius,emd1)
>   		lan_mac=$(mtd_get_mac_ascii 0:APPSBLENV ethaddr)
> diff --git a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> index 7f41bdcfcc..4b6072f0fe 100644
> --- a/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> +++ b/target/linux/ipq40xx/base-files/etc/hotplug.d/firmware/11-ath10k-caldata
> @@ -83,6 +83,10 @@ case "$FIRMWARE" in
>   		caldata_extract "ART" 0x1000 0x2f20
>   		ath10k_patch_mac $(mtd_get_mac_ascii bdcfg wlanmac)
>   		;;
> +	eero,cento)
> +		caldata_extract "0:ART" 0x1000 0x2f20
> +		ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii 0:IDENTITY mac) 3)
Use NVMEM cells for both caldata and MAC setting.
> +		;;
>   	engenius,emd1)
>   		caldata_extract "0:ART" 0x1000 0x2f20
>   		ath10k_patch_mac $(mtd_get_mac_ascii 0:APPSBLENV wlanaddr)
> @@ -178,6 +182,10 @@ case "$FIRMWARE" in
>   		caldata_extract "ART" 0x5000 0x2f20
>   		ath10k_patch_mac $(mtd_get_mac_ascii bdcfg wlanmac_a)
>   		;;
> +	eero,cento)
> +		caldata_extract "0:ART" 0x5000 0x2f20
> +		ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii 0:IDENTITY mac) 4)
Use NVMEM cells for both caldata and MAC setting.
> +		;;
>   	engenius,emd1)
>   		caldata_extract "0:ART" 0x5000 0x2f20
>   		ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii 0:APPSBLENV wlanaddr) 1)
> diff --git a/target/linux/ipq40xx/base-files/etc/hotplug.d/usb/20-bluetooth-mac b/target/linux/ipq40xx/base-files/etc/hotplug.d/usb/20-bluetooth-mac
> new file mode 100644
> index 0000000000..eada210214
> --- /dev/null
> +++ b/target/linux/ipq40xx/base-files/etc/hotplug.d/usb/20-bluetooth-mac
> @@ -0,0 +1,21 @@
> +. /lib/functions/system.sh
> +
> +setup_bluetooth_mac()
> +{
> +	local board=$(board_name)
> +
> +	case "$board" in
> +	eero,cento)
> +		hciconfig hci0 up
> +		bdaddr "$(macaddr_add "$(mtd_get_mac_ascii 0:IDENTITY mac)" 2)"
> +		hciconfig hci0 reset
> +		hciconfig hci0 down
> +	;;
> +	esac
> +}
> +
> +if [ "${DRIVER}" = "btusb" ]; then
> +	if [ "${ACTION}" = "bind" ]; then
> +		setup_bluetooth_mac
> +	fi
> +fi
> diff --git a/target/linux/ipq40xx/base-files/lib/upgrade/eero.sh b/target/linux/ipq40xx/base-files/lib/upgrade/eero.sh
> new file mode 100644
> index 0000000000..c27c4bfad7
> --- /dev/null
> +++ b/target/linux/ipq40xx/base-files/lib/upgrade/eero.sh
> @@ -0,0 +1,94 @@
> +# Flashes upgrade package using eero's A/B partition scheme
> +# will leave most recent eero installation alone as a backup
> +platform_do_upgrade_eero_cento() {
> +	local tar_file="$1"
> +
> +	local current_bootcmd
> +	local current_bootargs
> +	current_bootcmd=$(fw_printenv -n bootcmd)
> +	current_bootargs=$(fw_printenv -n bootargs)
> +	local first_install
> +	first_install=$(echo "$current_bootcmd" | grep -c "eero_kernel")
> +	if [ $first_install -eq 1 ]; then
> +		echo "first installation! backing up important stock env variables"
> +		fw_setenv -s - <<-EOF
> +			bootcmd_eero_backup $current_bootcmd
> +			bootargs_eero_backup $current_bootargs
> +		EOF
> +	fi
> +
> +###
> +# Determine partitions
> +###
> +	local current_bootpart
> +	local current_rootpart
> +	current_bootpart=$(echo "$current_bootcmd" | sed -nr 's/.*ext2load mmc 0:([[:digit:]]).*/\1/p')
> +	current_rootpart=$(echo "$current_bootargs" | sed -nr 's/.*root=\/dev\/mmcblk0p([[:digit:]]).*/\1/p')
> +
> +	# validate that they're sane; determine inactive partitions
> +	if [ "$current_bootpart" -eq 1 ] && [ "$current_rootpart" -eq 3 ]; then
> +		local inactive_bootpart=2
> +		local inactive_rootpart=4
> +		echo "currently booting from slot A"
> +	elif [ "$current_bootpart" -eq 2 ] && [ "$current_rootpart" -eq 4 ]; then
> +		local inactive_bootpart=1
> +		local inactive_rootpart=3
> +		echo "currently booting from slot B"
> +	else
> +		echo "invalid boot or root partitions"
> +		return 1
> +	fi
> +
> +	# on the first install, we want to install to the inactive slot
> +	# (easier to recover to known-good, configured stock OS).
> +	# on subsequent installs, continue using the active slot to keep
> +	# the stock install intact.
> +	if $first_install; then
> +		local install_bootpart=$inactive_bootpart
> +		local install_rootpart=$inactive_rootpart
> +		echo "installing to inactive slot;"
> +	else
> +		local install_bootpart=$current_bootpart
> +		local install_rootpart=$current_rootpart
> +		echo "installing to currently booted slot;"
> +	fi
> +	echo "boot: $install_bootpart"
> +	echo "root: $install_rootpart"
> +
> +###
> +# Install kernel to ext2 part
> +###
> +	local board_dir=$(tar tf $tar_file | grep -m 1 '^sysupgrade-.*/$')
> +	board_dir=${board_dir%/}
> +
> +	# mount boot partition
> +	mkdir /mnt/bootpart &&
> +	mount -t ext2 /dev/mmcblk0p"$install_bootpart" /mnt/bootpart ||
> +	{ echo "unable to mount boot partition" && return 1 ; }
> +
> +	# clean it out and install new kernel image
> +	rm -r /mnt/bootpart/* &&
> +	mkdir /mnt/bootpart/lost+found &&
> +	tar Oxf $tar_file ${board_dir}/kernel > /mnt/bootpart/kernel.itb ||
> +	{ echo "unable to install kernel image" && return 1 ; }
> +
> +	echo "installed kernel image to /dev/mmcblk0p$install_bootpart"
> +
> +###
> +# Install rootfs using emmc_do_upgrade
> +###
> +	EMMC_ROOT_DEV=/dev/mmcblk0p"$install_rootpart"
> +	emmc_do_upgrade $tar_file
> +
> +	echo "done with emmc_do_upgrade, rootfs should be installed"
> +
> +###
> +# Finalize env vars
> +###
> +	fw_setenv -s - <<-EOF
> +		bootcmd ext2load mmc 0:$install_bootpart 0x84000000 kernel.itb && bootm; reset
> +		bootargs root=/dev/mmcblk0p$install_rootpart rootwait
> +	EOF
> +
> +	echo "new boot cmd/args set, install complete!"
> +}
> diff --git a/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh b/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh
> index 988921fa8c..74f425861b 100644
> --- a/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh
> +++ b/target/linux/ipq40xx/base-files/lib/upgrade/platform.sh
> @@ -156,6 +156,9 @@ platform_do_upgrade() {
>   	compex,wpj419)
>   		nand_do_upgrade "$1"
>   		;;
> +	eero,cento)
> +		platform_do_upgrade_eero_cento "$1"
> +		;;
>   	google,wifi)
>   		export_bootdevice
>   		export_partdevice CI_ROOTDEV 0
> diff --git a/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-cento.dts b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-cento.dts
> new file mode 100644
> index 0000000000..5c646de918
> --- /dev/null
> +++ b/target/linux/ipq40xx/files/arch/arm/boot/dts/qcom-ipq4019-cento.dts
> @@ -0,0 +1,393 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
> +
> +#include "qcom-ipq4019.dtsi"
> +#include <dt-bindings/input/input.h>
> +#include <dt-bindings/gpio/gpio.h>
> +#include <dt-bindings/leds/common.h>
> +#include <dt-bindings/soc/qcom,tcsr.h>
> +
> +/ {
> +	model = "Eero Cento (J010001)";
> +	compatible = "eero,cento";
> +
> +	chosen {
> +		stdout-path = &blsp1_uart1;
> +	};
> +
> +	aliases {
> +		led-boot = &led_status_white;
> +		led-failsafe = &led_status_red;
> +		led-running = &led_status_green;
> +		led-upgrade = &led_status_blue;
> +	};
> +
> +	memory {
> +		device_type = "memory";
> +		reg = <0x80000000 0x20000000>;

Is this required at all, bootloader should patch it in.

> +	};
> +
> +	keys {
> +		compatible = "gpio-keys";
> +
> +		reset {
> +			label = "reset";
> +			gpios = <&tlmm 18 GPIO_ACTIVE_LOW>;
> +			linux,code = <KEY_RESTART>;
> +		};
> +	};
> +
> +	tcsr at 1949000 {
> +		compatible = "qcom,tcsr";
> +		reg = <0x1949000 0x100>;
> +		qcom,wifi_glb_cfg = <TCSR_WIFI_GLB_CFG>;
> +	};
> +
> +	tcsr at 194b000 {
> +		compatible = "qcom,tcsr";
> +		reg = <0x194b000 0x100>;
> +		qcom,usb-hsphy-mode-select = <TCSR_USB_HSPHY_HOST_MODE>;
> +	};
> +
> +	ess_tcsr at 1953000 {
> +		compatible = "qcom,tcsr";
> +		reg = <0x1953000 0x1000>;
> +		qcom,ess-interface-select = <TCSR_ESS_PSGMII>;
> +	};
> +
> +	tcsr at 1957000 {
> +		compatible = "qcom,tcsr";
> +		reg = <0x1957000 0x100>;
> +		qcom,wifi_noc_memtype_m0_m2 = <TCSR_WIFI_NOC_MEMTYPE_M0_M2>;
> +	};
> +
> +};
> +
> +&tlmm {
> +	serial_0_pins: serial0_pinmux {
> +		mux {
> +			pins = "gpio16", "gpio17";
> +			function = "blsp_uart0";
> +			bias-disable;
> +		};
> +	};
> +
> +	spi_0_pins: spi_0_pinmux {
> +			pinmux {
> +					function = "blsp_spi0";
> +					pins = "gpio13", "gpio14", "gpio15";
> +			};
> +
> +			pinmux_cs {
> +					function = "gpio";
> +					pins = "gpio12";
> +			};
> +
> +			pinconf {
> +					pins = "gpio13", "gpio14", "gpio15";
> +					bias-disable;
> +			};
> +
> +			pinconf_cs {
> +					pins = "gpio12";
> +					bias-disable;
> +					output-high;
> +			};
> +	};
> +
> +	sd_0_pins: sd_0_pinmux {
> +		sd0 {
> +			function = "sdio";
> +			pins = "gpio23", "gpio24", "gpio25", "gpio26", "gpio29",
> +					"gpio30", "gpio31", "gpio32";
> +			drive-strength = <4>;
> +			bias-disable;
> +		};
> +
> +		sdclk {
> +			pins = "gpio27";
> +			function = "sdio";
> +			drive-strength = <4>;
> +			bias-disable;
> +		};
> +
> +		sdcmd {
> +			pins = "gpio28";
> +			function = "sdio";
> +			drive-strength = <4>;
> +			bias-disable;
> +		};
> +	};
> +
> +	i2c_0_pins: i2c_0_pinmux {
> +		mux {
> +			pins = "gpio20", "gpio21";
> +			function = "blsp_i2c0";
> +			bias-disable;
> +		};
> +	};
> +
> +	i2c_1_pins: i2c_1_pinmux {
> +		mux {
> +			pins = "gpio34", "gpio35";
> +			function = "blsp_i2c1";
> +			bias-disable;
> +		};
> +	};
> +
> +	// cypress cyw20704 connected over usb
> +	bluetooth-enable {
> +		gpio-hog;
> +		gpios = <48 GPIO_ACTIVE_HIGH>;
> +		output-high;
> +	};
> +};
> +
> +&usb3_ss_phy {
> +	status = "ok";
Replace "ok" with "okay", "ok" has been deprecated for years.
Same applies for all nodes.
> +};
> +
> +&usb3_hs_phy {
> +	status = "ok";
> +};
> +
> +&usb3 {
> +	status = "ok";
> +};
> +
> +&usb2_hs_phy {
> +	status = "ok";
> +};
> +
> +&usb2 {
> +	status = "ok";
> +};
> +
> +&blsp1_uart1 {
> +	status = "ok";
> +
> +	pinctrl-0 = <&serial_0_pins>;
> +	pinctrl-names = "default";
> +};
> +
> +&watchdog {
> +	status = "ok";
> +};
> +
> +&prng {
> +	status = "ok";
> +};
> +
> +&crypto {
> +	status = "ok";
> +};
> +
> +&cryptobam {
> +	status = "ok";
> +};
> +
> +&blsp_dma {
> +	status = "ok";
> +};
> +
> +&blsp1_spi1 {
> +	status = "ok";
> +
> +	pinctrl-0 = <&spi_0_pins>;
> +	pinctrl-names = "default";
> +	cs-gpios = <&tlmm 12 GPIO_ACTIVE_HIGH>;
> +
> +	flash at 0 {
> +		reg = <0>;
> +		compatible = "jedec,spi-nor";
> +		spi-max-frequency = <24000000>;
> +
> +		partitions {
> +			compatible = "fixed-partitions";
> +			#address-cells = <1>;
> +			#size-cells = <1>;
> +
> +			partition at 0 {
> +				label = "0:SBL1";
> +				reg = <0x0 0x40000>;
> +				read-only;
> +			};
> +
> +			partition at 40000 {
> +				label = "0:MIBIB";
> +				reg = <0x40000 0x20000>;
> +				read-only;
> +			};
> +
> +			partition at 60000 {
> +				label = "0:QSEE";
> +				reg = <0x60000 0x60000>;
> +				read-only;
> +			};
> +
> +			partition at c0000 {
> +				label = "0:CDT";
> +				reg = <0xc0000 0x10000>;
> +				read-only;
> +			};
> +
> +			partition at d0000 {
> +				label = "0:DDRPARAMS";
> +				reg = <0xd0000 0x10000>;
> +				read-only;
> +			};
> +
> +			partition at e0000 {
> +				label = "0:ART";
> +				reg = <0xe0000 0x10000>;
> +				read-only;
> +			};
> +
> +			partition at f0000 {
> +				label = "0:APPSBL";
> +				reg = <0xf0000 0x100000>;
> +				read-only;
> +			};
> +
> +			partition at 1f0000 {
> +				label = "0:IDENTITY";
> +				reg = <0x1f0000 0x10000>;
> +				read-only;
> +			};
> +
> +			partition at 200000 {
> +				label = "0:PK";
> +				reg = <0x200000 0x10000>;
> +				read-only;
> +			};
> +
> +			partition at 210000 {
> +				label = "0:APPSBLENV";
> +				reg = <0x210000 0x20000>;
> +				// r/w allowed because installation needs to modify u-boot env
> +			};
> +
> +			partition at 230000 {
> +				label = "0:SYSVAR";
> +				reg = <0x230000 0x10000>;
> +				read-only;
> +			};
> +		};
> +	};
> +};
> +
> +&vqmmc {
> +	status = "ok";
> +};
> +
> +&sdhci {
> +	status = "ok";
> +
> +	pinctrl-0 = <&sd_0_pins>;
> +	pinctrl-names = "default";
> +	vqmmc-supply = <&vqmmc>;
> +	non-removable;
> +	no-1-8-v;
> +	#address-cells = <1>;
> +	#size-cells = <0>;
> +
> +	emmc at 0 {
> +		compatible = "mmc-card";
> +		reg = <0>;
> +	};
> +};
> +
> +&blsp1_i2c3 {
> +	status = "ok";
> +
> +	pinctrl-0 = <&i2c_0_pins>;
> +	pinctrl-names = "default";
> +};
> +
> +&blsp1_i2c4 {
> +	status = "ok";
> +
> +	pinctrl-0 = <&i2c_1_pins>;
> +	pinctrl-names = "default";
> +
> +	led-controller at 30 {
> +		compatible = "ti,lp5562";
> +		reg = <0x30>;
> +		clock-mode = /bits/ 8 <2>;
> +		skip-reset;
> +
> +		#address-cells = <1>;
> +		#size-cells = <0>;
> +
> +		// current limits from stock dt
> +
> +		led_status_red: led at 0 {
> +			chan-name = "red:status";
> +			led-cur = /bits/ 8 <0xB4>; /* 18.0 mA */
> +			max-cur = /bits/ 8 <0xFF>; /* 25.5 mA */
> +			reg = <0>;
> +			color = <LED_COLOR_ID_RED>;
> +		};
> +
> +		led_status_green: led at 1 {
> +			chan-name = "green:status";
> +			led-cur = /bits/ 8 <0xB4>; /* 18.0 mA */
> +			max-cur = /bits/ 8 <0xC8>; /* 20.0 mA */
> +			reg = <1>;
> +			color = <LED_COLOR_ID_GREEN>;
> +		};
> +
> +		led_status_blue: led at 2 {
> +			chan-name = "blue:status";
> +			led-cur = /bits/ 8 <0xC8>; /* 20.0 mA */
> +			max-cur = /bits/ 8 <0xC8>; /* 20.0 mA */
> +			reg = <2>;
> +			color = <LED_COLOR_ID_BLUE>;
> +		};
> +
> +		led_status_white: led at 3 {
> +			chan-name = "white:status";
> +			led-cur = /bits/ 8 <0x96>; /* 15.0 mA */
> +			max-cur = /bits/ 8 <0x96>; /* 15.0 mA */
> +			reg = <3>;
> +			color = <LED_COLOR_ID_WHITE>;
> +		};
> +	};
> +};
> +
> +&gmac {
> +	status = "ok";
> +};
> +
> +&mdio {
> +	status = "ok";
> +};
> +
> +&switch {
> +	status = "ok";
> +};
> +
> +&swport4 {
> +	status = "ok";
> +
> +	label = "wan"; //arbitrary, no marking
> +};
> +
> +&swport5 {
> +	status = "ok";
> +
> +	label = "lan"; //arbitrary, no marking
> +};
> +
> +&wifi0 {
> +	status = "ok";
> +
> +	qcom,ath10k-calibration-variant = "Eero-Cento";
> +	qcom,coexist-support = <1>;
> +	qcom,coexist-gpio-pin = <52>;
> +};
> +
> +&wifi1 {
> +	status = "ok";
> +
> +	qcom,ath10k-calibration-variant = "Eero-Cento";
> +};
> diff --git a/target/linux/ipq40xx/image/generic.mk b/target/linux/ipq40xx/image/generic.mk
> index adce4fe0f2..14e209fd2a 100644
> --- a/target/linux/ipq40xx/image/generic.mk
> +++ b/target/linux/ipq40xx/image/generic.mk
> @@ -448,6 +448,19 @@ endef
>   # Missing DSA Setup
>   #TARGET_DEVICES += edgecore_oap100
>   
> +define Device/eero_cento
> +	$(call Device/FitImage)
> +	$(call Device/UbiFit)
> +	DEVICE_VENDOR := Eero
> +	DEVICE_MODEL := Cento (J010001)
> +	SOC := qcom-ipq4019
> +	DEVICE_PACKAGES := e2fsprogs kmod-fs-f2fs mkf2fs kmod-mmc kmod-fs-ext4 \
What is kmod-mmc required for?
MMC/SDHCI support is compiled in on this target already.
> +		ipq-wifi-eero_cento kmod-bluetooth bluez-libs bluez-utils
> +	IMAGES := sysupgrade.bin
> +	IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata

You are including $(call Device/UbiFit) which already has the same 
recipe for
sysupgrade.bin

> +endef
> +TARGET_DEVICES += eero_cento
> +
>   define Device/engenius_eap1300
>   	$(call Device/FitImage)
>   	DEVICE_VENDOR := EnGenius



More information about the openwrt-devel mailing list