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.

[参考译文] Linux/AM5728:AM572X EVM 中的 GPIO、UART 和 I2C 操作

Guru**** 2546020 points
Other Parts Discussed in Thread: AM5728, AM3358

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/595855/linux-am5728-gpio-uart-and-i2c-operations-in-am572x-evm

器件型号:AM5728
主题中讨论的其他器件: AM3358

工具/软件:Linux

您好!

我不熟悉 AM572x EVM。 之前、我曾使用 BeagleBone Black 并连接 GPIO、UART 和 I2C。

但我认为 AM572x EVM 的情况略有不同。

有关在 AM572x 中连接 GPIO、UART 和 I2C 的信息,请参阅一些 wiki 或指南。

现在、我能够通过 ssh (以太网端口)、minicom (调试端口)与 AM572x EVM 通信。

我可以运行一些简单的应用 程序- helloworld。

首先、我使用在 BeagleBone Black 板中工作正常的相同代码测试了 GPIO。

使用此软件、将创建文件夹/sys/class/gpio/gpioxx 文件夹。 文件"value"正在按照软件中的方式进行更新。

但该值不会出现在引脚输出中。

我是否应该更改 am57xx_evm.dts 文件以使 GPIO、UART 和 I2C 适用于 AM572x?

提前感谢您的帮助。

谢谢、此致、

