马卫青的博客

爱思思爱猫爱技术

Front

Back

Overview

1 简介

  • SOM-RK3399是友善电子团队设计的一款266-pin金手指形式高性能ARM计算机模块,它采用了瑞芯微64位六核SoC RK3399作为主处理器,标配2GB DDR3内存和16GB闪存,板载2x2 MIMO双天线WiFi模组,尺寸只有69.6x50mm,模块上带有独立的TypeC供电接口,以及USB-C显示接口,无需底板也可以单独使用。

  • SOM-RK3399计算模块具有丰富的外设和扩展接口,通过底板可连接使用4通道NVMe高速固态硬盘,读写速度高达1GB/s; 它还可以扩展使用双MIPI宽动态摄像头,另外它还带有eDP显示接口,MIPI显示接口, 1路USB3.0, 2路USB2.0, 以及I2C, I2S, SPI, PWM, GPIO和串口等各种资源。

  • SOM-RK3399可流畅运行Android 8.1, Ubuntu 18.04, Armbian, Buildroot等主流嵌入式操作系统, 软件资源和生态非常丰富,尤其是Android 8.1具有NN SDK神经网络加速软件包, Qt-5.10集成了VPU硬件编解码, GPU图形加速,可使用QML快速开发流畅的动态式界面,因此SOM-RK3399核心板非常适合中小型企业和初创公司做高端人脸识别,机器视觉,VR虚拟现实,自动驾驶,深度计算分析等方面的人工智能产品快速原型及产品开发。
    2 硬件特性

  • 主控芯片: Rockchip RK3399

    • CPU: big.LITTLE大小核架构,双Cortex-A72大核(up to 2.0GHz)+四Cortex-A53小核结构(up to 1.5GHz)
    • GPU: Mali-T864 GPU,支持OpenGL ES1.1/2.0/3.0/3.1, OpenCL, DX11, 支持AFBC(帧缓冲压缩)
    • VPU: 支持4K VP9 and 4K 10bits H265/H264 视频解码,高达60fps, 双VOP显示等视频编解码功能
  • 电源管理单元: RK808-D PMIC, 搭配独立DC/DC, 支持动态调压, 软件关机, 按键开机, RTC唤醒, 睡眠唤醒等功能

  • 内存: 双通道2GB DDR3

  • Flash: 标配16GB eMMC 5.1闪存,可定制选配32GB/64GB

  • 有线网络: 集成千兆以太网PHY

  • Wi-Fi/蓝牙: 802.11a/b/g/n/ac, Bluetooth 4.1 双频Wi-Fi蓝牙模块, 2x2 MIMO, 双天线接口

  • 视频输入: 1个或2个4线MIPI-CSI, 双ISP像素处理能力高达13MPix/s,支持双路摄像头数据同时输入

  • 视频输出

    • HDMI: HDMI 2.0a, 支持4K@60Hz显示,支持HDCP 1.4/2.2
    • DP on Type-C: DisplayPort 1.2 Alt Mode on USB Type-C
    • LCD Interface: 一个eDP 1.3(4 线,10.8Gbps), 一个或2个4线MIPI-DSI
  • USB

    • USB 2.0: 2个独立的原生USB 2.0 Host
    • USB 3.0: 1个原生USB 3.0 Host
    • USB Type-C: 支持USB3.0 Type-C 和 DisplayPort 1.2 Alt Mode on USB Type-C
  • PCIe: PCIe x4, compatible with PCIe 2.1, Dual operation mode

  • SDIO/MMC: 一路SDIO/MMC, 用来扩展SD卡

  • 调试串口: 一路调试串口 UART, 3V level, 1500000bps

  • 按键: PowerKey, Reset, Recovery 各一个

  • LED指示灯: 一个电源LED ,一个GPIO控制的状态LED

  • 其它资源

    • 2 X 1.8V I2C, 1 x 3V I2C
    • 1 x 3V UART/SPI
    • 2 x PWM
    • 1 x IR-RX
    • 1 x SPDIF_TX
    • 1 x 1.8V 8ch-I2S,
    • 6 x 1.8V GPIO, 8 x 3V GPIO
    • 3 x 1.8V ADC inputs
  • 供电: DC12V/1A(金手指), Type-C:DC5V/2.5A(Type-C)

  • PCB: 8层沉金工艺, 50 mm x 69.6 mm x 1.2mm, 260 Pin金手指接口

  • 环境工作温度: -20℃ to 70℃
    3 布局和引脚定义
    enter description here

  • 260 Pin 金手指定义

    • 匹配的卡槽型号:0.5mm Pitch 260-Pin Standard Type DDR4 SODIMM Socket, 参考型号:https://www.te.com/usa-en/product-2309409-5.html

enter description here

  • 按键
    • 三个按键分别是电源按键, 系统还原和复位。此3个按键相应的信号也存在于260Pin金手指上。
  • LED
    • 一个红色的电源LED和一个绿色的状态LED
  • USB Type-C接口
    • 一个全功能USB-C接口,支持DP,支持USB2.0和USB3.0数据传输,可向外输出5V/2A电源,但不可外接电源给板子供电。支持DRP和安卓ADB调试。因为USB3.0模式下不支持ADB,所以,当使用ADB功能时,请连接到PC的USB2.0端口,或使用只具备USB2.0功能的数据线连接板子和PC。
    • 另外一个USB Type-C 5V_IN接口只有给板子供电的功能,用于不接底板快速测试板子。
  • 电源输入
    • 支持从金手指和USB Type-C 5V_IN接口给核心板供电,支持5V到20V宽电压输入,推荐12V。我们运行安兔兔测试程序时,测量到的最大功耗是10.8W, 建议按12W设计。
    • 设计底板时,建议在电源输入处添加100uF/16V,或100uF/35V电解电容, 以减少电源振铃和提供瞬态电流。

4 参考底板

  • SOM-RK3399 Dev Kit 点击跳转到底板介绍页面

enter description here

5 快速入门

5.1 准备工作
要开启你的SOM-RK3399,请先准备好以下硬件:

  • SOM-RK3399主板
  • Type-C数据线
  • TF卡: Class10或以上的8GB microSD卡
  • USB转串口适配器(可选,用于调试或PC上进行操作)
  • 一个DC接口的外接电源,要求输出为12V/2A
  • 一台支持HDMI输入的显示器或者电视(或选购LCD配件)
  • 一套USB键盘鼠标,同时连接更多USB的设备时还需要USB HUB
  • 一台电脑,需要联网,建议使用Ubuntu 18.04 64位系统

    5.2 安装系统

5.2.1.1 i style="margin-bottom: 0.1em;">sd: 安装系统到TF卡时使用
图标文件名版本描述内核版本
Android-icon.svgrk3399-XYZ-android10-YYYYMMDD.img.zip10Android 104.4.y
Android-icon.svgrk3399-XYZ-android8-YYYYMMDD.img.zip8.1Android 8.14.4.y
Android-icon.svgrk3399-XYZ-android7-YYYYMMDD.img.zip7.1.2Android 7.1.24.4.y
Debian-icon.svgrk3399-XYZ-debian-bullseye-minimal-4.19-arm64-YYYYMMDD.img.gzbullseyeDebian11 系统固件,LXDE桌面, 不预装推荐软件包, 支持GPU/VPU硬件加速4.19.y
Debian-icon.svgrk3399-XYZ-debian-bullseye-desktop-4.19-arm64-YYYYMMDD.img.gzbullseyeDebian11 完整版固件,LXDE桌面, 预装推荐软件包, 支持GPU/VPU硬件加速4.19.y
Debian-icon.svgrk3399-XYZ-debian-bookworm-core-4.19-arm64-YYYYMMDD.img.gzbookwormDebian12 精简版固件,没有桌面, 仅命令行4.19.y
Ubuntu-icon.svgrk3399-XYZ-ubuntu-focal-desktop-4.19-arm64-YYYYMMDD.img.gzfocalUbuntu 20.04固件, LXQT桌面,支持GPU/VPU硬件加速4.19.y
Ubuntu-icon.svgrk3399-XYZ-friendlydesktop-bionic-4.4-arm64-YYYYMMDD.img.zipbionic64位FriendlyDesktop桌面固件(内置Qt 5.10.0, X-Window),基于Ubuntu Desktop 18.04构建4.4.y
Ubuntu-icon.svgrk3399-XYZ-friendlycore-focal-4.19-arm64-YYYYMMDD.img.gzfocal64位FriendlyCore系统固件 (内置Qt 5.10.0),基于Ubuntu core 20.04构建4.19.y
Ubuntu-icon.svgrk3399-XYZ-friendlycore-bionic-4.4-arm64-YYYYMMDD.img.gzbionic64位FriendlyCore系统固件 (内置Qt 5.10.0),基于Ubuntu core 18.04构建4.4.y
Ubuntu-icon.svgrk3399-XYZ-lubuntu-desktop-xenial-4.4-armhf-YYYYMMDD.img.zipxenialLubuntu桌面版固件(内置Qt 5.10.0, X-Window)4.4.y
Ubuntu-icon.svgrk3399-XYZ-ubuntu-noble-core-4.19-arm64-YYYYMMDD.img.gznoble精简版64位Ubuntu系统固件,基于Ubuntu core 24.04构建4.19.y
Openmediavault250.pngrk3399-XYZ-openmediavault-6.1-YYYYMMDD.img.gzShaitanOpenMediaVault NAS系统,基于Debian12构建6.1.y
Linux-tux.svgrk3399-XYZ-buildroot-4.19-arm64-YYYYMMDD.img.gz--Buildroot 固件,基于Rockchip Linux SDK,带Qt5-wayland图形界面4.19.y
Openwrt-icon.svgrk3399-XYZ-friendlywrt-24.10-YYYYMMDD.img.gz24.10FriendlyWrt, 基于OpenWrt 24.106.6.y
Openwrt-icon.svgrk3399-XYZ-friendlywrt-24.10-docker-YYYYMMDD.img.gz24.10预装了Docker的FriendlyWrt, 基于OpenWrt 24.106.6.y
Openwrt-icon.svgrk3399-XYZ-friendlywrt-23.05-YYYYMMDD.img.gz23.05FriendlyWrt, 基于OpenWrt 23.056.6.y
Openwrt-icon.svgrk3399-XYZ-friendlywrt-23.05-docker-YYYYMMDD.img.gz23.05预装了Docker的FriendlyWrt, 基于OpenWrt 23.056.6.y
Other Image
Openwrt-icon.svgFriendlyWrt (在线编译)24.10,23.05FriendlyWrt6.6.y
Alpinelinux.pngAlpine-Linux (在线编译)-Alpine-Linux6.6.y
Linux-tux.svgrk3399-XYZ-multiple-os-YYYYMMDD-25g.img.gz-内含了多个操作系统的eMMC烧写文件,方便测试各个OS,此固件不会开机自动烧写,需要手动选择要烧写的OS
5.2.1.2 工具软件(可选)

访问 此处的下载链接 下载所需要的工具软件 (位于网盘的"05_工具软件"目录).

文件名描述
win32diskimager.rar用于将映象文件写入SD卡
SD Card Formatter用于清空SD卡中的引导数据
RKDevTool_v3.30_for_window.zip瑞芯微的刷机工具,USB线刷系统时需要使用此工具

5.2.2 通过TF卡运行系统

操作步骤如下:

  • 准备一张8G或以上容量的TF卡;

  • 访问此处的下载地址下载需要的固件(位于”01_系统固件/01_SD卡固件”目录);

  • 下载烧写工具 win32diskimager (位于”05_工具软件”目录),或者选用你喜爱的工具;

  • 解压 .gz 格式的压缩文件得到 .img 格式的镜像文件;

  • 在Windows下以管理员身份运行 win32diskimager,在界面上选择你的SD卡盘符,选择解压后的固件文件,点击 Write 按钮烧写到SD卡;

  • 将SD卡从电脑端弹出,插入SOM-RK3399的microSD卡槽;

  • 连接SOM-RK3399的电源,系统会从TF卡启动, 某些型号可能需要按下Power键才会启动;

5.2.3 烧写系统到eMMC

5.2.3.1 方法1: 用TF启动卡进行自动烧写

此方法是通过SD卡启动一个小型的Linux系统, 借助名为EFlasher的工具来烧写固件到eMMC。

如果有连接HDMI显示器, 可通过图形界面观察烧写进度, 也可以通过板载LED灯来掌握烧写进度:

默认情况下烧写是上电自动开始的,所以要注意备份eMMC里的数据,如果不想自动,可以使用文件名含”multiple-os”字样的固件,在界面上手动选择要烧写的系统。

5.2.3.1.1 烧写官方固件到eMMC

详细操作步骤如下:

  • 准备一张8G或以上容量的SDHC卡;
  • 访问此处的下载地址下载需要的固件(位于”01_系统固件/02_SD卡刷机固件(SD-to-eMMC)”目录)和烧写工具win32diskimager(位于”05_工具软件”目录);
  • 解压 .gz 格式的压缩文件得到 .img 格式的镜像文件;
  • 在Windows下以管理员身份运行 win32diskimager,在界面上选择你的SD卡盘符,选择解压后的固件文件,点击 Write 按钮烧写到SD卡;
  • 将SD卡从电脑端弹出,插入SOM-RK3399的microSD卡槽;
  • 连接SOM-RK3399的电源,系统会从SD卡启动,并自动启动 EFlasher 烧写工具将系统安装到 eMMC;
  • 烧写完成后,从SOM-RK3399弹出SD卡,SOM-RK3399会自动重启并从eMMC启动你刚刚烧写的系统;
5.2.3.1.2 烧写第三方固件(镜像文件)到eMMC
  1. 从网盘上下载文件名带 eflasher 字样的任意固件(位于”01_系统固件/02_SD卡刷机固件(SD-to-eMMC)”目录), 解压后烧进TF卡;
  2. 重新拨插一次TF卡, PC上会出现一个名为FriendlyARM的盘符(Linux下是FriendlyARM目录), 将 .raw 或者 .gz 结尾的固件复制进去 (注:如果你的文件为 .img 格式那么请改名为 .raw 格式);
  3. 编辑TF卡上的 eflasher.conf 配置文件, 修改 autoStart= 后面的值指定为你的固件文件名, 例如:
1
autoStart=openwrt-rockchip-armv8_nanopi-ext4-sysupgrade.img.gz

除了第三方固件,亦支持文件名带 “-sd-“ 字样的官方固件文件, 例如: rk3NNN-sd-friendlywrt-24.10-YYYYMMDD.img.gz
4) 安全弹出TF卡, 将TF卡放在SOM-RK3399上上电启动, 会自动烧写你的固件, 通过板载 LED 灯来了解安装进度;

5.2.3.2 方法2: 在网页上烧写

使用烧写了FriendlyWrt固件的TF卡启动SOM-RK3399, 登录FriendlyWrt页面, 在网页菜单上点击 “系统” -> “eMMC刷机助手” 进入eMMC刷机助手界面, 点击界面上的 “选择文件” 按钮, 选择你要刷写的文件 (官方固件选用文件名有”-sd-“的文件), 亦可选择第三方固件, 文件支持 .gz 格式的压缩文件, 或者以 .img 作为扩展名的raw格式。

选择文件后, 点击 “上传并烧写” 按钮, 开始上传并烧写, 如下图所示:
enter description here
烧写完成后,请弹出SD卡,设备会自动重启, 并从eMMC引导新系统,可留意指示灯的状态, 在系统状态灯闪烁,同时网卡状态灯亮起时,表示系统启动完成, 如果eMMC安装的系统是 FriendlyWrt, 则可以通过点击“进入首页”进入FriendlyWrt管理页面。
官方固件需要选用文件名带 “-sd-“ 字样的镜像文件, 例如: rk3NNN-sd-friendlywrt-24.10-YYYYMMDD.img.gz, 压缩文件只支持gz格式, 如果文件太大, 可以先压缩成gz格式再上传。

5.2.3.3 方法3: 通过USB烧写
5.2.3.3.1 USB烧写步骤1: 安装USB驱动和工具

从网盘的tools目录下载瑞芯微的USB驱动: DriverAssitant_v5.12.zip, 解压后安装;
在相同目录下, 下载瑞芯微开发工具: RKDevTool_v3.30_for_window.zip, 解压后备用;

5.2.3.3.2 USB烧写步骤2: 将SOM-RK3399与电脑连接, 并进入刷机模式

按住Recover Key按键不放, 用USB C数据线, 将SOM-RK3399与电脑进行连接, 连接到SOM-RK3399的USB C接口, 保持按住Recover Key键, 状态灯亮起3秒后即可松开;

5.2.3.3.3 USB烧写步骤3: 开始烧写

固件格式一般有两种格式, 一种是单个的image文件, 通常第三方固件会使用这种打包方式, 另一种是多个分区镜像, FriendlyELEC的固件采用这种方式, 下面分别对这两种格式的固件进行说明:

  • 选项1: 烧写打包成单个image文件的固件
    在电脑上双击 RKDevTool_v3.30_for_window 目录下的 RKDevTool.exe 启动瑞芯微开发工具, 与电脑连接正常的情况下, 瑞芯微开发工具界面上会显示 “发现一个Maskrom设备”;
    在瑞芯微开发工具界面上, 点击 “升级固件”, 再点击 “固件” 按钮, 选择你要烧写的image文件, 点击 “升级” 然后等待烧写完成即可, 完成后设备会自动重启, 并从eMMC启动你刚刚安装的系统;
  • 选项2: 烧写由多个分区镜像组成的固件
    根据需要到网盘上下载对应的压缩包(位于”01_系统固件/03_USB线刷固件(USB-to-eMMC)”目录), 在电脑上解压: 解压后, 可以看到固件目录下已内置了瑞芯微开发工具和预设好的配置文件, 双击 RKDevTool.exe 启动瑞芯微开发工具, 界面上会显示 “发现一个Maskrom设备”, 点击界面上的“执行”按钮, 稍等片刻即可完成烧写, 完成后设备会自动重启, 并从eMMC启动你安装的系统;

5.2.4 安装系统到M.2或USB硬盘

可以通过使用TF卡启动eFlasher系统,将引导和系统分别安装到不同存储设备,但是由于CPU不支持直接从M.2和USB设备引导,所以虽然系统可以安装到M.2和USB设备,但是引导仍然需要安装到eMMC或者TF卡。
操作步骤如下:

  • 准备一张32G或以上容量的TF卡;
  • 访问此处的下载地址下载文件名为XXXX-eflasher-multiple-os-YYYYMMDD-30g.img.gz的固件(位于”01_系统固件/02_SD卡刷机固件(SD-to-eMMC)”目录);
  • 将固件写入TF卡,在SOM-RK3399上连接好存储设备,插入TF卡上电开机,接下来要在界面上操作,如果没有显示设备,可以使用VNC代替,请参考使用VNC操作eFlasher;
  • 在eFlasher界面上,首先选择要安装的OS,然后选择引导安装的目的地 (通常选eMMC),以及选择系统安装的目的地(可以选eMMC,M.2硬盘,USB存储设备等),如下图所示:
    enter description here
  • 没有eMMC时可使用TF卡作为引导,方法是将另一个TF卡通过USB读卡器插入USB端口,然后选择USB设备作为引导安装目的地,从而实现从TF卡引导,但系统存放在M.2或USB硬盘的目的;
  • 烧写完成后,从SOM-RK3399弹出SD卡,引导在eMMC的情况下,SOM-RK3399会自动重启至你刚刚烧写的系统,如果引导安装在TF卡,则需要拨掉电源,插入TF引导卡再上电开机;
  • 更详细的安装指南请参考此处;

5.3 串口调试

如果你想查看SOM-RK3399启动时更多详细的信息,或者更直接的对其进行控制,建议连接并使用调试串口。

  • 使用准备好的USB转串口适配器和连接线(需另购),连接开发板:
Pin# 开发板调试串口 USB转串口适配器
1 GND GND
2 VCC5V0_SYS NC (不需要连接)
注: Matrix USB2UART适配器,请将5V ON/OFF切换到OFF
3 UART2DBG_TX RX
4 UART2DBG_RX TX
  • 将USB转串口适配器连接到PC Linux,通常会识别为ttyUSB0,或使用以下命令来确定设备名字:
 dmesg | grep ttyUSB
 ls -l /dev/ttyUSB*
  • 在PC Linux安装minicom,运行minicom,配置串口设备和参数(1500000 Bps, 8N1, 流控无)
 sudo apt-get install minicom
 minicom -s

注意: RK3399调试串口的波特率缺省是1500000,有些适配器可能达不到此速率,还有可能因USB延长线或连接到USB hub出现异常(如乱码),需检查并更换。

6 Debian11 桌面系统的使用

6.1 Debian11桌面系统简介

Debian11 Desktop 是一个轻量级的Debian桌面环境,具有如下特点:

  • 桌面环境采用 LXDE, 多种主题可选, 简洁美观, 占用资源少;

  • 提供基于 Mali GPU 的 OpenGL 支持;

  • 支持Rockhip MPP视频硬编和硬解码;

  • 预装基于mpv的Kodi, SMPlayer播放器, 均支持4K视频硬解码;

  • 预装Chromium浏览器, 支持vpu/gpu硬件加速 (视频硬解限h264/mp4格式);

  • 支持安装Plex Server, Docker与wps等应用, 玩法丰富;

enter description here

6.2 帐户与密码

普通用户:
    用户名: pi
    密码: pi

Root用户:
    默认没有设置root密码,可通过sudo passwd root命令配置root密码

6.3 查看IP地址

由于Debian主机名默认为硬件型号, 所以可以使用ping命令来获得IP地址: ping SOM-RK3399

6.4 通过ssh登录Debian

使用以下命令:ssh pi@SOM-RK3399
默认密码为pi

6.5 更新软件包

6.5.1 更换软件源为国内镜像源

sudo sed -i -e 's/deb.debian.org/mirrors.cloud.tencent.com/g' /etc/apt/sources.list
sudo sed -i -e 's/security.debian.org/mirrors.cloud.tencent.com/g' /etc/apt/sources.list
sudo apt update

6.6 安装x11vnc远程桌面

x11vnc是一个VNC服务器, 安装后我们可以不依赖外部的显示设备, 通过网络远程登录Debian桌面。

6.6.1 安装x11vnc

sudo apt-get install x11vnc

6.6.2 设置VNC登录密码

sudo x11vnc -storepasswd /etc/x11vnc.pwd

6.6.3 设置x11vnc在开机时自动启动

新建如下文件:

sudo vi /lib/systemd/system/x11vnc.service

内容如下:

[Unit]
Description=Start x11vnc at startup.
Requires=display-manager.service
After=syslog.target network-online.target
Wants=syslog.target network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -display :0 -forever -loop -noxdamage -repeat -rfbauth /etc/x11vnc.pwd -rfbport 5900 -shared -capslock -nomodtweak
ExecStop=/usr/bin/x11vnc -R stop
Restart=on-failure

[Install]
WantedBy=multi-user.target

设置systemd服务:

sudo systemctl daemon-reload
sudo systemctl enable x11vnc.service
sudo systemctl start x11vnc

6.6.4 测试远程桌面

在电脑上启动VNC客户端软件, 在地址栏输入: IP地址:5900 连接即可, 效果如下图所示, 图中设备IP地址为192.168.1.123, 使用端口5900进行连接:
enter description here

6.7 安装内核头文件

sudo dpkg -i /opt/archives/linux-headers-*.deb

测试编译内核模块:

sudo apt update
sudo apt install git gcc make bc
git clone https://github.com/RinCat/RTL88x2BU-Linux-Driver.git
cd RTL88x2BU-Linux-Driver
make -j$(nproc)
sudo make install
sudo modprobe 88x2bu

6.8 更改时区

6.8.1 检查当前时区

timedatectl

6.8.2 列出所有时区

timedatectl list-timezones

6.8.3 设置时区 (比如上海)

sudo timedatectl set-timezone Asia/Shanghai

6.9 更换开机LOGO和桌面墙纸

替换内核下面的两个文件,重新编译内核:
kernel/logo.bmp
kernel/logo_kernel.bmp
或者使用脚本来操作,如下所示:

  • 下载脚本
git clone https://github.com/friendlyarm/sd-fuse_rk3399.git -b kernel-4.19 --single-branch
cd sd-fuse_rk3399
  • 编译内核并重新打包固件
convert files/logo.jpg -type truecolor /tmp/logo.bmp
convert files/logo.jpg -type truecolor /tmp/logo_kernel.bmp
sudo LOGO=/tmp/logo.bmp KERNEL_LOGO=/tmp/logo_kernel.bmp ./build-kernel.sh debian-bullseye-desktop-arm64
sudo ./mk-sd-image.sh debian-bullseye-desktop-arm64
sudo ./mk-emmc-image.sh debian-bullseye-desktop-arm64

注: 如果你的系统不是debian-bullseye-desktop-arm64,请根据实际情况指定

6.9.2 更换桌面墙纸

修改如下配置文件:

/home/pi/.config/pcmanfm/LXDE/desktop-items-0.conf

6.9.3 恢复出厂设置

在终端上执行如下命令:

sudo firstboot && sudo reboot

6.10 开机自动启动程序(例如Kodi)

把要开机启动的程序的desktop文件放入~/.config/autostart/目录即可,例如:

mkdir ~/.config/autostart/
cp /usr/share/applications/kodi.desktop ~/.config/autostart/

6.11 取消USB存储设备自动挂载

sudo systemctl mask udisks2
sudo reboot

6.12 设置中文语言与输入法

6.12.1 设置中文语言

输入以下命令,用空格选中 ‘zh_CN.UTF-8’

sudo dpkg-reconfigure locales

添加环境变量到 .bashrc:

echo "export LC_ALL=zh_CN.UTF-8" >> ~/.bashrc
echo "export LANG=zh_CN.UTF-8" >> ~/.bashrc
echo "export LANGUAGE=zh_CN.UTF-8" >> ~/.bashrc

重启确认一下设置是否生效:

sudo reboot

6.12.2 安装中文输入法

输入如下命令安装fcitx和拼音输入法:

sudo apt update
sudo apt-get install fcitx fcitx-pinyin
sudo apt-get install im-config
sudo apt-get install fcitx-table*
sudo apt-get install fcitx-ui-classic fcitx-ui-light
sudo apt-get install fcitx-frontend-gtk2 fcitx-frontend-gtk3 fcitx-frontend-qt4
sudo apt-get remove --purge scim* ibus*
sudo reboot

重启后, 按Ctrl+Space即可切换中英文输入法, 右上角也出现了输入法图标, 右击右上角的输入法图标, 在弹出菜单中可以切换输入法, 如下图所示:
enter description here

6.13 安装Plex多媒体服务器

访问 Plex官网的如下地址: https://www.plex.tv/media-server-downloads/
在下载页面上, 选择 ”Plex Media Server” 分类, 平台选择 ”Linux“, 版本选择 “Ubuntu(16.04+)/Debian(8+) - ARMv8”,
下载得到deb包后, 使用 dpkg 命令安装软件包即可:

sudo dpkg -i plexmediaserver_1.31.0.6654-02189b09f_arm64.deb

安装完成后, 在电脑浏览器上输入以下地址登录Plex服务器后台: http://IP地址:32400/web/

6.14 在Debian系统上安装Docker

请参考此链接: How to Install Docker on Debian/zh

1 本文适应范围

  • 支持的平台: RK3328/RK3399/RK3568/RK3588

  • 支持的目标板操作系统: Debian 11, Debian 12

2 安装前的检查和准备

Docker现在推荐使用的存储驱动是Overlay2, 而由于根文件系统已经使用了OverlayFS, 所以可能无法直接安装,需要对分区作些调整,有如下几种方法, 下面将分别介绍, 请根据需要选择其中一种:

方法1
让根文件系统不再使用OverlayFS, 最省事,但由于”恢复出厂设置”这个功能需要依赖OverlayFS,所以此功能将无法工作;
方法2
创建一个额外的分区用来挂载/var/lib/docker目录, 需要预先规划好分区大小;
方法3
将/var/lib/docker目录挂载到例如U盘和M.2 SSD这样的外置存储设备上,存储设备需要格式化为ext4格式, 本文主要讨论上面两种;

注意事项:

  • 此操作会擦除用户数据,需要预先备份好数据

  • 需要将固件更新至2023/03/14或之后的版本,或者单独更新boot.img

  • 命令中出现的/dev/mmcblkX设备节点是虚构的节点,需要改成真实的设备,eMMC的设备节点是/dev/mmcblk2,TF卡的设备节点是/dev/mmcblk0

3 方法1: 让根文件系统不使用OverlayFS

  • 写特定内容到 /.init_wipedata 后重启
sudo passwd root  # 为root用户创建密码,如果之前没有做
su - root -c 'echo "overlayfs=disable" > /.init_wipedata'
sudo reboot
  • 重启后,使用parted命令查看当前的分区布局,正常情况下,可以看到根系统是以ext4格式挂载的,而不是之前的overlay:
sudo apt update
sudo apt install parted
export DEV=/dev/mmcblkX # 需要改成真实的设备
sudo parted -s ${DEV} unit MiB print

4 方法2: 创建一个额外的分区用于docker

  • 查看当前的分区布局
sudo apt update
sudo apt install parted fdisk
export DEV=/dev/mmcblkX # 需要改成真实的设备
sudo parted -s ${DEV} unit MiB print
  • 调整userdata分区的大小

这里以调整为8G大小为例:

sudo passwd root  # 为root用户创建密码,如果之前没有做
su - root -c 'echo "overlayfs=enable userdata=8096" > /.init_wipedata'
sudo reboot

重启后, 正常情况下,可以看到userdata分区已调整为8GB:

export DEV=/dev/mmcblkX  # 需要改成真实的设备
sudo parted -s ${DEV} unit MiB print
  • 创建新分区并格式化
(echo n; echo ""; echo ""; echo ""; echo w) | sudo fdisk ${DEV}
NUM=$(sudo parted ${DEV} print | awk 'NF > 1 {p = $1} END {print p}')  # 获取最后一个分区的序号
sudo mkfs.ext4 ${DEV}p${NUM}
  • 挂载新分区到docker数据目录
sudo mkdir /var/lib/docker
sudo blkid ${DEV}p${NUM}
# 记下UUID
# 配置开机自动挂载新创建的分区
sudo vi /etc/fstab
# 在文件末尾加入如下内容(其中UUID需替换为真实的)
UUID=bbb06fe1-df52-4c7c-b2eb-926b14605fe4 /var/lib/docker ext4 suid,dev,exec,auto,nouser,async,noatime,nofail 0 0
# 输入以下命令挂载分区
sudo mount /var/lib/docker

5 安装docker

  • 因Docker安装程序需要使用iptables, 而Debian默认使用的是nftables, 因此安装前先设置Debian使用传统的iptables:
[ -f /usr/sbin/iptables-legacy ] && sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
[ -f /usr/sbin/ip6tables-legacy ] && sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
  • 开始安装Docker:
sudo apt install lsb-release wget
codename=$(lsb_release -c | awk '{print $2}')
version=$(lsb_release -sr | cut -d'.' -f1)
wget https://download.docker.com/linux/debian/dists/${codename}/pool/stable/arm64/containerd.io_1.7.25-1_arm64.deb
wget https://download.docker.com/linux/debian/dists/${codename}/pool/stable/arm64/docker-ce-cli_28.0.1-1~debian.${version}~${codename}_arm64.deb
wget https://download.docker.com/linux/debian/dists/${codename}/pool/stable/arm64/docker-buildx-plugin_0.21.1-1~debian.${version}~${codename}_arm64.deb
wget https://download.docker.com/linux/debian/dists/${codename}/pool/stable/arm64/docker-ce_28.0.1-1~debian.${version}~${codename}_arm64.deb
wget https://download.docker.com/linux/debian/dists/${codename}/pool/stable/arm64/docker-compose-plugin_2.33.1-1~debian.${version}~${codename}_arm64.deb
sudo apt install ./containerd.io_1.7.25-1_arm64.deb \
  ./docker-ce_28.0.1-1~debian.${version}~${codename}_arm64.deb \
  ./docker-ce-cli_28.0.1-1~debian.${version}~${codename}_arm64.deb \
  ./docker-buildx-plugin_0.21.1-1~debian.${version}~${codename}_arm64.deb \
  ./docker-compose-plugin_2.33.1-1~debian.${version}~${codename}_arm64.deb
  • 验证是否安装成功:
sudo docker info
  • 看看Docker是否使用了overlay2存储驱动:
$ sudo docker info | grep storage -i
 Storage Driver: overlay2

6 配置非root用户使用docker

sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo systemctl restart docker
sudo chmod a+rw /var/run/docker.sock

验证是否成功:

docker images

7 测试运行docker映像: 安装nextcloud网盘

mkdir ~/nextcloud -p
docker run -d -p 8888:80  --name nextcloud  -v ~/nextcloud/:/var/www/html/ --restart=always --privileged=true  arm64v8/nextcloud

安装完成后, 在电脑浏览器上访问: http://设备IP地址:8888, 即可查看nextcloud网盘页面。

8 参考资料

https://docs.docker.com/engine/install/debian/#install-from-a-package

6.15 如何测试NPU

请参考此链接: NPU/zh

6.16 如何测试VPU

请参考此链接: VPU/zh

6.17 设置WiFi无线链接

6.17.1 图形界面操作

点击右上角的网络图标,选择你要连接的WiFi热点,按界面提示操作即可。

6.17.2 命令行操作

请参考 Use NetworkManager to configure network settings/zh

6.18 取消自动登录

编辑文件:

sudo vim /etc/lightdm/lightdm.conf

注释掉如下两行内容 (在前面插入#):

autologin-user=pi
autologin-user-timeout=0

6.19 测试OpenGL ES性能

在系统菜单 System Tools 中点击 Terminator 打开命令行终端,输入以下命令即可测试:

glmark2-es2

6.20 设置HDMI/DP屏幕分辨率

进入系统菜单 Perferences -> Monitor Settings界面进行设置即可。
推荐分辨率:1920x1080@60Hz

6.21 调节HDMI边界

打开命令行终端,输入命令进行操作,有几个注意事项:

  1. 需要登录桌面才能操作,如果Desktop停留在Login是无法设置的;
  2. 如果你是在 ssh 登录的终端,请使用与桌面登录相同的用户名,默认是 pi,不能使用root用户,同时,你需要赋值 DISPLAY 变量:
export DISPLAY=:0.0

6.21.1 查询显示器支持哪些分辨率

xrandr -q

输出示例:

Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 8192 x 8192
eDP-1 disconnected primary (normal left inverted right x axis y axis)
HDMI-1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   1920x1080     60.00*+  50.00  
   1280x720      60.00    50.00  
   720x576       50.00  
   720x480       59.94

6.21.2 设置分辨率

例如设置为 1920X1080@60Hz:

xrandr --output HDMI-1 --mode 1920x1080 --refresh 60

6.21.3 设节HDMI输出边界

For example, the transformation scaling horizontal coordinates by 0.8, vertical coordinates by 1.04 and moving the screen by 35 pixels right and 19 pixels down:

xrandr --output HDMI-1 --transform 0.80,0,-35,0,1.04,-19,0,0,1

6.21.4 开机自动调整

编辑~/.config/autostart/lxrandr-autostart.desktop,将完整的xrandr命令写入到Exec=开头的键中,如下所示:

[Desktop Entry]
Type=Application
Name=LXRandR autostart
Comment=Start xrandr with settings done in LXRandR
Exec=sh -c 'xrandr --output HDMI-1 --mode 1920x1080 --refresh 50 --transform 1.04,0,-35,0,1.05,-30,0,0,1'
OnlyShowIn=LXDE

6.22 Chromium网页浏览器

6.22.1 GPU支持情况

系统预装的Chromium网页浏览器已经默认启用硬件加速,支持WebGL,可以通过输入网址 chrome://gpu 了解硬件加速情况,如下图所示:
enter description here

6.22.2 VPU支持情况

在浏览器上播放一个视频,然后在命令行使用fuser查看mpp设备节点的使用情况来确认已经调用了vpu:

pi@FriendlyElec:~$ fuser /dev/mpp_service
/dev/mpp_service:     3258

如果fuser命令没有内容输出, 则表示当前是软解.

6.22.3 查看支持的硬解格式

在浏览器地址栏输入 about://gpu,翻页到页面最底部,查看 “Video Acceleration Information” 表格;
播放一个视频后,再在浏览器地址栏输入 about://media-internals, 可以查看最近播放的视频是否启用了硬解;

6.23 测试mpp视频硬件编码

mpi_enc_test -w 1920 -h 1080 -t 7 -f 0 -o test.h264 -n 300
export XDG_RUNTIME_DIR=/run/user/0
ffplay test.h264

7 Debian10 桌面系统的使用

  • Refer to:
    • Debian Buster

8 FriendlyDesktop系统的使用

enter description here

FriendlyDesktop 是一个轻量级的Ubuntu桌面环境,其底层基于LXDE桌面构建,具有如下特点:
    最新版本 - 基于Ubuntu 18.04 64位系统构建。
    易于开发 - 兼容FriendlyCore的特性,集成经过优化的Qt5.10, QtCreator和Arduino IDE。
    轻巧 - 只需要很少的CPU资源即可执行顺畅,而且当内存容量充足时表现特别出色。
    省能源 - 它比其他常见的系统需要较少的资源运行相同的工作。
    简朴美 - 借由GTK+ 2,它拥有美观、支持国际化的用户界面。
    使用简单 - 提供用户如微软Windows般的应用程序列表。
    可自定义性 - 用户可以轻易自定义LXDE的外观。
    兼容标准 - 兼容于freedesktop.org标准。
用于友善电子RK3399平台的FriendlyDesktop已经最佳化了对Mali GPU和VPU的支持,系统中已集成X.org驱动,支持Hardware Cursor、OpenGL图形加速等,支持4K硬解视频播放。

8.1 帐户与密码

普通用户:

   用户名: pi
   密码: pi

Root用户:

   用户名: root
   密码: fa

8.2 设置WiFi无线链接

点击FriendlyDesktop右上角的网络图标,选择你要连接的WiFi热点,按界面提示操作即可。

8.3 设置HDMI/DP屏幕分辨率

进入系统菜单 Perferences -> Monitor Settings界面进行设置即可。
推荐分辨率:1920x1080@60Hz

8.4 调节HDMI边界

打开命令行终端,输入命令进行操作,有几个注意事项:

  1. 需要登录桌面才能操作,如果Desktop停留在Login是无法设置的;
  2. 如果你是在 ssh 登录的终端,请使用与桌面登录相同的用户名,默认是 pi,不能使用root用户,同时,你需要赋值 DISPLAY 变量:
export DISPLAY=:0.0

8.4.1 查询显示器支持哪些分辨率

xrandr -q

输出示例:

Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 8192 x 8192
eDP-1 disconnected primary (normal left inverted right x axis y axis)
HDMI-1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   1920x1080     60.00*+  50.00  
   1280x720      60.00    50.00  
   720x576       50.00  
   720x480       59.94

8.4.2 设置分辨率

例如设置为 1920X1080@60Hz:

xrandr --output HDMI-1 --mode 1920x1080 --refresh 60

8.4.3 设节HDMI输出边界

For example, the transformation scaling horizontal coordinates by 0.8, vertical coordinates by 1.04 and moving the screen by 35 pixels right and 19 pixels down:

xrandr --output HDMI-1 --transform 0.80,0,-35,0,1.04,-19,0,0,1

8.4.4 开机自动调整

编辑~/.config/autostart/lxrandr-autostart.desktop,将完整的xrandr命令写入到Exec=开头的键中,如下所示:

[Desktop Entry]
Type=Application
Name=LXRandR autostart
Comment=Start xrandr with settings done in LXRandR
Exec=sh -c 'xrandr --output HDMI-1 --mode 1920x1080 --refresh 50 --transform 1.04,0,-35,0,1.05,-30,0,0,1'
OnlyShowIn=LXDE

8.5 设置eDP显示屏旋转

如果要旋转eDP屏的显示,可使用命令xrotate.sh 来旋转90/180/270度。 以root用户运行以下命令,即可顺时钟旋转90度,命令执行过程中,会重启lightdm服务让设置立即生效:

sudo xrotate.sh -m CW -r

其他旋转角度,可以通过运行 xrotate -h 命令获得详细的参数说明。
另外,该命令暂不支持HDMI显示的旋转,用户参考X11的文档,自行编辑 /etc/X11/xorg.conf 配置文件。

注意:硬解视频时,视频窗口并不会跟随屏幕旋转。

8.6 测试OpenGL ES性能

在系统菜单 System Tools 中点击 Terminator 打开命令行终端,输入以下命令即可测试:

taskset -c 4-5 glmark2-es2

enter description here
enter description here

8.7 如何播放4K视频

8.7.1 使用Qt硬解播放器播放

FriendlyDesktop预装了Qt播放器Qt5-VideoPlayer,该播放器已经适配Rockchip的gstreamer插件,支持4K视频的硬解播放, 播放器启动方法: 在FriendlyDesktop上打开菜单 Sound & Video,点击 Qt5-VideoPlayer。

在播放器界面上,点击左下角的 Open 按钮加载一个视频文件到右边的播放列表,双击播放列表上的文件开始播放。播放器的界面如下所示,可以设置全屏播放,也可以调节音量:
enter description here

Qt播放器源代码: https://github.com/friendlyarm/rk-player-qt

8.7.2 命令行播放

打开命令行终端,输入以下命令即可测试:

gst-player.sh

默认音频会输出到耳机孔, 可以使用 which gst-player.sh 找到这个脚本的位置,自已定制其播放的行为。

8.8 如何使用USB摄像头

将USB摄像头(比如罗技C270/C920)插入开发板,双FriendlyDesktop桌面上的USB Camera会弹出luvcview预览界面 (需要使用2019/05/11版本以上的FriendlyDesktop),在界面上点击中间的录像按钮可以录像.
luvcview 是一个开源软件,你可以自行编译:

git clone https://github.com/ksv1986/luvcview
cd luvcview
make

查看luvcview的用法:

./luvcview -h

参数说明:

luvcview version 0.2.1
usage: uvcview [-h -d -g -f -s -i -c -o -C -S -L -l -r]
-h    print this message
-d    /dev/videoX       use videoX device
-g    use read method for grab instead mmap
-w    disable SDL hardware accel.
-f    video format  default jpg  others options are yuv jpg
-i    fps           use specified frame interval
-s    widthxheight      use specified input size
-c    enable raw frame capturing for the first frame
-C    enable raw frame stream capturing from the start
-S    enable raw stream capturing from the start
-o    avifile  create avifile, default video.avi
-L    query valid video formats
-l    query valid controls and settings
-r    read and set control settings from luvcview.cfg

以640x360@30fps的格式预览USB摄像头图像可以使用以下命令:

./luvcview -d /dev/video8 -i 30 -s 640x360

从luvcview的输出信息可以看到,硬件加速已经开启:

pi@NanoPC-T4:/etc/xrdp$ luvcview -d /dev/video8 -i 30 -s 640x360
luvcview version 0.2.1
 interval: 30 fps
Hardware acceleration available
video /dev/video8

8.9 如何通过蓝牙传输文件

在FriendlyDesktop上打开菜单 Preferences,启动 Bluetooth Manager,在界面上点 Search 即可搜索周边的蓝牙设备, 点击你的设备进行配对,配对后即可发送文件,如下图所示:
enter description here

8.10 安装使用OpenCV

OpenCV has been pre-installed in FriendlyCore/FriendlyDesktop (Version after 201905) and does not require manual installation.
Please refre this link: https://github.com/friendlyarm/install-opencv-on-friendlycore/blob/rk3399/README.md

8.11 开发Qt程序

FriendlyDesktop下提供了重新编译的 Qt 5.10.0,支持RK3399的OpenGL ES和Gstreamer 1.0的硬件加速,同时集成了 QtCreator IDE,已配置好可以直接在开发板上编译并运行程序,如下所示:
enter description here

运行Qt程序时,需要指定platform参数为xcb,如下所示:

./HelloQt --platform xcb

8.12 访问GPIO/I2C/串口等硬件资源

请参考下面的文档:

  • WiringPi for RK3399
  • WiringPi-Python for RK3399

8.13 切换音频默认输出设备

8.13.1 查看当前默认的输出设备

在普通用户的终端上,输入以下命令:

pactl info -vvv

显示的信息包含以下内容,表示当前音频输出到耳机:

Default Sink: alsa_output.platform-rt5651-sound.stereo-fallback

显示的信息包含以下内容,表示当前音频输出到HDMI:

Default Sink: alsa_output.platform-hdmi-sound.stereo-fallback

8.13.2 设置默认的音频输出设备为耳机口

在普通用户的终端上,输入以下命令:

pactl set-default-sink  alsa_output.platform-rt5651-sound.stereo-fallback

设置耳机口输出的默认音量为20%:

pactl -- set-sink-volume alsa_output.platform-rt5651-sound.stereo-fallback 20%

8.13.3 设置默认的音频输出设备为HDMI

在普通用户的终端上,输入以下命令:

pactl set-default-sink  alsa_output.platform-hdmi-sound.stereo-fallback

8.13.4 查看设置是否已生效

cat /var/lib/pulse/*-default-sink

8.13.5 播放时临时切换

这种方法仅对当前的播放进程有效:
打开菜单 “Sound & Video” -> “PulseAudio Volume Control”, 在界面上点击 “Built-in Audio Stereo” 按钮切换不同的输出设备,比如在HDMI与耳机接口之间切换。

8.14 播放网络流媒体(或网络摄像头)

打开命令行终端,输入以下命令:

gst-launch-1.0 rtspsrc location="rtsp://admin:12345@192.168.1.120:554/live/main" ! rtph264depay ! decodebin ! rkximagesink

请将 rtsp:// 后面的地址改成真实的地址。

8.15 Chromium网页浏览器

系统预装的Chromium网页浏览器已经默认启用硬件加速,支持WebGL,可以通过输入网址 chrome://gpu 了解硬件加速情况,如下图所示:
enter description here

8.16 屏幕保护与自动休眠相关设置

屏幕保护与自动休眠的配置文件是 /etc/xdg/autostart/xset_command.desktop,默认出厂的设置是屏幕保护和DPMS都是关闭的,你可以通过修改这个文件来更改配置,具体可以了解一下Linux下 xset 命令的用法。

8.17 安装Scratch

用以下命令安装:

sudo apt-get install scratch:arm64

8.18 安装Arduino IDE

用以下命令安装:

sudo apt-get install arduino:arm64

8.19 开机自动启动程序

把要开机启动的程序的desktop文件放入~/.config/autostart/目录即可,例如:

cp /usr/share/applications/org.qt-project.qtcreator.desktop ~/.config/autostart/

8.20 用root用户登录桌面

编辑 /root/.profile文件:

sudo vim /root/.profile

替换成如下内容:

if [ -n "$BASH_VERSION" ]; then
    if [ -f "$HOME/.bashrc" ]; then
	. "$HOME/.bashrc"
    fi
fi
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

执行以下命令修改lightdm的配置文件,将自动登录的用户名改成 root:

sudo sed -i 's/autologin-user=pi/autologin-user=root/g' /usr/share/lightdm/lightdm.conf.d/20-defaultsession.conf

执行reboot命令重启:

sudo reboot

如果希望登录后,桌面图标与配置等都与pi用户一样,可以从/home/pi目录复制相关的目录过来:

sudo rm -rf /root/Desktop /root/Pictures /root/.config
sudo cp -af /home/pi/Desktop /home/pi/Pictures /home/pi/.config /root/
sudo chown root:root /root/Desktop /root/Pictures /root/.config

8.21 FriendlyDesktop下使用NVME SSD

请参考: How to Initialize and Format New SSD And HDD

9 FriendlyCore的使用

9.1 介绍

FriendlyCore,是一个没有预装X Desktop,基于Ubuntu core构建的系统 (版本: 18.04)。

FriendlyCore的定位是为企业客户提供可直接用于产品的基础OS,Core的含义是指”核心”与”可量产”,FriendlyCore与Ubuntu base最小系统的定位不同,FriendlyCore并不只是提供命令行界面,它提供了两种形式的图形界面:
1)针对RK3399优化的Qt 5.10.0,支持GPU和VPU加速,提供QtQuick/QtWebEngine/QtMultimedia/WebGL等Qt模块以及KMS、EGLFS和XCB三种显示插件;
2) 集成Xorg最小系统,可以以最轻量的方式运行X11应用,X11服务器同样支持硬件加速;

FriendlyCore在 RK3399 平台下的其他特性还包括:

  • 支持7寸电容屏HD702,与HDMI同时连接时,可实现双屏异显,或者同步显示
  • 支持 Gstreamer 1.0 多媒体框架
  • 支持命令行和Qt硬解播放器
  • 支持Qt5 WebGL,可以在其他设备上用浏览器上显示Qt界面
  • 支持Qt5 VNC,可以将Qt应用作为VNC Server的形式运行,轻松实现远程控制
  • 支持蓝牙,已预装bluez等相关软件包

9.2 运行FriendlyCore

  • 对于有HDMI接口的板子,如果要在电视上进行操作,您需要连接USB鼠标和键盘。
  • 如果您需要进行内核开发,最好选购一个串口配件,连接了串口,则可以通过串口终端对开发板进行操作。

SOM-RK3399需要使用USB转串口模块,连接方法如下图所示:
enter description here

  • FriendlyCore默认帐户:

普通用户:

   用户名: pi
   密码: pi

Root用户:

   用户名: root
   密码: fa

默认会以 pi 用户自动登录,你可以使用 sudo npi-config 命令取消自动登录。

  • 更新软件包:
$ sudo apt-get update

9.3 开发Qt应用

请参考 How to Build and Install Qt Application for FriendlyELEC Boards/zh

9.4 开机自动运行Qt示例程序

使用npi-config工具进行开启:

sudo npi-config

进入Boot Options -> Autologin -> Qt/Embedded,选择Enable然后重启即可。

9.5 扩展TF卡文件系统

第一次启动FriendlyCore系统时,系统会自动扩展文件系统分区,请耐心等待,TF卡/eMMC的容量越大,需要等待的时间越长,进入系统后执行下列命令查看文件系统分区大小:

df -h

9.6 使用蓝牙传输文件

以传输文件到手机为例进行说明,首先,将你的手机蓝牙设置为可侦测状态,然后执行以下命令开始蓝牙搜索:

hcitool scan

搜索到设备时,结果举例如下:

Scanning ...
    2C:8A:72:1D:46:02   HTC6525LVW

这表示搜索到一台名为HTC6525LVW的手机,我们记下手机名称前面的MAC地址,然后用sdptool命令查看该手机支持的蓝牙服务:

sdptool browser 2C:8A:72:1D:46:02

注:上述命令中的MAC地址请替换成手机实际的蓝牙MAC地址
这个命令会详细列出手机蓝牙所支持的协议,我们需要关心的是一个名为 OBEX Object Push 的文件传输服务,以HTC6525LVW手机为例,其显示结果如下所示:

Service Name: OBEX Object Push
Service RecHandle: 0x1000b
Service Class ID List:
  "OBEX Object Push" (0x1105)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 12
  "OBEX" (0x0008)
Profile Descriptor List:
  "OBEX Object Push" (0x1105)
    Version: 0x0100

从上面的信息可以看到,这个手机的OBEX Object Push服务的所用的频道是12, 我们需要将它传递给obexftp命令,最后发起文件传输请求的命令如下:

obexftp --nopath --noconn --uuid none --bluetooth -b 2C:8A:72:1D:46:02 -B 12 -put example.jpg

注:上述命令中的MAC地址、频道和文件名请替换成实际的

执行上述命令后,请留意手机屏幕,正常情况下手机会弹出配对和接收文件的提示,确定后就开始文件传輪了。

蓝牙常见问题:

  1. 开发板上找不到蓝牙设备, 可尝试用以下命令开启蓝牙:
rfkill unblock 0
  1. 提示找不到相关命令,可尝试用以下命令安装相关软件:
apt-get install bluetooth bluez obexftp openobex-apps python-gobject ussp-push

9.7 连接WiFi

无论是SD WiFi还是USB WiFi, 它们的连接方式都是一样的。正基科技的APXX系列芯片属于SD WiFi,另外系统默认也已经支持市面上众多常见的USB WiFi,已测试过的USB WiFi型号如下:

序号 型号
1 RTL8188CUS/8188EU 802.11n WLAN Adapter
2 RT2070 Wireless Adapter
3 RT2870/RT3070 Wireless Adapter
4 RTL8192CU Wireless Adapter
5 小米WiFi mt7601
6 5G USB WiFi RTL8821CU
7 5G USB WiFi RTL8812AU

目前使用 NetworkManager 工具来管理网络,其在命令行下对应的命令是 nmcli,要连接WiFi,相关的命令如下:

  • 切换到root账户
$ su root
  • 查看网络设备列表
$ nmcli dev

注意,如果列出的设备状态是 unmanaged 的,说明网络设备不受NetworkManager管理,你需要清空 /etc/network/interfaces下的网络设置,然后重启.

  • 开启WiFi
$ nmcli r wifi on
  • 扫描附近的 WiFi 热点
$ nmcli dev wifi
  • 连接到指定的 WiFi 热点
$ nmcli dev wifi connect "SSID" password "PASSWORD" ifname wlan0

请将 SSID和 PASSWORD 替换成实际的 WiFi名称和密码。
连接成功后,下次开机,WiFi 也会自动连接。

更详细的NetworkManager使用指南可参考这篇文章: Use NetworkManager to configure network settings

如果你的USB WiFi无法正常工作, 大概率是因为文件系统里缺少了对应的USB WiFi固件。对于Debian系统, 可以在Debian-WiFi里找到并安装USB WiFi芯片的固件。而对于Ubuntu系统, 则可以通过下列命令安装所有的USB WiFi固件:

$ apt-get install linux-firmware

一般情况下, 各种WiFi芯片的固件都存放在/lib/firmware目录下。

9.8 连接以太网

默认插上网线开机,会自动连接并通过DHCP获取IP地址,如需要配置静态IP地址,请参考 NetworkManager 的相关文档: Use NetworkManager to configure network settings

9.9 定制命令行的欢迎信息(文字LOGO)

欢迎信息主要是这个目录下的脚本来打印的:

/etc/update-motd.d/

比如要修改 FriendlyELEC 的大字LOGO,可以修改/etc/update-motd.d/10-header 这个文件,比如要将LOGO改为HELLO,可将以下行:

TERM=linux toilet -f standard -F metal $BOARD_VENDOR

改为:

TERM=linux toilet -f standard -F metal HELLO

9.10 修改时区

例如更改为Shanghai时区:

sudo rm /etc/localtime
sudo ln -ls /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

9.11 选择系统默认的音频设备

可以通过下面的操作步骤,设置系统默认的音频设备。
可用以下命令查看系统中所有的声卡设备 (注:不同的开发板结果会有所不同):

pi@NanoPi:~$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: realtekrt5651co [realtek,rt5651-codec], device 0: ff880000.i2s-rt5651-aif1 rt5651-aif1-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: rockchiphdmi [rockchip,hdmi], device 0: ff8a0000.i2s-i2s-hifi i2s-hifi-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 2: ROCKCHIPSPDIF [ROCKCHIP,SPDIF], device 0: ff870000.spdif-dit-hifi dit-hifi-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0

可以看到,硬件上有如下声卡设备:

声卡设备 声卡序号 说明
realtekrt5651co 0 Realtek声卡的缺省输出接口(通过3.5mm耳机输出)
rockchiphdmi 1 HDMI输出
ROCKCHIPSPDIF 2 光纤输出 (注:暂不可用,因为硬件没有引出)

要配置成将音频输出到3.5mm耳机接口,可修改配置文件/etc/asound.conf,修改成如下内容:

defaults.pcm.card 0
defaults.pcm.device 0

要配置成将音频输出到HDMI,则将上面的defaults.pcm.card修改为1。
需要注意的是,有些板子由于没有Realtek声卡 (没有耳机输出接口),所以HDMI设备的序号会是card 0,所以配置时,要以aplay -l命令的结果为准。

9.12 设置PWM风扇的行为

默认情况下,风扇的转速是根据cpu温度动态调整的,如果需要取消温控,让风扇一直处于运行状态,可以把脚本 /usr/bin/start-rk3399-pwm-fan.sh 修改成以下内容来实现:

#!/bin/bash

echo 0 > /sys/class/pwm/pwmchip1/export
sleep 1
echo 0 > /sys/class/pwm/pwmchip1/pwm0/enable
echo 50000 > /sys/class/pwm/pwmchip1/pwm0/period
echo 1 > /sys/class/pwm/pwmchip1/pwm0/enable
echo 45000 > /sys/class/pwm/pwmchip1/pwm0/duty_cycle

9.13 运行X11程序

FriendlyCore系统集成了轻量级的Xorg,虽然没有窗口管理器,但是你仍然可以运行单一的X-Windows程序,例如要运行的程序是~/YourX11App,使用以下命令:

. /usr/bin/setqt5env-xcb
startx ~/YourX11App -geometry 1280x800

注意 “.” 与 /usr/bin/setqt5env-xcb 之间有一个空格,另外,-geometry后面的分辨率请更改为你的屏幕的实际分辨率。

9.14 mpv硬解播放器

FriendlyCore预装了基于 ffmpeg 实现的命令行视频播放器,除了 mpv 播放器本身,也包含了 libmpv 库文件,方便在程序里调用。
mpv播放器支持 Rockchip MPP video decoder,所以支持4K硬解播放,mpv的参数较多,为了简化使用,我们提供了一个脚本 start-mpv,简化后,只要传文件名给它,就可以播放视频了:

start-mpv /home/pi/demo.mp4

需要注意的是,播放时需要使用pi用户登录,因为其它用户的目录里没有mpv相关的设置,当然你可以从pi用户目录复制一份过来也是可以的,mpv的设置文件存放在以下路径:

/home/pi/.config/mpv/mpv.conf

mpv.conf的文件内容如下所示:

vo=gpu
gpu-context=drm
hwdec=rkmpp
demuxer-max-bytes=41943040
demuxer-max-back-bytes=41943040
drm-osd-plane-id=1
drm-video-plane-id=0
audio-device=alsa/default:CARD=rockchiphdmi

这些都是比较重要的,会传递给 mpv 的参数,其中hwdec需要指定为rkmpp才能开启硬件解码,audio-device用于指定音频输出设备,默认输出到HDMI,你可以用以下命令来查询系统中有哪些音频设备:

mpv --audio-device=help

另一个比较重要的参数是 drm-osd-size,当全屏播放视频时,drm-osd-size指定为屏幕的分辨率即可,这个参数由start-mpv自动获取屏幕参数并传给mpv,start-mpv脚本除此之外,还会做一件更重要的事情,它需要保证系统中的 libmali 库用了正确的版本,因为 mpv 是通过 gbm 来渲染画面的,所以 libmali.so 需要使用这个版本: libmali-midgard-t86x-r14p0-gbm.so,这也意味着,这个版本的mpv只能在FriendlyCore下使用,不能在X11 Desktop下使用,具体细节可以自已查看 start-mpv 的脚本内容。
mpv官方使用指南:https://github.com/mpv-player/mpv/wiki

10 同时适用于FriendlyDesktop与FriendlyCore系统的功能特性

10.1 Linux下使用摄像头(MIPI接口摄像头OV13850与OV4689,USB摄像头罗技C920)

摄像头连接方法: 摄像头可以连接在MIPI接口,如下图所示:

为了方便测试摄像头,我们提供了脚本可以在命令行测试摄像头的拍照和录像功能。
你可以用以下命令更新这个脚本到最新版本:

cd /tmp/
git clone https://github.com/friendlyarm/gst-camera-sh.git
sudo cp gst-camera-sh/*.sh /usr/bin/

共有以下三个脚本:
gst-camera.sh: 单个摄像头的预览、拍照与录像
dual-camera.sh: 预览两个摄像头
stop-gst-camera.sh: 停止预览

10.1.1 gst-camera.sh 参数说明

参数 功能
–index或-i 选择要使用的摄像头的序号,可选值为0和1,当同时连接两个摄像头时,指定为1表示要操作第二个摄像头
–action或-a 指定命令要执行的动作,可选参数为: preview、photo和video,分别对应预览、拍照和录像
–output或-o 指定输出的文件名,用于拍照和录像时指定输出文件名
–verbose或-v 指定为yes时,会输出调用gst-launch-1.0命令的完整命令行
-x 使用rkximagesink插件,预览图像会输出到X11窗口,适用于FriendlyDesktop与Lubuntu系统
-g 使用glimagesink插件,预览图像会输出到X11窗口,适用于FriendlyDesktop与Lubuntu系统
-k 使用kmssink插件,预览图像会直接输出到屏幕,适用于FriendlyCore系统

脚本gst-camera.sh会自动识别OV13850/OV4689/罗技C920摄像头,并传递合适的参数给gst-launch-1.0。

10.1.2 脚本使用方法

  • 预览图像
gst-camera.sh --action preview
  • 拍照

用命令拍照一张照片,存储为文件 1.jpg:

gst-camera.sh -a photo -o 1.jpg
  • 录像并预览

用以下命令启动录像,存储为视频文件 1.ts,录像时使用了硬件编码:

gst-camera.sh --action video -output 1.ts
  • 显示完整的命令

加入 –verbose yes 的参数,会显示最终的 gsteamer 命令,例如:

gst-camera.sh --action video --output 1.ts --verbose yes

你会得到以下完整的 gsteamer 命令,这对你开发会有帮助:

gst-launch-1.0 rkisp num-buffers=512 device=/dev/video0 io-mode=1 ! \
    video/x-raw,format=NV12,width=1280,height=720,framerate=30/1 ! \
        mpph264enc ! queue ! h264parse ! mpegtsmux ! \
        filesink location=/tmp/camera-record.ts
  • 预览双摄像头

连接两个mipi摄像头,或者一个mipi摄像头加一个usb摄像头(仅测试过:罗技C920 pro),调用以下命令即可同时预览两个摄像头的图像:

dual-camera.sh

注:建议在FriendlyDesktop下测试。

10.1.3 gst-launch-1.0命令行解析

在FriendlyDesktop下预览摄像头命令如下:

gst-launch-1.0 rkisp device=/dev/video1 io-mode=4 ! video/x-raw,format=NV12,width=1280,height=720,framerate=30/1 ! rkximagesink

重要参数说明:

参数 说明
device 用于预览的device (selfpath) 是 /dev/video1, 用于拍照的device (mainpath) 是 /dev/video0, 如果是多路摄像头,则另一路预览(selfpath)是 /dev/video5, 另一路拍照 (mainpath)是 /dev/video4, USB摄像头一般都是 /dev/video8
io-mode 值为1表示是memory map模式,值为4表示是dmabuf模式,一般预览用io-mode=4,拍照用io-mode=1, 在OpenCV里访问用io-mode=4
rkximagesink/glimagesink/kmssink 在X-Windows窗口中输出mipi摄像头图像时指定为rkximagesink (适用于FriendlyDesktop),如果是USB摄像头则指定为glimagesink,FriendlyCore下只能使用kmssink

10.1.4 在OpenCV中访问摄像头

访问MIPI摄像头:

cv.VideoCapture('rkisp device=/dev/video1 io-mode=4 ! video/x-raw,format=NV12,width=640,height=480,framerate=30/1 ! videoconvert ! appsink', cv.CAP_GSTREAMER)

访问USB摄像头:

cv.VideoCapture('rkisp device=/dev/video8 io-mode=4 ! videoconvert ! video/x-raw,format=NV12,width=640,height=480,framerate=30/1 ! videoconvert ! appsink', cv.CAP_GSTREAMER)

详情请参考这里的示例代码:https://github.com/friendlyarm/install-opencv-on-friendlycore/tree/rk3399/examples

10.1.5 摄像头应用教程: 推流至直播平台

请查看这篇文档: How to setup RTMP server on NanoPC-T4/zh

10.1.6 参考资源

http://blog.iotwrt.com/media/2017/10/01/camera/ http://www.360doc.com/content/16/1019/17/496343_599664458.shtml

10.2 Docker的安装与使用

10.2.1 安装Docker

使用以下命令安装:

wget https://download.docker.com/linux/ubuntu/dists/bionic/pool/stable/arm64/containerd.io_1.2.6-3_arm64.deb
wget https://download.docker.com/linux/ubuntu/dists/bionic/pool/stable/arm64/docker-ce-cli_19.03.2~3-0~ubuntu-bionic_arm64.deb
wget https://download.docker.com/linux/ubuntu/dists/bionic/pool/stable/arm64/docker-ce_19.03.2~3-0~ubuntu-bionic_arm64.deb
sudo dpkg -i containerd.io_1.2.6-3_arm64.deb
sudo dpkg -i docker-ce-cli_19.03.2~3-0~ubuntu-bionic_arm64.deb
sudo dpkg -i docker-ce_19.03.2~3-0~ubuntu-bionic_arm64.deb

10.2.2 验证Docker的安装

用Docker创建并运行一个debian镜像:

git clone https://github.com/friendlyarm/debian-jessie-arm-docker
cd debian-jessie-arm-docker
./rebuild-image.sh
./run.sh

10.3 Linux下使用ffmpeg进行硬件加速的视频解码

FriendlyCore和FriendlyDesktop系统均预装了 ffmpeg 的可执行文件、静态库和头文件,位于 /usr/ffmpeg-rkmp目录。
ffmpeg支持RockChip MPP视频硬件解码器,但并不支持硬编码,具体信息可参考:https://trac.ffmpeg.org/wiki/HWAccelIntro

测试4K视频的解码性能:

/usr/ffmpeg-rkmp/bin/ffmpeg -benchmark -loglevel 48 -vcodec h264_rkmpp -i 4K-Chimei-inn-60mbps.mp4 -map 0:v:0 -f null -

结果如下图所示,平均 45 FPS:
enter description here

要播放视频,可以使用基于 ffmpeg 实现的播放器 mpv,上面测试所用的4K视频可在网盘的 test-video 目录找到,网盘地址:http://dl.friendlyelec.com/nanopct4。

11 初始化NVME固态硬盘和USB移动硬盘

11.1 检查是否检测到了硬盘

安装好硬盘后, 上电开机, 在终端上输入以下命令:

cat /proc/partitions

看到有 nvme0n1 设备的节点,说明NVME固态硬盘已经成功被识别到了:

major minor  #blocks  name
   1        0       4096 ram0
 259        0  125034840 nvme0n1

看到有 sda 设备的节点,说明USB移动硬盘已经成功被识别到了:

 179      105   30646767 mmcblk0p9
   8        0 3907018584 sda
   8        1 3907017543 sda1

11.2 给硬盘重新分区并格式化为ext4格式

为了简化操作, 我们会将硬盘整个空间分成一个分区, 如果你用的是NVME固态硬盘, 输入以下命令进行操作:

(echo g; echo n; echo p; echo 1; echo ""; echo ""; echo w; echo q) | fdisk /dev/nvme0n1
mkfs.ext4 /dev/nvme0n1p1

如果要对USB移动硬盘进行操作, 输入以下命令:

(echo g; echo n; echo p; echo 1; echo ""; echo ""; echo w; echo q) | fdisk /dev/sda
mkfs.ext4 /dev/sda1

11.3 硬盘的自动挂载

11.3.1 在FriendlyWrt系统下挂载

在FriendlyWrt菜单中, 点击”系统”->”挂载点”界面, 在页面底部的”挂载点”的区域中, 点击”新增”按钮, 在UUID一栏中,选择你的硬盘分区, NVME固态硬盘选择 /dev/nvme0n1p1, 如果是USB移动硬盘, 则选择 /dev/sda1, 然后钩选”已启动“, 填写挂载硬盘的目标位置, 本例中选择将 NVME固态硬盘 挂载到 /mnt 目录, 如下图所示:
enter description here
点击”Save”按钮保存设置, 挂载完成后界面会列出所挂载的硬盘, 如下图所示:
enter description here

11.3.2 在FriendlyCore系统下挂载

首先,我们需要了解分区的Block ID,用blkid查看, NVME固态硬盘输入如下命令查看:

blkid /dev/nvme0n1p1

USB移动固态硬盘输入如下命令查看:

blkid /dev/sda1

输入信息如下所示, 我们需要的是UUID:

/dev/sda1: UUID="de29e869-f442-414a-8dc4-9c47c05b229f" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="b026f952-01"

然后需要把 UUID 添加到 /etc/fstab 文件中去,为了挂载本例中使用的硬盘,/etc/fstab内容如下所示:

UUID=de29e869-f442-414a-8dc4-9c47c05b229f /media/mydisk ext4 defaults 0 0

硬盘将挂载到 /media/mydisk 目录,这个目录默认是不存在的,我们用以下命令手动创建它,并设置为普通用户可以读写:

mkdir -p /media/mydisk
chmod 777 /media/mydisk

接下来就可以输入mount命令,测试一下是否能正常挂载了:

mount /media/mydisk

如果成功挂载, 接下来我们关机测试一下,看下次开机是否会自动挂载:

reboot

11.4 为硬盘设置网络共享

11.4.1 提升硬件挂载目录的权限

为了方便普通用户的读取, 进入终端, 输入以下命令先提升硬件挂载目录的权限:

chmod 777 /mnt

11.4.2 FriendlyWrt下设置网络共享

进入 “服务” -> “网络共享” 菜单, 在页面底部的 “共享目录” 区域, 点击 “新增” 按钮, 分别填写 “名称” 与 “路径” 为 mnt 和 /mnt, 其他默认, 点击 “保存并应用” 即可.

11.4.3 在电脑上访问共享

在Windows电脑上输入以下地址访问共享目录:

\\192.168.2.1\mnt

在Ubuntu/Mac电脑上使用以下地址访问共享目录:

smb://192.168.2.1/mnt

在询问身份验证时, 输入如下信息:
连接方式: 已注册用户
用户名: root
域: WORKGROUP
密码: password

11.5 本机上进行硬盘速度测试

11.5.1 NVME固态硬盘速度测试

11.5.1.1 写入速度

测试命令:

dd if=/dev/zero of=/mnt/deleteme.dat bs=32M count=64 oflag=direct,nonblock

结果如下:

2147483648 bytes (2.1 GB, 2.0 GiB) copied, 6.74925 s, 318 MB/s
11.5.1.2 读取速度

测试命令:

dd if=/mnt/deleteme.dat of=/dev/null bs=32M count=64 iflag=direct,nonblock

结果如下:

2147483648 bytes (2.1 GB, 2.0 GiB) copied, 5.18329 s, 414 MB/s

11.5.2 USB移动机械硬盘速度测试

11.5.2.1 写入速度

测试命令:

dd if=/dev/zero of=/mnt/deleteme.dat bs=32M count=64 oflag=direct,nonblock

结果如下:

2147483648 bytes (2.1 GB, 2.0 GiB) copied, 20.3973 s, 105 MB/s
11.5.2.2 读取速度

测试命令:

dd if=/mnt/deleteme.dat of=/dev/null bs=32M count=64 iflag=direct,nonblock

结果如下:

2147483648 bytes (2.1 GB, 2.0 GiB) copied, 18.9168 s, 114 MB/s

11.6 设置调速散热风扇

散热风扇使用PWM来实现自动调速,会根据当前的CPU温度来决定风扇的开关,以及风扇的转速,如果当前的CPU温度不高,风扇会被关闭或者以较低转速旋转 (减少不必要的环境噪声),
如果你想让风扇立即开始工作,可以用以下命令让CPU立即以高负载运行,以便观察风扇的工作状态:

cpuburn

如果你想改变风扇的调速行为,请修改以下文件:

/usr/bin/fa-fancontrol.sh         # 入口,被pwm-fan.service服务调用,分两种情况控制风扇,由内核控制风扇,或者用户空间通过操作PWM控制风扇
/usr/bin/fa-fancontrol-direct.sh  # 用户空间通过操作PWM控制风扇的脚本,可控制风速等,此脚本由上面的脚本调用

需要禁止开机自动启动风扇(比如你需要连接其他的PWM设备),请输入以下命令:

systemctl stop pwm-fan
systemctl disable pwm-fan

或者删除下面这两个文件:

/etc/systemd/system/pwm-fan.service
/etc/systemd/system/multi-user.target.wants/pwm-fan.service

11.7 Linux下使用4G EC20模块

请参考: How to use 4G Module on NanoPC-T4/zh

12 Buildroot Linux系统的使用

Buildroot是Linux平台上一个构建嵌入式Linux系统的框架,由Makefile脚本和Kconfig配置文件构成,旨在简化系统制作步骤,可实现一站式生成可烧写的系统固件,最终的固件包含boot-loader、kernel和rootfs,以及rootfs中的各种库和应用程序 (例如qt, gstreamer, busybox等)。

由 FriendlyELEC 提供的 Buildroot 项目是基于Rockchip原厂的 linux-sdk 制作, 项目使用 git 管理,与原厂的linux sdk更新保持同步;

  • Rockchip原厂Buildroot项目: https://github.com/rockchip-linux/buildroot

  • Buildroot官网: https://buildroot.org

Buildroot for rockchip运行界面如下:
enter description here
enter description here
enter description here
enter description here

关于Buildroot系统更详细的说明,请参考: Buildroot

13 Lubuntu 系统的使用

看这里: Lubuntu desktop 16.04 for RK3399/zh
Lubuntu下使用NVME SSD: How to Initialize and Format New SSD And HDD

14 Android8.1 系统的使用

我们为 SOM-RK3399 提供了完善的Android8.1 BSP,代码使用 gitlab.com 平台管理,完全开源,支持GPU加速和VPU硬件加速。
enter description here

14.1 使用MIPI摄像头进行拍照和录像

SOM-RK3399在Android系统下,可以搭配 MIPI摄像头CAM1320 进行拍照和录像,操作比较简单,连接摄像头到SOM-RK3399的MIPI接口,开机进入 Android 系统,用系统自带的 Camera 应用即可完成拍照和录像,操作跟 Android 手机是一样的。

14.2 使用双MIPI摄像头预览与录像

从github下载以下示例源代码,并用 Android studio 编译并运行:

git clone https://github.com/friendlyarm/Dual-Camera.git -b working-branch

应用安装后,需要设置Android权限才能让程序正常运行,方法是在开发板的Android系统里进入 Settings -> Apps & notifications -> Dual Camera -> Permissions 钩选以下权限:

Camera
Microphone
Storage

最终运行效果如下:
enter description here

点击界面上的 “CAPTURE VIDEO” 按钮即可录制视频(同时录两个摄像头),录制的视频保存到以下位置:/storage/emulated/0/Download/dualcamera_h264.mp4,电脑上可以用以下adb命令下载到本地:

adb pull /storage/emulated/0/Download/dualcamera_h264.mp4

已知问题
录制的视频文件,播放时会比正常的快,可能需要调整mediacodec的某些参数

14.3 切换系统语言

Android系统默认的系统语言是英文,比如我们要设置为中文,步骤如下: 1) 进入 Android 设置:Settings -> System -> Languages & Input -> Languages;
2)点击”Add a language”, 在列表中选择 “简体中文”,再选择 “中国”;
3) 这时列表中会有中文和英文两种语言,拖动中文那一项到列表的最上面即可,注意,如果你使用的是鼠标,拖动的方法是:将鼠标指针放在列表项右边的图标上,然后按下鼠标中键来拖动;

14.4 Android8.1 硬件访问

开发者可以通过FriendlyThings SDK在Android App中访问和控制主板上的各种硬件资源,比如Uart, SPI, I2C, GPIO等接口,详情可参考以下两份文档:

  • Android: FriendlyThings for Rockchip
  • Android: FriendlyThings APIs

14.5 Android神经网络 NN SDK示例

Android8.1 BSP中包含了支持GPU加速的Android NN SDK,为了方便测试,Android8固件中也预装了原厂提供的Android NN示例程序:TfLiteCameraDemo,这是一个使用Rockchip AndroidNN GPU加速的MobileNet分类器Demo,运行时需要连接摄像头模块,USB和CSI摄像头都是支持的,通过点击 “TfLiteCameraDemo”图标进入示例,其运行效果如下所示:
enter description here

关于Android NN SDK的详细描述,可以去网上参考原厂的文档
TfLiteCameraDemo示例源代码下载地址:[TfLiteCameraDemo源代码]

14.6 如何使用adb(Android Debug Bridge)

14.6.1 在Windows10下使用adb

1. 准备一个烧写好安卓系统的 SOM-RK3399 ,一条Typc-C数据线
2. 在dl.friendlyelec.com找到 SOM-RK3399 的网盘,进入后下载Tools文件夹下的adb.zip

enter description here
3. 解压adb.zip
enter description here
4. 按win+R打开“运行”窗口,输入“cmd”打开命令行工具
enter description here

  1. 在命令行工具输入以下命令转到adb工具的所在路径:
1
cd c:\adb

enter description here
6. 输入以下命令会出现adb的版本信息和使用说明,说明adb可用:

adb

enter description here

7. 把烧写好安卓系统的 SOM-RK3399 接上电源,用Type-C数据线连接 SOM-RK3399 和电脑,然后在命令行工具输入:

adb devices

可看到返回的设备信息,说明Win10已经通过adb检测到 SOM-RK3399 ,之后可以在Win10下对设备进行操作
enter description here

8. 尝试在Win10下使用命令在设备上安装安卓应用,下载一个APK文件,然后输入“adb install 文件名.apk”,如:

adb install QQ_Android_8.3.6.apk

看到“Success”的提示即安装成功

enter description here

14.6.2 在Ubuntu下使用adb

1. 把烧写好安卓系统的 SOM-RK3399 接上电源,用Type-C数据线连接 SOM-RK3399 和电脑,打开“终端”
enter description here

2. 输入以下命令安装adb工具,这时要求输入用户密码:

sudo apt-get install android-tools-adb

enter description here
3. 安装过程中弹出下载提示,输入“Y”然后按Enter确认
enter description here
等待安装完成
enter description here
4. 在命令行工具输入以下命令查看设备:

adb devices

可看到返回的设备信息,说明Ubuntu已经通过adb检测到 SOM-RK3399
enter description here

14.6.3 adb下修改系统文件

1. 第一次启动系统,如果需要更改系统文件,需要关闭安全验证 (注:安装apk不需要关闭),关闭安全验证后需要重启

adb root
adb disable-verity
adb reboot

2. 重启后,获得root权限,并重新挂载 /system 开启写入权限

adb root
adb remount

3. 上传文件

adb push example.txt /system/

14.6.4 注意事项

部分电脑USB端口可能供电不足,如使用NanoPi M4系列请使用PSU Module供电

14.7 HDMI分辨率、边界调节

如果连接了HDMI显示设备,可进入 Android 的 Settings -> Display -> Advanced -> HDMI & Rotation 进行设置。

HDMI Resolution 缺省为 Auto,可手动设置显示分辨率,最高可支持 4K 分辨率
Screen Zoom 用户可观察红色边框的显示,点击中间的4个箭头按钮来进行缩放调节
Display Rotation 可进行横竖屏切换

14.8 屏幕旋转

使用HDMI与LCD作为显示设备时,如果需要旋转屏幕,可进入 Android 的 Settings -> Display -> Advanced -> HDMI & Rotation -> Display Rotation 进行设置。

在 adb shell 用命令来测试屏幕旋转 (不会保存设置):

wm rotation 90

14.9 隐藏Navigation bar

进入设置界面 Settings -> Accessibility,启用 Immersive Mode,然后再打开你的 Android应用,例如 Lightning,你会发现它将处于全屏状态。

14.10 切换音频输出通道

可以配置音频输出到HDMI或者耳机接口,设置入口:Android 的 Settings -> Accessibility -> Force audio output。 如果 Force audio output菜单项是灰色的,即处于不可选择的状态,说明你所用的硬件会自动检测耳机插拨状态,并自动切换音频通道,无需设置。

14.11 调整录音的音量

  1. 先通过串口或adb shell,以root用户权限使用amix 命令调节录音的音量,例如:
amix "IN2 Boost"
amix "ADC Capture Volume"

以上命令用于查看当前的设置,然后便可根据支持的值来调节并测试。
2) 调试好后,修改 hardware/rockchip/audio/tinyalsa_hal/codec_config/rt5651_config.h 文件中 rt5651_main_mic_capture_controls 数组中对应配置项的值,编译Android源代码并测试。

14.12 定制开关机界面与动画

14.12.1 开启与关闭

将 device/rockchip/common/BoardConfig.mk 文件的
BOOT_SHUTDOWN_ANIMATION_RINGING := false
改为
BOOT_SHUTDOWN_ANIMATION_RINGING := true
来打开编译时将文件打包进固件的功能

14.12.2 开机动画

创建或替换Android源代码目录下的如下文件:
kernel/logo.bmp
kernel/logo_kernel.bmp
device/rockchip/common/bootshutdown/bootanimation.zip

14.12.3 关机动画

创建或替换Android源代码目录下的如下文件:
device/rockchip/common/bootshutdown/shutdownanimation.zip

14.12.4 动画制作方法

请参考:http://blog.sina.com.cn/s/blog_4960586c0100vu5v.html

14.13 移除Google框架

如果不需要使用google服务,可以删除Google框架以节约系统资源,方法是删除Android源代码中的以下目录,然后重新编译Android:
vendor/google

14.14 用摇控器操作Android

SOM-RK3399在Android下完美支持 FriendlyARM RC-100 红外遥控器,更方便SOM-RK3399在接电视的场景下使用,遥控器按键功能丰富:
enter description here

按键定义与功能如下表所示:

按键 功能
导航键-上
导航键-下
导航键-左
导航键-右
OK 确认
- 音量-
+ 音量+
静音 静音
菜单 Android菜单键
首页 Android Home键
返回 Android 返回键
F1 下拉Android 通知栏
F2 Android 截屏
F3 切换操作模式,在鼠标模式与按钮模式之间切换

14.15 使用USB摄像头进行拍照和录像

Android系统同时支持USB摄像头拍照和录像,使用系统自带的 Camera 应用即可,有两点需要注意的地方:
1)需要根据摄像头规格,选择合适的录像分辨率,可以先选择较低的CIF分辨率,测试OK之后再尝试更高的分辨率,设置界面如下所示:

enter description here

2)USB摄像头不能与MIPI摄像头同时使用,也不能热拨插,插入摄像头后需要重新开机才能识别;

我们测试过的USB摄像头型号如下:罗技C270,罗技C922 PRO,
实测罗技C922 PRO录像和拍照可以达到1080P分辨率。

14.16 Android下使用4G模块EC20

14.16.1 连接方法

连接时,需要通过USB to miniPCIe转接板转接EC20,再连接到主板的USB Host端口,如下图所示:

连接后无需额外的配置,启动Android后就可以使用4G上网了,跟Android手机类拟。

14.16.2 启用EC20的GPS功能

默认情况下,Android的GPS功能是关闭的 (原因是Android在没有找到任何GPS模块的情况下,会不停的打印LOG信息),在你连接了EC20模块后,就可以开启GPS了。
开启方法是修改Android源代码下的 vendor/quectel/ec20/BoardConfigPartial.mk 文件,将下面这行:

BOARD_HAS_GPS := false

改为

BOARD_HAS_GPS := true

然后重新编译 Android。

14.17 Android下使用NVME SSD高速固态硬盘

14.17.1 第一步:格式化SSD为单分区ext4格式

此操作可以在电脑上进行,也可以在开发板的 linux 系统里进行。

为了方便操作,请在终端上先用以下命令切换为 root 用户:

su -

root用户的默认密码是fa。

14.17.1.1 检查是否检测到了SSD
root@FriendlyELEC:~# cat /proc/partitions 
major minor  #blocks  name
   1        0       4096 ram0
 259        0  125034840 nvme0n1

看到有 nvme0n1 设备的节点,说明SSD已经成功被识别到了。

14.17.1.2 给SSD重新分区

为了让 Linux 系统能成功能挂载,我们选择给 SSD 重新分区,下面的命令会自动将 SSD 整个空间分成一个区:

(echo o; echo n; echo p; echo 1; echo ""; echo ""; echo w; echo q) | fdisk /dev/nvme0n1

如果要分多个区,可以用 fdisk /dev/nvme0n1 命令,参考 fdisk的文档来操作。

14.17.1.3 将分区格式化为 ext4 格式

上一个步骤分区完成后,我们再用 cat /proc/partitions 命令看一下当前的分区信息,在下面的结果中,可用于存储数据的分区设备名为 /dev/nvme0n1p1 :

root@FriendlyELEC:~# cat /proc/partitions
major minor  #blocks  name

   1        0       4096 ram0
 259        0  125034840 nvme0n1
 259        2  125033816 nvme0n1p1

下面的命令将该分区格式化为 ext4 格式,其中-L参数指定SSD分区的名称,这个名称会在Android界面上显示:

mkfs.ext4 /dev/nvme0n1p1 -L SSD

14.17.2 第二步:Android开机自动挂载

只要SSD已经被正确地格式化,Android就会自动挂载SSD为外置存储设备,无需额外的设置,打开Android内置的Files应用,可以看到SSD设备已经挂载:
enter description here
第三方的软件可以正常识别SSD,如下图中的迅雷下载软件,可以设置将文件默认下载到SSD上:
enter description here

14.18 设置调速散热风扇

散热风扇使用PWM来实现自动调速,会根据当前的CPU温度来决定风扇的开关,以及风扇的转速,如果当前的CPU温度不高,风扇会被关闭或者以较低转速旋转 (减少不必要的环境噪声),如果你想改变风扇的调速行为,请修改Android bsp源代码中的以下文件:

device/rockchip/rk3399/nanopc-t4/pwm_fan.sh

需要禁止开机自动启动风扇(比如你需要连接其他的PWM设备),请修改Android bsp源代码中的以下文件:

device/rockchip/rk3399/init.rk3399.rc

对源代码做了修改后,需要重新编译Android。

15 Android7.1 系统的使用

看这里: Android7

16 如何编译系统

16.1 搭建编译环境

16.1.1 方法1: 使用Docker进行交叉编译

请参考 docker-cross-compiler-novnc,也可使用网盘 “04_SDK与编译器/docker” 目录下的本地镜像,参考README.md用docker load命令导入即可。

16.1.2 方法2: 本地搭建交叉编译环境

16.1.2.1 安装编译所需软件包

建议使用amd64架构Ubuntu 20.04操作系统,参考如下内容安装编译及打包所需要的软件包:

sudo apt-get -y update
sudo apt-get install -y sudo curl
sudo bash -c \
  "$(curl -fsSL https://raw.githubusercontent.com/friendlyarm/build-env-on-ubuntu-bionic/master/install.sh)"

对于中国大陆的用户亦可使用以下地址:

sudo bash -c \
  "$(curl -fsSL http://112.124.9.243:3000/friendlyelec/build-env-on-ubuntu-bionic/raw/branch/cn/install.sh)"

你的电脑上会安装好如下交叉编译器:

版本 架构 编译器路径 用途
4.9.3 armhf /opt/FriendlyARM/toolchain/4.9.3 用于编译armhf架构的应用程序
6.4 aarch64 /opt/FriendlyARM/toolchain/6.4-aarch64 用于交叉编译4.4内核
11.3 aarch64 /opt/FriendlyARM/toolchain/11.3-aarch64 用于交叉编译4.19及以上内核(含5.10,6.1)及uboot
16.1.2.2 设置交叉编译器

参考上一节的表格,选用合适版本的编译器,然后将编译器的路径加入到PATH中,例如要使用11.3的交叉编译器,用vi编辑~/.bashrc,在末尾加入以下内容:

export PATH=/opt/FriendlyARM/toolchain/11.3-aarch64/bin:$PATH
export GCC_COLORS=auto

执行一下~/.bashrc脚本让设置立即在当前shell窗口中生效,注意”.”后面有个空格:

. ~/.bashrc

验证是否安装成功:

$ aarch64-linux-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gcc
COLLECT_LTO_WRAPPER=/opt/FriendlyARM/toolchain/11.3-aarch64/libexec/gcc/aarch64-cortexa53-linux-gnu/11.3.0/lto-wrapper
Target: aarch64-cortexa53-linux-gnu
Configured with: /home/cross/arm64/src/gcc/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=aarch64-cortexa53-linux-gnu --prefix=/opt/FriendlyARM/toolchain/11.3-aarch64 --exec_prefix=/opt/FriendlyARM/toolchain/11.3-aarch64 --with-sysroot=/opt/FriendlyARM/toolchain/11.3-aarch64/aarch64-cortexa53-linux-gnu/sysroot --enable-languages=c,c++ --enable-fix-cortex-a53-843419 --with-arch=armv8-a+crypto+crc --with-cpu=cortex-a53 --with-pkgversion=ctng-1.25.0-119g-FA --with-bugurl=http://www.friendlyelec.com/ --enable-objc-gc --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libsanitizer --disable-libmpx --with-gmp=/home/cross/arm64/buildtools --with-mpfr=/home/cross/arm64/buildtools --with-mpc=/home/cross/arm64/buildtools --with-isl=/home/cross/arm64/buildtools --enable-lto --enable-threads=posix --disable-libstdcxx-pch --enable-clocale=gnu --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-indirect-function --enable-gnu-unique-object --enable-default-pie --enable-linker-build-id --with-linker-hash-style=gnu --enable-plugin --enable-gold --with-libintl-prefix=/home/cross/arm64/buildtools --disable-multilib --with-local-prefix=/opt/FriendlyARM/toolchain/11.3-aarch64/aarch64-cortexa53-linux-gnu/sysroot --enable-long-long --enable-checking=release --enable-link-serialization=2
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 11.3.0 (ctng-1.25.0-119g-FA)

16.2 编译 Openwrt/Friendlywrt

16.2.1 下载源代码

FriendlyWrt有两个版本, 请根据需要进行选择.

16.2.1.1 版本FriendlyWrt 24.10
mkdir friendlywrt24-rk3399
cd friendlywrt24-rk3399
git clone https://github.com/friendlyarm/repo --depth 1 tools
tools/repo init -u https://github.com/friendlyarm/friendlywrt_manifests -b master-v24.10 \
        -m rk3399.xml --repo-url=https://github.com/friendlyarm/repo  --no-clone-bundle
tools/repo sync -c  --no-clone-bundle
16.2.1.2 版本FriendlyWrt 23.05
mkdir friendlywrt23-rk3399
cd friendlywrt23-rk3399
git clone https://github.com/friendlyarm/repo --depth 1 tools
tools/repo init -u https://github.com/friendlyarm/friendlywrt_manifests -b master-v23.05 \
        -m rk3399.xml --repo-url=https://github.com/friendlyarm/repo  --no-clone-bundle
tools/repo sync -c  --no-clone-bundle

16.2.2 首次编译

下面的命令是编译不带docker的版本, 如需要编译带docker的版本, 请将rk3399.mk替换为rk3399-docker.mk:

./build.sh rk3399.mk

会编译所有组件(包含u-boot, kernel 和 friendlywrt)并生成sd卡镜像文件,再执行以下命令,可生成用于安装系统到emmc运行的镜像文件(eflahser固件):

./build.sh emmc-img

对项目进行过修改后, 需要重新打包sd卡镜像, 可执行如下命令:

./build.sh sd-img

16.2.3 二次编译

cd friendlywrt
make menuconfig #改动FriendlyWrt的配置
rm -rf ./tmp
make -j${nproc}
cd ../
./build.sh sd-img
./build.sh emmc-img

16.2.4 单独编译u-boot

./build.sh uboot

16.2.5 单独编译kernel

./build.sh kernel

16.2.6 单独编译friendlywrt

./build.sh friendlywrt

或者进入friendlywrt目录, 按标准openwrt的命令操作, 上面的命令出现错误时, 可尝试使用以下命令单线程编译:

cd friendlywrt
make -j1 V=s

16.3 编译Buildroot

请参考: Buildroot

16.4 其他Linux系统编译

16.4.1 各个OS对应的内核与u-boot版本

enter description here

  • 内核源代码仓库地址:https://github.com/friendlyarm/kernel-rockchip
  • u-boot源代码仓库地址:https://github.com/friendlyarm/uboot-rockchip
  • 交叉编译工具链存放在如下路径: /opt/FriendlyARM/toolchain/,使用前需导出到PATH环境变量,例如需要使用11.3-aarch64版本的编译器,使用如下命令:
export PATH=/opt/FriendlyARM/toolchain/11.3-aarch64/bin/:$PATH
  • sd-fuse构建脚本可以用于快速编译kernel和uboot、重新打包sd卡固件与卡刷固件等
  • 点击表格中的MBR与GPT可查看各系统的分区布局(配置文件)

16.4.2 编译内核linux-v4.4.y

本节内容适用于如下OS:

lubuntu eflasher friendlydesktop-arm64 friendlycore-arm64

下载源代码并编译:

git clone https://github.com/friendlyarm/kernel-rockchip --single-branch --depth 1 -b nanopi4-linux-v4.4.y kernel-rockchip
cd kernel-rockchip
export PATH=/opt/FriendlyARM/toolchain/6.4-aarch64/bin/:$PATH
touch .scmversion
# 配置内核
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- nanopi4_linux_defconfig
# 启动配置界面
# make ARCH=arm64 CROSS_COMPILE=aarch64-linux- menuconfig
# 编译内核
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- nanopi4-images -j$(nproc)
# 编译驱动模块
mkdir -p out-modules
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- INSTALL_MOD_PATH="$PWD/out-modules" modules -j$(nproc)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- INSTALL_MOD_PATH="$PWD/out-modules" modules_install
KERNEL_VER=$(make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 kernelrelease)
rm -rf $PWD/out-modules/lib/modules/${KERNEL_VER}/kernel/drivers/gpu/arm/mali400/
[ ! -f "$PWD/out-modules/lib/modules/${KERNEL_VER}/modules.dep" ] && depmod -b $PWD/out-modules -E Module.symvers -F System.map -w ${KERNEL_VER}
(cd $PWD/out-modules && find . -name \*.ko | xargs aarch64-linux-strip --strip-unneeded)

编译完会生成如下文件:

kernel.img resource.img 驱动模块位于out-modules目录

安装内核:
请参考 #应用新编译的uboot与内核

16.4.3 编译u-boot v2014.10

本节内容适用于如下OS:

lubuntu eflasher friendlydesktop-arm64 friendlycore-arm64

下载源代码并编译:

git clone https://github.com/friendlyarm/uboot-rockchip --single-branch --depth 1 -b nanopi4-v2014.10_oreo
cd uboot-rockchip
export PATH=/opt/FriendlyARM/toolchain/6.4-aarch64/bin/:$PATH
make CROSS_COMPILE=aarch64-linux- rk3399_defconfig
make CROSS_COMPILE=aarch64-linux-

编译完成后会生成如下文件:

uboot.img trust.img rk3399_loader_v1.22.119.bin (打包时改名为MiniLoaderAll.bin)

安装u-boot:
请参考 #应用新编译的uboot与内核

16.4.4 编译内核linux-v4.19.y

本节内容适用于如下OS:

ubuntu-focal-desktop-arm64 debian-bullseye-desktop-arm64 debian-bullseye-minimal-arm64 friendlycore-focal-arm64 ubuntu-noble-core-arm64 debian-bookworm-core-arm64 buildroot

下载源代码并编译:

git clone https://github.com/friendlyarm/kernel-rockchip --single-branch --depth 1 -b nanopi4-v4.19.y kernel-rockchip
cd kernel-rockchip
export PATH=/opt/FriendlyARM/toolchain/11.3-aarch64/bin/:$PATH
touch .scmversion
# 配置内核
# option1: 加载Linux系统配置
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- nanopi4_linux_defconfig
# option2: 加载FriendlyWrt系统配置
# make ARCH=arm64 CROSS_COMPILE=aarch64-linux- nanopi4_linux_defconfig friendlywrt.config
# 启动配置界面
# make ARCH=arm64 CROSS_COMPILE=aarch64-linux- menuconfig
# 编译内核
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- nanopi4-images -j$(nproc)
# 编译驱动模块
mkdir -p out-modules
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- INSTALL_MOD_PATH="$PWD/out-modules" modules -j$(nproc)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- INSTALL_MOD_PATH="$PWD/out-modules" modules_install
KERNEL_VER=$(make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 kernelrelease)
rm -rf $PWD/out-modules/lib/modules/${KERNEL_VER}/kernel/drivers/gpu/arm/mali400/
[ ! -f "$PWD/out-modules/lib/modules/${KERNEL_VER}/modules.dep" ] && depmod -b $PWD/out-modules -E Module.symvers -F System.map -w ${KERNEL_VER}
(cd $PWD/out-modules && find . -name \*.ko | xargs aarch64-linux-strip --strip-unneeded)

编译完会生成如下文件:

kernel.img resource.img 驱动模块位于out-modules目录

安装内核:
请参考 #应用新编译的uboot与内核

16.4.5 编译内核linux-v6.1.y

本节内容适用于如下OS:

friendlywrt21 friendlywrt21-docker friendlywrt23 friendlywrt23-docker openmediavault-arm64

下载源代码并编译:

git clone https://github.com/friendlyarm/kernel-rockchip --single-branch --depth 1 -b nanopi-r2-v6.1.y kernel-rockchip
cd kernel-rockchip
export PATH=/opt/FriendlyARM/toolchain/11.3-aarch64/bin/:$PATH
touch .scmversion
# 配置内核
# option1: 加载Linux系统配置
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 nanopi4_linux_defconfig
# option2: 加载FriendlyWrt系统配置
# make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 nanopi4_linux_defconfig friendlywrt.config
# 启动配置界面
# make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 menuconfig
# 编译内核
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 -j$(nproc)
# 编译驱动模块
mkdir -p out-modules && rm -rf out-modules/*
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 INSTALL_MOD_PATH="$PWD/out-modules" modules -j$(nproc)
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 INSTALL_MOD_PATH="$PWD/out-modules" modules_install
KERNEL_VER=$(make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 kernelrelease)
[ ! -f "$PWD/out-modules/lib/modules/${KERNEL_VER}/modules.dep" ] && depmod -b $PWD/out-modules -E Module.symvers -F System.map -w ${KERNEL_VER}
(cd $PWD/out-modules && find . -name \*.ko | xargs aarch64-linux-strip --strip-unneeded)

打包kernel.img与resource.img:

wget https://raw.githubusercontent.com/friendlyarm/sd-fuse_rk3399/kernel-6.1.y/tools/mkkrnlimg && chmod 755 mkkrnlimg
wget https://raw.githubusercontent.com/friendlyarm/sd-fuse_rk3399/kernel-6.1.y/tools/resource_tool && chmod 755 resource_tool
wget https://raw.githubusercontent.com/friendlyarm/sd-fuse_rk3399/kernel-6.1.y/prebuilt/boot/logo.bmp
wget https://raw.githubusercontent.com/friendlyarm/sd-fuse_rk3399/kernel-6.1.y/prebuilt/boot/logo_kernel.bmp
./mkkrnlimg arch/arm64/boot/Image kernel.img
mkdir kernel-dtbs
cp -f arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dtb kernel-dtbs/rk3399-nanopi4-rev09.dtb
cp -f arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dtb kernel-dtbs/rk3399-nanopi4-rev0a.dtb
cp -f arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4se.dtb kernel-dtbs/rk3399-nanopi4-rev0b.dtb
cp -f arch/arm64/boot/dts/rockchip/rk3399-nanopc-t4.dtb kernel-dtbs/rk3399-nanopi4-rev00.dtb
./resource_tool --dtbname kernel-dtbs/*.dtb logo.bmp logo_kernel.bmp

完成后会得到如下文件:

kernel.img resource.img 驱动模块位于out-modules目录

安装内核:
请参考 #应用新编译的uboot与内核

16.4.6 编译u-boot v2017.09

本节内容适用于如下OS:

ubuntu-focal-desktop-arm64 debian-bullseye-desktop-arm64 debian-bullseye-minimal-arm64 friendlycore-focal-arm64 ubuntu-noble-core-arm64 debian-bookworm-core-arm64 buildroot

下载源代码并编译:

git clone https://github.com/friendlyarm/rkbin --single-branch --depth 1 -b friendlyelec
git clone https://github.com/friendlyarm/uboot-rockchip --single-branch --depth 1 -b nanopi4-v2017.09
export PATH=/opt/FriendlyARM/toolchain/11.3-aarch64/bin/:$PATH
cd uboot-rockchip/
./make.sh nanopi4

编译完成后会生成如下文件:

uboot.img trust.img rk3399_loader_v1.24.126.bin (打包时改名为MiniLoaderAll.bin)

安装u-boot:
请参考 #应用新编译的uboot与内核

16.4.7 应用新编译的uboot与内核

16.4.7.1 安装到目标板
16.4.7.1.1 MBR分区

本节内容适用于如下OS:

lubuntu eflasher friendlydesktop-arm64 friendlycore-arm64

目前只有linux v4.4内核使用MBR分区,需要参考此链接的partmap文件,计算各分区的偏移地址,用dd命令将img文件写入到相应位置,例如parameter.template文件内容中”0x00014000@0x00014000(kernel)”表示kernel.img的位置位于0x00014000,转换成10进制就是81920, 相应的dd命令如下所示:

dd if=kernel.img of=/dev/mmcblk0 seek=81920
16.4.7.1.2 GPT分区

本节内容适用于如下OS:

ubuntu-focal-desktop-arm64 friendlycore-focal-arm64 debian-bullseye-desktop-arm64 debian-bullseye-minimal-arm64 ubuntu-noble-core-arm64
buildroot friendlywrt21 friendlywrt21-docker friendlywrt23 friendlywrt23-docker

linux v4.19内核和linux v5.15内核的系统默认使用GPT分区, 可以用dd命令直接将image文件烧写至image对应的分区,SD卡与eMMC的设备节点如下:

  • SD/TF Card设备节点为 /dev/mmcblk0

  • eMMC设备节点为 /dev/mmcblk2

下面将演示如何将内核更新到eMMC:
使用parted命令查看分区布局:

parted /dev/mmcblk2 print

得到如下输出:

Model: MMC BJTD4R (sd/mmc)
Disk /dev/mmcblk2: 31.3GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name      Flags
 1      8389kB  12.6MB  4194kB               uboot
 2      12.6MB  16.8MB  4194kB               trust
 3      16.8MB  21.0MB  4194kB               misc
 4      21.0MB  25.2MB  4194kB               dtbo
 5      25.2MB  41.9MB  16.8MB               resource
 6      41.9MB  83.9MB  41.9MB               kernel
 7      83.9MB  134MB   50.3MB               boot
 8      134MB   2500MB  2366MB  ext4         rootfs
 9      2500MB  31.3GB  28.8GB  ext4         userdata

resource分区的序号为5, kernel分区的序号为6,对应的设备节点为/dev/mmcblk2p5和/dev/mmcblk2p6, dd命令如下:

dd if=resource.img of=/dev/mmcblk2p5 bs=1M
dd if=kernel.img of=/dev/mmcblk2p6 bs=1M

如果要更新uboot:

dd if=uboot.img of=/dev/mmcblk2p1 bs=1M

如果要更新内核驱动模块,将新驱动模块目录上传并替换以下目录下的文件即可:/lib/modules。

16.4.7.2 打包新的SD Image

sd-fuse 提供一些工具和脚本, 用于制作SD卡固件, 具体用途如下:

  • 制作分区镜像文件, 例如将rootfs目录打包成rootfs.img

  • 将多个分区镜像文件打包成可直接写SD卡的单一镜像文件

  • 简化内核和uboot的编译, 一键编译内核、第三方驱动, 并更新rootfs.img中的内核模块

请根据所用的内核版本点击对应的链接了解详细的使用方法:

内核版本 构建脚本
linux v4.4.y sd-fuse
linux v4.19.y sd-fuse
linux v6.1.y sd-fuse
16.4.7.3 线刷

注:不支持内核v4.4.y的固件

16.4.7.3.1 Linux系统

用以下命令让开发板进入loader模式:

sudo reboot loader

用 upgrade_tool_v2.17_for_linux 工具烧写uboot与内核, 命令如下所示:

sudo upgrade_tool di -k kernel.img
sudo upgrade_tool di -re resource.img
sudo upgrade_tool di -u uboot.img
sudo upgrade_tool RD

注:upgrade_tool是Rockchip提供的Linux下的命令行工具(Linux_Upgrade_Tool),需要使用v2以上版本。

16.5 使用脚本进行编译

16.5.1 下载工具与固件

以friendlycore-focal系统为例,从github克隆下载脚本, 并解压friendlycore-focal系统的映象文件,映象文件可以在网盘的”03_分区镜像文件”目录找到:

git clone https://github.com/friendlyarm/sd-fuse_rk3399.git -b kernel-4.19
cd sd-fuse_rk3399
tar xvzf /path/to/netdrive/03_分区镜像文件/friendlycore-focal-arm64-images.tgz

16.5.2 编译内核

下载内核源代码并编译,编译完成后会自动更新 friendlycore-focal-arm64 目录下的相关映象文件,包括文件系统中的内核模块 (rootfs.img会被解包并重新打包):

git clone https://github.com/friendlyarm/kernel-rockchip --depth 1 -b nanopi4-v4.19.y kernel-rk3399
KERNEL_SRC=$PWD/kernel-rk3399 ./build-kernel.sh friendlycore-focal-arm64

16.5.3 编译内核头文件

git clone https://github.com/friendlyarm/kernel-rockchip --depth 1 -b nanopi4-v4.19.y kernel-rk3399
MK_HEADERS_DEB=1 BUILD_THIRD_PARTY_DRIVER=0 KERNEL_SRC=$PWD/kernel-rk3399 ./build-kernel.sh friendlycore-focal-arm64

16.5.4 编译uboot

下载uboot源代码并编译,编译完成后会自动更新 friendlycore-focal-arm64 目录下的相关映象文件:

git clone https://github.com/friendlyarm/uboot-rockchip --depth 1 -b nanopi4-v2017.09
UBOOT_SRC=$PWD/uboot-rockchip ./build-uboot.sh friendlycore-focal-arm64

16.5.5 生成新固件

将friendlycore-focal-arm64目录下的映象文件重新打包成sd卡固件:

./mk-sd-image.sh friendlycore-focal-arm64

命令完成后,固件位于out目录,可以用 dd 命令制作sd启动卡,举例说明:

dd if=out/rk3399-sd-friendlycore-focal-4.19-arm64-YYYYMMDD.img of=/dev/sdX bs=1M

16.6 Android系统编译

16.6.1 电脑的软硬件要求

  • 至少配置16G以上内存+300G磁盘空间,建议使用32G内存+大容量高速SSD的机器,不建议使用虚拟机;
  • 如遇到编译错误,可能是编译环境问题,推荐使用如下Docker容器进行编译:docker-cross-compiler-novnc

16.6.2 编译Android10

16.6.2.1 下载Android10源代码

有以下两种途径获取 Android10 的源代码,都需要联网:

  • 使用网盘里的git repo压缩包

网盘下载地址: 点击进入
文件位于网盘的以下路径:07_源代码/rk3399-android-10.git-YYYYMMDD.tar.xz (YYYYMMDD表示打包的日期)
从网盘中获取的压缩包在解压之后,需要执行一下 sync.sh 脚本,会从gitlab上拉取最新的代码:

tar xf /path/to/netdisk/07_源代码/rk3399-android-10.git-YYYYMMDD.tar.xz
cd rk3399-android-10
./sync.sh

注意: 如果遇到“error: unknown option `recurse-submodules’”,请升级git至v2.0.0或以上版本。

  • 直接克隆git仓库

SOM-RK3399 源代码托管在 gitlab 上,使用以下命令进行下载:

git clone --recursive https://gitlab.com/friendlyelec/rk3399-android-10.git -b main
16.6.2.2 编译并生成Image文件

编译Android 10建议使用普通用户登录,运行以下命令编译:

cd rk3399-android-10
./build-nanopc-t4.sh -F -M

如果需要包含google apps,需要设置一个环境变量再编译,如下所示:

cd rk3399-android-10
export INSTALL_GAPPS_FOR_TESTING=yes
./build-nanopc-t4.sh -F -M
16.6.2.3 编译OTA Packages

如果需要A/B (Seamless) System Updates的支持,需要先进行以下定制:
a) 搭建自己的更新服务器
b) 定制packages/apps/Updater使其适配自己的更新服务
定制完成后,使用快速编译脚本参数-O或–ota可编译OTA Packages,如下所示:

cd rk3399-android-10
./build-nanopc-t4.sh -F -O -M

编译成功完成后,OTA更新相关的包位于目录 rockdev/otapackage/ ,请保留此目录。
当完成了某些修改后使用参数-O 再次编译将会生成ota-update-XXXXXXXX.zip,这是增量更新包。
OTA Packages依赖BUILD_NUMBER, 只有它有变化才会生成增量更新包,缺省的生成规则请查看build-nanopc-t4.sh。
修改 device/rockchip/rk3399/nanopc-t4/BoardConfig.mk 中

BOARD_USES_AB_IMAGE := false

可禁用 A/B 特性,然后重新编译(包括u-boot和android)。

16.6.2.4 更新系统为自已编译的Image

编译完成后,image文件会存放在Android10源代码目录的 rockdev/Image-nanopc_t4/ 子目录下,参考以下步骤更新到 SOM-RK3399上:

  1. 将 EFlasher 启动SD卡 通过读卡器插入电脑,电脑上的Ubuntu系统会自动挂载 SD卡的分区;
  2. 我们需要将 rockdev/Image-nanopc_t4/ 子目录下的所有文件,拷贝并覆盖到 SD卡 FRIENDLYARM 分区里的 android10 目录;
  3. 将SD卡插入SOM-RK3399,重新烧写Andorid系统即可;
    也可参考这个github仓库的方法来更新:sd-fuse_rk3399
    烧写Android 10时EFlasher 需要 v1.3 或以上版本,通过Type-C烧写时请使用rockchip提供的工具AndroidTool v2.71 或Linux_Upgrade_Tool v1.49 。

16.6.3 编译Android8.1

16.6.3.1 下载Android8.1源代码

有以下两种途径获取 Android8.1 的源代码,都需要联网:

  • 使用网盘里的git repo压缩包

网盘下载地址: 点击进入
文件位于网盘的以下路径:sources/rk3399-android-8.1.git-YYYYMMDD.tgz (YYYYMMDD表示打包的日期)
从网盘中获取的压缩包在解压之后,需要执行一下 sync.sh 脚本,会从gitlab上拉取最新的代码:

tar xvzf /path/to/netdisk/sources/rk3399-android-8.1.git-YYYYMMDD.tgz
cd rk3399-android-8.1
./sync.sh
  • 直接克隆git仓库

SOM-RK3399 源代码托管在 gitlab 上,使用以下命令进行下载:

git clone https://gitlab.com/friendlyelec/rk3399-android-8.1 --depth 1 -b master
16.6.3.2 编译并生成Image文件

使用以下命令编译:

cd rk3399-android-8.1
./build-nanopc-t4.sh -F -M
16.6.3.3 更新系统为自已编译的Image

编译完成后,image文件会存放在Android8.1源代码目录的 rockdev/Image-nanopc_t4/ 子目录下,参考以下步骤更新到 SOM-RK3399上:

  1. 将 EFlasher 启动SD卡 通过读卡器插入电脑,电脑上的Ubuntu系统会自动挂载 SD卡的分区;
  2. 我们需要将 rockdev/Image-nanopc_t4/ 子目录下的所有文件,拷贝并覆盖到 SD卡 FRIENDLYARM 分区里的 android8 目录;
  3. 将SD卡插入SOM-RK3399,重新烧写Andorid系统即可;
    也可参考这个github仓库的方法来更新:sd-fuse_rk3399

16.6.4 编译Android7源代码

16.6.4.1 下载Android7源代码

有以下两种途径获取 Android7 的源代码,都需要联网:

  • 使用网盘里的git repo压缩包

网盘下载地址: 点击进入
文件位于网盘的以下路径:sources/rk3399-android-7.git-YYYYMMDD.tgz (YYYYMMDD表示打包的日期)
从网盘中获取的 repo 压缩包在解压之后,需要执行一下 sync.sh 脚本,会从gitlab上拉取最新的代码:

tar xvzf /path/to/netdisk/sources/rk3399-android-7.git-20181228.tgz
cd rk3399-nougat
./sync.sh
  • 直接克隆git仓库

SOM-RK3399 源代码托管在 gitlab 上,使用以下命令进行下载:

git clone https://gitlab.com/friendlyelec/rk3399-nougat --depth 1 -b nanopc-t4-nougat
16.6.4.2 编译并生成Image文件

使用以下命令编译:

cd rk3399-nougat
./build-nanopc-t4.sh -F -M
16.6.4.3 更新系统为自已编译的Image

编译完成后,image文件会存放在Android7源代码目录的 rockdev/Image-nanopc_t4/ 子目录下,参考以下步骤更新到 SOM-RK3399上:

  1. 将 EFlasher 启动SD卡 通过读卡器插入电脑,电脑上的Ubuntu系统会自动挂载 SD卡的分区;
  2. 我们需要将 rockdev/Image-nanopc_t4/ 子目录下的所有文件,拷贝并覆盖到 SD卡 FRIENDLYARM 分区里的 nougat 目录;
  3. 将SD卡插入SOM-RK3399,重新烧写Andorid系统即可;
    也可参考这个github仓库的方法来更新:sd-fuse_rk3399

17 板载资源的使用

17.1 串口访问

如下表所示,仅 UART4 可供应用程序开发使用:

串口设备 串口资源占用情况
UART0 已被蓝牙占用
UART1 已被千兆以太网占用
UART2 已被作为调试串口
UART3 已被千兆以太网占用
UART4 空闲,设备名称为 /dev/ttyS4 (注:需使用20180618之后的ROM)

17.2 DTS文件

请参考 DTS files

18 备份文件系统并创建SD映像(将系统及应用复制到另一块开发板)

18.1 备份根文件系统

开发板上执行以下命令,备份整个文件系统(包括OS与数据):

sudo passwd root
su root
cd /
tar --warning=no-file-changed -cvpzf /rootfs.tar.gz \
    --exclude=/rootfs.tar.gz --exclude=/var/lib/docker/runtimes \
    --exclude=/etc/firstuser --exclude=/etc/friendlyelec-release \
    --exclude=/usr/local/first_boot_flag --one-file-system /

注:备份时,如果系统中有挂载目录,最后会出现一个错误提示信息,可以无视它,我们本来就是要忽略这些目录

18.2 从根文件系统制作一个可启动的SD卡

在Linux PC上执行以下shell命令,为了简洁起见,这里以debian-bullseye-desktop-arm64系统为例,但方法适用于所有Linux系统。

su root
git clone https://github.com/friendlyarm/sd-fuse_rk3399 --single-branch -b kernel-4.19
cd sd-fuse_rk3399
tar xvzf /path/to/netdrive/03_Partition\ image\ files/debian-bullseye-desktop-arm64-images.tgz
tar xvzf /path/to/netdrive/03_Partition\ image\ files/emmc-eflasher-images.tgz
scp pi@BOARDIP:/rootfs.tar.gz /rootfs.tar.gz
mkdir rootfs
tar xvzfp rootfs.tar.gz -C rootfs --numeric-owner --same-owner
./build-rootfs-img.sh rootfs debian-bullseye-desktop-arm64
./mk-sd-image.sh debian-bullseye-desktop-arm64
./mk-emmc-image.sh debian-bullseye-desktop-arm64 autostart=yes

19 更改内核命令行参数 (仅支持4.4内核)

19.1 eMMC启动

步骤如下:
先做一张eflahser的烧写卡 (使用rk3xxxx-eflasher-开头的固件文件),
将烧写卡插入电脑,进入sd卡的OS相关目录,编辑文件parameter.txt, 这是个文本文件,里面有命令行参数,
然后再用烧写卡启动,把系统烧写进 eMMC。

19.2 SD启动

要修改SD卡启动时的命令行参数, 需要重新打包SD卡镜像文件, 可以使用我们提供的sd-fuse脚本来辅助打包:

git clone https://github.com/friendlyarm/sd-fuse_rk3399.git -b master --single-branch
cd sd-fuse_rk3399
tar xvzf /path/to/netdrive/03_Partition\ image\ files/friendlydesktop-arm64-images.tgz
tar xvzf /path/to/netdrive/03_Partition\ image\ files/emmc-flasher-images.tgz
vim friendlydesktop-arm64/parameter.txt   # 编辑命令行参数
./mk-sd-image.sh friendlydesktop-arm64    # 重新打包sd映象文件
./mk-emmc-image.sh friendlydesktop-arm64  # 重新打包sd-to-emmc映象文件(eflasher img)

20 Linux操作系统的常见操作

20.1 Linux系统下使用adb

20.1.1 buildroot系统下开启adb功能

开机自动开启

mv /etc/init.d/K50usbdevice.sh /etc/init.d/S50usbdevice.sh
reboot

临时开启

usbdevice-wrapper start

20.1.2 ubuntu和debian系统下开启adb功能

开机自动开启

sudo systemctl enable usbdevice
sudo reboot

临时开启

usbdevice-wrapper start

20.1.3 如何连接

使用adb时,与电脑相连接的端口与usb线刷的端口相同。

20.2 安装内核头文件

安装位于/opt/archives目录下的deb文件:

sudo dpkg -i /opt/archives/linux-headers-*.deb

在线下载并更新内核头文件:

wget http://112.124.9.243/archives/rk3399/linux-headers-$(uname -r)-latest.deb
sudo dpkg -i ./linux-headers-latest.deb

可以访问 http://112.124.9.243/archives/rk3399 查看有哪些内核deb包。

20.3 设置内核启动参数 (仅支持eMMC/UFS)

将固件XXXX-eflasher-multiple-os-YYYYMMDD-30g.img.gz烧写到TF卡,将TF卡插入电脑,Windows电脑一般会自动识别TF卡的分区,该分区为exfat格式,Linux或Mac用户,请手动挂载TF卡的第一个分区,假设TF卡的设备名为/dev/sdX,挂载/dev/sdX1即可。

编辑TF卡对应OS目录下的info.conf配置文件,增加bootargs-ext参数,例如:

bootargs-ext=rockchipdrm.fb_max_sz=2048

如果要删除某个已经指定的参数,可以设置为空,例如删除userdata参数:

bootargs-ext=userdata=

编辑完成后,再用此TF卡烧写系统到eMMC/UFS即可。

要在制作量产卡的过程中设置好内核启动参数,可参考如下脚本 (以RK3588为例): https://github.com/friendlyarm/sd-fuse_rk3588/blob/kernel-6.1.y/test/test-custom-bootargs.sh

21 救砖办法

如何固件没有正确安装,导致开发板变砖,而且可能没有机会通过SD卡重新安装固件,这时,就需要进入Maskrom模式,通过擦除存储设备的办法救砖。

21.1 Windows用户

21.1.1 下载所需文件

  • 获取所需工具:访问这里,在 05_Tools 目录中找到 RKDevTool_v3.30_for_window.zipDriverAssitant_v5.12.zip 下载到本地
  • 安装Rockchip USB驱动和RKDevTool: 解压 DriverAssitant_v5.12.zip 安装Rockchip USB驱动, 解压 RKDevTool_v3.30_for_window.zip 获得 Rockchip烧写工具 RKDevTool
  • 获取loader: 访问这里,进入CPU型号对应的tools目录,下载 MiniLoaderAll.bin

21.1.2 进入Maskrom模式擦除存储设备

  • 从开发板上拨出SD卡,USB设备等外设

  • 在电脑上启动 RKDevTool

  • 按住Recover Key按键不放, 用USB C数据线, 将SOM-RK3399与电脑进行连接, 连接到SOM-RK3399的USB C接口, 保持按住Recover Key键, 状态灯亮起3秒后即可松开

  • 正常情况下,界面下方会显示 Found One MASKROM Device, 如下图所示:
    enter description here

  • 在 RKDevTool 界面上点击 Advanced Function 选项卡

  • 在 Boot 编辑框中选择 MiniLoaderAll.bin,然后点击 Download 按钮

  • 选中 EMMC,点 Switch Storage,再点击 ErashAll 按钮擦除eMMC
    enter description here

  • 至此,SOM-RK3399恢复至初始状态,可以正常通过SD卡或eMMC引导系统了

21.2 Linux

21.2.1 下载所需文件

  • 获取所需工具:访问这里,在 05_Tools 目录中找到 upgrade_tool_v2.30_for_linux.tgz 下载到本地
  • 获取loader: 访问这里,进入CPU型号对应的tools目录,下载 MiniLoaderAll.bin

21.2.2 安装upgrade_tool工具

输入如下命令:

tar xzf upgrade_tool_v2.30_for_linux.tgz
cd upgrade_tool_v2.30_for_linux
sudo cp upgrade_tool /usr/local/sbin/
sudo chmod 755 /usr/local/sbin/upgrade_tool

21.2.3 进入Maskrom模式擦除存储设备

  • 使用USB数据线将SOM-RK3399与电脑相连接
  • 将SOM-RK3399断开电源,按住 MASK 键,连接电源,4秒后松开按键
  • 用如下命令检查连接:
upgrade_tool LD

显示类似 “DevNo=1 Vid=0x2207,Pid=0x350b,LocationID=13 Mode=Maskrom SerialNo=” 的内容表示已检测到设备。

  • 用如下命令擦除eMMC:
upgrade_tool EF MiniLoaderAll.bin
  • 至此,SOM-RK3399恢复至初始状态,可以正常通过SD卡或eMMC引导系统了

21.3 Mac Users

我们测试发现Mac下的upgrade_tool_v2.25无法正常工作,因此建议使用Windows和Linux,除非获得了更新版本的upgrade_tool。

22 更多OS

22.1 DietPi

enter description here

DietPi is a highly optimised & minimal Debian-based Linux distribution. DietPi is extremely lightweight at its core, and also extremely easy to install and use.
Setting up a single board computer (SBC) or even a computer, for both regular or server use, takes time and skill. DietPi provides an easy way to install and run favourite software you choose.
For more information, please visit this link https://dietpi.com/docs/.

DietPi supports many of the NanoPi board series, you may download the image file from here:

  • https://dietpi.com/docs/hardware/#nanopi-series-friendlyarm
  • Link to Rockchip’s resources: https://gitlab.com/friendlyelec/rk3399-nougat/tree/nanopc-t4-nougat/RKDocs
  • RK3399 datasheet V2.1
  • RK3399TRM V1.4

24 原理图, PCB图

  • 核心板原理图: SOM-RK3399_1904_Schematic.pdf
  • 核心板PCB CAD 文件:SOM-RK3399_1904_dxf.zip
  • 底板原理图:SOM-RK3399_Dev_Kit_1904_Schematic.pdf
  • 底板PCB CAD 文件:SOM-RK3399_Dev_Kit_1904_dxf.zip

25 更新日志

25.1 2025-04-30

25.1.1 FriendlyWrt

  • 增加配置加载npu驱动模块
  • 增加RTL8851bu无线网卡的支持

25.2 2025-03-27

25.2.1 FriendlyWrt

  • 修正opt分区inode过小的问题
  • 从eMMC启动时,为内存超1G设备重新启用eMMC刷机助手

25.3 2025-02-28

25.3.1 FriendlyWrt

  • 更新FriendlyWrt到24.10
  • RK33xx内核更新至6.6.78+
  • 调整分区:固定根分区大小,增加独立分区以提升 Docker 存储性能,恢复出厂设置后该分区数据仍会得到保留

25.4 2024-10-16

25.4.1 Linux系统

  • 更新Debian bullseye系统到linux-5.10-gen-rkr8 (更新mpp/xserver/rkaiq/gsteamer-rockchip/rga2/libv4l-rkmpp等软件包)
  • 更新Ubuntu focal desktop系统中的rockchip硬件相关软件包 (同Debian bullseye)
  • 升级Chromium到最新版本
  • 更新FriendlyWrt到openwrt-23.05.05版本

25.4.2 其他

  • eflasher卡刷固件支持选择目标存储设备,可将Linux系统根分区安装至M.2硬盘或U盘 (但仍需eMMC/TF卡引导)
  • eflasher可通过配置文件定制内核启动参数
  • 更新ramdisk支持btrfs文件系统 (可使用sd-fuse_rk3399打包btrfs的固件)
  • 更新ramdisk提升文件系统修复的兼容性

25.5 2024-05-11

25.5.1 Debian11 Desktop

  • 同步原厂debian版本到linux-5.10-gen-rkr7.1
  • 更新基础库libmali,mpp,rga2,npu,gstreamer等到新版本
  • 更新网页浏览器chromeium到新版本

25.5.2 Ubuntu Focal Desktop

  • 增加多语言的支持(含中文)
  • 修正开机后再连接显示屏有可能会无显示的问题
  • 更新基础库libmali,mpp,rga2,npu,gstreamer等到新版本

25.5.3 其他

  • sd-fuse_rk3399 支持在arm64平台下打包固件

25.6 2024-04-21

25.6.1 OpenMediaVault

  • 更新到 7.0.5-1
  • 更新到 Debian12

25.7 2024-03-15

25.7.1 Ubuntu focal desktop

  • 修正蓝牙无法使用的问题

25.8 2024-01-31

25.8.1 Debian/Ubuntu/FriendlyCore/Buildroot

  • 增加adb支持

25.9 2023-12-01

25.9.1 FriendlyWrt

  • 更新到 6.1.63 内核
  • 更新到 OpenWrt 23.05.2

25.10 2023-10-31

25.10.1 增加新系统

  • 增加NAS系统 OpenMediaVault,基于Debian11构建,使用6.1内核

25.10.2 Debian Core/FriendlyCore-Lite-Core

  • 更新到 6.1 内核

25.10.3 FriendlyWrt

  • 更新到 6.1 内核
  • 更新到 openwrt-23.05

25.11 2023-07-01

25.11.1 Debian11

  • 更新到Rockchip sdk版本最新版本, 升级gpu与xserver驱动等,提升UI与媒体播放性能
  • 修正已知问题

25.12 2023-05-26

25.12.1 FriendlyWrt更新

  • 更新 v22.03 到新版本 openwrt-22.03.5
  • 更新 v21.02 到新版本 openwrt-21.02.7

25.13 2023-05-21

25.13.1 Debian11:

  • 更新到Rockchip sdk版本linux-5.10-gen-rkr4
  • 为了流畅性,将桌面切换至LXDE

25.14 2023-04-26

25.14.1 FriendlyWrt:

  • 更新 v22.03 到新版本 openwrt-22.03.4
  • 更新 v21.02 到新版本 openwrt-21.02.6

25.15 2023-02-10

25.15.1 新增 Debian11

分为以下三个版本:

  • Debian11 Core: 仅命令行
  • Debian11 Minimal: LXDE桌面,精简版
  • Debian11 Desktop: LXDE桌面,完整版

25.16 2023-01-09

25.16.1 FriendlyCore更新说明:

  • 优化了开机服务

25.17 2022-12-04

25.17.1 FriendlyWrt:

  • 修正存储空间某些情况下无法扩展的问题
  • 加强eMMC刷机工具的刷机稳定性

25.18 2022-09-06

25.18.1 FriendlyWrt更新说明:

  • 提升了NanoPi-R4SE的eMMC读取性能
  • 增加Fullcone NAT支持 (默认开启)
  • 版本升级到 22.03.0 正式版
  • 修复NanoPC-T4在FriendlyWrt下的eMMC稳定性问题

25.19 2022-08-19

25.19.1 Lubuntu/Android8/FriendlyDesktop更新说明:

  • 增加7寸屏HD703E的支持
  • 修正FriendlyDesktop eMMC启动问题

25.19.2 Buildroot更新说明:

  • 修正在Som-RK3399下未自动加载WiFi模块的问题

25.20 2022-08-03

25.20.1 FriendlyWrt更新说明:

  • 升级FriendlyWrt至最新版本22.03-rc6
  • 修正 R4S/R4SE 软重启后小概率会识别不到pcie设备(lan口)的问题
  • 修正R4SE在烧写系统到eMMC时状态灯没有反映烧写进度的问题
  • 防火墙设置调整: 单网口的设备(使如NanoPi-T4/NanoPi-M4)默认设置为允许WAN入站流量以方便网页配置,多网口的设备仍然保持默认拒绝WAN入站流量
  • 更新使用4.19内核的FriendlyWrt固件,特性与5.15的FriendlyWrt 21.02 docker版本一致

25.21 2022-07-27

25.21.1 FriendlyWrt更新说明:

  • 提供测试版22.03-rc3, 可根据软件包的需求情况进行选择, 推荐使用稳定版本 21.02.3
  • 提供docker与非docker两个版本,除了docker外其他特性相同
  • 改善了第三方软件包的安装兼容性问题
  • 增加支持 “恢复出厂设置” 功能
  • 增加网页刷机工具 eMMC-Tools, 支持安装FriendlyElec及部分第三方固件到eMMC, 除了raw-image还支持rockchip打包格式的固件
  • 其他一些细节调整: 默认设置时区设置为上海、新增NAS分类菜单、去掉lcd2usb、改进安全性设置、调优sysctl参数、修正docker防火墙设置等
  • 增加支持新的硬件型号: NanoPi-R4SE

25.22 2022-07-04

25.22.1 Debian 10(buster) Desktop (首次发布)

  • 桌面环境采用 LXDE, 多种主题可选, 简洁美观, 占用资源少
  • 提供基于 Mali GPU 的 OpenGL 支持
  • 支持Rockhip MPP视频硬编和硬解码
  • 预装基于mpv的Kodi, SMPlayer播放器, 支持4K视频硬解码
  • 预装Chromium浏览器, 支持vpu/gpu硬件加速 (视频硬解限h264/mp4格式)
  • 支持安装Plex Server, wps等应用, 玩法丰富

25.23 2021-12-02

  • 修正某些sd卡会导致reboot命令和看门狗无法正常工作的问题 (更新了uboot v2017.09)

25.24 2021-10-29

25.24.1 FriendlyWrt更新说明:

  • FriendlyWrt更新至官方稳定版本 21.02.1,特性与19.07.5基本保持一致,支持docker、usb wifi等

25.24.2 Friendlycore-Focal 更新说明:

  • 更新了rockchip的视频编/解码(mpp)支持
  • 更新了camera支持, 集成了rkisp_3A_server,运行它后摄像头预览可直接使用v4l2src,用法实例如下:
     rkisp_3A_server --mmedia /dev/media0 &
     gst-launch-1.0 v4l2src device=/dev/video1 io-mode=4 ! \
       video/x-raw,format=NV12,width=1280,height=720,framerate=30/1 ! queue ! kmssink
  • 修复gst-camera.sh预览HDMI IN会出错的问题

25.25 2021-08-31

25.25.1 FriendlyWrt更新说明:

  • FriendlyWrt的内核更新到 5.10.60
  • 新增一款高速5G USB WiFi的支持,网卡型号为 Comfast CF-WU782AC V2,芯片型号为 MediaTek MT7662
  • 改进了USB WiFi的兼容性
  • 改进了PWM风扇的支持,风扇由内核驱动控制,支持温控(详情请在R4S的WiKi页面搜索 PWM风扇)
  • 改进了首次启动的稳定性 (之前的版本,首次启动时,某些情况下会出现bpfilter错误)

25.26 2021-03-11

25.26.1 FriendlyWrt更新说明:

  • FriendlyWrt内核更新到5.10

25.27 2020-12-24

25.27.1 FriendlyWrt更新说明:

  • FriendlyWrt更新至官方稳定版本 19.07.5

25.28 2020-12-17

25.28.1 FriendlyWrt更新说明:

25.29 2020-12-17

25.29.1 FriendlyWrt更新说明:

  1. FriendlyWrt提供两个版本,使用4.19内核与5.4内核,其中5.4用于R4S,其他型号请使用4.19版本
  2. 提高了软件包的兼容性,方便用 opkg 命令安装软件包

25.29.2 FriendlyCore/FriendlyDesktop更新说明:

更新wiringPi,支持更多引脚

25.30 2020-10-27

  • 增加新OS: FriendlyCore 20.04, 主要特性如下:
  1. Linux内核版本为4.19.111
  2. 基于Ubuntu 20.04构建,保留FriendlyCore原有特性如Qt5, OpenCV,WiringPi等,暂不支持ffmpeg/mpv
  3. U-Boot 2017.09
  4. 整合原厂最新的GPU、视频编解码、Camera支持

25.31 2020-09-27

25.31.1 Android 10更新说明:

  • 增加A/B(无缝)系统更新的支持
  • 为演示新特性,此次发布的Rom,可检查到一个更新

25.32 日期 2020-09-16

  • Android 10 更新
  1. 更新SDK为Rockchip android-10.0-mid-rkr9
  2. HDMI开放更多的分辨率选择
  3. 修复DisplayPort无显示的问题
  4. 更新蓝牙固件,修复NanoPi M4B无法启用蓝牙的问题
  5. 修正内核的logo显示
  • FriendlyCore/FriendlyDesktop 更新如下:
  1. 更新蓝牙固件,修复蓝牙固件没有成功加载的问题
  2. 更新bcmdhd 驱动为 1.579.77.41.22
    3)修正 /tmp/ 目录权限某些情况下被修改成只读的问题

25.33 日期 2020-08-17

  1. 修正 typc-c 烧写的稳定性和易用性,为每个系统的压缩包预置了AndroidTool以及配置文件,无需手动加载文件 (注:改变EMMC中的OS类型时,仍需先擦除Flash再烧写新的OS);
  2. 修正 FriendlyWrt 串口无法登录的问题;

25.34 日期 2020-07-10

  • Android 10 更新:
  1. SOM-RK3399缺省启用HDMI IN音频输入与耳机口音频输出
  2. 增加支持2个USB摄像头协同工作,Camera应用可切换前/后摄像头预览
  3. 集成了浏览器Chrome和输入法Gboard

25.35 日期 2020-06-23

  • 增加新OS: Android 10, 主要特性如下:
  1. 基于原⼚ android-10.0-mid-rkr8, 具体版本如下:
  • AOSP: android-10.0.0_r32
  • Linux version 4.19.111
  • U-Boot 2017.09
  1. 支持MIPI-CSI摄像头和USB摄像头
  2. 支持HDMI IN视频输入
  3. 集成Google Play应⽤用商店
  4. 集成Lightning为缺省浏览器器应⽤用 (注:Android官⽅缺省不提供Browser应用)
  5. 启⽤Android动态分区特性(dynamic partitions)
  6. 已整合FriendlyThings demo
  7. 支持4G网络,模块型号为: Quectel EC20
  8. 支持RC-100红外遥控器器,支持下拉通知栏、截屏
  9. 提供自动隐藏导航栏的设置
  10. 更新用于 Android10的线刷工具:AndroidTool_Release_v2.71.zip,Linux_Upgrade_Tool_v1.49.zip
  • Android8更新如下:

增加自动隐藏导航栏的设置

25.36 日期 2020-03-24

  1. 更新Android8.1_SDK至Rockchip官方版本v8.32_20200218
  2. 升级OpenCV版本至 4.2
  3. 升级OpenWrt版本至 19.07.1
  4. DDR loader版本更新到1.24,LPDDR4支持多频点
  5. 加强了摄像头驱动的稳定性
  6. 内核稳定性方面的优化

25.37 日期 2019-12-27

  • FriendlyCore/FriendlyDesktop 更新如下:
  1. 预装 wiringPi for python3,支持在非root用户下访问gpio等硬件资源
  2. 优化了opencv在非root用户下的使用,修正pi用户下的virtual env权限
  3. 更新了 ramdisk, 修正 /tmp 目录的权限问题
  4. 更改内核配置,改善了 docker 的兼容性
  • FriendlyWrt更新如下:

升级版本到 OpenWrt r19-snapshot 64bit,支持Docker CE

  • eflasher更新如下:
  1. 支持只烧写部分文件,例如仅更新emmc内的内核和uboot
  2. 在界面上增加禁用overlay filesystem选项
  3. 增加命令行参数,方便脚本调用,可以实现无交互的一键安装
  4. 修正备份与恢复镜像后,不同设备会出现相同mac地址的问题
  5. UI界面现在可以配置标题,隐藏界面菜单与按钮

25.38 日期 2019-09-26

  • FriendlyCore/FriendlyDesktop小修正:

修正 Qt5 demo在某些LCD下无法触摸的问题

25.39 日期 2019-09-03

  • Android 8.1更新如下:
  1. 更新Android8.1_SDK至Rockchip官方版本v8.20_20190801 (内核更新到4.4.167)
  2. 增加录音音量(+15dB)
  3. 修正某些HDMI显示器比例显示不正确的问题
  4. USB 3.0 Host: 启用AutoRetry特性,改进部分USB3.0工业摄像头的稳定性
  • FriendlyCore/FriendlyDesktop更新如下:
  1. 合并原厂的内核更新,并升级至kernel-4.4.179
  2. USB 3.0 Host: 启用AutoRetry特性,改进部分USB3.0工业摄像头的稳定性
  3. 增加Linux下支持使用HDMI IN
  • Buildroot更新如下:
  1. 更新Buildroot至Rockchip官方版本v2.2.0_20190628
  2. 合并原厂的内核更新,并升级至kernel-4.4.179
  3. 增加使能开机后自动加载蓝牙固件

25.40 日期 2019-07-18

  • FriendlyCore/FriendlyDesktop/Lubuntu更新:
  1. 修改SDIO最高频率为150M以提升Wi-Fi性能
  2. 修复部分NVMe M.2固态硬盘无法识别的问题,提升兼容性
  • Android 8更新
  1. 修改SDIO最高频率为150M以提升Wi-Fi性能
  2. 启用了蓝牙BLE的支持

25.41 日期 2019-06-25

Linux(Ubuntu 16.04/18.04) 全面采用 OverlayFS,以增强文件系统的稳定性.

25.42 日期 2019-05-23

  • Ubuntu 18.04(FriendlyCore, FriendlyDesktop)更新:
  1. 修正 Pulseaudio 服务没法启动的问题
  2. 修正 Bluetooth 服务的问题

25.43 日期 2019-05-11

  • Android 8.1更新如下:
  1. 增加支持PWM风扇自动调速
  2. 增加SSD支持: 开机会自动挂载SSD (注:SSD分区需格式化为ext4格式)
  • Ubuntu 18.04(FriendlyCore, FriendlyDesktop)更新:
  1. 内核版本更新到 Linux-4.4.167
  2. 升级摄像头isp驱动(由 cif_isp10 升级至 rk_isp1),支持双mipi摄像头同时工作
  3. 升级集成OpenCV 4.1,支持双mipi摄像头, USB摄像头(罗技C920)
  4. 增加4G LTE无线模块的支持(型号:Quectel EC20)
  5. 增加支持PWM风扇自动调速
  6. 改进了FriendlyDesktop的易用性
  • EFlasher烧写专用系统更新:
  1. 精简了文件系统体积
  2. 为了启动速度,网络配置由DHCP改为静态IP地址(192.168.1.231)

25.44 日期 2019-03-08

  • 增加Buildroot项目:

增加 Buildroot Linux系统,基于Rockchip原厂RK3399 Linux SDK,项目开源,详情请参考:Buildroot

  • Android 8.1更新如下:
  1. 优化了LCD和HDMI屏幕旋转的设置,支持命令行操作(命令:wm rotation 90)
  2. 修复将音频强制输出到耳机后麦克风无法声音的问题
  • FriendlyCore, FriendlyDesktop, Lubuntu更新如下:
  1. 内核版本更新到 v4.4.154
  2. 增加Docker的支持
  3. 内核配置项进行了优化,启用更多特性与设备驱动
  4. 修正USB WiFi无法使用的问题
  5. 修正ISP摄像头的稳定性问题

25.45 日期 2018-12-19

  • Android 8.1更新如下:
  1. 更新AOSP源码版本到 Android8.1-SDK v5.00-20181109
  2. 增加HDMI分辨率与边界调节的设置界面
  3. 增加音频输出设置,可设置默认输出到耳机或者HDMI
  4. 增加OV13850和和宽动态OV4689摄像头支持,可任意连接到CSI1或CSI2接口
  • FriendlyCore更新如下:
  1. 增加OV13850和和宽动态OV4689摄像头支持,可任意连接到CSI1或CSI2接口
    2)增加ffmpeg支持,提供静态库和头文件,支持4K硬解(不支持硬编码)
    3)增加命令行mpv播放器,支持4K硬解
  • FriendlyDesktop更新如下:
  1. 增加OV13850和和宽动态OV4689摄像头支持,可任意连接到CSI1或CSI2接口
  2. 增加chromium-browser浏览器,支持网页1080P硬解播放, 支持WebGL
    3)增加ffmpeg支持,提供静态库和头文件,支持4K硬解(不支持硬编码)
  3. 修正音量调节Issue
  4. 将音频输出通道默认设置为HDMI (可通过/etc/pulse/default.pa修改配置)
  5. 优化本地硬解播放器,与本地mp4文件关联,双击本地视频默认会启动本地硬解播放器播放(仅支持mp4文件)
  6. 为NEO4自动启用 swap 分区
  7. 修正 hostapd 相关的issue
  8. 调整DPMS设置,默认关闭自动休眠
  • Lubuntu更新如下:
  1. 增加OV13850和宽动态OV4689摄像头支持,可任意连接到CSI1或CSI2接口
  2. 增加chromium-browser浏览器,支持网页1080P硬解播放, 支持WebGL
  3. 将音频输出通道默认设置为HDMI(可通过/etc/asound.conf修改配置)
  4. 优化本地硬解播放器,与本地mp4文件关联,双击本地视频默认会启动本地硬解播放器播放(仅支持mp4文件)
  5. 修正前一版本中存在的一些关于软件包报错的issue
  6. 调整DPMS设置,默认关闭自动休眠

25.46 日期 2018-11-12

  • Android 8.1更新如下:
  1. 增加USB-C显示器的支持
  2. 增加4G网络的支持,支持模块的型号为:Quectel EC20
  3. 增加Android硬件访问库FriendlyThing,用于在Android下编程访问各种硬件资源,比如Uart, SPI, I2C, GPIO等
  4. 优化内核配置提升PCIe性能,连接NVME SSD会有较大幅度的性能提升
  5. 集成Google Play应用商店
  6. 改进摄像头的底层支持,使之能自动适应竖屏(HD702E)和横屏(HDMI)
  7. 修复Android8下接NVME SSD时分区表异常以及Android8无法启动的问题
  • Android 7.1更新如下:
  1. 增加4G网络的支持,支持模块的型号为:Quectel EC20
  2. 增加Android硬件访问库FriendlyThing,用于在Android下编程访问各种硬件资源,比如Uart, SPI, I2C, GPIO等
  3. 优化内核配置提升PCIe性能,连接NVME SSD会有较大幅度的性能提升
  4. 改进摄像头的底层支持,使之能自动适应竖屏(HD702E)和横屏(HDMI)
  5. 修复Android8下接NVME SSD时分区表异常以及Android8无法启动的问题
  • FriendlyCore和FriendlyDesktop更新如下:
  1. 增加OV13850摄像头的支持,提供支持ISP的gsteamer插件
  2. 增加WiringPi的支持,用于C语言编程访问GPIO等硬件资源
  3. 增加WiringPi-Python的支持,用于Python编程访问GPIO等硬件资源
  4. 优化内核配置提升PCIe性能,连接NVME SSD会有较大幅度的性能提升

25.47 日期 2018-09-21

  • 增加一款eDP屏的支持
  • Linux启用了PCI-E转Sata 功能 (AHCI SATA support)
  • Linux下的SquashFS启用了LZO/XZ/ZSTD压缩支持

25.48 日期 2018-09-05

  • 增加新OS: Android 8.1, 主要特性如下:
  1. 支持同时接2个CAM1320 (OV13850),可选择切换前后摄像头使用
  2. 支持USB摄像头 (1路, 不能与CAM1320同时使用)
  3. 支持AndroidNN GPU 加速方案,可为采用AndroidNN API开发的 AI 相关应用提供通用加速支持
  4. 集成了Rockchip官方提供的Tensorflow Lite物品识别Demo: TfLiteCameraDemo (启动前须先连接CAM1320或USB摄像头)
  5. 集成Lightning为缺省浏览器应用 (注:Android官方缺省不提供Browser应用)
  6. 支持RC-100红外遥控器,支持下拉通知栏、截屏
  7. 支持Android全盘加密功能,system分区已启用Verity特性,使用adb时,可通过adb root; adb disable-verity命令禁止Verity
  8. 支持MTP功能,在连接Type-C后,可进入Settings -> Connected devices -> USB 选择相应功能
  9. 内核版本升级到 4.4.126
  10. 更新AOSP源码到版本 android-8.1.0_r41,并更新8月份安全补丁
  • FriendlyCore 增加Qt双摄像头示例程序:示例位于/opt/dual-camera目录,通过run.sh运行 (启动前须先连接两个USB摄像头,建议使用罗技C270或罗技C922摄像头)

  • FriendlyDesktop 默认设置HDMI分辨率为 1080P

25.49 2018-08-20

  • 增加新的桌面OS:FriendlyDesktop 18.04 for RK3399,主要特性
  1. 带X桌面 LXDE,基于64位Ubuntu 18.04系统构建,支持OpenGL ES加速,支持硬解播放
  2. 支持SD卡启动运行,支持TF卡刷机或Type-C刷机
  3. 完全保留FriendlyCore 18.04 for RK3399的特性,集成带GPU和VPU加速的Qt 5.10.0
  4. 内置开源硬解的4K视频播放器 QtVideoPlayer(Menu->Sound & Video->Qt5-VideoPlayer)
  5. 内置 QtCreator IDE,Arduino 和 Scratch等流行开发和学习工具,开箱即用
  6. 支持双屏异显 (可选择eDP/DP/HDMI 任意两路同时输出)
  7. 支持eDP电容触摸屏 (HD702E)
  8. 支持屏幕旋转 (仅限于eDP)
  9. 支持AP6356S无线模块 (802.11 a/b/g/n/AC,BLE4.0)
  10. 支持升兆以太网即插即用
  11. 支持 OpenCV 3.4 一键安装 (详见https://github.com/friendlyarm/install-opencv-on-friendlycore)
  12. 内置gcc版本:7.3.0
  13. 内核版本:4.4.138
    附下载链接:http://dl.friendlyelec.com/nanopct4

25.50 2018-08-02

  • 增加可以直接从SD卡启动的FriendlyCore和Lubuntu固件

25.51 2018-07-28

  • 修正FriendlyCore中的一处可能会影响CPU降频的问题

25.52 2018-07-27

  • Android增加UART4支持并集成了串口demo,内核增加常见USB串口支持

25.53 2018-07-19

  • 增加新的OS:FriendlyCore (based on ubuntu-core with Qt),主要特性
  1. 基于最新版本的 Ubuntu 18.04 构建
  2. 集成Qt 5.10.0,支持OpenGL ES加速,支持硬解播放,支持KMS双屏异显和WebGL和VNC远程控制
  3. 集成 Xorg最小系统,以最轻量的方式运行X11应用
  4. 集成带VPU加速的Gstreamer 1.0 多媒体框架
  5. 支持7寸电容屏HD702
  6. 5G WIFI 和 蓝牙4.0
  • 内核修复连接HDMI 2.0设备时的core dump问题
  • Linux内核合并了原厂release-4.4的更新,版本为4.4.132
  • EFlasher更新: 增加eMMC备份与还原功能

25.54 2018-06-20

  • Android 支持HDMI与LCD屏幕旋转
  • Android 增加 摇控器支持
  • Lubuntu 内核默认启用 UART4,应用程序可通过设备名 ttyS4 访问
  • 改进了 HDMI 与 eDP屏的用户体验

Overview

Front

Back

Front

Back

外壳

外壳

外壳

外壳

NanoPi R4S Layout

NanoPi R4S Layout

1 介绍

  • NanoPi R4S(以下简称R4S)是友善电子团队最新推出的一款实现满速率双千兆的、完全开源的开发板。
  • NanoPi R4S 使用RK3399 CPU,有两个千兆网口和两个USB3.0接口,最大4G DDR4内存,友善电子团队为NanoPi R4S专门移植了OpenWrt系统,支持Docker CE, 完全开源,用于企业物联网二次开发,个人定制NAS等。

2 NanoPi R4S资源特性

  • SoC: Rockchip RK3399
    • CPU: big.LITTLE,Dual-Core Cortex-A72(up to 2.0GHz) + Quad-Core Cortex-A53(up to 1.5GHz)
    • GPU: Mali-T864 GPU,supports OpenGL ES1.1/2.0/3.0/3.1, OpenCL, DX11, and AFBC
    • VPU: 4K VP9 and 4K 10bits H265/H264 60fps decoding, Dual VOP, etc
  • PMU: RK808-D PMIC, cooperated with independent DC/DC, enabling DVFS, software power-down, RTC wake-up, system sleep mode
  • RAM: 1GB DDR3/4GB LPDDR4
  • Flash: no Onboard eMMC
  • Ethernet: one Native Gigabit Ethernet, and one PCIe Gigabit Ethernet
  • USB: two USB 3.0 Type-A ports
  • Pin header extension interface
    • 2x5-pin header: SPI x 1, I2C x 1
    • 4-pin header: USB 2.0
  • microSD Slot x 1
  • Debug: one Debug UART, 3 Pin 2.54mm header, 3V level, 1500000bps
  • LEDs: 1 x power LED and 3 x GPIO Controlled LED (SYS, LAN, WAN)
  • others:
    • 2 Pin 1.27/1.25mm RTC battery input connector
    • one User Button
    • one 5V Fan connector
  • Power supply: DC 5V/3A, via USB-C connector or Pin header
  • PCB: 8 Layer, 66 mm x 66 mm
  • Temperature measuring range: 0℃ to 80℃

3 接口布局和尺寸

3.1 接口布局

  • 2x5-pin header
Pin# Assignment Pin# Assignment
1 VDD_5V 2 VDD_3.3V
3 VDD_5V 4 GPIO4_C0/I2C3_SDA(3V)
5 GND 6 GPIO4_C1/I2C3_SCL(3V)
7 GPIO1_B1/SPI1_CLK 8 GPIO1_B0/SPI1_TXD/UART4-TX
9 GPIO1_B2/SPI1_CSn 10 GPIO1_A7/SPI1_RXD/UART4-RX
  • 4-pin header
1 2 3 4
VDD_5V USB_DM USB_DP GND
  • Debug UART Pin Spec
    3V level signals, 1500000bps
Pin# Assignment Description
1 GND 0V
2 UART2DBG_TX output
3 UART2DBG_RX intput
  • USB Port
    Each USB 3.0 port has 2A overcurrent protection.

  • RTC
    RTC backup current is 27uA.
    Connector P/N: Molex 53398-0271
    Notes
    1.Power Input : 5V/3A, via USB Type-C(USB PD Specification is not supported) or Pin1&Pin2 of the 2x5-pin header

3.2 R4S标准版和企业版的区别

R4S【企业版】内置一颗具有全球唯一MAC地址的EEPROM芯片(型号:24AA025E48T),该MAC地址永久存在,且无法被修改。
R4S【标准版】不带此芯片,但会根据其他硬件ID由软件自动生成一个MAC地址。除此之外,其他完全相同。

【标准版】不带全球唯一MAC地址芯片,【企业版】带全球唯一MAC地址芯片,【标准版】和【企业版】均使用同样的网卡芯片(RealTek RTL8211E 和R8111H),详细信息请查看下方硬件配置说明。个人用户可选择【标准版】,企业用户推荐选择【企业版】

小知识:大部分开发板产品如树莓派3B都采用软件生成的MAC地址, 这对网络通讯功能和速度没有影响;独立固定的MAC地址在复杂的网络环境中兼容性更好,更利于集团企业管理多个设备,比如绑定IP地址等。

MAC地址芯片在开发板上的位置如下:
R4S MACchip.jpg

NanoPi-R4S【企业版】拥有一个全球唯一的MAC地址,默认分配给CPU内置的以太网卡(rtl8211e),接口名为eth0,该以太网口在PCB上的标注为LAN2,在外壳标注为WAN,在FriendlyWrt系统下默认已分配给WAN口。
可在FriendlyWrt网页首页查看MAC地址:
enter description here

在命令行查看:
enter description here

如何确定一个地址是否是全球唯一的MAC地址:

  • 查看地址的第一个字节,如果bit 2为1则表示此地址仅在本地使用,非全球唯一。

4 快速入门
4.1 准备工作
要开启你的NanoPi R4S新玩具,请先准备好以下硬件

  • NanoPi R4S主板
  • MicroSD卡/TF卡: Class10或以上的 8GB SDHC卡
  • 一个USB Type-C接口的外接电源,建议使用传统5V/3A及以上的电源适配器(注:部分QC/PD快速充电器可能存在兼容性问题),可选用以下或类拟规格的电源适配器:
  • 5V 4A Power Adapter
  • 如果需要开发与编译,则需要一台可以联网的电脑,推荐安装Ubuntu 20.04 64位系统,并使用下面的脚本初始化开发环境, 也可以使用Docker容器:
  • How to setup the Compiling Environment on Ubuntu bionic
  • docker-cross-compiler-novnc
    4.2 经测试可选用的TF卡
    请参考: TF Cards We Tested

制作启动TF卡时,建议Class10或以上的 8GB SDHC卡。以下是经友善电子测试验证过的高速TF卡:

  • SanDisk闪迪 32GB TF(MicroSD)存储卡 U3 C10 A1 V30 4K 至尊超极速移动版内存卡 (开发者推荐)

SanDiskExtremePro

  • SanDisk闪迪32GB TF(MicroSD)存储卡 行车记录仪&安防监控专用内存卡 (长时间运行推荐)

SanDiskHighEndurance

  • SanDisk闪迪 TF 8G Class10 microSD 高速 TF卡:

SanDisk microSD 8G

  • SanDisk闪迪 TF 128G 至尊高速 Class10 microSDXC TF 128G 48MB/S:

SanDisk microSD 128G

  • 川宇 8G手机内存卡 TF 8G 卡存储卡 C10 高速 Class10 microSD卡:

chuanyu microSD 8G

4.3 调试串口参数配置
使用以下串口参数:

波特率 1500000
数据位 8
奇偶校验 None
停止位 1
流控制 None

4.4 安装系统

4.4.1 下载系统固件

4.4.2 通过TF卡运行系统

访问此处的下载地址下载需要的固件文件(位于”01_系统固件/01_SD卡固件”目录)和烧写工具(位于”05_工具软件”目录):

| 固件文件 |

rk3399-sd-friendlywrt-24.10-YYYYMMDD.img.gz FriendlyWrt系统固件,基于OpenWrt 24.10构建,内核版本 6.6.y
rk3399-sd-friendlywrt-24.10-docker-YYYYMMDD.img.gz 预装了Docker的FriendlyWrt系统固件,基于OpenWrt 24.10构建,内核版本 6.6.y
rk3399-sd-friendlywrt-23.05-YYYYMMDD.img.gz FriendlyWrt系统固件,基于OpenWrt 23.05构建,内核版本 6.6.y
rk3399-sd-friendlywrt-23.05-docker-YYYYMMDD.img.gz 预装了Docker的FriendlyWrt系统固件,基于OpenWrt 23.05构建,内核版本 6.6.y
rk3399-sd-ubuntu-noble-core-arm64-4.19-YYYYMMDD.img.gz Ubuntu24.04 精简版固件,没有桌面, 仅命令行,内核版本 4.19
rk3399-sd-debian-bookworm-core-4.19-arm64-YYYYMMDD.img.gz Debian12 精简版固件,没有桌面, 仅命令行,内核版本 4.19
rk3399-sd-debian-bullseye-minimal-4.19-arm64-YYYYMMDD.img.gz Debian11 系统固件,LXDE桌面, 不预装推荐软件包, 支持GPU/VPU硬件加速,内核版本 4.19.y
rk3399-sd-debian-bullseye-desktop-4.19-arm64-YYYYMMDD.img.gz Debian11 完整版固件,LXDE桌面, 预装推荐软件包, 支持GPU/VPU硬件加速,内核版本 4.19.y
其他固件
FriendlyWrt (在线编译) FriendlyWrt
Alpine-Linux (在线编译) Alpine-Linux
Flash Utility:
win32diskimager.rar Windows utility. Under Linux users can use “dd”

详细操作步骤如下:

  • 准备一张8G或以上容量的TF卡;
  • 下载并解压镜像文件 xxx.img.gz 和工具 win32diskimager;
  • 在Windows下以管理员身份运行 win32diskimager,在界面上选择你的SD卡盘符,选择解压后的固件文件,点击 Write 按钮烧写到SD卡; 或者在 Linux下使用 dd 命令将 rkXXXX-sd-OSNAME-YYYYMMDD.img 写入 SD卡;
  • 将SD卡从电脑端弹出,插入NanoPi-R4S的microSD卡槽;
  • 连接NanoPi-R4S的电源,系统会从TF卡启动;

5 FriendlyWrt的使用

5.1 FriendlyWrt简介

FriendlyWrt是友善电子基于OpenWrt定制的系统,完全开源,用于企业物联网二次开发,个人定制NAS等。

5.2 首次开机的初始化

首次上电开机,系统需要做以下一些初始化工作:
1)扩展根文件系统
2)初始化设置(会执行/root/setup.sh)
所以第一次开机需要等待片刻(约2~3分钟),再对FriendlyWrt进行设置,可以在openwrt网页上进入ttyd终端,当提示符显示为 root@FriendlyWrt 表示系统已经初始化完成。

root@FriendlyWrt

5.3 帐户与密码

默认的密码是password(某些版本是空密码),请设置或更改一个较安全的密码用于web登录与ssh登录,建议在将NanoPi-R4S连接到互联网之前完成此设置。

5.4 登录FriendlyWrt

将电脑连接到 NanoPi-R4S 的LAN口,如果电脑没有网口,可将无线AP的LAN口与NanoPi-R4S的LAN口相连接,电脑再通过WiFi连接到无线AP,在电脑浏览器上输入以下网址即可进入FriendlyWrt管理页面:

  • http://friendlywrt/
  • http://192.168.2.1/
  • http://[fd00🆎cd::1]

以上是NanoPi-R4S的LAN口地址,WAN口会从你的主路由器动态获取IP地址。

5.5 建议的安全性设置

以下设置事项非常建议在将 NanoPi-R4S 接入互联网之前完成,因为在空密码或弱密码的状态下将NanoPi-R4S接入互联网,极易受到网络攻击。

  • 设置一个安全的密码

进入 系统->管理权 界面设置密码。

  • 禁止从wan访问ssh,更换端口

进入 系统->管理权->SSH访问,将接口限制为 lan,将端口设置为其他非常用端口,例如 23333。

  • 检查防火墙设置

根据实际情况调整设置

5.6 更改LAN口的IP地址

  1. 菜单栏导航到:”网络” -> “接口”, 点击“LAN”右边的“编辑”按钮;
  2. 在“常规设置”页面上找到“IPv4 地址”, 输入新的IP地址 (例如192.168.11.1), 然后点击“保存”, 再点击“保存并应用”;
  3. 在弹出的“连接更改“询问界面上, 选择”Apply and revert on connectivity loss”;
  4. 稍等片刻, 在电脑的浏览器上输入新的地址登录 FriendlyWrt;

5.7 安全的关机操作

进入”服务”->”终端”,输入poweroff命令敲回车,待led灯熄灭,再拔开电源。

5.8 恢复出厂设置

进入”系统”->”备份/升级”,点击“执行重置“按钮,在弹出的询问界面上点击“确定”,设备会重启并擦除data分区, 所有的设置和数据都会被清除, 并恢复至出厂时的状态。
恢复出厂设置也可以通过命令行来操作, 进入“服务”-》“终端”界面, 输入如下命令:

firstboot && reboot

5.9 安装软件包

5.9.1 设置第三方软件源

进入菜单”系统“-》”软件包“, 在界面上点击”okpg配置“按钮, 在新弹出的界面上, 更改/etc/opkg/distfeeds.conf的文件内容即可,
比如要切换至国内腾讯源, 可以替换成如下内容, 然后点击 “保存” 按钮:

src/gz openwrt_base https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/23.05.5/packages/aarch64_cortex-a53/base
src/gz openwrt_luci https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/23.05.5/packages/aarch64_cortex-a53/luci
src/gz openwrt_packages https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/23.05.5/packages/aarch64_cortex-a53/packages
src/gz openwrt_routing https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/23.05.5/packages/aarch64_cortex-a53/routing
src/gz openwrt_telephony https://mirrors.tuna.tsinghua.edu.cn/openwrt/releases/23.05.5/packages/aarch64_cortex-a53/telephony
src/gz friendlywrt_packages file://opt/packages
  • 注意, friendlywrt_packages需要保留, 否则会缺少一些系统依赖;
  • 如果你使用的是 friendlywrt 24.10 的固件, 则将上面的 23.05.5 替换成 24.10.0;
  • CPU架构可选择 aarch64_cortex-a53和aarch64_generic这两种;
  • 通过命令行切换国内源:
sed -i -e 's/downloads.openwrt.org/mirrors.cloud.tencent.com/g' /etc/opkg/distfeeds.conf
opkg update

5.9.2 在线安装软件包

回到”软件包“界面, 点击 “更新列表” 更新软件包信息, 更新完成后, 就可以在“筛选器”一栏中输入软件包的关键字, 搜索软件包安装了。

5.9.3 安装离线ipk软件包

在”软件包“界面上点击“上传软件包“, 定位你本地的ipk文件, 上传并安装即可。

5.10 FriendlyWrt的一些常见问题

  • 无法拨号上网
    • 进入“网络“->“防火墙“,将 “WAN区域“ 的“入站数据“,“出站数据“与“转发“均设置为 “接受”;
    • 如仍无法上网,可尝试关闭IPV6;
  • 拨号成功,但没有外网流量
    • 进入”服务”->”终端”,输入fw4 reload尝试重新加载一次防火墙设置;
  • 无法开机,LED灯不亮
    • 尝试更换电源适配器和电缆,推荐使用 5V/2A 以上规格的电源供应;
    • 注意,部分Type-C接口的快速充电器会有延迟,可能需要几秒钟才开始提供电量;
  • 做二级路由时,电脑无法连接互联网
    • 如果你的主网络是IPv4,而NanoPi-R4S工作在IPv6,电脑有可能无法连接互联网,建议关闭IPv6 (本WiKi后面有介绍方法),或将主路由切换到IPv6;
  • 如果你有问题,或有更好的建议,欢迎发送邮件到 techsupport@friendlyarm.com;

5.11 禁用IPv6

要关掉 IPv6,可在ssh终端输入如下命令:

. /root/setup.sh
disable_ipv6
reboot

待NanoPi-R4S重启完毕,电脑也需要重新插拨一下网线(或重启网络端口)以便重新获得IP地址。

5.12 配置用户按键的功能

默认情况下, 用户按键配置成用于重启设备(软重启), 如下所示:

echo 'BTN_1 1 /sbin/reboot' >> /etc/triggerhappy/triggers.d/example.conf

你可以通过更改上面的配置文件改变它的行为.

5.13 配置移远EC20(4G模块)拨号上网

  • 进入“网络“->“接口“;
  • 点击 “WAN6“ 后面的 “删除“, 点击 “保存及应用”;
  • 点击 “WAN“ 后面的 “编辑“,在 “设备“ 下拉选单中选择 “以太网适配器:wwan0”,在“协议”下拉选单中选择“QMI蜂窝”,然后点击“切换协议“;
  • 在“调制解调器设备“下拉选单中选择”/dev/cdc-wdm0“,如果是中国联通,在“APN“中填入3gnet,如果是中国移动则填入cmnet,填写完成后,如下图所示:

enter description here

  • 点击“保存”关闭界面,最后点击下方的“保存并应用”,FriendlyWrt后台会进行拨号上网,拨号成功的状态如下所示:

enter description here

  • 连接到Lan的设备将可以连接互联网,如有WiFi模块,可进入“无线”界面开启无线AP功能,通过无线接入的设备亦可连接到互联网。

5.14 使用USB2LCD查看IP和温度

在终端输入如下命令设置lcd2usb服务开机自动启动:

. /root/setup.sh
init_lcd2usb
poweroff

将USB2LCD模块Plug到 NanoPi-R4S 的USB接口再开机,IP地址和CPU温度将显示在LCD上:

enter description here

5.15 PWM风扇的调节

(注:本章节的内容基于2021/08/31之后发布的固件,内核版本 kernel 5.10.xyz)

  • 当前PWM风扇的默认行为是: 上电开机稍等片刻(约20秒),风扇会先自动旋转约5秒时间,之后的行为,是由内核驱动,根据CPU温度来决定风扇的开关以及转速。

  • 可以通过修改以下脚本:/usr/bin/fa-fancontrol.sh 来更改风扇的行为,例如要修改风扇开始工作时的CPU温度,可以修改以下两行:

echo 50000 > trip_point_3_temp  # 表示CPU温度到达50度时,风扇开始工作在最低转速
echo 55000 > trip_point_4_temp  # 表示CPU温度到达55度时,风扇升至第二档及以上转速运行,并根据CPU降温情况自动调节至最高档(第4档),或降低转速
  • 如果需要调整各个档位的转速,可以修改内核dts文件,并重新编译内核来达到目的,具体的 dts 及修改位置可参考如下commit: https://github.com/friendlyarm/kernel-rockchip/commit/f74ac319f02e2d22cdd33227e7f167e4232809f9

如下如示,cooling-levels 定义了4个档位,0为关闭,最高档的值为255:

	fan: pwm-fan {
 		compatible = "pwm-fan";
-		/* FIXME: adjust leveles for the connected fan */
-		cooling-levels = <0 12 18 255>;
+		cooling-levels = <0 18 102 170 255>;
  • 如你使用的内核版本是 4.19.xyz,此时的风扇是由应用层操作PWM来实现温控的,上述的内容不适用,需要去修改这个脚本:
/usr/bin/fa-fancontrol-direct.sh

5.16 读取EEPROM中的Mac Address

5.16.1 命令行读取

先安装i2c工具, 用如下命令:

opkg install i2c-tools

然后通过如下命令可以读取EEPROM中的Mac Address, 仅适用于有EEPROM芯片的型号:

sudo i2ctransfer -y 2 w1@0x51 0xfa r6

会输出类拟如下格式的Mac Address:

0x68 0x27 0x19 0xa5 0x2d 0xdf

如果命令出错, 则表示没有内建EEPROM芯片.

5.17 如何使用USB WiFi

5.17.1 如何在终端使用命令查询USB无线网卡型号

(1) 点击“服务>ttyd”进入FriendlyWrt的命令行界面

(2) 在开发板没有插入任何USB设备时输入以下命令以查看挂在USB主线上的现有设备

lsusb

(3) 插入USB WiFi,再次输入以下命令

lsusb

可以看到多出一个设备,ID为0BDA:C811

(4) 以“0BDA:C811”或“VID_0BDA&PID_C811”作为关键词在搜索引擎上搜索,搜索结果显示VID_0BDA&PID_C811的对应WIFI芯片为Realtek 8811CU

5.17.2 如何使用USB WiFi作为AP

(1) 把USB WiFi插入NanoPi-R4S的USB端口,推荐使用以下列表中支持AP模式的WiFi芯片模块:
enter description here

注:符合以上WiFi芯片型号并符合以上VID&PID信息的USB无线网卡都可以使用,支持的型号不局限于某个品牌某个型号
(2) 插入USB WiFi后,点击上方菜单栏的“系统>重启”,点击“执行重启”按钮重启NanoPi-R4S

(3) 点击“网络>无线”进入配置无线WiFi界面

(4) 点击“编辑”按钮可编辑WiFi设置

(5) 在“接口配置”中可设置WiFi 模式和SSID等,然后点击到“无线安全”项可修改加密方式和WiFi密码,默认密码为password,设置完成后点击“保存”

(4) 配置完成后使用手机端或电脑端搜索对应SSID的WiFi即可

5.17.3 常见的USB WiFi问题及应对方法

  1. 建议在关机状态下插入usb wifi, 再上电开机,FriendlyWrt会自动生成配置文件 /etc/config/wireless,如果没有生成,通过 ifconfig -a 看看有没有 wlan0,如果没有 wlan0,通常是没有驱动。
  2. 如果 ifconfig -a 能看到 wlan0,但是热点没有正常工作,可以尝试更改 频道 和 国家代号,不合适的国家代号也会导致 WiFi 不工作。
  3. 某些USB WiFi(例如MTK MT7662)默认工作在CD-ROM模式,需要经过usb_modeswitch来进行切换,可以尝试自行添加 usb_modeswitch 配置到以下目录:/etc/usb_modeswitch.d 。

5.17.4 更改系统默认的WiFi热点配置

FriendlyWrt默认会为USB WiFi设置国家、热点名称等参数,目的是尽量的做到即插即用,但这不能保证所有的模块都能兼容此设置,你可以通过修改以下文件,来更改这些行为:

/lib/wifi/mac80211.sh

5.18 玩转Docker应用

5.18.1 Docker使用:安装JellyFin影音服务器

请参考: How to setup JellyFin media system on NanoPi-R2S/zh

1 简介说明

本文详细介绍了如何通过友善官方提供的FriendlyWrt系统,在NanoPi R2S上使用Docker搭建JerryFin影音管理系统,其中包括如何安装使用JellyFin、挂载外部存储设备、通过局域网或下载器Aria2添加影音资源等。

2 在FriendlyWrt下安装JellyFin

(1) 准备一个已烧好FriendlyWrt的NanoPi R2S(或任意H3/RK3399 平台的友善开发板),接上电源和网线,网线接入NanoPi R2S的WAN口;

(2) 在电脑端的浏览器输入 http://friendlywrt/ 或者开发板的IP地址即可进入FriendlyWrt管理页面,默认情况下,LAN口的IP地址为192.168.2.1,WAN会从你的主路由器动态获取IP地址;

enter description here
(3) 点击上方菜单栏的“服务->ttyd”进入命令行界面;
enter description here
enter description here

(4) 输入以下命令安装JellyFin:

创建一个目录用于存放 jellyFin 的配置:

mkdir -p /jellyfin/config

创建一个专门供jellyFin访问的目录,存放影片和视频:

mkdir -p /jellyfin/videos

然后安装JellyFin,请耐心等待安装过程:

docker run --restart=always -d -p 8096:8096 -v /jellyfin/config:/config -v /jellyfin/videos:/videos jellyfin/jellyfin:10.1.0-arm64 -name myjellyfin

主要参数说明:
8096:8096: 指定端口号为 8096,安装完后,可能通过 http://路由器IP:8096 访问jellyFin
/jellyfin/videos: 指定用于存放影片的目录,本地目录为 /jellyfin/videos,在jellyFin界面上可以通过路径 /videos访问到这些影片
enter description here

(5) 等到可再次操作命令行界面时即完成安装,如下图:
enter description here

3 如何使用JellyFin

3.1 挂载外部存储设备

(1) 把移动硬盘连接NanoPi R2S作为外接媒体库,将移动硬盘插入NanoPi R2S的USB接口,在FriendlyWrt中点击“系统->挂载点”进入挂载点设置界面:
enter description here

(2) 在界面下方找到挂载点存储设备设置,点击“添加”按钮:
enter description here
(3) 在弹出的对话框中UUID一栏选中刚刚接入的移动硬盘 /dev/sda1(实际情况请根据自身设备选择,如硬盘有多个分区可能会显示sda1/sda2……等):
enter description here
(4) 在挂载点一栏中使用自定义,填入“/jellyfin/videos”,勾选上方的“已启用”,然后点击“保存”:
enter description here
enter description here
(5) 设置完后点击“系统->重启”重启NanoPi R2S使挂载点生效:
enter description here

(6) 重启后再回到“挂载点”界面可看到“已挂载的文件系统”中显示刚刚挂载的移动硬盘信息,即设置成功(以后需要再新增或删减编辑挂载点都可以在下面的“挂载点”设置中操作):
注:每次操作后都需要重启后才能生效
enter description here

3.2 远程传输文件到挂载的外部存储设备

3.2.1 通过WinSCP添加影音文件

(1)下载安装WinSCP后打开,新建一个连接,主机名填写NanoPi R2S的IP地址,然后填写NanoPi R2S的用户名和密码,默认用户名:root,密码为空,文件协议改为“SCP”,点击“登录”

使用WinSCP可以远程访问NanoPi R2S并传输文件。
WinSCP下载地址:https://winscp.net/eng/download.php
enter description here
(2) 登录后可看到左边是本地的目录,右边是NanoPi R2S的文件目录,打开刚刚新建的目录/jellyfin/videos,把媒件文件拖到右边即可开始传输,等待文件传输完成:
enter description here

3.2.2 通过Windows共享添加影音文件

3.2.2.1 设置Samba网络文件共享

(1)在FriendlyWrt中点击上方菜单栏的“服务->网络共享”
enter description here
(2) 点击底部的“添加”按钮:
enter description here
(3) 填写你要共享目录,这里以设置共享 /jellyfin/videos 目录为例(如目录文件夹有大小写请注意区分),填写完成后点击“保存并应用”:
enter description here

3.2.2.2 在Windows10系统下访问Samba共享

默认情况下,你的Windows10可能没有启动网络发现与共享,请先参考下面这二份文档,对你的Windows10做一些设置:
(1) 启用Samba v1/v2的访问:https://www.windowscentral.com/how-access-files-network-devices-using-smbv1-windows-10
enter description here
(2) 启用网络发现:https://www.dummies.com/computers/operating-systems/windows-10/how-to-enable-network-discovery-and-configure-sharing-options-in-windows-10/
enter description here

具体操作可以百度“Windows10 开启SMBv1” 与 “Win10启用网络发现”了解中文版的设置方法;

设置完成后,在资源管理器的地址栏输入 \friendlywrt 即可访问共享目录, 用户名为root, 密码为password;
enter description here

3.2.3 通过路由器自带的Aria2下载影音文件

(1) 使用 Aria2 之前,需要先设置一个目录专门用于存放 Aria2 下载的文件,这个目录需要 让aria2 用户有读写权限,如果你是挂载外部的硬盘作为下载目录,硬盘建议格式化为 ext4 格式。
下面以 /jellyfin/videos/Disk/download 目录为例,点击上方菜单栏“服务->ttyd”, 输入以下命令创建目录,并设置目录拥有者为 aria2:

mkdir -p /jellyfin/videos/Disk/download
chown aria2:aria2 /jellyfin/videos/Disk/download

enter description here
(2) 点击“服务->Aria2”
enter description here
(3) 勾选“已启用”复选框,将下载目录设置为/jellyfin/videos/Disk/download,然后点击“保存并应用”按钮:
enter description here
(4) 保存完成后,点击 “AriaNg”即可进入 Aria2 前端界面,点击“新建”按钮即可创建下载任务:
enter description here

3.3 为JellyFin添加媒体库

(1) 在浏览器输入NanoPi R2S的IP地址+端口8096 进入JellyFin界面:
如:192.168.1.126:8096
enter description here
(2) 点击右上角的“设置”图标进入控制台:
enter description here
(3) 点击左边的“媒体库”,然后点击“添加媒体库”:
enter description here
(4) 建议打开“显示高级设置”选项,内容类型等选项根据情况选择,勾选“将媒体图像保存到媒体所在文件夹”的话JellyFin会在网上搜索电影封面等信息下载到媒体文件夹中,设置完成后点击“确定”:
enter description here
enter description here
(5) 设置完成后回到“控制台”,可看到“Scan media library”任务,即JellyFin正在扫描媒体库并下载媒体信息,视网络情况而定可能需要几分钟至几十分钟:

enter description here
(6) 扫描完成后返回主界面,可看到媒体库已添加成功:
enter description here

3.4 如何播放影片

3.4.1 在电脑端播放影片

在浏览器中输入NanoPi R2S的IP地址+端口8096 进入JellyFin,点击媒体库中其中一部影片,即可开始播放:
enter description here

3.4.2 在手机端播放影片

(1) 从应用商店下载安装JellyFin APP,打开APP输入NanoPi R2S的IP地址+端口8096登录进入:
enter description here
enter description here
(2) 点击媒体库可看到库中所有影片,点击其中一部影片可查看影片详情:
enter description here
enter description here
enter description here
(2) 点击播放按钮即可观看影片:
enter description here

4 JellyFin下修改和优化影片信息

4.1 修改影片图片

(1) 进入媒体库,发现有些影片的信息显示错误或者封面图片不对:
enter description here
(2) 对封面图片匹配错误的影片可以点击该影片的详情图标,然后点击“修改图片”:
enter description here
enter description here
(3) 点击“搜索”按钮,选择“封面图”,在搜索到的结果中选择喜欢的图片点击下面的“下载”图标即可:
enter description here
enter description here

4.2 使用识别功能匹配影片封面图片

(1) 对于另一部没有封面的“Ghost in the Shell”应该是没有识别出影片,使用“识别”功能尝试解决:
enter description here
(2) 填写影片名字或者IMDb/TMDB 的ID然后点击“搜索”:
enter description here
(3) 在搜索得到的结果中选择对应的影片封面然后点击“确定”:
enter description here
enter description here

4.3 编辑影片信息

(1) 有些影片信息显示有误,可以点击“编辑元数据”然后修改成正确的信息:
enter description here
enter description here
enter description here

5.18.2 Docker使用:安装个人网盘nextcloud

mkdir /nextcloud -p
docker run -d -p 8888:80  --name nextcloud  -v /nextcloud/:/var/www/html/ --restart=always --privileged=true  arm64v8/nextcloud

安装完成后,使用8888端口进行访问。

5.18.3 使用外接硬盘来扩展Docker可用空间

  • 先停止docker服务:
/etc/init.d/dockerd stop
  • 把原来的/opt目录改个名, 建一个空的/opt目录:
mv /opt /opt-old && mkdir /opt
  • 参考章节“8 初始化NVME固态硬盘和USB移动硬盘”, 将你的硬盘格式化为ext4, 然后挂载至 /opt 目录:

enter description here

  • 输入命令 “mount | grep /opt” 确实一下硬盘被正常挂载到 /opt 下:
root@FriendlyWrt:~# mount | grep /opt
/dev/nvme0n1p1 on /opt type ext4 (rw,relatime)
root@FriendlyWrt:~#
  • 把原来 /opt 目录下的文件复制到新的 /opt 目录:
cp -af /opt-old/* /opt/ && rm -rf /opt-old
  • 操作完后, 重启
reboot
  • 重启后, 进入”Docker”->”概览”页面, 查看”Docker根目录”这一行的信息, 可以确认Docke空间已扩容:
    enter description here

5.18.4 Docker的常见问题与解决办法

5.18.4.1 无法访问Docker提供的网络服务

解决办法:

  • 进入 “防火墙” 的设置,把 “转发” 设置成 “接受”;
  • 关闭 ”软件流量分载“;

5.19 挂载smbfs共享资源

mount -t cifs //192.168.1.10/shared /movie -o username=xxx,password=yyy,file_mode=0644

5.20 使用sdk编译软件包

5.20.1 安装编译环境

在64位的Ubuntu (版本18.04+)下载并运行如下脚本: How to setup the Compiling Environment on Ubuntu bionic

5.20.2 在网盘上下载并解压sdk

sdk位于网盘的toolchain目录,解压后,需要先下载feeds软件包:

tar xvf openwrt-sdk-*-rockchip-armv8_gcc-11.2.0_musl.Linux-x86_64.tar.xz
# 路径太长会导致有些包编译出错,所以这里改一下目录名
mv openwrt-sdk-*-rockchip-armv8_gcc-11.2.0_musl.Linux-x86_64 sdk
cd sdk
./scripts/feeds update -a
./scripts/feeds install -a

5.20.3 将软件包编译并打包成ipk文件

此处以mwarning的示例作为演示,下载例子的源代码(共3个分别为example1, example2, example3),并拷到package目录:

git clone https://github.com/mwarning/openwrt-examples.git
cp -rf openwrt-examples/example* package/
rm -rf openwrt-examples/

再通过以下命令进入配置菜单:

make menuconfig

在菜单中选中以下我们要编译的软件包(默认实际上已经选中):

"Utilities" => "example1"
"Utilities" => "example3"
"Network" => "VPN" => "example2"

退出配置菜单的界面,在提示是否保存设置时需要选择Yes,然后执下以下命令,分别编译这三个软件包:

make package/example1/compile V=99
make package/example2/compile V=99
make package/example3/compile V=99

编译成功后,可以在bin目录下找到ipk文件,如下所示:

$ find ./bin -name example*.ipk
./bin/packages/aarch64_generic/base/example3_1.0.0-220420.38257_aarch64_generic.ipk
./bin/packages/aarch64_generic/base/example1_1.0.0-220420.38257_aarch64_generic.ipk
./bin/packages/aarch64_generic/base/example2_1.0.0-220420.38257_aarch64_generic.ipk

5.20.4 将编译生成的ipk安装到NanoPi上

可以用scp命令将ipk文件上传到NanoPi上:

cd ./bin/packages/aarch64_generic/base/
scp example*.ipk root@192.168.2.1:/root/

然后用opkg命令进行安装他们:

cd /root/
opkg install example3_1.0.0-220420.38257_aarch64_generic.ipk
opkg install example1_1.0.0-220420.38257_aarch64_generic.ipk
opkg install example2_1.0.0-220420.38257_aarch64_generic.ipk

5.21 使用 GitHub Actions 编译 FriendlyWrt

项目地址: https://github.com/friendlyarm/Actions-FriendlyWrt

6 FriendlyCore的使用

6.1 FriendlyCore默认帐户

  • 普通用户:
   用户名: pi
   密码: pi
  • Root用户:
   用户名: Root用户:
   密码: fa

6.2 更新软件包

$ sudo apt-get update

6.3 配置网络

6.3.1 设置静态IP地址

默认已将 eth0 配置成 dhcp 自动获取IP地址,要更改配置,可以修改这个文件:

vi /etc/network/interfaces.d/eth0

比如修改成静态IP地址,如下所示:

auto eth0
iface eth0 inet static
    address 192.168.1.231
    netmask 255.255.255.0
    gateway 192.168.1.1

6.3.2 设置DNS

还需要修改如下文件加入DNS的配置:

vi /etc/systemd/resolved.conf

例如设置为192.168.1.1:

[Resolve]
DNS=192.168.1.1

再用以下命令重新启动systemd-resolved服务:

sudo systemctl restart systemd-resolved.service
sudo systemctl enable systemd-resolved.service

6.3.3 设置使用另一个网络接口

要配置另一个网口, 例如eth1,可以在 /etc/network/interfaces.d/ 下复制 eth0 成 eth1,然后编辑eth1, 把其中的eth0改为eth1, 根据需要指定网络配置:

cp /etc/network/interfaces.d/eth0 /etc/network/interfaces.d/eth1
vi /etc/network/interfaces.d/eth1

6.4 连接WiFi

先用以下命令检查一下系统是否有安装Network-Manager:

which nmcli

如果有安装Network-Manager, 则参考此链接的方法连接WiFi: Use NetworkManager to configure network settings/zh, 如果没有安装, 则参考如下方法配置WiFi,
输入以下命令查询一下WiFi的网络接口,wlan开头的就是WiFi:

ifconfig -a

默认情况下是wlan0,在/etc/network/interfaces.d/目录下新建一个与网络接口同名的配置文件 ,以wlan0为例,用vi命令新建以下文件:

sudo vi /etc/network/interfaces.d/wlan0

wlan0文件的内容如下:

auto lo
iface lo inet loopback
auto wlan0
iface wlan0 inet dhcp
wpa-driver wext
wpa-ssid YourWiFiESSID
wpa-ap-scan 1
wpa-proto RSN
wpa-pairwise CCMP
wpa-group CCMP
wpa-key-mgmt WPA-PSK
wpa-psk YourWiFiPassword

其中,YourWiFiESSID和YourWiFiPassword请替换成你要连接的无线AP名称和密码, 保存文件后输入以下命令, 或者重启以应用配置:

sudo systemctl daemon-reload
sudo systemctl restart networking

需要注意的是,如果你的SD卡在多个硬件上运行,WiFi的网络接口可能会被重命名为wlan1, wlan2等,你可以通过清空这个文件的内容并重启让它恢复为默认值:/etc/udev/rules.d/70-persistent-net.rules。

6.4.1 重点支持的WIFI型号

6.4.1.1 M.2 WiFi Module
  • RTL8822CE
6.4.1.2 Usb Dongle
  • RTL8821CU (Vid: 0BDA, Pid: C811) (测试样品:TP-Link TL-WDN5200H)
  • RTL8812AU (Vid: 0BDA, Pid: 8812)
  • MediaTek MT7662 (Vid: 0E8D, Pid: 7612) (测试样品:COMFAST CF-WU782AC V2)

6.5 安装内核头文件

sudo dpkg -i /opt/archives/linux-headers-*.deb

6.6 编译内核头文件安装包

请参考 https://github.com/friendlyarm/sd-fuse_rk3399/blob/kernel-5.15.y/test/test-build-kernel-header-deb.sh

6.7 配置状态灯

先确定一下系统是否已经存在leds初始化的服务:

sudo systemctl status leds

如果已经存在leds服务, 则通过编辑如下文件改变状态灯的默认行为:

/etc/init.d/leds.sh

早期的固件由于没有leds服务, 需要参考以下指南手动配置状态灯, 首先, 设置开机自动加载以下内核模块:

modprobe ledtrig-netdev
echo ledtrig-netdev > /etc/modules-load.d/ledtrig-netdev.conf

下面的脚本代码将状态灯与网卡相关联, 需要加入到开机自动运行的脚本中:

echo netdev > /sys/class/leds/wan_led/trigger
echo eth0 > /sys/class/leds/wan_led/device_name
echo 1 > /sys/class/leds/wan_led/link

echo netdev > /sys/class/leds/lan_led/trigger
echo eth1 > /sys/class/leds/lan_led/device_name
echo 1 > /sys/class/leds/lan_led/link

6.8 删除Qt5及相关文件

在root用户下执行如下命令:

su root
cd /
rm -rf usr/local/Trolltech/Qt-5.10.0-rk64one usr/local/Trolltech/Qt-5.10.0-rk64one-sdk usr/bin/setqt5env* usr/bin/qt5demo etc/qt5
rm -rf opt/{qt5-browser,Qt5_CinematicExperience,qt5-multi-screen-demo,qt5-nmapper,qt5-player,qt5-smarthome,QtE-Demo,qt5-qml-image-viewer,dual-camera}

6.9 读取EEPROM中的Mac Address

6.9.1 命令行读取

先安装i2c工具, 用如下命令:

sudo apt-get update
sudo apt-get install i2c-tools

然后通过如下命令可以读取EEPROM中的Mac Address, 仅适用于有EEPROM芯片的型号:

sudo i2ctransfer -y 2 w1@0x51 0xfa r6

会输出类拟如下格式的Mac Address:

0x68 0x27 0x19 0xa5 0x2d 0xdf

如果命令出错, 则表示没有内建EEPROM芯片.

6.9.2 程序中读取

安装libi2c:

sudo apt-get install libi2c0:arm64
cd /lib/aarch64-linux-gnu/
sudo ln -s libi2c.so.0 libi2c.so

新建源代码getmac.c:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define RK3399_I2C_NUM (2)
#define RK3328_I2C_NUM (0)

int getMacAddressFromEEPROM(int adapter_nr, char* dest, int maxlen) {
    int file;
    char filename[20];
    snprintf(filename, 19, "/dev/i2c-%d", adapter_nr);
    file = open(filename, O_RDWR);
    if (file < 0) {
        return -1;
    }

    int addr = 0x51; /* The I2C address */
    if (ioctl(file, I2C_SLAVE, addr) < 0) {
        close(file);
        return -1;
    }
    unsigned char reg = 0xfa; /* Device register to access */
    unsigned char buf[6] = { 0 };
    int res;
    /* Using SMBus commands */
    res = i2c_smbus_read_i2c_block_data(file, reg, 6, buf);
    close(file);

    if (res < 0) {
        return -1;
    }

    snprintf(dest, maxlen, "%02x:%02x:%02x:%02x:%02x:%02x",
                buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);

    return 0;
}

int main() {
    char mac[50]={0};
    if (getMacAddressFromEEPROM(RK3399_I2C_NUM, mac, sizeof(mac)-1) == 0) {
        printf("macaddress: %s\n", mac);
    } else {
        printf("no eeprom found.\n");
    }
    return 0;
}

编译并运行:

root@FriendlyELEC:~# gcc getmac.c -li2c -o getmac
root@FriendlyELEC:~# ./getmac
macaddress: 68:27:19:a5:2d:df

7 Debian11 桌面系统的使用

7.1 Debian11桌面系统简介

Debian11 Desktop 是一个轻量级的Debian桌面环境,具有如下特点:

  • 桌面环境采用 LXDE, 多种主题可选, 简洁美观, 占用资源少;

  • 提供基于 Mali GPU 的 OpenGL 支持;

  • 支持Rockhip MPP视频硬编和硬解码;

  • 预装基于mpv的Kodi, SMPlayer播放器, 均支持4K视频硬解码;

  • 预装Chromium浏览器, 支持vpu/gpu硬件加速 (视频硬解限h264/mp4格式);

  • 支持安装Plex Server, Docker与wps等应用, 玩法丰富;
    enter description here

7.2 帐户与密码

普通用户:
    用户名: pi
    密码: pi

Root用户:
    默认没有设置root密码,可通过sudo passwd root命令配置root密码

7.3 查看IP地址

由于Debian主机名默认为硬件型号, 所以可以使用ping命令来获得IP地址: ping NanoPi-R4S

7.4 通过ssh登录Debian

使用以下命令:ssh pi@NanoPi-R4S
默认密码为pi

7.5 更新软件包

7.5.1 更换软件源为国内镜像源

sudo sed -i -e 's/deb.debian.org/mirrors.cloud.tencent.com/g' /etc/apt/sources.list
sudo sed -i -e 's/security.debian.org/mirrors.cloud.tencent.com/g' /etc/apt/sources.list
sudo apt update

7.6 安装x11vnc远程桌面

x11vnc是一个VNC服务器, 安装后我们可以不依赖外部的显示设备, 通过网络远程登录Debian桌面。

7.6.1 安装x11vnc

sudo apt-get install x11vnc

7.6.2 设置VNC登录密码

sudo x11vnc -storepasswd /etc/x11vnc.pwd

7.6.3 设置x11vnc在开机时自动启动

新建如下文件:

sudo vi /lib/systemd/system/x11vnc.service

内容如下:

[Unit]
Description=Start x11vnc at startup.
Requires=display-manager.service
After=syslog.target network-online.target
Wants=syslog.target network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -display :0 -forever -loop -noxdamage -repeat -rfbauth /etc/x11vnc.pwd -rfbport 5900 -shared -capslock -nomodtweak
ExecStop=/usr/bin/x11vnc -R stop
Restart=on-failure

[Install]
WantedBy=multi-user.target

设置systemd服务:

sudo systemctl daemon-reload
sudo systemctl enable x11vnc.service
sudo systemctl start x11vnc

问题 x11vnc 进程确实在运行,但连接仍被拒绝。我们需要进行深度排查和修复:

终极解决方案
彻底清理残留进程

1
2
3
sudo systemctl stop x11vnc
sudo pkill -9 x11vnc
sudo rm /tmp/.X11-unix/* # 清理X11临时文件

检查端口占用情况

1
2
sudo lsof -i :5900
sudo netstat -tulnp | grep 5900

如果端口被其他进程占用,执行:

1
sudo kill -9 <PID>  # 替换为占用进程的PID

重建X11认证权限

1
2
3
sudo cp /var/run/lightdm/root/:0 /tmp/x11auth
sudo chmod 644 /tmp/x11auth
xhost +

以调试模式重新启动x11vnc

1
sudo x11vnc -display :0 -auth /tmp/x11auth -forever -shared -rfbauth /etc/x11vnc.pwd -noxdamage -verbose -o /var/log/x11vnc.log

检查关键日志

1
tail -f /var/log/x11vnc.log

重点关注以下错误:
Could not connect to X server → X11配置问题
Failed to bind socket → 端口问题
RFB authentication failed → 密码问题

永久修复方案

1
sudo nano /etc/systemd/system/x11vnc.service

使用以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=x11vnc service
After=display-manager.service
Requires=display-manager.service

[Service]
ExecStartPre=/bin/sh -c 'while [ ! -f /var/run/lightdm/root/:0 ]; do sleep 1; done'
ExecStart=/usr/bin/x11vnc -display :0 -auth /var/run/lightdm/root/:0 -forever -loop -noxdamage -shared -rfbauth /etc/x11vnc.pwd -rfbport 5900 -o /var/log/x11vnc.log
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

应用配置并测试

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable --now x11vnc
sudo systemctl status x11vnc

7.6.4 测试远程桌面

在电脑上启动VNC客户端软件, 在地址栏输入: IP地址:5900 连接即可, 效果如下图所示, 图中设备IP地址为192.168.1.123, 使用端口5900进行连接:
enter description here

7.7 安装内核头文件

sudo dpkg -i /opt/archives/linux-headers-*.deb

测试编译内核模块:

sudo apt update
sudo apt install git gcc make bc
git clone https://github.com/RinCat/RTL88x2BU-Linux-Driver.git
cd RTL88x2BU-Linux-Driver
make -j$(nproc)
sudo make install
sudo modprobe 88x2bu

7.8 更改时区

7.8.1 检查当前时区

timedatectl

7.8.2 列出所有时区

timedatectl list-timezones

7.8.3 设置时区 (比如上海)

sudo timedatectl set-timezone Asia/Shanghai

7.9 更换开机LOGO和桌面墙纸

替换内核下面的两个文件,重新编译内核:
kernel/logo.bmp
kernel/logo_kernel.bmp
或者使用脚本来操作,如下所示:

  • 下载脚本
git clone https://github.com/friendlyarm/sd-fuse_rk3399.git -b kernel-4.19 --single-branch
cd sd-fuse_rk3399
  • 编译内核并重新打包固件
convert files/logo.jpg -type truecolor /tmp/logo.bmp
convert files/logo.jpg -type truecolor /tmp/logo_kernel.bmp
sudo LOGO=/tmp/logo.bmp KERNEL_LOGO=/tmp/logo_kernel.bmp ./build-kernel.sh debian-bullseye-desktop-arm64
sudo ./mk-sd-image.sh debian-bullseye-desktop-arm64
sudo ./mk-emmc-image.sh debian-bullseye-desktop-arm64

注: 如果你的系统不是debian-bullseye-desktop-arm64,请根据实际情况指定

7.9.2 更换桌面墙纸

修改如下配置文件:

/home/pi/.config/pcmanfm/LXDE/desktop-items-0.conf

7.9.3 恢复出厂设置

在终端上执行如下命令:

sudo firstboot && sudo reboot

7.10 开机自动启动程序(例如Kodi)

把要开机启动的程序的desktop文件放入~/.config/autostart/目录即可,例如:

mkdir ~/.config/autostart/
cp /usr/share/applications/kodi.desktop ~/.config/autostart/

7.11 取消USB存储设备自动挂载

sudo systemctl mask udisks2
sudo reboot

7.12 设置中文语言与输入法

7.12.1 设置中文语言

输入以下命令,用空格选中 ‘zh_CN.UTF-8’

sudo dpkg-reconfigure locales

添加环境变量到 .bashrc:

echo "export LC_ALL=zh_CN.UTF-8" >> ~/.bashrc
echo "export LANG=zh_CN.UTF-8" >> ~/.bashrc
echo "export LANGUAGE=zh_CN.UTF-8" >> ~/.bashrc

重启确认一下设置是否生效:

sudo reboot

7.12.2 安装中文输入法

输入如下命令安装fcitx和拼音输入法:

sudo apt update
sudo apt-get install fcitx fcitx-pinyin
sudo apt-get install im-config
sudo apt-get install fcitx-table*
sudo apt-get install fcitx-ui-classic fcitx-ui-light
sudo apt-get install fcitx-frontend-gtk2 fcitx-frontend-gtk3 fcitx-frontend-qt4
sudo apt-get remove --purge scim* ibus*
sudo reboot

重启后, 按Ctrl+Space即可切换中英文输入法, 右上角也出现了输入法图标, 右击右上角的输入法图标, 在弹出菜单中可以切换输入法, 如下图所示:
enter description here

7.13 安装Plex多媒体服务器

访问 Plex官网的如下地址: https://www.plex.tv/media-server-downloads/

在下载页面上, 选择 ”Plex Media Server” 分类, 平台选择 ”Linux“, 版本选择 “Ubuntu(16.04+)/Debian(8+) - ARMv8”,
下载得到deb包后, 使用 dpkg 命令安装软件包即可:

sudo dpkg -i plexmediaserver_1.31.0.6654-02189b09f_arm64.deb

安装完成后, 在电脑浏览器上输入以下地址登录Plex服务器后台: http://IP地址:32400/web/

7.14 在Debian系统上安装Docker

请参考此链接: How to Install Docker on Debian/zh

1 本文适应范围

  • 支持的平台: RK3328/RK3399/RK3568/RK3588

  • 支持的目标板操作系统: Debian 11, Debian 12

2 安装前的检查和准备

Docker现在推荐使用的存储驱动是Overlay2, 而由于根文件系统已经使用了OverlayFS, 所以可能无法直接安装,需要对分区作些调整,有如下几种方法, 下面将分别介绍, 请根据需要选择其中一种:

方法1
让根文件系统不再使用OverlayFS, 最省事,但由于”恢复出厂设置”这个功能需要依赖OverlayFS,所以此功能将无法工作;
方法2
创建一个额外的分区用来挂载/var/lib/docker目录, 需要预先规划好分区大小;
方法3
将/var/lib/docker目录挂载到例如U盘和M.2 SSD这样的外置存储设备上,存储设备需要格式化为ext4格式, 本文主要讨论上面两种;

注意事项:

  • 此操作会擦除用户数据,需要预先备份好数据

  • 需要将固件更新至2023/03/14或之后的版本,或者单独更新boot.img

  • 命令中出现的/dev/mmcblkX设备节点是虚构的节点,需要改成真实的设备,eMMC的设备节点是/dev/mmcblk2,TF卡的设备节点是/dev/mmcblk0

3 方法1: 让根文件系统不使用OverlayFS

  • 写特定内容到 /.init_wipedata 后重启
sudo passwd root  # 为root用户创建密码,如果之前没有做
su - root -c 'echo "overlayfs=disable" > /.init_wipedata'
sudo reboot
  • 重启后,使用parted命令查看当前的分区布局,正常情况下,可以看到根系统是以ext4格式挂载的,而不是之前的overlay:
sudo apt update
sudo apt install parted
export DEV=/dev/mmcblkX # 需要改成真实的设备
sudo parted -s ${DEV} unit MiB print

4 方法2: 创建一个额外的分区用于docker

  • 查看当前的分区布局
sudo apt update
sudo apt install parted fdisk
export DEV=/dev/mmcblkX # 需要改成真实的设备
sudo parted -s ${DEV} unit MiB print
  • 调整userdata分区的大小

这里以调整为8G大小为例:

sudo passwd root  # 为root用户创建密码,如果之前没有做
su - root -c 'echo "overlayfs=enable userdata=8096" > /.init_wipedata'
sudo reboot

重启后, 正常情况下,可以看到userdata分区已调整为8GB:

export DEV=/dev/mmcblkX  # 需要改成真实的设备
sudo parted -s ${DEV} unit MiB print
  • 创建新分区并格式化
(echo n; echo ""; echo ""; echo ""; echo w) | sudo fdisk ${DEV}
NUM=$(sudo parted ${DEV} print | awk 'NF > 1 {p = $1} END {print p}')  # 获取最后一个分区的序号
sudo mkfs.ext4 ${DEV}p${NUM}
  • 挂载新分区到docker数据目录
sudo mkdir /var/lib/docker
sudo blkid ${DEV}p${NUM}
# 记下UUID
# 配置开机自动挂载新创建的分区
sudo vi /etc/fstab
# 在文件末尾加入如下内容(其中UUID需替换为真实的)
UUID=bbb06fe1-df52-4c7c-b2eb-926b14605fe4 /var/lib/docker ext4 suid,dev,exec,auto,nouser,async,noatime,nofail 0 0
# 输入以下命令挂载分区
sudo mount /var/lib/docker

5 安装docker

  • 因Docker安装程序需要使用iptables, 而Debian默认使用的是nftables, 因此安装前先设置Debian使用传统的iptables:
[ -f /usr/sbin/iptables-legacy ] && sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
[ -f /usr/sbin/ip6tables-legacy ] && sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
  • 开始安装Docker:
sudo apt install lsb-release wget
codename=$(lsb_release -c | awk '{print $2}')
version=$(lsb_release -sr | cut -d'.' -f1)
wget https://download.docker.com/linux/debian/dists/${codename}/pool/stable/arm64/containerd.io_1.7.25-1_arm64.deb
wget https://download.docker.com/linux/debian/dists/${codename}/pool/stable/arm64/docker-ce-cli_28.0.1-1~debian.${version}~${codename}_arm64.deb
wget https://download.docker.com/linux/debian/dists/${codename}/pool/stable/arm64/docker-buildx-plugin_0.21.1-1~debian.${version}~${codename}_arm64.deb
wget https://download.docker.com/linux/debian/dists/${codename}/pool/stable/arm64/docker-ce_28.0.1-1~debian.${version}~${codename}_arm64.deb
wget https://download.docker.com/linux/debian/dists/${codename}/pool/stable/arm64/docker-compose-plugin_2.33.1-1~debian.${version}~${codename}_arm64.deb
sudo apt install ./containerd.io_1.7.25-1_arm64.deb \
  ./docker-ce_28.0.1-1~debian.${version}~${codename}_arm64.deb \
  ./docker-ce-cli_28.0.1-1~debian.${version}~${codename}_arm64.deb \
  ./docker-buildx-plugin_0.21.1-1~debian.${version}~${codename}_arm64.deb \
  ./docker-compose-plugin_2.33.1-1~debian.${version}~${codename}_arm64.deb
  • 验证是否安装成功:
sudo docker info
  • 看看Docker是否使用了overlay2存储驱动:
$ sudo docker info | grep storage -i
 Storage Driver: overlay2

6 配置非root用户使用docker

sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo systemctl restart docker
sudo chmod a+rw /var/run/docker.sock

验证是否成功:

docker images

7 测试运行docker映像: 安装nextcloud网盘

mkdir ~/nextcloud -p
docker run -d -p 8888:80  --name nextcloud  -v ~/nextcloud/:/var/www/html/ --restart=always --privileged=true  arm64v8/nextcloud

安装完成后, 在电脑浏览器上访问: http://设备IP地址:8888, 即可查看nextcloud网盘页面。

8 参考资料

https://docs.docker.com/engine/install/debian/#install-from-a-package

7.15 如何测试NPU

请参考此链接: NPU/zh

1 本文简介

本文档将讲述如何使用使用RKNN SDK,以及如何将将Huggingface格式的大语言模型转换成RKLLM格式,并部署到RK3576/RK3588上利用NPU进行硬件加速推理。

2 支持的平台

  • RK3576
    • NanoPi-R76S
    • NanoPi-M5
  • RK3588/RK3588S
    • NanoPC-T6
    • NanoPC-R6S
    • NanoPC-R6C

3 Check NPU driver version

$ sudo cat /sys/kernel/debug/rknpu/version
RKNPU driver: v0.9.8

4 运行RKNN示例程序

4.1 OS

Tested on the following OS:

4.1.1 Debian11 (bullseye)

  • rk3588-sd-debian-bullseye-desktop-6.1-arm64-20250117.img.gz
  • rk3576-sd-debian-bullseye-desktop-6.1-arm64-20250402.img.gz

4.1.2 Ubuntu20 (focal)

  • rk3588-sd-ubuntu-focal-desktop-6.1-arm64-20250117.img.gz
  • rk3576-sd-ubuntu-focal-desktop-6.1-arm64-20250402.img.gz

4.2 Installing RKNN Runtime

cd ~
export GIT_SSL_NO_VERIFY=1
git clone https://github.com/airockchip/rknn-toolkit2.git
cd rknn-toolkit2/rknpu2
sudo cp ./runtime/Linux/librknn_api/aarch64/* /usr/lib
sudo cp ./runtime/Linux/rknn_server/aarch64/usr/bin/* /usr/bin/
sudo cp ./runtime/Linux/librknn_api/include/* /usr/include/

4.3 Check rknn version

$ strings /usr/bin/rknn_server |grep 'build@'
2.3.0 (e80ac5c build@2024-11-07T12:52:53)
rknn_server version: 2.3.0 (e80ac5c build@2024-11-07T12:52:53)
$ strings /usr/lib/librknnrt.so |grep 'librknnrt version:'
librknnrt version: 2.3.0 (c949ad889d@2024-11-07T11:35:33)

4.4 C++示例程序: 编译并运行YOLOv5示例

sudo apt-get update
sudo apt-get install -y gcc g++ make cmake

# fix broken link
cd ~/rknn-toolkit2/rknpu2/examples/3rdparty/mpp/Linux/aarch64
rm -f librockchip_mpp.so librockchip_mpp.so.1
ln -s librockchip_mpp.so.0 librockchip_mpp.so
ln -s librockchip_mpp.so.0 librockchip_mpp.so.1

cd ~/rknn-toolkit2/rknpu2/examples/rknn_yolov5_demo
chmod +x ./build-linux.sh
sudo ln -s /usr/bin/gcc /usr/bin/aarch64-gcc
sudo ln -s /usr/bin/g++ /usr/bin/aarch64-g++
export GCC_COMPILER=aarch64
./build-linux.sh -t rk3588 -a aarch64 -b Release
cd install/rknn_yolov5_demo_Linux
./rknn_yolov5_demo model/RK3588/yolov5s-640-640.rknn model/bus.jpg

Transfer the generated out.jpg to PC to view the result:

scp out.jpg xxx@YourIP:/tmp/

enter description here

4.5 Python示例: Debian11下安装并测试RKNN Toolkit Lite2

4.5.1 Install RKNN Toolkit Lite2

sudo apt-get update
sudo apt-get install -y python3-dev python3-numpy python3-opencv python3-pip
cd ~/rknn-toolkit2
pip3 install ./rknn-toolkit-lite2/packages/rknn_toolkit_lite2-2.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -i https://pypi.tuna.tsinghua.edu.cn/simple/

4.5.2 Run the python example

$ cd ~/rknn-toolkit2/rknn-toolkit-lite2/examples/resnet18/
$ python3 test.py
W rknn-toolkit-lite2 version: 2.3.0
--> Load RKNN model
done
--> Init runtime environment
I RKNN: [06:29:43.602] RKNN Runtime Information, librknnrt version: 2.3.0 (c949ad889d@2024-11-07T11:35:33)
I RKNN: [06:29:43.602] RKNN Driver Information, version: 0.9.8
I RKNN: [06:29:43.602] RKNN Model Information, version: 6, toolkit version: 2.3.0(compiler version: 2.3.0 (c949ad889d@2024-11-07T11:39:30)), target: RKNPU v2, target platform: rk3588, framework name: PyTorch, framework layout: NCHW, model inference type: static_shape
W RKNN: [06:29:43.617] query RKNN_QUERY_INPUT_DYNAMIC_RANGE error, rknn model is static shape type, please export rknn with dynamic_shapes
W Query dynamic range failed. Ret code: RKNN_ERR_MODEL_INVALID. (If it is a static shape RKNN model, please ignore the above warning message.)
done
--> Running model
resnet18
-----TOP 5-----
[812] score:0.999680 class:"space shuttle"
[404] score:0.000249 class:"airliner"
[657] score:0.000013 class:"missile"
[466] score:0.000009 class:"bullet train, bullet"
[895] score:0.000008 class:"warplane, military plane"

done

4.6 Python示例: Ubuntu 20.04 (Focal)下安装并测试RKNN Toolkit Lite2

4.6.1 通过编译源代码安装Python 3.9

sudo apt install build-essential libssl-dev libffi-dev software-properties-common \
    libbz2-dev libncurses-dev libncursesw5-dev libgdbm-dev liblzma-dev libsqlite3-dev \
    tk-dev libgdbm-compat-dev libreadline-dev

wget https://www.python.org/ftp/python/3.9.21/Python-3.9.21.tar.xz
tar -xvf Python-3.9.21.tar.xz
cd Python-3.9.21/
./configure --enable-optimizations
make -j$(nproc)
sudo make install

4.6.2 Install RKNN Toolkit Lite2

python3.9 -m pip install --upgrade pip
python3.9 -m pip install opencv-python

cd ~
[ -d rknn-toolkit2 ] || git clone https://github.com/airockchip/rknn-toolkit2.git \
    --depth 1 -b master
cd rknn-toolkit2
python3.9 -m pip install \
    ./rknn-toolkit-lite2/packages/rknn_toolkit_lite2-2.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl \
    -i https://pypi.tuna.tsinghua.edu.cn/simple/

4.6.3 Run the python example

cd ~/rknn-toolkit2/rknn-toolkit-lite2/examples/resnet18/
python3.9 test.py

output:

W rknn-toolkit-lite2 version: 2.3.0
--> Load RKNN model
done
--> Init runtime environment
I RKNN: [07:08:29.756] RKNN Runtime Information, librknnrt version: 2.3.0 (c949ad889d@2024-11-07T11:35:33)
I RKNN: [07:08:29.757] RKNN Driver Information, version: 0.9.8
I RKNN: [07:08:29.762] RKNN Model Information, version: 6, toolkit version: 2.3.0(compiler version: 2.3.0 (c949ad889d@2024-11-07T11:39:30)), target: RKNPU v2, target platform: rk3588, framework name: PyTorch, framework layout: NCHW, model inference type: static_shape
W RKNN: [07:08:29.814] query RKNN_QUERY_INPUT_DYNAMIC_RANGE error, rknn model is static shape type, please export rknn with dynamic_shapes
W Query dynamic range failed. Ret code: RKNN_ERR_MODEL_INVALID. (If it is a static shape RKNN model, please ignore the above warning message.)
done
--> Running model
resnet18
-----TOP 5-----
[812] score:0.999680 class:"space shuttle"
[404] score:0.000249 class:"airliner"
[657] score:0.000013 class:"missile"
[466] score:0.000009 class:"bullet train, bullet"
[895] score:0.000008 class:"warplane, military plane"

done

5 RKLLM的使用与大语言模型

5.1 目前支持模型

  • InternLM2-1.8B
  • TinyLLAMA-1.1B
  • Qwen2.5-1.5B
  • Qwen2.5-3B
  • DeepSeek-R1-Distill-Qwen-1.5B
  • DeepSeek-R1-Distill-Qwen-7B
  • MiniCPM3-4B
  • Llama-3.2-1B-Instruct
  • Gemma-2B
  • Gemma-2-9B-IT
  • ChatGLM3-6B

以上模型的RKLLM格式文件,可在网盘的如下路径 “09_Other files/RKLLM models” 中找到,网盘链接 http://dl.friendlyelec.com/rk3576。
更新模型支持情况请参考Rockchip官方的列表:https://github.com/airockchip/rknn-llm

5.2 部分模型性能对比

Hardware Model AI Model Parameter size Dtype Performance CPU load NPU load Memory usage
NanoPi TinyLLAMA 1.1B w4a16 Pre filled: 166.61 token/s Reasoning: 17.90 token/s 24% 2*73% 0.58G
NanoPi DeepSeek-R1-Distill-Qwen 1.5B w4a16 Pre filled: 111.84 token/s Reasoning: 11.75 token/s 23% 2*75% 1.01G
NanoPi DeepSeek-R1-Distill-Qwen 7B w4a16 Pre filled: 38.05 token/s Reasoning: 4.12 token/s 18.625% 2*85% 3.76G
NanoPi Qwen2.5 1.5B w4a16 Pre filled: 109.36 token/s Reasoning: 11.23 token/s 20.25% 2*75% 1.01G
NanoPi Qwen2.5 3B w4a16 Pre filled: 70.06 token/s Reasoning: 8.17 token/s 20.875% 2*76% 1.78G
NanoPi InternLM2 1.8B w4a16 Pre filled: 96.08 token/s Reasoning: 11.72 token/s 16.75% 2*79% 1.02G
NanoPi MiniCPM3 4B w4a16 Pre filled: 39.29 token/s Reasoning: 4.11 token/s 25.875% 2*66% 2.34G
NanoPi Llama-3.2-Instruct 1B w4a16 Pre filled: 180.33 token/s Reasoning: 14.51 token/s 17.125% 2*79% 0.87G
NanoPi Llama-3.1-8B 8B w4a16 Pre filled: 36.44 token/s Reasoning: 3.8 token/s 18.875% 2*85% 3.97G
NanoPi Gemma-2 2B w4a16 Pre filled: 93.08 token/s Reasoning: 7.86 token/s 19.875% 2*83% 1.65G
NanoPi Gemma-2 9B w4a16 Pre filled: 25.91 token/s Reasoning: 2.84/s 19.125% 2*80% 5.25G
NanoPi ChatGLM3 6B w4a16 Pre filled: 47.13 token/s Reasoning: 4.03 token/s 19.75% 2*88% 3.04G

5.3 转换模型 (PC端)

需要将Hugging Face格式的大语言模型转换为RKLLM 模型,使其能够在Rockchip NPU平台上加载使用, 转换操作需要在PC端运行,建议使用的操作系统为Ubuntu20.04,可以使用Docker容器。

5.3.1 安装RKLLM-Toolkit

sudo apt-get update
sudo apt-get install -y python3-dev python3-numpy python3-opencv python3-pip
cd ~
git clone https://github.com/airockchip/rknn-llm
cd rknn-llm
git reset 8623edd0559a07e7127876d685f2b7ca8b83590c --hard
pip3 install rkllm-toolkit/packages/rkllm_toolkit-1.1.4-cp38-cp38-linux_x86_64.whl

5.3.2 下载并转换模型

使用git clone命令从Hugging Face站点下载所需模型,并修改test.py指向该模型,最后调用test.py开始模型转换:

cd ~/rknn-llm/rkllm-toolkit/examples/
git lfs install
git clone https://huggingface.co/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
sed -i 's|^modelpath\s*=.*|modelpath = "./DeepSeek-R1-Distill-Qwen-1.5B"|' test.py
sed -i 's|^dataset\s*=.*|dataset = None|' test.py
# 如果CPU不是RK3588,比如是RK3576,还需要进行如下修改:
sed -i "s/target_platform='rk3588'/target_platform='rk3576'/g" test.py
sed -i "s/num_npu_core=3/num_npu_core=2/g" test.py

执行test.py开始转换模型:

python3 test.py

模型转换的输出信息如下:

ubuntu@20de568f4011:~/rknn-llm/rkllm-toolkit/examples$ python3 test.py
INFO: rkllm-toolkit version: 1.1.4
The argument `trust_remote_code` is to be used with Auto classes. It has no effect here and is ignored.
Optimizing model: 100%|██████████████████████████████████████████████████████████████████████████████████████| 28/28 [01:33<00:00,  3.35s/it]
Building model: 100%|█████████████████████████████████████████████████████████████████████████████████████| 399/399 [00:03<00:00, 102.43it/s]
WARNING: The bos token has two ids: 151646 and 151643, please ensure that the bos token ids in config.json and tokenizer_config.json are consistent!
INFO: The token_id of bos is set to 151646
INFO: The token_id of eos is set to 151643
INFO: The token_id of pad is set to 151643
Converting model: 100%|███████████████████████████████████████████████████████████████████████████████| 339/339 [00:00<00:00, 5642337.52it/s]
INFO: Exporting the model, please wait ....
[=================================================>] 597/597 (100%)
INFO: Model has been saved to ./qwen.rkllm!

成功的话会生成文件qwen.rkllm,我们将其改名为DeepSeek-R1-Distill-Qwen-1.5B.rkllm并上传到开发板:

mv qwen.rkllm DeepSeek-R1-Distill-Qwen-1.5B.rkllm
scp DeepSeek-R1-Distill-Qwen-1.5B.rkllm root@NanoPC-T6:/home/pi

5.4 编译运行大模型推理示例 (开发板端)

sudo apt-get update
sudo apt-get install -y gcc g++ make cmake

# get rknn-llm
cd ~
[ -d rknn-llm ] || git clone https://github.com/airockchip/rknn-llm
cd rknn-llm
git reset 8623edd0559a07e7127876d685f2b7ca8b83590c --hard
cd examples/rkllm_api_demo
chmod +x ./build-linux.sh
sed -i 's/^GCC_COMPILER_PATH=.*/GCC_COMPILER_PATH=aarch64-linux-gnu/' ./build-linux.sh
./build-linux.sh

# run llm_demo
cd ./build/build_linux_aarch64_Release/
export LD_LIBRARY_PATH=~/rknn-llm/rkllm-runtime/Linux/librkllm_api/aarch64:$LD_LIBRARY_PATH
ulimit -HSn 10240
# max_new_tokens = 512, max_context_len = 1024
taskset f0 ./llm_demo ~/DeepSeek-R1-Distill-Qwen-1.5B.rkllm 512 1024

运行结果:

rkllm init start
I rkllm: rkllm-runtime version: 1.1.4, rknpu driver version: 0.9.8, platform: RK3588

rkllm init success

**********************可输入以下问题对应序号获取回答/或自定义输入********************

[0] 把下面的现代文翻译成文言文: 到了春风和煦,阳光明媚的时候,湖面平静,没有惊涛骇浪,天色湖光相连,一片碧绿,广阔无际;沙洲上的鸥鸟,时而飞翔,时而停歇,美丽的鱼游来游去,岸上与小洲上的花草,青翠欲滴。
[1] 以咏梅为题目,帮我写一首古诗,要求包含梅花、白雪等元素。
[2] 上联: 江边惯看千帆过
[3] 把这句话翻译成中文: Knowledge can be acquired from many sources. These include books, teachers and practical experience, and each has its own advantages. The knowledge we gain from books and formal education enables us to learn about things that we have no opportunity to experience in daily life. We can also develop our analytical skills and learn how to view and interpret the world around us in different ways. Furthermore, we can learn from the past by reading books. In this way, we won't repeat the mistakes of others and can build on their achievements.
[4] 把这句话翻译成英文: RK3588是新一代高端处理器,具有高算力、低功耗、超强多媒体、丰富数据接口等特点

*************************************************************************

user: 天空为什么是蓝色的?
robot: 这个问题看起来很有趣,但我不太确定。我想知道天空的颜色是什么原因导致的,以及是否有其他因素影响了它的颜色。
首先,我想到的是太阳本身的颜色。太阳看起来像一个红色的东西,对吧?那是不是和天空的颜色有关呢?
然后,我还记得以前学过一点关于大气层的知识,说大气层是透明的,但有一定的折射作用。这可能影响了我们看到的天空颜色。
另外,我还听说过光的反射和折射的一些定律,比如费马原理,可能也与天空的颜色有关。
不过,我还不太确定这些因素是如何相互作用的,以及它们最终导致了天空为什么会是蓝色的。

也许我可以先从太阳本身的颜色开始分析。太阳看起来红色,是因为它发出的光大部分在红光区,而蓝光和绿光被大气层吸收或散射,所以我们看到的是红色。那如果太阳本身是蓝色的话,会不会影响天空的颜色呢?
另外,我还记得有人说过,天空的颜色可能与地球上的天气状况有关,比如阳光是否直射、云的类型等等。
不过,这些信息我还不太确定,需要进一步查证。

总的来说,我觉得天空的颜色是由多种因素共同作用的结果,包括太阳的颜色、大气层的折射和反射、光的反射定律以及天气状况等。但具体来说,为什么天空会是蓝色呢?这可能涉及到光的折射和反射现象,以及地球表面的光线分布。


天空呈现蓝色的原因主要归因于光的折射和反射现象,以及地球表面光线分布的影响。以下是详细的解释:

1. **太阳的颜色**:太阳本身看起来红色,这是因为太阳发出的大部分光在红光区,而蓝光和绿光被大气层吸收或散射,所以我们看到的是红色。

2. **大气层的作用**:
   - 大气层是透明的,但具有折射作用。当阳光穿过大气层时,部分光线会被折射,导致天空呈现蓝色。
   - 这种现象称为“大气折射”或“海市蜃楼效应”。不同颜色的光在不同介质中的折射率不同,导致它们在空气中传播时发生偏折。

3. **光的反射和折射**:
   - 光线在空气中的传播遵循费马原理,即光线会尽可能地快速到达目标。这包括反射和折射。
   - 太阳光穿过大气层后,在地球表面反射,而部分光被折射进入天空,

user:

5.5 有用的资源

  • https://github.com/airockchip/rknn-llm
  • https://github.com/wudingjian/rkllm_chat

6 Doc

https://github.com/rockchip-linux/rknpu2/tree/master/doc

7 Other

7.1 查看NPU占有率

sudo cat /sys/kernel/debug/rknpu/load

7.2 Set NPU freq

echo userspace | sudo tee /sys/class/devfreq/fdab0000.npu/governor > /dev/null
echo 800000000 | sudo tee /sys/class/devfreq/fdab0000.npu/min_freq > /dev/null
echo 1000000000 | sudo tee /sys/class/devfreq/fdab0000.npu/max_freq > /dev/null

7.3 查看NPU频率

cat /sys/class/devfreq/fdab0000.npu/cur_freq

7.16 如何测试VPU

1 How to test VPU
1.1 OS
Tested on the following OS:

1.1.1 Debian11 (bullseye)

  • rk3588-sd-debian-bullseye-desktop-6.1-arm64-20240116.img.gz

  • rk3568-sd-debian-bullseye-desktop-6.1-arm64-20231113.img.gz

1.1.2 Ubuntu20 (focal)

  • rk3588-sd-ubuntu-focal-desktop-6.1-arm64-20240116.img.gz

1.1.3 Buildroot

  • rk3588-sd-buildroot-5.10-arm64-20240117.img.gz

1.2 查看mpp版本

1
2
mpp_info_test
tail /var/log/messages

1.3 测试硬解码

1
2
3
wget http://112.124.9.243/test/200frames_count.h264 -O 200frames_count.h264
mpi_dec_test -t 7 -i 200frames_count.h264
tail /var/log/messages

1.4 测试硬编码
将nv12祼视频流编码成h264:

1
2
3
4
wget http://112.124.9.243/test/4k_nv12.yuv.gz -O 4k_nv12.yuv.gz
gzip -d 4k_nv12.yuv.gz
mpi_enc_test -w 3840 -h 2160 -t 7 -i 4k_nv12.yuv -f 0 -o 4k_nv12.h264
tail /var/log/messages

打包成可播放的mp4文件:

1
ffmpeg -i 4k_nv12.h264 -vcodec copy -f mp4 4k_nv12.mp4

注:上面的视频流文件4k_nv12.yuv是在T6上通过HDMI-In抓取的,命令如下:

1
v4l2-ctl  -d /dev/video0 --set-fmt-video=width=3840,height=2160,pixelformat='NV12' --stream-mmap=4 --stream-skip=10  --stream-to=/tmp/4k_nv12.yuv --stream-count=240 --stream-poll

1.5 Debian/Ubuntu下重新编译mpp(可选)
在开发板上操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sudo apt update
sudo apt install gcc g++ cmake make
cd ~
git clone https://github.com/friendlyarm/mpp
# 或者 git clone https://github.com/rockchip-linux/mpp.git
cd mpp/build/linux/aarch64/
sed -i 's/aarch64-linux-gnu-gcc/gcc/g' ./arm.linux.cross.cmake
sed -i 's/aarch64-linux-gnu-g++/g++/g' ./arm.linux.cross.cmake
./make-Makefiles.bash
make -j$(nproc)
sudo make install
cd test
sudo cp mpp_info_test /usr/local/bin/mpp_info_test
sudo cp mpi_dec_test /usr/local/bin/mpi_dec_test
sudo cp mpi_enc_test /usr/local/bin/mpi_enc_test

1.6 Buildroot下重新编译mpp(可选)
在电脑上操作:

1
2
3
4
5
6
7
export PATH=/path/to/your/buildroot-rk3588/buildroot/output/rockchip_rk3588/host/bin/:$PATH
cd buildroot-rk3588/external/mpp/build/linux/aarch64
sed -i 's/aarch64-linux-gnu-gcc/aarch64-linux-gcc/g' ./arm.linux.cross.cmake
sed -i 's/aarch64-linux-gnu-g++/aarch64-linux-g++/g' ./arm.linux.cross.cmake
./make-Makefiles.bash
make -j$(nproc)
cd test

进入mpp目录,将librockchip_mpp.so.0拷到开发板上:

1
wget http://YourIP/files/mpp/librockchip_mpp.so.0 -O /usr/lib/librockchip_mpp.so.0

进入test目录下,将mpp_info_test,mpi_dec_test,mpi_enc_test拷到开发板上:

1
2
3
wget http://YourIP/files/mpp/mpp_info_test -O /usr/bin/mpp_info_test
wget http://YourIP/files/mpp/mpi_dec_test -O /usr/bin/mpi_dec_test
wget http://YourIP/files/mpp/mpi_enc_test -O /usr/bin/mpi_enc_test

8 Debian10 桌面系统的使用

  • Refer to:

  • Debian Buster

1 Debian10 桌面系统的使用
1.1 Debian10桌面系统简介
Debian10 Desktop 是一个轻量级的Debian桌面环境,具有如下特点:

  • 桌面环境采用 LXDE, 多种主题可选, 简洁美观, 占用资源少;

  • 提供基于 Mali GPU 的 OpenGL 支持;

  • 支持Rockhip MPP视频硬编和硬解码;

  • 预装基于mpv的Kodi, SMPlayer播放器, 均支持4K视频硬解码;

  • 预装Chromium浏览器, 支持vpu/gpu硬件加速 (视频硬解限h264/mp4格式);

  • 支持安装Plex Server, Docker与wps等应用, 玩法丰富;

enter description here

1.2 帐户与密码

普通用户:
    用户名: pi
    密码: pi

Root用户:
    默认没有设置root密码,可通过sudo passwd root命令配置root密码

1.3 查看IP地址

由于Debian主机名默认为硬件型号, 所以可以使用ping命令来获得IP地址: ping NanoPi-R5S

1.4 通过ssh登录Debian

使用以下命令:ssh pi@NanoPi-R5S
默认密码为pi

1.5 更新软件包

1.5.1 更换软件源为国内镜像源

编辑/etc/apt/sources.list替换成以下内容:

1
2
3
4
5
6
7
8
deb http://mirrors.163.com/debian/ buster main non-free contrib
deb http://mirrors.163.com/debian/ buster-updates main non-free contrib
# deb http://mirrors.163.com/debian/ buster-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ buster main non-free contrib
# deb-src http://mirrors.163.com/debian/ buster-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ buster-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ buster/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ buster/updates main non-free contrib

1.5.2 更新软件包列表

$ sudo apt-get update

1.6 安装x11vnc远程桌面

x11vnc是一个VNC服务器, 安装后我们可以不依赖外部的显示设备, 通过网络远程登录Debian桌面。

1.6.1 安装x11vnc

sudo apt-get install x11vnc

1.6.2 设置VNC登录密码

sudo x11vnc -storepasswd /etc/x11vnc.pwd

1.6.3 设置x11vnc在开机时自动启动

新建如下文件:

sudo vi /lib/systemd/system/x11vnc.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=Start x11vnc at startup.
Requires=display-manager.service
After=syslog.target network-online.target
Wants=syslog.target network-online.target
 
[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -display :0 -forever -loop -noxdamage -repeat -rfbauth /etc/x11vnc.pwd -rfbport 5900 -shared -capslock -nomodtweak
ExecStop=/usr/bin/x11vnc -R stop
Restart=on-failure
 
[Install]
WantedBy=multi-user.target

设置systemd服务:

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable x11vnc.service
sudo systemctl start x11vnc

1.6.4 测试远程桌面
在电脑上启动VNC客户端软件, 在地址栏输入: IP地址:5900 连接即可, 效果如下图所示, 图中设备IP地址为192.168.1.123, 使用端口5900进行连接:
enter description here
1.7 安装内核头文件

1
sudo dpkg -i /opt/archives/linux-headers-*.deb

测试编译内核模块:

1
2
3
4
5
6
7
sudo apt update
sudo apt install git gcc make bc
git clone https://github.com/RinCat/RTL88x2BU-Linux-Driver.git
cd RTL88x2BU-Linux-Driver
make -j$(nproc)
sudo make install
sudo modprobe 88x2bu

1.8 更改时区
1.8.1 检查当前时区

1
timedatectl

1.8.2 列出所有时区

1
timedatectl list-timezones

1.8.3 设置时区 (比如上海)

1
sudo timedatectl set-timezone Asia/Shanghai

1.9 更换开机LOGO和桌面墙纸
1.9.1 更换开机LOGO
替换内核下面的两个文件,重新编译内核:

1
2
kernel/logo.bmp
kernel/logo_kernel.bmp

或者使用脚本来操作,如下所示:

  • 下载脚本
1
2
git clone https://github.com/friendlyarm/sd-fuse_rk3568.git -b kernel-6.1.y --single-branch
cd sd-fuse_rk3568
  • 编译内核并重新打包固件
1
2
3
4
5
convert files/logo.jpg -type truecolor /tmp/logo.bmp
convert files/logo.jpg -type truecolor /tmp/logo_kernel.bmp
LOGO=/tmp/logo.bmp KERNEL_LOGO=/tmp/logo_kernel.bmp ./build-kernel.sh debian-buster-desktop-arm64
sudo ./mk-sd-image.sh debian-buster-desktop-arm64
./mk-emmc-image.sh debian-buster-desktop-arm64

注: 如果你的系统不是debian-buster-desktop-arm64,请根据实际情况指定

1.9.2 更换桌面墙纸
修改如下配置文件:

1
/home/pi/.config/pcmanfm/LXDE/desktop-items-0.conf

1.9.3 恢复出厂设置

在终端上执行如下命令:

1
sudo firstboot && sudo reboot

1.10 开机自动启动程序(例如Kodi)
把要开机启动的程序的desktop文件放入~/.config/autostart/目录即可,例如:

1
2
mkdir ~/.config/autostart/
cp /usr/share/applications/kodi.desktop ~/.config/autostart/

1.11 取消USB存储设备自动挂载

1
2
sudo systemctl mask udisks2
sudo reboot

1.12 设置中文语言与输入法

1.12.1 设置中文语言

输入以下命令,用空格选中 ‘zh_CN.UTF-8

1
<pre class="de1">sudo dpkg-reconfigure locales</pre>

添加环境变量到 .bashrc:

1
2
3
echo "export LC_ALL=zh_CN.UTF-8" >> ~/.bashrc
echo "export LANG=zh_CN.UTF-8" >> ~/.bashrc
echo "export LANGUAGE=zh_CN.UTF-8" >> ~/.bashrc

重启确认一下设置是否生效:

1
sudo reboot

1.12.2 安装中文输入法
输入如下命令安装fcitx和拼音输入法:

1
2
3
4
5
6
7
8
sudo apt update
sudo apt-get install fcitx fcitx-pinyin
sudo apt-get install im-config
sudo apt-get install fcitx-table*
sudo apt-get install fcitx-ui-classic fcitx-ui-light
sudo apt-get install fcitx-frontend-gtk2 fcitx-frontend-gtk3 fcitx-frontend-qt4
sudo apt-get remove --purge scim* ibus*
sudo reboot

重启后, 按Ctrl+Space即可切换中英文输入法, 右上角也出现了输入法图标, 右击右上角的输入法图标, 在弹出菜单中可以切换输入法, 如下图所示:
Debian10-chinese-im.png

1.13 安装Plex多媒体服务器

访问 Plex官网的如下地址: https://www.plex.tv/media-server-downloads/
在下载页面上, 选择 ”Plex Media Server” 分类, 平台选择 ”Linux“, 版本选择 “Ubuntu(16.04+)/Debian(8+) - ARMv8”,
下载得到deb包后, 使用 dpkg 命令安装软件包即可:

1
sudo dpkg -i plexmediaserver_1.31.0.6654-02189b09f_arm64.deb

安装完成后, 在电脑浏览器上输入以下地址登录Plex服务器后台: http://IP地址:32400/web/

1.14 在Debian系统上安装Docker

请参考此链接: How to Install Docker on Debian/zh

1.15 设置WiFi无线链接

1.15.1 图形界面操作

点击右上角的网络图标,选择你要连接的WiFi热点,按界面提示操作即可。

1.15.2 命令行操作

请参考 Use NetworkManager to configure network settings/zh

1.16 测试OpenGL ES性能

在系统菜单 System Tools 中点击 Terminator 打开命令行终端,输入以下命令即可测试

1
glmark2-es2

1.17 设置HDMI/DP屏幕分辨率

进入系统菜单 Perferences -> Monitor Settings界面进行设置即可。
推荐分辨率:1920x1080@60Hz

1.18 调节HDMI边界

打开命令行终端,输入命令进行操作,有几个注意事项:

  1. 需要登录桌面才能操作,如果Desktop停留在Login是无法设置的;
  2. 如果你是在 ssh 登录的终端,请使用与桌面登录相同的用户名,默认是 pi,不能使用root用户,同时,你需要赋值 DISPLAY 变量:
export DISPLAY=:0.0

1.18.1 查询显示器支持哪些分辨率

xrandr -q

输出示例:

1
2
3
4
5
6
7
Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 8192 x 8192
eDP-1 disconnected primary (normal left inverted right x axis y axis)
HDMI-1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
1920x1080 60.00*+ 50.00
1280x720 60.00 50.00
720x576 50.00
720x480 59.94

1.18.2 设置分辨率
例如设置为 1920X1080@60Hz:

1
xrandr --output HDMI-1 --mode 1920x1080 --refresh 60

1.18.3 设节HDMI输出边界
For example, the transformation scaling horizontal coordinates by 0.8, vertical coordinates by 1.04 and moving the screen by 35 pixels right and 19 pixels down:

1
xrandr --output HDMI-1 --transform 0.80,0,-35,0,1.04,-19,0,0,1

1.18.4 开机自动调整

编辑~/.config/autostart/lxrandr-autostart.desktop,将完整的xrandr命令写入到Exec=开头的键中,如下所示:

1
2
3
4
5
6
[Desktop Entry]
Type=Application
Name=LXRandR autostart
Comment=Start xrandr with settings done in LXRandR
Exec=sh -c 'xrandr --output HDMI-1 --mode 1920x1080 --refresh 50 --transform 1.04,0,-35,0,1.05,-30,0,0,1'
OnlyShowIn=LXDE

1.19 Chromium网页浏览器
1.19.1 GPU支持情况
系统预装的Chromium网页浏览器已经默认启用硬件加速,支持WebGL,可以通过输入网址 chrome://gpu 了解硬件加速情况,如下图所示:

enter description here

1.19.2 VPU支持情况

在浏览器上播放一个视频,然后在命令行使用fuser查看mpp设备节点的使用情况来确认已经调用了vpu:

1
2
pi@FriendlyElec:~$ fuser /dev/mpp_service
/dev/mpp_service: 3258

如果fuser命令没有内容输出, 则表示当前是软解.
1.19.3 查看支持的硬解格式
在浏览器地址栏输入 about://gpu,翻页到页面最底部,查看 “Video Acceleration Information” 表格;
播放一个视频后,再在浏览器地址栏输入 about://media-internals, 可以查看最近播放的视频是否启用了硬解;

9 Buildroot Linux系统的使用

Buildroot是Linux平台上一个构建嵌入式Linux系统的框架,由Makefile脚本和Kconfig配置文件构成,旨在简化系统制作步骤,可实现一站式生成可烧写的系统固件,最终的固件包含boot-loader、kernel和rootfs,以及rootfs中的各种库和应用程序 (例如qt, gstreamer, busybox等)。

由 FriendlyELEC 提供的 Buildroot 项目是基于Rockchip原厂的 linux-sdk 制作, 项目使用 git 管理,与原厂的linux sdk更新保持同步;

  • Rockchip原厂Buildroot项目: https://github.com/rockchip-linux/buildroot

  • Buildroot官网: https://buildroot.org

关于Buildroot系统更详细的说明,请参考: Buildroot

10 如何编译系统

10.1 搭建编译环境

10.1.1 方法1: 使用Docker进行交叉编译

请参考 docker-cross-compiler-novnc,也可使用网盘 “04_SDK与编译器/docker” 目录下的本地镜像,参考README.md用docker load命令导入即可。

10.1.2 方法2: 本地搭建交叉编译环境

10.1.2.1 安装编译所需软件包

建议使用amd64架构Ubuntu 20.04操作系统,参考如下内容安装编译及打包所需要的软件包:

1
2
3
4
sudo apt-get -y update
sudo apt-get install -y sudo curl
sudo bash -c \
"$(curl -fsSL https://raw.githubusercontent.com/friendlyarm/build-env-on-ubuntu-bionic/master/install.sh)"

对于中国大陆的用户亦可使用以下地址:

1
2
sudo bash -c \
"$(curl -fsSL http://112.124.9.243:3000/friendlyelec/build-env-on-ubuntu-bionic/raw/branch/cn/install.sh)"

你的电脑上会安装好如下交叉编译器:

版本 架构 编译器路径 用途
用途 armhf /opt/FriendlyARM/toolchain/4.9.3 用于编译armhf架构的应用程序
6.4 aarch64 /opt/FriendlyARM/toolchain/6.4-aarch64 用于交叉编译4.4内核
11.3 aarch64 /opt/FriendlyARM/toolchain/11.3-aarch64 用于交叉编译4.19及以上内核(含5.10,6.1)及uboot
10.1.2.2 设置交叉编译器
参考上一节的表格,选用合适版本的编译器,然后将编译器的路径加入到PATH中,例如要使用11.3的交叉编译器,用vi编辑~/.bashrc,在末尾加入以下内容:
1
2
export PATH=/opt/FriendlyARM/toolchain/11.3-aarch64/bin:$PATH
export GCC_COLORS=auto

执行一下~/.bashrc脚本让设置立即在当前shell窗口中生效,注意”.”后面有个空格:

1
. ~/.bashrc

验证是否安装成功:

1
2
3
4
5
6
7
8
9
$ aarch64-linux-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gcc
COLLECT_LTO_WRAPPER=/opt/FriendlyARM/toolchain/11.3-aarch64/libexec/gcc/aarch64-cortexa53-linux-gnu/11.3.0/lto-wrapper
Target: aarch64-cortexa53-linux-gnu
Configured with: /home/cross/arm64/src/gcc/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=aarch64-cortexa53-linux-gnu --prefix=/opt/FriendlyARM/toolchain/11.3-aarch64 --exec_prefix=/opt/FriendlyARM/toolchain/11.3-aarch64 --with-sysroot=/opt/FriendlyARM/toolchain/11.3-aarch64/aarch64-cortexa53-linux-gnu/sysroot --enable-languages=c,c++ --enable-fix-cortex-a53-843419 --with-arch=armv8-a+crypto+crc --with-cpu=cortex-a53 --with-pkgversion=ctng-1.25.0-119g-FA --with-bugurl=http://www.friendlyelec.com/ --enable-objc-gc --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libsanitizer --disable-libmpx --with-gmp=/home/cross/arm64/buildtools --with-mpfr=/home/cross/arm64/buildtools --with-mpc=/home/cross/arm64/buildtools --with-isl=/home/cross/arm64/buildtools --enable-lto --enable-threads=posix --disable-libstdcxx-pch --enable-clocale=gnu --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-indirect-function --enable-gnu-unique-object --enable-default-pie --enable-linker-build-id --with-linker-hash-style=gnu --enable-plugin --enable-gold --with-libintl-prefix=/home/cross/arm64/buildtools --disable-multilib --with-local-prefix=/opt/FriendlyARM/toolchain/11.3-aarch64/aarch64-cortexa53-linux-gnu/sysroot --enable-long-long --enable-checking=release --enable-link-serialization=2
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 11.3.0 (ctng-1.25.0-119g-FA)

10.2 编译 Openwrt/Friendlywrt
10.2.1 下载源代码
FriendlyWrt有两个版本, 请根据需要进行选择.
10.2.1.1 版本FriendlyWrt 24.10

1
2
3
4
5
6
mkdir friendlywrt24-rk3399
cd friendlywrt24-rk3399
git clone https://github.com/friendlyarm/repo --depth 1 tools
tools/repo init -u https://github.com/friendlyarm/friendlywrt_manifests -b master-v24.10 \
-m rk3399.xml --repo-url=https://github.com/friendlyarm/repo --no-clone-bundle
tools/repo sync -c --no-clone-bundle
10.2.1.2 版本FriendlyWrt 23.05
1
2
3
4
5
6
7
mkdir friendlywrt23-rk3399
cd friendlywrt23-rk3399
git clone https://github.com/friendlyarm/repo --depth 1 tools
tools/repo init -u https://github.com/friendlyarm/friendlywrt_manifests -b
master-v23.05 \
-m rk3399.xml --repo-url=https://github.com/friendlyarm/repo --no-clone-bundle
tools/repo sync -c --no-clone-bundle

10.2.2 首次编译
下面的命令是编译不带docker的版本, 如需要编译带docker的版本, 请将rk3399.mk替换为rk3399-docker.mk:

1
./build.sh rk3399.mk

会编译所有组件(包含u-boot, kernel 和 friendlywrt)并生成sd卡镜像文件,再执行以下命令,可生成用于安装系统到emmc运行的镜像文件(eflahser固件):

1
./build.sh emmc-img

对项目进行过修改后, 需要重新打包sd卡镜像, 可执行如下命令:

1
./build.sh sd-img

10.2.3 二次编译

1
2
3
4
5
6
7
cd friendlywrt
make menuconfig #改动FriendlyWrt的配置
rm -rf ./tmp
make -j${nproc}
cd ../
./build.sh sd-img
./build.sh emmc-img

10.2.4 单独编译u-boot

1
./build.sh uboot

10.2.5 单独编译kernel

1
./build.sh kernel

10.2.6 单独编译friendlywrt

1
./build.sh friendlywrt

或者进入friendlywrt目录, 按标准openwrt的命令操作, 上面的命令出现错误时, 可尝试使用以下命令单线程编译:

1
2
cd friendlywrt
make -j1 V=s

10.3 编译Buildroot
请参考: Buildroot
10.4 其他Linux系统编译
10.4.1 各个OS对应的内核与u-boot版本

enter description here

  • 内核源代码仓库地址:https://github.com/friendlyarm/kernel-rockchip
  • u-boot源代码仓库地址:https://github.com/friendlyarm/uboot-rockchip
  • 交叉编译工具链存放在如下路径: /opt/FriendlyARM/toolchain/,使用前需导出到PATH环境变量,例如需要使用11.3-aarch64版本的编译器,使用如下命令:
1
export PATH=/opt/FriendlyARM/toolchain/11.3-aarch64/bin/:$PATH
  • sd-fuse构建脚本可以用于快速编译kernel和uboot、重新打包sd卡固件与卡刷固件等
  • 点击表格中的MBR与GPT可查看各系统的分区布局(配置文件)
    10.4.2 编译内核linux-v4.4.y
    本节内容适用于如下OS:
    l
lubuntu eflasher friendlydesktop-arm64 friendlycore-arm64

下载源代码并编译:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
git clone https://github.com/friendlyarm/kernel-rockchip --single-branch --depth 1 -b
nanopi4-linux-v4.4.y kernel-rockchip
cd kernel-rockchip
export PATH=/opt/FriendlyARM/toolchain/6.4-aarch64/bin/:$PATH
touch .scmversion
# 配置内核
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- nanopi4_linux_defconfig
# 启动配置界面
# make ARCH=arm64 CROSS_COMPILE=aarch64-linux- menuconfig
# 编译内核
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- nanopi4-images -j$(nproc)
# 编译驱动模块
mkdir -p out-modules
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- INSTALL_MOD_PATH="$PWD/out-modules" modules -j$(nproc)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- INSTALL_MOD_PATH="$PWD/out-modules" modules_install
KERNEL_VER=$(make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 kernelrelease)
rm -rf $PWD/out-modules/lib/modules/${KERNEL_VER}/kernel/drivers/gpu/arm/mali400/
[ ! -f "$PWD/out-modules/lib/modules/${KERNEL_VER}/modules.dep" ] && depmod -b $PWD/out-modules -E Module.symvers -F System.map -w ${KERNEL_VER}
(cd $PWD/out-modules && find . -name \*.ko | xargs aarch64-linux-strip --strip-unneeded)

编译完会生成如下文件:

kernel.img resource.img 驱动模块位于out-modules目录

安装内核:
请参考 #应用新编译的uboot与内核
10.4.3 编译u-boot v2014.10
本节内容适用于如下OS:

lubuntu eflasher friendlydesktop-arm64 friendlycore-arm64
下载源代码并编译:
1
2
3
4
5
git clone https://github.com/friendlyarm/uboot-rockchip --single-branch --depth 1 -b nanopi4-v2014.10_oreo
cd uboot-rockchip
export PATH=/opt/FriendlyARM/toolchain/6.4-aarch64/bin/:$PATH
make CROSS_COMPILE=aarch64-linux- rk3399_defconfig
make CROSS_COMPILE=aarch64-linux-

下载源代码并编译:

uboot.img trust.img rk3399_loader_v1.22.119.bin (打包时改名为MiniLoaderAll.bin)

安装u-boot:
请参考 #应用新编译的uboot与内核

10.4.4 编译内核linux-v4.19.y

本节内容适用于如下OS:

ubuntu-focal-desktop-arm64 debian-bullseye-desktop-arm64 debian-bullseye-minimal-arm64 friendlycore-focal-arm64 ubuntu-noble-core-arm64 debian-bookworm-core-arm64 buildroot

下载源代码并编译:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
git clone https://github.com/friendlyarm/kernel-rockchip --single-branch --depth 1 -b nanopi4-v4.19.y kernel-rockchip
cd kernel-rockchip
export PATH=/opt/FriendlyARM/toolchain/11.3-aarch64/bin/:$PATH
touch .scmversion
# 配置内核
# option1: 加载Linux系统配置
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- nanopi4_linux_defconfig
# option2: 加载FriendlyWrt系统配置
# make ARCH=arm64 CROSS_COMPILE=aarch64-linux- nanopi4_linux_defconfig friendlywrt.config
# 启动配置界面
# make ARCH=arm64 CROSS_COMPILE=aarch64-linux- menuconfig
# 编译内核
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- nanopi4-images -j$(nproc)
# 编译驱动模块
mkdir -p out-modules
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- INSTALL_MOD_PATH="$PWD/out-modules" modules -j$(nproc)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- INSTALL_MOD_PATH="$PWD/out-modules" modules_install
KERNEL_VER=$(make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 kernelrelease)
rm -rf $PWD/out-modules/lib/modules/${KERNEL_VER}/kernel/drivers/gpu/arm/mali400/
[ ! -f "$PWD/out-modules/lib/modules/${KERNEL_VER}/modules.dep" ] && depmod -b $PWD/out-modules -E Module.symvers -F System.map -w ${KERNEL_VER}
(cd $PWD/out-modules && find . -name \*.ko | xargs aarch64-linux-strip --strip-unneeded)

编译完会生成如下文件:

kernel.img resource.img 驱动模块位于out-modules目录

安装内核:
请参考 #应用新编译的uboot与内核
10.4.5 编译内核linux-v6.1.y
本节内容适用于如下OS:

friendlywrt21 friendlywrt21-docker friendlywrt23 friendlywrt23-docker openmediavault-arm64

下载源代码并编译:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
git clone https://github.com/friendlyarm/kernel-rockchip --single-branch --depth 1 -b nanopi-r2-v6.1.y kernel-rockchip
cd
kernel-rockchip
export PATH=/opt/FriendlyARM/toolchain/11.3-aarch64/bin/:$PATH
touch .scmversion
# 配置内核
# option1: 加载Linux系统配置
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 nanopi4_linux_defconfig
# option2: 加载FriendlyWrt系统配置
# make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 nanopi4_linux_defconfig friendlywrt.config
# 启动配置界面
# make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 menuconfig
# 编译内核
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 -j$(nproc)
# 编译驱动模块
mkdir -p out-modules && rm -rf out-modules/*
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 INSTALL_MOD_PATH="$PWD/out-modules" modules -j$(nproc)
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 INSTALL_MOD_PATH="$PWD/out-modules"
modules_install
KERNEL_VER=$(make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 kernelrelease)
[ ! -f "$PWD/out-modules/lib/modules/${KERNEL_VER}/modules.dep" ] && depmod -b $PWD/out-modules -E Module.symvers -F System.map -w ${KERNEL_VER}
(cd $PWD/out-modules && find . -name \*.ko | xargs aarch64-linux-strip --strip-unneeded)

打包kernel.img与resource.img:

1
2
3
4
5
6
7
8
9
10
11
wget https://raw.githubusercontent.com/friendlyarm/sd-fuse_rk3399/kernel-6.1.y/tools/mkkrnlimg && chmod 755 mkkrnlimg
wget https://raw.githubusercontent.com/friendlyarm/sd-fuse_rk3399/kernel-6.1.y/tools/resource_tool && chmod 755 resource_tool
wget https://raw.githubusercontent.com/friendlyarm/sd-fuse_rk3399/kernel-6.1.y/prebuilt/boot/logo.bmp
wget https://raw.githubusercontent.com/friendlyarm/sd-fuse_rk3399/kernel-6.1.y/prebuilt/boot/logo_kernel.bmp
./mkkrnlimg arch/arm64/boot/Image kernel.img
mkdir kernel-dtbs
cp -f arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dtb kernel-dtbs/rk3399-nanopi4-rev09.dtb
cp -f arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dtb kernel-dtbs/rk3399-nanopi4-rev0a.dtb
cp -f arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4se.dtb kernel-dtbs/rk3399-nanopi4-rev0b.dtb
cp -f arch/arm64/boot/dts/rockchip/rk3399-nanopc-t4.dtb kernel-dtbs/rk3399-nanopi4-rev00.dtb
./resource_tool --dtbname kernel-dtbs/*.dtb logo.bmp logo_kernel.bmp

完成后会得到如下文件:

kernel.img resource.img 驱动模块位于out-modules目录
安装内核:
请参考 #应用新编译的uboot与内核
10.4.6 编译u-boot v2017.09
本节内容适用于如下OS:
ubuntu-focal-desktop-arm64 debian-bullseye-desktop-arm64 debian-bullseye-minimal-arm64 friendlycore-focal-arm64 ubuntu-noble-core-arm64 debian-bookworm-core-arm64 buildroot
下载源代码并编译:
1
2
3
4
5
git clone https://github.com/friendlyarm/rkbin --single-branch --depth 1 -b friendlyelec
git clone https://github.com/friendlyarm/uboot-rockchip --single-branch --depth 1 -b nanopi4-v2017.09
export PATH=/opt/FriendlyARM/toolchain/11.3-aarch64/bin/:$PATH
cd uboot-rockchip/
./make.sh nanopi4

编译完成后会生成如下文件:

uboot.img trust.img rk3399_loader_v1.24.126.bin (打包时改名为MiniLoaderAll.bin)
安装u-boot:
请参考 #应用新编译的uboot与内核

10.4.7 应用新编译的uboot与内核

10.4.7.1 安装到目标板
10.4.7.1.1 MBR分区

本节内容适用于如下OS:

lubuntu eflasher friendlydesktop-arm64 friendlycore-arm64

目前只有linux v4.4内核使用MBR分区,需要参考此链接的partmap文件,计算各分区的偏移地址,用dd命令将img文件写入到相应位置,例如parameter.template文件内容中”0x00014000@0x00014000(kernel)”表示kernel.img的位置位于0x00014000,转换成10进制就是81920, 相应的dd命令如下所示:

1
dd if=kernel.img of=/dev/mmcblk0 seek=81920

10.4.7.1.2 GPT分区
本节内容适用于如下OS:

ubuntu-focal-desktop-arm64 friendlycore-focal-arm64 debian-bullseye-desktop-arm64 debian-bullseye-minimal-arm64 ubuntu-noble-core-arm64
buildroot friendlywrt21 friendlywrt21-docker friendlywrt23 friendlywrt23-docker
linux v4.19内核和linux v5.15内核的系统默认使用GPT分区, 可以用dd命令直接将image文件烧写至image对应的分区,SD卡与eMMC的设备节点如下:
  • SD/TF Card设备节点为 /dev/mmcblk0
  • eMMC设备节点为 /dev/mmcblk2
    下面将演示如何将内核更新到eMMC:
    使用parted命令查看分区布局:
1
parted /dev/mmcblk2 print

得到如下输出:

Model: MMC BJTD4R (sd/mmc)
Disk /dev/mmcblk2: 31.3GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name      Flags
 1      8389kB  12.6MB  4194kB               uboot
 2      12.6MB  16.8MB  4194kB               trust
 3      16.8MB  21.0MB  4194kB               misc
 4      21.0MB  25.2MB  4194kB               dtbo
 5      25.2MB  41.9MB  16.8MB               resource
 6      41.9MB  83.9MB  41.9MB               kernel
 7      83.9MB  134MB   50.3MB               boot
 8      134MB   2500MB  2366MB  ext4         rootfs
 9      2500MB  31.3GB  28.8GB  ext4         userdata

resource分区的序号为5, kernel分区的序号为6,对应的设备节点为/dev/mmcblk2p5和/dev/mmcblk2p6, dd命令如下:

dd if=resource.img of=/dev/mmcblk2p5 bs=1M
dd if=kernel.img of=/dev/mmcblk2p6 bs=1M

如果要更新uboot:

dd if=uboot.img of=/dev/mmcblk2p1 bs=1M

如果要更新内核驱动模块,将新驱动模块目录上传并替换以下目录下的文件即可:/lib/modules。

10.4.7.2 打包新的SD Image

sd-fuse 提供一些工具和脚本, 用于制作SD卡固件, 具体用途如下:

  • 制作分区镜像文件, 例如将rootfs目录打包成rootfs.img

  • 将多个分区镜像文件打包成可直接写SD卡的单一镜像文件

  • 简化内核和uboot的编译, 一键编译内核、第三方驱动, 并更新rootfs.img中的内核模块

请根据所用的内核版本点击对应的链接了解详细的使用方法:

内核版本 构建脚本
linux v4.4.y sd-fuse
linux v4.19.y sd-fuse
linux v6.1.y sd-fuse
10.4.7.3 线刷

注:不支持内核v4.4.y的固件

10.4.7.3.1 Linux系统

用以下命令让开发板进入loader模式:

sudo reboot loader

用 upgrade_tool_v2.17_for_linux 工具烧写uboot与内核, 命令如下所示:

sudo upgrade_tool di -k kernel.img
sudo upgrade_tool di -re resource.img
sudo upgrade_tool di -u uboot.img
sudo upgrade_tool RD

注:upgrade_tool是Rockchip提供的Linux下的命令行工具(Linux_Upgrade_Tool),需要使用v2以上版本。

10.5 使用脚本进行编译

10.5.1 下载工具与固件

以friendlycore-focal系统为例,从github克隆下载脚本, 并解压friendlycore-focal系统的映象文件,映象文件可以在网盘的”03_分区镜像文件”目录找到:

git clone https://github.com/friendlyarm/sd-fuse_rk3399.git -b kernel-4.19
cd sd-fuse_rk3399
tar xvzf /path/to/netdrive/03_分区镜像文件/friendlycore-focal-arm64-images.tgz

10.5.2 编译内核

下载内核源代码并编译,编译完成后会自动更新 friendlycore-focal-arm64 目录下的相关映象文件,包括文件系统中的内核模块 (rootfs.img会被解包并重新打包):

git clone https://github.com/friendlyarm/kernel-rockchip --depth 1 -b nanopi4-v4.19.y kernel-rk3399
KERNEL_SRC=$PWD/kernel-rk3399 ./build-kernel.sh friendlycore-focal-arm64

10.5.3 编译内核头文件

git clone https://github.com/friendlyarm/kernel-rockchip --depth 1 -b nanopi4-v4.19.y kernel-rk3399
MK_HEADERS_DEB=1 BUILD_THIRD_PARTY_DRIVER=0 KERNEL_SRC=$PWD/kernel-rk3399 ./build-kernel.sh friendlycore-focal-arm64

10.5.4 编译uboot

下载uboot源代码并编译,编译完成后会自动更新 friendlycore-focal-arm64 目录下的相关映象文件:

git clone https://github.com/friendlyarm/uboot-rockchip --depth 1 -b nanopi4-v2017.09
UBOOT_SRC=$PWD/uboot-rockchip ./build-uboot.sh friendlycore-focal-arm64

10.5.5 生成新固件

将friendlycore-focal-arm64目录下的映象文件重新打包成sd卡固件:

./mk-sd-image.sh friendlycore-focal-arm64

命令完成后,固件位于out目录,可以用 dd 命令制作sd启动卡,举例说明:

dd if=out/rk3399-sd-friendlycore-focal-4.19-arm64-YYYYMMDD.img of=/dev/sdX bs=1M

10.6 Android系统编译

10.6.1 电脑的软硬件要求

  • 至少配置16G以上内存+300G磁盘空间,建议使用32G内存+大容量高速SSD的机器,不建议使用虚拟机;
  • 如遇到编译错误,可能是编译环境问题,推荐使用如下Docker容器进行编译:docker-cross-compiler-novnc

10.6.2 编译Android10

10.6.2.1 下载Android10源代码

有以下两种途径获取 Android10 的源代码,都需要联网:

  • 使用网盘里的git repo压缩包

网盘下载地址: 点击进入
文件位于网盘的以下路径:07_源代码/rk3399-android-10.git-YYYYMMDD.tar.xz (YYYYMMDD表示打包的日期)
从网盘中获取的压缩包在解压之后,需要执行一下 sync.sh 脚本,会从gitlab上拉取最新的代码:

tar xf /path/to/netdisk/07_源代码/rk3399-android-10.git-YYYYMMDD.tar.xz
cd rk3399-android-10
./sync.sh

注意: 如果遇到“error: unknown option `recurse-submodules’”,请升级git至v2.0.0或以上版本。

  • 直接克隆git仓库

NanoPi-R4S 源代码托管在 gitlab 上,使用以下命令进行下载:

git clone --recursive https://gitlab.com/friendlyelec/rk3399-android-10.git -b main
10.6.2.2 编译并生成Image文件

编译Android 10建议使用普通用户登录,运行以下命令编译:

cd rk3399-android-10
./build-nanopc-t4.sh -F -M

如果需要包含google apps,需要设置一个环境变量再编译,如下所示:

cd rk3399-android-10
export INSTALL_GAPPS_FOR_TESTING=yes
./build-nanopc-t4.sh -F -M
10.6.2.3 编译OTA Packages

如果需要A/B (Seamless) System Updates的支持,需要先进行以下定制:
a) 搭建自己的更新服务器
b) 定制packages/apps/Updater使其适配自己的更新服务
定制完成后,使用快速编译脚本参数-O或–ota可编译OTA Packages,如下所示:

cd rk3399-android-10
./build-nanopc-t4.sh -F -O -M

编译成功完成后,OTA更新相关的包位于目录 rockdev/otapackage/ ,请保留此目录。
当完成了某些修改后使用参数-O 再次编译将会生成ota-update-XXXXXXXX.zip,这是增量更新包。
OTA Packages依赖BUILD_NUMBER, 只有它有变化才会生成增量更新包,缺省的生成规则请查看build-nanopc-t4.sh。
修改 device/rockchip/rk3399/nanopc-t4/BoardConfig.mk 中

BOARD_USES_AB_IMAGE := false

可禁用 A/B 特性,然后重新编译(包括u-boot和android)。

10.6.2.4 更新系统为自已编译的Image

编译完成后,image文件会存放在Android10源代码目录的 rockdev/Image-nanopc_t4/ 子目录下,参考以下步骤更新到 NanoPi-R4S上:

  1. 将 EFlasher 启动SD卡 通过读卡器插入电脑,电脑上的Ubuntu系统会自动挂载 SD卡的分区;
  2. 我们需要将 rockdev/Image-nanopc_t4/ 子目录下的所有文件,拷贝并覆盖到 SD卡 FRIENDLYARM 分区里的 android10 目录;
  3. 将SD卡插入NanoPi-R4S,重新烧写Andorid系统即可;
    也可参考这个github仓库的方法来更新:sd-fuse_rk3399
    烧写Android 10时EFlasher 需要 v1.3 或以上版本,通过Type-C烧写时请使用rockchip提供的工具AndroidTool v2.71 或Linux_Upgrade_Tool v1.49 。

10.6.3 编译Android8.1

10.6.3.1 下载Android8.1源代码

有以下两种途径获取 Android8.1 的源代码,都需要联网:

  • 使用网盘里的git repo压缩包

网盘下载地址: 点击进入
文件位于网盘的以下路径:sources/rk3399-android-8.1.git-YYYYMMDD.tgz (YYYYMMDD表示打包的日期)
从网盘中获取的压缩包在解压之后,需要执行一下 sync.sh 脚本,会从gitlab上拉取最新的代码:

tar xvzf /path/to/netdisk/sources/rk3399-android-8.1.git-YYYYMMDD.tgz
cd rk3399-android-8.1
./sync.sh
  • 直接克隆git仓库

NanoPi-R4S 源代码托管在 gitlab 上,使用以下命令进行下载:

git clone https://gitlab.com/friendlyelec/rk3399-android-8.1 --depth 1 -b master
10.6.3.2 编译并生成Image文件

使用以下命令编译:

cd rk3399-android-8.1
./build-nanopc-t4.sh -F -M
10.6.3.3 更新系统为自已编译的Image

编译完成后,image文件会存放在Android8.1源代码目录的 rockdev/Image-nanopc_t4/ 子目录下,参考以下步骤更新到 NanoPi-R4S上:

  1. 将 EFlasher 启动SD卡 通过读卡器插入电脑,电脑上的Ubuntu系统会自动挂载 SD卡的分区;
  2. 我们需要将 rockdev/Image-nanopc_t4/ 子目录下的所有文件,拷贝并覆盖到 SD卡 FRIENDLYARM 分区里的 android8 目录;
  3. 将SD卡插入NanoPi-R4S,重新烧写Andorid系统即可;
    也可参考这个github仓库的方法来更新:sd-fuse_rk3399

10.6.4 编译Android7源代码

10.6.4.1 下载Android7源代码

有以下两种途径获取 Android7 的源代码,都需要联网:

  • 使用网盘里的git repo压缩包

网盘下载地址: 点击进入
文件位于网盘的以下路径:sources/rk3399-android-7.git-YYYYMMDD.tgz (YYYYMMDD表示打包的日期)
从网盘中获取的 repo 压缩包在解压之后,需要执行一下 sync.sh 脚本,会从gitlab上拉取最新的代码:

tar xvzf /path/to/netdisk/sources/rk3399-android-7.git-20181228.tgz
cd rk3399-nougat
./sync.sh
  • 直接克隆git仓库

NanoPi-R4S 源代码托管在 gitlab 上,使用以下命令进行下载:

git clone https://gitlab.com/friendlyelec/rk3399-nougat --depth 1 -b nanopc-t4-nougat
10.6.4.2 编译并生成Image文件

使用以下命令编译:

cd rk3399-nougat
./build-nanopc-t4.sh -F -M
10.6.4.3 更新系统为自已编译的Image

编译完成后,image文件会存放在Android7源代码目录的 rockdev/Image-nanopc_t4/ 子目录下,参考以下步骤更新到 NanoPi-R4S上:

  1. 将 EFlasher 启动SD卡 通过读卡器插入电脑,电脑上的Ubuntu系统会自动挂载 SD卡的分区;
  2. 我们需要将 rockdev/Image-nanopc_t4/ 子目录下的所有文件,拷贝并覆盖到 SD卡 FRIENDLYARM 分区里的 nougat 目录;
  3. 将SD卡插入NanoPi-R4S,重新烧写Andorid系统即可;
    也可参考这个github仓库的方法来更新:sd-fuse_rk3399

11 板载资源的使用

11.1 串口访问

如下表所示,仅 UART4 可供应用程序开发使用:

:
:

串口设备 串口资源占用情况
UART0 已被蓝牙占用
UART1 已被千兆以太网占用
UART2 已被作为调试串口
UART3 已被千兆以太网占用
UART4 空闲,设备名称为 /dev/ttyS4 (注:需使用20180618之后的ROM)

11.2 DTS文件

请参考 DTS files

12 备份文件系统并创建SD映像(将系统及应用复制到另一块开发板)

12.1 备份根文件系统

开发板上执行以下命令,备份整个文件系统(包括OS与数据):

sudo passwd root
su root
cd /
tar --warning=no-file-changed -cvpzf /rootfs.tar.gz \
    --exclude=/rootfs.tar.gz --exclude=/var/lib/docker/runtimes \
    --exclude=/etc/firstuser --exclude=/etc/friendlyelec-release \
    --exclude=/usr/local/first_boot_flag --one-file-system /

注:备份时,如果系统中有挂载目录,最后会出现一个错误提示信息,可以无视它,我们本来就是要忽略这些目录

12.2 从根文件系统制作一个可启动的SD卡

在Linux PC上执行以下shell命令,为了简洁起见,这里以debian-bullseye-desktop-arm64系统为例,但方法适用于所有Linux系统。

su root
git clone https://github.com/friendlyarm/sd-fuse_rk3399 --single-branch -b kernel-4.19
cd sd-fuse_rk3399
tar xvzf /path/to/netdrive/03_Partition\ image\ files/debian-bullseye-desktop-arm64-images.tgz
tar xvzf /path/to/netdrive/03_Partition\ image\ files/emmc-eflasher-images.tgz
scp pi@BOARDIP:/rootfs.tar.gz /rootfs.tar.gz
mkdir rootfs
tar xvzfp rootfs.tar.gz -C rootfs --numeric-owner --same-owner
./build-rootfs-img.sh rootfs debian-bullseye-desktop-arm64
./mk-sd-image.sh debian-bullseye-desktop-arm64
./mk-emmc-image.sh debian-bullseye-desktop-arm64 autostart=yes

13 更改内核命令行参数 (仅支持4.4内核)

13.1 eMMC启动

步骤如下:
先做一张eflahser的烧写卡 (使用rk3xxxx-eflasher-开头的固件文件),
将烧写卡插入电脑,进入sd卡的OS相关目录,编辑文件parameter.txt, 这是个文本文件,里面有命令行参数,
然后再用烧写卡启动,把系统烧写进 eMMC。

13.2 SD启动

要修改SD卡启动时的命令行参数, 需要重新打包SD卡镜像文件, 可以使用我们提供的sd-fuse脚本来辅助打包:

git clone https://github.com/friendlyarm/sd-fuse_rk3399.git -b master --single-branch
cd sd-fuse_rk3399
tar xvzf /path/to/netdrive/03_Partition\ image\ files/friendlydesktop-arm64-images.tgz
tar xvzf /path/to/netdrive/03_Partition\ image\ files/emmc-flasher-images.tgz
vim friendlydesktop-arm64/parameter.txt   # 编辑命令行参数
./mk-sd-image.sh friendlydesktop-arm64    # 重新打包sd映象文件
./mk-emmc-image.sh friendlydesktop-arm64  # 重新打包sd-to-emmc映象文件(eflasher img)

14 性能测试方法

14.1 测试网口速率

14.1.1 软件下载

Windows下可以到官网下载 iperf3测速工具: https://iperf.fr/iperf-download.php
Linux系统可以用以下命令安装: sudo apt-get install iperf3

14.1.2 开始测速

用网线连接电脑到Lan网口,
电脑上打开浏览器, 进入FriendlyWrt后台页面, 进入 “服务“ -> “终端”, 登录后输入以下命令启用 iperf3 服务:

iperf3 -s -i 2

再打开电脑的终端, 输入以下命令开始测试RX速率:

iperf3 -c 192.168.2.1 -i 2 -t 30 -P4
输入以下命令开始测试TX速率:
iperf3 -c 192.168.2.1 -i 2 -t 30 -P4 -R

15 更多OS

15.1 DietPi

Dietpi-logo.png
DietPi is a highly optimised & minimal Debian-based Linux distribution. DietPi is extremely lightweight at its core, and also extremely easy to install and use.
Setting up a single board computer (SBC) or even a computer, for both regular or server use, takes time and skill. DietPi provides an easy way to install and run favourite software you choose.
For more information, please visit this link https://dietpi.com/docs/.

DietPi supports many of the NanoPi board series, you may download the image file from here:

  • https://dietpi.com/docs/hardware/#nanopi-series-friendlyarm
  • RK3399 datasheet V2.1
  • RK3399TRM V1.4

17 资源链接

17.1 手册原理图等开发资料

  • 原理图

    • NanoPi-R4S-1GB-2008-Schematic.pdf NanoPi-R4S-4GB-2008-Schematic.pdf
  • PCB尺寸图

    • NanoPi_R4S_1GB_2008_dxf.zip NanoPi_R4S_1GB_2008_dxf.zip

18 已知问题及解决办法

    • Q: 绿联18W QC快充头无法供电?
    • A: 它需要等待几秒钟才能上电,有一个QC握手过程,用普通5V/3A充电头,或者其他快充头例如绿联30W没有发现此问题。

19 更新日志

19.1 2023-12-01

19.1.1 FriendlyWrt

  • 更新到 6.1.63 内核
  • 更新到 OpenWrt 23.05.2

19.2 2023-05-26

19.2.1 FriendlyWrt更新

  • 更新 v22.03 到新版本 openwrt-22.03.5
  • 更新 v21.02 到新版本 openwrt-21.02.7

19.3 2023-04-26

19.3.1 FriendlyWrt:

  • 更新 v22.03 到新版本 openwrt-22.03.4
  • 更新 v21.02 到新版本 openwrt-21.02.6

19.4 2023-02-10

19.4.1 新增 Debian11

分为以下三个版本:

  • Debian11 Core: 仅命令行
  • Debian11 Minimal: LXDE桌面,精简版
  • Debian11 Desktop: LXDE桌面,完整版

19.5 2023-01-09

19.5.1 FriendlyCore更新说明:

  • 优化了开机服务

19.6 2022-12-04

19.6.1 FriendlyWrt:

  • 修正存储空间某些情况下无法扩展的问题
  • 加强eMMC刷机工具的刷机稳定性

19.7 2022-09-06

19.7.1 FriendlyWrt更新说明:

  • 提升了NanoPi-R4SE的eMMC读取性能
  • 增加Fullcone NAT支持 (默认开启)
  • 版本升级到 22.03.0 正式版
  • 修复NanoPC-T4在FriendlyWrt下的eMMC稳定性问题

19.8 2022-08-03

19.8.1 FriendlyWrt更新说明:

  • 升级FriendlyWrt至最新版本22.03-rc6
  • 修正 R4S/R4SE 软重启后小概率会识别不到pcie设备(lan口)的问题
  • 修正R4SE在烧写系统到eMMC时状态灯没有反映烧写进度的问题
  • 防火墙设置调整: 单网口的设备(使如NanoPi-T4/NanoPi-M4)默认设置为允许WAN入站流量以方便网页配置,多网口的设备仍然保持默认拒绝WAN入站流量
  • 更新使用4.19内核的FriendlyWrt固件,特性与5.15的FriendlyWrt 21.02 docker版本一致

19.9 2022-07-27

19.9.1 FriendlyWrt更新说明:

  • 提供测试版22.03-rc3, 可根据软件包的需求情况进行选择, 推荐使用稳定版本 21.02.3
  • 提供docker与非docker两个版本,除了docker外其他特性相同
  • 改善了第三方软件包的安装兼容性问题
  • 增加支持 “恢复出厂设置” 功能
  • 增加网页刷机工具 eMMC-Tools, 支持安装FriendlyElec及部分第三方固件到eMMC, 除了raw-image还支持rockchip打包格式的固件
  • 其他一些细节调整: 默认设置时区设置为上海、新增NAS分类菜单、去掉lcd2usb、改进安全性设置、调优sysctl参数、修正docker防火墙设置等
  • 增加支持新的硬件型号: NanoPi-R4SE

19.10 2021-10-29

19.10.1 FriendlyWrt更新说明:

  • FriendlyWrt更新至官方稳定版本 21.02.1,特性与19.07.5基本保持一致,支持docker、usb wifi等

19.11 2021-08-31

19.11.1 FriendlyWrt更新说明:

  • FriendlyWrt的内核更新到 5.10.60
  • 新增一款高速5G USB WiFi的支持,网卡型号为 Comfast CF-WU782AC V2,芯片型号为 MediaTek MT7662
  • 改进了USB WiFi的兼容性
  • 改进了PWM风扇的支持,风扇由内核驱动控制,支持温控(详情请在R4S的WiKi页面搜索 PWM风扇)
  • 改进了首次启动的稳定性 (之前的版本,首次启动时,某些情况下会出现bpfilter错误)

19.12 2020-12-24

  • FriendlyWrt更新至官方稳定版本 19.07.5

安装FriendlyDesktop

配置Samba

步骤 1:安装 Samba

1
2
sudo apt update
sudo apt install samba

步骤 2:创建共享目录

1
2
3
sudo mkdir -p /media/pi/userdata2/file
sudo chown -R pi:pi /media/pi/userdata2/file
sudo chmod -R 775 /media/pi/userdata2/file

步骤 3:编辑 Samba 配置

1
sudo nano /etc/samba/smb.conf

在文件末尾添加:

要在Samba中设置共享目录 /media/pi/userdata2/file,您需要在 smb.conf 文件的末尾添加一个新的共享部分。以下是您可以添加的配置:

1
2
3
4
5
6
7
8
[file]
comment = File Share
path = /media/pi/userdata2/file
browseable = yes
read only = no
guest ok = yes
create mask = 0775
directory mask = 0775

添加后,您需要:

确保目录存在且有正确的权限:

1
2
3
sudo mkdir -p /media/pi/userdata2/file
sudo chown -R pi:pi /media/pi/userdata2/file
sudo chmod -R 775 /media/pi/userdata2/file

重启Samba服务使更改生效:

1
sudo service smbd restart

测试配置是否正确:

1
testparm

Docker 需要启用 实验性功能(experimental features) 才能使用 –platform

  1. 启用 Docker 实验性功能
    (1)编辑 Docker 配置文件
1
nano /etc/docker/daemon.json

(2)添加以下内容(如果文件已存在,则合并)

1
2
3
{
"experimental": true
}

将内容改为(保留原有镜像加速,新增 experimental 字段):

1
2
3
4
{
"registry-mirrors": ["https://docker.1ms.run"],
"experimental": true
}

注意:JSON 格式必须严格正确(逗号、引号、无注释)。
(3)重启 Docker 服务

1
systemctl restart docker
  1. 验证实验性功能是否启用
1
docker version --format '{{.Server.Experimental}}'

如果输出 true 表示已启用。

  1. 重新尝试拉取镜像
1
docker pull --platform=arm64 gethomepage/homepage:latest

安装 Openwrt

这里用到的是编译好的集成版,下载地址,推荐下载高大全版本
enter description here

portainer

1
2
3
4
5
6
7
8
docker run -d \
-p 9000:9000 \
-p 9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
--name portainer \
--restart always \
6053537/portainer-ce:latest
1
2
3
4
5
6
7
8
9
docker run -d \
--privileged \
-p 9000:9000 \
-p 9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
--name portainer \
--restart always \
portainer/portainer-ce:linux-arm64

filebrowser文件浏览器安装

arm64拉取镜像

1
docker pull 80x86/filebrowser:arm64

x86拉取镜像

1
docker pull 80x86/filebrowser

enter description here
enter description here
容器/myfiles 主机/opt/docker/filebrowser/data
容器/config 主机/opt/docker/filebrowser/config
容器/myfiles/volume1 主机/opt
容器/myfiles/volume2 主机/mnt

如果通过filebrowser写入或删除homepage文件,给与权限

1
chmod -R 777 /opt/docker/homepage

hexo博客

1
docker pull --platform=arm64 bloodstar/hexo:latest

enter description here
enter description here

安装主题

切换到博客的主题根目录下打开Git Bash并执行以下命令:

1
git clone https://github.com/next-theme/hexo-theme-next.git themes/next

下载完成后,会在项目themes目录下生成next文件夹。

enter description here
如果没有修改代码的需求可以直接通过npm来安装。

1
npm install hexo-theme-next

与所有 Hexo 主题启用的模式一样。当 克隆/下载 完成后,打开 站点配置文件, 找到 theme 字段,并将其值更改为 next。

1
theme: next

到此,NexT 主题安装完成。
验证主题 启动服务并访问http://localhost:4000查看效果.

1
hexo clean && hexo s

添加搜索功能

在博客根目录下,执行如下命令

1
npm install hexo-generator-searchdb --save

修改站点配置文件
修改根目录下_config.yml,在最底部添加如下配置

1
2
3
4
5
search:
path: search.xml
field: post
format: html
limit: 10000

修改主题配置文件
修改主体下的themes\next_config.yml配置文件,搜索local_search,修改enable为true

1
2
local_search:
enable: true

字数统计以及阅读时间配置

安装

1
2
npm install hexo-word-counter
hexo clean

然后在站点配置文件Hexo _config.yml的文件尾部添加

1
2
3
4
5
6
7
8
9
symbols_count_time:
symbols: true
time: true
total_symbols: true
total_time: true
exclude_codeblock: false
awl: 4
wpm: 275
suffix: "mins."

3.然后在主题配置文件NexT _config.yml中修改

1
2
3
4
5
# Post wordcount display settings
# Dependencies: https://github.com/next-theme/hexo-word-counter
symbols_count_time:
separated_meta: true
item_text_total: false

将设置item_text_total为true

homepage导航

1
docker pull --platform=arm64 gethomepage/homepage:latest

enter description here
enter description here
容器/var/run/docker.sock 主机/opt/docker/homepage/docker.sock
容器/app/config 主机/opt/docker/homepage/config
容器/app/public/icons主机/opt/docker/homepage/icons
容器/app/public/images主机/opt/docker/homepage/images
enter description here
添加环境变量

1
HOMEPAGE_ALLOWED_HOSTS=192.168.5.1:3000 #按实际更改

calibre-web

1
docker pull --platform=arm64 linuxserver/calibre-web:latest
1
2
3
4
5
6
7
8
9
docker run -d \
--name=calibre-web \
--privileged \ # 启用特权模式
--pids-limit=-1 \ # 禁用进程数限制
--ulimit nproc=65535:65535 \ # 提高线程限制
-p 8083:8083 \
-v /path/to/calibre/config:/config \ # 替换为你的配置目录
-v /path/to/your/books:/books \ # 替换为你的书库目录
linuxserver/calibre-web

enter description here
enter description here

jellyfin

1
docker pull --platform=arm64 jellyfin/jellyfin:latest

enter description here
enter description here

迅雷远程下载服务(非官方)

ARM版安装

1
docker pull --platform=arm64 cnk3x/xunlei:latest

amd64版安装

1
docker pull cnk3x/xunlei

从迅雷群晖套件中提取出来用于其他设备的迅雷远程下载服务程序。仅供研究学习测试。
本程序仅提供 Linux 模拟和容器化运行环境,未对原版迅雷程序进行任何修改。
使用 镜像

1
2
3
cnk3x/xunlei:latest
registry.cn-shenzhen.aliyuncs.com/cnk3x/xunlei:latest
ghcr.io/cnk3x/xunlei:latest

常规的容器,还是要在特权模式下运行。 如果 docker 的存储驱动如果是 btrfs 或者 overlayfs,可以支持的非特权运行。
环境变量参数

1
2
3
4
5
6
7
8
9
10
11
12
XL_DASHBOARD_PORT      #网页访问的端口,默认 2345
XL_DASHBOARD_IP #网页访问的端口,默认 0.0.0.0(代表所有IP
XL_DASHBOARD_USERNAME #网页访问的用户名
XL_DASHBOARD_PASSWORD #网页访问的密码
XL_DIR_DOWNLOAD #下载保存默认文件夹,默认 /xunlei/downloads,多个文件夹用冒号:分隔
XL_DIR_DATA #程序数据保存文件夹,默认 /xunlei/data
XL_UID #运行迅雷的用户ID
XL_GID #运行迅雷的用户组ID
XL_PREVENT_UPDATE #是否阻止更新,默认 true, 可选值 true/false, 1/0
XL_CHROOT #隔离运行主目录, 指定该值且不为`/`则以隔离模式运行, 用于在容器内隔离环境,容器内默认为 /xunlei,隔离模式运行需要特权模式(--privileged),可以将该值设置为`/`来以非特权模式运行。非特权模式运行有条件,可以尝试失败后使用特权模式重新运行。
XL_DEBUG #调试模式, 可选值 true/false, 1/0

1
2
3
4
5
6
7
8
9
10
11
12
# docker run -d \
# -v <数据目录>:/xunlei/data \
# -v <默认下载保存目录>:/xunlei/downloads \
# -p <访问端口>:2345 \
# --privileged \
# cnk3x/xunlei

# example
docker run --privileged -v /mnt/sdb1/configs/xunlei:/xunlei/data -v /mnt/sdb1/downloads:/xunlei/downloads -p 2345:2345 cnk3x/xunlei

# 如果你的docker存储驱动是 overlayfs 或者 btrfs等, 可以不用特权运行
docker run -e XL_CHROOT=/ -v /mnt/sdb1/configs/xunlei:/xunlei/data -v /mnt/sdb1/downloads:/xunlei/downloads -p 2345:2345 cnk3x/xunlei

10分钟搭建一个可以实现音乐自由的音乐服务器 - Navidrome

前言

随着国内版权意识的提高,现在想听一首歌曲,往往我们可能要切换好几个个 APP —— 网易云音乐、QQ 音乐、咪咕音乐等,切换起来很麻烦,并且还需要开通 VIP,有的 APP 就算你买了 VIP 服务,下载的歌曲还是加密的,一旦 VIP 到期后某些歌你还听不了,非常蛋疼,最蛋疼的是有的歌曲还需要单独付费购买,不禁想问这 VIP 的用处是啥。

于是我不得不转到了 YouTube Music 加入一个家庭组会员一年仅需 40 元 左右,即可获得 YouTube Music & YouTube 视频双会员,就目前来看,我想听的歌都是找得到的,我非常满意,但是有一个缺点,必须得富强,才能使用,有时候场合也不是很方便,还是想低调点使用。

后续不得不考虑自建方案,不用太多,把自己经常听的几首放进去就够用了,但是找来找去一直没找到合适的方案,感觉都很繁琐,不适合我这种懒人,好在功夫不负有心人,终于让我找到了 Navidrome,它支持 docker compose 部署,界面也是简洁、美观,让我十分喜欢。

Navidrome ⁠是一款基于 Web 的开源音乐收藏服务器和流媒体播放器。它让您可以自由地从任何浏览器或移动设备收听您的音乐收藏。它就像您的个人 Spotify!

1、优点:

  • 处理非常大的音乐收藏
  • 播放几乎所有可用的音频格式
  • 读取并使用您精心策划的所有元数据(id3 标签)
  • 多用户,每个用户都有自己的播放次数、播放列表、收藏夹等。
  • 资源占用极低:例如:300GB 的曲库(约 29000 首歌曲)占用的 RAM 不到 50MB
  • 多平台,可在 macOS、Linux 和 Windows 上运行。还提供 Docker 镜像
  • 可立即使用的 Raspberry Pi 二进制文件和 Docker 镜像
  • 自动监控库中的变更,导入新文件并重新加载新元数据
  • 基于 Material UI 的主题化、现代化、响应式的 Web 界面,用于管理用户和浏览您的图书馆
  • 与所有 Subsonic/Madsonic/Airsonic 客户端兼容。查看已测试客户端列表⁠
  • 即时转码 / 降采样。可按用户 / 玩家设置。支持 Opus 编码
  • 集成音乐播放器

2、缺点:

  • 暂时没找到自动获取歌词的方法 (已找到方案,可参考 Navidrome 番外,解决歌词显示问题)
  • 不支持通过界面 上传 & 删除 歌曲(后续我们会通过其他的方式实现 上传 & 删除 功能)

3、官方演示站点:

https://demo.navidrome.org/app/

4、 项目地址:

Docker Hub 地址:https://hub.docker.com/r/deluan/navidrome

Github 地址:https://github.com/navidrome/navidrome

开始搭建

1、 搭建 Navidrome

我们将采用 docker compose 来搭建,docker & docker compose 的安装我就不赘述了,谷歌随便一搜一大把。

1
2
3
4
5
6
7
apt update -y ## 安装前先升级系统包

mkdir /home/docker/navidrome ## 创建文件夹

cd /home/docker/navidrome ## 进入文件夹

nano docker-compose.yml ## 创建 yml 文件

贴一个实际我在用的 docker-compose 配置示例(可以通过 LASTFM & SPOTIFY 削刮封面图等信息)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
version: "3"
services:
navidrome:
image: deluan/navidrome:latest # 指定程序版本版本,例如: 0.56.1
ports:
- "4533:4533" # 左边可以改成自己服务器未被占用的端口
environment:
# 可选配置选项,以下是一些示例:
ND_SCANSCHEDULE: 5m # 扫描音乐文件夹的时间间隔
ND_LASTFM_ENABLED: "true" # 是否启用 Last.fm 集成(留空表示禁用)
ND_LASTFM_APIKEY: a0ac723bb9917c49f65ad # 替换为你自己的 Last.fm API Key
ND_LASTFM_SECRET: 3d0c1db7ded3af # 替换为你自己的 Last.fm Secret
ND_SPOTIFY_ID: 567e1ab95ad9cd2393af # 替换为你自己的 Spotify ID
ND_SPOTIFY_SECRET: 34b420f48d51520c # 替换为你自己的 Spotify Secret
ND_LASTFM_LANGUAGE: zh # 设置 Last.fm 的语言为中文
ND_LOGLEVEL: info # 日志级别,推荐使用 info
ND_SESSIONTIMEOUT: 72h # 用户会话超时时间,例如 72 小时
ND_BASEURL: "" # 如果需要反向代理,设置基础 URL(留空表示不使用)
ND_MUSICFOLDER: "/music" # 指定多个音乐文件夹路径,用冒号分隔
ND_LYRICSPRIORITY: "embedded,.lrc,.txt" #歌词优先
ND_ENABLEDOWNLOADS: "false" #启用下载
ND_SUBSONIC_DEFAULTREPORTREALPATH: "false" #在 API 中报告音乐文件的真实路径
ND_ENABLESHARING: "false" #启用共享
ND_ENABLETRANSCODINGCONFIG: "false" #启用转码
volumes:
- "/home/docker/navidrome/data:/data" # 冒号左边修改为本地存储 Navidrome 数据的路径
- "/home/docker/navidrome/music:/music:rw" # 冒号左边修改为本地音乐文件夹路径,挂载模式改为 rw
restart: unless-stopped # 容器在意外停止时自动重启
1
2
3
4
5
6
7
8
9
docker run -d \
--name navidrome \
--privileged \
-v /var/lib/docker/navidrome:/data \
-v /media/pi/userdata2/file/music:/music \
-p 4533:4533 \
-e ND_SCANSCHEDULE=1h \
-e ND_LOGLEVEL=info \
deluan/navidrome:latest

使用的是 Docker Compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '3'
services:
navidrome:
image: deluan/navidrome:latest
container_name: navidrome
privileged: true
ports:
- "4533:4533"
volumes:
- "/var/lib/docker/navidrome:/data"
- "/media/pi/userdata2/file/music:/music"
environment:
- ND_SCANSCHEDULE=1h
- ND_LOGLEVEL=info
restart: unless-stopped

2、获取 LASTFM & SPOTIFY 密钥信息

1). 获取 LASTFM 密钥信息

首先需要一个 Last.fm 免费帐户,其次你要能访问 Last.fm

转到 https://www.last.fm/api/account/create 并创建一个 API 帐户。只有应用程序名称 字段是强制性的

提交表单后,可以从 API account Created 页面获取 API Key 和 Shared Secret

将获取的密钥信息复制到刚才的 docker-compose.yml 文件内进行替换。

2). 获取 SPOTIFY 密钥信息

在 Spotify 中创建一个免费帐户,然后按照以下步骤操作:

单击 Spotify 的开发者仪表板中的 CREATE AN APP 按钮:https://developer.spotify.com/dashboard/applications

填入 应用名称 应用程序描述 重定向 URL(可以随意填写)计划使用(建议全部勾选)然后保存即可

将获取的密钥信息复制到刚才的 docker-compose.yml 文件内进行替换。

3、运行

密钥替换完毕后,我们同时按住 Ctrl+X 键,输入 Y , 回车

然后输入以下命令启动:

1
docker compose up -d

输入 IP:4533 就可以访问了

域名访问,可以参考这篇文章最后的配置域名访问部分:https://makifx.com/1240.html

4、成品展示

目前刚部署上,还没存几首,仅作展示:

更新

1
2
3
4
cd /home/docker/navidrome # 进入安装目录/
docker compose pull # 拉取最新镜像/
docker compose up -d # 直接升级容器,自动停止并立刻重建新的容器。/
docker image prune # 删除所有未被 tag 标记和未被容器使用的镜像

卸载

1
2
3
4
cd /home/docker/navidrome
docker compose down
cd ..
rm -rf /home/docker/navidrome # 完全删除

解决音乐 上传 & 删除 问题(番外)

1、搭建

我们将采用 filebrowser 来管理歌曲文件,可以有效解决音乐 上传 & 删除 问题。

直接输入以下命令运行即可:

1
2
3
4
5
docker run -d --restart=always \
-v /home/docker/navidrome/music:/srv \ # 冒号左边的文件夹路径需与 Navidrome 保持一致
-p 8003:80 \ # 冒号左边可以改成自己服务器未被占用的端口
--name filebrowser \
langren1353/filebrowser-ckplayer

2、 成品展示

至此,属于你自己的音乐服务器就搭建完毕了,赶紧扩充你的音乐库,开始享受吧!

Navidrome 解决歌词显示问题

背景:

上一期我们搭建了属于自己的音乐服务器 Navidrome,详情参考:10 分钟搭建一个可以实现音乐自由的音乐服务器 - Navidrome

直接调用 115 网盘资源,不占用服务器空间,使用起来也是非常的舒服,上传了一些我常听的歌,顺便把我收集来的一个 880G 的音乐资源包一起放进去了,但是有一个痛点就是没有歌词显示,让习惯了听歌看歌词的我非常的不习惯,几经周折也是让我发现了一款名为 【音乐标签】 的开源项目,可以专门针对音乐进行削刮,效果我也是比较满意。

Music Tag Web

【音乐标签】Web 版是一款可以编辑歌曲的标题,专辑,艺术家,歌词,封面等信息的音乐标签编辑器程序, 支持 FLAC, APE, WAV, AIFF, WV, TTA, MP3, M4A, OGG, MPC, OPUS, WMA, DSF, DFF, MP4 等音频格式。

项目特点:

  • 支持大部分音频格式元数据的查看、编辑和修改
  • 支持批量自动修改(刮削)音乐标签
  • 支持音乐指纹识别,即使没有元数据也可以识别音乐
  • 支持整理音乐文件,按艺术家,专辑分组, 或者自定义多级分组
  • 支持文件排序,按照文件名,文件大小,更新时间排序
  • 支持批量转换音乐元数据繁体转简体,或者简体转繁体
  • 支持文件名称的拆分解包,补充缺失元数据信息
  • 支持文本替换,批量替换音乐元数据中脏数据
  • 支持音乐格式转换,引入 ffmpeg 支持音乐格式转换
  • 支持整轨音乐文件的切割
  • 支持多种音乐标签来源
  • 支持歌词翻译功能
  • 支持显示操作记录
  • 支持导出专辑封面文件,支持自定义上传专辑封面
  • 支持适配移动端 UI,支持手机端访问
  • 支持使用小爱同学播放本地音乐,播放 NAS 本地音乐

需要注意的一点是有的功能是 V2 专属(付费),不过免费版对于削刮来说也够用了。

项目地址:

【Music Tag Web】Github 地址:https://github.com/xhongc/music-tag-web

【Music Tag Web】官网:https://xiers-organization.gitbook.io/music-tag-web

本人自用客户端推荐:https://github.com/gitbobobo/StreamMusic

搭建:

1、 搭建 Music Tag Web

1
2
3
4
5
6
docker run --privileged -d \
-v /media/pi/userdata2/file/music:/app/media:rw \
-v /var/lib/docker/tag:/app/data \
-p 8001:8002 \
--name music_tag_web \
xhongc/music_tag_web:latest
1
2
3
mkdir -p /home/docker/tag   ## 路径和名称可以自定义
cd /home/docker/tag ## 与上述路径名称保持一致
nano docker-compose.yml

下面是 docker-compose.yml 配置文件

1
2
3
4
5
6
7
8
9
10
11
version: '3'
services:
music-tag:
image: xhongc/music_tag_web:latest
container_name: music-tag-web
ports:
- "8992:8002" ## 冒号左边端口可自定义为为占用端口
volumes:
- /home/docker/navidrome/music:/app/media:rw ## 冒号左边路径请与Navidrome保持一致
- /home/docker/tag/config:/app/data ## 冒号左边路径请填写config配置文件路径
restart: unless-stopped

2、 运行

1
docker compose up -d

输入 IP:8992 就可以访问了,默认账号密码均为:admin

域名访问,可以参考这篇文章最后的配置域名访问部分:https://makifx.com/1240.html

3. 成品展示

卸载:

1
2
3
4
cd /home/docker/tag
docker compose down
cd ..
rm -rf /home/docker/tag ## 完全删除


系统迁移

我对之前的听音系统还是比较满意的,我并不是发烧友,当系统的音质能达到一定程度,剩下的就是音乐欣赏的事情了。
这个系统我用了很多年,也没打算做什么调整。
试用了Roon后,我比较喜欢她的和音乐管理,关联,搜索,流媒体音乐深度集成等特性,就购买了帐号,正式将Roon引入了我的听音系统,并归一化了所有的终端。

我之前听音系统的网络拓扑

我之前的听音系统终端并没有归一,音频的流动主要以DLNA为主,因为解码器的Bridge卡作为Render,内部通过I2S输入解码板,效果非常好,我又不想折腾各种USB,同轴,光纤的连接,线材不菲且完全不在我的知识范围内。

群晖NAS作为Media Server, 解码器,Mac软件,智能音箱作为Render,电脑、手机和Pad的软件作为Browser和Controller

enter description here

引入Roon后听音系统网络拓扑

Roon的帐号挺贵的,加上我对原来的硬件还算满意,所以想最大限度的利用,思想就是用Roon Core管理音乐,同时将Roon的RAAT协议都转为DLNA,复用现有的设备。 电脑、手机、平板的客户端都统一到Roon Remote。

感谢philippe开发的SqueezeBox桥接到Upnp的软件squeeze2upnp,使得我复用原有DLNA系统的想法成为了可能,而且他对待用户的反馈是否友好,耐心解答并能很快做出修改。

enter description here

安装Roon

在这个网站下载群晖NAS的套件 : https://roononnas.org/de/synology-2/

在共享文件夹中创建一个名字叫”RoonServer”的共享目录
强烈建议使用SSD安装Roon,因为Roon服务器的随机访问速度很关键,我的NAS没有SSD安装槽位,只能通过USB 3.0的盒子接入SATA3固态硬盘。
如果接入外置存储,将外置存储的名字改为RoonServer
enter description here

3、选择手动安装套件,安装过程比较长
enter description here

手机,PC, MAC, Pad的客户端可以参考官网安装:
https://roonlabs.com/downloads

以Windows为例,在PC上启动Roon,就回发现群晖NAS的Core,连接就可以使用
enter description here

如何为Roon增加DLNA输出

Roon本身不支持输出,但是支持Squeezebox设备(就是LMS(Logitech Media Server)体系)

下图就是在Roon设置中打开对squeezbox的支持。

enter description here
接下来的思路就是做一个桥,将Roon使用Squeezebox协议输出的音频转成DLNA的协议

使用这个软件实现:Squeeze2upnp,他的目的就是将DLNA设备变成SqueezeBox设备
enter description here

软件github地址:https://github.com/philippe44/LMS-to-uPnP
里面有下载地址和提供支持的论坛地址

安装

安装非常简单,从github网址给出的下载网站下载最新的安装包解压即可。

!!!重要,需要安装1.49.8之后的版本,这之前的版本不支持Huawei Sound,我和作者squeeze2upnp的作者philippe反馈后并提供日志后,他经过修改,新出了版本用于支持Huawei Sound

安装包解压后有一个Bin目录,所有平台的可执行文件都在里面。

1
2
3
4
5
ls ./Bin
cc32160mt.dll libmad-0.dll libopusfile-0.dll pthreadBC2.dll squeeze2upnp-armv5te-static squeeze2upnp-bsd-x64-static squeeze2upnp-ppc-static squeeze2upnp-x86 ssleay32.dll
libeay32.dll libogg-0.dll libsoxr.dll squeeze2upnp-aarch64 squeeze2upnp-armv6hf squeeze2upnp-osx-multi squeeze2upnp-sparc squeeze2upnp-x86-64
libfaad2.dll libogg.dll libvorbis.dll squeeze2upnp-aarch64-static squeeze2upnp-armv6hf-static squeeze2upnp-osx-multi-static squeeze2upnp-sparc-static squeeze2upnp-x86-64-static
libFLAC.dll libopus-0.dll libvorbisfile.dll squeeze2upnp-armv5te squeeze2upnp-bsd-x64 squeeze2upnp-ppc squeeze2upnp-win.exe squeeze2upnp-x86-static

尽管Squeeze2upnp是LMS的一个插件,但是他并不依赖LMS,可以独立运行。解压后在Bin目录下后缀为_static的可执行程序都是独立执行程序

Squeeze2upnp支持Windows, OSX, or Linux x86/64, ARM and OSX

可以从可执行的程序名中看出哪个可执行程序对应什么平台。

例如树莓派,你可以选择 : squeeze2upnp-armv6hf-static
例如群晖X86 NAS, 你可以选择 : squeeze2upnp-x86-64-static

对于Linux,对应你平台的执行文件需要增加可执行属性,例如

1
chomd a+x squeeze2upnp-x86-64-static

以下描述以都以群晖NAS为例,其他的平台将命令中的可执行程序替换为对应平台的执行程序即可。

DLNA设备发现

对于第一次使用,或者希望重新创建一个配置文件,需要执行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
./Bin/squeeze2upnp-x86-64-static -i config.xml
[22:18:38.897023] main:1756 Starting squeeze2upnp version: v1.49.6 (Feb 13 2021 @ 14:45:36)
[22:18:38.904985] main:1764

!!!!!!!!!!!!!!!!!! ERROR LOADING CONFIG FILE !!!!!!!!!!!!!!!!!!!!!

[22:18:38.943266] Start:1518 Binding to 192.168.1.100:49152 (http:0)
[22:18:39.363148] AddMRDevice:1405 [0xc41840]: adding renderer (HUAWEI Sound-0286)
[22:18:39.363354] AddMRDevice:1418 [0xc41840]: cannot get mac HUAWEI Sound-0286, creating fake fcceaf23
[22:18:39.371278] MasterHandler:1036 [0xc41840]: subscribe success
[22:18:39.395668] AddMRDevice:1405 [0xc43a58]: adding renderer (LIVINGROOM)
[22:18:39.395813] AddMRDevice:1418 [0xc43a58]: cannot get mac LIVINGROOM, creating fake 13a64ae6
[22:18:39.428824] MasterHandler:1036 [0xc43a58]: subscribe success
[22:19:00.344578] Stop:1540 stopping squeezelite devices ...
[22:19:00.344673] Stop:1544 terminate update thread ...
[22:19:00.344770] Stop:1549 terminate main thread ...
[22:19:00.344824] Stop:1553 stopping UPnP devices ...

等程序执行完,就会生成一个基础配置文件(config.xml,这个名字可以按照你的指定更换),里面包括默认配置和发现的你的局域网的DLNA设备。
注:你的DLNA Render设备需要打开才能被发现并生成配置。

其中段是针对你所有设备的通用配置

每个发现的设备都有一个段,你可以在段中设置和common中相同的参数,这个参数会针对这个设备覆盖common参数。

以我的设备为例,生成的设备配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<device>
<udn>uuid:b8aabe2db4df5481eb8b4f4cf3f302eac9a1539192127404166af840a41a0945</udn>
<name>HUAWEI Sound-0286</name>
<friendly_name>HUAWEI Sound-0286</friendly_name>
<mac>bb:bb:23:af:ce:fc</mac>
<enabled>1</enabled>
</device>
<device>
<udn>uuid:9166ce01-e4b5-4d56-8a1a-6a031b3b416b</udn>
<name>LIVINGROOM</name>
<friendly_name>LIVINGROOM</friendly_name>
<mac>bb:bb:e6:4a:a6:13</mac>
<enabled>1</enabled>
</device>

其中LIVINGROOM是我客厅的PS Audio PWD解码器,而HUAWEI Sound-0286则是卧室的Huawei智能音箱

接下来要对config.xml做一些简单的配置修改。例如, 在”common”段设置了设备最大支持48Khz采样率, 但是如果你的设备的最大采样率是192Khz,你可以在”device”段进行覆盖:

1
2
3
4
5
6
7
8
9
10
<common>
...
<sample_rate>48000</sample_rate>
...
</common>
<device>
...
<sample_rate>192000</sample_rate>
...
</device>

尽管根据测试华为智能音箱支持24bit/192Khz,但是华为给出的规格是24bit/96Khz,所以建议还是把Huawei Sound的采样率设置为96Khz

每个被发现的设备的”enable”属性都是1,表示会为这个设备生成一个桥设备,在Roon设置里面的音频设备列表展现, 如果你不想在Roon中使用这个设备,就将enable设置为0.

“device”段里面有一个有个属性是DLNA Render的标识,类似:

1
<mac>bb:bb:e6:4a:a6:13</mac>

这是这个设备的标识,后续发现设备时,设备mac地址和这个段相同,就不会添加新的设备,并使用这个”device”设置的属性进行处理。

!!!!!!最重要的一点: 将roon_mode属性设置为1,否则Roon下可能不工作

1
<roon_mode>1</roon_mode>

!!!!! **另外重要的一点,需要在Huawei Sound的”device”段中增加以下属性,否则会不能播放下一首,或者播放进度条不走

1
<accept_nexturi>1</accept_nexturi>

后续有新设备发现,squeeze2upnp会为新设备增加一个device段到配置文件。如果你不想自动增加新设备(可能会造成问题),可以将”common”段的”enabled”属性设置为0

运行

测试运行:

1
squeeze2upnp-x86-64-static -x config.xml

调试信息会输出在终端

正式运行

1
./Bin/squeeze2upnp-x86-64-static -z -x config.xml

要用-z参数在后台运行,否则即使使用Linux在后台运行,会占用一个CPU核的全部资源

然后需要开机启动就将上诉命令加入到/etc/rc.local 中即可

Roon配置

在Roon的“设置”->”音频”中启用桥设备,并给其命名,例如命名为Huawei Sound
enter description here

对设备进行一些简单配置
enter description here
在右下角的设备选择那里选择需要播放的设备,例如Huawei Sound音箱
enter description here
然后打开设备的DSP选项
enter description here
将Huawei Sound高于96k码率的音乐和DSD音乐进行转换
enter description here

最终效果

这下,就可以在Roon系统中使用Huawei智能音箱了

enter description here

使用docker运行squeeze2upnp

上面的squeeze2upnp安装过程依赖命令行,有点复杂,我简单做了一个docker镜像,在群晖上可以通过docker套件的界面来部署squeeze2upnp

首先需要在群晖上安装官方的docker套件:
enter description here
打开Docker套件界面搜索镜像hjianhao/hjianhao-squeeze2upnp
enter description here
搜索到镜像后下载,并在映像界面启动容器
enter description here
选择高级设置
enter description here
在NAS上创建一个保存配置文件(config.xml)的目录,并挂接到容器的/config目录
enter description here
因为squeezeupnp涉及范围端口的使用,所以使用host网络
enter description here
应用后,一路“下一步”即可启动容器。
enter description here
第一次容器虽然启动了,但是功能是失效的,从上面的说明可以看到此时还没有配置文件(config.xml), 点击“详情”按钮弹出容器信息窗口,从“日志”标签中可以看到,加载配置文件失败
enter description here
此时我们进入“终端”标签,执行/squeeze2upnp/find.sh,用于发现DLNA Render设备,并生成配置文件
enter description here
执行完成后,使用“Ctrl+D”退出并停止容器运行。此时在你挂载的配置文件目录中就会有”Config.xml”配置文件。
enter description here
然后配置按前面对配置文件的描述修改配置文件,再重启容器即可。重启容器前最好将自动重启勾上
enter description here
启动成功后,只有一行日志
enter description here

通过桥连接解码器

除了上面提到的通过squeeze2upnp转换用DLNA连接解码器外,还有其他的连接解码器的方式:

1、也可以通过RAAT接入Roon Ready的解码器(前提是解码器支持Roon Ready)
enter description here
这种方式比较简单,只要你的解码器支持Roon Ready且解码器和Roon core在同一个局域网网段,就可以相互发现,不用配置。因为简单且我的解码器不支持Roon Ready就不在这里赘述了
2、Roon Core通过USB输出接入解码器,包括直接接入到解码器的USB输入,或者通过解码器界面转换为同轴和光纤输入解码器
enter description here
3、Roon Core通过RAAT协议接入Roon Bridge,然后Roon Bridge接入解码器,接入方式和上面说的Roon Core类似
enter description here

这里主要介绍第三种,因为Bridge可以:

  1. 让Roon Core和解码器的位置摆放更为灵活,只要Bridge接近解码器即可。
  2. Bridge使用树莓派这种低功耗设备可以比Core更容易避免干扰,同时电源也更好处理。
  3. 多个Bridge可以让Roon接入和控制多个房间的音响设备。

因为我个人的主音响系统以DLNA为主,因为我的解码器出声最好的就是DLNA接入,其他数字接入都稍微差一些。所以树莓派做Bridge一个是做对比测试,另一个方面是作为我一个房间耳放的接入。这样我就可以用Roon控制在我的耳放上播放音乐。

树莓派做Roon Bridge是性价比非常高的Roon Bridge设备,功耗低,价格低,USB输出较好,I2S数字音频卡多,电源好处理。

在树莓派上装Roon Bridge

如果树莓派专用于Roon Bridge,则最好安装volumio,moode,RoPieee这类已经预先集成了Bridge软件的,比较简单。

因为我的树莓派还需要跑其他的软件,所以我是预装了系统再手工安装Roon Bridge。也比较简单

官方有Linux安装指导:https://help.roonlabs.com/portal/en/kb/articles/linux-install

要选对架构,对于树莓派4,如果是32位系统,用armv7hf, 我用的系统是64位的,所以使用armv8,安装只有下面三个指令

1
2
3
$ curl -O http://download.roonlabs.com/builds/roonbridge-installer-linuxarmv8.sh
$ chmod +x roonbridge-installer-linuxarmv8.sh
$ sudo ./roonbridge-installer-linuxarmv8.sh

取消安装在执行脚本加上参数uninstall,如:

1
sudo ./roonbridge-installer-linuxarmv8.sh uninstall

安装完成后会有安装结果提示,看是否安装成功。

重要提示: 安装完成后,可能会出现在Roon的关于里面可以看到桥,但是在音频里面看不到输出设备,应该是树莓派没有启动音频设备,需要修改config.txt文件,将dtparam=audio=on这一行的注释弃掉(删除前面的#号)

除了USB输出外,也可以给树莓派添加I2S音频扩展卡,通过同轴/平衡/光纤输出到解码器。

如果选用的是兼容HiFiBerry系列的显卡,可以参考:
https://www.hifiberry.com/docs/software/configuring-linux-3-18-x/

以我买的带平衡和光纤输出的兼容HiFiBerry Digi+的扩展版为例,修改/boot/config.txt

  1. 注释掉dtparam=audio=on
  2. 添加dtoverlay=hifiberry-dac

重启树莓派即可。然后用aplay指令可以看到I2S声卡

1
2
3
4
5
aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: sndrpihifiberry [snd_rpi_hifiberry_digi], device 0: HifiBerry Digi HiFi wm8804-spdif-0 [HifiBerry Digi HiFi wm8804-spdif-0]
Subdevices: 1/1
Subdevice #0: subdevice #0

通过VPN实现远程ROON

打通WAN连接服务器

  1. 首先要像运营商(如电信宽带)申请公网IP。

  2. 申请一个免费域名,同时将域名设置动态映射。这个每家域名提供商具体不一样,根据指导去配。

  3. 公网IP一般是动态的,会变化的,使用DDNS来做动态映射,以下以梅林固件的路由器为例:

enter description here
服务器选择不同域名提供商,然后输入用户名等参数

搭建VPN服务器

以群晖NAS为例

1、安装VPN Server套件
enter description here

2、启动L2TP/IPSec服务器
enter description here
其中10.2.0.0是VPN虚拟机局域网的网段

在路由器做端口映射,将以下端口流量导向NAS
UDP:500
UDP:4500
UDP:1701
enter description here

或者也可以通过DMZ映射到NAS服务器地址

远程机器连接VPN服务器

以在Windows设置创建VPN连接为例

  1. 修改注册表并重启
    在“Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent”创建一个DWORD (32-bit)值,可以是“AssumeUDPEncapsulationContextOnSendRule”, 值为“2”
    修改完最好重启

  2. 创建连接

enter description here
其中
a. 用户名和密码是你创建VPN服务器的NAS用户用户名和密码
b. 共享密钥是第2步设置的预共享密钥

3、进行连接
enter description here
连接后会增加一个虚拟网卡

1
2
3
4
5
6
7
PPP 适配器 myhome:

连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::ecdd:7a2a:228e:9b30%51
IPv4 地址 . . . . . . . . . . . . : 10.2.0.1
子网掩码 . . . . . . . . . . . . : 255.255.255.255
默认网关. . . . . . . . . . . . . : 0.0.0.0

同时你也可以访问NAS所在局域网的地址
例如

1
ping 192.168.1.100

此时你的Windows和NAS已经处在一个虚拟局域网下,启动远程计算机上的Roon就可以连接NAS上跑的Core了。

此时你看到Roon Core的IP地址是刚才建立的VPN的网段(Core机器上也有一个虚拟网卡)
enter description here
同时也可以发现远程Windows机器上连接的音频设备用于播放
enter description here

将Roon的RAAT协议都转为DLNA的容器 squeeze2upnp

1
2
3
4
5
6
docker run -d
  --name=squeeze2upnp
  --restart=unless-stopped
  --network=host
  -v /自己设置自己的/config:/config
 ycllwl/squeeze2upnp:latest

enter description here
首次运行需要进入此容器的“终端”,
1.查看有哪些运行中容器,然后选择想进入的容器名称

1
docker ps

2.进入容器

1
docker exec -it 容器名称 /bin/bash

2.运行
find.sh
执行/squeeze2upnp/find.sh,用于发现DLNA Render设备,并生成配置文件
enter description here
enter description here

然后编辑/config文件夹生成的配置文件<roon_mode>0</roon_mode>修改为

1
<roon_mode>1</roon_mode>

使其能在 Roon工作
打开关闭设备 < device> < /device> 之间为一个设备
< enabled>0< /enabled> 表示关闭此设备
< enabled>1< /enabled> 表示打开此设备
enter description here

前言

由于 Synology 的 DSM 7 不允许第三方应用程序以 root 用户身份运行。所以 DSM7 以上的版本将只能使用 docker 的方式来安装 zerotier(而 DSM6 的 zerotier 将在 2023 年进入 EOL 阶段(停止服务),且用且珍惜吧。
通过 docker 安装 zerotier 主要分为以下四个步骤:
1、在 nas 启动 ssh 访问;
2、创建 TUN 服务;
3、安装 docker 服务(群晖套件直接安装即可,这里略过);
4、拉取并启动 zerotier one 镜像;
5、将 zerotier-one 镜像加入你的网络,并添加 moon 节点

在 nas 启动 ssh 访问

在群晖页面控制面板下,找的 “终端机和 SNMP” 这一项,把 “启动 SSH 功能” 勾上即可,默认使用 22 端口即可;
enter description here
之后使用远程访问工具(我这里使用 putty)登录群晖;
enter description here

创建 TUN 服务

首先切换到 root 用户(以下所有的操作都需要有 root 权限)

1
sudo -i

创建一个 /usr/local/etc/rc.d/tun.sh 脚本 到 /dev/net/tun 目录下

1
echo -e '#!/bin/sh -e \ninsmod /lib/modules/tun.ko' > /usr/local/etc/rc.d/tun.sh

给刚刚创建的 tun 脚本授予所有用户均可执行的权限

1
chmod a+x /usr/local/etc/rc.d/tun.sh

使用以下命令检查以下 tun.ko 是否存在

1
lsmod | grep tun

enter description here
由于我的群晖默认已经有 tun 这个包了,所以就不需要安装,直接用即可,如果使用 lsmod 命令找不到 tun 这个包,则执行以下脚本,创建 TUN

1
/usr/local/etc/rc.d/tun.sh

如果执行脚本遇到以下报错,说明 tun.ko 模块可能已存在,不需要重新编译
enter description here
检查一下 TUN

1
ls /dev/net/tun

如果您在让 TUN 工作时遇到困难,请查看‎‎ Rui Marinho 的指南‎

创建 zerotier 镜像

创建一个文件夹用于挂载 zerotier-one 的配置文件和认证信息(我这里路径指定到我自己创建的 docker/zerotier 文件夹下)

1
mkdir /volume1/docker/zerotier

这里也可以直接在群晖 file Station 上创建,然后再文件夹属性中获取实际路径(建议使用这步,比较直观,不容易出错)
enter description here
以下是 zerotier 官方给的注意: In the next step we bind mount to the host’s created above in order to store ZeroTier’s identity. This is not guaranteed to survive DSM updates. I would suggest placing this on an automatically-mounted volume where your other private user data resides. The location you choose to store your identities should be kept secure and never placed on a shared volume that others can access./var/lib/zerotier-one 译文版本: ‎在下一步中,我们将装载绑定到上面创建的主机,以存储 ZeroTier 的身份(我的理解是 config 配置和用户信息)。这不能保证在 DSM 更新后仍然有效(zerotier 自己也不确定,为了群晖更新后,会不会不再允许用户使用 zerotier 做内网穿透,毕竟 DSM7 之后,群晖直接不再支持 zerotier 的套件了,可能 zerotier 自己也感觉后续可能会被不再支持,故在此给用户打个预防针)。zerotier 建议将其放在其他私人用户数据所在的自动装载卷上。您选择存储身份(用户信息和 config 信息)的位置应保持安全,切勿放置在其他人可以访问的共享卷上‎。
构建 zerotier-one 镜像 (Repo: zerotier/zerotier-synologyzt)

1
docker run -d \ --name zt \ --restart=always \ --device=/dev/net/tun \ --net=host \ --cap-add=NET_ADMIN \ --cap-add=SYS_ADMIN \ -v /volume1/docker/zerotier:/var/lib/zerotier-one zerotier/zerotier-synology:latest

enter description here
执行完,出现一串检验码即表示镜像部署启动成功,回到群晖管理页面,既可以看到多了一个群晖镜像;
enter description here

配置 zerotier-one 加入网络,并配置 moon 节点

配置 zerotier-one 加入网络

使用以下命令检查 zerotier-one 的运行状态

1
docker exec -it zt zerotier-cli status

再使用以下命令加入你的 zerotier-one 网络(其中后面的 e5cd7a9e1cae134f 换成你自己的 zerotier-one 生成的网络 id)

1
docker exec -it zt zerotier-cli join e5cd7a9e1cae134f

enter description here
当看到 200 join OK,既是表示加入网络成功,这时候登录 zerotier 控制台,即可看到网络列表多了一条未授权加入的网络,勾选允许其加入即可;
enter description here

接下来在为 docker 环境下的 zerotier-one 添加 moon 节点

这个比较简单,直接在群晖 file station 下,找到你上面创建的 docker 文件夹下的 zerotier 文件夹,将你的 moon.d 拖拽进入即可
enter description here
最后,重启 zerotier docker 容器,在 ssh 端执行以下命令,检查 moon 节点是否加载成功(看到多了 moon 的那行即表示成功)

1
docker exec -it zt zerotier-cli listpeers 

enter description here
最后在手机上使用 zerotier 分配的 ip 即可顺便在 4G 网络下接入局域网内的群晖了(前提是你的手机需要先安装 zerotier 客户端,并已加入同一个网络 id)
enter description here

连接群晖及WinScp使用见上一篇文章

产品型号:DS3622xs+

DSM版本:DSM 7.2-64570 Update 1 

先看一下效果图

我们最终想要的:屏蔽系统更新,但是不能影响套件更新!!是的,做到了!

之前看博主“GXNAS”猜测的的套件和系统更新共用一个升级地址了,建议劝退了


可是黑群晖心不甘啊。。。。。。。。。。。。万一哪天手残,数据(小姐姐)可容不得半点马虎。。。。  可能不需要这么麻烦的,一年前搭建过一台7.1版本的黑群晖,忘了咋搞的了,应该是用了啥脚本,木得记录了,有用脚本搞定的欢迎留言,后来比对了一下配置文件,直接改 这里假装你已经用WinSCP连上系统了
enter description here
根目录下找到如下文件夹,一会要用
enter description here
其实两个文件夹里文件名都是一样的,改的项目也一样,九处
在两个文件夹下分别找到synoinfo.conf文件
enter description here
双击打开,找到如下行,在域名后面添加example,其实就是将域名地址改为一个不存在的网址就可以了
注意:这几行不是在一起的 原配置

1
2
3
4
5
6
7
8
9
myds_region_api_base_url="https://account.synology.com/"
rss_server="http://update7.synology.com/autoupdate/genRSS.php"
rss_server_ssl="https://update7.synology.com/autoupdate/genRSS.php"
rss_server_v2="https://update7.synology.com/autoupdate/v2/getList"
security_version_server="https://update7.synology.com/securityVersion"
small_info_path="https://update7.synology.com/smallupdate"
update_server="http://update7.synology.com/"
update_server_ssl="https://update7.synology.com/"
updateurl="http://www.synology.com/"

更新为

1
2
3
4
5
6
7
8
9
myds_region_api_base_url="https://account.synologyexample.com/"
rss_server="http://update7.synologyexample.com/autoupdate/genRSS.php"
rss_server_ssl="https://update7.synologyexample.com/autoupdate/genRSS.php"
rss_server_v2="https://update7.synologyexample.com/autoupdate/v2/getList"
security_version_server="https://update7.synologyexample.com/securityVersion"
small_info_path="https://update7.synologyexample.com/smallupdate"
update_server="http://update7.synologyexample.com/"
update_server_ssl="https://update7.synologyexample.com/"
updateurl="http://www.synologyexample.com/"

群晖版本不同该配置所在的行也会不同 其它的不要动! 其它的不要动! 其它的不要动! 改不好会影响套件的更新! 保存,然后改一下另一个目录下相同的文件,改法和内容都一致!!!!不再赘述!! 关机!!!开机!!!我直接重启后不好使,也不知道是不是浏览器缓存的问题,自测吧,后期要更新就把配置文件改回去就行。
————————————————————————————华丽的分割线——————————————————————————————————
还有网友修改hosts文件的方法,我试了一下不管用,当然,不放心可以双管齐下
我改的hosts文件内容

1
2
3
4
5
127.0.0.1    global.download.synology.com
127.0.0.1 global.synologydownload.com
127.0.0.1 update7.synology.com
127.0.0.1 autoupdate7.synology.com
127.0.0.1 autoupdate7.synology.cn

依据是官方提到的
enter description here
见 https://kb.synology.cn/zh-cn/DSM/tutorial/What_websites_does_Synology_NAS_connect_to_when_running_services_or_updating_software
可以都加上试试,欢迎自测留言哈~~~
希望对同样爱瞎捣鼓的您有所帮助~~~~O(∩_∩)O哈哈~
还有一点要注意:
如果你使用Virtual Machine Manager套件要从官方下载映像,屏蔽上述更新后也是无法获取映像文件的,方法一:改回原配置文件,下载后再屏蔽更新;方法二:如图示,example是我在屏蔽网址中添加的,改成你改的就行
enter description here

收工了,妈妈再也不用担心我手贱点击更新了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

原本计划先发 GPT4Free 的,但看很多人在后台反馈 FreeGPT35aurora 遇到的问题,基本上都是网络原因,所以先发个不用折腾网络的国产 API 服务,让大家先用起来

什么是 kimi-free-api ?

kimi-free-api 是长文本大模型白嫖服务,支持高速流式输出、联网搜索、长文档解读、图像解析、多轮对话,零配置部署,多路 token 支持,自动清理会话痕迹。与 ChatGPT 接口完全兼容。

最近一段时间,国产大模型 Kimi 火了,起因是它的 200 万字超长上下文输入,这使得它能够处理和分析大量的文本信息,为用户提供深度的理解和分析

kimi-free-api 是和 FreeGPT35 、aurora 类似的 Kimi 的免费大模型接口,由 LLM 大模型红队(LLM Red Team) 提供,除此之外,还提供了其他几家大模型的 API,有兴趣的可以去看看

kimi-free-api 相比 FreeGPT35 、aurora 等国外大模型 API 服务,最大的优势不是长文本,而是不用折腾网络 ߘ⊊在使用前,请仔细阅读并理解官方的免责申明

安装

在群晖上以 Docker 方式安装。

在注册表中搜索 kimi-free-api ,选择第一个 vinlic/kimi-free-api,版本选择 latest

本文写作时, latest 版本对应为 0.0.25
Blockquote

enter description here

端口

本地端口不冲突就行,不确定的话可以用命令查一下

1
2
# 查看端口占用
netstat -tunlp | grep 端口号
本地端口 容器端口
8126 8000
enter description here

环境

可变
TZ 时区,设为 Asia/Shanghai
enter description here

命令行安装

如果你熟悉命令行,可能用 docker cli 更快捷

1
2
3
4
5
6
7
8
# 运行容器
docker run -d \
--restart unless-stopped \
--name kimi-free-api \
--init \
-p 8126:8000 \
-e TZ=Asia/Shanghai \
vinlic/kimi-free-api:latest</pre>

--init 标志用于在容器内部启动一个 init 进程。

也可以用 docker-compose 安装,将下面的内容保存为 docker-compose.yml 文件

1
2
3
4
5
6
7
8
9
10
11
<pre>version: '3'

services:
kimi-free-api:
image: vinlic/kimi-free-api:latest
container_name: kimi-free-api
restart: always
ports:
- "8126:8000"
environment:
- TZ=Asia/Shanghai</pre>

然后执行下面的命令

1
2
3
4
5
6
7
8
9
10
# 新建文件夹 kimi 和 子目录
mkdir -p /volume1/docker/kimi

# 进入 kimi 目录
cd /volume1/docker/kimi

# 将 docker-compose.yml 放入当前目录

# 一键启动
docker-compose up -d</pre>

运行

在浏览器中输入 http://群晖IP:8126 就能看到主界面

获取 refresh_token

从 kimi.moonshot.cn 获取 refresh_token

进入kimi 先要登录,然后随便发起一个对话,接着按 F12 打开开发者工具,从Application –> Local Storage 中找到 refresh_token的值,这将作为Authorization 的 Bearer Token 值:Authorization: Bearer TOKEN
enter description here

下面这种情况没遇到过,来自于 kimi-free-api 的说明

如果你看到的 refresh_token 是一个数组,请使用 . 拼接起来再使用。

目前 kimi 限制普通账号每 3 小时内只能进行 30 轮长文本的问答(短文本不限),你可以通过提供多个账号的 refresh_token 并使用,拼接提供:

1
Authorization: Bearer TOKEN1,TOKEN2,TOKEN3

每次请求服务会从中挑选一个

命令行

kimi-free-api 支持与 OpenAI 兼容的 /v1/chat/completions 接口,所以要验证 API 服务是否正常,可以用下面的示例

用 SSH 客户端登录到群晖后,在命令行执行下面的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
curl http://192.168.0.197:8126/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer [refresh_token]" \
-d '{
"model": "kimi",
"messages": [
{
"role": "user",
"content": "你是谁?"
}
],
"use_search": true,
"stream": false
}'

服务正常的话,很快会得到响应数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"id": "cobts9maoforsk2g47c0",
"model": "kimi",
"object": "chat.completion",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "我是Kimi,由月之暗面科技有限公司开发的人工智能助手。我擅长中英文对话,并且能够提供安全、有帮助、准确的信息。如果你有任何问题或需要帮助,随时可以问我!"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 1,
"completion_tokens": 1,
"total_tokens": 2
},
"created": 1712840230
}

enter description here

kimi-free-api 除了对话接口,还有文档解读、图像解析、refresh_token 存活检测等接口

因为 refresh_token 比较长,所以还是推荐用 API 工具比较好,比如 PostmanApifox 、ApiPost 等

客户端

还可以使用与 OpenAI 或其他兼容的客户端接入接口,还是以 ChatGPT-Next-Web 为例

文章传送门:跨平台私人ChatGPT应用ChatGPT-Next-Web

如果你还没安装 ChatGPT-Next-Web ,可以用下面的命令一键搞定

1
2
3
4
5
6
7
8
9
# 运行容器  
docker run -d \
--restart unless-stopped \
--name chatgpt-next-web \
-p 3059:3000 \
-e OPENAI_API_KEY=<你的refresh_token> \
-e BASE_URL=http://<你的群晖IP>:8126 \
-e CUSTOM_MODELS="-all,+kimi" \
yidadaa/chatgpt-next-web

如果你已经安装过ChatGPT-Next-Web,需要修改三个环境变量参数

  • OPENAI_API_KEY:之前不论你是安装的 FreeGPT35 还是 aurora,这个值都是随便填的,现在必须改为我们前面获取的 refresh_token
  • BASE_URL:填写 kimi-free-api 服务的地址 + 端口
服务名称 服务地址
FreeGPT35 http://192.168.0.197:3044
aurora http://192.168.0.197:8328
GPT4Free http://192.168.0.197:1337
kimi-free-api http://192.168.0.197:8126
  • CUSTOM_MODELS :用来控制模型列表,使用 + 增加一个模型,使用 - 来隐藏一个模型,使用 模型名=展示名 来自定义模型的展示名,用英文逗号隔开。需从 -all,+gpt-3.5-turbo 改为 -all,+kimi
    enter description here

进入 ChatGPT-Next-Web 的设置,可以看到模型已经被设置为 kimi

enter description here
现在可以开始聊天了
enter description here

做个文档解读,

文档地址:https://mj101-1317487292.cos.ap-shanghai.myqcloud.com/ai/test.pdf

enter description here

还能做图像解析

图片地址:https://www.moonshot.cn/assets/logo/normal-dark.png

enter description here

自己用用就行,千万不要对外提供服务或商用,避免对官方造成服务压力,且用且珍惜!

其他

这块的内容和上文没啥直接关系,是给大家推荐两款 Kimi 的 chrome 插件,功能都是用来做网页内容总结的

  • Kimi copilot 网页总结助手,特点是极简,除了一键总结没有其它花里胡哨的功能

  • Kimi 阅读助手,可以自己预设提示词,根据自己需要定义提示词工程

参考文档

LLM-Red-Team/kimi-free-api: ߚࠋIMI AI 长文本大模型白嫖服务,支持高速流式输出、联网搜索、长文档解读、图像解析、多轮对话,零配置部署,多路token支持,自动清理会话痕迹。
地址:https://github.com/LLM-Red-Team/kimi-free-api

1、阅读项目文档

谷歌浏览器

https://github.com/linuxserver/docker-chromium

Edge浏览器

https://github.com/linuxserver/docker-msedge

火狐浏览器

https://github.com/linuxserver/docker-firefox

2、配置国内镜像源(解决中文字体安装问题)

新建文件sources.list,内容填写国内镜像源地址,保存。

1
2
3
4
deb https://mirrors.bfsu.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
deb https://mirrors.bfsu.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
deb https://mirrors.bfsu.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware
deb https://mirrors.bfsu.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware

3、部署参数

docker cli

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
docker run -d \
--name=chromium \
--hostname=chromium \
--security-opt=no-new-privileges:true \
--security-opt seccomp=unconfined \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Asia/Shanghai \
-e CUSTOM_USER=admin \
-e PASSWORD=admin \
-e DOCKER_MODS=linuxserver/mods:universal-package-install \
-e INSTALL_PACKAGES=fonts-noto-cjk \
-e LC_ALL=zh_CN.UTF-8 \
-e TITLE=Chromium \
-p 3000:3000 \
-p 3001:3001 \
-v /opt/docker/chromium:/config \
-v /opt/docker/chromium/sources.list:/etc/apt/sources.list \
--shm-size="2gb" \
--restart unless-stopped \
linuxserver/chromium:latest

docker-compose

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
services:
chromium:
image: linuxserver/chromium:latest
container_name: chromium
hostname: chromium
security_opt:
- no-new-privileges:true
- seccomp=unconfined
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
- CUSTOM_USER=admin
- PASSWORD=admin
- DOCKER_MODS=linuxserver/mods:universal-package-install
- INSTALL_PACKAGES=fonts-noto-cjk
- LC_ALL=zh_CN.UTF-8
- TITLE=Chromium
volumes:
- /opt/docker/chromium:/config
- /opt/docker/chromium/sources.list:/etc/apt/sources.list
ports:
- 3000:3000
- 3001:3001
shm_size: 2gb
restart: unless-stopped

4、运行容器

1
docker compose up -d

5、Edge浏览器、火狐浏览器部署思路与此相同。

 发表于 2024-03-04  更新于 2025-02-14  分类于 各种折腾  Waline:  阅读次数: 本文字数: 2.4k  阅读时长 ≈ 2 分钟Open WebUI 是针对 LLM 的用户友好的 WebUI。


在前文 本地大模型运行框架Ollama 中,老苏留了个尾巴,限于篇幅只是提了一下 Open WebUI,有网友留言说自己安装没搞定,今天我们来补上

文章传送门:本地大模型运行框架Ollama

什么是 Open WebUI ?

Open WebUI 是针对 LLM 的用户友好的 WebUI,支持的 LLM 运行程序包括 Ollama 和 OpenAI 兼容的 API

Open WebUI 系统旨在简化客户端(您的浏览器)和 Ollama API 之间的交互。此设计的核心是后端反向代理,可增强安全性并解决 CORS 问题。

enter description here

【说明】:

  • 因为老苏的小机器不支持 Nvidia GPU,所以下面ߑ秚䥮騣姤ꤾ뤻妔歷ႠCPU

  • 本文假设你已经在 11434 端口启动了 Ollama 服务,但是否在本机是无所谓的。

安装

在群晖上以 Docker 方式安装。

镜像下载

官方没有在 docker hub 上发布镜像,而是发布在 ghcr.io,地址在 https://github.com/open-webui/open-webui/pkgs/container/open-webui

用 SSH 客户端登录到群晖后,依次执行下面的命令

1
2
3
4
5
6
7
8
# 新建文件夹 open-webui 和 子目录
mkdir -p /volume1/docker/open-webui/data

# 进入 open-webui 目录
cd /volume1/docker/open-webui

# 拉取镜像
docker pull ghcr.io/open-webui/open-webui:main

如果没有科学上网,很可能会拉不动,可以试试 docker 代理网站:https://dockerproxy.com/,但是会多几个步骤

1
2
3
4
5
6
7
8
# 如果拉不动的话加个代理
docker pull ghcr.dockerproxy.com/open-webui/open-webui:main

# 重命名镜像(如果是通过代理下载的)
docker tag ghcr.dockerproxy.com/open-webui/open-webui:main ghcr.io/open-webui/open-webui:main

# 删除代理镜像(如果是通过代理下载的)
docker rmi ghcr.dockerproxy.com/open-webui/open-webui:main

下载完成后,可以在 映像 中找到

命令行安装

如果你熟悉命令行,可能用 docker cli 更快捷

1
2
3
4
5
6
7
8
9
# 运行容器(仅CPU
docker run -d \
--restart unless-stopped \
--name ollama-webui \
-p 11433:8080 \
-v $(pwd)/data:/app/backend/data \
-e OLLAMA_API_BASE_URL=http://192.168.0.197:11434/api \
-e WEBUI_SECRET_KEY=TkjGEiQ@5K^j \
ghcr.io/open-webui/open-webui:main

环境变量的简单说明

没有找到官方说明,但是这两个是必须要设置的

可变
OLLAMA_API_BASE_URL Ollama 服务器的地址
WEBUI_SECRET_KEY 可以理解成密码,老苏是用 Vaultwarden 生成的

也可以用 docker-compose 安装,将下面的内容保存为 docker-compose.yml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: '3'

services:
ollama-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: ollama-webui
restart: unless-stopped
ports:
- 11433:8080
volumes:
- ./data:/app/backend/data
environment:
- OLLAMA_API_BASE_URL=http://192.168.0.197:11434/api
- WEBUI_SECRET_KEY=TkjGEiQ@5K^j

然后执行下面的命令

1
2
3
4
5
6
7
# 进入 open-webui 目录
cd /volume1/docker/open-webui

# 将 docker-compose.yml 放入当前目录

# 一键启动
docker-compose up -d

运行

在浏览器中输入 http://群晖IP:11433 就能看到登录界面

第一次需要注册账号

enter description here

登录成功后的主界面

点左下角的用户名,进 Settings

也可以点 Select a model 后面的设置图标;

enter description here

Modles 中可以添加、删除和切换模型

感谢网友 Zzz 推荐的 qwen:0.5b,这是阿里云推出的基于 Transformer 的大型语言模型,推理最低内存需求小于 2GB ,在老苏的机器上,运行都非常流畅。

可以在 Ollama 中用命令行安装

感谢网友 潇雨 推荐的 gemma:2b,这是 Google 及其 DeepMind 团队开发的新型开放模型。

也可以在这里直接下载

  • ①中输入模型名称及版本
  • ②点击开始下载
  • ③跳转到模型库查询页面

过程中有进度显示

回到首界面,选择模型

刚下载的模型可能要等一会才会显示出来,现在老苏已经有了 2 模型了

现在可以开始提问了

同样的问题,换个模型试试

目前的这种应用场景下,老苏暂时倾向于使用 qwen:0.5b ,不仅速度快,答案看起来也更丰满一些

参考文档

open-webui/open-webui: User-friendly WebUI for LLMs (Formerly Ollama WebUI)
地址:https://github.com/open-webui/open-webui

ߏ᠈ome | Open WebUI
地址:https://docs.openwebui.com/

选择软路由和openwrt的原因在这里就不再阐述了,相信既然搜到这篇文章的你心中已经有了答案。这里说一下为什么选择esir的高大全版本,在这个版本里几乎集合了你想要的所有功能,基本无需再额外下载配置,所以非常推荐这一个!!! 此教程及其资源适用于x86_64架构,即适用于Intel各芯片如j4125/n4100/n5105等,不适用于arm系列
硬件准备: 对于未购买者,这里建议直接在拼多多购买整机,如倍控的j4125和幻网的N4100,自带4个2.5g网口。经过测试2.5g局域内交换跑满,J4125占用比为39%.性能足够且价格相对较低,j4125倍控带电源价格为560,幻网n4100带电源券减完后为399. 对于软路由物理机内存,准备ddr4 笔记本2g内存条已非常满足。固态若不作为nas使用,仅安装系统可选择24g/32g msata硬盘
资源下载:
1 、esir openwrt高大全版:
百度网盘:https://pan.baidu.com/s/1zbrWEhi_Iiy--raQgAiKNQ?pwd=ll2s 提取码:ll2s esir官方链接:https://drive.google.com/drive/folders/1uRXg_krKHPrQneI3F2GNcSVRoCgkqES
2、工具
百度网盘:https://pan.baidu.com/s/1gTsTIX5VND8fu23x4g7XZg?pwd=bxyb 提取码:bxyb
3、PE制作 大白菜:http://www.winbaicai.com/ 老毛桃:https://www.laomaotao.net/

一、openwrt系统安装

1.1 制作PE盘

  1. 可选择资源下载3中提供的两个链接,大白菜或老毛桃官网下载制作一个PE启动盘。这里我选择的是大白菜,也是我从大学就开始用的PE。这里我选择了在线安装,虽然下载下来只有3m左右,但是在制作PE盘时还会在线下载500m左右。

  1. 插入U盘,打开安装好的PE制作软件。在默认模式->请选择 中选择你要制作为PE盘的u盘。选择好后选择 “一键制作USB启动盘”,等一会就制作好了,是不是很简单。

  1. 拷如openwrt系统镜像和写盘工具:

PE启动盘制作完成后,会出现大白菜U盘 设备,这时将我们的openwrt和镜像写入工具复制进去即可。

openwrt系统镜像可从本文开始资源下载->esir openwrt高大全版 处下载,esir提供了两个版本分别为uefi启动和传统legacy启动。除了很老的主板不支持uefi,大部分主板都支持uefi,所以这里我也是仅拷了uefi镜像到u盘。

镜像写入工具即physdiskwrite,可从本文开始资源下载->工具 中获取。

1.2 写入openwrt系统

  1. 将制作好的PE盘插入到软路由上,点击开机键,选择第一项回车后,随即进入大白菜的PE界面

  1. 删除硬盘所有分区:安装openwrt前,需要将你软路由上要安装openwrt系统的硬盘所有分区都删掉。PE桌面上有一个DiskGenius软件,打开后,对应你要安装的硬盘右击选择“删除所有分区(A)”,然后点击确定即可

  1. openwrt系统写入,点击左下角的Windows图标->所有程序,继续选择最上方的命令提示符

  1. 将之前复制到U盘中的写盘工具拖入命令提示符窗口中,此时会显示类似“U:\physdiskwrite” 在后面继续输入 “空格 -u 空格”,在其后面将我们的openwrt镜像拖入,如下图:

按回车,此时会出现你当前软路由上的硬盘列表,你需要关注的是硬盘的编号和Model。如下图,软路由上我插了两块硬盘,其中镁光 C400编号为0,浦科特PX 256M6S编号为1.

此时,会问你写入那块硬盘。这里我想将openwrt系统写入浦科特PX 256M6S中,故回复其编号1,回车后,继续输入y,如图:

稍等片刻,软路由系统即写入完毕。

二、配置openwrt

2.1 设置密码和IP网关

  1. 设置密码

开机,进入系统后,按回车进入指令输入。输入:

passwd

即可输入密码,输入后会让你再次输入以验证(Linux下输入密码是看不到,所以只管输入即可,输完后按回车)

  1. 设置默认网关

这里对以后我们连接软路由设备的IP进行设定,默认为192.168.5.1。这里可以根据我们自己喜好来设定,比如我修改为192.168.1.1。修改方式如下,继续输入指令:

vi /etc/config/network

回车后,出现以下界面。键盘按i,进入编辑模式。

这里我把可能修改的三处已画出,其中192.168.1.1是我修改的自己设置的软路由的默认网关,你可以自行修改。eth1是我将连接软路由的lan口(连接PC、AP等)设置为编号为eth1的网口,将eth0设置为上级路由/光猫连接的wan口。

修改完成后,按esc退出编辑。键盘同时按shift 和 :按键,再输入wq回车,即保存修改的设定(若要放弃保存退出输入q回车)。

  1. 重启软路由或重启网络

我个人比较喜好重启软路由,继续输入指令:

reboot

稍等一两分钟,即可重启。

  1. 连接网线

此时将我们上级路由/光猫出来的网线连接至我们设定的wan口上(比如,我设定为eth0口)。将我们的电脑连接至lan口(比如,我设定为eth1口)。

  1. 登录openwrt管理界面

在第三步设置默认网关,我设定为192.168.1.1。因此,我在浏览器输入192.168.1.1回车后,就可以看到如下界面,其中密码为步骤1所设定:

2.2 配置网络

  1. 多LAN口桥接

进入openwrt管理界面,选择:网络->接口->LAN->物理设置,将除wan口的其它以太网适配器eth勾选,并在下方点击“保存&应用”,这样就可以拥有多个LAN口了。

  1. WAN口拨号上网

如果软路由存在上级路由,则此处无需进行配置,当前通过网线连接的电脑已经可以上网。

若需软路由进行拨号,则进行如下操作:

进入openwrt管理界面,选择:网络->接口->WAN->基本设置,传输协议更改为PPPoE,点击切换协议,输入用户名和密码,并点击“保存&应用”,稍等片刻即可以拨号上网了。

2.3 配置存储

此步骤为扩增 openwrt内部软件包安装存储、Docker存储以及增加网络存储。由于esir的高大全版本基本已装好所需要的程序,所以此步骤视自己的需求而定。

  1. 进入指令窗口

esir高大全版本在管理界面即提供了指令窗口,选择 系统->TTYD终端。

在OpenWrt输入用户名即root,回车后输入你的密码.得到如下:

  1. 规划分区

输入指令:

lsblk

可以看到,软路由中只有一块硬盘sda,且其当前已有两个分区分别为:sda1和sda2,接下来分别对openwrt overlay、docker和网络存储,扩增内存。扩增方式也很简单就是创建一个新的分区挂载上去。

这里我为overlay扩增为5g内存,docker扩增为10g内存,剩下的全部为网络存储。需注意的是,如果有多块硬盘,可以按照以下步骤多划分几个分区,然后进行挂载到网络存储,当做nas使用。

  1. 创建分区

现在对我的硬盘sda(若存在多块硬盘可以修改下方的sda为其它),进行分区,输入指令:

cfdisk /dev/sda

回车后,可以看到当前此硬盘的分区情况:

其中,绿色字体为当前还为进行分区的空间,共有29.3G。

键盘向下移动至绿色 Free space,下方为New,按回车,会让输入分区的大小:

由于这一个分区是位overlay所划分,因此我这里输入5G,然后回车

继续,为docker划分10G,选择Free space回车后输入10G。

最后,剩下所有空间都交由网络存储,所以只分一个区,在Free space回车后,不修改空间数值,直接回车。

可以看到经过三此分区后,当前的硬盘分区列表,键盘控制左右键至下方的Write,回车后输入y,再回车:

键盘控制左右键至Quit退出。

  1. 格式化和挂载分区

对新创建的三个分区,即sda3/sda4/sda5进行格式化,输入指令:

mkfs.ext4 /dev/sda3

按回车后,即对sda3进行格式化。此后,以此将sda3更改为sda4和sda5,依次格式化。

格式化后,对分区进行挂载,输入指令:

mount /dev/sda3 /mnt/sda3

同样,将上述的sda3均改为sda4和sda5,将三个分区均进行挂载。

  1. 备份overlay中的文件至overlay对应的新建分区:

这里overlay的新分区,即为我设定的sda3,因此,输入指令:

cp -r /overlay/* /mnt/sda3
  1. 设置中进行挂载

进入openwrt管理界面,选择 系统->挂载点,选择下方的挂载点,点击添加。

勾选“启用此挂载点”,UUID选择sda3,挂载点选择“作为外部overlay使用”,点击“保存&应用”;

继续点击添加,勾选“启用此挂载点”,UUID选择sda4,挂载点选择“作为Docker数据分区使用”,点击“保存&应用”;

点击添加,勾选“启用此挂载点”,UUID选择sda5,挂载点选择“–自定义–”,输入/mnt/sda5,点击“保存&应用”。

最后,挂载情况如下:

记得,点击下方的“保存&应用”

为了确保,overlay的挂载情况,避免重启消失,在配置文件再进行修改:

再次进入 系统->TTYD终端,输入指令:

vi /etc/rc/local

键盘按i,进入编辑模式,在exit 0前方一行输入:

mount /dev/sda3 /overlay

修改完成后,键盘按esc退出编辑。键盘同时按 shift和 : ,输入wq回车(若不想保存修改则输入q回车)。

  1. 配置网络存储:

进入openwrt管理界面,选择 网络存储->网络共享,在共享目录中选择要挂载的分区,如我的sda5,名称可以随意,输入完成后点击添加。对于不需要共享的分区可在对应行最后面点击删除。最后,点击“保存&应用”

  1. 重启软路由

选择 系统->重启->执行重启

三、优化及使用

3.1 校园网无法访问

进入openwrt系统管理,选择网络->DHCP/DNS,取消重绑定保护,并点击

“保存&应用”

0%