You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 11:52:04