Verdin AM62 引脚复用配置

news2024/9/22 19:19:36

By Toradex 胡珊逢

简介

Verdin AM62 是 Toradex 基于 TI AM623/AM625 SoC 的 Arm 计算机模块。它最多提供 4 个 A53 和 1 个 M4F 处理器。这是 TI 基于其 K3 平台的处理器,虽然和 NXP 的 iMX8M Mini/Plus 都使用 A53 核心,但是由于架构不同,在 Linux 系统中配置外设的方式也不同。文章将介绍如何配置 AM62 的引脚复用关系。

硬件介绍

Verdin AM62 所使用的 AM623/AM625 处理器的 GPIO 控制器如下图所示。GPIO 控制器根据不同的处理器可能有多个模块,AM623/AM625 拥有一个 MCU_GPIO0,一个 GPIO0 和一个 GPIO1 共三个模块。每个模块有 9 个 bank,每个 bank 有 16 个引脚,所以理论上最多有 3x9x46 = 432 个引脚。但 AM623/AM625 SoC 并不能使用所有引脚,SoC 实际可用的为 198 个引脚。Verdin AM62 模块并没有把 SoC 的引脚都引出,因而可用的引脚少于 198。

Device Tree 配置

在写本文章时,Verdin AM62 使用 toradex_ti-linux-6.1.y分支内核。每个 GPIO 根据用途的不同,相应的配置分布在多个 device tree 文件中。如下图,k3-am62-mcu.dtsi 和 k3-am62-main.dtsi 中定义了三个 GPIO 控制器模块以及对应的物理地址,k3-am62-verdin.dtsi 中包含每个引脚的具体配置。三个 GPIO 控制器分为两种,MCU_GPIO 和 GPIO0/1,它们可以使用各自专门的函数来配置所控制的引脚。&mcu_pmx0 和 &main_pmx0 分别使用 AM62X_MCU_IOPAD 和 AM62X_IOPAD 配置。下面将介绍如何修改和使用 mcu_gpio0,main_gpio0 和 main_gpio1 模块所控制的引脚。

我们分别选择来自如下三个不同 IO 控制器的引脚,分别是 SOIDMM 19、21、61。 查看 Verdi AM62 Datatsheet 的 Table 12: Alternate functions 可以确定对应引脚的 SoC Ball ID 和 SoC ball name。在 TI AM623/AM625处理器的 Datasheet 中 Table 6-1. Pin Attributes 可以找到对应 SoC Ball ID 的 PADCONFIG Address。有了这些信息就能够在 Device tree 中进行配置。

SODIMMSoC Ball IDSoC ball namePADCONFIG AddressALT7
61A6MCU_UART0_CTSn0x0408401CMCU_GPIO0_7
21U24GPMC0_AD150x000F4078GPIO0_30

19

A14SPI0_CLK0x000F41BCGPIO1_17

  • SODIMM 19

k3-am62-verdin.dtsi 中提供了默认引脚的配置。Toradex 在代码中做了详细的注释,例如以 SODIMM 19 为关键字搜索,可以找到该引脚的默认配置,这里发现关于 SODIMM 19 的配置有两个。SODIMM 19 属于 GPIO1 控制器,所以该配置是 main_pmx0 下面的子节点,并使用 AM62X_IOPAD 函数进行配置。A14(Ball ID)的 PADCONFIG 地址是 0x000F41BC,对应的掩码是 0x1fff,AM62X_IOPAD 使用 0x01bc。 PIN_OUTPUT/PIN_INPUT 表示把该引脚配置为输出/输入状态。数字 2 表示该引脚使用第二个复用配置,即当作 PWM1_A 使用。数字 7 表示该引脚使用第七个复用配置,即当作 GPIO 使用。引脚所有可用的复用关系可在 Verdi AM62 Datatsheet Table 12: Alternate functions 查看。AM62 处理器的引脚最多可以有 10 个复用配置可选,在 Table 12 中由 ALT0 到 ALT9 表示。部分引脚可能少于 10 个复用配置。后面的注释中,A14 为 SoC Ball ID,SPI0_CLK 是 SoC Ball Name,GPIO1_17 指当前选择第七个复用配置,作为 GPIO 对应的编号 GPIO1_17。当配置为 PWM 功能时就由 GPIO1_17 改为 EHRPWM1_A。在修改为其他复用配置后,建议也对应修改注释,便于理解代码。

/* Verdin PWM_3_DSI */
pinctrl_epwm1_a: main-epwm1a-pins-default {
  pinctrl-single,pins = <
      AM62X_IOPAD(0x01bc, PIN_OUTPUT, 2) 
      /* (A14) SPI0_CLK.EHRPWM1_A */ /* SODIMM 19 */
  >;
};

