燕小飞 · 2022年10月31日 · 河北

TI AM6254关于GPIO的应用笔记-飞凌

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

b1aca606c36b05f5f44272bda57fa103_f_5f7ce2f528004b4d196a76de9963540a&t=png&o=&s=&v=1666265458.png

如果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章节有如下描述:
292b7f15011a09963b078178a2b832f4_f_92a92f9ecf096754af3434b60eefa92d&t=png&o=&s=&v=1666265458.png

AM6254的GPIO信号一共有两大组:分别是MAINDomain和MCUDomain,其中MAINDomain是A核的GPIO,有两组GPIO0和GPIO1,分别是92和52个引脚。
9282382fee345e7381252bec772acfaa_f_cb24bca46425f952bf2e4a082f109f98&t=png&o=&s=&v=1666265458.png

7ed0fa30158a19d0fcd1397bf305e016_f_06682c3139d1f1bad877467992c8fc62&t=png&o=&s=&v=1666265458.png

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

6072c6d2d05aa4ed4b5506cc2a065997_f_f54cfa4280f5a3647dc1716b60a3c524&t=png&o=&s=&v=1666265458.png

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

42a0d693ff2783870e04d478181ca905_f_9d8748f4a61f6a766e92628c302986cf&t=png&o=&s=&v=1666265458.png

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

root@ok6254:~# devmem2 0x000F41C0

/dev/mem opened.

Memory mapped at address0xffff969c0000.

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

root@ok6254:~#

5.1.2.3Pad Configuration Register Functional Description章节。

7cb58531e32abc678438a3a195e349c1_f_985bf0f3d1f5cb9aa1b2adb9bd8bc43d&t=png&o=&s=&v=1666265458.png

f029c3221000448412edb02e73d3a1c2_f_8a95895b90879f6fc21fc9e413174c57&t=png&o=&s=&v=1666265458.png

A核使用A核的引脚

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

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

8fd160f34f42a2b9c0715cccdf8efa05_f_ec6cee872e9b14fc40d842823dd70b47&t=png&o=&s=&v=1666265458.png
9065ea58a83c2f829edfa28c6bacfc14_f_79ab802df13c364a70272312039161fb&t=png&o=&s=&v=1666265458.png

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

用户空间如何控制GPIO

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

7d1c5caf845933f7a6fe91dbb0ca18b4_f_a5899ffd860f87083743b712ce8baff3&t=png&o=&s=&v=1666265458.png

方式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。

e3877722132b83a1dc2b04e0ad3fd824_f_159d6d28b95524f2f4582426923acac5&t=png&o=&s=&v=1666265458.png

6f4763f44fa73b0352edd3d4120ccb09_f_dfe26ed9bac266a3da9049388af48d83&t=png&o=&s=&v=1666265458.png

关于gpiochip的计算公式如下:
5a09c3e1fc7e1047a10e7401e040a112_f_35bd81fc9b16207fa46770a784e80336&t=png&o=&s=&v=1666265458.png

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

root@ok6254:~#echo432>/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也是类似,想要了解更详细的使用方式,大家可以关注后续的应用笔记。点击下图进入飞凌嵌入式官网,了解更多产品详情。

推荐阅读
关注数
6040
内容数
15
飞凌嵌入式:www.forlinx.com
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息