1. 40Pin接口引脚对照图

LubanCat-Hi3403板卡引出了通用40Pin排针接口,用于连接外部模块

提示

LubanCat-Hi3403 40Pin排针接口满足HiSpark社区《海思开放硬件规范 V1.00.pdf》中的40Pin接口要求。

提示

LubanCat-Hi3403 40Pin排针接口与树莓派40Pin接口功能大部分兼容。注意部分电源引脚电平有差异,所有IO口仅支持1.8V电平。

../../_images/Hi-40Pin.png

上图是结合海思开放硬件要求和Hi3403实际能力的40Pin引脚基础功能的定义图,此引脚设计旨在增加生态内已有的40Pin模块复用性。

实现的基础功能如下:

  • UART接口2组。

  • I2C接口2组。

  • SPI接口1组。

  • SDIO接口1组。

图中x、y表示序号,序号相同表示为同一功能的1组引脚。

错误

Hi3403的40Pin引脚都是1.8V电平,且此引脚直连主芯片,在使用时应特别注意,接入错误的电平会导致主芯片损坏。

1.1. LubanCat-Hi3403引脚复用表

提示

网页浏览时,将鼠标放到图片上,点击鼠标右键,然后点击新建标签页打开图像即可查看超清原图

40Pin引脚基础功能定义是为了增加模块的复用性,即使是不同型号,不同厂商的板卡,只要符合规范就能直接使用。

除了符合40Pin引脚基础功能的定义外,Hi3403的大部分引脚都能配置复用为更多功能,具体如下图所示。

../../_images/hi3403-40Pin.png
  • 引脚号:40Pin接口中的引脚序号

  • 引脚名称:硬件原理图中的引脚名称

  • 复用寄存器:引脚功能配置寄存器的地址

  • 复用功能:设置引脚功能配置寄存器的功能选择位为对应的值,就可以配置引脚的复用功能

如果不考虑复用关系,40Pin引脚能够实现的功能如下:

  • UART接口5组,分别是UART1、UART2、UART3、UART4、UART5,其中UART1、UART2、UART5支持流控,UART3有两组引脚可选。

  • I2C接口2组,分别是I2C4、I2C5。

  • SPI接口2组,分别是SPI1、SPI2。每个SPI接口都各有两组引脚可选,SPI1的其中1组有两个片选引脚。

  • SDIO接口1组,为SDIO1。

  • PWM接口9组,其中PWM1_OUT1_2_P与PWM1_OUT10_0_P为同一引脚,PWM1_OUT1_2_N与PWM1_OUT11_0_P为同一引脚。

Hi3403除电源外的大部分引脚都可以用配置引脚复用,以上只展示了40Pin引脚中的复用关系,完整信息请查看官方资料中的 《21AP10_PINOUT_CN.xlsx》。

1.2. 引脚功能配置寄存器说明

打开《21AP10_PINOUT_CN.xlsx》的 3.管脚控制寄存器 工作表

../../_images/pinout.png

以其中一个引脚为例,各项含义如下

  • Register Name: 寄存器名称。此寄存器名称为iocfg_reg50。

  • Pin Number: 引脚在芯片物理封装中的位置。AB为行号,4为列号。具体内容查看《21AP10_PINOUT_CN.xlsx》的 5.管脚分布图

  • Function: 寄存器的功能描述。此寄存器为IO配置寄存器。

  • Address:寄存器的地址。此寄存器地址为0x102F0070。

  • Default Value:芯片复位后,寄存器的默认值。此寄存器的默认值为0x1200

  • Field Bits/Field Description: 寄存器各位功能的说明。

    • 3:0 功能选择:配置引脚的复用功能

    • 7:4 管脚驱动能力选择:档位越搞,驱动电流越大。

    • 8 管脚上拉控制:打开或关闭芯片内部上拉电阻。

    • 9 管脚下拉控制:打开或关闭芯片内部下拉电阻。

    • 11 管脚施密特输入控制:打开或关闭引脚的施密特输入触发器。

    • 10/12… 保留

    • 31:15 保留

如果要设置引脚为UART2_RXD,需要向0x102f0070寄存器写入0x1201。

1.3. 引脚功能配置寄存器修改

提示

在修改引脚功能配置寄存器时要注意,对于同一个寄存器地址,后进行的操作会覆盖之前修改的值,如果使用多种方式修改了同一引脚的复用配置,则应该重点关注他们的覆盖关系。

