文章目录
- 目的
- 使用参考与演示
- 使用参考
- 存在的问题
- 问题定位
- 修改设备树
- 使用测试
- 总结
- 设备树文件内容
目的
GPIO是最基础的外设,使用频率也非常高,这篇文章将简单体验在NUC980 Liunx用户应用中使用GPIO功能。
这篇文章中内容均在下面的开发板上进行测试:
《新唐NUC980使用记录:自制开发板(基于NUC980DK61YC)》
开发板中提供了两组共四个直连到GPIO口上的轻触按钮和发光二极管,可以方便地进行GPIO功能测试:
这篇文章是在下面文章基础上进行的:
新唐NUC980使用记录(5.10.y内核):访问以太网(LAN8720A) & 启用SSH
使用参考与演示
使用参考
在用户应用中使用GPIO完全可参考之前的文章:
新唐NUC980使用记录:在用户应用中使用GPIO
根据上面文章这里用到的几个GPIO口编号换算如下:
PB13 = 32 x 1(PA) + 13 = 45
PF10 = 32 x 5(PA/PB/PC/PD/PE) + 10 = 170
PE10 = 32 x 4(PA/PB/PC/PD) + 10 = 138
PE12 = 32 x 4(PA/PB/PC/PD) + 12 = 140
存在的问题
前面的文章中有一些引脚和其它功能有冲突,通过修改内核选项来避开冲突。这篇文章中因为 5.10.y内核 默认使用设备树了,所以通过修改设备树来处理该问题。首先尝试下看看会有哪些引脚有冲突:
可以看到除了 PF10 ,其它引脚都被占用了。
问题定位
查看内核目录下 arch/arm/boot/dts/nuc980.dtsi
文件,可以看到相关引脚引用情况:
上面 pins = < ... >
中每一行代表一个 pin 。每个 pin 第一个值表示第几组,GPIOA = 0、GPIOB = 1、GPIOC = 2,以此类推;第二个值表示这组的第几个口,这里0xD=13,结合前面的这个 pin 就是 PB13 ;第三个值表示 multi-function ,可以看到这里等于2,和前面冲突信息中一致。
可以看到 PB13 默认是被用于 外部中断2 了。
同样方法我们可以找到 PE10 和 PE12 :
可以看到PE10和PE12被usbh_ehci占用了。
修改设备树
定位到问题之后就可以处理的,这里修改我们使用的设备树文件 nuc980-dev-v1.0.dts
:
# cd ~/nuc980-sdk/NUC980-linux-5.10.y/
gedit arch/arm/boot/dts/nuc980-dev-v1.0.dts
内容修改要点如下(完整的文件可以参考本文结尾):
/ {
apb {
gpio: gpio@b0004000 {
pinctrl-0 = <>;
eint2-config = <0 0 0>;
eint3-config = <0 0 0>;
};
};
ahb {
usbh_ehci@b0015000 {
pinctrl-0 = <>; /*disable PWREN and OVC*/
ov_active = <1>; /*disable PWREN and OVC*/
status = "okay";
};
};
};
修改完成后编译:
# 设置编译工具链
# export ARCH=arm; export CROSS_COMPILE=arm-buildroot-linux-gnueabi-
# export PATH=$PATH:/home/nx/nuc980-sdk/buildroot-2023.02/output/host/bin
# 编译生成设备树文件
make dtbs
# 编译完成后拷贝到电脑上再拷贝到SD卡中
# sudo cp arch/arm/boot/dts/nuc980-dev-v1.0.dtb /media/sf_common/
# 我这里开发环境和开发板在同一局域网中,所以可以直接通过网络将dtb文件拷贝到开发板上
# 在开发板中挂载boot分区
# mount /dev/mmcblk0p1 /mnt/
# 在ubuntu中使用scp命令拷贝dtb文件到开发板上
# scp arch/arm/boot/dts/nuc980-dev-v1.0.dtb root@192.168.31.142:/mnt/
# 拷贝完成后重启开发板即可测试
# reboot
使用测试
使用的方式参考之前文章即可,这里稍微演示下几个引脚的导出,证明前面调整确实解决了冲突:
总结
GPIO是最基础的外设,使用频率非常高,同时在用户应用中使用GPIO也是比较简单的,基础的使用参考上面这些内容就差不多了。
设备树文件内容
/*
* Device Tree Source for NUC980 DEV board
*
* Copyright (C) 2018 Nuvoton Technology Corp.
*
* The code contained herein is licensed under the GNU General Public
* License. You may obtain a copy of the GNU General Public License
* Version 2 or later at the following locations:
*
* http://www.opensource.org/licenses/gpl-license.html
* http://www.gnu.org/copyleft/gpl.html
*/
/dts-v1/;
#include "nuc980.dtsi"
/ {
model = "Nuvoton NUC980 DEV V1.0";
compatible = "nuvoton,nuc980-dev-v1.0", "nuvoton,nuc980";
chosen {
bootargs = "console=ttyS0,115200n8 noinitrd rootfstype=ext4 root=/dev/mmcblk0p2 rw rootwait mem=64M";
};
apb {
uart1: serial@b0071000 {
status = "disabled";
};
uart2: serial@b0072000 {
status = "disabled";
};
uart3: serial@b0073000 {
status = "disabled";
};
uart4: serial@b0074000 {
status = "disabled";
};
uart5: serial@b0075000 {
status = "disabled";
};
uart6: serial@b0076000 {
status = "disabled";
};
uart7: serial@b0077000 {
status = "disabled";
};
uart8: serial@b0078000 {
status = "disabled";
};
uart9: serial@b0079000 {
status = "disabled";
};
can0: can@b00a0000 {
status = "disabled";
};
can1: can@b00a1000 {
status = "disabled";
};
rtc: rtc@b0041000 {
status = "disabled";
};
gpio: gpio@b0004000 {
pinctrl-0 = <>;
eint2-config = <0 0 0>;
eint3-config = <0 0 0>;
};
nadc: nadc@b0043000 {
status = "disabled";
};
pwm0: pwm@b0058000 {
status = "disabled";
};
pwm1: pwm@b0059000 {
status = "disabled";
};
etimer0: etimer0@b0050000 {
status = "disabled";
};
etimer1: etimer1@b0050100 {
status = "disabled";
};
etimer2: etimer2@b0051000 {
status = "disabled";
};
etimer3: etimer3@b0051100 {
status = "disabled";
};
i2c0: i2c0@b0080000 {
status = "disabled";
};
i2c1: i2c1@b0081000 {
status = "disabled";
pinctrl-0 = <&pinctrl_i2c1_PB>;
};
i2c2: i2c2@b0082000 {
status = "disabled";
pinctrl-0 = <&pinctrl_i2c2_PB>;
};
};
ahb {
usbh_ehci@b0015000 {
pinctrl-0 = <>; /*disable PWREN and OVC*/
ov_active = <1>;/*disable PWREN and OVC*/
status = "okay";
};
usbh_ohci@b0017000{
status = "okay";
};
usbdev@b0016000 {
status = "okay";
};
fmi@b0019000 {
status = "disabled";
};
sdh@b0018000 {
status = "okay";
};
emac0@b0012000 {
status = "okay";
};
emac1@b0022000 {
status = "disabled";
};
ccap0@b0024000 {
status = "disabled";
};
i2c_gpio0: i2c-gpio-0 {
status = "disabled";
};
ccap1@b0014000 {
status = "disabled";
};
i2c_gpio1: i2c-gpio-1 {
status = "disabled";
};
dma@b0008000 {
status = "okay";
};
i2s: i2s@b0020000 {
status = "disabled";
};
i2s_pcm: i2s_pcm {
status = "disabled";
};
sound {
compatible = "nuvoton,nuc980-audio";
i2s-controller = <&i2s>;
i2s-platform = <&i2s_pcm>;
status = "disabled";
};
ebi: ebi@b0010000 {
status = "disabled";
};
};
};