注:本文基于yocto编译出的u-boot.2016.03

参考:Document Number: IMX6DQRM
Rev. C, 1/2012

1、 IOMUX

Chapter 4
External Signals and Pin Multiplexing

The i.MX 6Dual/6Quad contains a limited number of pins, most of which have multiple signal options. These signal to pin and pin to signal options are selected by the inputoutput multiplexer called IOMUX. The IOMUX is also used to configure other pin characteristics, such as voltage level, drive strength, and hysteresis.

i.MX 6Dual/6Quad 的芯片引脚有限,大部分的引脚可以配置成不同的信号功能,引脚功能由IOMUX来决定,IOMUX也用来配置引脚的其它特性,如:电压电平,驱动强度和迟滞。

2、以UART4 为例

2.1 涉及的函数

mx6qsabreauto.c

这个board_early_init_f函数在初化序列里是在比较靠前的位置,这样可以来调试u-boot,用串口来打印。
int board_early_init_f(void)
{setup_iomux_uart();return 0;
}

imx_iomux_v3_setup_multiple_pads函数来初始化UART4的引脚。

static void setup_iomux_uart(void)
{imx_iomux_v3_setup_multiple_pads(uart4_pads, ARRAY_SIZE(uart4_pads));
}

2.2 UART4有两个引脚需要配置

static iomux_v3_cfg_t const uart4_pads[] = {MX6_PAD_KEY_COL0__UART4_TX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),MX6_PAD_KEY_ROW0__UART4_RX_DATA | MUX_PAD_CTRL(UART_PAD_CTRL),
};

2.3 函数调用关系

如果搜素这个“MX6_PAD_KEY_COL0__UART4_TX_DATA”找不着。

对应关系是怎么样的呢?见下图

通过 “MX6_PAD_DECL”这个宏定义了一个 64位的无符号长整型

typedef u64 iomux_v3_cfg_t;

2.4 pad定义

对于KEY_COL0这个PAD,需要配置以下的三个寄存器

使用一个64位的整型把偏移量与配置值都放在一起,传给函数:

2.4.1 iomux_v3_cfg_t的内存布局:

sel_input pad_ctrl mux_mode sel_input_ofs pad_ctrl_ofs mux_ctrl_ofs
菊花链 控制 复用 菊花链偏移 控制偏移 多路复用偏移
4 19 7 12 12 12
0 X 4 0x938 0x05C8 0x01F8

A 菊花链:

B X的定义为:

#define UART_PAD_CTRL  (PAD_CTL_PUS_100K_UP |            \PAD_CTL_SPEED_MED | PAD_CTL_DSE_40ohm |            \PAD_CTL_SRE_FAST  | PAD_CTL_HYS)

UART_PAD_CTRL 宏定义把以下的这些位填充了。

C 多路复用:

2.5 、回写pad的相关寄存器

下面这个函数把组的一个64位的pad解析出来再写到相关的寄存器里

