Pluto固件编译笔记

news2025/2/5 1:39:15

前段时间我已经做到在电脑上交叉编译一个简单的c/c++程序,然后复制到pluto上运行。

要做到这一点,其实参考adi pluto官网的wiki就能做到了。

但这样有几个问题,只能做到简易程序,如果程序复杂,要调用更多库而SYSROOT里没有就不行了。还有就是每次复制完程序重启pluto后这个程序就没了。

所以接下来要想办法编译pluto的固件。

我找了很多地方,比较难找,英文资料里比较接近的是adi在github上的说明。但也比较复杂。好不容易找到了如下中文资料:

让程序在Pluto SDR上脱机运行——基于Pluto SDR的交叉编译_plutosdr-fw-v0.38-CSDN博客

如何编译Pluto SDR固件plutosdr-fw得到SD卡固件和交叉编译用的sysroot_pluto sdr固件移植-CSDN博客

让Pluto SDR完全脱机执行任务——实现开机运行特定脚本/程序_plutosdr 运行app-CSDN博客

其中,第一篇是我已经做到的。第二篇是我现在要做的。第三篇我还没到这一步但也是我关心的。

理论上,按第二篇做就应该能实现固件编译。但开源项目很容易碰到版本不匹配的问题——即使用这个作者在2024年4月底一模一样的命令,你可能达不到这个作者实现的效果。因为github开源库里的内容有变化了,另外ubuntu的apt库也有变化。这是我们玩开源项目经常碰到的问题。我这边就照着那个作者的步骤,加入我自己的笔记。

第一步,这位作者说他操作系统用了ubuntu 20.04 LTS。但我建议用ubuntu 18.04 LTS。因为20.04的apt装依赖库的时候会有一个libssl1.0你装不上,因为目前只提供1.1版本了。而你用ubuntu 18.04能装上。

第二步,需要装依赖库,而不是用git命令下载。如果你没用apt装git,肯定是下载不了的。

sudo apt-get install git build-essential ccache device-tree-compiler dfu-util fakeroot help2man libncurses5-dev libssl1.0-dev mtools rsync u-boot-tools bc python cpio zip unzip file wget libmpc-dev libgmp-dev flex bison

上面就是依赖库,除了最后两个我加的外,其他包与adi在pluto项目里写的是一模一样的,只是合并到一行里。参考GitHub - analogdevicesinc/plutosdr-fw: PlutoSDR Firmware 

第三步,就可以下载plutosdr-fw代码了,这一步是比较难的一步。我不建议你用recursive一次性下载这个项目下所有的子文件夹,因为这个库是非常大的。中国用户很可能因为网络问题中断,而导致之前下载到的也没了,因为git clone是没有断点续传功能的。

你要做的是先运行:

git clone https://github.com/analogdevicesinc/plutosdr-fw.git

然后用cd plutosdr-fw,到这个plutosdr-fw的文件夹下,然后再运行:

git clone https://github.com/analogdevicesinc/buildroot

这样你才能把子文件夹buildroot下载下来。同理hdl linux u-boot-xlnx都要用同样的方式来操作。

第四步,其实plutosdr-fw还没完全搞定,如果你细心你可以注意到2025年时plutosdr-fw已经更新到了0.39版本,而中国作者用的是0.38版本。我点了这个项目右上角的commits,翻了一下还有个0.37版本。我也纠结了好久到底要用哪个版本。

如果我用0.39版本,那么vivado版本是2023.2,越新的程序尺寸越大,而且还有个问题我看最新README里说交叉编译工具要用linaro而不是xilinx的gcc。而中国作者教程还是在用xilinx。有点矛盾,我想避开这个问题,所以不打算用0.39版本。

后来我又想用0.37版本,因为我翻到0.37版本时,还没提到要更换这个gcc交叉编译工具的问题。

但我发现0.37固件对应的vivado版本是2021.2,这个程序的尺寸反而比2022.2还大,所以我又放弃了。

