1. 40Pin接口引脚对照图¶
LubanCat-Hi3403板卡引出了通用40Pin排针接口,用于连接外部模块
提示
LubanCat-Hi3403 40Pin排针接口满足HiSpark社区《海思开放硬件规范 V1.00.pdf》中的40Pin接口要求。
提示
LubanCat-Hi3403 40Pin排针接口与树莓派40Pin接口功能大部分兼容。注意部分电源引脚电平有差异,所有IO口仅支持1.8V电平。
上图是结合海思开放硬件要求和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的大部分引脚都能配置复用为更多功能,具体如下图所示。
引脚号: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.管脚控制寄存器 工作表
以其中一个引脚为例,各项含义如下
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启动阶段修改对应寄存器,来对芯片进行初始化配置。
文件中的 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为地址。
在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,手动卸载和加载模块来更新引脚配置。
