diff mbox series

ath79: add support for Ubiquiti UniFi AP Pro

Message ID 20200914121944.114046-1-mail@david-bauer.net
State Superseded
Headers show
Series ath79: add support for Ubiquiti UniFi AP Pro | expand

Commit Message

David Bauer Sept. 14, 2020, 12:19 p.m. UTC
This adds support for the Ubiquiti UniFi AP Pro to the ath79 target. The
device was previously supported on the now removed ar71xx target.

SoC   Atheros AR9344
WiFi  Atheros AR9344 & Atheros AR9280
ETH   Atheros AR8327
RAM   128M DDR2
FLASH 16M SPI-NOR

Installation
------------

Follow the Ubiquiti TFTP recovery procedure for this device.

1. Hold down the reset button while connecting power for 10 seconds.
2. Transfer the factory image via TFTP to the AP (192.168.1.20)
3. Wait 2 minutes for the AP to write the firmware to flash. The device
   will automatically reboot to OpenWrt.

Signed-off-by: David Bauer <mail@david-bauer.net>
---
 .../ath79/dts/ar9344_ubnt_unifi-ap-pro.dts    | 153 ++++++++++++++++++
 .../generic/base-files/etc/board.d/02_network |   4 +
 .../etc/hotplug.d/firmware/10-ath9k-eeprom    |   1 +
 target/linux/ath79/image/generic-ubnt.mk      |  25 +++
 4 files changed, 183 insertions(+)
 create mode 100644 target/linux/ath79/dts/ar9344_ubnt_unifi-ap-pro.dts

Comments

Adrian Schmutzler Sept. 14, 2020, 3:27 p.m. UTC | #1
Hi,

