ls1012有两组GPIO,分别为:
模块名称 模块基地址 支持的引脚 端口数量 GPIO1 0x230_0000 0:31 32 GPIO2 0x231_0000 0:7,9:17 17
GPIO功能通常与其他功能复用。在此上下文中“支持”表示任何引脚多路复用配置都选择了GPIO功能。有关信号多路复用的详细信息,请参阅信号章节。
在32个GPIO1和17个GPIO2引脚中,某些实现可能会将特定引脚限制为仅输入,仅输出或保留。
·仅输出引脚:GPIO1 [0],GPlO1 [4],GPIO1 [5],GPIO1 [11],GPIO1 [12],GPIO1 [20],GPIO1 [23],GPIO1 [29],GPIO1 [31], GPIO2 [0]和GPIO2 [15] ·仅输入引脚:GPIO2 [17] ·保留引脚:GPIO2 [8]
如果将引脚配置为输入,则可以选择在检测到更改时生成中断。如果引脚配置为输出,则可以将其单独配置为漏极开路或完全有效输出。
GPIO单元包括以下功能: ·支持32个通用输入/输出端口 ·复位期间所有信号均为高阻态 ·所有端口的开漏功能 ·所有端口都可以选择在更改状态时生成中断 ·端口可以与其他功能信号复用
GPIO1 base address: 230_0000h GPIO2 base address: 231_0000h
偏移地址 寄存器名称 位宽 权限 复位默认值 0h GPIO direction register (GPDIR) 32 RW 0000_0000h 4h GPIO open drain register (GPODR) 32 RW 0000_0000h 8h GPIO data register (GPDAT) 32 RW 0000_0000h Ch GPIO interrupt event register (GPIER) 32 RW 查看相关描述 10h GPIO interrupt mask register (GPIMR) 32 RW 0000_0000h 14h GPIO interrupt control register (GPICR) 32 RW 0000_0000h
———————————————————————————————————————————————————————————————————————— GPIO direction register (GPDIR) GPIO方向寄存器(GPDIR)定义各个引脚的方向
方向,指示引脚是用作输入还是输出。 00000000000000000000000000000000b - 相应的引脚是输入。 00000000000000000000000000000001b-相应的引脚是输出。 ———————————————————————————————————————————————————————————————————————— GPIO open drain register (GPODR) GPIO开漏寄存器(GPODR)定义了各个端口驱动其输出的方式。
开漏配置,指示信号是作为输出主动驱动还是开漏驱动器。该寄存器对GPDIR中编程为输入的信号没有影响。 00000000000000000000000000000000b - 相应的信号作为输出被主动驱动。 00000000000000000000000000000001b-相应的信号是漏极开路驱动器。作为输出,信号被驱动为低电平有效,否则它不被驱动(高阻抗)。 ———————————————————————————————————————————————————————————————————————— GPIO data register (GPDAT) GPIO数据寄存器(GPDAT)承载各个端口的数据输入/输出。
数据。写入该寄存器会锁存在外部引脚上显示的数据,前提是相应的GPDIR位配置为输出。 当GPDIR处于输出模式时,GPDAT读操作会在返回引脚处的数据。 当GPDIR处于输入模式时,GPDAT读操作返回端口的状态。 ————————————————————————————————————————————————————————————————————————— GPIO interrupt event register (GPIER) GPIO中断事件寄存器(GPIER)携带导致中断的事件的信息。
GPIER中的每个位对应一个中断源。通过写入来清除GPIER位。但是,写零无效。
中断事件。指示相应的GPIO信号是否发生中断事件。 00000000000000000000000000000000b-相应的GPIO信号上没有发生中断事件。 00000000000000000000000000000001b-相应的GPIO信号发生中断事件。 ————————————————————————————————————————————————————————————————————————— GPIO interrupt mask register (GPIMR) GP10中断屏蔽寄存器(GPIMR)定义各个端口的中断屏蔽。
发生屏蔽中断请求时,无论GPIMR状态如何,都会设置相应的GPIER位。当发生一个或多个非屏蔽中断事件时,GPIO模块向中断控制器发出中断。
中断掩码。指示是否屏蔽或未屏蔽相应GPIO信号的中断事件。 00000000000000000000000000000000b - 屏蔽(禁用)输入中断信号。 0000000000000000000000000000000001b - 未屏蔽(启用)输入中断信号。 ————————————————————————————————————————————————————————————————————————— GPIO interrupt control register (GPICR) GPlO中断控制寄存器(GPICR)确定相应的端口线是否在从高到低的变化或信号状态的任何变化时断言中断请求。
边沿检测模式。相应的端口线根据以下内容断言中断请求: 00000000000000000000000000000000b-对端口状态的任何更改都会生成中断请求。 00000000000000000000000000000001b-端口上由高到低的更改生成中断请求。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Ls1012的引脚配置信息路径:OK10xx-linux-fs/flexbuild/packages/firmware/rcw/ls1012ardb/ls1012a.rcwi,对应使用方法为CPU手册的《3.4 Signal multiplexing details》章节。 Ls1012RCW文件路径:OK10xx-linux-fs/flexbuild/packages/firmware/rcw/ls1012ardb/R_SPNH_3508/rcw_1000_default.rcw 将JTAG的引脚TDO、TCK复用为GPIO功能为例: 可见需要将RCW[UART2_BASE_DATA]置0。
经过查找packages/firmware/rcw/ls1012ardb/ls1012a.rcwi
UART2_BASE_DATA[378]
修改文件packages/firmware/rcw/ls1012ardb/R_SPNH_3508/rcw_1000_default.rcw
将语句 UART2_BASE_DATA=1 改为 UART2_BASE_DATA=0
编译替换firmware_ls1012ardb_uboot_qspiboot.img,重新烧写。
手册中有说明,注意:This field is ignored if TJTAG_EN=1, in which case these pins are used as JTAG.需要在硬件上拉低,使TJTAG_EN=0 ,JTAG才能复用为GPIO。
验证测试: root@localhost:~# ls /sys/class/gpio export gpiochip448 gpiochip480 unexport root@localhost:~# echo 486 > /sys/class/gpio/export root@localhost:~# echo 488 > /sys/class/gpio/export root@localhost:~# echo out > /sys/class/gpio/gpio486/direction root@localhost:~# echo out > /sys/class/gpio/gpio488/direction root@localhost:~# ls /sys/class/gpio export gpio486 gpio488 gpiochip448 gpiochip480 unexport root@localhost:~# echo 1 > /sys/class/gpio/gpio486/value root@localhost:~# cat /sys/class/gpio/gpio486/value 1 root@localhost:~# echo 0 > /sys/class/gpio/gpio486/value root@localhost:~# cat /sys/class/gpio/gpio486/value 0 root@localhost:~# echo 1 > /sys/class/gpio/gpio488/value root@localhost:~# cat /sys/class/gpio/gpio488/value 1 root@localhost:~# echo 0 > /sys/class/gpio/gpio488/value root@localhost:~# cat /sys/class/gpio/gpio488/value 0
|