From patchwork Sun Jan 24 16:20:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Todor Colov X-Patchwork-Id: 1430932 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.openwrt.org (client-ip=2001:8b0:10b:1231::1; helo=merlin.infradead.org; envelope-from=openwrt-devel-bounces+incoming=patchwork.ozlabs.org@lists.openwrt.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=merlin.20170209 header.b=qhgn8AeY; dkim=temperror header.d=abv.bg header.i=@abv.bg header.a=rsa-sha256 header.s=smtp-out header.b=sTYyEGHA; dkim-atps=neutral Received: from merlin.infradead.org (merlin.infradead.org [IPv6:2001:8b0:10b:1231::1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DNyxL66Nvz9sSs for ; Mon, 25 Jan 2021 03:24:06 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:To:From: Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender :Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Owner; bh=xLjKkIc0mrHKKWp/8FCeBkD3SxtW6imfx0xvHFIXAA8=; b=qhgn8AeY/oENCDrzyLWInkWdZq T6zpWyDGqprmCyKQroGXHjNepbow5yFmt3c4rrW7Jb/uZICOFmCopwwGSl9hUd+DW2hYtopAuvHv+ 5YC9DXpQy9W4ROxMw6/rw+d1sfXjuWbfAgLFFd9I6Q4xWC9IK2fw/qsz7v1Roljg0vqkkC2jzfYn1 +GzvoaVDuWAYx2pDVsjH+dFiX/sAEQdFCSQzxRTNruhkRTg7ATd1Jgo0XOMHjOvZ44lDDYNUk/TFy N1+b86jn94q4FzK4rSchqbta6jQwbQhJkNcag4/3zozaYkQHHUl1QUbPKatSMxW8iV0MyWlUZpz6e hcKPwBDw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l3i83-0007qE-VU; Sun, 24 Jan 2021 16:20:44 +0000 Received: from pop32.abv.bg ([194.153.145.222]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1l3i80-0007o8-Gr for openwrt-devel@lists.openwrt.org; Sun, 24 Jan 2021 16:20:42 +0000 Received: from smtp.abv.bg (localhost [127.0.0.1]) by pop32.abv.bg (Postfix) with ESMTP id 5B91F1FD4B; Sun, 24 Jan 2021 18:20:36 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=abv.bg; s=smtp-out; t=1611505236; bh=4Kq2IqlkWG15bHAccpwWTYK51ON8mYlSMOv1/gCmQ70=; h=From:To:Cc:Subject:Date:From; b=sTYyEGHAvgNzv8j4d42Yi6dojVVKDUYDiKmoBHkyZAlY4Fo/juhsF5BGJzwCv8Dkw SnD6N81tS+KgFN3Hg2jfD9FUj8NIzzWWAIU/DwSNHnvpHqe3uRNI9Lhrtx/m3UIfoh I3gZiBVe52EBCNwSDsTQtmthHHkS2cPDUYeceux0= X-HELO: tchome.lan Authentication-Results: smtp.abv.bg; auth=pass (plain) smtp.auth=todorcolov@abv.bg Received: from host.48.137.bol-bg.com (HELO tchome.lan) (78.128.48.137) by smtp.abv.bg (qpsmtpd/0.96) with ESMTPSA (ECDHE-RSA-AES128-GCM-SHA256 encrypted); Sun, 24 Jan 2021 18:20:36 +0200 From: Todor Colov To: openwrt-devel@lists.openwrt.org Subject: [PATCH v7 1/2] [v7,1/2] ipq806x: add support for Linksys E8350 v1 Date: Sun, 24 Jan 2021 18:20:21 +0200 Message-Id: <20210124162022.24178-1-todorcolov@abv.bg> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210124_112040_936042_E50BC12F X-CRM114-Status: GOOD ( 25.39 ) X-Spam-Score: -0.2 (/) X-Spam-Report: SpamAssassin version 3.4.4 on merlin.infradead.org summary: Content analysis details: (-0.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider [todorcolov[at]abv.bg] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain X-BeenThere: openwrt-devel@lists.openwrt.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: OpenWrt Development List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Todor Colov Sender: "openwrt-devel" Errors-To: openwrt-devel-bounces+incoming=patchwork.ozlabs.org@lists.openwrt.org Signed-off-by: Todor Colov --- .../ipq806x/base-files/etc/board.d/01_leds | 3 + .../ipq806x/base-files/etc/board.d/02_network | 1 + .../base-files/lib/upgrade/platform.sh | 3 +- .../arm/boot/dts/qcom-ipq8064-e8350-v1.dts | 246 ++++++++++++++++++ target/linux/ipq806x/image/Makefile | 29 +++ .../0069-arm-boot-add-dts-files.patch | 3 +- 6 files changed, 283 insertions(+), 2 deletions(-) create mode 100644 target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8064-e8350-v1.dts diff --git a/target/linux/ipq806x/base-files/etc/board.d/01_leds b/target/linux/ipq806x/base-files/etc/board.d/01_leds index 284f9e2c1d..33c7f80fb9 100755 --- a/target/linux/ipq806x/base-files/etc/board.d/01_leds +++ b/target/linux/ipq806x/base-files/etc/board.d/01_leds @@ -22,6 +22,9 @@ edgecore,ecw5410) ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wlan2g" "phy1tpt" ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wlan5g" "phy0tpt" ;; +linksys,e8350-v1) + ucidef_set_led_wlan "wlan" "WLAN" "green:wifi" "phy0tpt" + ;; nec,wg2600hp) ucidef_set_led_wlan "wlan2g" "WLAN2G" "green:wlan2g" "phy1tpt" ucidef_set_led_wlan "wlan5g" "WLAN5G" "green:wlan5g" "phy0tpt" diff --git a/target/linux/ipq806x/base-files/etc/board.d/02_network b/target/linux/ipq806x/base-files/etc/board.d/02_network index ddef4b7ac6..036cba2de5 100755 --- a/target/linux/ipq806x/base-files/etc/board.d/02_network +++ b/target/linux/ipq806x/base-files/etc/board.d/02_network @@ -69,6 +69,7 @@ qcom,ipq8064-db149) ubnt,unifi-ac-hd) ucidef_set_interface_lan "eth0 eth1" ;; +linksys,e8350-v1 |\ zyxel,nbg6817) hw_mac_addr=$(mtd_get_mac_ascii 0:APPSBLENV ethaddr) ucidef_add_switch "switch0" \ diff --git a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh index 4dc612492c..7b319a5b7c 100644 --- a/target/linux/ipq806x/base-files/lib/upgrade/platform.sh +++ b/target/linux/ipq806x/base-files/lib/upgrade/platform.sh @@ -1,7 +1,7 @@ PART_NAME=firmware REQUIRE_IMAGE_METADATA=1 -RAMFS_COPY_BIN='fw_printenv fw_setenv' +RAMFS_COPY_BIN='fw_printenv fw_setenv fwtool' RAMFS_COPY_DATA='/etc/fw_env.config /var/lock/fw_printenv.lock' platform_check_image() { @@ -20,6 +20,7 @@ platform_do_upgrade() { nand_do_upgrade "$1" ;; compex,wpq864|\ + linksys,e8350-v1|\ netgear,d7800 |\ netgear,r7500 |\ netgear,r7500v2 |\ diff --git a/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8064-e8350-v1.dts b/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8064-e8350-v1.dts new file mode 100644 index 0000000000..872deeb044 --- /dev/null +++ b/target/linux/ipq806x/files/arch/arm/boot/dts/qcom-ipq8064-e8350-v1.dts @@ -0,0 +1,246 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT +#include "qcom-ipq8064-v2.0.dtsi" + +#include +#include + +/ { + model = "Linksys E8350 V1 WiFi Router"; + compatible = "linksys,e8350-v1", "qcom,ipq8064"; + + memory@0 { + reg = <0x42000000 0x1e000000>; + device_type = "memory"; + }; + + aliases { + serial0 = &gsbi4_serial; + + led-boot = &led_power; + led-failsafe = &led_power; + led-running = &led_power; + led-upgrade = &led_power; + }; + + keys { + compatible = "gpio-keys"; + pinctrl-0 = <&button_pins>; + pinctrl-names = "default"; + + reset { + label = "reset"; + gpios = <&qcom_pinmux 68 GPIO_ACTIVE_LOW>; + linux,code = ; + }; + + wps { + label = "wps"; + gpios = <&qcom_pinmux 65 GPIO_ACTIVE_LOW>; + linux,code = ; + }; + + wifi { + label = "wifi"; + gpios = <&qcom_pinmux 67 GPIO_ACTIVE_LOW>; + linux,code = ; + }; + }; + + nand-controller@1ac00000 { + compatible = "qcom,ipq806x-nand"; + reg = <0x1ac00000 0x800>; + clocks = <&gcc EBI2_CLK>, + <&gcc EBI2_AON_CLK>; + clock-names = "core", "aon"; + dmas = <&adm_dma 3>; + dma-names = "rxtx"; + qcom,cmd-crci = <15>; + qcom,data-crci = <3>; + + nand@0 { + reg = <0>; + + nand-ecc-strength = <4>; + nand-bus-width = <8>; + + partitions { + compatible = "fixed-partitions"; + + partition@0 { + label = "ubi"; + reg = <0 0x4000000>; + }; + + partition@4000000 { + label = "extra"; + reg = <0x4000000 0x4000000>; + }; + }; + }; + }; + + + leds { + compatible = "gpio-leds"; + pinctrl-0 = <&led_pins>; + pinctrl-names = "default"; + + led_power: power { + label = "green:power"; + gpios = <&qcom_pinmux 26 GPIO_ACTIVE_HIGH>; + default-state = "keep"; + }; + + wps { + label = "green:wps"; + gpios = <&qcom_pinmux 53 GPIO_ACTIVE_HIGH>; + }; + + wifi { + label = "green:wifi"; + gpios = <&qcom_pinmux 54 GPIO_ACTIVE_HIGH>; + }; + }; +}; + +&qcom_pinmux { + button_pins: button_pins { + mux { + pins = "gpio68","gpio65", "gpio67"; + function = "gpio"; + drive-strength = <2>; + bias-pull-up; + }; + }; + + led_pins: led_pins { + mux { + pins = "gpio26","gpio53", "gpio54"; + function = "gpio"; + drive-strength = <2>; + bias-pull-up; + }; + }; +}; + +&gsbi4 { + qcom,mode = ; + status = "okay"; + serial@16340000 { + status = "okay"; + }; + /* + * The i2c device on gsbi4 should not be enabled. + * On ipq806x designs gsbi4 i2c is meant for exclusive + * RPM usage. Turning this on in kernel manifests as + * i2c failure for the RPM. + */ +}; +&gsbi5 { + qcom,mode = ; + status = "okay"; + + spi5: spi@1a280000 { + status = "okay"; + + pinctrl-0 = <&spi_pins>; + pinctrl-names = "default"; + + cs-gpios = <&qcom_pinmux 20 GPIO_ACTIVE_HIGH>; + + m25p80@0 { + compatible = "jedec,spi-nor"; + spi-max-frequency = <51200000>; + reg = <0>; + + partitions { + compatible = "qcom,smem"; + }; + }; + }; +}; + +&sata_phy { + status = "okay"; +}; + +&sata { + status = "okay"; +}; + +&usb3_0 { + clocks = <&gcc USB30_1_MASTER_CLK>; + status = "okay"; +}; + +&usb3_1 { + clocks = <&gcc USB30_0_MASTER_CLK>; + status = "okay"; +}; + +&pcie0 { + status = "okay"; +}; + +&pcie1 { + status = "okay"; +}; + +&pcie2 { + status = "okay"; +}; + +&mdio0 { + status = "okay"; + + pinctrl-0 = <&mdio0_pins>; + pinctrl-names = "default"; + + phy0: ethernet-phy@0 { + reg = <0>; + qca,ar8327-initvals = < + 0x00004 0x7600000 /* PAD0_MODE */ + 0x00008 0x1000000 /* PAD5_MODE */ + 0x0000c 0x80 /* PAD6_MODE */ + 0x00010 0x2613a0 /* PWS_REG */ + 0x000e4 0x6a545 /* MAC_POWER_SEL */ + 0x000e0 0xc74164de /* SGMII_CTRL */ + 0x0007c 0x4e /* PORT0_STATUS */ + 0x00094 0x4e /* PORT6_STATUS */ + >; + }; +}; + +&gmac1 { + status = "okay"; + phy-mode = "rgmii"; + qcom,id = <1>; + + pinctrl-0 = <&rgmii2_pins>; + pinctrl-names = "default"; + + fixed-link { + speed = <1000>; + full-duplex; + }; +}; + +&gmac2 { + status = "okay"; + phy-mode = "sgmii"; + qcom,id = <2>; + + fixed-link { + speed = <1000>; + full-duplex; + }; +}; + +&tcsr { + qcom,usb-ctrl-select = ; + compatible = "qcom,tcsr"; +}; + +&adm_dma { + status = "okay"; +}; diff --git a/target/linux/ipq806x/image/Makefile b/target/linux/ipq806x/image/Makefile index bab1da0090..5ea38f564d 100644 --- a/target/linux/ipq806x/image/Makefile +++ b/target/linux/ipq806x/image/Makefile @@ -23,6 +23,17 @@ define Build/edimax-header @mv $@.new $@ endef +# tune addpattern for Linksys E8350-V1 fw pattern generation +define Build/linksys-bin + $(STAGING_DIR_HOST)/bin/addpattern -p $(FW_DEVICE_ID) -v $(FW_VERSION) $(if $(SERIAL),-s $(SERIAL)) -i $@ -o $@.new + mv $@.new $@ +endef +# Use Linksys fw header generator to upgrade openwrt factory image over the native Linksys WEB interface +define Build/linksys-addfwhdr + -$(STAGING_DIR_HOST)/bin/addfwhdr -i $@ -o $@.new \ + ;mv "$@.new" "$@" +endef + define Device/Default PROFILES := Default KERNEL_DEPENDS = $$(wildcard $(DTS_DIR)/$$(DEVICE_DTS).dts) @@ -145,6 +156,24 @@ define Device/edgecore_ecw5410 endef TARGET_DEVICES += edgecore_ecw5410 +define Device/linksys_e8350-v1 + $(call Device/LegacyImage) + DEVICE_VENDOR := Linksys + DEVICE_MODEL := E8350 + DEVICE_VARIANT := v1 + SOC := qcom-ipq8064 + FW_VERSION := v1.0.03.003 + FW_DEVICE_ID := 8350 + PAGESIZE := 2048 + BLOCKSIZE := 128k + KERNEL_IN_UBI := 1 + IMAGES = factory.bin sysupgrade.ubi + IMAGE/sysupgrade.ubi := append-ubi | check-size 0x04000000 | append-metadata + IMAGE/factory.bin := append-ubi | check-size 0x04000000 | linksys-addfwhdr | linksys-bin + DEVICE_PACKAGES := ath10k-firmware-qca988x-ct +endef +TARGET_DEVICES += linksys_e8350-v1 + define Device/linksys_ea7500-v1 $(call Device/LegacyImage) DEVICE_VENDOR := Linksys diff --git a/target/linux/ipq806x/patches-5.4/0069-arm-boot-add-dts-files.patch b/target/linux/ipq806x/patches-5.4/0069-arm-boot-add-dts-files.patch index 055a4cbc30..df37f18f23 100644 --- a/target/linux/ipq806x/patches-5.4/0069-arm-boot-add-dts-files.patch +++ b/target/linux/ipq806x/patches-5.4/0069-arm-boot-add-dts-files.patch @@ -10,7 +10,7 @@ Signed-off-by: John Crispin --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile -@@ -842,7 +842,24 @@ dtb-$(CONFIG_ARCH_QCOM) += \ +@@ -842,7 +842,25 @@ dtb-$(CONFIG_ARCH_QCOM) += \ qcom-ipq4019-ap.dk04.1-c3.dtb \ qcom-ipq4019-ap.dk07.1-c1.dtb \ qcom-ipq4019-ap.dk07.1-c2.dtb \ @@ -20,6 +20,7 @@ Signed-off-by: John Crispin + qcom-ipq8064-d7800.dtb \ + qcom-ipq8064-db149.dtb \ + qcom-ipq8064-ap161.dtb \ ++ qcom-ipq8064-e8350-v1.dtb \ + qcom-ipq8064-ea7500-v1.dtb \ + qcom-ipq8064-ea8500.dtb \ + qcom-ipq8064-g10.dtb \ From patchwork Sun Jan 24 16:20:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Todor Colov X-Patchwork-Id: 1430931 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.openwrt.org (client-ip=2001:8b0:10b:1231::1; helo=merlin.infradead.org; envelope-from=openwrt-devel-bounces+incoming=patchwork.ozlabs.org@lists.openwrt.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; secure) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=merlin.20170209 header.b=UfUa4L/P; dkim=temperror header.d=abv.bg header.i=@abv.bg header.a=rsa-sha256 header.s=smtp-out header.b=OtmyjznL; dkim-atps=neutral Received: from merlin.infradead.org (merlin.infradead.org [IPv6:2001:8b0:10b:1231::1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4DNyxL68krz9sVn for ; Mon, 25 Jan 2021 03:24:06 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-Id:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=9aPMW21+Z3PuuwG/roWM9At2FLceTrCFGeXTOYr9IN0=; b=UfUa4L/PGuagvDZkYouF3Tdms uBwhwOjchp2NCqIkRv73vqPEOJxKG2wYd2i20GzXE3mdvDHoteoFyE7VVp562w8mkPhKnZmybq2YA qkOpr6fJsLPuEoqs33s0jTO2PQKXXu/j188jT5Kri+I3S9opiFZUHXE9voJ7heUHYrkNyzsUA1hN4 Xh2FsY6H+q8eG1UESjPm4J3PGi6CXYgOD/wIuHKww0aPGY0YS04XjUhkJ3IXNfXjbqTAZLyVG17Y3 OR+3swlzoetNwjLRK4CS24aDzSBOcs2fP+m70OqGJ7CeQRBBgRBQwTe4PWeEAZuwc3jF5OyIiAkxg 1AnV8vyUQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l3i85-0007qW-TG; Sun, 24 Jan 2021 16:20:45 +0000 Received: from pop32.abv.bg ([194.153.145.222]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1l3i81-0007pZ-Rb for openwrt-devel@lists.openwrt.org; Sun, 24 Jan 2021 16:20:43 +0000 Received: from smtp.abv.bg (localhost [127.0.0.1]) by pop32.abv.bg (Postfix) with ESMTP id C27D41FE53; Sun, 24 Jan 2021 18:20:40 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=abv.bg; s=smtp-out; t=1611505240; bh=E6jbnDzJ27L6j3ZKfmUp/ZD8JF4iv5MAS65ObcnRSLA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OtmyjznLOWY7rCKpitJV+Q7XSi1s63pegIYaqFkvp36Jl83f7l20Ei77ugbi8jQhJ P4bjX+vfkTYUR8UxhzLf2qh7ynKYPCDnWFu39kQA2gGOO2qJ9EJE6ylOh6jPFFndkq KEpz2hRjN2v5SMy/hAOlaEiSLTMi/7cPTLH0GmN8= X-HELO: tchome.lan Authentication-Results: smtp.abv.bg; auth=pass (plain) smtp.auth=todorcolov@abv.bg Received: from host.48.137.bol-bg.com (HELO tchome.lan) (78.128.48.137) by smtp.abv.bg (qpsmtpd/0.96) with ESMTPSA (ECDHE-RSA-AES128-GCM-SHA256 encrypted); Sun, 24 Jan 2021 18:20:40 +0200 From: Todor Colov To: openwrt-devel@lists.openwrt.org Subject: [PATCH v7 2/2] [v7, 2/2] tools: addfwhrd Linksys E8350v1 FW header genarator Date: Sun, 24 Jan 2021 18:20:22 +0200 Message-Id: <20210124162022.24178-2-todorcolov@abv.bg> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210124162022.24178-1-todorcolov@abv.bg> References: <20210124162022.24178-1-todorcolov@abv.bg> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210124_112042_156027_9EB6BDA3 X-CRM114-Status: GOOD ( 26.36 ) X-Spam-Score: -0.2 (/) X-Spam-Report: SpamAssassin version 3.4.4 on merlin.infradead.org summary: Content analysis details: (-0.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider [todorcolov[at]abv.bg] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's domain -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from envelope-from domain X-BeenThere: openwrt-devel@lists.openwrt.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: OpenWrt Development List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Todor Colov Sender: "openwrt-devel" Errors-To: openwrt-devel-bounces+incoming=patchwork.ozlabs.org@lists.openwrt.org Signed-off-by: Todor Colov --- tools/firmware-utils/Makefile | 1 + tools/firmware-utils/src/addfwhdr.c | 233 ++++++++++++++++++++++++++++ 2 files changed, 234 insertions(+) create mode 100644 tools/firmware-utils/src/addfwhdr.c diff --git a/tools/firmware-utils/Makefile b/tools/firmware-utils/Makefile index e4a31b6fd0..34a857c6e5 100644 --- a/tools/firmware-utils/Makefile +++ b/tools/firmware-utils/Makefile @@ -25,6 +25,7 @@ endef define Host/Compile mkdir -p $(HOST_BUILD_DIR)/bin $(call cc,add_header) + $(call cc,addfwhdr cyg_crc32) $(call cc,addpattern) $(call cc,asustrx) $(call cc,bcm4908asus,-Wall) diff --git a/tools/firmware-utils/src/addfwhdr.c b/tools/firmware-utils/src/addfwhdr.c new file mode 100644 index 0000000000..ada56e6abf --- /dev/null +++ b/tools/firmware-utils/src/addfwhdr.c @@ -0,0 +1,233 @@ +/* + Linksys e8350 v1 firmware header generator +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "cyg_crc.h" +#define AC2350 20 +#define USA 1 + +#if LOCALE == USA + #define CYBERTAN_VERSION "v1.0.03" + #define SERIAL_NUMBER "003" + #define MINOR_VERSION "" + #define BUILD_KEYWORD " B" + #define BUILD_NUMBER SERIAL_NUMBER + #define BETA_VERSION " " + #define CYBERTAN_UBOOT_VERSION "v1.0" +#else // ETSI + #define CYBERTAN_VERSION "v1.0.00" + #define SERIAL_NUMBER "01" + #define MINOR_VERSION "" + #define BUILD_KEYWORD " B" + #define BUILD_NUMBER SERIAL_NUMBER + #define BETA_VERSION " " + #define CYBERTAN_UBOOT_VERSION "v1.0" +#endif + +//add for AC2350 F/W header +#define FWHDR_MAGIC_STR "CHDR" +#define FWHDR_MAGIC 0X52444843 +struct cbt_fw_header +{ + unsigned int magic; /* "CHDR" */ + unsigned int len; /* Length of file including header */ + unsigned int crc32; /* 32-bit CRC */ + unsigned int res; +}; + +#define MAX_BUF 1024 +#define CRC32_INIT_VALUE 0xffffffff /* Initial CRC32 checksum value */ + +#ifndef TYPEDEF_UINT8 +typedef unsigned char uint8; +#endif + +#ifndef TYPEDEF_UINT16 +typedef unsigned short uint16; +#endif + +#ifndef TYPEDEF_UINT32 +typedef unsigned int uint32; +#endif + +typedef uint32_t cyg_uint32; +typedef uint16_t cyg_uint16; + +extern cyg_uint32 cyg_crc32_accumulate(cyg_uint32 crc32val, unsigned char *s, int len); +//extern uint32 crc32(uint8 *pdata, uint nbytes, uint32 crc); + +int fd, fd_w; + +void die(const char * str, ...) +{ + va_list args; + va_start(args, str); + vfprintf(stderr, str, args); + fputc('\n', stderr); + exit(1); +} + +int fill_null0(int size) +{ + unsigned char buf[1]; + int i; + + fprintf(stderr,"Fill null\n"); + + buf[0] = 0xff; + for (i=0 ; i< size; i++ ) + if (write(fd_w, buf, 1) != 1) + return 0; + + return 1; +} + +long file_open(const char *name) +{ + struct stat sb; + if ((fd = open(name, O_RDONLY, 0)) < 0){ + die("Unable to open `%s' : %m", name); + } + + if (fstat (fd, &sb)) + die("Unable to stat `%s' : %m", name); + + return sb.st_size; +} + +void usage(void) +{ + die("Usage: addfwhdr [-i|--input] sysupgrade.o [-o|--output] code.bin\n"); +} + +int main(int argc, char ** argv) +{ + uint input_size,c; + char *input_file=NULL, *output_file=NULL; + int opt; + int option_index=0; + int garbage = 0; + char *buf = NULL; + extern char *optarg; + extern int optind, opterr, optopt; + + struct cbt_fw_header *fwhdr; + uint32 crc; + + static struct option long_options[] = + { + {"input", 1, 0, 'i'}, + {"output", 1, 0, 'o'}, + {"garbage", 0, 0, 'g'}, + {0, 0, 0, 0} + }; + + printf("\n---------- add fw header --------\n"); + + fwhdr = malloc(sizeof(struct cbt_fw_header)); + memset(fwhdr, 0, sizeof(struct cbt_fw_header)); + + while(1){ + opt = getopt_long(argc, argv, "i:o:g",long_options, &option_index); + if(opt == -1) + break; + switch(opt){ + case 'h' : + usage(); break; + case 'i' : + input_file = optarg; + printf("input file is [%s]\n",input_file); break; + case 'o' : + output_file = optarg; + printf("output file is [%s]\n",output_file); break; + case 'g' : + garbage = 1; break; + default : + usage(); + } + } + + if(!input_file || !output_file) + { + printf("You must specify the input and output file!\n"); + usage(); + } + + + unlink(output_file); + if ((fd_w = open(output_file,O_RDWR|O_CREAT, S_IREAD | S_IWRITE)) < 0){ + die("Unable to open `%s' : %m", output_file); + } + + fwhdr = malloc(sizeof(struct cbt_fw_header)); + memset(fwhdr, 0, sizeof(struct cbt_fw_header)); + + memcpy((char *)&fwhdr->magic, FWHDR_MAGIC_STR, sizeof(fwhdr->magic)); + + input_size = file_open(input_file); + if(!(buf = malloc(input_size))) + { + perror("malloc"); + goto fail; + } + c = read(fd, buf, input_size); + fwhdr->len = input_size + sizeof(struct cbt_fw_header); + + fwhdr->res = fwhdr->res | 0x1; + + //junzhao add fw build date in cbt_fw_header for calculate MD5 + #if 0 + { + static char *months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + int year, day, mon=1; + char temp[10]={0}; + unsigned char *p_date = (unsigned char *)&fwhdr->res; + int j; + + sscanf(__DATE__, "%s %d %d", temp, &day, &year); + + for(j=0;j<12;j++) { + if(!strcmp(temp, months[j])) { + mon = j+1; + break; + } + } + p_date[0]= year-2000; + p_date[1]= mon; + p_date[2]= day; + + printf("%s: Build date(20%d-%d-%d)\n", __FUNCTION__, p_date[0], p_date[1], p_date[2]); + + } + #endif + //end + + crc = cyg_crc32_accumulate(CRC32_INIT_VALUE,(uint8 *)&fwhdr->res, 4); + crc = cyg_crc32_accumulate(crc,(uint8 *)&buf[0], input_size); + + fwhdr->crc32 = crc; + + /* write code pattern header */ + write(fd_w, fwhdr, sizeof(struct cbt_fw_header)); + + if(write(fd_w, buf, c)!=c) + die("Write call failed!\n"); + +fail: + if(buf) + free(buf); + close (fd); + close (fd_w); + + return 0; +}