NanoPi R4S/zh

From FriendlyELEC WiKi
Jump to: navigation, search

English

Contents

1 介绍

Overview
Front
Back
Front
Back
外壳
外壳
外壳
外壳
  • 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 接口布局

NanoPi R4S Layout
NanoPi R4S Layout
  • 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地址:
R4s-friendlywrt-macaddress.png
在命令行查看:
Friendlywrt-macaddress-ifconfig.png
如何确定一个地址是否是全球唯一的MAC地址:

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

4 快速入门

4.1 准备工作

要开启你的NanoPi R4S新玩具,请先准备好以下硬件

  • NanoPi R4S主板
  • MicroSD卡/TF卡: Class10或以上的 8GB SDHC卡
  • 一个USB Type-C接口的外接电源,建议使用传统5V/3A及以上的电源适配器(注:部分QC/PD快速充电器可能存在兼容性问题),可选用以下或类拟规格的电源适配器:
  • 如果需要开发与编译,则需要一台可以联网的电脑,推荐安装Ubuntu 18.04 64位系统,并使用下面的脚本初始化开发环境:

4.2 经测试可选用的TF卡

请参考: TF Cards We Tested

4.3 调试串口参数配置

使用以下串口参数:

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

4.4 安装系统

4.4.1 下载系统固件

4.4.2 通过TF卡运行系统

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

固件文件
rk3399-sd-friendlywrt-21.02-YYYYMMDD.img.gz FriendlyWrt系统固件,基于OpenWrt 21.02构建,内核版本 5.15.y
rk3399-sd-friendlywrt-21.02-docker-YYYYMMDD.img.gz 预装了Docker的FriendlyWrt系统固件,基于OpenWrt 21.02构建,内核版本 5.15.y
rk3399-sd-friendlywrt-22.03-YYYYMMDD.img.gz FriendlyWrt系统固件,基于OpenWrt 22.03构建,内核版本 5.15.y
rk3399-sd-friendlywrt-22.03-docker-YYYYMMDD.img.gz 预装了Docker的FriendlyWrt系统固件,基于OpenWrt 22.03构建,内核版本 5.15.y
rk3399-sd-friendlycore-lite-focal-5.15-arm64-YYYYMMDD.img.gz 精简版64位FriendlyCore系统固件,基于Ubuntu core 20.04构建,内核版本 5.15.y
rk3399-sd-debian-buster-desktop-4.19-arm64-YYYYMMDD.img.gz Debian10系统固件,内核版本 4.19.y
其他固件
Github Actions云编译版本 FriendlyWrt
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管理页面:

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

5.5 建议的安全性设置

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

  • 设置一个安全的密码

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

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

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

  • 只允许本地设备访问luci

编辑 /etc/config/uhttpd,将原来的0.0.0.0和[::]地址改为本地lan的地址,例如:

	# HTTP listen addresses, multiple allowed
	list listen_http	192.168.2.1:80
	list listen_http	[fd00:ab:cd::1]:80
 
	# HTTPS listen addresses, multiple allowed
	list listen_https	192.168.2.1:443
	list listen_https	[fd00:ab:cd::1]:443

完成后重启服务:

/etc/init.d/uhttpd restart
  • 检查防火墙设置

根据实际情况调整设置

5.6 安全的关机操作

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

5.7 恢复出厂设置

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

firstboot && reboot

5.8 安装软件包

5.8.1 设置第三方软件源

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

src/gz openwrt_base https://mirrors.cloud.tencent.com/openwrt/releases/22.03.2/packages/aarch64_cortex-a53/base
src/gz openwrt_luci https://mirrors.cloud.tencent.com/openwrt/releases/22.03.2/packages/aarch64_cortex-a53/luci
src/gz openwrt_packages https://mirrors.cloud.tencent.com/openwrt/releases/22.03.2/packages/aarch64_cortex-a53/packages
src/gz openwrt_routing https://mirrors.cloud.tencent.com/openwrt/releases/22.03.2/packages/aarch64_cortex-a53/routing
src/gz openwrt_telephony https://mirrors.cloud.tencent.com/openwrt/releases/22.03.2/packages/aarch64_cortex-a53/telephony
src/gz friendlywrt_packages file://opt/packages
  • 注意, friendlywrt_packages需要保留, 否则会缺少一些系统依赖;
  • 如果你使用的是 friendlywrt 21.02 的固件, 则将上面的 22.03.2 替换成 21.02.5;
  • 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.8.2 在线安装软件包

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

