445 lines
12 KiB
Bash
Executable File
445 lines
12 KiB
Bash
Executable File
#!/bin/bash
|
||
# RK3588S 依赖安装脚本
|
||
# 在全新安装的RK3588S上运行,安装所有必要的支撑软件
|
||
#
|
||
# 用法: sudo ./install_deps.sh
|
||
|
||
set -e
|
||
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m'
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||
|
||
# 临时目录
|
||
TEMP_DIR="/tmp/rk3588_deps_$(date +%s)"
|
||
mkdir -p "$TEMP_DIR"
|
||
|
||
echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
|
||
echo -e "${BLUE}║ RK3588S 依赖安装脚本 ║${NC}"
|
||
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}"
|
||
echo ""
|
||
|
||
# 检查root权限
|
||
if [ "$(id -u)" -ne 0 ]; then
|
||
echo -e "${RED}错误: 请使用 sudo 运行此脚本${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
# 检测系统版本
|
||
echo -e "${YELLOW}[系统信息]${NC}"
|
||
echo " 内核: $(uname -r)"
|
||
echo " 架构: $(uname -m)"
|
||
echo " 系统: $(lsb_release -d 2>/dev/null | cut -f2 || cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d '\"')"
|
||
echo ""
|
||
|
||
# ============================================
|
||
# 1. 安装基础工具
|
||
# ============================================
|
||
install_basic_tools() {
|
||
echo -e "${YELLOW}[1/6] 安装基础工具...${NC}"
|
||
|
||
apt-get update
|
||
|
||
# 编译工具
|
||
apt-get install -y \
|
||
build-essential \
|
||
cmake \
|
||
git \
|
||
wget \
|
||
curl \
|
||
pkg-config
|
||
|
||
# 开发库
|
||
apt-get install -y \
|
||
libdrm-dev \
|
||
libx11-dev \
|
||
libxext-dev \
|
||
libgles2-mesa-dev \
|
||
libwayland-dev \
|
||
libpulse-dev \
|
||
libasound2-dev \
|
||
libv4l-dev
|
||
|
||
# Python和工具
|
||
apt-get install -y \
|
||
python3 \
|
||
python3-pip \
|
||
python3-dev \
|
||
python3-venv
|
||
|
||
# 其他工具 (注意: ffmpeg稍后会从源码编译安装)
|
||
apt-get install -y \
|
||
htop \
|
||
vim \
|
||
net-tools \
|
||
v4l-utils
|
||
|
||
echo -e "${GREEN}✓${NC} 基础工具安装完成"
|
||
}
|
||
|
||
# ============================================
|
||
# 2. 安装Rockchip MPP
|
||
# ============================================
|
||
install_mpp() {
|
||
echo -e "${YELLOW}[2/6] 安装 Rockchip MPP...${NC}"
|
||
|
||
cd "$TEMP_DIR"
|
||
|
||
# 克隆MPP
|
||
if [ ! -d "mpp" ]; then
|
||
git clone https://github.com/rockchip-linux/mpp.git
|
||
fi
|
||
|
||
cd mpp
|
||
|
||
# 创建build目录
|
||
mkdir -p build
|
||
cd build
|
||
|
||
# 配置编译
|
||
cmake .. \
|
||
-DCMAKE_INSTALL_PREFIX=/usr \
|
||
-DCMAKE_BUILD_TYPE=Release \
|
||
-DHAVE_DRM=ON
|
||
|
||
# 编译安装
|
||
make -j$(nproc)
|
||
make install
|
||
|
||
# 更新动态链接库
|
||
ldconfig
|
||
|
||
echo -e "${GREEN}✓${NC} MPP 安装完成"
|
||
}
|
||
|
||
# ============================================
|
||
# 3. 安装Rockchip RGA
|
||
# ============================================
|
||
install_rga() {
|
||
echo -e "${YELLOW}[3/6] 安装 Rockchip RGA...${NC}"
|
||
|
||
cd "$TEMP_DIR"
|
||
|
||
# 克隆RGA
|
||
if [ ! -d "rkrga" ]; then
|
||
git clone https://github.com/rockchip-linux/rkrga.git
|
||
fi
|
||
|
||
cd rkrga
|
||
|
||
# 编译
|
||
mkdir -p build
|
||
cd build
|
||
|
||
cmake .. \
|
||
-DCMAKE_INSTALL_PREFIX=/usr \
|
||
-DCMAKE_BUILD_TYPE=Release
|
||
|
||
make -j$(nproc)
|
||
make install
|
||
|
||
ldconfig
|
||
|
||
echo -e "${GREEN}✓${NC} RGA 安装完成"
|
||
}
|
||
|
||
# ============================================
|
||
# 4. 安装RKNN Runtime
|
||
# ============================================
|
||
install_rknn() {
|
||
echo -e "${YELLOW}[4/6] 安装 RKNN Runtime...${NC}"
|
||
|
||
cd "$TEMP_DIR"
|
||
|
||
# 检查项目目录中是否有RKNN包
|
||
RKNN_PACKAGE=""
|
||
if [ -d "$PROJECT_DIR/third_party/rknpu2" ]; then
|
||
echo " 使用项目自带的 RKNN Runtime"
|
||
else
|
||
# 下载RKNN Runtime
|
||
echo " 下载 RKNN Runtime..."
|
||
RKNN_VERSION="1.6.0"
|
||
RKNN_DEB="rknpu2_${RKNN_VERSION}_arm64.deb"
|
||
|
||
if [ ! -f "$RKNN_DEB" ]; then
|
||
wget "https://github.com/rockchip-linux/rknpu2/releases/download/v${RKNN_VERSION}/${RKNN_DEB}" \
|
||
-O "$RKNN_DEB" 2>/dev/null || {
|
||
echo -e "${YELLOW}警告: 无法下载RKNN包,请手动安装${NC}"
|
||
return 0
|
||
}
|
||
fi
|
||
|
||
dpkg -i "$RKNN_DEB" || apt-get install -f -y
|
||
fi
|
||
|
||
# 安装python包
|
||
pip3 install rknn-toolkit2-lite2 --break-system-packages 2>/dev/null || \
|
||
pip3 install rknn-toolkit2-lite2 --user 2>/dev/null || {
|
||
echo -e "${YELLOW}警告: RKNN Python包安装失败${NC}"
|
||
}
|
||
|
||
ldconfig
|
||
|
||
echo -e "${GREEN}✓${NC} RKNN Runtime 安装完成"
|
||
}
|
||
|
||
# ============================================
|
||
# 5. 安装FFmpeg (带Rockchip支持)
|
||
# ============================================
|
||
install_ffmpeg_rk() {
|
||
echo -e "${YELLOW}[5/6] 安装 FFmpeg (带Rockchip支持)...${NC}"
|
||
|
||
# 检查并处理系统预装的ffmpeg
|
||
echo " 检查系统ffmpeg..."
|
||
if dpkg -l | grep -q "^ii ffmpeg "; then
|
||
echo " 发现系统预装ffmpeg,解除保留状态..."
|
||
apt-mark unhold ffmpeg 2>/dev/null || true
|
||
apt-get remove -y ffmpeg 2>/dev/null || true
|
||
fi
|
||
|
||
cd "$TEMP_DIR"
|
||
|
||
# 检查是否已有ffmpeg-rockchip
|
||
if [ -d "$PROJECT_DIR/ffmpeg-rockchip" ]; then
|
||
echo " 使用项目自带的 ffmpeg-rockchip"
|
||
cd "$PROJECT_DIR/ffmpeg-rockchip"
|
||
else
|
||
# 克隆ffmpeg-rockchip
|
||
echo " 下载 ffmpeg-rockchip..."
|
||
git clone https://github.com/nyanmisaka/ffmpeg-rockchip.git
|
||
cd ffmpeg-rockchip
|
||
fi
|
||
|
||
# 安装依赖
|
||
apt-get install -y \
|
||
libgnutls28-dev \
|
||
libaom-dev \
|
||
libdav1d-dev \
|
||
libmp3lame-dev \
|
||
libopus-dev \
|
||
libtheora-dev \
|
||
libvorbis-dev \
|
||
libvpx-dev \
|
||
libx264-dev \
|
||
libx265-dev \
|
||
libnuma-dev
|
||
|
||
# 配置编译
|
||
./configure \
|
||
--prefix=/usr/local \
|
||
--enable-gpl \
|
||
--enable-version3 \
|
||
--enable-libdrm \
|
||
--enable-rkmpp \
|
||
--enable-rkrga \
|
||
--enable-libx264 \
|
||
--enable-libx265 \
|
||
--enable-libvpx \
|
||
--enable-libopus \
|
||
--enable-libvorbis \
|
||
--enable-libmp3lame \
|
||
--enable-libtheora \
|
||
--enable-libaom \
|
||
--enable-libdav1d \
|
||
--enable-shared \
|
||
--disable-static \
|
||
--extra-libs=-lpthread \
|
||
--extra-libs=-lm
|
||
|
||
# 编译安装
|
||
make -j$(nproc)
|
||
make install
|
||
|
||
# 更新动态链接库
|
||
ldconfig
|
||
|
||
# 创建软链接
|
||
ln -sf /usr/local/bin/ffmpeg /usr/bin/ffmpeg-rk
|
||
|
||
echo -e "${GREEN}✓${NC} FFmpeg 安装完成"
|
||
echo " 版本: $(ffmpeg -version | head -1)"
|
||
}
|
||
|
||
# ============================================
|
||
# 6. 配置系统环境
|
||
# ============================================
|
||
configure_system() {
|
||
echo -e "${YELLOW}[6/6] 配置系统环境...${NC}"
|
||
|
||
# 创建udev规则(NPU设备权限)
|
||
cat > /etc/udev/rules.d/99-rockchip-npu.rules << 'EOF'
|
||
# RK3588 NPU
|
||
KERNEL=="rknpu", MODE="0666", GROUP="video"
|
||
KERNEL=="rknpu0", MODE="0666", GROUP="video"
|
||
KERNEL=="rknpu1", MODE="0666", GROUP="video"
|
||
KERNEL=="rknpu2", MODE="0666", GROUP="video"
|
||
|
||
# MPP
|
||
KERNEL=="mpp_service", MODE="0666", GROUP="video"
|
||
|
||
# RGA
|
||
KERNEL=="rga", MODE="0666", GROUP="video"
|
||
KERNEL=="rga3", MODE="0666", GROUP="video"
|
||
EOF
|
||
|
||
# 重新加载udev规则
|
||
udevadm control --reload-rules
|
||
udevadm trigger
|
||
|
||
# 添加用户到video组
|
||
usermod -a -G video orangepi 2>/dev/null || true
|
||
usermod -a -G render orangepi 2>/dev/null || true
|
||
|
||
# 创建日志目录
|
||
mkdir -p /var/log/rk3588
|
||
chown -R orangepi:orangepi /var/log/rk3588 2>/dev/null || true
|
||
|
||
# 配置内核参数(性能优化)
|
||
cat >> /etc/sysctl.conf << 'EOF'
|
||
# RK3588 性能优化
|
||
vm.swappiness=10
|
||
vm.dirty_ratio=40
|
||
vm.dirty_background_ratio=10
|
||
net.core.rmem_max=134217728
|
||
net.core.wmem_max=134217728
|
||
EOF
|
||
|
||
sysctl -p
|
||
|
||
echo -e "${GREEN}✓${NC} 系统环境配置完成"
|
||
}
|
||
|
||
# ============================================
|
||
# 验证安装
|
||
# ============================================
|
||
verify_installation() {
|
||
echo ""
|
||
echo -e "${BLUE}[安装验证]${NC}"
|
||
|
||
local ERRORS=0
|
||
|
||
# 检查NPU设备
|
||
if [ -e /dev/rknpu ]; then
|
||
echo -e "${GREEN}✓${NC} NPU设备: $(ls /dev/rknpu* 2>/dev/null | wc -l) 个"
|
||
else
|
||
echo -e "${RED}✗${NC} NPU设备未找到"
|
||
ERRORS=$((ERRORS+1))
|
||
fi
|
||
|
||
# 检查MPP
|
||
if pkg-config --exists rockchip_mpp; then
|
||
echo -e "${GREEN}✓${NC} MPP: $(pkg-config --modversion rockchip_mpp)"
|
||
else
|
||
echo -e "${RED}✗${NC} MPP未安装"
|
||
ERRORS=$((ERRORS+1))
|
||
fi
|
||
|
||
# 检查RGA
|
||
if [ -f /usr/include/rga/RgaApi.h ]; then
|
||
echo -e "${GREEN}✓${NC} RGA头文件"
|
||
else
|
||
echo -e "${YELLOW}⚠${NC} RGA头文件可能未正确安装"
|
||
fi
|
||
|
||
# 检查RKNN
|
||
if [ -f /usr/lib/librknnrt.so ] || [ -f /usr/lib/aarch64-linux-gnu/librknnrt.so ]; then
|
||
echo -e "${GREEN}✓${NC} RKNN Runtime"
|
||
else
|
||
echo -e "${YELLOW}⚠${NC} RKNN Runtime可能使用项目内置版本"
|
||
fi
|
||
|
||
# 检查FFmpeg
|
||
if command -v ffmpeg &> /dev/null; then
|
||
echo -e "${GREEN}✓${NC} FFmpeg: $(ffmpeg -version | head -1 | awk '{print $3}')"
|
||
else
|
||
echo -e "${RED}✗${NC} FFmpeg未安装"
|
||
ERRORS=$((ERRORS+1))
|
||
fi
|
||
|
||
# 检查cmake
|
||
if command -v cmake &> /dev/null; then
|
||
echo -e "${GREEN}✓${NC} CMake: $(cmake --version | head -1)"
|
||
else
|
||
echo -e "${RED}✗${NC} CMake未安装"
|
||
ERRORS=$((ERRORS+1))
|
||
fi
|
||
|
||
echo ""
|
||
if [ $ERRORS -eq 0 ]; then
|
||
echo -e "${GREEN}所有依赖安装成功!${NC}"
|
||
return 0
|
||
else
|
||
echo -e "${YELLOW}有 $ERRORS 项验证失败,请检查安装日志${NC}"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# ============================================
|
||
# 清理
|
||
# ============================================
|
||
cleanup() {
|
||
echo ""
|
||
echo -e "${YELLOW}[清理]${NC}"
|
||
read -p "是否删除临时文件 ($TEMP_DIR)? (y/N): " -r
|
||
if [ "$REPLY" = "y" ] || [ "$REPLY" = "Y" ]; then
|
||
rm -rf "$TEMP_DIR"
|
||
echo "临时文件已删除"
|
||
fi
|
||
}
|
||
|
||
# ============================================
|
||
# 主流程
|
||
# ============================================
|
||
main() {
|
||
echo -e "${YELLOW}即将安装以下软件:${NC}"
|
||
echo " 1. 基础工具 (cmake, git, python3等)"
|
||
echo " 2. Rockchip MPP (硬件编解码)"
|
||
echo " 3. Rockchip RGA (2D图形加速)"
|
||
echo " 4. RKNN Runtime (NPU推理)"
|
||
echo " 5. FFmpeg (带Rockchip支持)"
|
||
echo " 6. 系统环境配置"
|
||
echo ""
|
||
read -p "确认安装? (y/N): " -r
|
||
if [ "$REPLY" != "y" ] && [ "$REPLY" != "Y" ]; then
|
||
echo "已取消"
|
||
exit 0
|
||
fi
|
||
|
||
echo ""
|
||
|
||
# 执行安装
|
||
install_basic_tools
|
||
install_mpp
|
||
install_rga
|
||
install_rknn
|
||
install_ffmpeg_rk
|
||
configure_system
|
||
|
||
# 验证
|
||
verify_installation
|
||
|
||
# 清理
|
||
cleanup
|
||
|
||
# 完成
|
||
echo ""
|
||
echo -e "${GREEN}╔════════════════════════════════════════════════════════════╗${NC}"
|
||
echo -e "${GREEN}║ 依赖安装完成! ║${NC}"
|
||
echo -e "${GREEN}╚════════════════════════════════════════════════════════════╝${NC}"
|
||
echo ""
|
||
echo "下一步:"
|
||
echo " 1. 复制项目代码到新设备"
|
||
echo " 2. 编译项目: cd build && cmake .. && make -j\$(nproc)"
|
||
echo " 3. 运行部署脚本: sudo ./scripts/deploy.sh install"
|
||
echo ""
|
||
echo "提示: 重新登录或使用 'newgrp video' 使组权限生效"
|
||
}
|
||
|
||
# 运行
|
||
main "$@"
|