【问题标题】:I2C driver changes to recognize multiple busesI2C 驱动程序更改以识别多条总线
【发布时间】:2020-01-03 11:50:03
【问题描述】:

我们在一个 iMX 设备树文件的 i2c2 节点中定义了模拟视频在 adv7180 元数据硬件定义。最终目的是从 i2c2 总线识别 adv7180 驱动程序。

在处理器的引导过程中,使用 linux 映像进行了 I2C 的 defconfig 更改,第二个 I2C 总线未被识别。

以下是串行控制台打印语句:

U-Boot 2015.10+fslc+g1b6aee7 (Jan 16 2018 - 14:57:01 +0530)

CPU: Freescale i.MX6Q rev1.2 996 MHz (running at 792 MHz)
CPU: Automotive temperature grade (-40C to 125C) at 26C
Reset cause: POR
Board: MX6-SabreSD
I2C: ready

Line 129: i2c i2c-1: IMX I2C adapter registered   //i2c-2 not registered??

Line 272 onwards: i2c /dev entries driver 
IR NEC protocol handler initialized 
IR RC5(x) protocol handler initialized 
IR RC6 protocol handler initialized 
IR JVC protocol handler initialized 
IR Sony protocol handler initialized 
IR RC5 (streamzap) protocol handler initialized 
IR SANYO protocol handler initialized 
IR MCE Keyboard/mouse protocol handler initialized 
mxc_v4l2_output v4l2_out.28: V4L2 device registered as video16 
mxc_v4l2_output v4l2_out.28: V4L2 device registered as video17 
i2c-core: driver [mag3110] using legacy suspend method 
i2c-core: driver [mag3110] using legacy resume method  

我已经在我的 Yocto Built 的源目录中的 defconfig 文件中编写了这些额外的行。

CONFIG_IMX_HAVE_PLATFORM_IMX_I2C=y
# CONFIG_I2C_COMPAT is not set
CONFIG_I2C_CHARDEV=y
# CONFIG_I2C_HELPER_AUTO is not set
CONFIG_I2C_ALGOPCF=m
CONFIG_I2C_ALGOPCA=m
CONFIG_I2C_ALGOBIT=y
CONFIG_I2C_IMX=y
CONFIG_I2C_MUX=y
CONFIG_I2C_MUX=y

我还检查了 Kconfig 文件,发现 i2c 驱动程序是从构建的 kernel-source 目录传递的。

我是否必须修改在我构建的 yocto 的路径 /home/fsl-community-bsp-myproject/build/tmp/work-shared/imx6qonlinepdd/kernel-source/drivers/i2c 中创建的 C 文件(驱动程序文件)?

子目录/drivers/media下竟然还有一个adv7180的C文件,可以修改吗?

【问题讨论】:

  • 您似乎向内核传递了错误的 dtb(mag3110 正在通过 i2c、i2c-1 进行探测,但没有注册 i2c-2...)。你如何告诉 Yocto/U-Boot/kernel 使用你的 dtb?
  • 我已经在源目录的机器文件夹中声明了 .dtb 文件名。传递错误的 dtb 是什么意思?我在机器文件夹中提到了名称“imx6q-sabresd-ldo.dtb”。
  • 我的意思是很有可能您没有将修改后的 dtb 传递给内核,而是将默认的 dtb 传递给内核。您可以粘贴这些配置及其路径吗?你没有对whatever/build/tmp/work-shared/... 做任何改变,不是吗?如果你是,你不应该。除非你确切地知道你在做什么。顾名思义,是一个临时 (tmp) 文件夹,更改可能会挥发。
  • 你猜对了。我正在篡改tmp文件夹,并替换dts和dtsi文件以获取dtb文件中的一些更改,它可以识别一些驱动程序,但它不起作用。我什至尝试在/lib/modules/kernel 中查看modules.dep 文件,而我需要的驱动程序并没有写在这些文件中。
  • 您应该在重新编译内核之前执行此操作。否则您的更改将不会被考虑在内。在tmp 中进行更改后,您也可以使用bitbake virtual/kernel -C compile

标签: kernel yocto i2c u-boot kconfig


【解决方案1】:

如果启用了 i2c 总线 2,您应该查看正在使用的设备树。

您需要在 dts 中添加以下行:

&i2c2 { // Change the name as needed 
    status = "okay"; 

    pinctrl-names = "default";
}

您可能已经设置了 status = "disabled";在您正在寻找的 i2c 节点中。

编辑: 乍一看,提供的 dts (https://pastebin.com/Y0esXmaX) 似乎没问题。为了进一步调试,需要查看 /dev/ 目录以找到 i2c 总线。

举个例子:

root@pico-imx8mq:~# ls /dev/*i2c*
/dev/i2c-0  /dev/i2c-1  /dev/i2c-2

这意味着我有 3 个 i2c 总线,我可以在我的 dts 上找到它们。如果你在那里没有公共汽车,你可能确实有 dts 问题。

dmesg | grep i2c 也可能会给出一些提示。

您也可以使用 i2ctools 包中的 i2cdetect :

root@pico-imx8mq:~# i2cdetect -y 0 ## that will detect devices on first i2c bus
root@pico-imx8mq:~# i2cdetect -y 1 ## that will detect devices on second i2c bus
root@pico-imx8mq:~# i2cdetect -y 2 ## that will detect devices on third i2c bus

【讨论】:

  • 我已经在设备树级别进行了更改。我什至在 adv7180 中添加了 pmic、pinctrl 和 video。 dts 文件在 bitbake 过程中得到反映,因为我在 yocto 中检查了使用内核编译的 dtb 文件,发现 i2c2 节点已启用。
  • 你能添加一个链接到你的 dts 吗? (如果可能,粘贴到您的原始问题)
  • pastebin.com/Y0esXmaX ,这个文件包含dts,其他dts文件我保存的和imx6q-sabresd参考设备一样。
  • 您可以尝试使用 i2ctools 来了解是否实际检测到总线,或者只是观察您在 /dev/*i2c* 中找到的内容,您应该在那里找到您的 i2c 总线。
  • 然后你应该 bitbake virtual/kernel -c menuconfig 并添加 i2c 选项。但是我很感兴趣,您的内核配置还没有使用它,您是否为您的主板使用了正确的 yocto 版本?为了在您的图像中添加包,只需将 IMAGE_INSTALL +=" i2c-tools " 添加到您的图像配方或 IMAGE_INSTALL_append = " i2c-tools " 到您的 local.conf
猜你喜欢
  • 2020-01-17
  • 2017-05-04
  • 1970-01-01
  • 2016-04-23
  • 1970-01-01
  • 2015-05-14
  • 2017-03-20
  • 2015-04-10
  • 2016-05-28
相关资源
最近更新 更多