1. 程式人生 > >通過Libsoc在嵌入式ARM簡化GPIO呼叫

通過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 隨著按鍵點亮或者熄滅。

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

[email protected]:~# ./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,並建立下面連結

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

[email protected]:~# cd /lib

[email protected]:~# ln -s libsoc.so.2.4.2 libsoc.so.2

[email protected]:~# ln -s libsoc.so.2.4.2 libsoc.so

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

 

c). 剩下的部分和上面部署測試一致,這裡就不贅述了。