[LEDE-DEV] [PATCH] ar71xx: add support for Comfast CF-E312A V2

Piotr Dymacz pepe2k at gmail.com
Tue Dec 12 11:53:15 PST 2017


Hello Bill,

Please see below some more comments (excluding those from John).

I closed your PR on GitHub [1] as it's a copy of your patch (there is no 
need to send it here and on GitHub).

On 06.12.2017 20:37, bmoffitt at bmoffitt.com wrote:
> The Comfast CF-E312A V2 is a 5 GHz radio with a built-in directional antenna,
> much like a Ubiquiti NanoStation M5.
> 
> Specifiation:
> - SoC: AR9344 at 650 MHz
> - Flash: 16 MiB (W25Q128FVSG)
> - RAM: 64 MiB DDR2 (W9751G6KB)
> - Ethernet:  1 x WAN (100 Mbps) and 1 x LAN (100 Mbps)
> - Button: 1 x reset button, 1 x PoE pass-through switch
> - LED: 8 x LEDS (Power, LAN, WAN, Wireless, 4 signal LEDs)
> - UART: 1 x UART with header on PCB (GND, RX, TX, 3.3V)
> 
> It is very similar to the CF-316N - similar chipset, etc. The major
> differences are:
> 
> * It operates at 5 GHz, not 2.4
> * All the LEDs are white
> * It has 4 signal LEDs
> 
> Of note: the eth1 port has an optional PoE pass-through, controlled with a
> slider switch.
> 
> Most of the changes are in the file
> target/linux/ar71xx/files/arch/mips/ath79/mach-cf-e316n-v2.c - the code
> for the E316N was copied and modified to support the additional LEDs, the
> LED colors, and a few changes in the GPIOs.
> 
> Firmware can be flashed on these units by the following method:
> 1.) Apply power to the unit
> 2.) Immediately AFTER applying power, hold down the reset button
> 3.) The WAN, LAN, and wireless lights will flash - wait three seconds
> (three flashes) and then release the button.
> 4.) After a second, the lights will "flutter" quickly and the unit will
> be visible at 192.168.1.1. A web page will be available to enable quick
> and simple uploading and flashing of firmware.
> 
> During the boot process, these units also look for a tftp server at
> 192.168.1.10. If one is present, the firmware can be uploaded as a file
> called "firmware-auto.bin"
> 
> Signed-off-by: bmoffitt at bmoffitt.com <bmoffitt at ayrstone.com>
> ---
>   target/linux/ar71xx/base-files/etc/board.d/01_leds |   5 +
>   target/linux/ar71xx/base-files/etc/diag.sh         |   1 +
>   target/linux/ar71xx/base-files/lib/ar71xx.sh       |   3 +
>   .../ar71xx/base-files/lib/upgrade/platform.sh      |   1 +
>   target/linux/ar71xx/config-4.4                     |   1 +
>   target/linux/ar71xx/config-4.9                     |   1 +
>   .../ar71xx/files/arch/mips/ath79/Kconfig.openwrt   |  10 ++
>   target/linux/ar71xx/files/arch/mips/ath79/Makefile |   1 +
>   .../files/arch/mips/ath79/mach-cf-e316n-v2.c       | 127 +++++++++++++++++++++
>   .../linux/ar71xx/files/arch/mips/ath79/machtypes.h |   1 +
>   target/linux/ar71xx/image/generic.mk               |   8 ++
>   11 files changed, 159 insertions(+)
> 
> diff --git a/target/linux/ar71xx/base-files/etc/board.d/01_leds b/target/linux/ar71xx/base-files/etc/board.d/01_leds
> index e5baa90..c55a8bc 100755
> --- a/target/linux/ar71xx/base-files/etc/board.d/01_leds
> +++ b/target/linux/ar71xx/base-files/etc/board.d/01_leds
> @@ -182,6 +182,11 @@ carambola2)
>   	ucidef_set_led_netdev "wan" "WAN" "$board:orange:eth1" "eth1"
>   	ucidef_set_led_wlan "wlan" "WLAN" "$board:green:wlan" "phy0tpt"
>   	;;
> +cf-e312a)

If it's CF-E312A v2, please follow the general approach (example is just 
a few lines below) and use "cf-e312a-v2" for the board name. If not 
(COMFAST surprises me all the time with their weird and broken version 
scheme), please change your commit subject and description (drop v2).

