OK1043A-C开发板上市已有一段时间,大家对LS1043A有了初步体验,小编今天就分享一个最常用到的技能: GPIO的复用 。
一、LS1043A GPIO 概况
GPIO1[13]只能做输出
GPIO单元包括以下功能:
· 支持32个通用输入/输出端口
· 复位期间所有信号均为高阻态
· 所有端口的开漏功能
· 所有端口都可以选择在更改状态时生成中断
· 端口可以与其他功能信号复用
二、 GPIO 寄存器介绍
GPIO内存映射
GPIO1 base address:230_0000h
GPIO2 base address:231_0000h
GPIO3 base address:232_0000h
GPIO4 base address:233_0000h
1.GPIO direction register (GPDIR)
GPIO方向寄存器(GPDIR)定义各个引脚的方向。方向,指示引脚是用作输入还是输出。
00000000000000000000000000000000b - 相应的引脚是输入。
00000000000000000000000000000001b-相应的引脚是输出。
2. GPIO open drain register (GPODR)
GPIO开漏寄存器(GPODR)定义了各个端口驱动其输出的方式。开漏配置,指示信号是作为输出主动驱动还是开漏驱动器。该寄存器对GPDIR中编程为输入的信号没有影响。
00000000000000000000000000000000b - 相应的信号作为输出被主动驱动。
00000000000000000000000000000001b-相应的信号是漏极开路驱动器。作为输出,信号被驱动为低电平有效,否则它不被驱动(高阻抗)。
3. GPIO data register (GPDAT)
GPIO数据寄存器(GPDAT)承载各个端口的数据输入/输出。数据,写入该寄存器会锁存在外部引脚上显示的数据,前提是相应的GPDIR位配置为输出。
当GPDIR处于输出模式时,GPDAT读操作会在返回引脚处的数据。
当GPDIR处于输入模式时,GPDAT读操作返回端口的状态。
4. GPIO interrupt event register (GPIER)
GPIO中断事件寄存器(GPIER)携带导致中断的事件的信息。GPIER中的每个位对应一个中断源。通过写入来清除GPIER位。但是,写零无效。中断事件,指示相应的GPIO信号是否发生中断事件。
00000000000000000000000000000000b-相应的GPIO信号上没有发生中断事件。
00000000000000000000000000000001b-相应的GPIO信号发生中断事件。
5. GPIO interrupt mask register(GPIMR)
GPIO中断屏蔽寄存器(GPIMR)定义各个端口的中断屏蔽。发生屏蔽中断请求时,无论GPIMR状态如何,都会设置相应的GPIER位。当发生一个或多个非屏蔽中断事件时,GPIO模块向中断控制器发出中断。中断掩码,指示是否屏蔽或未屏蔽相应GPIO信号的中断事件。
00000000000000000000000000000000b - 屏蔽(禁用)输入中断信号。
0000000000000000000000000000000001b - 未屏蔽(启用)输入中断信号。
6. GPIO interrupt control register(GPICR)
GPlO中断控制寄存器(GPICR)确定相应的端口线是否在从高到低的变化或信号状态的任何变化时断言中断请求。
边沿检测模式,相应的端口线根据以下内容断言中断请求:
00000000000000000000000000000000b-对端口状态的任何更改都会生成中断请求。
00000000000000000000000000000001b-端口上由高到低的更改生成中断请求。
三、GPIO 在 LS1043A 的配置
1. rcw配置阶段
LS1043A的引脚配置信息文件路径:
OK10xx-linux-fs/flexbuildpackages/firmware/rcw/ls1043aqds/ls1043a.rcwi
LS1043A引脚修改生效路径:
OK10xx-linux-fs/flexbuild/packages/firmware/rcw/ls1043ardb/RR_FQPP_1455/rcw_1600_qspiboot.rcw
对应使用方法参考CPU手册3.4Signal multiplexing details 章节
以SPI,eSDHC, USB and GPIO2 signal multiplexing复用为GPIO2[]为例
通过此图可知,当SPI_EXT为010时引脚被配置为GPIO
从引脚生效路径来看SPI_EXT原始配置为SPI_EXT=1 引脚生效路径中“=”后面的值为十六进制,在修改SPI_EXT的值的时候需要将二进制转换为十六进制即SPI_EXT=2
root@localhost:~# ls /sys/class/GPIO/
export GPIOchip384/ GPIOchip416/ GPIOchip448/ GPIOchip480/unexport
输入上述命令出现四组GPIOchip,一般对应关系为
GPIOchip480 对应GPIO1[]
GPIOchip448 对应GPIO2[]
GPIOchip416 对应GPIO3[]
GPIOchip384 对应GPIO4[]
若要验证单个引脚则在此基础上做加法即可,即GPIO2[x]=GPIOchip448+x
验证工具为memtool文件系统中没有此工具需要安装:apt-getinstall memtool
root@localhost:~# echo 450 >/sys/class/GPIO/export
root@localhost:~# echo out >/sys/class/GPIO/GPIO450/direction
root@localhost:~# memtool md0x2310000
root@localhost:~# echo in > /sys/class/GPIO/GPIO450/direction
root@localhost:~# memtool md0x2310000
由上两个图看出当GPIO输出方向发生改变时,寄存器的值也发生了变化。
00000020 -------> 0000 0000 0000 0000 0000 0000 0010 0000 此为GPIO2 base address寄存器的32位值,读取顺序为 24,25,26,27 28,29,30,31 16,17,18,19 20,21,22,23 8,9,10,11,12 13,14,15,16 0,1,2,3 4,5,6,7
可见第二位已经置为1即GPIO2[2]更改生效。
注:此方法只可适用于qspi启动。