新闻  |   论坛  |   博客  |   在线研讨会
通过Libsoc在嵌入式ARM简化GPIO调用
toradex | 2018-08-24 12:33:11    阅读:254   发布文章

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 编号了解其对应关系,比较复杂,为了便于用户使用 GPIOToradex 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 连接 LED4SODIMM_63 连接 SW6

 

./ 复制配置文件到 Colibri iMX6

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

 

./ 复制 libsoc 应用

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

 

./ 运行应用

按下 SW6LED4 随着按键点亮或者熄灭。

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

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). 剩下的部分和上面部署测试一致,这里就不赘述了。


参与讨论
登录后参与讨论
推荐文章
最近访客