请选择 进入手机版 | 继续访问电脑版
查看: 2493|回复: 0

[分享] 关于IMX6Q-IOMUX-IO及串口复用配置

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3296

    主题

    6541

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    31904
    最后登录
    2024-3-28
    发表于 2019-12-25 14:48:51 | 显示全部楼层 |阅读模式
    IMX6Q-IOMUX-IO及串口复用配置
    在这份文档中查找复用关系
    1.png

    找到电路图
    2.png

    以上面的UART4_TXD(KEY_COL0为例)


    在芯片手册第四章找到KEY_COL0

    3.png

    复用关系

    找到相关寄存器
    4.png

    相关寄存器


    这里我们找到了三个名字
    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
    查找该名称可以找到相关寄存器的地址
    5.png


    地址

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

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


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

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


    8.png

    9.png

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



    上面这个寄存器的主要功能就是选择引脚的复用功能
    再查找第三个寄存器
    10.png





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

    11.png

    12.png

    打开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寄存器值
    13.png

    配置代码
    添加串口2和4
    14.png



    设备树修改1
    15.png

    设备树修改2
    16.png

    arch/arm/boot/dts/imx6dl-pinfunc.h
    17.png

    修改完后编译设备树
    18.png

    串口4测试成功



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

    19.png

    linux下修改串口4配置为115200
    20.png

    有客户反馈读GPIO始终为0

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

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








    作者:Lazy_Caaat





















    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-3-29 00:24 , Processed in 0.117951 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表