2017-02-27 17 views
1

我正面臨一個有趣的問題。我喜歡設置一個我的CPU的針。到目前爲止,我創建了一個控制引腳的模塊。該模塊設置默認引腳配置(高)。加載模塊時,默認的引腳配置變爲活動狀態。這工作正常。如何在嵌入式Linux的引導和模塊加載之間設置引腳?

現在我喜歡在啓動過程開始時啓用我的默認引腳配置。爲了存檔,我爲ATMEL bootloader(at91bootstrap)和uboot(u-boot-at91)寫了一個補丁。這工作正常,直到內核啓動。在內核啓動時,引腳被設置爲ATMEL默認值。它們的引腳在設備樹中定義爲gpios。

我想我有兩種可能性:

月1日 - 在「正確」的現場修補/init/main.c。正確的地點在哪裏?

第2步 - 修改設備樹以將GPIO設置爲其他默認值。如何「重新設置」一個gpio值?

+3

忘掉第一個選項,這是一個醜陋的黑客。考慮只修改設備樹或加載一些設備樹覆蓋。另外,您提供的信息不足。您應該提供您正在使用的設備樹文件/文件(或LXR/kernel.org上這些文件的鏈接),並告訴我們您要修改哪個GPIO(詳細信息:默認值,在數據表/用戶中描述手冊等)。 –

+0

所以我正在尋找一個例子來重置/覆蓋在dts的引腳值。任何想法在哪裏可以找到它?試圖使用「led」類。這導致與我的模塊衝突。 LED模塊和我的模塊試圖獲得相同的引腳。 –

+0

在這種情況下,您應該只從驅動程序控制GPIO引腳狀態。我不太明白你爲什麼要從設備樹那裏做到這一點?只需從驅動程序中獲取該引腳(從設備樹中),並相應地更改其狀態。 –

回答

1

當您修改u-boot級別的引腳時;它將被內核覆蓋。 /init/main.c是糟糕的想法,所以我想,如果你要設置的GPIO引腳你不應該採取了這一做法

在內核級別,有兩種可能性(除了你的模塊)

1)內核板文件。

2)設備樹文件。

假設如果你想在i.MX6板上將SDIO引腳設置爲GPIO,那麼你需要像這樣修改代碼。

leds { 
    compatible = "gpio-leds"; 
    pinctrl-names = "default"; 
    pinctrl-0 = <&pinctrl_gpio_leds>; 

red { 
     gpios = <&gpio7 0 0>; 
     default-state = "on"; 
}; 

MX6QDL_PAD_SD3_DAT5__GPIO7_IO00 0x1b0b0 //set the pin as GPIO 

有關引腳的默認狀態,請參閱處理器的數據表。一個引腳可能具有不同的功能。

如果你想使用相同的引腳代替GPIO的其他功能,那麼你可以選擇下面的配置。

MX6QDL_PAD_SD3_DAT5__UART2_RX_DATA //UART2 RX Data pin 
MX6QDL_PAD_SD3_DAT5__GPIO7_IO00 //As a GPIO pin 
MX6QDL_PAD_SD3_DAT6__UART1_RX_DATA // UART1 RX data 
MX6QDL_PAD_SD3_DAT6__SD3_DATA6 //SDIO pin which is default in this case 

如果您正在尋找更多的東西(如引腳號和設備樹文件名),請添加更多詳細信息。

+0

在我的第一個方法中,我想出了相同的解決方案。但令人遺憾的是,通過使用LED驅動器的引腳,它被阻塞了。我的情況我喜歡使用我自己的內核驅動程序的引腳。這可以將問題簡化爲:「將引腳設置爲高電平直到我自己的模塊被加載」。 –

+0

您希望使用一個引腳來實現您的自定義功能,並且現在該引腳已經被LED驅動器佔用。理想情況下,應該有兩個不同的銷釘用於兩個不同的目的。所以我們假設你的LED驅動器會有一個引腳(如果你想使用這個驅動器的話),其中一個將用於你的定製功能。 您可以從驅動程序的設備樹條目中設置引腳的狀態(高/低),如gpios = <&gpio7 0 0>; 。 通過更改第三個參數,您可以更改GPIO引腳的狀態。 0爲高電平有效狀態,1爲低電平有效狀態。 –

相關問題