Files
BPI-CM9-Linux/amlbian/scripts/udev/build-udev.sh
T

333 lines
12 KiB
Bash

#!/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 <[email protected]>"
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" <<EOF
Package: ${pkg_name}
Version: ${pkg_version}
Architecture: ${pkg_arch}
Maintainer: ${maintainer}
Depends:
Section: ${section}
Priority: optional
Description: ${description}
This package provides udev rules on Amlogic SoCs.
These permissions are required for proper GPU memory allocation.
EOF
}
# Create postinst script for udev rules
function _udev_create_postinst() {
display_alert "COMPILE-UDEV Creating post-installation script DEBIAN/postinst" "info"
cat > "${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"