在 Busybox 中启用它然后使用“bitbake custom-image”后找不到`i2cdetect`命令

问题描述 投票:0回答:1

我正在遵循 Shawn Hymel (Digi-Key) 的嵌入式 Linux 教程中的每一步。

设备:STM32MP157D-DK1

设置: 主机 PC 是 Linux Mint 21.1 Vera。

目标:在设备上运行命令

i2cdetect
(使用 Yocto,将正确的映像刷新到微型 SD 上并从中启动)。

采取的步骤:我正在一一遵循教程步骤,但无法运行命令。总结所采取的步骤,以

i2cdetect
结尾未找到:

sudo apt install -y bc build-essential chrpath cpio diffstat gawk git texinfo wget gdisk python3 python3-pip`
sudo apt install -y libssl-dev

从 git 克隆必要的分支:

git clone git://git.yoctoproject.org/poky.git
git clone git://github.com/STMicroelectronics/meta-st-stm32mp
git clone git://github.com/openembedded/meta-openembedded.git

检查确认邓菲尔分店。

  • 编辑local.conf:

    vi conf/local.conf
    

    机器=“stm32mp1”

    还评论了

    EXTRA_IMAGE_FEATURES

    #EXTRA_IMAGE_FEATURES ?=“调试调整”

  • 编辑custom-image.bb(本文不需要更改密码,但要遵守所有细节):

    vi recipes-core/images/custom-image.bb
    
    SUMMARY = "My custom linux image."
    IMAGE_INSTALL = "packagegroup-core-boot ${CORE_IMAGE_EXTRA_INSTALL}"
    IMAGE_LINGUAS = " "
    LICENSE = "MIT"
    
    inherit core-image
    inherit extrausers
    
    # Set rootfs to 200 MiB by default
    IMAGE_OVERHEAD_FACTOR ?= "1.0"
    IMAGE_ROOTFS_SIZE ?= "204800"
    
    # Change root password (note the capital -P)
    EXTRA_USERS_PARAMS = "  \
    usermod -P 'toor' root \
    "
    
  • 编辑 bblayers.conf:

    vi conf/bblayers.conf
    
    # POKY_BBLAYERS_CONF_VERSION is increased each time 
    build/conf/bblayers.conf
    # changes incompatibly
    POKY_BBLAYERS_CONF_VERSION = "2"
    
    BBPATH = "${TOPDIR}"
    BBFILES ?= ""
    
    BBLAYERS ?= " \
      /home/barak/Projects/yocto/poky/meta \
      /home/barak/Projects/yocto/poky/meta-poky \
      /home/barak/Projects/yocto/poky/meta-yocto-bsp \
      /home/barak/Projects/yocto/meta-openembedded/meta-oe \
      /home/barak/Projects/yocto/meta-openembedded/meta-python \
      /home/barak/Projects/yocto/meta-st-stm32mp  \
      /home/barak/Projects/yocto/meta-custom \
      "
    
  • 复制.dts文件到补丁:

    cp stm32mp157d-dk1.dts ~/Documents
    

    并创建它的副本,在末尾添加 .orig:

    cp stm32mp157d-dk1.dts stm32mp157d-dk1.dts.orig
    
  • 修改第一个以添加我们自己的节点以启用 i2c。修改后的文件将如下所示:

// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
/*
 * Copyright (C) STMicroelectronics 2019 - All Rights Reserved
 * Author: Alexandre Torgue <[email protected]> for STMicroelectronics.
 */

/dts-v1/;

#include "stm32mp157.dtsi"
#include "stm32mp15xd.dtsi"
#include "stm32mp15-pinctrl.dtsi"
#include "stm32mp15xxac-pinctrl.dtsi"
#include "stm32mp15xx-dkx.dtsi"

/ {
        model = "STMicroelectronics STM32MP157D-DK1 Discovery Board";
        compatible = "st,stm32mp157d-dk1", "st,stm32mp157";

        aliases {
                serial0 = &uart4;
                serial1 = &usart3;
                serial2 = &uart7;
        };

        chosen {
                stdout-path = "serial0:115200n8";
        };
};

&i2c5 {
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&i2c5_pins_a>;
        pinctrl-1 = <&i2c5_sleep_pins_a>;
        i2c-scl-rising-time-ns = <185>;
        i2c-scl-falling-time-ns = <20>;
        clock-frequency = <100000>;
        status = "okay";
};
  • 创建一个补丁文件并在我们自己的层中使用它:

    git diff --no-index stm32mp157d-dk1.dts.orig stm32mp157d-dk1.dts > 0001-add-i2c5-userspace-dts.patch
    

修改这个补丁文件,编辑路径和文件名相同(除了a/和b/),结果是:

diff --git a/stm32mp157d-dk1.dts.orig b/stm32mp157d-dk1.dts
index d54dcf1..d8bd859 100644
--- a/arch/boot/dts/stm32mp157d-dk1.dts
+++ b/arch/boot/dts/stm32mp157d-dk1.dts
@@ -16,7 +16,23 @@
        model = "STMicroelectronics STM32MP157D-DK1 Discovery Board";
        compatible = "st,stm32mp157d-dk1", "st,stm32mp157";

+       aliases {
+               serial0 = &uart4;
+               serial1 = &usart3;
+               serial2 = &uart7;
+       };
+
        chosen {
                stdout-path = "serial0:115200n8";
        };
 };
+
+&i2c5 {
+       pinctrl-names = "default", "sleep";
+       pinctrl-0 = <&i2c5_pins_a>;
+       pinctrl-1 = <&i2c5_sleep_pins_a>;
+       i2c-scl-rising-time-ns = <185>;
+       i2c-scl-falling-time-ns = <20>;
+       clock-frequency = <100000>;
+       status = "okay";
+};

现在我们想要将此补丁复制到我们的自定义层,并告诉我们的配方我们想要包含此补丁并在构建设备树之前应用它。

source poky/oe-init-build-env build-mp1/`
cp ~/Documents/0001-add-i2c5-userspace-dts.patch recipes-kernel/linux/stm32mp1/
  • 创建 .bbappend 文件:
    vi recipes-kernel/linux/linux-stm32mp_%.bbappend
    
    看起来像这样:
