From 925cee33225dc750f506e37b22cad1d0eea1a5cd Mon Sep 17 00:00:00 2001 From: Miguel Fuertes Date: Tue, 21 Oct 2025 10:49:18 +0200 Subject: [PATCH 01/11] Add support for generic UF02 modem and update configuration files - Updated diffconfig to include CONFIG_TARGET_msm89xx_msm8916_DEVICE_generic-uf02 - Added new device definition for generic UF02 in msm8916.mk - Included msm8916-generic-mf68e.dtb and msm8916-generic-uf02.dtb in the Makefile - Created new diffconfig_uf02 file with necessary configurations - Added instructions for entering DIAG mode in enable_all_bands.md - Introduced device tree source for generic UF02 modem --- diffconfig | 3 +- diffconfig_uf02 | 95 +++++++++++++++++++ enable_all_bands.md | 12 +++ msm89xx/image/msm8916.mk | 12 +++ ...01-arm64-dts-qcom-add-mf68e-makefile.patch | 3 +- ...m64-dts-qcom-add-msm8916-generic-uf2.patch | 42 ++++++++ 6 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 diffconfig_uf02 create mode 100644 enable_all_bands.md create mode 100644 msm89xx/patches-6.12/804-arm64-dts-qcom-add-msm8916-generic-uf2.patch diff --git a/diffconfig b/diffconfig index 7d5ce74..973cd4a 100644 --- a/diffconfig +++ b/diffconfig @@ -1,7 +1,7 @@ CONFIG_TARGET_msm89xx=y CONFIG_TARGET_msm89xx_msm8916=y CONFIG_TARGET_msm89xx_msm8916_DEVICE_yiming-uz801v3=y -CONFIG_LIBQMI_COLLECTION_BASIC=y +CONFIG_LIBQMI_COLLECTION_FULL=y CONFIG_LIBQMI_WITH_MBIM_QMUX=y CONFIG_LIBQMI_WITH_QRTR_GLIB=y CONFIG_MODEMMANAGER_WITH_MBIM=y @@ -70,6 +70,7 @@ CONFIG_PACKAGE_modemmanager=y CONFIG_PACKAGE_mount-utils=y CONFIG_PACKAGE_mtools=y CONFIG_PACKAGE_nano=y +CONFIG_PACKAGE_qmi-utils=y CONFIG_PACKAGE_resize2fs=y CONFIG_PACKAGE_resolveip=y CONFIG_PACKAGE_rpcd=y diff --git a/diffconfig_uf02 b/diffconfig_uf02 new file mode 100644 index 0000000..c22f17f --- /dev/null +++ b/diffconfig_uf02 @@ -0,0 +1,95 @@ +CONFIG_TARGET_msm89xx=y +CONFIG_TARGET_msm89xx_msm8916=y +CONFIG_TARGET_msm89xx_msm8916_DEVICE_generic-uf02=y +CONFIG_BUSYBOX_CUSTOM=y +CONFIG_BUSYBOX_CONFIG_FBSET=y +CONFIG_BUSYBOX_CONFIG_USLEEP=y +CONFIG_LIBQMI_COLLECTION_FULL=y +CONFIG_LIBQMI_WITH_MBIM_QMUX=y +CONFIG_LIBQMI_WITH_QRTR_GLIB=y +CONFIG_MODEMMANAGER_WITH_MBIM=y +CONFIG_MODEMMANAGER_WITH_NETIFD=y +CONFIG_MODEMMANAGER_WITH_QMI=y +CONFIG_MODEMMANAGER_WITH_QRTR=y +CONFIG_PACKAGE_bash=y +CONFIG_PACKAGE_cgi-io=y +CONFIG_PACKAGE_dbus=y +CONFIG_PACKAGE_glib2=y +CONFIG_PACKAGE_ip-tiny=y +CONFIG_PACKAGE_kmod-crypto-kpp=y +CONFIG_PACKAGE_kmod-crypto-lib-chacha20=y +CONFIG_PACKAGE_kmod-crypto-lib-chacha20poly1305=y +CONFIG_PACKAGE_kmod-crypto-lib-curve25519=y +CONFIG_PACKAGE_kmod-crypto-lib-poly1305=y +CONFIG_PACKAGE_kmod-tun=y +CONFIG_PACKAGE_kmod-udptunnel4=y +CONFIG_PACKAGE_kmod-udptunnel6=y +CONFIG_PACKAGE_kmod-wireguard=y +CONFIG_PACKAGE_libattr=y +CONFIG_PACKAGE_libdbus=y +CONFIG_PACKAGE_libexpat=y +CONFIG_PACKAGE_libfdisk=y +CONFIG_PACKAGE_libffi=y +CONFIG_PACKAGE_libiwinfo=y +CONFIG_PACKAGE_libiwinfo-data=y +CONFIG_PACKAGE_liblua=y +CONFIG_PACKAGE_liblucihttp=y +CONFIG_PACKAGE_liblucihttp-lua=y +CONFIG_PACKAGE_liblucihttp-ucode=y +CONFIG_PACKAGE_libmbim=y +CONFIG_PACKAGE_libmount=y +CONFIG_PACKAGE_libncurses=y +CONFIG_PACKAGE_libpcre2=y +CONFIG_PACKAGE_libqmi=y +CONFIG_PACKAGE_libqrtr-glib=y +CONFIG_PACKAGE_libreadline=y +CONFIG_PACKAGE_libubus-lua=y +CONFIG_PACKAGE_lsblk=y +CONFIG_PACKAGE_lua=y +CONFIG_PACKAGE_luci=y +CONFIG_PACKAGE_luci-app-firewall=y +CONFIG_PACKAGE_luci-app-package-manager=y +CONFIG_PACKAGE_luci-app-usb-gadget=y +CONFIG_PACKAGE_luci-base=y +CONFIG_PACKAGE_luci-lib-base=y +CONFIG_PACKAGE_luci-lib-ip=y +CONFIG_PACKAGE_luci-lib-json=y +CONFIG_PACKAGE_luci-lib-jsonc=y +CONFIG_PACKAGE_luci-lib-nixio=y +CONFIG_PACKAGE_luci-lib-uqr=y +CONFIG_PACKAGE_luci-light=y +CONFIG_PACKAGE_luci-lua-runtime=y +CONFIG_PACKAGE_luci-mod-admin-full=y +CONFIG_PACKAGE_luci-mod-network=y +CONFIG_PACKAGE_luci-mod-rpc=y +CONFIG_PACKAGE_luci-mod-status=y +CONFIG_PACKAGE_luci-mod-system=y +CONFIG_PACKAGE_luci-proto-ipv6=y +CONFIG_PACKAGE_luci-proto-modemmanager=y +CONFIG_PACKAGE_luci-proto-ppp=y +CONFIG_PACKAGE_luci-proto-wireguard=y +CONFIG_PACKAGE_luci-theme-bootstrap=y +CONFIG_PACKAGE_modemmanager=y +CONFIG_PACKAGE_mount-utils=y +CONFIG_PACKAGE_mtools=y +CONFIG_PACKAGE_nano=y +CONFIG_PACKAGE_qmi-utils=y +CONFIG_PACKAGE_resize2fs=y +CONFIG_PACKAGE_resolveip=y +CONFIG_PACKAGE_rpcd=y +CONFIG_PACKAGE_rpcd-mod-file=y +CONFIG_PACKAGE_rpcd-mod-iwinfo=y +CONFIG_PACKAGE_rpcd-mod-luci=y +CONFIG_PACKAGE_rpcd-mod-rrdns=y +CONFIG_PACKAGE_rpcd-mod-ucode=y +CONFIG_PACKAGE_sfdisk=y +CONFIG_PACKAGE_terminfo=y +CONFIG_PACKAGE_tune2fs=y +CONFIG_PACKAGE_ucode-mod-html=y +CONFIG_PACKAGE_ucode-mod-log=y +CONFIG_PACKAGE_ucode-mod-lua=y +CONFIG_PACKAGE_ucode-mod-math=y +CONFIG_PACKAGE_uhttpd=y +CONFIG_PACKAGE_uhttpd-mod-ubus=y +CONFIG_PACKAGE_wireguard-tools=y +# CONFIG_TARGET_ROOTFS_EXT4FS is not set diff --git a/enable_all_bands.md b/enable_all_bands.md new file mode 100644 index 0000000..2b5d476 --- /dev/null +++ b/enable_all_bands.md @@ -0,0 +1,12 @@ +### Enter DIAG +```shell +adb shell +setprop service.adb.root 1; busybox killall adbd +adb shell +setprop sys.usb.config diag,adb + +adb shell "setprop service.adb.root 1; busybox killall adbd" +adb shell "setprop sys.usb.config diag,adb" +``` + +> If in linux, now connect to Windows VM and open QXDM \ No newline at end of file diff --git a/msm89xx/image/msm8916.mk b/msm89xx/image/msm8916.mk index bb98ec5..4277a53 100644 --- a/msm89xx/image/msm8916.mk +++ b/msm89xx/image/msm8916.mk @@ -39,6 +39,18 @@ define Device/yiming-uz801v3 endef TARGET_DEVICES += yiming-uz801v3 +define Device/generic-uf02 + $(Device/msm8916) + DEVICE_VENDOR := Generic + DEVICE_MODEL := UF02 (250605 V0S) + FILESYSTEMS := squashfs + DEVICE_PACKAGES := configs-uz801 wpad-basic-wolfssl rmtfs uci-usb-gadget \ + block-mount f2fs-tools prepare-rootfs-data \ + msm-firmware-dumper ledcontrol +endef +TARGET_DEVICES += generic-uf02 + + define Device/generic-mf68e $(Device/msm8916) DEVICE_VENDOR := Generic diff --git a/msm89xx/patches-6.12/801-arm64-dts-qcom-add-mf68e-makefile.patch b/msm89xx/patches-6.12/801-arm64-dts-qcom-add-mf68e-makefile.patch index febf68a..dfda770 100644 --- a/msm89xx/patches-6.12/801-arm64-dts-qcom-add-mf68e-makefile.patch +++ b/msm89xx/patches-6.12/801-arm64-dts-qcom-add-mf68e-makefile.patch @@ -11,11 +11,12 @@ Signed-off-by: hkfuertes --- a/arch/arm64/boot/dts/qcom/Makefile +++ b/arch/arm64/boot/dts/qcom/Makefile -@@ -23,6 +23,7 @@ dtb-$(CONFIG_ARCH_QCOM) += msm8916-samsu +@@ -23,6 +23,8 @@ dtb-$(CONFIG_ARCH_QCOM) += msm8916-samsu dtb-$(CONFIG_ARCH_QCOM) += msm8916-samsung-gt58.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-samsung-j3ltetw.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-samsung-j5.dtb +dtb-$(CONFIG_ARCH_QCOM) += msm8916-generic-mf68e.dtb ++dtb-$(CONFIG_ARCH_QCOM) += msm8916-generic-uf02.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-samsung-j5x.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-samsung-rossa.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-samsung-serranove.dtb diff --git a/msm89xx/patches-6.12/804-arm64-dts-qcom-add-msm8916-generic-uf2.patch b/msm89xx/patches-6.12/804-arm64-dts-qcom-add-msm8916-generic-uf2.patch new file mode 100644 index 0000000..9414c1a --- /dev/null +++ b/msm89xx/patches-6.12/804-arm64-dts-qcom-add-msm8916-generic-uf2.patch @@ -0,0 +1,42 @@ +--- /dev/null ++++ b/arch/arm64/boot/dts/qcom/msm8916-generic-uf02.dts +@@ -0,0 +1,39 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++ ++/dts-v1/; ++ ++#include "msm8916-ufi.dtsi" ++ ++#include ++ ++/ { ++ model = "UF02 4G Modem Stick"; ++ compatible = "uf02,250605v0s", "qcom,msm8916"; ++}; ++ ++&button_restart { ++ gpios = <&tlmm 23 GPIO_ACTIVE_LOW>; ++}; ++ ++&led_r { ++ gpios = <&tlmm 72 GPIO_ACTIVE_HIGH>; ++}; ++ ++&led_g { ++ function = LED_FUNCTION_WAN; ++ gpios = <&tlmm 71 GPIO_ACTIVE_HIGH>; ++}; ++ ++&led_b { ++ function = LED_FUNCTION_WLAN; ++ gpios = <&tlmm 73 GPIO_ACTIVE_HIGH>; ++}; ++ ++&button_default { ++ pins = "gpio23"; ++ bias-pull-up; ++}; ++ ++&gpio_leds_default { ++ pins = "gpio71", "gpio72", "gpio73"; ++}; From 296cf25b5acb3244acc81ffe809d578eb5a40c03 Mon Sep 17 00:00:00 2001 From: Miguel Fuertes Date: Tue, 21 Oct 2025 18:08:02 +0200 Subject: [PATCH 02/11] Add support for generic M9S device and update Makefile entries --- diffconfig_m9s | 94 ++++++++++++++ msm89xx/image/msm8916.mk | 11 ++ ...arm64-dts-qcom-add-devices-makefile.patch} | 3 +- ...m64-dts-qcom-add-msm8916-generic-m9s.patch | 120 ++++++++++++++++++ 4 files changed, 227 insertions(+), 1 deletion(-) create mode 100644 diffconfig_m9s rename msm89xx/patches-6.12/{801-arm64-dts-qcom-add-mf68e-makefile.patch => 801-arm64-dts-qcom-add-devices-makefile.patch} (88%) create mode 100644 msm89xx/patches-6.12/805-arm64-dts-qcom-add-msm8916-generic-m9s.patch diff --git a/diffconfig_m9s b/diffconfig_m9s new file mode 100644 index 0000000..3664dda --- /dev/null +++ b/diffconfig_m9s @@ -0,0 +1,94 @@ +CONFIG_TARGET_msm89xx=y +CONFIG_TARGET_msm89xx_msm8916=y +CONFIG_TARGET_msm89xx_msm8916_DEVICE_generic-m9s=y +CONFIG_BUSYBOX_CUSTOM=y +CONFIG_BUSYBOX_CONFIG_FBSET=y +CONFIG_BUSYBOX_CONFIG_USLEEP=y +CONFIG_LIBQMI_COLLECTION_BASIC=y +CONFIG_LIBQMI_WITH_MBIM_QMUX=y +CONFIG_LIBQMI_WITH_QRTR_GLIB=y +CONFIG_MODEMMANAGER_WITH_MBIM=y +CONFIG_MODEMMANAGER_WITH_NETIFD=y +CONFIG_MODEMMANAGER_WITH_QMI=y +CONFIG_MODEMMANAGER_WITH_QRTR=y +CONFIG_PACKAGE_bash=y +CONFIG_PACKAGE_cgi-io=y +CONFIG_PACKAGE_dbus=y +CONFIG_PACKAGE_glib2=y +CONFIG_PACKAGE_ip-tiny=y +CONFIG_PACKAGE_kmod-crypto-kpp=y +CONFIG_PACKAGE_kmod-crypto-lib-chacha20=y +CONFIG_PACKAGE_kmod-crypto-lib-chacha20poly1305=y +CONFIG_PACKAGE_kmod-crypto-lib-curve25519=y +CONFIG_PACKAGE_kmod-crypto-lib-poly1305=y +CONFIG_PACKAGE_kmod-tun=y +CONFIG_PACKAGE_kmod-udptunnel4=y +CONFIG_PACKAGE_kmod-udptunnel6=y +CONFIG_PACKAGE_kmod-wireguard=y +CONFIG_PACKAGE_libattr=y +CONFIG_PACKAGE_libdbus=y +CONFIG_PACKAGE_libexpat=y +CONFIG_PACKAGE_libfdisk=y +CONFIG_PACKAGE_libffi=y +CONFIG_PACKAGE_libiwinfo=y +CONFIG_PACKAGE_libiwinfo-data=y +CONFIG_PACKAGE_liblua=y +CONFIG_PACKAGE_liblucihttp=y +CONFIG_PACKAGE_liblucihttp-lua=y +CONFIG_PACKAGE_liblucihttp-ucode=y +CONFIG_PACKAGE_libmbim=y +CONFIG_PACKAGE_libmount=y +CONFIG_PACKAGE_libncurses=y +CONFIG_PACKAGE_libpcre2=y +CONFIG_PACKAGE_libqmi=y +CONFIG_PACKAGE_libqrtr-glib=y +CONFIG_PACKAGE_libreadline=y +CONFIG_PACKAGE_libubus-lua=y +CONFIG_PACKAGE_lsblk=y +CONFIG_PACKAGE_lua=y +CONFIG_PACKAGE_luci=y +CONFIG_PACKAGE_luci-app-firewall=y +CONFIG_PACKAGE_luci-app-package-manager=y +CONFIG_PACKAGE_luci-app-usb-gadget=y +CONFIG_PACKAGE_luci-base=y +CONFIG_PACKAGE_luci-lib-base=y +CONFIG_PACKAGE_luci-lib-ip=y +CONFIG_PACKAGE_luci-lib-json=y +CONFIG_PACKAGE_luci-lib-jsonc=y +CONFIG_PACKAGE_luci-lib-nixio=y +CONFIG_PACKAGE_luci-lib-uqr=y +CONFIG_PACKAGE_luci-light=y +CONFIG_PACKAGE_luci-lua-runtime=y +CONFIG_PACKAGE_luci-mod-admin-full=y +CONFIG_PACKAGE_luci-mod-network=y +CONFIG_PACKAGE_luci-mod-rpc=y +CONFIG_PACKAGE_luci-mod-status=y +CONFIG_PACKAGE_luci-mod-system=y +CONFIG_PACKAGE_luci-proto-ipv6=y +CONFIG_PACKAGE_luci-proto-modemmanager=y +CONFIG_PACKAGE_luci-proto-ppp=y +CONFIG_PACKAGE_luci-proto-wireguard=y +CONFIG_PACKAGE_luci-theme-bootstrap=y +CONFIG_PACKAGE_modemmanager=y +CONFIG_PACKAGE_mount-utils=y +CONFIG_PACKAGE_mtools=y +CONFIG_PACKAGE_nano=y +CONFIG_PACKAGE_resize2fs=y +CONFIG_PACKAGE_resolveip=y +CONFIG_PACKAGE_rpcd=y +CONFIG_PACKAGE_rpcd-mod-file=y +CONFIG_PACKAGE_rpcd-mod-iwinfo=y +CONFIG_PACKAGE_rpcd-mod-luci=y +CONFIG_PACKAGE_rpcd-mod-rrdns=y +CONFIG_PACKAGE_rpcd-mod-ucode=y +CONFIG_PACKAGE_sfdisk=y +CONFIG_PACKAGE_terminfo=y +CONFIG_PACKAGE_tune2fs=y +CONFIG_PACKAGE_ucode-mod-html=y +CONFIG_PACKAGE_ucode-mod-log=y +CONFIG_PACKAGE_ucode-mod-lua=y +CONFIG_PACKAGE_ucode-mod-math=y +CONFIG_PACKAGE_uhttpd=y +CONFIG_PACKAGE_uhttpd-mod-ubus=y +CONFIG_PACKAGE_wireguard-tools=y +# CONFIG_TARGET_ROOTFS_EXT4FS is not set diff --git a/msm89xx/image/msm8916.mk b/msm89xx/image/msm8916.mk index 4277a53..77c61c1 100644 --- a/msm89xx/image/msm8916.mk +++ b/msm89xx/image/msm8916.mk @@ -63,4 +63,15 @@ define Device/generic-mf68e endef TARGET_DEVICES += generic-mf68e +define Device/generic-m9s + $(Device/msm8916) + DEVICE_VENDOR := Generic + DEVICE_MODEL := M9S + FILESYSTEMS := squashfs + DEVICE_PACKAGES := configs-mf68e wpad-basic-wolfssl rmtfs uci-usb-gadget \ + block-mount f2fs-tools prepare-rootfs-data \ + msm-firmware-dumper ledcontrol +endef +TARGET_DEVICES += generic-m9s + endif diff --git a/msm89xx/patches-6.12/801-arm64-dts-qcom-add-mf68e-makefile.patch b/msm89xx/patches-6.12/801-arm64-dts-qcom-add-devices-makefile.patch similarity index 88% rename from msm89xx/patches-6.12/801-arm64-dts-qcom-add-mf68e-makefile.patch rename to msm89xx/patches-6.12/801-arm64-dts-qcom-add-devices-makefile.patch index dfda770..32dedca 100644 --- a/msm89xx/patches-6.12/801-arm64-dts-qcom-add-mf68e-makefile.patch +++ b/msm89xx/patches-6.12/801-arm64-dts-qcom-add-devices-makefile.patch @@ -11,12 +11,13 @@ Signed-off-by: hkfuertes --- a/arch/arm64/boot/dts/qcom/Makefile +++ b/arch/arm64/boot/dts/qcom/Makefile -@@ -23,6 +23,8 @@ dtb-$(CONFIG_ARCH_QCOM) += msm8916-samsu +@@ -23,6 +23,9 @@ dtb-$(CONFIG_ARCH_QCOM) += msm8916-samsu dtb-$(CONFIG_ARCH_QCOM) += msm8916-samsung-gt58.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-samsung-j3ltetw.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-samsung-j5.dtb +dtb-$(CONFIG_ARCH_QCOM) += msm8916-generic-mf68e.dtb +dtb-$(CONFIG_ARCH_QCOM) += msm8916-generic-uf02.dtb ++dtb-$(CONFIG_ARCH_QCOM) += msm8916-generic-m9s.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-samsung-j5x.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-samsung-rossa.dtb dtb-$(CONFIG_ARCH_QCOM) += msm8916-samsung-serranove.dtb diff --git a/msm89xx/patches-6.12/805-arm64-dts-qcom-add-msm8916-generic-m9s.patch b/msm89xx/patches-6.12/805-arm64-dts-qcom-add-msm8916-generic-m9s.patch new file mode 100644 index 0000000..92f9145 --- /dev/null +++ b/msm89xx/patches-6.12/805-arm64-dts-qcom-add-msm8916-generic-m9s.patch @@ -0,0 +1,120 @@ +--- /dev/null ++++ b/arch/arm64/boot/dts/qcom/msm8916-generic-m9s.dts +@@ -0,0 +1,117 @@ ++// SPDX-License-Identifier: GPL-2.0-only ++ ++/dts-v1/; ++ ++#include "msm8916-ufi.dtsi" ++ ++#include ++ ++/ { ++ model = "M9S 4G LTE Mobile WiFi Router"; ++ compatible = "generic,m9s", "qcom,msm8916"; ++ ++ /* Batería - Voltaje máximo corregido a 4.4V */ ++ bat: battery { ++ compatible = "simple-battery"; ++ voltage-min-design-microvolt = <3400000>; ++ voltage-max-design-microvolt = <4400000>; ++ energy-full-design-microwatt-hours = <11100000>; ++ charge-full-design-microamp-hours = <3000000>; ++ ++ ocv-capacity-celsius = <25>; ++ ocv-capacity-table-0 = <4330000 100>, <4265000 95>, ++ <4208000 90>, <4154000 85>, <4102000 80>, ++ <4063000 75>, <4006000 70>, <3972000 65>, ++ <3931000 60>, <3880000 55>, <3841000 50>, ++ <3817000 45>, <3798000 40>, <3783000 35>, ++ <3767000 30>, <3747000 25>, <3729000 20>, ++ <3700000 16>, <3687000 13>, <3683000 11>, ++ <3681000 10>, <3680000 9>, <3678000 8>, ++ <3674000 7>, <3666000 6>, <3641000 5>, ++ <3597000 4>, <3537000 3>, <3457000 2>, ++ <3336000 1>, <3000000 0>; ++ }; ++ ++ /* USB ID detection - GPIO 110 */ ++ usb_id: usb-id { ++ compatible = "linux,extcon-usb-gpio"; ++ id-gpios = <&tlmm 110 GPIO_ACTIVE_HIGH>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&usb_id_default>; ++ }; ++ ++ /* LED WLAN rojo (componente rojo del LED bicolor) */ ++ leds-extra { ++ compatible = "gpio-leds"; ++ ++ led-wlan-red { ++ function = LED_FUNCTION_WLAN; ++ color = ; ++ gpios = <&tlmm 84 GPIO_ACTIVE_HIGH>; ++ }; ++ }; ++}; ++ ++/* USB con extcon */ ++&usb { ++ extcon = <&usb_id>, <&usb_id>; ++}; ++ ++&usb_hs_phy { ++ extcon = <&usb_id>; ++}; ++ ++/* Botón Reset - GPIO 102 */ ++&button_restart { ++ gpios = <&tlmm 102 GPIO_ACTIVE_LOW>; ++}; ++ ++/* LEDs - 2 LEDs bicolores (WAN y WLAN) = 4 componentes */ ++ ++/* LED WAN rojo (componente rojo del bicolor) */ ++&led_r { ++ function = LED_FUNCTION_WAN; ++ color = ; ++ gpios = <&tlmm 72 GPIO_ACTIVE_HIGH>; ++}; ++ ++/* LED WLAN verde (componente verde del bicolor) */ ++&led_g { ++ function = LED_FUNCTION_WLAN; ++ color = ; ++ gpios = <&tlmm 73 GPIO_ACTIVE_HIGH>; ++}; ++ ++/* LED WAN verde (componente verde del bicolor) */ ++&led_b { ++ function = LED_FUNCTION_WAN; ++ color = ; ++ gpios = <&tlmm 85 GPIO_ACTIVE_HIGH>; ++}; ++ ++/* BMS y Charger */ ++&pm8916_bms { ++ monitored-battery = <&bat>; ++}; ++ ++&pm8916_charger { ++ qcom,fast-charge-safe-voltage = <4400000>; ++}; ++ ++/* Pinctrl definitions */ ++&tlmm { ++ usb_id_default: usb-id-default-state { ++ pins = "gpio110"; ++ function = "gpio"; ++ drive-strength = <8>; ++ bias-pull-up; ++ }; ++}; ++ ++&button_default { ++ pins = "gpio102"; ++}; ++ ++&gpio_leds_default { ++ pins = "gpio72", "gpio73", "gpio84", "gpio85"; ++}; From c768a292460e115a76d26fe992bfe564659fe679 Mon Sep 17 00:00:00 2001 From: Miguel Fuertes Date: Tue, 21 Oct 2025 19:38:46 +0200 Subject: [PATCH 03/11] leds ok --- ...m64-dts-qcom-add-msm8916-generic-m9s.patch | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/msm89xx/patches-6.12/805-arm64-dts-qcom-add-msm8916-generic-m9s.patch b/msm89xx/patches-6.12/805-arm64-dts-qcom-add-msm8916-generic-m9s.patch index 92f9145..f8bcc5b 100644 --- a/msm89xx/patches-6.12/805-arm64-dts-qcom-add-msm8916-generic-m9s.patch +++ b/msm89xx/patches-6.12/805-arm64-dts-qcom-add-msm8916-generic-m9s.patch @@ -1,6 +1,6 @@ --- /dev/null +++ b/arch/arm64/boot/dts/qcom/msm8916-generic-m9s.dts -@@ -0,0 +1,117 @@ +@@ -0,0 +1,118 @@ +// SPDX-License-Identifier: GPL-2.0-only + +/dts-v1/; @@ -13,7 +13,6 @@ + model = "M9S 4G LTE Mobile WiFi Router"; + compatible = "generic,m9s", "qcom,msm8916"; + -+ /* Batería - Voltaje máximo corregido a 4.4V */ + bat: battery { + compatible = "simple-battery"; + voltage-min-design-microvolt = <3400000>; @@ -35,7 +34,6 @@ + <3336000 1>, <3000000 0>; + }; + -+ /* USB ID detection - GPIO 110 */ + usb_id: usb-id { + compatible = "linux,extcon-usb-gpio"; + id-gpios = <&tlmm 110 GPIO_ACTIVE_HIGH>; @@ -43,7 +41,6 @@ + pinctrl-0 = <&usb_id_default>; + }; + -+ /* LED WLAN rojo (componente rojo del LED bicolor) */ + leds-extra { + compatible = "gpio-leds"; + @@ -52,10 +49,22 @@ + color = ; + gpios = <&tlmm 84 GPIO_ACTIVE_HIGH>; + }; ++ ++ led-wan-green { ++ function = LED_FUNCTION_WAN; ++ color = ; ++ gpios = <&tlmm 85 GPIO_ACTIVE_HIGH>; ++ }; ++ ++ led-battery-green { ++ function = LED_FUNCTION_CHARGING; ++ color = ; ++ gpios = <&tlmm 0 GPIO_ACTIVE_HIGH>; ++ default-state = "on"; ++ }; + }; +}; + -+/* USB con extcon */ +&usb { + extcon = <&usb_id>, <&usb_id>; +}; @@ -64,35 +73,28 @@ + extcon = <&usb_id>; +}; + -+/* Botón Reset - GPIO 102 */ +&button_restart { + gpios = <&tlmm 102 GPIO_ACTIVE_LOW>; +}; + -+/* LEDs - 2 LEDs bicolores (WAN y WLAN) = 4 componentes */ -+ -+/* LED WAN rojo (componente rojo del bicolor) */ +&led_r { + function = LED_FUNCTION_WAN; + color = ; + gpios = <&tlmm 72 GPIO_ACTIVE_HIGH>; +}; + -+/* LED WLAN verde (componente verde del bicolor) */ +&led_g { + function = LED_FUNCTION_WLAN; + color = ; + gpios = <&tlmm 73 GPIO_ACTIVE_HIGH>; +}; + -+/* LED WAN verde (componente verde del bicolor) */ +&led_b { -+ function = LED_FUNCTION_WAN; -+ color = ; -+ gpios = <&tlmm 85 GPIO_ACTIVE_HIGH>; ++ function = LED_FUNCTION_CHARGING; ++ color = ; ++ gpios = <&tlmm 1 GPIO_ACTIVE_HIGH>; +}; + -+/* BMS y Charger */ +&pm8916_bms { + monitored-battery = <&bat>; +}; @@ -101,7 +103,6 @@ + qcom,fast-charge-safe-voltage = <4400000>; +}; + -+/* Pinctrl definitions */ +&tlmm { + usb_id_default: usb-id-default-state { + pins = "gpio110"; @@ -116,5 +117,5 @@ +}; + +&gpio_leds_default { -+ pins = "gpio72", "gpio73", "gpio84", "gpio85"; ++ pins = "gpio0", "gpio1", "gpio72", "gpio73", "gpio84", "gpio85"; +}; From e451099d6de7746ed4da8a7b7c66bbfcc080a8a7 Mon Sep 17 00:00:00 2001 From: Miguel Fuertes Date: Tue, 21 Oct 2025 19:39:55 +0200 Subject: [PATCH 04/11] Add OpenWrt Builder workflows for M9S and UF02 devices --- .github/workflows/m9s.yml | 97 ++++++++++++++++++++++++++++++++++++++ .github/workflows/uf02.yml | 97 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 194 insertions(+) create mode 100644 .github/workflows/m9s.yml create mode 100644 .github/workflows/uf02.yml diff --git a/.github/workflows/m9s.yml b/.github/workflows/m9s.yml new file mode 100644 index 0000000..16f5e5f --- /dev/null +++ b/.github/workflows/m9s.yml @@ -0,0 +1,97 @@ +name: OpenWrt Builder (M9S) +on: + repository_dispatch: + workflow_dispatch: + +env: + UPLOAD_BIN_DIR: true + UPLOAD_FIRMWARE: true + UPLOAD_RELEASE: false + TZ: Europe/Madrid + +jobs: + build: + runs-on: ubuntu-22.04 + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Initialization environment + env: + DEBIAN_FRONTEND: noninteractive + run: | + sudo rm -rf /etc/apt/sources.list.d/* /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache/CodeQL + sudo docker image prune --all --force + sudo -E apt-get -qq update + sudo -E ./devenv/dependencies.sh + sudo -E apt-get -qq autoremove --purge + sudo -E apt-get -qq clean + sudo timedatectl set-timezone "$TZ" + + - name: "Clone OpenWrt source code" + run: | + df -hT $PWD + git clone --depth=1 --branch "main" https://git.openwrt.org/openwrt/openwrt.git openwrt + + - name: Load msm89xx target and uz801 packages + run: | + git apply --unsafe-paths enable_wcn36xx_mac80211.patch + mv msm89xx openwrt/target/linux/msm89xx + mv packages openwrt/package/uz801 + if [ "${{ inputs.openwrt_version }}" == "openwrt-24.10" ]; then + sed -i '/^KERNEL_PATCHVER/c\KERNEL_PATCHVER:=6.6' openwrt/target/linux/msm89xx/Makefile + fi + + - name: Update and install feeds + run: | + cd openwrt + rm -rf tmp + ./scripts/feeds update -a + ./scripts/feeds install -a + + - name: "Load diffconfig" + run: | + [ -f diffconfig_m9s ] && mv diffconfig_m9s openwrt/.config + + - name: Download package + id: package + run: | + cd openwrt + make defconfig + make download -j8 + find dl -size -1024c -exec ls -l {} \; || true + find dl -size -1024c -exec rm -f {} \; || true + + - name: Compile the firmware + id: compile + run: | + cd openwrt + echo -e "$(nproc) thread compile" + make -j$(nproc) || make -j1 || make -j1 V=s + echo "status=success" >> $GITHUB_OUTPUT + grep '^CONFIG_TARGET.*DEVICE.*=y' .config | sed -r 's/.*DEVICE_(.*)=y/\1/' > DEVICE_NAME + [ -s DEVICE_NAME ] && echo "DEVICE_NAME=$(cat DEVICE_NAME)" >> $GITHUB_ENV + echo "FILE_DATE=$(date +"%Y%m%d%H%M")" >> $GITHUB_ENV + + - name: Organize files + id: organize + if: env.UPLOAD_FIRMWARE == 'true' && !cancelled() + run: | + cd openwrt/bin/targets/*/* + rm -rf packages + echo "FIRMWARE=$PWD" >> $GITHUB_ENV + echo "status=success" >> $GITHUB_OUTPUT + + - name: Upload firmware + uses: actions/upload-artifact@v4 + if: steps.organize.outputs.status == 'success' && !cancelled() + with: + name: openwrt_firmware_${{ env.DEVICE_NAME }}_${{ env.FILE_DATE }} + path: | + ${{ env.FIRMWARE }}/openwrt-msm89xx-msm8916-yiming-uz801v3-squashfs-gpt_both0.bin + ${{ env.FIRMWARE }}/openwrt-msm89xx-msm8916-yiming-uz801v3-squashfs-boot.img + ${{ env.FIRMWARE }}/openwrt-msm89xx-msm8916-yiming-uz801v3-squashfs-system.img + ${{ env.FIRMWARE }}/openwrt-msm89xx-msm8916-yiming-uz801v3.manifest + ${{ env.FIRMWARE }}/openwrt-msm89xx-msm8916-yiming-uz801v3-flash.sh + ${{ env.FIRMWARE }}/openwrt-msm89xx-msm8916-yiming-uz801v3-firmware.zip diff --git a/.github/workflows/uf02.yml b/.github/workflows/uf02.yml new file mode 100644 index 0000000..a53fdb8 --- /dev/null +++ b/.github/workflows/uf02.yml @@ -0,0 +1,97 @@ +name: OpenWrt Builder (UF02) +on: + repository_dispatch: + workflow_dispatch: + +env: + UPLOAD_BIN_DIR: true + UPLOAD_FIRMWARE: true + UPLOAD_RELEASE: false + TZ: Europe/Madrid + +jobs: + build: + runs-on: ubuntu-22.04 + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Initialization environment + env: + DEBIAN_FRONTEND: noninteractive + run: | + sudo rm -rf /etc/apt/sources.list.d/* /usr/share/dotnet /usr/local/lib/android /opt/ghc /opt/hostedtoolcache/CodeQL + sudo docker image prune --all --force + sudo -E apt-get -qq update + sudo -E ./devenv/dependencies.sh + sudo -E apt-get -qq autoremove --purge + sudo -E apt-get -qq clean + sudo timedatectl set-timezone "$TZ" + + - name: "Clone OpenWrt source code" + run: | + df -hT $PWD + git clone --depth=1 --branch "main" https://git.openwrt.org/openwrt/openwrt.git openwrt + + - name: Load msm89xx target and uz801 packages + run: | + git apply --unsafe-paths enable_wcn36xx_mac80211.patch + mv msm89xx openwrt/target/linux/msm89xx + mv packages openwrt/package/uz801 + if [ "${{ inputs.openwrt_version }}" == "openwrt-24.10" ]; then + sed -i '/^KERNEL_PATCHVER/c\KERNEL_PATCHVER:=6.6' openwrt/target/linux/msm89xx/Makefile + fi + + - name: Update and install feeds + run: | + cd openwrt + rm -rf tmp + ./scripts/feeds update -a + ./scripts/feeds install -a + + - name: "Load diffconfig" + run: | + [ -f diffconfig_uf02 ] && mv diffconfig_uf02 openwrt/.config + + - name: Download package + id: package + run: | + cd openwrt + make defconfig + make download -j8 + find dl -size -1024c -exec ls -l {} \; || true + find dl -size -1024c -exec rm -f {} \; || true + + - name: Compile the firmware + id: compile + run: | + cd openwrt + echo -e "$(nproc) thread compile" + make -j$(nproc) || make -j1 || make -j1 V=s + echo "status=success" >> $GITHUB_OUTPUT + grep '^CONFIG_TARGET.*DEVICE.*=y' .config | sed -r 's/.*DEVICE_(.*)=y/\1/' > DEVICE_NAME + [ -s DEVICE_NAME ] && echo "DEVICE_NAME=$(cat DEVICE_NAME)" >> $GITHUB_ENV + echo "FILE_DATE=$(date +"%Y%m%d%H%M")" >> $GITHUB_ENV + + - name: Organize files + id: organize + if: env.UPLOAD_FIRMWARE == 'true' && !cancelled() + run: | + cd openwrt/bin/targets/*/* + rm -rf packages + echo "FIRMWARE=$PWD" >> $GITHUB_ENV + echo "status=success" >> $GITHUB_OUTPUT + + - name: Upload firmware + uses: actions/upload-artifact@v4 + if: steps.organize.outputs.status == 'success' && !cancelled() + with: + name: openwrt_firmware_${{ env.DEVICE_NAME }}_${{ env.FILE_DATE }} + path: | + ${{ env.FIRMWARE }}/openwrt-msm89xx-msm8916-yiming-uz801v3-squashfs-gpt_both0.bin + ${{ env.FIRMWARE }}/openwrt-msm89xx-msm8916-yiming-uz801v3-squashfs-boot.img + ${{ env.FIRMWARE }}/openwrt-msm89xx-msm8916-yiming-uz801v3-squashfs-system.img + ${{ env.FIRMWARE }}/openwrt-msm89xx-msm8916-yiming-uz801v3.manifest + ${{ env.FIRMWARE }}/openwrt-msm89xx-msm8916-yiming-uz801v3-flash.sh + ${{ env.FIRMWARE }}/openwrt-msm89xx-msm8916-yiming-uz801v3-firmware.zip From 4c162d35766c6904ccd1242409a812859d1feaa0 Mon Sep 17 00:00:00 2001 From: Miguel Fuertes Date: Tue, 21 Oct 2025 20:56:15 +0200 Subject: [PATCH 05/11] Add battery monitoring and LED control features for M9S device --- diffconfig_m9s | 3 + ...m64-dts-qcom-add-msm8916-generic-m9s.patch | 10 +- packages/configs-mf68e/files/rc.button.power | 13 -- packages/ledcontrol/Makefile | 10 +- packages/ledcontrol/files/50-battery-show | 16 +++ packages/ledcontrol/files/99-modem-led | 2 + .../ledcontrol/files/battery-monitor.init | 101 +++++++++++++ packages/ledcontrol/files/ledcontrol | 87 ----------- packages/ledcontrol/files/ledcontrol.sh | 136 ++++++++++++++++++ 9 files changed, 275 insertions(+), 103 deletions(-) create mode 100644 packages/ledcontrol/files/50-battery-show create mode 100644 packages/ledcontrol/files/battery-monitor.init delete mode 100644 packages/ledcontrol/files/ledcontrol create mode 100644 packages/ledcontrol/files/ledcontrol.sh diff --git a/diffconfig_m9s b/diffconfig_m9s index 3664dda..d986a7c 100644 --- a/diffconfig_m9s +++ b/diffconfig_m9s @@ -15,6 +15,8 @@ CONFIG_PACKAGE_bash=y CONFIG_PACKAGE_cgi-io=y CONFIG_PACKAGE_dbus=y CONFIG_PACKAGE_glib2=y +CONFIG_PACKAGE_inotifywait=y +CONFIG_PACKAGE_inotifywatch=y CONFIG_PACKAGE_ip-tiny=y CONFIG_PACKAGE_kmod-crypto-kpp=y CONFIG_PACKAGE_kmod-crypto-lib-chacha20=y @@ -30,6 +32,7 @@ CONFIG_PACKAGE_libdbus=y CONFIG_PACKAGE_libexpat=y CONFIG_PACKAGE_libfdisk=y CONFIG_PACKAGE_libffi=y +CONFIG_PACKAGE_libinotifytools=y CONFIG_PACKAGE_libiwinfo=y CONFIG_PACKAGE_libiwinfo-data=y CONFIG_PACKAGE_liblua=y diff --git a/msm89xx/patches-6.12/805-arm64-dts-qcom-add-msm8916-generic-m9s.patch b/msm89xx/patches-6.12/805-arm64-dts-qcom-add-msm8916-generic-m9s.patch index f8bcc5b..d303884 100644 --- a/msm89xx/patches-6.12/805-arm64-dts-qcom-add-msm8916-generic-m9s.patch +++ b/msm89xx/patches-6.12/805-arm64-dts-qcom-add-msm8916-generic-m9s.patch @@ -1,6 +1,6 @@ --- /dev/null +++ b/arch/arm64/boot/dts/qcom/msm8916-generic-m9s.dts -@@ -0,0 +1,118 @@ +@@ -0,0 +1,126 @@ +// SPDX-License-Identifier: GPL-2.0-only + +/dts-v1/; @@ -119,3 +119,11 @@ +&gpio_leds_default { + pins = "gpio0", "gpio1", "gpio72", "gpio73", "gpio84", "gpio85"; +}; ++ ++&pm8916_0 { ++ pon@800 { ++ watchdog { ++ status = "disabled"; ++ }; ++ }; ++}; diff --git a/packages/configs-mf68e/files/rc.button.power b/packages/configs-mf68e/files/rc.button.power index 237b1bd..3a523e8 100644 --- a/packages/configs-mf68e/files/rc.button.power +++ b/packages/configs-mf68e/files/rc.button.power @@ -9,22 +9,9 @@ lockfile="/tmp/toff.lock" delay=1 -maybe_notify_display_shutdown() { - . /lib/functions.sh - config_load system - config_get FIFO display fifo "/var/run/display.fifo" - - [ -p "$FIFO" ] && { - echo "shutdown" > "$FIFO" 2>/dev/null; - sleep 1; - } -} - shutdown() { logger -t poweroff "Powering off..." - # maybe_notify_display_shutdown - sync /sbin/poweroff } diff --git a/packages/ledcontrol/Makefile b/packages/ledcontrol/Makefile index 5112cfb..a599bd9 100644 --- a/packages/ledcontrol/Makefile +++ b/packages/ledcontrol/Makefile @@ -11,7 +11,7 @@ define Package/ledcontrol SECTION:=utils CATEGORY:=Utilities TITLE:=Simple LED control utility - DEPENDS:= + DEPENDS:=+kmod-button-hotplug +inotifywait endef define Package/ledcontrol/description @@ -25,13 +25,19 @@ endef define Package/ledcontrol/install $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) ./files/ledcontrol $(1)/usr/sbin/ + $(INSTALL_BIN) ./files/ledcontrol.sh $(1)/usr/sbin/ $(INSTALL_DIR) $(1)/etc/hotplug.d/ieee80211 $(INSTALL_DATA) ./files/99-wifi-led $(1)/etc/hotplug.d/ieee80211/ $(INSTALL_DIR) $(1)/etc/hotplug.d/iface $(INSTALL_DATA) ./files/99-modem-led $(1)/etc/hotplug.d/iface/ + + $(INSTALL_DIR) $(1)/etc/hotplug.d/button + $(INSTALL_DATA) ./files/50-battery-show $(1)/etc/hotplug.d/button/ + + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_DATA) ./files/battery-monitor.init $(1)/etc/init.d/battery-monitor endef $(eval $(call BuildPackage,ledcontrol)) diff --git a/packages/ledcontrol/files/50-battery-show b/packages/ledcontrol/files/50-battery-show new file mode 100644 index 0000000..79370a8 --- /dev/null +++ b/packages/ledcontrol/files/50-battery-show @@ -0,0 +1,16 @@ +#!/bin/sh +# /etc/hotplug.d/button/50-battery-show + +[ "$BUTTON" = "power" ] || exit 0 +[ "$ACTION" = "pressed" ] || exit 0 + +# Solo actuar si NO está cargando +charging=$(cat /sys/class/power_supply/pm8916-lbc-chgr/online 2>/dev/null || echo 0) + +if [ "$charging" = "0" ]; then + # Enviar SIGUSR1 al daemon para mostrar batería + [ -f /var/run/battery-monitor.pid ] && { + kill -USR1 $(cat /var/run/battery-monitor.pid) 2>/dev/null + logger -t button-battery "SIGUSR1 sent to battery-monitor" + } +fi diff --git a/packages/ledcontrol/files/99-modem-led b/packages/ledcontrol/files/99-modem-led index dbc0a88..b155a5c 100644 --- a/packages/ledcontrol/files/99-modem-led +++ b/packages/ledcontrol/files/99-modem-led @@ -4,10 +4,12 @@ case "$ACTION:$INTERFACE" in ifup:modem) + ledcontrol wan red off 2>/dev/null || true ledcontrol wan on logger -t modem-led "Modem UP - Green LED ON" ;; ifdown:modem) + ledcontrol wan red on 2>/dev/null || true ledcontrol wan off logger -t modem-led "Modem DOWN - Green LED OFF" ;; diff --git a/packages/ledcontrol/files/battery-monitor.init b/packages/ledcontrol/files/battery-monitor.init new file mode 100644 index 0000000..79e6847 --- /dev/null +++ b/packages/ledcontrol/files/battery-monitor.init @@ -0,0 +1,101 @@ +#!/bin/sh /etc/rc.common +# /etc/init.d/battery-monitor + +START=99 +STOP=01 + +CHARGER_FILE="/sys/class/power_supply/pm8916-lbc-chgr/online" +BMS_PATH="/sys/class/power_supply/pm8916-bms-vm" + +get_capacity() { + local voltage=$(cat $BMS_PATH/voltage_now 2>/dev/null) + local vmax=$(cat $BMS_PATH/voltage_max_design 2>/dev/null) + local vmin=$(cat $BMS_PATH/voltage_min_design 2>/dev/null) + + if [ -n "$voltage" ] && [ -n "$vmax" ] && [ -n "$vmin" ]; then + awk -v v="$voltage" -v vmax="$vmax" -v vmin="$vmin" \ + 'BEGIN {pct = ((v - vmin) / (vmax - vmin)) * 100; + if (pct < 0) pct = 0; + if (pct > 100) pct = 100; + printf "%.0f", pct}' + else + echo "50" + fi +} + +show_battery_temp() { + local capacity=$(get_capacity) + + ledcontrol charging red off 2>/dev/null + ledcontrol charging green off 2>/dev/null + + if [ "$capacity" -lt 20 ]; then + ledcontrol charging red on 2>/dev/null + elif [ "$capacity" -lt 50 ]; then + ledcontrol charging red on 2>/dev/null + ledcontrol charging green on 2>/dev/null + else + ledcontrol charging green on 2>/dev/null + fi + + logger -t battery-monitor "SIGUSR1: Showing ${capacity}%" + + sleep 2 + + update_led +} + +update_led() { + local charging=$(cat $CHARGER_FILE 2>/dev/null || echo 0) + + if [ "$charging" = "1" ]; then + local capacity=$(get_capacity) + + ledcontrol charging red off 2>/dev/null + ledcontrol charging green off 2>/dev/null + + if [ "$capacity" -ge 95 ]; then + ledcontrol charging green on 2>/dev/null + logger -t battery-monitor "Charging complete: ${capacity}%" + elif [ "$capacity" -ge 50 ]; then + ledcontrol charging red blink 2>/dev/null & + ledcontrol charging green blink 2>/dev/null & + logger -t battery-monitor "Charging: ${capacity}%" + else + ledcontrol charging red blink 2>/dev/null + logger -t battery-monitor "Charging low: ${capacity}%" + fi + else + ledcontrol charging red off 2>/dev/null + ledcontrol charging green off 2>/dev/null + fi +} + +start() { + update_led + + ( + trap 'show_battery_temp' USR1 + + while true; do + inotifywait -qq -e modify $CHARGER_FILE 2>/dev/null + sleep 1 + update_led + done + ) & + + echo $! > /var/run/battery-monitor.pid +} + +stop() { + [ -f /var/run/battery-monitor.pid ] && { + kill $(cat /var/run/battery-monitor.pid) 2>/dev/null + rm -f /var/run/battery-monitor.pid + } + + ledcontrol charging red blink 2>/dev/null + ledcontrol charging green blink 2>/dev/null + + logger -t shutdown-led "BAT LED blinking amber - shutdown" + return 0 +} diff --git a/packages/ledcontrol/files/ledcontrol b/packages/ledcontrol/files/ledcontrol deleted file mode 100644 index 68e338a..0000000 --- a/packages/ledcontrol/files/ledcontrol +++ /dev/null @@ -1,87 +0,0 @@ -#!/bin/sh -# LED Control Utility for OpenWrt -# Usage: ledcontrol - -set -e - -COLOR="$1" -ACTION="$2" - -# LED base path -LED_BASE="/sys/class/leds" - -# Find LED by color -find_led() { - local color="$1" - local led_path - - # Search for LED containing the color in name - led_path=$(find "$LED_BASE" -maxdepth 1 -type l -iname "*:${color}:*" 2>/dev/null | head -n 1) - - if [ -z "$led_path" ]; then - # Try without colons - led_path=$(find "$LED_BASE" -maxdepth 1 -type l -iname "*${color}*" 2>/dev/null | head -n 1) - fi - - if [ -z "$led_path" ]; then - logger -t ledcontrol "LED color '$color' not found" - echo "[!] LED color '$color' not found" >&2 - echo "[*] Available LEDs:" >&2 - ls -1 "$LED_BASE" | sed 's/^/ /' >&2 - return 1 - fi - - echo "$led_path" -} - -# Set LED state -set_led() { - local led_path="$1" - local action="$2" - - case "$action" in - on) - echo none > "$led_path/trigger" - echo 1 > "$led_path/brightness" - ;; - off) - echo none > "$led_path/trigger" - echo 0 > "$led_path/brightness" - ;; - blink) - echo timer > "$led_path/trigger" - echo 500 > "$led_path/delay_on" - echo 500 > "$led_path/delay_off" - ;; - blink_fast) - echo timer > "$led_path/trigger" - echo 100 > "$led_path/delay_on" - echo 100 > "$led_path/delay_off" - ;; - *) - logger -t ledcontrol "Invalid action: $action" - echo "[!] Invalid action: $action" >&2 - echo "[*] Valid actions: on, off, blink, blink_fast" >&2 - return 1 - ;; - esac -} - -# Main -if [ -z "$COLOR" ] || [ -z "$ACTION" ]; then - echo "Usage: ledcontrol " >&2 - echo "" >&2 - echo "Available LEDs:" >&2 - ls -1 "$LED_BASE" 2>/dev/null | sed 's/^/ /' >&2 - exit 1 -fi - -LED_PATH=$(find_led "$COLOR") || exit 1 -LED_NAME=$(basename "$LED_PATH") - -if set_led "$LED_PATH" "$ACTION"; then - logger -t ledcontrol "LED '$LED_NAME' set to '$ACTION'" - echo "[+] LED '$COLOR' set to '$ACTION'" -else - exit 1 -fi diff --git a/packages/ledcontrol/files/ledcontrol.sh b/packages/ledcontrol/files/ledcontrol.sh new file mode 100644 index 0000000..1091902 --- /dev/null +++ b/packages/ledcontrol/files/ledcontrol.sh @@ -0,0 +1,136 @@ +#!/bin/sh +# LED Control Utility for OpenWrt +# Usage: ledcontrol [color] +# Examples: +# ledcontrol wan on (MiFi with green:wan) +# ledcontrol wlan on (MiFi with green:wlan) +# ledcontrol blue on (Dongle with blue LED) +# ledcontrol wan green on (Explicit color override) + +set -e + +# Parse arguments (support both 2 and 3 arg syntax) +if [ $# -eq 2 ]; then + # 2 args: + SEARCH_KEY="$1" + COLOR="" + ACTION="$2" +elif [ $# -eq 3 ]; then + # 3 args: + SEARCH_KEY="$1" + COLOR="$2" + ACTION="$3" +else + echo "Usage: ledcontrol " >&2 + echo " or: ledcontrol " >&2 + echo "" >&2 + echo "Examples:" >&2 + echo " ledcontrol wan on # Auto-detect color (green:wan or blue)" >&2 + echo " ledcontrol wlan off # Auto-detect color (green:wlan or blue)" >&2 + echo " ledcontrol blue blink # Specific color LED" >&2 + echo " ledcontrol wan green on # Explicit function+color" >&2 + echo "" >&2 + echo "Available LEDs:" >&2 + ls -1 /sys/class/leds 2>/dev/null | grep -v "^mmc" | sed 's/^/ /' >&2 + exit 1 +fi + +LED_BASE="/sys/class/leds" + +# Find LED with smart matching +find_led() { + local search="$1" + local color="$2" + local led_path + + # Priority 1: Exact match with color prefix (green:wan, red:wlan) + if [ -n "$color" ]; then + led_path=$(find "$LED_BASE" -maxdepth 1 -type l -name "${color}:${search}" 2>/dev/null | head -n 1) + if [ -n "$led_path" ]; then + echo "$led_path" + return 0 + fi + fi + + # Priority 2: Function-based match (wan, wlan, charging) + # Prefer green for status, fallback to any color + for clr in green blue red amber; do + led_path=$(find "$LED_BASE" -maxdepth 1 -type l -name "${clr}:${search}" 2>/dev/null | head -n 1) + if [ -n "$led_path" ]; then + echo "$led_path" + return 0 + fi + done + + # Priority 3: Color-only match (blue, green, red) + led_path=$(find "$LED_BASE" -maxdepth 1 -type l -name "${search}" 2>/dev/null | head -n 1) + if [ -n "$led_path" ]; then + echo "$led_path" + return 0 + fi + + # Priority 4: Case-insensitive partial match + led_path=$(find "$LED_BASE" -maxdepth 1 -type l | grep -i "${search}" | grep -v "mmc" | head -n 1) + if [ -n "$led_path" ]; then + echo "$led_path" + return 0 + fi + + logger -t ledcontrol "LED '$search' not found" + echo "[!] LED '$search' not found" >&2 + echo "[*] Available LEDs:" >&2 + ls -1 "$LED_BASE" 2>/dev/null | grep -v "^mmc" | sed 's/^/ /' >&2 + return 1 +} + +# Set LED state +set_led() { + local led_path="$1" + local action="$2" + + case "$action" in + on) + echo none > "$led_path/trigger" 2>/dev/null || true + echo 1 > "$led_path/brightness" + ;; + off) + echo none > "$led_path/trigger" 2>/dev/null || true + echo 0 > "$led_path/brightness" + ;; + blink) + echo timer > "$led_path/trigger" 2>/dev/null || { + echo "[!] Blink not supported, setting ON" >&2 + echo 1 > "$led_path/brightness" + return 0 + } + echo 500 > "$led_path/delay_on" 2>/dev/null || true + echo 500 > "$led_path/delay_off" 2>/dev/null || true + ;; + blink_fast) + echo timer > "$led_path/trigger" 2>/dev/null || { + echo "[!] Blink not supported, setting ON" >&2 + echo 1 > "$led_path/brightness" + return 0 + } + echo 100 > "$led_path/delay_on" 2>/dev/null || true + echo 100 > "$led_path/delay_off" 2>/dev/null || true + ;; + *) + logger -t ledcontrol "Invalid action: $action" + echo "[!] Invalid action: $action" >&2 + echo "[*] Valid actions: on, off, blink, blink_fast" >&2 + return 1 + ;; + esac +} + +# Main +LED_PATH=$(find_led "$SEARCH_KEY" "$COLOR") || exit 1 +LED_NAME=$(basename "$LED_PATH") + +if set_led "$LED_PATH" "$ACTION"; then + logger -t ledcontrol "LED '$LED_NAME' set to '$ACTION'" + echo "[+] LED '$LED_NAME' set to '$ACTION'" +else + exit 1 +fi From 83660359fae29958f07402e330f6902f5764ec12 Mon Sep 17 00:00:00 2001 From: Miguel Fuertes Date: Tue, 21 Oct 2025 21:10:08 +0200 Subject: [PATCH 06/11] working with buttons --- packages/ledcontrol/Makefile | 2 +- packages/ledcontrol/files/50-battery-show | 2 -- packages/ledcontrol/files/battery-monitor.init | 4 ++-- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/ledcontrol/Makefile b/packages/ledcontrol/Makefile index a599bd9..0f33b76 100644 --- a/packages/ledcontrol/Makefile +++ b/packages/ledcontrol/Makefile @@ -25,7 +25,7 @@ endef define Package/ledcontrol/install $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) ./files/ledcontrol.sh $(1)/usr/sbin/ + $(INSTALL_BIN) ./files/ledcontrol.sh $(1)/usr/sbin/ledcontrol $(INSTALL_DIR) $(1)/etc/hotplug.d/ieee80211 $(INSTALL_DATA) ./files/99-wifi-led $(1)/etc/hotplug.d/ieee80211/ diff --git a/packages/ledcontrol/files/50-battery-show b/packages/ledcontrol/files/50-battery-show index 79370a8..b087991 100644 --- a/packages/ledcontrol/files/50-battery-show +++ b/packages/ledcontrol/files/50-battery-show @@ -4,11 +4,9 @@ [ "$BUTTON" = "power" ] || exit 0 [ "$ACTION" = "pressed" ] || exit 0 -# Solo actuar si NO está cargando charging=$(cat /sys/class/power_supply/pm8916-lbc-chgr/online 2>/dev/null || echo 0) if [ "$charging" = "0" ]; then - # Enviar SIGUSR1 al daemon para mostrar batería [ -f /var/run/battery-monitor.pid ] && { kill -USR1 $(cat /var/run/battery-monitor.pid) 2>/dev/null logger -t button-battery "SIGUSR1 sent to battery-monitor" diff --git a/packages/ledcontrol/files/battery-monitor.init b/packages/ledcontrol/files/battery-monitor.init index 79e6847..1befce0 100644 --- a/packages/ledcontrol/files/battery-monitor.init +++ b/packages/ledcontrol/files/battery-monitor.init @@ -93,9 +93,9 @@ stop() { rm -f /var/run/battery-monitor.pid } + ledcontrol charging green off 2>/dev/null ledcontrol charging red blink 2>/dev/null - ledcontrol charging green blink 2>/dev/null - logger -t shutdown-led "BAT LED blinking amber - shutdown" + logger -t shutdown-led "BAT LED blinking - shutdown" return 0 } From 6bc2d6febab246890c1b151ad18f78e125074470 Mon Sep 17 00:00:00 2001 From: Miguel Fuertes Date: Wed, 22 Oct 2025 09:39:33 +0200 Subject: [PATCH 07/11] changes --- ...m64-dts-qcom-add-msm8916-generic-m9s.patch | 7 +- optional_battery_prompt | 172 ++++++++++++++++++ 2 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 optional_battery_prompt diff --git a/msm89xx/patches-6.12/805-arm64-dts-qcom-add-msm8916-generic-m9s.patch b/msm89xx/patches-6.12/805-arm64-dts-qcom-add-msm8916-generic-m9s.patch index d303884..418c323 100644 --- a/msm89xx/patches-6.12/805-arm64-dts-qcom-add-msm8916-generic-m9s.patch +++ b/msm89xx/patches-6.12/805-arm64-dts-qcom-add-msm8916-generic-m9s.patch @@ -1,6 +1,6 @@ --- /dev/null +++ b/arch/arm64/boot/dts/qcom/msm8916-generic-m9s.dts -@@ -0,0 +1,126 @@ +@@ -0,0 +1,131 @@ +// SPDX-License-Identifier: GPL-2.0-only + +/dts-v1/; @@ -96,10 +96,15 @@ +}; + +&pm8916_bms { ++ status = "okay"; + monitored-battery = <&bat>; ++ power-supplies = <&pm8916_charger>; +}; + +&pm8916_charger { ++ status = "okay"; ++ monitored-battery = <&bat>; ++ qcom,fast-charge-safe-current = <900000>; + qcom,fast-charge-safe-voltage = <4400000>; +}; + diff --git a/optional_battery_prompt b/optional_battery_prompt new file mode 100644 index 0000000..1efc1cb --- /dev/null +++ b/optional_battery_prompt @@ -0,0 +1,172 @@ +Perfecto. Aquí tienes la **checklist definitiva** para solucionar esto por software en el futuro:[1][2][3] + +## Checklist: Simular batería presente por software + +### 1. **Información que necesito darte** + +Cuando quieras hacer esto en otro dispositivo, dame:[4][5] + +**A) El device tree completo del dispositivo** (archivo `.dts`) +- Para identificar qué GPIOs y canales VADC están definidos + +**B) El device tree base de msm8916** (normalmente `msm8916-ufi.dtsi`) +- Para ver qué tiene el PMIC configurado por defecto + +**C) Logs del kernel con batería vs sin batería** +```bash +dmesg | grep -E "pm8916|bms|vadc|bat" +``` + +**D) Estado actual de los sysfs relevantes** +```bash +ls -la /sys/class/power_supply/ +cat /sys/kernel/debug/iio/iio:device*/in_*_raw +cat /sys/bus/spmi/devices/0-000*/name +``` + +### 2. **Preguntas clave que debes hacerme** + +Cuando tengas esa información, pregúntame:[2][3][1] + +**"¿Cómo simular batería presente en [nombre-dispositivo]?"** + +Y específicamente investigo: + +**a) Identificar el canal VADC de BAT_ID**[1] +``` +¿Qué canal del PM8916 VADC lee el BAT_ID? +``` +Normalmente es `VADC_LR_MUX2_BAT_ID` o similar. + +**b) Localizar GPIO asociado a BAT_ID**[3][2] +``` +¿Hay algún GPIO del PMIC conectado a BAT_ID? +``` + +**c) Ver configuración actual del BMS**[1] +``` +¿Qué propiedades tiene el nodo &pm8916_bms? +``` + +### 3. **Soluciones software que aplicaré** + +Según lo que encuentre, te daré una de estas soluciones:[2][3][1] + +#### Opción A: Desactivar lectura de BAT_ID en VADC + +```dts +&pm8916_vadc { + /* Comentar/eliminar el canal BAT_ID */ + /* + bat-id@12 { + reg = ; + qcom,pre-scaling = <1 1>; + qcom,hw-settle-time = <200>; + }; + */ +}; +``` + +#### Opción B: Forzar GPIO en pull-down permanente + +```dts +&pm8916_gpios { + bat_id_pulldown: bat-id-pulldown-state { + pins = "gpioX"; // X = número de GPIO + function = "normal"; + input-disable; + output-low; + bias-pull-down; + power-source = ; + }; +}; +``` + +#### Opción C: Modificar propiedades del BMS + +```dts +&pm8916_bms { + status = "okay"; + monitored-battery = <&bat>; + power-supplies = <&pm8916_charger>; + + /* Opciones para ignorar BAT_ID */ + qcom,ignore-shutdown-soc; + qcom,force-bms-active-on-charger; + /delete-property/ io-channels; // Elimina referencia a VADC +}; +``` + +#### Opción D: Simular resistencia con GPIO analog + +```dts +&pm8916_gpios { + bat_id_sim: bat-id-simulation { + pins = "gpioX"; + function = "normal"; + qcom,pull-up-strength = ; // 100kΩ equiv + bias-pull-down; + }; +}; +``` + +### 4. **Archivos que necesito ver** + +Cuando me preguntes, adjunta estos archivos:[5][4] + +```bash +# 1. DTS del dispositivo +target/linux/msm89xx/dts/qcom/msm8916-generic-TUDEVICE.dts + +# 2. DTSI base si existe +target/linux/msm89xx/dts/qcom/msm8916-ufi.dtsi + +# 3. Configuración del kernel (opcional pero útil) +target/linux/msm89xx/config-* + +# 4. Output de debugfs con batería conectada +cat /sys/kernel/debug/pm8916-adc/channels +cat /sys/kernel/debug/gpio +``` + +### 5. **Comando diagnóstico rápido** + +Cuando no arranque sin batería, ejecuta esto (con UART/serial):[2][1] + +```bash +# Durante boot, captura: +dmesg | grep -i "bat\|bms\|vadc\|adc" > /tmp/boot_log.txt + +# Y también: +cat /sys/bus/spmi/devices/*/name +cat /proc/interrupts | grep pm8916 +``` + +Y pásame ese log completo. + +### 6. **Resumen: ¿Qué te pregunto yo a ti?** + +Cuando tengas un dispositivo nuevo que no arranca sin batería:[3][1][2] + +> **"Tengo [dispositivo] con MSM8916/PM8916 que no arranca sin batería. Usa el mismo lk2nd que [otro dispositivo] que sí funciona sin batería. Te adjunto:** +> - **DTS de ambos dispositivos** (el que funciona y el que no) +> - **dmesg completo** del que no funciona (si arranca con batería) +> - **Esquemático** si lo tengo +> +> **¿Cómo configuro el device tree para simular BAT_ID por software?**" + +Y con eso, busco las diferencias en VADC, GPIOs y configuración del BMS para darte el patch exacto.[4][5][3][1][2] + +[1](https://www.kernel.org/doc/Documentation/devicetree/bindings/power/supply/qcom,pm8916-bms-vm.yaml) +[2](https://www.kernel.org/doc/Documentation/devicetree/bindings/pinctrl/qcom,pmic-gpio.txt) +[3](https://docs.qualcomm.com/bundle/publicresource/topics/80-88500-4/20_GPIO_registers_configuration.html) +[4](https://ppl-ai-file-upload.s3.amazonaws.com/web/direct-files/attachments/71119587/2cbba375-133e-46d7-b84a-35a4b519f137/802-arm64-dts-qcom-add-msm8916-generic-mf68e.patch) +[5](https://ppl-ai-file-upload.s3.amazonaws.com/web/direct-files/attachments/71119587/bb25f50b-d1d3-4c22-921c-7e22b9b185a8/805-arm64-dts-qcom-add-msm8916-generic-m9s.patch) +[6](https://docs.qualcomm.com/bundle/publicresource/topics/80-88500-1/7_Pin_control_driver.html) +[7](https://www.kernel.org/doc/Documentation/devicetree/bindings/mfd/qcom,spmi-pmic.yaml) +[8](https://sbexr.rabexc.org/latest/sources/6d/8af0298da51217.html) +[9](https://gitlab.com/cunidev/linux-msm8996/-/blob/v3.5-rc5/Documentation/gpio.txt) +[10](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-4/pmic-developer-touchpoints.html) +[11](https://hafnium.googlesource.com/hafnium/third_party/linux/+/refs/heads/master/Documentation/devicetree/bindings/pinctrl/qcom,pmic-gpio.txt) +[12](https://docs.qualcomm.com/bundle/publicresource/topics/80-88500-4/19_Hardware_overview.html) +[13](https://docs.qualcomm.com/bundle/publicresource/topics/80-70020-8/pcie.html) \ No newline at end of file From 104145900be85c9f0be690cc17dcbae6b0313823 Mon Sep 17 00:00:00 2001 From: Miguel Fuertes Date: Wed, 22 Oct 2025 11:30:28 +0200 Subject: [PATCH 08/11] Add battery monitoring and LED control features - Implemented a battery-monitor service to track battery capacity and charging status, controlling LEDs accordingly. - Created a battery status page in LuCI to display voltage, status, health, and estimated capacity. - Added hotplug scripts to trigger battery status updates on power button presses and modem interface changes. - Developed LED control scripts for modem and WiFi status indicators. - Configured UCI defaults to enable WiFi and set up a modem interface with appropriate settings. - Introduced a utility script for LED control with various actions (on, off, blink). - Added a power button script for double-click shutdown functionality. --- msm89xx/image/msm8916.mk | 8 +- .../Makefile | 14 +- .../files/hotplugs}/99-modem-led | 6 +- .../files/hotplugs}/99-wifi-led | 6 +- .../files/luci-app-tailscale-1.2.6-r1.apk | Bin .../files/uci_defaults | 0 .../{configs-mf68e => configs-mifi}/Makefile | 20 +- .../configs-mifi/files/battery-monitor.init | 179 ++++++++++++++++++ .../files/battery.htm | 0 .../files/hotplugs}/50-battery-show | 0 .../configs-mifi/files/hotplugs/99-modem-led | 16 ++ .../configs-mifi/files/hotplugs/99-wifi-led | 32 ++++ .../files/luci-app-tailscale-1.2.6-r1.apk | Bin .../files/rc.button.power | 0 .../files/uci_defaults | 0 packages/ledcontrol/Makefile | 20 +- .../ledcontrol/files/battery-monitor.init | 101 ---------- packages/ledcontrol/files/ledcontrol.sh | 136 ------------- packages/ledcontrol/ledcontrol.sh | 75 ++++++++ 19 files changed, 341 insertions(+), 272 deletions(-) rename packages/{configs-uz801 => configs-dongle}/Makefile (68%) rename packages/{ledcontrol/files => configs-dongle/files/hotplugs}/99-modem-led (65%) rename packages/{ledcontrol/files => configs-dongle/files/hotplugs}/99-wifi-led (87%) rename packages/{configs-mf68e => configs-dongle}/files/luci-app-tailscale-1.2.6-r1.apk (100%) rename packages/{configs-uz801 => configs-dongle}/files/uci_defaults (100%) rename packages/{configs-mf68e => configs-mifi}/Makefile (74%) create mode 100644 packages/configs-mifi/files/battery-monitor.init rename packages/{configs-mf68e => configs-mifi}/files/battery.htm (100%) rename packages/{ledcontrol/files => configs-mifi/files/hotplugs}/50-battery-show (100%) create mode 100644 packages/configs-mifi/files/hotplugs/99-modem-led create mode 100644 packages/configs-mifi/files/hotplugs/99-wifi-led rename packages/{configs-uz801 => configs-mifi}/files/luci-app-tailscale-1.2.6-r1.apk (100%) rename packages/{configs-mf68e => configs-mifi}/files/rc.button.power (100%) rename packages/{configs-mf68e => configs-mifi}/files/uci_defaults (100%) delete mode 100644 packages/ledcontrol/files/battery-monitor.init delete mode 100644 packages/ledcontrol/files/ledcontrol.sh create mode 100644 packages/ledcontrol/ledcontrol.sh diff --git a/msm89xx/image/msm8916.mk b/msm89xx/image/msm8916.mk index 77c61c1..82de291 100644 --- a/msm89xx/image/msm8916.mk +++ b/msm89xx/image/msm8916.mk @@ -33,7 +33,7 @@ define Device/yiming-uz801v3 DEVICE_VENDOR := YiMing DEVICE_MODEL := uz801v3 FILESYSTEMS := squashfs - DEVICE_PACKAGES := configs-uz801 wpad-basic-wolfssl rmtfs uci-usb-gadget \ + DEVICE_PACKAGES := configs-dongle wpad-basic-wolfssl rmtfs uci-usb-gadget \ block-mount f2fs-tools prepare-rootfs-data \ msm-firmware-dumper ledcontrol endef @@ -44,7 +44,7 @@ define Device/generic-uf02 DEVICE_VENDOR := Generic DEVICE_MODEL := UF02 (250605 V0S) FILESYSTEMS := squashfs - DEVICE_PACKAGES := configs-uz801 wpad-basic-wolfssl rmtfs uci-usb-gadget \ + DEVICE_PACKAGES := configs-dongle wpad-basic-wolfssl rmtfs uci-usb-gadget \ block-mount f2fs-tools prepare-rootfs-data \ msm-firmware-dumper ledcontrol endef @@ -57,7 +57,7 @@ define Device/generic-mf68e DEVICE_MODEL := MF68E FILESYSTEMS := squashfs CMDLINE := "earlycon console=ttyMSM0,115200 quiet loglevel=0 vt.global_cursor_default=0 vt.cur_default=0 root=/dev/mmcblk0p14 rootfstype=squashfs rootwait nowatchdog" - DEVICE_PACKAGES := configs-mf68e wpad-basic-wolfssl rmtfs uci-usb-gadget \ + DEVICE_PACKAGES := configs-mifi wpad-basic-wolfssl rmtfs uci-usb-gadget \ block-mount f2fs-tools prepare-rootfs-data \ msm-firmware-dumper kmod-fbtft-gc9107 router-display endef @@ -68,7 +68,7 @@ define Device/generic-m9s DEVICE_VENDOR := Generic DEVICE_MODEL := M9S FILESYSTEMS := squashfs - DEVICE_PACKAGES := configs-mf68e wpad-basic-wolfssl rmtfs uci-usb-gadget \ + DEVICE_PACKAGES := configs-mifi wpad-basic-wolfssl rmtfs uci-usb-gadget \ block-mount f2fs-tools prepare-rootfs-data \ msm-firmware-dumper ledcontrol endef diff --git a/packages/configs-uz801/Makefile b/packages/configs-dongle/Makefile similarity index 68% rename from packages/configs-uz801/Makefile rename to packages/configs-dongle/Makefile index 121c933..33e8eee 100644 --- a/packages/configs-uz801/Makefile +++ b/packages/configs-dongle/Makefile @@ -1,6 +1,6 @@ include $(TOPDIR)/rules.mk -PKG_NAME:=configs-uz801 +PKG_NAME:=configs-dongle PKG_VERSION:=1.0 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) @@ -10,13 +10,13 @@ include $(INCLUDE_DIR)/package.mk define Package/$(PKG_NAME) SECTION:=Utilities CATEGORY:=Utilities - TITLE:=Default Settings For uz801v3 - DEPENDS:=+PACKAGE_luci:luci-proto-modemmanager + TITLE:=Default Settings For Dongles + DEPENDS:=+PACKAGE_luci:luci-proto-modemmanager +ledcontrol +kmod-button-hotplug +inotifywait endef # Optional description define Package/$(PKG_NAME)/description -Tweaks and defaults for uz801v3, including cleanup of problematic APK feeds. +Tweaks and defaults for Dongles, including cleanup of problematic APK feeds. endef define Build/Configure @@ -32,6 +32,12 @@ define Package/$(PKG_NAME)/install $(INSTALL_DIR) $(1)/root/ $(INSTALL_BIN) ./files/luci-app-tailscale*.apk $(1)/root/ + + $(INSTALL_DIR) $(1)/etc/hotplug.d/ieee80211 + $(INSTALL_DATA) ./files/99-wifi-led $(1)/etc/hotplug.d/ieee80211/ + + $(INSTALL_DIR) $(1)/etc/hotplug.d/iface + $(INSTALL_DATA) ./files/99-modem-led $(1)/etc/hotplug.d/iface/ endef define Package/$(PKG_NAME)/postinst diff --git a/packages/ledcontrol/files/99-modem-led b/packages/configs-dongle/files/hotplugs/99-modem-led similarity index 65% rename from packages/ledcontrol/files/99-modem-led rename to packages/configs-dongle/files/hotplugs/99-modem-led index b155a5c..d172917 100644 --- a/packages/ledcontrol/files/99-modem-led +++ b/packages/configs-dongle/files/hotplugs/99-modem-led @@ -4,13 +4,11 @@ case "$ACTION:$INTERFACE" in ifup:modem) - ledcontrol wan red off 2>/dev/null || true - ledcontrol wan on + ledcontrol green:wan on logger -t modem-led "Modem UP - Green LED ON" ;; ifdown:modem) - ledcontrol wan red on 2>/dev/null || true - ledcontrol wan off + ledcontrol green:wan off logger -t modem-led "Modem DOWN - Green LED OFF" ;; esac diff --git a/packages/ledcontrol/files/99-wifi-led b/packages/configs-dongle/files/hotplugs/99-wifi-led similarity index 87% rename from packages/ledcontrol/files/99-wifi-led rename to packages/configs-dongle/files/hotplugs/99-wifi-led index a308f93..e31d8cc 100644 --- a/packages/ledcontrol/files/99-wifi-led +++ b/packages/configs-dongle/files/hotplugs/99-wifi-led @@ -12,17 +12,17 @@ case "$ACTION" in sta_status=$(ip link show phy0-sta0 2>/dev/null | grep -c "state UP") if [ "$ap_status" -gt 0 ] || [ "$sta_status" -gt 0 ]; then - ledcontrol wlan on + ledcontrol blue:wlan on logger -t wifi-led "phy0 interface UP, blue LED ON" else - ledcontrol wlan off + ledcontrol blue:wlan off logger -t wifi-led "No phy0 interface UP, blue LED OFF" fi fi ;; remove) if [ "$DEVICENAME" = "phy0" ]; then - ledcontrol wlan off + ledcontrol blue:wlan off logger -t wifi-led "phy0 removed, blue LED OFF" fi ;; diff --git a/packages/configs-mf68e/files/luci-app-tailscale-1.2.6-r1.apk b/packages/configs-dongle/files/luci-app-tailscale-1.2.6-r1.apk similarity index 100% rename from packages/configs-mf68e/files/luci-app-tailscale-1.2.6-r1.apk rename to packages/configs-dongle/files/luci-app-tailscale-1.2.6-r1.apk diff --git a/packages/configs-uz801/files/uci_defaults b/packages/configs-dongle/files/uci_defaults similarity index 100% rename from packages/configs-uz801/files/uci_defaults rename to packages/configs-dongle/files/uci_defaults diff --git a/packages/configs-mf68e/Makefile b/packages/configs-mifi/Makefile similarity index 74% rename from packages/configs-mf68e/Makefile rename to packages/configs-mifi/Makefile index d7c2b05..ab1d7b1 100644 --- a/packages/configs-mf68e/Makefile +++ b/packages/configs-mifi/Makefile @@ -1,6 +1,6 @@ include $(TOPDIR)/rules.mk -PKG_NAME:=configs-mf68e +PKG_NAME:=configs-mifi PKG_VERSION:=1.0 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) @@ -10,13 +10,13 @@ include $(INCLUDE_DIR)/package.mk define Package/$(PKG_NAME) SECTION:=Utilities CATEGORY:=Utilities - TITLE:=Default Settings For mf68e - DEPENDS:=+PACKAGE_luci:luci-proto-modemmanager + TITLE:=Default Settings For MiFis + DEPENDS:=+PACKAGE_luci:luci-proto-modemmanager +ledcontrol +kmod-button-hotplug +inotifywait endef # Optional description define Package/$(PKG_NAME)/description -Tweaks and defaults for mf68e, including cleanup of problematic APK feeds and LuCI battery widget. +Tweaks and defaults for MiFis, including cleanup of problematic APK feeds and LuCI battery widget. endef define Build/Prepare @@ -55,6 +55,18 @@ define Package/$(PKG_NAME)/install $(INSTALL_DIR) $(1)/usr/lib/lua/luci/view/admin_status/index $(INSTALL_DATA) ./files/battery.htm $(1)/usr/lib/lua/luci/view/admin_status/index/20_battery.htm + + $(INSTALL_DIR) $(1)/etc/hotplug.d/ieee80211 + $(INSTALL_DATA) ./files/hotplugs/99-wifi-led $(1)/etc/hotplug.d/ieee80211/ + + $(INSTALL_DIR) $(1)/etc/hotplug.d/iface + $(INSTALL_DATA) ./files/hotplugs/99-modem-led $(1)/etc/hotplug.d/iface/ + + $(INSTALL_DIR) $(1)/etc/hotplug.d/button + $(INSTALL_DATA) ./files/hotplugs/50-battery-show $(1)/etc/hotplug.d/button/ + + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./files/battery-monitor.init $(1)/etc/init.d/battery-monitor endef define Package/$(PKG_NAME)/postinst diff --git a/packages/configs-mifi/files/battery-monitor.init b/packages/configs-mifi/files/battery-monitor.init new file mode 100644 index 0000000..345ee70 --- /dev/null +++ b/packages/configs-mifi/files/battery-monitor.init @@ -0,0 +1,179 @@ +#!/bin/sh /etc/rc.common +# /etc/init.d/battery-monitor + +START=99 +STOP=01 + +CHARGER_FILE="/sys/class/power_supply/pm8916-lbc-chgr/online" +BMS_PATH="/sys/class/power_supply/pm8916-bms-vm" + +# Required LEDs +LED_RED="red:charging" +LED_GREEN="green:charging" + +# Check if required LEDs exist +check_leds() { + local missing="" + + if [ ! -d "/sys/class/leds/$LED_RED" ]; then + missing="$missing $LED_RED" + fi + + if [ ! -d "/sys/class/leds/$LED_GREEN" ]; then + missing="$missing $LED_GREEN" + fi + + if [ -n "$missing" ]; then + logger -t battery-monitor "LEDs not found, service disabled:$missing" + return 1 + fi + + return 0 +} + +get_capacity() { + local voltage=$(cat $BMS_PATH/voltage_now 2>/dev/null) + local vmax=$(cat $BMS_PATH/voltage_max_design 2>/dev/null) + local vmin=$(cat $BMS_PATH/voltage_min_design 2>/dev/null) + + if [ -n "$voltage" ] && [ -n "$vmax" ] && [ -n "$vmin" ]; then + awk -v v="$voltage" -v vmax="$vmax" -v vmin="$vmin" \ + 'BEGIN {pct = ((v - vmin) / (vmax - vmin)) * 100; + if (pct < 0) pct = 0; + if (pct > 100) pct = 100; + printf "%.0f", pct}' + else + echo "50" + fi +} + +show_battery_temp() { + local capacity=$(get_capacity) + + ledcontrol $LED_RED off 2>/dev/null + ledcontrol $LED_GREEN off 2>/dev/null + + if [ "$capacity" -lt 20 ]; then + ledcontrol $LED_RED on 2>/dev/null + elif [ "$capacity" -lt 50 ]; then + ledcontrol $LED_RED on 2>/dev/null + ledcontrol $LED_GREEN on 2>/dev/null + else + ledcontrol $LED_GREEN on 2>/dev/null + fi + + logger -t battery-monitor "SIGUSR1: Showing ${capacity}%" + + sleep 2 + + update_led +} + +update_led() { + local charging=$(cat $CHARGER_FILE 2>/dev/null || echo 0) + + if [ "$charging" = "1" ]; then + local capacity=$(get_capacity) + + ledcontrol $LED_RED off 2>/dev/null + ledcontrol $LED_GREEN off 2>/dev/null + + if [ "$capacity" -ge 95 ]; then + ledcontrol $LED_GREEN on 2>/dev/null + logger -t battery-monitor "Charging complete: ${capacity}%" + elif [ "$capacity" -ge 50 ]; then + ledcontrol $LED_RED blink 2>/dev/null & + ledcontrol $LED_GREEN blink 2>/dev/null & + logger -t battery-monitor "Charging: ${capacity}%" + else + ledcontrol $LED_RED blink 2>/dev/null + logger -t battery-monitor "Charging low: ${capacity}%" + fi + else + ledcontrol $LED_RED off 2>/dev/null + ledcontrol $LED_GREEN off 2>/dev/null + fi +} + +# Main monitoring loop (runs in background) +monitor_loop() { + # Set up signal handler + trap 'show_battery_temp' USR1 + + # Get initial state + local last_state=$(cat $CHARGER_FILE 2>/dev/null || echo 0) + update_led + + # Poll charger state + while true; do + local current_state=$(cat $CHARGER_FILE 2>/dev/null || echo 0) + + if [ "$current_state" != "$last_state" ]; then + logger -t battery-monitor "Charger state changed: $last_state -> $current_state" + last_state=$current_state + sleep 1 + update_led + fi + + # Poll every 2 seconds + sleep 2 + done +} + +start() { + # Exit silently if LEDs don't exist + check_leds || return 0 + + # Check if already running + if [ -f /var/run/battery-monitor.pid ] && kill -0 $(cat /var/run/battery-monitor.pid) 2>/dev/null; then + logger -t battery-monitor "Already running" + return 0 + fi + + logger -t battery-monitor "Starting with LEDs: $LED_RED, $LED_GREEN" + + # Start monitoring loop in background + monitor_loop & + + echo $! > /var/run/battery-monitor.pid + logger -t battery-monitor "Service started (PID: $!)" +} + +stop() { + if [ -f /var/run/battery-monitor.pid ]; then + local pid=$(cat /var/run/battery-monitor.pid) + + if kill -0 $pid 2>/dev/null; then + kill $pid 2>/dev/null + + # Wait for process to die + local timeout=5 + while [ $timeout -gt 0 ] && kill -0 $pid 2>/dev/null; do + sleep 1 + timeout=$((timeout - 1)) + done + + # Force kill if still alive + kill -9 $pid 2>/dev/null + + logger -t battery-monitor "Service stopped (PID: $pid)" + fi + + rm -f /var/run/battery-monitor.pid + fi + + # Only try to control LEDs if they exist + if check_leds 2>/dev/null; then + ledcontrol $LED_GREEN off 2>/dev/null + ledcontrol $LED_RED blink 2>/dev/null + logger -t battery-monitor "Shutdown: Red LED blinking" + fi + + return 0 +} + +restart() { + stop + sleep 1 + start +} diff --git a/packages/configs-mf68e/files/battery.htm b/packages/configs-mifi/files/battery.htm similarity index 100% rename from packages/configs-mf68e/files/battery.htm rename to packages/configs-mifi/files/battery.htm diff --git a/packages/ledcontrol/files/50-battery-show b/packages/configs-mifi/files/hotplugs/50-battery-show similarity index 100% rename from packages/ledcontrol/files/50-battery-show rename to packages/configs-mifi/files/hotplugs/50-battery-show diff --git a/packages/configs-mifi/files/hotplugs/99-modem-led b/packages/configs-mifi/files/hotplugs/99-modem-led new file mode 100644 index 0000000..37a4b6b --- /dev/null +++ b/packages/configs-mifi/files/hotplugs/99-modem-led @@ -0,0 +1,16 @@ +#!/bin/sh +# /etc/hotplug.d/iface/99-modem-led +# Modem LED control based on interface status + +case "$ACTION:$INTERFACE" in + ifup:modem) + ledcontrol red:wan off 2>/dev/null || true + ledcontrol green:wan on 2>/dev/null || true + logger -t modem-led "Modem UP - Green LED ON" + ;; + ifdown:modem) + ledcontrol red:wan on 2>/dev/null || true + ledcontrol green:wan off 2>/dev/null || true + logger -t modem-led "Modem DOWN - Green LED OFF" + ;; +esac diff --git a/packages/configs-mifi/files/hotplugs/99-wifi-led b/packages/configs-mifi/files/hotplugs/99-wifi-led new file mode 100644 index 0000000..be75521 --- /dev/null +++ b/packages/configs-mifi/files/hotplugs/99-wifi-led @@ -0,0 +1,32 @@ +#!/bin/sh +# /etc/hotplug.d/ieee80211/99-wifi-led +# WiFi LED control based on phy0 status + +case "$ACTION" in + add) + if [ "$DEVICENAME" = "phy0" ]; then + sleep 5 + + # Check interface status + ap_status=$(ip link show phy0-ap0 2>/dev/null | grep -c "state UP") + sta_status=$(ip link show phy0-sta0 2>/dev/null | grep -c "state UP") + + if [ "$ap_status" -gt 0 ] || [ "$sta_status" -gt 0 ]; then + ledcontrol red:wlan on 2>/dev/null || true + ledcontrol green:wlan on 2>/dev/null || true + logger -t wifi-led "phy0 interface UP, blue LED ON" + else + ledcontrol red:wlan on 2>/dev/null || true + ledcontrol green:wlan off 2>/dev/null || true + logger -t wifi-led "No phy0 interface UP, blue LED OFF" + fi + fi + ;; + remove) + if [ "$DEVICENAME" = "phy0" ]; then + ledcontrol red:wlan off 2>/dev/null || true + ledcontrol green:wlan off 2>/dev/null || true + logger -t wifi-led "phy0 removed, blue LED OFF" + fi + ;; +esac diff --git a/packages/configs-uz801/files/luci-app-tailscale-1.2.6-r1.apk b/packages/configs-mifi/files/luci-app-tailscale-1.2.6-r1.apk similarity index 100% rename from packages/configs-uz801/files/luci-app-tailscale-1.2.6-r1.apk rename to packages/configs-mifi/files/luci-app-tailscale-1.2.6-r1.apk diff --git a/packages/configs-mf68e/files/rc.button.power b/packages/configs-mifi/files/rc.button.power similarity index 100% rename from packages/configs-mf68e/files/rc.button.power rename to packages/configs-mifi/files/rc.button.power diff --git a/packages/configs-mf68e/files/uci_defaults b/packages/configs-mifi/files/uci_defaults similarity index 100% rename from packages/configs-mf68e/files/uci_defaults rename to packages/configs-mifi/files/uci_defaults diff --git a/packages/ledcontrol/Makefile b/packages/ledcontrol/Makefile index 0f33b76..77a5a27 100644 --- a/packages/ledcontrol/Makefile +++ b/packages/ledcontrol/Makefile @@ -11,12 +11,12 @@ define Package/ledcontrol SECTION:=utils CATEGORY:=Utilities TITLE:=Simple LED control utility - DEPENDS:=+kmod-button-hotplug +inotifywait + DEPENDS:= endef define Package/ledcontrol/description Simple utility to control device LEDs via sysfs - Usage: ledcontrol + Usage: ledcontrol Includes hotplug scripts for WiFi and modem LED management endef @@ -24,20 +24,8 @@ define Build/Compile endef define Package/ledcontrol/install - $(INSTALL_DIR) $(1)/usr/sbin - $(INSTALL_BIN) ./files/ledcontrol.sh $(1)/usr/sbin/ledcontrol - - $(INSTALL_DIR) $(1)/etc/hotplug.d/ieee80211 - $(INSTALL_DATA) ./files/99-wifi-led $(1)/etc/hotplug.d/ieee80211/ - - $(INSTALL_DIR) $(1)/etc/hotplug.d/iface - $(INSTALL_DATA) ./files/99-modem-led $(1)/etc/hotplug.d/iface/ - - $(INSTALL_DIR) $(1)/etc/hotplug.d/button - $(INSTALL_DATA) ./files/50-battery-show $(1)/etc/hotplug.d/button/ - - $(INSTALL_DIR) $(1)/etc/init.d - $(INSTALL_DATA) ./files/battery-monitor.init $(1)/etc/init.d/battery-monitor + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) ./ledcontrol.sh $(1)/usr/bin/ledcontrol endef $(eval $(call BuildPackage,ledcontrol)) diff --git a/packages/ledcontrol/files/battery-monitor.init b/packages/ledcontrol/files/battery-monitor.init deleted file mode 100644 index 1befce0..0000000 --- a/packages/ledcontrol/files/battery-monitor.init +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/sh /etc/rc.common -# /etc/init.d/battery-monitor - -START=99 -STOP=01 - -CHARGER_FILE="/sys/class/power_supply/pm8916-lbc-chgr/online" -BMS_PATH="/sys/class/power_supply/pm8916-bms-vm" - -get_capacity() { - local voltage=$(cat $BMS_PATH/voltage_now 2>/dev/null) - local vmax=$(cat $BMS_PATH/voltage_max_design 2>/dev/null) - local vmin=$(cat $BMS_PATH/voltage_min_design 2>/dev/null) - - if [ -n "$voltage" ] && [ -n "$vmax" ] && [ -n "$vmin" ]; then - awk -v v="$voltage" -v vmax="$vmax" -v vmin="$vmin" \ - 'BEGIN {pct = ((v - vmin) / (vmax - vmin)) * 100; - if (pct < 0) pct = 0; - if (pct > 100) pct = 100; - printf "%.0f", pct}' - else - echo "50" - fi -} - -show_battery_temp() { - local capacity=$(get_capacity) - - ledcontrol charging red off 2>/dev/null - ledcontrol charging green off 2>/dev/null - - if [ "$capacity" -lt 20 ]; then - ledcontrol charging red on 2>/dev/null - elif [ "$capacity" -lt 50 ]; then - ledcontrol charging red on 2>/dev/null - ledcontrol charging green on 2>/dev/null - else - ledcontrol charging green on 2>/dev/null - fi - - logger -t battery-monitor "SIGUSR1: Showing ${capacity}%" - - sleep 2 - - update_led -} - -update_led() { - local charging=$(cat $CHARGER_FILE 2>/dev/null || echo 0) - - if [ "$charging" = "1" ]; then - local capacity=$(get_capacity) - - ledcontrol charging red off 2>/dev/null - ledcontrol charging green off 2>/dev/null - - if [ "$capacity" -ge 95 ]; then - ledcontrol charging green on 2>/dev/null - logger -t battery-monitor "Charging complete: ${capacity}%" - elif [ "$capacity" -ge 50 ]; then - ledcontrol charging red blink 2>/dev/null & - ledcontrol charging green blink 2>/dev/null & - logger -t battery-monitor "Charging: ${capacity}%" - else - ledcontrol charging red blink 2>/dev/null - logger -t battery-monitor "Charging low: ${capacity}%" - fi - else - ledcontrol charging red off 2>/dev/null - ledcontrol charging green off 2>/dev/null - fi -} - -start() { - update_led - - ( - trap 'show_battery_temp' USR1 - - while true; do - inotifywait -qq -e modify $CHARGER_FILE 2>/dev/null - sleep 1 - update_led - done - ) & - - echo $! > /var/run/battery-monitor.pid -} - -stop() { - [ -f /var/run/battery-monitor.pid ] && { - kill $(cat /var/run/battery-monitor.pid) 2>/dev/null - rm -f /var/run/battery-monitor.pid - } - - ledcontrol charging green off 2>/dev/null - ledcontrol charging red blink 2>/dev/null - - logger -t shutdown-led "BAT LED blinking - shutdown" - return 0 -} diff --git a/packages/ledcontrol/files/ledcontrol.sh b/packages/ledcontrol/files/ledcontrol.sh deleted file mode 100644 index 1091902..0000000 --- a/packages/ledcontrol/files/ledcontrol.sh +++ /dev/null @@ -1,136 +0,0 @@ -#!/bin/sh -# LED Control Utility for OpenWrt -# Usage: ledcontrol [color] -# Examples: -# ledcontrol wan on (MiFi with green:wan) -# ledcontrol wlan on (MiFi with green:wlan) -# ledcontrol blue on (Dongle with blue LED) -# ledcontrol wan green on (Explicit color override) - -set -e - -# Parse arguments (support both 2 and 3 arg syntax) -if [ $# -eq 2 ]; then - # 2 args: - SEARCH_KEY="$1" - COLOR="" - ACTION="$2" -elif [ $# -eq 3 ]; then - # 3 args: - SEARCH_KEY="$1" - COLOR="$2" - ACTION="$3" -else - echo "Usage: ledcontrol " >&2 - echo " or: ledcontrol " >&2 - echo "" >&2 - echo "Examples:" >&2 - echo " ledcontrol wan on # Auto-detect color (green:wan or blue)" >&2 - echo " ledcontrol wlan off # Auto-detect color (green:wlan or blue)" >&2 - echo " ledcontrol blue blink # Specific color LED" >&2 - echo " ledcontrol wan green on # Explicit function+color" >&2 - echo "" >&2 - echo "Available LEDs:" >&2 - ls -1 /sys/class/leds 2>/dev/null | grep -v "^mmc" | sed 's/^/ /' >&2 - exit 1 -fi - -LED_BASE="/sys/class/leds" - -# Find LED with smart matching -find_led() { - local search="$1" - local color="$2" - local led_path - - # Priority 1: Exact match with color prefix (green:wan, red:wlan) - if [ -n "$color" ]; then - led_path=$(find "$LED_BASE" -maxdepth 1 -type l -name "${color}:${search}" 2>/dev/null | head -n 1) - if [ -n "$led_path" ]; then - echo "$led_path" - return 0 - fi - fi - - # Priority 2: Function-based match (wan, wlan, charging) - # Prefer green for status, fallback to any color - for clr in green blue red amber; do - led_path=$(find "$LED_BASE" -maxdepth 1 -type l -name "${clr}:${search}" 2>/dev/null | head -n 1) - if [ -n "$led_path" ]; then - echo "$led_path" - return 0 - fi - done - - # Priority 3: Color-only match (blue, green, red) - led_path=$(find "$LED_BASE" -maxdepth 1 -type l -name "${search}" 2>/dev/null | head -n 1) - if [ -n "$led_path" ]; then - echo "$led_path" - return 0 - fi - - # Priority 4: Case-insensitive partial match - led_path=$(find "$LED_BASE" -maxdepth 1 -type l | grep -i "${search}" | grep -v "mmc" | head -n 1) - if [ -n "$led_path" ]; then - echo "$led_path" - return 0 - fi - - logger -t ledcontrol "LED '$search' not found" - echo "[!] LED '$search' not found" >&2 - echo "[*] Available LEDs:" >&2 - ls -1 "$LED_BASE" 2>/dev/null | grep -v "^mmc" | sed 's/^/ /' >&2 - return 1 -} - -# Set LED state -set_led() { - local led_path="$1" - local action="$2" - - case "$action" in - on) - echo none > "$led_path/trigger" 2>/dev/null || true - echo 1 > "$led_path/brightness" - ;; - off) - echo none > "$led_path/trigger" 2>/dev/null || true - echo 0 > "$led_path/brightness" - ;; - blink) - echo timer > "$led_path/trigger" 2>/dev/null || { - echo "[!] Blink not supported, setting ON" >&2 - echo 1 > "$led_path/brightness" - return 0 - } - echo 500 > "$led_path/delay_on" 2>/dev/null || true - echo 500 > "$led_path/delay_off" 2>/dev/null || true - ;; - blink_fast) - echo timer > "$led_path/trigger" 2>/dev/null || { - echo "[!] Blink not supported, setting ON" >&2 - echo 1 > "$led_path/brightness" - return 0 - } - echo 100 > "$led_path/delay_on" 2>/dev/null || true - echo 100 > "$led_path/delay_off" 2>/dev/null || true - ;; - *) - logger -t ledcontrol "Invalid action: $action" - echo "[!] Invalid action: $action" >&2 - echo "[*] Valid actions: on, off, blink, blink_fast" >&2 - return 1 - ;; - esac -} - -# Main -LED_PATH=$(find_led "$SEARCH_KEY" "$COLOR") || exit 1 -LED_NAME=$(basename "$LED_PATH") - -if set_led "$LED_PATH" "$ACTION"; then - logger -t ledcontrol "LED '$LED_NAME' set to '$ACTION'" - echo "[+] LED '$LED_NAME' set to '$ACTION'" -else - exit 1 -fi diff --git a/packages/ledcontrol/ledcontrol.sh b/packages/ledcontrol/ledcontrol.sh new file mode 100644 index 0000000..43c81f3 --- /dev/null +++ b/packages/ledcontrol/ledcontrol.sh @@ -0,0 +1,75 @@ +#!/bin/sh +# LED Control Utility for OpenWrt +# Usage: ledcontrol +# Examples: +# ledcontrol green:wan on +# ledcontrol blue:wlan blink +# ledcontrol red:charging off + +set -e + +# Parse arguments +if [ $# -ne 2 ]; then + echo "Usage: ledcontrol " >&2 + echo "" >&2 + echo "Examples:" >&2 + echo " ledcontrol green:wan on" >&2 + echo " ledcontrol blue:wlan blink" >&2 + echo " ledcontrol red:charging off" >&2 + echo "" >&2 + echo "Available LEDs:" >&2 + ls -1 /sys/class/leds 2>/dev/null | grep -v "^mmc" | sed 's/^/ /' >&2 + exit 1 +fi + +LED_NAME="$1" +ACTION="$2" +LED_PATH="/sys/class/leds/$LED_NAME" + +# Check if LED exists +if [ ! -d "$LED_PATH" ]; then + echo "[!] LED '$LED_NAME' not found" >&2 + echo "[*] Available LEDs:" >&2 + ls -1 /sys/class/leds 2>/dev/null | grep -v "^mmc" | sed 's/^/ /' >&2 + exit 1 +fi + +# Set LED state +case "$ACTION" in + on) + echo none > "$LED_PATH/trigger" 2>/dev/null || true + echo 1 > "$LED_PATH/brightness" + ;; + off) + echo none > "$LED_PATH/trigger" 2>/dev/null || true + echo 0 > "$LED_PATH/brightness" + ;; + blink) + echo timer > "$LED_PATH/trigger" 2>/dev/null || { + echo "[!] Blink not supported, setting ON" >&2 + echo 1 > "$LED_PATH/brightness" + exit 0 + } + echo 500 > "$LED_PATH/delay_on" 2>/dev/null || true + echo 500 > "$LED_PATH/delay_off" 2>/dev/null || true + ;; + blink_fast) + echo timer > "$LED_PATH/trigger" 2>/dev/null || { + echo "[!] Blink not supported, setting ON" >&2 + echo 1 > "$LED_PATH/brightness" + exit 0 + } + echo 100 > "$LED_PATH/delay_on" 2>/dev/null || true + echo 100 > "$LED_PATH/delay_off" 2>/dev/null || true + ;; + *) + echo "[!] Invalid action: $ACTION" >&2 + echo "[*] Valid actions: on, off, blink, blink_fast" >&2 + exit 1 + ;; +esac + +logger -t ledcontrol "LED '$LED_NAME' set to '$ACTION'" + +# Only print to stdout if running interactively (not from a script/service) +[ -t 1 ] && echo "[+] LED '$LED_NAME' set to '$ACTION'" From ebfaa6b3960756e45a803c1b88a0338543fa29c4 Mon Sep 17 00:00:00 2001 From: Miguel Fuertes Date: Wed, 22 Oct 2025 11:55:23 +0200 Subject: [PATCH 09/11] Remove inotifywait and inotifywatch dependencies from MiFi package --- diffconfig_m9s | 3 --- packages/configs-mifi/Makefile | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/diffconfig_m9s b/diffconfig_m9s index d986a7c..3664dda 100644 --- a/diffconfig_m9s +++ b/diffconfig_m9s @@ -15,8 +15,6 @@ CONFIG_PACKAGE_bash=y CONFIG_PACKAGE_cgi-io=y CONFIG_PACKAGE_dbus=y CONFIG_PACKAGE_glib2=y -CONFIG_PACKAGE_inotifywait=y -CONFIG_PACKAGE_inotifywatch=y CONFIG_PACKAGE_ip-tiny=y CONFIG_PACKAGE_kmod-crypto-kpp=y CONFIG_PACKAGE_kmod-crypto-lib-chacha20=y @@ -32,7 +30,6 @@ CONFIG_PACKAGE_libdbus=y CONFIG_PACKAGE_libexpat=y CONFIG_PACKAGE_libfdisk=y CONFIG_PACKAGE_libffi=y -CONFIG_PACKAGE_libinotifytools=y CONFIG_PACKAGE_libiwinfo=y CONFIG_PACKAGE_libiwinfo-data=y CONFIG_PACKAGE_liblua=y diff --git a/packages/configs-mifi/Makefile b/packages/configs-mifi/Makefile index ab1d7b1..1036c02 100644 --- a/packages/configs-mifi/Makefile +++ b/packages/configs-mifi/Makefile @@ -11,7 +11,7 @@ define Package/$(PKG_NAME) SECTION:=Utilities CATEGORY:=Utilities TITLE:=Default Settings For MiFis - DEPENDS:=+PACKAGE_luci:luci-proto-modemmanager +ledcontrol +kmod-button-hotplug +inotifywait + DEPENDS:=+PACKAGE_luci:luci-proto-modemmanager +ledcontrol +kmod-button-hotplug endef # Optional description From 46d78ab19c47699e81c1c8938306d4dfe6aea433 Mon Sep 17 00:00:00 2001 From: Miguel Fuertes Date: Wed, 22 Oct 2025 12:36:45 +0200 Subject: [PATCH 10/11] Refactor battery monitoring LED control logic and update package dependencies --- msm89xx/image/msm8916.mk | 6 +++--- packages/configs-dongle/Makefile | 4 ++-- .../configs-mifi/files/battery-monitor.init | 18 ++++++++++++------ 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/msm89xx/image/msm8916.mk b/msm89xx/image/msm8916.mk index 82de291..4d90a8a 100644 --- a/msm89xx/image/msm8916.mk +++ b/msm89xx/image/msm8916.mk @@ -35,7 +35,7 @@ define Device/yiming-uz801v3 FILESYSTEMS := squashfs DEVICE_PACKAGES := configs-dongle wpad-basic-wolfssl rmtfs uci-usb-gadget \ block-mount f2fs-tools prepare-rootfs-data \ - msm-firmware-dumper ledcontrol + msm-firmware-dumper endef TARGET_DEVICES += yiming-uz801v3 @@ -46,7 +46,7 @@ define Device/generic-uf02 FILESYSTEMS := squashfs DEVICE_PACKAGES := configs-dongle wpad-basic-wolfssl rmtfs uci-usb-gadget \ block-mount f2fs-tools prepare-rootfs-data \ - msm-firmware-dumper ledcontrol + msm-firmware-dumper endef TARGET_DEVICES += generic-uf02 @@ -70,7 +70,7 @@ define Device/generic-m9s FILESYSTEMS := squashfs DEVICE_PACKAGES := configs-mifi wpad-basic-wolfssl rmtfs uci-usb-gadget \ block-mount f2fs-tools prepare-rootfs-data \ - msm-firmware-dumper ledcontrol + msm-firmware-dumper endef TARGET_DEVICES += generic-m9s diff --git a/packages/configs-dongle/Makefile b/packages/configs-dongle/Makefile index 33e8eee..96512b1 100644 --- a/packages/configs-dongle/Makefile +++ b/packages/configs-dongle/Makefile @@ -34,10 +34,10 @@ define Package/$(PKG_NAME)/install $(INSTALL_BIN) ./files/luci-app-tailscale*.apk $(1)/root/ $(INSTALL_DIR) $(1)/etc/hotplug.d/ieee80211 - $(INSTALL_DATA) ./files/99-wifi-led $(1)/etc/hotplug.d/ieee80211/ + $(INSTALL_DATA) ./files/hotplugs/99-wifi-led $(1)/etc/hotplug.d/ieee80211/ $(INSTALL_DIR) $(1)/etc/hotplug.d/iface - $(INSTALL_DATA) ./files/99-modem-led $(1)/etc/hotplug.d/iface/ + $(INSTALL_DATA) ./files/hotplugs/99-modem-led $(1)/etc/hotplug.d/iface/ endef define Package/$(PKG_NAME)/postinst diff --git a/packages/configs-mifi/files/battery-monitor.init b/packages/configs-mifi/files/battery-monitor.init index 345ee70..1c33261 100644 --- a/packages/configs-mifi/files/battery-monitor.init +++ b/packages/configs-mifi/files/battery-monitor.init @@ -50,15 +50,16 @@ get_capacity() { show_battery_temp() { local capacity=$(get_capacity) + # Clear both LEDs first ledcontrol $LED_RED off 2>/dev/null ledcontrol $LED_GREEN off 2>/dev/null - if [ "$capacity" -lt 20 ]; then + # Show battery level with 2 states (button press) + if [ "$capacity" -lt 50 ]; then + # Low battery: solid red ledcontrol $LED_RED on 2>/dev/null - elif [ "$capacity" -lt 50 ]; then - ledcontrol $LED_RED on 2>/dev/null - ledcontrol $LED_GREEN on 2>/dev/null else + # Good battery: solid green ledcontrol $LED_GREEN on 2>/dev/null fi @@ -75,21 +76,26 @@ update_led() { if [ "$charging" = "1" ]; then local capacity=$(get_capacity) + # Clear both LEDs first ledcontrol $LED_RED off 2>/dev/null ledcontrol $LED_GREEN off 2>/dev/null + # 3 charging states if [ "$capacity" -ge 95 ]; then + # Fully charged: solid green ledcontrol $LED_GREEN on 2>/dev/null logger -t battery-monitor "Charging complete: ${capacity}%" elif [ "$capacity" -ge 50 ]; then - ledcontrol $LED_RED blink 2>/dev/null & - ledcontrol $LED_GREEN blink 2>/dev/null & + # Charging medium/high: blinking green + ledcontrol $LED_GREEN blink 2>/dev/null logger -t battery-monitor "Charging: ${capacity}%" else + # Charging low: blinking red ledcontrol $LED_RED blink 2>/dev/null logger -t battery-monitor "Charging low: ${capacity}%" fi else + # Not charging: turn off LEDs ledcontrol $LED_RED off 2>/dev/null ledcontrol $LED_GREEN off 2>/dev/null fi From d3d35633cab7591f0f79a3a3cac170eb42569421 Mon Sep 17 00:00:00 2001 From: Miguel Fuertes Date: Wed, 22 Oct 2025 16:29:03 +0200 Subject: [PATCH 11/11] Update README with device specifications and fastboot/EDL mode instructions for UF02 and MiFi M9S --- enable_all_bands.md | 12 ------------ readme.md | 12 +++++++++++- 2 files changed, 11 insertions(+), 13 deletions(-) delete mode 100644 enable_all_bands.md diff --git a/enable_all_bands.md b/enable_all_bands.md deleted file mode 100644 index 2b5d476..0000000 --- a/enable_all_bands.md +++ /dev/null @@ -1,12 +0,0 @@ -### Enter DIAG -```shell -adb shell -setprop service.adb.root 1; busybox killall adbd -adb shell -setprop sys.usb.config diag,adb - -adb shell "setprop service.adb.root 1; busybox killall adbd" -adb shell "setprop sys.usb.config diag,adb" -``` - -> If in linux, now connect to Windows VM and open QXDM \ No newline at end of file diff --git a/readme.md b/readme.md index b33daf3..69ca72f 100644 --- a/readme.md +++ b/readme.md @@ -30,7 +30,9 @@ OpenWrt Project is a Linux operating system targeting embedded devices. Instead | Device | OpenWrt Target | SoC | RAM | Storage | Display | Battery | Notes | |--------|----------------|-----|-----|---------|---------|---------|-------| | **UZ801v3** | `yiming-uz801v3` | MSM8916 | 384MB | 4GB | ❌ | ❌ | USB dongle form factor | +| **UF02** | `generic-uf02` | MSM8916 | 384MB | 4GB | ❌ | ❌ | USB dongle form factor most likely with only asian bands. _(Can be somewhat changed via QPST and the `qcn` file from uz801)_ | | **MiFi M68E** | `generic-mf68e` | MSM8916 | 384MB | 4GB | ✅ GC9107 | ✅ | Portable hotspot with interactive display | +| **MiFi M9S** | `generic-mf9s` | MSM8916 | 384MB | 4GB | ❌ (Leds) | ✅ | Portable hotspot| ## Features @@ -114,7 +116,15 @@ make -j$(nproc) - **Fastboot mode**: Insert device while holding the button - **EDL mode**: Boot to fastboot first, then execute: `fastboot oem reboot-edl` -#### MiFi M68E +#### UF02 +- **Fastboot mode**: + - From OEM: `adb reboot bootloader`. + - From OpenWrt: Enter `edl` and erase boot partition (`edl e boot`). +- **EDL mode**: + - From OEM: `adb reboot bootloader`, flash `lk2nd` aboot. Reboot pressing the button. + - From OpenWrt: Insert device while holding the button. + +#### MiFi M68E or M9S - **Fastboot mode from OpenWrt**: Enter `edl` mode and erase boot partition (`edl e boot`). This will force bootloader. - **EDL mode**: - From OEM: `adb reboot edl`