포럼 회원으로 등록하신분만 다운로드가 가능합니다. 최대 업로드 가능한 용량은 20MB 입니다.

일주일동안 외부강의에 목요일날 심한 음주로 인하여 2일 정도 완전 폐인모드에

어제는

 

android에 새로운 multimedia player를 포팅하기 위한 작업을 노가다 한 후에....쩝...

오늘에야 겨우 자료를 올리네요...ㅎㅎ

 

저번에 컴파일해도 부팅이 안되는 경우가 있다고 말씀드렸는데 관련 패치부분을 올립니다.

----------------------------------------------------------------------------------------

Android source를 공식사이트에 받아서 compile하고 부팅할 경우
부팅이 안되는 경우가 나온다.

 

1.5와 1.6에서는 logcat으로 봤을 때


E/BatteryService( 1661): Could not open '/sys/class/power_supply/ac/online'
E/BatteryService( 1661): Could not open '/sys/class/power_supply/usb/online'
E/BatteryService( 1661): Could not open '/sys/class/power_supply/battery/present'
E/BatteryService( 1661): Could not open '/sys/class/power_supply/battery/capacity'
E/BatteryService( 1661): Could not open '/sys/class/power_supply/battery/batt_vol'
E/BatteryService( 1661): Could not open '/sys/class/power_supply/battery/batt_temp'
E/BatteryService( 1661): Could not open '/sys/class/power_supply/battery/status'
E/BatteryService( 1661): Could not open '/sys/class/power_supply/battery/health'
E/BatteryService( 1661): Could not open '/sys/class/power_supply/battery/technology'


이런 메세지가 나오면서 다음과 같은 부분때문에 system halt 가 된다.


2.0 이상의 경우는 전혀 메세지는 나오지 않고 그냥 부팅이 안될 뿐이다....
반복해서 삽질만 해댄다.......ㅎ


이는 배터리 문제로 안드로이드는 실제 장비가 완전히 hw부분이 포팅이 되었다고 가정하고
소스가 구성되었기 때문이다. 실제로도 G1 혹은 motorola droid가 실제 타겟으로 설계된 부분이 있기 때문이다.

즉, 소스 받아서 폰에 넣으면 동작한다는 얘기이다.(물론, 그렇지 않을 경우도 있지만)

1. Battery 문제

android source에서 관련된 부분을 없앤다.
(몇가지 방법이 있음)

1> system halt에 대해 JAVA application framework 단에서 수정하는 법


- 1.5/1.6의 경우
frameworks/policies/base/phone/com/android/internal/policy/impl/KeyguardUpdateMonitor.java 에서 아래 부분을 주석처리
298 line

        if (batteryLevel == 0 &&
                pluggedInStatus != BATTERY_STATUS_CHARGING &&
                pluggedInStatus != BATTERY_STATUS_UNKNOWN) {
            ShutdownThread.shutdownAfterDisablingRadio(mContext, false);
        }
       
- 2.0 이상의 경우

frameworks/base/services/java/com/android/server/BatteryService.java


shutdown관련 함수의 내부를 주석처리하면 되고.

