gpio子系统-通过io来控制gpio
先要通过io控制gpio,这种方法是直接控制寄存器的,先学习一些命令。
io命令
作用:在内核阶段读写寄存器
用法:
io -v -1|2 |4 -r|w [-| <len>] [-f <file>] <addr> [<value>]
V Verbose, asks for confirmation
-1]214 Sets memory access size in bytes (default byte)
-| <len> Length in bytes of area to access(defaults to one access, or whole file length)
-r | w 从内存读或写(默认读)(重点看这个)
-f <file> File to write on memory read, or to read on memary write
<addr> The memory address to access
<val> The value to write (implies -w)
例子:
ie 0x1000 读0x1000位置的值
io 0x1000 0x12 将0x12写入位置0x1000
io -2 -18 0x1000 Reads 8 words from 0x1000 io -r -f dmp -l 100 200 从地址200读取100字节到文件
io -w -fimg 0x10000 将整个文件写入内存
上面的就是io命令相关的命令,-r | w 重点关注这个 它的作用就是从内存读或写(默认读)(重点看这个)。我们以控制gpio的LED灯亮灭。下面,这是我的gpio引脚的位置原理图。
用io命令控制gpio的灯亮灭,有三个步骤,第一个设置gpio引脚的复用、设置gpio的输入输出方向、最后输入高低电平。
我们这种方法是直接控制寄存器,所以就要先找到寄存器的地址,地址一般都是基地址+偏移量,才能对它控制。打开我们的芯片手册,
第一步:把引脚的复用设置成gpio功能。 只要看到IOMUX都是和寄存器复用有关系的。
因为gpio有很多组gpio,我需要确定是那一组的gpio,从上什么原理图我们可以知道,我的是0的,PMU_GRF就是基地址的位置0xFDC20000,可以知道我们的gpio是第0组
根据原理图我们已确认在0C的上,但是这里面有两组,分为高位和地位,怎么选,我们要看它的显示说明了
这是低位的,看他的说明,16:31位是使能位,就是你要操作gpio,就先把gpio对应的位使能了,先使能了在能用,0:15就对应着c1, c2, c3, c4。
这是高位的,看他的说明,16:31位是使能位,就是你要操作gpio,就先把gpio对应的位使能了,先使能了在能用,0:15就对应着c5, c6, c7, c8。
因为有原理图可以知道,我的是gpio0_c7,所以选择高位的,对应的位是8:10,0就对应是gpio功能。前面说了,寄存器的位置是等于基地址+偏移量,所以这个寄存器地址是 0xFDC20000 + 0x0014 = 0xFDC20014。
所以,现在就可以命令去读取一下这个寄存器的值,看看现在是什么功能描述
读取出来值可以通过计算机换算一下,我们只需要关注12:14,这里是设置我们的引脚位置,,可以看到默认就是gpio功能描述
复用设置完了,接下来就是设置gpio的输入输出方向了。打开芯片手册,找到gpio的章节可以看到这两个位置有两个寄存器方向数据,还是老样子那个才是我们需要的,偏移地址是0x0008和0x00C,偏移量还需要确认偏移量,我们是使用gpio0的,所以知道gpio0的寄存器基地址
在手册的第一章,有一张表,描述各个功能的基地址的
在这里就可以找到GPIO0的基地址,0xFDD60000,
我们可以看到两个寄存器,都是只有底16位才是控制引脚的,高16位都是控制使能位的,
我们gpio一共有四组A,B,C,D,每组控制8个应引脚,所以两组加起来刚刚好是16个引脚,所以低位的是控制A和B组,高位控制是C和D组,我的是C7选高位的,高位的偏移量是0x000C,所以寄存器地址等于偏移量 + 偏移量 = 0xFDD60000 + 0x000C = FDD6000C。
所以,现在就可以命令去读取一下这个寄存器的值,看看现在是是输出还是输入
用计算机换算 ,只需要关注23脚,因为我的是gpio0_c7,计算规则看以前的博客,我这里23脚是,但是我们这里只有0:16,怎么办,前面说了,高位管C,D组,意思也是从0开始
可以看到每一组只有8个脚,所以我的是c7,意思就是第七位,这里看到第七位是0,0是输入,所以不对,要改,我们还要改使能位。
把对应的位值置1, 就变成806080,我们要把这个值写回去
最后面是输出输入高电平,看到数据寄存器有两个,选择方法一样看说说明,所以我们操作高位的,高位的偏移量是0x0004,基地址是0xFDD60000 = 寄存器地址 = 0xFDD60004
读取出来看看,再用计算机换算
引脚的位置和之前的计算一样。
但是有点注意,我的是低电平触发亮灯,是什么电平触发根据情况而定
亮灯