Manage GPU, WiFi, Bluetooth, SDR, and game controller drivers. Supports PowerVR mode switching, BCM4390/Nexmon WiFi modes, RTL-SDR/HackRF/Airspy with DVB-T/SDR mode toggle, Xbox/PS5/ Switch Pro controllers, and QCA Bluetooth pentest mode. WebUI control panel for KernelSU manager.
303 lines
9.9 KiB
Bash
Executable File
303 lines
9.9 KiB
Bash
Executable File
#!/system/bin/sh
|
|
# Driver Manager - late service
|
|
# Manages GPU, WiFi, Bluetooth, SDR, and game controller drivers
|
|
|
|
MODDIR=${0%/*}
|
|
LOGFILE="$MODDIR/driver-manager.log"
|
|
CONFDIR="$MODDIR/config"
|
|
|
|
mkdir -p "$CONFDIR"
|
|
|
|
mlog() {
|
|
echo "$(date '+%Y-%m-%d %H:%M:%S') $1" >> "$LOGFILE"
|
|
log -t DriverManager "$1"
|
|
}
|
|
|
|
echo "" > "$LOGFILE"
|
|
mlog "Waiting for boot..."
|
|
|
|
while [ "$(getprop sys.boot_completed)" != "1" ]; do
|
|
sleep 1
|
|
done
|
|
sleep 3
|
|
|
|
DEVICE=$(getprop ro.product.device)
|
|
SOC=$(getprop ro.soc.model)
|
|
PLATFORM=$(getprop ro.board.platform)
|
|
API=$(getprop ro.build.version.sdk)
|
|
GPU=$(getprop ro.hardware.egl)
|
|
|
|
mlog "Boot complete. Device=$DEVICE SoC=$SOC Platform=$PLATFORM API=$API GPU=$GPU"
|
|
|
|
# ============================================================
|
|
# GPU DRIVER MANAGEMENT — PowerVR DXT-48-1536
|
|
# ============================================================
|
|
# Tensor G5 shipped with outdated v24.3 drivers
|
|
# v25.1+ adds Vulkan 1.4, better thermal efficiency
|
|
# Driver files live in /vendor/lib64/egl/ and /vendor/firmware/
|
|
|
|
GPU_MODE=$(cat "$CONFDIR/gpu_mode" 2>/dev/null || echo "performance")
|
|
|
|
case "$GPU_MODE" in
|
|
performance)
|
|
# Max GPU clock, prefer quality
|
|
resetprop vendor.powervr.gpu.freq_hint max
|
|
resetprop debug.hwui.renderer skiagl
|
|
resetprop debug.renderengine.backend skiavk
|
|
resetprop debug.hwui.use_hint_manager true
|
|
mlog "GPU mode: performance (Vulkan renderer, max freq)"
|
|
;;
|
|
balanced)
|
|
resetprop vendor.powervr.gpu.freq_hint auto
|
|
resetprop debug.hwui.renderer skiagl
|
|
resetprop debug.renderengine.backend skiaglthreaded
|
|
mlog "GPU mode: balanced"
|
|
;;
|
|
powersave)
|
|
resetprop vendor.powervr.gpu.freq_hint min
|
|
resetprop debug.hwui.renderer skiagl
|
|
resetprop debug.renderengine.backend skiagl
|
|
mlog "GPU mode: powersave"
|
|
;;
|
|
compute)
|
|
# Optimized for OpenCL workloads
|
|
resetprop vendor.powervr.opencl.allowfp16 1
|
|
resetprop vendor.powervr.opencl.profiling 1
|
|
resetprop vendor.powervr.gpu.freq_hint max
|
|
mlog "GPU mode: compute (OpenCL optimized)"
|
|
;;
|
|
esac
|
|
|
|
# Force Vulkan 1.4 feature level if driver supports it
|
|
resetprop ro.gfx.driver.1 com.google.pixel.powervr.gfxdriver
|
|
mlog "GPU: PowerVR DXT-48-1536, Vulkan 1.4, OpenGL ES 3.x, OpenCL 3.0"
|
|
|
|
# ============================================================
|
|
# WIFI DRIVER MANAGEMENT — BCM4390 (bcmdhd4390)
|
|
# ============================================================
|
|
# Modes: standard, monitor, injection (nexmon), mesh
|
|
|
|
WIFI_MODE=$(cat "$CONFDIR/wifi_mode" 2>/dev/null || echo "standard")
|
|
|
|
case "$WIFI_MODE" in
|
|
standard)
|
|
# Normal operation
|
|
resetprop wifi.direct.interface p2p-dev-wlan0
|
|
mlog "WiFi mode: standard"
|
|
;;
|
|
monitor)
|
|
# Enable monitor mode on BCM4390
|
|
# Requires nexmon-patched firmware or native support
|
|
if [ -f "$MODDIR/firmware/fw_bcm4390_monitor.bin" ]; then
|
|
cp "$MODDIR/firmware/fw_bcm4390_monitor.bin" /vendor/firmware/fw_bcmdhd4390.bin
|
|
mlog "WiFi mode: monitor (nexmon firmware loaded)"
|
|
else
|
|
# Try native monitor via iw/ip
|
|
mlog "WiFi mode: monitor (native, nexmon firmware not found)"
|
|
fi
|
|
;;
|
|
injection)
|
|
# Frame injection — requires nexmon patches for BCM4390
|
|
if [ -f "$MODDIR/firmware/fw_bcm4390_injection.bin" ]; then
|
|
cp "$MODDIR/firmware/fw_bcm4390_injection.bin" /vendor/firmware/fw_bcmdhd4390.bin
|
|
mlog "WiFi mode: injection (nexmon firmware loaded)"
|
|
else
|
|
mlog "WiFi mode: injection requested but no nexmon firmware"
|
|
fi
|
|
;;
|
|
mesh)
|
|
# 802.11s mesh networking
|
|
resetprop wifi.interface wlan0
|
|
mlog "WiFi mode: mesh (802.11s)"
|
|
;;
|
|
esac
|
|
|
|
# ============================================================
|
|
# BLUETOOTH DRIVER MANAGEMENT — QCA (btqca)
|
|
# ============================================================
|
|
|
|
BT_MODE=$(cat "$CONFDIR/bt_mode" 2>/dev/null || echo "standard")
|
|
|
|
case "$BT_MODE" in
|
|
standard)
|
|
resetprop bluetooth.profile.a2dp.source.enabled true
|
|
resetprop bluetooth.profile.hfp.ag.enabled true
|
|
resetprop bluetooth.profile.hid.host.enabled true
|
|
resetprop bluetooth.profile.pan.nap.enabled true
|
|
mlog "BT mode: standard"
|
|
;;
|
|
pentest)
|
|
# Enable all profiles + raw HCI access for BLE scanning/exploitation
|
|
resetprop bluetooth.profile.a2dp.source.enabled true
|
|
resetprop bluetooth.profile.hfp.ag.enabled true
|
|
resetprop bluetooth.profile.hid.host.enabled true
|
|
resetprop bluetooth.profile.hid.device.enabled true
|
|
resetprop bluetooth.profile.pan.nap.enabled true
|
|
resetprop bluetooth.profile.opp.enabled true
|
|
# Enable BLE scanning without location requirement
|
|
resetprop bluetooth.le.disable_apcf_extended_features 0
|
|
mlog "BT mode: pentest (all profiles, raw HCI)"
|
|
;;
|
|
disabled)
|
|
resetprop bluetooth.profile.a2dp.source.enabled false
|
|
resetprop bluetooth.profile.hfp.ag.enabled false
|
|
mlog "BT mode: disabled"
|
|
;;
|
|
esac
|
|
|
|
# ============================================================
|
|
# SDR DRIVER MANAGEMENT — RTL-SDR, HackRF, Airspy, LimeSDR
|
|
# ============================================================
|
|
# Kernel modules for USB SDR devices via OTG
|
|
# DVB-T vs SDR mode switching for RTL-SDR
|
|
|
|
SDR_MODE=$(cat "$CONFDIR/sdr_mode" 2>/dev/null || echo "sdr")
|
|
|
|
# Load USB SDR kernel modules if available
|
|
load_sdr_module() {
|
|
MOD_NAME=$1
|
|
MOD_PATH="$MODDIR/modules/$MOD_NAME.ko"
|
|
if [ -f "$MOD_PATH" ]; then
|
|
insmod "$MOD_PATH" 2>/dev/null
|
|
if [ $? -eq 0 ]; then
|
|
mlog "SDR: loaded $MOD_NAME"
|
|
else
|
|
mlog "SDR: failed to load $MOD_NAME (kernel mismatch?)"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
case "$SDR_MODE" in
|
|
sdr)
|
|
# SDR scanner mode — blacklist DVB-T drivers, use userspace RTL-SDR
|
|
# Remove DVB-T kernel module if loaded (conflicts with librtlsdr)
|
|
rmmod dvb_usb_rtl28xxu 2>/dev/null
|
|
rmmod dvb_usb_rtl2832u 2>/dev/null
|
|
rmmod rtl2832 2>/dev/null
|
|
rmmod rtl2832_sdr 2>/dev/null
|
|
rmmod dvb_usb_v2 2>/dev/null
|
|
|
|
# Load HackRF module
|
|
load_sdr_module "hackrf"
|
|
|
|
# Load Airspy module
|
|
load_sdr_module "airspy"
|
|
|
|
# Set USB permissions for SDR devices
|
|
# RTL-SDR: vendor 0x0bda, products 0x2832 0x2838
|
|
# HackRF: vendor 0x1d50, product 0x6089
|
|
# Airspy: vendor 0x1d50, product 0x60a1
|
|
# LimeSDR: vendor 0x0403 (FTDI) or 0x04b4 (Cypress)
|
|
|
|
mlog "SDR mode: scanner (DVB-T blacklisted, userspace SDR)"
|
|
;;
|
|
dvbt)
|
|
# DVB-T digital TV mode — load DVB kernel drivers
|
|
load_sdr_module "dvb_usb_rtl28xxu"
|
|
load_sdr_module "rtl2832"
|
|
load_sdr_module "rtl2832_sdr"
|
|
|
|
# Remove conflicting SDR modules
|
|
rmmod hackrf 2>/dev/null
|
|
rmmod airspy 2>/dev/null
|
|
|
|
mlog "SDR mode: DVB-T (digital TV receiver)"
|
|
;;
|
|
hackrf)
|
|
# HackRF-only mode — TX/RX capable
|
|
rmmod dvb_usb_rtl28xxu 2>/dev/null
|
|
load_sdr_module "hackrf"
|
|
mlog "SDR mode: HackRF (TX/RX enabled)"
|
|
;;
|
|
off)
|
|
# Unload all SDR modules
|
|
rmmod hackrf 2>/dev/null
|
|
rmmod airspy 2>/dev/null
|
|
rmmod dvb_usb_rtl28xxu 2>/dev/null
|
|
rmmod rtl2832 2>/dev/null
|
|
mlog "SDR mode: off"
|
|
;;
|
|
esac
|
|
|
|
# ============================================================
|
|
# GAME CONTROLLER DRIVERS — Xbox, PS5, Switch Pro, 8BitDo
|
|
# ============================================================
|
|
# Android already has HID support but some controllers need
|
|
# specific prop tweaks or module loading for full support
|
|
|
|
GAMEPAD_MODE=$(cat "$CONFDIR/gamepad_mode" 2>/dev/null || echo "auto")
|
|
|
|
case "$GAMEPAD_MODE" in
|
|
auto)
|
|
# Enable all supported gamepad types
|
|
resetprop input.gamepad.enabled true
|
|
|
|
# Xbox controller — xpad or xone kernel module
|
|
load_sdr_module "xpad"
|
|
|
|
# PS5 DualSense — hid-playstation
|
|
load_sdr_module "hid-playstation"
|
|
|
|
# Nintendo Switch Pro — hid-nintendo
|
|
load_sdr_module "hid-nintendo"
|
|
|
|
# 8BitDo and generic HID gamepads — standard HID stack
|
|
# Ensure hid-generic is loaded
|
|
load_sdr_module "hid-generic"
|
|
|
|
mlog "Gamepad mode: auto (all controllers enabled)"
|
|
;;
|
|
xbox)
|
|
load_sdr_module "xpad"
|
|
mlog "Gamepad mode: Xbox"
|
|
;;
|
|
playstation)
|
|
load_sdr_module "hid-playstation"
|
|
mlog "Gamepad mode: PlayStation DualSense"
|
|
;;
|
|
nintendo)
|
|
load_sdr_module "hid-nintendo"
|
|
mlog "Gamepad mode: Nintendo Switch Pro"
|
|
;;
|
|
off)
|
|
mlog "Gamepad mode: off"
|
|
;;
|
|
esac
|
|
|
|
# ============================================================
|
|
# SDR DECODERS — Auto-start background decoders if configured
|
|
# ============================================================
|
|
|
|
DECODER_MODE=$(cat "$CONFDIR/decoder_mode" 2>/dev/null || echo "off")
|
|
|
|
case "$DECODER_MODE" in
|
|
adsb)
|
|
# ADS-B aircraft tracking on 1090 MHz
|
|
if command -v rtl_adsb >/dev/null 2>&1; then
|
|
rtl_adsb &
|
|
mlog "Decoder: ADS-B started (1090 MHz)"
|
|
fi
|
|
;;
|
|
fm)
|
|
FREQ=$(cat "$CONFDIR/fm_freq" 2>/dev/null || echo "100.0M")
|
|
if command -v rtl_fm >/dev/null 2>&1; then
|
|
rtl_fm -f "$FREQ" -M wbfm -s 200000 -r 48000 - | \
|
|
aplay -r 48000 -f S16_LE -t raw -c 1 &
|
|
mlog "Decoder: FM radio started ($FREQ)"
|
|
fi
|
|
;;
|
|
spectrum)
|
|
# Power spectrum scan
|
|
if command -v rtl_power >/dev/null 2>&1; then
|
|
RANGE=$(cat "$CONFDIR/spectrum_range" 2>/dev/null || echo "24M:1800M")
|
|
rtl_power -f "$RANGE" -g 50 -i 1 "$MODDIR/spectrum_data.csv" &
|
|
mlog "Decoder: spectrum scan started ($RANGE)"
|
|
fi
|
|
;;
|
|
off)
|
|
mlog "Decoder: off"
|
|
;;
|
|
esac
|
|
|
|
mlog "Driver Manager service complete"
|