mirror of
https://github.com/shenmintao/aic8800d80.git
synced 2026-09-26 17:44:16 +00:00
Refactor script for other Linux distros with automatic kernel updates
This commit is contained in:
Regular → Executable
+401
-283
@@ -1,438 +1,556 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Cores for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
CYAN='\033[0;36m'
|
||||
NC='\033[0m' # No Color
|
||||
#############################################################################
|
||||
# AIC8800D80 WiFi 6 Driver - Universal Installer (DKMS) - VERSÃO CORRIGIDA
|
||||
# Version: 2.0.4
|
||||
# Date: 2025-12-30
|
||||
# Description: Multi-distribution installer with DKMS support
|
||||
# Supported: Debian/Ubuntu, Fedora/RHEL, Arch Linux, and derivatives
|
||||
# FIX: Corrected DKMS module configuration for aic8800_fdrv
|
||||
#############################################################################
|
||||
|
||||
# Variables
|
||||
DRIVER_REPO="https://github.com/shenmintao/aic8800d80.git"
|
||||
DRIVER_DIR="$HOME/aic8800d80"
|
||||
LOG_FILE="/tmp/aic8800d80_install.log"
|
||||
MODULE_NAME="aic8800_fdrv"
|
||||
set -e # Exit on error
|
||||
|
||||
# Color definitions
|
||||
readonly RED='\033[0;31m'
|
||||
readonly GREEN='\033[0;32m'
|
||||
readonly YELLOW='\033[1;33m'
|
||||
readonly BLUE='\033[0;34m'
|
||||
readonly CYAN='\033[0;36m'
|
||||
readonly NC='\033[0m' # No Color
|
||||
|
||||
# Driver configuration
|
||||
readonly DRV_NAME="aic8800"
|
||||
readonly DRV_VERSION="1.0.0"
|
||||
readonly SRC_DIR="/usr/src/${DRV_NAME}-${DRV_VERSION}"
|
||||
readonly MODULE_NAME="aic8800_fdrv"
|
||||
readonly LOG_FILE="/tmp/aic8800d80_install.log"
|
||||
|
||||
# Script directory (where the script is located)
|
||||
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
#############################################################################
|
||||
# Logging and Output Functions
|
||||
#############################################################################
|
||||
|
||||
log_message() {
|
||||
local level="$1"
|
||||
shift
|
||||
# Garantir que o arquivo de log existe e tem permissões corretas
|
||||
if [ ! -f "$LOG_FILE" ]; then
|
||||
touch "$LOG_FILE" 2>/dev/null || true
|
||||
chmod 666 "$LOG_FILE" 2>/dev/null || true
|
||||
fi
|
||||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $*" >> "$LOG_FILE" 2>/dev/null || true
|
||||
}
|
||||
|
||||
# Auxiliary functions
|
||||
print_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1"
|
||||
echo "[INFO] $1" >> "$LOG_FILE"
|
||||
log_message "INFO" "$1"
|
||||
}
|
||||
|
||||
print_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||
echo "[SUCCESS] $1" >> "$LOG_FILE"
|
||||
log_message "SUCCESS" "$1"
|
||||
}
|
||||
|
||||
print_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||
echo "[WARNING] $1" >> "$LOG_FILE"
|
||||
log_message "WARNING" "$1"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1"
|
||||
echo "[ERROR] $1" >> "$LOG_FILE"
|
||||
log_message "ERROR" "$1"
|
||||
}
|
||||
|
||||
print_step() {
|
||||
echo -e "\n${CYAN}==>${NC} ${1}"
|
||||
echo "==> $1" >> "$LOG_FILE"
|
||||
echo ""
|
||||
echo -e "${CYAN}==>${NC} ${1}"
|
||||
log_message "STEP" "$1"
|
||||
}
|
||||
|
||||
# Function to check if the command was successful
|
||||
check_success() {
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "$1"
|
||||
return 0
|
||||
else
|
||||
print_error "$2"
|
||||
return 1
|
||||
#############################################################################
|
||||
# Error Handling
|
||||
#############################################################################
|
||||
|
||||
cleanup_on_error() {
|
||||
print_error "Installation failed. Check $LOG_FILE for details."
|
||||
exit 1
|
||||
}
|
||||
|
||||
trap cleanup_on_error ERR
|
||||
|
||||
#############################################################################
|
||||
# Root Privilege Check
|
||||
#############################################################################
|
||||
|
||||
check_root() {
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
print_error "This script must be run as root (use sudo)"
|
||||
echo ""
|
||||
echo "Usage: sudo ./install.sh"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
# Check Secure Boot
|
||||
# Secure Boot Detection
|
||||
#############################################################################
|
||||
|
||||
check_secure_boot() {
|
||||
print_step "Checking Secure Boot status..."
|
||||
|
||||
# Method 1: Check via mokutil (more reliable)
|
||||
local secure_boot_enabled=false
|
||||
|
||||
# Method 1: Check via mokutil
|
||||
if command -v mokutil &> /dev/null; then
|
||||
SECURE_BOOT_STATUS=$(mokutil --sb-state 2>/dev/null | grep -i "SecureBoot" | awk '{print $2}')
|
||||
|
||||
if [[ "$SECURE_BOOT_STATUS" == "enabled" ]]; then
|
||||
print_error "Secure Boot is ENABLED!"
|
||||
echo ""
|
||||
echo -e "${RED}╔════════════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${RED}║ SECURE BOOT IS ENABLED - INSTALLATION CANNOT PROCEED ║${NC}"
|
||||
echo -e "${RED}╚════════════════════════════════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}Why does Secure Boot need to be disabled?${NC}"
|
||||
echo ""
|
||||
echo "Secure Boot is a security feature of UEFI that prevents the loading"
|
||||
echo "of unsigned kernel modules. The AIC8800D80 driver is a custom module"
|
||||
echo "compiled locally and does not have a digital signature recognized by the system."
|
||||
echo ""
|
||||
echo -e "${CYAN}How to disable Secure Boot:${NC}"
|
||||
echo ""
|
||||
echo "1. Restart the computer"
|
||||
echo "2. Enter the BIOS/UEFI (usually pressing DEL, F2, F10 or ESC)"
|
||||
echo "3. Search for 'Secure Boot' in the settings (usually in Security)"
|
||||
echo "4. Change from 'Enabled' to 'Disabled'"
|
||||
echo "5. Save the settings and restart (usually F10)"
|
||||
echo "6. Execute this script again"
|
||||
echo ""
|
||||
echo -e "${YELLOW}Note:${NC} Disabling Secure Boot is safe for personal use, but"
|
||||
echo " slightly reduces security against bootrootkits."
|
||||
echo ""
|
||||
return 1
|
||||
else
|
||||
print_success "Secure Boot is disabled. Proceeding..."
|
||||
return 0
|
||||
if mokutil --sb-state 2>/dev/null | grep -qi "SecureBoot enabled"; then
|
||||
secure_boot_enabled=true
|
||||
fi
|
||||
fi
|
||||
|
||||
# Method 2: Check via /sys/firmware/efi/efivars (fallback)
|
||||
if [ -d /sys/firmware/efi/efivars ]; then
|
||||
if [ -f /sys/firmware/efi/efivars/SecureBoot-* ]; then
|
||||
SB_VALUE=$(od -An -t u1 /sys/firmware/efi/efivars/SecureBoot-* | awk '{print $NF}')
|
||||
if [ "$SB_VALUE" = "1" ]; then
|
||||
print_error "Secure Boot is ENABLED (detected via EFI vars)!"
|
||||
echo ""
|
||||
echo -e "${RED}Secure Boot needs to be disabled to install this driver.${NC}"
|
||||
echo "See the instructions above on how to disable it."
|
||||
return 1
|
||||
else
|
||||
print_success "Secure Boot is disabled (verified via EFI vars)."
|
||||
return 0
|
||||
# Method 2: Check via EFI variables (fallback)
|
||||
if [ "$secure_boot_enabled" = false ] && [ -d /sys/firmware/efi ]; then
|
||||
local secureboot_files=(/sys/firmware/efi/efivars/SecureBoot-*)
|
||||
if [ -f "${secureboot_files[0]}" ]; then
|
||||
local sb_value
|
||||
sb_value=$(od -An -t u1 "${secureboot_files[0]}" 2>/dev/null | awk '{print $NF}')
|
||||
if [ "$sb_value" = "1" ]; then
|
||||
secure_boot_enabled=true
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# Method 3: Check via dmesg (last resort)
|
||||
DMESG_SB=$(dmesg | grep -i "secure boot" | grep -i "enabled")
|
||||
if [ -n "$DMESG_SB" ]; then
|
||||
print_warning "Secure Boot may be enabled (detected via dmesg)."
|
||||
echo "Please check manually and disable if necessary."
|
||||
read -p "Do you want to continue anyway? (y/N): " choice
|
||||
if [[ ! "$choice" =~ ^[Ss]$ ]]; then
|
||||
return 1
|
||||
if [ "$secure_boot_enabled" = true ]; then
|
||||
echo ""
|
||||
echo -e "${YELLOW}╔════════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${YELLOW}║ SECURE BOOT IS ENABLED ║${NC}"
|
||||
echo -e "${YELLOW}╚════════════════════════════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
echo "The driver may not load automatically due to Secure Boot restrictions."
|
||||
echo "Third-party modules require signing or Secure Boot must be disabled."
|
||||
echo ""
|
||||
echo -e "${CYAN}Options:${NC}"
|
||||
echo " 1. Disable Secure Boot in BIOS/UEFI settings (recommended)"
|
||||
echo " 2. Sign the module manually (advanced)"
|
||||
echo " 3. Continue installation anyway (module may fail to load)"
|
||||
echo ""
|
||||
read -p "Continue installation? (y/N): " choice
|
||||
if [[ ! "$choice" =~ ^[Yy]$ ]]; then
|
||||
print_info "Installation cancelled by user."
|
||||
exit 0
|
||||
fi
|
||||
print_warning "Continuing with Secure Boot enabled..."
|
||||
else
|
||||
print_success "Secure Boot is disabled or not present."
|
||||
fi
|
||||
|
||||
print_success "Secure Boot verification completed."
|
||||
return 0
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
# Check requirements
|
||||
# Package Manager Detection and Dependency Installation
|
||||
#############################################################################
|
||||
|
||||
check_requirements() {
|
||||
print_step "Checking system requirements..."
|
||||
detect_package_manager() {
|
||||
print_step "Detecting package manager and distribution..."
|
||||
|
||||
# Verificar se é root
|
||||
if [ "$EUID" -eq 0 ]; then
|
||||
print_error "This script MUST NOT be run as root!"
|
||||
echo "Run as a normal user. The script will request sudo when necessary."
|
||||
local pkg_manager=""
|
||||
local distro_name=""
|
||||
|
||||
if command -v apt-get &> /dev/null; then
|
||||
pkg_manager="apt"
|
||||
distro_name="Debian/Ubuntu"
|
||||
elif command -v dnf &> /dev/null; then
|
||||
pkg_manager="dnf"
|
||||
distro_name="Fedora/RHEL"
|
||||
elif command -v yum &> /dev/null; then
|
||||
pkg_manager="yum"
|
||||
distro_name="CentOS/RHEL (legacy)"
|
||||
elif command -v pacman &> /dev/null; then
|
||||
pkg_manager="pacman"
|
||||
distro_name="Arch Linux"
|
||||
elif command -v zypper &> /dev/null; then
|
||||
pkg_manager="zypper"
|
||||
distro_name="openSUSE"
|
||||
else
|
||||
print_error "No supported package manager found!"
|
||||
echo ""
|
||||
echo "Please install the following packages manually:"
|
||||
echo " - dkms"
|
||||
echo " - build-essential / base-devel / development tools"
|
||||
echo " - linux-headers for your kernel version"
|
||||
echo " - mokutil (optional, for Secure Boot detection)"
|
||||
echo ""
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check kernel
|
||||
KERNEL_VERSION=$(uname -r)
|
||||
print_info "Kernel detected: $KERNEL_VERSION"
|
||||
|
||||
# Check if has access to sudo
|
||||
if ! sudo -n true 2>/dev/null; then
|
||||
print_info "This script requires sudo privileges."
|
||||
sudo -v || { print_error "Failed to obtain sudo privileges."; exit 1; }
|
||||
fi
|
||||
|
||||
print_success "Basic requirements met."
|
||||
print_success "Detected: $distro_name ($pkg_manager)"
|
||||
DETECTED_PKG_MANAGER="$pkg_manager"
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
# Install dependencies
|
||||
#############################################################################
|
||||
|
||||
install_dependencies() {
|
||||
print_step "Installing necessary dependencies..."
|
||||
local pkg_manager="$1"
|
||||
|
||||
# Update package list
|
||||
print_info "Updating package list..."
|
||||
sudo apt update >> "$LOG_FILE" 2>&1
|
||||
check_success "Package list updated" "Failed to update package list"
|
||||
print_step "Installing dependencies..."
|
||||
|
||||
# List of dependencies
|
||||
DEPENDENCIES=(
|
||||
"git"
|
||||
"build-essential"
|
||||
"dkms"
|
||||
"bc"
|
||||
"linux-headers-$(uname -r)"
|
||||
"mokutil"
|
||||
)
|
||||
case "$pkg_manager" in
|
||||
apt)
|
||||
print_info "Updating package database..."
|
||||
apt-get update -qq >> "$LOG_FILE" 2>&1
|
||||
|
||||
print_info "Installing: dkms, build-essential, linux-headers, mokutil..."
|
||||
apt-get install -y dkms build-essential linux-headers-$(uname -r) mokutil >> "$LOG_FILE" 2>&1
|
||||
;;
|
||||
|
||||
dnf)
|
||||
print_info "Installing: dkms, gcc, make, kernel-devel, kernel-headers, mokutil..."
|
||||
dnf install -y dkms make gcc kernel-devel kernel-headers mokutil >> "$LOG_FILE" 2>&1
|
||||
;;
|
||||
|
||||
yum)
|
||||
print_info "Installing: dkms, gcc, make, kernel-devel, mokutil..."
|
||||
yum install -y epel-release >> "$LOG_FILE" 2>&1
|
||||
yum install -y dkms make gcc kernel-devel mokutil >> "$LOG_FILE" 2>&1
|
||||
;;
|
||||
|
||||
pacman)
|
||||
print_info "Syncing package database..."
|
||||
pacman -Sy --noconfirm >> "$LOG_FILE" 2>&1
|
||||
|
||||
print_info "Installing: dkms, base-devel, linux-headers, mokutil..."
|
||||
pacman -S --noconfirm dkms base-devel linux-headers mokutil >> "$LOG_FILE" 2>&1
|
||||
;;
|
||||
|
||||
zypper)
|
||||
print_info "Installing: dkms, gcc, make, kernel-devel, mokutil..."
|
||||
zypper install -y dkms make gcc kernel-devel mokutil >> "$LOG_FILE" 2>&1
|
||||
;;
|
||||
|
||||
*)
|
||||
print_error "Unsupported package manager: $pkg_manager"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
print_info "Installing: ${DEPENDENCIES[*]}"
|
||||
sudo apt install -y "${DEPENDENCIES[@]}" >> "$LOG_FILE" 2>&1
|
||||
check_success "Dependencies installed" "Failed to install dependencies"
|
||||
print_success "Dependencies installed successfully."
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
# Download driver
|
||||
# Firmware Installation
|
||||
#############################################################################
|
||||
|
||||
download_driver() {
|
||||
print_step "Downloading AIC8800D80 driver..."
|
||||
install_firmware() {
|
||||
print_step "Installing firmware..."
|
||||
|
||||
# If the directory already exists, ask if you want to update
|
||||
if [ -d "$DRIVER_DIR" ]; then
|
||||
print_warning "Directory $DRIVER_DIR already exists."
|
||||
read -p "Do you want to remove and download again? (y/N): " choice
|
||||
if [[ "$choice" =~ ^[Ss]$ ]]; then
|
||||
print_info "Removing old directory..."
|
||||
rm -rf "$DRIVER_DIR"
|
||||
check_success "Old directory removed" "Failed to remove old directory"
|
||||
else
|
||||
print_info "Using existing directory."
|
||||
cd "$DRIVER_DIR" || exit 1
|
||||
git pull >> "$LOG_FILE" 2>&1
|
||||
print_info "Repository updated."
|
||||
return 0
|
||||
fi
|
||||
fi
|
||||
local fw_source="${SCRIPT_DIR}/fw/aic8800D80"
|
||||
local fw_dest="/lib/firmware/aic8800D80"
|
||||
|
||||
# Clone repository
|
||||
print_info "Cloning repository..."
|
||||
cd "$HOME" || exit 1
|
||||
git clone "$DRIVER_REPO" >> "$LOG_FILE" 2>&1
|
||||
check_success "Repository cloned successfully" "Failed to clone repository" || exit 1
|
||||
|
||||
cd "$DRIVER_DIR" || exit 1
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
# Installation of driver
|
||||
#############################################################################
|
||||
|
||||
install_driver() {
|
||||
print_step "Installing AIC8800D80 driver..."
|
||||
|
||||
cd "$DRIVER_DIR" || { print_error "Driver directory not found!"; exit 1; }
|
||||
|
||||
# Step 1: Copy udev rules
|
||||
print_info "Copying udev rules..."
|
||||
sudo cp aic.rules /lib/udev/rules.d/ >> "$LOG_FILE" 2>&1
|
||||
check_success "Udev rules copied" "Failed to copy udev rules"
|
||||
|
||||
# Step 2: Remove old firmwares (IMPORTANT!)
|
||||
print_info "Removing old firmwares (prevents freezes)..."
|
||||
sudo rm -rf /lib/firmware/aic8800* >> "$LOG_FILE" 2>&1
|
||||
print_success "Old firmwares removed"
|
||||
|
||||
# Step 3: Copy new firmware
|
||||
print_info "Copying new firmware AIC8800D80..."
|
||||
sudo cp -r ./fw/aic8800D80 /lib/firmware/ >> "$LOG_FILE" 2>&1
|
||||
check_success "Firmware copied" "Failed to copy firmware" || exit 1
|
||||
|
||||
# Step 4: Navigate to driver directory
|
||||
print_info "Navigating to driver directory..."
|
||||
cd ./drivers/aic8800 || { print_error "Driver directory drivers/aic8800 not found!"; exit 1; }
|
||||
|
||||
# Check if Makefile exists
|
||||
if [ ! -f "Makefile" ]; then
|
||||
print_error "Makefile not found in $(pwd)"
|
||||
if [ ! -d "$fw_source" ]; then
|
||||
print_error "Firmware directory not found: $fw_source"
|
||||
echo "Please ensure you're running the script from the repository root."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Step 5: Compile driver
|
||||
print_info "Compiling driver (this may take a few minutes)..."
|
||||
make >> "$LOG_FILE" 2>&1
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
print_warning "Compilation failed with default GCC. Trying with gcc-12..."
|
||||
make clean >> "$LOG_FILE" 2>&1
|
||||
make CC=gcc-12 >> "$LOG_FILE" 2>&1
|
||||
check_success "Driver compiled with gcc-12" "Failed to compile driver" || exit 1
|
||||
else
|
||||
print_success "Driver compiled successfully"
|
||||
# Remove old firmware versions
|
||||
if [ -d "$fw_dest" ]; then
|
||||
print_info "Removing existing firmware..."
|
||||
if [ -d "/lib/firmware" ] && [ -n "$(find /lib/firmware -maxdepth 1 -name 'aic8800*' -type d 2>/dev/null)" ]; then
|
||||
rm -rf /lib/firmware/aic8800* >> "$LOG_FILE" 2>&1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Step 6: Install driver
|
||||
print_info "Installing driver..."
|
||||
sudo make install >> "$LOG_FILE" 2>&1
|
||||
check_success "Driver installed" "Failed to install driver" || exit 1
|
||||
# Copy new firmware
|
||||
print_info "Copying firmware to $fw_dest..."
|
||||
cp -r "$fw_source" "$fw_dest" >> "$LOG_FILE" 2>&1
|
||||
|
||||
print_success "Firmware installed successfully."
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
# Configure automatic loading
|
||||
# DKMS Configuration - CORRIGIDO v2.0.4
|
||||
#############################################################################
|
||||
|
||||
configure_autoload() {
|
||||
print_step "Configuring automatic loading on boot..."
|
||||
create_dkms_conf() {
|
||||
print_step "Configuring DKMS..."
|
||||
|
||||
# Add module to /etc/modules
|
||||
if ! grep -q "^$MODULE_NAME$" /etc/modules 2>/dev/null; then
|
||||
echo "$MODULE_NAME" | sudo tee -a /etc/modules >> "$LOG_FILE" 2>&1
|
||||
print_success "Module added to /etc/modules"
|
||||
else
|
||||
print_info "Module already configured in /etc/modules"
|
||||
local dkms_conf="${SCRIPT_DIR}/dkms.conf"
|
||||
|
||||
# Check if dkms.conf already exists
|
||||
if [ -f "$dkms_conf" ]; then
|
||||
print_info "DKMS configuration file already exists."
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Create configuration file modules-load.d
|
||||
echo "$MODULE_NAME" | sudo tee /etc/modules-load.d/aic8800.conf >> "$LOG_FILE" 2>&1
|
||||
print_success "Configuration file created in /etc/modules-load.d/"
|
||||
print_info "Creating dkms.conf..."
|
||||
|
||||
# CORRIGIDO: Configuração para múltiplos módulos
|
||||
cat > "$dkms_conf" << EOF
|
||||
PACKAGE_NAME="${DRV_NAME}"
|
||||
PACKAGE_VERSION="${DRV_VERSION}"
|
||||
CLEAN="cd drivers/aic8800 && make clean"
|
||||
MAKE="cd drivers/aic8800 && make"
|
||||
|
||||
# Módulo principal (aic8800_fdrv)
|
||||
BUILT_MODULE_NAME[0]="aic8800_fdrv"
|
||||
BUILT_MODULE_LOCATION[0]="drivers/aic8800/aic8800_fdrv"
|
||||
DEST_MODULE_LOCATION[0]="/updates/dkms"
|
||||
|
||||
# Módulo de carregamento de firmware (aic_load_fw)
|
||||
BUILT_MODULE_NAME[1]="aic_load_fw"
|
||||
BUILT_MODULE_LOCATION[1]="drivers/aic8800/aic_load_fw"
|
||||
DEST_MODULE_LOCATION[1]="/updates/dkms"
|
||||
|
||||
AUTOINSTALL="yes"
|
||||
EOF
|
||||
|
||||
print_success "DKMS configuration created."
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
# Load module
|
||||
# DKMS Installation
|
||||
#############################################################################
|
||||
|
||||
install_via_dkms() {
|
||||
print_step "Installing driver via DKMS..."
|
||||
|
||||
# Remove existing DKMS installation if present
|
||||
if dkms status | grep -q "${DRV_NAME}/${DRV_VERSION}"; then
|
||||
print_info "Removing existing DKMS installation..."
|
||||
dkms remove "${DRV_NAME}/${DRV_VERSION}" --all >> "$LOG_FILE" 2>&1 || true
|
||||
fi
|
||||
|
||||
# Clean up old source directory
|
||||
if [ -n "$SRC_DIR" ] && [ -d "$SRC_DIR" ]; then
|
||||
print_info "Cleaning up old source directory..."
|
||||
rm -rf "$SRC_DIR"
|
||||
fi
|
||||
|
||||
# Copy source to /usr/src
|
||||
print_info "Copying source files to $SRC_DIR..."
|
||||
mkdir -p "$SRC_DIR"
|
||||
cp -r "${SCRIPT_DIR}"/* "$SRC_DIR/" >> "$LOG_FILE" 2>&1
|
||||
|
||||
# Add to DKMS
|
||||
print_info "Adding module to DKMS..."
|
||||
dkms add -m "${DRV_NAME}" -v "${DRV_VERSION}" >> "$LOG_FILE" 2>&1
|
||||
|
||||
# Build with DKMS
|
||||
print_info "Building module (this may take a few minutes)..."
|
||||
if ! dkms build -m "${DRV_NAME}" -v "${DRV_VERSION}" >> "$LOG_FILE" 2>&1; then
|
||||
print_error "DKMS build failed!"
|
||||
echo ""
|
||||
echo "Please check the log file: $LOG_FILE"
|
||||
echo "Common issues:"
|
||||
echo " - Missing kernel headers"
|
||||
echo " - Compiler version mismatch"
|
||||
echo " - Kernel version too new/old"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
print_success "Module built successfully."
|
||||
|
||||
# Install with DKMS
|
||||
print_info "Installing module..."
|
||||
dkms install -m "${DRV_NAME}" -v "${DRV_VERSION}" >> "$LOG_FILE" 2>&1
|
||||
|
||||
print_success "Module installed via DKMS."
|
||||
print_info "The driver will automatically rebuild after kernel updates."
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
# Module Loading
|
||||
#############################################################################
|
||||
|
||||
load_module() {
|
||||
print_step "Loading driver module..."
|
||||
print_step "Loading kernel module..."
|
||||
|
||||
# Update module dependencies
|
||||
print_info "Updating module dependencies..."
|
||||
depmod -a >> "$LOG_FILE" 2>&1
|
||||
|
||||
# Unload module if already loaded
|
||||
if lsmod | grep -q "$MODULE_NAME"; then
|
||||
print_info "Module already loaded. Reloading..."
|
||||
sudo modprobe -r "$MODULE_NAME" >> "$LOG_FILE" 2>&1
|
||||
modprobe -r "$MODULE_NAME" >> "$LOG_FILE" 2>&1 || true
|
||||
fi
|
||||
|
||||
# Load module
|
||||
sudo modprobe "$MODULE_NAME" >> "$LOG_FILE" 2>&1
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Module loaded successfully"
|
||||
# Load the module
|
||||
print_info "Loading $MODULE_NAME..."
|
||||
if modprobe "$MODULE_NAME" >> "$LOG_FILE" 2>&1; then
|
||||
print_success "Module loaded successfully."
|
||||
|
||||
# Check if it is listed
|
||||
sleep 2
|
||||
if lsmod | grep -q "$MODULE_NAME"; then
|
||||
print_success "Module active in kernel"
|
||||
lsmod | grep aic | tee -a "$LOG_FILE"
|
||||
# Verify module is loaded
|
||||
print_info "Waiting for module to initialize..."
|
||||
local module_loaded=false
|
||||
for i in {1..10}; do
|
||||
if lsmod | grep -q "$MODULE_NAME"; then
|
||||
module_loaded=true
|
||||
break
|
||||
fi
|
||||
sleep 0.5
|
||||
done
|
||||
|
||||
if [ "$module_loaded" = true ]; then
|
||||
print_success "Module is active in kernel."
|
||||
else
|
||||
print_warning "Module not appears in lsmod"
|
||||
print_warning "Module may not be fully initialized yet."
|
||||
fi
|
||||
else
|
||||
print_error "Failed to load module"
|
||||
echo "Check dmesg for more details: sudo dmesg | tail -50"
|
||||
return 1
|
||||
print_warning "Module installed but could not be loaded immediately."
|
||||
print_info "This may be due to Secure Boot or missing hardware."
|
||||
print_info "Try rebooting or check: sudo dmesg | grep aic8800"
|
||||
fi
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
# Post-installation verification
|
||||
# Post-Installation Verification
|
||||
#############################################################################
|
||||
|
||||
verify_installation() {
|
||||
print_step "Verifying installation..."
|
||||
|
||||
# Check module
|
||||
if lsmod | grep -q "$MODULE_NAME"; then
|
||||
print_success "Module $MODULE_NAME is loaded"
|
||||
# Check DKMS status
|
||||
local dkms_status
|
||||
dkms_status=$(dkms status "${DRV_NAME}/${DRV_VERSION}" 2>/dev/null || echo "not found")
|
||||
|
||||
if echo "$dkms_status" | grep -q "installed"; then
|
||||
print_success "DKMS module registered: $dkms_status"
|
||||
else
|
||||
print_warning "Module is not loaded"
|
||||
print_warning "DKMS status unclear: $dkms_status"
|
||||
fi
|
||||
|
||||
# Check if module is loaded
|
||||
if lsmod | grep -q "$MODULE_NAME"; then
|
||||
print_success "Kernel module is loaded."
|
||||
echo ""
|
||||
lsmod | grep aic
|
||||
else
|
||||
print_info "Module not currently loaded (this is OK if no hardware is connected)."
|
||||
fi
|
||||
|
||||
# Check firmware
|
||||
if [ -d "/lib/firmware/aic8800D80" ]; then
|
||||
print_success "Firmware installed in /lib/firmware/aic8800D80"
|
||||
else
|
||||
print_error "Firmware not found!"
|
||||
fi
|
||||
|
||||
# Check wireless interfaces
|
||||
print_info "Wireless interfaces available:"
|
||||
iwconfig 2>/dev/null | grep -E "wlan|IEEE" | tee -a "$LOG_FILE"
|
||||
|
||||
# Check USB devices
|
||||
print_info "USB devices AIC detected:"
|
||||
lsusb | grep -i "aic\|368B" | tee -a "$LOG_FILE"
|
||||
# Check for wireless interfaces
|
||||
print_info "Checking for wireless interfaces..."
|
||||
if command -v iwconfig &> /dev/null; then
|
||||
iwconfig 2>/dev/null | grep -E "wlan|IEEE" || echo "No wireless interfaces detected (hardware may not be connected)"
|
||||
fi
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
# Final instructions
|
||||
# Final Instructions
|
||||
#############################################################################
|
||||
|
||||
show_final_instructions() {
|
||||
echo ""
|
||||
echo -e "${GREEN}╔════════════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${GREEN}║ INSTALLATION COMPLETED SUCCESSFULLY! ║${NC}"
|
||||
echo -e "${GREEN}╚════════════════════════════════════════════════════════════════════╝${NC}"
|
||||
echo -e "${GREEN}╔════════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${GREEN}║ INSTALLATION COMPLETED SUCCESSFULLY! ║${NC}"
|
||||
echo -e "${GREEN}╚════════════════════════════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
echo -e "${CYAN}Next steps:${NC}"
|
||||
echo -e "${CYAN}Important Information:${NC}"
|
||||
echo ""
|
||||
echo "1. ${YELLOW}CONNECT THE USB ADAPTER${NC} physically (if not already connected)"
|
||||
echo "✓ Driver installed via DKMS"
|
||||
echo "✓ Automatic rebuild enabled for kernel updates"
|
||||
echo "✓ Firmware installed in /lib/firmware/"
|
||||
echo ""
|
||||
echo "2. Wait a few seconds and check if it was detected:"
|
||||
echo -e "${CYAN}Next Steps:${NC}"
|
||||
echo ""
|
||||
echo "1. Connect your AIC8800D80 USB WiFi adapter"
|
||||
echo ""
|
||||
echo "2. Check if the adapter is detected:"
|
||||
echo " ${BLUE}lsusb | grep -i aic${NC}"
|
||||
echo " ${BLUE}iwconfig${NC}"
|
||||
echo " ${BLUE}ip link show${NC}"
|
||||
echo ""
|
||||
echo "3. To view kernel logs about the device:"
|
||||
echo " ${BLUE}sudo dmesg | tail -30${NC}"
|
||||
echo "3. View kernel messages about the driver:"
|
||||
echo " ${BLUE}sudo dmesg | grep aic8800${NC}"
|
||||
echo ""
|
||||
echo "4. To connect to a WiFi network:"
|
||||
echo "4. Connect to a WiFi network:"
|
||||
echo " ${BLUE}nmcli device wifi list${NC}"
|
||||
echo " ${BLUE}nmcli device wifi connect \"NETWORK_NAME\" password \"PASSWORD\"${NC}"
|
||||
echo " ${BLUE}nmcli device wifi connect \"SSID\" password \"PASSWORD\"${NC}"
|
||||
echo ""
|
||||
echo "5. To disable internal WiFi (optional):"
|
||||
echo " ${BLUE}rfkill list${NC}"
|
||||
echo " ${BLUE}sudo rfkill block <internal_wifi_number>${NC}"
|
||||
echo -e "${CYAN}Troubleshooting:${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}Important notes:${NC}"
|
||||
echo "- Bluetooth does not work with this driver (known limitation)"
|
||||
echo "- After kernel update, recompile the driver:"
|
||||
echo " ${BLUE}cd $DRIVER_DIR/drivers/aic8800${NC}"
|
||||
echo " ${BLUE}make clean && make && sudo make install${NC}"
|
||||
echo "• Check DKMS status:"
|
||||
echo " ${BLUE}dkms status${NC}"
|
||||
echo ""
|
||||
echo -e "${CYAN}Complete log saved in:${NC} $LOG_FILE"
|
||||
echo "• Check loaded modules:"
|
||||
echo " ${BLUE}lsmod | grep aic8800${NC}"
|
||||
echo ""
|
||||
echo "• Manually load the module:"
|
||||
echo " ${BLUE}sudo modprobe aic8800_fdrv${NC}"
|
||||
echo ""
|
||||
echo "• View detailed logs:"
|
||||
echo " ${BLUE}cat $LOG_FILE${NC}"
|
||||
echo ""
|
||||
echo -e "${YELLOW}Known Limitations:${NC}"
|
||||
echo "• Bluetooth functionality is not supported"
|
||||
echo "• Secure Boot may prevent module loading (disable in BIOS if needed)"
|
||||
echo ""
|
||||
echo -e "${CYAN}Uninstallation:${NC}"
|
||||
echo " ${BLUE}sudo dkms remove ${DRV_NAME}/${DRV_VERSION} --all${NC}"
|
||||
echo " ${BLUE}sudo rm -rf /lib/firmware/aic8800D80${NC}"
|
||||
echo ""
|
||||
}
|
||||
|
||||
#############################################################################
|
||||
# Main function
|
||||
# Main Installation Flow
|
||||
#############################################################################
|
||||
|
||||
main() {
|
||||
# Clear previous log
|
||||
> "$LOG_FILE"
|
||||
# Initialize log file
|
||||
rm -f "$LOG_FILE" 2>/dev/null || true
|
||||
touch "$LOG_FILE" 2>/dev/null || true
|
||||
chmod 666 "$LOG_FILE" 2>/dev/null || true
|
||||
|
||||
echo -e "${CYAN}"
|
||||
echo "╔════════════════════════════════════════════════════════════════════╗"
|
||||
echo "║ Installation script for AIC8800D80 WiFi 6 driver ║"
|
||||
echo "║ Version 1.0 - 2025-12-29 ║"
|
||||
echo "╚════════════════════════════════════════════════════════════════════╝"
|
||||
echo "╔════════════════════════════════════════════════════════════════╗"
|
||||
echo "║ AIC8800D80 WiFi 6 Driver - Universal Installer (DKMS) ║"
|
||||
echo "║ Version 2.0.4 (Fixed) ║"
|
||||
echo "╚════════════════════════════════════════════════════════════════╝"
|
||||
echo -e "${NC}"
|
||||
|
||||
# Step 1: Check Secure Boot (REQUIRED)
|
||||
check_secure_boot || exit 1
|
||||
log_message "START" "Installation started"
|
||||
log_message "INFO" "Kernel: $(uname -r)"
|
||||
log_message "INFO" "Distribution: $(cat /etc/os-release 2>/dev/null | grep PRETTY_NAME | cut -d= -f2 | tr -d '"')"
|
||||
|
||||
# Step 2: Check requirements
|
||||
check_requirements
|
||||
# Step 1: Check root privileges
|
||||
check_root
|
||||
|
||||
# Step 3: Install dependencies
|
||||
install_dependencies
|
||||
# Step 2: Check Secure Boot
|
||||
check_secure_boot
|
||||
|
||||
# Step 4: Download driver
|
||||
download_driver
|
||||
# Step 3: Detect package manager
|
||||
detect_package_manager
|
||||
|
||||
# Step 5: Install driver
|
||||
install_driver
|
||||
# Step 4: Install dependencies
|
||||
install_dependencies "$DETECTED_PKG_MANAGER"
|
||||
|
||||
# Step 6: Configure autoload
|
||||
configure_autoload
|
||||
# Step 5: Install firmware
|
||||
install_firmware
|
||||
|
||||
# Step 7: Load module
|
||||
# Step 6: Create DKMS configuration
|
||||
create_dkms_conf
|
||||
|
||||
# Step 7: Install via DKMS
|
||||
install_via_dkms
|
||||
|
||||
# Step 8: Load the module
|
||||
load_module
|
||||
|
||||
# Step 8: Verify installation
|
||||
# Step 9: Verify installation
|
||||
verify_installation
|
||||
|
||||
# Step 9: Show final instructions
|
||||
# Step 10: Show final instructions
|
||||
show_final_instructions
|
||||
|
||||
log_message "END" "Installation completed successfully"
|
||||
}
|
||||
|
||||
# Execute script
|
||||
# Execute main function
|
||||
main "$@"
|
||||
|
||||
exit 0
|
||||
|
||||
Reference in New Issue
Block a user