首页 > 其他分享 >GPIO映射 【ChatGPT】

GPIO映射 【ChatGPT】

时间:2023-12-11 16:02:41浏览次数:37  
标签:led 映射 power 引脚 HIGH gpiod GPIO ChatGPT

GPIO映射

本文档解释了如何将GPIO分配给特定的设备和功能。

请注意,这仅适用于基于新描述符的接口。有关已弃用的基于整数的GPIO接口的描述,请参阅“Legacy GPIO Interfaces”(实际上,使用旧接口无法进行真正的映射;您只是从某个地方获取一个整数,然后请求相应的GPIO)。

所有平台都可以启用GPIO库,但如果平台严格要求存在GPIO功能,则需要从其Kconfig中选择GPIOLIB。然后,GPIO的映射取决于平台用于描述其硬件布局的方式。目前,可以通过设备树、ACPI和平台数据定义映射。

设备树

在设备树中,可以很容易地将GPIO映射到设备和功能。确切的操作方式取决于提供GPIO的GPIO控制器,请参阅您的控制器的设备树绑定。

GPIO映射在使用者设备的节点中定义,属性名为<function>-gpios,其中<function>是驱动程序将通过gpiod_get()请求的功能。例如:

foo_device {
        compatible = "acme,foo";
        ...
        led-gpios = <&gpio 15 GPIO_ACTIVE_HIGH>, /* red */
                    <&gpio 16 GPIO_ACTIVE_HIGH>, /* green */
                    <&gpio 17 GPIO_ACTIVE_HIGH>; /* blue */

        power-gpios = <&gpio 1 GPIO_ACTIVE_LOW>;
};

也可以使用名为<function>-gpio的属性,但由于已被弃用,仅出于兼容性原因支持旧绑定,不应该在新绑定中使用。

此属性将使GPIO 15、16和17在"led"功能下可供驱动程序使用,GPIO 1作为"power" GPIO:

struct gpio_desc *red, *green, *blue, *power;

red = gpiod_get_index(dev, "led", 0, GPIOD_OUT_HIGH);
green = gpiod_get_index(dev, "led", 1, GPIOD_OUT_HIGH);
blue = gpiod_get_index(dev, "led", 2, GPIOD_OUT_HIGH);

power = gpiod_get(dev, "power", GPIOD_OUT_HIGH);

led GPIO将是活动高电平,而power GPIO将是活动低电平(即gpiod_is_active_low(power)将返回true)。

gpiod_get()函数的第二个参数,即con_id字符串,必须是GPIO后缀(由gpiod函数内部自动查找的"gpios"或"gpio")的<function>-前缀。使用上述"led-gpios"示例,使用不带"-"的前缀作为con_id参数:"led"。

在内部,GPIO子系统使用传递给con_id的字符串和GPIO后缀("gpios"或"gpio")的字符串进行前缀(snprintf(... "%s-%s", con_id, gpio_suffixes[]))。

ACPI

ACPI也支持类似于设备树的GPIO功能名称。上述设备树示例可以通过_DSD(设备特定数据)转换为等效的ACPI描述,引入自ACPI 5.1:

Device (FOO) {
        Name (_CRS, ResourceTemplate () {
                GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionOutputOnly,
                        "\\_SB.GPI0", 0, ResourceConsumer) { 15 } // red
                GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionOutputOnly,
                        "\\_SB.GPI0", 0, ResourceConsumer) { 16 } // green
                GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionOutputOnly,
                        "\\_SB.GPI0", 0, ResourceConsumer) { 17 } // blue
                GpioIo (Exclusive, PullNone, 0, 0, IoRestrictionOutputOnly,
                        "\\_SB.GPI0", 0, ResourceConsumer) { 1 } // power
        })

        Name (_DSD, Package () {
                ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
                Package () {
                        Package () {
                                "led-gpios",
                                Package () {
                                        ^FOO, 0, 0, 1,
                                        ^FOO, 1, 0, 1,
                                        ^FOO, 2, 0, 1,
                                }
                        },
                        Package () { "power-gpios", Package () { ^FOO, 3, 0, 0 } },
                }
        })
}

有关ACPI GPIO绑定的更多信息,请参阅与GPIO相关的_DSD设备属性。

平台数据

