首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >启用上拉GPIO

启用上拉GPIO
EN

Stack Overflow用户
提问于 2013-03-14 22:15:30
回答 2查看 9K关注 1票数 3

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

代码语言:javascript
复制
╔════════════╦════════════╦════════════╦════════════╦════════════╗
║  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时,由于上拉,我在几个GPIO中读取了一个"1“值作为输入。当GPIO (带上拉电阻的输入)可以与其他外设多路复用时,在几个板上复位时,这是正常的安全状态吗?我不知道如何使用GPIOLIB通过用户空间禁用pullup。例如,我看到当内核启动时,它会检查图像传感器外设是在内核中启用还是作为一个模块启用,如果是这样,它会将PC0设置为外设B。这位于内核源代码中的/arch/arm/mach-at91/at91sam9x5_devices.c

代码语言:javascript
复制
#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:

代码语言:javascript
复制
    # 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

代码语言:javascript
复制
    # 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(GPIOUART线),例如PIOC20被清除,但是文档中说所有处于重置状态的GPIO线都是带上拉的输入,我找不到内核或u-boot在哪里禁用了这个TXD0的上拉(如果没有人接触他的寄存器,GPIO可能会保持它们的状态?)

但他的主要问题是,我如何清除GPIO线的上拉寄存器?我在内核源代码中发现/arch/arm/mach-at91/at91sam9x5_devices.c使用在linux-2.6.39/arch/arm/mach-at91/gpio.c中实现的这个函数。

代码语言:javascript
复制
    /*
    * 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);

Header arch/arm/mach-at91/include/mach/gpio.h

代码语言:javascript
复制
    #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:很抱歉我的英语有任何错误,我知道我需要提高它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-16 11:27:01

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

我不认为你应该做一个内核模块。我建议您使用现有的用户模式界面进行实验。您的内核应该已经挂接了低级驱动程序,以便通过sysfs提供访问。请参阅sysfsomap gpio。我不认为我在sysfs中看到过pullup in选项。如果你得到了一些有用的东西,并且需要从C代码中调用它,那么你可以寻找API,或者仅仅使用system()。

票数 2
EN

Stack Overflow用户

发布于 2014-04-26 17:05:33

在使用设备树的较新内核上,您可以通过重新编译设备树"blob“来控制它,而不需要更改内核或编写内核驱动程序。

http://lxr.free-electrons.com/source/Documentation/devicetree/bindings/pinctrl/atmel,at91-pinctrl.txt

但如果pinctrl有一个像gpio那样的用户空间界面,那就太好了,所以控制引脚的完整解决方案是用户空间控制的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15411746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档