想要修改引脚功能配置寄存器的值,有以下三种方法,以生效时间为顺序进行说明。

1.3.1. U-boot表格

U-boot表格是一个xlsm格式的Excel表格。我们可以使用WPS或者Office中的表格工具进行修改。

U-boot表格中保存了寄存器的地址和值,用于在u-boot启动阶段修改对应寄存器,来对芯片进行初始化配置。

../../_images/uboot-xlsm.png

文件中的 pinout 工作表记录了引脚功能配置

U-boot表格保存在SDK的osdrv/tools/pc/uboot_tools目录下

除了需要引脚配置在U-Boot和内核起始阶段生效,不建议在U-Boot表格中配置引脚复用。 因为在U-boot和内核的部分驱动中,使用了直接操作寄存器的方式对引脚复用做了配置,会导致部分U-Boot表格中的引脚配置被覆盖,从而不生效。

1.3.2. 命令行工具

当我们启动系统以后,可以在Linux命令行中使用reg-tools工具对寄存器进行操作。

reg-tools包含几个命令,这里只列出与寄存器操作相关的命令

  • bspmm <addr> <value>:设置寄存器的值,addr为寄存器地址,value为设置的值。

  • bspmd <addr>:读取寄存器的值,addr为地址。

  • bspmd.l <addr> <num>:读取多个寄存器的值,addr为地址,num为连续读取的个数。

  • bspmd.reg <addr>:读取单个寄存器的值,addr为地址。

../../_images/reg-tools.png

在Linux系统进行中,我们使用开机自动运行的脚本来对引脚复用功能进行配置。此脚本运行在内核初始化完成后,会对U-Boot表格、U-Boot驱动、内核驱动中的引脚复用配置做覆盖。

脚本的位置在/etc/init.d/S00pinmux

reg-tools的源码保存在SDK的osdrv/tools/board/reg-tools-1.0.0目录下

1.3.3. sysconfig模块

sysconfig是内核外部模块,默认在开机自动运行的脚本中加载,也可以手动加载此模块,在模块加载时会对源码中配置的寄存器的值进行修改。

sysconfig的自动加载在S99user脚本中,晚于S00pinmux,所以对S00pinmux中配置的引脚复用配置有覆盖关系。

1
2
3
4
5
# 加载模块
insmod sys_config.ko

# 卸载模块
rmmod sys_config

sysconfig的源码保存在SDK的smp/a55_linux/interdrv/sysconfig目录下,主要关注源码中的pin_mux.c,下面列出pin_mux.c中的部分内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
/* 设置MIPI-CSI0引脚复用 */
static void mipi0_rx_pin_mux(void)
{
    void *iocfg2_base = sys_config_get_reg_iocfg2();

    sys_writel(iocfg2_base + 0x01B0, 0x0000); /* MIPI_RX0_CK1N */
    sys_writel(iocfg2_base + 0x01B4, 0x0000); /* MIPI_RX0_CK1P */
    sys_writel(iocfg2_base + 0x01C0, 0x0000); /* MIPI_RX0_D3N */
    sys_writel(iocfg2_base + 0x01C4, 0x0000); /* MIPI_RX0_D3P */
    sys_writel(iocfg2_base + 0x01B8, 0x0000); /* MIPI_RX0_D1N */
    sys_writel(iocfg2_base + 0x01BC, 0x0000); /* MIPI_RX0_D1P */
    sys_writel(iocfg2_base + 0x01A8, 0x0000); /* MIPI_RX0_CK0N */
    sys_writel(iocfg2_base + 0x01AC, 0x0000); /* MIPI_RX0_CK0P */
    sys_writel(iocfg2_base + 0x0198, 0x0000); /* MIPI_RX0_D0N */
    sys_writel(iocfg2_base + 0x019C, 0x0000); /* MIPI_RX0_D0P */
    sys_writel(iocfg2_base + 0x01A0, 0x0000); /* MIPI_RX0_D2N */
    sys_writel(iocfg2_base + 0x01A4, 0x0000); /* MIPI_RX0_D2P */
}

通过使用sys_writel函数对寄存器进行读写

当我们修改了源码中的引脚配置后,可以重新生成sys_config.ko,手动卸载和加载模块来更新引脚配置。