#!/bin/bash -e DEFAULT_ROOTFS_DIR=buildroot/output/$RK_BUILDROOT_CFG/target # Usage: build_wifibt [wifi chip] [bt tty dev] build_wifibt() { check_config RK_KERNEL_CFG RK_WIFIBT_CHIP || return 0 ROOTFS_DIR="${1:-$DEFAULT_ROOTFS_DIR}" WIFI_CHIP="${2:-$RK_WIFIBT_CHIP}" BT_TTY_DEV="${3:-$RK_WIFIBT_TTY}" echo "==========================================" echo " Start building wifi/BT ($WIFI_CHIP - $BT_TTY_DEV)" echo "==========================================" if ls "$ROOTFS_DIR/lib/" | grep -wq ld-linux-armhf.so; then ROOTFS_ARCH=arm else ROOTFS_ARCH=arm64 fi RKWIFIBT=$SDK_DIR/external/rkwifibt OWNER=$(stat --format %U "$RKWIFIBT") if [ "$OWNER" != "root" ]; then if [ "${USER:-$(id -un)}" = "root" ]; then # Fixing up rkwifibt permissions find "$RKWIFIBT" -user root \ -exec chown -h -R $OWNER:$OWNER {} \; # Sudo to source code owner (for Debian) export KMAKE="sudo -u $OWNER $KMAKE" else # Check for dirty files owned by root echo -e "\e[36m" if find "$RKWIFIBT" -user 0 | grep ""; then echo -e "\e[31m" echo "$RKWIFIBT is dirty for non-root building!" echo "Please clear it:" echo "cd $RKWIFIBT" echo "git add -f ." echo "sudo git reset --hard" echo -e "\e[0m" exit 1 fi echo -e "\e[0m" fi fi # Make sure that the kernel is ready if [ ! -r kernel/include/generated/asm-offsets.h ]; then echo "Kernel is not ready, building it for wifi/BT..." "$SCRIPTS_DIR/mk-kernel.sh" fi # Check kernel config WIFI_USB=`grep "CONFIG_USB=y" kernel/.config` || true WIFI_SDIO=`grep "CONFIG_MMC=y" kernel/.config` || true WIFI_PCIE=`grep "CONFIG_PCIE_DW_ROCKCHIP=y" kernel/.config` || true WIFI_RFKILL=`grep "CONFIG_RFKILL=y" kernel/.config` || true if [ -z "WIFI_SDIO" ]; then echo "=== WARNNING CONFIG_MMC not set !!! ===" fi if [ -z "WIFI_RFKILL" ]; then echo "=== WARNNING CONFIG_USB not set !!! ===" fi if [[ "$WIFI_CHIP" =~ "U" ]];then if [ -z "$WIFI_USB" ]; then echo "=== WARNNING CONFIG_USB not set so ABORT!!! ===" exit 0 fi fi echo "kernel config: $WIFI_USB $WIFI_SDIO $WIFI_RFKILL" if [[ "$WIFI_CHIP" =~ "ALL_AP" ]];then echo "building bcmdhd sdio" $KMAKE M=$RKWIFIBT/drivers/bcmdhd CONFIG_BCMDHD=m \ CONFIG_BCMDHD_SDIO=y CONFIG_BCMDHD_PCIE= if [ -n "$WIFI_PCIE" ]; then echo "building bcmdhd pcie" $KMAKE M=$RKWIFIBT/drivers/bcmdhd CONFIG_BCMDHD=m \ CONFIG_BCMDHD_PCIE=y CONFIG_BCMDHD_SDIO= fi if [ -n "$WIFI_USB" ]; then echo "building rtl8188fu usb" $KMAKE M=$RKWIFIBT/drivers/rtl8188fu modules fi echo "building rtl8189fs sdio" $KMAKE M=$RKWIFIBT/drivers/rtl8189fs modules echo "building rtl8723ds sdio" $KMAKE M=$RKWIFIBT/drivers/rtl8723ds modules echo "building rtl8821cs sdio" $KMAKE M=$RKWIFIBT/drivers/rtl8821cs modules echo "building rtl8822cs sdio" $KMAKE M=$RKWIFIBT/drivers/rtl8822cs modules echo "building rtl8852bs sdio" $KMAKE M=$RKWIFIBT/drivers/rtl8852bs modules \ DRV_PATH=$RKWIFIBT/drivers/rtl8852bs if [ -n "$WIFI_PCIE" ]; then echo "building rtl8852be pcie" $KMAKE M=$RKWIFIBT/drivers/rtl8852be modules \ DRV_PATH=$RKWIFIBT/drivers/rtl8852be fi fi if [[ "$WIFI_CHIP" =~ "ALL_CY" ]];then echo "building CYW4354" ln -sf chips/CYW4354_Makefile \ $RKWIFIBT/drivers/infineon/Makefile $KMAKE M=$RKWIFIBT/drivers/infineon echo "building CYW4373" ln -sf chips/CYW4373_Makefile \ $RKWIFIBT/drivers/infineon/Makefile $KMAKE M=$RKWIFIBT/drivers/infineon echo "building CYW43438" ln -sf chips/CYW43438_Makefile \ $RKWIFIBT/drivers/infineon/Makefile $KMAKE M=$RKWIFIBT/drivers/infineon echo "building CYW43455" ln -sf chips/CYW43455_Makefile \ $RKWIFIBT/drivers/infineon/Makefile $KMAKE M=$RKWIFIBT/drivers/infineon echo "building CYW5557X" ln -sf chips/CYW5557X_Makefile \ $RKWIFIBT/drivers/infineon/Makefile $KMAKE M=$RKWIFIBT/drivers/infineon if [ -n "$WIFI_PCIE" ]; then echo "building CYW5557X_PCIE" ln -sf chips/CYW5557X_PCIE_Makefile \ $RKWIFIBT/drivers/infineon/Makefile $KMAKE M=$RKWIFIBT/drivers/infineon echo "building CYW54591_PCIE" ln -sf chips/CYW54591_PCIE_Makefile \ $RKWIFIBT/drivers/infineon/Makefile $KMAKE M=$RKWIFIBT/drivers/infineon fi echo "building CYW54591" ln -sf chips/CYW54591_Makefile \ $RKWIFIBT/drivers/infineon/Makefile $KMAKE M=$RKWIFIBT/drivers/infineon if [ -n "$WIFI_USB" ]; then echo "building rtl8188fu usb" $KMAKE M=$RKWIFIBT/drivers/rtl8188fu modules fi echo "building rtl8189fs sdio" $KMAKE M=$RKWIFIBT/drivers/rtl8189fs modules echo "building rtl8723ds sdio" $KMAKE M=$RKWIFIBT/drivers/rtl8723ds modules echo "building rtl8821cs sdio" $KMAKE M=$RKWIFIBT/drivers/rtl8821cs modules echo "building rtl8822cs sdio" $KMAKE M=$RKWIFIBT/drivers/rtl8822cs modules echo "building rtl8852bs sdio" $KMAKE M=$RKWIFIBT/drivers/rtl8852bs modules \ DRV_PATH=$RKWIFIBT/drivers/rtl8852bs if [ -n "$WIFI_PCIE" ]; then echo "building rtl8852be pcie" $KMAKE M=$RKWIFIBT/drivers/rtl8852be modules \ DRV_PATH=$RKWIFIBT/drivers/rtl8852be fi fi if [[ "$WIFI_CHIP" =~ "AP6" ]];then if [[ "$WIFI_CHIP" = "AP6275_PCIE" ]];then echo "building bcmdhd pcie driver" $KMAKE M=$RKWIFIBT/drivers/bcmdhd CONFIG_BCMDHD=m \ CONFIG_BCMDHD_PCIE=y CONFIG_BCMDHD_SDIO= else echo "building bcmdhd sdio driver" $KMAKE M=$RKWIFIBT/drivers/bcmdhd CONFIG_BCMDHD=m \ CONFIG_BCMDHD_SDIO=y CONFIG_BCMDHD_PCIE= fi fi if [[ "$WIFI_CHIP" = "CYW4354" ]];then echo "building CYW4354" ln -sf chips/CYW4354_Makefile \ $RKWIFIBT/drivers/infineon/Makefile $KMAKE M=$RKWIFIBT/drivers/infineon fi if [[ "$WIFI_CHIP" = "CYW4373" ]];then echo "building CYW4373" ln -sf chips/CYW4373_Makefile \ $RKWIFIBT/drivers/infineon/Makefile $KMAKE M=$RKWIFIBT/drivers/infineon fi if [[ "$WIFI_CHIP" = "CYW43438" ]];then echo "building CYW43438" ln -sf chips/CYW43438_Makefile \ $RKWIFIBT/drivers/infineon/Makefile $KMAKE M=$RKWIFIBT/drivers/infineon fi if [[ "$WIFI_CHIP" = "CYW43455" ]];then echo "building CYW43455" ln -sf chips/CYW43455_Makefile \ $RKWIFIBT/drivers/infineon/Makefile $KMAKE M=$RKWIFIBT/drivers/infineon fi if [[ "$WIFI_CHIP" = "CYW5557X" ]];then echo "building CYW5557X" ln -sf chips/CYW5557X_Makefile \ $RKWIFIBT/drivers/infineon/Makefile $KMAKE M=$RKWIFIBT/drivers/infineon fi if [[ "$WIFI_CHIP" = "CYW5557X_PCIE" ]];then echo "building CYW5557X_PCIE" ln -sf chips/CYW5557X_PCIE_Makefile \ $RKWIFIBT/drivers/infineon/Makefile $KMAKE M=$RKWIFIBT/drivers/infineon fi if [[ "$WIFI_CHIP" = "CYW54591" ]];then echo "building CYW54591" ln -sf chips/CYW54591_Makefile \ $RKWIFIBT/drivers/infineon/Makefile $KMAKE M=$RKWIFIBT/drivers/infineon fi if [[ "$WIFI_CHIP" = "CYW54591_PCIE" ]];then echo "building CYW54591_PCIE" ln -sf chips/CYW54591_PCIE_Makefile \ $RKWIFIBT/drivers/infineon/Makefile $KMAKE M=$RKWIFIBT/drivers/infineon fi if [[ "$WIFI_CHIP" = "RTL8188FU" ]];then echo "building rtl8188fu driver" $KMAKE M=$RKWIFIBT/drivers/rtl8188fu modules fi if [[ "$WIFI_CHIP" = "RTL8189FS" ]];then echo "building rtl8189fs driver" $KMAKE M=$RKWIFIBT/drivers/rtl8189fs modules fi if [[ "$WIFI_CHIP" = "RTL8723DS" ]];then $KMAKE M=$RKWIFIBT/drivers/rtl8723ds modules fi if [[ "$WIFI_CHIP" = "RTL8821CS" ]];then $KMAKE M=$RKWIFIBT/drivers/rtl8821cs modules fi if [[ "$WIFI_CHIP" = "RTL8822CS" ]];then $KMAKE M=$RKWIFIBT/drivers/rtl8822cs modules fi if [[ "$WIFI_CHIP" = "RTL8852BS" ]];then $KMAKE M=$RKWIFIBT/drivers/rtl8852bs modules fi if [[ "$WIFI_CHIP" = "RTL8852BE" ]];then $KMAKE M=$RKWIFIBT/drivers/rtl8852be modules fi echo "building realtek bt drivers" $KMAKE M=$RKWIFIBT/drivers/bluetooth_uart_driver if [ -n "$WIFI_USB" ]; then $KMAKE M=$RKWIFIBT/drivers/bluetooth_usb_driver fi mkdir -p $ROOTFS_DIR/etc/init.d mkdir -p $ROOTFS_DIR/usr/bin/ mkdir -p $ROOTFS_DIR/usr/lib/modules/ mkdir -p $ROOTFS_DIR/lib/firmware/rtlbt/ mkdir -p $ROOTFS_DIR/system/lib/modules/ mkdir -p $ROOTFS_DIR/system/etc/firmware/ echo "create link system->vendor" rm -rf $ROOTFS_DIR/vendor ln -sf system $ROOTFS_DIR/vendor echo "copy prebuilt tools/sh to rootfs" cp $RKWIFIBT/bin/$ROOTFS_ARCH/* $ROOTFS_DIR/usr/bin/ cp $RKWIFIBT/sh/wifi_start.sh $ROOTFS_DIR/usr/bin/ cp $RKWIFIBT/sh/wifi_ap6xxx_rftest.sh $ROOTFS_DIR/usr/bin/ cp $RKWIFIBT/conf/wpa_supplicant.conf $ROOTFS_DIR/etc/ cp $RKWIFIBT/conf/dnsmasq.conf $ROOTFS_DIR/etc/ if [[ "$WIFI_CHIP" = "ALL_CY" ]];then echo "copy infineon/realtek firmware/nvram to rootfs" cp $RKWIFIBT/drivers/infineon/*.ko \ $ROOTFS_DIR/system/lib/modules/ || true cp $RKWIFIBT/firmware/infineon/*/* \ $ROOTFS_DIR/system/etc/firmware/ || true cp $RKWIFIBT/sh/bt_load_broadcom_firmware $ROOTFS_DIR/usr/bin/ cp $ROOTFS_DIR/usr/bin/bt_load_broadcom_firmware \ $ROOTFS_DIR/usr/bin/bt_init.sh cp $ROOTFS_DIR/usr/bin/bt_load_broadcom_firmware \ $ROOTFS_DIR/usr/bin/bt_pcba_test #reatek cp $RKWIFIBT/firmware/realtek/*/* $ROOTFS_DIR/lib/firmware/ cp $RKWIFIBT/firmware/realtek/*/* \ $ROOTFS_DIR/lib/firmware/rtlbt/ cp $RKWIFIBT/drivers/bluetooth_uart_driver/hci_uart.ko \ $ROOTFS_DIR/usr/lib/modules/ if [ -n "$WIFI_USB" ]; then cp $RKWIFIBT/drivers/bluetooth_usb_driver/rtk_btusb.ko \ $ROOTFS_DIR/usr/lib/modules/ fi rm -rf $ROOTFS_DIR/etc/init.d/S36load_wifi_modules cp $RKWIFIBT/S36load_all_wifi_modules $ROOTFS_DIR/etc/init.d/ sed -i "s/BT_TTY_DEV/\/dev\/${BT_TTY_DEV}/g" \ $ROOTFS_DIR/etc/init.d/S36load_all_wifi_modules fi if [[ "$WIFI_CHIP" = "ALL_AP" ]];then echo "copy ap6xxx firmware/nvram to rootfs" cp $RKWIFIBT/drivers/bcmdhd/*.ko $ROOTFS_DIR/system/lib/modules/ cp $RKWIFIBT/firmware/broadcom/*/wifi/* \ $ROOTFS_DIR/system/etc/firmware/ || true cp $RKWIFIBT/firmware/broadcom/*/bt/* \ $ROOTFS_DIR/system/etc/firmware/ || true cp $RKWIFIBT/sh/bt_load_broadcom_firmware $ROOTFS_DIR/usr/bin/ cp $ROOTFS_DIR/usr/bin/bt_load_broadcom_firmware \ $ROOTFS_DIR/usr/bin/bt_init.sh cp $ROOTFS_DIR/usr/bin/bt_load_broadcom_firmware \ $ROOTFS_DIR/usr/bin/bt_pcba_test #reatek echo "copy realtek firmware/nvram to rootfs" cp $RKWIFIBT/drivers/rtl*/*.ko $ROOTFS_DIR/system/lib/modules/ cp -rf $RKWIFIBT/firmware/realtek/*/* $ROOTFS_DIR/lib/firmware/ cp -rf $RKWIFIBT/firmware/realtek/*/* \ $ROOTFS_DIR/lib/firmware/rtlbt/ cp $RKWIFIBT/drivers/bluetooth_uart_driver/hci_uart.ko \ $ROOTFS_DIR/usr/lib/modules/ if [ -n "$WIFI_USB" ]; then cp $RKWIFIBT/drivers/bluetooth_usb_driver/rtk_btusb.ko \ $ROOTFS_DIR/usr/lib/modules/ fi echo "copy S36load_wifi_modules to rootfs" rm -rf $ROOTFS_DIR/etc/init.d/S36load_wifi_modules cp $RKWIFIBT/S36load_all_wifi_modules $ROOTFS_DIR/etc/init.d/ sed -i "s/BT_TTY_DEV/\/dev\/${BT_TTY_DEV}/g" \ $ROOTFS_DIR/etc/init.d/S36load_all_wifi_modules fi if [[ "$WIFI_CHIP" =~ "RTL" ]];then echo "Copy RTL file to rootfs" if [ -d "$RKWIFIBT/firmware/realtek/$WIFI_CHIP" ]; then cp $RKWIFIBT/firmware/realtek/$WIFI_CHIP/* \ $ROOTFS_DIR/lib/firmware/rtlbt/ cp $RKWIFIBT/firmware/realtek/$WIFI_CHIP/* \ $ROOTFS_DIR/lib/firmware/ else echo "INFO: $WIFI_CHIP isn't bluetooth?" fi WIFI_KO_DIR=$(echo $WIFI_CHIP | tr '[A-Z]' '[a-z]') cp $RKWIFIBT/drivers/$WIFI_KO_DIR/*.ko \ $ROOTFS_DIR/system/lib/modules/ cp $RKWIFIBT/sh/bt_load_rtk_firmware $ROOTFS_DIR/usr/bin/ sed -i "s/BT_TTY_DEV/\/dev\/${BT_TTY_DEV}/g" \ $ROOTFS_DIR/usr/bin/bt_load_rtk_firmware if [ -n "$WIFI_USB" ]; then cp $RKWIFIBT/drivers/bluetooth_usb_driver/rtk_btusb.ko \ $ROOTFS_DIR/usr/lib/modules/ sed -i "s/BT_DRV/rtk_btusb/g" \ $ROOTFS_DIR/usr/bin/bt_load_rtk_firmware else cp $RKWIFIBT/drivers/bluetooth_uart_driver/hci_uart.ko \ $ROOTFS_DIR/usr/lib/modules/ sed -i "s/BT_DRV/hci_uart/g" \ $ROOTFS_DIR/usr/bin/bt_load_rtk_firmware fi cp $ROOTFS_DIR/usr/bin/bt_load_rtk_firmware \ $ROOTFS_DIR/usr/bin/bt_init.sh cp $ROOTFS_DIR/usr/bin/bt_load_rtk_firmware \ $ROOTFS_DIR/usr/bin/bt_pcba_test rm -rf $ROOTFS_DIR/etc/init.d/S36load_all_wifi_modules cp $RKWIFIBT/S36load_wifi_modules $ROOTFS_DIR/etc/init.d/ sed -i "s/WIFI_KO/\/system\/lib\/modules\/$WIFI_CHIP.ko/g" \ $ROOTFS_DIR/etc/init.d/S36load_wifi_modules fi if [[ "$WIFI_CHIP" =~ "CYW" ]];then echo "Copy CYW file to rootfs" #firmware cp $RKWIFIBT/firmware/infineon/$WIFI_CHIP/* \ $ROOTFS_DIR/system/etc/firmware/ cp $RKWIFIBT/drivers/infineon/*.ko \ $ROOTFS_DIR/system/lib/modules/ #bt cp $RKWIFIBT/sh/bt_load_broadcom_firmware $ROOTFS_DIR/usr/bin/ sed -i "s/BT_TTY_DEV/\/dev\/${BT_TTY_DEV}/g" \ $ROOTFS_DIR/usr/bin/bt_load_broadcom_firmware sed -i "s/BTFIRMWARE_PATH/\/system\/etc\/firmware\//g" \ $ROOTFS_DIR/usr/bin/bt_load_broadcom_firmware cp $ROOTFS_DIR/usr/bin/bt_load_broadcom_firmware \ $ROOTFS_DIR/usr/bin/bt_init.sh cp $ROOTFS_DIR/usr/bin/bt_load_broadcom_firmware \ $ROOTFS_DIR/usr/bin/bt_pcba_test #wifi rm -rf $ROOTFS_DIR/etc/init.d/S36load_all_wifi_modules cp $RKWIFIBT/S36load_wifi_modules $ROOTFS_DIR/etc/init.d/ sed -i "s/WIFI_KO/\/system\/lib\/modules\/$WIFI_CHIP.ko/g" \ $ROOTFS_DIR/etc/init.d/S36load_wifi_modules fi if [[ "$WIFI_CHIP" =~ "AP6" ]];then echo "Copy AP file to rootfs" #firmware cp $RKWIFIBT/firmware/broadcom/$WIFI_CHIP/wifi/* \ $ROOTFS_DIR/system/etc/firmware/ cp $RKWIFIBT/firmware/broadcom/$WIFI_CHIP/bt/* \ $ROOTFS_DIR/system/etc/firmware/ cp $RKWIFIBT/drivers/bcmdhd/*.ko $ROOTFS_DIR/system/lib/modules/ #bt cp $RKWIFIBT/sh/bt_load_broadcom_firmware $ROOTFS_DIR/usr/bin/ sed -i "s/BT_TTY_DEV/\/dev\/${BT_TTY_DEV}/g" \ $ROOTFS_DIR/usr/bin/bt_load_broadcom_firmware sed -i "s/BTFIRMWARE_PATH/\/system\/etc\/firmware\//g" \ $ROOTFS_DIR/usr/bin/bt_load_broadcom_firmware cp $ROOTFS_DIR/usr/bin/bt_load_broadcom_firmware \ $ROOTFS_DIR/usr/bin/bt_init.sh cp $ROOTFS_DIR/usr/bin/bt_load_broadcom_firmware \ $ROOTFS_DIR/usr/bin/bt_pcba_test #wifi rm -rf $ROOTFS_DIR/etc/init.d/S36load_all_wifi_modules cp $RKWIFIBT/S36load_wifi_modules $ROOTFS_DIR/etc/init.d/ if [[ "$WIFI_CHIP" =~ "AP" ]];then sed -i "s/WIFI_KO/\/system\/lib\/modules\/bcmdhd.ko/g" \ $ROOTFS_DIR/etc/init.d/S36load_wifi_modules else sed -i "s/WIFI_KO/\/system\/lib\/modules\/bcmdhd_pcie.ko/g" \ $ROOTFS_DIR/etc/init.d/S36load_wifi_modules fi fi finish_build build_wifibt $@ } # Hooks usage_hook() { echo -e "wifibt[:[:[:]]] \tbuild Wifi/BT" } BUILD_CMDS="wifibt" build_hook() { shift build_wifibt "$([ -d "$1" ] || echo $DEFAULT_ROOTFS_DIR)" $@ } source "${BUILD_HELPER:-$(dirname "$(realpath "$0")")/../build-hooks/build-helper}" build_wifibt $@