ADIS16475 的 Yocto 层 简短的近似理论自定义内核配置

如何解决ADIS16475 的 Yocto 层 简短的近似理论自定义内核配置

背景

最近,我在 Yocto 构建中遇到了 adis 驱动程序的问题。我已经在 adis forum 上问过这个问题,但在任何人回答之前就找到了解决方案。 adis 论坛对用户不是很友好,而且答案很长,我决定在这里回答我的问题并将其链接到论坛中。

问题

我正在使用 yocto 构建我的操作系统,并且我想添加一个用于 IMU ADIS1607 的驱动程序(除了易用性之外的任何东西都是加分项)作为此构建的一部分。

我正在 raspberryPi4 上构建原型。我的应用程序使用 ADIS IMU (ADIS16507)。由于最终产品的电路板未固定,我正在使用 Yocto 构建我的操作系统。

我目前正在尝试为 ADIS16507 添加驱动程序。理想情况下,我想添加 ADIS16475,但我可以使用其他东西,只要它运行良好。

首先,我检查了我是否能够按照 doc 中的规定为 RaspberryPi 构建整个 ADIS linux 内核。使用该内核,驱动程序运行良好。

然而,ADIS linux 内核对于我打算做的来说太重了。因此,我正在尝试使用 yocto 构建一个更轻量级的操作系统(另外,如前所述,我可能需要将我的工作移植到不同的平台上)。

我有一些关于如何去做的想法,但没有一个很容易奏效,我不确定该追求哪一个。

  • 我认为最简单的方法是自行编译 ADIS16475 并将其添加到 Yocto 构建中。但是,我在使用 Yocto 时遇到了一些困难,并且无法成功编译

  • 或者,我确实找到了 yocto 的 libiio 层,但它似乎需要大量代码才能读取 IMU 值。

  • 我知道 libiio layerPyadi-iio 的 python 绑定,它看起来很容易使用(虽然我没有尝试用 yocto 添加它)但计算速度是一个问题我和我宁愿使用 C/C++ 而不是 python。

  • 最后我也找到了 meta-adi layer。我认为在我的情况下它不相关,但我发现的文档相当稀疏,我不确定该层应该做什么。

欢迎任何关于我应该使用哪种方法的指针(也许我错过了一个明显的简单方法)。

解决方法

所以这是我找到的解决方案。我们将使用 ADIS16475,它是自 5.10 版以来标准 libc 的一部分。然后我们将从 ADIS 中获取相应的设备树覆盖,并添加相关变量以使其与其他设备树覆盖一起编译。

获取正确的版本

为此,我们需要 libc 5.10 或更高版本,因为早期版本不包含 adis16475.c 源文件。然而,只有最新的 yocto 版本 Hardknott 使用 5.10 版本。所以最简单的事情就是切换到 Yocto 的 Hardknott 分支。请记住,如果您使用其他层,出于兼容性原因,您可能还需要更改版本。

配置内核以编译内置的 ADIS16475 驱动程序

在这里,我们将深入了解内核编译,因此有一些事情需要了解

简短的近似理论

如果您不太了解内核编译,请不要担心,我也不知道。但这里有一个大概的快速解释,以便您了解我们在做什么:内核 makefile 包含必须执行的文件列表编译。对于司机来说,有两个重要的。 obj-y 保存将被内置的文件,obj-m 保存将被编译为可加载模块的文件。为了使这些列表可配置,它们在 makefile 中使用以下语句进行定义:

obj-${CONFIG_MYDRIVER} += my_driver.o

这个想法是您可以将外部字段中的 CONFIG_MYDRIVER 设置为“m”或“y”。如果您将它设置为其他任何内容,makefile 中的行将被忽略并且您的文件将不会被编译。所以基本上我们要做的就是将正确的变量设置为 rigth 值,以便 yocto 编译我们的驱动程序。

自定义内核配置

基本上我们想要做的是创建我们自己的 configuration fragment file。为此,您需要设置 yocto 层(我假设您在阅读这篇文章时知道如何操作)。在您的图层中,您应该添加以下树状:

