前言
芯片的多数pin脚通常支持多种功能复用,软件上根据实际的硬件设计,配置成相应的功能。
芯片得到供电但还未运行软件的时候,PAD 脚的状态是芯片内部固定好的,具体请参见 BB 芯片规格书或 GPIO SPEC 文档。
软件启动后,由软件进行配置,通常是在bootloader启动阶段。下面以展锐平台进行分析。
硬件:展锐ums512
软件:Android 11
开机时会调用pin_init,通过写寄存器,对pin进行初始化配置,寄存器和对应的值在pinmap中配置
bsp/bootloader/u-boot12/board/spreadtrum/ums512_1h10/pinmap.c
static pinmap_t pinmap[]={
{RGE_PIN_CTRL_REG0,0X00000000}, //SIMCARD0_BAT_DET_AP
...
...
{REG_PIN_EMMC_RST, BITS_PIN_AF(0)},
{REG_MISC_PIN_EMMC_RST, BITS_PIN_DS(3)|BIT_PIN_NULL|BIT_PIN_NUL|BIT_PIN_SLP_AP|BIT_PIN_SLP_WPU|BIT_PIN_SLP_Z},//EMMC_RST
...
...
{REG_PIN_SCL3, BITS_PIN_AF(0)},
{REG_MISC_PIN_SCL3, BITS_PIN_DS(3)|BIT_PIN_WPUS|BIT_PIN_WPU|BIT_PIN_SLP_AP|BIT_PIN_SLP_WPU|BIT_PIN_SLP_Z},//CTP_SCL
};
寄存器的值和宏对应bit在对应平台的pinmap.h中定义,这是根据芯片手册配置的
bsp/bootloader/u-boot15/arch/arm/include/asm/arch-sharkl5pro/pinmap.h
/* registers definitions for controller REG_PIN */
#define REG_PIN_PWR_PAD_CTL_RESERVED ( 0X0000 )
...
...
#define REG_PIN_CTL_REG0 ( 0X001C )
...
...
/* registers definitions for controller CTL_PIN */
#define REG_PIN_EMMC_RST ( 0X001C )
...
...
/* registers definitions for controller CTL_PIN MISC_OFFSET */
#define REG_PIN_PWR_PAD_CTL_G1 ( 0X0000 )
#define REG_MISC_PIN_EMMC_RST ( 0X0434 )
...
...
/* bits definitions for register REG_PIN_XXX */
#define BITS_PIN_DS(_x_) (((_x_) << 9) & (BIT_19|BIT_20|BIT_21|BIT_22))
#define BIT_PIN_SLP_CM4 ( BIT_17)
#define BIT_PIN_SLP_AUDCP ( BIT_16)
#define BIT_PIN_SLP_WTLCP ( BIT_15)
#define BIT_PIN_SLP_PUBCP ( BIT_14)
#define BIT_PIN_SLP_AP ( BIT_13)
#define BIT_PIN_SLP_NONE ( (~(0x1f << 13)) & (BIT_13|BIT_14|BIT_15|BIT_16|BIT_17))
#define BITS_PIN_SLP(_x_) ( ((_x_) << 13) & (BIT_13|BIT_14|BIT_15|BIT_16|BIT_17))
#define BIT_PIN_WPUS ( BIT_12)
#define BIT_PIN_SE ( BIT_11)
#define BIT_PIN_WPU ( BIT_7)
#define BIT_PIN_WPD ( BIT_6)
#define BITS_PIN_AF(_x_) ( ((_x_) << 4) & (BIT_4|BIT_5))
#define BIT_PIN_SLP_WPU ( BIT_3)
#define BIT_PIN_SLP_WPD ( BIT_2)
#define BIT_PIN_SLP_IE ( BIT_1)
#define BIT_PIN_SLP_OE ( BIT_0)
/* vars definitions for controller CTL_PIN */
#define BIT_PIN_NUL ( 0 )
#define BIT_PIN_SLP_NUL ( 0 )
#define BIT_PIN_SLP_Z ( 0 )
#define BIT_PIN_NULL ( 0 )
pinmap关键字段介绍
pinmap.c 文件中对 BB 每个 PAD 的配置都分为两行,第一行配置 PAD 的“Central 寄存器”,第二行配置PAD 的“Side Band(MISC)寄存器”。下面以 DSI_TE 为例,对关键字段进行解释说明。
A:PAD 脚的“Central 寄存器”名称。“DSI_TE”为 PAD 的 Ball Name。
B:“Central 寄存器”的控制内容,控制 PAD 的功能。AF0~3 对应 BB 芯片规格书和 GPIO SPEC 中的 Function 0~3。
如果配置为 3,通过表格可以看到对应的是 GPIO79。如果配置为0,即 Function0 为 EXTINT10,在 EIC Source List 中,可以查询到对应的 EIC 控制器,说明可以作 EIC 中断使用。
C:PAD 脚的“Side Band(MISC)寄存器”名称。“DSI_TE”为 PAD 的 Ball Name。
D:“Side Band 寄存器”的控制内容,PAD 驱动强度(Drive Strength)选择。调整输出信号的驱动能力(提供对输出信号电流的控制),默认与平台版本保持一致,驱动强度过大会造成高频分量过多。输出信号时序有问题时才做调整。
E/F:“Side Band 寄存器”的控制内容,唤醒状态下 PAD 内部上下拉状态控制。
两个关键字共同控制上下拉状态,所有组合如下:
BIT_PIN_NULL|BIT_PIN_NUL 表示内部无上下拉。
BIT_PIN_NULL|BIT_PIN_WPU 表示 20 kΩ 电阻上拉。
BIT_PIN_WPUS|BIT_PIN_NUL 表示 4.7 kΩ 电阻上拉。
BIT_PIN_WPUS|BIT_PIN_WPU 表示 1.8 kΩ 电阻上拉。
BIT_PIN_NULL|BIT_PIN_WPD 表示 50 kΩ 电阻下拉。
说明:除 I2C 接口和 SIM 卡接口之外,一般不需要开启强上拉(4.7 kΩ/1.8 kΩ),保持与平台一致即可。IO口只有作为输入时才配置上下拉,主要是为了钳制电位;作信号输出时,高低电位由软件决定,无需配置上下拉。
WPU(Weak Pull Up):是弱上拉。
WPUS(Weak Pull Up Selection):上拉强度选择。
WPD(Weak Pull Down):弱下拉。
G:“Side Band 寄存器”的控制内容,PAD 休眠控制选择。PAD 在唤醒时,其状态动态可变;休眠后只能静态保持一种状态。具体的对外表现状态由关键字 H和 I 决定。PAD 的休眠选择:PAD 应与其信号 Controller 所在的子系统一起休眠。C 文件在开头对一些子系统的集合作出了定义[1],也可以直接将多个子系统并列写,作“与”逻辑。如 BIT_PIN_SLP_AP|BIT_PIN_SLP_AUDCP,表示在 AP 和 AUDCP 都休眠时(“与”),信号才进入休眠。休眠状态相关的关键字只有在休眠状态下才会生效,如休眠项配置为 BIT_PIN_SLP_NONE,则 PAD不会休眠,关键字 H 和 I 一直不会生效。
H:“Side Band 寄存器”的控制内容,休眠后 PAD 内部上下拉状态控制[2]。
BIT_PIN_SLP_WPU 表示弱上拉
BIT_PIN_SLP_WPD 表示弱下拉
BIT_PIN_SLP_NUL 表示无上下拉
此处的状态是为了控制信号在休眠后的内部上下拉,此时上拉电阻固定为 20K。
I:“Side Band 寄存器”的控制内容,休眠后 PAD 的输入输出状态[2]。
BIT_PIN_SLP_IE 表示输入
BIT_PIN_SLP_OE 表示输出
BIT_PIN_SLP_Z 表示高阻
PAD 未休眠时,其信号的输入/输出方向由内部 Controller 决定;PAD 休眠后,其信号方向将为单一
固定方向,由此关键字控制。
说明:
IE(Input Enable,输入使能)使能时为输入,PAD 与内部输入门电路连接。
OE(Output Enable,输出使能)使能时为输出,PAD 与内部输出门电路连接。
IE/OE 都不使能时为高阻,PAD 与内部输入/输出门电路都断开。
J:注释网络名等信息,增加可读性。
注:PAD 休眠后,可以通过关键字 H 和 I 配置 PAD 此时的状态:
BIT_PIN_SLP_WPU|BIT_PIN_SLP_Z
表示 PAD 休眠后与内部输入/输出门电路都断开,内部上拉,对外表现高电平。
用于子系统休眠后 BB 端无需收发数据,但外设端需要高电平的信号,如 I2C 信号等。
BIT_PIN_SLP_WPD|BIT_PIN_SLP_Z
表示 PAD 休眠后与内部输入/输出门电路都断开,内部下拉,对外表现低电平。
用于子系统休眠后 BB 端无需收发数据,但外设端需要低电平的信号。
BIT_PIN_SLP_NUL|BIT_PIN_SLP_Z
表示 PAD 休眠后与内部输入/输出门电路都断开,内部无上下拉,对外表现悬空。
用于子系统休眠后 BB 端无需收发数据,外设端对电平也没有要求的信号(PAD 悬空时会耦合相
邻 PAD 的跳变电平,因此尽量不要配置此状态)。
BIT_PIN_SLP_NUL|BIT_PIN_SLP_OE
表示 PAD 休眠后保持与内部输出门电路的连接,输出电平由内部寄存器决定,无须配置上下拉。
用于子系统休眠后,BB 端需要保持输出的信号,如复位信号等。
BIT_PIN_SLP_XXX|BIT_PIN_SLP_IE
表示 PAD 休眠后保持与内部输入门电路连接,内部上下拉的选择与工作状态下的一致。
用于子系统休眠后,BB 端仍需保持接受状态的信号,如中断信号等。
参考文章:
sprd平台pinmap介绍-优快云博客
– 新移科技 - Powered by Discuz! (new-mobi.com)展讯pinmap解析_展讯pin码编码格式-优快云博客