티스토리 뷰
목차
안드로이드 포팅, 참고 자료 (AT91CAP9SDK 보드 기준)
안드로이드 포팅 보드 정보
- Proven, Innovative Microcontroller [링크]
- [AT91CAP9-STK]Linux Porting [링크]
안드로이드 포팅 참조
안드로이드 포팅 참조 파일
이하 사항들은 안드로이드 포팅 정보의 요약 내용입니다.
-- 안드로이드 포팅 시작 --
버닝 방법 요약은 다음과 같다. (윈도우에서의 예로서, 리눅스와 더불어 리눅스 CDC 드라이버 요소가 필요)
SAM-BA, CDC driver를 다운로드 후 설치하고, AT91CAP9-STK의 Linux Software Package 압축을 해제
안드로이드 포팅 시작
STK board를 콘센트와 연결하고 USB 케이블을 컴퓨터와 연결.
보드에서 J66 점퍼 제거(CAP9 칩 쪽의 파란색 위치)한 후 S4(EN_PMC)를 눌러 시작.
이때 윈도우는 인스톨 되어 있던 CDC 드라이버와 같은 새로운 장치를 발견, 사용자는 드라이버를 윈도우에서 자동으로 검색됨. (at91cap9stk-console-nd.bat는 GUI 버전이 아님)
조금 기다린 후, "logfile.log"이 생성되면 버닝이 완료된 것임.
전원 연결 해제 후, S4(EN_PMC)를 눌러 부트 프로세서를 시작해 부트가 실행되면 성공되긴 하지만, 최소한의 터치 기능만 있다.
(중략)
1 | $git clone git://android.git.kernel.org/kernel/common.git | cs |
(이 과정전에 sudo apt-get install git-core 필요)
리눅스 커널 패치는 'AT91CAP9-STK Linux Software Package'에 있다.
압축을 해제하면, 안드로이드 포팅을 위한 세 개의 패치 파일이 있다.
1 2 3 | $git clone git://android.git.kernel.0001_CAP9-STK_linux-2.6.27-at91.patch 0002_CAP9-STK_linux-2.6.27-at91-exp-cap9-dk.patch 0003_CAP9-STK_linux-2.6.27-at91-exp-cap9-stk.patchrg/kernel/common.git | cs |
STK 보드는 0001 + 0003, DK 보드는 0001 + 0002가 필요하다.
$(andsrc)/kernel로 패치 파일을 옮기는 것이 요구되며, 커널 패치를 하기 위해 다음 명령어를 사용해라.
1 | $patch -p1 < patch-file-name-here | cs |
(중략)
사용자는 처음으로 at91cap9-sdk의 설정을 적용한다.
1 2 3 4 5 | $cp $(andkernel)/common/arch/arm/configs/at91cap9stk_defconfig $(andkernel)/common/.config $make ARCH=arm menuconfig (잘 안되면 sudo apt-get install libncurses5-dev) | cs |
여기서 우리는 처음 설정을 수정하지 않고, 바로 나와 설정을 저장한다.
유효한 사용가능한 ARM CPU 커널을 컴파일, 우리는 안드로이드 포팅을 위해 CodeSourcery를 사용한다.
설치 성공 후에 컴파일러 경로를 추가한다.
1 | $export PATH=$PATH:$(codesourcery)/Sourcery_G + + _Lite/bin | cs |
$(andkernel)/common 아래에 Makefile을 수정한다.
1 2 3 | Modify $ (andkernel) / common under the Makefile: CROSS_COMPILE? = Arm-none-eabi- | cs |
그 다음 당신은 커널을 컴파일 할 수 있다.
지금 우리는 커널을 가지고 있지만 U-Boot는 uImage를 먹어, uImage에 대한 Image를 만들어야 한다.
커널 환경설정 툴을 $(andkernel)/common 아래에서 연다.
1 | $make ARCH=arm menuconfig | cs |
Ext3로 포맷된 SD 카드의 파일 시스템이어서 커널은 Ext3 파일 시스템을 지원해야 안드로이드 포팅을 이어갈 수 있다.
1 2 3 | File systems ---> <*> Ext3 journalling file system support [*] Ext3 extended attributes | cs |
ARM Thumb가 사용할 수 있도록 실행 가능한 파일로 컴파일을 할 것이다.
1 2 | System Type ---> [*] Support Thumb user binaries | cs |
AT91CAP9-STK에 응답하기 위하여
1 2 | General setup ---> [*] Enable the Anonymous Shared Memory Subsystem | cs |
1 2 3 4 5 | $cd $(andkernel)/common/arch/arm/boot $gzip -9 Image $mkimage -A arm -O linux -T kernel -C gzip -a 0x70008000 -d Image.gz uImage (이전에 sudo apt-get install uboot-mkimage) | cs |
우리가 원하는 La uImage kernel이다.
(중략)
소스는 ‘working-directory-name'의 '$(andsrc)'에 다운로드 된다.
여기서 우리는 아무런 수정 없이 바로 첫 번째 컴파일을 바로 하여 안드로이드 포팅을 계속한다.
1 2 3 4 5 6 7 8 9 10 | sudo apt-get install sun-java5-jdk(jdk 버전 5에서만 make됨) sudo apt-get install bison sudo apt-get install build-essential sudo apt-get install qemu sudo apt-get install qemu-kvm sudo apt-get install libsdl1.2-dev $cd $(andsrc) $make | cs |
컴파일 시간은 약 2.5 시간, 디스크 용량은 거의 8GB 정도 소요된다. (원글을 적은 중국 개발자 사양 - Intel Core 2 Solo U3500@1.4GHz)
컴파일이 되면 파일 시스템은 $(andsrc)/out/target/product/generic 다음에 있을 것이다.
안드로이드 파일 시스템은 주로 세 개의 파트 종류로 구성되어 있다.
1. Ramdisk.img는 파일 시스템 “/”의 /system과 /data 밖의 파일을 제외한 모든 파일들을 포함
2. System.img는 /system 아래의 모든 파일을 포함
3. Data.img는 /data 아래의 모든 파일을 포함
보통의 안드로이드 포팅 환경 아래서, 파일 시스템은 JFFS2 패키지이기 때문에 SAM-BA로 NAND에 버닝할 수 있다.
그러나 안드로이드 /data 폴더 아래의 파일 시스템은 memory-mapped(기억 장소 할당) 작업을 지원해야 하는데, JFFS2는 memory-mapped를 지원하지 않아, SAMBA에서 안드로이드 YAFFS2를 사용해 버닝 할 수 없다.
(중략)
리눅스에서 SD 카드를 카드 리더기에 넣으면, Ext3로 포맷이 된다(fdisk나 mkfs).
그 위치는 /media/disk일 것이고, 안드로이드의 “/”루트 폴더 위치와 대응한다.
우리는 .img 파일의 압축 해제가 필요하지 않는데, 왜냐하면, $(Andsrc)/out/target/product/generic 폴더 아래의 root, data, system 폴더들 ramdisk.img, userdata.img, system.img가 압축이 해제된 파일들이기 때문이다.
당신이 할 수 있다면 대응하는 위치에 복사가 된다.(루트 권한 필요)
1 2 3 | $ sudo cp -r $(andsrc)/out/target/product/generic/root/* /media/disk/ $ sudo cp -r $(andsrc)/out/target/product/generic/data/ /media/disk/ $ sudo cp -r $(andsrc)/out/target/product/generic/system/ /media/disk/ | cs |
그 다음 init.rc를 수정해야 한다.(/media/disk/init.rc).
1 | Then we want to modify init.rc (/ media / disk / init.rc). | cs |
init.rc는 init 실행을 정의를 완료하며, 그리고 /data와 /system 마운트하여 실행하며, 그러나 우리는 이 폴더들을 버렸고, 그래서 그 명령들은 없애야 안드로이드 포팅할 수 있다.
init.rc에서 마운트 명령어를 모두 삭제하는 것을 시작하며, 오직 "mount tmpfs tmpfs /sqlite_stmt_journals size=4m"。"만 남겨준다. 우리는 커널과 파일 시스템을 완성시켰다.
(중략)
커널 환경설정 툴을 $(andkernel)/common 아래에서 연다
1 | $make ARCH=arm menuconfig | cs |
Ext3로 포맷된 SD 카드의 파일 시스템이어서 커널은 Ext3 파일 시스템을 지원해야 한다.
1 2 3 | File systems ---> <*> Ext3 journalling file system support [*] Ext3 extended attributes | cs |
안드로이드의 일부는 ARM Thumb가 사용할 실행 가능한 파일로 컴파일을 할 것이다.
1 2 | General setup ---> [*] Enable the Anonymous Shared Memory Subsystem | cs |
1 2 | System Type ---> [*] Support Thumb user binaries | cs |
셋업이 완벽할 때, 셋팅을 .config에 저장하는 것을 기억한다.
(중략)
마지막으로 옹스트롬을 사용했을 때, at91cap9-stk-x11-nd.bat과 같은 디렉토리에 있다.
1 2 3 | kernelFileName "at91cap9stk-linux.bin" -> KernelFileName "uImage" | cs |
uImage는 그 다음에 같은 방법으로 버닝된 디렉토리에 복사되어 안드로이드 포팅에 사용할 수 있다.
(버닝된 파일 시스템이 필요하지 않을 때, .tcl 파일에서 2개의 줄은 삭제한다.)
(중략)
1 2 | U-Boot> setenv bootargs console=ttyS0, 115200 root=/dev/mmcblk0p1 rw init=/init rootwait | cs |
/dev/mmcblk0p1는 첫 번째 파티션에서 첫 번째 SD 카드, rootwait는 그 SD 카드 드라이브에서 루트가 준비 될 때까지 기다리는 것을 보장한다.
1 2 3 | U-Boot> saveenv U-Boot> run bootcmd | cs |
bootcmd가 시작되며 커널과 드라이버가 로딩되고 SD 카드에서 루트 파일 시스템을 얻게되고 /init 폴더에서 작동하는 것이 실행된다.