...
    private final void shutdownIfNoPower() {
        // shut down gracefully if our battery is critically low and we are not powered.
        // wait until the system has booted before attempting to display the shutdown dialog.
        if (mBatteryLevel == 0 && !isPowered() && ActivityManagerNative.isSystemReady()) {
            Intent intent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);
            intent.putExtra(Intent.EXTRA_KEY_CONFIRM, false);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            mContext.startActivity(intent);
        }
    }

    private native void native_update();

    private synchronized final void update() {
        native_update();

        boolean logOutlier = false;
        long dischargeDuration = 0;
...

위와 같이 되어 있는 코드를 다음과 같이 수정

...
    private final void shutdownIfNoPower() {
        /*
        // shut down gracefully if our battery is critically low and we are not powered.
        // wait until the system has booted before attempting to display the shutdown dialog.
        if (mBatteryLevel == 0 && !isPowered() && ActivityManagerNative.isSystemReady()) {
            Intent intent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);
            intent.putExtra(Intent.EXTRA_KEY_CONFIRM, false);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            mContext.startActivity(intent);
        }
        */

    }

    private native void native_update();

    private synchronized final void update() {
        // native_update();

        boolean logOutlier = false;
        long dischargeDuration = 0;
...

      

2> JNI와 HAL에서 처리하는 방법
  /hardware/libhardware_legacy/power/power.c
  /frameworks/base/services/jni/com_android_server_BatteryService.cpp


3> 실제 커널서 battery관련 부분을 추가해 주는 법
==> 커널 코드를 수정

driver관련 HAL 실습부분에서 처리.

 

===============================================================================
참고. storage 용량 계산에서 문제가 발생할 경우

 low on space 메세지 관련 패치
==> 이 부분은 android 버전별로 차이가 있을 수 있음. 하지만, 공식버전에는 발생하는 경우가 많다.
/*
참고

./frameworks/base/services/java/com/android/server/DeviceStorageMonitorService.java

mTotalMemory = ((long)mFileStats.getBlockCount()*(long)mBlkSize)/100;

*/
===============================================================================

 


2. 수정 후 다시 make하고 system 디렉토리만 update한 후 재부팅

android top directory에서 컴파일 후

타겟이 off된 상태에서

 

cp -a out/target/product/ntc100/system/* /root/work/rootfs/test/system

 

이렇게 하고 부팅하면 된다.

 

 

================================================================================

 

이 정도까지 하면 일단 부팅은 될겁니다.

 

이제는 부팅과 관련된 몇가지 얘기를 할 차례네요.

 

init process인데, 몇가지 다른데서 받아온 자료를 기본으로 해서 약간의 간단한 설명을 해볼까 합니다.

"사람은 자기가 보고 싶은 현실만 볼 뿐이다." - Gaius Julius Caesar
엮인글 :
http://www.aesop.or.kr/index.php?mid=Board_Documents_Android_Frameworks&document_srl=34892&act=trackback&key=dba

바람돌이0

2010.06.06 09:57:47
*.109.40.94

질문을 드려도 될런지요...

오드로이드 사용자입니다.

고도리님 올려주신글 잘 읽고 따라해봤습니다.

배터리 부분에선 BatteryService.java 를 수정해서 컴파일해서 올려봤는데

초록 로봇머리 나왔다 없어지고 ANDROID 란 작은 글씨가 중앙에 나타나서 감감무소식이네요.

http://dev.odroid.com/projects/android 여기에서 받은 안드로이드 소스로 컴파일해서 올리면 잘 돌아갑니다.


# repo init -u git://android.git.kernel.org/platform/manifest.git

# repo sync


위와같이 받은 소스로 맨땅에 컴팔해서 오드로이드에 올려보고 싶은데 잘 안되네요.

참고로 커널과 boot 이미지는 http://dev.odroid.com/projects/odroid 여기에서 다운로드 받은 2.1 파일안에 있는걸 사용했습니다.

커널과 rootfs 파일들이 뭔가 꿍짝이 안 맞아서 그런가 하는 생각도 드네요.

Application 개발할려구 구입했다가 이쪽이 더 잼나는것 같아서 몇일 헤메고 있는데

왕초보라 어디를 봐야할지 도통 몰르겠어서 염치 불구하고 여기다 질문 드립니다.

죄송하네요... 넘 길게 썼네요.

고현철

2010.06.06 21:11:01
*.66.210.20

음....odroid쪽 전원쪽에 차이가 있는지 모르겠네요.

 

특정 핀을 손대는지 확인해 봐야할텐데.....후배들한테 odroid에 공식 android를 올려보았는지

확인해 보도록 하겠습니다.

 

저번에 해본 듯도 하고요.

 

아니면 내일쯤에 함 올려보도록 하겠습니다.

이제현

2010.06.07 18:50:56
*.90.137.102

ODROID의 경우 배터리와 충전회로가 있기 때문에 위와 같이 패치하면 정상 동작하지 않습니다.

현재 오드로이드 소스는 sysfs를 통해 배터리 잔량 아이콘도 맞추고 충전 상태 표시도 잘 하고 있으므로 배터리 관련 드라이버는 dev.odroid.com의 소스를 사용하시길 바랍니다.

바람돌이0

2010.06.08 00:06:49
*.48.21.234

답변감사합니다.

첨부터 다시한번 잘 해봐야겠습니다.


착한악마

2010.07.20 06:07:49
*.230.16.120

Eclair 버전은 하면되는데, donut 버전은 커널에서 배터리 패치된것으로 이 작업을 하니까..

부팅이 안되네요. 그걸 모르고 몇일을 삽질만 ㅜㅜ

고도리

2010.07.20 07:42:03
*.140.0.103

1> system halt에 대해 JAVA application framework 단에서 수정하는 법


- 1.5/1.6의 경우
frameworks/policies/base/phone/com/android/internal/policy/impl/KeyguardUpdateMonitor.java 에서 아래 부분을 주석처리
298 line

        if (batteryLevel == 0 &&
                pluggedInStatus != BATTERY_STATUS_CHARGING &&
                pluggedInStatus != BATTERY_STATUS_UNKNOWN) {
            ShutdownThread.shutdownAfterDisablingRadio(mContext, false);
        }

이렇게 하시면 됩니다

liky

2010.11.12 19:08:04
*.41.134.119

안녕하세요. 초보자라서 안드로이드 부팅관련 조언을 얻고자합니다.

현재 개발환경은 노트북에 ubuntu10.04.1LTS 32bit용 설치했고요

타겟보드:odroid

커널소스: http://dev.odroid.com/projects/linux/download/32?filename=eclair-2.6.29.0-hardkernel.tar.gz

안드로이드소스: http://dev.odroid.com/projects/android/download/31?filename=hk_eclair_2.1_r2.tar.gz


[커널이미지]

make hkdkc100_android_defconfig한후

make menuconfig에서 DeviceDriver->USB Driver->USB Gadget CDC Ethernet 및

FileSystem->NetworkFileSystem->NFS Client Support ver3및 Root file system on NFS

를 선택한후 make zImage 하여 만들었습니다.


[안드로이드 rootfilesystem]

./hkdkc100_build.sh 를 통해 만들어진 rootfs폴더를 /nfs/에 복사하였습니다.

sudo chown -R root.root /nfs/rootfs  로 변경하였고요..

sudo vim init.rc파일에서  nfs용으로만들기위해서 66,67번라인을 주석처리했습니다.

66  #mount ext3 /dev/block/mmcblk0p1 /data
67  #setprop EXTERNAL_STORAGE_STATE mounted


[호스트nfs서버설정]

etc/exports에

/nfs/rootfs *(rw,sync,no_subtree_check) 라고 작성한후 서버를 다시실행시켰습니다.


[부트로더 bootargs설정]

setenv bootargs androidboot.console=s3c2410_serial0 init=/init root=/dev/nfs rw nfsroot=192.168.10.2:/nfs/rootfs/ ip=192.168.10.3:192.168.10.2:192.168.10.1:255.255.255.0::usb0:off console=ttySAC0,115200n81


[부팅메세지일부입니다]...부팅메세지전체를 파일로첨부했습니다...

IP-Config: Complete:                                                                                   
     device=usb0, addr=192.168.10.3, mask=255.255.255.0, gw=192.168.10.1,                              
     host=192.168.10.3, domain=, nis-domain=(none),                                                    
     bootserver=192.168.10.2, rootserver=192.168.10.2, rootpath=                                       
Looking up port of RPC 100003/2 on 192.168.10.2                                                        
Looking up port of RPC 100005/1 on 192.168.10.2                                                        
VFS: Mounted root (nfs filesystem) on device 0:13.                                                     
Freeing init memory: 168K                                                                              
Warning: unable to open an initial console.                                                            
init: Unable to open persistent property directory /data/property errno: 2                             
# warning: `rild' uses 32-bit capabilities (legacy support in use)                                     
request_suspend_state: wakeup (3->0) at 4122586002 (2010-01-16 01:54:39.068383000 UTC)                 
init: untracked pid 1748 exited                                                                        
request_suspend_state: wakeup (0->0) at 8494662002 (2010-01-16 01:54:43.440459000 UTC)                 
init: untracked pid 1770 exited


현재 위에 보이는 것과 같이 request_suspend_state: wakeup xxxx이라는 것이 계속해서 반복만되고

있으며 화면은 노란색 안드로이드 이미지에서 멈춰있는 상황입니다.

안드로이드 소스 코드상에서는 request_suspend_state가 검색되지 않고요..

커널소스에서는 아래와 같이 검색되어 지네요..

x2@ubuntu:~/work/eclair-2.6.29.0-hardkernel$ find ./ -name "*.[ch]" | xargs grep "request_suspend_state"
./kernel/power/earlysuspend.c:void request_suspend_state(suspend_state_t new_state)
./kernel/power/earlysuspend.c:        pr_info("request_suspend_state: %s (%d->%d) at %lld "
./kernel/power/main.c:            request_suspend_state(state);
./kernel/power/power.h:void request_suspend_state(suspend_state_t state);
x2@ubuntu:~/work/eclair-2.6.29.0-hardkernel$


그리고 kernel/power/main.c +511줄에있는 state_store함수에서 호출되는것을 확인했습니다..

static ssize_t state_store(struct kobject *kobj, struct kobj_attribute *attr,const char *buf, size_t n)


질문1)커널의 파워관리 쪽에서 나오는 메세지가 무엇때문에 발생하는지 초보자로써

 알아내기가 쉽지 않습니다.

 (google검색으로는 sysfs과연관있다고 하던데요..어떤이유로계속발생하는지궁금합니다)


질문2)오드로이드로 nfs 부팅하려면 dev.odroid.com 에서 제공하는 init.rc에서 어떤부분을

 수정해야하는지 도움부탁드립니다.(오드로이드로 nfs부팅 성공하신고수님들 도와주세요)

  (init.rc도 파일로첨부했습니다)


  그리고 안드로이드소스를 -b eclair로 직접받아서 generic으로 컴파일한후 batteryservice.java부분을

  주석처리한후 nfs root로 동작시켜도 동일한 결과가 나왔습니다.

  초보라서 무작정 질문만 올리는것 같습니다..


첨부
List of Articles
번호 제목 글쓴이 날짜 조회 수
64 Google 의 새로운 코덱 VP8 Video Codec 규격자료를 올려 봅니다... file [1] 장석원 2010-05-24 14955
» [실습-03] android source compile시 battery 부분 patch하기 [7] 고도리 2010-05-24 15897
62 [실습-02] android에서 new product 만들고 compile하기 file [7] 고도리 2010-05-18 13223
61 [이론-00] Android의 개요와 구성 part0 [2] 고도리 2010-05-17 12471
60 [실습-01] android 개발환경 세팅과 source download [2] 고도리 2010-05-17 13781
59 [실습-00] android eclair porting을 위한 ubuntu 설치하기 file [6] 고도리 2010-05-17 12321
58 AudioSystem과 AudioSystem.java를 이용한 JNI 단에서의 연결 [1] JhoonKim 2010-04-14 10871
57 AudioPolicyService와 AudioFlinger 및 HAL의 연결 구조 JhoonKim 2010-04-08 11297
56 Android 2.x AudioFlinger와 HAL의 연결 구조 분석 [2] JhoonKim 2010-04-08 19343
55 busybox에 대한 질문 [3] 득드로이드 2010-03-24 8881
54 누가 Android 에 tslib를 포팅해 놓은듯 합니다. file 최종환 2009-11-11 11062
53 Android Battery 부분 조금 정리해 놓은것 file [2] 최종환 2009-11-04 10726
52 Power Management from Linux Kernel to Android file [10] 최종환 2009-11-01 14996
51 이솝 임베디드 포럼 - 10월 31일 Google Android Seminar 발표 ... file [16] 관리자 2009-10-28 10898
50 Dummy Battery 드라이버 입니다. file [3] 관리자 2009-10-10 10263
49 [참고] Android wifi howto - 아직 테스트는 다 못했습니다. file [10] 고도리 2009-09-22 21723
48 [번역] Android Camera Framework 번역 file [7] 고도리 2009-09-10 19665
47 Android home key is not working(home key 동작 안 할경우 ) [1] 고현철 2009-09-10 10597
46 S3C6410 프로세서용 Andoird Kernel 2.6.29 이식 방법 #1 [2] 김재훈 2009-09-04 15823
45 삼성 안드로이드폰(갤럭시) 리눅스 커널 소스코드 file [3] 유형목 2009-09-01 15909

사용자 로그인