FILESEXTRAPATHS_prepend := "${THISDIR}:"
SRC_URI += "file://0001-add-i2c5-userspace-dts.patch"
  • 使用Busybox添加i2cDetect工具:

    bitbake -c menuconfig busybox
    

    Busybox 内部:杂项实用程序 --> [*] i2cdetect --> 选择 --> 退出 --> 是 保存配置

这只适用于本地 build-mp1 文件夹。这在我们的自定义层中尚未启用,因此我们每次部署该映像时都必须执行此操作,除非创建默认配置(不是本例)。

bitbake 自定义图像:

bitbake custom-image

然后将映像刷新到具有 5 个分区的 micro-SD 卡:fsbl1、fsbl2、fip、bootfs、rootfs。

在此阶段,准备启动 picocom 并为开发板供电。

登录(root)后,运行一些命令来检查,例如:

ls -l /sys/bus/i2c/devices/

但是,找不到 i2cdetect:

i2cdetect -y 1
-sh: i2cdetect: not found

有人知道如何解决启用

i2cdetect
的问题吗?任何形式的帮助将不胜感激。

尝试在 Yocto 创建的自定义图像中使用 Busybox 启用

i2cdetect
。不起作用,因为找不到该命令。

stm32 embedded-linux yocto i2c device-tree
1个回答
2
投票

您提供的所有详细信息都无助于解决

i2cdetect
未找到的问题。

无论如何,这个问题唯一合乎逻辑的原因如下:

  • 您使用
    busybox
    menuconfig 所做的修改未得到应用。

为什么?

因为:

  • busybox 配方在更改后没有再次编译

为什么?

因为:

  • do_compile
    已经完成并且任务缓存已经创建,所以它永远不会再运行

为什么?

因为:

  • do_compile
    的内容没有改变

现在,解决方案是以下之一:

  1. 创建一个片段文件,如this答案中详述。
  2. busybox
    之后强制编译
    menuconfig
    bitbake busybox -f -c compile

[注意]

在牺牲时间之前:

  • 构建完整图像
  • 刷新 SD 卡
  • 启动和测试

确保先调试图像:

  1. bitbake -e <image_name> | grep ^WORKDIR=
    ,在该路径下你会发现
    rootfs
    ,这是将进入SD卡的最终rootfs,检查
    i2cdetect
    是否存在。

[其他解决方案]

您可以通过另一个配方(meta/recipes-devtools/i2c-tools)将

i2cdetect
与所有其他
i2c-tools
一起集成,方法很简单:

IMAGE_INSTALL:append = " i2c-tools"

但请记住仅选择两种解决方案之一,否则您将在

busybox
i2c-tools
之间遇到文件冲突。

© www.soinside.com 2019 - 2024. All rights reserved.