5.8.3 安装离线ipk软件包

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

5.9 FriendlyWrt的一些常见问题

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

5.10 禁用IPv6

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

. /root/setup.sh
disable_ipv6
reboot

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

5.11 配置用户按键的功能

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

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

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

5.12 使用USB2LCD查看IP和温度

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

. /root/setup.sh
init_lcd2usb
poweroff

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

5.13 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档),或降低转速

如下如示,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.14 读取EEPROM中的Mac Address

5.14.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.15 如何使用USB WiFi

5.15.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.15.2 如何使用USB WiFi作为AP

(1) 把USB WiFi插入NanoPi-R4S的USB端口,推荐使用以下列表中支持AP模式的WiFi芯片模块:
R2swrt+usbwifi-20210831.jpg
注:符合以上WiFi芯片型号并符合以上VID&PID信息的USB无线网卡都可以使用,支持的型号不局限于某个品牌某个型号
(2) 插入USB WiFi后,点击上方菜单栏的“系统>重启”,点击“执行重启”按钮重启NanoPi-R4S

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

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

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

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

5.15.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.15.4 更改系统默认的WiFi热点配置

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

/lib/wifi/mac80211.sh

5.16 玩转Docker应用

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

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

5.16.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.16.3 使用外接硬盘来扩展Docker可用空间

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

Friendlywrt mount nvme opt-zh.jpg

  • 输入命令 "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空间已扩容:

Friendlywrt docker info-zh.jpg

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

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

解决办法:

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

5.17 挂载smbfs共享资源

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


5.18 使用sdk编译软件包

5.18.1 安装编译环境

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

5.18.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.18.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.18.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.19 使用 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 安装内核头文件

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

6.5 编译内核头文件安装包

请参考 https://github.com/friendlyarm/sd-fuse_rk3399/blob/kernel-5.15.y/test/test-build-kernel-header-deb.sh

6.6 配置状态灯

先确定一下系统是否已经存在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.7 读取EEPROM中的Mac Address

6.7.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.7.2 程序中读取

安装libi2c:

sudo apt-get install libi2c0:arm64
cd /lib/aarch64-linux-gnu/
sudo ln -s libi2c.so.0 libi2c.so

新建源代码getmac.c:

#include <stdio.h>
#include <stdlib.h>
#include <linux/i2c-dev.h>
#include <fcntl.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <linux/i2c.h>
 
#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 Debian10 桌面系统的使用

7.1 Debian10桌面系统简介

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

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

Debian10-lxde.png

7.2 Account & Password

7.3 帐户与密码

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

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

7.4 查看IP地址

由于Debian Buster主机名默认为FriendlyElec.lan, 所以可以使用ping命令来获得IP地址:

ping FriendlyElec.lan

7.5 通过ssh登录Debian

ssh pi@FriendlyElec.lan

默认密码为pi

7.6 更新软件包

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

$ sudo cp /etc/apt/sources.list /etc/apt/sources.list.org
$ sudo sed -i -e 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list

7.6.2 更新软件包列表

$ sudo apt-get update

7.7 安装x11vnc远程桌面

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

7.7.1 安装x11vnc

sudo apt-get install x11vnc

7.7.2 设置VNC登录密码

sudo x11vnc -storepasswd /etc/x11vnc.pwd

7.7.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

7.7.4 测试远程桌面

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

7.8 安装内核头文件

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

7.9 更改时区

7.9.1 检查当前时区

timedatectl

7.9.2 列出所有时区

timedatectl list-timezones

7.9.3 设置时区 (比如上海)

sudo timedatectl set-timezone Asia/Shanghai

7.10 更换开机LOGO和桌面墙纸

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

  • 下载脚本
