Linux,ARM:为什么只有在引导时存在I2C GPIO Expander时才会创建gpiochip <num>?

时间:2016-05-11 16:34:45

标签: linux linux-kernel embedded-linux gpio i2c

在imx6sx硬件平台(恩智浦嵌入式ARM)上使用Linux 3.14.52。

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

将这些设备添加到系统后,有没有办法在启动后将这些设备指定为gpiochip?

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

1 个答案:

答案 0 :(得分:1)

确保内核在2.6内核分支中对sysfs的工作方式不同。我也遇到过类似的问题。它与处理设备树有关。设备树将变得不平整,但这只会启动设备的实际发现。如果设备实际不存在,则不会对它们进行探测,也不会在sysfs中创建条目。

Device Tree Usage

  

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

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

我可以确认仅在您的设备探测时添加了gpiochip:

gpio-pcf857x.c

请注意第397行到gpiochip_add

的电话

我建议尝试使用gpio扩展器设置为模块来编译内核,然后在实际附加后对其进行insmod。