pinctrl_pwm3_dsi_gpio: main-gpio1-17-pins-default {
  pinctrl-single,pins = <
      AM62X_IOPAD(0x01bc, PIN_INPUT, 7) 
      /* (A14) SPI0_CLK.GPIO1_17 */ /* SODIMM 19 */
  >;
};

上面 AM62X_IOPAD 中配置的 PIN_OUTPUT/PIN_INPUT 将设置 PADCONFIG 的寄存器。PIN_OUTPUT/PIN_INPUT 在 k3-pinctrl.h 定义。

/* Only these macros are expected be used directly in device tree files */
#define PIN_OUTPUT        (INPUT_DISABLE | PULL_DISABLE)
#define PIN_OUTPUT_PULLUP    (INPUT_DISABLE | PULL_UP)
#define PIN_OUTPUT_PULLDOWN    (INPUT_DISABLE | PULL_DOWN)
#define PIN_INPUT        (INPUT_EN | PULL_DISABLE)
#define PIN_INPUT_PULLUP    (INPUT_EN | PULL_UP)
#define PIN_INPUT_PULLDOWN    (INPUT_EN | PULL_DOWN)
 

PIN_OUTPUT/PIN_INPUT 定义的值最终被写入 Pad Configuration 寄存器,具体的说明可以参考 AM623/625 的 Technical Reference Manual中 Table 6-2045. Description Of The Pad Configuration Register Bits 相关说明。

根据 pinctrl_epwm1_a 查找,发现该引脚被分配到 epwm1,为了将 SODIMM 19 作为 GPIO 使用,在device tree 需要确保 epwm1 处于 disabled 状态。

/* Verdin PWM_3_DSI */
&epwm1 {
  pinctrl-names = "default";
  pinctrl-0 = <&pinctrl_epwm1_a>;
  status = "disabled";
};

如果使用 k3-am625-verdin-nonwifi-dev.dtb,那么在 k3-am62-verdin-dev.dtsi 中需要将 epwm1 禁用。

/* Verdin PWM_3_DSI */
&epwm1 {
  status = "disabled";
};

在 k3-am62-verdin.dtsi 的 main_gpio1 可以为 GPIO1 控制器的引脚添加 line-name,这样在 Linux 中 libgpiod 就能够使用更直观 line-name 直接访问引脚。gpio-line-names 从 gpio1_0 开始为每个引脚添加 line-name,gpio1_17 则设置为 SODIMM_19。

