我正在遵循 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/
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
。不起作用,因为找不到该命令。
您提供的所有详细信息都无助于解决
i2cdetect
未找到的问题。
无论如何,这个问题唯一合乎逻辑的原因如下:
busybox
menuconfig 所做的修改未得到应用。为什么?
因为:
为什么?
因为:
do_compile
已经完成并且任务缓存已经创建,所以它永远不会再运行为什么?
因为:
do_compile
的内容没有改变现在,解决方案是以下之一:
busybox
之后强制编译menuconfig
:bitbake busybox -f -c compile
[注意]
在牺牲时间之前:
确保先调试图像:
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
之间遇到文件冲突。