飞凌嵌入式技术帖——i.MX9352的GPIO怎么用?

之前小编为大家介绍过在飞凌嵌入式i.mx6ull开发板上操作gpio的方法。本期,让我们一起走近i.mx9352处理器,深入了解这位i.mx系列新成员的gpio该如何操作,以及它与前辈i.mx6ull处理器又有哪些异同。
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熄灭。
 02 设备树引脚复用打开飞凌嵌入式ok-mx9352-c开发板的设备树:
okmx93-linux-kernel/arch/arm64/boot/dts/freescale/ok-mx93-c.dts
在iomuxc节点下新建一组引脚复用,复用的两个gpio分别是底板上的led灯d6和按键k1。
接下来新建一个gpio节点,内容如下:
注释掉led和key部分,防止复用冲突:
保存退出后重新编译设备树。
执行环境变量:
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/
将生成的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。
3.1 gpiodetect查看所有gpio设备
这里的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
查看gpio3的寄存器基地址为:gpio3: gpio@43820080,对应的是gpiochip1,而gpio4对应的是gpiochip2。
其余gpio的对应关系如下,可供大家参考:
3.2 gpioinfo由3.1可知,led灯对应的是gpio4,即gpiochip2;按键对应的是gpio3,即gpiochip1。列出gpiochip2控制器的引脚情况:
3.3 gpioset该命令用于设置gpio电平,2代表gpiochip2,即gpio4,28是gpio pin,当设置该gpio为1时,底板上的d6点亮。
3.4 gpioget该命令用于获取gpio引脚状态,以按键为例,按键对应的是gpio3-27,即gpiochip1 27。按键没有按下时,读取到按键状态为1,当按键按下时,读到按键状态为0。
3.5 gpiomon监控gpio的状态是否发生变化,同样以按键为例,当按键按下时:
 04 使用libgpiod库编程libgpiod是用于与linux gpio交互的c库和工具,linux官方于linux 4.8 版本引入了libgpiod的功能。而在ok-mx9352-c开发板搭载的linux5.15内核版本中,已经不再支持sysfs的方式操作gpio。与sysfs相比,libgpiod更加可靠,具备更多功能,例如,可一次读写多个gpio值。
4.1 源码获取如果想要在pc上交叉编译出能够在开发板上运行的应用,则交叉编译时链接的库文件应该与开发板上的保持一致,可以直接把开发板上的库拷贝到开发环境进行使用。该库文件在开发板上的路径为:
从上图可以看出,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拷贝到开发环境中:
将lib.tar.bz2解压到本目录下,编译时会使用到里边的gpiod.h文件和libgpiod库文件:
示例1
循环控制led亮和灭,时间间隔为1s
交叉编译gpio-toggle.c
设置环境变量(注意 . 后边有空格)
交叉编译
将可执行文件gpio-toggle拷贝到开发板中并执行可看到led(d6)灯1s亮,1s灭。其中输入参数2、28为:gpiochip2 line28。
示例2
按键控制led亮灭,每按一次状态翻转
交叉编译gpio-test.c
设置环境变量(注意点后边有空格)
交叉编译
将可执行文件gpio-test拷贝到ok-mx9352-c开发板中并执行,可看到每按一次按键,led灯的状态就翻转一次,其中输入参数1、27为:gpiochip1 line27 ;2、28为:gpiochip2 line28。
以上就是为ok-mx9352-c开发板配置gpio的过程,希望能够对屏幕前的各位工程师小伙伴有所帮助。

TWS蓝牙耳机充电仓方案ETA9697:1uA低功耗, 耐压20V
华为Mate 30 Pro电池容量曝光采用了一块4500mAh的大电池
中移动5G商用仪器仪表采购项目招标,却遭美企作恶
曝Redmi K30 Pro变焦高配版除了镜头之外与标配版没有太大区别
激光重熔技术制备细晶高强中熵合金!
飞凌嵌入式技术帖——i.MX9352的GPIO怎么用?
江铜贵溪冶炼厂携手海康威视 为“新智造”增效升级
压敏电阻及其选型
为什么要进行车间粉尘监测?车间粉尘监测系统具备哪些功能?
消防设备电源监控系统在商业中心的应用
AGM 5G三防新机来袭:启用国产自研芯片
区块链概念股有哪些
VR消防实景体验正在不断推广
激光打标机:从不同应用到各个领域的多功能标记设备
中科曙光为百度飞桨黑客马拉松活动提供海量算力支持
选购视频会议系统时应该考虑的几大问题
华为mate10什么时候上市?华为mate10最新消息:华为mate10即将发布!全力狙击苹果iphone8,直击三星Note8
配备支持5G的Snapdragon 865的IQOO 3将于2月25日在印度推出
AiP485低功耗RS485/RS422收发器,替换LTC485、SP485等,性价比超高
基于可编程霍尔芯片,适用于低带宽应用的微型电流传感器