Yocto 项目下通过网络更新内核、设备树及模块

Yocto 项目下通过网络更新内核、设备树及模块

前言

在 Yocto 项目的开发过程中,特别是在进行 BSP(Board Support Package)开发时,经常需要调整特定软件包的版本,修改内核、设备树以及内核模块。然而,每次更改后都重新刷写整个镜像不仅耗时,而且效率低下。本文主要记录一种快速迭代开发的方法,即通过网络更新内核镜像、设备树以及内核模块,以 ST 开发板为例进行详细说明。

调整特定软件包版本

在 Yocto 项目中,调整特定软件包的版本是一个常见的需求。

以调整 libgpiod 版本为例,libgpiod 是一个专为 Linux 系统设计的 GPIO 控制库。它提供了一组用户空间的API,使开发者能够方便地与GPIO设备进行交互,进行配置、读取和控制操作。

  • 定位配方:
    • 在 openembedded 目录下使用 find . -name "libgpiod" 搜索 libgpiod 的配方路径。
    • 确定 meta-openembedded/meta-oe/recipes-support/libgpiod 目录下是否存在你需要的指定版本配方。(如果不存在,那就要考虑自己编写配方,这里不考虑这种情况)
      在这里插入图片描述
  • 指定版本:在 conf/local.conf 文件中添加 PREFERRED_VERSION_libgpiod = "1.6.4%" 来指定 libgpiod 的版本为 1.6.4。
  • 编译配方:使用 bitbake libgpiod 命令编译 libgpiod 版本,观察是否下载指定版本的软件包。
  • 检查依赖关系:确保没有其他配方依赖于更高版本的 libgpiod。如果有,可能需要调整这些配方的依赖关系或更新它们以兼容 1.6.4 版本。
  • 清理构建缓存:如果之前构建过其他版本的 libgpiod,可能需要清理构建缓存以避免潜在冲突。可以使用 bitbake -c cleansstate libgpiodbitbake -c cleanall libgpiod 命令。
  • 验证版本:在构建完成后,可以使用 bitbake -e libgpiod PV 命令来验证实际使用的 libgpiod 版本号(PV 代表 Package Version)。

查找所有配方

Yocto 项目构建系统依赖于大量的配方(Recipe)文件,这些文件定义了如何构建软件包、镜像和其他组件。当需要定位某个特定软件或镜像的配方时,使用 bitbake -s 命令结合 grep 进行筛选是一个实用的技巧。

  • 使用 bitbake -s 列出所有配方及其版本。
  • 使用 bitbake-layers show-recipes,列出所有可用的配方及其所属的层,这有助于我们理解配方的来源和层次结构。

如何通过网络更新内核镜像和设备树

  • 定位配方文件:在 Yocto 中,内核镜像的配方通常符合 linux-<?> 的命名规则,这种命名模式用于表示特定于某个硬件平台或特定功能的 Linux 内核配方(Recipe)。如 linux-imx(i.MX系列)、linux-stm32mp(STM32MP系列)、linux-qcom(针对高通平台)、linux-rpi(针对树莓派平台)等。

    • 使用 bitbake -s | grep linux 查找当前构建系统中可能涉及 Linux 内核的源代码、模块、设备树或其他与 Linux 相关组件的配方。
    • 如果不确定哪个目标是内核镜像,可以查看与 Linux 内核相关的配方文件(通常位于 meta-layers 的recipes-kernel/ 目录下)。这些配方文件会定义如何构建 Linux 内核,并且可能会包含构建镜像的目标。如下图的 linux-stm32mp
      在这里插入图片描述
  • 使用 bitbake linux-stm32mp 触发一个完整的内核镜像构建过程,这个过程会自动去下载源代码、配置、编译和打包内核镜像等步骤。

  • 查找编译包的位置

    • Yocto 在编译完成后会生成很多文件,通常位于<work dir>/<build dir>/tmp 目录下。其中,内核编译完成后的镜像文件一般会放在类似于<work dir>/<build dir>/tmp/work/<machine name>-<distro name>-linux/<kernel name>/<version>-r<revision>/image/boot/的目录下。这里的< >需要根据具体的 Yocto工程配置来确定。比如说我这里:

    • 内核镜像 uImage :build/tmp-glibc/work/stm32mp15_loar_gateway-ostl-linux-gnueabi/linux-stm32mp/6.1.82-stm32mp-r2-r0/image/boot/uImage

    • 设备树文件 : build/tmp-glibc/work/stm32mp15_loar_gateway-ostl-linux-gnueabi/linux-stm32mp/6.1.82-stm32mp-r2-r0/image/boot/stm32mp15-loar-gateway.dtb
      在这里插入图片描述

  • 通过网络更新目标板的内核

    • 进入编译好的镜像目录,替换目标板 /boot 目录下的 uimage,dtb
    • scp uImage root@10.2.1.62:/boot/uImage
    • scp stm32mp15-loar-gateway.dtb root@10.2.1.62:/boot/stm32mp15-loar-gateway.dtb
    • reboot 重启目标板重新加载镜像和设备树
      在这里插入图片描述

