On Wed, May 17, 2023 at 01:47:02PM -0400, 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 <cont...@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)
> +             ;;
>       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

Can you declare nvmem cell and use that to provide calibration bin?

> +             ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii 0:IDENTITY 
> mac) 3)
> +             ;;
>       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

Ditto.

> +             ath10k_patch_mac $(macaddr_add $(mtd_get_mac_ascii 0:IDENTITY 
> mac) 4)
> +             ;;
>       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>;
> +     };
> +
> +     keys {
> +             compatible = "gpio-keys";
> +
> +             reset {
> +                     label = "reset";
> +                     gpios = <&tlmm 18 GPIO_ACTIVE_LOW>;
> +                     linux,code = <KEY_RESTART>;
> +             };
> +     };
> +
> +     tcsr@1949000 {
> +             compatible = "qcom,tcsr";
> +             reg = <0x1949000 0x100>;
> +             qcom,wifi_glb_cfg = <TCSR_WIFI_GLB_CFG>;
> +     };
> +
> +     tcsr@194b000 {
> +             compatible = "qcom,tcsr";
> +             reg = <0x194b000 0x100>;
> +             qcom,usb-hsphy-mode-select = <TCSR_USB_HSPHY_HOST_MODE>;
> +     };
> +
> +     ess_tcsr@1953000 {
> +             compatible = "qcom,tcsr";
> +             reg = <0x1953000 0x1000>;
> +             qcom,ess-interface-select = <TCSR_ESS_PSGMII>;
> +     };
> +
> +     tcsr@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";
> +};
> +
> +&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@0 {
> +             reg = <0>;
> +             compatible = "jedec,spi-nor";
> +             spi-max-frequency = <24000000>;
> +
> +             partitions {
> +                     compatible = "fixed-partitions";
> +                     #address-cells = <1>;
> +                     #size-cells = <1>;
> +
> +                     partition@0 {
> +                             label = "0:SBL1";
> +                             reg = <0x0 0x40000>;
> +                             read-only;
> +                     };
> +
> +                     partition@40000 {
> +                             label = "0:MIBIB";
> +                             reg = <0x40000 0x20000>;
> +                             read-only;
> +                     };
> +
> +                     partition@60000 {
> +                             label = "0:QSEE";
> +                             reg = <0x60000 0x60000>;
> +                             read-only;
> +                     };
> +
> +                     partition@c0000 {
> +                             label = "0:CDT";
> +                             reg = <0xc0000 0x10000>;
> +                             read-only;
> +                     };
> +
> +                     partition@d0000 {
> +                             label = "0:DDRPARAMS";
> +                             reg = <0xd0000 0x10000>;
> +                             read-only;
> +                     };
> +
> +                     partition@e0000 {
> +                             label = "0:ART";
> +                             reg = <0xe0000 0x10000>;
> +                             read-only;
> +                     };
> +
> +                     partition@f0000 {
> +                             label = "0:APPSBL";
> +                             reg = <0xf0000 0x100000>;
> +                             read-only;
> +                     };
> +
> +                     partition@1f0000 {
> +                             label = "0:IDENTITY";
> +                             reg = <0x1f0000 0x10000>;
> +                             read-only;
> +                     };
> +
> +                     partition@200000 {
> +                             label = "0:PK";
> +                             reg = <0x200000 0x10000>;
> +                             read-only;
> +                     };
> +
> +                     partition@210000 {
> +                             label = "0:APPSBLENV";
> +                             reg = <0x210000 0x20000>;
> +                             // r/w allowed because installation needs to 
> modify u-boot env
> +                     };
> +
> +                     partition@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@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@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@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@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@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@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 \
> +             ipq-wifi-eero_cento kmod-bluetooth bluez-libs bluez-utils
> +     IMAGES := sysupgrade.bin
> +     IMAGE/sysupgrade.bin := sysupgrade-tar | append-metadata
> +endef
> +TARGET_DEVICES += eero_cento
> +
>  define Device/engenius_eap1300
>       $(call Device/FitImage)
>       DEVICE_VENDOR := EnGenius
> -- 
> 2.40.1
> 
> 
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel@lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel

-- 
        Ansuel

_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to