GPIO 코드 컴파일(Build)

이제 실제 앱을 이용하여 BBB의 GPIO를 컨트롤해보자.

이전 글에서 만들었던 안드로이드 프로젝트 대신에 이미 구현이 되어 있는 첨부 파일을 사용할 것이다.

gpio.zip
1.73MB

이 첨부 파일 안에 라이브러리는 이전 글에서 만들었던 것과 동일한 so 파일이 담겨져 있다. 첨부 파일을 다운로드 받고 적당한 위치에 압축을 풀고 Eclipse ADT를 실행한다.

1. 'File' → 'Import'를 선택하고, 

2. 'Android' → 'Existing Android Code Into Workspace'를 선택 한 후, 'Next'를 누른다.

3. 하기 빨간 네모 안 'Browse'를 선택하여, 압축을 해제한 폴더 'gpio'를 클릭 한 후 '폴더선택' 버튼을 누른다.

4. 'Finish' 버튼을 눌러 끝낸다.

이제 프로젝트를 Build 하기 위해서 "gpio에서 오른쪽 클릭" → 'Run As'  'Android Applicaiton' 선택.

하지만, 보기 좋게 Error 발생.

이 Error에 대해서 검색을 해보니 다음과 같이 해결 방안을 찾을 수 있었다.

https://m.blog.naver.com/kkson50/221208277244

 

[문제해결] Unable to build: the file dx.jar was not loaded from the SDK folder

에러현상Eclipse ADT에서 발생한 에러입니다. Failed to load d:\Android\sdk\build-tools\26.0.2\li...

blog.naver.com

그래서 Eclipse에서 'Window → Android SDK Manager'를 실행.

Android SDK Build-tools 25.0.3을 체크하고 'install 1 package'를 실시.

Accept License를 체크하고 Install 버튼을 누른다.

인스톨을 마친 이후에 Eclipse SDK가 위치한 폴더로 이동 후 build-tools\25.0.3\lib\dx.jar 파일을 복사하여 build-tools\29.0.2\lib\dx.jar 파일을 대체 하도록 덮어 씌우기를 한다.

그 다음 다시 build를 실시하면 정상적으로 build가 완료된다.

그러나 Android Virtual Device(ADB)에서 다음과 같이 문제 발생. 우리가 만든 gpio 앱이 정지되었다.

이 문제는 ADB 설정시 Intel CPU로 셋팅을 해서 발생한 문제이다. 그래서 ARM CPU로 변경하였다.

그리고 다시 build 하면 정상적으로 GPIO 앱이 화면에 display 되는 것을 확인할 수 있다.

여기까지 컴파일(build)한 GPIO 코드가 Emulator에서 잘 동작하는 것을 확인했다.

 

GPIO 앱을 BeagleBone Black에 넣기

이제, BBB에 컴파일 하고 만들어진 앱(apk)를 넣는 일만 남았다.

넣는 방법은 이전에 hacktHAL을 BBB에 넣었던 것과 동일하게 ADB를 사용하는 것이다.

참고로, 하기 글을 참고하면 hacktHAL을 BBB에 어떻게 넣었는지 확인 할 수 있다.

2019/12/12 - [안드로이드 임베디드/Android for the BeagleBone Black] - Window10에서 ADB Tool을 이용하여 PacktHAL files을 동작하는 Beaglebone Black(BBB)에 넣기

 

Window10에서 ADB Tool을 이용하여 PacktHAL files을 동작하는 Beaglebone Black(BBB)에 넣기

지난번에 Ubuntu에 ADB를 인스톨했지만, 웬지 아직까지는 Window가 편한지라 Window를 이용해서 진행을 해보았다. Android Debug Bidge를 이용하여 현재 동작 중인 Beaglebone Black(BBB)에 PacktHAL files을 넣을..

decdream08.tistory.com

다음과 같은 순서로 실행을 하면 BBB에 adb 명령어를 이용하여 생성한 앱 즉, .apk 파일을 BBB에 넣을 수 있다.

1. 컴파일 후 생성된 .apk 파일을 확인한다. 안드로이드 프로젝트 안에 \gpio\bin 폴더 안에 있을 것이다. 본인의 경우는 하기 그림과 같이 확인 가능했다.

2. Window에서 CMD 창을 열고 adb.exe가 있는 파일로 경로를 변경 한다.

