IOMUX Controller (IOMUXC) IO多路复用控制器
1.overview
The IOMUX Controller (IOMUXC), together with the IOMUX, enables the IC to share one pad to several functional blocks.
IOMUXC和IOMUX使IMX6能够多个功能模块公用一个pad. 共用是通过对pad的输入/输出信号的多路复用技术来实现的.
每一个模块需要一个特定的pad设置, 且对于每一个pad, 有多达8个复用选择(称为ALT(alternative)). 这些pad设置通过IOMUXC控制.
IOMUX由多个基本的IOMUX单元的组合逻辑构成. 每一个基本的IOMUX单元只能处理一个pad的信号复用.

2.features
32位软件多路控制寄存器(IOMUXC_SW_MUX_CTL_PAD_<PADNAME> or IOMUXC_SW_MUX_CTL_GRP_<GROUP NAME>)配置8个可选(ALT)多路复用模式位域, 并强制设置pad输入路径(通过SION bit)
32位软件pad控制寄存器(IOMUXC_SW_PAD_CTL_PAD_<PAD_NAME> or IOMUXC_SW_PAD_CTL_GRP_<GROUP NAME>)对每一个pad配置特定的pad设置
32位通用寄存器14个(GPR0 to GPR13), 32位寄存器根据SoC需求用于任何使用
32位输入选择控制器用于控制输入路径到一个模块当不止一个pad驱动这个模块输入时
每一个SW MUX/PAD CTL IOMUXC寄存器只能处理一个pad或一个pad组

3.functional description
IOMUXC由两个子模块组成:
IOMUXC_REGISTERS包含所有的IOMUXC寄存器
IOMUXC_LOGIC包含所有IOMUXC组合逻辑(IP接口控制, 地址解码)
3.1ALT6和ALT7扩展多路复用模式
ALT6和ALT7多路复用模式允许系统的任何信号(比如fuse, pad input)重写任何软件配置和强制ALT6/ALT7多路复用模式
它也允许一个IOMUX软件寄存器控制一组pads
3.2SW loopback功能通过设置SION bit
当IOMUXC_SW_MUX_CTL的SION位被置1他讲忽视模式控制位的输入模式
3.3Daisy链-多个pads驱动同一个模块的输入引脚
有些时候, 多个pad可能驱动单个模块的输入引脚
比如imx6dl中, uart4的收数据输入引脚: UART4_RX_DATA, 它有两个pad可以驱动它, 也就是说有两个pad都可以作为UART4_RX_DATA引脚, 这取决与硬件. 在imx6dl手册中搜索UART4_RX_DATA可知, 有这两个pad: CSI0_DAT13, KEY_ROW0可以作为UART4_RX_DATA的输入引脚. 具体参照原理图, HUD项目中, 原理图中UART4_RX_DATA是接到KEY_ROW0这个pad上了, 所以项目中, KEY_ROW0这个pad作为UART4_RX_DATA输入脚, 故要设置IOMUXC_UART4_UART_RX_DATA_SELECT_INPUT[DAISY]=3

如何理解IOMUX多路复用器呢?
a.首先这些IO都是输入输出管脚(pad)
b.这些管脚可以复用成多个功能(比如GPIO, CCM_CLKO, SPDIF_OUT...)
c.手册中会以其中的一个功能来命名pad名
d.然后在IOMUX章节可以找到其他复用的功能
例子:
节油项目中音频解码器芯片mp7741dq中的EN使能脚是通过AP_EN来控制的, 然后找到AP_EN管脚对应的pad为EIM_D29, 在数据手册IOMUX Controller章节搜索EIM_D29可以看到它可以复用成其他7个功能(IPU1_DI1_PIN15, ECSPI4_SS0, UART2_RTS_B, GPIO3_IO29, IPU1_CSI1_VSYNC, IPU1_DI0_PIN14, EPDC_PWR_WAKE), 只是这里以EIM_D29为pad名, 然后就可以在数据手册中搜索到其他的复用功能

