找回密码
 注册
关于网站域名变更的通知
查看: 240|回复: 1
打印 上一主题 下一主题

在i.MX9352上操作GPIO的方法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2023-5-16 14:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

01硬件原理分析

以点灯和按键为例,打开飞凌嵌入式OK-MX9352-C开发板的原理图,可以看到一颗LED灯,它由MX93_PAD_CCM_CLKO4控制。由于这一个GPIO属于1.8V电平域,所以在OK-MX9352-C开发板的底板上并没有直接将GPIO接到LED上,而是用GPIO控制了一个MOS管,再由MOS管去控制LED的亮灭——当GPIO电平为高时,MOS导通,LED点亮;当GPIO电平为低时,MOS关断,LED熄灭。


; _0 M& c- x; e4 d1 G

% x5 w* e7 L: ?) T9 ?; v7 n) h

02设备树引脚复用

打开飞凌嵌入式OK-MX9352-C开发板的设备树:

OKMX93-linux-kernel/arch/ARM64/boot/dts/freescale/OK-MX93-C.dts

在iomuxc节点下新建一组引脚复用,复用的两个GPIO分别是底板上的LED灯D6和按键K1。

8 l$ }0 w5 }% \' W# @

接下来新建一个GPIO节点,内容如下:


& @3 g, M5 m" Q; D

; @* v5 ~( j* i3 ]9 o. m2 n: B0 T: L

注释掉LED和KEY部分,防止复用冲突:

* M; ?! d0 ?; k% ^0 [% w3 ~


8 ^3 y. y0 g3 i2 `: |9 c) Y; k! w

保存退出后重新编译设备树。

执行环境变量:

forlinx@ubuntu:~/ok-mx93/OKMX93-linux-sdk$ . environment-setup-aarch64-toolchain

单独编译设备树:

forlinx@ubuntu:~/ok-mx93/OKMX93-linux-sdk/OKMX93-linux-kernel$ make ARCH=arm64 CROSS_COMPILE=aarch64-poky-linux- dtbs

编译完成后,单独更新设备树。首先将U盘插到虚拟机上,将生成的设备树文件拷贝到U盘:

forlinx@ubuntu:~/ok-mx93/OKMX93-linux-sdk/OKMX93-linux-kernel$ cp arch/arm64/boot/dts/freescale/OK-MX93-C.dtb /media/forlinx/2075-A0A7/


2 M& x4 z/ g% P. u5 w8 Z7 h/ R$ [

将生成的dtb文件使用U盘拷贝到OK-MX9352-C开发板上,替换掉:/run/media/Boot-mmcblk0p1/OK-MX93-C.dtb

root@ok-mx93:/run/media/Boot-mmcblk0p1# cp /run/media/sda/OK-MX93-C.dtb ./

重启OK-MX9352-C开发板。

03通过命令测试

在OKMX6ULL-S开发板中,操作GPIO的方式是通过操作/sys/class/gpio下的文件来实现的。而在OK-MX9352-C上,引入了新的Lingpiod的方式,而原有的基于sysfs的操作方式已经不再被支持。

Libgpiod是一种字符设备接口,GPIO访问控制是通过操作字符设备文件(比如/dev/gpiodchip0)实现的。OK-MX9352-C共有4组GPIO,可以在/dev下查看GPIO设备文件。

Libgpiod可以通过shell终端和C库两种方式使用,本节介绍在shell终端控制GPIO的方法,下一节我们将会介绍使用C库的方式控制GPIO。


' {" ]% y. M* ~2 F7 K$ V. l' K
5 k2 U, E6 N1 {4 _, S. ~' g

3.1 gpiodetect

查看所有GPIO设备

) ^; l5 ?1 b" J& W) Z7 s5 Y. c

这里的gpiochip0- gpiochip4分别对应的是设备树当中的GPIO1-GPIO4这四组GPIO,但是顺序并不是一一对应的,这是由于对应的寄存器地址顺序问题导致的。那么goiochip0如何跟设备树对应起来呢?我们可以打开设备树当中的dtsi文件,文件路径为:

OKMX93-linux-kernel/arch/arm64/boot/dts/freescale/imx93.dtsi

forlinx@ubuntu:~/ok-mx93/OKMX93-linux-sdk$ vi OKMX93-linux-kernel/arch/arm64/boot/dts/freescale/imx93.dtsi


: ^& |& l+ H7 @, T

查看GPIO3的寄存器基地址为:gpio3: gpio@43820080,对应的是gpiochip1,而GPIO4对应的是gpiochip2。

4 }5 P% x7 Q6 \, b# y* L- l1 L

; r6 l! h- V$ M4 D8 j+ ~; ?6 r

其余GPIO的对应关系如下,可供大家参考:

4 b( p9 }1 m: I% |. ^

6 |( a0 ]4 b5 y8 m. E
; j8 ]* [: q- A% U/ x3 E

/ x$ l. z  s* U; S

3.2 gpioinfo

由3.1可知,LED灯对应的是GPIO4,即gpiochip2;按键对应的是GPIO3,即gpiochip1。列出gpiochip2控制器的引脚情况:

, r- m0 w2 _8 v5 ?. \1 t

3.3 gpioset

该命令用于设置GPIO电平,2代表gpiochip2,即GPIO4,28是GPIO pin,当设置该GPIO为1时,底板上的D6点亮。

0 N6 k2 h' N) O

, g5 ?4 L5 a. H2 E) b' ~

3.4 gpioget

该命令用于获取GPIO引脚状态,以按键为例,按键对应的是GPIO3-27,即gpiochip1 27。按键没有按下时,读取到按键状态为1,当按键按下时,读到按键状态为0。


2 ?* X) o( S6 y; G$ q# R% ?# }

! }- P, [& L# q+ G5 f

3.5 gpiomon

监控GPIO的状态是否发生变化,同样以按键为例,当按键按下时:


2 U' @, T3 H. V6 {2 I8 N" g2 [# `7 R5 ~+ n3 Y2 g

04使用Libgpiod库编程

Libgpiod是用于与Linux GPIO交互的C库和工具,Linux官方于Linux 4.8 版本引入了Libgpiod的功能。而在OK-MX9352-C开发板搭载的Linux5.15内核版本中,已经不再支持sysfs的方式操作GPIO。与sysfs相比,Libgpiod更加可靠,具备更多功能,例如,可一次读写多个GPIO值。

4.1 源码获取

如果想要在PC上交叉编译出能够在开发板上运行的应用,则交叉编译时链接的库文件应该与开发板上的保持一致,可以直接把开发板上的库拷贝到开发环境进行使用。该库文件在开发板上的路径为:


3 M$ M4 d; _6 j) E8 c