3. BBB 보드를 USB로 PC와 연결한 후 정상적으로 연결되어 adb 명령어를 사용할 수 있는지 다음과 같이 adb devices 명령어를 입력하여 확인 한다.

4. 정상적으로 BBBANDROID가 확인이 되었다면, adb install -d 명령어를 이용하여 #1의 경로에 있는 gpio.apk 파일을 BBB의 Android system에 install 한다.

adb install -d D:\02_Dev_Tools\01_Android\eclipse_workspace\gpio\bin\gpio.apk

위와 같이 Success가 보여진다면, 앱이 정상적으로 BBB에 install 되었다는 것이다.

실제로 BBB를 HDMI 케이블을 이용하여 모니터에 연결 하였을때 메인 화면에 gpio 앱이 깔려 있음을 확인 할 수 있었다.

그리고 마우스를 BBB에 연결하여 gpio 앱을 실행을 하면 다음과 같이 보여진다.

실제로 마우스로 Turn light on을 클릭하면 GPIO30인 P9의 11번 핀이 High로, Turn light off를 클릭하면 Low로 변경되는 것을 확인할 수 있었다.

- 끝.

Overview

바로 이전 글에서 ADB로 hacktHAL 관련 파일을 BBB에서 구동되는 Android image에 넣고, ADB Shell을 이용하여 GPIO를 컨트롤해보았다.

2019/12/18 - [안드로이드 임베디드/Android for the BeagleBone Black] - BeagleBone Black에서 GPIO Control 하기

 

BeagleBone Black에서 GPIO Control 하기

하기와 같이 지난 번에 Window10에서 ADB를 이용하여 BeagleBone Black(BBB)에 PacktHAL 파일들을 넣었다. 2019/12/12 - [안드로이드 임베디드/Android for the BeagleBone Black] - Window10에서 ADB Tool을 이용..

decdream08.tistory.com

이번에는 제목 그대로 Eclipse ADT를 이용하여 실제 Android App을 만들어 BegaleBone Black(BBB)의 GPIO를 컨트롤 하려고 한다.

지난번과 동일하게 Header P9의 핀11(P9.11)과 핀13(P9.13)을 각각 Mode7 설정으로 GPIO30과 GPIO31로 사용할 예정이다.

GPIO를 Control 하기위해서는 PacktHAL(muxed GPIO)을 안드로이드앱에 포함시키는 작업을 해야한다. 그러기위해서는 PacktHAL은 공유된 라이브러리로 .apk 파일 안에 앱과 함께 넣어져야 하며, 공유된 라이브러리로 PacktHAL을 만들려면  java code와는 별도로 분리하여 build를 실행해야 한다.

즉, PacktHAL code는 C native code로 구현됐기에, Android NDK 내부에 제공된 특정 hardware architecture(ARM) Tool chain을 이용하여 build 된다.

참고로, 이렇게 build된 C native code는 Java Native Interface(JNI)를 통해 앱의 Java code에 의해 호출이된다. JNI는 C 데이터 타입을 Java 데이터 타입으로 또는 그 반대로 번역을 해주는 역할을 한다.

Android NDK 다운로드

PacktHAL code를 컴파일 하기 전에, Android NDK를 다음 링크를 이용하여 Download 받아야 한다.

https://developer.android.com/ndk/downloads?hl=ko

 

NDK 다운로드  |  Android NDK  |  Android Developers

개발 플랫폼에 맞는 NDK 패키지를 선택합니다. NDK 최신 버전 및 이전 버전의 변경사항에 관한 정보는 NDK 업데이트 기록을 참조하세요. 안정적인 최신 버전(r20) 플랫폼 패키지 크기(바이트) SHA1 체크섬 Windows 32비트 android-ndk-r20-windows-x86.zip 814417431 b605f7e2e7585af2fc9d59fe9ddad86b64b2bf03 Windows 64비트 android-ndk-r20-windows-x86

developer.android.com

링크가 걸린 페이지를 열고, 제일 밑으로 가면 이전 Version의 NDK를 다운로드 받을 수 있다. 하기의 빨간 네모 안 참고.

최신 버젼이 아닌 이전 버젼을 다운로드 받으려는 이유는, NDK r17 부터 armeabi(ARM v5) 지원을 중단했기 때문이다.

우리가 사용 할 BBB의 Arm core에 대한 지원이 되지 않기때문에, 이전 버젼을 다운받는 것이다.

