AM6254的A核如何引脚复用成GPIO

2022年10月22日 09:42    发布者:繁花之语
飞凌嵌入式FET6254-C核心板基于TI Sitara™ AM62x系列工业级处理器设计开发,由于AM6254采用了Cortex-A53+Cortex-M4F的处理核+控制核架构组合,因此引脚自然也是分为A核的引脚和M核的引脚。



https://pic2.zhimg.com/80/v2-7bdee53d2fadab9c616b9555af5dbe32_720w.jpg如果A核的引脚不够用怎么办?可以把M核的引脚用作A核吗?答案是肯定的。

今天小编将为大家分别介绍这颗核心板的GPIO引脚信号描述、A核使用A核的引脚、用户空间如何控制GPIO以及A核如何调用M核的引脚并复用成GPIO。

关于AM6254的GPIO信号描述

我们通过GPIO可以了解有关AM6254这颗CPU的引脚框架,CPU手册目录:用户资料/原厂资料/SPRSP58_AM62x_DS_AI_2_16_2022

在6.3.10GPIO章节有如下描述:






https://pic3.zhimg.com/80/v2-1b09269c06ddc24ba206749bcb4fd499_720w.png






AM6254的GPIO信号一共有两大组:分别是MAINDomainMCUDomain,其中MAINDomain是A核的GPIO,有两组GPIO0和GPIO1,分别是92和52个引脚。






https://pica.zhimg.com/80/v2-fc80ee029f3a0639b3c7f6cb06acf096_720w.png





https://pic1.zhimg.com/80/v2-1dfec487695e6ebd1a2d26c8cdc37225_720w.png






MCUDomain是M核的GPIO,有一组GPIO0,24个引脚。






https://pic2.zhimg.com/80/v2-fb22b4a19c611c860d73193a4f601d79_720w.png






6.2Pin Attributes章节描述了引脚的控制寄存器PADCONFIG名称以及地址,以及每个引脚的属性。例如B13引脚,引脚名称是SPI0_D0,寄存器名称为PADCONFIG112,寄存器地址为0x000F41C0,可以复用的功能如下:






https://pic3.zhimg.com/80/v2-95d27847c2a61907e9e47b6d1601e3d9_720w.png






Linux系统可以使用devmem2查看寄存器值。

root@ok6254:~# devmem2 0x000F41C0

/dev/mem opened.

Memory mapped at address 0xffff969c0000.

Read at address  0x000F41C0(0xffff969c41c0): 0x00010007

root@ok6254:~#




5.1.2.3Pad Configuration Register Functional Description章节。






https://pic1.zhimg.com/80/v2-320b8186c6271e531835dbcd2c086d18_720w.png







https://pic3.zhimg.com/80/v2-86ae2aaa77178c17d11ac0b8fb5d3f1f_720w.png





A核使用A核的引脚




了解了引脚信号的描述,先不要着急,接下来先熟悉一下A核的引脚复用方法,以将SPI_D0用作GPIO为例,设备树配置修改如下:

arch/arm64/boot/dts/ti/OK6254-C.dts






https://pica.zhimg.com/80/v2-bafcebe0995e9316e09117a1008eaf57_720w.png








https://pica.zhimg.com/80/v2-b0eb829e689e109dfcb054a836ae0921_720w.png





修改完成后编译设备树,会在Image目录下生成镜像,然后替换dtb镜像,替换目录:/boot/OK6254-C.dtb。执行sync保存后重启。




用户空间如何控制GPIO




为了查看是否修改成功,可以使用如下命令查看GPIO使用情况

root@ok6254:~#cat /sys/kernel/debug/gpio



方式1:
使用内核的gpio-leds驱动

root@ok6254:~# cd /sys/class/leds/root@ok6254:/sys/class/leds#lsheartbeat  led1  led2 led3  mmc0::  mmc1::  mmc2::root@ok6254:/sys/class/leds#
进入其中一个led1

root@ok6254:/sys/class/leds#cd led1/root@ok6254:/sys/class/leds/led1#lsbrightness  device max_brightness  power  subsystem  trigger  ueventroot@ok6254:/sys/class/leds/led1#
设备树默认配置触发方式trigger为timer,此时的led是按照定时亮灭的,可以改成手动控制。

root@ok6254:/sys/class/leds/led1#echo none > trigger  将方式改成正常模式
方式2:

使用/sys/class/gpio,注意,该方式不需要再设备配置leds节点,只需要配置引脚即可。如下是将gpmc_ad15引脚配置成GPIO。






https://pica.zhimg.com/80/v2-aceaccd8d07824d3be58b19ed60cf502_720w.png








https://pica.zhimg.com/80/v2-47238e15ee8d0b20cdb456098974d228_720w.png





关于gpiochip的计算公式如下:






https://pic2.zhimg.com/80/v2-1d8a382c9fab2d019384a46e23845068_720w.png




Gpmc_ad15的引脚是gpio0_30,chip值为402+30=432,导出gpio:

root@ok6254:~#echo 432 >/sys/class/gpio/export






设置方向:

root@ok6254:~# echo out >/sys/class/gpio/gpio432/direction



设置高低电平:

root@ok6254:~# echo 1 >/sys/class/gpio/gpio432/value  置高
A核如何调用M核的引脚

并复用成GPIO?




设备树配置:

&mcu_pmx0 {mymcugpio1_pins_default:mymcugpio1-pins-default




使用gpio-leds驱动的配置,在leds节点中添加如下(若您正在使用手机阅读,建议您关掉“深色模式”):

---a/arch/arm64/boot/dts/ti/OK6254-C.dts+++b/arch/arm64/boot/dts/ti/OK6254-C.dts
控制方式与前面提到的方式1和方式2一样,至此GPIO的复位完成。




当然其他接口I2C、CAN、SPI、UART也是类似,想要了解更详细的使用方式,大家可以关注后续的应用笔记。