解析uboot下iomux相关宏的使用
在arm/include/asm/imx-common/iomux-v3.h中, 描述了IOMUX模块相关寄存器的宏
IOMUX/PAD Bit field definitions
MUX_CTRL_OFS: 0..11 (12)
PAD_CTRL_OFS: 12..23 (12)
SEL_INPUT_OFS: 24..35 (12)
MUX_MODE + SION: 36..40 (5)
PAD_CTRL + NO_PAD_CTRL: 41..58 (18)
SEL_INP: 59..62 (4)
reserved: 63 (1)
IOMUX_PAD(pad_ctrl_ofs, mux_ctrl_ofs, mux_mode, sel_input_ofs, sel_input, pad_ctrl) \
...
其实这里的宏定义就是要把IOMUX相关的寄存器集中在IOMUX_PAD中, 然后通过相应函数(imx_iomux_v3_setup_multiple_pads)的解析, 把该宏定义好的值写入到到IOMUX相关寄存器中, 这样就实现了设置IO复用功能

一个设置IO复用的例子:
在board/fresscale/mx6sabresd/mx6sabresd.c中有很多IO复用的例子, 这里举一个
iomux_v3_cfg_t const yaxon_pads[] = {
MX6_PAD_GPIO_17__GPIO7_IO12 | MUX_PAD_CTRL(NO_PAD_CTRL),
};

static void setup_yaxon(void)
{
imx_iomux_v3_setup_multiple_pads(yaxon_pads, ARRAY_SIZE(yaxon_pads));
}

这里首先通过定义yaxon_pads为iomux_v3_cfg_t类型的常量数据, 然后通过imx_iomux_v3_setup_multiple_pads()函数设置IOMUX相关寄存器来设置需要的IO复用
a.MX6_PAD_GPIO_17__GPIO7_IO12是拼接起来的, 在source insight中搜索GPIO_17__GPIO_IO12, 可以在arch/arm/include/asm/arch-mx6/mx6dl_pins.h中搜到MX6_PAD_DECL(GPIO_17__GPIO7_IO12, 0x5E8, 0x0218, 5, 0x0000, 0, 0)
b.继续搜索MX6_PAD_DECL, 在arch/arm/include/asm/arch/mx6-pins.h有该宏定义:
#define MX6_PAD_DECL(name, pco, mc, mm, sio, si, pc) \
MX6_PAD_DECLARE(MX6_PAD_, name, pco, mc, mm, sio, si, pc)
c.继续搜索MX6_PAD_DECLARE, 同样在arch/arm/include/asm/arch/mx6-pins.h有该宏定义:
#define MX6_PAD_DECLARE(prefix, name, pco, mc, mm, sio, si, pc) \
prefix##name = IOMUX_PAD(pco, mc, mm, sio, si, pc)
d.继续搜索IOMUX_PAD, 在arm/include/asm/imx-common/iomux-v3.h中
参照上面内容(解析uboot下iomux相关宏的使用), 所以
MX6_PAD_GPIO_17__GPIO7_IO12其实就是:
MX6_PAD_GPIO_17__GPIO7_IO12 = IOMUX_PAD(0x5E8, 0x0218, 5, 0x0000, 0, 0)
其中, 0x05E8 ---> pad_ctrl_ofs
0x0218 ---> mux_ctrl_ofs
5 ---> mux_mode
0x0000 ---> sel_input_ofs
0 ---> sel_input
0 ---> pad_ctrl
查找imx6dl产品规格书, IOMUX章节
IOMUXC_SW_MUX_CTL_PAD_GPIO17寄存器可知mux_ctrl_ofs确实为0x218, 我们需要设置为GPIO模式, 即mux_mode为5, 与实际一样
IOMUXC_SW_PAD_CTL_PAD_GPIO17寄存器可知pad_ctrl_ofs确实为0x5E8, 我们不需要设置pad_ctrl
我们不需要设置sel_input_ofs, 所以设置它为0
然后通过分析imx_iomux_v3_multiple_pads()函数把刚刚的这些值写入到对应寄存器里, 这样就设置好我们想要的IO复用模式了

参考:http://www.xuebuyuan.com/774804.html

