• 飞凌AM6254核心板的GPIO怎么用?进来聊聊


    来源:飞凌嵌入式官网www.forlinx.com

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

    如果A核的引脚不够用怎么办?可以把M核的引脚用作A核吗?答案是肯定的。

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

    1、关于AM6254的GPIO信号描述

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

    在6.3.10GPIO章节有如下描述:

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

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

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

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

    1. root@ok6254:~# devmem2 0x000F41C0
    2. /dev/mem opened.
    3. Memory mapped at address 0xffff969c0000.
    4. Read at address 0x000F41C0(0xffff969c41c0): 0x00010007
    5. root@ok6254:~#

    5.1.2.3Pad Configuration Register Functional Description章节。

    2、A核使用A核的引脚

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

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

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

    3、用户空间如何控制GPIO

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

    1. root@ok6254:~#cat /sys/kernel/debug/gpio
    2. gpiochip2: GPIOs 314-401, parent:platform/601000.gpio, 601000.gpio:
    3. gpio-330 ( |led1 ) out lo
    4. gpio-331 ( |led2 ) out lo
    5. gpio-332 ( |led3 ) out lo
    6. gpio-333 ( |led4 ) out lo
    7. gpio-336 ( |fixed-regulator-rgb ) out lo
    8. gpiochip1: GPIOs 402-488, parent:platform/600000.gpio, 600000.gpio:
    9. gpio-433 ( |net-5g-rst ) out lo ACTIVE LOW
    10. gpio-437 ( |phy_rstn ) out lo
    11. gpio-438 ( |id ) in lo
    12. gpio-440 ( |RT9186 ) out lo
    13. gpio-441 ( |fixed-regulator-lvds) out lo
    14. gpio-442 ( |phy_rstn ) out lo
    15. gpio-444 ( |heartbeat ) out lo
    16. gpio-473 ( |regulator-6 ) out lo
    17. gpiochip0: GPIOs 489-511, parent:platform/4201000.gpio, 4201000.gpio:
    18. root@ok6254:~#
    19. 方式1
    20. 使用内核的gpio-leds驱动
    21. root@ok6254:~# cd /sys/class/leds/
    22. root@ok6254:/sys/class/leds#ls
    23. heartbeat led1 led2 led3 mmc0:: mmc1:: mmc2::
    24. root@ok6254:/sys/class/leds#
    25. 进入其中一个led1
    26. root@ok6254:/sys/class/leds#cd led1/
    27. root@ok6254:/sys/class/leds/led1#ls
    28. brightness device max_brightness power subsystem trigger uevent
    29. root@ok6254:/sys/class/leds/led1#
    30. 设备树默认配置触发方式trigger为timer,此时的led是按照定时亮灭的,可以改成手动控制。
    31. root@ok6254:/sys/class/leds/led1#echo none > trigger 将方式改成正常模式
    32. root@ok6254:/sys/class/leds/led1#echo 1 > brightness 熄灭
    33. root@ok6254:/sys/class/leds/led1#echo 0 > brightness 点亮
    34. root@ok6254:/sys/class/leds/led1#

    方式1:

    使用内核的gpio-leds驱动

    1. root@ok6254:~# cd /sys/class/leds/
    2. root@ok6254:/sys/class/leds#ls
    3. heartbeat led1 led2 led3 mmc0:: mmc1:: mmc2::
    4. root@ok6254:/sys/class/leds#

    进入其中一个led1

    1. root@ok6254:/sys/class/leds#cd led1/
    2. root@ok6254:/sys/class/leds/led1#ls
    3. brightness device max_brightness power subsystem trigger uevent
    4. root@ok6254:/sys/class/leds/led1#

    设备树默认配置触发方式trigger为timer,此时的led是按照定时亮灭的,可以改成手动控制。

    1. root@ok6254:/sys/class/leds/led1#echo none > trigger 将方式改成正常模式
    2. root@ok6254:/sys/class/leds/led1#echo 1 > brightness 熄灭
    3. root@ok6254:/sys/class/leds/led1#echo 0 > brightness 点亮
    4. root@ok6254:/sys/class/leds/led1#

    方式2:

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

    关于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

    设置高低电平:

    1. root@ok6254:~# echo 1 >/sys/class/gpio/gpio432/value 置高
    2. root@ok6254:~# echo 0 >/sys/class/gpio/gpio432/value 拉低
    3. root@ok6254:~#

    4、A核如何调用M核的引脚并复用成GPIO?

    设备树配置:

    1. &mcu_pmx0 {
    2. mymcugpio1_pins_default:mymcugpio1-pins-default {
    3. pinctrl-single,pins= <
    4. AM62X_MCU_IOPAD(0x004,PIN_INPUT, 7)
    5. >;
    6. };
    7. };
    8. &mcu_gpio0 {
    9. pinctrl-names ="default";
    10. pinctrl-0=<&mymcugpio1_pins_default>;
    11. status = "okay";
    12. };

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

    1. ---a/arch/arm64/boot/dts/ti/OK6254-C.dts
    2. +++b/arch/arm64/boot/dts/ti/OK6254-C.dts
    3. @@ -166,7 +166,7 @@
    4. compatible= "gpio-leds";
    5. pinctrl-names= "default";
    6. pinctrl-0= <&usr_led_pins_default>;
    7. -
    8. + pinctrl-1 = <&mymcugpio1_pins_default>;
    9. led-0 {
    10. label= "heartbeat";
    11. gpios= <&main_gpio0 42 GPIO_ACTIVE_HIGH>;
    12. @@ -206,6 +206,14 @@
    13. led-pattern= <500 500>;
    14. default-state= "on";
    15. };
    16. +
    17. + led-5 {
    18. + label = "led5";
    19. + gpios = <&mcu_gpio0 1 GPIO_ACTIVE_HIGH>;
    20. + linux,default-trigger = "timer";
    21. + led-pattern = <500 500>;
    22. + default-state = "on";
    23. + };
    24. };

    控制方式与前面提到的方式1和方式2一样,至此GPIO的复位完成。

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

  • 相关阅读:
    Python基础知识
    PTA题目 最佳情侣身高差
    Vue3 实现网页背景水印功能
    vivo X系列为什么能不断拉高手机上限?
    facebook群控如何做?使用静态住宅ip代理有什么好处?
    比较两个相互垂直结构的迭代次数
    Django实现统一包装接口返回值数据格式
    Suricata – 入侵检测、预防和安全工具
    JavaScript 进阶03
    Linux内存管理 | 二、虚拟地址空间布局
  • 原文地址:https://blog.csdn.net/m0_46665078/article/details/127445324