mirror of
				https://github.com/Telecominfraproject/wlan-ap.git
				synced 2025-11-03 20:07:59 +00:00 
			
		
		
		
	Compare commits
	
		
			21 Commits
		
	
	
		
			v2.9.0-rc2
			...
			v2.9.0
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					85ff703e2f | ||
| 
						 | 
					ebd7c79e65 | ||
| 
						 | 
					b3493bcf55 | ||
| 
						 | 
					2b767fb84f | ||
| 
						 | 
					560e9f326d | ||
| 
						 | 
					3da1530926 | ||
| 
						 | 
					abcf6dd1fd | ||
| 
						 | 
					2bcedafe0d | ||
| 
						 | 
					71fc375a72 | ||
| 
						 | 
					95bfa265ee | ||
| 
						 | 
					c0cf066900 | ||
| 
						 | 
					6462efd6bc | ||
| 
						 | 
					0bce7dc7a4 | ||
| 
						 | 
					a3f0fb23b7 | ||
| 
						 | 
					b9d20e083c | ||
| 
						 | 
					725899248a | ||
| 
						 | 
					c8685f2352 | ||
| 
						 | 
					7d10d77e35 | ||
| 
						 | 
					96c391eaac | ||
| 
						 | 
					c700795895 | ||
| 
						 | 
					8bcb4c2063 | 
							
								
								
									
										2
									
								
								.github/workflows/build-dev.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/build-dev.yml
									
									
									
									
										vendored
									
									
								
							@@ -21,7 +21,7 @@ jobs:
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        target: ['actiontec_web7200', 'cig_wf188n', 'cig_wf194c4', 'cig_wf196-us', 'cig_wf196-ca', 'cig_wf610d', 'cig_wf808', 'cybertan_eww622-a1', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'liteon_wpx8324', 'edgecore_ecs4100-12ph', 'edgecore_ecw5211', 'edgecore_ecw5410', 'edgecore_oap100', 'edgecore_ssw2ac2600', 'edgecore_spw2ac1200', 'edgecore_spw2ac1200-lan-poe', 'hfcl_ion4', 'hfcl_ion4xe', 'hfcl_ion4xi', 'hfcl_ion4x', 'hfcl_ion4x_2', 'indio_um-305ac', 'indio_um-305ax', 'indio_um-325ac', 'indio_um-510ac-v3', 'indio_um-550ac', 'indio_um-310ax-v1', 'indio_um-510axp-v1', 'indio_um-510axm-v1', 'linksys_ea6350-v4', 'linksys_e8450-ubi', 'linksys_ea8300', 'meshpp_s618_cp03', 'meshpp_s618_cp01', 'udaya_a5-id2', 'wallys_dr40x9', 'wallys_dr6018', 'wallys_dr6018_v4', 'x64_vm', 'yuncore_ax840', 'yuncore_fap640', 'yuncore_fap650' ]
 | 
			
		||||
        target: ['actiontec_web7200', 'cig_wf188n', 'cig_wf194c4', 'cig_wf196-us', 'cig_wf196-ca', 'cig_wf610d', 'cig_wf660a', 'cig_wf808', 'cybertan_eww622-a1', 'edgecore_eap101', 'edgecore_eap102', 'edgecore_eap104', 'liteon_wpx8324', 'edgecore_ecs4100-12ph', 'edgecore_ecw5211', 'edgecore_ecw5410', 'edgecore_oap100', 'edgecore_ssw2ac2600', 'edgecore_spw2ac1200', 'edgecore_spw2ac1200-lan-poe', 'hfcl_ion4', 'hfcl_ion4xe', 'hfcl_ion4xi', 'hfcl_ion4x', 'hfcl_ion4x_2', 'indio_um-305ac', 'indio_um-305ax', 'indio_um-325ac', 'indio_um-510ac-v3', 'indio_um-550ac', 'indio_um-310ax-v1', 'indio_um-510axp-v1', 'indio_um-510axm-v1', 'linksys_ea6350-v4', 'linksys_e8450-ubi', 'linksys_ea8300', 'meshpp_s618_cp03', 'meshpp_s618_cp01', 'udaya_a5-id2', 'wallys_dr40x9', 'wallys_dr6018', 'wallys_dr6018_v4', 'x64_vm', 'yuncore_ax840', 'yuncore_fap640', 'yuncore_fap650' ]
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
    - uses: actions/checkout@v3
 | 
			
		||||
 
 | 
			
		||||
@@ -190,6 +190,7 @@ ath11k-macs)
 | 
			
		||||
		;;
 | 
			
		||||
	yuncore,ax840|\
 | 
			
		||||
	edgecore,eap102|\
 | 
			
		||||
	edgecore,eap104|\
 | 
			
		||||
	edgecore,eap106|\
 | 
			
		||||
	indio,um-310ax-v1|\
 | 
			
		||||
	indio,um-510axp-v1|\
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,3 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
mac=$(cat /etc/board.json | jsonfilter -e '@["network-device"]["'$DEVICENAME'"]'.macaddr)
 | 
			
		||||
mac=$(cat /etc/board.json | jsonfilter -e '@["network_device"]["'$DEVICENAME'"]'.macaddr)
 | 
			
		||||
[ -n "$mac" ] && ip link set $DEVICENAME address $mac
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@ PKG_NAME:=qca-nss-clients
 | 
			
		||||
PKG_SOURCE_PROTO:=git
 | 
			
		||||
PKG_BRANCH:=master
 | 
			
		||||
PKG_RELEASE:=2
 | 
			
		||||
PKG_SOURCE_URL:=https://source.codeaurora.org/quic/qsdk/oss/lklm/nss-clients/
 | 
			
		||||
PKG_SOURCE_URL:=https://git.codelinaro.org/clo/qsdk/oss/lklm/nss-clients
 | 
			
		||||
PKG_MIRROR_HASH:=802bf8b2dac8da0549e108b873afd982d127370c07d6574ece71f902eafe7698
 | 
			
		||||
PKG_VERSION:=153998d70fdba508a59a28c13a606032cbf32686
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
include $(TOPDIR)/rules.mk
 | 
			
		||||
 | 
			
		||||
PKG_NAME:=mcu-firmware
 | 
			
		||||
PKG_VERSION:=2023-03-05
 | 
			
		||||
PKG_VERSION:=2023-03-12
 | 
			
		||||
PKG_RELEASE:=1
 | 
			
		||||
 | 
			
		||||
PKG_MAINTAINER:=Piotr Dymacz <pepe2k@gmail.com>
 | 
			
		||||
@@ -28,10 +28,15 @@ endef
 | 
			
		||||
#   version-name_git-sha_pipeline-id_sha256-of-package
 | 
			
		||||
ZEPHYR_VERSIONS := \
 | 
			
		||||
	zephyr-v3.3.x_7055d10e538e_3877473859_321a0daf6328698a913c6504d19aa85a5170dfce6039b86d31d2e9162d34af7c \
 | 
			
		||||
	zephyr-main_63d7f67d401d_3877472923_e44948759ad705f8a28449760ec3153f81d3620e0d3665e50490c7786dd2f8e2
 | 
			
		||||
	zephyr-main_cf50a3c570bb_3912606668_10922f34cdde9e16cbee76a13a14fb935b9d1fe13eb9136cba31de27033a9c3e
 | 
			
		||||
 | 
			
		||||
