ubuntu 22.04搭建SOC开发环境
目录
AArch64位编译器命名规则
安装交叉工具链编译
安装aarch64-none-elf工具链
安装aarch64-none-linux-gnu工具链
启动板载系统
板卡启动方式
硬件连接
准备阶段
硬件连接
udev规则配置
启动流程
开发板外观图
硬件准备清单
硬件连接
SSH登录系统
设置Windows为WLAN共享模式
设置以太网IP
开发板配置静态IP
基本概念
配置静态IP
编辑
SSH登录验证
SSH安装
修改SSH配置文件
SSH登录验证
硬件连接
登录验证
番外篇
终端光标跳转快捷键
虚拟机: VMware
操作系统版本: ubuntu 22.04
文本编辑器: vscode
开发板: LubanCat-RK3568
USB转TTL模块:CH340
AArch64位编译器命名规则
aarch64
是全新的64
位指令集,aarch64
前缀直接表明64
位架构,64
位架构统一了浮点支持,无需像arm32
用eabihf
标记硬浮点;
[arch] [-vendor] [-os] [-abi] [-gcc/g++]
arch:
目标芯片架构, RK3568开发板为Cortex-A55内核,架构为aarch64
vendor:
工具链提供商,当工具链不依赖特定芯片厂商,采用none替代
OS:
用于明确目标设备的操作环境
,当os
字段值为none
时,表示目标设备无操作系统(裸机),当os
字段值为linux
时,表示目标设备运行linux操作系统;当
os
字段值为none
时,适用场景如下:
- 单片机、嵌入式系统初始化代码
Bootloader
开发- 内核引导阶段代码
RTOS
(实时操作系统)开发当
os
字段值为linux
时,适用场景如下:
Linux
应用程序- 内核模块
- 驱动程序
abi:
工具链提供应用二进制接口,elf
表示裸机,GNU 表示GNU
/Linux
的glibc,其中glibc
是GNU
项目提供的C
标准库实现,为Linux
系统和其他基于GNU
工具链的操作系统提供核心API。
安装交叉工具链编译
RK3568为ARM Cortex-A55内核(基于ARMV8-A架构),64位架构,目标开发板需要运行裸机程序,因此选择交叉编译工具链为 aarch64-none-elf-gcc;
首先查看当前ubuntu系统运行的cpu架构,方便官网下载与当前系统架构匹配的工具链;
官网地址:Arm GNU 工具链下载 – Arm Developer
安装aarch64-none-elf工具链
步骤一:将下载到本地的工具链上传到ubuntu系统下的自定义目录,解压该文件;
tar -xJvf arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf.tar.xz
步骤二:查看解压后的bin目录所在路径,将此路径添加到~/.bashrc中;
sudo vim ~/.bashrc
bashrc
是Bash Shell
的 运行时配置文件,可以设置环境变量,将自定义路径添加到系统路径中,在bashrc
文件最后一行添加如下内容,需要注意路径替换;
export PATH="/home/shuju/Linux/ToolChain/aarch64-none-elf/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-elf/bin:$PATH"
步骤三:使能环境变量,使配置文件生效;
source ~/.bashrc
步骤四:验证安装是否成功
aarch64-none-elf-gcc -v
安装aarch64-none-linux-gnu工具链
RK3568为ARM Cortex-A55内核(基于ARMV8-A架构),64位架构,目标开发板需要运行U-Boot程序,U-Boot
虽然属于裸机开发,但U-Boot
是为 Linux 系统启动服务的,因此需要同时使用 裸机工具链 和 Linux 交叉编译工具链;
步骤一:将下载到本地的工具链上传到ubuntu系统下的自定义目录,解压该文件;
tar -xJvf arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz
步骤二:查看解压后的bin目录所在路径,将此路径添加到~/.bashrc中;
~/.
bashrc
文件最后一行添加如下内容,需要注意路径替换
export PATH="/home/shuju/Linux/ToolChain/aarch64-none-linux-gnu/arm-gnu-toolchain-14.2.rel1-x86_64-aarch64-none-linux-gnu/bin:$PATH"
步骤三:使能环境变量,使配置文件生效;
source ~/.bashrc
步骤四:验证安装是否成功
aarch64-none-linux-gnu-gcc -v
启动板载系统
运行板卡时需要三个步骤:烧录系统,启动系统 ,系统登录;
LubanCat-RK3568开发板出厂时默认烧录Debian系统镜像,所以无需烧录系统镜像;
板卡启动方式
LubanCat-RK3568开发板具有板载eMMC并留有TF卡槽的板卡,支持eMMC和SD卡两种启动方式,启动流程如下:
当SD卡有镜像时,则优先使用sd卡进行启动;
当SD卡没有镜像,emmc有镜像则使用emmc的镜像进行启动;
sd卡和emmc都没有镜像,则不会启动;
由于LubanCat-RK3568开发板emmc中烧录了Debian系统镜像,本文选择以emmc的方式启动系统;
硬件连接
准备阶段
步骤一:windows安装USB TO TTL模块的驱动程序
步骤二:VMware虚拟机配置
需要关闭Ubuntu虚拟机,只开启VMware界面
由于VMware默认拦截外部USB设备,所以VMware需要启用USB穿透,按照下图配置;
步骤三:ubuntu虚拟机安装串口终端工具
启动ubuntu虚拟机,安装串口终端工具minicom
sudo apt install minicom
硬件连接
鲁班猫2 TX → TTL模块 RX
鲁班猫2 RX → TTL模块 TX
鲁班猫2 GND → TTL模块 GND
点击虚拟机--->点击可移动设备--->点击usb serial---->点击连接到虚拟机
查看内核是否识别USB TO TTL
lsusb
手动加载驱动,查看设备节点
sudo modprobe ch341 # 显式加载驱动(CH340在Linux内核中通常命名为ch341)
sudo ls /dev/ttyUSB*
采用dmesg查看内核日志,dmesg指令用于查看Linux内核环形缓冲区(kernel ring buffer)消息,内核在启动和运行过程中会输出大量日志信息,包括硬件检测、驱动程序加载、系统错误等,这些信息会被临时存储在内核的环形缓冲区中,而
dmesg
就是用来读取和显示这些消息的工具;
sudo dmesg | tail -n 10 # 查看内核日志是否有 "ch341-uart converter now attached to ttyUSB0"
根据dmesg日志可以看出,系统最初成功识别了
CH340
设备并创建了ttyUSB0
节点,但随后被brltty
(盲文显示终端程序)占用并断开了连接,其中brltty是
一种专为视障人士设计的软件工具,主要功能是将计算机或移动设备屏幕上的文本内容实时转换为可触摸的盲文点,并通过外接的盲文终端硬件呈现给用户;
如果用户确定不需要盲文支持,可以选择永久禁用
brltty,执行如下指令
移除 brltty,然后重新插拔 USB 设备再确定设备节点,若确定存在ttyUSB0设备节点之后,务必断开电源;
# 卸载brltty
sudo apt-get remove --purge brltty# 检查设备节点是否存在
sudo ls /dev/ttyUSB*
udev规则配置
步骤一: udev规则文件存放在
/etc/udev/rules.d/
目录下,系统启动时会自动加载这些规则,首先创建一个新的 udev 规则文件;
sudo vim /etc/udev/rules.d/99-ch340.rules
步骤二: 将如下内容写入到99-ch340.rules文件中
# CH340/CH341 USB转TTL模块udev规则SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE="0666", SYMLINK+="ttyCH340"
各字段解释如下:
SUBSYSTEM=="tty"
:只匹配串口设备ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523"
:指定 CH340 设备MODE="0666"
:为所有用户设置设备权限为读写;SYMLINK+="ch340-tty"
:创建固定的符号链接,避免设备节点名称变化;
步骤三:保存并应用规则
# 重新加载所有 udev 规则
sudo udevadm control --reload-rules#触发规则应用
sudo udevadm trigger
启动流程
开发板外观图
硬件准备清单
硬件连接
依次检查内核是否识别USB TO TTL, 检查设备节点/dev/ttyUSB0是否存在,当两项条件满足,先执行如下指令,再接通电源,此时以串口方式进行登录,账号名与密码需要联系厂家获得;
sudo minicom -D /dev/ttyUSB0 -b 1500000
SSH登录系统
为方便快速构建临时网络,需要将 Windows 主机变为网络中枢,所以需要开启本地Windows的WLAN 共享模式,当 Windows 开启 WLAN 共享时,系统会强制将共享目标网卡有线网卡的 IP 设置为
192.168.137.1
,子网掩码255.255.255.0
。这是Internet连接共享的强制规则,无法直接修改;
设置Windows为WLAN共享模式
设置以太网IP
开发板配置静态IP
通过 DHCP(动态主机配置协议)自动获取的 IP 地址,由于会定期变更,称之为动态IP;
由用户手动固定分配给设备的 IP 地址称为静态IP,特点是不会自动变更,但是需要手动修改,由于Windows强制将共享目标网卡的 IP地址设置为
192.168.137.1,因此需要将开发板IP地址配置为
同一网段内;
基本概念
IP地址:标识网络中的唯一设备,由 网络部分 和 主机部分 组成
- IP 地址:
192.168.137.200
- 子网掩码:
255.255.255.0
(用于划分网络和主机部分)- 网络地址:通过
IP地址 & 子网掩码
计算得出,即192.168.137.0
(表示设备所属的局域网)- 主机地址:
200
(表示局域网内的具体设备)
子网掩码:划分网络与主机的 “剪刀”,通过二进制掩码确定 IP 地址的 网络部分 和 主机部分
- IP 地址:
192.168.137.200
- 子网掩码:
255.255.255.0 (
二进制:11111111.11111111.11111111.00000000)
- 前 24 位(
192.168.137
)是网络部分,后 8 位(200
)是主机部分- 判断不同设备是否处于同一网段:两台设备的 IP 地址与子网掩码按位 “与” 后,若网络地址相同,则属于同一局域网,可直接通信;否则需通过网关转发
网关:跨网络通信的 “大门,当设备需要与 不同网段的设备通信时,数据必须先发送到 网关(通常是路由器的IP地址),由网关转发
DNS服务器(Domain Name System Server,域名系统服务器): 负责将人类易读的域名(如
www.baidu.com
)解析为计算机能识别的IP 地址(如14.215.177.38
)
# 常见公共 DNS 服务器# 阿里云DNS:IPv4:223.5.5.5、223.6.6.6# 114 DNS:IPv4:114.114.114.114# 腾讯云 DNS:IPv4:119.29.29.29# 百度 DNS:IPv4:180.76.76.76# Google DNS:IPv4:8.8.8.8
配置静态IP
步骤一:以串口登录方式登录到开发板,首先检查网络是否联通,即判断目标主机是否返回应答数据包;
sudo ping www.baidu.com
步骤二:查看网卡名称
ifconfig
本文采用systemd-network配置开发板静态IP,配置方案如下:
- IP地址:192.168.137.200
- 子网掩码:255.255.255.0
- 网关:192.168.137.1
- DNS服务器:114.114.114.114 8.8.8.8
步骤三:检查systemd-networkd是否正在运行
# 检查systemd-networkd的状态
sudo systemctl status systemd-networkd --no-pager# 如果没有运行,执行如下指令启动
sudo systemctl enable --now systemd-networkd
Linux系统中,可能存在多个网络管理工具同时运行的情况,这会导致
systemd-networkd
的配置失效或冲突,需要临时停止其他网络管理工具,在系统重启后,这些工具自动恢复运行,因为systemd-networkd
的配置优先级高,如果systemd-networkd
在启动时先于其他工具完成网卡配置,其他工具可能检测到网卡已被占用,从而放弃管理,从而使得静态 IP 生效;
常见的网络管理工具
步骤四:临时停止其他网络管理工具
# 检查除systemd-networkd正在运行的网络管理工具
sudo systemctl --type=service | grep -E 'NetworkManager|networking|wicd|dhcpcd'# 禁用NetworkManager(如果存在)
sudo systemctl disable --now NetworkManager# 禁用传统networking服务(Debian/Ubuntu)
sudo systemctl disable --now networking
步骤五:创建网络配置文件
网络配置文件命名规则
sudo vim /etc/systemd/network/10-eth1.network
步骤五: 新创建的配置文件中新增如下内容,注意按照实际情形进行替换
[Match]
Name=eth1[Network]
Address=192.168.137.200/24
# 同时使用Gateway和Route参数确保路由生效
Gateway=192.168.137.1
Route=0.0.0.0/0 via 192.168.137.1[Route]
Destination=0.0.0.0/0
Gateway=192.168.137.1
Metric=1024
步骤六:重启网络服务
sudo systemctl restart systemd-networkd# 检查配置是否生效
ip a show eth1
步骤七:测试网络连通性
SSH登录验证
SSH安装
# 更新软件源
sudo apt update# 安装SSH客户端
sudo apt install openssh-client# 安装SSH服务端
sudo apt install openssh-server
修改SSH配置文件
sudo vim /etc/ssh/sshd_config
# 重启ssh,使配置生效
sudo /etc/init.d/ssh restart
SSH登录验证
硬件连接
登录验证
ubuntu 22.04虚拟机重启,打开终端,按照如下方式登录
# ssh 用户名@IP地址
ssh shuju@192.168.137.200