여튼, 'NDK 자료실'을 클릭하면 하기와 같이 빨간색 네모 안의 '약관에 동의합니다'를 선택한다.

그러면, 여러가지 버젼을 다운 받을 수 있는 곳으로 이동한다. 여기서 본인은 Window10용 Android NDK, 버전 15c를 다운 받았다.

Download 받은 압축된 파일을 PC의 적당한 곳에 풀어 놓았다.

NDK 압축을 해제한 폴더에 SPI 드라이버에 대한 Header 파일을 넣어 두어야 한다. 해당 Header 파일은 첨부 파일로 넣어 두었으니 참고하면 되겠다.

spi.zip
0.00MB

SPI에 대한 Header 파일을 NDK가 깔려있는 위치에서(본인은 'D:\02_Dev_Tools\01_Android\android-ndk-r15c' 이다) 서브 디렉토리인 다음과 같은 경로로 옮기면 된다.

NDK가 있는 폴더\android-19\arch-arm\usr\include\linux

참고로, android-19를 사용하는 이유는 BBB에 올라가 있는 Android version이 Kitkat이고 그에 대한 API Level이 19이기 때문이고, arch-arm인 이유는 BBB의 CPU core가 ARM이기 때문이다.

정상적으로 잘 따라 했다면, linux 폴더에 spi 폴더가 생성이되고, spi 폴더 안에 spidev.h 파일이 있을 것이다.

 

PacktHAL 컴파일

자, 이제 PacktHAL code를 컴파일 하고, 그리고 나서 라이브러리 형태로 앱에 포함하는 것을 연습해 보겠다.

1. eclipse를 열어 'File → New → Android Application Project'를 선택하여 새로운 프로젝트를 하나 만들고, 그 프로젝트 경로를 잘 숙지한다. 본인은 경우는 그 경로는 'D:\02_Dev_Tools\01_Android\eclipse_workspace\myapp\jni'이다.

2. PacktHAL 폴더 안에 jni 폴더를 복사하여 #1에서 만든 프로젝트 경로에 붙여 넣기 한다. 참고로 jni 폴더는 첨부 파일로 넣어 두었으니 참고하면 되겠다. 또 참고로, jini 폴더 안에 있는 파일은 하드웨어를 access하기 위해 만든 c파일들이다.

jni.zip
0.01MB

3. Window에서 CMD 창을 열고 #1에서의 프로젝트 경로로 이동 한후, #2에서 복사한 jni 폴더로 이동을 한다.

4. 해당 디렉토리에서 Andorid NDK를 이용하여 PacktHAL을 빌드한다. 빌드하는 방법은 Android NDK 경로에 있는 ndk-build를 호출하면 된다. 따라서 본인의 경우는 ndk-build가 있는 경로가 'D:\02_Dev_Tools\01_Android\android-ndk-r15c\ndk-build"이므로, 하기와 같이 입력을 하였다.

이제 컴파일이 제대로 되었는지 확인을 해보자.

안드로이드 프로젝트를 생성한 폴더에서 'libs' 폴더를 들어가 보면 여러 개의 폴더가 생성된 것을 알수가 있다. 눈치가 빠른 사람이라면 우리가 jni를 NDK로 컴파일 할때 나온 메세지들과 관련된 폴더들이라는 것을 알 수 있을 것이다.

우리 Target board인 BBB에 해당 되는 TArget은 'ameabi'이므로, 그 폴더에 들어가서 'libpacktHAL.so' 파일이 하기와 같이 정상적으로 생성되었는지를 확인하면 된다.

이 라이브러리를 Android Project에 넣어 사용하면, 실제 안드로이드 앱에서도 라이브러리 안에 jni 폴더의 c 파일들을 이용하여 하드웨어를 제어 할 수 있게된다.

- 계속...

하기와 같이 지난 번에 Window10에서 ADB를 이용하여 BeagleBone Black(BBB)에 PacktHAL 파일들을 넣었다.

2019/12/12 - [안드로이드 임베디드/Android for the BeagleBone Black] - Window10에서 ADB Tool을 이용하여 PacktHAL files을 동작하는 Beaglebone Black(BBB)에 넣기

 

Window10에서 ADB Tool을 이용하여 PacktHAL files을 동작하는 Beaglebone Black(BBB)에 넣기

지난번에 Ubuntu에 ADB를 인스톨했지만, 웬지 아직까지는 Window가 편한지라 Window를 이용해서 진행을 해보았다. Android Debug Bidge를 이용하여 현재 동작 중인 Beaglebone Black(BBB)에 PacktHAL files을 넣을..

