Merge pull request #19 from hkfuertes/uf02_new_device

Two new devices: UF02 & M9S
This commit is contained in:
Miguel Fuertes authored and GitHub committed 2025-10-22 16:31:15 +02:00
commit 350848eff0
28 files changed
+1129 -128

No files matched your search

+97
View File
@@ -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
+97
View File
@@ -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
+2 -1
View File
@@ -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
+94
View File
@@ -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
+95
View File
@@ -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
+26 -3
View File
@@ -33,22 +33,45 @@ 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
msm-firmware-dumper
endef
TARGET_DEVICES += yiming-uz801v3
define Device/generic-uf02
$(Device/msm8916)
DEVICE_VENDOR := Generic
DEVICE_MODEL := UF02 (250605 V0S)
FILESYSTEMS := squashfs
DEVICE_PACKAGES := configs-dongle wpad-basic-wolfssl rmtfs uci-usb-gadget \
block-mount f2fs-tools prepare-rootfs-data \
msm-firmware-dumper
endef
TARGET_DEVICES += generic-uf02
define Device/generic-mf68e
$(Device/msm8916)
DEVICE_VENDOR := Generic
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
TARGET_DEVICES += generic-mf68e
define Device/generic-m9s
$(Device/msm8916)
DEVICE_VENDOR := Generic
DEVICE_MODEL := M9S
FILESYSTEMS := squashfs
DEVICE_PACKAGES := configs-mifi wpad-basic-wolfssl rmtfs uci-usb-gadget \
block-mount f2fs-tools prepare-rootfs-data \
msm-firmware-dumper
endef
TARGET_DEVICES += generic-m9s
endif
@@ -11,11 +11,13 @@ Signed-off-by: hkfuertes <hkfuertes@example.com>
--- 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,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
@@ -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 <dt-bindings/leds/common.h>
+
+/ {
+ 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";
+};
@@ -0,0 +1,134 @@
--- /dev/null
+++ b/arch/arm64/boot/dts/qcom/msm8916-generic-m9s.dts
@@ -0,0 +1,131 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+/dts-v1/;
+
+#include "msm8916-ufi.dtsi"
+
+#include <dt-bindings/leds/common.h>
+
+/ {
+ model = "M9S 4G LTE Mobile WiFi Router";
+ compatible = "generic,m9s", "qcom,msm8916";
+
+ 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: usb-id {
+ compatible = "linux,extcon-usb-gpio";
+ id-gpios = <&tlmm 110 GPIO_ACTIVE_HIGH>;
+ pinctrl-names = "default";
+ pinctrl-0 = <&usb_id_default>;
+ };
+
+ leds-extra {
+ compatible = "gpio-leds";
+
+ led-wlan-red {
+ function = LED_FUNCTION_WLAN;
+ color = <LED_COLOR_ID_RED>;
+ gpios = <&tlmm 84 GPIO_ACTIVE_HIGH>;
+ };
+
+ led-wan-green {
+ function = LED_FUNCTION_WAN;
+ color = <LED_COLOR_ID_GREEN>;
+ gpios = <&tlmm 85 GPIO_ACTIVE_HIGH>;
+ };
+
+ led-battery-green {
+ function = LED_FUNCTION_CHARGING;
+ color = <LED_COLOR_ID_GREEN>;
+ gpios = <&tlmm 0 GPIO_ACTIVE_HIGH>;
+ default-state = "on";
+ };
+ };
+};
+
+&usb {
+ extcon = <&usb_id>, <&usb_id>;
+};
+
+&usb_hs_phy {
+ extcon = <&usb_id>;
+};
+
+&button_restart {
+ gpios = <&tlmm 102 GPIO_ACTIVE_LOW>;
+};
+
+&led_r {
+ function = LED_FUNCTION_WAN;
+ color = <LED_COLOR_ID_RED>;
+ gpios = <&tlmm 72 GPIO_ACTIVE_HIGH>;
+};
+
+&led_g {
+ function = LED_FUNCTION_WLAN;
+ color = <LED_COLOR_ID_GREEN>;
+ gpios = <&tlmm 73 GPIO_ACTIVE_HIGH>;
+};
+
+&led_b {
+ function = LED_FUNCTION_CHARGING;
+ color = <LED_COLOR_ID_RED>;
+ gpios = <&tlmm 1 GPIO_ACTIVE_HIGH>;
+};
+
+&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>;
+};
+
+&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 = "gpio0", "gpio1", "gpio72", "gpio73", "gpio84", "gpio85";
+};
+
+&pm8916_0 {
+ pon@800 {
+ watchdog {
+ status = "disabled";
+ };
+ };
+};
+172
View File
@@ -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 = <VADC_LR_MUX2_BAT_ID>;
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 = <PM8916_GPIO_VPH>;
};
};
```
#### 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 = <PMIC_GPIO_PULL_UP_30>; // 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)
@@ -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/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/
endef
define Package/$(PKG_NAME)/postinst
@@ -4,11 +4,11 @@
case "$ACTION:$INTERFACE" in
ifup:modem)
ledcontrol wan on
ledcontrol green:wan on
logger -t modem-led "Modem UP - Green LED ON"
;;
ifdown:modem)
ledcontrol wan off
ledcontrol green:wan off
logger -t modem-led "Modem DOWN - Green LED OFF"
;;
esac
@@ -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
;;
@@ -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
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
@@ -0,0 +1,185 @@
#!/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)
# Clear both LEDs first
ledcontrol $LED_RED off 2>/dev/null
ledcontrol $LED_GREEN off 2>/dev/null
# Show battery level with 2 states (button press)
if [ "$capacity" -lt 50 ]; then
# Low battery: solid red
ledcontrol $LED_RED on 2>/dev/null
else
# Good battery: solid green
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)
# 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
# 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
}
# 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
}
@@ -0,0 +1,14 @@
#!/bin/sh
# /etc/hotplug.d/button/50-battery-show
[ "$BUTTON" = "power" ] || exit 0
[ "$ACTION" = "pressed" ] || exit 0
charging=$(cat /sys/class/power_supply/pm8916-lbc-chgr/online 2>/dev/null || echo 0)
if [ "$charging" = "0" ]; then
[ -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
@@ -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
@@ -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
@@ -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
}
+3 -9
View File
@@ -16,7 +16,7 @@ endef
define Package/ledcontrol/description
Simple utility to control device LEDs via sysfs
Usage: ledcontrol <color> <on|off|blink|blink_fast>
Usage: ledcontrol <color:function> <on|off|blink|blink_fast>
Includes hotplug scripts for WiFi and modem LED management
endef
@@ -24,14 +24,8 @@ define Build/Compile
endef
define Package/ledcontrol/install
$(INSTALL_DIR) $(1)/usr/sbin
$(INSTALL_BIN) ./files/ledcontrol $(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)/usr/bin
$(INSTALL_BIN) ./ledcontrol.sh $(1)/usr/bin/ledcontrol
endef
$(eval $(call BuildPackage,ledcontrol))
-87
View File
@@ -1,87 +0,0 @@
#!/bin/sh
# LED Control Utility for OpenWrt
# Usage: ledcontrol <color> <on|off|blink|blink_fast>
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 <color> <on|off|blink|blink_fast>" >&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
+75
View File
@@ -0,0 +1,75 @@
#!/bin/sh
# LED Control Utility for OpenWrt
# Usage: ledcontrol <color:function> <on|off|blink|blink_fast>
# Examples:
# ledcontrol green:wan on
# ledcontrol blue:wlan blink
# ledcontrol red:charging off
set -e
# Parse arguments
if [ $# -ne 2 ]; then
echo "Usage: ledcontrol <color:function> <on|off|blink|blink_fast>" >&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'"
+11 -1
View File
@@ -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`