2016-05-11 124 views
3

在imx6sx硬件平台(恩智浦嵌入式ARM)上使用Linux 3.14.52。Linux,ARM:为什么gpiochip <num>仅在引导时存在I2C GPIO扩展器时才创建?

问题是,设备树中指定的PCF8575 I2C GPIO扩展器没有实例化为/ sys/class/gpio结构中的设备,除非它们在内核引导期间存在。这些器件列在/sys/bus/i2c/devices/i2c-1(I2C总线1)结构中,但没有在/sys/class/gpio结构中给出GPIO芯片。

有没有办法让这些设备在启动后被指定为gpiochip,一旦它们被添加到系统中?

在以前的(PowerPC)平台上,设备树中列出的所有设备都分配了gpiochip,无论它们在内核引导期间是否打开。但是通过我们的ARM平台,这些设备在内核启动时必须可用。我试过尽可能地将内核i2c/gpio选项(通过.config)更改为尽可能接近前一个平台,但这似乎没有效果。

+1

你的内核版本有变化吗?当设备被实际探测时,较新的内核可能只是简单地创建sysfs条目。也许查看源代码,看看GPIO扩展器的探测功能发生了什么。 – bodangly

+0

是的,内核已经改变。 PowerPC是2.6.37.6所以完全不同的版本。同意这可能是改变的原因。我想我可以尝试深入研究内核源码,但不知道探针的位置;也许gpiolib.c?希望有一个后启动的方式来处理这个,而不用改变内核。 – Bruce

+0

正如您在我的答案中所看到的,我可以确认只有在设备探测时才会添加它。 – bodangly

回答

1

肯定内核对2.6内核分支中的sysfs有不同的工作。我也遇到过类似的问题。它与处理设备树有关。设备树将变成unflattened,但这只能启动设备的实际发现。如果设备不存在,它们将不会被探测,也不会在sysfs中创建条目。

Device Tree Usage

Linux电路板支持的代码调用of_platform_populate(NULL,NULL,NULL,NULL) 于在树的根开球设备的发现。 参数全为NULL,因为从 树的根开始,不需要提供起始节点(第一个NULL),父结构设备(最后一个NULL),并且我们不使用匹配 表(还)。对于仅需要注册设备的板卡, .init_machine()可以是完全空的,除了调用 of_platform_populate()。

所以设备树只会告诉内核要发现什么,如果没有找到,它实际上不会添加任何东西。

gpio-pcf857x.c

通知上线397调用gpiochip_add

我会建议是尝试与编译内核:

我可以确认gpiochip在设备的探头只添加gpio扩展器设置为模块,然后在实际连接后对其进行insmod。

+0

谢谢!证实这一点很好。您的建议可能会起作用,但我决定只从设备树中移除设备,而不是以gpio芯片的形式访问它们。相反,我只是将它们作为简单的I2C设备访问,并且适用于这些简单的扩展器。 – Bruce

+0

@布鲁斯没问题!如果这回答你的问题,请将它标记为:) – bodangly

相关问题