从上图可以看出,Libgpiod库的版本为libgpiod.so.2.2.2,软链接到libgpiod.so.2。

在飞凌嵌入式提供的OK-MX9352-C开发板资料中,已经将所需的库文件、头文件以及相关例程进行了打包,用户可以直接使用。资料路径为:用户资料/应用笔记/ OK-MX9352-C-GPIO接口_Linux应用笔记/Libgpiod测试源码。咨询在线客服即可获取资料。

4.2 编译测试例程

将Libgpiod测试源码目录下的gpIoTest.c、gpio-toggle.c、lib.tar.bz2拷贝到开发环境中:

# T% L- U6 b7 |! K% _

将lib.tar.bz2解压到本目录下,编译时会使用到里边的gpiod.h文件和Libgpiod库文件:

) @  ~5 x! u; _, }2 U  P! Q, r, X

示例1循环控制LED亮和灭,时间间隔为1s

交叉编译gpio-toggle.c

设置环境变量(注意 . 后边有空格)

2 M" D# y3 G! y


2 m! g# ^& X+ l- G! N5 V5 E, a

交叉编译

8 W0 D% G! @  F% |

3 n3 [4 {- Y9 V* @& k5 n5 I

将可执行文件gpio-toggle拷贝到开发板中并执行可看到LED(D6)灯1s亮,1s灭。其中输入参数2、28为:gpiochip2 line28。


, |5 @3 ]& \; U5 o( a* m

示例2按键控制LED亮灭,每按一次状态翻转

交叉编译gpio-test.c

设置环境变量(注意点后边有空格)


  B& |  }. t2 [


% o/ n8 e: D9 {7 Y# Y  M3 g

交叉编译


% Y" v  `* ]% g' r" i5 a

将可执行文件gpio-test拷贝到OK-MX9352-C开发板中并执行,可看到每按一次按键,LED灯的状态就翻转一次,其中输入参数1、27为:gpiochip1 line27 ;2、28为:gpiochip2 line28。

% ?9 K# i% B- M4 h8 D

以上就是为OK-MX9352-C开发板配置GPIO的过程,希望能够对屏幕前的各位工程师小伙伴有所帮助。


7 V4 @0 g$ O% `/ X: h( E

该用户从未签到

2#
发表于 2023-5-16 14:48 | 只看该作者
现在STM32系列也很火
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-1 07:32 , Processed in 0.140625 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表