最后,GPIO可以使用平台数据绑定到设备和功能。希望这样做的板文件需要包含以下头文件:

#include <linux/gpio/machine.h>

通过查找表的方式映射GPIO,包含gpiod_lookup结构的实例。定义了两个宏来帮助声明这种映射:

GPIO_LOOKUP(key, chip_hwnum, con_id, flags)
GPIO_LOOKUP_IDX(key, chip_hwnum, con_id, idx, flags)

其中:

  • key是提供GPIO的gpiod_chip实例的标签,或者是GPIO线名称

  • chip_hwnum是GPIO在芯片内的硬件编号,或者是U16_MAX,表示key是GPIO线名称

  • con_id是设备视角下的GPIO功能的名称。它可以为NULL,在这种情况下将匹配任何功能。

  • idx是功能内的GPIO的索引。

  • flags用于指定以下属性:

    • GPIO_ACTIVE_HIGH - GPIO线为高电平
    • GPIO_ACTIVE_LOW - GPIO线为低电平
    • GPIO_OPEN_DRAIN - GPIO线设置为开漏
    • GPIO_OPEN_SOURCE - GPIO线设置为开源
    • GPIO_PERSISTENT - 在挂起/恢复期间,GPIO线保持其值
    • GPIO_TRANSITORY - GPIO线是瞬态的,在挂起/恢复期间可能失去其电气状态

将查找表定义如下,使用空条目定义其结束。表的'dev_id'字段是将使用这些GPIO的设备的标识符。它可以为NULL,在这种情况下将匹配对gpiod_get()的调用。

struct gpiod_lookup_table gpios_table = {
        .dev_id = "foo.0",
        .table = {
                GPIO_LOOKUP_IDX("gpio.0", 15, "led", 0, GPIO_ACTIVE_HIGH),
                GPIO_LOOKUP_IDX("gpio.0", 16, "led", 1, GPIO_ACTIVE_HIGH),
                GPIO_LOOKUP_IDX("gpio.0", 17, "led", 2, GPIO_ACTIVE_HIGH),
                GPIO_LOOKUP("gpio.0", 1, "power", GPIO_ACTIVE_LOW),
                { },
        },
};

然后,可以通过以下方式将表添加到板代码中:

gpiod_add_lookup_table(&gpios_table);

然后,控制"foo.0"的驱动程序将能够获取其GPIO,如下所示:

struct gpio_desc *red, *green, *blue, *power;

red = gpiod_get_index(dev, "led", 0, GPIOD_OUT_HIGH);
green = gpiod_get_index(dev, "led", 1, GPIOD_OUT_HIGH);
blue = gpiod_get_index(dev, "led", 2, GPIOD_OUT_HIGH);

power = gpiod_get(dev, "power", GPIOD_OUT_HIGH);

由于"led" GPIO被映射为活动高电平,此示例将切换它们的信号为1,即启用LED。对于被映射为活动低电平的"power" GPIO,其实际信号在此代码执行后将为0。与传统的整数GPIO接口不同,活动低属性在映射期间处理,因此对GPIO使用者是透明的。

还提供了一组函数,如gpiod_set_value(),用于使用新的基于描述符的接口。

使用平台数据的板还可以通过定义GPIO hog表来独占GPIO线。

struct gpiod_hog gpio_hog_table[] = {
        GPIO_HOG("gpio.0", 10, "foo", GPIO_ACTIVE_LOW, GPIOD_OUT_HIGH),
        { }
};

然后,可以通过以下方式将表添加到板代码中:

gpiod_add_hogs(gpio_hog_table);

一旦创建gpiochip,或者(如果芯片早已创建)在注册hog表时,该线将被独占。

引脚数组

除了逐个请求属于某个功能的引脚外,设备还可以请求分配给该功能的引脚数组。确定这些引脚如何映射到设备将决定该数组是否符合快速位图处理的要求。如果是,位图将直接在调用者和GPIO芯片的相应.get/set_multiple()回调之间传递。

为了符合快速位图处理的要求,数组必须满足以下要求:

  • 数组成员0的引脚硬件编号也必须为0
  • 属于与成员0相同芯片的连续数组成员的引脚硬件编号也必须与它们的数组索引匹配。

否则,将不使用快速位图处理路径,以避免处理分属于同一芯片但不按硬件顺序排列的连续引脚。

