Kernel I2C驱动程序更改以识别多条总线

Kernel I2C驱动程序更改以识别多条总线,kernel,yocto,i2c,u-boot,kconfig,Kernel,Yocto,I2c,U Boot,Kconfig,我们已经在一个iMX设备树文件的i2c2节点中定义了模拟videoInadv7180元数据硬件定义。最终目的是从i2c2总线识别adv7180驱动程序 在处理器的引导过程中,使用针对I2C的defconfig更改生成的linux映像,无法识别第二条I2C总线 以下是串行控制台打印语句: U-Boot 2015.10+fslc+g1b6aee7 (Jan 16 2018 - 14:57:01 +0530) CPU: Freescale i.MX6Q rev1.2 996 MHz (running

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

在处理器的引导过程中,使用针对I2C的defconfig更改生成的linux映像,无法识别第二条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的源目录中的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驱动程序是从内置的内核源目录传递的

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


子目录中甚至有adv7180的C文件/drivers/media,可以修改吗?

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

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

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

    pinctrl-names = "default";
}
您可能已经使用status=“disabled”;在您正在寻找的i2c节点中

编辑: 乍一看,提供的dts()似乎还可以。为了进一步调试,应该查看/dev/目录以找到i2c总线

例如:

root@pico-imx8mq:~# ls /dev/*i2c*
/dev/i2c-0  /dev/i2c-1  /dev/i2c-2
这意味着我有3条i2c总线,我可以在我的dts上找到它们。如果你没有巴士在那里,你可能有一个数据传输系统的问题

dmesg | grepi2c
也可能给出一些提示

您还可以使用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

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

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

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

    pinctrl-names = "default";
}
您可能已经使用status=“disabled”;在您正在寻找的i2c节点中

编辑: 乍一看,提供的dts()似乎还可以。为了进一步调试,应该查看/dev/目录以找到i2c总线

例如:

root@pico-imx8mq:~# ls /dev/*i2c*
/dev/i2c-0  /dev/i2c-1  /dev/i2c-2
这意味着我有3条i2c总线,我可以在我的dts上找到它们。如果你没有巴士在那里,你可能有一个数据传输系统的问题

dmesg | grepi2c
也可能给出一些提示

您还可以使用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和videoin。dts文件在bitbake期间反映出来,因为我在yocto中检查了使用内核编译的dtb文件,发现i2c2节点已启用。您可以添加到dts的链接吗?(如有可能,请将其粘贴到原始问题中),此文件包含dts,我保留的其他dts文件与imx6q sabresd参考设备相同。您可以尝试使用i2ctools,以了解是否实际检测到总线,或者看看你在/dev/*i2c*中发现了什么,你应该在那里找到你的i2c总线,然后你应该bitbake virtual/kernel-c menuconfig并添加i2c选项。然而,我很好奇,你的内核配置还没有使用它,你是否为你的主板使用了合适的yocto版本?要在映像中添加软件包,只需将image_INSTALL+=“i2c工具”添加到映像配方中,或将image_INSTALL_append=“i2c工具”添加到本地。confI已经在设备树级别进行了更改。我甚至在adv7180中添加了pmic、pinctrl和videoin。dts文件在bitbake期间反映出来,因为我在yocto中检查了使用内核编译的dtb文件,发现i2c2节点已启用。您可以添加到dts的链接吗?(如有可能,请将其粘贴到原始问题中),此文件包含dts,我保留的其他dts文件与imx6q sabresd参考设备相同。您可以尝试使用i2ctools,以了解是否实际检测到总线,或者看看你在/dev/*i2c*中发现了什么,你应该在那里找到你的i2c总线,然后你应该bitbake virtual/kernel-c menuconfig并添加i2c选项。然而,我很好奇,你的内核配置还没有使用它,你是否为你的主板使用了合适的yocto版本?为了在映像中添加软件包,只需将image_INSTALL+=“i2c tools”添加到映像配方中,或将image_INSTALL_append=“i2c tools”添加到本地。confIt似乎向内核传递了错误的dtb(
mag3110
正在通过i2c进行探测,i2c-1但没有注册i2c-2…)。您是如何告诉Yocto/U-Boot/kernel使用您的dtb的?我已经在sources目录的machine文件夹中声明了.dtb文件名。通过错误的dtb是什么意思?我在machine文件夹中提到了名称“imx6q sabresd ldo.dtb”。我的意思是,很可能您没有将内核传递给修改后的dtb,而是传递给默认的dtb。能否粘贴这些配置及其路径?你没有在
的任何/build/tmp/work shared/…
中做任何更改,是吗?如果你是,你不应该。除非你知道自己在做什么。正如其名称所述,是一个临时(
tmp
)文件夹,更改可能会挥发。您猜对了。我正在篡改tmp文件夹,并替换dts和dtsi文件,以对dtb文件进行一些更改,该文件可以识别一些驱动程序,但不起作用。我甚至尝试在/lib/modules/kernel中查看modules.dep文件,而我需要的驱动程序并没有写在这些文件中。否则,您的更改将不会被考虑在内。在
tmp
中进行更改后,您还可以使用
bitbake virtual/kernel-C compile
。似乎您向内核传递了错误的dtb(
mag3110
正在通过i2c进行探测,i2c-1但没有注册i2c-2…)。您是如何告诉Yocto/U-Boot/kernel使用您的dtb的?我已经在sources目录的machine文件夹中声明了.dtb文件名。通过错误的dtb是什么意思?我提到了名称“imx6q-sabresd-ldo.dt”