&main_gpio1 {
  gpio-line-names =
      "", /* 0 */
      "",
      "",
      "",
      "",
      "",
      "",
      "",
      "",
      "",
      "", /* 10 */
      "",
      "",
      "",
      "",
      "SODIMM_15",
      "SODIMM_16",
      "SODIMM_19",

由于 SOIDMM 19 属于 GPIO1 控制器,在 k3-am62-verdin-dev.dtsi 中需要添加 main_gpio1 节点并将 pinctrl_pwm3_dsi_gpio 添加到节点中。

&main_gpio1 {
  pinctrl-names = "default";
  pinctrl-0 = <&pinctrl_pwm3_dsi_gpio>;
};

  • SODIMM 21

SODIMM 21 也是类似的方法。在 Verdi AM62 Datatsheet Table 12: Alternate functions 中看到 SOIDMM 21 对应的 SoC Ball ID 为 U24,第七复用配置 ALT7 可以作为 GPIO 功能,编号 GPIO0_30,这属于 GPIO0 控制器。TI AM623/AM625处理器的 Datasheet 中 Table 6-1. Pin Attributes 中找到 U24 对应的 PADCONFIG Address 是 0x000F4078。因此,在 AM62X_IOPAD 使用 0x0078。

/* Verdin DSI_1_BKL_EN */

pinctrl_dsi1_bkl_en: main-gpio0-30-pins-default {

pinctrl-single,pins = <

 AM62X_IOPAD(0x0078, PIN_INPUT, 7)

 /* (U24) GPMC0_AD15.GPIO0_30 */ /* SODIMM 21 */

>;

};

在 main_gpio0 中,GPIO0_30 的 line-name 已经被定义为 SODIMM_21。

&main_gpio0 {

gpio-line-names =

"",

"SODIMM_76",

"SODIMM_21", /* 30 */

SODIMM 21 属于 GPIO0 控制器,在 k3-am62-verdin-dev.dtsi 中,将 pinctrl_dsi1_bkl_en 添加到 main_gpio0 节点中。

&main_gpio0 {
  pinctrl-names = "default";
  pinctrl-0 = <&pinctrl_ctrl_sleep_moci>,
          <&pinctrl_gpio_5>,
          <&pinctrl_gpio_6>,
          <&pinctrl_gpio_7>,
          <&pinctrl_gpio_8>,
          <&pinctrl_dsi1_bkl_en>;
};

  • SODIMM 61

在 Verdi AM62 Datatsheet 的 Table 12 发现 SODIMM 61 对应 ALT7 为 MCU_GPIO0_7,SoC Ball ID 为 A6,SoC ball name 为 MCU_UART0_CTSn。在 TI AM623/AM625 处理器的 Datasheet 中 Table 6-1 中对应的 PADCONFIG Address 是 0x0408401C。使用 0x010c 作为关键字在 k3-am62-verdin.dtsi 检索只发现下面配置,但该子节点属于 main_pmx0 而非为 mcu_pmx0。所以在 k3-am625-verdin-nonwifi-dev.dtb 并未配置 SODIMM 61。那么就需要在 k3-am62-verdin.dtsi 添加相关配置。

  pinctrl_sdhci2: main-mmc2-pins-default {
      pinctrl-single,pins = <
          AM62X_IOPAD(0x120, PIN_INPUT, 0) 
          /* (C24) MMC2_CMD   */ /* WiFi_SDIO_CMD   */
          AM62X_IOPAD(0x118, PIN_INPUT, 0) 
          /* (D25) MMC2_CLK   */ /* WiFi_SDIO_CLK   */
          AM62X_IOPAD(0x114, PIN_INPUT, 0) 
          /* (B24) MMC2_DAT0  */ /* WiFi_SDIO_DATA0 */
          AM62X_IOPAD(0x110, PIN_INPUT, 0) 
          /* (C25) MMC2_DAT1  */ /* WiFi_SDIO_DATA1 */
          AM62X_IOPAD(0x10c, PIN_INPUT, 0) 
          /* (E23) MMC2_DAT2  */ /* WiFi_SDIO_DATA2 */
 

在 mcu_pmx0 中把 SODIMM 61 配置作为子节点添加进去。注意,由于 SODIMM 61 属于 MCU_GPIO 控制器,所以这里使用 AM62X_MCU_IOPAD 来配置。

&mcu_pmx0 {
  /* Verdin GPIO_9 */
  pinctrl_gpio_9: mcu-gpio0-7-pins-default {
      pinctrl-single,pins = <
          AM62X_MCU_IOPAD(0x001c, PIN_INPUT, 7) 
          /* (A6) MCU_UART0_CTSn.MCU_GPIO0_7 */ /* SODIMM 61 */
      >;
  };

在 &mcu_gpio0 中第八个位置添加 MCU_GPIO0_7 对应的 line-name 为 SODIMM_61。其中第一行 SODIMM_244 对应的是 MCU_GPIO0_0,第二行 SODIMM_206 对应的是 MCU_GPIO0_1。

&mcu_gpio0 {
  gpio-line-names =
      "SODIMM_244",
      "SODIMM_206",
      "SODIMM_208",
      "SODIMM_210",
      "SODIMM_212",
      "",
      "",
      "SODIMM_61",

在 k3-am62-verdin-dev.dtsi 中的 mcu_gpio0 节点中添加前面配置的 pinctrl_gpio_9。

&mcu_gpio0 {
  pinctrl-names = "default";
  pinctrl-0 = <&pinctrl_gpio_1>,
          <&pinctrl_gpio_2>,
          <&pinctrl_gpio_3>,
          <&pinctrl_gpio_4>,
          <&pinctrl_pcie_1_reset>,
          <&pinctrl_gpio_9>;
};

引脚测试

上面配置完成后,重新编译 device tree,并部署到的开发板上。

make ti/k3-am625-verdin-nonwifi-dev.dtb

重启后使用 gpioinfo 命令找到上面配置三个引脚在 Linux 系统中对应的 bank 和 line 编号。

gpiochip1 - 24 lines:
line   7:  "SODIMM_61"       unused   input  active-high


gpiochip2 - 92 lines:
line  30:  "SODIMM_21"       unused   input  active-high


gpiochip3 - 52 lines:
line  17:  "SODIMM_19"       unused   input  active-high

下面三个命令分别可以把对应的引脚拉高或拉低。

root@verdin-am62:~# gpioset 3 17=1
root@verdin-am62:~# gpioset 2 30=1
root@verdin-am62:~# gpioset 1 7=1

root@verdin-am62:~# gpioset 3 17=0
root@verdin-am62:~# gpioset 2 30=0
root@verdin-am62:~# gpioset 1 7=0

除了像上面直接在 user space 控制 GPIO 的状态,驱动中也可以控制相关引脚。例如在 k3-am62-verdin-dev.dtsi 的根节点下添加一个 LED 子节点并使用 SOIDMM 61 来控制。首先,需要把 pinctrl_gpio_9 从原来 &mcu_gpio0 删除,因为这里该引脚不再作为普通的 GPIO 使用,而是用于 LED 驱动。在 gpios 参数中使用 &mcu_gpio0 7 来引用 SODIMM 61。如果是 main_gpio0 控制器下的 SODIMM 21,则对应需要使用 &main_gpio0 30 来引用。

  gpio-leds {
      compatible = "gpio-leds";
      pinctrl-names = "default";
      pinctrl-0 = <&pinctrl_gpio_9>;
      
      led-yellow {
          gpios = <&mcu_gpio0 7 GPIO_ACTIVE_HIGH>;
          default-state = "on";
          label = "status";
      };
      
  };

总结

文章就 AM623/625 SoC 介绍了如何在 Device tree 中配置和使用 GPIO,需要注意区分 GPIO 来自哪个控制器,并使用对应的函数和引用符号。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2144364.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能优化算法-遗传算法(GA)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 遗传算法 (Genetic Algorithm, GA) 是一种基于自然选择和遗传学原理的元启发式优化算法&#xff0c;它模仿了生物进化过程中的选择、交叉和变异操作来搜索最优解。 GA的工作机制主要包括&#xff1a; 选择&am…

1652AM任意波形发生器

1652AM 任意波形发生器 1652AM任意波形发生器是一款多通道、多功能的任意波形发生器。它在兼顾了输出信号高质量的同时&#xff0c;实现了高通道密度。它可与其它通用或专用模块化测试仪器构成综合测试系统或平台&#xff0c;支持众多解决方案&#xff0c;包括先进计算机调…

鹰眼降尘系统多少钱

关于鹰眼系统的价格&#xff0c;由于该系统可能涉及多个领域和不同的配置&#xff0c;因此价格范围可能相对较广。以下是朗观视觉小编对鹰眼系统价格的一些分析和说明&#xff1a; 一、价格影响因素 应用领域&#xff1a;鹰眼系统可能应用于不同的领域&#xff0c;如环保降尘、…

线性代数书中求解线性方程组的三种方法的实例

目录 一、克拉默法则(P45) 二、逆矩阵(P46) 三、高斯-约当消元法(P65) 一、克拉默法则(P45) 二、逆矩阵(P46) 三、高斯-约当消元法(P65)

c++11标准(1)右值引用和移动构造

欢迎来到博主的专栏&#xff1a;c杂谈 博主ID&#xff1a;代码小豪 文章目录 左值和左值引用右值和右值引用右值右值引用 右值引用的使用场景与意义 右值引用是c11标准推出的新特性&#xff0c;在此之前&#xff0c;引用都是左值引用。为了弄清楚什么是右值引用&#xff0c;首先…

Euro 2024 足球中的IMU技术突破

在体育技术领域&#xff0c;IMU&#xff08;惯性测量单元&#xff09;技术正以前所未有的方式重塑足球比赛。Adidas Fussballliebe Finale足球&#xff0c;作为首个在欧洲锦标赛中采用公司“连接球技术”的官方比赛用球&#xff0c;展示了IMU技术在现代足球中的应用。以下是这款…

『.NET 高手必备』深入浅出RulesEngine:业务逻辑抽象新利器!

亲爱的朋友们&#xff0c;我是许泽宇&#xff0c;今天我要和大家探讨一款强大的业务规则库——Microsoft RulesEngine。在软件开发中&#xff0c;业务逻辑的变更和扩展往往如同“潘多拉魔盒”&#xff0c;一旦打开就难以收拾。RulesEngine 的设计理念就是为了解决这个难题&…

从“治理”到“智理”,看大模型如何赋能智慧政务

一、从治理到智理的飞跃 在智慧城市的建设蓝图中&#xff0c;智慧政务如同一股不可忽视的力量&#xff0c;正悄然改变着城市的治理面貌。传统意义上&#xff0c;“治理”往往意味着对复杂社会现象的被动应对&#xff0c;而“智理”则预示着通过智能化手段主动预见、解决问题的…

最优化理论与自动驾驶(一):概述

目录 1. 最优化理论的原理 2. 最优化问题的分类 1. 按目标函数的性质分类 2. 按变量的性质分类 3. 按约束条件分类 4. 按时间维度分类 5. 按不确定性分类 6. 按决策变量的维度分类 3. 常用的最优化方法 1. 梯度类优化算法 2. 约束优化算法 3. 启发式算法 4. 线性规…

Internet选项检查所存网页的较新版本的设置

每次访问此页时检查代表着,你无论打开任何网页时,都不用IE缓存,直接刷新浏览每次启动IE时检查,代表着,只要你IE浏览器不关闭,,那么他在访问相当网站,网页时,就会调用IE缓存(你会感觉打开非常快),这时候,他并没有下载网页,,只是调用缓存而已。。但是如果你关闭IE浏览器,再重新打…

考软考的信息安全工程师,有什么诀窍在一个月内通过吗?

一般是至少是2个月时间拿来备考的&#xff0c;低于2个月的话&#xff0c;时间肯定是比较赶的。虽然一个月时间相对紧张&#xff0c;但通过合理规划和高效利用时间&#xff0c;也是有可能成功通过考试的。以下是一份详细的备考策略&#xff0c;旨在帮助大家在有限的时间内最大化…

springboot家政服务管理系统—计算机毕业设计源码34242

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

数据结构与算法——顺序表期末复习五大经典题型

目录 一&#xff1a;顺序表-移除元素 二&#xff1a;顺序表-删除有序数组中的重复项 三&#xff1a;顺序表-合并两个有序数组 四&#xff1a;顺序表-旋转数组 五&#xff1a;顺序表-数组形式的整数加法 一&#xff1a;顺序表-移除元素 题型链接&#xff1a;27. 移除元素 -…

【期末复习】大二下系列 公共课专业课 复习笔记合集

计算机网络 老师划重点 第一章 计算机网络概述 1.3 互联网概述&#xff08;概念&#xff0c;因特网四个阶段&#xff09; 因特网四个阶段&#xff1a; 因特网草案建议标准草案标准因特网标准 1.5 计算机网络的主要性能指标 1.6 计算机网络体系结构&#xff08;三种划分和各…

黑神话悟空mac可以玩吗

黑神话悟空mac上能不能玩对于苹果玩家来说很重要&#xff0c;那么黑神话悟空mac可以玩吗&#xff1f;目前是玩不了了&#xff0c;没有针对ios系统的版本&#xff0c;只能之后在云平台上找找了&#xff0c;大家可以再观望下看看。 黑神话悟空mac可以玩吗 ‌使用CrossOver‌&…

cdr怎么画虚线?

虚线是以点或者短线画成的断续的线&#xff0c;多用于几何图形或者标记。我们在平常学习工作中经常使用标记的方式。根据国标制图规定 机械制图 图样画法 图线规定&#xff0c;技术图样中&#xff0c;主要使用细虚线和粗虚线两种&#xff0c;细虚线用以表示不可见棱边线和不可见…

Feed流系统重构:架构篇

重构对我而言&#xff0c;最大的乐趣在于解决问题。我曾参与一个C#彩票算奖系统的重构&#xff0c;那时系统常因超时引发用户投诉。接手任务时&#xff0c;我既激动又紧张&#xff0c;连续两天几乎废寝忘食地编码。结果令人振奋&#xff0c;算奖时间从一小时大幅缩短至十分钟。…

半导体行业跨国文件传输解决方案

在数字化浪潮席卷全球的今天&#xff0c;半导体行业无疑是科技创新的先锋。随着对数据传输需求的激增&#xff0c;传统的文件传输协议FTP在处理半导体行业庞大的文件量和复杂的文件结构时显得捉襟见肘。尤其是在跨国文件传输场景中&#xff0c;传统方法已经难以跟上行业的发展步…

你了解什么是场外期权吗?

今天期权懂带你了解你了解什么是场外期权吗&#xff1f;场外期权是指在交易所之外进行交易的期权合约。这类期权通常是由买卖双方通过私人协议进行交易&#xff0c;而不是在标准化的交易所上进行。 场外期权的特点 1.定制化&#xff1a;场外期权合约可以根据交易双方的具体需…

AI写作神器:助力体制内小白轻松完成材料撰写,减少慌张茫然

刚刚进入体制内的工作者&#xff0c;对于公文材料撰写基本无从下手&#xff0c;力不从心&#xff0c;提交稿件后&#xff0c;反馈的问题大多存在结构格式不对、文字口语化&#xff0c;缺少理论依据等&#xff0c;笔者是做互联网的&#xff0c;所以对AI工具比较了解&#xff0c;…