#!/bin/sh -e BT_PINCTRL_DIR="/sys/firmware/devicetree/base/pinctrl/wireless-bluetooth" CHIPS_FILE="/var/run/wifibt-chips.txt" CHIP_FILE="/var/run/wifibt-info.txt" bt_tty() { if [ ! -d "$BT_PINCTRL_DIR" ]; then # No uart BT case "$(wifibt_bus)" in usb | "") return ;; esac # Fallback to the first uart device find /dev/ -name "ttyS*" | sort | head -n 1 echo "# Missing $(basename "$BT_PINCTRL_DIR") in kernel dts" >&2 else UART_DIR=$(find "$BT_PINCTRL_DIR/" -name "uart*" | head -n 1) echo "$UART_DIR" | sed 's~.*uart\([0-9]\+\).*~/dev/ttyS\1~' fi } wifibt_info() { if [ -r "$CHIP_FILE" ]; then cat "$CHIP_FILE" return fi VIDS="$(grep -v "^#" "$CHIPS_FILE" | cut -f3 | cut -d":" -f1 | \ sort | uniq | xargs | tr ' ' '|')" VENDORS="$(find \ /sys/bus/usb/devices/*/ \ /sys/bus/pci/devices/*/ \ /sys/bus/sdio/devices/*/ \ -type f -name vendor -o -name idVendor 2>/dev/null | \ xargs grep -El "$VIDS" || true)" for VENDOR in $VENDORS; do BUS=$(echo "$VENDOR" | cut -d'/' -f4) case $BUS in usb) PRODUCT="$(dirname "$VENDOR")/idProduct" ;; *) PRODUCT="$(dirname "$VENDOR")/device" ;; esac VID="$(sed 's/^0x//' "$VENDOR")" PID="$(sed 's/^0x//' "$PRODUCT")" ID="$VID:$PID" CHIP="$(grep -v "^#" "$CHIPS_FILE" | grep -w -m 1 "$ID" || true)" if [ "$CHIP" ]; then echo "$CHIP" | sed "s/\($ID\)/$BUS\t\1/" | \ tee "$CHIP_FILE" return fi done } wifibt_vendor() { wifibt_info | cut -f 1 } wifibt_chip() { wifibt_info | cut -f 2 } wifibt_bus() { wifibt_info | cut -f 3 } wifibt_id() { wifibt_info | cut -f 4 } wifibt_module() { FIRST_KO=`wifibt_info | cut -f 5` SECOND_KO=`wifibt_info | cut -f 6` if [[ "$SECOND_KO" =~ "cyw" ]] && [ -e "/lib/modules/$SECOND_KO" ]; then echo "$SECOND_KO" else echo "$FIRST_KO" fi } if [ ! -r "$CHIPS_FILE" ]; then echo "# Vendor Name VID:PID Module\n" > "$CHIPS_FILE" # Prefer /etc/ version cat "/etc/wifibt-chips.txt" >>"$CHIPS_FILE" 2>/dev/null || true # Append built-in chip list cat << EOF >> "$CHIPS_FILE" Realtek RTL8188EU 0bda:0179 RTL8188EU.ko Realtek RTL8188EU 0bda:8179 RTL8188EU.ko Realtek RTL8188FU 0bda:f179 RTL8189FU.ko Realtek RTL8189ES 024c:8179 RTL8189ES.ko Realtek RTL8189FS 024c:f179 RTL8189FS.ko Realtek RTL8192DU 0bda:8194 RTL8192DU.ko Realtek RTL8192EU 0bda:818b RTL8192EU.ko Realtek RTL8723BS 024c:b723 RTL8723BS.ko Realtek RTL8723BU 0bda:b720 RTL8723BU.ko Realtek RTL8723CS 024c:b703 RTL8723CS.ko Realtek RTL8723DS 024c:d723 RTL8723DS.ko Realtek RTL8812AU 0bda:8812 RTL8812AU.ko Realtek RTL8821CS 024c:c821 RTL8821CS.ko Realtek RTL8821CS 0bda:c821 RTL8821CS.ko Realtek RTL8822BE 10ec:b822 RTL8822BE.ko Realtek RTL8822BS 024c:b822 RTL8822BS.ko Realtek RTL8822BU 0bda:b82c RTL8822BU.ko Realtek RTL8822CE 0bda:c123 RTL8822CE.ko Realtek RTL8822CE 10ec:c822 RTL8822CE.ko Realtek RTL8822CS 024c:c822 RTL8822CS.ko Realtek RTL8822CS 0bda:c822 RTL8822CS.ko Realtek RTL8852BE 10ec:b852 8852be.ko Realtek RTL8852BS 024c:b852 8852bs.ko Realtek RTL8852BU 0bda:a85b 8852bu.ko Broadcom AP6212A 02d0:a9a6 bcmdhd.ko Broadcom AP625X 02d0:a9bf bcmdhd.ko cyw43455.ko # AP6255/AP6256/AP6745 Broadcom AP6275P 14e4:449d bcmdhd_pcie.ko Broadcom AP6275S 02d0:aae8 bcmdhd.ko Broadcom AP6276P 14e4:44a0 bcmdhd_pcie.ko Broadcom AP6276S 02d0:aaec bcmdhd.ko Broadcom AP6330 02d0:4330 bcmdhd.ko Broadcom AP6335 02d0:4335 bcmdhd.ko Broadcom AP6354 02d0:4354 bcmdhd.ko Broadcom AP6356S 02d0:4356 bcmdhd.ko Broadcom AP6398S 02d0:4359 bcmdhd.ko Rockchip RK960 0296:5349 rk960.ko EOF fi if [ -e "$CHIP_FILE" ]; then # Invalid out-dated cache file if [ "$CHIP_FILE" -ot "$CHIPS_FILE" ] || [ "$CHIP_FILE" -ot "$(realpath "$0")" ]; then rm -f "$CHIP_FILE" fi fi for cmd in "$(basename "$0")" "$1"; do # Invalid cache file when forcing reload case "$1" in -f | --force-reload) rm -f "$CHIP_FILE" ;; esac case "$cmd" in tty | bt-tty) bt_tty; exit ;; info | wifibt-info) wifibt_info; exit ;; vendor | wifibt-vendor) wifibt_vendor; exit ;; chip | wifibt-chip) wifibt_chip; exit ;; id | wifibt-id) wifibt_id; exit ;; bus | wifibt-bus) wifibt_bus; exit ;; module | wifibt-module) wifibt_module; exit ;; esac [ -z "$1" ] || shift done echo "$(basename "$0") [-f|--force-reload]"