Linux 驱动开发基础知识——认识LED驱动程序 (二)

简介: Linux 驱动开发基础知识——认识LED驱动程序 (二)

一、硬件知识_LED 原理图

我们怎样去点亮一个 LED 呢?分为三步:

       第1步 看原理图,确定控制 LED 的引脚;

       第2步 看主芯片的芯片手册,确定如何设置控制这个引脚;

       第3步 写程序;

原理图

LED 样子有很多种,像插脚的,贴片的。

       它们长得完全不一样,因此我们在原理图中将它抽象出来。

       点亮 LED 需要通电源,同时为了保护 LED,加个电阻减小电流。

       控制 LED 灯的亮灭,可以手动开关 LED,但在电子系统中,不可能让人来控制开关,通过编程,利用芯片的引脚去控制开关。

LED 的驱动方式,常见的有四种。

(1)使用引脚输出 3.3V 点亮 LED,输出 0V 熄灭 LED

(2)使用引脚拉低到 0V 点亮 LED,输出 3.3V 熄灭 LED

(3)有的芯片为了省电等原因,其引脚驱动能力不足,这时可以使用三极管驱动

(4)使用引脚输出 1.2V 点亮 LED,输出 0V 熄灭 LED。 使用引脚输出 0V 点亮 LED,输出 1.2V 熄灭 LED。

       由此,主芯片引脚输出高电平/低电平,即可改变 LED 状态,而无需关注 GPIO 引脚输出的是 3.3V 还是 1.2V。所以简称输出 1 或 0:

逻辑 1-->高电平          逻辑 0-->低电平

二、普适的 GPIO 引脚操作方法

GPIO: General-purpose input/output,通用的输入输出口

1.GPIO 模块一般结构

有多组 GPIO,每组有多个 GPIO

使能:电源/时钟

模式(Mode):引脚可用于 GPIO 或其他功能

方向:引脚 Mode 设置为 GPIO 时,可以继续设置它是输出引脚,还是输入引脚

数值:

       对于输出引脚,可以设置寄存器让它输出高、低电平

       对于输入引脚,可以读取寄存器得到引脚的当前电平

2.GPIO 寄存器操作

芯片手册一般有相关章节,用来介绍:power/clock

       可以设置对应寄存器使能某个 GPIO 模块(Module)

       有些芯片的 GPIO 是没有使能开关的,即它总是使能

一个引脚可以用于 GPIO、串口、USB 或其他功能

        有对应的寄存器来选择引脚的功能

对于已经设置为 GPIO 功能的引脚,有方向寄存器用来设置它的方向:输出、 输入

对于已经设置为 GPIO 功能的引脚,有数据寄存器用来写、读引脚电平状态 GPIO 寄存器的 2

操作方法:原则:不能影响到其他位

更高效的办法,对于有些处理器有设置和清除寄存器

(1)直接读写:读出、修改对应位、写入

       要设置 bit n:

val = data_reg;
val = val | (1<<n);
data_reg = val;

       要清除 bit n:

val = data_reg;
val = val & ~(1<<n);
data_reg = val;

(2)set-and-clear protocol:

set_reg, clr_reg, data_reg 三个寄存器对应的是同一个物理寄存器

             a) 要设置 bit n:set_reg = (1<

             b) 要清除 bit n:   clr_reg = (1<

三、具体单板的 GPIO 操作方法

1.IMX6ULL 的 GPIO 操作方法

2. 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、模块本身

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

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

对于某个/某组引脚,IOMUXC 中有 2 个寄存器用来设置它:

1).选择功能:

       a) IOMUXC_SW_MUX_CTL_PAD_ <PADNAME>:Mux pad xxx,选择某个 pad 的功能

       b) IOMUXC_SW_MUX_CTL_GRP_<GROUP NAME>:Mux grp xxx,选择某组引脚的功能

       某个引脚,或是某组预设的引脚,都有 8 个可选的模式(alternate (ALT) MUX_MODE)

2)设置上下拉电阻等参数

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

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

3.GPIO 模块内部

我们暂时只需要关心 3 个寄存器:

(1)GPIOx_GDIR:

       设置引脚方向,每位对应一个引脚,1-output,0-input

(2)GPIOx_DR:

       设置输出引脚的电平,每位对应一个引脚,1-高电平,0-低电平

(3) GPIOx_PSR:

       读取引脚的电平,每位对应一个引脚,1-高电平,0-低电平

4.读 GPIO

(1)设置 CCM_CCGRx 寄存器中某位使能对应的 GPIO 模块 // 默认是使能的,

(2)IOMUX 来选择引脚用于 GPIO

(3)设置 GPIOx_GDIR 中某位为 0,把该引脚设置为输入功能

