NanoPi R4S/zh

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