포럼 회원으로 등록하신분만 다운로드가 가능합니다. 최대 업로드 가능한 용량은 20MB 입니다.
안녕하세요.
고도리입니다. 오늘은 목/금/토 연타석 술에 찌들어 지낸 일요일 후유증에 하루종일 힘들었습니다.
(강의도 오후에는 힘들더군요...ㅠ.ㅠ, 그냥 커피--저한테는 마약수준인--한잔먹고 버텼습니다)
오늘은 새로운 vendor와 product를 만들어서 컴파일 하는 방법을 써 볼까 합니다.
저한테 강의 들으시는 분들은 직접 실습을 해 보실 수 있지만, 온라인으로 보시는 분들은 실수 하셔도 제가
봐드리기 힘드니, 잘 따라 하셔야 할 듯 하네요....ㅎㅎ
손으로 치지 마시고, 되도록이면 copy and paste를 이용하시는게 도움이 될 듯 하네요(저도 항상 애용합니다)
새로운 vendor는 aesop으로 정하고, 새로운 product는 ntc100으로 정하도록 하겠습니다.
자 이제 시작합니다.(경어체는 아니나 기분나쁘게 생각치는 마시기 바랍니다.)
-------------------------------------------------------------------------------------------------------------------------------------------------
참, 등호로 이루어진 한줄은 그냥 구분자이니 copy 하지 마시기 바랍니다......ㅎㅎ
1. 일단 android를 다운로드 받은 디렉토리로 움직인 후에 aesop이란 vendor를 하나 만듭니다.
기존에 있는 sample을 이용해서 하나 만들도록 하겠습니다.
cd vendor
cp -a sample aesop
cd aesop
Android.mk와
products 만 빼고 전부 삭제
====================================================================================
rm -rf apps/ frameworks/ sdk_addon/ skins/
====================================================================================
2. products를 새롭게 정의
1>
cd products
vi AndroidProducts.mk
====================================================================================
PRODUCT_MAKEFILES :=
$(LOCAL_DIR)/sample_addon.mk
==> 이렇게 된 것을 새로운 보드 이름으로 대체
PRODUCT_MAKEFILES :=
$(LOCAL_DIR)/ntc100.mk
====================================================================================
그리고 기존의 복잡한 sample관련 mk 파일을 지웁니다.
rm sample_addon.mk
2> ntc100.mk를 다음과 같이 edit
vi ntc100.mk
====================================================================================
$(call inherit-product, build/target/product/generic.mk)
PRODUCT_MANUFACTURER := aesop
PRODUCT_NAME := ntc100
PRODUCT_DEVICE := ntc100
PRODUCT_BOARD := ntc100
====================================================================================
3. 새롭게 추가된 board에 대한 directory 구성
- 기존의 generic board의 것을 이용한다. generic board 디렉토리를 ntc100 디렉토리로 복사
cd ..
cp -a ../../build/target/board/generic/ ./ntc100
- 이 부분은 적용하지 않아도 된다. board에 따라 틀림(kernel에 따라)
이 부분은 product의 kernel 내에서의 keypad driver에 따라 keylayout을 지정하는 부분인데, 이 부분은 건너뛰어도 됩니다.
그냥 이게 없으면 qwerty.kl 이 로딩되거든요.
===================================================================================
vi AndroidBoard.mk
tuttle2를 nt-keypad로 수정(여기서 nt-keypad는 key device driver의 이름이다)
mv tuttle2.kcm nt-keypad.kcm
mv tuttle2.kl nt-keypad.kl
===================================================================================
vi BoardConfig.mk
해서
USE_CAMERA_STUB:=true
를 추가한다.
- 이유는
==================================================================================
//주의사항
frameworks/base/camera/libcameraservice/Android.mk를 보면
#
# Set USE_CAMERA_STUB for non-emulator and non-simulator builds, if you want
# the camera service to use the fake camera. For emulator or simulator builds,
# we always use the fake camera.
ifeq ($(USE_CAMERA_STUB),)
USE_CAMERA_STUB:=false
ifneq ($(filter sooner generic sim,$(TARGET_DEVICE)),)
USE_CAMERA_STUB:=true
endif #libcamerastub
endif
이 경우
USE_CAMERA_STUB:=true
를 BoardConfig.mk 에 넣어줘야 한다.
==================================================================================
4. build script 만들기
android top으로 가서
vi ntc100.sh
해서
==================================================================================
#!/bin/sh
CPU_JOB_NUM=$(grep processor /proc/cpuinfo | awk '{field=$NF};END{print field+1}')
START_TIME=`date +%s`
echo make -j$CPU_JOB_NUM PRODUCT-ntc100-eng
echo
make -j$CPU_JOB_NUM PRODUCT-ntc100-eng
if [ $? != 0 ] ; then
exit $?
fi
END_TIME=`date +%s`
echo "Total compile time is $((($END_TIME-$START_TIME)/60)) minutes $((($END_TIME-$START_TIME)%60)) seconds"
==================================================================================
저장하고 나온 후에
(
이 명령은 samsung의 C100 code를 보면 build script가 있는데 그것을 베낀 것입니다.
실제로는 host의 cpu갯수를 읽은 후에
make PRODUCT-ntc100-eng
-j 옵션을 이용해서 실행하는 것입니다.
)
생성된 script에 실행 permission을 줍니다.
chmod 755 ntc100.sh
5. android build
android top 디렉토리에서
./ntc100.sh
여기서 cpu가 별루 없는 장비 혹은 virtual box를 이용하시는 분들은 한숨 주무시던지, 어디가서 찐하게 놀다오시면
됩니다.
cpu 1개의 경우 대략 4시간 걸립니다. cpu 4개면 대략 1시간 걸릴겁니다.
6. 다 build 된 후 NFS용 root filesystem 만들기
// make rootfs with nfs
cd out/target/product/ntc100
mkdir /root/work/rootfs/test
cp -a root/* /root/work/rootfs/test
cp -a data/* /root/work/rootfs/test/data/
cp -a system/* /root/work/rootfs/test/system/
cd /root/rootfs/gst
chown -R root.root *
chmod -R 777 data system
이렇게 해서 root filesystem을 만든 후에 init.rc를 nfs로 부팅할 수 있도록 수정한다.
(nfs.init.rc 참조)
※ mkrootfs script 참고
7. NFS 세팅 후 부팅
vi /etc/exports
해당 디렉토리 부분 추가한 후
/root/work/rootfs/test *(rw,no_root_squash,no_all_squash)
nfs server restart
/etc/init.d/nfs-kernel-server restart
bootloader에서 boot argument를 다음과 같은 방식으로 추가해 주시고 부팅하시면 됩니다.
setenv bootargs mem=256M init=/init root=/dev/nfs rw nfsroot=192.168.0.199:/root/work/rootfs/test ip=192.168.0.101:192.168.0.199:192.168.0.1:255.255.255.0::eth0:off console=ttySAC1,115200n81
----------------------------------------------------------------------------------------------------------------------------
자 이렇게 하시면 android로 부팅은 시작하는데, 실제로 부팅은 안될겁니다........ㅎㅎ
다음시간에는 부팅이 안되는 이유와 수정사항에 대해서 설명드리겠습니다.
(수정은 오래 안걸립니다......Battery 문제라 몇줄만 고쳐주시면 부팅은 금방 되거든요...^^)
nfs 형태의 부팅은 ethernet 있는 보드만 가능하지만......
실제로 usb gadget을 cdc ethernet으로 세팅을 하시면 usb device로도 가능합니다.
대부분의 핸폰 제조사에서는 fastboot를 이용한 nand writing으로 개발하고 있습니다만...
개인적으로는 nfs의 속도를 따라오기는 좀 힘들지 않을까 생각합니다.
그리고, NFS 없이 리눅스 개발은 앙코없는 찐빵이 아닐까나........하고 생각도 해 봅니다...ㅎㅎ
그래서 ethernet없는 분들을 위해서 odroid관련 공부하시는 분들이 내놓은 해법이 여기 있습니다...,^^
http://www.aesop.or.kr/?document_srl=245257#2
당근 aesop c100은 되겠지요?....안될래나....나중에 함 해봐야겠습니다.
ㅎㅎ