git clone https://github.com/friendlyarm/sd-fuse_rk3399.git -b kernel-4.19
cd sd-fuse_rk3399
  • 编译内核并重新打包固件
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
./mk-emmc-image.sh debian-buster-desktop-arm64

7.10.2 更换桌面墙纸

修改如下配置文件:

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

7.10.3 恢复出厂设置

在终端上执行如下命令:

sudo firstboot && sudo reboot

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

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

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

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

sudo systemctl mask udisks2
sudo reboot

7.13 设置中文语言与输入法

7.13.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.13.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即可切换中英文输入法, 右上角也出现了输入法图标, 右击右上角的输入法图标, 在弹出菜单中可以切换输入法, 如下图所示:
Debian10-chinese-im.png

7.14 安装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.28.1.6104-788f82488_arm64.deb

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

7.15 安装Docker

因Docker安装程序需要使用iptables, 而Debian默认使用的是nftables, 因此安装前先设置Debian使用传统的iptables:

sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy

7.15.1 安装docker

curl -fsSL https://get.docker.com | bash

验证是否安装成功:

sudo docker info

7.15.2 不使用sudo运行docker

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

验证是否成功:

docker images

7.15.3 测试运行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 Buildroot Linux系统的使用

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

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


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

9 如何编译系统

9.1 编译 Openwrt/Friendlywrt

9.1.1 下载源代码

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

9.1.1.1 版本FriendlyWrt 21.02
mkdir friendlywrt21-rk3399
cd friendlywrt21-rk3399
git clone https://github.com/friendlyarm/repo --depth 1 tools
tools/repo init -u https://github.com/friendlyarm/friendlywrt_manifests -b master-v21.02 \
        -m rk3399.xml --repo-url=https://github.com/friendlyarm/repo  --no-clone-bundle
tools/repo sync -c  --no-clone-bundle
9.1.1.2 版本FriendlyWrt 22.03.2
mkdir friendlywrt22-rk3399
cd friendlywrt22-rk3399
git clone https://github.com/friendlyarm/repo --depth 1 tools
tools/repo init -u https://github.com/friendlyarm/friendlywrt_manifests -b master-v22.03 \
        -m rk3399.xml --repo-url=https://github.com/friendlyarm/repo  --no-clone-bundle
tools/repo sync -c  --no-clone-bundle

9.1.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

9.1.3 二次编译

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

9.2 单独编译u-boot

./build.sh uboot

9.3 单独编译kernel

./build.sh kernel

9.4 单独编译friendlywrt

./build.sh friendlywrt

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

cd friendlywrt
make -j1 V=s

9.5 编译 FriendlyCore-Focal

9.6 搭建编译环境

建议使用64位的Ubuntu 18.04系统,需要安装如下软件包:

sudo apt-get -y install bison g++-multilib git gperf libxml2-utils make python-networkx zip
sudo apt-get -y install flex curl libncurses5-dev libssl-dev zlib1g-dev gawk minicom
sudo apt-get -y install openjdk-8-jdk
sudo apt-get -y install exfat-fuse exfat-utils device-tree-compiler liblz4-tool
sudo apt-get -y install android-tools-fsutils
sudo apt-get -y install swig
sudo apt-get -y install python-dev python3-dev

9.7 安装交叉编译器

9.7.1 安装aarch64-linux-gcc 6.4

该编译器可用来编译Linux系统的内核和u-boot,用以下命令下载并安装:

git clone https://github.com/friendlyarm/prebuilts.git -b master --depth 1
cd prebuilts/gcc-x64
cat toolchain-6.4-aarch64.tar.gz* | sudo tar xz -C /

然后将编译器的路径加入到PATH中,用vi编辑vi ~/.bashrc,在末尾加入以下内容:

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

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

. ~/.bashrc

这个编译器是64位的,不能在32位的PC Linux系统上运行,安装完成后,用以下命令可以验证是否安装成功:

