通过Libsoc在嵌入式ARM简化GPIO调用

By Toradex胡珊逢

1). 简介

嵌入式设备往往会通过 GPIO 连接外设,从而实现通信、状态监测、控制等功能,用户需要操作特定的 GPIO。在 Linux 系统中,用户应用一般无法直接访问 SoC 的 GPIO 寄存器,而使用特定的引脚编号,然而不同ARM模块平台供应商的管脚定义和对应的GPIO编号有需要一个对应转换关系,使得整个GPIO调用比较复杂,本文就演示通过libsoc来简化这个操作,使用户在程序中可以直接使用ARM模块的管脚号码来调用对应的GPIO。

 

本文所演示的平台来自于Toradex Colibri iMX6 ARM嵌入式平台,这是一个基于NXP iMX6 ARM处理器,支持单核/双核Cortex-A9。

 

 

2. 准备

a). Colibri iMX6 ARM核心版配合Colibri Evaluation Board,连接默认调试串口UART1到开发主机方便调试。

 

b). 在未使用libsoc之前,例如 要调用Colibri iMX6 模块金手指上的 SODIMM55 引脚作为GPIO,其实际连接 iMX6 SoC 的 GPIO1_IO07,在 Linux 系统中的序号为 gpio7。用户需要对照 Colibri iMX6 datasheet GPIO 编号了解其对应关系,比较复杂,为了便于用户使用 GPIO,Toradex Linux BSP 自 v2.8b3 起添加了 libsoc 支持,用户可以直接用模块金手指编号操作对应的 GPIO,免去查找对应关系,下面就分别对应于BSP v2.8b3以及之前的BSP对如何使用libsoc进行说明。

 

 

3). V2.8b3 及后续 BSP

a). 自该版本开始,BSP 中已经包含了 libsoc 的库文件。用户只需要添加 libsoc.conf 配置文件以及为 SDK 增加编译应用所需的头文件等即可。SDK 安装方法请参考这里

 

b). SDK增加libsoc支持

./ 下载并编译 libsoc 源码

---------------------------

$ git clone https://github.com/jackmitch/libsoc.git

$ cd libsoc

$ ./home/ben/Toradex/DISK/LinuxSDK/v2.7-gcc6/SDK-GCC6/Colibri_iMX6/environment-setup-armv7at2hf-neon-angstrom-linux-gnueabi

$ autoreconf -i

$./configure ­--host=arm-angstrom-linux-gnueabi --prefix=/home/ben/Toradex/DISK/LinuxSDK/v2.8/imx6/sysroots/armv7at2hf-neon-angstrom-linux-gnueabi/ --enable-board=colibri-imx6 --with-board-configs

---------------------------

// --prefix 指向 SDK 中 rootfs 目录,根据实际使用的开发板设置 --enable-board

 

---------------------------

$ MACHINE=colibri-imx6 make -j3

$ make install

---------------------------

// MACHINE 也需要设置为对应的计算机模块,这里使用 colibri iMX6。

 

c). 下载并编译 libsoc 演示代码

---------------------------

$ git clone https://github.com/bhuvanchandra/libsoc-examples.git

$ cd libsoc-examples

$ cd io-ctrl

$ MACHINE=colibri-imx6 make

---------------------------

//注意:在执行 make 开始编译前,从这里下载 Makefie 文件替换 io-ctrl 目录下的同名文件。

 

// 代码 io.c 中直接使用 SODIMM_55 和 SODIMM_63 编号,SODIMM_55 设置为 GPIO 连接 LED,控制其亮灭,SODIMM_63 为输入引脚,连接轻触开关,检测按键情况。

---------------------------

gpio_interrupt = libsoc_gpio_request(libsoc_board_gpio_id(config, "SODIMM_63"), LS_GPIO_SHARED);

if (gpio_interrupt == NULL) {

perror("gpio request failed");

         goto exit;

}

 

gpio_led = libsoc_gpio_request(libsoc_board_gpio_id(config, "SODIMM_55"), LS_GPIO_SHARED);

if (gpio_led == NULL) {

         perror("led gpio request failed");

         goto exit;

}

---------------------------

 

c). 在Colibri iMX6上面部署测试

 

./ 在 Colibri Evaluation Board 上 SODIMM_55 连接 LED4,SODIMM_63 连接 SW6。

 

./ 复制配置文件到 Colibri iMX6

将 libsoc 下载目录中 contrib/board_files 文件夹内对应的配置文件复制到目标板的 /etc 目录,并重命名为 libsoc.conf。

 

./ 复制 libsoc 应用

将 io-ctrl 目录中编译成功文件 io 复制到目标板上。

 

./ 运行应用

按下 SW6,LED4 随着按键点亮或者熄灭。

---------------------------

root@colibri-imx6:~# ./io

Waiting for interrupt. Press 'q' and 'Enter' at any time to exit

Interrupt occurred 1 times

Interrupt occurred 2 times

---------------------------

 

 

4). V2.8b3 之前 BSP

a). 该版本之前的 BSP 并不包含 libsoc,用户需要下载源码交叉编译。

---------------------------

$ git clone https://github.com/jackmitch/libsoc.git

$ cd libsoc

$ ./home/ben/Toradex/DISK/LinuxSDK/v2.7-gcc6/SDK-GCC6/Colibri_iMX6/environment-setup-armv7at2hf-neon-angstrom-linux-gnueabi

$ autoreconf -i

$ ./configure --host=arm-angstrom-linux-gnueabi --prefix=/home/ben/Toradex/DISK/LinuxSDK/v2.7-gcc6/SDK-GCC6/Colibri_iMX6/sysroots/armv7at2hf-neon-angstrom-linux-gnueabi/ --enable-board=colibri-imx6 --with-board-configs

---------------------------

// --prefix 指向 SDK 中 rootfs 目录,根据实际使用的开发板设置 --enable-board

 

---------------------------

$ MACHINE=colibri-imx6 make -j3

$ make install

---------------------------

 

 

b). 复制 libsoc 库文件到目标板

SDK 安装目录中 sysroots/armv7at2hf-neon-angstrom-linux-gnueabi/lib/libsoc.so.2.4.2 文件复制到 Colibri iMX6 的 /lib,并创建下面链接

---------------------------

root@colibri-imx6:~# cd /lib

root@colibri-imx6:~# ln -s libsoc.so.2.4.2 libsoc.so.2

root@colibri-imx6:~# ln -s libsoc.so.2.4.2 libsoc.so

---------------------------

 

c). 剩下的部分和上面部署测试一致,这里就不赘述了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值