(4)读 GPIOx_DR 或 GPIOx_PSR 得到某位的值(读 GPIOx_DR 返回的是 GPIOx_PSR 的值)

6.写 GPIO

(1)设置 CCM_CCGRx 寄存器中某位使能对应的 GPIO 模块 // 默认是使能的

(2)设置 IOMUX 来选择引脚用于 GPIO

(3)设置 GPIOx_GDIR 中某位为 1,把该引脚设置为输出功能

(4)写 GPIOx_DR 某位的值

       需要注意的是,你可以设置该引脚的 loopback 功能,这样就可以从 GPIOx_PSR 中读到引脚的有实电平;你从 GPIOx_DR 中读回的只是上次设置的 值,它并不能反应引脚的真实电平,比如可能因为硬件故障导致该引脚跟地短路 了,你通过设置 GPIOx_DR 让它输出高电平并不会起效果。

三、基于IMX6ULL的LED寄存器操作

1.先看原理图原理图

       打开原理图,搜“LED”,如下图所示:

       用到了GPIO5中的第3个引脚 ,要想点亮LED,我们需要将GPIO输出低电平

2.再看芯片手册:使能GPIO5

       GPIO5_3属于GPIO5里的第3个引脚。

       怎么使能GPIO5对于IMX6ULLGPIO5默认使能,无需设置。

       CCM_CCGR1地址:0x020C4000 + 0x6C

3.再看芯片手册:设置GPIO5_3为GPIO

IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3地址:0x02290000 + 0x14

4.再看芯片手册:设置GPIO5_3为输出

GPIO5_GDIR地址:0x020AC004

四、框架图


目录
相关文章
|
5天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
1月前
|
Linux Shell C语言
【Shell 命令集合 设备管理 】Linux控制Linux系统的键盘LED setleds命令 使用指南
【Shell 命令集合 设备管理 】Linux控制Linux系统的键盘LED setleds命令 使用指南
38 0
|
4天前
|
Linux Shell Android开发
自动化脚本之GPIO/LED相关适用于Android/Linux
自动化脚本之GPIO/LED相关适用于Android/Linux
13 0
|
22天前
|
Linux API C语言
FFmpeg开发笔记(一)搭建Linux系统的开发环境
本文指导初学者如何在Linux上搭建FFmpeg开发环境。首先,由于FFmpeg依赖第三方库,可以免去编译源码的复杂过程,直接安装预编译的FFmpeg动态库。推荐网站<https://github.com/BtbN/FFmpeg-Builds/releases>提供适用于不同系统的FFmpeg包。但在安装前,需确保系统有不低于2.22版本的glibc库。详细步骤包括下载glibc-2.23源码,配置、编译和安装。接着,下载Linux版FFmpeg安装包,解压至/usr/local/ffmpeg,并设置环境变量。最后编写和编译简单的C或C++测试程序验证FFmpeg环境是否正确配置。
38 8
FFmpeg开发笔记(一)搭建Linux系统的开发环境
|
1月前
|
存储 缓存 Linux
探秘Linux块设备驱动程序:成为内核开发大师的第一步
探秘Linux块设备驱动程序:成为内核开发大师的第一步
93 0
|
1月前
|
Linux 编译器 测试技术
探索Linux设备树:硬件描述与驱动程序的桥梁
探索Linux设备树:硬件描述与驱动程序的桥梁
68 0
|
1月前
|
存储 缓存 安全
掌握Linux字符设备驱动程序的核心要点
掌握Linux字符设备驱动程序的核心要点
59 0
|
1月前
|
Linux
linux驱动开发-点亮第一个led灯
linux驱动开发-点亮第一个led灯
23 0
|
Linux
手把手教你写第一个Linux驱动程序
说到写第一个linux内核驱动程序,再简单不过了。以前也写过,这次将做一个图形化的整理。 我这里以我的开发环境tiny4412为主,我将在这上面写第一个驱动程序。 首先,我在driver/目录下创建yangyx目录, 在目录下新建一个hello.c和一个Makefile hello.c内容如下: hello.c包含的头文件就类似咱们写标准C一样的头文件。
1204 0
|
6天前
|
机器学习/深度学习 缓存 监控
linux查看CPU、内存、网络、磁盘IO命令
`Linux`系统中,使用`top`命令查看CPU状态,要查看CPU详细信息,可利用`cat /proc/cpuinfo`相关命令。`free`命令用于查看内存使用情况。网络相关命令包括`ifconfig`(查看网卡状态)、`ifdown/ifup`(禁用/启用网卡)、`netstat`(列出网络连接,如`-tuln`组合)以及`nslookup`、`ping`、`telnet`、`traceroute`等。磁盘IO方面,`iostat`(如`-k -p ALL`)显示磁盘IO统计,`iotop`(如`-o -d 1`)则用于查看磁盘IO瓶颈。