ZEPHYR_FW_CI_URL := https://gitlab.com/pepe2k/zephyr/-/jobs/
 | 
			
		||||
 | 
			
		||||
ZEPHYR_FW_TYPES := \
 | 
			
		||||
	hello_world \
 | 
			
		||||
	hci_uart \
 | 
			
		||||
	hci_usb
 | 
			
		||||
 | 
			
		||||
# Zephyr 'hello_world' targets
 | 
			
		||||
ZEPHYR_HELLO_WORLD_TARGETS := \
 | 
			
		||||
	cig_wf196_nrf52833 \
 | 
			
		||||
@@ -59,6 +64,20 @@ define Download/zephyr-fw
 | 
			
		||||
endef
 | 
			
		||||
$(foreach FW,$(ZEPHYR_VERSIONS),$(eval $(call Download,zephyr-fw,$(FW))))
 | 
			
		||||
 | 
			
		||||
# $(1) firmware name (e.g. hci_usb)
 | 
			
		||||
define zephyr-fw-host-support
 | 
			
		||||
  define Package/zephyr-$(1)-host-support
 | 
			
		||||
    $(call Package/mcu-fw-default)
 | 
			
		||||
    DEPENDS:=+mcu
 | 
			
		||||
    TITLE:=Zephyr '$(1)' common host side support
 | 
			
		||||
    HIDDEN:=1
 | 
			
		||||
  endef
 | 
			
		||||
 | 
			
		||||
  define Package/zephyr-$(1)-host-support/install
 | 
			
		||||
	$(CP) ./files/$(1)/* $$(1)/
 | 
			
		||||
  endef
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
# $(1) version (e.g zephyr-v3.3.x)
 | 
			
		||||
# $(2) firmware name (e.g. hci_usb)
 | 
			
		||||
# $(3) target/board name (e.g. nrf52840dongle_nrf52840)
 | 
			
		||||
@@ -81,6 +100,7 @@ define zephyr-fw
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define zephyr-fw-deps
 | 
			
		||||
	$(if $(wildcard ./files/$(1)/*),+zephyr-$(1)-host-support) \
 | 
			
		||||
	$(if $(findstring hci_u,$1),+bluez-daemon +kmod-bluetooth +kmod-crypto-user)
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
@@ -102,6 +122,15 @@ define Build/Compile
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Generate host side support packages (per firmware type)
 | 
			
		||||
$(foreach FW,$(ZEPHYR_FW_TYPES),\
 | 
			
		||||
  $(if $(wildcard ./files/$(FW)/*),$(eval $(call zephyr-fw-host-support,$(FW)))))
 | 
			
		||||
 | 
			
		||||
$(foreach FW,$(ZEPHYR_FW_TYPES),\
 | 
			
		||||
  $(if $(wildcard ./files/$(FW)/*),$(eval $(call BuildPackage,zephyr-$(FW)-host-support))))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Generate dedicated Zephyr firmware packages (per firmware version, type and board)
 | 
			
		||||
$(foreach VER,$(ZEPHYR_VERSIONS),\
 | 
			
		||||
  $(foreach TARGET,$(ZEPHYR_HELLO_WORLD_TARGETS),\
 | 
			
		||||
    $(eval $(call zephyr-fw,$(call word-underscore,$(VER),1),hello_world,$(TARGET)))))
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										79
									
								
								feeds/mcu/mcu-firmware/files/hci_uart/etc/mcu.d/hci_uart.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										79
									
								
								feeds/mcu/mcu-firmware/files/hci_uart/etc/mcu.d/hci_uart.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,79 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
. /lib/functions.sh
 | 
			
		||||
. /lib/functions/mcu.sh
 | 
			
		||||
 | 
			
		||||
attach_hci_controller() {
 | 
			
		||||
	local section="$1"
 | 
			
		||||
 | 
			
		||||
	local sn
 | 
			
		||||
	local pid
 | 
			
		||||
	local interface
 | 
			
		||||
	local uart_path
 | 
			
		||||
	local uart_baud
 | 
			
		||||
	local uart_flow
 | 
			
		||||
 | 
			
		||||
	[ -n "$section" ] || return 1
 | 
			
		||||
	command -v btattach > /dev/null 2>&1 || return 1
 | 
			
		||||
 | 
			
		||||
	config_load mcu
 | 
			
		||||
	config_get sn "$section" sn
 | 
			
		||||
	config_get interface "$section" interface
 | 
			
		||||
	config_get uart_path "$section" uart_path
 | 
			
		||||
	config_get uart_baud "$section" uart_baud "115200"
 | 
			
		||||
	config_get uart_flow "$section" uart_flow "0"
 | 
			
		||||
 | 
			
		||||
	[ -n "$sn" ] || return 1
 | 
			
		||||
 | 
			
		||||
	if [ "$interface" = "usb" ]; then
 | 
			
		||||
		uart_baud="1000000"
 | 
			
		||||
		uart_flow="1"
 | 
			
		||||
 | 
			
		||||
		dev_found=""
 | 
			
		||||
		usb_path="/sys/bus/usb/devices/*"
 | 
			
		||||
		for dev_path in $usb_path; do
 | 
			
		||||
			dev="$(basename "$dev_path")"
 | 
			
		||||
			[[ $dev == *":"* ]] && continue
 | 
			
		||||
 | 
			
		||||
			[ "$sn" = "$(cat "${dev_path}/serial" 2>/dev/null)" ] && {
 | 
			
		||||
				dev_found="$dev"
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		done
 | 
			
		||||
 | 
			
		||||
		[ -n "$dev_found" ] || return 1
 | 
			
		||||
 | 
			
		||||
		usb_path="/sys/bus/usb/devices/${dev_found}*/tty/*"
 | 
			
		||||
		for tty_path in $usb_path; do
 | 
			
		||||
			tty="$(basename "$tty_path")"
 | 
			
		||||
			[ -c "/dev/${tty}" ] && {
 | 
			
		||||
				uart_path="/dev/${tty}"
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
		done
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	[ -c "$uart_path" ] || return 1
 | 
			
		||||
 | 
			
		||||
	# Give MCU some time for BLE controller setup
 | 
			
		||||
	sleep 1
 | 
			
		||||
 | 
			
		||||
	if [ "$uart_flow" = "1" ]; then
 | 
			
		||||
		btattach -B "$uart_path" -S "$uart_baud" > /dev/null 2>&1 &
 | 
			
		||||
	else
 | 
			
		||||
		btattach -B "$uart_path" -S "$uart_baud" -N > /dev/null 2>&1 &
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	pid="$!"
 | 
			
		||||
 | 
			
		||||
	kill -0 "$pid" > /dev/null 2>&1 && {
 | 
			
		||||
		echo "$pid" > "/var/run/mcu.${sn}.pid"
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
attach_hci_controller "$1" || exit 1
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
include $(TOPDIR)/rules.mk
 | 
			
		||||
 | 
			
		||||
PKG_NAME:=mcu
 | 
			
		||||
PKG_VERSION:=2023-03-05
 | 
			
		||||
PKG_VERSION:=2023-03-22
 | 
			
		||||
PKG_RELEASE=1
 | 
			
		||||
 | 
			
		||||
PKG_LICENSE:=GPL-2.0
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,7 @@ MCU_CFG_FOUND="0"
 | 
			
		||||
 | 
			
		||||
mcu_hotplug_setup() {
 | 
			
		||||
	local sn
 | 
			
		||||
	local fw_type
 | 
			
		||||
	local disabled
 | 
			
		||||
 | 
			
		||||
	local sn_dev="$2"
 | 
			
		||||
@@ -15,6 +16,9 @@ mcu_hotplug_setup() {
 | 
			
		||||
 | 
			
		||||
	SECT="$1"
 | 
			
		||||
 | 
			
		||||
	MCU_SYSINFO_OUTPUT=""
 | 
			
		||||
	MCU_IMGLIST_OUTPUT=""
 | 
			
		||||
 | 
			
		||||
	[ "$MCU_CFG_FOUND" = "1" ] && return 0
 | 
			
		||||
 | 
			
		||||
	config_get sn "$SECT" sn
 | 
			
		||||
@@ -32,11 +36,30 @@ mcu_hotplug_setup() {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	# Stop related service
 | 
			
		||||
	[ -f "/var/run/mcu.${sn}.pid" ] && {
 | 
			
		||||
		kill "$(cat "/var/run/mcu.${sn}.pid" 2>/dev/null)" \
 | 
			
		||||
			> /dev/null 2>&1
 | 
			
		||||
		rm -f "/var/run/mcu.${sn}.pid" > /dev/null 2>&1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mcu_sn_check_and_update "$sn" "$uart"
 | 
			
		||||
	[ $? -ne 0 ] && return 1
 | 
			
		||||
 | 
			
		||||
	mcu_fw_check_and_update "$uart"
 | 
			
		||||
	[ $? -ne 0 ] && return 1
 | 
			
		||||
	rc="$?"
 | 
			
		||||
 | 
			
		||||
	[ "$rc" = "1" ] && return 1
 | 
			
		||||
 | 
			
		||||
	[ "$rc" = "0" ] && {
 | 
			
		||||
		fw_type="$(uci -q get "mcu.${SECT}.firmware" | awk -F '__' '{print $2}')"
 | 
			
		||||
		[ -n "$fw_type" ] || return 0
 | 
			
		||||
 | 
			
		||||
		[ -x "${MCU_HS_DIR}/${fw_type}.sh" ] && \
 | 
			
		||||
			"${MCU_HS_DIR}/${fw_type}.sh" "$SECT"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# We are looking for ttyACM with specific product name and USB VID:PID
 | 
			
		||||
@@ -58,9 +81,6 @@ mcu_hotplug_setup() {
 | 
			
		||||
 | 
			
		||||
	mcu_logi "found compatible MCU with S/N '$sn' at USB bus '$dev'"
 | 
			
		||||
 | 
			
		||||
	MCU_SYSINFO_OUTPUT=""
 | 
			
		||||
	MCU_IMGLIST_OUTPUT=""
 | 
			
		||||
 | 
			
		||||
	# We expect just a single ttyACM interface
 | 
			
		||||
	usb_path="/sys/bus/usb/devices/${dev}*/tty/*"
 | 
			
		||||
	for tty in $usb_path; do
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,8 @@ mcu_setup_uart() {
 | 
			
		||||
	local gpio_on="$5"
 | 
			
		||||
	local sn="$6"
 | 
			
		||||
 | 
			
		||||
	local fw_type
 | 
			
		||||
 | 
			
		||||
	# Take out MCU out of reset and read basic info
 | 
			
		||||
	mcu_enable_pin_set "$gpio_path" "$gpio_on"
 | 
			
		||||
	sleep 1
 | 
			
		||||
@@ -22,7 +24,22 @@ mcu_setup_uart() {
 | 
			
		||||
	[ $? -ne 0 ] && return 1
 | 
			
		||||
 | 
			
		||||
	mcu_fw_check_and_update "$uart" "$baud" "$flow"
 | 
			
		||||
	rc="$?"
 | 
			
		||||
 | 
			
		||||
	[ "$rc" = "1" ] && return 1
 | 
			
		||||
 | 
			
		||||
	[ "$rc" = "2" ] && {
 | 
			
		||||
		sleep 1
 | 
			
		||||
 | 
			
		||||
		mcu_req "boot" "$uart" "$baud" "$flow"
 | 
			
		||||
		[ $? -ne 0 ] && return 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fw_type="$(uci -q get "mcu.${SECT}.firmware" | awk -F '__' '{print $2}')"
 | 
			
		||||
	[ -n "$fw_type" ] || return 0
 | 
			
		||||
 | 
			
		||||
	[ -x "${MCU_HS_DIR}/${fw_type}.sh" ] && \
 | 
			
		||||
		"${MCU_HS_DIR}/${fw_type}.sh" "$SECT"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mcu_setup_usb() {
 | 
			
		||||
@@ -32,6 +49,7 @@ mcu_setup_usb() {
 | 
			
		||||
	local gpio_off="0"
 | 
			
		||||
 | 
			
		||||
	local uart
 | 
			
		||||
	local fw_type
 | 
			
		||||
 | 
			
		||||
	[ "$gpio_on" = "0" ] && gpio_off="1"
 | 
			
		||||
 | 
			
		||||
@@ -132,18 +150,28 @@ mcu_setup_usb() {
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mcu_fw_check_and_update "$uart"
 | 
			
		||||
	[ $? -ne 0 ] && {
 | 
			
		||||
	rc="$?"
 | 
			
		||||
 | 
			
		||||
	[ "$rc" = "1" ] && {
 | 
			
		||||
		mcu_enable_pin_set "$gpio_path" "$gpio_off"
 | 
			
		||||
 | 
			
		||||
		flock -u 9
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	[ "$rc" = "0" ] && {
 | 
			
		||||
		fw_type="$(uci -q get "mcu.${SECT}.firmware" | awk -F '__' '{print $2}')"
 | 
			
		||||
		[ -n "$fw_type" -a -x "${MCU_HS_DIR}/${fw_type}.sh" ] && \
 | 
			
		||||
			"${MCU_HS_DIR}/${fw_type}.sh" "$SECT"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	flock -u 9
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mcu_setup() {
 | 
			
		||||
	local sn
 | 
			
		||||
	local action
 | 
			
		||||
	local fw_type
 | 
			
		||||
	local disabled
 | 
			
		||||
	local uart_baud
 | 
			
		||||
	local uart_flow
 | 
			
		||||
@@ -159,15 +187,19 @@ mcu_setup() {
 | 
			
		||||
	SECT="$1"
 | 
			
		||||
	MCU_SCRIPT_NAME="mcu-init.${SECT}"
 | 
			
		||||
 | 
			
		||||
	action="$2"
 | 
			
		||||
 | 
			
		||||
	MCU_SYSINFO_OUTPUT=""
 | 
			
		||||
	MCU_IMGLIST_OUTPUT=""
 | 
			
		||||
 | 
			
		||||
	# Section disabled?
 | 
			
		||||
	[ "$action" = "start" ] && {
 | 
			
		||||
		config_get_bool disabled "$SECT" disabled "0"
 | 
			
		||||
		[ "$disabled" = "1" ] && {
 | 
			
		||||
			mcu_logw "section is disabled in config"
 | 
			
		||||
			return 0
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	config_get sn "$SECT" sn
 | 
			
		||||
	config_get bootloader "$SECT" bootloader
 | 
			
		||||
@@ -177,6 +209,15 @@ mcu_setup() {
 | 
			
		||||
	config_get uart_baud "$SECT" uart_baud "115200"
 | 
			
		||||
	config_get_bool uart_flow "$SECT" uart_flow "0"
 | 
			
		||||
 | 
			
		||||
	# Stop related service
 | 
			
		||||
	[ "$action" = "stop" ] && {
 | 
			
		||||
		[ -n "$sn" -a  -f "/var/run/mcu.${sn}.pid" ] && {
 | 
			
		||||
			kill "$(cat "/var/run/mcu.${sn}.pid" 2>/dev/null)" \
 | 
			
		||||
				> /dev/null 2>&1
 | 
			
		||||
			rm -f "/var/run/mcu.${sn}.pid" > /dev/null 2>&1
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	# As for now, only 'mcuboot' bootloader is supported
 | 
			
		||||
	case "$bootloader" in
 | 
			
		||||
	"mcuboot")
 | 
			
		||||
@@ -219,12 +260,19 @@ mcu_setup() {
 | 
			
		||||
		# TODO: should we maybe bail out here if the MCU was took out
 | 
			
		||||
		#       of reset already before, by something/someone else?
 | 
			
		||||
		[ "$(cat "${gpio_path}/value")" = "$gpio_on" ] && {
 | 
			
		||||
			if [ "$action" = "start" ]; then
 | 
			
		||||
				mcu_logw "MCU already enabled, resetting"
 | 
			
		||||
			else
 | 
			
		||||
				mcu_logi "disabling MCU"
 | 
			
		||||
			fi
 | 
			
		||||
 | 
			
		||||
			mcu_enable_pin_set "$gpio_path" "$gpio_off"
 | 
			
		||||
			sleep 1
 | 
			
		||||
		}
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	[ "$action" = "stop" ] && return 0
 | 
			
		||||
 | 
			
		||||
	# For now only 'usb' and 'uart' interfaces are supported
 | 
			
		||||
	case "$interface" in
 | 
			
		||||
	"uart")
 | 
			
		||||
@@ -248,7 +296,14 @@ mcu_setup() {
 | 
			
		||||
 | 
			
		||||
start() {
 | 
			
		||||
	config_load mcu
 | 
			
		||||
	config_foreach mcu_setup mcu
 | 
			
		||||
	config_foreach mcu_setup mcu "start"
 | 
			
		||||
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
stop() {
 | 
			
		||||
	config_load mcu
 | 
			
		||||
	config_foreach mcu_setup mcu "stop"
 | 
			
		||||
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,10 @@
 | 
			
		||||
MCUBOOT_USB_PRODUCT="MCUboot serial recovery"
 | 
			
		||||
MCUBOOT_USB_VID_PID="16c005e1"
 | 
			
		||||
 | 
			
		||||
MCU_FW_DIR="/lib/firmware/mcu/"
 | 
			
		||||
# Host support and firmware directories
 | 
			
		||||
MCU_HS_DIR="/etc/mcu.d"
 | 
			
		||||
MCU_FW_DIR="/lib/firmware/mcu"
 | 
			
		||||
 | 
			
		||||
MCU_FLOCK_FILE="/tmp/lock/mcu"
 | 
			
		||||
 | 
			
		||||
MCU_SYSINFO_OUTPUT=
 | 
			
		||||
@@ -43,7 +46,7 @@ mcu_logw() {
 | 
			
		||||
	mcu_log "warn" "$1"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_mcu_get_fwlist() {
 | 
			
		||||
mcu_fetch_fwlist() {
 | 
			
		||||
	local uart="$1"
 | 
			
		||||
	local baud="$2"
 | 
			
		||||
	local flow="$3"
 | 
			
		||||
@@ -56,36 +59,16 @@ _mcu_get_fwlist() {
 | 
			
		||||
 | 
			
		||||
	[ -n "$baud" ] || baud="115200"
 | 
			
		||||
 | 
			
		||||
	[ -n "$MCU_IMGLIST_OUTPUT" ] && return 0
 | 
			
		||||
 | 
			
		||||
	MCU_IMGLIST_OUTPUT="$(umcumgr -s -d "$uart" -b "$baud$flow" list)"
 | 
			
		||||
	[ $? -eq 0 ] || return 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_mcu_get_fwmetadata() {
 | 
			
		||||
	local slot="$1"
 | 
			
		||||
	local uart="$2"
 | 
			
		||||
	local baud="$3"
 | 
			
		||||
	local flow="$4"
 | 
			
		||||
 | 
			
		||||
	local value
 | 
			
		||||
 | 
			
		||||
	[ -n "$MCU_IMGLIST_OUTPUT" ] || {
 | 
			
		||||
		_mcu_get_fwlist "$uart" "$baud" "$flow" || {
 | 
			
		||||
	[ $? -eq 0 ] || {
 | 
			
		||||
		mcu_loge "request 'list' failed (uart='$uart', baud='$baud', flow='$flow')"
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if [ "$slot" = "0" ]; then
 | 
			
		||||
		slot="slot0_metadata"
 | 
			
		||||
	else
 | 
			
		||||
		slot="slot1_metadata"
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	value="$(echo "$MCU_IMGLIST_OUTPUT" | grep "$slot=" | cut -d '=' -f 2)"
 | 
			
		||||
	echo "$value"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_mcu_get_sysinfo() {
 | 
			
		||||
mcu_fetch_sysinfo() {
 | 
			
		||||
	local uart="$1"
 | 
			
		||||
	local baud="$2"
 | 
			
		||||
	local flow="$3"
 | 
			
		||||
@@ -98,132 +81,83 @@ _mcu_get_sysinfo() {
 | 
			
		||||
 | 
			
		||||
	[ -n "$baud" ] || baud="115200"
 | 
			
		||||
 | 
			
		||||
	[ -n "$MCU_SYSINFO_OUTPUT" ] && return 0
 | 
			
		||||
 | 
			
		||||
	MCU_SYSINFO_OUTPUT="$(umcumgr -s -d "$uart" -b "$baud$flow" sysinfo)"
 | 
			
		||||
	[ $? -eq 0 ] || return 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_mcu_get() {
 | 
			
		||||
	local field="$1"
 | 
			
		||||
	local uart="$2"
 | 
			
		||||
	local baud="$3"
 | 
			
		||||
	local flow="$4"
 | 
			
		||||
 | 
			
		||||
	local value
 | 
			
		||||
 | 
			
		||||
	[ -n "$MCU_SYSINFO_OUTPUT" ] || {
 | 
			
		||||
		_mcu_get_sysinfo "$uart" "$baud" "$flow" || {
 | 
			
		||||
	[ $? -eq 0 ] || {
 | 
			
		||||
		mcu_loge "request 'sysinfo' failed (uart='$uart', baud='$baud', flow='$flow')"
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	value="$(echo "$MCU_SYSINFO_OUTPUT" | grep "$field=" | cut -d '=' -f 2)"
 | 
			
		||||
	echo "$value"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mcu_get_sn() {
 | 
			
		||||
	local uart="$1"
 | 
			
		||||
	local baud="$2"
 | 
			
		||||
	local flow="$3"
 | 
			
		||||
 | 
			
		||||
	local value
 | 
			
		||||
 | 
			
		||||
	value="$(_mcu_get "serial_num" "$uart" "$baud" "$flow")"
 | 
			
		||||
	[ $? -eq 0 ] || return 1
 | 
			
		||||
 | 
			
		||||
	[ -n "$value" ] && mcu_logd "MCU S/N: '$value'"
 | 
			
		||||
	echo "$value"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mcu_get_board() {
 | 
			
		||||
	local uart="$1"
 | 
			
		||||
	local baud="$2"
 | 
			
		||||
	local flow="$3"
 | 
			
		||||
 | 
			
		||||
	local value
 | 
			
		||||
 | 
			
		||||
	value="$(_mcu_get "board" "$uart" "$baud" "$flow")"
 | 
			
		||||
	[ $? -eq 0 ] || return 1
 | 
			
		||||
 | 
			
		||||
	[ -n "$value" ] && mcu_logd "MCU board: '$value'"
 | 
			
		||||
	echo "$value"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mcu_get_slotsnum() {
 | 
			
		||||
	local uart="$1"
 | 
			
		||||
	local baud="$2"
 | 
			
		||||
	local flow="$3"
 | 
			
		||||
 | 
			
		||||
	local value
 | 
			
		||||
 | 
			
		||||
	value="$(_mcu_get "single_slot" "$uart" "$baud" "$flow")"
 | 
			
		||||
	[ $? -eq 0 ] || return 1
 | 
			
		||||
 | 
			
		||||
	[ -n "$value" ] || value="1"
 | 
			
		||||
	[ "$value" != "1" ] && value="2"
 | 
			
		||||
 | 
			
		||||
	[ -n "$value" ] && mcu_logd "number of firmware slots: '$value'"
 | 
			
		||||
	echo "$value"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mcu_get_softver() {
 | 
			
		||||
	local uart="$1"
 | 
			
		||||
	local baud="$2"
 | 
			
		||||
	local flow="$3"
 | 
			
		||||
 | 
			
		||||
	local value
 | 
			
		||||
 | 
			
		||||
	value="$(_mcu_get "soft_ver" "$uart" "$baud" "$flow")"
 | 
			
		||||
	[ $? -eq 0 ] || return 1
 | 
			
		||||
 | 
			
		||||
	[ -n "$value" ] && mcu_logd "MCUboot version: '$value'"
 | 
			
		||||
	echo "$value"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mcu_get_activeslot() {
 | 
			
		||||
	local uart="$1"
 | 
			
		||||
	local baud="$2"
 | 
			
		||||
	local flow="$3"
 | 
			
		||||
 | 
			
		||||
	local value
 | 
			
		||||
 | 
			
		||||
	value="$(_mcu_get "active_slot" "$uart" "$baud" "$flow")"
 | 
			
		||||
	[ $? -eq 0 ] || return 1
 | 
			
		||||
 | 
			
		||||
	[ -n "$value" ] && mcu_logd "active firmware slot: '$value'"
 | 
			
		||||
	echo "$value"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mcu_get_fwname() {
 | 
			
		||||
	local slot="$1"
 | 
			
		||||
	local uart="$2"
 | 
			
		||||
	local baud="$3"
 | 
			
		||||
	local flow="$4"
 | 
			
		||||
mcu_get() {
 | 
			
		||||
	local param="$1"
 | 
			
		||||
	local slot="$2"
 | 
			
		||||
 | 
			
		||||
	local value
 | 
			
		||||
	local metadata
 | 
			
		||||
	local sysinfo_field
 | 
			
		||||
 | 
			
		||||
	metadata="$(_mcu_get_fwmetadata "$slot" "$uart" "$baud" "$flow")"
 | 
			
		||||
	[ $? -eq 0 ] || return 1
 | 
			
		||||
	case "$param" in
 | 
			
		||||
	"board"|\
 | 
			
		||||
	"soft_ver"|\
 | 
			
		||||
	"serial_num"|\
 | 
			
		||||
	"active_slot")
 | 
			
		||||
		sysinfo_field="$param"
 | 
			
		||||
		;;
 | 
			
		||||
	"slots_num")
 | 
			
		||||
		sysinfo_field="single_slot"
 | 
			
		||||
		;;
 | 
			
		||||
	"fwname")
 | 
			
		||||
		[ -n "$slot" ] || return 1
 | 
			
		||||
		param="image list: slot${slot} fw_name"
 | 
			
		||||
 | 
			
		||||
		metadata="$(echo "$MCU_IMGLIST_OUTPUT" | grep "slot${slot}_metadata=" | cut -d '=' -f 2)"
 | 
			
		||||
		[ -n "$metadata" ] && {
 | 
			
		||||
			json_load "$metadata"
 | 
			
		||||
			json_get_var value fw_name
 | 
			
		||||
		}
 | 
			
		||||
		;;
 | 
			
		||||
	"fwsha")
 | 
			
		||||
		[ -n "$slot" ] || return 1
 | 
			
		||||
		param="image list: slot${slot}_hash"
 | 
			
		||||
 | 
			
		||||
	if [ -n "$value" ]; then
 | 
			
		||||
		mcu_logi "firmware installed in slot '$slot': '$value'"
 | 
			
		||||
	else
 | 
			
		||||
		mcu_logw "no firmware installed in slot '$slot'"
 | 
			
		||||
	fi
 | 
			
		||||
		value="$(echo "$MCU_IMGLIST_OUTPUT" | grep "slot${slot}_hash=" | cut -d '=' -f 2)"
 | 
			
		||||
		;;
 | 
			
		||||
	*)
 | 
			
		||||
		return 1
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
 | 
			
		||||
	[ -n "$sysinfo_field" ] && {
 | 
			
		||||
		value="$(echo "$MCU_SYSINFO_OUTPUT" | grep "${sysinfo_field}=" | cut -d '=' -f 2)"
 | 
			
		||||
 | 
			
		||||
		[ "$sysinfo_field" = "single_slot" ] && {
 | 
			
		||||
			[ -n "$value" ] || value="1"
 | 
			
		||||
			[ "$value" != "1" ] && value="2"
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		param="sysinfo: $param"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	[ -n "$value" ] && mcu_logd "$param: '$value'"
 | 
			
		||||
	echo "$value"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mcu_req_boot() {
 | 
			
		||||
	local uart="$1"
 | 
			
		||||
	local baud="$2"
 | 
			
		||||
	local flow="$3"
 | 
			
		||||
mcu_req() {
 | 
			
		||||
	local cmd="$1"
 | 
			
		||||
	local uart="$2"
 | 
			
		||||
	local baud="$3"
 | 
			
		||||
	local flow="$4"
 | 
			
		||||
 | 
			
		||||
	case "$cmd" in
 | 
			
		||||
	"boot"|\
 | 
			
		||||
	"reset")
 | 
			
		||||
		;;
 | 
			
		||||
	*)
 | 
			
		||||
		return 1
 | 
			
		||||
		;;
 | 
			
		||||
	esac
 | 
			
		||||
 | 
			
		||||
	if [ "$flow" = "1" ]; then
 | 
			
		||||
		flow=" -f"
 | 
			
		||||
@@ -233,34 +167,12 @@ mcu_req_boot() {
 | 
			
		||||
 | 
			
		||||
	[ -n "$baud" ] || baud="115200"
 | 
			
		||||
 | 
			
		||||
	umcumgr -s -d "$uart" -b "$baud$flow" boot || {
 | 
			
		||||
		mcu_loge "request 'boot' failed"
 | 
			
		||||
	umcumgr -s -d "$uart" -b "$baud$flow" "$cmd" || {
 | 
			
		||||
		mcu_loge "request '$cmd' failed (uart='$uart', baud='$baud', flow='$flow')"
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mcu_logi "MCU requested to boot the firmware"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mcu_req_reset() {
 | 
			
		||||
	local uart="$1"
 | 
			
		||||
	local baud="$2"
 | 
			
		||||
	local flow="$3"
 | 
			
		||||
 | 
			
		||||
	if [ "$flow" = "1" ]; then
 | 
			
		||||
		flow=" -f"
 | 
			
		||||
	else
 | 
			
		||||
		flow=""
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	[ -n "$baud" ] || baud="115200"
 | 
			
		||||
 | 
			
		||||
	# Request warm reset of the MCU
 | 
			
		||||
	umcumgr -s -d "$uart" -b "$baud$flow" reset || {
 | 
			
		||||
		mcu_loge "request 'reset' failed"
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mcu_logi "MCU requested to reset"
 | 
			
		||||
	mcu_logi "MCU requested '$cmd'"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mcu_sel_slot() {
 | 
			
		||||
@@ -279,13 +191,26 @@ mcu_sel_slot() {
 | 
			
		||||
 | 
			
		||||
	# Request firmware active slot change
 | 
			
		||||
	umcumgr -s -d "$uart" -b "$baud$flow" select "$slot" || {
 | 
			
		||||
		mcu_loge "request 'select slot' failed"
 | 
			
		||||
		mcu_loge "request 'select slot' failed (uart='$uart', baud='$baud', flow='$flow')"
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mcu_logi "active firmware slot changed to: '$slot'"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mcu_fwfile_sha() {
 | 
			
		||||
	local path="$1"
 | 
			
		||||
 | 
			
		||||
	local value
 | 
			
		||||
 | 
			
		||||
	[ -f "$path" ] || return 1
 | 
			
		||||
 | 
			
		||||
	value="$(umcumgr -s hash "$path" | grep "hash=" | cut -d '=' -f 2)"
 | 
			
		||||
	[ -n "$value" ] || return 1
 | 
			
		||||
 | 
			
		||||
	echo "$value"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mcu_fw_upload() {
 | 
			
		||||
	local board="$1"
 | 
			
		||||
	local slot="$2"
 | 
			
		||||
@@ -315,7 +240,7 @@ mcu_fw_upload() {
 | 
			
		||||
	# Upload fw to selected slot (TODO: slots numbering Zephyr vs. MCUboot)
 | 
			
		||||
	[ "$slot" = "1" ] && slot="2"
 | 
			
		||||
	umcumgr -q -n "$slot" -d "$uart" -b "$baud$flow" upload "$fw_path" || {
 | 
			
		||||
		mcu_loge "request 'upload' failed"
 | 
			
		||||
		mcu_loge "request 'upload' failed (uart='$uart', baud='$baud', flow='$flow')"
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -338,15 +263,10 @@ mcu_sn_check_and_update() {
 | 
			
		||||
 | 
			
		||||
	local sn_dev
 | 
			
		||||
 | 
			
		||||
	if [ "$flow" = "1" ]; then
 | 
			
		||||
		flow=" -f"
 | 
			
		||||
	else
 | 
			
		||||
		flow=""
 | 
			
		||||
	fi
 | 
			
		||||
	# Fetch sysinfo
 | 
			
		||||
	mcu_fetch_sysinfo "$uart" "$baud" "$flow" || return 1
 | 
			
		||||
 | 
			
		||||
	[ -n "$baud" ] || baud="115200"
 | 
			
		||||
 | 
			
		||||
	sn_dev="$(mcu_get_sn "$uart" "$baud" "$flow")"
 | 
			
		||||
	sn_dev="$(mcu_get "serial_num")"
 | 
			
		||||
	[ -n "$sn_dev" ] || return 1
 | 
			
		||||
 | 
			
		||||
	[ -n "$sn_dev" ] && {
 | 
			
		||||
@@ -369,6 +289,10 @@ mcu_sn_check_and_update() {
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Returns:
 | 
			
		||||
# 0 if MCU was requested to boot firmware
 | 
			
		||||
# 1 on error
 | 
			
		||||
# 2 if MCU was requested to reset
 | 
			
		||||
mcu_fw_check_and_update() {
 | 
			
		||||
	local uart="$1"
 | 
			
		||||
	local baud="$2"
 | 
			
		||||
@@ -377,24 +301,36 @@ mcu_fw_check_and_update() {
 | 
			
		||||
	local active_slot
 | 
			
		||||
	local fw_slots
 | 
			
		||||
	local slot0_fw
 | 
			
		||||
	local slot0_sha
 | 
			
		||||
	local slot1_fw
 | 
			
		||||
	local slot1_sha
 | 
			
		||||
	local firmware
 | 
			
		||||
	local fw0_sha
 | 
			
		||||
	local fw1_sha
 | 
			
		||||
	local board
 | 
			
		||||
	local soft_ver
 | 
			
		||||
 | 
			
		||||
	config_get firmware "$SECT" firmware
 | 
			
		||||
	[ -n "$firmware" ] || mcu_logw "option 'firmware' unset"
 | 
			
		||||
 | 
			
		||||
	# MCU board name
 | 
			
		||||
	board="$(mcu_get_board "$uart" "$baud" "$flow")"
 | 
			
		||||
	# Fetch sysinfo and firmware images list
 | 
			
		||||
	mcu_fetch_sysinfo "$uart" "$baud" "$flow" || return 1
 | 
			
		||||
	mcu_fetch_fwlist "$uart" "$baud" "$flow" || return 1
 | 
			
		||||
 | 
			
		||||
	# MCU board name and software version
 | 
			
		||||
	board="$(mcu_get "board")"
 | 
			
		||||
	[ $? -eq 0 ] || return 1
 | 
			
		||||
 | 
			
		||||
	soft_ver="$(mcu_get "soft_ver")"
 | 
			
		||||
	[ $? -eq 0 ] || return 1
 | 
			
		||||
 | 
			
		||||
	# Number of firmware slots and active slot
 | 
			
		||||
	fw_slots="$(mcu_get_slotsnum "$uart" "$baud" "$flow")"
 | 
			
		||||
	fw_slots="$(mcu_get "slots_num")"
 | 
			
		||||
	[ $? -eq 0 ] || return 1
 | 
			
		||||
	[ -n "$fw_slots" ] || fw_slots="1"
 | 
			
		||||
 | 
			
		||||
	[ "$fw_slots" = "2" ] && {
 | 
			
		||||
		active_slot="$(mcu_get_activeslot "$uart" "$baud" "$flow")"
 | 
			
		||||
		active_slot="$(mcu_get "active_slot")"
 | 
			
		||||
		[ $? -eq 0 ] || return 1
 | 
			
		||||
	}
 | 
			
		||||
	[ -n "$active_slot" ] || active_slot="0"
 | 
			
		||||
@@ -407,22 +343,36 @@ mcu_fw_check_and_update() {
 | 
			
		||||
				mcu_loge "firmware '$firmware' doesn't exist"
 | 
			
		||||
				return 1
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			fw1_sha="$(mcu_fwfile_sha "${MCU_FW_DIR}/${board}/${firmware}/slot1.bin")"
 | 
			
		||||
		else
 | 
			
		||||
			[ -f "${MCU_FW_DIR}/${board}/${firmware}/slot0.bin" ] || {
 | 
			
		||||
				mcu_loge "firmware '$firmware' doesn't exist"
 | 
			
		||||
				return 1
 | 
			
		||||
			}
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		fw0_sha="$(mcu_fwfile_sha "${MCU_FW_DIR}/${board}/${firmware}/slot0.bin")"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	slot0_fw="$(mcu_get_fwname "0" "$uart" "$baud" "$flow")"
 | 
			
		||||
	slot0_fw="$(mcu_get "fwname" "0")"
 | 
			
		||||
	[ $? -eq 0 ] || return 1
 | 
			
		||||
 | 
			
		||||
	[ "$fw_slots" = "2" ] && {
 | 
			
		||||
		slot1_fw="$(mcu_get_fwname "1" "$uart" "$baud" "$flow")"
 | 
			
		||||
	[ -n "$slot0_fw" ] && {
 | 
			
		||||
		slot0_sha="$(mcu_get "fwsha" "0")"
 | 
			
		||||
		[ $? -eq 0 ] || return 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	[ "$fw_slots" = "2" ] && {
 | 
			
		||||
		slot1_fw="$(mcu_get "fwname" "1")"
 | 
			
		||||
		[ $? -eq 0 ] || return 1
 | 
			
		||||
 | 
			
		||||
		[ -n "$slot1_fw" ] && {
 | 
			
		||||
			slot1_sha="$(mcu_get "fwsha" "1")"
 | 
			
		||||
			[ $? -eq 0 ] || return 1
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	# No target firmware provided, check what's on device and update config
 | 
			
		||||
	[ -n "$firmware" ] || {
 | 
			
		||||
		firmware="$slot0_fw"
 | 
			
		||||
@@ -437,62 +387,72 @@ mcu_fw_check_and_update() {
 | 
			
		||||
			uci -q set mcu.${SECT}.firmware="$firmware"
 | 
			
		||||
			uci -q commit mcu
 | 
			
		||||
 | 
			
		||||
			mcu_req_boot "$uart" "$baud" "$flow"
 | 
			
		||||
			mcu_req "boot" "$uart" "$baud" "$flow"
 | 
			
		||||
			[ $? -ne 0 ] && return 1
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
			return 0
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	# Do we have target firmware installed in the first slot?
 | 
			
		||||
	[ "$firmware" = "$slot0_fw" ] && {
 | 
			
		||||
		mcu_logd "found matching firmware installed in slot '0'"
 | 
			
		||||
	[ "$firmware" = "$slot0_fw" -a "$slot0_sha" = "$fw0_sha" ] && {
 | 
			
		||||
		mcu_logi "found matching firmware installed in slot '0'"
 | 
			
		||||
 | 
			
		||||
		if [ "$fw_slots" = "2" -a "$active_slot" != "0" ]; then
 | 
			
		||||
			mcu_sel_slot "0" "$uart" "$baud" "$flow"
 | 
			
		||||
			[ $? -ne 0 ] && return 1
 | 
			
		||||
 | 
			
		||||
			# Changing active slots requires MCU reset at the moment
 | 
			
		||||
			mcu_req_reset "$uart" "$baud" "$flow"
 | 
			
		||||
			mcu_req "reset" "$uart" "$baud" "$flow"
 | 
			
		||||
			[ $? -ne 0 ] && return 1
 | 
			
		||||
 | 
			
		||||
			return 2
 | 
			
		||||
		else
 | 
			
		||||
			mcu_req_boot "$uart" "$baud" "$flow"
 | 
			
		||||
			mcu_req "boot" "$uart" "$baud" "$flow"
 | 
			
		||||
			[ $? -ne 0 ] && return 1
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	# Upload and boot firmware on single-slot device
 | 
			
		||||
	mcu_logi "no matching firmware found in slot '0'"
 | 
			
		||||
 | 
			
		||||
	# Upload firmware and reset on single-slot device
 | 
			
		||||
	[ "$fw_slots" = "1" ] && {
 | 
			
		||||
		mcu_fw_upload "$board" "0" "$firmware" "$uart" "$baud" "$flow"
 | 
			
		||||
		[ $? -ne 0 ] && return 1
 | 
			
		||||
 | 
			
		||||
		mcu_req_boot "$uart" "$baud" "$flow"
 | 
			
		||||
		mcu_req "reset" "$uart" "$baud" "$flow"
 | 
			
		||||
		[ $? -ne 0 ] && return 1
 | 
			
		||||
 | 
			
		||||
		return 0
 | 
			
		||||
		return 2
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	# Do we have target firmware installed in the second slot?
 | 
			
		||||
	[ "$firmware" = "$slot1_fw" ] && {
 | 
			
		||||
		mcu_logd "found matching firmware installed in slot '1'"
 | 
			
		||||
	[ "$firmware" = "$slot1_fw" -a "$slot1_sha" = "$fw1_sha" ] && {
 | 
			
		||||
		mcu_logi "found matching firmware installed in slot '1'"
 | 
			
		||||
 | 
			
		||||
		if [ "$active_slot" != "1" ]; then
 | 
			
		||||
			mcu_sel_slot "1" "$uart" "$baud" "$flow"
 | 
			
		||||
			[ $? -ne 0 ] && return 1
 | 
			
		||||
 | 
			
		||||
			# Changing active slots requires MCU reset at the moment
 | 
			
		||||
			mcu_req_reset "$uart" "$baud" "$flow"
 | 
			
		||||
			mcu_req "reset" "$uart" "$baud" "$flow"
 | 
			
		||||
			[ $? -ne 0 ] && return 1
 | 
			
		||||
 | 
			
		||||
			return 2
 | 
			
		||||
		else
 | 
			
		||||
			mcu_req_boot "$uart" "$baud" "$flow"
 | 
			
		||||
			mcu_req "boot" "$uart" "$baud" "$flow"
 | 
			
		||||
			[ $? -ne 0 ] && return 1
 | 
			
		||||
		fi
 | 
			
		||||
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mcu_logi "no matching firmware found in slot '1'"
 | 
			
		||||
 | 
			
		||||
	# Upload and boot firmware on multi-slot device
 | 
			
		||||
	# Always use inactive slot
 | 
			
		||||
	if [ "$active_slot" = "0" ]; then
 | 
			
		||||
@@ -508,10 +468,10 @@ mcu_fw_check_and_update() {
 | 
			
		||||
	[ $? -ne 0 ] && return 1
 | 
			
		||||
 | 
			
		||||
	# Changing active slots requires MCU reset at the moment
 | 
			
		||||
	mcu_req_reset "$uart" "$baud" "$flow"
 | 
			
		||||
	mcu_req "reset" "$uart" "$baud" "$flow"
 | 
			
		||||
	[ $? -ne 0 ] && return 1
 | 
			
		||||
 | 
			
		||||
	return 0
 | 
			
		||||
	return 2
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mcu_add_uci_config() {
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ add_rate() {
 | 
			
		||||
	config_get ssid "$cfg" ssid
 | 
			
		||||
	config_get ingress "$cfg" ingress
 | 
			
		||||
	config_get egress "$cfg" egress
 | 
			
		||||
	ubus call ratelimit defaults_set '{"name": "'$ssid'", "rate_ingress": "'$ingress'mbit", "rate_egress": "'$egress'mbit" }'
 | 
			
		||||
	ubus call ratelimit defaults_set "{\"name\": \"$ssid\", \"rate_ingress\": \""$ingress"mbit\", \"rate_egress\": \""$egress"mbit\" }"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
reload_service() {
 | 
			
		||||
 
 | 
			
		||||
@@ -84,7 +84,7 @@ let handlers = {
 | 
			
		||||
			ssid: hapd.ssid,
 | 
			
		||||
			bssid: hapd.bssid,
 | 
			
		||||
		});
 | 
			
		||||
		if (ratelimit) {
 | 
			
		||||
		if (ratelimit && !wildcard(notify.data.phy, 'wlanc*')) {
 | 
			
		||||
			let msg = {
 | 
			
		||||
				device: hapd.ifname,
 | 
			
		||||
				address: notify.data.address,
 | 
			
		||||
 
 | 
			
		||||
@@ -4,10 +4,9 @@ PKG_NAME:=ucentral-schema
 | 
			
		||||
PKG_RELEASE:=1
 | 
			
		||||
 | 
			
		||||
PKG_SOURCE_URL=https://github.com/Telecominfraproject/wlan-ucentral-schema.git
 | 
			
		||||
PKG_MIRROR_HASH:=62d2b659d16dbdb467215da655259fcb6b239a635f43ee1e87c4d3a3db281d45
 | 
			
		||||
PKG_SOURCE_PROTO:=git
 | 
			
		||||
PKG_SOURCE_DATE:=2022-05-29
 | 
			
		||||
PKG_SOURCE_VERSION:=54453a6345519ead8edbf75475fd802a8af7a245
 | 
			
		||||
PKG_SOURCE_VERSION:=caac3f11f790d2819bf9e41189c3cf99a5d18a78
 | 
			
		||||
 | 
			
		||||
PKG_MAINTAINER:=John Crispin <john@phrozen.org>
 | 
			
		||||
PKG_LICENSE:=BSD-3-Clause
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,100 @@
 | 
			
		||||
{
 | 
			
		||||
	"uuid": 2,
 | 
			
		||||
	"radios": [
 | 
			
		||||
		{
 | 
			
		||||
			"band": "5G",
 | 
			
		||||
			"country": "CA",
 | 
			
		||||
			"channel-mode": "HE",
 | 
			
		||||
			"channel-width": 80,
 | 
			
		||||
			"channel": 32
 | 
			
		||||
		}
 | 
			
		||||
	],
 | 
			
		||||
 | 
			
		||||
	"interfaces": [
 | 
			
		||||
		{
 | 
			
		||||
			"name": "WAN",
 | 
			
		||||
			"role": "upstream",
 | 
			
		||||
			"ethernet": [
 | 
			
		||||
				{
 | 
			
		||||
					"select-ports": [
 | 
			
		||||
						"WAN*"
 | 
			
		||||
					]
 | 
			
		||||
				}
 | 
			
		||||
			],
 | 
			
		||||
			"ipv4": {
 | 
			
		||||
				"addressing": "dynamic"
 | 
			
		||||
			},
 | 
			
		||||
			"ssids": [
 | 
			
		||||
				{
 | 
			
		||||
					"name": "OpenWifi",
 | 
			
		||||
					"wifi-bands": [
 | 
			
		||||
						"5G"
 | 
			
		||||
					],
 | 
			
		||||
					"bss-mode": "ap",
 | 
			
		||||
					"encryption": {
 | 
			
		||||
						"proto": "wpa2",
 | 
			
		||||
						"ieee80211w": "optional"
 | 
			
		||||
					},
 | 
			
		||||
					"radius": {
 | 
			
		||||
						"authentication": {
 | 
			
		||||
							"host": "192.168.178.192",
 | 
			
		||||
							"port": 1812,
 | 
			
		||||
							"secret": "secret",
 | 
			
		||||
							"secondary": {
 | 
			
		||||
								"host": "192.168.178.193",
 | 
			
		||||
								"port": 1812,
 | 
			
		||||
								"secret": "secret2"
 | 
			
		||||
							}
 | 
			
		||||
						},
 | 
			
		||||
						"accounting": {
 | 
			
		||||
							"host": "192.168.178.192",
 | 
			
		||||
							"port": 1813,
 | 
			
		||||
							"secret": "secret",
 | 
			
		||||
							"secondary": {
 | 
			
		||||
								"host": "192.168.178.193",
 | 
			
		||||
								"port": 1813,
 | 
			
		||||
								"secret": "secret2"
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			]
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"name": "LAN",
 | 
			
		||||
			"role": "downstream",
 | 
			
		||||
			"services": [ "ssh" ],
 | 
			
		||||
			"ethernet": [
 | 
			
		||||
				{
 | 
			
		||||
					"select-ports": [
 | 
			
		||||
						"LAN*"
 | 
			
		||||
					]
 | 
			
		||||
				}
 | 
			
		||||
			],
 | 
			
		||||
			"ipv4": {
 | 
			
		||||
				"addressing": "static",
 | 
			
		||||
				"subnet": "192.168.1.1/24",
 | 
			
		||||
				"dhcp": {
 | 
			
		||||
					"lease-first": 10,
 | 
			
		||||
					"lease-count": 100,
 | 
			
		||||
					"lease-time": "6h"
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
	],
 | 
			
		||||
	"metrics": {
 | 
			
		||||
		"statistics": {
 | 
			
		||||
			"interval": 120,
 | 
			
		||||
			"types": [ "ssids", "lldp", "clients" ]
 | 
			
		||||
		},
 | 
			
		||||
		"health": {
 | 
			
		||||
			"interval": 120
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	"services": {
 | 
			
		||||
		"ssh": {
 | 
			
		||||
			"port": 22
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -5,9 +5,9 @@ PKG_RELEASE:=1
 | 
			
		||||
 | 
			
		||||
PKG_SOURCE_PROTO:=git
 | 
			
		||||
PKG_SOURCE_URL=https://github.com/blogic/udevmand.git
 | 
			
		||||
PKG_MIRROR_HASH:=51bcf59754ef87913c40f2f1c708c8d2d2eb0ad5fc128a5c891e54ea4b3b035e
 | 
			
		||||
PKG_MIRROR_HASH:=0c234de7e8aca07fcabb7685bd899f0c0c82303c2be61e89364abf1d28b089e7
 | 
			
		||||
PKG_SOURCE_DATE:=20220112
 | 
			
		||||
PKG_SOURCE_VERSION:=3d2b67b180679a6f5687e8d318a66a7cbad3fa7b
 | 
			
		||||
PKG_SOURCE_VERSION:=979aca4764c10312b62b4e34c7e9f58e22f86b76
 | 
			
		||||
CMAKE_INSTALL:=1
 | 
			
		||||
 | 
			
		||||
PKG_LICENSE:=LGPL-2.1
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user