IMX6Q-IOMUX-IO及串口复用配置

参考这篇文章所写
也可参考这篇文章
在这份文档中查找复用关系

文档名称

找到电路图


电路图

以上面的UART4_TXD(KEY_COL0为例)

在芯片手册第四章找到KEY_COL0


复用关系

找到相关寄存器


相关寄存器

这里我们找到了三个名字
SW_PAD_CTL_PAD_KEY_COL0(Pad的控制寄存器名称)
IOMUXC_SW_MUX_CTL_PAD_KEY_COL0(Mux的控制寄存器名称)
IOMUXC_UART4_UART_RX_DATA_SELECT_INPUT(Select Input的寄存器名称)

其实SW_PAD_CTL_PAD_KEY_COL0是有一个前缀的,全称是IOMUXC_SW_PAD_CTL_PAD_KEY_COL0
查找该名称可以找到相关寄存器的地址


地址

上面的地址是什么意思呢,请看下图

image.png

这里我们知道了,这组寄存器的地址起始值为20E_0000,所以我们的IOMUXC_SW_PAD_CTL_PAD_KEY_COL0相对偏移地址是05c8

继续查找,下图就是该寄存器每个位的功能,同时这里也提到了基址和相对地址。


pad控制寄存器

上面这个寄存器主要功能就是控制引脚的电气属性
再查找第二个寄存器


pad复用寄存器

0-2bit可以控制,复用成串口

上面这个寄存器的主要功能就是选择引脚的复用功能

再查找第三个寄存器


Selecting Pads Involved in Daisy Chain.

上图寄存器的功能就是选择到底是通过哪个引脚输入进来的信号

linux内核源码里


打开iomux-v3.h

复用函数的原型

参数的意义
_pad_ctrl_ofs pad控制寄存器的偏移地址
_mux_ctrl_ofs mux控制寄存器的偏移地址
_mux_mode mux的模式
_sel_input_ofs input寄存器的偏移地址
_sel_input input的类型

通过上面三个寄存器说明即可使用iomux函数去配置自己的引脚了
相关源码位置是在arch/arm/boot/dts/imx6dl-pinfunc.h中
/*

  • The pin function ID is a tuple of
  • <mux_reg conf_reg input_reg mux_mode input_val>
    */
    以上规则为:
    mux_reg:mux控制寄存器偏移地址
    conf_reg:pad控制寄存器偏移地址
    input_reg:select_input控制寄存器偏移地址
    mux_mode:mux模式
    input_val:select_input寄存器值


    配置代码

添加串口2和4


设备树修改1

设备树修改2
arch/arm/boot/dts/imx6dl-pinfunc.h
其中MX6QDL_PAD_EIM_D26__UART2_TX_DATA    0X1b0b1代表pad_ctrl寄存器的值
0x170  0x540  0x000 0x4 0x1  0x1b0b1
mux_ctrl_ofs  |  pad_ctrl_ofs |  sel_input_ofs |  mux_mode   | sel_input   |  pad_ctrl

修改完后编译设备树

source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa9hf-neon-poky-linux-gnueabi
export ARCH=arm
export CROSS_COMPILE=arm-poky-linux-gnueabi-
make imx6q-krt.dtb
sudo dd if=arch/arm/boot/dts/imx6q-krt.dtb of=/dev/sdb bs=512 seek=20480 conv=fsync
串口4测试成功

linux下查看串口4配置,默认波特率9600

stty -F /dev/ttymxc3 -a

linux下修改串口4配置为115200

stty -F /dev/ttymxc3 ispeed 115200 ospeed 115200 cs8

有客户反馈读GPIO始终为0

其原因是因为当复用为GPIO后,我们第一反应是给direction赋值为out,也就是说GPIO变为输出模式了。而系统读取的value是从PSR中读取的。而写入output值是写入到DR中的。所以就根本不是读取的输出值,一直为0也就正常了。看下图中的NOTE描述,正常的read操作是读取GPIO_PSR的值。


image.png

我们可以可以通过设置SION位让GPIO的输出输入进入回环(下图第一点说明),既SION的意义数既做输入又做输出,注意:此模式下GPIO复用功能是会被忽略的。


image.png

至于如何修改SION,去arch/arm/boot/dts/imx6ul-pinfunc.h中找到相关GPIO宏定义(注意,此时我使用的是IMX6ULL官方EVK),然后把mux_ctl寄存器的bit5改为1就行,其他随意(因为SION=1时会忽略复用模式的配置信息),这里就改成0X01即可,不过在这里修改是个偷懒的方法,并不漂亮,容易以后给自己留坑(忘记修改过这个宏定义,导致复用功能失效),建议计算出来值,在宏定义的引用处再进行置位操作。

define MX6UL_PAD_GPIO1_IO01__GPIO1_IO01 0x0060 0x02EC 0x0000 0x5 0x0

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 为什么IOMUX Soc芯片上有很多引脚,每个引脚对应特定的功能。例如控制电机需要控制电机的功能引脚1和引脚2,控...
    songwenbin阅读 10,057评论 2 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,948评论 18 139
  • 一,apk以进程的形式运行,进程的创建是由zygote。 参考文章《深入理解Dalvik虚拟机- Android应...
    Kevin_Junbaozi阅读 2,894评论 0 12
  • 1.在导航栏添加按钮 2.在导航栏一侧添加两个按钮且有空隙 3设置导航栏字体颜色/导航栏颜色/返回按钮颜色/背景图...
    喜剧收尾_XWX阅读 435评论 0 0
  • 闲谈品茗马不前, 烂柯山中又十年。 君胜一筹车骑秀, 美人帐下逞英雄。 ——周文 ...
    乐陵君阅读 194评论 0 1