이지랑드로랑 - 6장. System Halted 문제 해결하기
[그림5-3. System Halted?! 허억! 뭐지!]
우리가 저번 시간에 보고 끝을 냈던 슬픈 화면이네요.
콘솔을 연결해서 보면 System Halted 라는 메시지가 나면서 보드가 꺼져버리는... 정말 슬프죠.
오늘은 이 문제를 해결해 보도록 합시다.
일단 문제의 원인을 알아야겠죠?
뭘까요? ... 흐으음~
[그림6-1. Battery! 전지! 배터리!]
정답은 바로 배터리에 있었습니다.
안드로이드는 휴대폰 운영체제이기 때문에 당연히 배터리에 대한 처리가 되어 있죠.
그러나 우리의 이지보드는 개발용 보드입니다.
기본적으로 배터리가 '지원되지 않됨' 입니다. (배터리 장착 문의 좋지 않아요. ^^)
개발자가 추가적으로 배터리를 달아주지 않는 이상 이지보드는 5V 어탭터를 이용합니다.
자, 그렇다고 우리가 여기서 GG 를 치고 안드로이드를 포기하면 안되겠죠?
배터리를 가짜로 하나 만들어 보도록 할까요?
안드로이드 소스를 좀 볼 필요가 있습니다.
# vi {Android_SRC}/frameworks/base/services/jni/com_android_server_BatteryService.cpp
네, 안드로이드 프레임워크에 있는 JNI 하나를 수정해 보는거에요.
파일 이름에서도 알수 있듯, 베터리 서비스에 관련된 사항 입니다.
소스코드를 열자마자 아래와 같은 부분을 볼수 있습니다.
#define AC_ONLINE_PATH "/sys/class/power_supply/ac/online" #define USB_ONLINE_PATH "/sys/class/power_supply/usb/online" #define BATTERY_STATUS_PATH "/sys/class/power_supply/battery/status" #define BATTERY_HEALTH_PATH "/sys/class/power_supply/battery/health" #define BATTERY_PRESENT_PATH "/sys/class/power_supply/battery/present" #define BATTERY_CAPACITY_PATH "/sys/class/power_supply/battery/capacity" #define BATTERY_VOLTAGE_PATH "/sys/class/power_supply/battery/batt_vol" #define BATTERY_TEMPERATURE_PATH "/sys/class/power_supply/battery/batt_temp" #define BATTERY_TECHNOLOGY_PATH "/sys/class/power_supply/battery/technology"
이 부분을 아래와 같이 수정 합니다.
#define AC_ONLINE_PATH "/junk_battery/class/power_supply/ac/online" #define USB_ONLINE_PATH "/junk_battery/class/power_supply/usb/online" #define BATTERY_STATUS_PATH "/junk_battery/class/power_supply/battery/status" #define BATTERY_HEALTH_PATH "/junk_battery/class/power_supply/battery/health" #define BATTERY_PRESENT_PATH "/junk_battery/class/power_supply/battery/present" #define BATTERY_CAPACITY_PATH "/junk_battery/class/power_supply/battery/capacity" #define BATTERY_VOLTAGE_PATH "/junk_battery/class/power_supply/battery/batt_vol" #define BATTERY_TEMPERATURE_PATH "/junk_battery/class/power_supply/battery/batt_temp" #define BATTERY_TECHNOLOGY_PATH "/junk_battery/class/power_supply/battery/technology"
이렇게 바꾸는 것은 베터리 관리 프로그램이 참조하는 위치를 속이기 위해서 그렇습니다.
자, 그리고 아래와 같이 디렉토리를 생성해 줍니다.
[그림6-2. junk_battery 디렉토리 구조]
그리고 각 디렉토리 안에 참조되는 파일을 생성해 줍니다.
아래 명령어들을 그냥 쭉 사용하시면 될듯 합니다.
# cd {My_Workspace} # mkdir junk_battery # mkdir junk_battery/class # mkdir junk_battery/class/power_supply # mkdir junk_battery/class/power_supply/ac # mkdir junk_battery/class/power_supply/usb # mkdir junk_battery/class/power_supply/battery # touch junk_battery/class/power_supply/ac/online # touch junk_battery/class/power_supply/usb/online # touch junk_battery/class/power_supply/battery/status # touch junk_battery/class/power_supply/battery/health # touch junk_battery/class/power_supply/battery/present # touch junk_battery/class/power_supply/battery/capacity # touch junk_battery/class/power_supply/battery/batt_vol # touch junk_battery/class/power_supply/battery/batt_temp # touch junk_battery/class/power_supply/battery/technology
디렉토리와 파일이 다 만들어졌습니다.
이제 touch로 생성한 파일 내용에 값을 집어넣어서 진짜 거짓정보를 날리도록 해줘야 합니다.
사용하시는 에디터로 해서 touch 로 생성한 파일들에 값을 넣어주면 되겠습니다. (저는 100을 넣었습니다)
자, 이제 안드로이드를 다시 빌드하고 파일시스템을 새롭게 바꿔 줍니다.
그리고 만들어둔 junk_battery 디렉토리를 통체로 파일시스템의 루트에 복사해 놓습니다.
[그림6-3. 꺼지지 않고 부팅에 성공한 안드로이드의 모습!]
자! 안드로이드로 부팅이 성공적으로 이루어졌습니다!
정말 신기하네요. 몇개 건드린게 없는데 일단 부팅이 되버렸습니다. 안드로이드의 이런 모습, 놀랍고 무섭네요.
벌써 느껴지지 않나요? 안드로이드가 왜 폭풍을 일으키려고 꼼지락 꼼지락 하는지!
오늘은 일반 부팅시키는데 성공했으니까요, 이것저것 좀 가지고 놀아보세요.
다음 시간에는 ALSA 드라이버를 넣어보도록 하겠습니다.
그럼 다음에 또 봐요~ 제발~~~
PS. 1분후 화면이 꺼져버리는 문제는 설정에서 바꿔주세요. 1장에서 설명했습니다.
글 올라오는 매주 화요일을 기다리고있습니다. 감사합니다.