所以我最终选择的是和中国作者一模一样的0.38版本,并且装了vivado 2022.2。

说了这么多,我想说的是,你应该要能够做到灵活地切换不同固件版本对应的源代码,包括子文件夹。

具体方式是,你先点右上角黑色commits,根据描述找到你需要的主版本,比如我根据注释PlutoSDR: Prepare for v0.38 release,找到了这个0359a0b版本。

点进去后,下面子文件夹也会有与之相对应的版本hash值。这些值你都要记下来。

然后依次访问主文件夹和各子文件夹,用git checkout <hash>的方式来切换。

第五步,是时候装vivado了,vivado尺寸非常大,而且是在线安装的,还需要自己去他们官网注册一个账号。你可以照着中国作者的链接和步骤来装,但记得vivado经常更新,而且连名字都有可能会改。

Downloads

我当时点这个链接进去,找到的程序名就跟中国作者截图不一样。

一旦点进去,可能出现的是最新的下载文件。我目前出现的是:

Vitis™ Core Development Kit - 2024.2  Full Product Installation

对应的安装包名字叫:

AMD Unified Installer for FPGAs & Adaptive SoCs 2024.2: Linux Self Extracting Web Installer

而中国作者让你下载的是

Xilinx Unified Installer 2022.2: Linux Self Extracting Web Installer

你会看到,除了年份不一样外,连下载的文件名也不一样,一个AMD开头,一个Xilinx开头,不熟悉的人不知道到底是不是同一个包,直到我根据网页上方大标题:

Vitis Core Development Kit - 2022.2  Full Product Installation

这样才确认,我要找的是同一种开发环境的包。当然我后来也没装2024.2或者2021.2,而是跟中国作者完全一模一样的2022.2,避免后面可能遇到的麻烦。

原作者的上面这个截图也挺重要,可以尽量少装点东西,但即使这样,也需要消耗80多G的硬盘空间。

第六步,配置环境变量。如果你把刚刚那个软件装到/opt/Xilinx下。就运行:

export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/opt/Xilinx/Vitis/2022.2/gnu/aarch32/lin/gcc-arm-linux-gnueabi/bin
export VIVADO_SETTINGS=/opt/Xilinx/Vivado/2022.2/settings64.sh

这样环境基本就配置完了,你可以到plutosdr-fw下运行make编译了,但编译过程记得也需要联网。

我当时其实也有点担心,毕竟adi官方要求0.38版本固件不能用xilinx的gcc,而要替换为linaro的。但我发现只要运行make命令,会自动下载linaro的gcc,我估计一切都体现在脚本里了。

上图就是make过程中提示正在从网上下载linaro的交叉编译工具的步骤。

但是有些包还是提示下载不成功。我当天试了很多遍都不行。

神奇的是,第二天重新开机再运行make后就行了,我怀疑是网络时好时坏导致的。

你可以看到上方终端窗口里提示编译成功了。下方文件夹里就是编译过程中陆陆续续下载的各种包,一部分是yesterday下载的,一部分是今天11点多下载的,包括昨天一直下不成的ad936x_ref_cal。我的经验是尽量一大早用手机流量下载,我没有用梯。

然后运行

ls -AGhl build

就能得到下面的输出,可以看到已经出现了官方刷机方式中所需要用到的文件了。 

现在有些国产pluto流行把固件放在sd卡里,而不是像官方那样在板子自带flash里运行。

那么还需要运行

make sdimg

但因为我这边用的是官方的代码,所以不支持这个指令。

第七步,获取SYSROOT

编译这个固件主要是为了得到SYSROOT,用来交叉编译自己写的小程序。

你自己编译的SYSROOT在/buildroot/output/staging/中

最后,我把我的这个虚拟机镜像分享出来,你可以下载我的镜像,直接在镜像中实现编译。

