#!/usr/bin/env bash # SPDX-License-Identifier: (GPL-2.0-only OR MIT) # Copyright (C) 2026 Amlogic, Inc. All rights reserved ################################################################################ # Amlbian WiFi Common Compilation Module # # Purpose: WiFi common driver compilation with Hook support and aml-comp integration # Provides: WiFi common driver compilation, firmware installation ################################################################################ set -e # Get script directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" AMLBIAN_DIR="$(dirname "$(dirname "${SCRIPT_DIR}")")" BASE_DIR="$(dirname "$(dirname "${AMLBIAN_DIR}")")" # Source common functions if [[ -f "${AMLBIAN_DIR}/lib/function-common.sh" ]]; then source "${AMLBIAN_DIR}/lib/function-common.sh" fi # ============================================================================== # Shared Helper Functions # ============================================================================== # ------------------------------------------------------------------------------ # Step 1: Version and Package Information Definition # ------------------------------------------------------------------------------ # Initialize package metadata for WiFi common driver function _wifi_common_init_package_info() { PKG_MAINTAINER="Armbian Build " PKG_DESCRIPTION="Amlogic WiFi common driver" PKG_NAME="aml-wifi-common" PKG_VERSION="1.0" PKG_ARCH="${ARCH:-arm64}" DRIVER_NAME="wifi_comm" DRIVER_MODULE="${DRIVER_NAME}.ko" # Cross compilation settings CROSS_COMPILE="${CROSS_COMPILE:-aarch64-linux-gnu-}" # Board configuration BOARD="${BOARD:-s6-bq201}" KERNEL_VER="${KERNEL_VER:-aml-6.12}" # WiFi modules supported WIFI_MODULES=("w1" "w1u" "w2" "w2l") # Configuration overrides if [ "${BOARD:-}" = "s6-bq201" ]; then OVERRIDES="${OVERRIDES:-mesons6-bq201}" elif [ "${BOARD:-}" = "a9-by401" ]; then OVERRIDES="${OVERRIDES:-mesona9-by401}" elif [ "${BOARD:-}" = "s6-bl201" ]; then OVERRIDES="${OVERRIDES:-mesons6-bl201}" fi display_alert "COMPILE-WIFI-COMMON" "BOARD: ${BOARD} OVERRIDES: ${OVERRIDES}" "info" #MACHINE_EXTRA_RRECOMMENDS="${MACHINE_EXTRA_RRECOMMENDS:-aml-wifi-w2l}" #DISTRO_FEATURES="${DISTRO_FEATURES:-aml-wifi-w2l}" } # ------------------------------------------------------------------------------ # Step 2: Build Directory Structure Setup # ------------------------------------------------------------------------------ # Create layered build directory structure # Parameters: # $1 - base name (e.g. "${PKG_NAME}_${PKG_VERSION}_${PKG_ARCH}") # Sets: TMP_DIR, BASE_BUILD_DIR, SOURCE_DIR, BUILD_DIR, INSTALL_DIR, PATCH_DIR, # DEB_PACKAGE_DIR, DEBIAN_DIR function _wifi_common_create_build_dirs() { local base_name="$1" TMP_DIR="${SRC}/.tmp" mkdir -p "${TMP_DIR}" # 基础构建目录 BASE_BUILD_DIR="${TMP_DIR}/${base_name}" rm -rf ${BASE_BUILD_DIR} # 分层目录 SOURCE_DIR="${BASE_BUILD_DIR}/source" # 源码目录 BUILD_DIR="${BASE_BUILD_DIR}/build" # 编译目录 INSTALL_DIR="${BASE_BUILD_DIR}/install" # 安装目录 PATCH_DIR="${BASE_BUILD_DIR}/patch" # 补丁目录 # 创建所有目录 mkdir -p "${SOURCE_DIR}" mkdir -p "${BUILD_DIR}" mkdir -p "${INSTALL_DIR}" mkdir -p "${PATCH_DIR}" # 在BUILD_DIR下创建deb/包名目录 DEB_PACKAGE_DIR="${BUILD_DIR}/deb/${base_name}" mkdir -p "${DEB_PACKAGE_DIR}" # 安装目录的子目录 DEBIAN_DIR="${INSTALL_DIR}/DEBIAN" mkdir -p "${DEBIAN_DIR}" } # Create standard install subdirectories for WiFi common driver function _wifi_common_create_install_dirs() { local kernel_version="$1" mkdir -p "${INSTALL_DIR}/lib/modules/${kernel_version}/kernel/drivers/amlogic/wifi/" mkdir -p "${INSTALL_DIR}/lib/firmware/" } # ------------------------------------------------------------------------------ # Step 3: Helper Functions # ------------------------------------------------------------------------------ # Extract board information from OVERRIDES function _wifi_common_extract_board_info() { local overrides="${OVERRIDES:-}" local meson_override="" local board_info="" # Split OVERRIDES string IFS=':' read -ra overrides_list <<< "$overrides" # Find override starting with "meson" for override in "${overrides_list[@]}"; do if [[ "$override" == meson* ]]; then meson_override="$override" break fi done # Extract board information if [[ -n "$meson_override" ]]; then IFS='-' read -ra parts <<< "$meson_override" if [[ ${#parts[@]} -ge 2 ]]; then board_info="${parts[1]}" fi fi echo "$board_info" } # Check if should compile based on MACHINE_EXTRA_RRECOMMENDS function _wifi_common_should_compile() { local machine_extra_rrecommends="${MACHINE_EXTRA_RRECOMMENDS:-}" local patterns=("aml-wifi-w2" "aml-wifi-w1" "aml-wifi-w1u") # Check if contains any specified pattern for pattern in "${patterns[@]}"; do if [[ "$machine_extra_rrecommends" == *"$pattern"* ]]; then return 0 # should compile fi done return 1 # should not compile } # Check if aml-wifi feature is enabled in DISTRO_FEATURES function _wifi_common_is_aml_wifi_enabled() { local distro_features="${DISTRO_FEATURES:-}" display_alert "COMPILE-WIFI-COMMON" "DISTRO_FEATURES: ${distro_features}" "info" if [[ "$distro_features" == *"aml-wifi"* ]]; then return 0 # enabled else return 1 # not enabled fi } # ------------------------------------------------------------------------------ # Step 4: Debian Packaging Scripts Creation # ------------------------------------------------------------------------------ # Create Debian control file # Parameters: # $1 - package name # $2 - package version # $3 - package architecture # $4 - maintainer # $5 - description # $6 - dependencies (optional) # $7 - conflicts (optional) # $8 - provides (optional) # $9 - section (optional, default "kernel") function _wifi_common_create_control_file() { local pkg_name="$1" local pkg_version="$2" local pkg_arch="$3" local maintainer="$4" local description="$5" local depends="${6:-}" local conflicts="${7:-}" local provides="${8:-}" local section="${9:-kernel}" display_alert "COMPILE-WIFI-COMMON Creating control file DEBIAN/control" "info" cat > "${DEBIAN_DIR}/control" < "${DEBIAN_DIR}/postinst" << EOF #!/bin/sh set -e if [ "\$1" = "configure" ]; then # run depmod only if /lib/modules/${kernel_version} exists if [ -d "/lib/modules/${kernel_version}" ]; then depmod -a ${kernel_version} else echo "Warning: /lib/modules/${kernel_version} not found, skipping depmod" fi # try to load module but don't error if modprobe -n wifi_comm 2>/dev/null; then echo "Amlogic wifi common module can be loaded with 'modprobe wifi_comm'" fi fi exit 0 EOF chmod 755 "${DEBIAN_DIR}/postinst" } # Create prerm script for WiFi common driver function _wifi_common_create_prerm() { display_alert "COMPILE-WIFI-COMMON Creating pre-removal script DEBIAN/prerm" "info" cat > "${DEBIAN_DIR}/prerm" << EOF #!/bin/sh set -e if [ "\$1" = "remove" ] || [ "\$1" = "deconfigure" ]; then # Unload module if loaded if lsmod | grep -q "wifi_comm"; then modprobe -r wifi_comm 2>/dev/null || true fi fi exit 0 EOF chmod 755 "${DEBIAN_DIR}/prerm" } # ------------------------------------------------------------------------------ # Step 5: Source/Vendor File Copying and Building # ------------------------------------------------------------------------------ # Copy WiFi common driver source files and build module function _wifi_common_copy_and_build() { display_alert "COMPILE-WIFI-COMMON Copying WiFi common driver files" "info" # Source directory local SRC_DIR="${BASE_DIR}/aml-comp/hardware/wifi/amlogic/drivers/wifi_comm" # Check if source exists if [[ ! -d "${SRC_DIR}" ]]; then display_alert "COMPILE-WIFI-COMMON WiFi common driver source code not found. Expected at: ${SRC_DIR}" "error" exit 1 fi # Copy source to source directory display_alert "COMPILE-WIFI-COMMON Copying source files to source directory" "info" cp -r "${SRC_DIR}/"* "${SOURCE_DIR}/" # Kernel headers directory local KERNEL_HEADERS="${BASE_DIR}/aml-comp/kernel/${KERNEL_VER}" # Check for kernel headers if [[ ! -d "${KERNEL_HEADERS}" ]]; then display_alert "COMPILE-WIFI-COMMON Kernel headers directory not found at: ${KERNEL_HEADERS}" "error" exit 1 fi # Change to source directory cd "${SOURCE_DIR}" # Build the module if echo "$MACHINE_EXTRA_RRECOMMENDS" | grep -q -E '\b(aml-wifi-w2|aml-wifi-w1|aml-wifi-w1u)\b'; then display_alert "COMPILE-WIFI-COMMON Building wifi_comm.ko kernel module $MACHINE_EXTRA_RRECOMMENDS" "info" make -C "${KERNEL_HEADERS}/build" \ M="${SOURCE_DIR}" \ KERNELDIR="${KERNEL_HEADERS}" \ ARCH="${PKG_ARCH}" \ CROSS_COMPILE="${CROSS_COMPILE}" fi # Check if module was built if [[ -f "${SOURCE_DIR}/${DRIVER_MODULE}" ]]; then display_alert "COMPILE-WIFI-COMMON Module built successfully: ${DRIVER_MODULE}" "info" # Install module to INSTALL_DIR local module_dir="${INSTALL_DIR}/lib/modules/${KERNEL_VERSION}/kernel/drivers/amlogic/wifi/" display_alert "COMPILE-WIFI-COMMON Installing module to install directory ${module_dir}" "info" install -m 0644 "${SOURCE_DIR}/${DRIVER_MODULE}" "${module_dir}/" else rm -rf "${INSTALL_DIR}/lib/modules" display_alert "COMPILE-WIFI-COMMON Module build failed. Could not find ${DRIVER_MODULE}" "info" fi } # Install firmware files based on board configuration function _wifi_common_install_firmware() { local board_info="$1" local kernel_version="$2" display_alert "COMPILE-WIFI-COMMON Installing firmware files" "info" # Check if aml-wifi feature is enabled if ! _wifi_common_is_aml_wifi_enabled; then display_alert "COMPILE-WIFI-COMMON Aml-wifi feature not enabled, skipping firmware installation" "info" return 0 fi display_alert "COMPILE-WIFI-COMMON Aml-wifi feature enabled, installing firmware files" "info" # Install firmware files for each WiFi module for WIFI_MODULE in "${WIFI_MODULES[@]}"; do # Check if this module is in machine recommended list local machine_extra_rrecommends="${MACHINE_EXTRA_RRECOMMENDS:-}" if echo "${machine_extra_rrecommends}" | grep -wq "aml-wifi-${WIFI_MODULE}"; then display_alert "COMPILE-WIFI-COMMON Installing firmware for module: ${WIFI_MODULE}, board: ${board_info}" "info" local FILE_PATH="${SOURCE_DIR}/aml_txt" local WIFI_PATH="${FILE_PATH}/${WIFI_MODULE}" # Determine firmware source directory local FIRMWARE_SRC_PATH="" # Prioritize board-specific firmware directory if [[ -n "$board_info" && -d "${WIFI_PATH}/${board_info}" ]]; then FIRMWARE_SRC_PATH="${WIFI_PATH}/${board_info}" # Then use firmware files in module directory elif [[ -n "$(ls ${WIFI_PATH}/aml_*.txt 2>/dev/null)" ]]; then FIRMWARE_SRC_PATH="${WIFI_PATH}" else continue fi display_alert "COMPILE-WIFI-COMMON Firmware source path: ${FIRMWARE_SRC_PATH}" "info" # Determine firmware destination directory local FIRMWARE_DST="" if [[ "${WIFI_MODULE}" == "w2" ]]; then FIRMWARE_DST="${INSTALL_DIR}/lib/firmware/" else FIRMWARE_DST="${INSTALL_DIR}/lib/firmware/${WIFI_MODULE}/" fi mkdir -p "${FIRMWARE_DST}" # Copy firmware files to INSTALL_DIR for f in "${FIRMWARE_SRC_PATH}"/aml_*.txt; do if [[ -f "$f" ]]; then install -m 0644 "$f" "${FIRMWARE_DST}" fi done fi done } # ------------------------------------------------------------------------------ # Step 6: Debian Package Building # ------------------------------------------------------------------------------ # Build Debian package from install directory # Parameters: # $1 - log prefix (e.g. "COMPILE-WIFI-COMMON") # $2 - output deb filename (without path) # Sets: OUTPUT_DEB function _wifi_common_build_deb_package() { local log_prefix="$1" local output_deb_name="$2" # 将install目录内容拷贝到deb目录 display_alert "Copying install directory to deb package directory ${log_prefix}" "info" cp -r "${INSTALL_DIR}/"* "${DEB_PACKAGE_DIR}/" 2>&1 # 基于deb目录打包 display_alert "Building Debian package from deb directory ${log_prefix}" "info" dpkg-deb --build "${DEB_PACKAGE_DIR}" 2>&1 # Move to output directory OUTPUT_DEB="${SRC}/output/${output_deb_name}" mkdir -p "$(dirname "${OUTPUT_DEB}")" mv "${DEB_PACKAGE_DIR}.deb" "${OUTPUT_DEB}" display_alert "${log_prefix} Package built successfully ${output_deb_name}" "info" display_alert "${log_prefix} Build directory preserved ${BASE_BUILD_DIR}" "info" } # Display build directory info # Parameters: # $1 - log prefix function _wifi_common_display_build_info() { local log_prefix="$1" display_alert "${log_prefix} Source dir: ${SOURCE_DIR}" "info" display_alert "${log_prefix} Build dir: ${BUILD_DIR}" "info" display_alert "${log_prefix} Install dir: ${INSTALL_DIR}" "info" display_alert "${log_prefix} Patch dir: ${PATCH_DIR}" "info" display_alert "${log_prefix} Deb package dir: ${DEB_PACKAGE_DIR}" "info" } # ============================================================================== # Main Build Functions (Entry Points) # ============================================================================== # ------------------------------------------------------------------------------ # WiFi Common Driver Build # Entry point: amlbian_build_wifi_common # ------------------------------------------------------------------------------ function amlbian_build_wifi_common() { set -e # ---- Step 1: Version and Package Information ---- _wifi_common_init_package_info # Check compile condition if ! _wifi_common_should_compile; then display_alert "COMPILE-WIFI-COMMON" "Skipping compilation for this machine" "info" return 0 fi # Get kernel version for packaging local KERNEL_VERSION=$(make -s -C "${BASE_DIR}/aml-comp/kernel/aml-6.12/build" kernelrelease 2>/dev/null || true) if [[ -z "${KERNEL_VERSION}" ]]; then KERNEL_VERSION="unknown-$(date +%Y%m%d)" fi display_alert "COMPILE-WIFI-COMMON Building WiFi common driver for kernel ${KERNEL_VERSION}" "info" # ---- Step 2: Build Directory Setup ---- _wifi_common_create_build_dirs "${PKG_NAME}_${PKG_VERSION}_${PKG_ARCH}" _wifi_common_create_install_dirs "${KERNEL_VERSION}" _wifi_common_display_build_info "COMPILE-WIFI-COMMON" # ---- Step 3: Debian Packaging Scripts ---- _wifi_common_create_control_file \ "${PKG_NAME}" "${PKG_VERSION}" "${PKG_ARCH}" "${PKG_MAINTAINER}" \ "${PKG_DESCRIPTION}" "" "" "" "kernel" _wifi_common_create_postinst "${KERNEL_VERSION}" _wifi_common_create_prerm # ---- Step 4: Copy Source/Vendor Files and Build ---- _wifi_common_copy_and_build # ---- Step 5: Install Firmware Files ---- local board_info=$(_wifi_common_extract_board_info) display_alert "COMPILE-WIFI-COMMON Board info: ${board_info:-none}" "info" _wifi_common_install_firmware "${board_info}" "${KERNEL_VERSION}" # ---- Step 6: Build Debian Package ---- _wifi_common_build_deb_package "COMPILE-WIFI-COMMON" "${PKG_NAME}_${PKG_VERSION}_${KERNEL_VERSION}_${PKG_ARCH}.deb" display_alert "COMPILE-WIFI-COMMON WiFi common driver build completed. Successfully built for ${PKG_ARCH} with kernel ${KERNEL_VERSION}" "info" return 0 } export amlbian_build_wifi_common