#!/usr/bin/env bash # SPDX-License-Identifier: (GPL-2.0-only OR MIT) # Copyright (C) 2026 Amlogic, Inc. All rights reserved ################################################################################ # Amlbian HCI Attach Compilation Package # # Purpose: Build aml_hciattach tool and bluetooth configuration package # Provides: aml_hciattach binary to /usr/bin, configuration files to /lib/firmware/aml # Based on Yocto recipe: amlogic-hciattach_git.bb ################################################################################ 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: Package Information Definition # ------------------------------------------------------------------------------ # Initialize package metadata for HCI Attach function _hciattach_init_package_info() { PKG_MAINTAINER="Armbian Build " PKG_DESCRIPTION="Amlogic HCI attach tool for bluetooth" PKG_NAME="aml-hciattach" PKG_VERSION="1.0" PKG_ARCH="${ARCH:-arm64}" COMPONENT="hciattach" # Cross compilation settings CROSS_COMPILE="${CROSS_COMPILE:-aarch64-linux-gnu-}" # Source directory for hciattach HCIATTACH_SRC_DIR="${BASE_DIR}/aml-comp/hardware/bluetooth/amlogic/aml_hciattach" } # ------------------------------------------------------------------------------ # 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, BIN_DIR, FIRMWARE_DIR function _hciattach_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" BIN_DIR="${INSTALL_DIR}/usr/bin/" FIRMWARE_DIR="${INSTALL_DIR}/lib/firmware/aml/" mkdir -p "${DEBIAN_DIR}" mkdir -p "${BIN_DIR}" mkdir -p "${FIRMWARE_DIR}" } # Display build directory info # Parameters: # $1 - log prefix function _hciattach_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" display_alert "${log_prefix} Bin dir: ${BIN_DIR}" "info" display_alert "${log_prefix} Firmware dir: ${FIRMWARE_DIR}" "info" } # ------------------------------------------------------------------------------ # Step 3: Source File Validation and Copying # ------------------------------------------------------------------------------ # Validate and copy source files # Parameters: # $1 - source directory path # Sets: HCIATTACH_SRC_DIR (updated to SOURCE_DIR after copy) function _hciattach_validate_and_copy_sources() { local src_dir="$1" # Check if source directory exists if [[ ! -d "${src_dir}" ]]; then display_alert "COMPILE-${COMPONENT} HCI attach source code not found" "${src_dir}" "error" exit 1 fi # Copy source to source directory display_alert "COMPILE-${COMPONENT} Copying source files to source directory" "info" cp -r "${src_dir}/"* "${SOURCE_DIR}/" 2>&1 # Update source directory to the copied location HCIATTACH_SRC_DIR="${SOURCE_DIR}" } # ------------------------------------------------------------------------------ # Step 4: Build HCI Attach Tool # ------------------------------------------------------------------------------ # Build aml_hciattach tool function _hciattach_build_tool() { display_alert "COMPILE-${COMPONENT} Building aml_hciattach" "info" # Change to source directory cd "${HCIATTACH_SRC_DIR}" # Based on Yocto recipe: ${MAKE} -C ${S} CC='${CC}' OUT_DIR=${B} make -C "${HCIATTACH_SRC_DIR}" CC="${CROSS_COMPILE}gcc" OUT_DIR="${BUILD_DIR}" # Check if binary was built if [[ ! -f "${BUILD_DIR}/aml_hciattach" ]]; then display_alert "COMPILE-${COMPONENT} Build failed. Could not find aml_hciattach" "error" exit 1 fi display_alert "COMPILE-${COMPONENT} aml_hciattach built successfully" "info" # 在BUILD_DIR中保存编译结果(备份) display_alert "COMPILE-${COMPONENT} Saving build result to build directory" "info" mkdir -p "${BUILD_DIR}/bin" cp -f "${BUILD_DIR}/aml_hciattach" "${BUILD_DIR}/bin/" } # ------------------------------------------------------------------------------ # Step 5: File Installation # ------------------------------------------------------------------------------ # Install binary and configuration files function _hciattach_install_files() { # Install binary to INSTALL_DIR(用于打包) display_alert "COMPILE-${COMPONENT} Installing aml_hciattach to install directory ${BIN_DIR}" "info" install -m 0755 "${BUILD_DIR}/aml_hciattach" "${BIN_DIR}/" # Install configuration files to INSTALL_DIR display_alert "COMPILE-${COMPONENT} Installing configuration files to install directory ${FIRMWARE_DIR}" "info" # Install aml_bt.conf if [[ -f "${HCIATTACH_SRC_DIR}/aml_bt.conf" ]]; then install -m 0644 "${HCIATTACH_SRC_DIR}/aml_bt.conf" "${FIRMWARE_DIR}/" fi # Install a2dp_mode_cfg.txt if [[ -f "${HCIATTACH_SRC_DIR}/a2dp_mode_cfg.txt" ]]; then install -m 0644 "${HCIATTACH_SRC_DIR}/a2dp_mode_cfg.txt" "${FIRMWARE_DIR}/" fi # Install aml_bt_rf.txt if [[ -f "${HCIATTACH_SRC_DIR}/aml_bt_rf.txt" ]]; then install -m 0644 "${HCIATTACH_SRC_DIR}/aml_bt_rf.txt" "${FIRMWARE_DIR}/" fi # Special handling for w2 USB: change pinmux # Based on Yocto recipe: # if ${@bb.utils.contains('MACHINE_EXTRA_RRECOMMENDS', 'aml-bt-w2', 'true', 'false', d)}; then # if [ "${AML_WIFI_BUS_TYPE}" = "usb" ]; then # sed -i 's/^ChangePinMux.*/ChangePinMux=1/' ${FWDIR}/aml_bt.conf # fi # fi if echo "$MACHINE_EXTRA_RRECOMMENDS" | grep -q -E '\b(aml-wifi-w2)\b'; then if [[ -n "${AML_WIFI_BUS_TYPE}" ]] && [[ "${AML_WIFI_BUS_TYPE}" == "usb" ]]; then if [[ -f "${FIRMWARE_DIR}/aml_bt.conf" ]]; then display_alert "COMPILE-${COMPONENT} USB bus detected, enabling ChangePinMux" "info" sed -i 's/^ChangePinMux.*/ChangePinMux=1/' "${FIRMWARE_DIR}/aml_bt.conf" fi fi fi } # ------------------------------------------------------------------------------ # Step 6: Debian Packaging Scripts Creation # ------------------------------------------------------------------------------ # Create Debian control file function _hciattach_create_control_file() { display_alert "COMPILE-${COMPONENT} Creating control file DEBIAN/control" "info" cat > "${DEBIAN_DIR}/control" << EOF Package: ${PKG_NAME} Version: ${PKG_VERSION} Architecture: ${PKG_ARCH} Maintainer: ${PKG_MAINTAINER} Section: utils Priority: optional Description: ${PKG_DESCRIPTION} This package provides the aml_hciattach tool for initializing Amlogic bluetooth chips. It includes configuration files for bluetooth operation. EOF } # Create post-installation script function _hciattach_create_postinst() { display_alert "COMPILE-${COMPONENT} Creating post-installation script: DEBIAN/postinst" "info" cat > "${DEBIAN_DIR}/postinst" << EOF #!/bin/bash set -e if [ "\$1" = "configure" ]; then echo "Amlogic HCI attach tool installed successfully" echo "Configuration files are located in /lib/firmware/aml/" fi exit 0 EOF chmod 755 "${DEBIAN_DIR}/postinst" } # Create pre-removal script function _hciattach_create_prerm() { display_alert "COMPILE-${COMPONENT} Creating pre-removal script: DEBIAN/prerm" "info" cat > "${DEBIAN_DIR}/prerm" << EOF #!/bin/bash set -e if [ "\$1" = "remove" ] || [ "\$1" = "deconfigure" ]; then # Stop any running bluetooth services if needed echo "Removing amlogic-hciattach" fi exit 0 EOF chmod 755 "${DEBIAN_DIR}/prerm" } # ------------------------------------------------------------------------------ # Step 7: Debian Package Building # ------------------------------------------------------------------------------ # Build Debian package from install directory # Parameters: # $1 - log prefix (e.g. "COMPILE-HCIATTACH") # $2 - output deb filename (without path) # Sets: OUTPUT_DEB function _hciattach_build_deb_package() { local log_prefix="$1" local output_deb_name="$2" # 将install目录内容拷贝到deb目录 display_alert "${log_prefix} Copying install directory to deb package directory" "info" cp -r "${INSTALL_DIR}/"* "${DEB_PACKAGE_DIR}/" 2>&1 # 基于deb目录打包 display_alert "${log_prefix} Building Debian package" "info" dpkg-deb --build "${DEB_PACKAGE_DIR}" 2>&1 if [[ $? -ne 0 ]]; then display_alert "${log_prefix} Package build failed" "error" exit 1 fi # 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" } # ============================================================================== # Main Build Function (Entry Point) # ============================================================================== # Main HCI Attach package build function function amlbian_build_hciattach() { set -e # ---- Step 1: Version and Package Information ---- _hciattach_init_package_info display_alert "COMPILE-${COMPONENT} Building amlogic-hciattach package version ${PKG_VERSION} for ${PKG_ARCH}" "info" # ---- Step 2: Build Directory Setup ---- _hciattach_create_build_dirs "${PKG_NAME}_${PKG_VERSION}_${PKG_ARCH}" _hciattach_display_build_info "COMPILE-${COMPONENT}" # ---- Step 3: Source File Validation and Copying ---- _hciattach_validate_and_copy_sources "${HCIATTACH_SRC_DIR}" # ---- Step 4: Build HCI Attach Tool ---- _hciattach_build_tool # ---- Step 5: File Installation ---- _hciattach_install_files # ---- Step 6: Debian Packaging Scripts ---- _hciattach_create_control_file _hciattach_create_postinst _hciattach_create_prerm # ---- Step 7: Build Debian Package ---- _hciattach_build_deb_package "COMPILE-${COMPONENT}" "${PKG_NAME}_${PKG_VERSION}_${PKG_ARCH}.deb" display_alert "COMPILE-${COMPONENT} Amlogic HCI attach package build completed" "success" display_alert "COMPILE-${COMPONENT} Build directories preserved:" "info" display_alert "COMPILE-${COMPONENT} Source: ${SOURCE_DIR}" "info" display_alert "COMPILE-${COMPONENT} Build: ${BUILD_DIR}" "info" display_alert "COMPILE-${COMPONENT} Install: ${INSTALL_DIR}" "info" display_alert "COMPILE-${COMPONENT} Patch: ${PATCH_DIR}" "info" display_alert "COMPILE-${COMPONENT} Deb package: ${DEB_PACKAGE_DIR}" "info" return 0 }