SD카드로 비글보드 Android 부팅을 위해서는 커널이미지와 Android root file system이 필요하다. 커널 소스와 Android 소스를 ubuntu 상에서 빌드하고 생성된 이미지들을 SD카드에 복사를 해야 한다.
우선 복사하기 전에 Android 소스를 받을 폴더를 생성한다.
$ cd ~
$ mkdir –p ~/Project/mydroid
1. Tool 설치
(1)ARM compiler 설치
- 컴파일러 다운로드
http://www.codesourcery.com/downloads/public/gnu_toolchain/arm-none-linux-gnueabi/arm-2007q3-51-arm-none-linux-gnueabi.bin
- 컴파일러 설치 (전체 설치할 것)
$ sh arm-2007q3-51-arm-none-eabi.bin
(2) Git 1.5.4 또는 최신 버전 그리고 GNU Privacy Guard를 설치
$ sudo apt-get install git-core gnupg
(3) JDK 5.0, update 12 나 상위 버전을 설치.
$ sudo apt-get install sun-java6-jdk
(4) flex, bison, gperf, libsdl-dev, libesd0-dev, libwxgtk2.6-dev (optional), build-essential, zip, curl 패키지를 설치
$ sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
(5) 필요하다면 Valgrind 설치
(이는 Memory leak이나 stack corruption, array bounds overflows를 찾는데 도움이 된다.)
$ sudo apt-get install valgrind
(6) repo 설치.
$ mkdir –p ~/Project/bin
$ curl http://android.git.kernel.org/repo >~/Project/bin/repo
$ chmod a+x ~/Project/bin/repo
(7) gparted 설치.
$ sudo apt-get install gparted
(8) 경로 설정
$ cd ~
$ vim .bashrc
마지막 줄에 추가할 경로를 입력한다.
export PATH=$PATH:~/Project/bin (repo 경로)
export PATH=$PATH:/root/CodeSourcery/Sourcery_G++_Lite/bin (컴파일러 경로)
위 경로 입력/저장후 다시 부팅하면 경로가 적용 된다.
2. U-Boot 다운로드 및 빌드
(1) U-Boot 소스 다운로드
- 다운로드한다.
$ git clone git://git.denx.de/u-boot.git u-boot-main
$ cd u-boot-main
$ git checkout --track -b omap3 origin/master
(2)U-Boot 빌드
$ make CROSS_COMPILE=arm-none-linux-gnueabi- mrproper
$ make CROSS_COMPILE=arm-none-linux-gnueabi- omap3_beagle_config
$ make CROSS_COMPILE=arm-none-linux-gnueabi-
Result : 빌드하면 tools 폴더가 생기는데 tools폴더의 패스를 등록해야 한다. 또는 tools 디렉토리내 mkimage 파일을 /bin 디렉토리에 복사하면 된다. (커널 컴파일시 uImage 만들때 사용됨)
** $ cp tools/mkimage /bin
3. Kernel 다운로드 및 빌드
$ git clone git://source.mvista.com/git/linux-omap-2.6-historic.git
$ cd linux-omap-2.6-historic
$ git remote add labs.embinux git://labs.embinux.org/linux-omap-2.6
$ git remote update
$ git checkout -b beagle.android-2.6.27 labs.embinux/android-2.6.27
◆[K1] 기존의 코드에서 자체 제작한 patch 적용
$ tar –zxvf patches_old.tar.gz /* 파일 압축 해제 */
$ 압축 해제 후 나온 diff파일들을 linux-omap-2.6-historic 폴더에 복사.
$ patch -p1 < sdc_lcd.diff /* lcd timing 패치 */
$ patch -p1 < sdc_musb.diff /* musb 오류 패치 */
$ patch -p1 < sdc_ehci_patch1.diff /* EHCI 수정 패치#1 */
$ patch -p1 < sdc_ehci_patch2.diff /* EHCI 수정 패치#2 */
$ patch -p1 < sdc_defconfig.diff /* defconfig 추가 패치 */
$ make ARCH=arm omap3_beagle_android_sdc_defconfig
$ make ARCH=arm CROSS_COMPILE= arm-none-linux-gnueabi- uImage
Result : /arch/arm/boot 폴더안에 uImage파일이 만들어져 있는지 확인.
4. Android 다운로드 및 빌드
(1) 다운로드
repo 환경 초기화 (최신버전)
$ cd ~/Project/mydroid
$ repo init -u git://android.git.kernel.org/platform/manifest.git
다른 버전(beable보드의 환경으로 맞춰져있는 버전)을 받기 위해 환경 파일을 기존 파일에 덮어 씌운다.
http://labs.embinux.org/images/9/91/Manifest18032009.xml
/.repo 폴더안의 Manifest.xml파일 내용을 위 링크의 내용으로 대체한다.
대체 후 아래 명령어로 파일 다운로드
$ repo sync
(2)패치
- TLS patch
http://labs.embinux.org/images/4/40/Tls.patch
위 링크의 파일을 받아서 패치를 한다.
$ cd ~/Project/mydroid/bionic/libc/private
$ patch -p1 < ~/Tls.patch
- GL_WRAPPER patch
http://labs.embinux.org/images/b/b6/Gl_wrapper.patch
위 링크의 파일을 받아서 패치를 한다.
$ cd ~/Project/mydroid/frameworks/base
$ patch -p1 < ~/Gl_wrapper.patch
- pmem 문제 수정.
$ cd ~/Project/mydroid/external/opencore/android
$ gedit android_surface_output.cpp
$ 생성자의 mEmulation=false è mEmulation=true 로 수정.
(3)빌드
$ cd ~/Project/mydroid
$ make
빌드하면 root file system이 만들어진다.
경로는 ~/Project/mydroid/out/target/product/generic에 있다.
(4)rfs 환경 만들기
root file system 환경을 ~/Android_rfs에 우선 복사한다.
$ cd ~/Project/mydroid/out/target/product/generic
$ mkdir ~/Android_rfs
$ cp -a root/* ~/Android_rfs
$ cp -a data/* ~/Android_rfs/data/
$ cp -a system/* ~/Android_rfs/system/
패치를 받아서 적용
다운로드. 아래 파일을 사용자 루트에 저장한다.
http://labs.embinux.org/images/6/6c/Initrc.patch
http://labs.embinux.org/images/f/fd/Qwerty.patch
init.rc 파일 패치
$ cd ~/Android_rfs
$ patch –p1 < ~/Initrc.patch
qwerty.kl 파일 패치
$ cd ~/Android_rfs/system/usr/keylayout
$ patch -p1 < ~/Qwerty.patch
5. SD 카드에 rfs 와 uImage 올리기
(1) SD 카드 포맷
$ sudo gparted
위 파티션 에디터를 실행 후 파티션을 두 개를 만든다. 하나는 커널 이미지인 uImage를 넣을 fat32 파티션 하나와 rfs를 넣을 ext2 파티션 하나를 만든다.
(2) rfs와 uImage 올리기
/dev/sdb1/에 FAT32가 잡혀있고 /dev/sdb2/에 ext2가 잡혀있는 것으로 가정한다.
정확한 정보는 아래 명령어로 확인하면 된다.
$ sudo fdisk –l
이제 위 이미지들을 SD카드에 올린다.
SD카드에 rfs 복사.
$ sudo mkdir –p /tmp/disk
$ sudo mount /dev/sdb2 /tmp/disk
$ sudo su
$ cp –R /home/(user root)/Android_rfs/* /tmp/disk
$ exit
$ sync
$ sudo umount /tmp/disk
SD카드에 uImage 복사.
$ sudo mount /dev/sdb1 /tmp/disk
$ sudo cp (커널 폴더 경로)/arch/arm/boot/uImage /tmp/disk
$ sudo umount /tmp/disk
6. Android 실행 (on beagle board)
터미널 실행 후 부팅
>> OMAP3 beagleboard.org # mmcinit
>> OMAP3 beagleboard.org # fatload mmc
>> OMAP3 beagleboard.org # setenv bootargs 'console=ttyS2,115200n8 noinitrd root=/dev/mmcblk0p2 rw video=omapfb:mode:1024x768@60 rootdelay=1 init=/init rootfstype=ext2 nohz=off'
>> OMAP3 beagleboard.org # bootm 0x80300000
7. Referrence
[1] http://beagleboard.org/ 비글보드 웹페이지
[2] http://labs.embinux.org/index.php/Android_Porting_Guide_to_Beagle_Board 안드로이드 포팅 가이드
[3] http://www.youtube.com/watch?v=zymOmduNWyI&eurl=http%3A%2F%2Fbeagleboard%2Eorg%2Fmedia&feature=player_embedded SD카드에 이미지 넣는 방법을 설명
[4] http://source.android.com/download Android 소스 다운로드
[5] http://elinux.org/BeagleBoard 비글보드 포팅 페이지