ITPub博客

首页 > 嵌入式/内核开发 > 嵌入式/内核开发 > AM6254的A核如何引脚复用成GPIO

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

嵌入式/内核开发 作者:ningmengzier 时间:2022-10-22 09:48:24 0 删除 编辑
飞凌嵌入式FET6254-C核心板基于TI Sitara™ AM62x系列工业级处理器设计开发,由于 AM6254采用了Cortex-A53+Cortex-M4F的处理核+控制核架构组合,因此引脚自然也是分为A核的引脚和M核的引脚。
编辑 切换为居中
添加图片注释,不超过 140 字(可选)
如果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章节有如下描述:

编辑


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

编辑 切换为居中





MCUDomain是M核的GPIO,
有一组GPIO0,24个引脚。
编辑 切换为居中



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

编辑 切换为居中



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章节。


编辑 切换为居中
添加图片注释,不超过 140 字(可选)


A核使用A核的引脚

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

编辑 切换为居中


编辑



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

用户空间如何控制GPIO

为了查看是否修改成功,可以使用如下命令查看GPIO使用情况
root@ok6254:~#cat /sys/kernel/debug/gpio
gpiochip2: GPIOs 314-401, parent:platform/601000.gpio, 601000.gpio:
gpio-330 (                    |led1               ) out lo
gpio-331 (                    |led2               ) out lo
gpio-332 (                    |led3               ) out lo
gpio-333 (                    |led4               ) out lo
gpio-336 (                   |fixed-regulator-rgb ) out lo
gpiochip1: GPIOs 402-488, parent:platform/600000.gpio, 600000.gpio:
gpio-433 (                    |net-5g-rst         ) out lo ACTIVE LOW
gpio-437 (                    |phy_rstn           ) out lo
gpio-438 (                    |id                 ) in  lo
gpio-440 (                    |RT9186             ) out lo
gpio-441 (                   |fixed-regulator-lvds) out lo
gpio-442 (                    |phy_rstn           ) out lo
gpio-444 (                    |heartbeat          ) out lo
gpio-473 (                    |regulator-6        ) out lo
gpiochip0: GPIOs 489-511, parent:platform/4201000.gpio, 4201000.gpio:
root@ok6254:~#

方式1:
使用内核的gpio-leds驱动
root@ok6254:~# cd /sys/class/leds/
root@ok6254:/sys/class/leds#ls
heartbeat  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#ls
brightness  device max_brightness  power  subsystem  trigger  uevent
root@ok6254:/sys/class/leds/led1#
设备树默认配置触发方式trigger为timer,此时的led是按照定时亮灭的,可以改成手动控制。
root@ok6254:/sys/class/leds/led1#echo none > trigger  将方式改成正常模式
root@ok6254:/sys/class/leds/led1#echo 1 > brightness  熄灭
root@ok6254:/sys/class/leds/led1#echo 0 > brightness  点亮
root@ok6254:/sys/class/leds/led1#
方式2:
使用/sys/class/gpio, 注意,该方式不需要再设备配置leds节点,只需要配置引脚即可。如下是将gpmc_ad15引脚配置成GPIO。

编辑
添加图片注释,不超过 140 字(可选)


编辑 切换为居中


关于gpiochip的计算公式如下:

编辑 切换为居中



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  置高
root@ok6254:~# echo 0 >/sys/class/gpio/gpio432/value   拉低
root@ok6254:~#
A核如何调用M核的引脚
并复用成GPIO?

设备树配置:
&mcu_pmx0 {
mymcugpio1_pins_default:mymcugpio1-pins-default {
                pinctrl-single,pins= <                                        
                                AM62X_MCU_IOPAD(0x004,PIN_INPUT, 7)
                    >;
            };
};
&mcu_gpio0 {
                pinctrl-names ="default";
                    pinctrl-0=<&mymcugpio1_pins_default>;
                status = "okay";
};


使用gpio-leds驱动的配置,在leds节点中添加如下(若您正在使用手机阅读,建议您关掉“深色模式”):
---a/arch/arm64/boot/dts/ti/OK6254-C.dts
+++b/arch/arm64/boot/dts/ti/OK6254-C.dts
@@ -166,7 +166,7 @@
                            compatible= "gpio-leds";
                            pinctrl-names= "default";
                            pinctrl-0= <&usr_led_pins_default>;
-
+                          pinctrl-1 = <&mymcugpio1_pins_default>;
                            led-0 {
                                    label= "heartbeat";
                                    gpios= <&main_gpio0 42 GPIO_ACTIVE_HIGH>;
@@ -206,6 +206,14 @@
                        led-pattern= <500 500>;
                        default-state= "on";
                 };
+              
+               led-5 {
+                      label = "led5";
+                       gpios = <&mcu_gpio0 1 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "timer";
+                       led-pattern = <500 500>;
+                       default-state = "on";
+               };
};
控制方式与前面提到的方式1和方式2一样,至此GPIO的复位完成。

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


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69989353/viewspace-2919754/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-11-25

  • 博文量
    327
  • 访问量
    139465