在Yocto Scarthgap中启用BeagleBone Black的I2C1与SPI1求助
问题:BeagleBone Black在Yocto Scarthgap下启用I2C1和SPI1失败
需求
- 启用I2C1:配合ISL1209 RTC,使用引脚P9_17、P9_18
- 启用SPI1:配合CY15B104QN FRAM,使用引脚P9_28、P9_29、P9_30、P9_31
环境
- Yocto Scarthgap版本(Kirkstone版本中I2C功能正常,推测新版本存在变更)
- 机器配置:
MACHINE ?= "beaglebone-yocto"
现有配置
bblayers.conf
POKY_BBLAYERS_CONF_VERSION = "2" BBPATH = "${TOPDIR}" BBFILES ?= "" BSPDIR := "${@os.path.abspath(os.path.dirname(d.getVar('FILE', True)) + '/../..')}" BBLAYERS ?= " \n ${BSPDIR}/poky/meta \n ${BSPDIR}/poky/meta-poky \n ${BSPDIR}/poky/meta-yocto-bsp \n ${BSPDIR}/meta-ti/meta-ti-bsp \n ${BSPDIR}/meta-ti/meta-ti-extras \n ${BSPDIR}/meta-arago/meta-arago-demos \n ${BSPDIR}/meta-arago/meta-arago-distro \n ${BSPDIR}/meta-arago/meta-arago-extras \n ${BSPDIR}/meta-arago/meta-arago-test \n ${BSPDIR}/meta-openembedded/meta-oe \n ${BSPDIR}/meta-openembedded/meta-multimedia \n ${BSPDIR}/meta-openembedded/meta-networking \n ${BSPDIR}/meta-openembedded/meta-python \n ${BSPDIR}/meta-openembedded/meta-filesystems \n ${BSPDIR}/meta-arm/meta-arm \n ${BSPDIR}/meta-arm/meta-arm-bsp \n ${BSPDIR}/meta-arm/meta-arm-toolchain \n ${BSPDIR}/meta-arm/meta-arm-systemready \n ${BSPDIR}/meta-qt5 \n ${BSPDIR}/meta-custom \n "
meta-custom 配置文件
recipes-kernel/linux/linux-bb%.bbappend
PR = "r0" FILESEXTRAPATHS:prepend := "${THISDIR}/files:" SRC_URI:append = " \n file://custom-config.cfg \n file://enable_i2c1.dtsi \n file://enable-spi-cy15.dtsi \n" do_configure:append() { cp ${WORKDIR}/enable_i2c1.dtsi ${B}/source/arch/${ARCH}/boot/dts cp ${WORKDIR}/enable-spi-cy15.dtsi ${B}/source/arch/${ARCH}/boot/dts echo '#include "enable_i2c1.dtsi"' >> ${B}/source/arch/${ARCH}/boot/dts/am335x-boneblack.dts echo '#include "enable-spi-cy15.dtsi"' >> ${B}/source/arch/${ARCH}/boot/dts/am335x-boneblack.dts } do_compile:append() { # Ensure the custom .config file is used yes '' | make oldconfig }
custom-config.cfg
CONFIG_EXPERT=y CONFIG_CONFIGFS_FS=y CONFIG_OVERLAY_FS=y CONFIG_RFKILL_GPIO=y CONFIG_MTD_SPI_NOR=y CONFIG_MTD_SPI_NOR_USE_4K_SECTORS=y CONFIG_MTD_SPI_NOR_SWP_DISABLE_ON_VOLATILE=y CONFIG_OF_DYNAMIC=y CONFIG_OF_RESOLVE=y CONFIG_OF_OVERLAY=y CONFIG_TOUCHSCREEN_ADS7846=n CONFIG_RFKILL_INPUT=y CONFIG_DEBUG_MEMORY_INIT=y CONFIG_SPI_DEBUG=y CONFIG_SPI=y CONFIG_SPI_MASTER=y CONFIG_SPI_MEM=y CONFIG_SPI_MUX=y CONFIG_SPI_SPIDEV=y CONFIG_SPI_LOOPBACK_TEST=m CONFIG_SPI_SLAVE=y CONFIG_SPI_SLAVE_TIME=y CONFIG_SPI_SLAVE_SYSTEM_CONTROL=y CONFIG_SPI_DYNAMIC=y CONFIG_PPS=y CONFIG_GPIO_SYSFS=y CONFIG_RTC_DRV_ISL1208=y CONFIG_MULTIPLEXER=y CONFIG_JFFS2_FS=y CONFIG_JFFS2_FS_DEBUG=0 CONFIG_JFFS2_FS_WRITEBUFFER=y CONFIG_JFFS2_ZLIB=y CONFIG_JFFS2_RTIME=y CONFIG_UBIFS_FS=y CONFIG_UBIFS_FS_ADVANCED_COMPR=y CONFIG_UBIFS_FS_LZO=y CONFIG_UBIFS_FS_ZLIB=y CONFIG_UBIFS_FS_ZSTD=y CONFIG_UBIFS_ATIME_SUPPORT=y CONFIG_UBIFS_FS_XATTR=y CONFIG_UBIFS_FS_SECURITY=y CONFIG_CRYPTO_LZO=y CONFIG_CRYPTO_ZSTD=y
enable_i2c1.dtsi
&am33xx_pinmux { /* I2C-1: My i2c and muxing it for my needs */ my_i2c1_pins: my_i2c1_pins { pinctrl-single,pins = < /* My device: i2c addr 0x22, 0x23 */ AM33XX_IOPAD(0x95c, PIN_INPUT | MUX_MODE2) /* (A16)/(Pin 50) spi0_cs0.I2C1_SCL */ AM33XX_IOPAD(0x958, PIN_INPUT | MUX_MODE2) /* (B16)/(Pin 49) spi0_d1.I2C1_SDA */ >; }; }; &i2c1 { /* My i2c device 0x22, 0x23 */ status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&my_i2c1_pins>; clock-frequency = <100000>; rtc@6f { compatible = "isil,isl1208"; reg = <0x6f>; }; };
enable-spi-cy15.dtsi
&am33xx_pinmux { my_spi1_pins: pinmux_my_spi1_pins { pinctrl-single,pins = < AM33XX_IOPAD(0x990, PIN_INPUT_PULLUP | MUX_MODE3) /* spi1_sclk */ AM33XX_IOPAD(0x994, PIN_INPUT_PULLUP | MUX_MODE3) /* spi1_d0 */ AM33XX_IOPAD(0x998, PIN_OUTPUT_PULLUP | MUX_MODE3) /* spi1_d1 */ AM33XX_IOPAD(0x99C, PIN_OUTPUT_PULLUP | MUX_MODE3) /* spi1_cs0 */ >; }; }; &spi1 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&my_spi1_pins>; spi-max-frequency = <24000000>; spidev@0 { compatible = "spidev"; reg = <0>; spi-max-frequency = <24000000>; }; spidev@1 { compatible = "spidev"; reg = <1>; spi-max-frequency = <24000000>; }; };
recipes-core/images/core-custom-beaglebone.bb
inherit core-image # Include the core-image-minimal recipe require recipes-core/images/core-image-minimal.bb CORE_IMAGE_EXTRA_INSTALL += " kernel-modules" IMAGE_INSTALL += " nano libgpiod" IMAGE_INSTALL += " sysfsutils i2c-tools spitools config-pin" IMAGE_INSTALL += " libgpiod-tools libgpiod-dev"
开发板输出日志
root@beaglebone-yocto:~# dmesg | grep i2c [ 2.114915] i2c_dev: i2c /dev entries driver [ 2.229480] omap_i2c 4819c000.i2c: bus 2 rev0.11 at 100 kHz [ 2.266352] platform 4830e000.lcdc: Fixed dependency cycle(s) with /ocp/interconnect@44c00000/segment@200000/target-module@b000/i2c@0/tda19988@70 [ 3.457405] omap_i2c 44e0b000.i2c: bus 0 rev0.11 at 400 kHz root@beaglebone-yocto:~# dmesg | grep spi root@beaglebone-yocto:~# i2cdetect -l i2c-0 i2c OMAP I2C adapter I2C adapter i2c-2 i2c OMAP I2C adapter I2C adapter root@beaglebone-yocto:~# ls -l /dev/spi* ls: cannot access '/dev/spi*': No such file or directory root@beaglebone-yocto:~# cat /proc/mtd dev: size erasesize name root@beaglebone-yocto:~# uname -a Linux beaglebone-yocto 6.6.21-yocto-standard #1 PREEMPT Tue Mar 19 16:42:51 UTC 2024 armv7l GNU/Linux
问题排查与修复方案
1. I2C1 未加载的修复
从日志看仅i2c-0、i2c-2被识别,i2c-1缺失,核心问题如下:
(1)引脚配置缺失上拉属性
I2C总线必须启用上拉才能正常工作,修改enable_i2c1.dtsi中的引脚配置:
AM33XX_IOPAD(0x95c, PIN_INPUT | MUX_MODE2) // 改为 AM33XX_IOPAD(0x95c, PIN_INPUT_PULLUP | MUX_MODE2) AM33XX_IOPAD(0x958, PIN_INPUT | MUX_MODE2) // 改为 AM33XX_IOPAD(0x958, PIN_INPUT_PULLUP | MUX_MODE2)
(2)内核配置补全
Scarthgap使用的6.6内核需确保OMAP I2C控制器驱动启用,在custom-config.cfg中添加:
CONFIG_I2C_OMAP=y
(3)改用设备树覆盖机制
直接修改主dts文件易被内核源码覆盖,改为标准设备树覆盖:
- 将
enable_i2c1.dtsi重命名为enable_i2c1.dts,添加头部:/dts-v1/; /plugin/; - 修改
linux-bb%.bbappend:do_configure:append() { # 移除原复制和修改dts的代码 } KERNEL_DEVICETREE:append = " enable_i2c1.dtbo"
2. SPI1 未加载的修复
无SPI相关日志说明控制器未初始化,修复步骤:
(1)验证SPI控制器内核配置
在custom-config.cfg中添加OMAP SPI控制器驱动:
CONFIG_SPI_OMAP24XX=y
(2)检查原始设备树SPI1状态
执行以下命令确认默认SPI1是否被禁用:
fdtget /boot/am335x-boneblack.dtb /ocp/spi@48030000 status
若返回disabled,则当前enable-spi-cy15.dtsi中的status = "okay"可生效;若仍失败,需检查引脚是否被其他设备占用。
(3)改为设备树覆盖
同I2C1,将enable-spi-cy15.dtsi改为enable-spi-cy15.dts并添加/plugin/头部,在linux-bb%.bbappend中添加:
KERNEL_DEVICETREE:append = " enable-spi-cy15.dtbo"
3. 构建与验证
重新构建镜像烧录后,执行以下命令验证:
# 验证I2C1 dmesg | grep i2c-1 i2cdetect -y 1 # 验证SPI1 dmesg | grep spi ls /dev/spidev1.*
内容的提问来源于stack exchange,提问作者Andrei M.
相关产品推荐
相关产品推荐

