#!/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"