이지랑드로랑 - 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장에서 설명했습니다.