办网站需流程,网站建立与推广,品牌网络营销方法分析,如何制作视频短片Yocto 项目下通过网络更新内核、设备树及模块
前言
在 Yocto 项目的开发过程中#xff0c;特别是在进行 BSP#xff08;Board Support Package#xff09;开发时#xff0c;经常需要调整特定软件包的版本#xff0c;修改内核、设备树以及内核模块。然而#xff0c;每次…Yocto 项目下通过网络更新内核、设备树及模块
前言
在 Yocto 项目的开发过程中特别是在进行 BSPBoard 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 libgpiod 或 bitbake -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-imxi.MX系列、linux-stm32mpSTM32MP系列、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-rrevision/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 目录下的 uimagedtbscp uImage root10.2.1.62:/boot/uImagescp stm32mp15-loar-gateway.dtb root10.2.1.62:/boot/stm32mp15-loar-gateway.dtbreboot 重启目标板重新加载镜像和设备树
如何通过网络更新内核模块
Linux 内核模块可分为内置模块和可加载的模块。
内置模块 内置模块被静态地编译进了内核它们与内核的其他部分一起被编译成一个单独的二进制文件并在系统启动时被加载到内存中。所以在更新内核时同样会更新内置模块。 要确定一个模块是不是内置模块可以运行以下命令这个文件包含了当前内核版本下所有内置模块的名称。如果一个模块在这个文件中那么它就是内置的。 cat /lib/modules/$(uname -r)/modules.builtin可加载模块
可加载模块也称为动态内核模块是可以在系统运行时动态地加载和卸载的内核代码块。Yocto 内核编译完成后的内核模块文件一般会放在类似于work dir/build dir/tmp/work/machine name-distro name-linux/kernel name/version-rrevision/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 root10.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