decdream08.tistory.com

정상적으로 PacktHAL을 BBB에 넣었다면, ADB Shell을 이용하여 PacktHAL에 의해 output으로 설정된 GPIO30을 컨트롤 할 수 있다.

아래 BeagleBoard Manual(https://cdn-shop.adafruit.com/datasheets/BBB_SRM.pdf)에서 발췌한 P9 connector에 대한 자료에서 보듯이, GPIO30은 BBB 보드의 P9 connector에서 11번 핀이다(P9.11).

이제, Eclipse에서 사용하는 ADB.exe가 위치한 경로를 파악한다. 본인의 경우는 경로가 D:\02_Dev_Tools\01_Android\eclipse_SDK\platform-tools이다.

윈도우에서 CMD 창을 열고 ADB.exe가 위치한 경로로 이동한 후, BBB를 USB케이블로 PC와 연결한다.

BBB가 정상 부팅이 된 후, 아까 열었던 윈도우 CMD 창에서 하기와 같이 adb devices를 입력하여 현재 연결된 Android 기기를 검색한다.

BBB가 정상적으로 연결되었다면, 위의 그림과 같이 adb devices 명령어로 BBB가 검색이 될 것이다.

이제 준비는 마쳤고, 다음과 같은 순서로 명령어를 입력하면 된다.

   1. adb shell 을 입력한다.

$adb shell

   2. BBB의 gpio30 폴더로 이동한다.


root@beagleboneblack:/ # cd /sys/class/gpio/gpio30

3. echo CMD를 이용하여 강제로 GPIO30을 1(High)로 셋팅 한 후, 0(Low)로 셋팅 한다.

root@beagleboneblack:/ # echo 1 > value

root@beagleboneblack:/ # echo 0 > value

실제로 P9 커넥터의 11번 핀(GPIO30)이 default value인 Low에서 High로 셋팅되고, 그다음 다시 Low로 가는 것을 오실로스코프로 확인할 수 있었다.

참고로, PacktHAL에 의해 GPIO31은 input으로 설정이 되어 있으며, 다음 명령어를 사용하면 GPIO31의 값을 읽을 수 있다.

root@beagleboneblack:/ # cat value

 

- 끝.

지난번에 Ubuntu에 ADB를 인스톨했지만, 웬지 아직까지는 Window가 편한지라 Window를 이용해서 진행을 해보았다.

Android Debug Bidge를 이용하여 현재 동작 중인 Beaglebone Black(BBB)에 PacktHAL files을 넣을 수 있다.

참고로 본인은 Window10에서 이 작업을 실시하였다.

먼저 Eclipse에서 사용하는 ADB.exe가 위치한 경로를 파악한다. 본인의 경우는 경로가 D:\02_Dev_Tools\01_Android\eclipse_SDK\platform-tools이다.

윈도우에서 CMD 창을 열고 ADB.exe가 위치한 경로로 이동한 후, BBB를 USB케이블로 PC와 연결한다.

BBB가 정상 부팅이 된 후, 아까 열었던 윈도우 CMD 창에서 하기와 같이 adb devices를 입력하여 현재 연결된 Android 기기를 검색한다.

BBB가 정상적으로 연결되었다면, 위의 그림과 같이 adb devices 명령어로 BBB가 검색이 될 것이다.

이제 준비는 마쳤고, ADB Tool을 이용하여 PacktHAL 파일을 넣기위해 다음과 같은 명령어들을 하나씩 실행한다.

1. ADB를 통해 BBB의 Android 내부 Shell을 이용하여, BBB Android root filesystems을 read-only에서 read-write로 remount 한다.

$ adb shell

root@beagleboneblack:/ # mount -o rw,remount rootfs /

root@beagleboneblack:/ # exit

 

2. BBB의 Android root filesystem에 필요한 파일(BB-PACKTPUB-00A0.dtbo를 system/vendor/firmware에 그리고 init.genericam33xx(flatteneddevicetr.rc 파일은 root에)들을 넣는다.

본인의 경우 두 파일 모두 C:\Temp에 위치 시켰으므로 다음과 같이 명령어를 입력하였다.

$ adb push D:\Temp\BB-PACKTPUB-00A0.dtbo /system/vendor/firmware

$ adb push D:\Temp\init.genericam33xx(flatteneddevicetr.rc /

$ adb shell su -c "chmod 750 /init.genericam33xx*.rc"

3. BBB의 Android root filesystem안의 Shell로 Sync를 하고 read-only로 remount 해준다.

$ adb shell

root@beagleboneblack:/ # sync

root@beagleboneblack:/ # mount -o ro,remount rootfs /

root@beagleboneblack:/ # exit

이상으로 Android Debug Bidge(ADB)를 이용하여 현재 동작 중인 Beaglebone Black(BBB)에 PacktHAL files을 넣는 방법을 확인했다.

비글본 블랙에 안드로이드 이미지를 올리겠다.

이 이미지는 http://bbbandroid.sourceforge.net/에서 다운 받을 수 있다. 참고로 첨부 파일로 공유한다.

 

BBBAndroid: A custom Android OS for the BeagleBone Black

What is BBBAndroid? BBBAndroid is a port of AOSP Android KitKat 4.4.4 to the BeagleBone Black. Using the BeagleBone Black's custom Linux 3.8 kernel, BBBAndroid brings the BBB's "cape manager" functionality to the Android environment. This makes BBBAndroid

bbbandroid.sourceforge.net

비글본 블랙에 이미지를 올리기 위해서는 반드시 microSD 카드가 필요하다. 그리고 그 안드로이드에 이미지를 올리기 위한 Tool인 Win32 Disk Imager가 필요하다.

다음과 같은 순서로 이미지를 MicroSD카드에 굽는다.

1. bbbandorid의 옆 링크(또는 첨부한 이미지를 이용)를 통해 https://sourceforge.net/projects/bbbandroid/files/latest/download 안드로이드 이미지를 다운 받을 수 있다. 

2. RAR로 압축이 되었으므로, www.rarlab.com 에서 툴을 다운받아 이미지 압축을 해제하면 된다.

3. 압축된 이미지를 SD 카드에 굽기 위해서는 Win32 Disk Imager 툴이 필요하다. http://sourceforge.net/projects/win32diskimager 를 통하여 툴은 다운 받아 설치하면 된다.

4. 준비된 SD 카드를 삽입하고, 만약 SD 카드가 파티션이 여러개로 나뉘어 있는 경우 다음 방법을 따른다.

  • 윈도우에서 "Window key + x"를 눌러서 디스크 관리를 선택
  • 디스크 관리에서 SD카드에 해당 되는 부분을 확인

  • 오른쪽(data (H:) 영역)에서 부터 왼쪽 순서로 boot까지 오른쪽 클릭 후 볼륨삭제를 실시한다.

  • 볼륨을 하기와 같이 모두 삭제 한다.

  • 할당되지 않은 14.42GB을 선택 후 오른쪽 클리하여 새 단순 볼륨을 만든다. 그 다음 나오는 "단순 볼륨 만들기 마법사" 창에서 순차적으로 다음을 여러번 선택 후 포맷까지 완료 한다.

5. MicroSD 카드에 이미지를 굽기 위해 Win32 Disk Imager 툴을 실행한다.

6. 툴에서 Device는 MicroSD 드라이브를 지정하고, Image File은 안드로이드 이미지가 저장된 경로를 지정한다. 그 다음 Wirte 버튼을 클릭하여 실행한다.

그 다음은 이미지를 포함한 MicroSD 카드를 BBB에 삽입 후 전원을 키기만 하면 끝이다.

Ubuntu v18.04에 ADB를 설치한다.

$ sudo apt-get install android-tools-adb android-tools-fastboot

위의 명령어를 Ubuntu의 terminal 창을 이용하여 입력한다.

그 다음 하기의 명령어를 이용하여 현재 접속되어 있는 안드로이드 기기를 검색한다.

$ adb devices

하지만... 나의 경우는 표시되는 list에 접속한 기기가 없다.

adb devices 명령어를 실행했을때 접속된 기기가 list에 없는 경우는 어떻게 해야 하는 걸까?

USB에 연결된 안드로이드 기기를 뺐다가 다시 연결을 했다. VMware에서 돌아가고 있는 Ubuntu에서 USB 장치를 Host로 연결할지 현재 돌아가고 있는 Ubuntu에서 연결할지를 물어본다.

당연히 현재 돌아가고 있는 Ubuntu에서 연결을 선택 한 후, 다시 명령어를 입력.

다행히도 정상적으로 인식이 되었다.

 

+ Recent posts