Onion Omega2+의 C/C++ Cross Compile 환경에서 GPIO를 이용하기 위해서는 libugpio가 있어야 한다. libugpio는 toolchain을 빌드할때 같이 빌드 되어야 한다. 툴체인 빌드는 http://alnova2.tistory.com/1216 에서 포스팅 하였는데, 기본적으로 libugpio는 포함되어 있지 않다. 다음과 같이 libugpio에 대한 Makefile을 툴체인에 포함시킨다.
$mkdir [ToolChain Source Dir]/package/libs/libugpio
$cd [ToolChain Source Dir]/package/libs/libugpio
$wget https://raw.githubusercontent.com/openwrt/packages/master/libs/libugpio/Makefile
$cd [ToolChain Source Dir]
$make menuconfig
menuconfig에서 library를 선택해 들어가서 libugpio를 선택한다.
그리고 빌드한다.
$make -j4
빌드하고 나면 [ToolChain Source Dir]/staging_dir/target-mipsel_24kc_musl-1.1.16/usr/lib 에 libugpio라이브러리가 빌드되어 있다. 그리고 include 파일은 [ToolChain Source Dir]/staging_dir/target-mipsel_24kc_musl-1.1.16/usr/include/ugpio/ugpio.h 에 존재한다.
Eclipse에서 이용하려면 "Properties" -> "C/C++ Build" -> "Settings" 에서 "Cross G++ Compiler" 의 includes에 [ToolChain Source Dir]/staging_dir/target-mipsel_24kc_musl-1.1.16/usr/include/ 를 포함시켜야 하며, "Cross G++ Linker"의 "Library search path"에 [ToolChain Source Dir]/staging_dir/target-mipsel_24kc_musl-1.1.16/usr/lib 를 포함시켜 주고, "Libraries"에 ugpio를 설정해 준다.
GPIO C++ 예제는 다음의 사이트에서 구할 수 있다.
https://github.com/OnionIoT/c-cross-compile-example
다음은 main 함수에서 GPIO 0번에 대해서 입력을 체크하는 소스 코드이다. (#include <ugpio/ugpio.h>를 include 해줘야 함)
int main() { int rq,rv,gpio,value,i; gpio=0; if((rq=gpio_is_requested(gpio))<0){ cout<<"GPIO is already Requested"<<endl; exit(-1); } if(!rq){ if((rv=gpio_request(gpio,NULL))<0){ cout<<"GPIO Request Error:"<<rv<<endl; exit(-1); } } if ((rv = gpio_direction_input(gpio)) < 0) { cout<<"gpio_direction_input"<<endl; exit(-1); } printf("> begin reading GPIO%d\n",gpio); for (i = 0; i < 20; i++) { // read the gpio value = gpio_get_value(gpio); printf(" > Read GPIO%d: value '%d'\n", gpio, value); // pause between each read sleep(1); } // unexport the gpio if (!rq) { printf("> unexporting gpio\n"); if (gpio_free(gpio) < 0) { perror("gpio_free"); } } return 0; } |
버튼은 드음과 같이 A-C구간에 대해서 연결하거나 연결을 해제한다.
스위치는 다음과 같이 구성한다. button가 눌리지 않은 상태에서는 GND 가 입력되고, 눌리면 3.3 Voltage가 입력된다.
실제 구성한 사진이다.