即時通訊工具與AT91SAM9G25板,它有4個PIO控制器管理多達32個可編程I/O線。每個引腳可配置爲僅用於通用I/O線 ,或者可配置爲多路複用到兩個外設I/O的I/O線。因此,例如根據文檔(SAM9G25,第14頁),可以將信號PC0複用爲通用I/O線或VIDEO_ATMEL_ISI(圖像傳感器接口的ISI)的ISI_D0線。使能上拉GPIO
╔════════════╦════════════╦════════════╦════════════╦════════════╗
║ Primary ║ Alternates ║ PeripA ║ PeripB ║ PeripC ║
╠════════════╬════════════╬════════════╬════════════╬════════════╣
║ Signal/Dir ║ Signal/Dir ║ Signal/Dir ║ Signal/Dir ║ Signal/Dir ║
║ --------- ║ --------- ║ --------- ║ --------- ║ --------- ║
║ PC0/I/O ║ ║ ║ ISI_D0/I ║ ║
╚════════════╩════════════╩════════════╩════════════╩════════════╝
所有GPIO線的復位狀態都是使能方向IN和上拉。當我通過sysfs使用GPIOLIB時,由於pullup,我在多個GPIO中讀取「1」值作爲INPUT。當它們可以與其他外設複用時,在幾個電路板上覆位時,這是GPIO(INPUT和上拉電阻)的正常安全狀態嗎?我沒有看到我可以通過GPIOLIB禁用用戶空間的pullup。例如,我看到當內核啓動時它檢查圖像傳感器外設是在內核還是作爲模塊啓用,如果是的話,它將PC0設置爲外設B.這在位於/ arch/arm/mach的內核源代碼中-at91/at91sam9x5_devices.c
#if defined(CONFIG_VIDEO_ATMEL_ISI) || defined(CONFIG_VIDEO_ATMEL_ISI_MODULE)
....
at91_set_B_periph(AT91_PIN_PC0, 0); /* ISI_D0 */
...
#endif
然後,如果我不啓用內核ISI支持我可以使用PC0信號作爲GPIO線。這是/ SYS /內核/調試/ GPIO:
# cat /sys/kernel/debug/gpio
GPIOs 32-63, A:
GPIOs 64-95, B:
[atmel_usba_udc] GPIOB16: [gpio] set
[d1] GPIOB18: [gpio] clear
GPIOs 96-127, C:
GPIOs 128-159, D:
[ohci_vbus] GPIOD19: [gpio] clear
[ohci_vbus] GPIOD20: [gpio] clear
[d2] GPIOD21: [gpio] set
,這是/ SYS /內核/調試/ at91_gpio
# cat /sys/kernel/debug/at91_gpio
Pin PIOA PIOB PIOC PIOD
0: A A GPIO:1 A
1: A A GPIO:1 A
2: GPIO:1 A GPIO:1 A
3: GPIO:1 A GPIO:1 A
4: GPIO:1 A GPIO:1 GPIO:1
5: GPIO:1 A GPIO:1 GPIO:1
6: GPIO:1 A GPIO:1 A
7: B A GPIO:1 A
8: GPIO:1 GPIO:1 GPIO:1 A
9: A A GPIO:1 A
10: A A GPIO:1 A
11: A GPIO:1 GPIO:1 A
12: A GPIO:1 GPIO:1 A
13: A GPIO:1 GPIO:1 A
14: A GPIO:1 GPIO:1 GPIO:1
15: GPIO:1 GPIO:1 GPIO:1 A
16: GPIO:1 GPIO:1 GPIO:0 A
17: GPIO:1 GPIO:1 GPIO:1 A
18: GPIO:1 GPIO:1 GPIO:1 A
19: GPIO:1 A GPIO:1 GPIO:0
20: GPIO:1 A GPIO:0 GPIO:0
21: GPIO:1 A GPIO:0 GPIO:1
22: GPIO:1 A GPIO:1 A
23: GPIO:1 A GPIO:1 A
24: GPIO:1 A GPIO:1 A
25: GPIO:1 A GPIO:1 A
26: GPIO:1 A GPIO:1 A
27: GPIO:0 A GPIO:1 A
28: GPIO:1 A GPIO:0 A
29: GPIO:1 A GPIO:0 A
30: GPIO:1 A GPIO:1 A
31: GPIO:1 A GPIO:1 A
上述輸出表明PIOA0被複用,以外設A(TXD0 UART線),例如PIOC20被清除,但是文檔說所有處於復位狀態的GPIO線都是帶有上拉的INPUTS,我沒有找到內核或u-boot禁止這個GPIO的上拉(可能GPIO保持它們的狀態,如果沒有觸摸他的註冊?)
但他主要的問題是,怎麼可以我清除了GPIO線的上拉寄存器?我在內核源代碼中發現/arch/arm/mach-at91/at91sam9x5_devices.c使用了在linux-2.6.39/arch/arm/mach-at91/gpio.c中實現的這個功能。
/*
* enable/disable the pull-down.
* If pull-up already enabled while calling the function, we disable it.
*/
int __init_or_module at91_set_pulldown(unsigned pin, int is_on)
{
void __iomem *pio = pin_to_controller(pin);
unsigned mask = pin_to_mask(pin);
if (!pio || !cpu_has_pio3())
return -EINVAL;
/* Disable pull-up anyway */
__raw_writel(mask, pio + PIO_PUDR);
__raw_writel(mask, pio + (is_on ? PIO_PPDER : PIO_PPDDR));
return 0;
}
EXPORT_SYMBOL(at91_set_pulldown);
頭拱/ ARM /馬赫AT91 /包括/馬赫/ gpio.h
#ifndef __ASSEMBLY__
/* setup setup routines, called from board init or driver probe() */
.....
extern int __init_or_module at91_set_pulldown(unsigned pin, int is_on);
.....
#endif /* __ASSEMBLY__ */
如何使用這個功能,我的工具鏈,或者我應該做一個內核模塊?
感謝
PD:對不起,我的英文任何錯誤,我知道我需要改善它。
嗨喬庫爾,謝謝。我會檢查一下繼電器是否被輸入引腳拉起來,我認爲你是對的。我還有一個相關的問題,那我該如何尋找GPIO的內核API?我是一個使用內核連接應用程序的begginer,我只知道通過GNU C庫調用系統(POSIX)的方式。但是如果在我構建內核時沒有創建模塊,我應該使用哪個庫?哪種方式在內核中使用驅動程序,而不使用庫?對不起,如果它的一個愚蠢的問題,或者我可能需要更多的Linux驅動程序背景。 – MABC 2013-03-16 12:51:11
最簡單的開始方法是在Linux控制檯上使用命令。檢查上面的sysfs鏈接。 Linux控制檯是您要登錄的位置,然後輸入其他命令(如ls)以查看目錄內容。如果你想將GPIO#82作爲輸出低電平驅動到繼電器,這些命令可以這樣做:echo 82>/sys/class/gpio/export; echo out>/sys/class/gpio/gpio82/direction; echo 0>/sys/class/gpio/gpio82/value。如果你想從一個Linux應用程序來做到這一點,你可以把它們放在一個shell腳本文件(/home/me/my.sh)中,然後在應用程序中添加下面這行代碼:system(「/ home/me/my.sh」 ); – 2013-03-17 00:50:56
嗨,再次感謝喬。我知道通過sysfs驅動GPIO的方式,但啓用或禁用GPIO上拉的功能不會導出到sysfs,那麼我認爲我必須通過sysfs將此功能導出到用戶空間,但現在我認爲這個問題已經解決,因爲上拉激活繼電器的能力非常弱。問題是關於在Linux中使用通用驅動程序,我認爲唯一的方法是使用librarys或內核模塊,或通過一般系統調用libc,我吧? – MABC 2013-03-17 01:16:41