> +	ucidef_set_led_netdev "lan" "LAN" "$board:white:lan" "eth0"
> +	ucidef_set_led_netdev "wan" "WAN" "$board:white:wan" "eth1"
> +	ucidef_set_led_wlan "wlan" "WLAN" "$board:white:wlan" "phy0tpt"
> +	;;
>   cf-e316n-v2)
>   	ucidef_set_led_netdev "lan" "LAN" "$board:blue:lan" "eth0"
>   	ucidef_set_led_netdev "wan" "WAN" "$board:blue:wan" "eth1"
> diff --git a/target/linux/ar71xx/base-files/etc/diag.sh b/target/linux/ar71xx/base-files/etc/diag.sh
> index 6cbb357..45939ea 100644
> --- a/target/linux/ar71xx/base-files/etc/diag.sh
> +++ b/target/linux/ar71xx/base-files/etc/diag.sh
> @@ -119,6 +119,7 @@ get_status_led() {
>   	cap4200ag)
>   		status_led="senao:green:pwr"
>   		;;
> +	cf-e312a|\
>   	cf-e316n-v2|\
>   	cf-e520n|\
>   	cf-e530n)
> diff --git a/target/linux/ar71xx/base-files/lib/ar71xx.sh b/target/linux/ar71xx/base-files/lib/ar71xx.sh
> index 285fa68..7491f2d 100755
> --- a/target/linux/ar71xx/base-files/lib/ar71xx.sh
> +++ b/target/linux/ar71xx/base-files/lib/ar71xx.sh
> @@ -504,6 +504,9 @@ ar71xx_board_detect() {
>   	*"Carambola2"*)
>   		name="carambola2"
>   		;;
> +	*"CF-E312A")
> +		name="cf-e312a"
> +		;;
>   	*"CF-E316N v2")
>   		name="cf-e316n-v2"
>   		;;
> diff --git a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> index 172a58b..fd81bf1 100755
> --- a/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> +++ b/target/linux/ar71xx/base-files/lib/upgrade/platform.sh
> @@ -215,6 +215,7 @@ platform_check_image() {
>   	bullet-m|\
>   	c-55|\
>   	carambola2|\
> +	cf-e312a|\
>   	cf-e316n-v2|\
>   	cf-e320n-v2|\
>   	cf-e355ac|\
> diff --git a/target/linux/ar71xx/config-4.4 b/target/linux/ar71xx/config-4.4
> index 3ba3853..9682af1 100644
> --- a/target/linux/ar71xx/config-4.4
> +++ b/target/linux/ar71xx/config-4.4
> @@ -67,6 +67,7 @@ CONFIG_ATH79_MACH_C55=y
>   CONFIG_ATH79_MACH_CAP324=y
>   CONFIG_ATH79_MACH_CAP4200AG=y
>   CONFIG_ATH79_MACH_CARAMBOLA2=y
> +CONFIG_ATH79_MACH_CF_E312A=y
>   CONFIG_ATH79_MACH_CF_E316N_V2=y
>   CONFIG_ATH79_MACH_CF_E320N_V2=y
>   CONFIG_ATH79_MACH_CF_E355AC=y
> diff --git a/target/linux/ar71xx/config-4.9 b/target/linux/ar71xx/config-4.9
> index 1d47246..9c1fdf5 100644
> --- a/target/linux/ar71xx/config-4.9
> +++ b/target/linux/ar71xx/config-4.9
> @@ -65,6 +65,7 @@ CONFIG_ATH79_MACH_C55=y
>   CONFIG_ATH79_MACH_CAP324=y
>   CONFIG_ATH79_MACH_CAP4200AG=y
>   CONFIG_ATH79_MACH_CARAMBOLA2=y
> +CONFIG_ATH79_MACH_CF_E312A=y
>   CONFIG_ATH79_MACH_CF_E316N_V2=y
>   CONFIG_ATH79_MACH_CF_E320N_V2=y
>   CONFIG_ATH79_MACH_CF_E355AC=y
> diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> index 1198fcb..58b58f2 100644
> --- a/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> +++ b/target/linux/ar71xx/files/arch/mips/ath79/Kconfig.openwrt
> @@ -2051,6 +2051,16 @@ config ATH79_MACH_RAMBUTAN
>   	select ATH79_DEV_USB
>   	select ATH79_DEV_WMAC
>   
> +config ATH79_MACH_CF_E312A
> +	bool "COMFAST CF-E312A support"
> +	select SOC_AR934X
> +	select ATH79_DEV_ETH
> +	select ATH79_DEV_GPIO_BUTTONS
> +	select ATH79_DEV_LEDS_GPIO
> +	select ATH79_DEV_M25P80
> +	select ATH79_DEV_USB
> +	select ATH79_DEV_WMAC
> +
>   config ATH79_MACH_CF_E316N_V2
>   	bool "COMFAST CF-E316N v2 support"
>   	select SOC_AR934X
> diff --git a/target/linux/ar71xx/files/arch/mips/ath79/Makefile b/target/linux/ar71xx/files/arch/mips/ath79/Makefile
> index 455af76..eec7ef9 100644
> --- a/target/linux/ar71xx/files/arch/mips/ath79/Makefile
> +++ b/target/linux/ar71xx/files/arch/mips/ath79/Makefile
> @@ -74,6 +74,7 @@ obj-$(CONFIG_ATH79_MACH_C60)			+= mach-c60.o
>   obj-$(CONFIG_ATH79_MACH_CAP324)			+= mach-cap324.o
>   obj-$(CONFIG_ATH79_MACH_CAP4200AG)		+= mach-cap4200ag.o
>   obj-$(CONFIG_ATH79_MACH_CARAMBOLA2)		+= mach-carambola2.o
> +obj-$(CONFIG_ATH79_MACH_CF_E312A)		+= mach-cf-e316n-v2.o
>   obj-$(CONFIG_ATH79_MACH_CF_E316N_V2)		+= mach-cf-e316n-v2.o
>   obj-$(CONFIG_ATH79_MACH_CF_E320N_V2)		+= mach-cf-e316n-v2.o
>   obj-$(CONFIG_ATH79_MACH_CF_E355AC)		+= mach-cf-e316n-v2.o
> diff --git a/target/linux/ar71xx/files/arch/mips/ath79/mach-cf-e316n-v2.c b/target/linux/ar71xx/files/arch/mips/ath79/mach-cf-e316n-v2.c
> index 82fe83f..849117a 100644
> --- a/target/linux/ar71xx/files/arch/mips/ath79/mach-cf-e316n-v2.c
> +++ b/target/linux/ar71xx/files/arch/mips/ath79/mach-cf-e316n-v2.c
> @@ -1,5 +1,6 @@
>   /*
>    *  Support for COMFAST boards:
> + *  - CF-E312A v2 (AR9344)
>    *  - CF-E316N v2 (AR9341)
>    *  - CF-E320N v2 (QCA9531)
>    *  - CF-E355AC (QCA9531)
> @@ -36,6 +37,81 @@
>   #define CF_EXXXN_KEYS_POLL_INTERVAL	20
>   #define CF_EXXXN_KEYS_DEBOUNCE_INTERVAL	(3 * CF_EXXXN_KEYS_POLL_INTERVAL)
>   
> +/* CF-E312A */
> +#define CF_E312A_GPIO_LED_LAN           2
> +#define CF_E312A_GPIO_LED_WAN           3
> +#define CF_E312A_GPIO_LED_WLAN          0
> +#define CF_E312A_GPIO_LED_SIGNAL1       14
> +#define CF_E312A_GPIO_LED_SIGNAL2       15
> +#define CF_E312A_GPIO_LED_SIGNAL3       16
> +#define CF_E312A_GPIO_LED_SIGNAL4       17
> +#define CF_E312A_GPIO_BTN_SUITE         11
> +#define CF_E312A_GPIO_BTN_RESET         22
> +#define CF_E312A_GPIO_SDA               1
> +#define CF_E312A_GPIO_SCL               12
> +
> +#define CF_E312A_GPIO_XWDT_TRIGGER      19
> +
> +static struct gpio_led cf_e312a_leds_gpio[] __initdata = {
> +	{
> +		.name		= "cf-e312a:white:lan",
> +		.gpio		= CF_E312A_GPIO_LED_LAN,
> +		.active_low	= 0,
> +	}, {
> +		.name		= "cf-e312a:white:wan",
> +		.gpio		= CF_E312A_GPIO_LED_WAN,
> +		.active_low	= 0,
> +	}, {
> +		.name		= "cf-e312a:white:wlan",
> +		.gpio		= CF_E312A_GPIO_LED_WLAN,
> +		.active_low	= 1,
> +	}, {
> +		.name		= "cf-e312a:white:signal1",
> +		.gpio		= CF_E312A_GPIO_LED_SIGNAL1,
> +		.active_low	= 1,
> +	}, {
> +		.name		= "cf-e312a:white:signal2",
> +		.gpio		= CF_E312A_GPIO_LED_SIGNAL2,
> +		.active_low	= 1,
> +	}, {
> +		.name		= "cf-e312a:white:signal3",
> +		.gpio		= CF_E312A_GPIO_LED_SIGNAL3,
> +		.active_low	= 1,
> +	}, {
> +		.name		= "cf-e312a:white:signal4",
> +		.gpio		= CF_E312A_GPIO_LED_SIGNAL4,
> +		.active_low	= 1,
> +
> +	}, {
> +		.name		= "cf-e312a:sda",
> +		.gpio		= CF_E312A_GPIO_SDA,
> +		.active_low	= 0,
> +	}, {
> +		.name		= "cf-e312a:scl",
> +		.gpio		= CF_E312A_GPIO_SCL,
> +		.active_low	= 0,
> +	},

GPIO connected LEDs =/= I2C pins, please drop or fix it (if bit-banged 
I2C is used on this board at all).

> +};
> +
> +static struct gpio_keys_button cf_e312a_gpio_keys[] __initdata = {
> +	{
> +		.desc		= "reset",
> +		.type		= EV_KEY,
> +		.code		= KEY_RESTART,
> +		.debounce_interval = CF_EXXXN_KEYS_DEBOUNCE_INTERVAL,
> +		.gpio		= CF_E312A_GPIO_BTN_RESET,
> +		.active_low	= 0,
> +	}, {
> +		.desc		= "suite button",
> +		.type		= EV_KEY,
> +		.code		= KEY_POWER,
> +		.debounce_interval = CF_EXXXN_KEYS_DEBOUNCE_INTERVAL,
> +		.gpio		= CF_E312A_GPIO_BTN_SUITE,
> +		.active_low	= 1,

Your commit message doesn't include anything about this button and 
"suite" name doesn't explain it either. I wasn't able to also find 
second button on the device pictures from the Internet.

Can you tell what it is and what it's used for or drop it if it's a mistake?

> +	},
> +};
> +
> +
>   /* CF-E316N v2 */
>   #define CF_E316N_V2_GPIO_LED_DIAG_B	0
>   #define CF_E316N_V2_GPIO_LED_DIAG_R	2
> @@ -290,6 +366,57 @@ static void __init cf_exxxn_common_setup(unsigned long art_ofs, int gpio_wdt)
>   	ath79_register_usb();
>   }
>   
> +static void __init cf_e312a_setup(void)
> +{
> +	u8 *mac = (u8 *) KSEG1ADDR(0x1f010000);
> +
> +	cf_exxxn_common_setup(0x10000, CF_E312A_GPIO_XWDT_TRIGGER);
> +
> +	ath79_setup_ar934x_eth_cfg(AR934X_ETH_CFG_SW_PHY_SWAP);
> +
> +	ath79_register_mdio(1, 0x0);
> +
> +	/* GMAC0 is connected to the PHY0 of the internal switch */
> +	ath79_switch_data.phy4_mii_en = 1;
> +	ath79_switch_data.phy_poll_mask = BIT(0);
> +	ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
> +	ath79_eth0_data.phy_mask = BIT(0);
> +	ath79_eth0_data.mii_bus_dev = &ath79_mdio1_device.dev;
> +	ath79_init_mac(ath79_eth0_data.mac_addr, mac, 0);
> +	ath79_register_eth(0);
> +
> +	/* GMAC1 is connected to the internal switch */
> +	ath79_eth1_data.phy_if_mode = PHY_INTERFACE_MODE_GMII;
> +	ath79_init_mac(ath79_eth1_data.mac_addr, mac, 2);
> +	ath79_register_eth(1);
> +
> +	ath79_gpio_direction_select(CF_E312A_GPIO_LED_LAN, true);
> +	ath79_gpio_direction_select(CF_E312A_GPIO_LED_WAN, true);
> +	ath79_gpio_direction_select(CF_E312A_GPIO_LED_WLAN, true);
> +	ath79_gpio_direction_select(CF_E312A_GPIO_LED_SIGNAL1, true);
> +	ath79_gpio_direction_select(CF_E312A_GPIO_LED_SIGNAL2, true);
> +	ath79_gpio_direction_select(CF_E312A_GPIO_LED_SIGNAL3, true);
> +	ath79_gpio_direction_select(CF_E312A_GPIO_LED_SIGNAL4, true);
> +
> +	ath79_gpio_output_select(CF_E312A_GPIO_LED_LAN, 0);
> +	ath79_gpio_output_select(CF_E312A_GPIO_LED_WAN, 0);
> +	ath79_gpio_output_select(CF_E312A_GPIO_LED_WLAN, 0);
> +	ath79_gpio_output_select(CF_E312A_GPIO_LED_SIGNAL1, 0);
> +	ath79_gpio_output_select(CF_E312A_GPIO_LED_SIGNAL2, 0);
> +	ath79_gpio_output_select(CF_E312A_GPIO_LED_SIGNAL3, 0);
> +	ath79_gpio_output_select(CF_E312A_GPIO_LED_SIGNAL4, 0);
> +
> +	ath79_register_leds_gpio(-1, ARRAY_SIZE(cf_e312a_leds_gpio),
> +				 cf_e312a_leds_gpio);
> +
> +	ath79_register_gpio_keys_polled(1, CF_EXXXN_KEYS_POLL_INTERVAL,
> +					ARRAY_SIZE(cf_e312a_gpio_keys),
> +					cf_e312a_gpio_keys);
> +}
> +
> +MIPS_MACHINE(ATH79_MACH_CF_E312A, "CF-E312A", "COMFAST CF-E312A",
> +	     cf_e312a_setup);
> +
>   static void __init cf_e316n_v2_setup(void)
>   {
>   	u8 *mac = (u8 *) KSEG1ADDR(0x1f010000);
> diff --git a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> index 0f536f0..028c398 100644
> --- a/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> +++ b/target/linux/ar71xx/files/arch/mips/ath79/machtypes.h
> @@ -60,6 +60,7 @@ enum ath79_mach_type {
>   	ATH79_MACH_CAP324,			/* PowerCloud CAP324 */
>   	ATH79_MACH_CAP4200AG,			/* Senao CAP4200AG */
>   	ATH79_MACH_CARAMBOLA2,			/* 8devices Carambola2 */
> +	ATH79_MACH_CF_E312A,			/* COMFAST CF-E312A */
>   	ATH79_MACH_CF_E316N_V2,			/* COMFAST CF-E316N v2 */
>   	ATH79_MACH_CF_E320N_V2,			/* COMFAST CF-E320N v2 */
>   	ATH79_MACH_CF_E355AC,			/* COMFAST CF-E355AC */
> diff --git a/target/linux/ar71xx/image/generic.mk b/target/linux/ar71xx/image/generic.mk
> index eb6d6e5..673dab1 100644
> --- a/target/linux/ar71xx/image/generic.mk
> +++ b/target/linux/ar71xx/image/generic.mk
> @@ -135,6 +135,14 @@ define Device/carambola2
>   endef
>   TARGET_DEVICES += carambola2
>   
> +define Device/cf-e312a
> +  DEVICE_TITLE := COMFAST CF-E312A
> +  BOARDNAME := CF-E312A
> +  IMAGE_SIZE := 16192k
> +  MTDPARTS := spi0.0:64k(u-boot)ro,64k(art)ro,16192k(firmware),64k(art-backup)ro
> +endef
> +TARGET_DEVICES += cf-e312a

This looks the same as for CF-E316N v2, you can combine them (make 
cf-e316n-v2 and cf-e320n-v2 recipes include cf-e312a) to save some 
duplicated lines, please have a look at [2] for an example.

[1] https://github.com/lede-project/source/pull/1562

[2] 
https://github.com/lede-project/source/blob/master/target/linux/ar71xx/image/generic.mk#L147

-- 
Cheers,
Piotr



More information about the Lede-dev mailing list