From b186fa417b85531a7ec08927fb2c356608a8d204 Mon Sep 17 00:00:00 2001 From: Dmitry Ermakov <7954832+dimerr@users.noreply.github.com> Date: Wed, 28 Oct 2026 09:32:02 +0000 Subject: [PATCH 1/6] ssv6020-openipc: the iComm SSV6020 SDIO Wi-Fi, for the XM533's SSV6158M The Wi-Fi on Xiongmai XM533 boards (X3-WQ-B, "SSV6158M") is an iComm SSV6020B/C on SDIO, 5653:2060. Neither ssv615x-openipc (SSV6006, 3030:3030) nor ssv635x-openipc (SSV6030, 5356:6030) binds it. The source is the ssv6020/ directory of OpenIPC/ssv6x5x (OpenIPC/ssv6x5x#2): iComm's L.SMAC trunk r170 with the SSV6020 HAL, as Allwinner's BSP ships it for the SSV6158, made to build as an external module on 3.10. The package installs the module, its ssv6x5x-sw.bin firmware in /lib/firmware (it calls request_firmware without a firmware_path) and a default /etc/ssv6x5x-wifi.cfg. xm533_lite selects it. On the xm533 image in qemu-bench, `modprobe ssv6x5x stacfgpath=/etc/ssv6x5x-wifi.cfg` loads cfg80211, mac80211 and the driver, which reads the cfg and registers its SDIO driver with no unknown symbol. qemu-bench has no SSV6020, so the card itself needs a camera. --- .../configs/xm533_lite_defconfig | 2 ++ general/package/Config.in | 1 + general/package/ssv6020-openipc/Config.in | 7 ++++++ .../ssv6020-openipc/ssv6020-openipc.mk | 25 +++++++++++++++++++ 4 files changed, 35 insertions(+) create mode 100644 general/package/ssv6020-openipc/Config.in create mode 100644 general/package/ssv6020-openipc/ssv6020-openipc.mk diff --git a/br-ext-chip-xiongmai/configs/xm533_lite_defconfig b/br-ext-chip-xiongmai/configs/xm533_lite_defconfig index e93456274..6ca8ceb3f 100644 --- a/br-ext-chip-xiongmai/configs/xm533_lite_defconfig +++ b/br-ext-chip-xiongmai/configs/xm533_lite_defconfig @@ -64,4 +64,6 @@ BR2_PACKAGE_MOTORS=y BR2_PACKAGE_OPUS_OPENIPC=y BR2_PACKAGE_VTUND_OPENIPC=y BR2_PACKAGE_XIONGMAI_OSDRV_XM530V200=y +# The X3-WQ-B's Wi-Fi, sold as SSV6158M: an iComm SSV6020 on SDIO +BR2_PACKAGE_SSV6020_OPENIPC=y BR2_PACKAGE_YAML_CLI=y diff --git a/general/package/Config.in b/general/package/Config.in index c60b66eff..1384a1707 100644 --- a/general/package/Config.in +++ b/general/package/Config.in @@ -110,6 +110,7 @@ source "$BR2_EXTERNAL_GENERAL_PATH/package/sigmastar-osdrv-infinity6e/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/sigmastar-osdrv-sensors/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/siproxd-openipc/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/ssv615x-openipc/Config.in" +source "$BR2_EXTERNAL_GENERAL_PATH/package/ssv6020-openipc/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/ssv635x-openipc/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/ssw101b/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/txw8301-openipc/Config.in" diff --git a/general/package/ssv6020-openipc/Config.in b/general/package/ssv6020-openipc/Config.in new file mode 100644 index 000000000..5fc229291 --- /dev/null +++ b/general/package/ssv6020-openipc/Config.in @@ -0,0 +1,7 @@ +config BR2_PACKAGE_SSV6020_OPENIPC + bool "ssv6020-openipc" + depends on BR2_LINUX_KERNEL + help + iComm SSV6020 (Turismo E) SDIO wireless driver, sdio:v5653d2060: + the SSV6020B/C, sold as the SSV6158M on Xiongmai XM533 boards. + Loads ssv6x5x-sw.bin from /lib/firmware. diff --git a/general/package/ssv6020-openipc/ssv6020-openipc.mk b/general/package/ssv6020-openipc/ssv6020-openipc.mk new file mode 100644 index 000000000..857058cf0 --- /dev/null +++ b/general/package/ssv6020-openipc/ssv6020-openipc.mk @@ -0,0 +1,25 @@ +################################################################################ +# +# ssv6020-openipc +# +################################################################################ + +# OpenIPC/ssv6x5x's ssv6020/ directory: iComm's L.SMAC trunk r170 with the +# SSV6020 HAL, as Allwinner's BSP ships it for the SSV6158, built as an +# external module on 3.10 kernels. +SSV6020_OPENIPC_SITE = $(call github,openipc,ssv6x5x,$(SSV6020_OPENIPC_VERSION)) +SSV6020_OPENIPC_VERSION = d624c55332901a1e0fde2a3944cf102cd87a1cfe + +SSV6020_OPENIPC_LICENSE = GPL-2.0 + +SSV6020_OPENIPC_MODULE_SUBDIRS = ssv6020 +SSV6020_OPENIPC_MODULE_MAKE_OPTS = CONFIG_SSV6X5X=m + +define SSV6020_OPENIPC_INSTALL_FIRMWARE + $(INSTALL) -D -m 644 $(@D)/ssv6020/image/ssv6x5x-sw.bin $(TARGET_DIR)/lib/firmware/ssv6x5x-sw.bin + $(INSTALL) -D -m 644 $(@D)/ssv6020/ssv6x5x-wifi.cfg $(TARGET_DIR)/etc/ssv6x5x-wifi.cfg +endef +SSV6020_OPENIPC_POST_INSTALL_TARGET_HOOKS += SSV6020_OPENIPC_INSTALL_FIRMWARE + +$(eval $(kernel-module)) +$(eval $(generic-package)) From 970e0facb0498f1901d5d30f918a024acef64195 Mon Sep 17 00:00:00 2001 From: Dmitry Ermakov <7954832+dimerr@users.noreply.github.com> Date: Wed, 28 Oct 2026 10:49:17 +0000 Subject: [PATCH 2/6] atbm606x-openipc: AltoBeam's Wi-Fi 6 USB driver, for the XM535D2's ATBM6132CU The Wi-Fi on Xiongmai XM535D2 boards (X9-WE2Q) is an AltoBeam ATBM6132CU, USB 007a:6052/6055/6162. Neither atbm-wifi nor atbm60xx carries AltoBeam's Wi-Fi 6 parts or their firmware. The source is the atbm606x/ directory of OpenIPC/atbm_60xx (OpenIPC/atbm_60xx#5): AltoBeam's 606x driver as Ingenic's SDK ships it (DRIVER_VER 4327). It covers the ATBM6062, 6062-C, 6162 and 6132-C, with the Cronus, Oceanus and Cronus Lite firmware built in and chosen at run time. Its USB table matches the vendor 6132cu.ko's exactly. It needs no changes, only settings: those are passed as make variables, as for atbm60xx, since the tree has no .config. It brings its own cfg80211 (a backport) and mac80211, as the vendor firmware does, so the xm535d2 kernel config turns the kernel's CFG80211 and MAC80211 off. Otherwise two cfg80211.ko would ship and depmod could bind the driver to the wrong one. xm535d2_lite selects the package. On a clean xm535d2 build in qemu-bench: - modules.dep binds atbm606x_wifi_usb.ko to the bundled cfg80211.ko; - modprobe loads both and the driver registers atbm_wlan (SVN_VER=4327), with no unknown symbol or Oops. The rootfs is 2.66 MB of 5 MB. qemu-bench's ATBM model is Ares-B only, so the dongle itself needs a camera. --- .../board/xm530/xm535d2.generic.config | 38 ++---------- .../configs/xm535d2_lite_defconfig | 2 + general/package/Config.in | 1 + general/package/atbm606x-openipc/Config.in | 8 +++ .../atbm606x-openipc/atbm606x-openipc.mk | 58 +++++++++++++++++++ 5 files changed, 74 insertions(+), 33 deletions(-) create mode 100644 general/package/atbm606x-openipc/Config.in create mode 100644 general/package/atbm606x-openipc/atbm606x-openipc.mk diff --git a/br-ext-chip-xiongmai/board/xm530/xm535d2.generic.config b/br-ext-chip-xiongmai/board/xm530/xm535d2.generic.config index 6f3118356..104d8db30 100644 --- a/br-ext-chip-xiongmai/board/xm530/xm535d2.generic.config +++ b/br-ext-chip-xiongmai/board/xm530/xm535d2.generic.config @@ -564,25 +564,12 @@ CONFIG_WIRELESS_EXT=y CONFIG_WEXT_CORE=y CONFIG_WEXT_PROC=y CONFIG_WEXT_PRIV=y -CONFIG_CFG80211=m -# CONFIG_NL80211_TESTMODE is not set -# CONFIG_CFG80211_DEVELOPER_WARNINGS is not set -# CONFIG_CFG80211_REG_DEBUG is not set -# CONFIG_CFG80211_CERTIFICATION_ONUS is not set -CONFIG_CFG80211_DEFAULT_PS=y -# CONFIG_CFG80211_INTERNAL_REGDB is not set -# CONFIG_CFG80211_WEXT is not set +# CONFIG_CFG80211 is not set # CONFIG_LIB80211 is not set -CONFIG_MAC80211=m -CONFIG_MAC80211_HAS_RC=y -# CONFIG_MAC80211_RC_PID is not set -CONFIG_MAC80211_RC_MINSTREL=y -CONFIG_MAC80211_RC_MINSTREL_HT=y -CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y -CONFIG_MAC80211_RC_DEFAULT="minstrel_ht" -# CONFIG_MAC80211_MESH is not set -# CONFIG_MAC80211_MESSAGE_TRACING is not set -# CONFIG_MAC80211_DEBUG_MENU is not set + +# +# CFG80211 needs to be enabled for MAC80211 +# # CONFIG_WIMAX is not set # CONFIG_RFKILL is not set # CONFIG_NET_9P is not set @@ -836,24 +823,9 @@ CONFIG_MDIO_BITBANG=y # CONFIG_USB_USBNET is not set # CONFIG_USB_IPHETH is not set CONFIG_WLAN=y -# CONFIG_LIBERTAS_THINFIRM is not set -# CONFIG_AT76C50X_USB is not set CONFIG_USB_ZD1201=m -# CONFIG_USB_NET_RNDIS_WLAN is not set -# CONFIG_RTL8187 is not set -# CONFIG_MAC80211_HWSIM is not set -# CONFIG_ATH_CARDS is not set -# CONFIG_B43 is not set -# CONFIG_B43LEGACY is not set -# CONFIG_BRCMFMAC is not set # CONFIG_HOSTAP is not set -# CONFIG_LIBERTAS is not set -# CONFIG_P54_COMMON is not set -# CONFIG_RT2X00 is not set -# CONFIG_RTLWIFI is not set # CONFIG_WL_TI is not set -# CONFIG_ZD1211RW is not set -# CONFIG_MWIFIEX is not set # # Enable WiMAX (Networking options) to see the WiMAX drivers diff --git a/br-ext-chip-xiongmai/configs/xm535d2_lite_defconfig b/br-ext-chip-xiongmai/configs/xm535d2_lite_defconfig index 6b24363cc..d8434a3e8 100644 --- a/br-ext-chip-xiongmai/configs/xm535d2_lite_defconfig +++ b/br-ext-chip-xiongmai/configs/xm535d2_lite_defconfig @@ -64,4 +64,6 @@ BR2_PACKAGE_MOTORS=y BR2_PACKAGE_OPUS_OPENIPC=y BR2_PACKAGE_VTUND_OPENIPC=y BR2_PACKAGE_XIONGMAI_OSDRV_XM530V200=y +# The X9-WE2Q's Wi-Fi: an AltoBeam ATBM6132CU on USB, with its own cfg80211 +BR2_PACKAGE_ATBM606X_OPENIPC=y BR2_PACKAGE_YAML_CLI=y diff --git a/general/package/Config.in b/general/package/Config.in index 1384a1707..a97ccd118 100644 --- a/general/package/Config.in +++ b/general/package/Config.in @@ -5,6 +5,7 @@ source "$BR2_EXTERNAL_GENERAL_PATH/package/allwinner-osdrv-v85x/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/anyka-osdrv-ak3918av130/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/atbm-wifi/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/atbm60xx/Config.in" +source "$BR2_EXTERNAL_GENERAL_PATH/package/atbm606x-openipc/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/aura-httpd/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/baresip-openipc/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/comgt/Config.in" diff --git a/general/package/atbm606x-openipc/Config.in b/general/package/atbm606x-openipc/Config.in new file mode 100644 index 000000000..97149a000 --- /dev/null +++ b/general/package/atbm606x-openipc/Config.in @@ -0,0 +1,8 @@ +config BR2_PACKAGE_ATBM606X_OPENIPC + bool "atbm606x-openipc" + depends on BR2_LINUX_KERNEL + help + AltoBeam Wi-Fi 6 USB driver for the ATBM6062, ATBM6062-C, + ATBM6162 and ATBM6132-C (Cronus, Oceanus, Cronus Lite), firmware + built in. It brings its own cfg80211 and mac80211, so the kernel's + CONFIG_CFG80211 and CONFIG_MAC80211 must be off. diff --git a/general/package/atbm606x-openipc/atbm606x-openipc.mk b/general/package/atbm606x-openipc/atbm606x-openipc.mk new file mode 100644 index 000000000..da5b07a71 --- /dev/null +++ b/general/package/atbm606x-openipc/atbm606x-openipc.mk @@ -0,0 +1,58 @@ +################################################################################ +# +# atbm606x-openipc +# +################################################################################ + +# OpenIPC/atbm_60xx's atbm606x/ directory: AltoBeam's Wi-Fi 6 driver as +# Ingenic's SDK ships it (DRIVER_VER 4327). +ATBM606X_OPENIPC_SITE = $(call github,openipc,atbm_60xx,$(ATBM606X_OPENIPC_VERSION)) +ATBM606X_OPENIPC_VERSION = 216c7f2ecf2016a282a8567598e5823386705373 + +ATBM606X_OPENIPC_LICENSE = GPL-2.0 + +# The tree has no .config: its settings are passed instead, as for +# atbm60xx. ATBM_BUILD_IN_KERNEL=n is what makes its top Makefile build +# the bundled cfg80211 (wireless/) beside the driver (hal_apollo/). +ATBM606X_OPENIPC_MODULE_SUBDIRS = atbm606x +ATBM606X_OPENIPC_MODULE_MAKE_OPTS = \ + ATBM_BUILD_IN_KERNEL=n \ + WIFI_PROJ_DIR=$(@D)/atbm606x \ + CONFIG_ATBM_MENUCONFIG_WIFI6=y \ + CONFIG_ATBM_WIRELESS_WIFI6=y \ + CONFIG_ATBM_USB_BUS_WIFI6=y \ + CONFIG_ATBM_USE_FIRMWARE_H_WIFI6=y \ + CONFIG_COMPAT_COMBO_HFW=y \ + CONFIG_COMPAT_6062X=y \ + CONFIG_COMPAT_6162X=y \ + CONFIG_COMPAT_6062_CX=y \ + CONFIG_COMPAT_6132_C=y \ + CONFIG_ATBM_SUPPORT_BAN_5G_24G_WIFI6=y \ + CONFIG_ATBM_FUNC_NOTXCONFIRM_WIFI6=y \ + CONFIG_ATBM_FUNC_MONITOR_WIFI6=y \ + CONFIG_ATBM_USB_INTR_WIFI6=y \ + CONFIG_ATBM_FUNC_DEV_CTRL_API_WIFI6=y \ + CONFIG_ATBM_FUNC_MODULE_FS_WIFI6=y \ + CONFIG_ATBM_FUNC_PRIVE_IE_WIFI6=y \ + CONFIG_ATBM_FUNC_SAE_AUTHEN_WIFI6=y \ + CONFIG_ATBM_FUNC_DRIVER_SETUP_AMPDU_WIFI6=y \ + CONFIG_ATBM_DEFAULT_COUNTRY_CODE_WIFI6=00 \ + CONFIG_ATBM_APOLLO_SUPPORT_SGI_WIFI6=y \ + CONFIG_ATBM_WIFIIF1_NAME_WIFI6=wlan%d \ + CONFIG_NEED_P2P0_INTERFACE_WIFI6=y \ + CONFIG_ATBM_WIFIIF2_NAME_WIFI6=p2p%d \ + CONFIG_ATBM_MODULE_PM_STAYAWK_WIFI6=pm_stayawake \ + CONFIG_ATBM_MODULE_DRIVER_NAME_WIFI6=atbm_wlan \ + CONFIG_ATBM_PLATFORM_DEVICE_NAME_WIFI6=atbm_dev_wifi \ + CONFIG_ATBM_MODULE_NAME_WIFI6=atbm606x_wifi_usb \ + CONFIG_CPTCFG_CFG80211=y \ + CONFIG_CPTCFG_CFG80211_WEXT=y \ + CONFIG_CPTCFG_CFG80211_CRDA_SUPPORT=y \ + CONFIG_CPTCFG_CFG80211_COUNTRY_CODE=y + +# Its mac80211 code reaches the WEP/TKIP software crypto unconditionally +# on kernels up to 5.4; this option is what gives it the fields it uses. +ATBM606X_OPENIPC_MODULE_MAKE_OPTS += CONFIG_ATBM_FUNC_SW_ENC_WIFI6=y + +$(eval $(kernel-module)) +$(eval $(generic-package)) From eac5a313999033c7fb658917804bbaf17bbb18ed Mon Sep 17 00:00:00 2001 From: Dmitry Ermakov <7954832+dimerr@users.noreply.github.com> Date: Wed, 28 Oct 2026 11:15:03 +0000 Subject: [PATCH 3/6] atbm603x-comb-openipc: the AltoBeam USB Wi-Fi of the XM530V200, XM535D1 and XM535W1 Each V200-series board now selects the Wi-Fi driver for the chip its camera ships with: | Board | Wi-Fi | Package | |---|---|---| | xm530v200_lite | ATBM6012B-X (X6C-WEQ, 007a:888b); XM713G (X2-WQ2, 007a:8888, AsmLite firmware) | atbm603x-comb-openipc | | xm533_lite | iComm SSV6020 | ssv6020-openipc | | xm535d1_lite | ATBM6012B-X | atbm603x-comb-openipc | | xm535d2_lite | ATBM6132CU | atbm606x-openipc | | xm535w1_lite | ATBM6012B-X | atbm603x-comb-openipc | The source is the atbm603x_comb/ directory of OpenIPC/atbm_60xx (OpenIPC/atbm_60xx#6): AltoBeam's apollo driver (DRIVER_VER 2874), as Khadas ships it, with the AsmLite and Ares-B firmware built in. The chip type is picked at run time. It binds 007a:888b and 007a:8888, and uses the kernel's cfg80211. The directory's own .config is used, through ATBM_BUILD_IN_KERNEL=n and WIFI_PROJ_DIR. In qemu-bench, with its emulated AltoBeam dongle: - xm530v200 (PID 8888, chip 0x49) and xm535d1 (PID 888b, chip 0x4a): modprobe identifies the chip and brings up wlan0; - wpa_supplicant associates with the model's open AP; - udhcpc gets a lease over Wi-Fi (192.168.50.15); - no Oops. rootfs: xm530v200 2.54 MB, xm535d1/w1 2.52 MB, of 5 MB. --- .../configs/xm530v200_lite_defconfig | 2 ++ .../configs/xm533_lite_defconfig | 2 +- .../configs/xm535d1_lite_defconfig | 2 ++ .../configs/xm535d2_lite_defconfig | 2 +- .../configs/xm535w1_lite_defconfig | 2 ++ general/package/Config.in | 1 + .../package/atbm603x-comb-openipc/Config.in | 7 ++++++ .../atbm603x-comb-openipc.mk | 23 +++++++++++++++++++ 8 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 general/package/atbm603x-comb-openipc/Config.in create mode 100644 general/package/atbm603x-comb-openipc/atbm603x-comb-openipc.mk diff --git a/br-ext-chip-xiongmai/configs/xm530v200_lite_defconfig b/br-ext-chip-xiongmai/configs/xm530v200_lite_defconfig index 028cacb88..b947e60ce 100644 --- a/br-ext-chip-xiongmai/configs/xm530v200_lite_defconfig +++ b/br-ext-chip-xiongmai/configs/xm530v200_lite_defconfig @@ -63,4 +63,6 @@ BR2_PACKAGE_MOTORS=y BR2_PACKAGE_OPUS_OPENIPC=y BR2_PACKAGE_VTUND_OPENIPC=y BR2_PACKAGE_XIONGMAI_OSDRV_XM530V200=y +# Wi-Fi: the X6C-WEQ's AltoBeam ATBM6012B-X and the X2-WQ2's XM713G (AsmLite), USB +BR2_PACKAGE_ATBM603X_COMB_OPENIPC=y BR2_PACKAGE_YAML_CLI=y diff --git a/br-ext-chip-xiongmai/configs/xm533_lite_defconfig b/br-ext-chip-xiongmai/configs/xm533_lite_defconfig index 6ca8ceb3f..e5e71b269 100644 --- a/br-ext-chip-xiongmai/configs/xm533_lite_defconfig +++ b/br-ext-chip-xiongmai/configs/xm533_lite_defconfig @@ -64,6 +64,6 @@ BR2_PACKAGE_MOTORS=y BR2_PACKAGE_OPUS_OPENIPC=y BR2_PACKAGE_VTUND_OPENIPC=y BR2_PACKAGE_XIONGMAI_OSDRV_XM530V200=y -# The X3-WQ-B's Wi-Fi, sold as SSV6158M: an iComm SSV6020 on SDIO +# Wi-Fi: the X3-WQ-B's "SSV6158M", an iComm SSV6020, SDIO BR2_PACKAGE_SSV6020_OPENIPC=y BR2_PACKAGE_YAML_CLI=y diff --git a/br-ext-chip-xiongmai/configs/xm535d1_lite_defconfig b/br-ext-chip-xiongmai/configs/xm535d1_lite_defconfig index e504f9fdc..7159efd71 100644 --- a/br-ext-chip-xiongmai/configs/xm535d1_lite_defconfig +++ b/br-ext-chip-xiongmai/configs/xm535d1_lite_defconfig @@ -64,4 +64,6 @@ BR2_PACKAGE_MOTORS=y BR2_PACKAGE_OPUS_OPENIPC=y BR2_PACKAGE_VTUND_OPENIPC=y BR2_PACKAGE_XIONGMAI_OSDRV_XM530V200=y +# Wi-Fi: the X6E-WEQ's AltoBeam ATBM6012B-X, USB +BR2_PACKAGE_ATBM603X_COMB_OPENIPC=y BR2_PACKAGE_YAML_CLI=y diff --git a/br-ext-chip-xiongmai/configs/xm535d2_lite_defconfig b/br-ext-chip-xiongmai/configs/xm535d2_lite_defconfig index d8434a3e8..7e5b7bfea 100644 --- a/br-ext-chip-xiongmai/configs/xm535d2_lite_defconfig +++ b/br-ext-chip-xiongmai/configs/xm535d2_lite_defconfig @@ -64,6 +64,6 @@ BR2_PACKAGE_MOTORS=y BR2_PACKAGE_OPUS_OPENIPC=y BR2_PACKAGE_VTUND_OPENIPC=y BR2_PACKAGE_XIONGMAI_OSDRV_XM530V200=y -# The X9-WE2Q's Wi-Fi: an AltoBeam ATBM6132CU on USB, with its own cfg80211 +# Wi-Fi: the X9-WE2Q's AltoBeam ATBM6132CU, USB, with its own cfg80211 BR2_PACKAGE_ATBM606X_OPENIPC=y BR2_PACKAGE_YAML_CLI=y diff --git a/br-ext-chip-xiongmai/configs/xm535w1_lite_defconfig b/br-ext-chip-xiongmai/configs/xm535w1_lite_defconfig index 2689f93cb..1278a6254 100644 --- a/br-ext-chip-xiongmai/configs/xm535w1_lite_defconfig +++ b/br-ext-chip-xiongmai/configs/xm535w1_lite_defconfig @@ -64,4 +64,6 @@ BR2_PACKAGE_MOTORS=y BR2_PACKAGE_OPUS_OPENIPC=y BR2_PACKAGE_VTUND_OPENIPC=y BR2_PACKAGE_XIONGMAI_OSDRV_XM530V200=y +# Wi-Fi: the X2W-WNG's AltoBeam ATBM6012B-X, USB +BR2_PACKAGE_ATBM603X_COMB_OPENIPC=y BR2_PACKAGE_YAML_CLI=y diff --git a/general/package/Config.in b/general/package/Config.in index a97ccd118..d86169073 100644 --- a/general/package/Config.in +++ b/general/package/Config.in @@ -4,6 +4,7 @@ source "$BR2_EXTERNAL_GENERAL_PATH/package/allwinner-osdrv-v83x/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/allwinner-osdrv-v85x/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/anyka-osdrv-ak3918av130/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/atbm-wifi/Config.in" +source "$BR2_EXTERNAL_GENERAL_PATH/package/atbm603x-comb-openipc/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/atbm60xx/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/atbm606x-openipc/Config.in" source "$BR2_EXTERNAL_GENERAL_PATH/package/aura-httpd/Config.in" diff --git a/general/package/atbm603x-comb-openipc/Config.in b/general/package/atbm603x-comb-openipc/Config.in new file mode 100644 index 000000000..ba419249d --- /dev/null +++ b/general/package/atbm603x-comb-openipc/Config.in @@ -0,0 +1,7 @@ +config BR2_PACKAGE_ATBM603X_COMB_OPENIPC + bool "atbm603x-comb-openipc" + depends on BR2_LINUX_KERNEL + help + AltoBeam USB Wi-Fi driver for the ATBM6012B-X/Y and 6032-X + (AsmLite) and the ATBM603x (Ares-B), firmware built in; + binds 007a:888b and 007a:8888. Needs the kernel's cfg80211. diff --git a/general/package/atbm603x-comb-openipc/atbm603x-comb-openipc.mk b/general/package/atbm603x-comb-openipc/atbm603x-comb-openipc.mk new file mode 100644 index 000000000..0b20e8590 --- /dev/null +++ b/general/package/atbm603x-comb-openipc/atbm603x-comb-openipc.mk @@ -0,0 +1,23 @@ +################################################################################ +# +# atbm603x-comb-openipc +# +################################################################################ + +# OpenIPC/atbm_60xx's atbm603x_comb/ directory: AltoBeam's apollo driver +# (DRIVER_VER 2874) with the AsmLite and Ares-B firmware, as Khadas ships it. +ATBM603X_COMB_OPENIPC_SITE = $(call github,openipc,atbm_60xx,$(ATBM603X_COMB_OPENIPC_VERSION)) +ATBM603X_COMB_OPENIPC_VERSION = 9b636083a9298e1e42ba4fa916d10669737e883b + +ATBM603X_COMB_OPENIPC_LICENSE = GPL-2.0 + +# The directory carries its own .config (USB, firmware built in, module +# atbm603x_comb_wifi_usb). ATBM_BUILD_IN_KERNEL=n makes its Makefiles +# read it from WIFI_PROJ_DIR. +ATBM603X_COMB_OPENIPC_MODULE_SUBDIRS = atbm603x_comb +ATBM603X_COMB_OPENIPC_MODULE_MAKE_OPTS = \ + ATBM_BUILD_IN_KERNEL=n \ + WIFI_PROJ_DIR=$(@D)/atbm603x_comb + +$(eval $(kernel-module)) +$(eval $(generic-package)) From eaa7e2f97c0e544a90ff7f37a7e5a3f85e675d5e Mon Sep 17 00:00:00 2001 From: Dmitry Ermakov <7954832+dimerr@users.noreply.github.com> Date: Wed, 28 Oct 2026 11:27:54 +0000 Subject: [PATCH 4/6] ssv6020-openipc, atbm606x-openipc: pin the drivers with their memory-safety fixes Both source PRs gained a commit from review: OpenIPC/ssv6x5x#2 bounds its debug interfaces' input and fixes a module-load crash on a missing stacfgpath (1d5db46); OpenIPC/atbm_60xx#5 bounds its USB endpoint and RX header reads and the private ioctls' input (5379d2a). Both rebuilt images load the drivers in qemu-bench without an Oops. --- general/package/atbm606x-openipc/atbm606x-openipc.mk | 2 +- general/package/ssv6020-openipc/ssv6020-openipc.mk | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/general/package/atbm606x-openipc/atbm606x-openipc.mk b/general/package/atbm606x-openipc/atbm606x-openipc.mk index da5b07a71..8f483651a 100644 --- a/general/package/atbm606x-openipc/atbm606x-openipc.mk +++ b/general/package/atbm606x-openipc/atbm606x-openipc.mk @@ -7,7 +7,7 @@ # OpenIPC/atbm_60xx's atbm606x/ directory: AltoBeam's Wi-Fi 6 driver as # Ingenic's SDK ships it (DRIVER_VER 4327). ATBM606X_OPENIPC_SITE = $(call github,openipc,atbm_60xx,$(ATBM606X_OPENIPC_VERSION)) -ATBM606X_OPENIPC_VERSION = 216c7f2ecf2016a282a8567598e5823386705373 +ATBM606X_OPENIPC_VERSION = 5379d2a495cc572e927e4ba2fb3f25519b17ab1e ATBM606X_OPENIPC_LICENSE = GPL-2.0 diff --git a/general/package/ssv6020-openipc/ssv6020-openipc.mk b/general/package/ssv6020-openipc/ssv6020-openipc.mk index 857058cf0..b184fe9ca 100644 --- a/general/package/ssv6020-openipc/ssv6020-openipc.mk +++ b/general/package/ssv6020-openipc/ssv6020-openipc.mk @@ -8,7 +8,7 @@ # SSV6020 HAL, as Allwinner's BSP ships it for the SSV6158, built as an # external module on 3.10 kernels. SSV6020_OPENIPC_SITE = $(call github,openipc,ssv6x5x,$(SSV6020_OPENIPC_VERSION)) -SSV6020_OPENIPC_VERSION = d624c55332901a1e0fde2a3944cf102cd87a1cfe +SSV6020_OPENIPC_VERSION = 1d5db4649d12cdfddc7c8ecccd039e528afca89f SSV6020_OPENIPC_LICENSE = GPL-2.0 From 27b74eb800e9462e10db1e594dac295d5cd716fc Mon Sep 17 00:00:00 2001 From: Dmitry Ermakov <7954832+dimerr@users.noreply.github.com> Date: Wed, 28 Oct 2026 11:43:33 +0000 Subject: [PATCH 5/6] xiongmai: wireless profiles that bring up each V200-series board's Wi-Fi From review on #2712: the drivers were in the images, but no wlandev profile loaded them. S40network runs the profile named by wlandev. USB (/etc/wireless/usb): - atbm603x-xm530v200-x6c-weq (pad 87) - atbm603x-xm530v200-x2-wq2 (pad 82) - atbm603x-xm535d1-x6e-weq (pad 11) - atbm603x-xm535w1-x2w-wng (pad 163) - atbm606x-xm535d2-x9-we2q (no pad; its vendor loadpublic passes 255) Each loads the USB host, which load_xiongmai would only load after S40network: the vendor's dwc2 and xm_usb0. It then cycles the dongle's power pad as the vendor wifi_pdn.ko does (output high, 2 s, low, 2 s; the pads are its loadpublic's), loads the driver and waits for wlan0. load_xiongmai now modprobes dwc2 and xm_usb0, so a host the profile loaded is not loaded twice. atbm603x-generic-usb also takes atbm603x-comb-openipc's module when atbm-wifi's is not there, and atbm606x-generic-usb loads atbm606x's. SDIO (/etc/wireless/sdio): ssv6020-xm533-x3-wq-b loads xm_v200_sdio_wifi (OpenIPC/linux#156), which registers the XM533's SDIO0 Wi-Fi slot with power pad 166 and clock phase 0x170, then ssv6x5x with its cfg. The xm533 kernel config builds xm_v200_sdio_wifi. In qemu-bench: - xm530v200, wlandev=atbm603x-xm530v200-x6c-weq and wlanssid=OpenIPC, with its emulated AltoBeam dongle: at boot wlan0 joins, gets 192.168.50.15 by DHCP and takes the default route. - xm533, wlandev=ssv6020-xm533-x3-wq-b: the slot comes up as mmc0 (25 MHz from the 1.2 GHz PLL) and ssv6x5x binds it, beside the card slot's mmc1, which mounts its card. qemu-bench has no SSV6020, so there is no wlan0 there. --- .../board/xm530/xm533.generic.config | 1 + general/overlay/etc/wireless/sdio | 16 +++++ general/overlay/etc/wireless/usb | 65 ++++++++++++++++++- .../files/xm530v200/load_xiongmai | 5 +- .../files/xm535d1/load_xiongmai | 5 +- .../files/xm535d2/load_xiongmai | 5 +- .../files/xm535w1/load_xiongmai | 5 +- 7 files changed, 92 insertions(+), 10 deletions(-) diff --git a/br-ext-chip-xiongmai/board/xm530/xm533.generic.config b/br-ext-chip-xiongmai/board/xm530/xm533.generic.config index d9c91e75d..844e47007 100644 --- a/br-ext-chip-xiongmai/board/xm530/xm533.generic.config +++ b/br-ext-chip-xiongmai/board/xm530/xm533.generic.config @@ -1192,6 +1192,7 @@ CONFIG_MMC_ARASAN=y # CONFIG_MMC_WIFI is not set CONFIG_MMC_SD=m CONFIG_MMC_XM_V200_SD=m +CONFIG_MMC_XM_V200_SDIO_WIFI=m # CONFIG_MMC_ARMMMCI is not set # CONFIG_MMC_SDHCI is not set # CONFIG_MMC_SDHCI_PXAV3 is not set diff --git a/general/overlay/etc/wireless/sdio b/general/overlay/etc/wireless/sdio index 955032922..6c25844fe 100755 --- a/general/overlay/etc/wireless/sdio +++ b/general/overlay/etc/wireless/sdio @@ -83,4 +83,20 @@ if [ "$1" = "rtl8189ftv-t31-wyze-v3" ]; then exit 0 fi +# XM533 X3-WQ-B: SSV6020 ("SSV6158M") on SDIO0. xm_v200_sdio_wifi registers +# the slot, sets its clock and powers the chip up (power pad 166, clock phase +# 0x170, as its vendor loadpublic passes them); wlan0 appears once the card +# has enumerated and the driver has loaded its firmware. +if [ "$1" = "ssv6020-xm533-x3-wq-b" ]; then + modprobe xm_v200_sdio_wifi value=166 phase=0x170 + modprobe ssv6x5x stacfgpath=/etc/ssv6x5x-wifi.cfg || exit 1 + i=0 + while [ ! -e /sys/class/net/wlan0 ] && [ $i -lt 10 ]; do + sleep 1 + i=$((i + 1)) + done + [ -e /sys/class/net/wlan0 ] + exit $? +fi + exit 1 diff --git a/general/overlay/etc/wireless/usb b/general/overlay/etc/wireless/usb index 449f54d87..fb6bf0eea 100755 --- a/general/overlay/etc/wireless/usb +++ b/general/overlay/etc/wireless/usb @@ -41,9 +41,15 @@ if [ "$1" = "rtl8812au-generic" ]; then exit 0 fi -# Generic ATBM603x +# Generic ATBM603x: atbm-wifi's module, or atbm603x-comb-openipc's if [ "$1" = "atbm603x-generic-usb" ]; then - modprobe atbm603x_wifi_usb + modprobe atbm603x_wifi_usb 2>/dev/null || modprobe atbm603x_comb_wifi_usb + exit 0 +fi + +# Generic ATBM606x (Wi-Fi 6: ATBM6062, 6162, 6132-C) +if [ "$1" = "atbm606x-generic-usb" ]; then + modprobe atbm606x_wifi_usb exit 0 fi @@ -332,4 +338,59 @@ if [ "$1" = "rtl8188fu-t31-aoni-e97vj62" ]; then exit 0 fi +# Xiongmai V200 series. The USB host is the vendor's dwc2 and xm_usb0, which +# load_xiongmai only loads after S40network, so the profile loads them. The +# dongle's power pad is cycled as the vendor's wifi_pdn.ko does: output high +# (off) for 2 s, then low (on) for 2 s; pad register 0x10020000 + 4 * pad. +# $1: power pad, 0 for none. $2: driver module. +xm_v200_wifi() { + modprobe dwc2 + modprobe xm_usb0 + if [ "$1" -gt 0 ]; then + pad=$(printf 0x%x $((0x10020000 + $1 * 4))) + devmem "$pad" 32 0xc00 + sleep 2 + devmem "$pad" 32 0x400 + sleep 2 + fi + modprobe "$2" || return 1 + # wlan0 appears once the dongle has enumerated and taken its firmware + i=0 + while [ ! -e /sys/class/net/wlan0 ] && [ $i -lt 10 ]; do + sleep 1 + i=$((i + 1)) + done + [ -e /sys/class/net/wlan0 ] +} + +# XM530V200 X6C-WEQ: ATBM6012B-X +if [ "$1" = "atbm603x-xm530v200-x6c-weq" ]; then + xm_v200_wifi 87 atbm603x_comb_wifi_usb + exit $? +fi + +# XM530V200 X2-WQ2: XM713G +if [ "$1" = "atbm603x-xm530v200-x2-wq2" ]; then + xm_v200_wifi 82 atbm603x_comb_wifi_usb + exit $? +fi + +# XM535D1 X6E-WEQ: ATBM6012B-X +if [ "$1" = "atbm603x-xm535d1-x6e-weq" ]; then + xm_v200_wifi 11 atbm603x_comb_wifi_usb + exit $? +fi + +# XM535D2 X9-WE2Q: ATBM6132CU, no power pad (the vendor passes 255) +if [ "$1" = "atbm606x-xm535d2-x9-we2q" ]; then + xm_v200_wifi 0 atbm606x_wifi_usb + exit $? +fi + +# XM535W1 X2W-WNG: ATBM6012B-X +if [ "$1" = "atbm603x-xm535w1-x2w-wng" ]; then + xm_v200_wifi 163 atbm603x_comb_wifi_usb + exit $? +fi + exit 1 diff --git a/general/package/xiongmai-osdrv-xm530v200/files/xm530v200/load_xiongmai b/general/package/xiongmai-osdrv-xm530v200/files/xm530v200/load_xiongmai index 224dfc5a6..d53cc0302 100644 --- a/general/package/xiongmai-osdrv-xm530v200/files/xm530v200/load_xiongmai +++ b/general/package/xiongmai-osdrv-xm530v200/files/xm530v200/load_xiongmai @@ -60,8 +60,9 @@ insert_ko() { # The kernel's xm_v200_sd, not the vendor's sdio0_sd/sdio1_sd: those hand # the arasan driver their own kernel's platform data layout. modprobe xm_v200_sd detect=1 pdn="$SDIO_PDN" - insmod dwc2.ko - insmod xm_usb0.ko + # modprobe: a Wi-Fi profile (/etc/wireless/usb) may have loaded them already + modprobe dwc2 + modprobe xm_usb0 } remove_ko() { diff --git a/general/package/xiongmai-osdrv-xm530v200/files/xm535d1/load_xiongmai b/general/package/xiongmai-osdrv-xm530v200/files/xm535d1/load_xiongmai index 6ffffac4a..69bee8f32 100755 --- a/general/package/xiongmai-osdrv-xm530v200/files/xm535d1/load_xiongmai +++ b/general/package/xiongmai-osdrv-xm530v200/files/xm535d1/load_xiongmai @@ -66,8 +66,9 @@ insert_ko() { # The kernel's xm_v200_sd, not the vendor's sdio0_sd/sdio1_sd: those hand # the arasan driver their own kernel's platform data layout. modprobe xm_v200_sd detect=1 pdn="$SDIO_PDN" - insmod dwc2.ko - insmod xm_usb0.ko + # modprobe: a Wi-Fi profile (/etc/wireless/usb) may have loaded them already + modprobe dwc2 + modprobe xm_usb0 } remove_ko() { diff --git a/general/package/xiongmai-osdrv-xm530v200/files/xm535d2/load_xiongmai b/general/package/xiongmai-osdrv-xm530v200/files/xm535d2/load_xiongmai index 0846a16f7..0b6aef6cb 100755 --- a/general/package/xiongmai-osdrv-xm530v200/files/xm535d2/load_xiongmai +++ b/general/package/xiongmai-osdrv-xm530v200/files/xm535d2/load_xiongmai @@ -66,8 +66,9 @@ insert_ko() { # The kernel's xm_v200_sd, not the vendor's sdio0_sd/sdio1_sd: those hand # the arasan driver their own kernel's platform data layout. modprobe xm_v200_sd detect=1 pdn="$SDIO_PDN" - insmod dwc2.ko - insmod xm_usb0.ko + # modprobe: a Wi-Fi profile (/etc/wireless/usb) may have loaded them already + modprobe dwc2 + modprobe xm_usb0 } remove_ko() { diff --git a/general/package/xiongmai-osdrv-xm530v200/files/xm535w1/load_xiongmai b/general/package/xiongmai-osdrv-xm530v200/files/xm535w1/load_xiongmai index 0ab72a448..2db1665e7 100755 --- a/general/package/xiongmai-osdrv-xm530v200/files/xm535w1/load_xiongmai +++ b/general/package/xiongmai-osdrv-xm530v200/files/xm535w1/load_xiongmai @@ -71,8 +71,9 @@ insert_ko() { insmod adc.ko # No SD card: the X2W-WNG has no slot, and its firmware ships no SD # module to take the pads from. - insmod dwc2.ko - insmod xm_usb0.ko + # modprobe: a Wi-Fi profile (/etc/wireless/usb) may have loaded them already + modprobe dwc2 + modprobe xm_usb0 } remove_ko() { From 3703c6a42350570baa50563148ad1bdd2913b1c5 Mon Sep 17 00:00:00 2001 From: Dmitry Ermakov <7954832+dimerr@users.noreply.github.com> Date: Wed, 28 Oct 2026 11:57:28 +0000 Subject: [PATCH 6/6] atbm603x-comb-openipc: bump to the reviewed driver --- general/package/atbm603x-comb-openipc/atbm603x-comb-openipc.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/general/package/atbm603x-comb-openipc/atbm603x-comb-openipc.mk b/general/package/atbm603x-comb-openipc/atbm603x-comb-openipc.mk index 0b20e8590..91ce0573c 100644 --- a/general/package/atbm603x-comb-openipc/atbm603x-comb-openipc.mk +++ b/general/package/atbm603x-comb-openipc/atbm603x-comb-openipc.mk @@ -7,7 +7,7 @@ # OpenIPC/atbm_60xx's atbm603x_comb/ directory: AltoBeam's apollo driver # (DRIVER_VER 2874) with the AsmLite and Ares-B firmware, as Khadas ships it. ATBM603X_COMB_OPENIPC_SITE = $(call github,openipc,atbm_60xx,$(ATBM603X_COMB_OPENIPC_VERSION)) -ATBM603X_COMB_OPENIPC_VERSION = 9b636083a9298e1e42ba4fa916d10669737e883b +ATBM603X_COMB_OPENIPC_VERSION = 543b02dc8871a1bc4df90cd56e07305b95c3ec9c ATBM603X_COMB_OPENIPC_LICENSE = GPL-2.0