1.引言
有个使用NUC972的网友遇到一个问题:他需要把PD7当做GPIO使用,但是在配置PD7为GPIO时提示: Please Check GPIOD07's multi-function = 0x6 为了解决此问题,我花了一定时间,通过本篇文章把解决问题的方法记录下来,希望对大家也有所帮助。
2.环境介绍
2.1.硬件
1) 网上的一个第三方做的NUC972开发
2.2.软件
1) Uboot使用上一篇的,需要改动。
2) Kernel使用上一篇的,不需要改动。
3) Rootfs在上一篇基础上,不需要改动。
3.问题复现
通过查看原理图我们可以看到PD0-PD6是用作了SD卡接口,PD7是没有使用的,所以理论上这个引脚肯定是可以当做普通GPIO引脚使用的。
先在我的板子上试试看。 PD7对应的GPIO编号为0x67,输入下面这条命令,果然提示同样的问题。
echo 103 > /sys/class/gpio/export
4.解决方法
第一步:使用devmem指令 底层开发过程中,经常需要在终端查看或者修改设备寄存器的值, devmem,可用于读取或者修改物理寄存器的值,非常方便Usage: devmem ADDRESS [WIDTH [VALUE]] 比如我们要读取下面地址的内容 读取:在地址0x97000000读取32bit值(WIDTH默认等于32, 可选值为[8, 16, 32, 64]) # devmem 0x97000000 # 0x11111111 读取:在地址0x97000000读取16bit值 # devmem 0x97000000 16 # 0x111
通过阅读 NUC970_TechnicalReferenceManual_EN_Rev1.20.pdf文件
我们知道GPIOD的地址为0xB0000088,我们使用 devmem 0xB0000088 读取该地址的值
可以看到值为0x66666666,对应PD7引脚它的功能被设置为6了。
一种解决方式是我们直接写寄存器: devmem 0xB0000088 32 0x06666666 就可以了。 还有一种方法是在Uboot里修改: /board/nuvoton/nuc970/nuc970.c Board_mmc_init函数里,将下图红框中的0x66666666改为0x06666666.
重新编译烧录后,再使用echo 指令就不会再报错了。
5.结束语
本期给大家介绍了一个实际GPIO问题的解决方法,重点是devmem指令的使用,同时第一次阅读芯片寄存器。