ADIS16475 的 Yocto 层

Yocto layer for ADIS16475

上下文

最近我在我的 Yocto 构建中包含 adis 驱动程序时遇到了问题。我在 adis forum 上问过这个问题,但在有人回答之前就找到了解决方案。 adis 论坛不是很用户友好,答案也很长,我决定在这里回答我的问题,然后 link 在论坛中回答。

问题

我正在用 yocto 构建我的 OS 并且我想为 IMU ADIS1607 添加一个驱动程序(除了易用性是一个优点)作为这个构建的一部分.

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

我目前正在尝试为 ADIS16507 添加驱动程序。理想情况下,我想添加 ADIS16475,但我可以做其他事情,前提是它能很好地工作。

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

但是 ADIS linux 内核对于我打算做的事情来说太重了。因此,我正在尝试使用 yocto 构建一个更轻的 OS(同样,如前所述,我可能需要将我的工作移植到不同的平台上)。

我有一些关于如何做到这一点的想法,但是 none 他们很容易工作,我不确定要追求哪一个。

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

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

获取正确的版本

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

配置内核以内置编译 ADIS16475 drivers

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

简短近似理论

如果您对内核编译了解不多,请不要担心,我也不了解。但为了让您了解我们在做什么,这里有一个大概的快速解释:内核 makefile 包含文件列表必须编译。对于 drivers 有 2 个重要的。 obj-y 包含将内置的文件,obj-m 包含将编译为可加载模块的文件。为了使这些列表可配置,它们在 makefile 中使用如下语句定义:

obj-${CONFIG_MYDRIVER} += my_driver.o

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

自定义内核配置

基本上我们想要做的是创建我们自己的 configuration fragment file。为此,您需要设置 yocto 层(我假设如果您正在阅读本文 post,您就知道该怎么做)。在您的图层中,您应该添加以下文件夹:

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

(请注意,我们附加了 linux-raspberrypi_5.10,因为它是 meta-raspberrypi 中负责 libc 编译的那个。如果您正在为另一台机器编译,请查看 [= 中的文件94=]。您的 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

据我所知和经验,这是您必须构建的最少 driver 数量才能正常工作。

完成此操作后,您的 driver 将内置,但不会对 Pi 产生任何影响。那是因为我们缺少正确的覆盖。

建设 adis16475-overlay.dts

为了解决这个问题,我受到 this post 的广泛启发,所以如果您遇到问题,您可能想检查一下。 这里的问题是,据我所知,driver对应的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。该文件将包含我们要为此 driver 进行的所有其他配置。在其中首先添加:

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

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

然后我们将利用这个文件来启用一些必要的 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,因为它就是我的机器。此过程没有理由不与 meta-raspberrypi 层中的任何其他机器一起工作。只要记得在我放置 raspberrypi4-64 的所有地方替换你的机器名称,你应该没问题。

希望这能帮助迷失在 Yoctoverse 中的其他一些人

干杯