uboot 2020版本下gpio命令的使用 + linux下的libgpiod lib库的移植使用
第一大部分 uboot下的gpio
1.在uboot命令行中想要支持gpio的命令,需要打开如下宏
CONFIG_CMD_GPIO=y
2.选用gpio引脚,作为测试引脚
2.1 查看电路原理图,选用那种soc不和mcu连接的pin,这样可以避免mcu的干扰。
2.2 查看pinmux的配置文件pinmux.h,选用目前已经被复用为gpio的pin管脚。
0x049BC418, 0x00060094, /* PadName = I2C9_SDA Fuction = GPIO0_A29 */ 0x049BC80C, 0x00060094, /* PadName = SDIO_DAT3 Fuction = GPIO0_A14 */ 0x049BC818, 0x00060094, /* PadName = SDIO_DAT2 Fuction = GPIO0_A13 */
目前ball name SDIO_DAT2,SDIO_DAT3,I2C9_SDA已经被pinmux成gpio管脚,也就是说 这几个ball管脚已经被内部连接到gpio controller模块。
我们就以这三个管脚为例,进行实验。
3.在uboot command中设置管脚输出高/低,并用逻辑分析仪进行查看
在本soc中gpio分为0、1、2三组,每组有32个gpio,做如下约定N为gpio的编号,p为组号取值范围为0、1、2,可以得到 N=p*32+offset。以GPIO0_29为例计算gpio的编号,可以知道
p=0, offset为29,N=0*32+29=29.


4.根据uboot command gpio命令,我们可以追踪到源码,发现其核心的实现是基于如下几个函数
gpio_request
gpio_direction_output
gpio_get_value
附录1:即使是配置成输出模式,也是可以通过gpio_get_value获取现在的值是多少。
我曾经做过如下实验,
将某个gpio设置成输出,并设置成输出逻辑1,由于我在外围电路上强制将其硬线连接到GND地,所以uboot gpio command会告诉我设置失败。
设置输出为0或者1的逻辑是 先设置并获取其值,如果不一致,就通过打印 报 错误信息。
附录2:通过研究步骤4中函数的代码实现,最终就是 设置gpio controller对应的寄存器。
所以 我们应该是也可以通过uboot中md和mw命令来读写寄存器直接进行设定。由于时间关系,目前尚未验证。
第二大部分 linux下的libgpiod
1.移植的版本
https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/snapshot/libgpiod-v1.6.x.tar.gz
2.编译方法
./autogen.sh --enable-tools=yes --host=arm-linux-gnueabihf --prefix=/home/zhongshan/zhongshan_test/libgpiod_install_path
3.查看编译出来的工具集合gpiodetect依赖的库,以及库本身所依赖的库。确认板子上目前是否有这些被依赖的库。

4.执行如下命令,并通过mcu输出方波到soc的GPIO2_A8,观察如下打印
gpiomon --num-events=3 --rising-edge gpiochip2 8 event: RISING EDGE offset: 8 timestamp: [949336016.966726520] event: RISING EDGE offset: 8 timestamp: [949336018.966762854] event: RISING EDGE offset: 8 timestamp: [949336020.966797355]
总结:在uboot下是用一个总的N, number号来指明是哪个gpio管脚,需要转换
而下linux下是用 哪个group 哪个脚,不需要进行转换。

浙公网安备 33010602011771号