如果数组适用于快速位图处理路径,则属于与成员0不同芯片的引脚,以及其索引与硬件引脚编号不同的引脚,都将被排除在快速路径之外,无论是输入还是输出。此外,开漏和开源引脚也将被排除在快速位图输出处理之外。

希望了解更多信息,可以参考原文。

标签:led,映射,power,引脚,HIGH,gpiod,GPIO,ChatGPT
From: https://www.cnblogs.com/pengdonglin137/p/17894614.html

相关文章

  • GPIO 驱动接口 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/gpio/driver.htmlGPIO驱动接口这份文档是GPIO芯片驱动程序编写者的指南。每个GPIO控制器驱动程序都需要包含以下头文件,该头文件定义了用于定义GPIO驱动程序的结构:#include<linux/gpio/driver.h>GPIO的内部表示......
  • GPIO描述符消费者接口 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/gpio/consumer.htmlGPIO描述符消费者接口本文档描述了GPIO框架的消费者接口。请注意,它描述了新的基于描述符的接口。有关已弃用的基于整数的GPIO接口的描述,请参阅“LegacyGPIOInterfaces”。GPIO消费者的指南不能在没有......
  • General Purpose Input/Output (GPIO) 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/gpio/index.html#general-purpose-input-output-gpio通用目的输入/输出(GPIO)简介GPIO接口什么是GPIO?常见的GPIO属性在Linux中使用GPIO线GPIO驱动程序接口GPIO的内部表示控制器驱动程序:gpio_chip提供IRQ的GPIO驱动程序......
  • GPIO - 介绍 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/gpio/intro.htmlGPIO接口简介什么是GPIO?GPIO(通用目的输入/输出)是一种灵活的软件控制的数字信号。它们由许多种类型的芯片提供,并且对于使用嵌入式和定制硬件的Linux开发人员来说非常熟悉。每个GPIO代表连接到特定引脚或Ball......
  • 在Linux中使用GPIO线【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/driver-api/gpio/using-gpio.html在Linux中使用GPIO线Linux内核的存在是为了将硬件抽象化并呈现给用户。GPIO线通常不是面向用户的抽象。使用GPIO线的最明显、自然和首选方式是让内核硬件驱动程序处理它们。对于任何您想要编写的其他内......
  • ChatGPT叫你如何在centos中配置javapath变量
    当使用vim编辑器时,你可以按照以下步骤来编辑bash配置文件:打开~/.bashrc文件:bashvim~/.bashrc或者,如果你选择在系统级别配置,可以使用:bashsudovim/etc/environment在vim中编辑文件:移动光标到文件末尾,按下i进入插入模式,然后添加以下行:bashexportJ......
  • 万字长文专访“AI之父”Geoffrey Hinton: 我使用ChatGPT之后,为什么也开始害怕现在AI技
     “蜻蜓的幼虫就像水下的怪兽,”Hinton说。“它就像电影《异形》中的场景,蜻蜓从这个怪兽的背部破壳而出。幼虫经历了一个变成汤的阶段,然后蜻蜓就从这种汤中诞生。”在他的比喻中,幼虫象征着用于训练现代神经网络的数据;而蜻蜓则代表了由此诞生的敏捷的人工智能。深度学习——Hinto......
  • MyBatis-Plus 自定义 TypeHandler 映射JSON类型为List
    1在mysql5.7支持json类型,那么在表实体是怎么运用的在mybatis-plus中有相关的handler/***Jackson实现JSON字段类型处理器**@authorhubin*@since2019-08-25*/@Slf4j@MappedTypes({Object.class})@MappedJdbcTypes(JdbcType.VARCHAR)publicclassJackso......
  • 延迟IO 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/fb/deferred_io.html延迟IO延迟IO是一种延迟和重新分配IO的方法。它使用主机内存作为缓冲区,并使用MMU页错误作为执行设备IO的预触发器。以下示例可能是对这种设置如何工作的有用解释:用户空间应用程序(如Xfbdev)将帧缓冲区进行内存映射......
  • /proc文件系统 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/filesystems/proc.html/proc文件系统/proc/sys作者:[email protected],[email protected]日期:1999年10月7日2.4.x更新作者:[email protected]日期:2000年11月14日移动/proc/sys作......