Pluto固件编译笔记

前段时间我已经做到在电脑上交叉编译一个简单的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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【产品经理学习案例——AI翻译棒出海业务】

前言&#xff1a; 本文主要讲述了硬件产品在出海过程中&#xff0c;翻译质量、翻译速度和本地化落地策略是硬件产品规划需要考虑的核心因素。针对不同国家&#xff0c;需要优化翻译质量和算法&#xff0c;关注市场需求和文化差异&#xff0c;以便更好地满足当地用户的需求。同…

星际智慧农业系统(SAS),智慧农业的未来篇章

新月人物传记&#xff1a;人物传记之新月篇-CSDN博客 相关文章&#xff1a;星际战争模拟系统&#xff1a;新月的编程之道-CSDN博客 新月智能护甲系统CMIA--未来战场的守护者-CSDN博客 “新月智能武器系统”CIWS&#xff0c;开启智能武器的新纪元-CSDN博客 目录 星际智慧农业…

【蓝桥杯嵌入式入门与进阶】4.初读启动文件:粗略阅读,经常翻阅,知己知彼,百战百胜

目录 1.二者差异 1. 1适用芯片型号不同 1.2中断向量表差异 1.2.1 中断数量和种类 1.2.2 部分中断处理函数命名差异 1.2.3. 复位处理描述差异 1.2.4代码注释中的功能描述差异 1.2.5 DMA 通道中断处理函数差异 示例代码对比片段 startup_stm32g431xx.s startup_stm32…

unity中的动画混合树

为什么需要动画混合树&#xff0c;动画混合树有什么作用&#xff1f; 在Unity中&#xff0c;动画混合树&#xff08;Animation Blend Tree&#xff09;是一种用于管理和混合多个动画状态的工具&#xff0c;包括1D和2D两种类型&#xff0c;以下是其作用及使用必要性的介绍&…

C语言 --- 分支

C语言 --- 分支 语句分支语句含义if...else语句单分支if语句语法形式 双分支 if-else 语句语法形式 悬空else含义问题描述 多分支 if-else 语句语法形式 switch...case语句含义语法形式 总结 &#x1f4bb;作者简介&#xff1a;曾与你一样迷茫&#xff0c;现以经验助你入门 C 语…

pytorch实现长短期记忆网络 (LSTM)

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 LSTM 通过 记忆单元&#xff08;cell&#xff09; 和 三个门控机制&#xff08;遗忘门、输入门、输出门&#xff09;来控制信息流&#xff1a; 记忆单元&#xff08;Cell State&#xff09; 负责存储长期信息&…

C++:抽象类习题

题目内容&#xff1a; 求正方体、球、圆柱的表面积&#xff0c;抽象出一个公共的基类Container为抽象类&#xff0c;在其中定义一个公共的数据成员radius(此数据可以作为正方形的边长、球的半径、圆柱体底面圆半径)&#xff0c;以及求表面积的纯虚函数area()。由此抽象类派生出…

GEE | 计算Sentinel-2的改进型土壤调整植被指数MSAVI

同学们好&#xff01;今天和大家分享的是 “改进型土壤调整植被指数MSAVI”&#xff0c;它能够更准确地反映植被生长状态&#xff0c;且广泛应用于植被覆盖监测、生态环境评估等领域。 1. MSAVI 改进型土壤调整植被指数&#xff08;MSAVI&#xff09;是一种针对植被覆盖区域土…

deepseek+vscode自动化测试脚本生成

近几日Deepseek大火,我这里也尝试了一下,确实很强。而目前vscode的AI toolkit插件也已经集成了deepseek R1,这里就介绍下在vscode中利用deepseek帮助我们完成自动化测试脚本的实践分享 安装AI ToolKit并启用Deepseek 微软官方提供了一个针对AI辅助的插件,也就是 AI Toolk…

CodeGPT使用本地部署DeepSeek Coder

目前NV和github都托管了DeepSeek&#xff0c;生成Key后可以很方便的用CodeGPT接入。CodeGPT有三种方式使用AI&#xff0c;分别时Agents&#xff0c;Local LLMs&#xff08;本地部署AI大模型&#xff09;&#xff0c;LLMs Cloud Model&#xff08;云端大模型&#xff0c;从你自己…

