gpt4 book ai didi

linux - 启用上拉 GPIO

转载 作者:太空狗 更新时间:2023-10-29 11:15:16 25 4
gpt4 key购买 nike

我正在使用一 block AT91SAM9G25 板,它有 4 个 PIO Controller ,管理多达 32 条可编程 I/O 线。每个引脚都可配置为通用 I/O 线仅或作为 I/O 线多路复用两个外围 I/O。因此,例如,根据文档(SAM9G25,第 14 页),信号 PC0 可以多路复用,例如通用 I/O 线或 VIDEO_ATMEL_ISI(图像传感器接口(interface)的 ISI)的 ISI_D0 线。

╔════════════╦════════════╦════════════╦════════════╦════════════╗
║ Primary ║ Alternates ║ PeripA ║ PeripB ║ PeripC ║
╠════════════╬════════════╬════════════╬════════════╬════════════╣
║ Signal/Dir ║ Signal/Dir ║ Signal/Dir ║ Signal/Dir ║ Signal/Dir ║
║ --------- ║ --------- ║ --------- ║ --------- ║ --------- ║
║ PC0 / I/O ║ ║ ║ ISI_D0 / I ║ ║
╚════════════╩════════════╩════════════╩════════════╩════════════╝

所有 GPIO 线的复位状态都是方向 IN 和 Pullup 使能。当我通过 sysfs 使用 GPIOLIB 时,由于上拉,我在几个 GPIO 中读取了一个“1”值作为输入。当多个板可以与其他外设复用时,这是否是 GPIO(带上拉电阻的输入)在复位时的正常安全状态?我不知道如何使用 GPIOLIB 通过用户空间禁用上拉。因此,例如,我看到当内核启动时,它会检查图像传感器外围设备是否在内核中启用或作为模块启用,如果是,它将 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/kernel/debug/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/kernel/debug/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 线都是带上拉的输入,我没有找到内核或你在哪里-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);

头文件 arch/arm/mach-at91/include/mach/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:抱歉我的英语有任何错误,我知道我需要改进它。

最佳答案

也许你可以不用管上拉。我在 OMAP SoC 上使用过 GPIO,在最低级别有类似的引脚多路复用选项,但没有必要担心上拉。通常无论是什么驱动它都能吸收足够的电流(这是EE/电路的观点,如果你不熟悉也不用担心)。 float 输入可能是随机且麻烦的;拉高应该没问题。

我认为您不需要制作内核模块。我建议您尝试使用现有的用户模式界面。您的内核应该已经连接了低级驱动程序以提供通过 sysfs 的访问。引用sysfs , omap gpio .我认为我在 sysfs 中没有看到上拉选项。如果您得到了一些工作并且需要从 C 代码调用它,那么您可以寻找 API,或者只使用 system()。

关于linux - 启用上拉 GPIO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15411746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com