> +			firmware-partition@50000 {

Is there a special reason for calling this "firmware-partition"?

> +				label = "firmware";
> +				reg = <0x50000 0xf60000>;
> +			};
> +
> +			partition@fb0000 {
> +				label = "cfg";
> +				reg = <0xfb0000 0x40000>;
> +				read-only;
> +			};
> +
> +			art: partition@f0000 {

Typo: @ff0000

> +				label = "art";
> +				reg = <0xff0000 0x10000>;
> +				read-only;
> +			};
> +		};
> +	};
> +};
> +
> +&pcie {
> +	status = "okay";
> +
> +	wifi@0,0 {
> +		compatible = "pci168c,0033";
> +		reg = <0 0 0 0 0>;
> +		qca,no-eeprom;
> +	};
> +};
> +
> +&wmac {
> +	status = "okay";
> +	mtd-cal-data = <&art 0x1000>;

I'd like an empty line after status here.

[...]

> +  IMAGES := sysupgrade.bin factory.bin
> +  IMAGE/sysupgrade.bin := append-kernel | pad-to $$$$(KERNEL_SIZE) |
> append-rootfs |\
> +	pad-rootfs | append-metadata | check-size $$$$(IMAGE_SIZE)

check-size can be used without argument now. (But watch out during backporting ...).

Best

Adrian
Rafał Miłecki Sept. 16, 2020, 5:03 a.m. UTC | #2
On Mon, 14 Sep 2020 at 14:22, David Bauer <mail@david-bauer.net> wrote:
> +                       firmware-partition@50000 {
> +                               label = "firmware";
> +                               reg = <0x50000 0xf60000>;
> +                       };

Please specify "compatible" so the kernel doesn't have to guess its format.

https://openwrt.org/docs/guide-developer/defining-firmware-partitions#defining_software_partitions_in_all_dts_targets
David Bauer Sept. 16, 2020, 7:52 a.m. UTC | #3
Hi Rafal,

On 9/16/20 7:03 AM, Rafał Miłecki wrote:
> On Mon, 14 Sep 2020 at 14:22, David Bauer <mail@david-bauer.net> wrote:
>> +                       firmware-partition@50000 {
>> +                               label = "firmware";
>> +                               reg = <0x50000 0xf60000>;
>> +                       };
> 
> Please specify "compatible" so the kernel doesn't have to guess its format.

There's not MTD splitter for JFFS2 kernel partitions as far as I'm concerned.
kernel and rootfs partitions are also defined in the DTS, so no splitter is needed.

The sole purpose of th firmware partition is to allow the default sysupgrade method.

Best wishes
David

> 
> https://openwrt.org/docs/guide-developer/defining-firmware-partitions#defining_software_partitions_in_all_dts_targets
>
diff mbox series

Patch

diff --git a/target/linux/ath79/dts/ar9344_ubnt_unifi-ap-pro.dts b/target/linux/ath79/dts/ar9344_ubnt_unifi-ap-pro.dts
new file mode 100644
index 0000000000..8b6e1bfd6d
--- /dev/null
+++ b/target/linux/ath79/dts/ar9344_ubnt_unifi-ap-pro.dts
@@ -0,0 +1,153 @@ 
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+/dts-v1/;
+
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/input/input.h>
+
+#include "ar9344.dtsi"
+
+/ {
+	model = "Ubiquiti UniFi AP Pro";
+	compatible = "ubnt,unifi-ap-pro";
+
+	aliases {
+		led-boot = &led_white;
+		led-failsafe = &led_white;
+		led-running = &led_blue;
+		led-upgrade = &led_blue;
+		label-mac-device = &eth0;
+	};
+
+	leds {
+		compatible = "gpio-leds";
+
+		led_white: led-white {
+			label = "ubnt:white:dome";
+			gpios = <&gpio 12 GPIO_ACTIVE_HIGH>;
+		};
+
+		led_blue: led-blue {
+			label = "ubnt:blue:dome";
+			gpios = <&gpio 13 GPIO_ACTIVE_HIGH>;
+		};
+	};
+
+	keys {
+		compatible = "gpio-keys";
+
+		reset {
+			linux,code = <KEY_RESTART>;
+			gpios = <&gpio 17 GPIO_ACTIVE_LOW>;
+			debounce-interval = <60>;
+		};
+	};
+};
+
+&ref {
+	clock-frequency = <40000000>;
+};
+
+&uart {
+	status = "okay";
+};
+
+&spi {
+	status = "okay";
+
+	num-cs = <1>;
+
+	flash@0 {
+		compatible = "jedec,spi-nor";
+		reg = <0>;
+		spi-max-frequency = <50000000>;
+
+		partitions {
+			compatible = "fixed-partitions";
+			#address-cells = <1>;
+			#size-cells = <1>;
+
+			uboot: partition@0 {
+				label = "u-boot";
+				reg = <0x0 0x40000>;
+				read-only;
+			};
+
+			partition@40000 {
+				label = "u-boot-env";
+				reg = <0x40000 0x10000>;
+				read-only;
+			};
+
+			partition@50000 {
+				label = "kernel";
+				reg = <0x50000 0x300000>;
+				/* Can be resized w/o issues.
+				 * U-Boot canload kernel from the
+				 * entirety of the "firmware" partition space.
+				 */
+			};
+
+			partition@350000 {
+				label = "rootfs";
+				reg = <0x350000 0xc60000>;
+			};
+
+			firmware-partition@50000 {
+				label = "firmware";
+				reg = <0x50000 0xf60000>;
+			};
+
+			partition@fb0000 {
+				label = "cfg";
+				reg = <0xfb0000 0x40000>;
+				read-only;
+			};
+
+			art: partition@f0000 {
+				label = "art";
+				reg = <0xff0000 0x10000>;
+				read-only;
+			};
+		};
+	};
+};
+
+&pcie {
+	status = "okay";
+
+	wifi@0,0 {
+		compatible = "pci168c,0033";
+		reg = <0 0 0 0 0>;
+		qca,no-eeprom;
+	};
+};
+
+&wmac {
+	status = "okay";
+	mtd-cal-data = <&art 0x1000>;
+};
+
+&mdio0 {
+	status = "okay";
+
+	phy0: ethernet-phy@0 {
+		reg = <0>;
+
+		qca,ar8327-initvals = <
+			0x4 0x7600000 /* PORT0 PAD MODE CTRL */
+			0x10 0x80000080 /* POWER_ON_STRAP */
+			0x7c 0x7e /* PORT0_STATUS */
+			>;
+	};
+};
+
+&eth0 {
+	status = "okay";
+
+	pll-data = <0x6000000 0x101 0x1616>;
+
+	mtd-mac-address = <&art 0x0>;
+
+	phy-mode = "rgmii";
+	phy-handle = <&phy0>;
+};
diff --git a/target/linux/ath79/generic/base-files/etc/board.d/02_network b/target/linux/ath79/generic/base-files/etc/board.d/02_network
index f437f7432f..4105b639f0 100755
--- a/target/linux/ath79/generic/base-files/etc/board.d/02_network
+++ b/target/linux/ath79/generic/base-files/etc/board.d/02_network
@@ -370,6 +370,10 @@  ath79_setup_interfaces()
 		ucidef_add_switch "switch0" \
 			"0@eth0" "2:lan:1" "3:lan:2"
 		;;
+	ubnt,unifi-ap-pro)
+		ucidef_add_switch "switch0" \
+			"0@eth0" "1:lan" "2:lan"
+		;;
 	zbtlink,zbt-wd323|\
 	xiaomi,mi-router-4q)
 		ucidef_set_interface_wan "eth1"