如何通过网络更新内核模块

Linux 内核模块可分为内置模块和可加载的模块。

内置模块

  • 内置模块被静态地编译进了内核,它们与内核的其他部分一起被编译成一个单独的二进制文件,并在系统启动时被加载到内存中。所以在更新内核时同样会更新内置模块。

  • 要确定一个模块是不是内置模块,可以运行以下命令,这个文件包含了当前内核版本下所有内置模块的名称。如果一个模块在这个文件中,那么它就是内置的。

    cat /lib/modules/$(uname -r)/modules.builtin
    

可加载模块

  • 可加载模块(也称为动态内核模块)是可以在系统运行时动态地加载和卸载的内核代码块。
  • Yocto 内核编译完成后的内核模块文件一般会放在类似于<work dir>/<build dir>/tmp/work/<machine name>-<distro name>-linux/<kernel name>/<version>-r<revision>/image/lib/modules/的目录下。这里的< >需要根据具体的 Yocto工程配置来确定。比如说我这里的 SPI 模块:build/tmp-glibc/work/stm32mp15_loar_gateway-ostl-linux-gnueabi/linux-stm32mp/6.1.82-stm32mp-r2-r0/image/lib/modules/6.1.82/kernel/drivers/spi/spi-stm32.ko
    在这里插入图片描述
  • 进入编译好的模块目录,替换目标板 /lib/modules/ 目录下对应的内核模块,比如 spi-stm32.ko
    • scp spi-stm32.ko root@10.2.1.62:/lib/modules/6.1.82/kernel/drivers/spi/spi-stm32.ko
    • 更新模块依赖::sudo depmod
    • 加载新模块:sudo insmod /lib/modules/6.1.82/kernel/drivers/spi/spi-stm32.ko
    • 或者使用 modprobe 自动处理模块依赖关系:sudo modprobe spi-stm32

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

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

相关文章

算法每日双题精讲——双指针(移动零,复写零)

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 别再犹豫了&#xff01;快来订阅我们的算法每日双题精讲专栏&#xff0c;一起踏上算法学习的精彩之旅吧&#xff01;&#x1f4aa;…

数据库的使用02:SQLServer的连接字符串、备份、还原、SQL监视相关设置

目录 一、连接字符串 【本地连接字符串】 【远程连接字符串】 二、备份 三、还原 &#xff08;1&#xff09;还原数据库-bak、btn文件 &#xff08;2&#xff09;附加数据库mdf文件 四、SQL监视器的使用 一、连接字符串 【本地连接字符串】 server DESKTOP-FTH2P3S; Da…

使用SearXNG-搭建个人搜索引擎(附国内可用Docker镜像源)

介绍 SearXNG是聚合了七十多种搜索服务的开源搜索工具。我们可以匿名浏览页面&#xff0c;不会被记录和追踪。作为开发者&#xff0c;SearXNG也提供了清晰的API接口以及完整的开发文档。 部署 我们可以很方便地使用Docker和Docker compose部署SearXNG。下面给出Docker部署Se…

【笔记】LLC电路工作频点选择 2-2 开关管与滤波压力

LLC谐振变换器稳态工作波形分析 - 知乎&#xff0c;上面这篇文的结论相较MPS那篇文章的结论更严格。我们分析一下它的频点选择为什么会更窄&#xff1a; 1. LLC电路模型 电流滞后的特性就是电路呈感性注意这里也是开关管ZVS开通。 2.工作循环的波形 iLm的波形&#xff0c;最终…

mysql数据同步到sql server

