#!/usr/bin/env bash # SPDX-License-Identifier: (GPL-2.0-only OR MIT) # Copyright (C) 2026 Amlogic, Inc. All rights reserved ################################################################################ # Amlbian Udev Rules Compilation Module # # Purpose: Compile and package udev rules for DMA heap devices # Provides: dmaheap.rules installation for Amlogic GPU support ################################################################################ set -e # Get script directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" AMLBIAN_DIR="$(dirname "$(dirname "${SCRIPT_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 common package metadata for udev rules function _udev_init_package_info() { PKG_MAINTAINER="Armbian Build " PKG_DESCRIPTION="Udev rules for Amlogic" PKG_NAME="aml-udev" PKG_VERSION="1.0" PKG_ARCH="all" # Source directory for udev rules UDEV_SRC_DIR="${SCRIPT_DIR}/files" } # ------------------------------------------------------------------------------ # 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 _udev_create_build_dirs() { local base_name="$1" TMP_DIR="${AMLBIAN_DIR}/.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}" # 创建udev规则安装目录 mkdir -p "${INSTALL_DIR}/etc/udev/rules.d" mkdir -p "${INSTALL_DIR}/etc/udev/scripts" mkdir -p "${INSTALL_DIR}/etc/systemd/system" mkdir -p "${INSTALL_DIR}/etc/systemd/network" } # ------------------------------------------------------------------------------ # Step 3: Debian Packaging Scripts Creation # ------------------------------------------------------------------------------ # Create Debian control file # Parameters: # $1 - package name # $2 - package version # $3 - package architecture # $4 - maintainer # $5 - description # $6 - section (optional, default "admin") function _udev_create_control_file() { local pkg_name="$1" local pkg_version="$2" local pkg_arch="$3" local maintainer="$4" local description="$5" local section="${6:-admin}" display_alert "COMPILE-UDEV Creating control file DEBIAN/control" "info" cat > "${DEBIAN_DIR}/control" < "${DEBIAN_DIR}/postinst" << EOF #!/bin/sh set -e if [ "\$1" = "configure" ]; then # Reload udev rules if command -v udevadm >/dev/null 2>&1; then udevadm control --reload-rules udevadm trigger echo "Udev rules reloaded for DMA heap devices" else echo "Warning: udevadm not found, cannot reload udev rules" fi fi exit 0 EOF chmod 755 "${DEBIAN_DIR}/postinst" } # Create prerm script for udev rules function _udev_create_prerm() { display_alert "COMPILE-UDEV Creating pre-removal script DEBIAN/prerm" "info" cat > "${DEBIAN_DIR}/prerm" << EOF #!/bin/sh set -e if [ "\$1" = "remove" ] || [ "\$1" = "deconfigure" ]; then # Note: We don't remove the rules file here because it might be modified by user # The file will be removed by dpkg during package removal echo "udev rules package being removed" fi exit 0 EOF chmod 755 "${DEBIAN_DIR}/prerm" } # ------------------------------------------------------------------------------ # Step 4: Source/Vendor File Copying # ------------------------------------------------------------------------------ # Copy udev rules from source directory function _udev_copy_rules_files() { display_alert "COMPILE-UDEV Copying dmaheap.rules from ${UDEV_SRC_DIR}" "info" if [[ -f "${UDEV_SRC_DIR}/dmaheap.rules" ]]; then cp "${UDEV_SRC_DIR}/dmaheap.rules" "${INSTALL_DIR}/etc/udev/rules.d/" display_alert "COMPILE-UDEV Copied dmaheap.rules" "info" fi if [[ -f "${UDEV_SRC_DIR}/10-amlogic-wireless-insmod.rules" ]]; then cp "${UDEV_SRC_DIR}/10-amlogic-wireless-insmod.rules" "${INSTALL_DIR}/etc/udev/rules.d/" display_alert "COMPILE-UDEV Copied 10-amlogic-wireless-insmod.rules" "info" fi if [[ -f "${UDEV_SRC_DIR}/10-audio-dummy-soc-kdriver-alias-insmod.rules" ]]; then cp "${UDEV_SRC_DIR}/10-audio-dummy-soc-kdriver-alias-insmod.rules" "${INSTALL_DIR}/etc/udev/rules.d/" display_alert "COMPILE-UDEV Copied 10-audio-dummy-soc-kdriver-alias-insmod.rules" "info" fi if [[ -f "${UDEV_SRC_DIR}/10-video.rules" ]]; then cp "${UDEV_SRC_DIR}/10-video.rules" "${INSTALL_DIR}/etc/udev/rules.d/" display_alert "COMPILE-UDEV Copied 10-video.rules" "info" fi if [[ -f "${UDEV_SRC_DIR}/10-adb-serial.rules" ]]; then cp "${UDEV_SRC_DIR}/10-adb-serial.rules" "${INSTALL_DIR}/etc/udev/rules.d/" display_alert "COMPILE-UDEV Copied 10-adb-serial.rules" "info" fi if [[ -f "${UDEV_SRC_DIR}/99-rfkill.rules" ]]; then cp "${UDEV_SRC_DIR}/99-rfkill.rules" "${INSTALL_DIR}/etc/udev/rules.d/" cp "${UDEV_SRC_DIR}/bt-rfkill.sh" "${INSTALL_DIR}/etc/udev/scripts/" chmod 0755 "${INSTALL_DIR}/etc/udev/scripts/bt-rfkill.sh" display_alert "COMPILE-UDEV Copied 10-adb-serial.rules" "info" fi if [[ -f "${UDEV_SRC_DIR}/99-recover-adbd.rules" ]]; then cp "${UDEV_SRC_DIR}/99-recover-adbd.rules" "${INSTALL_DIR}/etc/udev/rules.d/" cp "${UDEV_SRC_DIR}/adbd-recover.sh" "${INSTALL_DIR}/etc/udev/scripts/" cp "${UDEV_SRC_DIR}/adbd-recover.service" "${INSTALL_DIR}/etc/systemd/system/" chmod 0755 "${INSTALL_DIR}/etc/udev/scripts/adbd-recover.sh" display_alert "COMPILE-UDEV Copied 99-recover-adbd.rules" "info" fi if [[ -f "${UDEV_SRC_DIR}/10-wlan0.link" ]]; then cp "${UDEV_SRC_DIR}/10-wlan0.link" "${INSTALL_DIR}/etc/systemd/network/" chmod 0755 "${INSTALL_DIR}/etc/systemd/network/10-wlan0.link" display_alert "COMPILE-UDEV Copied 10-wlan0.link" "info" fi cat > "${INSTALL_DIR}/etc/udev/rules.d/npu.rules" << EOF KERNEL=="adla0", MODE="0777", RUN+="/bin/mkdir -p /data/nn", RUN+="/bin/chmod 777 /data/nn" EOF if ! is_feature_contains "$MEDIA_ENCODER_HW_CONFIG" "TAHOE"; then cat > "${INSTALL_DIR}/etc/udev/rules.d/venc.rules" << EOF KERNEL=="vc8000", MODE="0777" KERNEL=="memalloc", MODE="0777" EOF else cat > "${INSTALL_DIR}/etc/udev/rules.d/venc.rules" << EOF KERNEL=="tahoe", MODE="0777" EOF fi display_alert "COMPILE-UDEV Created default venc.rules for ${BOARD}" "info" } # ------------------------------------------------------------------------------ # Step 5: Debian Package Building # ------------------------------------------------------------------------------ # Build Debian package from install directory # Parameters: # $1 - log prefix (e.g. "COMPILE-UDEV") # $2 - output deb filename (without path) # Sets: OUTPUT_DEB function _udev_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 _udev_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} Udev source dir: ${UDEV_SRC_DIR}" "info" } # ============================================================================== # Main Build Functions (Entry Points - DO NOT RENAME) # ============================================================================== # ------------------------------------------------------------------------------ # Udev Rules Build # Entry point: amlbian_build_udev # ------------------------------------------------------------------------------ function amlbian_build_udev() { if ! is_unit_enabled "udev"; then echo "[SKIP] >> Udev disable in BUILD_UNITS" return fi # ---- Step 1: Version and Package Information ---- _udev_init_package_info # ---- Step 2: Build Directory Setup ---- _udev_create_build_dirs "${PKG_NAME}_${PKG_VERSION}_${PKG_ARCH}" # Display info display_alert "COMPILE-UDEV Building DMA heap udev rules package version ${PKG_VERSION}" "info" _udev_display_build_info "COMPILE-UDEV" # ---- Step 3: Debian Packaging Scripts ---- _udev_create_control_file \ "${PKG_NAME}" "${PKG_VERSION}" "${PKG_ARCH}" "${PKG_MAINTAINER}" \ "${PKG_DESCRIPTION}" "admin" _udev_create_postinst _udev_create_prerm # ---- Step 4: Copy Source/Vendor Files ---- _udev_copy_rules_files # ---- Step 5: Build Debian Package ---- _udev_build_deb_package "COMPILE-UDEV" "${PKG_NAME}_${PKG_VERSION}_${PKG_ARCH}.deb" # Display the installed rules location display_alert "COMPILE-UDEV After installation, run: sudo udevadm control --reload-rules && sudo udevadm trigger" "info" return 0 } display_alert "AMLbian udev Build Script" "Scriptdir: ${SCRIPT_DIR} AmlbianDir: ${AMLBIAN_DIR} Version: ${KERNEL_VERSION}, Board: ${BOARD}" "info" amlbian_build_udev display_alert "AMLOGIC: udev build completed" "${OUTPUT_DIR}" "info"