imx6中iomux IO复用的更多相关文章

  1. Linux中的IO复用接口简介(文件监视?)

    I/O复用是Linux中的I/O模型之一.所谓I/O复用,指的是进程预先告诉内核,使得内核一旦发现进程指定的一个或多个I/O条件就绪,就通知进程进行处理,从而不会在单个I/O上导致阻塞. 在Linux ...

  2. Libevent的IO复用技术和定时事件原理

    Libevent 是一个用C语言编写的.轻量级的开源高性能网络库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大:源代码相当精炼.易 ...

  3. 简单聊下IO复用

    没图,不分析API Java中IO API的发展:Socket -> SocketChannel -> AsynchronousSocketChannelServerSocket -> ...

  4. Linux网络编程-IO复用技术

    IO复用是Linux中的IO模型之一,IO复用就是进程预先告诉内核需要监视的IO条件,使得内核一旦发现进程指定的一个或多个IO条件就绪,就通过进程进程处理,从而不会在单个IO上阻塞了.Linux中,提 ...

  5. IO复用三种方式

    简介 IO复用技术,简单来说就是同时监听多个描述符.在没有用到IO复用以前,只能是一个线程或一个 线程去监听,服务端同时有多个连接的时候,需要创建多个线程或者进程.而且,并不是所有的连 接是一直在传输 ...

  6. IO复用_select函数

    select函数: #include <sys/select.h> #include <time.h> #include <sys/types.h> #includ ...

  7. IO复用(Reactor模式和Preactor模式)——用epoll来提高服务器并发能力

    上篇线程/进程并发服务器中提到,提高服务器性能在IO层需要关注两个地方,一个是文件描述符处理,一个是线程调度. IO复用是什么?IO即Input/Output,在网络编程中,文件描述符就是一种IO操作 ...

  8. 使用select io复用实现超时设置

    在linux的socket编程中,经常会遇到超时设置的问题,例如请求方如果在Ks内不发送数据则服务器要断开连接停止服务.这里我使用select的io复用实现超时5s设置,具体代码片段如下: fd_se ...

  9. select、poll、epoll三组IO复用

    int select(int nfds,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,struct timeval* timeout)//其中n ...

随机推荐

  1. Postman Json测试接口

    当传递Json数据时: 1.必须添加http头:content-type:application/json,否则会报错(后台取不到相对应的值) 注意:如果服务端只支持UTF-8,但程序未对提交数据进行 ...

  2. scope的范围

    (一)scope=“singleton” 知识点:无论获取多少个bean,得到的总是一样的地址,singleton范围下只会创建一个bean实例 1.Bean4.java package com.in ...

  3. Linux下使用xargs得到字符串作为参数进行输出、awk得到字符串作为参数进行输出

    背景: cat test.txt 实例: 1.xargs cat test.txt | xargs -i echo {} cat test.txt | xargs -I {} echo {} 大小写i ...

  4. Linux下Shell脚本替换换行符(转)

    说明:过滤换行符确实有点吭,不是那么好弄.处理文本时需要将换行符替换为空格,若使用sed命令会比较麻烦,而使用tr命令非常方便. 输入文本(country.txt) China America Fra ...

  5. oracle 百万行数据优化查询

      1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使 ...

  6. ztree jquery 树 控件

    插件地址:http://www.ztree.me 数据:[{"id":1,"pId":-1,"name":"根目录"}, ...

  7. mac下更新自带的PHP版本到5.6或7.0

    下载和安装PHP 5.6 打开终端并且运行如下命令: curl -s http://php-osx.liip.ch/install.sh | bash -s 5.6 然后,PHP 5.6的版本会被安装 ...

  8. 关于ComboGrid取值为非下拉框数据是,隐藏面板数据清空

    $('#areaGuid').combogrid({ panelWidth: 300, idField: 'guid', textField: 'name', mode: 'remote', meth ...

  9. JS中的Math.pow(a,b)方法

    定义和用法 pow() 方法可返回 x 的 y 次幂的值. 语法 Math.pow(x,y) 参数 描述 x 必需.底数.必须是数字. y 必需.幂数.必须是数字. 返回值 x 的 y 次幂. 说明 ...

  10. 十个Chatbot框架介绍

    十个Chatbot框架介绍 原创 2016年12月13日 16:01:23 4616 Chatbot列表 1.  Artificial Intelligence Markup Language    ...