This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM625:使用可拆卸 I2C 扩展模块确保 GPIO 编号的一致性

Guru**** 2482225 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1446586/am625-ensuring-consistent-gpio-numbering-with-removable-i2c-expansion-module

器件型号:AM625

工具与软件:

在我们的客户电路板上有一个 I2C 扩展 IO 模块。 连接此模块后、IO 编号如下、检测到5个 gpiochips。 其中、gpiochip2gpiochip4mcu_gpio0main_gpio0main_gpio1分别表示、和。

卸下 I2C 模块后、只剩下四个 GPIO 芯片。 在这种情况下、gpiochip1gpiochip3表示mcu_gpio0main_gpio0main_gpio1

可以观察到mcu_gpio0main_gpio0和的起始 GPIO 编号main_gpio1发生了变化、这直接影响了应用程序的使用。

如何配置系统、以确保mcu_gpio0main_gpio0main_gpio1在卸下 I2C 扩展模块时、、和的起始 GPIO 编号保持不变?


当模块被连接时:

root@User:~# cat /sys/kernel/debug/gpio
gpiochip4: GPIOs 334-385, parent: platform/601000.gpio, 601000.gpio:
gpiochip3: GPIOs 386-477, parent: platform/600000.gpio, 600000.gpio:
gpiochip2: GPIOs 478-501, parent: platform/4201000.gpio, 4201000.gpio:
gpiochip1: GPIOs 502-509, parent: i2c/0-0020, 0-0020, can sleep:
gpiochip0: GPIOs 510-511, parent: platform/3b000000.memory-controller, omap-gpmc:

卸下模块后:

root@User:~# cat /sys/kernel/debug/gpio
gpiochip3: GPIOs 342-393, parent: platform/601000.gpio, 601000.gpio:
gpiochip2: GPIOs 394-485, parent: platform/600000.gpio, 600000.gpio:
gpiochip1: GPIOs 486-509, parent: platform/4201000.gpio, 4201000.gpio:
gpiochip0: GPIOs 510-511, parent: platform/3b000000.memory-controller, omap-gpmc:
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Stephen:

    您的应用程序不应依赖 gpiochip 名称。 正确的实现是为 GPIO 引脚指定唯一名称(在 devicetree 中)、然后您的应用使用 GPIO 引脚名称作为参数来查询 gpiochip 名称。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Bin、

    我想你可能不会完全理解我的问题。 在我们的应用中、我们不依赖于 gpiochip 名称、而是依赖于其 GPIO 编号。

    下面是我们如何使用它的一个简单示例:我们使用控制一个 LEDmain_gpio0_57

    在这种情况下、如果 I2C 扩展 IO 模块被插入、MAIN_GPIO0_BASE需要被定义为386。 然而、如果此模块被移除、MAIN_GPIO0_BASE需要被定义为394来控制同一个 GPIO 引脚。

    #define MAIN_GPIO0_BASE 386
    #define GPIO_TO_PIN(base, gpio) ((base) + (gpio))
    #define GPIO_LED_ALARM	  GPIO_TO_PIN(MAIN_GPIO0_BASE, 57)
    ....
    
    
    if (temp > 0) {
    	gpio_direction_output(GPIO_LED_ALARM, ON);
    } else {
    	gpio_direction_output(GPIO_LED_ALARM, OFF);
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Stephen:

    我的观点是、用户空间应用不应该依赖于 gpiochip ID 或 GPIO 引脚编号、这些 ID 或引脚编号会因内核、甚至平台而异。 若要将应用与内核完全解耦、应使用 GPIO 引脚名称而不是 gpiochip ID 和 GPIO 引脚编号。

    以下是 AM64x EVM 的示例(很抱歉、使用 AM64x 作为示例、我目前只在我的办公桌上运行 EVM)。

    在内核器件树 k3-am642-evm.dts 中、I/O 扩展器引脚名称定义为:

      &main_i2c1 {                                                                                                                                                                                                                                                                                                                                                                                                                            
              status = "okay";                                                                                                                                                                                                                                                                                                                                                                                                                
              pinctrl-names = "default";                                                                                                                                                                                                                                                                                                                                                                                                      
              pinctrl-0 = <&main_i2c1_pins_default>;                                                                                                                                                                                                                                                                                                                                                                                          
              clock-frequency = <400000>;                                                                                                                                                                                                                                                                                                                                                                                                     
                                                                                                                                                                                                                                                                                                                                                                                                                                              
              exp1: gpio@22 {                                                                                                                                                                                                                                                                                                                                                                                                                 
                      compatible = "ti,tca6424";                                                                                                                                                                                                                                                                                                                                                                                              
                      reg = <0x22>;                                                                                                                                                                                                                                                                                                                                                                                                           
                      gpio-controller;                                                                                                                                                                                                                                                                                                                                                                                                        
                      #gpio-cells = <2>;                                                                                                                                                                                                                                                                                                                                                                                                      
                      gpio-line-names = "GPIO_eMMC_RSTn", "CAN_MUX_SEL",                                                                                                                                                                                                                                                                                                                                                                      
                                        "GPIO_CPSW1_RST", "GPIO_RGMII1_RST",                                                                                                                                                                                                                                                                                                                                                                  
                                        "GPIO_RGMII2_RST", "GPIO_PCIe_RST_OUT",                                                                                                                                                                                                                                                                                                                                                               
                                        "MMC1_SD_EN", "FSI_FET_SEL",
                    ...

    在 Linux 中以引脚"GPIO_OLED_RESETn"为例:

    root@am64xx-evm:~# gpiofind GPIO_OLED_RESETn
    gpiochip0 14
    root@am64xx-evm:~# gpioget 0 14
    0
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨、Bin、

    感谢提供新方法。 稍后我将测试这种方法来控制 GPIO。
    此外、如果我要继续使用前一种方法、是否有办法避免上述问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Stephen:

    遗憾的是、我不知道有什么方法可以阻止内核动态分配 gpiochip ID 和引脚编号。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bin、

    如果我想在某个 .c文件中调用这些唯一的名称、则需要包含哪个头文件?  应使用哪个函数来操作它?  是否有在用户应用程序和内核驱动程序中使用的示例? 谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Stephen:

    gpiofind 命令是 libgpiod 包的一部分。 请检查 libgpiod 项目源代码以了解相关示例。