准备工作 下载安装sql server express 2019 现在安装SSMS(连接数据库GUI) 安装ssms for mysql 需要注意的是在上面的步骤中首先需要根据指导安装mysql ODBC 设置express sa用户密码登录 --change password for login user "sa"Security > Logins > sa (rig…

【SpringMVC】——Cookie和Session机制

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;实践 1&#xff1a;获取URL中的参数 &#xff08;1&#xff09;PathVariable 2&…

B2119 删除单词后缀

B2119 删除单词后缀 #include <iostream> using namespace std; # include <string.h> #include <ctype.h> #include <algorithm> #include <string.h> int main(){ string word; cin>>word; if(word.size()> 2 && word.…

AlohaKit:一组.NET MAUI绘制的开源控件

前言 今天大姚给大家分享一组.NET MAUI绘制的开源、免费&#xff08;MIT License&#xff09;UI控件库&#xff1a;AlohaKit。 MAUI介绍 .NET MAUI是一个开源、免费&#xff08;MIT License&#xff09;的跨平台框架&#xff08;支持Android、iOS、macOS 和 Windows多平台运…

漫谈分布式唯一ID

文章目录 本系列前言UUIDDB自增主键Redis incr命令号段模式雪花算法 本系列 漫谈分布式唯一ID&#xff08;本文&#xff09;分布式唯一ID生成&#xff08;二&#xff09;&#xff1a;leaf分布式唯一ID生成&#xff08;三&#xff09;&#xff1a;uid-generator分布式唯一ID生成…

C语言:文件操作2(又一万字?)

关于文件操作这章内容&#xff0c;因为知道内容较多所以我分两篇发了&#xff0c;但是还是没料到第二篇还是这么多&#xff0c;达到了一万多字&#xff01;&#xff01;&#xff01;作者本人真的将知识点进行了超级详解分析并且举了很多例子来帮助读者理解&#xff0c;本文章较…

STM32标准库-待机模式

1.1 STM32待机模式简介 STM32单片机具有低功耗模式&#xff0c;包括睡眠、停止和待机三种。 运行状态下&#xff0c;HCLK为CPU提供时钟。HCLK由AHB预分频器分频后直接输出得到。 低功耗模式选择需考虑电源消耗、启动时间和唤醒源。 睡眠模式停CPU不停外设时钟&#xff1b; 停止…

C++内存分区

内存分区 C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理的 全局区&#xff1a;存放全局变量和静态变量以及常量&#xff08;不包括局部常量&#xff09; 栈区&#xff1a;由编译器自动分配释…

大数据面试题--kafka夺命连环问

1、kafka消息发送的流程&#xff1f; 在消息发送过程中涉及到两个线程&#xff1a;一个是 main 线程和一个 sender 线程。在 main 线程中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给双端队列&#xff0c;sender 线程不断从双端队列 RecordAccumulator 中拉取…

ElasticSearch备考 -- 集群配置常见问题

一、集群开启xpack安全配置后无法启动 在配置文件中增加 xpack.security.enabled: true 后无法启动&#xff0c;日志中提示如下 Transport SSL must be enabled if security is enabled. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security b…

LeetCode:485.最大连续1的个数——简单题简单做

目录 题目——485.最大连续1的个数 题目分析&#xff1a; 图解如下&#xff1a; 代码如下 题目——485.最大连续1的个数 给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,0,1,1,1] 输出&#xff1a;3 解…

如何在Android中自定义property

在Android中创建自定义的属性&#xff08;Android property&#xff09;通常用于调试、性能调优或传递应用和系统之间的信息。 以下是如何在Android中创建和使用自定义属性的步骤&#xff1a; 1. 定义属性 在Android中&#xff0c;属性是以“属性名称属性值”形式定义的键值对…

web——sqliabs靶场——第二关

今天来搞第二关&#xff0c;来看看是什么咸蛋 1.判断是否存在sql注入漏洞 输入1 存在sql注入&#xff0c;报错语句为 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near LIMIT 0,1 …

时序预测 | Python基于CNN-transformer时间序列预测

时序预测 | Python基于CNN-transformer时间序列预测 目录 时序预测 | Python基于CNN-transformer时间序列预测预测效果基本介绍参考资料 预测效果 基本介绍 时序预测 | Python基于CNN-transformer时间序列预测 Cnn-transformer-自适应稀疏自注意力ASSA-对比归一化contranorm预…

windows中docker安装redis和redisinsight记录

创建一个Redis运行容器&#xff0c;命令如下 docker run -it -d --name redis -p 6379:6379 redis --bind 0.0.0.0 --protected-mode no -d 代表Redis容器后台运行 --name redis 给创建好的容器起名叫redis -p 6379:6379 将容器的6379端口映射到宿主机的6379端口&#xff0c;注…

ClickHouse创建账号和连接测试

在之前搭建ClickHouse的时候&#xff0c;把账户相关的去掉了&#xff0c;所以登录和连接的时候是不需要账号密码的&#xff0c;但是实际项目中&#xff0c;肯定是需要根据需要创建账号。 一&#xff0c;创建账号 1&#xff0c;进入到 /etc/clickhouse-server&#xff0c; 编辑…