Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯-1

简介: Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯

前言

最近跟着韦东山老师的课程学习驱动基础知识,韦东山老师讲的非常好,大家想深入学习驱动知识的可以去看看韦东山老师的驱动教学视频。

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

fb2c5c20ff885d0da2dbcc754e9bf3d0_5d11dae5222747d591c4e209ba7967da.png

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 时钟控制:


798e4f0c42068e71635834f0397541cf_d5a72a98077d46a4a0572b200856dc3f.png


GPIO1、GPIO5 时钟控制:

dc6619e4ac55e96aebccebd1b77ea696_b7e8a408e19c470196e0ffba4edc580e.png

GPIO3 时钟控制:

560d784ec1b03f9eb7741d4a6b00b0b3_7c2685ca91bc44e295857da8c697c193.png



GPIO4 时钟控制:


ecb069f2c06e404b03dd44ec8547fa94_485de67d25d742209b2ab01b57ef92ab.png


IOMUXC:引脚的模式(Mode、功能)

b015525a416dcb18579b26c3f67270f2_bda5c7453c314bb08689f14a2d28e797.png

对于某个/某组引脚,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)。


6c99973fca30ebbdad708b8fe5a269bd_886b5f77824541438b3cd9d029bfcfab.png


比如:


193c2fd4da9976c0a7f6075a318a4d52_0692c881d97b40fab589cb36729d7028.png


设置上下拉电阻等参数:


a) IOMUXC_SW_PAD_CTL_PAD_:pad pad xxx,设置某个 pad 的参数


b) IOMUXC_SW_PAD_CTL_GRP_:pad grp xxx,设置某组引脚的参数

比如:


GPIO 模块内部

框图如下:


567c7c7e1c0255278fa34c524c072542_2cd6038f06094756a45686becfb92d61.png


我们暂时只需要关心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

https://developer.aliyun.com/article/1507976

相关文章
|
23天前
|
网络协议 Linux 网络安全
入职必会-开发环境搭建39-Linux常用操作-Linux防火墙操作
在CentOS 7中,新引入了firewalld服务(防火墙),取代了CentOS 6之前的iptables服务(防火墙)。
入职必会-开发环境搭建39-Linux常用操作-Linux防火墙操作
|
4天前
|
存储 Ubuntu Linux
Linux基础入门
Linux基础入门
11 1
|
30天前
|
存储 JSON Linux
|
1月前
|
存储 运维 Linux
Linux磁盘精准缩容:操作详解与技巧
在Linux系统管理中,有效的磁盘空间优化对于维护系统性能至关重要。本文将深入探讨如何在Linux环境下安全地进行磁盘缩容,帮助你合理调整存储资源,确保系统高效运行。跟随本篇的步骤,一起优化你的Linux系统磁盘空间!
Linux磁盘精准缩容:操作详解与技巧
|
1月前
|
Oracle 关系型数据库 Linux
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
通过这一连串的步骤,可以专业且有效地在Linux下为Qt编译Oracle驱动库 `libqsqloci.so`,使得Qt应用能够通过OCI与Oracle数据库进行交互。这些步骤适用于具备一定Linux和Qt经验的开发者,并且能够为需要使用Qt开发数据库应用的专业人士提供指导。
49 1
讲解linux下的Qt如何编译oracle的驱动库libqsqloci.so
|
4天前
|
Ubuntu Linux Shell
Linux 终端入门
Linux 终端入门
7 0
|
4天前
|
安全 网络协议 Linux
保护你的 Linux VPS:入门指南
保护你的 Linux VPS:入门指南
9 0
|
1月前
|
缓存 网络协议 算法
【Linux系统编程】深入剖析:四大IO模型机制与应用(阻塞、非阻塞、多路复用、信号驱动IO 全解读)
在Linux环境下,主要存在四种IO模型,它们分别是阻塞IO(Blocking IO)、非阻塞IO(Non-blocking IO)、IO多路复用(I/O Multiplexing)和异步IO(Asynchronous IO)。下面我将逐一介绍这些模型的定义:
|
2月前
|
Linux 网络安全 开发工具
Linux 管理远程会话 screen:掌握终端的多任务操作
`Linux screen` 命令让多任务管理变得更简单,尤其在SSH连接远程服务器时。创建新会话如`screen -S backup`,查看会话`screen -ls`,退出`exit`。高级功能包括直接在会话中运行命令,如`screen vim memo.txt`,会话共享以协同工作,以及通过`screen -r`或`-D -r`重新连接或强制恢复断开的会话。提高效率,确保任务不间断运行。
27 1
|
1月前
|
Linux
Linux部署03---ls命令入门 ls直接用命令是列出目录下的内容,ls命令等同于双击打开文件夹,FinalShell默认的是在home目录下,工作目录
Linux部署03---ls命令入门 ls直接用命令是列出目录下的内容,ls命令等同于双击打开文件夹,FinalShell默认的是在home目录下,工作目录