[c语言日寄]C语言类型转换规则详解

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

FPGA 使用 CLOCK_DEDICATED_ROUTE 约束

使用 CLOCK_DEDICATED_ROUTE 约束 CLOCK_DEDICATED_ROUTE 约束通常在从一个时钟区域中的时钟缓存驱动到另一个时钟区域中的 MMCM 或 PLL 时使 用。默认情况下&#xff0c; CLOCK_DEDICATED_ROUTE 约束设置为 TRUE &#xff0c;并且缓存 /MMCM 或 PLL 对必须布局在相同…

Ollama 介绍,搭建本地 AI 大模型 deepseek,并使用 Web 界面调用

Ollama 是一个基于 Go 语言的本地大语言模型运行框架&#xff0c;类 Docker产品&#xff08;支持 list,pull,push,run 等命令&#xff09;&#xff0c;事实上它保留了 Docker 的操作习惯&#xff0c;支持上传大语言模型仓库(有 deepseek、llama 2&#xff0c;mistral&#xff0…

OpenEuler学习笔记(十四):在OpenEuler上搭建.NET运行环境

一、在OpenEuler上搭建.NET运行环境 基于包管理器安装 添加Microsoft软件源&#xff1a;运行命令sudo rpm -Uvh https://packages.microsoft.com/config/centos/8/packages-microsoft-prod.rpm&#xff0c;将Microsoft软件源添加到系统中&#xff0c;以便后续能够从该源安装.…

【Linux】从硬件到软件了解进程

个人主页~ 从硬件到软件了解进程 一、冯诺依曼体系结构二、操作系统三、操作系统进程管理1、概念2、PCB和task_struct3、查看进程4、通过系统调用fork创建进程&#xff08;1&#xff09;简述&#xff08;2&#xff09;系统调用生成子进程的过程〇提出问题①fork函数②父子进程关…

物联网 STM32【源代码形式-使用以太网】连接OneNet IOT从云产品开发到底层MQTT实现,APP控制 【保姆级零基础搭建】

物联网&#xff08;IoT&#xff09;‌是指通过各种信息传感器、射频识别技术、全球定位系统、红外感应器等装置与技术&#xff0c;实时采集并连接任何需要监控、连接、互动的物体或过程&#xff0c;实现对物品和过程的智能化感知、识别和管理。物联网的核心功能包括数据采集与监…

【背包问题】二维费用的背包问题

目录 二维费用的背包问题详解 总结&#xff1a; 空间优化&#xff1a; 1. 状态定义 2. 状态转移方程 3. 初始化 4. 遍历顺序 5. 时间复杂度 例题 1&#xff0c;一和零 2&#xff0c;盈利计划 二维费用的背包问题详解 前面讲到的01背包中&#xff0c;对物品的限定条件…

眼见着折叠手机面临崩溃,三星计划增强抗摔能力挽救它

据悉折叠手机开创者三星披露了一份专利&#xff0c;通过在折叠手机屏幕上增加一个抗冲击和遮光层的方式来增强折叠手机的抗摔能力&#xff0c;希望通过这种方式进一步增强折叠手机的可靠性和耐用性&#xff0c;来促进折叠手机的发展。 据悉三星和研发可折叠玻璃的企业的做法是在…

首发!ZStack 智塔支持 DeepSeek V3/R1/ Janus Pro,多种国产 CPU/GPU 可私有化部署

2025年2月2日&#xff0c;针对日益强劲的AI推理需求和企业级AI应用私有化部署场景&#xff08;Private AI&#xff09;&#xff0c;云轴科技 ZStack 宣布 AI Infra 平台 ZStack 智塔全面支持企业私有化部署 DeepSeek V3/R1/ Janus Pro三种模型&#xff0c;并可基于海光、昇腾、…

25寒假算法刷题 | Day1 | LeetCode 240. 搜索二维矩阵 II,148. 排序链表

目录 240. 搜索二维矩阵 II题目描述题解 148. 排序链表题目描述题解 240. 搜索二维矩阵 II 点此跳转题目链接 题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到…