Blog:
Libsoc在Toradex模块的应用
嵌入式设备往往会通过 GPIO 连接外设,从而实现通信、状态监测、控制等功能,用户需要操作特定的 GPIO。在 Linux 系统中,用户应用一般无法直接访问 SoC 的 GPIO 寄存器,需要使用特定的引脚编号。而在 Toradex 计算机模块上,GPIO 在金手指上的编号方法和 Linux 系统以及 SoC 所有采用的命名方法各自均不相同。因此用户需要查找对应的关系。例如 Colibri iMX6 模块金手指上的 SODIMM55 引脚,其实际连接 iMX6 SoC 的 GPIO1_IO07,在 Linux 系统中的序号为 gpio7。用户需要对照 Colibri iMX6 datasheet 和 GPIO 编号了解其对应关系。
为了便于用户使用 GPIO,Toradex Linux BSP 自 v2.8b3 起添加了 libsoc 支持,用户可以直接用模块金手指编号操作对应的 GPIO,免去查找对应关系。 下面将介绍如何在 v2.8b3 和之前的 BSP 中使用 libsoc。
V2.8b3 及后续 BSP
自该版本开始,BSP 中已经包含了 libsoc 的库文件。用户只需要添加 libsoc.conf 配置文件以及为 SDK 增加编译应用所需的头文件等即可。SDK 安装方法请参考这里。
下载并编译 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。
下载并编译 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;
}
在 Colibri Evaluation Board 上 SODIMM_55 连接 LED4,SODIMM_63 连接 SW6。
复制配置文件到 Colibri iMX6
将 libsoc 下载目录中 contrib/board_files 文件夹内对应的配置文件复制到目标板的 /etc 目录,并重命名为 libsoc.conf。
复制 libsoc 应用
将 io-ctrl 目录中编译成功文件 io 复制到目标板上。
运行应用root@colibri-imx6:~# ./io
Waiting for interrupt. Press 'q' and 'Enter' at any time to exit
Interrupt occurred 1 times
Interrupt occurred 2 times
按下 SW6,LED4 随着按键点亮或者熄灭。
V2.8b3 之前 BSP
该版本之前的 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
复制 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
复制配置文件到 Colibri iMX6
将 libsoc 下载目录中 contrib/board_files 文件夹内对应的配置文件复制到目标板的 /etc 目录,并重命名为 libsoc.conf。
下载并编译 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;
}
在 Colibri Evaluation Board 上 SODIMM_55 连接 LED4,SODIMM_63 连接 SW6。
复制 libsoc 应用
将 io-ctrl 目录中编译成功文件 io 复制到目标板上。
运行应用
由于采用了交叉编译,在运行应用前需要指定 libsoc.conf 在目标板上的路径root@colibri-imx6:~# export LIBSOC_CONF=/etc/libsoc.conf
root@colibri-imx6:~# ./io
root@colibri-imx6:~# ./io
Waiting for interrupt. Press 'q' and 'Enter' at any time to exit
Interrupt occurred 1 times
Interrupt occurred 2 times
Libsoc 使得用户能够根据实际使用模块引脚的序号直观地操作 GPIO。除了 GPIO 外,libsoc 还可以访问 PWM、SPI、I2C 功能,并支持 python 调用。目前所有的 Toradex 的模块均已经支持 libsoc。