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/Linuxglibc,其中glibcGNU项目提供的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

番外篇

终端光标跳转快捷键

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

push [特殊字符] present

push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…

Java项目中常用的中间件及其高频问题避坑

Java项目中常用的中间件及其高频问题避坑如下: 一、常用中间件分类及作用 1. ​​消息队列中间件​​ ​​作用​​:解耦系统、异步通信、削峰填谷。​​代表产品​​: ​​Kafka​​:高吞吐量流处理,适合日志收集、实时分析。​​RocketMQ​​:金融级可靠性,支持事务消…

发布一个angular的npm包(包含多个模块)

为什么要发布npm包 根本原因时为了能够在更广泛的区域复用代码,比如公司不支持一般的外部网络,但是支持npm包的下载,那么就可以发布npm包,然后在公司内使用。 angular的npm不同吗 angular library angular 目前已经到angular20…

Web后端基础:Maven基础

课程内容: 初始MavenMaven概述 Maven模型Maven仓库介绍Maven安装与配置 IDEA集成Maven依赖管理单元测试 1.初始Maven 1.1介绍 Maven 是一款用于管理和构建Java项目的工具,是Apache旗下的一个开源项目 。 Apache 软件基金会,成立于1999年7月…

http协议同时传输文本和数据的新理解

首先,承认本人对于http协议认知确实不够,从来没有仔细研究这一块。 其次,这回确实要把自己十几年的理解更新一下了,主要还是自己过去没有认真研究过http协议。 这一次是这么回事,碰到一个情况,要在一次消…

《安富莱嵌入式周报》第354期: 开源36通道16bit同步数据采集卡,开源PoE以太网GPIB,分体式键盘DIY,微软WSL开源,USB转车载以太网

周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版: https://www.bilibili.com/video/BV1kJThzxETY/ 《安富莱嵌入式周报》第354期: 开源36通道16bit同…

Hyperlane 框架详解与使用指南

hyperlane 是一个高性能且轻量级的 Rust HTTP 框架,设计目标是简化现代 Web 服务的开发,同时兼顾灵活性和性能表现。本文将详细介绍 hyperlane 框架的核心功能、API 设计、生命周期模型、路由支持及性能测试结果,帮助开发者快速掌握和应用该框…

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…

一个小小的 flask app, 几个小工具,拼凑一下

1. 起因, 目的: 自己的工具,为自己服务。给大家做参考。项目地址: https://github.com/buxuele/flask_utils 2. 先看效果 3. 过程: 一个有趣的 Flask 工具集:从无到有的开发历程 缘起:为什么要做这个项目&#xff…

织梦dedecms怎样用标签调用随机数?

​在使用织梦模板建站中,随机数作为一个偶尔使用到的参数,在具体使用中虽然用的少,但是今天跟版网小编给大家介绍下,大家可以参考下: 实现随机数的调用可以使用下面的js: 方法一:js代码 Math…

访问服务器项目,服务器可以ping通,但是端口访问不到

原因:端口未开放 假设项目部署服务器为205,在90服务器访问205项目 1、首先在205确定项目启动,看端口是否占用 # Windows(检查端口占用) netstat -ano | findstr "8103"期望输出: TCP 0.0.…

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…

华为云Flexus+DeepSeek征文 | 基于ModelArts Studio、DeepSeek大模型和Dify搭建网站智能客服助手

目录 一、前言 二、ModelArts Studio(MaaS)介绍与应用场景 2.1ModelArts Studio(MaaS)介绍 2.2 ModelArts Studio(MaaS)使用场景 2.3 开通MaaS服务 2.4 开通DeepSeek-V3商用服务 三、华为云Flexus简介 3.1 …

『uniapp』url拦截屏蔽 避免webview中打开淘宝店铺自动跳转淘宝

目录 分析1. wv.overrideUrlLoading2. 参数 `mode: allow`3. 参数 `match: ^(http|https)://.*`4. 回调函数 `function(e) { console.warn(allow url:, e.url); }`作用:可能的应用场景:核心代码总结欢迎关注 『uniapp』 专栏,持续更新中 欢迎关注 『uniapp』 专栏,持续更新…

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…

Zookeeper 和 Kafka 版本与 JDK 要求

Apache Zookeeper 和 Apache Kafka 在不同版本中对 JDK 的要求如下表所示(基于官方文档和历史版本记录整理): 1. Zookeeper 版本与 JDK 要求 Zookeeper 版本要求的最低 JDK 版本说明3.4.x 系列JDK 6生产环境建议用 JDK 8(旧版兼容性强)。3.5.x 系列(3.5.5+)JDK 83.5.0 …

V837s-SDK Telnetd服务连接不上异常解决

目录 前言 一、检查 Telnetd 服务是否启动 二、问题解决 总结 前言 在基于 V837s-SDK 进行开发的过程中,Telnetd 服务连接不上是一个较为常见且棘手的问题。Telnet 作为一种远程登录协议,在开发调试时为我们提供了便捷的远程操作方式。若其连接出现异常,将严重影响开发进度…

滑动窗口最大值和最小值

题目: 思路: 窗口进行滑动时,需要快速获取min和max,因此需要一个结构来保存最值,而不是临时计算。动态的最值更新容易联想到单调栈,但是这里需要频繁增删元素,因此用双端队列,front…

JVM——对象创建全家桶:JVM中对象创建的模式及最佳实践

引入 在 Java 应用开发中,对象创建是最基础且高频的操作,但往往也是性能优化的关键切入点。想象一个在线阅读平台,每天需要创建数百万个 Book 对象来统计阅读数据。如果每个对象的创建过程存在内存浪费或性能瓶颈,累积效应将导致…