当前位置: 首页 > news >正文

嵌入式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, 其中

  1. xxx_gpios 代表该 gpio 的 name。驱动通过这个 name 遍历 dts 文件,最终获取 gpio 号及有效状态的电平。
  2. &gpio 代表该项是描述 gpio。
  3. &gpio 后的第一个 num 代表 gpio 号

计算方法:( “x”-“A”*32+字符串后的数字,x 代表 GPIOx。以 GPIOD32 为例,( D - A)*32+30 = 3*32+30 = 126。

  1. &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,SPI2UART4

以太网

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,SPI2UART6PWM4PWM5

以太网

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,UART2SPI3PWM0PWM1

以太网

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,UART2SPI3PWM2PWM3UART5

以太网

UART5 RX others:Reserved

7:06

RMII REF CLK

P ETH REF CLK PAD multiplex select. OO:RMII REF CLK/SMII 

CLK O1:UART4 TX

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 = <&ethernet_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

I2SNOR_A16

I2S_D0

4:03

I2S PCM1

P I2S LRCLKO, P I2S MCLKO

PAD multiplex select.

I2S,NOR,PCM1,

I2S 功能

http://www.dtcms.com/a/389390.html

相关文章:

  • Python快速入门专业版(三十四):函数实战1:计算器程序(支持加减乘除与括号优先级)
  • datawhale玩转通义四大新模型 202509 第2次作业
  • 【项目实战】知识库——基础理论1
  • ego(7)---为Astar路径点计算交点,避障基准点与排斥方向
  • Oracle体系结构-警报日志文件 (Alert Log File / Alert SID.log)
  • 解锁 TiDB:供应链场景下分布式分库分表的案例
  • 【IEEE出版 | 早鸟优惠开启】人工智能驱动图像处理与计算机视觉技术国际学术研讨会 (AIPCVT 2025)
  • Ubuntu之旅-02 Redis
  • 基于RK3588+FPGA的无人机飞控系统,支持AI算力和FPGA实时性,强大的图像处理能力,支持全国产化
  • 杂七杂八之基于ApiPost的Jar包调用
  • 华为HCCL集合通信库AllGather算子全流程解析
  • uv管理的python项目怎么打包成docker部署发布上线
  • unity之uv编辑
  • 华为电源研发的IPD实践:从概念到生命周期的结构化管控
  • MySQL中什么是回表查询,如何避免和优化?
  • MySql01
  • 2025版基于springboot的旅游门票预定系统
  • 3. Linux 计划任务管理
  • EasyCVR在智慧城市中场景中的核心应用与实践方案
  • LeetCode 刷题【84. 柱状图中最大的矩形】
  • CPP网络编程基础知识
  • 临床AI产品化全流程研究:环境聆听、在环校验与可追溯系统的多技术融合实践(上)
  • 【k8s】web服务优雅关闭用户连接
  • 设计模式的七大原则总述
  • C/C++柔性数组
  • 从 LiveData 到 Flow:Android 状态管理的现代化演进
  • 34、模型微调技术实战 - LoRA参数高效微调全流程
  • ASP.NET Core 中基于角色的授权
  • C++ 在 Windows 下实现最基础的 WebSocket 服务端与客户端
  • 并发、分布式和实时设计方法