前言
最近跟着韦东山老师的课程学习驱动基础知识,韦东山老师讲的非常好,大家想深入学习驱动知识的可以去看看韦东山老师的驱动教学视频。
IMX6ULL 的 GPIO 操作方法
GPIO 操作相关名词
IMX6ULL 的 GPIO 模块结构
参考芯片手册
有 5 组 GPIO(GPIO1~GPIO5),每组引脚最多有 32 个,但是可能实际上并有那么多。
- GPIO1 有 32 个引脚:GPIO1_IO0~GPIO1_IO31;
- GPIO2 有 22 个引脚:GPIO2_IO0~GPIO2_IO21;
- GPIO3 有 29 个引脚:GPIO3_IO0~GPIO3_IO28;
- GPIO4 有 29 个引脚:GPIO4_IO0~GPIO4_IO28;
- GPIO5 有 12 个引脚:GPIO5_IO0~GPIO5_IO11;
- GPIO 的控制涉及 4 大模块:CCM、IOMUXC、GPIO 模块本身,框图如图 4.2
1.2 CCM 用于设置是否向 GPIO 模块提供时钟
GPIOx 要用 CCM_CCGRy 寄存器中的 2 位来决定该组 GPIO 是否使能。
哪组 GPIO 用哪个 CCM_CCGR 寄存器来设置,请看上图红框部分。
CCM_CCGR 寄存器中某 2 位的取值含义如下:
- 00:该 GPIO 模块全程被关闭
- 01:该 GPIO 模块在 CPU run mode 情况下是使能的;在 WAIT 或 STOP 模式下,关闭
- 10:保留
- 11:该 GPIO 模块全程使能
GPIO2 时钟控制:
GPIO1、GPIO5 时钟控制:
GPIO3 时钟控制:
GPIO4 时钟控制:
IOMUXC:引脚的模式(Mode、功能)
对于某个/某组引脚,IOMUXC 中有 2 个寄存器用来设置它:
选择功能:
a) IOMUXC_SW_MUX_CTL_PAD_ :Mux pad xxx,选择 某个 pad 的功能
b) IOMUXC_SW_MUX_CTL_GRP_:Mux grp xxx,选 择某组引脚的功能 某个引脚,或是某组预设的引脚,都有 8 个可选的模式(alternate (ALT) MUX_MODE)。
比如:
设置上下拉电阻等参数:
a) IOMUXC_SW_PAD_CTL_PAD_:pad pad xxx,设置某个 pad 的参数
b) IOMUXC_SW_PAD_CTL_GRP_:pad grp xxx,设置某组引脚的参数
比如:
GPIO 模块内部
框图如下:
我们暂时只需要关心3个寄存器:
GPIOx_GDIR:设置引脚方向,每位对应一个引脚,1-output,0-input
GPIOx_DR:设置输出引脚的电平,每位对应一个引脚,1-高电平,0-低电平
GPIOx_PSR:读取引脚的电平,每位对应一个引脚,1-高电平,0-低电平
读 GPIO
翻译一下:
- 设置 CCM_CCGRx 寄存器中某位使能对应的 GPIO 模块 // 默认是使能的,上图省略了
- 设置 IOMUX 来选择引脚用于 GPIO
- 设置 GPIOx_GDIR 中某位为 0,把该引脚设置为输入功能
- 读 GPIOx_DR 或 GPIOx_PSR 得到某位的值(读 GPIOx_DR 返回的是 GPIOx_PSR 的值)
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯-2