본문 바로가기
C++ 200제/코딩 IT 정보

안드로이드 포팅, 참고 자료 (AT91CAP9SDK 보드 기준)

by vicddory 2017. 11. 25.

안드로이드 포팅, 참고 자료 (AT91CAP9SDK 보드 기준)


안드로이드 포팅, 참고 자료 (AT91CAP9SDK 보드 기준)



이하 사항들은 안드로이드 포팅 정보의 요약 내용입니다.


-- 안드로이드 포팅 시작 --

버닝 방법 요약은 다음과 같다. (윈도우에서의 예로서, 리눅스와 더불어 리눅스 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를 사용한다.


IA32 GNU / Linux Installer를 다운로드 한 후의 예.


1
$ ./arm-2008q3-66-arm-none-eabi.bin
cs


설치 성공 후에 컴파일러 경로를 추가한다.


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 -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 폴더에서 작동하는 것이 실행된다.

댓글