1 目的

  • FPGA的三个管脚与3516的三个GPIO口相连

  • 通过FPGA控制3516的GPIO口从而控制编码码率

2 寻找FPGA与3516相连的管脚

2.1 确认FPGA的控制接口号

已知FPGA用于控制的三个GPIO接口如下所示

  1. SDI_GPIO_control[0] LOC = L24
  2. SDI_GPIO_control[1] LOC = K25
  3. SDI_GPIO_control[2] LOC = K26

根据硬件原理图《XC7K-HI3516A-CHV1.1.pdf》查找这三根线对应的3516的接口

3516配置GPIO--himm方法 - 图1

找到fpga上的3个管脚:L24,K25,K26,其分别对应于连线:EN3,EN2,EN1。

2.2 确认fpga对应的3516 GPIO口

根据硬件原理图如下:3516配置GPIO--himm方法 - 图2

找到EN3,EN2,EN1对应于3516管脚如下:

  1. SDI_GPIO_control[0] LOC = L24 --- EN3 --- GPIO9_3
  2. SDI_GPIO_control[1] LOC = K25 --- EN2 --- GPIO14_3
  3. SDI_GPIO_control[2] LOC = K26 --- EN1 --- GPIO14_2

3 GPIO配置步骤

参考《Hi3516A/Hi3516D 专业型HD IP Camera Soc用户指南.pdf》,查询GPIO接口的配置方法。

GPIO配置需要三步走:

  1. 首先配置GPIO复用寄存器,需要调整寄存器的值保证对应的接口复用为GPIO接口;
  2. 配置GPIO方向寄存器GPIO_DIR,控制GPIO口是输入或输出数据;
  3. 读取或者写入GPIO值,使用到GPIO数据寄存器。

    3.1 GPIO复用寄存器的配置

    以 GPIO9_3/UART1_RXD口为例,参考《Hi3516A/Hi3516D 专业型HD IP Camera Soc用户指南.pdf》。

找到复用寄存器概述,寻找对应于UART1_RXD口的寄存器。

image.png

从上表中找到 UART1_RXD口的寄存器 — muxctrl_reg31

image.png

muxctrl_reg31的物理地址 = 基地址(0x200F_0000)+ 偏移地址(0x07C)=0x200F_007c

根据下图可知将该寄存器设为 0 时复用为GPIO口。

image.png

由上面步骤已知复用寄存器物理地址复用设置方式

使用himm命令如下:

  1. #将GPIO9_3/UART1_RXD管脚复用为GPIO9_3
  2. himm 0x200F007C 0X00
  1. 至此完成复用寄存器配置。

3.2 GPIO方向寄存器配置

参考《Hi3516A/Hi3516D 专业型HD IP Camera Soc用户指南.pdf》13.6GPIO章节

寻找GPIO9方向寄存器的物理地址

首先找到基地址0x201D_0000
image.png
然后找到方向寄存器的偏移地址 0x400

image.png
计算GPIO9的方向寄存器地址 = 基地址0x201D_0000 + 偏移地址 0x400 =0x201D_0400.

接下来找到方向寄存器配置方法
image.png
GPIO9_3 (从9_0开始命名)对应于 第四位 bit[3]— 0b0000 0000,全部置零,设为输入。

使用himm命令为:

  1. // 控制GPIO9_3管脚为输入
  2. himm 0x201D0400 0x00

至此 GPIO9_3方向寄存器配置完毕。

3.3读取GPIO数据寄存器

在程序中使用**HI_S32 HI_MPI_SYS_GetReg(HI_U32 u32Addr, HI_U32 *pu32Value)**获取寄存器的值。获取管脚的值需要知道其物理地址,需要参考GPIO_DATA数据寄存器

image.png
image.png
例如:
对第4个bit操作,即偏移地址为0b000010_0000,0x020 — X_3
对第3个bit操作,即偏移地址为0b00_0001_0000,0x010 — X_2
对第2个bit操作,即偏移地址为0b00_0000
1000,0x008
对第1个bit操作,即偏移地址为0b00_0000_0100,0x004

GPIO9_3,9_2,9_1,9_0.则X_3是对第四个bit操作,偏移地址0x020
其物理地址 = 基地址(0x201D0400)+ 偏移地址(0x020)= 0x201D_0020

GPIOx_x 物理地址
GPIO9_3 0x201D_0020

之后使用HI_MPI_SYS_GetReg()函数获取值。

  1. //获取输入值
  2. ret = HI_MPI_SYS_GetReg(0x201D0020, &SDI_GPIO_control_0);

至此成功获取fpga的控制信号。