diff --git a/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom b/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom
index 5ecae96cd1..4da7bfac6c 100644
--- a/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom
+++ b/target/linux/ath79/generic/base-files/etc/hotplug.d/firmware/10-ath9k-eeprom
@@ -98,6 +98,7 @@  case "$FIRMWARE" in
 	tplink,tl-wdr4300-v1-il|\
 	tplink,tl-wdr4310-v1|\
 	tplink,tl-wdr4900-v2|\
+	ubnt,unifi-ap-pro|\
 	winchannel,wb2000)
 		caldata_extract "art" 0x5000 0x440
 		;;
diff --git a/target/linux/ath79/image/generic-ubnt.mk b/target/linux/ath79/image/generic-ubnt.mk
index b945183776..3593f637a6 100644
--- a/target/linux/ath79/image/generic-ubnt.mk
+++ b/target/linux/ath79/image/generic-ubnt.mk
@@ -13,6 +13,14 @@  define Build/mkubntimage
 		-k $(IMAGE_KERNEL) -r $@ -o $@
 endef
 
+define Build/mkubntimage2
+	-$(STAGING_DIR_HOST)/bin/mkfwimage2 -f 0x9f000000 \
+		-v $(UBNT_TYPE).$(UBNT_CHIP).v6.0.0-$(VERSION_DIST)-$(REVISION) \
+		-p jffs2:0x50000:0xf60000:0:0:$@ \
+		-o $@.new
+	@mv $@.new $@
+endef
+
 # all UBNT XM/WA devices expect the kernel image to have 1024k while flash, when
 # booting the image, the size doesn't matter.
 define Build/mkubntimage-split
@@ -369,3 +377,20 @@  define Device/ubnt_unifiac-pro
   SUPPORTED_DEVICES += unifiac-pro
 endef
 TARGET_DEVICES += ubnt_unifiac-pro
+
+define Device/ubnt_unifi-ap-pro
+  SOC := ar9344
+  DEVICE_VENDOR := Ubiquiti
+  DEVICE_MODEL := UniFi AP Pro
+  UBNT_TYPE := BZ
+  UBNT_CHIP := ar934x
+  KERNEL_SIZE := 3072k
+  IMAGE_SIZE := 15744k
+  KERNEL := kernel-bin | append-dtb | lzma | uImage lzma | jffs2 kernel0
+  IMAGES := sysupgrade.bin factory.bin
+  IMAGE/sysupgrade.bin := append-kernel | pad-to $$$$(KERNEL_SIZE) | append-rootfs |\
+	pad-rootfs | append-metadata | check-size $$$$(IMAGE_SIZE)
+  IMAGE/factory.bin := $$(IMAGE/sysupgrade.bin) | mkubntimage2
+  SUPPORTED_DEVICES += uap-pro
+endef
+TARGET_DEVICES += ubnt_unifi-ap-pro