Electric Objects EO1을 다시 살려 미술 작품을 보여주는 디지털 액자로 쓰는 작업을 계속하고 있다. 지금까지는 PC에서 메트로폴리탄 미술관의 공개 작품 이미지를 내려받아 EO1 화면에 맞게 가공한 뒤, 로컬 웹 서버를 통해 Firefox에서 슬라이드쇼로 보여주는 방식을 사용했다. 이 방법은 이미 꽤 안정적으로 작동한다. 두 기기는 서로 동일한 Wi-Fi 네트워크 안에 있어야 한다.
![]() |
| 휴~ 힘들구나. 오늘 나의 기분을 잘 보여주는 그림. |
그러나 가능하면 EO1이 PC의 도움 없이 독립적으로 작동하게 만들고 싶었다. 그래서 USB 메모리에서 Linux를 부팅하는 방법도 시험해 보았고, 이번에는 원래 설치되어 있는 Android 4.4에서 USB 메모리를 직접 사용할 수 있는지도 조사해 보았다.
이 과정에서 먼저 해결해야 했던 것이 ADB(Android Debug Bridge)였다. EO1의 micro-USB 단자는 하나뿐이므로 PC와 ADB로 연결하면 OTG 마우스나 USB 메모리를 동시에 사용할 수 없다. 더구나 처음 ADB를 연결하면 다음 사진과 같이 Android가 RSA 인증을 요구하는데, 화면을 터치할 수도 없고 USB 포트는 이미 PC가 차지하고 있으니 OK 버튼을 누를 방법이 마땅치 않았다. USB 허브는 소용이 없다. 왜냐하면 PC가 호스트로 잡히기 때문이다. 여기에서 인증을 완료하지 못하면 ADB shell을 열거나 파일을 전송할 수 없고, ADB를 TCP 모드로 전환하여 Wi-Fi로 접속하는 것도 불가능하다.
![]() |
| 무슨 수로 체크박스를 표시하고 OK를 클릭한단 말인가? |
결국 이 문제를 해결하기 위해 작은 Android 앱을 하나 만들었다. Accessibility Service를 이용하여 USB debugging 승인 창이 나타났을 때 'Always allow from this computer'를 선택하고 OK 버튼을 눌러 주는 앱이다. Android Studio에서 APK를 빌드하여 EO1에 설치한 뒤 실제로 시험해 보니 제대로 작동했다.
그 결과 ADB 연결에 성공했고, 이어서 ADB를 TCP 5555 포트로 전환하여 Wi-Fi를 통한 접속도 가능하게 만들었다. USB 케이블을 뽑은 뒤에도 PC에서 EO1에 접속하여 shell을 사용할 수 있게 된 것이다. 다만 이 설정은 재부팅 후에는 유지되지 않아, 다시 무선 ADB를 사용하려면 USB로 연결하여 TCP 모드로 전환해야 한다.
여기서 뜻밖의 사실도 하나 발견했다.
uid=0(root) gid=0(root) context=u:r:shell:s0
EO1의 ADB shell이 처음부터 root 권한으로 실행되고 있었다. 별도의 rooting 작업이나 su 명령도 필요하지 않았다. 덕분에 시스템을 변경하지 않고도 커널과 USB 장치의 상태를 상당히 자세히 조사할 수 있게 되었다.
![]() |
| Shell을 열어서 EO1의 정체를 확인해 보았다. |
이제 무선 ADB를 유지한 채 EO1의 micro-USB 포트에 OTG 어댑터와 USB 메모리를 연결해 보았다. USB 메모리는 전혀 인식되지 않는 것처럼 보였지만 실제로는 그렇지 않았다. 커널 메시지를 확인해 보니 USB 장치 자체는 정상적으로 발견되고 있었다.
usb 1-1: new high speed USB device number 7 using fsl-ehci usb 1-1: device v23a9 pef18 is not supported
더 조사해 보니 이 장치는 class 08, subclass 06, protocol 50으로 인식되고 있었다. 즉 흔히 사용하는 표준 USB Mass Storage 장치임을 EO1이 정확히 알고 있었다. 문제는 그 다음 단계였다. USB 메모리를 block device로 취급하기 위해 필요한 SCSI 계층과 USB mass-storage 지원이 커널에 포함되어 있지 않았고, 따라서 /dev/sda와 같은 block device가 만들어지지 않았다.
마지막으로 실행 중인 EO1 커널의 /proc/config.gz를 꺼내 조사했다. 결정적인 설정은 다음과 같았다.
# CONFIG_SCSI is not set
즉 포맷이나 Android의 자동 마운트 기능에 문제가 있었던 것이 아니다. EO1의 기본 커널 자체가 일반적인 USB mass storage를 디스크로 사용하기 위해 필요한 SCSI 계층 없이 만들어져 있었다. 키보드와 마우스가 USB OTG에서 잘 작동하면서 USB 메모리만 사용할 수 없었던 이유도 이것으로 설명된다.
물론 커널을 다시 컴파일하는 방법도 있을 것이다. EO1은 i.MX6 계열의 ARM 프로세서를 사용하므로 PC의 Linux 환경에서 적절한 소스와 cross compiler를 이용하여 커널을 만들 수 있다. 그러나 단순히 미술 작품을 보여주기 위해 커널까지 교체하는 것은 일이 너무 커진다. 잘못된 커널을 내부 eMMC에 기록하면 멀쩡하게 작동하는 EO1을 부팅하지 못하게 만들 위험도 있다.
그런데 여기까지 조사하고 나니 훨씬 간단한 길이 보였다.
EO1에는 약 2.38 GB의 Android 사용자 저장공간이 있고, 현재 약 960 MB가 비어 있다. PC에 USB 케이블로 연결하면 이 공간을 볼 수 있으며, ADB를 이용해서도 파일을 복사할 수 있다. 그렇다면 굳이 USB 메모리가 필요할 이유가 없다.
PC | | adb push v EO1 내부 저장공간 | +-- images/ +-- metadata.json +-- exhibition.json | v EO1-Museum Android app | v 1080 x 1920 fullscreen display
현재 EO1-Museum은 MetBoot가 부팅 완료를 감지하여 Firefox를 실행하고, Firefox가 PC의 로컬 웹 서버에 접속하여 작품을 보여주는 구조이다. 이것도 잘 작동하지만 PC와 Wi-Fi가 항상 필요하다.
다음 단계에서는 아주 작은 Android 디스플레이 앱을 직접 만들어 볼 생각이다. 내부 저장공간의 특정 디렉터리에 있는 JPEG 이미지를 읽어 전체 화면으로 보여주고, 예를 들어 15초마다 다음 작품으로 넘어가게 하면 된다. 처음에는 그것만으로 충분하다.
잘 작동한다면 나중에 부팅 후 자동 실행, 작품 순서의 무작위화, 메타데이터 표시, 밝기 조절, 가로로 긴 작품의 천천히 움직이는 화면 같은 기능을 하나씩 더할 수 있다. 예전에 EO1을 위해 만들어진 오픈소스 Android 앱(spalt/EO1)의 코드도 참고할 수 있을 것이다.
재미있는 것은 여러 방향을 돌아본 끝에 오히려 구조가 단순해졌다는 점이다. Linux를 설치할 필요도 없고, USB 메모리를 인식시키기 위해 커널을 고칠 필요도 없다. 완성된 상태에서는 Firefox도, PC의 웹 서버도, 심지어 Wi-Fi도 필요하지 않을 수 있다.
그림을 내부 저장공간에 넣고 그것을 전체 화면으로 보여주는 Android 앱 하나.
어쩌면 그것이 내가 개발하는 EO1-Museum의 가장 자연스러운 모습일지도 모르겠다.



댓글 없음:
댓글 쓰기