meta-my-layer
|
- recipe-kernel
  |
  - linux
    |
    - linux-raspberrypi_5.10.bbappend
    |
    -linux-raspberrypi
     |
     -adis16475.cfg

(请注意,我们附加了 linux-raspberrypi_5.10,因为它是 meta-raspberrypi 中负责 libc 编译的那个。如果您正在为另一台机器编译,请查看 recipe-kernel/linux 中的文件。您的 bsp甚至可能实际使用 poky/meta/recipe-kernel/linux 中的那些)

现在剩下要做的就是通过在 linux-raspberrypi_5.10.bbappend 中添加以下几行将 adis16475.cfg 添加到我们的源中:

FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
SRC_URI += "file://adis16475.cfg"

并通过添加到文件中实际在 adis16475.cfg 中设置您的配置:

CONFIG_SPI_MASTER=y
CONFIG_IIO=y
CONFIG_ADIS16475=y
CONFIG_IIO_KFIFO_BUF=y
CONFIG_SPI_BCM2835=y

就我的知识和经验而言,这是您为使其工作而必须构建的最少驱动程序。

完成此操作后,您将内置驱动程序,但不会对 Pi 产生任何影响。那是因为我们缺少正确的叠加层。

构建 adis16475-overlay.dts

为了解决这个问题,我受到了 this post 的广泛启发,所以如果您遇到问题,您可能需要查看一下。 这里的问题是,据我所知,驱动对应的overlay不是由libc提供的,至少5.10版本没有。所以我们将不得不有点狡猾。首先从 adis 获取叠加层并将其复制到 recipe-kernel/linux/linux-raspberrypi

完成此操作后,我们将通过将 recipe-kernel/linux/linux-raspberrypi_5.10.bbappend 修改为如下所示来为 yocto 查找源代码:

FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
SRC_URI += "file://adis16475.cfg \
            file://adis16475-overlay.dts;subdir=git/arch/${ARCH}/boot/dts/overlays"

我们添加的最后一行告诉 yocto 在哪里获取我们的 .dts 文件以及将它放在哪里(以及其他覆盖)。

最后我们要做的是将我们的覆盖添加到要编译的覆盖和设备树的列表中。为此,我们将机器配置文件 raspberrypi4-64.conf。有关它的更多详细信息here

首先在您的层 conf 文件夹中,创建 machine/raspberrypi4-64-extra.conf。此文件将保存我们要为此驱动程序进行的所有附加配置。首先在其中添加:

# Create the device trees and overlay list with necessary drivers
KERNEL_DEVICETREE =  " \
                      ${RPI_KERNEL_DEVICETREE} \
                      ${RPI_KERNEL_DEVICETREE_OVERLAYS} \
                      overlays/adis16475.dtbo \
                     "

这将设置要编译的设备树列表。它添加了 pi(两个第一个变量)和我们的 adis16475 覆盖所需的 RPI 设备树和覆盖。

然后我们将利用这个文件来启用一些必要的 raspberrypi 特定配置选项。添加:

# Enable RPI specific options in config.txt
ENABLE_SPI_BUS = "1"
RPI_EXTRA_CONFIG = '\ndtoverlay=adis16475\n'

最后你需要告诉 yocto 使用这个额外的配置。最通用的方法是在您的 local/local.conf 中添加以下行:

# Enables the DIP hardware support
require conf/machine/${MACHINE}-dip-extra.conf

一旦完成,假设您确实将图层添加到了 bblayers.conf 文件中,并且您的机器在 local.con 文件中设置为 raspberrypi4-64,那么其他一切都应该可以正常工作。

关于机器类型的说明

在这里我使用设置为 raspberrypi4-64 的机器,因为它是我拥有的机器。这个过程没有理由不与来自元树莓派层的任何其他机器一起工作。只要记住在我放置 raspberrypi4-64 的任何地方替换你机器的名称,你应该没问题。

希望这能帮助其他一些在 Yoctovers 中迷路的人

干杯

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-