From f34db0bb24e3996a3ca0661d39b5c6005f3db637 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Wed, 1 Mar 2023 17:36:38 +0100 Subject: [PATCH 01/31] ucentral-schema: update to latest HEAD 5517c1c wifiscan: add additional options to the periodic scan feature Fixes: WIFI-11993 Signed-off-by: John Crispin --- feeds/ucentral/ucentral-event/files/ucentral-wifiscan | 3 ++- feeds/ucentral/ucentral-schema/Makefile | 4 ++-- .../files/etc/ucentral/examples/telemetry.json | 4 +++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/feeds/ucentral/ucentral-event/files/ucentral-wifiscan b/feeds/ucentral/ucentral-event/files/ucentral-wifiscan index 25a787d5d..f3765ca09 100644 --- a/feeds/ucentral/ucentral-event/files/ucentral-wifiscan +++ b/feeds/ucentral/ucentral-event/files/ucentral-wifiscan @@ -24,7 +24,8 @@ function timer_cb() { params: { active: true, override_dfs: false, - verbose: false, + verbose: +config.wifiscan.verbose, + information_elements: +config.wifiscan.information_elements, periodic: true, serial: 'foo', } diff --git a/feeds/ucentral/ucentral-schema/Makefile b/feeds/ucentral/ucentral-schema/Makefile index 29205b2ae..e96055e56 100644 --- a/feeds/ucentral/ucentral-schema/Makefile +++ b/feeds/ucentral/ucentral-schema/Makefile @@ -4,10 +4,10 @@ PKG_NAME:=ucentral-schema PKG_RELEASE:=1 PKG_SOURCE_URL=https://github.com/Telecominfraproject/wlan-ucentral-schema.git -PKG_MIRROR_HASH:=d7ba8e7cc26526144397d910d6eabe491ebf878a18ecb80a8bc84b17606ac57d +PKG_MIRROR_HASH:=abea08a7c29c2ec4bc353c50134d2c2867300767010f47fe3af5d8f6a17d417a PKG_SOURCE_PROTO:=git PKG_SOURCE_DATE:=2022-05-29 -PKG_SOURCE_VERSION:=5287f72bb7608e6562739682f20823f02812ddd9 +PKG_SOURCE_VERSION:=5517c1c7e0ac7c0bfb143705a85cabd7c29d1818 PKG_MAINTAINER:=John Crispin PKG_LICENSE:=BSD-3-Clause diff --git a/feeds/ucentral/ucentral-schema/files/etc/ucentral/examples/telemetry.json b/feeds/ucentral/ucentral-schema/files/etc/ucentral/examples/telemetry.json index 99e5b6042..50cf02663 100644 --- a/feeds/ucentral/ucentral-schema/files/etc/ucentral/examples/telemetry.json +++ b/feeds/ucentral/ucentral-schema/files/etc/ucentral/examples/telemetry.json @@ -74,7 +74,9 @@ "filters": [ "probe", "auth", "assoc", "disassoc", "deauth", "local-deauth", "inactive-deauth", "key-mismatch", "beacon-report", "radar-detected"] }, "wifi-scan": { - "interval": 60 + "interval": 60, + "verbose": true, + "information-elements": false }, "telemetry": { "interval": 15, From 3f03cfa7c4de85689d18e1fd59881f530fd2bbed Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Fri, 3 Feb 2023 11:21:41 +0100 Subject: [PATCH 02/31] ipq807x: backport fix for Bluetooth LE-only HCI controllers This backports an essential fix for Bluetooth LE-only HCI devices from kernel 4.9: 39385cb5f327 ("Bluetooth: Fix using the correct source address type"). Signed-off-by: Piotr Dymacz --- ...sing-the-correct-source-address-type.patch | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 feeds/ipq807x/ipq807x/patches/801-v4.9-Bluetooth-Fix-using-the-correct-source-address-type.patch diff --git a/feeds/ipq807x/ipq807x/patches/801-v4.9-Bluetooth-Fix-using-the-correct-source-address-type.patch b/feeds/ipq807x/ipq807x/patches/801-v4.9-Bluetooth-Fix-using-the-correct-source-address-type.patch new file mode 100644 index 000000000..cca715677 --- /dev/null +++ b/feeds/ipq807x/ipq807x/patches/801-v4.9-Bluetooth-Fix-using-the-correct-source-address-type.patch @@ -0,0 +1,131 @@ +From 39385cb5f3274735b03ed1f8e7ff517b02a0beed Mon Sep 17 00:00:00 2001 +From: Johan Hedberg +Date: Sat, 12 Nov 2016 17:03:07 +0200 +Subject: [PATCH] Bluetooth: Fix using the correct source address type + +The hci_get_route() API is used to look up local HCI devices, however +so far it has been incapable of dealing with anything else than the +public address of HCI devices. This completely breaks with LE-only HCI +devices that do not come with a public address, but use a static +random address instead. + +This patch exteds the hci_get_route() API with a src_type parameter +that's used for comparing with the right address of each HCI device. + +Signed-off-by: Johan Hedberg +Signed-off-by: Marcel Holtmann +--- + include/net/bluetooth/hci_core.h | 2 +- + net/bluetooth/6lowpan.c | 4 ++-- + net/bluetooth/hci_conn.c | 26 ++++++++++++++++++++++++-- + net/bluetooth/l2cap_core.c | 2 +- + net/bluetooth/rfcomm/tty.c | 2 +- + net/bluetooth/sco.c | 2 +- + 6 files changed, 30 insertions(+), 8 deletions(-) + +--- a/include/net/bluetooth/hci_core.h ++++ b/include/net/bluetooth/hci_core.h +@@ -1003,7 +1003,7 @@ static inline void hci_set_drvdata(struc + } + + struct hci_dev *hci_dev_get(int index); +-struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src); ++struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src, u8 src_type); + + struct hci_dev *hci_alloc_dev(void); + void hci_free_dev(struct hci_dev *hdev); +--- a/net/bluetooth/6lowpan.c ++++ b/net/bluetooth/6lowpan.c +@@ -1102,7 +1102,6 @@ static int get_l2cap_conn(char *buf, bda + { + struct hci_conn *hcon; + struct hci_dev *hdev; +- bdaddr_t *src = BDADDR_ANY; + int n; + + n = sscanf(buf, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx %hhu", +@@ -1113,7 +1112,8 @@ static int get_l2cap_conn(char *buf, bda + if (n < 7) + return -EINVAL; + +- hdev = hci_get_route(addr, src); ++ /* The LE_PUBLIC address type is ignored because of BDADDR_ANY */ ++ hdev = hci_get_route(addr, BDADDR_ANY, BDADDR_LE_PUBLIC); + if (!hdev) + return -ENOENT; + +--- a/net/bluetooth/hci_conn.c ++++ b/net/bluetooth/hci_conn.c +@@ -609,7 +609,7 @@ int hci_conn_del(struct hci_conn *conn) + return 0; + } + +-struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src) ++struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src, uint8_t src_type) + { + int use_src = bacmp(src, BDADDR_ANY); + struct hci_dev *hdev = NULL, *d; +@@ -630,7 +630,29 @@ struct hci_dev *hci_get_route(bdaddr_t * + */ + + if (use_src) { +- if (!bacmp(&d->bdaddr, src)) { ++ bdaddr_t id_addr; ++ u8 id_addr_type; ++ ++ if (src_type == BDADDR_BREDR) { ++ if (!lmp_bredr_capable(d)) ++ continue; ++ bacpy(&id_addr, &d->bdaddr); ++ id_addr_type = BDADDR_BREDR; ++ } else { ++ if (!lmp_le_capable(d)) ++ continue; ++ ++ hci_copy_identity_address(d, &id_addr, ++ &id_addr_type); ++ ++ /* Convert from HCI to three-value type */ ++ if (id_addr_type == ADDR_LE_DEV_PUBLIC) ++ id_addr_type = BDADDR_LE_PUBLIC; ++ else ++ id_addr_type = BDADDR_LE_RANDOM; ++ } ++ ++ if (!bacmp(&id_addr, src) && id_addr_type == src_type) { + hdev = d; break; + } + } else { +--- a/net/bluetooth/l2cap_core.c ++++ b/net/bluetooth/l2cap_core.c +@@ -7044,7 +7044,7 @@ int l2cap_chan_connect(struct l2cap_chan + BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst, + dst_type, __le16_to_cpu(psm)); + +- hdev = hci_get_route(dst, &chan->src); ++ hdev = hci_get_route(dst, &chan->src, chan->src_type); + if (!hdev) + return -EHOSTUNREACH; + +--- a/net/bluetooth/rfcomm/tty.c ++++ b/net/bluetooth/rfcomm/tty.c +@@ -178,7 +178,7 @@ static void rfcomm_reparent_device(struc + struct hci_dev *hdev; + struct hci_conn *conn; + +- hdev = hci_get_route(&dev->dst, &dev->src); ++ hdev = hci_get_route(&dev->dst, &dev->src, BDADDR_BREDR); + if (!hdev) + return; + +--- a/net/bluetooth/sco.c ++++ b/net/bluetooth/sco.c +@@ -219,7 +219,7 @@ static int sco_connect(struct sock *sk) + + BT_DBG("%pMR -> %pMR", &sco_pi(sk)->src, &sco_pi(sk)->dst); + +- hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src); ++ hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, BDADDR_BREDR); + if (!hdev) + return -EHOSTUNREACH; + From f1a56edd09a888381f6006b701ab446c357f14ec Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Sat, 4 Feb 2023 18:22:03 +0100 Subject: [PATCH 03/31] ipq807x: backport some additional fixes for Bluetooth This backports more fixes for the Bluetooth subsystem from 4.9. They were found missing during some initial Bluetooth LE testing. Signed-off-by: Piotr Dymacz --- ...e-HCI-to-MGMT-status-conversion-tabl.patch | 37 +++++++++++++ ...p-invalid-hci_sync_conn_complete_evt.patch | 52 +++++++++++++++++++ ...bugfs-entry-leak-in-hci_register_dev.patch | 33 ++++++++++++ 3 files changed, 122 insertions(+) create mode 100644 feeds/ipq807x/ipq807x/patches/802-v4.9-Bluetooth-Fix-the-HCI-to-MGMT-status-conversion-tabl.patch create mode 100644 feeds/ipq807x/ipq807x/patches/803-v4.9-Bluetooth-skip-invalid-hci_sync_conn_complete_evt.patch create mode 100644 feeds/ipq807x/ipq807x/patches/804-v4.9-Bluetooth-Fix-debugfs-entry-leak-in-hci_register_dev.patch diff --git a/feeds/ipq807x/ipq807x/patches/802-v4.9-Bluetooth-Fix-the-HCI-to-MGMT-status-conversion-tabl.patch b/feeds/ipq807x/ipq807x/patches/802-v4.9-Bluetooth-Fix-the-HCI-to-MGMT-status-conversion-tabl.patch new file mode 100644 index 000000000..11b392e9d --- /dev/null +++ b/feeds/ipq807x/ipq807x/patches/802-v4.9-Bluetooth-Fix-the-HCI-to-MGMT-status-conversion-tabl.patch @@ -0,0 +1,37 @@ +From 345bafc04fa2dea44dbdc8bda5633de256a74262 Mon Sep 17 00:00:00 2001 +From: Yu Liu +Date: Mon, 19 Apr 2021 16:53:30 -0700 +Subject: [PATCH] Bluetooth: Fix the HCI to MGMT status conversion table + +[ Upstream commit 4ef36a52b0e47c80bbfd69c0cce61c7ae9f541ed ] + +0x2B, 0x31 and 0x33 are reserved for future use but were not present in +the HCI to MGMT conversion table, this caused the conversion to be +incorrect for the HCI status code greater than 0x2A. + +Reviewed-by: Miao-chen Chou +Signed-off-by: Yu Liu +Signed-off-by: Marcel Holtmann +Signed-off-by: Sasha Levin +--- + net/bluetooth/mgmt.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/net/bluetooth/mgmt.c ++++ b/net/bluetooth/mgmt.c +@@ -212,12 +212,15 @@ static u8 mgmt_status_table[] = { + MGMT_STATUS_TIMEOUT, /* Instant Passed */ + MGMT_STATUS_NOT_SUPPORTED, /* Pairing Not Supported */ + MGMT_STATUS_FAILED, /* Transaction Collision */ ++ MGMT_STATUS_FAILED, /* Reserved for future use */ + MGMT_STATUS_INVALID_PARAMS, /* Unacceptable Parameter */ + MGMT_STATUS_REJECTED, /* QoS Rejected */ + MGMT_STATUS_NOT_SUPPORTED, /* Classification Not Supported */ + MGMT_STATUS_REJECTED, /* Insufficient Security */ + MGMT_STATUS_INVALID_PARAMS, /* Parameter Out Of Range */ ++ MGMT_STATUS_FAILED, /* Reserved for future use */ + MGMT_STATUS_BUSY, /* Role Switch Pending */ ++ MGMT_STATUS_FAILED, /* Reserved for future use */ + MGMT_STATUS_FAILED, /* Slot Violation */ + MGMT_STATUS_FAILED, /* Role Switch Failed */ + MGMT_STATUS_INVALID_PARAMS, /* EIR Too Large */ diff --git a/feeds/ipq807x/ipq807x/patches/803-v4.9-Bluetooth-skip-invalid-hci_sync_conn_complete_evt.patch b/feeds/ipq807x/ipq807x/patches/803-v4.9-Bluetooth-skip-invalid-hci_sync_conn_complete_evt.patch new file mode 100644 index 000000000..a6099e468 --- /dev/null +++ b/feeds/ipq807x/ipq807x/patches/803-v4.9-Bluetooth-skip-invalid-hci_sync_conn_complete_evt.patch @@ -0,0 +1,52 @@ +From 433c3febcb837cf8f2758660c6a89e1d734c55dc Mon Sep 17 00:00:00 2001 +From: Desmond Cheong Zhi Xi +Date: Wed, 28 Jul 2021 15:51:04 +0800 +Subject: [PATCH] Bluetooth: skip invalid hci_sync_conn_complete_evt + +[ Upstream commit 92fe24a7db751b80925214ede43f8d2be792ea7b ] + +Syzbot reported a corrupted list in kobject_add_internal [1]. This +happens when multiple HCI_EV_SYNC_CONN_COMPLETE event packets with +status 0 are sent for the same HCI connection. This causes us to +register the device more than once which corrupts the kset list. + +As this is forbidden behavior, we add a check for whether we're +trying to process the same HCI_EV_SYNC_CONN_COMPLETE event multiple +times for one connection. If that's the case, the event is invalid, so +we report an error that the device is misbehaving, and ignore the +packet. + +Link: https://syzkaller.appspot.com/bug?extid=66264bf2fd0476be7e6c [1] +Reported-by: syzbot+66264bf2fd0476be7e6c@syzkaller.appspotmail.com +Tested-by: syzbot+66264bf2fd0476be7e6c@syzkaller.appspotmail.com +Signed-off-by: Desmond Cheong Zhi Xi +Signed-off-by: Marcel Holtmann +Signed-off-by: Sasha Levin +--- + net/bluetooth/hci_event.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +--- a/net/bluetooth/hci_event.c ++++ b/net/bluetooth/hci_event.c +@@ -3748,6 +3748,21 @@ static void hci_sync_conn_complete_evt(s + + switch (ev->status) { + case 0x00: ++ /* The synchronous connection complete event should only be ++ * sent once per new connection. Receiving a successful ++ * complete event when the connection status is already ++ * BT_CONNECTED means that the device is misbehaving and sent ++ * multiple complete event packets for the same new connection. ++ * ++ * Registering the device more than once can corrupt kernel ++ * memory, hence upon detecting this invalid event, we report ++ * an error and ignore the packet. ++ */ ++ if (conn->state == BT_CONNECTED) { ++ bt_dev_err(hdev, "Ignoring connect complete event for existing connection"); ++ goto unlock; ++ } ++ + conn->handle = __le16_to_cpu(ev->handle); + conn->state = BT_CONNECTED; + conn->type = ev->link_type; diff --git a/feeds/ipq807x/ipq807x/patches/804-v4.9-Bluetooth-Fix-debugfs-entry-leak-in-hci_register_dev.patch b/feeds/ipq807x/ipq807x/patches/804-v4.9-Bluetooth-Fix-debugfs-entry-leak-in-hci_register_dev.patch new file mode 100644 index 000000000..794aac5b1 --- /dev/null +++ b/feeds/ipq807x/ipq807x/patches/804-v4.9-Bluetooth-Fix-debugfs-entry-leak-in-hci_register_dev.patch @@ -0,0 +1,33 @@ +From 69f728dac41d13fc3e8d4514684e476ebd0d61f5 Mon Sep 17 00:00:00 2001 +From: Wei Yongjun +Date: Wed, 13 Oct 2021 16:55:46 +0800 +Subject: [PATCH] Bluetooth: Fix debugfs entry leak in hci_register_dev() + +[ Upstream commit 5a4bb6a8e981d3d0d492aa38412ee80b21033177 ] + +Fault injection test report debugfs entry leak as follows: + +debugfs: Directory 'hci0' with parent 'bluetooth' already present! + +When register_pm_notifier() failed in hci_register_dev(), the debugfs +create by debugfs_create_dir() do not removed in the error handing path. + +Add the remove debugfs code to fix it. + +Signed-off-by: Wei Yongjun +Signed-off-by: Marcel Holtmann +Signed-off-by: Sasha Levin +--- + net/bluetooth/hci_core.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/net/bluetooth/hci_core.c ++++ b/net/bluetooth/hci_core.c +@@ -3420,6 +3420,7 @@ int hci_register_dev(struct hci_dev *hde + return id; + + err_wqueue: ++ debugfs_remove_recursive(hdev->debugfs); + destroy_workqueue(hdev->workqueue); + destroy_workqueue(hdev->req_workqueue); + err: From 5fec90d4ca95594b33653f54cd40db586c122ddd Mon Sep 17 00:00:00 2001 From: John Crispin Date: Mon, 6 Mar 2023 09:37:17 +0100 Subject: [PATCH 04/31] uspot: fix userurl and allow cleartext password Signed-off-by: John Crispin --- feeds/ucentral/uspot/files/usr/share/uspot/cpd.uc | 2 +- feeds/ucentral/uspot/files/usr/share/uspot/handler-uam.uc | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/feeds/ucentral/uspot/files/usr/share/uspot/cpd.uc b/feeds/ucentral/uspot/files/usr/share/uspot/cpd.uc index 160ef5d73..67f5b333d 100644 --- a/feeds/ucentral/uspot/files/usr/share/uspot/cpd.uc +++ b/feeds/ucentral/uspot/files/usr/share/uspot/cpd.uc @@ -1,4 +1,4 @@ Status: 302 Found -Location: http://{{env.SERVER_ADDR}}/hotspot/?redir={{env.headers.host}} +Location: http://{{env.SERVER_ADDR}}/hotspot/?redir={{env.headers.host}}{{env.REQUEST_URI}} Content-Type: text/html diff --git a/feeds/ucentral/uspot/files/usr/share/uspot/handler-uam.uc b/feeds/ucentral/uspot/files/usr/share/uspot/handler-uam.uc index 2c552fd13..617469bd9 100644 --- a/feeds/ucentral/uspot/files/usr/share/uspot/handler-uam.uc +++ b/feeds/ucentral/uspot/files/usr/share/uspot/handler-uam.uc @@ -13,7 +13,10 @@ function auth_client(ctx) { let payload = portal.radius_init(ctx); payload.logoff_url = sprintf('http://%s:3990/', ctx.env.SERVER_ADDR); - if (ctx.query_string.username && ctx.query_string.response) { + if (ctx.query_string.username && ctx.query_string.password && !portal.config.uam.uam_secret) { + payload.username = ctx.query_string.username; + payload.password = ctx.query_string.password; + } else if (ctx.query_string.username && ctx.query_string.response) { let challenge = uam.md5(portal.config.uam.challenge, ctx.format_mac); payload.username = ctx.query_string.username; From 9997af10a518ae3a9817e064cf2cbe22c50760a3 Mon Sep 17 00:00:00 2001 From: Ken Date: Wed, 1 Mar 2023 08:28:36 +0800 Subject: [PATCH 05/31] CIG WF-660A : Add WF-660a support [patch 3] Fixed caldata.bin can NOT be generated with EMMC issue. --- .../base-files/etc/hotplug.d/firmware/10-ath11k-caldata | 3 +++ 1 file changed, 3 insertions(+) diff --git a/feeds/ipq807x/ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata b/feeds/ipq807x/ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata index e87ad9f0d..b0241239e 100755 --- a/feeds/ipq807x/ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata +++ b/feeds/ipq807x/ipq807x/base-files/etc/hotplug.d/firmware/10-ath11k-caldata @@ -70,6 +70,9 @@ caldata_extract() { local mtd mtd=$(find_mtd_chardev $part) + if [ -z "$mtd" ]; then + mtd=/dev/$(echo $(find_mmc_part $part) | sed 's/^.\{5\}//') + fi [ -n "$mtd" ] || caldata_die "no mtd device found for partition $part" dd if=$mtd of=/lib/firmware/$FIRMWARE iflag=skip_bytes bs=$count skip=$offset count=1 2>/dev/null || \ From 8a86ae3b7d18e0d85d78d6074685dc6c10f96705 Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Tue, 15 Nov 2022 17:12:57 +0100 Subject: [PATCH 06/31] feeds: add mcu feed with 'umcumgr' package The 'umcumgr' is a simple command line tool for MCU firmware management over MCUmgr/SMP protocol. It will be used together with MCUboot running on the on-board (or external, e.g. in form of a dongle) MCU. While at it, add also dedicated 'mcu.yml' profile file. Signed-off-by: Piotr Dymacz --- feeds/mcu/umcumgr/Makefile | 43 ++++++++++++++++++++++++++++++++++++++ profiles/mcu.yml | 8 +++++++ 2 files changed, 51 insertions(+) create mode 100644 feeds/mcu/umcumgr/Makefile create mode 100644 profiles/mcu.yml diff --git a/feeds/mcu/umcumgr/Makefile b/feeds/mcu/umcumgr/Makefile new file mode 100644 index 000000000..212159fc3 --- /dev/null +++ b/feeds/mcu/umcumgr/Makefile @@ -0,0 +1,43 @@ +# +# Copyright (C) 2023 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=umcumgr +PKG_SOURCE_PROTO:=git +PKG_SOURCE_URL:=https://gitlab.com/pepe2k/umcumgr +PKG_SOURCE_DATE:=2023-03-06 +PKG_SOURCE_VERSION:=966606a2868b8e6b0a2c7e129dc45a30e0d9ef87 + +PKG_LICENSE:=Apache-2.0 +PKG_LICENSE_FILES:= + +PKG_MAINTAINER:=Piotr Dymacz + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/cmake.mk + +CMAKE_INSTALL:=1 + +define Package/umcumgr + SECTION:=utils + CATEGORY:=Utilities + DEPENDS:=+libubox + TITLE:=User space tool for MCUmgr SMP based management +endef + +define Package/umcumgr/description + Simple user space tool for MCU management over MCUmgr SMP + (Simple Management Protocol) protocol +endef + +define Package/umcumgr/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/umcumgr $(1)/usr/bin/ +endef + +$(eval $(call BuildPackage,umcumgr)) diff --git a/profiles/mcu.yml b/profiles/mcu.yml new file mode 100644 index 000000000..1384c9a53 --- /dev/null +++ b/profiles/mcu.yml @@ -0,0 +1,8 @@ +--- +description: Add MCU support related dependencies +feeds: + - name: mcu + path: ../../feeds/mcu + +packages: + - umcumgr From 5603442a372af0babdc40a00ca9843300744dae2 Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Fri, 17 Feb 2023 00:07:18 +0100 Subject: [PATCH 07/31] feeds: mcu: introduce 'mcu' package This introduces new package 'mcu' which is a collection of shell based scripts used as glue code for generic MCU configuration and management. The scripts are responsible for communicating with embedded MCU running compatible MCUboot bootloader version over MCUmgr/SMP protocol. The communication is realized based on usage of the introduced earlier dedicated CLI tool called 'umcumgr. The most important function of this package is a simple MCU's firmware management (checking firmware available in the MCU's internal flash, uploading new and selecting active on multi-firmware slot capable MCU). This solution requires MCU running modified version of MCUboot, available in GitLab: https://gitlab.com/pepe2k/mcuboot Signed-off-by: Piotr Dymacz --- feeds/mcu/mcu/Makefile | 42 +++ feeds/mcu/mcu/files/mcu.hotplug | 110 +++++++ feeds/mcu/mcu/files/mcu.init | 254 ++++++++++++++++ feeds/mcu/mcu/files/mcu.sh | 505 ++++++++++++++++++++++++++++++++ 4 files changed, 911 insertions(+) create mode 100644 feeds/mcu/mcu/Makefile create mode 100644 feeds/mcu/mcu/files/mcu.hotplug create mode 100644 feeds/mcu/mcu/files/mcu.init create mode 100644 feeds/mcu/mcu/files/mcu.sh diff --git a/feeds/mcu/mcu/Makefile b/feeds/mcu/mcu/Makefile new file mode 100644 index 000000000..826e54b92 --- /dev/null +++ b/feeds/mcu/mcu/Makefile @@ -0,0 +1,42 @@ +# +# Copyright (C) 2023 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=mcu +PKG_VERSION:=2023-03-05 +PKG_RELEASE=1 + +PKG_LICENSE:=GPL-2.0 +PKG_LICENSE_FILES:= + +PKG_MAINTAINER:=Piotr Dymacz + +include $(INCLUDE_DIR)/package.mk + +define Package/mcu + TITLE:=Generic OpenWrt/OpenWiFi MCU config and management handler + CATEGORY:=Utilities + DEPENDS:=+umcumgr +libubox + SECTION:=utils +endef + +define Package/mcu/conffiles + /etc/config/mcu +endef + +define Build/Compile +endef + +define Package/mcu/install + $(INSTALL_DIR) $(1)/etc/init.d $(1)/etc/hotplug.d/usb $(1)/lib/functions + $(INSTALL_BIN) ./files/mcu.init $(1)/etc/init.d/mcu + $(INSTALL_DATA) ./files/mcu.hotplug $(1)/etc/hotplug.d/usb/30-mcu + $(INSTALL_DATA) ./files/mcu.sh $(1)/lib/functions +endef + +$(eval $(call BuildPackage,mcu)) diff --git a/feeds/mcu/mcu/files/mcu.hotplug b/feeds/mcu/mcu/files/mcu.hotplug new file mode 100644 index 000000000..461c3f462 --- /dev/null +++ b/feeds/mcu/mcu/files/mcu.hotplug @@ -0,0 +1,110 @@ +#!/bin/sh + +. /lib/functions.sh +. /lib/functions/mcu.sh + +MCU_SCRIPT_NAME="mcu-hotplug" +MCU_CFG_FOUND="0" + +mcu_hotplug_setup() { + local sn + local disabled + + local sn_dev="$2" + local uart="$3" + + SECT="$1" + + [ "$MCU_CFG_FOUND" = "1" ] && return 0 + + config_get sn "$SECT" sn + [ "$sn" != "$sn_dev" ] && return 0 + + MCU_SCRIPT_NAME="mcu-hotplug.${SECT}" + MCU_CFG_FOUND="1" + + mcu_logi "found matching config section '$SECT'" + + # Section disabled? + config_get_bool disabled "$SECT" disabled "0" + [ "$disabled" = "1" ] && { + mcu_logw "section is disabled in config" + return 0 + } + + mcu_sn_check_and_update "$sn" "$uart" + [ $? -ne 0 ] && return 1 + + mcu_fw_check_and_update "$uart" + [ $? -ne 0 ] && return 1 +} + +# We are looking for ttyACM with specific product name and USB VID:PID +[ "$ACTION" = "add" -a \ + "$DRIVER" = "cdc_acm" -a \ + "$DEVTYPE" = "usb_interface" ] && { + + usb_path="/sys/bus/usb/devices/" + dev="$(echo "$DEVICENAME" | cut -d ':' -f 1)" + [ -n "$dev" ] || return 1 + + p="$(cat "${usb_path}/${dev}/product" 2>/dev/null)" + id="$(cat "${usb_path}/${dev}/idVendor" 2>/dev/null)" + id="${id}$(cat "${usb_path}//${dev}/idProduct" 2>/dev/null)" + sn="$(cat "${usb_path}/${dev}/serial" 2>/dev/null)" + + [ "$p" = "$MCUBOOT_USB_PRODUCT" -a \ + "$id" = "$MCUBOOT_USB_VID_PID" ] || return 0 + + 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 + [ -c "/dev/$(basename "$tty")" ] && { + uart_path="/dev/$(basename "$tty")" + break + } + done + + [ -n "$uart_path" ] || { + mcu_loge "failed to find ttyACM interface" + return 1 + } + + # Try to acquire lock (init script might be handling this device) + exec 9>"$MCU_FLOCK_FILE" || return 1 + flock -n 9 || { + mcu_logd "lock taken by init script, skipping" + return 1 + } + + config_load mcu + config_foreach mcu_hotplug_setup mcu "$sn" "$uart_path" + + # Add new config section for this MCU if no matching found (by S/N) + [ "$MCU_CFG_FOUND" = "0" ] && { + MCU_SCRIPT_NAME="mcu-hotplug" + + sect="${sn:0:8}_usb" + mcu_logi "no matching MCU config found, adding new (disabled): '$sect'" + + uci -q batch <<-EOF + set mcu.${sect}=mcu + set mcu.${sect}.interface=usb + set mcu.${sect}.bootloader=mcuboot + set mcu.${sect}.sn=$sn + set mcu.${sect}.disabled=1 + EOF + + uci -q commit mcu + + flock -u 9 + return 0 + } + + flock -u 9 +} diff --git a/feeds/mcu/mcu/files/mcu.init b/feeds/mcu/mcu/files/mcu.init new file mode 100644 index 000000000..c225c4e2f --- /dev/null +++ b/feeds/mcu/mcu/files/mcu.init @@ -0,0 +1,254 @@ +#!/bin/sh /etc/rc.common + +START=80 + +. /lib/functions/mcu.sh + +SECT= + +mcu_setup_uart() { + local uart="$1" + local baud="$2" + local flow="$3" + local gpio_path="$4" + local gpio_on="$5" + local sn="$6" + + # Take out MCU out of reset and read basic info + mcu_enable_pin_set "$gpio_path" "$gpio_on" + sleep 1 + + mcu_sn_check_and_update "$sn" "$uart" "$baud" "$flow" + [ $? -ne 0 ] && return 1 + + mcu_fw_check_and_update "$uart" "$baud" "$flow" + [ $? -ne 0 ] && return 1 +} + +mcu_setup_usb() { + local gpio_path="$1" + local gpio_on="$2" + local sn="$3" + local gpio_off="0" + + local uart + + [ "$gpio_on" = "0" ] && gpio_off="1" + + # If we have S/N in config, only take out the MCU from reset + [ -n "$sn" ] && { + mcu_logi "MCU S/N already set, hotplug will perform config" + mcu_enable_pin_set "$gpio_path" "$gpio_on" + return 0 + } + + # If S/N is missing, we need to take out MCU from reset, find out + # its S/N and save it for later + + exec 9>"$MCU_FLOCK_FILE" || { + mcu_loge "failed to obtain lock (exec fail)!" + return 1 + } + + flock -n 9 || { + mcu_loge "failed to obtain lock (flock fail)!" + return 1 + } + + usb_path="/sys/bus/usb/devices/*" + devs_old="" + for dev_path in $usb_path; do + dev="$(basename "$dev_path")" + [[ $dev == *":"* ]] && continue + + p="$(cat "${dev_path}/product" 2>/dev/null)" + id="$(cat "${dev_path}/idVendor" 2>/dev/null)" + id="${id}$(cat "${dev_path}/idProduct" 2>/dev/null)" + + [ "$p" = "$MCUBOOT_USB_PRODUCT" -a \ + "$id" = "$MCUBOOT_USB_VID_PID" ] && \ + devs_old="$devs_old $dev" + done + + mcu_enable_pin_set "$gpio_path" "$gpio_on" + sleep 2 + + dev_found="" + for dev_path in $usb_path; do + dev="$(basename "$dev_path")" + [[ $dev == *":"* ]] && continue + + p="$(cat "${dev_path}/product" 2>/dev/null)" + id="$(cat "${dev_path}/idVendor" 2>/dev/null)" + id="${id}$(cat "${dev_path}/idProduct" 2>/dev/null)" + + [ "$p" = "$MCUBOOT_USB_PRODUCT" -a \ + "$id" = "$MCUBOOT_USB_VID_PID" ] && { + [ -n "$devs_old" ] && { + if echo "$devs_old" | grep -q "$dev"; then + continue + fi + } + + dev_found="$dev" + break + } + done + + [ -n "$dev_found" ] || { + mcu_loge "failed to find MCU on USB bus" + mcu_enable_pin_set "$gpio_path" "$gpio_off" + + flock -u 9 + return 1 + } + + mcu_logd "MCU found on USB bus: '$dev_found'" + + # We expect just a single ttyACM interface + usb_path="/sys/bus/usb/devices/${dev_found}*/tty/*" + for tty_path in $usb_path; do + tty="$(basename "$tty_path")" + [ -c "/dev/${tty}" ] && { + uart="/dev/${tty}" + break + } + done + + [ -n "$uart" ] || { + mcu_loge "failed to find ttyACM interface" + mcu_enable_pin_set "$gpio_path" "$gpio_off" + + flock -u 9 + return 1 + } + + mcu_sn_check_and_update "$sn" "$uart" + [ $? -ne 0 ] && { + mcu_enable_pin_set "$gpio_path" "$gpio_off" + + flock -u 9 + return 1 + } + + mcu_fw_check_and_update "$uart" + [ $? -ne 0 ] && { + mcu_enable_pin_set "$gpio_path" "$gpio_off" + + flock -u 9 + return 1 + } + + flock -u 9 +} + +mcu_setup() { + local sn + local disabled + local uart_baud + local uart_flow + local uart_path + local interface + local bootloader + local enable_pin + local gpio_path + + local gpio_on="1" + local gpio_off="0" + + SECT="$1" + MCU_SCRIPT_NAME="mcu-init.${SECT}" + + MCU_SYSINFO_OUTPUT="" + MCU_IMGLIST_OUTPUT="" + + # Section disabled? + 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 + config_get enable_pin "$SECT" enable_pin + config_get interface "$SECT" interface + config_get uart_path "$SECT" uart_path + config_get uart_baud "$SECT" uart_baud "115200" + config_get_bool uart_flow "$SECT" uart_flow "0" + + # As for now, only 'mcuboot' bootloader is supported + case "$bootloader" in + "mcuboot") + command -v umcumgr > /dev/null 2>&1 || { + mcu_loge "missing 'umcumgr' tool" + return 1 + } + ;; + *) + mcu_loge "unsupported or unset 'bootloader' option" + return 1 + ;; + esac + + # Verify 'enable_pin' option + if [ -z "$enable_pin" ]; then + # USB based MCU without GPIO based way for reset are fully + # handled by the hotplug script + [ "$interface" = "usb" ] && { + mcu_logw "'enable_pin' option is unset, ignoring" + return 0 + } + + [ "$interface" = "uart" ] && { + mcu_loge "'enable_pin' option is unset" + return 1 + } + else + gpio_path="/sys/class/gpio/${enable_pin}" + [ -d "$gpio_path" ] || { + mcu_loge "invalid 'enable_pin' option" + return 1 + } + + [ "$(cat "${gpio_path}/active_low")" = "1" ] && { + gpio_on="0" + gpio_off="1" + } + + # 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" ] && { + mcu_logw "MCU already enabled, resetting" + mcu_enable_pin_set "$gpio_path" "$gpio_off" + sleep 1 + } + fi + + # For now only 'usb' and 'uart' interfaces are supported + case "$interface" in + "uart") + [ -z "$uart_path" -o ! -c "$uart_path" ] && { + mcu_loge "invalid or unset 'uart_path' option" + return 1 + } + + mcu_setup_uart "$uart_path" "$uart_baud" "$uart_flow" \ + "$gpio_path" "$gpio_on" "$sn" + ;; + "usb") + mcu_setup_usb "$gpio_path" "$gpio_on" "$sn" + ;; + *) + mcu_loge "unsupported or unset 'interface' option" + return 1 + ;; + esac +} + +start() { + config_load mcu + config_foreach mcu_setup mcu + + return 0 +} diff --git a/feeds/mcu/mcu/files/mcu.sh b/feeds/mcu/mcu/files/mcu.sh new file mode 100644 index 000000000..012ef6e4c --- /dev/null +++ b/feeds/mcu/mcu/files/mcu.sh @@ -0,0 +1,505 @@ +#!/bin/sh + +. /usr/share/libubox/jshn.sh + +# Product name and VID:PID used by OpenWrt/OpenWiFi MCUboot fork +MCUBOOT_USB_PRODUCT="MCUboot serial recovery" +MCUBOOT_USB_VID_PID="16c005e1" + +MCU_FW_DIR="/lib/firmware/mcu/" +MCU_FLOCK_FILE="/tmp/lock/mcu" + +MCU_SYSINFO_OUTPUT= +MCU_IMGLIST_OUTPUT= + +MCU_SCRIPT_NAME="" + +# logger helpers +mcu_log() { + if [ -n "$MCU_SCRIPT_NAME" ]; then + logger -p "$1" -t "${MCU_SCRIPT_NAME}[$$]" "$2" + else + logger -p "$1" "$2" + fi +} + +mcu_loge() { + mcu_log "err" "$1" +} + +mcu_logd() { + mcu_log "debug" "$1" +} + +mcu_logi() { + mcu_log "info" "$1" +} + +mcu_logn() { + mcu_log "notice" "$1" +} + +mcu_logw() { + mcu_log "warn" "$1" +} + +_mcu_get_fwlist() { + local uart="$1" + local baud="$2" + local flow="$3" + + if [ "$flow" = "1" ]; then + flow=" -f" + else + flow="" + fi + + [ -n "$baud" ] || baud="115200" + + 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" || { + 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() { + local uart="$1" + local baud="$2" + local flow="$3" + + if [ "$flow" = "1" ]; then + flow=" -f" + else + flow="" + fi + + [ -n "$baud" ] || baud="115200" + + 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" || { + 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" + + local value + local metadata + + metadata="$(_mcu_get_fwmetadata "$slot" "$uart" "$baud" "$flow")" + [ $? -eq 0 ] || return 1 + + [ -n "$metadata" ] && { + json_load "$metadata" + json_get_var value fw_name + } + + if [ -n "$value" ]; then + mcu_logi "firmware installed in slot '$slot': '$value'" + else + mcu_logw "no firmware installed in slot '$slot'" + fi + + echo "$value" +} + +mcu_req_boot() { + local uart="$1" + local baud="$2" + local flow="$3" + + if [ "$flow" = "1" ]; then + flow=" -f" + else + flow="" + fi + + [ -n "$baud" ] || baud="115200" + + umcumgr -s -d "$uart" -b "$baud$flow" boot || { + mcu_loge "request 'boot' failed" + 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_sel_slot() { + local slot="$1" + local uart="$2" + local baud="$3" + local flow="$4" + + if [ "$flow" = "1" ]; then + flow=" -f" + else + flow="" + fi + + [ -n "$baud" ] || baud="115200" + + # Request firmware active slot change + umcumgr -s -d "$uart" -b "$baud$flow" select "$slot" || { + mcu_loge "request 'select slot' failed" + return 1 + } + + mcu_logi "active firmware slot changed to: '$slot'" +} + +mcu_fw_upload() { + local board="$1" + local slot="$2" + local fw_name="$3" + local uart="$4" + local baud="$5" + local flow="$6" + + local fw_path + + if [ "$flow" = "1" ]; then + flow=" -f" + else + flow="" + fi + + [ -n "$baud" ] || baud="115200" + + fw_path="${MCU_FW_DIR}/${board}/${fw_name}/slot${slot}.bin" + umcumgr -q info "$fw_path" > /dev/null 2>&1 || { + mcu_loge "invalid or missing firmware file: '$fw_path'" + return 1 + } + + mcu_logi "uploading '$fw_name' to slot: '$slot'..." + + # 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" + return 1 + } + + mcu_logi "firmware uploaded!" +} + +mcu_enable_pin_set() { + local gpio="$1" + local gpio_value="$2" + + mcu_logd "setting MCU enable_pin '$(basename "$gpio")' to '$gpio_value'" + echo "$gpio_value" > "${gpio}/value" 2>/dev/null +} + +mcu_sn_check_and_update() { + local sn="$1" + local uart="$2" + local baud="$3" + local flow="$4" + + local sn_dev + + if [ "$flow" = "1" ]; then + flow=" -f" + else + flow="" + fi + + [ -n "$baud" ] || baud="115200" + + sn_dev="$(mcu_get_sn "$uart" "$baud" "$flow")" + [ -n "$sn_dev" ] || return 1 + + [ -n "$sn_dev" ] && { + if [ -z "$sn" ]; then + uci -q set mcu.${SECT}.sn="$sn_dev" + uci -q commit mcu + else + [ "$sn" != "$sn_dev" ] && { + mcu_loge "MCU S/N mismatch ('$sn_dev' != '$sn')!" + return 1 + } + fi + } + + return 0 +} + +mcu_fw_check_and_update() { + local uart="$1" + local baud="$2" + local flow="$3" + + local active_slot + local fw_slots + local slot0_fw + local slot1_fw + local firmware + local board + + config_get firmware "$SECT" firmware + [ -n "$firmware" ] || mcu_logw "option 'firmware' unset" + + # MCU board name + board="$(mcu_get_board "$uart" "$baud" "$flow")" + [ $? -eq 0 ] || return 1 + + # Number of firmware slots and active slot + fw_slots="$(mcu_get_slotsnum "$uart" "$baud" "$flow")" + [ $? -eq 0 ] || return 1 + [ -n "$fw_slots" ] || fw_slots="1" + + [ "$fw_slots" = "2" ] && { + active_slot="$(mcu_get_activeslot "$uart" "$baud" "$flow")" + [ $? -eq 0 ] || return 1 + } + [ -n "$active_slot" ] || active_slot="0" + + # Firmware available? + [ -n "$firmware" ] && { + if [ "$fw_slots" = "2" ]; then + [ -f "${MCU_FW_DIR}/${board}/${firmware}/slot0.bin" -a \ + -f "${MCU_FW_DIR}/${board}/${firmware}/slot1.bin" ] || { + mcu_loge "firmware '$firmware' doesn't exist" + return 1 + } + else + [ -f "${MCU_FW_DIR}/${board}/${firmware}/slot0.bin" ] || { + mcu_loge "firmware '$firmware' doesn't exist" + return 1 + } + fi + } + + slot0_fw="$(mcu_get_fwname "0" "$uart" "$baud" "$flow")" + [ $? -eq 0 ] || return 1 + + [ "$fw_slots" = "2" ] && { + slot1_fw="$(mcu_get_fwname "1" "$uart" "$baud" "$flow")" + [ $? -eq 0 ] || return 1 + } + + # No target firmware provided, check what's on device and update config + [ -n "$firmware" ] || { + firmware="$slot0_fw" + [ "$active_slot" = "1" ] && firmware="$slot1_fw" + + [ -n "$firmware" ] && { + uci -q set mcu.${SECT}.firmware="$firmware" + uci -q commit mcu + + mcu_req_boot "$uart" "$baud" "$flow" + [ $? -ne 0 ] && return 1 + } + + return 0 + } + + # Do we have target firmware installed in the first slot? + [ "$firmware" = "$slot0_fw" ] && { + mcu_logd "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" + [ $? -ne 0 ] && return 1 + else + mcu_req_boot "$uart" "$baud" "$flow" + [ $? -ne 0 ] && return 1 + fi + + return 0 + } + + # Upload and boot firmware 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" + [ $? -ne 0 ] && return 1 + + return 0 + } + + # Do we have target firmware installed in the second slot? + [ "$firmware" = "$slot1_fw" ] && { + mcu_logd "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" + [ $? -ne 0 ] && return 1 + else + mcu_req_boot "$uart" "$baud" "$flow" + [ $? -ne 0 ] && return 1 + fi + + return 0 + } + + # Upload and boot firmware on multi-slot device + # Always use inactive slot + if [ "$active_slot" = "0" ]; then + active_slot="1" + else + active_slot="0" + fi + + mcu_fw_upload "$board" "$active_slot" "$firmware" "$uart" "$baud" "$flow" + [ $? -ne 0 ] && return 1 + + mcu_sel_slot "$active_slot" "$uart" "$baud" "$flow" + [ $? -ne 0 ] && return 1 + + # Changing active slots requires MCU reset at the moment + mcu_req_reset "$uart" "$baud" "$flow" + [ $? -ne 0 ] && return 1 + + return 0 +} From 9aff26b7fb61d6eab26fcaf0ebaf254b777ed4b5 Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Fri, 17 Feb 2023 00:07:18 +0100 Subject: [PATCH 08/31] mcu: provide example UCI configuration file Signed-off-by: Piotr Dymacz --- feeds/mcu/mcu/files/example.config | 32 ++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 feeds/mcu/mcu/files/example.config diff --git a/feeds/mcu/mcu/files/example.config b/feeds/mcu/mcu/files/example.config new file mode 100644 index 000000000..6bdff5342 --- /dev/null +++ b/feeds/mcu/mcu/files/example.config @@ -0,0 +1,32 @@ +config mcu 'uart_no_hw_flow' + option interface 'uart' + option bootloader 'mcuboot' + option enable_pin 'mcu-enable' + option uart_path '/dev/ttyMSM1' + option uart_baud '115200' + option firmware 'zephyr-main__hello_world' + option disabled '1' + +config mcu 'uart_with_hw_flow' + option interface 'uart' + option bootloader 'mcuboot' + option enable_pin 'mcu-enable' + option uart_path '/dev/ttyMSM1' + option uart_baud '1000000' + option uart_flow '1' + option firmware 'zephyr-main__hello_world' + option disabled '1' + +config mcu 'usb_with_enable_pin' + option interface 'usb' + option bootloader 'mcuboot' + option enable_pin 'mcu-enable' + option firmware 'zephyr-main__hello_world' + option disabled '1' + +config mcu 'usb_no_enable_pin' + option interface 'usb' + option bootloader 'mcuboot' + option sn 'ABCDEF1234567890' + option firmware 'zephyr-main__hello_world' + option disabled '1' From e4ed881dd7f781a787df0b97a087e5bbda05b609 Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Fri, 17 Feb 2023 00:07:18 +0100 Subject: [PATCH 09/31] mcu: support OpenWiFi with uCentral On device running OpenWiFi with uCentral, additional copy of the initial UCI configuration will be generated in '/etc/config-shadow/'. As part of the MCU configuration is done during runtime, after the 'config-shadow' is created, we should update it as well to keep everything in sync. Signed-off-by: Piotr Dymacz --- feeds/mcu/mcu/files/mcu.hotplug | 12 ++++++++++++ feeds/mcu/mcu/files/mcu.sh | 10 ++++++++++ 2 files changed, 22 insertions(+) diff --git a/feeds/mcu/mcu/files/mcu.hotplug b/feeds/mcu/mcu/files/mcu.hotplug index 461c3f462..54b17963f 100644 --- a/feeds/mcu/mcu/files/mcu.hotplug +++ b/feeds/mcu/mcu/files/mcu.hotplug @@ -92,6 +92,18 @@ mcu_hotplug_setup() { sect="${sn:0:8}_usb" mcu_logi "no matching MCU config found, adding new (disabled): '$sect'" + [ -d /etc/config-shadow ] && { + uci -c /etc/config-shadow -q batch <<-EOF + set mcu.${sect}=mcu + set mcu.${sect}.interface=usb + set mcu.${sect}.bootloader=mcuboot + set mcu.${sect}.sn=$sn + set mcu.${sect}.disabled=1 + EOF + + uci -c /etc/config-shadow -q commit mcu + } + uci -q batch <<-EOF set mcu.${sect}=mcu set mcu.${sect}.interface=usb diff --git a/feeds/mcu/mcu/files/mcu.sh b/feeds/mcu/mcu/files/mcu.sh index 012ef6e4c..4fd5b3665 100644 --- a/feeds/mcu/mcu/files/mcu.sh +++ b/feeds/mcu/mcu/files/mcu.sh @@ -351,6 +351,11 @@ mcu_sn_check_and_update() { [ -n "$sn_dev" ] && { if [ -z "$sn" ]; then + [ -d /etc/config-shadow ] && { + uci -c /etc/config-shadow -q set mcu.${SECT}.sn="$sn_dev" + uci -c /etc/config-shadow -q commit mcu + } + uci -q set mcu.${SECT}.sn="$sn_dev" uci -q commit mcu else @@ -424,6 +429,11 @@ mcu_fw_check_and_update() { [ "$active_slot" = "1" ] && firmware="$slot1_fw" [ -n "$firmware" ] && { + [ -d /etc/config-shadow ] && { + uci -c /etc/config-shadow -q set mcu.${SECT}.firmware="$firmware" + uci -c /etc/config-shadow -q commit mcu + } + uci -q set mcu.${SECT}.firmware="$firmware" uci -q commit mcu From 7a37e9bf0be01b66e92777757868ca381decdbc6 Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Fri, 17 Feb 2023 00:07:18 +0100 Subject: [PATCH 10/31] mcu: support default configuration with uci-defaults This adds support for creating initial MCU configuration with use of 'uci-defaults' in a same was as for example 'uboot-envtools' package. Signed-off-by: Piotr Dymacz --- feeds/mcu/mcu/Makefile | 10 +++++++++- feeds/mcu/mcu/files/mcu.sh | 26 ++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/feeds/mcu/mcu/Makefile b/feeds/mcu/mcu/Makefile index 826e54b92..1a6c7682b 100644 --- a/feeds/mcu/mcu/Makefile +++ b/feeds/mcu/mcu/Makefile @@ -33,10 +33,18 @@ define Build/Compile endef define Package/mcu/install - $(INSTALL_DIR) $(1)/etc/init.d $(1)/etc/hotplug.d/usb $(1)/lib/functions + $(INSTALL_DIR) $(1)/etc/init.d $(1)/etc/hotplug.d/usb $(1)/lib/functions $(1)/etc/uci-defaults $(INSTALL_BIN) ./files/mcu.init $(1)/etc/init.d/mcu $(INSTALL_DATA) ./files/mcu.hotplug $(1)/etc/hotplug.d/usb/30-mcu $(INSTALL_DATA) ./files/mcu.sh $(1)/lib/functions + $(if $(wildcard ./files/uci-defaults/$(BOARD)_$(SUBTARGET)), \ + $(INSTALL_DATA) ./files/uci-defaults/$(BOARD)_$(SUBTARGET) \ + $(1)/etc/uci-defaults/20-mcu, \ + $(if $(wildcard ./files/uci-defaults/$(BOARD)), \ + $(INSTALL_DATA) ./files/uci-defaults/$(BOARD) \ + $(1)/etc/uci-defaults/20-mcu \ + ) \ + ) endef $(eval $(call BuildPackage,mcu)) diff --git a/feeds/mcu/mcu/files/mcu.sh b/feeds/mcu/mcu/files/mcu.sh index 4fd5b3665..2c1a1854b 100644 --- a/feeds/mcu/mcu/files/mcu.sh +++ b/feeds/mcu/mcu/files/mcu.sh @@ -513,3 +513,29 @@ mcu_fw_check_and_update() { return 0 } + +mcu_add_uci_config() { + local name="$1" + local interface="$2" + local bootloader="$3" + local firmware="$4" + local enable_pin="$5" + local uart_path="$6" + local uart_baud="$7" + local uart_flow="$8" + + uci -q set mcu.${name}="mcu" + uci -q set mcu.${name}.interface="$interface" + uci -q set mcu.${name}.bootloader="$bootloader" + uci -q set mcu.${name}.firmware="$firmware" + + [ -n "$enable_pin" ] && uci -q set mcu.${name}.enable_pin="$enable_pin" + [ -n "$uart_path" ] && uci -q set mcu.${name}.uart_path="$uart_path" + [ -n "$uart_baud" ] && uci -q set mcu.${name}.uart_baud="$uart_baud" + + [ "$uart_flow" = "1" ] && uci -q set mcu.${name}.uart_flow="1" + + uci -q set mcu.${name}.disabled="0" + + uci -q commit mcu +} From 397c6df34a2215b1439eb92e4a1cff00a2acaba0 Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Sat, 10 Dec 2022 16:08:37 +0100 Subject: [PATCH 11/31] feeds: mcu: introduce 'mcu-firmware' package The new 'mcu-firmware' package will provide binary firmware dedicated for MCU embedded on Wi-Fi boards (and also standalone, e.g. USB based), supported by the OpenWrt/OpenWiFi projects. Currently, only Zephyr RTOS based sample firmware ('BLE HCI controller' and 'hello world') files are provided, for Wi-Fi boards and one standalone development module, listed below: - CIG WF-196 (Nordic nRF52833, UART bus) - EdgeCore EAP102 (Nordic nRF52840, USB bus) - Nordic nRF52840 Dongle (Nordic nRF52840, USB bus) Different firmware types planned in future include Nordic's nRF Connect SDK, OpenThread and others. The Zephyr based firmware comes from a custom fork available in GitLab: 'https://gitlab.com/pepe2k/zephyr' (firmware in this package were built from a v3.3.0 release based branch 'zephyr-v3.3.x__mcu-on-wifi-boards'). MCU firmware from this package is compatible only with OpenWrt/OpenWiFi generic MCU support stack which, among others, assumes availability of compatible bootloader (MCUboot is currently the only one supported) and e.g. multiple firmware slots. MCUboot fork development takes part in git repository hosted in GitLab: 'https://gitlab.com/pepe2k/mcuboot/'. Signed-off-by: Piotr Dymacz --- feeds/mcu/mcu-firmware/Makefile | 123 ++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 feeds/mcu/mcu-firmware/Makefile diff --git a/feeds/mcu/mcu-firmware/Makefile b/feeds/mcu/mcu-firmware/Makefile new file mode 100644 index 000000000..480448305 --- /dev/null +++ b/feeds/mcu/mcu-firmware/Makefile @@ -0,0 +1,123 @@ +# +# Copyright (C) 2023 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=mcu-firmware +PKG_VERSION:=2023-03-05 +PKG_RELEASE:=1 + +PKG_MAINTAINER:=Piotr Dymacz + +include $(INCLUDE_DIR)/package.mk + +define Package/mcu-fw-default + CATEGORY:=Firmware + SUBMENU:=MCU firmware + SECTION:=firmware + TITLE:=MCU firmware +endef + + +# Zephyr versions +# 4 fields separated with underscore: +# version-name_git-sha_pipeline-id_sha256-of-package +ZEPHYR_VERSIONS := \ + zephyr-v3.3.x_7055d10e538e_3877473859_321a0daf6328698a913c6504d19aa85a5170dfce6039b86d31d2e9162d34af7c + +ZEPHYR_FW_CI_URL := https://gitlab.com/pepe2k/zephyr/-/jobs/ + +# Zephyr 'hello_world' targets +ZEPHYR_HELLO_WORLD_TARGETS := \ + cig_wf196_nrf52833 \ + edgecore_eap102_nrf52840 \ + nrf52840dongle_nrf52840 + +# Zephyr 'hci_uart' targets +ZEPHYR_HCI_UART_TARGETS:= \ + cig_wf196_nrf52833 \ + edgecore_eap102_nrf52840 \ + nrf52840dongle_nrf52840 + +# Zephyr 'hci_usb' targets +ZEPHYR_HCI_USB_TARGETS := \ + edgecore_eap102_nrf52840 \ + nrf52840dongle_nrf52840 + +word-underscore = $(word $2,$(subst _, ,$1)) + +define Download/zephyr-fw + URL:=$(ZEPHYR_FW_CI_URL)$(call word-underscore,$(2),3)/ + URL_FILE:=artifacts/download?file_type=archive + FILE:=$(call word-underscore,$(2),1)-$(call word-underscore,$(2),2).zip + HASH:=$(call word-underscore,$(2),4) +endef +$(foreach FW,$(ZEPHYR_VERSIONS),$(eval $(call Download,zephyr-fw,$(FW)))) + +# $(1) version (e.g zephyr-v3.3.x) +# $(2) firmware name (e.g. hci_usb) +# $(3) target/board name (e.g. nrf52840dongle_nrf52840) +define zephyr-fw + define Package/$(1)-$(2)-$(3) + $(call Package/mcu-fw-default) + DEPENDS:=+mcu + TITLE:=Zephyr '$(2)' + endef + + define Package/$(1)-$(2)-$(3)/description + Zephyr '$(1)' based firmware '$(2)' for '$(3)' board + endef + + define Package/$(1)-$(2)-$(3)/install + $(INSTALL_DIR) $$(1)/lib/firmware/mcu/$(3)/$(1)__$(2) + $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(1)/$(3)/$(1)__$(2)/*.bin \ + $$(1)/lib/firmware/mcu/$(3)/$(1)__$(2)/ + endef +endef + +define zephyr-fw-unzip + mkdir -p $(PKG_BUILD_DIR)/$(call word-underscore,$(1),1); \ + unzip -q -d $(PKG_BUILD_DIR)/$(call word-underscore,$(1),1) \ + $(DL_DIR)/$(call word-underscore,$(1),1)-$(call word-underscore,$(1),2).zip; \ + for fw in $(PKG_BUILD_DIR)/$(call word-underscore,$(1),1)/*.tar.gz; do \ + $(TAR) -C $(PKG_BUILD_DIR)/$(call word-underscore,$(1),1) --one-top-level -xzf $$$$fw; \ + rm -rf $$$$fw; \ + done; +endef + +define Build/Prepare + $(foreach FW,$(ZEPHYR_VERSIONS),$(call zephyr-fw-unzip,$(FW))) +endef + +define Build/Compile +endef + + +$(foreach VER,$(ZEPHYR_VERSIONS),\ + $(foreach TARGET,$(ZEPHYR_HELLO_WORLD_TARGETS),\ + $(eval $(call zephyr-fw,$(call word-underscore,$(VER),1),hello_world,$(TARGET))))) + +$(foreach VER,$(ZEPHYR_VERSIONS),\ + $(foreach TARGET,$(ZEPHYR_HCI_UART_TARGETS),\ + $(eval $(call zephyr-fw,$(call word-underscore,$(VER),1),hci_uart,$(TARGET))))) + +$(foreach VER,$(ZEPHYR_VERSIONS),\ + $(foreach TARGET,$(ZEPHYR_HCI_USB_TARGETS),\ + $(eval $(call zephyr-fw,$(call word-underscore,$(VER),1),hci_usb,$(TARGET))))) + + +$(foreach VER,$(ZEPHYR_VERSIONS),\ + $(foreach TARGET,$(ZEPHYR_HELLO_WORLD_TARGETS),\ + $(eval $(call BuildPackage,$(call word-underscore,$(VER),1)-hello_world-$(TARGET))))) + +$(foreach VER,$(ZEPHYR_VERSIONS),\ + $(foreach TARGET,$(ZEPHYR_HCI_UART_TARGETS),\ + $(eval $(call BuildPackage,$(call word-underscore,$(VER),1)-hci_uart-$(TARGET))))) + +$(foreach VER,$(ZEPHYR_VERSIONS),\ + $(foreach TARGET,$(ZEPHYR_HCI_USB_TARGETS),\ + $(eval $(call BuildPackage,$(call word-underscore,$(VER),1)-hci_usb-$(TARGET))))) From 5f649ea1f49ed95a5d2b5b2e805dc6928388f319 Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Fri, 17 Feb 2023 00:07:18 +0100 Subject: [PATCH 12/31] mcu-firmware: include firmware based on latest Zephyr This adds Zephyr firmware builds from custom git branch based on the latest's upstream branch name 'main': 'main__mcu-on-wifi-boards'. Signed-off-by: Piotr Dymacz --- feeds/mcu/mcu-firmware/Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/feeds/mcu/mcu-firmware/Makefile b/feeds/mcu/mcu-firmware/Makefile index 480448305..1387b720a 100644 --- a/feeds/mcu/mcu-firmware/Makefile +++ b/feeds/mcu/mcu-firmware/Makefile @@ -27,7 +27,8 @@ endef # 4 fields separated with underscore: # version-name_git-sha_pipeline-id_sha256-of-package ZEPHYR_VERSIONS := \ - zephyr-v3.3.x_7055d10e538e_3877473859_321a0daf6328698a913c6504d19aa85a5170dfce6039b86d31d2e9162d34af7c + zephyr-v3.3.x_7055d10e538e_3877473859_321a0daf6328698a913c6504d19aa85a5170dfce6039b86d31d2e9162d34af7c \ + zephyr-main_63d7f67d401d_3877472923_e44948759ad705f8a28449760ec3153f81d3620e0d3665e50490c7786dd2f8e2 ZEPHYR_FW_CI_URL := https://gitlab.com/pepe2k/zephyr/-/jobs/ From c4f0f367bc5625992d1e1b4154ed3287dce3383e Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Fri, 17 Feb 2023 00:07:18 +0100 Subject: [PATCH 13/31] profiles: edgecore_eap102: include 'mcu' feed Signed-off-by: Piotr Dymacz --- profiles/edgecore_eap102.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/profiles/edgecore_eap102.yml b/profiles/edgecore_eap102.yml index 95e3866b5..90db8cb44 100644 --- a/profiles/edgecore_eap102.yml +++ b/profiles/edgecore_eap102.yml @@ -10,5 +10,6 @@ feeds: include: - wifi-ax - ucentral-ap + - mcu diffconfig: | CONFIG_KERNEL_IPQ_MEM_PROFILE=0 From ee7bf9671ad8905e747ee09c464b847aa79c89e5 Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Fri, 17 Feb 2023 00:07:18 +0100 Subject: [PATCH 14/31] ipq807x: add Zephyr HCI USB MCU firmware to EdgeCore EAP102 Include Zephyr v3.3.x based Bluetooth LE HCI USB firmware package in default packages list for the EdgeCore EAP102. This brings initial support for the on-board nRF52840 MCU. Signed-off-by: Piotr Dymacz --- feeds/ipq807x/ipq807x/image/ipq807x.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/feeds/ipq807x/ipq807x/image/ipq807x.mk b/feeds/ipq807x/ipq807x/image/ipq807x.mk index c32074f73..622d9ec8f 100644 --- a/feeds/ipq807x/ipq807x/image/ipq807x.mk +++ b/feeds/ipq807x/ipq807x/image/ipq807x.mk @@ -53,7 +53,8 @@ define Device/edgecore_eap102 DEVICE_DTS := qcom-ipq807x-eap102 DEVICE_DTS_CONFIG=config@ac02 SUPPORTED_DEVICES := edgecore,eap102 - DEVICE_PACKAGES := ath11k-wifi-edgecore-eap102 kmod-usb2 kmod-usb3 uboot-envtools + DEVICE_PACKAGES := ath11k-wifi-edgecore-eap102 kmod-usb2 kmod-usb3 uboot-envtools \ + zephyr-v3.3.x-hci_usb-edgecore_eap102_nrf52840 endef TARGET_DEVICES += edgecore_eap102 From d59e58b7947c982fdbb1b50231fc3c0c297bd425 Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Fri, 17 Feb 2023 00:07:18 +0100 Subject: [PATCH 15/31] mcu: ipq807x: add support for EdgeCore EAP102 This includes default configuration for the on-board Nordic nRF52840 MCU in EdgeCore EAP102. A Zephyr based sample 'hci_usb' firmware is selected. Signed-off-by: Piotr Dymacz --- feeds/mcu/mcu/files/uci-defaults/ipq807x | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 feeds/mcu/mcu/files/uci-defaults/ipq807x diff --git a/feeds/mcu/mcu/files/uci-defaults/ipq807x b/feeds/mcu/mcu/files/uci-defaults/ipq807x new file mode 100644 index 000000000..3c4780d9f --- /dev/null +++ b/feeds/mcu/mcu/files/uci-defaults/ipq807x @@ -0,0 +1,18 @@ +[ -e /etc/config/mcu ] && exit 0 + +touch /etc/config/mcu + +. /lib/functions.sh +. /lib/functions/mcu.sh + +board=$(board_name) + +case "$board" in +edgecore,eap102) + mcu_add_uci_config "nrf52840_usb" "usb" "mcuboot" \ + "zephyr-v3.3.x__hci_usb" \ + "mcu-enable" + ;; +esac + +exit 0 From d8383918504f5e96e3914198d249f19c70090b09 Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Fri, 17 Feb 2023 00:07:18 +0100 Subject: [PATCH 16/31] profiles: cig_wf196: include 'mcu' feed Signed-off-by: Piotr Dymacz --- profiles/cig_wf196.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/profiles/cig_wf196.yml b/profiles/cig_wf196.yml index 82d366c97..9e3b4a98a 100644 --- a/profiles/cig_wf196.yml +++ b/profiles/cig_wf196.yml @@ -10,6 +10,7 @@ feeds: include: - wifi-ax - ucentral-ap + - mcu packages: - ath11k-fwtest - ftm From e09633fc2aa66d8caa7402810c13aca6e184f9c8 Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Fri, 17 Feb 2023 00:07:18 +0100 Subject: [PATCH 17/31] ipq807x: add Zephyr HCI UART MCU firmware to CIG WF-196 Include Zephyr v3.3.x based Bluetooth LE HCI UART firmware package in default packages list for the CIG WF-196. This brings initial support for the on-board nRF52833 MCU. Signed-off-by: Piotr Dymacz --- feeds/ipq807x/ipq807x/image/ipq807x.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/feeds/ipq807x/ipq807x/image/ipq807x.mk b/feeds/ipq807x/ipq807x/image/ipq807x.mk index 622d9ec8f..8a24deff7 100644 --- a/feeds/ipq807x/ipq807x/image/ipq807x.mk +++ b/feeds/ipq807x/ipq807x/image/ipq807x.mk @@ -44,7 +44,8 @@ define Device/cig_wf196 BLOCKSIZE := 256k PAGESIZE := 4096 DEVICE_PACKAGES := ath11k-wifi-cig-wf196 aq-fw-download uboot-envtools kmod-usb3 kmod-usb2 \ - ath11k-firmware-qcn9000 ath11k-wifi-cig-wf196_6g + ath11k-firmware-qcn9000 ath11k-wifi-cig-wf196_6g \ + zephyr-v3.3.x-hci_uart-cig_wf196_nrf52833 endef TARGET_DEVICES += cig_wf196 From 337a68cf1ddaddb2ebde0c8d07f82af8bf62d826 Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Fri, 17 Feb 2023 00:07:18 +0100 Subject: [PATCH 18/31] mcu: ipq807x: add support for CIG WF-196 This includes default configuration for the on-board Nordic nRF52833 MCU in CIG WF-196. A Zephyr based sample 'hci_uart' firmware is selected. Signed-off-by: Piotr Dymacz --- feeds/mcu/mcu/files/uci-defaults/ipq807x | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/feeds/mcu/mcu/files/uci-defaults/ipq807x b/feeds/mcu/mcu/files/uci-defaults/ipq807x index 3c4780d9f..4ca54c2be 100644 --- a/feeds/mcu/mcu/files/uci-defaults/ipq807x +++ b/feeds/mcu/mcu/files/uci-defaults/ipq807x @@ -8,6 +8,11 @@ touch /etc/config/mcu board=$(board_name) case "$board" in +cig,wf196) + mcu_add_uci_config "nrf52833_uart" "uart" "mcuboot" \ + "zephyr-v3.3.x__hci_uart" \ + "mcu-enable" "/dev/ttyMSM1" "115200" + ;; edgecore,eap102) mcu_add_uci_config "nrf52840_usb" "usb" "mcuboot" \ "zephyr-v3.3.x__hci_usb" \ From f92617f24a892b316b340a62ddb18866925715a8 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Wed, 8 Mar 2023 17:18:53 +0100 Subject: [PATCH 19/31] ipq807x: add zephyr specific profiles Signed-off-by: John Crispin --- profiles/cig_wf196-zephyr.yml | 18 ++++++++++++++++++ profiles/cig_wf196.yml | 1 - profiles/edgecore_eap102-zephyr.yml | 15 +++++++++++++++ profiles/edgecore_eap102.yml | 1 - 4 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 profiles/cig_wf196-zephyr.yml create mode 100644 profiles/edgecore_eap102-zephyr.yml diff --git a/profiles/cig_wf196-zephyr.yml b/profiles/cig_wf196-zephyr.yml new file mode 100644 index 000000000..9e3b4a98a --- /dev/null +++ b/profiles/cig_wf196-zephyr.yml @@ -0,0 +1,18 @@ +--- +profile: cig_wf196 +target: ipq807x +subtarget: ipq807x +description: Build image for the CIG WF196 +image: bin/targets/ipq807x/ipq807x/openwrt-ipq807x-cig_wf196-squashfs-sysupgrade.tar +feeds: + - name: ipq807x + path: ../../feeds/ipq807x +include: + - wifi-ax + - ucentral-ap + - mcu +packages: + - ath11k-fwtest + - ftm +diffconfig: | + CONFIG_KERNEL_IPQ_MEM_PROFILE=0 diff --git a/profiles/cig_wf196.yml b/profiles/cig_wf196.yml index 9e3b4a98a..82d366c97 100644 --- a/profiles/cig_wf196.yml +++ b/profiles/cig_wf196.yml @@ -10,7 +10,6 @@ feeds: include: - wifi-ax - ucentral-ap - - mcu packages: - ath11k-fwtest - ftm diff --git a/profiles/edgecore_eap102-zephyr.yml b/profiles/edgecore_eap102-zephyr.yml new file mode 100644 index 000000000..90db8cb44 --- /dev/null +++ b/profiles/edgecore_eap102-zephyr.yml @@ -0,0 +1,15 @@ +--- +profile: edgecore_eap102 +target: ipq807x +subtarget: ipq807x +description: Build image for the Edgecore EAP102 +image: bin/targets/ipq807x/ipq807x/openwrt-ipq807x-edgecore_eap102-squashfs-sysupgrade.tar +feeds: + - name: ipq807x + path: ../../feeds/ipq807x +include: + - wifi-ax + - ucentral-ap + - mcu +diffconfig: | + CONFIG_KERNEL_IPQ_MEM_PROFILE=0 diff --git a/profiles/edgecore_eap102.yml b/profiles/edgecore_eap102.yml index 90db8cb44..95e3866b5 100644 --- a/profiles/edgecore_eap102.yml +++ b/profiles/edgecore_eap102.yml @@ -10,6 +10,5 @@ feeds: include: - wifi-ax - ucentral-ap - - mcu diffconfig: | CONFIG_KERNEL_IPQ_MEM_PROFILE=0 From c670733ea54dfbfdf88e8e10520fb38322689051 Mon Sep 17 00:00:00 2001 From: Satya-sc Date: Tue, 7 Mar 2023 15:30:22 +0530 Subject: [PATCH 20/31] ucentral-event: added support to queue the events when there is no ucentral client is running and send those once it is available Signed-off-by: Satya-sc --- .../ucentral-event/files/ucentral-event | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/feeds/ucentral/ucentral-event/files/ucentral-event b/feeds/ucentral/ucentral-event/files/ucentral-event index 3f455a131..02d2f6357 100755 --- a/feeds/ucentral/ucentral-event/files/ucentral-event +++ b/feeds/ucentral/ucentral-event/files/ucentral-event @@ -30,6 +30,8 @@ let config; let wan_ports; let carrier = {}; let boot_file = "/tmp/booted"; +let ucentral_running = false; +let pending_events = []; function config_load() { uci.load('event'); @@ -55,10 +57,13 @@ function event(object, verb, payload) { type += '.' + verb; if (match(object, type, config.realtime?.filter)) - ubus.call('ucentral', 'event', { - type, - payload - }); + if (ucentral_running) + ubus.call('ucentral', 'event', { + type, + payload + }); + else + push(pending_events, {type, payload}); else if (!config.bulk?.interval || match(object, type, config.bulk?.filter)) ubus.call('ucentral', 'telemetry', { @@ -225,6 +230,12 @@ function log_subscriber_remove_cb(remove) { printf('dhcp remove: %.J\n', remove); } +function send_pending_events() { + for (let payload in pending_events) + ubus.call('ucentral', 'event', payload); + pending_events = []; +} + function unsub_object(add, id, path) { let object = split(path, '.'); @@ -240,6 +251,13 @@ function unsub_object(add, id, path) { printf('adding %s\n', path); log_subscriber.subscribe(path); break; + case 'ucentral': + if(add) { + ucentral_running = true; + send_pending_events(); + } else + ucentral_running = false; + break; } if (object[0] == 'hostapd' && object[1]) { if (add) From 317aaadcbde46c9133c78486cb95eadd34d60c9c Mon Sep 17 00:00:00 2001 From: John Crispin Date: Wed, 8 Mar 2023 17:35:43 +0100 Subject: [PATCH 21/31] ucentral-schema: update to latest HEAD 0f40765 turn telemetry and realtime filter into an enum Signed-off-by: John Crispin --- feeds/ucentral/ucentral-schema/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/feeds/ucentral/ucentral-schema/Makefile b/feeds/ucentral/ucentral-schema/Makefile index e96055e56..589584b7d 100644 --- a/feeds/ucentral/ucentral-schema/Makefile +++ b/feeds/ucentral/ucentral-schema/Makefile @@ -4,10 +4,10 @@ PKG_NAME:=ucentral-schema PKG_RELEASE:=1 PKG_SOURCE_URL=https://github.com/Telecominfraproject/wlan-ucentral-schema.git -PKG_MIRROR_HASH:=abea08a7c29c2ec4bc353c50134d2c2867300767010f47fe3af5d8f6a17d417a +PKG_MIRROR_HASH:=03d87a4fb125483dc08f2827e79a04b93968d4fd0a38da2e144b6fd96a610b84 PKG_SOURCE_PROTO:=git PKG_SOURCE_DATE:=2022-05-29 -PKG_SOURCE_VERSION:=5517c1c7e0ac7c0bfb143705a85cabd7c29d1818 +PKG_SOURCE_VERSION:=0f40765f2cfb3d0ea94d346915d23ea8d8ba1682 PKG_MAINTAINER:=John Crispin PKG_LICENSE:=BSD-3-Clause From 26192989cde4342f86d11972bd0a096b101711a5 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Thu, 9 Mar 2023 08:47:13 +0100 Subject: [PATCH 22/31] ipq807x: add CIG WF196 BDF split the image into 2 SKUs for CA/US. Fixes: WIFI-12357 Signed-off-by: John Crispin --- .github/workflows/build-dev.yml | 2 +- feeds/ipq807x/ipq807x/image/ipq807x.mk | 23 +++++++++++--- .../files/etc/board.d/04-regdm | 6 ++-- feeds/wifi-ax/ath11k-wifi/Makefile | 29 +++++++++++++----- .../board-cig-wf196-ca.bin.IPQ8074 | Bin 0 -> 131072 bytes ...IPQ8074 => board-cig-wf196-us.bin.IPQ8074} | Bin ...9074 => board-cig-wf196_6g-ca.bin.QCN9074} | Bin .../board-cig-wf196_6g-us.bin.QCN9074 | Bin 0 -> 131072 bytes profiles/{cig_wf196.yml => cig_wf196-ca.yml} | 6 ++-- profiles/cig_wf196-us.yml | 17 ++++++++++ 10 files changed, 65 insertions(+), 18 deletions(-) create mode 100644 feeds/wifi-ax/ath11k-wifi/board-cig-wf196-ca.bin.IPQ8074 rename feeds/wifi-ax/ath11k-wifi/{board-cig-wf196.bin.IPQ8074 => board-cig-wf196-us.bin.IPQ8074} (100%) rename feeds/wifi-ax/ath11k-wifi/{board-cig-wf196_6g.bin.QCN9074 => board-cig-wf196_6g-ca.bin.QCN9074} (100%) create mode 100644 feeds/wifi-ax/ath11k-wifi/board-cig-wf196_6g-us.bin.QCN9074 rename profiles/{cig_wf196.yml => cig_wf196-ca.yml} (57%) create mode 100644 profiles/cig_wf196-us.yml diff --git a/.github/workflows/build-dev.yml b/.github/workflows/build-dev.yml index 61c9a4d69..94958bb4d 100644 --- a/.github/workflows/build-dev.yml +++ b/.github/workflows/build-dev.yml @@ -21,7 +21,7 @@ jobs: strategy: fail-fast: false matrix: - target: ['actiontec_web7200', 'cig_wf188n', 'cig_wf194c4', 'cig_wf196', '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_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 diff --git a/feeds/ipq807x/ipq807x/image/ipq807x.mk b/feeds/ipq807x/ipq807x/image/ipq807x.mk index 8a24deff7..cea62856b 100644 --- a/feeds/ipq807x/ipq807x/image/ipq807x.mk +++ b/feeds/ipq807x/ipq807x/image/ipq807x.mk @@ -36,18 +36,31 @@ define Device/cig_wf194c4 endef TARGET_DEVICES += cig_wf194c4 -define Device/cig_wf196 - DEVICE_TITLE := CIG WF196 +define Device/cig_wf196_us + DEVICE_TITLE := CIG WF196 (US) DEVICE_DTS := qcom-ipq807x-wf196 DEVICE_DTS_CONFIG=config@hk14 SUPPORTED_DEVICES := cig,wf196 BLOCKSIZE := 256k PAGESIZE := 4096 - DEVICE_PACKAGES := ath11k-wifi-cig-wf196 aq-fw-download uboot-envtools kmod-usb3 kmod-usb2 \ - ath11k-firmware-qcn9000 ath11k-wifi-cig-wf196_6g \ + DEVICE_PACKAGES := ath11k-wifi-cig-wf196-us aq-fw-download uboot-envtools kmod-usb3 kmod-usb2 \ + ath11k-firmware-qcn9000 ath11k-wifi-cig-wf196_6g-us \ zephyr-v3.3.x-hci_uart-cig_wf196_nrf52833 endef -TARGET_DEVICES += cig_wf196 +TARGET_DEVICES += cig_wf196_us + +define Device/cig_wf196_ca + DEVICE_TITLE := CIG WF196 (CA) + DEVICE_DTS := qcom-ipq807x-wf196 + DEVICE_DTS_CONFIG=config@hk14 + SUPPORTED_DEVICES := cig,wf196 + BLOCKSIZE := 256k + PAGESIZE := 4096 + DEVICE_PACKAGES := ath11k-wifi-cig-wf196-ca aq-fw-download uboot-envtools kmod-usb3 kmod-usb2 \ + ath11k-firmware-qcn9000 ath11k-wifi-cig-wf196_6g-ca \ + zephyr-v3.3.x-hci_uart-cig_wf196_nrf52833 +endef +TARGET_DEVICES += cig_wf196_ca define Device/edgecore_eap102 DEVICE_TITLE := Edgecore EAP102 diff --git a/feeds/ucentral/ucentral-schema/files/etc/board.d/04-regdm b/feeds/ucentral/ucentral-schema/files/etc/board.d/04-regdm index 170a79a57..0af77d20d 100755 --- a/feeds/ucentral/ucentral-schema/files/etc/board.d/04-regdm +++ b/feeds/ucentral/ucentral-schema/files/etc/board.d/04-regdm @@ -12,10 +12,12 @@ cig,wf194c4|\ cig,wf194c|\ cig,wf610d|\ cig,wf808|\ -cig,wf660a|\ -cig,wf196) +cig,wf660a) ucidef_set_wifi_country 'US' ;; +cig,wf196) + ucidef_set_wifi_country "$(cat /lib/firmware/country)" + ;; esac board_config_flush diff --git a/feeds/wifi-ax/ath11k-wifi/Makefile b/feeds/wifi-ax/ath11k-wifi/Makefile index 1d082cfe5..65f73cdf4 100644 --- a/feeds/wifi-ax/ath11k-wifi/Makefile +++ b/feeds/wifi-ax/ath11k-wifi/Makefile @@ -29,7 +29,8 @@ ALLWIFIBOARDS:= \ cig-wf660a \ cig-wf194c \ cig-wf194c4 \ - cig-wf196 \ + cig-wf196-ca \ + cig-wf196-us \ cybertan-eww622-a1 \ edgecore-eap101 \ gl-ax1800 \ @@ -86,9 +87,14 @@ $(call Package/ath11k-wifi-default) TITLE:=board-2.bin for QCOM IPQ6122 eval kits endef -define Package/ath11k-wifi-cig-wf196_6g +define Package/ath11k-wifi-cig-wf196_6g-ca $(call Package/ath11k-wifi-default) - TITLE:=cig-wf196 6G bdf + TITLE:=cig-wf196 6G bdf CA +endef + +define Package/ath11k-wifi-cig-wf196_6g-us +$(call Package/ath11k-wifi-default) + TITLE:=cig-wf196 6G bdf US endef define Package/ath11k-wifi-gl-ax1800 @@ -198,9 +204,16 @@ define Package/ath11k-wifi-qcom-qcn9000/install $(INSTALL_DATA) ./board-2.bin.QCN9000 $(1)/lib/firmware/ath11k/QCN9074/hw1.0/board-2.bin endef -define Package/ath11k-wifi-cig-wf196_6g/install +define Package/ath11k-wifi-cig-wf196_6g-ca/install $(INSTALL_DIR) $(1)/lib/firmware/ath11k/QCN9074/hw1.0/ - $(INSTALL_DATA) ./board-cig-wf196_6g.bin.QCN9074 $(1)/lib/firmware/ath11k/QCN9074/hw1.0/board.bin + $(INSTALL_DATA) ./board-cig-wf196_6g-ca.bin.QCN9074 $(1)/lib/firmware/ath11k/QCN9074/hw1.0/board.bin + echo -n 'CA' > $(1)/lib/firmware/country +endef + +define Package/ath11k-wifi-cig-wf196_6g-us/install + $(INSTALL_DIR) $(1)/lib/firmware/ath11k/QCN9074/hw1.0/ + $(INSTALL_DATA) ./board-cig-wf196_6g-us.bin.QCN9074 $(1)/lib/firmware/ath11k/QCN9074/hw1.0/board.bin + echo -n 'US' > $(1)/lib/firmware/country endef define Package/ath11k-wifi-gl-ax1800/install @@ -240,7 +253,8 @@ $(eval $(call generate-ath11k-wifi-package,cig-wf188n,Cigtech WF188n)) $(eval $(call generate-ath11k-wifi-package,cig-wf660a,Cigtech WF660a)) $(eval $(call generate-ath11k-wifi-package,cig-wf194c,Cigtech WF194c)) $(eval $(call generate-ath11k-wifi-package,cig-wf194c4,Cigtech WF194c4)) -$(eval $(call generate-ath11k-wifi-package,cig-wf196,Cigtech WF196)) +$(eval $(call generate-ath11k-wifi-package,cig-wf196-ca,Cigtech WF196 CA)) +$(eval $(call generate-ath11k-wifi-package,cig-wf196-us,Cigtech WF196 US)) $(eval $(call generate-ath11k-wifi-package,cybertan-eww622-a1,CyberTan EWW622 A1)) $(eval $(call generate-ath11k-wifi-package,sercomm-wallaby,Sercomm Kiwi)) $(eval $(call generate-ath11k-wifi-package,wallys-dr6018,Wallys DR6018)) @@ -265,6 +279,7 @@ $(eval $(call BuildPackage,ath11k-wifi-qcom-ipq6122)) $(eval $(call BuildPackage,ath11k-wifi-qcom-ipq8074)) $(eval $(call BuildPackage,ath11k-wifi-qcom-ipq6018)) $(eval $(call BuildPackage,ath11k-wifi-qcom-qcn9000)) -$(eval $(call BuildPackage,ath11k-wifi-cig-wf196_6g)) +$(eval $(call BuildPackage,ath11k-wifi-cig-wf196_6g-ca)) +$(eval $(call BuildPackage,ath11k-wifi-cig-wf196_6g-us)) $(eval $(call BuildPackage,ath11k-wifi-motorola-q14)) $(eval $(call BuildPackage,ath11k-wifi-hfcl-ion4xi)) diff --git a/feeds/wifi-ax/ath11k-wifi/board-cig-wf196-ca.bin.IPQ8074 b/feeds/wifi-ax/ath11k-wifi/board-cig-wf196-ca.bin.IPQ8074 new file mode 100644 index 0000000000000000000000000000000000000000..177a5e15b43a812f97d23a0e9fa212bd4985fb45 GIT binary patch literal 131072 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 literal 0 HcmV?d00001 diff --git a/profiles/cig_wf196.yml b/profiles/cig_wf196-ca.yml similarity index 57% rename from profiles/cig_wf196.yml rename to profiles/cig_wf196-ca.yml index 82d366c97..2114ac5d2 100644 --- a/profiles/cig_wf196.yml +++ b/profiles/cig_wf196-ca.yml @@ -1,9 +1,9 @@ --- -profile: cig_wf196 +profile: cig_wf196_ca target: ipq807x subtarget: ipq807x -description: Build image for the CIG WF196 -image: bin/targets/ipq807x/ipq807x/openwrt-ipq807x-cig_wf196-squashfs-sysupgrade.tar +description: Build image for the CIG WF196 (CA) +image: bin/targets/ipq807x/ipq807x/openwrt-ipq807x-cig_wf196_ca-squashfs-sysupgrade.tar feeds: - name: ipq807x path: ../../feeds/ipq807x diff --git a/profiles/cig_wf196-us.yml b/profiles/cig_wf196-us.yml new file mode 100644 index 000000000..dfc6fd8da --- /dev/null +++ b/profiles/cig_wf196-us.yml @@ -0,0 +1,17 @@ +--- +profile: cig_wf196_us +target: ipq807x +subtarget: ipq807x +description: Build image for the CIG WF196 (US) +image: bin/targets/ipq807x/ipq807x/openwrt-ipq807x-cig_wf196_us-squashfs-sysupgrade.tar +feeds: + - name: ipq807x + path: ../../feeds/ipq807x +include: + - wifi-ax + - ucentral-ap +packages: + - ath11k-fwtest + - ftm +diffconfig: | + CONFIG_KERNEL_IPQ_MEM_PROFILE=0 From 7c535de60d811694a014a6e4d100009371ee544e Mon Sep 17 00:00:00 2001 From: John Crispin Date: Thu, 9 Mar 2023 16:40:58 +0100 Subject: [PATCH 23/31] ucentral-schema: update to latest HEAD 204341f state: add port_id and port_desc to lldp state Fixes: WIFI-11975 Signed-off-by: John Crispin --- feeds/ucentral/ucentral-schema/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/feeds/ucentral/ucentral-schema/Makefile b/feeds/ucentral/ucentral-schema/Makefile index 589584b7d..670c3e2f1 100644 --- a/feeds/ucentral/ucentral-schema/Makefile +++ b/feeds/ucentral/ucentral-schema/Makefile @@ -4,10 +4,10 @@ PKG_NAME:=ucentral-schema PKG_RELEASE:=1 PKG_SOURCE_URL=https://github.com/Telecominfraproject/wlan-ucentral-schema.git -PKG_MIRROR_HASH:=03d87a4fb125483dc08f2827e79a04b93968d4fd0a38da2e144b6fd96a610b84 +PKG_MIRROR_HASH:=ec55df0923cc4c22c4b190de56033268dce009031b4352207bb7c26d5d4e2958 PKG_SOURCE_PROTO:=git PKG_SOURCE_DATE:=2022-05-29 -PKG_SOURCE_VERSION:=0f40765f2cfb3d0ea94d346915d23ea8d8ba1682 +PKG_SOURCE_VERSION:=204341fafb852aa9cbb951abedc8c7ad698aed5b PKG_MAINTAINER:=John Crispin PKG_LICENSE:=BSD-3-Clause From dc0dae62840dd0090c1aae82e07588dff4c2b89e Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Wed, 8 Mar 2023 02:30:49 +0100 Subject: [PATCH 24/31] mcu: select host dependencies based on MCU firmware type In case of some types of MCU firmware, additional tools, daemons, kernel drivers, etc. are required on the host side. For example, for Bluetooth HCI controller, at least kernel module and BlueZ should be included. This adds a simple recipe which generates dependencies list per firmware type/name and for existing 'hci_usb' and 'hci_uart', selects 3 packages: 'bluez-daemon', 'kmod-bluetooth' and 'kmod-crypto-user'. Kernel crypto interface in user space has to be also included because the BlueZ isn't able to create static address for LE-only controller without it, which results in no registration of new BT interface: bluetoothd[668]: src/adapter.c:get_static_addr() Failed to open crypto bluetoothd[668]: No Bluetooth address for index 0 Signed-off-by: Piotr Dymacz --- feeds/mcu/mcu-firmware/Makefile | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/feeds/mcu/mcu-firmware/Makefile b/feeds/mcu/mcu-firmware/Makefile index 1387b720a..d49f464d0 100644 --- a/feeds/mcu/mcu-firmware/Makefile +++ b/feeds/mcu/mcu-firmware/Makefile @@ -65,7 +65,7 @@ $(foreach FW,$(ZEPHYR_VERSIONS),$(eval $(call Download,zephyr-fw,$(FW)))) define zephyr-fw define Package/$(1)-$(2)-$(3) $(call Package/mcu-fw-default) - DEPENDS:=+mcu + DEPENDS:=+mcu $(call zephyr-fw-deps,$(2)) TITLE:=Zephyr '$(2)' endef @@ -80,6 +80,10 @@ define zephyr-fw endef endef +define zephyr-fw-deps + $(if $(findstring hci_u,$1),+bluez-daemon +kmod-bluetooth +kmod-crypto-user) +endef + define zephyr-fw-unzip mkdir -p $(PKG_BUILD_DIR)/$(call word-underscore,$(1),1); \ unzip -q -d $(PKG_BUILD_DIR)/$(call word-underscore,$(1),1) \ From e193250291f61a34ffa51b78131a2a6636527c86 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Mon, 13 Mar 2023 07:49:54 +0100 Subject: [PATCH 25/31] ucentral-schema: update to latest HEAD 5e08879 add additional event types Signed-off-by: John Crispin --- feeds/ucentral/ucentral-schema/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/feeds/ucentral/ucentral-schema/Makefile b/feeds/ucentral/ucentral-schema/Makefile index 670c3e2f1..b3094023e 100644 --- a/feeds/ucentral/ucentral-schema/Makefile +++ b/feeds/ucentral/ucentral-schema/Makefile @@ -4,10 +4,10 @@ PKG_NAME:=ucentral-schema PKG_RELEASE:=1 PKG_SOURCE_URL=https://github.com/Telecominfraproject/wlan-ucentral-schema.git -PKG_MIRROR_HASH:=ec55df0923cc4c22c4b190de56033268dce009031b4352207bb7c26d5d4e2958 +PKG_MIRROR_HASH:=0cbdc5cb079a2878537466a653c496f25b88615926c3dd743ae33b56342146b5 PKG_SOURCE_PROTO:=git PKG_SOURCE_DATE:=2022-05-29 -PKG_SOURCE_VERSION:=204341fafb852aa9cbb951abedc8c7ad698aed5b +PKG_SOURCE_VERSION:=5e08879e4613280b43e6e98f344725bd5f6dc883 PKG_MAINTAINER:=John Crispin PKG_LICENSE:=BSD-3-Clause From 81b66ad44b74156e4d6a0cee0c15aa9881547986 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Mon, 13 Mar 2023 11:55:28 +0100 Subject: [PATCH 26/31] dnsmasq: fix handling of option 38 Fixes: WIFI-12260 Signed-off-by: John Crispin --- patches/base/0055-support-dhcp-option138.patch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patches/base/0055-support-dhcp-option138.patch b/patches/base/0055-support-dhcp-option138.patch index c306053c2..1fe98ddd1 100644 --- a/patches/base/0055-support-dhcp-option138.patch +++ b/patches/base/0055-support-dhcp-option138.patch @@ -31,7 +31,7 @@ index 6fcf139beb..d7c1324184 100755 + mkdir -p ${WORKING_PATH} + fi + for ip in ${capwap}; do -+ echo ${ip} >> ${DHCP_OPT_FILE_TMP} ++ echo -n ${ip} >> ${DHCP_OPT_FILE_TMP} + done + if ! cmp -s "${DHCP_OPT_FILE}" "${DHCP_OPT_FILE_TMP}"; then + mv ${DHCP_OPT_FILE_TMP} ${DHCP_OPT_FILE} From ae7506793889c8ad86814ab4cd0574bab883f036 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Mon, 13 Mar 2023 15:03:24 +0100 Subject: [PATCH 27/31] ucentral-schema: default to 32 STA max assoc if the driver does not report a valid value Fixes: WIFI-12355 Signed-off-by: John Crispin --- .../ucentral-schema/files/usr/share/ucentral/wifi_max_user.uc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feeds/ucentral/ucentral-schema/files/usr/share/ucentral/wifi_max_user.uc b/feeds/ucentral/ucentral-schema/files/usr/share/ucentral/wifi_max_user.uc index b7190a63c..e82f2fd1c 100755 --- a/feeds/ucentral/ucentral-schema/files/usr/share/ucentral/wifi_max_user.uc +++ b/feeds/ucentral/ucentral-schema/files/usr/share/ucentral/wifi_max_user.uc @@ -13,4 +13,4 @@ function phy_get() { } let phys = phy_get(); -printf("%d\n", phys[0].max_ap_assoc); +printf("%d\n", phys[0].max_ap_assoc || 32); From 792e3a8a2ee63d11b145ae35280514d6f7632458 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Tue, 14 Mar 2023 14:41:08 +0100 Subject: [PATCH 28/31] rtty: throttle the amount of data being pushed to the server The socket died when too much data was sent too fast Fixes: WIFI-12334 Signed-off-by: John Crispin --- .../ucentral/rtty/patches/300-throttle.patch | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 feeds/ucentral/rtty/patches/300-throttle.patch diff --git a/feeds/ucentral/rtty/patches/300-throttle.patch b/feeds/ucentral/rtty/patches/300-throttle.patch new file mode 100644 index 000000000..f7cab9780 --- /dev/null +++ b/feeds/ucentral/rtty/patches/300-throttle.patch @@ -0,0 +1,31 @@ +Index: rtty-7.1.4/src/rtty.c +=================================================================== +--- rtty-7.1.4.orig/src/rtty.c ++++ rtty-7.1.4/src/rtty.c +@@ -36,6 +36,8 @@ + #include "utils.h" + #include "command.h" + ++#include ++ + extern int force_exit; + extern int connected; + +@@ -84,7 +86,7 @@ static void pty_on_read(struct ev_loop * + struct tty *tty = container_of(w, struct tty, ior); + struct rtty *rtty = tty->rtty; + struct buffer *wb = &rtty->wb; +- static uint8_t buf[4096]; ++ static uint8_t buf[32* 1024]; + int len; + + while (1) { +@@ -394,6 +396,8 @@ static void on_net_write(struct ev_loop + + if (buffer_length(&rtty->wb) < 1) + ev_io_stop(loop, w); ++ ++ poll(NULL, 0, 100); + } + + static void on_net_connected(int sock, void *arg) From c952b34858291e0380928522c00d4b4e9d25e67b Mon Sep 17 00:00:00 2001 From: John Crispin Date: Tue, 14 Mar 2023 14:52:23 +0100 Subject: [PATCH 29/31] ucentral-schema: update to latest HEAD 54453a6 cmd_script: custom scripts with no uri failed to send the stdout to the server Fixes: WIFI-12358 Signed-off-by: John Crispin --- feeds/ucentral/ucentral-schema/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/feeds/ucentral/ucentral-schema/Makefile b/feeds/ucentral/ucentral-schema/Makefile index b3094023e..ae1e6d24b 100644 --- a/feeds/ucentral/ucentral-schema/Makefile +++ b/feeds/ucentral/ucentral-schema/Makefile @@ -4,10 +4,10 @@ PKG_NAME:=ucentral-schema PKG_RELEASE:=1 PKG_SOURCE_URL=https://github.com/Telecominfraproject/wlan-ucentral-schema.git -PKG_MIRROR_HASH:=0cbdc5cb079a2878537466a653c496f25b88615926c3dd743ae33b56342146b5 +PKG_MIRROR_HASH:=62d2b659d16dbdb467215da655259fcb6b239a635f43ee1e87c4d3a3db281d45 PKG_SOURCE_PROTO:=git PKG_SOURCE_DATE:=2022-05-29 -PKG_SOURCE_VERSION:=5e08879e4613280b43e6e98f344725bd5f6dc883 +PKG_SOURCE_VERSION:=54453a6345519ead8edbf75475fd802a8af7a245 PKG_MAINTAINER:=John Crispin PKG_LICENSE:=BSD-3-Clause From 8111566f35c33de51f41eece000ef4daf4916313 Mon Sep 17 00:00:00 2001 From: Piotr Dymacz Date: Wed, 22 Feb 2023 08:31:55 +0100 Subject: [PATCH 30/31] feeds: ucentral: include BlueZ 5.66 Copy 'bluez' package from OpenWrt's packages master branch to 'ucentral' feed so that we can use latest version and add custom, local changes. Keep this within 'ucentral' feeds directory to override version provided by community based 'packages' feed from OpenWrt 21.02. Signed-off-by: Piotr Dymacz --- feeds/ucentral/bluez/Makefile | 169 ++++++++++++++++++ feeds/ucentral/bluez/files/bluetoothd.init | 14 ++ feeds/ucentral/bluez/files/givepin | 14 ++ ...01-bcm43xx-Add-bcm43xx-3wire-variant.patch | 21 +++ ...-speed-must-be-reset-after-the-firmw.patch | 33 ++++ ...ncrease-firmware-load-timeout-to-30s.patch | 20 +++ ...-the-43xx-firmware-into-lib-firmware.patch | 20 +++ .../ucentral/bluez/patches/201-readline.patch | 75 ++++++++ .../bluez/patches/202-fix-endianness.patch | 10 ++ .../patches/203-obexd_without_systemd.patch | 49 +++++ ...fresh_adv_manager_for_non-LE_devices.patch | 47 +++++ feeds/ucentral/bluez/patches/206-sync.patch | 27 +++ .../patches/210-util-define-MAX_INPUT.patch | 12 ++ profiles/mcu.yml | 1 + 14 files changed, 512 insertions(+) create mode 100644 feeds/ucentral/bluez/Makefile create mode 100644 feeds/ucentral/bluez/files/bluetoothd.init create mode 100644 feeds/ucentral/bluez/files/givepin create mode 100644 feeds/ucentral/bluez/patches/001-bcm43xx-Add-bcm43xx-3wire-variant.patch create mode 100644 feeds/ucentral/bluez/patches/002-bcm43xx-The-UART-speed-must-be-reset-after-the-firmw.patch create mode 100644 feeds/ucentral/bluez/patches/003-Increase-firmware-load-timeout-to-30s.patch create mode 100644 feeds/ucentral/bluez/patches/004-Move-the-43xx-firmware-into-lib-firmware.patch create mode 100644 feeds/ucentral/bluez/patches/201-readline.patch create mode 100644 feeds/ucentral/bluez/patches/202-fix-endianness.patch create mode 100644 feeds/ucentral/bluez/patches/203-obexd_without_systemd.patch create mode 100644 feeds/ucentral/bluez/patches/205-refresh_adv_manager_for_non-LE_devices.patch create mode 100644 feeds/ucentral/bluez/patches/206-sync.patch create mode 100644 feeds/ucentral/bluez/patches/210-util-define-MAX_INPUT.patch diff --git a/feeds/ucentral/bluez/Makefile b/feeds/ucentral/bluez/Makefile new file mode 100644 index 000000000..c585593cc --- /dev/null +++ b/feeds/ucentral/bluez/Makefile @@ -0,0 +1,169 @@ +# +# Copyright (C) 2006-2016 OpenWrt.org +# +# This is free software, licensed under the GNU General Public License v2. +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=bluez +PKG_VERSION:=5.66 +PKG_RELEASE:=1 + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz +PKG_SOURCE_URL:=@KERNEL/linux/bluetooth/ +PKG_HASH:=39fea64b590c9492984a0c27a89fc203e1cdc74866086efb8f4698677ab2b574 + +PKG_LICENSE:=GPL-2.0-or-later +PKG_LICENSE_FILES:=COPYING +PKG_MAINTAINER:= +PKG_CPE_ID:=cpe:/a:bluez:bluez + +PKG_BUILD_PARALLEL:=1 +PKG_INSTALL:=1 + +include $(INCLUDE_DIR)/package.mk +include $(INCLUDE_DIR)/nls.mk + +define Package/bluez/Default + TITLE:=Bluetooth + URL:=http://www.bluez.org/ +endef + +define Package/bluez-libs +$(call Package/bluez/Default) + SECTION:=libs + CATEGORY:=Libraries + TITLE+= library + DEPENDS:=+libpthread +USB_SUPPORT:kmod-bluetooth +endef + +define Package/bluez-utils +$(call Package/bluez/Default) + SECTION:=utils + CATEGORY:=Utilities + TITLE+= utilities + DEPENDS:=+bluez-libs +endef + +define Package/bluez-utils-btmon +$(call Package/bluez/Default) + SECTION:=utils + CATEGORY:=Utilities + TITLE+= utilities + DEPENDS:=+bluez-libs +glib2 +endef + +define Package/bluez-utils-extra +$(call Package/bluez/Default) + SECTION:=utils + CATEGORY:=Utilities + TITLE+= additional utilities + DEPENDS:=+bluez-libs +libpthread +librt +glib2 +libncurses +libreadline $(INTL_DEPENDS) $(ICONV_DEPENDS) +dbus +endef + +define Package/bluez-daemon +$(call Package/bluez/Default) + SECTION:=utils + CATEGORY:=Utilities + TITLE+= daemon + DEPENDS:=+bluez-libs +bluez-utils +bluez-utils-extra +glib2 +libncurses +libreadline +dbus +libical $(INTL_DEPENDS) $(ICONV_DEPENDS) +endef + +define Package/bluez-daemon/conffiles +/etc/bluetooth/main.conf +/etc/bluetooth/network.conf +/etc/bluetooth/input.conf +/etc/bluetooth/keys +/etc/config/bluetooth +endef + +TARGET_CFLAGS += -D_GNU_SOURCE -ffunction-sections -fdata-sections +TARGET_LDFLAGS += -Wl,--gc-sections + +CONFIGURE_ARGS += \ + --enable-static \ + --enable-shared \ + --enable-client \ + --enable-datafiles \ + --enable-experimental \ + --enable-library \ + --enable-monitor \ + --enable-obex \ + --enable-threads \ + --enable-tools \ + --disable-android \ + --disable-cups \ + --disable-manpages \ + --disable-sixaxis \ + --disable-systemd \ + --disable-test \ + --disable-udev \ + --enable-deprecated + +define Build/InstallDev + $(INSTALL_DIR) $(1)/usr/include + $(CP) $(PKG_INSTALL_DIR)/usr/include/bluetooth $(1)/usr/include/ + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libbluetooth.{a,so*} $(1)/usr/lib/ + $(INSTALL_DIR) $(1)/usr/lib/pkgconfig + $(CP) $(PKG_INSTALL_DIR)/usr/lib/pkgconfig/bluez.pc $(1)/usr/lib/pkgconfig/ +endef + +define Package/bluez-libs/install + $(INSTALL_DIR) $(1)/usr/lib + $(CP) $(PKG_INSTALL_DIR)/usr/lib/libbluetooth.so.* $(1)/usr/lib/ +endef + +define Package/bluez-utils/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/tools/bdaddr $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/bluemoon $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/btattach $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/ciptool $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/hciattach $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/hciconfig $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/hcidump $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/hcitool $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/hex2hcd $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/l2ping $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/l2test $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/rctest $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/rfcomm $(1)/usr/bin/ +endef + +define Package/bluez-utils-btmon/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/btmon $(1)/usr/bin/ +endef + +define Package/bluez-utils-extra/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/tools/btmgmt $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/mpris-proxy $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/sdptool $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_BUILD_DIR)/attrib/gatttool $(1)/usr/bin/ +endef + +define Package/bluez-daemon/install + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/bluetooth/bluetoothd $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/bluetoothctl $(1)/usr/bin/ + $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/lib/bluetooth/obexd $(1)/usr/bin/ + $(INSTALL_DIR) $(1)/etc/dbus-1/system.d/ + $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/bluetooth.conf $(1)/etc/dbus-1/system.d/bluetooth.conf + $(INSTALL_DIR) $(1)/etc/bluetooth + $(INSTALL_DIR) $(1)/etc/bluetooth/keys + $(INSTALL_DATA) $(PKG_BUILD_DIR)/src/main.conf $(1)/etc/bluetooth/main.conf + $(INSTALL_DATA) $(PKG_BUILD_DIR)/profiles/network/network.conf $(1)/etc/bluetooth/network.conf + $(INSTALL_DATA) $(PKG_BUILD_DIR)/profiles/input/input.conf $(1)/etc/bluetooth/input.conf + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./files/bluetoothd.init $(1)/etc/init.d/bluetoothd +endef + +$(eval $(call BuildPackage,bluez-libs)) +$(eval $(call BuildPackage,bluez-utils)) +$(eval $(call BuildPackage,bluez-utils-btmon)) +$(eval $(call BuildPackage,bluez-utils-extra)) +$(eval $(call BuildPackage,bluez-daemon)) diff --git a/feeds/ucentral/bluez/files/bluetoothd.init b/feeds/ucentral/bluez/files/bluetoothd.init new file mode 100644 index 000000000..8c548bcdb --- /dev/null +++ b/feeds/ucentral/bluez/files/bluetoothd.init @@ -0,0 +1,14 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2007 OpenWrt.org + +#start after dbus (60) +START=62 +USE_PROCD=1 +PROG=/usr/bin/bluetoothd + +start_service() { + ln -snf /etc/bluetooth/keys/ /var/lib/bluetooth + procd_open_instance + procd_set_param command "$PROG" -n + procd_close_instance +} diff --git a/feeds/ucentral/bluez/files/givepin b/feeds/ucentral/bluez/files/givepin new file mode 100644 index 000000000..e52a3384a --- /dev/null +++ b/feeds/ucentral/bluez/files/givepin @@ -0,0 +1,14 @@ +#!/bin/sh + +# Write bluetooth PIN number here: +pin= + +if [ -z "$pin" ]; then + msg="Set bluetooth PIN in file $0" + logger -p user.err "$msg" + for i in /dev/pts/* ; do + [ -w $i ] && echo "$msg" > $i + done +else + echo "PIN:$pin" +fi diff --git a/feeds/ucentral/bluez/patches/001-bcm43xx-Add-bcm43xx-3wire-variant.patch b/feeds/ucentral/bluez/patches/001-bcm43xx-Add-bcm43xx-3wire-variant.patch new file mode 100644 index 000000000..9465ddc70 --- /dev/null +++ b/feeds/ucentral/bluez/patches/001-bcm43xx-Add-bcm43xx-3wire-variant.patch @@ -0,0 +1,21 @@ +From b4f2b77472aeb967d3a7595e8a965785c7a37c87 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Tue, 16 Feb 2016 16:40:46 +0000 +Subject: [PATCH 1/4] bcm43xx: Add bcm43xx-3wire variant + +--- + tools/hciattach.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/tools/hciattach.c ++++ b/tools/hciattach.c +@@ -1078,6 +1078,9 @@ struct uart_t uart[] = { + { "bcm43xx", 0x0000, 0x0000, HCI_UART_H4, 115200, 3000000, + FLOW_CTL, DISABLE_PM, NULL, bcm43xx, NULL }, + ++ { "bcm43xx-3wire", 0x0000, 0x0000, HCI_UART_3WIRE, 115200, 3000000, ++ 0, DISABLE_PM, NULL, bcm43xx, NULL }, ++ + { "ath3k", 0x0000, 0x0000, HCI_UART_ATH3K, 115200, 115200, + FLOW_CTL, DISABLE_PM, NULL, ath3k_ps, ath3k_pm }, + diff --git a/feeds/ucentral/bluez/patches/002-bcm43xx-The-UART-speed-must-be-reset-after-the-firmw.patch b/feeds/ucentral/bluez/patches/002-bcm43xx-The-UART-speed-must-be-reset-after-the-firmw.patch new file mode 100644 index 000000000..a2035304a --- /dev/null +++ b/feeds/ucentral/bluez/patches/002-bcm43xx-The-UART-speed-must-be-reset-after-the-firmw.patch @@ -0,0 +1,33 @@ +From e145c9621f976063e5c573db1f2053d906f63427 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Tue, 16 Feb 2016 16:39:09 +0000 +Subject: [PATCH 2/4] bcm43xx: The UART speed must be reset after the firmware + download + +--- + tools/hciattach_bcm43xx.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +--- a/tools/hciattach_bcm43xx.c ++++ b/tools/hciattach_bcm43xx.c +@@ -350,11 +350,8 @@ int bcm43xx_init(int fd, int def_speed, + return -1; + + if (bcm43xx_locate_patch(FIRMWARE_DIR, chip_name, fw_path)) { +- fprintf(stderr, "Patch not found, continue anyway\n"); ++ fprintf(stderr, "Patch not found for %s, continue anyway\n", chip_name); + } else { +- if (bcm43xx_set_speed(fd, ti, speed)) +- return -1; +- + if (bcm43xx_load_firmware(fd, fw_path)) + return -1; + +@@ -364,6 +361,7 @@ int bcm43xx_init(int fd, int def_speed, + return -1; + } + ++ sleep(1); + if (bcm43xx_reset(fd)) + return -1; + } diff --git a/feeds/ucentral/bluez/patches/003-Increase-firmware-load-timeout-to-30s.patch b/feeds/ucentral/bluez/patches/003-Increase-firmware-load-timeout-to-30s.patch new file mode 100644 index 000000000..ec13dd7f2 --- /dev/null +++ b/feeds/ucentral/bluez/patches/003-Increase-firmware-load-timeout-to-30s.patch @@ -0,0 +1,20 @@ +From d41dc2046dd08d8c95197f677e224506f5b39bdd Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Wed, 20 Jan 2016 16:00:37 +0000 +Subject: [PATCH 3/4] Increase firmware load timeout to 30s + +--- + tools/hciattach.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/tools/hciattach.c ++++ b/tools/hciattach.c +@@ -1227,7 +1227,7 @@ int main(int argc, char *argv[]) + { + struct uart_t *u = NULL; + int detach, printpid, raw, opt, i, n, ld, err; +- int to = 10; ++ int to = 30; + int init_speed = 0; + int send_break = 0; + pid_t pid; diff --git a/feeds/ucentral/bluez/patches/004-Move-the-43xx-firmware-into-lib-firmware.patch b/feeds/ucentral/bluez/patches/004-Move-the-43xx-firmware-into-lib-firmware.patch new file mode 100644 index 000000000..cce53b329 --- /dev/null +++ b/feeds/ucentral/bluez/patches/004-Move-the-43xx-firmware-into-lib-firmware.patch @@ -0,0 +1,20 @@ +From 76681284b0ea49852041fdb97a35175089a08781 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Tue, 23 Feb 2016 17:52:29 +0000 +Subject: [PATCH 4/4] Move the 43xx firmware into /lib/firmware + +--- + tools/hciattach_bcm43xx.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/tools/hciattach.h ++++ b/tools/hciattach.h +@@ -41,7 +41,7 @@ + #define HCI_UART_VND_DETECT 5 + + #ifndef FIRMWARE_DIR +-#define FIRMWARE_DIR "/etc/firmware" ++#define FIRMWARE_DIR "/lib/firmware/brcm" + #endif + + int read_hci_event(int fd, unsigned char *buf, int size); diff --git a/feeds/ucentral/bluez/patches/201-readline.patch b/feeds/ucentral/bluez/patches/201-readline.patch new file mode 100644 index 000000000..e58b504b3 --- /dev/null +++ b/feeds/ucentral/bluez/patches/201-readline.patch @@ -0,0 +1,75 @@ +--- a/Makefile.in ++++ b/Makefile.in +@@ -3598,7 +3598,7 @@ unit_tests = $(am__append_62) unit/test- + @CLIENT_TRUE@ client/player.h client/player.c + + @CLIENT_TRUE@client_bluetoothctl_LDADD = gdbus/libgdbus-internal.la src/libshared-glib.la \ +-@CLIENT_TRUE@ $(GLIB_LIBS) $(DBUS_LIBS) -lreadline ++@CLIENT_TRUE@ $(GLIB_LIBS) $(DBUS_LIBS) -lreadline -lncurses + + @ZSH_COMPLETIONS_TRUE@zshcompletiondir = $(ZSH_COMPLETIONDIR) + @ZSH_COMPLETIONS_TRUE@dist_zshcompletion_DATA = completion/zsh/_bluetoothctl +@@ -3877,7 +3877,7 @@ unit_tests = $(am__append_62) unit/test- + + @DEPRECATED_TRUE@@MESH_TRUE@@TOOLS_TRUE@tools_meshctl_LDADD = gdbus/libgdbus-internal.la src/libshared-glib.la \ + @DEPRECATED_TRUE@@MESH_TRUE@@TOOLS_TRUE@ lib/libbluetooth-internal.la \ +-@DEPRECATED_TRUE@@MESH_TRUE@@TOOLS_TRUE@ $(GLIB_LIBS) $(DBUS_LIBS) -ljson-c -lreadline ++@DEPRECATED_TRUE@@MESH_TRUE@@TOOLS_TRUE@ $(GLIB_LIBS) $(DBUS_LIBS) -ljson-c -lreadline -lncurses + + @MESH_TRUE@@TOOLS_TRUE@tools_mesh_cfgclient_SOURCES = tools/mesh-cfgclient.c \ + @MESH_TRUE@@TOOLS_TRUE@ tools/mesh/model.h tools/mesh/config-model.h \ +@@ -3891,7 +3891,7 @@ unit_tests = $(am__append_62) unit/test- + @MESH_TRUE@@TOOLS_TRUE@ mesh/crypto.h mesh/crypto.c + + @MESH_TRUE@@TOOLS_TRUE@tools_mesh_cfgclient_LDADD = lib/libbluetooth-internal.la src/libshared-ell.la \ +-@MESH_TRUE@@TOOLS_TRUE@ $(ell_ldadd) -ljson-c -lreadline ++@MESH_TRUE@@TOOLS_TRUE@ $(ell_ldadd) -ljson-c -lreadline -lncurses + + @MESH_TRUE@@TOOLS_TRUE@tools_mesh_cfgtest_SOURCES = tools/mesh-cfgtest.c + @MESH_TRUE@@TOOLS_TRUE@tools_mesh_cfgtest_LDADD = lib/libbluetooth-internal.la src/libshared-ell.la \ +@@ -3948,7 +3948,7 @@ unit_tests = $(am__append_62) unit/test- + @READLINE_TRUE@ tools/obex-client-tool.c + + @READLINE_TRUE@tools_obex_client_tool_LDADD = lib/libbluetooth-internal.la \ +-@READLINE_TRUE@ src/libshared-glib.la $(GLIB_LIBS) -lreadline ++@READLINE_TRUE@ src/libshared-glib.la $(GLIB_LIBS) -lreadline -lncurses + + @READLINE_TRUE@tools_obex_server_tool_SOURCES = $(gobex_sources) $(btio_sources) \ + @READLINE_TRUE@ tools/obex-server-tool.c +@@ -3959,15 +3959,15 @@ unit_tests = $(am__append_62) unit/test- + @READLINE_TRUE@tools_bluetooth_player_SOURCES = tools/bluetooth-player.c client/player.c + @READLINE_TRUE@tools_bluetooth_player_LDADD = gdbus/libgdbus-internal.la \ + @READLINE_TRUE@ src/libshared-glib.la \ +-@READLINE_TRUE@ $(GLIB_LIBS) $(DBUS_LIBS) -lreadline ++@READLINE_TRUE@ $(GLIB_LIBS) $(DBUS_LIBS) -lreadline -lncurses + + @READLINE_TRUE@tools_obexctl_SOURCES = tools/obexctl.c + @READLINE_TRUE@tools_obexctl_LDADD = gdbus/libgdbus-internal.la src/libshared-glib.la \ +-@READLINE_TRUE@ $(GLIB_LIBS) $(DBUS_LIBS) -lreadline ++@READLINE_TRUE@ $(GLIB_LIBS) $(DBUS_LIBS) -lreadline -lncurses + + @READLINE_TRUE@tools_btmgmt_SOURCES = tools/btmgmt.c src/uuid-helper.c client/display.c + @READLINE_TRUE@tools_btmgmt_LDADD = lib/libbluetooth-internal.la src/libshared-mainloop.la \ +-@READLINE_TRUE@ -lreadline ++@READLINE_TRUE@ -lreadline -lncurses + + @DEPRECATED_TRUE@@READLINE_TRUE@attrib_gatttool_SOURCES = attrib/gatttool.c attrib/att.c attrib/gatt.c \ + @DEPRECATED_TRUE@@READLINE_TRUE@ attrib/gattrib.c btio/btio.c \ +@@ -3976,7 +3976,7 @@ unit_tests = $(am__append_62) unit/test- + @DEPRECATED_TRUE@@READLINE_TRUE@ client/display.h + + @DEPRECATED_TRUE@@READLINE_TRUE@attrib_gatttool_LDADD = lib/libbluetooth-internal.la \ +-@DEPRECATED_TRUE@@READLINE_TRUE@ src/libshared-glib.la $(GLIB_LIBS) -lreadline ++@DEPRECATED_TRUE@@READLINE_TRUE@ src/libshared-glib.la $(GLIB_LIBS) -lreadline -lncurses + + @CUPS_TRUE@cupsdir = $(libdir)/cups/backend + @CUPS_TRUE@profiles_cups_bluetooth_SOURCES = profiles/cups/main.c \ +@@ -3996,7 +3996,7 @@ unit_tests = $(am__append_62) unit/test- + @BTPCLIENT_TRUE@tools_btpclient_DEPENDENCIES = lib/libbluetooth-internal.la $(ell_dependencies) + @BTPCLIENT_TRUE@tools_btpclientctl_SOURCES = tools/btpclientctl.c client/display.c + @BTPCLIENT_TRUE@tools_btpclientctl_LDADD = src/libshared-mainloop.la src/libshared-glib.la \ +-@BTPCLIENT_TRUE@ lib/libbluetooth-internal.la -lreadline ++@BTPCLIENT_TRUE@ lib/libbluetooth-internal.la -lreadline -lncurses + + + # SPDX-License-Identifier: GPL-2.0 diff --git a/feeds/ucentral/bluez/patches/202-fix-endianness.patch b/feeds/ucentral/bluez/patches/202-fix-endianness.patch new file mode 100644 index 000000000..c0086cc28 --- /dev/null +++ b/feeds/ucentral/bluez/patches/202-fix-endianness.patch @@ -0,0 +1,10 @@ +--- a/src/shared/util.h ++++ b/src/shared/util.h +@@ -15,6 +15,7 @@ + #include + #include + #include ++#include + + #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) + #define BIT(n) (1 << (n)) diff --git a/feeds/ucentral/bluez/patches/203-obexd_without_systemd.patch b/feeds/ucentral/bluez/patches/203-obexd_without_systemd.patch new file mode 100644 index 000000000..c2f23c141 --- /dev/null +++ b/feeds/ucentral/bluez/patches/203-obexd_without_systemd.patch @@ -0,0 +1,49 @@ +Submitted By: Armin K. +Date: 2013-04-29 +Initial Package Version: 5.17 +Upstream Status: unknown +Origin: Arch Linux (Giovanni Campagna) +Description: Allow using obexd without systemd in the user session + +Not all sessions run systemd --user (actually, the majority +doesn't), so the dbus daemon must be able to spawn obexd +directly, and to do so it needs the full path of the daemon. +--- + Makefile.obexd | 4 ++-- + obexd/src/org.bluez.obex.service | 4 ---- + obexd/src/org.bluez.obex.service.in | 4 ++++ + 3 files changed, 6 insertions(+), 6 deletions(-) + delete mode 100644 obexd/src/org.bluez.obex.service + create mode 100644 obexd/src/org.bluez.obex.service.in + +--- a/Makefile.obexd ++++ b/Makefile.obexd +@@ -2,12 +2,12 @@ + if SYSTEMD + systemduserunitdir = $(SYSTEMD_USERUNITDIR) + systemduserunit_DATA = obexd/src/obex.service ++endif + + dbussessionbusdir = $(DBUS_SESSIONBUSDIR) + dbussessionbus_DATA = obexd/src/org.bluez.obex.service +-endif + +-EXTRA_DIST += obexd/src/obex.service.in obexd/src/org.bluez.obex.service ++EXTRA_DIST += obexd/src/obex.service.in obexd/src/org.bluez.obex.service.in + + if OBEX + +--- a/obexd/src/org.bluez.obex.service ++++ /dev/null +@@ -1,4 +0,0 @@ +-[D-BUS Service] +-Name=org.bluez.obex +-Exec=/bin/false +-SystemdService=dbus-org.bluez.obex.service +--- /dev/null ++++ b/obexd/src/org.bluez.obex.service.in +@@ -0,0 +1,4 @@ ++[D-BUS Service] ++Name=org.bluez.obex ++Exec=@libexecdir@/obexd ++SystemdService=dbus-org.bluez.obex.service diff --git a/feeds/ucentral/bluez/patches/205-refresh_adv_manager_for_non-LE_devices.patch b/feeds/ucentral/bluez/patches/205-refresh_adv_manager_for_non-LE_devices.patch new file mode 100644 index 000000000..b79667bb0 --- /dev/null +++ b/feeds/ucentral/bluez/patches/205-refresh_adv_manager_for_non-LE_devices.patch @@ -0,0 +1,47 @@ +From 2c3bba7b38be03834162e34069156f1fd49f0528 Mon Sep 17 00:00:00 2001 +From: "antoine.belvire@laposte.net" +Date: Tue, 27 Mar 2018 20:30:26 +0200 +Subject: adapter: Don't refresh adv_manager for non-LE devices + +btd_adv_manager_refresh is called upon MGMT_SETTING_DISCOVERABLE setting change +but as only LE adapters have an adv_manager, this leads to segmentation fault +for non-LE devices: + +0 btd_adv_manager_refresh (manager=0x0) at src/advertising.c:1176 +1 0x0000556fe45fcb02 in settings_changed (settings=, + adapter=0x556fe53f7c70) at src/adapter.c:543 +2 new_settings_callback (index=, length=, + param=, user_data=0x556fe53f7c70) at src/adapter.c:573 +3 0x0000556fe462c278 in request_complete (mgmt=mgmt@entry=0x556fe53f20c0, + status=, opcode=opcode@entry=7, index=index@entry=0, + length=length@entry=4, param=0x556fe53eb5f9) at src/shared/mgmt.c:261 +4 0x0000556fe462cd9d in can_read_data (io=, + user_data=0x556fe53f20c0) at src/shared/mgmt.c:353 +5 0x0000556fe46396e3 in watch_callback (channel=, + cond=, user_data=) + at src/shared/io-glib.c:170 +6 0x00007fe351c980e5 in g_main_context_dispatch () + from /usr/lib64/libglib-2.0.so.0 +7 0x00007fe351c984b0 in ?? () from /usr/lib64/libglib-2.0.so.0 +8 0x00007fe351c987c2 in g_main_loop_run () from /usr/lib64/libglib-2.0.so.0 +9 0x0000556fe45abc75 in main (argc=, argv=) + at src/main.c:770 + +This commit prevents the call to btd_adv_manager_refresh for non-LE devices. +--- + src/adapter.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/src/adapter.c ++++ b/src/adapter.c +@@ -634,7 +634,9 @@ static void settings_changed(struct btd_ + */ + if (!adapter->discovery_discoverable) + store_adapter_info(adapter); +- btd_adv_manager_refresh(adapter->adv_manager); ++ ++ if (adapter->supported_settings & MGMT_SETTING_LE) ++ btd_adv_manager_refresh(adapter->adv_manager); + } + + if (changed_mask & MGMT_SETTING_BONDABLE) { diff --git a/feeds/ucentral/bluez/patches/206-sync.patch b/feeds/ucentral/bluez/patches/206-sync.patch new file mode 100644 index 000000000..265400e64 --- /dev/null +++ b/feeds/ucentral/bluez/patches/206-sync.patch @@ -0,0 +1,27 @@ +--- a/obexd/client/sync.c ++++ b/obexd/client/sync.c +@@ -209,7 +209,7 @@ static void sync_remove(struct obc_sessi + g_dbus_unregister_interface(conn, path, SYNC_INTERFACE); + } + +-static struct obc_driver sync = { ++static struct obc_driver sync2 = { + .service = "SYNC", + .uuid = SYNC_UUID, + .target = OBEX_SYNC_UUID, +@@ -228,7 +228,7 @@ int sync_init(void) + if (!conn) + return -EIO; + +- err = obc_driver_register(&sync); ++ err = obc_driver_register(&sync2); + if (err < 0) { + dbus_connection_unref(conn); + conn = NULL; +@@ -245,5 +245,5 @@ void sync_exit(void) + dbus_connection_unref(conn); + conn = NULL; + +- obc_driver_unregister(&sync); ++ obc_driver_unregister(&sync2); + } diff --git a/feeds/ucentral/bluez/patches/210-util-define-MAX_INPUT.patch b/feeds/ucentral/bluez/patches/210-util-define-MAX_INPUT.patch new file mode 100644 index 000000000..e2af0bf65 --- /dev/null +++ b/feeds/ucentral/bluez/patches/210-util-define-MAX_INPUT.patch @@ -0,0 +1,12 @@ +--- a/src/shared/util.c ++++ b/src/shared/util.c +@@ -23,6 +23,9 @@ + #include + #include + #include ++#ifndef MAX_INPUT ++#define MAX_INPUT _POSIX_MAX_INPUT ++#endif + + #ifdef HAVE_SYS_RANDOM_H + #include diff --git a/profiles/mcu.yml b/profiles/mcu.yml index 1384c9a53..4a43a26d6 100644 --- a/profiles/mcu.yml +++ b/profiles/mcu.yml @@ -6,3 +6,4 @@ feeds: packages: - umcumgr + - bluez From ea95356ebda3c76df1cecb8364a4b1e8f9d7a3c4 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Wed, 15 Mar 2023 09:56:09 +0100 Subject: [PATCH 31/31] rtty: improve patch indenting Newer version of GCC complained about inconsistent indenting. Signed-off-by: John Crispin --- feeds/ucentral/rtty/patches/300-throttle.patch | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feeds/ucentral/rtty/patches/300-throttle.patch b/feeds/ucentral/rtty/patches/300-throttle.patch index f7cab9780..3b9fd683b 100644 --- a/feeds/ucentral/rtty/patches/300-throttle.patch +++ b/feeds/ucentral/rtty/patches/300-throttle.patch @@ -25,7 +25,7 @@ Index: rtty-7.1.4/src/rtty.c if (buffer_length(&rtty->wb) < 1) ev_io_stop(loop, w); + -+ poll(NULL, 0, 100); ++ poll(NULL, 0, 100); } static void on_net_connected(int sock, void *arg)