mirror of
				https://github.com/Telecominfraproject/wlan-ap.git
				synced 2025-10-31 10:28:06 +00:00 
			
		
		
		
	Compare commits
	
		
			19 Commits
		
	
	
		
			v2.9.0-rc2
			...
			v2.9.0-rc5
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 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: |     strategy: | ||||||
|       fail-fast: false |       fail-fast: false | ||||||
|       matrix: |       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: |     steps: | ||||||
|     - uses: actions/checkout@v3 |     - uses: actions/checkout@v3 | ||||||
|   | |||||||
| @@ -190,6 +190,7 @@ ath11k-macs) | |||||||
| 		;; | 		;; | ||||||
| 	yuncore,ax840|\ | 	yuncore,ax840|\ | ||||||
| 	edgecore,eap102|\ | 	edgecore,eap102|\ | ||||||
|  | 	edgecore,eap104|\ | ||||||
| 	edgecore,eap106|\ | 	edgecore,eap106|\ | ||||||
| 	indio,um-310ax-v1|\ | 	indio,um-310ax-v1|\ | ||||||
| 	indio,um-510axp-v1|\ | 	indio,um-510axp-v1|\ | ||||||
|   | |||||||
| @@ -1,3 +1,3 @@ | |||||||
| #!/bin/sh | #!/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 | [ -n "$mac" ] && ip link set $DEVICENAME address $mac | ||||||
|   | |||||||
| @@ -8,7 +8,7 @@ | |||||||
| include $(TOPDIR)/rules.mk | include $(TOPDIR)/rules.mk | ||||||
|  |  | ||||||
| PKG_NAME:=mcu-firmware | PKG_NAME:=mcu-firmware | ||||||
| PKG_VERSION:=2023-03-05 | PKG_VERSION:=2023-03-12 | ||||||
| PKG_RELEASE:=1 | PKG_RELEASE:=1 | ||||||
|  |  | ||||||
| PKG_MAINTAINER:=Piotr Dymacz <pepe2k@gmail.com> | PKG_MAINTAINER:=Piotr Dymacz <pepe2k@gmail.com> | ||||||
| @@ -28,10 +28,15 @@ endef | |||||||
| #   version-name_git-sha_pipeline-id_sha256-of-package | #   version-name_git-sha_pipeline-id_sha256-of-package | ||||||
| ZEPHYR_VERSIONS := \ | ZEPHYR_VERSIONS := \ | ||||||
| 	zephyr-v3.3.x_7055d10e538e_3877473859_321a0daf6328698a913c6504d19aa85a5170dfce6039b86d31d2e9162d34af7c \ | 	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_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 | ||||||
| ZEPHYR_HELLO_WORLD_TARGETS := \ | ZEPHYR_HELLO_WORLD_TARGETS := \ | ||||||
| 	cig_wf196_nrf52833 \ | 	cig_wf196_nrf52833 \ | ||||||
| @@ -59,6 +64,20 @@ define Download/zephyr-fw | |||||||
| endef | endef | ||||||
| $(foreach FW,$(ZEPHYR_VERSIONS),$(eval $(call Download,zephyr-fw,$(FW)))) | $(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) | # $(1) version (e.g zephyr-v3.3.x) | ||||||
| # $(2) firmware name (e.g. hci_usb) | # $(2) firmware name (e.g. hci_usb) | ||||||
| # $(3) target/board name (e.g. nrf52840dongle_nrf52840) | # $(3) target/board name (e.g. nrf52840dongle_nrf52840) | ||||||
| @@ -81,6 +100,7 @@ define zephyr-fw | |||||||
| endef | endef | ||||||
|  |  | ||||||
| define zephyr-fw-deps | define zephyr-fw-deps | ||||||
|  | 	$(if $(wildcard ./files/$(1)/*),+zephyr-$(1)-host-support) \ | ||||||
| 	$(if $(findstring hci_u,$1),+bluez-daemon +kmod-bluetooth +kmod-crypto-user) | 	$(if $(findstring hci_u,$1),+bluez-daemon +kmod-bluetooth +kmod-crypto-user) | ||||||
| endef | endef | ||||||
|  |  | ||||||
| @@ -102,6 +122,15 @@ define Build/Compile | |||||||
| endef | 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 VER,$(ZEPHYR_VERSIONS),\ | ||||||
|   $(foreach TARGET,$(ZEPHYR_HELLO_WORLD_TARGETS),\ |   $(foreach TARGET,$(ZEPHYR_HELLO_WORLD_TARGETS),\ | ||||||
|     $(eval $(call zephyr-fw,$(call word-underscore,$(VER),1),hello_world,$(TARGET))))) |     $(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 | include $(TOPDIR)/rules.mk | ||||||
|  |  | ||||||
| PKG_NAME:=mcu | PKG_NAME:=mcu | ||||||
| PKG_VERSION:=2023-03-05 | PKG_VERSION:=2023-03-22 | ||||||
| PKG_RELEASE=1 | PKG_RELEASE=1 | ||||||
|  |  | ||||||
| PKG_LICENSE:=GPL-2.0 | PKG_LICENSE:=GPL-2.0 | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ MCU_CFG_FOUND="0" | |||||||
|  |  | ||||||
| mcu_hotplug_setup() { | mcu_hotplug_setup() { | ||||||
| 	local sn | 	local sn | ||||||
|  | 	local fw_type | ||||||
| 	local disabled | 	local disabled | ||||||
|  |  | ||||||
| 	local sn_dev="$2" | 	local sn_dev="$2" | ||||||
| @@ -15,6 +16,9 @@ mcu_hotplug_setup() { | |||||||
|  |  | ||||||
| 	SECT="$1" | 	SECT="$1" | ||||||
|  |  | ||||||
|  | 	MCU_SYSINFO_OUTPUT="" | ||||||
|  | 	MCU_IMGLIST_OUTPUT="" | ||||||
|  |  | ||||||
| 	[ "$MCU_CFG_FOUND" = "1" ] && return 0 | 	[ "$MCU_CFG_FOUND" = "1" ] && return 0 | ||||||
|  |  | ||||||
| 	config_get sn "$SECT" sn | 	config_get sn "$SECT" sn | ||||||
| @@ -32,11 +36,30 @@ mcu_hotplug_setup() { | |||||||
| 		return 0 | 		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" | 	mcu_sn_check_and_update "$sn" "$uart" | ||||||
| 	[ $? -ne 0 ] && return 1 | 	[ $? -ne 0 ] && return 1 | ||||||
|  |  | ||||||
| 	mcu_fw_check_and_update "$uart" | 	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 | # 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_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 | 	# We expect just a single ttyACM interface | ||||||
| 	usb_path="/sys/bus/usb/devices/${dev}*/tty/*" | 	usb_path="/sys/bus/usb/devices/${dev}*/tty/*" | ||||||
| 	for tty in $usb_path; do | 	for tty in $usb_path; do | ||||||
|   | |||||||
| @@ -14,6 +14,8 @@ mcu_setup_uart() { | |||||||
| 	local gpio_on="$5" | 	local gpio_on="$5" | ||||||
| 	local sn="$6" | 	local sn="$6" | ||||||
|  |  | ||||||
|  | 	local fw_type | ||||||
|  |  | ||||||
| 	# Take out MCU out of reset and read basic info | 	# Take out MCU out of reset and read basic info | ||||||
| 	mcu_enable_pin_set "$gpio_path" "$gpio_on" | 	mcu_enable_pin_set "$gpio_path" "$gpio_on" | ||||||
| 	sleep 1 | 	sleep 1 | ||||||
| @@ -22,7 +24,22 @@ mcu_setup_uart() { | |||||||
| 	[ $? -ne 0 ] && return 1 | 	[ $? -ne 0 ] && return 1 | ||||||
|  |  | ||||||
| 	mcu_fw_check_and_update "$uart" "$baud" "$flow" | 	mcu_fw_check_and_update "$uart" "$baud" "$flow" | ||||||
| 	[ $? -ne 0 ] && return 1 | 	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() { | mcu_setup_usb() { | ||||||
| @@ -32,6 +49,7 @@ mcu_setup_usb() { | |||||||
| 	local gpio_off="0" | 	local gpio_off="0" | ||||||
|  |  | ||||||
| 	local uart | 	local uart | ||||||
|  | 	local fw_type | ||||||
|  |  | ||||||
| 	[ "$gpio_on" = "0" ] && gpio_off="1" | 	[ "$gpio_on" = "0" ] && gpio_off="1" | ||||||
|  |  | ||||||
| @@ -132,18 +150,28 @@ mcu_setup_usb() { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	mcu_fw_check_and_update "$uart" | 	mcu_fw_check_and_update "$uart" | ||||||
| 	[ $? -ne 0 ] && { | 	rc="$?" | ||||||
|  |  | ||||||
|  | 	[ "$rc" = "1" ] && { | ||||||
| 		mcu_enable_pin_set "$gpio_path" "$gpio_off" | 		mcu_enable_pin_set "$gpio_path" "$gpio_off" | ||||||
|  |  | ||||||
| 		flock -u 9 | 		flock -u 9 | ||||||
| 		return 1 | 		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 | 	flock -u 9 | ||||||
| } | } | ||||||
|  |  | ||||||
| mcu_setup() { | mcu_setup() { | ||||||
| 	local sn | 	local sn | ||||||
|  | 	local action | ||||||
|  | 	local fw_type | ||||||
| 	local disabled | 	local disabled | ||||||
| 	local uart_baud | 	local uart_baud | ||||||
| 	local uart_flow | 	local uart_flow | ||||||
| @@ -159,14 +187,18 @@ mcu_setup() { | |||||||
| 	SECT="$1" | 	SECT="$1" | ||||||
| 	MCU_SCRIPT_NAME="mcu-init.${SECT}" | 	MCU_SCRIPT_NAME="mcu-init.${SECT}" | ||||||
|  |  | ||||||
|  | 	action="$2" | ||||||
|  |  | ||||||
| 	MCU_SYSINFO_OUTPUT="" | 	MCU_SYSINFO_OUTPUT="" | ||||||
| 	MCU_IMGLIST_OUTPUT="" | 	MCU_IMGLIST_OUTPUT="" | ||||||
|  |  | ||||||
| 	# Section disabled? | 	# Section disabled? | ||||||
| 	config_get_bool disabled "$SECT" disabled "0" | 	[ "$action" = "start" ] && { | ||||||
| 	[ "$disabled" = "1" ] && { | 		config_get_bool disabled "$SECT" disabled "0" | ||||||
| 		mcu_logw "section is disabled in config" | 		[ "$disabled" = "1" ] && { | ||||||
| 		return 0 | 			mcu_logw "section is disabled in config" | ||||||
|  | 			return 0 | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	config_get sn "$SECT" sn | 	config_get sn "$SECT" sn | ||||||
| @@ -177,6 +209,15 @@ mcu_setup() { | |||||||
| 	config_get uart_baud "$SECT" uart_baud "115200" | 	config_get uart_baud "$SECT" uart_baud "115200" | ||||||
| 	config_get_bool uart_flow "$SECT" uart_flow "0" | 	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 | 	# As for now, only 'mcuboot' bootloader is supported | ||||||
| 	case "$bootloader" in | 	case "$bootloader" in | ||||||
| 	"mcuboot") | 	"mcuboot") | ||||||
| @@ -219,12 +260,19 @@ mcu_setup() { | |||||||
| 		# TODO: should we maybe bail out here if the MCU was took out | 		# TODO: should we maybe bail out here if the MCU was took out | ||||||
| 		#       of reset already before, by something/someone else? | 		#       of reset already before, by something/someone else? | ||||||
| 		[ "$(cat "${gpio_path}/value")" = "$gpio_on" ] && { | 		[ "$(cat "${gpio_path}/value")" = "$gpio_on" ] && { | ||||||
| 			mcu_logw "MCU already enabled, resetting" | 			if [ "$action" = "start" ]; then | ||||||
|  | 				mcu_logw "MCU already enabled, resetting" | ||||||
|  | 			else | ||||||
|  | 				mcu_logi "disabling MCU" | ||||||
|  | 			fi | ||||||
|  |  | ||||||
| 			mcu_enable_pin_set "$gpio_path" "$gpio_off" | 			mcu_enable_pin_set "$gpio_path" "$gpio_off" | ||||||
| 			sleep 1 | 			sleep 1 | ||||||
| 		} | 		} | ||||||
| 	fi | 	fi | ||||||
|  |  | ||||||
|  | 	[ "$action" = "stop" ] && return 0 | ||||||
|  |  | ||||||
| 	# For now only 'usb' and 'uart' interfaces are supported | 	# For now only 'usb' and 'uart' interfaces are supported | ||||||
| 	case "$interface" in | 	case "$interface" in | ||||||
| 	"uart") | 	"uart") | ||||||
| @@ -248,7 +296,14 @@ mcu_setup() { | |||||||
|  |  | ||||||
| start() { | start() { | ||||||
| 	config_load mcu | 	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 | 	return 0 | ||||||
| } | } | ||||||
|   | |||||||
| @@ -6,7 +6,10 @@ | |||||||
| MCUBOOT_USB_PRODUCT="MCUboot serial recovery" | MCUBOOT_USB_PRODUCT="MCUboot serial recovery" | ||||||
| MCUBOOT_USB_VID_PID="16c005e1" | 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_FLOCK_FILE="/tmp/lock/mcu" | ||||||
|  |  | ||||||
| MCU_SYSINFO_OUTPUT= | MCU_SYSINFO_OUTPUT= | ||||||
| @@ -43,7 +46,7 @@ mcu_logw() { | |||||||
| 	mcu_log "warn" "$1" | 	mcu_log "warn" "$1" | ||||||
| } | } | ||||||
|  |  | ||||||
| _mcu_get_fwlist() { | mcu_fetch_fwlist() { | ||||||
| 	local uart="$1" | 	local uart="$1" | ||||||
| 	local baud="$2" | 	local baud="$2" | ||||||
| 	local flow="$3" | 	local flow="$3" | ||||||
| @@ -56,36 +59,16 @@ _mcu_get_fwlist() { | |||||||
|  |  | ||||||
| 	[ -n "$baud" ] || baud="115200" | 	[ -n "$baud" ] || baud="115200" | ||||||
|  |  | ||||||
|  | 	[ -n "$MCU_IMGLIST_OUTPUT" ] && return 0 | ||||||
|  |  | ||||||
| 	MCU_IMGLIST_OUTPUT="$(umcumgr -s -d "$uart" -b "$baud$flow" list)" | 	MCU_IMGLIST_OUTPUT="$(umcumgr -s -d "$uart" -b "$baud$flow" list)" | ||||||
| 	[ $? -eq 0 ] || return 1 | 	[ $? -eq 0 ] || { | ||||||
| } | 		mcu_loge "request 'list' failed (uart='$uart', baud='$baud', flow='$flow')" | ||||||
|  | 		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" || { |  | ||||||
| 			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 uart="$1" | ||||||
| 	local baud="$2" | 	local baud="$2" | ||||||
| 	local flow="$3" | 	local flow="$3" | ||||||
| @@ -98,132 +81,83 @@ _mcu_get_sysinfo() { | |||||||
|  |  | ||||||
| 	[ -n "$baud" ] || baud="115200" | 	[ -n "$baud" ] || baud="115200" | ||||||
|  |  | ||||||
|  | 	[ -n "$MCU_SYSINFO_OUTPUT" ] && return 0 | ||||||
|  |  | ||||||
| 	MCU_SYSINFO_OUTPUT="$(umcumgr -s -d "$uart" -b "$baud$flow" sysinfo)" | 	MCU_SYSINFO_OUTPUT="$(umcumgr -s -d "$uart" -b "$baud$flow" sysinfo)" | ||||||
| 	[ $? -eq 0 ] || return 1 | 	[ $? -eq 0 ] || { | ||||||
| } | 		mcu_loge "request 'sysinfo' failed (uart='$uart', baud='$baud', flow='$flow')" | ||||||
|  | 		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" || { |  | ||||||
| 			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() { | mcu_get() { | ||||||
| 	local uart="$1" | 	local param="$1" | ||||||
| 	local baud="$2" | 	local slot="$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" |  | ||||||
|  |  | ||||||
| 	local value | 	local value | ||||||
| 	local metadata | 	local metadata | ||||||
|  | 	local sysinfo_field | ||||||
|  |  | ||||||
| 	metadata="$(_mcu_get_fwmetadata "$slot" "$uart" "$baud" "$flow")" | 	case "$param" in | ||||||
| 	[ $? -eq 0 ] || return 1 | 	"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" | ||||||
|  |  | ||||||
| 	[ -n "$metadata" ] && { | 		metadata="$(echo "$MCU_IMGLIST_OUTPUT" | grep "slot${slot}_metadata=" | cut -d '=' -f 2)" | ||||||
| 		json_load "$metadata" | 		[ -n "$metadata" ] && { | ||||||
| 		json_get_var value fw_name | 			json_load "$metadata" | ||||||
|  | 			json_get_var value fw_name | ||||||
|  | 		} | ||||||
|  | 		;; | ||||||
|  | 	"fwsha") | ||||||
|  | 		[ -n "$slot" ] || return 1 | ||||||
|  | 		param="image list: slot${slot}_hash" | ||||||
|  |  | ||||||
|  | 		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" | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if [ -n "$value" ]; then | 	[ -n "$value" ] && mcu_logd "$param: '$value'" | ||||||
| 		mcu_logi "firmware installed in slot '$slot': '$value'" |  | ||||||
| 	else |  | ||||||
| 		mcu_logw "no firmware installed in slot '$slot'" |  | ||||||
| 	fi |  | ||||||
|  |  | ||||||
| 	echo "$value" | 	echo "$value" | ||||||
| } | } | ||||||
|  |  | ||||||
| mcu_req_boot() { | mcu_req() { | ||||||
| 	local uart="$1" | 	local cmd="$1" | ||||||
| 	local baud="$2" | 	local uart="$2" | ||||||
| 	local flow="$3" | 	local baud="$3" | ||||||
|  | 	local flow="$4" | ||||||
|  |  | ||||||
|  | 	case "$cmd" in | ||||||
|  | 	"boot"|\ | ||||||
|  | 	"reset") | ||||||
|  | 		;; | ||||||
|  | 	*) | ||||||
|  | 		return 1 | ||||||
|  | 		;; | ||||||
|  | 	esac | ||||||
|  |  | ||||||
| 	if [ "$flow" = "1" ]; then | 	if [ "$flow" = "1" ]; then | ||||||
| 		flow=" -f" | 		flow=" -f" | ||||||
| @@ -233,34 +167,12 @@ mcu_req_boot() { | |||||||
|  |  | ||||||
| 	[ -n "$baud" ] || baud="115200" | 	[ -n "$baud" ] || baud="115200" | ||||||
|  |  | ||||||
| 	umcumgr -s -d "$uart" -b "$baud$flow" boot || { | 	umcumgr -s -d "$uart" -b "$baud$flow" "$cmd" || { | ||||||
| 		mcu_loge "request 'boot' failed" | 		mcu_loge "request '$cmd' failed (uart='$uart', baud='$baud', flow='$flow')" | ||||||
| 		return 1 | 		return 1 | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	mcu_logi "MCU requested to boot the firmware" | 	mcu_logi "MCU requested '$cmd'" | ||||||
| } |  | ||||||
|  |  | ||||||
| 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_sel_slot() { | mcu_sel_slot() { | ||||||
| @@ -279,13 +191,26 @@ mcu_sel_slot() { | |||||||
|  |  | ||||||
| 	# Request firmware active slot change | 	# Request firmware active slot change | ||||||
| 	umcumgr -s -d "$uart" -b "$baud$flow" select "$slot" || { | 	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 | 		return 1 | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	mcu_logi "active firmware slot changed to: '$slot'" | 	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() { | mcu_fw_upload() { | ||||||
| 	local board="$1" | 	local board="$1" | ||||||
| 	local slot="$2" | 	local slot="$2" | ||||||
| @@ -315,7 +240,7 @@ mcu_fw_upload() { | |||||||
| 	# Upload fw to selected slot (TODO: slots numbering Zephyr vs. MCUboot) | 	# Upload fw to selected slot (TODO: slots numbering Zephyr vs. MCUboot) | ||||||
| 	[ "$slot" = "1" ] && slot="2" | 	[ "$slot" = "1" ] && slot="2" | ||||||
| 	umcumgr -q -n "$slot" -d "$uart" -b "$baud$flow" upload "$fw_path" || { | 	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 | 		return 1 | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -338,15 +263,10 @@ mcu_sn_check_and_update() { | |||||||
|  |  | ||||||
| 	local sn_dev | 	local sn_dev | ||||||
|  |  | ||||||
| 	if [ "$flow" = "1" ]; then | 	# Fetch sysinfo | ||||||
| 		flow=" -f" | 	mcu_fetch_sysinfo "$uart" "$baud" "$flow" || return 1 | ||||||
| 	else |  | ||||||
| 		flow="" |  | ||||||
| 	fi |  | ||||||
|  |  | ||||||
| 	[ -n "$baud" ] || baud="115200" | 	sn_dev="$(mcu_get "serial_num")" | ||||||
|  |  | ||||||
| 	sn_dev="$(mcu_get_sn "$uart" "$baud" "$flow")" |  | ||||||
| 	[ -n "$sn_dev" ] || return 1 | 	[ -n "$sn_dev" ] || return 1 | ||||||
|  |  | ||||||
| 	[ -n "$sn_dev" ] && { | 	[ -n "$sn_dev" ] && { | ||||||
| @@ -369,6 +289,10 @@ mcu_sn_check_and_update() { | |||||||
| 	return 0 | 	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() { | mcu_fw_check_and_update() { | ||||||
| 	local uart="$1" | 	local uart="$1" | ||||||
| 	local baud="$2" | 	local baud="$2" | ||||||
| @@ -377,24 +301,36 @@ mcu_fw_check_and_update() { | |||||||
| 	local active_slot | 	local active_slot | ||||||
| 	local fw_slots | 	local fw_slots | ||||||
| 	local slot0_fw | 	local slot0_fw | ||||||
|  | 	local slot0_sha | ||||||
| 	local slot1_fw | 	local slot1_fw | ||||||
|  | 	local slot1_sha | ||||||
| 	local firmware | 	local firmware | ||||||
|  | 	local fw0_sha | ||||||
|  | 	local fw1_sha | ||||||
| 	local board | 	local board | ||||||
|  | 	local soft_ver | ||||||
|  |  | ||||||
| 	config_get firmware "$SECT" firmware | 	config_get firmware "$SECT" firmware | ||||||
| 	[ -n "$firmware" ] || mcu_logw "option 'firmware' unset" | 	[ -n "$firmware" ] || mcu_logw "option 'firmware' unset" | ||||||
|  |  | ||||||
| 	# MCU board name | 	# Fetch sysinfo and firmware images list | ||||||
| 	board="$(mcu_get_board "$uart" "$baud" "$flow")" | 	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 | 	[ $? -eq 0 ] || return 1 | ||||||
|  |  | ||||||
| 	# Number of firmware slots and active slot | 	# 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 | 	[ $? -eq 0 ] || return 1 | ||||||
| 	[ -n "$fw_slots" ] || fw_slots="1" | 	[ -n "$fw_slots" ] || fw_slots="1" | ||||||
|  |  | ||||||
| 	[ "$fw_slots" = "2" ] && { | 	[ "$fw_slots" = "2" ] && { | ||||||
| 		active_slot="$(mcu_get_activeslot "$uart" "$baud" "$flow")" | 		active_slot="$(mcu_get "active_slot")" | ||||||
| 		[ $? -eq 0 ] || return 1 | 		[ $? -eq 0 ] || return 1 | ||||||
| 	} | 	} | ||||||
| 	[ -n "$active_slot" ] || active_slot="0" | 	[ -n "$active_slot" ] || active_slot="0" | ||||||
| @@ -407,22 +343,36 @@ mcu_fw_check_and_update() { | |||||||
| 				mcu_loge "firmware '$firmware' doesn't exist" | 				mcu_loge "firmware '$firmware' doesn't exist" | ||||||
| 				return 1 | 				return 1 | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
|  | 			fw1_sha="$(mcu_fwfile_sha "${MCU_FW_DIR}/${board}/${firmware}/slot1.bin")" | ||||||
| 		else | 		else | ||||||
| 			[ -f "${MCU_FW_DIR}/${board}/${firmware}/slot0.bin" ] || { | 			[ -f "${MCU_FW_DIR}/${board}/${firmware}/slot0.bin" ] || { | ||||||
| 				mcu_loge "firmware '$firmware' doesn't exist" | 				mcu_loge "firmware '$firmware' doesn't exist" | ||||||
| 				return 1 | 				return 1 | ||||||
| 			} | 			} | ||||||
| 		fi | 		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 | 	[ $? -eq 0 ] || return 1 | ||||||
|  |  | ||||||
| 	[ "$fw_slots" = "2" ] && { | 	[ -n "$slot0_fw" ] && { | ||||||
| 		slot1_fw="$(mcu_get_fwname "1" "$uart" "$baud" "$flow")" | 		slot0_sha="$(mcu_get "fwsha" "0")" | ||||||
| 		[ $? -eq 0 ] || return 1 | 		[ $? -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 | 	# No target firmware provided, check what's on device and update config | ||||||
| 	[ -n "$firmware" ] || { | 	[ -n "$firmware" ] || { | ||||||
| 		firmware="$slot0_fw" | 		firmware="$slot0_fw" | ||||||
| @@ -437,62 +387,72 @@ mcu_fw_check_and_update() { | |||||||
| 			uci -q set mcu.${SECT}.firmware="$firmware" | 			uci -q set mcu.${SECT}.firmware="$firmware" | ||||||
| 			uci -q commit mcu | 			uci -q commit mcu | ||||||
|  |  | ||||||
| 			mcu_req_boot "$uart" "$baud" "$flow" | 			mcu_req "boot" "$uart" "$baud" "$flow" | ||||||
| 			[ $? -ne 0 ] && return 1 | 			[ $? -ne 0 ] && return 1 | ||||||
|  |  | ||||||
|  | 			return 0 | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		return 0 | 		return 1 | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	# Do we have target firmware installed in the first slot? | 	# Do we have target firmware installed in the first slot? | ||||||
| 	[ "$firmware" = "$slot0_fw" ] && { | 	[ "$firmware" = "$slot0_fw" -a "$slot0_sha" = "$fw0_sha" ] && { | ||||||
| 		mcu_logd "found matching firmware installed in slot '0'" | 		mcu_logi "found matching firmware installed in slot '0'" | ||||||
|  |  | ||||||
| 		if [ "$fw_slots" = "2" -a "$active_slot" != "0" ]; then | 		if [ "$fw_slots" = "2" -a "$active_slot" != "0" ]; then | ||||||
| 			mcu_sel_slot "0" "$uart" "$baud" "$flow" | 			mcu_sel_slot "0" "$uart" "$baud" "$flow" | ||||||
| 			[ $? -ne 0 ] && return 1 | 			[ $? -ne 0 ] && return 1 | ||||||
|  |  | ||||||
| 			# Changing active slots requires MCU reset at the moment | 			# 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 | 			[ $? -ne 0 ] && return 1 | ||||||
|  |  | ||||||
|  | 			return 2 | ||||||
| 		else | 		else | ||||||
| 			mcu_req_boot "$uart" "$baud" "$flow" | 			mcu_req "boot" "$uart" "$baud" "$flow" | ||||||
| 			[ $? -ne 0 ] && return 1 | 			[ $? -ne 0 ] && return 1 | ||||||
| 		fi | 		fi | ||||||
|  |  | ||||||
| 		return 0 | 		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" ] && { | 	[ "$fw_slots" = "1" ] && { | ||||||
| 		mcu_fw_upload "$board" "0" "$firmware" "$uart" "$baud" "$flow" | 		mcu_fw_upload "$board" "0" "$firmware" "$uart" "$baud" "$flow" | ||||||
| 		[ $? -ne 0 ] && return 1 | 		[ $? -ne 0 ] && return 1 | ||||||
|  |  | ||||||
| 		mcu_req_boot "$uart" "$baud" "$flow" | 		mcu_req "reset" "$uart" "$baud" "$flow" | ||||||
| 		[ $? -ne 0 ] && return 1 | 		[ $? -ne 0 ] && return 1 | ||||||
|  |  | ||||||
| 		return 0 | 		return 2 | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	# Do we have target firmware installed in the second slot? | 	# Do we have target firmware installed in the second slot? | ||||||
| 	[ "$firmware" = "$slot1_fw" ] && { | 	[ "$firmware" = "$slot1_fw" -a "$slot1_sha" = "$fw1_sha" ] && { | ||||||
| 		mcu_logd "found matching firmware installed in slot '1'" | 		mcu_logi "found matching firmware installed in slot '1'" | ||||||
|  |  | ||||||
| 		if [ "$active_slot" != "1" ]; then | 		if [ "$active_slot" != "1" ]; then | ||||||
| 			mcu_sel_slot "1" "$uart" "$baud" "$flow" | 			mcu_sel_slot "1" "$uart" "$baud" "$flow" | ||||||
| 			[ $? -ne 0 ] && return 1 | 			[ $? -ne 0 ] && return 1 | ||||||
|  |  | ||||||
| 			# Changing active slots requires MCU reset at the moment | 			# 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 | 			[ $? -ne 0 ] && return 1 | ||||||
|  |  | ||||||
|  | 			return 2 | ||||||
| 		else | 		else | ||||||
| 			mcu_req_boot "$uart" "$baud" "$flow" | 			mcu_req "boot" "$uart" "$baud" "$flow" | ||||||
| 			[ $? -ne 0 ] && return 1 | 			[ $? -ne 0 ] && return 1 | ||||||
| 		fi | 		fi | ||||||
|  |  | ||||||
| 		return 0 | 		return 0 | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	mcu_logi "no matching firmware found in slot '1'" | ||||||
|  |  | ||||||
| 	# Upload and boot firmware on multi-slot device | 	# Upload and boot firmware on multi-slot device | ||||||
| 	# Always use inactive slot | 	# Always use inactive slot | ||||||
| 	if [ "$active_slot" = "0" ]; then | 	if [ "$active_slot" = "0" ]; then | ||||||
| @@ -508,10 +468,10 @@ mcu_fw_check_and_update() { | |||||||
| 	[ $? -ne 0 ] && return 1 | 	[ $? -ne 0 ] && return 1 | ||||||
|  |  | ||||||
| 	# Changing active slots requires MCU reset at the moment | 	# 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 | 	[ $? -ne 0 ] && return 1 | ||||||
|  |  | ||||||
| 	return 0 | 	return 2 | ||||||
| } | } | ||||||
|  |  | ||||||
| mcu_add_uci_config() { | mcu_add_uci_config() { | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ add_rate() { | |||||||
| 	config_get ssid "$cfg" ssid | 	config_get ssid "$cfg" ssid | ||||||
| 	config_get ingress "$cfg" ingress | 	config_get ingress "$cfg" ingress | ||||||
| 	config_get egress "$cfg" egress | 	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() { | reload_service() { | ||||||
|   | |||||||
| @@ -84,7 +84,7 @@ let handlers = { | |||||||
| 			ssid: hapd.ssid, | 			ssid: hapd.ssid, | ||||||
| 			bssid: hapd.bssid, | 			bssid: hapd.bssid, | ||||||
| 		}); | 		}); | ||||||
| 		if (ratelimit) { | 		if (ratelimit && !wildcard(notify.data.phy, 'wlanc*')) { | ||||||
| 			let msg = { | 			let msg = { | ||||||
| 				device: hapd.ifname, | 				device: hapd.ifname, | ||||||
| 				address: notify.data.address, | 				address: notify.data.address, | ||||||
|   | |||||||
| @@ -4,10 +4,9 @@ PKG_NAME:=ucentral-schema | |||||||
| PKG_RELEASE:=1 | PKG_RELEASE:=1 | ||||||
|  |  | ||||||
| PKG_SOURCE_URL=https://github.com/Telecominfraproject/wlan-ucentral-schema.git | PKG_SOURCE_URL=https://github.com/Telecominfraproject/wlan-ucentral-schema.git | ||||||
| PKG_MIRROR_HASH:=62d2b659d16dbdb467215da655259fcb6b239a635f43ee1e87c4d3a3db281d45 |  | ||||||
| PKG_SOURCE_PROTO:=git | PKG_SOURCE_PROTO:=git | ||||||
| PKG_SOURCE_DATE:=2022-05-29 | PKG_SOURCE_DATE:=2022-05-29 | ||||||
| PKG_SOURCE_VERSION:=54453a6345519ead8edbf75475fd802a8af7a245 | PKG_SOURCE_VERSION:=caac3f11f790d2819bf9e41189c3cf99a5d18a78 | ||||||
|  |  | ||||||
| PKG_MAINTAINER:=John Crispin <john@phrozen.org> | PKG_MAINTAINER:=John Crispin <john@phrozen.org> | ||||||
| PKG_LICENSE:=BSD-3-Clause | 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_PROTO:=git | ||||||
| PKG_SOURCE_URL=https://github.com/blogic/udevmand.git | PKG_SOURCE_URL=https://github.com/blogic/udevmand.git | ||||||
| PKG_MIRROR_HASH:=51bcf59754ef87913c40f2f1c708c8d2d2eb0ad5fc128a5c891e54ea4b3b035e | PKG_MIRROR_HASH:=0c234de7e8aca07fcabb7685bd899f0c0c82303c2be61e89364abf1d28b089e7 | ||||||
| PKG_SOURCE_DATE:=20220112 | PKG_SOURCE_DATE:=20220112 | ||||||
| PKG_SOURCE_VERSION:=3d2b67b180679a6f5687e8d318a66a7cbad3fa7b | PKG_SOURCE_VERSION:=979aca4764c10312b62b4e34c7e9f58e22f86b76 | ||||||
| CMAKE_INSTALL:=1 | CMAKE_INSTALL:=1 | ||||||
|  |  | ||||||
| PKG_LICENSE:=LGPL-2.1 | PKG_LICENSE:=LGPL-2.1 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user