void imx_iomux_v3_setup_pad(iomux_v3_cfg_t pad)
{u32 mux_ctrl_ofs = (pad & MUX_CTRL_OFS_MASK) >> MUX_CTRL_OFS_SHIFT;u32 mux_mode = (pad & MUX_MODE_MASK) >> MUX_MODE_SHIFT;u32 sel_input_ofs =(pad & MUX_SEL_INPUT_OFS_MASK) >> MUX_SEL_INPUT_OFS_SHIFT;u32 sel_input =(pad & MUX_SEL_INPUT_MASK) >> MUX_SEL_INPUT_SHIFT;u32 pad_ctrl_ofs =(pad & MUX_PAD_CTRL_OFS_MASK) >> MUX_PAD_CTRL_OFS_SHIFT;u32 pad_ctrl = (pad & MUX_PAD_CTRL_MASK) >> MUX_PAD_CTRL_SHIFT;#if defined(CONFIG_MX6SL) || defined(CONFIG_MX6SLL)/* Check whether LVE bit needs to be set */if (pad_ctrl & PAD_CTL_LVE) {pad_ctrl &= ~PAD_CTL_LVE;pad_ctrl |= PAD_CTL_LVE_BIT;}
#endif#ifdef CONFIG_IOMUX_LPSRu32 lpsr = (pad & MUX_MODE_LPSR) >> MUX_MODE_SHIFT;#ifdef CONFIG_MX7if (lpsr == IOMUX_CONFIG_LPSR) {base = (void *)IOMUXC_LPSR_BASE_ADDR;mux_mode &= ~IOMUX_CONFIG_LPSR;/* set daisy chain sel_input */if (sel_input_ofs)sel_input_ofs += IOMUX_LPSR_SEL_INPUT_OFS;}
#elseif (is_cpu_type(MXC_CPU_MX6ULL) || is_cpu_type(MXC_CPU_MX6SLL)) {if (lpsr == IOMUX_CONFIG_LPSR) {base = (void *)IOMUXC_SNVS_BASE_ADDR;mux_mode &= ~IOMUX_CONFIG_LPSR;}}
#endif
#endifif (is_soc_type(MXC_SOC_MX7) || is_cpu_type(MXC_CPU_MX6ULL) ||is_cpu_type(MXC_CPU_MX6SLL) || mux_ctrl_ofs)__raw_writel(mux_mode, base + mux_ctrl_ofs);if (sel_input_ofs)__raw_writel(sel_input, base + sel_input_ofs);#ifdef CONFIG_IOMUX_SHARE_CONF_REGif (!(pad_ctrl & NO_PAD_CTRL))__raw_writel((mux_mode << PAD_MUX_MODE_SHIFT) | pad_ctrl,base + pad_ctrl_ofs);
#elseif (!(pad_ctrl & NO_PAD_CTRL) && pad_ctrl_ofs)__raw_writel(pad_ctrl, base + pad_ctrl_ofs);
#if defined(CONFIG_MX6SLL)else if ((pad_ctrl & NO_PAD_CTRL) && pad_ctrl_ofs)clrbits_le32(base + pad_ctrl_ofs, PAD_CTL_IPD_BIT);
#endif
#endif#ifdef CONFIG_IOMUX_LPSRif (lpsr == IOMUX_CONFIG_LPSR)base = (void *)IOMUXC_BASE_ADDR;
#endif}

有用的参考

https://blog.csdn.net/u013554213/article/details/79309235
https://www.jianshu.com/p/3c2053508342

IMX6之PAD配置(IOMUX)相关推荐

  1. imx6 LCD 参数配置(lvds为例)

    目前imx6的BSP开发中,lvds的参数配置一般在两个地方:  1. uboot的CMDLINE的参数设置,形如:  video=mxcfb0:dev=ldb,bpp=32  2. uboot板级代 ...

  2. 联想小新 Pad和联想小新 Pad Pro有什么区别 哪个好详细性能配置对比

    联想小新 Pad配置: 处理器型号:高通 骁龙662 处理器主频:2.0Ghz A734+1.8Ghz A534 选联想小新 Pad还是联想小新 Pad Pro这些点很重要看过你就懂了 http:// ...

  3. 【i.MX6ULL】驱动开发3——GPIO寄存器配置原理

    前面的两篇Linux驱动文章,介绍了字符设备驱动的两种新旧开发方式,并使用一个虚拟的字符驱动来学习字符设备的开发的流程. 本篇起,就要来操作Linux开发板的硬件,首先当然是通过经典的点亮LED灯程序 ...

  4. 【imx6】Unable to find the ncurses libraries的解决办法

    问题描述 在执行make menuconfig时,报错: Unable to find the ncurses libraries- 解决方法 安装ncurses和ncursesw库 sudo apt ...

  5. RT1052的LPI2C配置

    开发平台 Board:野火RT1052-MINI IDE:Keil 5.28 再来说说I2C I2C是由 Phiilps提出的,目前被广泛应用在系统内多个IC间的通讯.I2C是一个能够支持多个设备的总 ...

  6. 瑞芯微 RK3399 JTAG 配置指南

    RK3399的CPU采用big.LITTLE大小核架构,双Cortex-A72大核+四Cortex-A53小核结构,对整数.浮点.内存等作了大幅优化,在整体性能.功耗及核心面积三个方面都具革命性提升. ...

  7. IMX51---GPIO

    GPIO(General Purpose Input/Output)指通用输入/输出,IMX51的GPIO模块提供32位双向的.通用输入和输出的信号,下图是GPIO的框图: 图1 1.      GP ...

  8. 嵌入式系统与硬件安全知识小记

    目录 嵌入式系统概述 第一节 嵌入式系统概念 第二节 嵌入式系统与台式计算机 第三节 嵌入式系统与单片机 嵌入式处理器 第一节 从传统处理器到片上系统 第二节 嵌入式处理器之ARM 第三节 嵌入式处理 ...

  9. 使用linux的gpio点亮imx6ull的led灯

    一.查看硬件原理图,确定原理图上的led灯的引脚位置 二.查看imx6ull芯片手册<IMX6ULLRM> 参考资料:芯片手册<Chapter 28: General Purpose ...

最新文章

  1. cannot find module 'cordova-common'
  2. 移动端HTML5性能优化
  3. 【采用】风控模型评估方法以及大数据风控模型概念
  4. AM335x 添加 HUAWEI MU609 Mini PCIe Module,并用pppd 启动相关设备
  5. Javascript实现最简跨平台面向对象拖拽
  6. PHP GUID和UUID生成类
  7. python-获取当前文件名
  8. HC-05与JDY-09蓝牙模块对比与使用
  9. ssize_t和size_t详解
  10. 阿里云云计算助理工程师认证(ACA)详细解读
  11. php中503代表什么,php 503是什么错误?_后端开发
  12. Python 静态方法 类方法
  13. 主动降噪(Active Noise Control)
  14. 用淘汰的手机做家庭监控
  15. matlab显示sig,Matlab中LSSVM参数gam和sig2寻优范围如何确定以及寻优具体程序如何实现的问题...
  16. MyOS(三):软盘读写
  17. 烤仔看世界 | 1700万美元成交,征服苏富比的匿名艺术家
  18. 基于OPCAutomation的OPC DA Client 工具
  19. mac上MAMP的各种坑
  20. Sentinel(哨兵)检测主观下线、客观下线、选举领头Sentinel、实现故障转移

热门文章

  1. 让烦人的弹窗广告消失操作
  2. 做了20年maya的动漫老同志被年轻的belnder 二次元动画制作吸引了!!
  3. Java中Map取值转String Null值处理
  4. 仓库管理系统有哪些作用?选择仓库管理系统要注意这4大问题!
  5. 用友u8 注入RCE漏洞利用数据
  6. 高清视频监控系统网络,交换机,服务器等系统设计要点,高清视频监控系统网络设计 如何选择监控交换机?...
  7. How to find out if the ethernet cable is plugged into the physical interface without bringing up NIC
  8. math的向上取整_JavaScript数字向上取整:Math对象的ceil()方法
  9. 跟狼叔聊了一夜,终于搞明白了 Serverless 是什么
  10. 最新版海豚调度dolphinscheduler-3.1.3安装部署详细教程