13 장실제타깃제작하기
시작하면서 2 목차 13.1 타깃개발개요 13.2 안드로이드모바일하드웨어플랫폼 13.3 실제타깃개발홖경구축 13.4 실제타깃커널제작 13.5 타깃으로이미지다운로드 13.6 파일시스템구성 13.7 부팅및실행
13.1 타깃개발개요 3 porting 어떻게안드로이드소프트웨어플랫폼을빌드하여포팅하는가? 계층구조의플랫폼을빌딩하는방법? 교차컴파일 링크 부팅 실제 ARM에서실행 [ 그림 13-1] 안드로이드플랫폼포팅개요
13.1 타깃개발개요 4 [ 그림 13-2] 에뮬레이터기반에뮬레이터플랫폼구성
13.1 타깃개발개요 5 [ 그림 13-3] 일반타깃보드 ( 하이버스 X-Hyper320TKU) 포팅예
13.1 타깃개발개요 6 [ 그림 13-4] 모바일전용타깃보드 ( 하이버스 H-AndroSV210) 포팅예
13.2 모바일하드웨어플랫폼 7 플랫폼구성및특징 안드로이드구현 ARM 필요사양 ARM926 또는그이상 (ARM11, ARM MPC, ARM Cortex) 을포함한 SOC 주의 : ARMv4 기반인 ARM920T 는동작하지않음 Thumb, MMU, EABI 를지원 Display/Frame buffer (Frame buffer 는 double buffer/page flipping 을지원 ) Keyboard USB(optional) RTC(optional) Serial console Storage (64MB 이상 ) e.g. NFS / USB stick / NAND / NOR / MMC /SD card 충분한 main memory (SDRAM, 32 MB 이상 )
13.2 모바일하드웨어플랫폼 8 안드로이드구현 ARM SoC 종류 H-AndroSV210 : 강력한성능을자랑하는 Cortex-A8 기반 1GHz의 Samsung 최신프로세서 S5PV210을탑재한보드 X-Hyper320(PXA 320) OMAP1(ARM v5 ARM926) OMAP2(ARM v6 ARM11) Sharp Zaurus SL-C760(PXA255) Sharp Zaurus SL-C3000(PXA270) A&W6410( 삼성 S3C6410)
13.2 모바일하드웨어플랫폼 9
13.2 모바일하드웨어플랫폼 10 추상계층 하드웨어제어및관리 [ 그림 13-6] 하드웨어추상계층
13.3 실제타깃개발환경구축 11 실제타깃개발지원환경 리눅스서버설치 통신홖경 [ 그림 13-7] 실제타깃개발지원환경
13.3 실제타깃개발환경구축 12 교차개발환경설계 교차컴파일러 교차어셈블러 링커 라이브러리 디버깅툴
13.3 실제타깃개발환경구축 13 사용자인터페이스 리눅스쉘프로그램선정 Bash 홖경 Busybox 파일시스템 Ext, jffs, yaffs 다운로드방법 JTAG, BDM RS-232 USB H-AndroSV210 Tftp( 이더넷 ) 부팅 Elf 데이터는 RAM, 코드는 ROM 에서실행 ROM 에서 RAM 으로복사한후실행 데스크톱에서타깃의 RAM 으로직접다운로드하여실행
13.3 실제타깃개발환경구축 14 개발지원도구구축 툴체인설치 컴파일러 어셈블러 로더 Native compiler cross compiler ARM ABI -> ARM EABI 툴체인준비방법 Codesourcery 툴체인소스다운로드 기존빌드된툴체인사용
13.3 실제타깃개발환경구축 15 [ 실습 13-1] 툴체인설치 (1)http://www.codesourcery.com/downloads/public/gnu_toolchain/armnone -linux- gnueabi 사이트를방문하면 [ 그림 13-8] 처럼다양한플랫폼에 대한툴체인이있다. [ 그림 13-8] 툴체인선택및다운로드
13.3 실제타깃개발환경구축 16 [ 실습 13-] 툴체인설치 (2) arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 툴체인파일을 /toolchain 디렉터리에다운로드받는다. (3) bzip2-d arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linuxgnu.tar.bz2 (4) tar xvf arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linuxgnu.tar bzip2와 tar를사용하여 /toolchain 디렉터리에저장된툴체인파일에대하여압축을해제한다. 그러면실제타깃에서사용할커널및파일시스템을만들고포팅을하기위한각종의교차컴파일도구가 /toolchain 디렉터리에생성된다. [ 그림 13-9] 는설치된툴체인의종류를보여준다. [ 그림 13-7] 설치된툴체인종류
13.3 실제타깃개발환경구축 17 busybox 설치 기존임베디드리눅스 busybox 와의차이점 : static 옵션빌드 기존 busybox(1.8mb) 안드로이드 busybox (150KB) 지원도구설치 Flex, bison, gperf, libsdl-dev, libesd0-dev, libwxgtk2.6- dev(optional), build-essential, zip, curl Valgrind libreadline Repo
13.4 실제타깃커널제작 18 소스 : 3GB, 128,000 파일로구성 우분투리눅스소스 안드로이드 2.2 플래폼소스 (2.1 GB) U-Boot 소스 문서 빌드 Goldfish, QEMU 비홗성화
13.4 실제타깃커널제작 19 안드로이드커널빌드 [ 그림 13-10] 커널제작및부팅절차
13.4 실제타깃커널제작 20 안드로이드커널소스준비 # mkdir ~/bin // bin 디렉토리를생성 # curl http://android.git.kernel.org/repo > ~/bin/repo //repo 스크립트다운로드 # chmod 755 ~/bin/repo // repo 를실행가능하게설정 # cp ~/bin/repo /bin # repo init -u git://android.git.kernel.org/platform/manifest.git // repo init 를사용하여 repo 의최신버젂을다운로드받는다. # repo sync
13.4 실제타깃커널제작 21 [ 실습 13-2] 커널소스다운로드하기 (1) 안드로이드홈페이지에서 linux-2.6.25-android-1.0_r1 을리눅스서버에 /kernel 디렉터리를만들어다운로드한다. (2) tar zxf linux-2.6.25-android-1.0_r1.tar.gz /kernel 디렉터리에압축해제하면 [ 그림 13-11] 처럼 kernel.git 디렉터리가생성된다. [ 그림 13-13] 커널소스압축해제
13.4 실제타깃커널제작 22 [ 실습 13-3] 커널소스패치하기 (1) gzip linux-2.6.25-android-1.0_r1-xhyper320tku_patch_v1.gz patch -p1 패치파일이압축파일형태로제공되므로 gzip 을사용하여패치파일의압축을해제하고소스에패치한다. 패치는 patch 명령어와옵션을사용하여이루어짂다. 압축해제는 /kernel.git 디렉터리에한다. (2) /kernel.git 디렉터리로이동하여패치결과를확인한다. [ 그림 13-12] 와같은소스폴더가생성된다. 일반리눅스소스폴더에서보던것과유사하다는것을알수있다. [ 그림 13-14] 리눅스커널소스구조
13.4 실제타깃커널제작 23 안드로이드커널설정
13.4 실제타깃커널제작 24 IPC 설정 Low memory killer, logger, 전력관리, yaffs2 설정 컴파일및빌드
13.4 실제타깃커널제작 25 [ 실습 13-4] 커널빌드하기 (1) 터미널창을열고 root 계정으로로그인한다. (2) CD-ROM 에 H-AndroSV210 의 BSP CD 를삽입한다. (3) 우분투 9.10 을기준으로 CD 는자동으로마운트되는데 /cdrom 이란폴더에자동마운트된다. (4) mkdir /mnt/cdrom/kernel 명령으로 /mnt/cdrom/kernel 이란폴더를 생성한다. (5) cp -r /cdrom /mnt/cdrom/kernel 명령으로 CD-ROM 의압축커널파일 android_kernel_2.6.32_sv210.tgz 내용을 /mnt/cdrom/kernel 에복사한다. (6) ls /mnt/cdrom/kernel 으로복사한내용을확인한다. (7) 압축커널파일 android_kernel_2.6.32_sv210.tgz 을해제한다. [ 그림 13-13] 처럼 CD 이미지가있는폴더로이동하여 tar 명령을이용해서압축을해제한다. [ 그림 13-13] H-AndroSV210 의커널파일준비
13.4 실제타깃커널제작 26 [ 실습 13-4] 커널빌드하기 (8) cd android_kernel_2.6.32_sv210; ls 압축을해제한커널의디렉터리로이동하여 ls 명령으로압축해제된파일구성내용을 [ 그림 13-14] 처럼확인해본다. [ 그림 13-14] 커널파일구성확인
13.4 실제타깃커널제작 27 [ 실습 13-4] 커널빌드하기 (9)./build_kernel build_kernel 이라는스크립트를이미정의해두어사용자가일일이커널설정을하는것을갂소화하고쉽도록구성해놓았다../build_kernel 을실행하여 [ 그림 13-15] 처럼커널빌드를한다. [ 그림 13-15] 커널빌드작업 [ 그림 13-16] build_kernel 내용확인
13.4 실제타깃커널제작 28 [ 실습 13-4] 커널빌드하기 (10) cd arch/arm/boot; ls 컴파일이완료되면 [ 그림 13-17] 과같이프롬프트가출력이되며, arch/arm/ boot/zimage라는파일로컴파일된 3.2MB 크기의 zimage 이미지가생성된것을볼수있다. [ 그림 13-17] 커널이미지생성확인
13.4 실제타깃커널제작 29 [ 실습 13-5] 안드로이드플랫폼이미지빌드하기 (1) CD-ROM 에 H-AndroSV210 의 BSP CD 를삽입한다. (2) 우분투 9.10 을기준으로 CD 는자동으로마운트되는데 /cdrom 이란폴더에자동마운트된다. (3) mkdir /mnt/cdrom/android 명령으로 /mnt/cdrom/android 란폴더를생성한다. (4) cp -r /cdrom /mnt/cdrom/android 명령으로 CD-ROM 의압축플랫폼파일 android_froyo_sv210.tgz 내용을 /mnt/cdrom/android 에복사한다. (5) ls /mnt/cdrom/android 으로복사한내용을확인한다. (6) tar zxvf android_froyo_sv210.tgz 압축플랫폼파일 android_froyo_sv210.tgz 을 [ 그림 13-18] 처럼해제한다. 파일용량이크기때문에압축해제과정은 PC 에따라수분이걸릴수있다. [ 그림 13-18] 안드로이드플랫폼압축파일해제
13.4 실제타깃커널제작 30 [ 실습 13-5] 안드로이드플랫폼이미지빌드하기 (7) cd android_froyo_sv210; ls 압축해제를완료했으면압축이해제된 android_froyo_sv210 폴더로이동한다. 그리고 ls 명령어로폴더내용을확인한다. (8)./build_android.sh build_android.sh 파일은 system.img 와 root.img 같은안드로이드플랫폼이미지를생성하기위해이미작성해놓은스크립트파일이다. (9) cd out/target/product/sv210; ls 안드로이드이미지의생성은 PC 사양에따라수시갂이소요된다. 안드로이드이미지의빌드가완료되면 out/target/product/sv210 이하에이미지가생성된것을 [ 그림 13-19] 처럼볼수있다. 기본파일시스템이미지 ro ot.img 와플랫폼이미지파일 system.img 가생성된다. [ 그림 13-19] 안드로이드플랫폼이미지생성
13.5 타깃으로이미지다운로드 31 zimage, root.img, system.img 생성된이미지다운로드
13.5 타깃으로이미지다운로드 32 [ 실습 13-6] 안드로이드이미지다운로드 (1) nand scrub 다운로드하기에앞서이미 Nand Flash 에올라가있던내용을삭제한다. (2) nand erase 80000 FF8000 nand scrub 작업이모두짂행되었으면 [ 그림 13-20] 처럼 NAND 플래시의내용을모두지운다. 메모리영역중 80000~FF8000 의내용을삭제한다. [ 그림 13-20] NAND 메모리지우기
13.5 타깃으로이미지다운로드 33 [ 실습 13-6] 안드로이드이미지다운로드 (3) dnw c0008000 Nand Flash 의내용을삭제하였으면커널의이미지를다운로드하기위하여 USB Port 의통신연결을설정한다. 그리고 zimage 파일이있는곳의경로를 지정한다. 파일이선택되면다운로드가짂행된다. 결과적으로 zimage 라는커널이미지가 SDRAM 에다운로드되었다. SDRAM 의경우휘발성메모리이기때문에 SDRAM 에다운로드된 zimage 를 Nand Flash 로 Write 해주어야한다. (4) nand write c0008000 600000 500000 Nand Flash 에 zimage 를 [ 그림 13-21] 처럼쓰기를한다. [ 그림 13-21] zimage 다운로드하기
13.5 타깃으로이미지다운로드 34 [ 실습 13-6] 안드로이드이미지다운로드 (5) dnw 40000000 다음은앞에서생성한 system.img 를 H-AndroSV210 에다운로드한다. 안드 로이드는 root 와 system 이미지로나누어져있기때문에 2 개의파일시스템이미지를업로드하여야한다. (3) 의과정을반복하는데, 차이점은다운로드주소가다르다는것이다. (6) nand write.yaffs 40000000 1000000 [byte size of system.img] Nand Flash 에 system.img 를 [ 그림 13-22] 처럼쓰기를한다. (7) root.img 이미지를다운로드하여플래시에저장한다. [ 그림 13-22] system.img 다운로드하기
13.6 파일시스템구성 35 임시루트파일시스템 Init 프로세스실행시루트파일시스템마운팅 Initrd, initramfs H-hyper320TKU : initrd (block device, 드라이버 ) H-AndroSV210 : initramfs (non-block device, 캐시메모리사용 ) Yaffs : root.img, system.img 생성
13.6 파일시스템구성 36
13.7 부팅및실행 37 [ 실습 13-7] 안드로이드부팅 (1) H-AndroSV210 을재부팅한다. (2) 잠시후 H-AndroSV210 이정상적으로부팅되는것을그림처럼볼수있다. [ 그림 13-23] 안드로이드부팅
끝 38