2016-05-11 146 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

相關問題