通过网盘分享的文件:pluto.zip
链接: https://pan.baidu.com/s/18OQ5EWn4pvjelt-0bDJluw 提取码: shao 

我用的虚拟机是VirtualBox 7.0.10 

系统用户名密码都是pluto

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

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

相关文章

弄懂Runable,Callable,Future之间的关系

JDK1.5之前&#xff0c;我们创建线程有这样两种方式 1.继承Thread类 2.连接实现Runnable接口 但是这两个方法我们都没有返回值&#xff0c;如果需要获取任务返回结果怎么办&#xff1f; 然后在JDK1.5之后&#xff0c;官方就提供了Callable和Future&#xff0c;有获取任务返…

Kafka中文文档

文章来源&#xff1a;https://kafka.cadn.net.cn 什么是事件流式处理&#xff1f; 事件流是人体中枢神经系统的数字等价物。它是 为“永远在线”的世界奠定技术基础&#xff0c;在这个世界里&#xff0c;企业越来越多地使用软件定义 和 automated&#xff0c;而软件的用户更…

Hugging Face GGUF 模型可视化

Hugging Face GGUF 模型可视化 1. Finding GGUF files (检索 GGUF 模型)2. Viewer for metadata & tensors info (可视化 GGUF 模型)References 无知小儿&#xff0c;仙家雄霸天下&#xff0c;依附强者才是唯一的出路。否则天地虽大&#xff0c;也让你们无路可走&#xff0…

小程序项目-购物-首页与准备

前言 这一节讲一个购物项目 1. 项目介绍与项目文档 我们这里可以打开一个网址 https://applet-base-api-t.itheima.net/docs-uni-shop/index.htm 就可以查看对应的文档 2. 配置uni-app的开发环境 可以先打开这个的官网 https://uniapp.dcloud.net.cn/ 使用这个就可以发布到…

【hot100】刷题记录(8)-矩阵置零

题目描述&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2…

一文讲解Spring中应用的设计模式

我们都知道Spring 框架中用了蛮多设计模式的&#xff1a; 工厂模式呢&#xff0c;就是用来创建对象的&#xff0c;把对象的创建和使用分开&#xff0c;这样代码更灵活。代理模式呢&#xff0c;是用一个代理对象来控制对真实对象的访问&#xff0c;可以在访问前后做一些处理。单…

springboot集成钉钉,发送钉钉日报

目录 1.说明 2.示例 3.总结 1.说明 学习地图 - 钉钉开放平台 在钉钉开放文档中可以查看有关日志相关的api&#xff0c;主要用到以下几个api&#xff1a; ①获取模板详情 ②获取用户发送日志的概要信息 ③获取日志接收人员列表 ④创建日志 发送日志时需要根据模板规定日志…

优选算法的灵动之章:双指针专题(一)

个人主页&#xff1a;手握风云 专栏&#xff1a;算法 目录 一、双指针算法思想 二、算法题精讲 2.1. 查找总价格为目标值的两个商品 2.2. 盛最多水的容器 ​编辑 2.3. 移动零 2.4. 有效的三角形个数 一、双指针算法思想 双指针算法主要用于处理数组、链表等线性数据结构…

PyQt4学习笔记1】使用QWidget创建窗口

目录 一、创建一个简单的 QWidget 窗口 二、设置窗口属性 1. 设置窗口标题 2. 设置背景颜色 3. 设置窗口大小和位置 4. 设置窗口模式 5. 关闭窗口 6. QWidget 及其子控件的样式 三、添加控件到 QWidget 1. 添加按钮 2. 添加标签 3. 添加文本框 4. 控件布局管理 四、自定义样式 …

pycharm 中的 Mark Directory As 的作用是什么?

文章目录 Mark Directory As 的作用PYTHONPATH 是什么PYTHONPATH 作用注意事项 Mark Directory As 的作用 可以查看官网&#xff1a;https://www.jetbrains.com/help/pycharm/project-structure-dialog.html#-9p9rve_3 我们这里以 Mark Directory As Sources 为例进行介绍。 这…

