嵌入式ARM SOC开发中文专题分享二:ARM SOC外围引脚功能说明
介绍
目的
描述 A6410 的参考设计开发板上各个引脚功能说明,以方便在做硬件设计的是熟悉选型和配置。
背景
以 A6410 soc 的功能模块为单位,进行每组模块功能的配置
缩写词
缩写和术语 | 解 释 |
A6410 | 文中 A6410 指soc 芯片名称 |
Evb | 文中指用 A6410 参考设计的一个通用开发板 |
dts | Device Tree Source,是硬件信息描述源文件。 |
GPIO | 通用输入输出口 I/O。 |
MFP | 一个输出 pin 具有多个功能,通常通过一组寄存器来管理配置, Multi-function Pin 多功能引脚. |
MFP&GPIO
硬件接口
A6410 Soc 是一个有众多的功能的应用处理器,除了 cpu 和 gpu 等内部模块外,也还有很多与外界交互的功能模块和通用输入输出接口 GPIO,每个模块都需要有多个 pin 功能组成,而芯片限于 BGA 封装尺寸,成本等等的考虑,无法所有功能模块各个 pin 功能都独占一个物理引脚,所以有了多个 pin(模块)功能复用(非同时使用)引脚的设计,也就是 MFP(Multi-function Pin)。
A6410 总共有 132(32*4 GPIOA,GPIOB,GPIOC,GPIOD 加 4 GPIOE)个可以作为 GPIO 的 pin 脚,绝大部分 pin 脚与 SoC 功能模块的 I/O 复用,只有少数为单独 GPIO 口功能,在方案设计的时候,可以在某些模块不使用的时候切换做普通 GPIO 口用,所有复用 pin 的 GPIO 功能是优先级最高的。
参考设计 EVB 开发板只预留少数 pin 作 GPIO, 其中的一部分用于控制外部器件的电源/reset 等,另一部分引出供用户定制。用户可定制的 GPIO 集中在基板的 GPIO 插口。
MFP 的复用关系分为两个层次, GPIO 复用和 function 复用。下图描述了一个 pin 的内部结构。
一个 pin 先是由 MUX0 决定是否启用(不启用的 pin 是高阻态), 启用了的 pin 再由 MUX1 决定是否做 GPIO 用(绝大多数功能引脚 pin 都有 GPIO 功能), 不用于 GPIO 的 pin 然后再由 MUX2 决定是引出哪路 function。
上述得到,GPIO 复用的优先级较高,无论 MUX2 选了哪路的 function,只要 GPIO output 或 input 生效,pin 脚用作 GPIO。大部分 pin 都采用这样的设计思路, 只有极少数 pin 使用别的特殊方式处理复用。
基于降低复杂性考虑,MFP function 层次的复用是部分映射,某个模块只能输出一部分预定义好的 pin脚上,而并非能输出到任意的 pin 脚,这与某些单片机/FPGA 的 pin 任意复用有所不同。
大部分 MFP 的复用关系是方案预定义好了的, 运行时固定不变(即某个 pin 脚一直维持某个功能,不会动态改变),只有小部分 pin 有动态切换功能的需求。方案制定 pin 复用时,优先考虑固定的映射,只有特例才考虑动态切换(如后述的 UART5 和 SDIO 的复用)。
1, A6410 SOC 的MFP 功能模块控制寄存器是
0xb01b00 | ||
0x0040 | MFP_CTL0 | Multiplexing Control 0 Register |
0x0044 | MFP_CTL1 | Multiplexing Control 1 Register |
0x0048 | MFP_CTL2 | Multiplexing Control 2 Register |
0x004C | MFP_CTL3 | Multiplexing Control 3 Register |
2,GPIO 控制寄存器如下
0x001C | GPIO_CINEN | GPIOC Input Enable Register |
0x0020 | GPIO_CDAT | GPIOC Data Register |
0x0024 | GPIO_DOUTEN | GPIOD Output Enable Register |
0x0028 | GPIO_DINEN | GPIOD Input Enable Register |
0x002C | GPIO_DDAT | GPIOD Data Register |
0x0030 | GPIO_EOUTEN | GPIOE Output Enable Register |
0x0034 | GPIO_EINEN | GPIOE Input Enable Register |
0x0038 | GPIO_EDAT | GPIOE Data Register |
3,PIN LIST 说明
BALL NO:每个管脚对应的 BGA 上编码,编码近的
MODULE:每个功能模块上有多个 pin 组成,这些 pin 也基本是 BGA 上位置比较靠近的位置
BALL NAME:每个管脚默认模块功能对应名称(紧跟后面罗列其他功能的名称)
Ball No. | Ball Name | Function Mux | Description |
A1 | NAND_WRB | NAND_WRB | NAND write enable |
A10 | OEN | OEN | LVDS OEN |
GPIOB11 | GPIOB11 | ||
LCD0 一 HSYNC0 | LCD HSYNC signal |
软件说明
1, MFP 模块
由 kernel 管理,代码位置为 android/kernel/arch/arm/mach-bruce/pinctrl_common-bruce.c
BALL NO. | Module | BALL Name | FUNC2 | FUNC3 | FUNC4 | FUN C5 | GPIO | EVB引脚分 布 | EVB 功能 说明 |
H2 | ETHERN ET MAC | P_ETH_T XD0 | SMII_TX | SPI2_S CLK | UART6_ RX | PW M4 | GPIOA 14 | ETH_TXD0 | ETHERNET |
H3 | P_ETH_T XD1 | SMII_S YNC | SPI2_S S | UART6_ TX | PW M5 | GPIOA 15 | ETH_TXD1 | ||
G1 | P_ETH_T XEN | SPI3_S CLK | UART2_ RX | PWM0 | GPIOA 16 | ETH_TXEN | |||
H4 | P_ETH_R XER | SPI3_M OSI | UART2_ TX | PWM1 | GPIOA 17 | ETH_RXE R | |||
J2 | P_ETH_R XD1 | SPI3_S S | UART5_ TX | UART2_ RTSB | PW M2 | GPIOA 19 | ETH_RXD 1 |
kernel 使用dts 配置其映射关系,
具体的配置文件是板型目录下的 dts/A6410-lt705a.dts,以太网模块举例说明配置方法。
dts 配置
bruce,groups = "mfp0_18_16_eth_txd0", "mfp0_18_16_eth_txd1";bruce,function = "eth_rmii";
};
2, GPIO 的分配
SDK 的 GPIO 分配使用 dts 文件做配置,驱动从 dts 配置文件中获取自己使用的 GPIO 号,再申请使用
GPIO。
GPIO 的配置在 SDK 的 android/bruce/gs705a/config/boards/demo/<板型>/dts/A6410-lt705a.dts 文件中, 下面是示例:
示例中 xxx_gpios 每一行配置一个 GPIO, 其中
- xxx_gpios 代表该 gpio 的 name。驱动通过这个 name 遍历 dts 文件,最终获取 gpio 号及有效状态的电平。
- &gpio 代表该项是描述 gpio。
- &gpio 后的第一个 num 代表 gpio 号
计算方法:( “x”-“A”)*32+字符串后的数字,x 代表 GPIOx。以 GPIOD32 为例,( D - A)*32+30 = 3*32+30 = 126。
- &gpio 后的第二个 num 代表有效状态 action 对应的电平
如 power 控制是低有效, num 为 1; reset 是高有效, num 为 0。
注意的是,gpio 的电平状态 action 统一是 0:high,1:low。要根据实际的硬件设计填写正确的 action
状态(如 reset 肯定是输出的,一般是低有效,但是上面的例子却是高有效,那是因为硬件逻辑翻转了下)。驱动程序如何获取 GPIO 的配置信息, 可参考如下实例:
MFP 修改和调试说明
1, 修改 MFP 举例,默认 P_KS_OUT2 是按键功能, EVB 上没有使用默认 KS_OUT2,
Module | PAD Name | FUNC 2 | FUNC 3 | FUNC 4 | FUNC 5 | FUNC 6 | GPIO | EVB引脚 分布 | EVB功能 说明 |
KEY | P_KS_O UT2 | UART5_ TX | SD0_D1 B | NOR_A1 1 | PWM2 | SENS1_HSY NC | GPIOB9 | KS_OUT 2 |
MFP1
25:23 | KS_OUT2 | P_KS_OUT2 PAD multiplex select. | SD0 KS_OUT2 NOR UART5 SENS1 | UART5 |
000:SD0_D1B | ||||
001:KS_OUT2 | ||||
010:NOR_A11 | ||||
011:PWM2 | ||||
100:UART5_TX | ||||
101 :SENS1_HSYNC | ||||
others:Reserved |
我们也可以将其配置为 PWM2,这里需要修改 dts
pwm2_state_default: pwm2_default {
pwm2_mfp {
actions,groups = "mfp1_25_23";
actions,function = "pwm2";
};
};pwm: pwm@b01b0050 {
pwm2 {
id = <2>;
pinctrl-names = "default";
pinctrl-0 = <&pwm2_state_default>;
};
};
2, 查看 MFP 配置:
调试中可以通过串口查看节点来确认 MFP 功能,这里确认是否配置为 PWM2:
root@86v:/ # cd dev
cd dev
root@86v:/dev # busybox devmem
0xb01b0044 32
busybox devmem 0xb01b0044 32
0x6DC13C70
root@86v:/dev #
这里 bit25:23 为 011 是 pwm2 功能,可以通过示波器量测本接口看是否有对应输出。
3,查看 GPIO 属性:
这里虽然 MFP 配置为了 PWM 功能,因为 GPIO 的优先级高,如果通过示波器得到不是想要的结果,
还需要看下是否哪个地方设了 GPIO 功能,以下是 GPIOB9 举例查看和设置状态,分别查看不同 GPIOBIN GPIODBUT GPIBDAT 数值
从寄存器查看 GPIOB9:
查看 GPIOBOUT
root@86v:/dev # busybox devmem 0xb01b000C 32 busybox devmem 0xb01b000C 32
0x00000018
查看 GPIOBIN
root@86v:/dev # busybox devmem 0xb01b0010 32 busybox devmem 0xb01b0010 32
0x00000080
查看 GPIOBDAT
root@86v:/dev # busybox devmem 0xb01b0014 32 busybox devmem 0xb01b0014 32
0x00000018
设置 GPIOB9 为输出
1|root@86v:/dev # busybox devmem 0xb01b000C 32 0x00000218 busybox devmem 0xb01b000C 32 0x00000218
3, 如果查看到 GPIO 被设置了,但又不知道是哪个模块误用可以在代码中修改,打印调用栈来,判断调用的函数
static int bruce_gpio_request(struct gpio_chip *chip, unsigned offset)
{
printk("gpio request =%d",offset);
if (offset == 19)(替换为对应 dpio)
{
dump_stack();
}
ETHERNET
模块 pin 功能列表
A6410 SoC 上以太网模块共 10 个 pin,EVB 上这里是作为以太网用,如果无以太网设计,各个 pin 根据
MFP 控制器说明,可以将 pin 复用为其他功能,或作为普通 gpio 使用
BALL NO. | Module | BALL Name | FUNC2 | FUNC3 | FUNC4 | FUN C5 | GPIO | EVB引脚分 布 | EVB 功能 说明 |
H2 | ETHERN ET MAC | P_ETH_T XD0 | SMII_TX | SPI2_S CLK | UART6_ RX | PW M4 | GPIOA 14 | ETH_TXD0 | ETHERNET |
H3 | P_ETH_T XD1 | SMII_S YNC | SPI2_S S | UART6_ TX | PW M5 | GPIOA 15 | ETH_TXD1 | ||
G1 | P_ETH_T XEN | SPI3_S CLK | UART2_ RX | PWM0 | GPIOA 16 | ETH_TXEN | |||
H4 | P_ETH_R XER | SPI3_M OSI | UART2_ TX | PWM1 | GPIOA 17 | ETH_RXE R | |||
J2 | P_ETH_R XD1 | SPI3_S S | UART5_ TX | UART2_ RTSB | PW M2 | GPIOA 19 | ETH_RXD 1 |
MFP 配置说明
MFP 对应为 MFP_CTL0
Multiplexing Control O Register Offset = OxOO4O
Bits | Name | Description | 对应 pin 可选配置功能 | IC 复位默认 |
22:2O | RMII 一 CRS 一 DV | P 一 ETH 一 CRS 一 DV PAD multiplex select. OOO:RMII 一 CRS 一 DV OO1:SMII 一 RX O1O:SPI2 一 MISO O11:UART4 一 RX 1OO:PWM4 Other Reserved | RMII,SMII,SPI2, UART4 | 以太网 |
18:16 | RMII 一 TXDO1 | P 一 ETH 一 TXDO, P 一 ETH 一 TXD1 PAD multiplex select. OOO:RMII 一 TXDO, RMII 一 TXD1 OO1:SMII 一 TX, SMII 一 SYNC O1O:SPI2 一 SCLK, SPI2 一 SS O11:UART6 一 RX, UART6 一 TX 1OO:PWM4,PWM5 others:Reserved | RMII,SMII,SPI2, UART6,PWM4,PWM5 | 以太网 |
15:13 | RMII 一 TXEN 一 RXER | P ETH TX EN, P ETH RX ER PAD multiplex select. OOO:RMII 一 TX 一 EN, RMII 一 RX 一 ER OO1:UART2 一 RX, UART2 一 TX O1O:SPI3 一 SCLK, SPI3 一 MOSI O11:PWMO, PWM1 Other Reserved | RMII,UART2,SPI3, PWM0,PWM1 | 以太网 |
1O:8 | RMII 一 RXD1O | P 一ETH 一RXD1, P 一ETH 一RXDO PAD multiplex select. OOO:RMII 一 RXD[1:O] OO1:UART2 一 RTSB, UART2 一 CTSB O1O:SPI3 一 SS, SPI3 一 MISO O11:PWM2, PWM3 1OO:UART5 一 TX, | RMII,UART2,SPI3, PWM2,PWM3,UART5 | 以太网 |
7:06 | RMII 一 REF 一 CLK | P 一 ETH 一 REF 一 CLK PAD multiplex select. OO:RMII 一 REF 一 CLK/SMII 一 | RMII,UART4 | 以太网 |
EVB 上 DTS 配置
EVB 上作为以太网模块使用,DTS 配置如下:
ethernet_state_default: ethernet_default { ethernet_smi { /* pins: MDC & MDIO */
bruce,groups = "eth_smi_dummy"; bruce,function = "eth_rmii";
};
ethernet_rmii_txd01 {
bruce,groups = "mfp0_18_16_eth_txd0", "mfp0_18_16_eth_txd1"; bruce,function = "eth_rmii";
};ethernet_rmii_txen_rxer {
bruce,groups = "mfp0_15_13_rmii_txen", "mfp0_15_13_rmii_rxen"; bruce,function = "eth_rmii";
};ethernet_rmii_crs_dv { bruce,groups = "mfp0_22_20"; bruce,function = "eth_rmii";
};ethernet_rmii_rxd10 {
bruce,groups = "mfp0_10_8_rmii_rxd1", "mfp0_10_8_rmii_rxd0"; bruce,function = "eth_rmii";
};ethernet_rmii_ref_clk { bruce,groups = "mfp0_7_6"; bruce,function = "eth_rmii";
};
};PHY 参数配置:
ethernet@b0310000 {
pinctrl-names = "default";
pinctrl-0 = <ðernet_state_default>;phy-mode = "rmii";
phy-handle = <&phy0>;
phy-power-gpios = <&gpio 85 0>; /* GPIOC21 active 1:low 0:high*/
phy-reset-gpios = <&gpio 84 0>; /* GPIOC20 active 1:low 0:high*/address-bits = <48>;
local-mac-address = [ 00 18 fe 66 66 66 ];
max-frame-size = <1518>;status = "okay";
compatible = "bruce,bruce-ethernet";phy0: ethernet-phy@0 {
compatible = "micrel,ksz8041tl"; reg = <0>;
};
};
phy1 {
compatible = "SR8201G,sr8201g"; reg = <0>;
/* SIRQ0 */ interrupt-parent = <&sirq>; interrupts = < 0 0x4 >;
};
INTC
模块 pin 功能列表
A6410 SOC 上有 3 个外部中断口,也可以作为普通 gpio 口使用 evb 上使用如下:
Module | PAD Name | GPIO | EVB引脚分布 | EVB功能说明 |
INTC | P_SIRQ0 | GPIOA24 | TP_INT | TP中断使用 |
P_SIRQ1 | GPIOA25 | SIRQ1 (FLASH 保护) | Flash断电保护 | |
P_SIRQ2 | GPIOA26 | SIRQ2 (PMU) | PMU中断 |
EVB 上 DTS 配置
Sirq0 做tp 中断 dts 配置如下:
ctp_detect {
compatible = "bruce-ctp-detect"; i2c_adapter_id = <1>;
tp_vcc = "ldo5";
//reset_gpios = <&gpio 35 1>; /*GPIOB(3) 0: high, 1: low*/
//interrupt-parent = <&sirq>;
//interrupts =< 0 0x4 >; /*SIRQ0*/ vol_range = <3100000 3110000>;Sirq2 做pmu 中断控制 dts 配置如下:
/* atc2603c*/
atc260x: atc2603c@65 {
compatible = "bruce,atc2603c"; reg = <0x65>;
interrupt-parent = <&sirq>; interrupts =< 2 0x4 >; interrupt-controller;
#interrupt-cells = <1>;losc_32k_output_enable = <1>; /* enable/disable output 32.768K clock via
I2S_MCLK1 pin */
I2S
模块 pin 功能列表
A6410 硬件 上 I2S 模块有 8 个 pin , EVB 上使 用了其 中 P_I2S_D0 , P_I2S_D1 ,
P_I2S_LRCLK0,P_I2S_MCLK0,连接到 PMU 的 codec,其他 pin 闲置可作为他用
Module | PAD Name | FUNC 2 | FUNC 3 | GPIO | EVB引脚 分布 | EVB功能说明 |
I2S | P_I2S_D0 | NOR_A16 | GPIOA27 | I2S_D0 | PMU I2S | |
P_I2S_BCL K0 | PCM0_IN | NOR_ A17 | GPIOA28 | I2S_BCLK 0 | ||
P_I2S_LRC LK0 | PCM1_SY NC | NOR_ A18 | GPIOA29 | I2S_LRCL K0 | PMU I2S | |
P_I2S_MCL K0 | PCM1_CL K | NOR_ A19 | GPIOA30 | I2S_MCL K0 | PMU I2S | |
P_I2S_D1 | NOR_A20 | GPIOA31 | I2S_D1 | PMU I2S | ||
P_I2S_BCL K1 | PCM0_OU T | NOR_ A21 | GPIOB0 | I2S_BCLK 1 | ||
P_I2S_LRC LK1 | PCM0_CL K | NOR_ A22 | GPIOB1 | I2S_LRCL K1 | ||
P_I2S_MCL K1 | PCM0_SY NC | NOR_ A23 | GPIOB2 | I2S_MCL K1 |
MFP 配置说明
I2S 模块 MFP 配置主要使用 MFP_CTL0 参考如下:
Bits | Name | Description | 可选配置功能 | IC 复位功能 |
5 | I2S 一 DO | P 一 I2S 一 DO PAD multiplex select. O:I2S 一 DO 1:NOR 一 A16 | I2S,NOR_A16 | I2S_D0 |
4:03 | I2S 一 PCM1 | P 一 I2S 一 LRCLKO, P 一 I2S 一 MCLKO PAD multiplex select. | I2S,NOR,PCM1, | I2S 功能 |