aarch64-linux-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gcc
COLLECT_LTO_WRAPPER=/opt/FriendlyARM/toolchain/6.4-aarch64/libexec/gcc/aarch64-cortexa53-linux-gnu/6.4.0/lto-wrapper
Target: aarch64-cortexa53-linux-gnu
Configured with: /work/toolchain/build/aarch64-cortexa53-linux-gnu/build/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/6.4-aarch64
--with-sysroot=/opt/FriendlyARM/toolchain/6.4-aarch64/aarch64-cortexa53-linux-gnu/sysroot --enable-languages=c,c++
--enable-fix-cortex-a53-835769 --enable-fix-cortex-a53-843419 --with-cpu=cortex-a53
...
Thread model: posix
gcc version 6.4.0 (ctng-1.23.0-150g-FA)

9.8 简易方式为FriendlyCore-Focal系统编译内核与uboot

9.8.1 下载工具与固件

下载脚本与friendlycore-focal系统的映象文件,映象文件也可以在网盘的images-for-eflasher目录找到:

git clone https://github.com/friendlyarm/sd-fuse_rk3399.git -b kernel-4.19
cd sd-fuse_rk3399
wget http://112.124.9.243/dvdfiles/RK3399/images-for-eflasher/friendlycore-focal-arm64-images.tgz
tar xvzf friendlycore-focal-arm64-images.tgz

9.8.2 编译内核

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

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

9.8.3 编译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

9.8.4 生成新固件

将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

9.9 普通方式为FriendlyCore-Focal系统编译kernel与uboot

9.9.1 编译 FriendlyCore-Focal 内核4.19版本源代码

git clone https://github.com/friendlyarm/kernel-rockchip --depth 1 -b nanopi4-v4.19.y kernel-rockchip
cd kernel-rockchip
make distclean
touch .scmversion
export PATH=/opt/FriendlyARM/toolchain/6.4-aarch64/bin/:$PATH
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- nanopi4_linux_defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- nanopi4-images

编译完成后会生成 kernel.img 和 resource.img 这两个文件,可使用工具sd_update烧写它们到TF卡或eMMC上。

9.9.2 编译 FriendlyCore-Focal uboot-2017.09 源代码

[ -d rkbin ] || git clone https://github.com/friendlyarm/rkbin
(cd rkbin && git reset 25de1a8bffb1e971f1a69d1aa4bc4f9e3d352ea3 --hard)
git clone https://github.com/friendlyarm/uboot-rockchip --depth 1 -b nanopi4-v2017.09
cd uboot-rockchip
make distclean
export PATH=/opt/FriendlyARM/toolchain/6.4-aarch64/bin/:$PATH
./make.sh nanopi4

编译完成后会生成 uboot.img、trust.img 和 rk3399_loader_v1.24.126.bin这3个文件,其中rk3399_loader_v1.24.126.bin需要重命名为MiniLoaderAll.bin,可使用工具sd_update烧写它们到TF卡或eMMC上。

9.10 制作用于量产的启动卡或者烧写文件

如果要自已做启动卡,定制文件系统,或制作用于批量生产的img文件,可参考这个github仓库:
sd-fuse_rk3399

10 性能测试方法

10.1 测试网口速率

10.1.1 软件下载

Windows下可以到官网下载 iperf3测速工具: https://iperf.fr/iperf-download.php
Linux系统可以用以下命令安装: sudo apt-get install iperf3

10.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

11 更多OS

11.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:

12 Link to Rockchip Resources

13 资源链接

13.1 手册原理图等开发资料

14 已知问题及解决办法

    • Q: 绿联18W QC快充头无法供电?
    • A: 它需要等待几秒钟才能上电,有一个QC握手过程,用普通5V/3A充电头,或者其他快充头例如绿联30W没有发现此问题。

15 更新日志

15.1 2022-09-06

15.1.1 FriendlyWrt更新说明:

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

15.2 2022-08-03

15.2.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版本一致

15.3 2022-07-27

15.3.1 FriendlyWrt更新说明:

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

15.4 2021-10-29

15.4.1 FriendlyWrt更新说明:

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

15.5 2021-08-31

15.5.1 FriendlyWrt更新说明:

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

15.6 2020-12-24

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