【C++】string类(上):string类的常用接口介绍

文章目录 前言一、C中设计string类的意义二、string类的常用接口说明1. string类对象的常见构造2. string类对象的容量操作2.1 size、capacity 和 empty的使用2.2 clear的使用2.3 reserve的使用2.4 resize的使用 3. string类对象的访问及遍历操作3.1 下标[ ] 和 at3.2 迭代器it…

从理论到实践:Linux 进程替换与 exec 系列函数

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 在Linux中&#xff0c;进程替换&#xff08;Process Substitution&#xff09;是一个非常强大的特性&#xff0c;它允许将一个进程的输出直接当作一个文件来处理。这种技术通常用于Shell脚本和命令行操作中…

3 卷积神经网络CNN

1 Image Classification (Neuron Version) – 1.1 Observation 1 1.2 Observation 2 如果不同的receptive field需要相同功能的neuron&#xff0c;可以使这些neuron共享参数 1.3 Benefit of Convolutional Layer 2 Image Classification (Filter Version) 不用担心filter大小…

详解Linux系统的终端(Terminal)以及分类(各种tty开头的设备文件)

目录 终端(Terminal)的概念和作用终端(Terminal)在Linux中被视为设备,每个终端有自己的设备文件tty三个字母的来源(tty名字的来源)如何查看当前终端的设备文件常见终端的分类1-串口终端02-虚拟控制台终端&#xff08;Virtual Console&#xff09;03-伪终端&#xff08;Pseudo T…

强化学习数学原理(五)——随机近似与随机

一、Motivating example 首先有个random variable(随机变量)X&#xff0c;我们的目标就是求出他的expectation E(x)&#xff0c;我们有一些iid的采样&#xff0c;xi&#xff0c;从1到n&#xff0c;求出均值 但是如果有很多数据&#xff0c;我需要等很久&#xff0c;把所有数据都…

线性数据结构:单向链表

放弃眼高手低&#xff0c;你真正投入学习&#xff0c;会因为找到一个新方法产生成就感&#xff0c;学习不仅是片面的记单词、学高数......只要是提升自己的过程&#xff0c;探索到了未知&#xff0c;就是学习。 考虑到可能有小白在合并代码时出现各种细节问题&#xff0c;本文…

线程互斥同步

前言&#xff1a; 简单回顾一下上文所学&#xff0c;上文我们最重要核心的工作就是介绍了我们线程自己的LWP和tid究竟是个什么&#xff0c;总结一句话&#xff0c;就是tid是用户视角下所认为的概念&#xff0c;因为在Linux系统中&#xff0c;从来没有线程这一说法&#xff0c;…

《苍穹外卖》项目学习记录-Day11订单统计

根据起始时间和结束时间&#xff0c;先把begin放入集合中用while循环当begin不等于end的时候&#xff0c;让begin加一天&#xff0c;这样就把这个区间内的时间放到List集合。 查询每天的订单总数也就是查询的时间段是大于当天的开始时间&#xff08;0点0分0秒&#xff09;小于…

SAP HCM 回溯分析

最近总有人问回溯问题&#xff0c;今天把12年总结的笔记在这共享下&#xff1a; 12年开这个图的时候总是不明白是什么原理&#xff0c;教程看N次&#xff0c;网上资料找一大堆&#xff0c;就是不明白原理&#xff0c;后来为搞明白逻辑&#xff0c;按照教材的数据一样做&#xf…

Med-R2:基于循证医学的检索推理框架:提升大语言模型医疗问答能力的新方法

Med-R2 : Crafting Trustworthy LLM Physicians through Retrieval and Reasoning of Evidence-Based Medicine Med-R2框架Why - 这个研究要解决什么现实问题What - 核心发现或论点是什么How - 1. 前人研究的局限性How - 2. 你的创新方法/视角How - 3. 关键数据支持How - 4. 可…