Sajeevan.K

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

    [引用]是否应更改 am57xx_evm.dts 文件以使 GPIO、UART 和 I2C 适用于 AM572x?[/quot]

    是的、您需要在 DTS 文件中启用引脚多路复用器和外设才能使用它们。

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


    感谢你的答复。
    是否有任何有关引脚多路复用和启用外设的 wiki 或指南。

    我的怀疑是这些。

    如何计算引脚编号或偏移?

    如何启用特定的 GPIO 引脚?

    对于 UART、启用是否仅需要引脚多路复用?


    提前感谢您的帮助。


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


    我向 am57xx-evm.dts 添加了以下行

    &dra7_PMX_CORE{
    pinctrl-names ="default";
    pinctrl-0 =<&board_pines>;

    Board_pins:pinmux_board_pins{
    pinctrl-single、pins =<
    0x16DB 0x020E
    0x16E0 0x020E
    0x1474 0x020E
    0x1488 0x020E

    0x14C4 0x060E
    0x14CC 0x060E
    0x14D8 0x060E
    >;
    };

    uart1_pins:pinmux_uart1_pins{
    pinctrl-single、pins =<
    0x17E0 0x00
    0x17E4 0x00

    >;
    };

    };

    uart1{(&U)
    状态="正常";
    pinctrl-names="default";
    pinctrl-0 = ;
    };

    我尝试将 GPIO4_17、GPIO5_11、GPIO2_3和 GPIO2_8作为输出、将 GPIO2_23、GPIO2_25和 GPIO2_28作为输入。
    我还尝试启用 uart1。

    DTS 文件已编译。

    在更换 DTB 后、它也无法正常工作。
    我缺少什么吗? 或者有什么问题吗?

    感谢您的帮助、

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

    可以在器件数据手册中看到模块引脚编号:
    表4-2. 焊球特性

    列焊球名称对应于应设置的控制模块寄存器。 CTRL_MODULE 寄存器可在器件技术参考手册中找到、请见:
    CTRL_CORE_PAD_*
    表18-28. CTRL_MODULE_CORE 寄存器映射 TRM 摘要。

    然后、可以通过选中 dra7.dtsi、
    L4_cfg:L4@4a000000 -->互连基址
    SCM:SCM@2000 -->系统控制模块偏移
    dra7_PMX_CORE:pinmux@1400 --> pinmux 寄存器起始地址

    如果添加上述地址、您将获得第一个 PADCONF 重定位器的地址:CTRL_CORE_PAD_GPMC_AD0 0x4A003400
    通过添加所需的寄存器偏移量、您可以获得相应 padconf 的地址。

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

    Yordan、您好!

    非常感谢您的回复。

    我可以从您的邮件中了解到、我写的偏移是错误的。

    我认为纠正它可以解决这个问题。

    但遗憾的是、我的 AM572x EVM 现在不处于工作状态。

    因此、我无法立即对其进行测试。

    问题是 PMIC 在7秒后关闭控制器电源。

    我不知道这种关闭是否有任何包含错误.dts 文件的链接。

    但是、即使 SD 卡具有预构建的映像、也会发生相同的问题。

     如果此 PMIC 关闭时有任何与错误.dts 文件的链接、请建议从该状态恢复。

    无论如何、我已经在 Sitara E2E 社区中为此 PMIC 关闭问题创建了另一个主题。

    那么、我要关闭这个线程。

    谢谢、此致、

    Sajeevan.K

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

    您好 Sajeevan、

    [报价]问题是 PMIC 在7秒后关闭控制器的电源。[/报价]

    这是因为 ROM 无法及时找到正确的引导加载程序、并且会关闭电源。  

    为了避免 这种行为、您应该在 J5上添加一个跳线:

    这会在电源连接到电路板的整个时间内将 PMIC_POWERHOLD 保持为高电平。  

    此致、  
    Yordan

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


    我有一个新的处理器卡。
    我使用更正后的.dtb 测试了此卡。

    但端口引脚的状态仍不会按照软件中的规定发生变化。

    更正后的.dts 文件部分如下所示。

    &dra7_PMX_CORE{
    pinctrl-names ="default";
    pinctrl-0 =<&board_pines>;

    Board_pins:pinmux_board_pins{
    pinctrl-single、pins =<
    0x2E0 0x020E
    0x2D8 0x020E
    0x74 0x020E
    0x88 0x020E

    0xc4 0x060E
    0xCC 0x060E
    0xD8 0x060E
    >;
    };

    uart1_pins:pinmux_uart1_pins{
    pinctrl-single、pins =<
    0x3E0 0x00
    0x3E4 0x00

    >;
    };

    };

    uart1{(&U)
    status="oke";
    pinctrl-names ="default";
    pinctrl-0 =<uart1_PINs>;
    };

    正如我之前提到的,/sys/class/gpio/gpioxx 文件夹正在创建中。 文件"value"正在按照软件中的方式进行更新。

    但该值不会出现在引脚输出中。


    提前感谢您的帮助。




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


    正如我在前一封邮件中所述、在 BeagleBone Black 中成功运行的 GPIO 软件在 A572x 中无法正常工作。

    该软件只是写入/sys/class/gpio/gpioxx/direction 和/sys/class/gpio/gpioxx/value.文件
    文件/sys/class/gpio/gpioxx/value 已按照软件正确更新。 我再次验证了这一点。

    但文件/sys/class/gpio/gpioxx/value 中的此值不会更新到端口引脚。



    现在、我使用我从获得的另一个软件"4174.AM335x_GPIO_key_led.c"进行了测试

    e2e.ti.com/.../1111256。使用此软件、端口引脚已正确更新。 一切都很好。


    在第二个软件中、方向寄存器和值寄存器通过其地址直接访问。

    在第一个软件中、/sys/class/gpio/gpioxx 中的文件被更改为控制。 这种方法在 BBB 中工作正常。 为什么该方法在 AM572x 中不起作用?


    在更正.dts 文件之前、两个软件都不起作用。


    现在、我将介绍 UART 和 i2c。 在这里、我还在使用在 BBB 中工作的软件。 在 BBB 中、有在/sys/devices/platform/bone_capemgr/slots.中定义的 Cape Manager 插槽

    例如、如果需要激活 UART4、则需要提供命令 sudo su -c "echo BB-UART4 >$slots "以启用 BB_UART4覆盖。 AM572x 中是否需要任何类似的过程?

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

    Yordan、您好!

    对于 UART、我也面临同样的问题。

    在 BBB 中正常工作的代码在 AM572x 中不工作。

    在代码中、我在 BBB 中使用

     SER_FD =开路("/dev/tty1、O_RDWR | O_NOCTTY);

      if (ser_fd =-1)

      {

       printf ("\n 错误! 打开 tty1\n");

      }

      其他

      {

       printf ("\n tty1已成功打开\n");

      }

      tcgetattr (ser_fd、&ser_settings);

      cfsetispeed (&ser_settings、B9600);

      cfsetospeed (&ser_settings、B9600);

    文件/dev/tty1已成功打开。

    但传输或接收不会发生。

    就像 GPIO 代码一样、这里还需要寄存器级访问?

    是否有适用于相同器件的示例代码?

    感谢你的帮助。

    谢谢、此致、

    Sajeevan.K

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

    您好、SAJEEVAN。
    我也遇到了 GPIO 问题:连接到 GPIO3_8、GPIO3_11、GPIO3_16和 GPIO3_20的 LED 无法通过 sysfs 属性进行编程。
    这个问题的关键点是、am5728上的 GPIO 组映射与 am33xx 上的映射不匹配。
    首先、您可以尝试确保请求正确数量的 GPIO。 您可以通过 DTS 将 GPIO 设置为 LED、在 Linux 启动后、通过 debugfs 检查系统中分配的 GPIO 编号:

    1.使用相应的 GPIO 组和端口号将以下测试节点添加到 DTS 中:

    LED{
     兼容="GPIO-LED";
     LED@0{
      标签="VD1:AH3";
      GPIO =<&GPIO3 8 GPIO_ACTIVE_LOW>;//在此处设置您的组和端口号
      linux、default-trigger ="default-on";
      默认状态="off";
    };
    (笑声)
    (如果需要、您可以添加更多 GPIO-LED)
    (笑声)

    };

    2.然后使用此 DTS 启动您的电路板,并通过命令检查分配的 GPIO 数量  

    CAT /sys/kernel/debug/gpio 

    根据此示例、您可以得到以下日志、其中清楚地看到、我们的 GPIO3_8有一个数字232、它与 am33xx 上的交叉枚举不对应(其中它应该是104):



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

    您好、Ilya Kravchuk、

    非常感谢您的回复。

    我们现在正忙于另一项工作。 完成该工作后、我们将检查此内容并向您提供反馈。

    谢谢、此致、

    Sajeevan.K

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

    您好!

    我遇到了从 am3358到 am5728 EVM 的 GPIO 同样的问题。 我发现对于 am5728、GPIO 组从1开始、而对于 am3358、它们从0开始。 即:
    在 AM335x 上:
    GPIO2_7应为 gpio71 (2-0)*32 + 7)
    在 am5728上:
    GPIO2_7应为 gpio39 ((2-1)*32 + 7)

    我在这里度过了一个很棒的一天

    我编辑了此条目、添加了有关与 am5728进行名称索引的更多信息、这可以解释 UART 存在的问题。 UART0对 ARM 不可用(仅对 PRU 可用)、因此 UART 从 UART1开始。 因此:

    在 am572x 上:

    UART1映射到 ttyS0

    UART2映射到 ttyS1...

    在 AM335x 上:

    UART0映射到 TTYO0

    UART1映射到 TTYO1...

    如果您需要使用 PWM、则可以使用该奇怪的索引映射:

    am57xx 上的器件树至硬件映射:

    ehrpw0映射到 ehrpw1

    ehrpw1映射到 ehrpw2

    ehrpw2映射到 ehrpw3

    当使用 am572x 进行索引移动时、请小心操作器件的所有命名。

    至于多路复用、请非常小心、因为所有引脚多路复用都是由引导加载程序完成的。 如果您的硬件未按其应有的方式使用 EVM 连接器的引脚、则必须相应地重建引导加载程序。 如果您的硬件组件具有与连接器上的输出引脚相对应的输出引脚、则覆盖器件树中的多路复用可能会很晚! 我个人认为多路复用应该保持在器件树的水平。 那些在"器件树时代"之前知道如何开发的人会记得跟上内核版本有多困难、我认为我们不希望这与引导加载程序是一样的! 我希望 TI 回到器件树中再进行多路复用。

    希望这对您有所帮助、


    Vincent Fournier