기본적으로 제공하는 모든 코드를 올릴수 있는 상태에서 진행.
*www.hardkernel.com에서 제공하는 "초보자를 위한 ODROID-7으로 Android 빌드하기"를 모두 따라 해보고
시도 하시기 바랍니다. 설정이나 기타 옵션등이 많더라구요.
1) U-Boot
2) Kernel
3) ramdisk
///////////////////////////////////////////////////////////////////////////////////////
//Odroid-T 24Bit BMP Logo Image 올리기 준비.
///////////////////////////////////////////////////////////////////////////////////////
1) Logo Image 생성.
initlogo.bmp 2.5MB(24Bit BMP Image (1149*766))
2) initlogo.bmp File copy
경로:/home/XXXX/Odroid-T/android/system/core/rootdir
3) logoFile Copy Cmd 추가.
경로:/home/XXXX/Odroid-T/android/system/core/rootdir/Android.mk
# 2011.03.09 seeingthesky Copy bmp Image.
file := $(TARGET_ROOT_OUT)/initlogo.bmp
$(file) : $(LOCAL_PATH)/initlogo.bmp | $(ACP)
$(transform-prebuilt-to-target)
ALL_PREBUILT += $(file)
4) 24Bit Image 처리 Code 추가.
경로:/home/XXXX/Odroid-T/android/system/core/init/init.h
#define INIT_IMAGE_FILE "/initlogo.bmp"//2011.03.09 seeingthesky chg bmp
int load_BMP24_image(char *fn, int IMGSizeW, int IMGSizeH);//2011.03.09 seeingthesky Add Function
경로:/home/XXXX/Odroid-T/android/system/core/init/init.c
int main(int argc, char **argv)
{
...
// if( load_565rle_image(INIT_IMAGE_FILE) ) {
//2011.03.09 seeingthesky chg Function
if( load_BMP24_image(INIT_IMAGE_FILE, 1149, 766) ) {
...
}
경로:/home/XXXX/Odroid-T/android/system/core/init/logo.c
//2011.03.09 seeingthesky Add Fn.
#define fb_size24BMP(fb) ((fb)->vi.xres * (fb)->vi.yres * 4) //Odroid-T LCD Memory size.
static int fb_open(struct FB *fb)
{
...
//2011.03.09 seeingthesky Change Function.
//fb->bits = mmap(0, fb_size(fb), PROT_READ | PROT_WRITE,
// MAP_SHARED, fb->fd, 0);
fb->bits = mmap(0, fb_size24BMP(fb), PROT_READ | PROT_WRITE,
MAP_SHARED, fb->fd, 0);
...
}
static void fb_close(struct FB *fb)
{
//2011.03.09 seeingthesky Change Function.
//munmap(fb->bits, fb_size(fb));
munmap(fb->bits, fb_size24BMP(fb));
close(fb->fd);
}
//2011.03.09 seeingthesky Add Function
//BMP24 image format: RGB24bit BMP Image Draw(rgb888)
int load_BMP24_image(char *fn, int IMGSizeW, int IMGSizeH)
{
struct FB fb;
struct stat s;
unsigned short *data;
int fd;
int *pByte;
char *pbufByte, *ptr;
int imgStepH, imgStepW, ScreenH, ScreenW;
int ImgToScreenOffset, BMP24Offset;
int CenterX, CenterY;
...
if (IMGSizeW>ScreenW || IMGSizeH>ScreenH)
goto fail_unmap_data;
//screeninfo Size
ScreenW = fb_width(&fb);
ScreenH = fb_height(&fb);
ptr = (char*)data; //Image Data.
ptr += (s.st_size); //BMP Up/Down ->Down/Up
pByte = (int*)fb.bits; //Disply Byte Pointer
//LCD Mem Image Center Cal.
CenterX = (ScreenW/2) -(IMGSizeW/2);
CenterY = (ScreenH/2) -(IMGSizeH/2);
pByte += CenterY*ScreenW;
pByte += CenterX;
ImgToScreenOffset = (ScreenW - IMGSizeW);
BMP24Offset = ((3 * IMGSizeW)%4);
if(BMP24Offset>0)
BMP24Offset = 4-BMP24Offset;
for(imgStepH =0; imgStepH < IMGSizeH; imgStepH++){
ptr -= ((IMGSizeW*3)+BMP24Offset); //Image Line Jump (24Bit BMP Offset add)
for(imgStepW =0; imgStepW < IMGSizeW*3; imgStepW+=3){ //BGR Image (Char Pointer 3Byte Jump)
pbufByte = (char*)pByte;
*(pbufByte+0) =*(ptr+imgStepW+0);//B
*(pbufByte+1) =*(ptr+imgStepW+1);//G
*(pbufByte+2) =*(ptr+imgStepW+2);//R
*(pbufByte+3) = 0x00; //A
pByte+=1;//LCD Memory Buffer 1 pixel move.
}
pByte += ImgToScreenOffset;//Screen Line Jump
}
...
}
5) Compaile 전 ramdisk img를 지우자.
(컴파일이 정상적으로 되면 마지막에 생긴다. - 현 Size check. 이후 File과 비교.)
경로:/home/XXXX/Odroid-T/android/odroidt-img/
odroidt-system.tar.gz
ramdisk-uboot.img
6) odroid Compaile(일부만 해도 된다는디 그냥해도 24sec이닌까 그냥 Go Go)
~/Odroid-T/android$ ./odroid_T_build
[[[[[[[ Make ramdisk image for u-boot ]]]]]]]
Image Name: ramdisk
Created: Wed Mar 9 19:34:19 2011
Image Type: ARM Linux RAMDisk Image (uncompressed)
Data Size: 3103969 Bytes = 3031.22 kB = 2.96 MB
Load Address: 0x30800000
Entry Point: 0x30800000
[[[[[[[ ok success !!! ]]]]]]]
7) initlogo.bmp Image Copy확인.(XXXX는 User Name)
경로:/home/XXXX/Odroid-T/android/out/target/product/odroidt/root
8) ramdisk-uboot.img 확인
경로:/home/XXXX/Odroid-T/android/odroidt-img/
odroidt-system.tar.gz
ramdisk-uboot.img(Size 증가.)
///////////////////////////////////////////////////////////////////////////////////////
//ramdisk-uboot.img File 올리기.
///////////////////////////////////////////////////////////////////////////////////////
1) minicom 연결.
2) Odroid-T Reset
3) 아무키나 누르기.(Minicom 터미널창에서 PC 키보드)
(* 아무키나 누르기라길래 Odroid-t의 조그키를 마구 눌렀다는 ㅠㅠ)
4) print명령.(기본 출력화면.)
# print
bootdelay=1
baudrate=115200
ethaddr=00:40:5c:26:0a:5b
ipaddr=192.168.0.20
serverip=192.168.0.10
gatewayip=192.168.0.1
netmask=255.255.255.0
args_mmc=setenv bootargs 'root=/dev/mmcblk0p2 rootfstype=ext3 rw init=/init console=ttySAC2,115200 androidboot.console=v
args_ram=setenv bootargs 'root=/dev/tfsr6 rootfstype=cramfs console=ttySAC2,115200 init=/linuxrc androidboot.console=s3v
dnwu=dnw 30008000; movi write u-boot 30008000
dnwk=dnw 30008000; movi write kernel 30008000
dnwr=dnw 30008000; movi write rootfs 30008000 300000
bootargs=root=/dev/tfsr6 rootfstype=cramfs console=ttySAC2,115200 init=/linuxrc androidboot.console=s3c2410_serial2
bootcmd=movi read kernel 30008000;movi read rootfs 31000000 180000;bootm 30008000 31000000
5) run dnwr로 올리면 "Verifying Checksum ... XXX"에서 Error가 난다.
*rootfs 31000000 180000이부분에서 180000이 rootfs Size이고, 이걸 키워줘야 한단다.
- 여러 웹문서및 AESOP, hardkernel,등에서 여러가지 힌트를 얻을수 있었다.
6) hkdkc110_mmc.h에서 설정 바꾸기.
경로:/home/XXXX/Odroid-T/uboot/include/configs
#define CFG_FASTBOOT_ADDR_RAMDISK (0x30A00000)
#define CONFIG_BOOTCOMMAND "movi read kernel 30008000; movi read rootfs 30A00000 180000; bootm 30008000 30A00000"
* 두개의 define의 값을 바꿔줘야 한단다.
#define CFG_FASTBOOT_ADDR_RAMDISK (0x31000000)
#define CONFIG_BOOTCOMMAND "movi read kernel 30008000; movi read rootfs 31000000 480000; bootm 30008000 31000000"
* 이렇게 바꿔 줬다.
******그런디 먼가 이상하다.
print문에나온 걸 보면
bootcmd=movi read kernel 30008000;movi read rootfs 31000000 180000;bootm 30008000 31000000 이렇게 출력되는디
코드에는 movi read kernel 30008000; movi read rootfs 30A00000 180000; bootm 30008000 30A00000 이렇게 되어있다.
그냥 진행 해본다.
7) U-Boot를 컴파일 하고 올린다.
cd uboot
make mrproper
make hkdkc110_mmc_config
make
sudo smdk-usbdl -f u-boot.bin
minicom
run dnwu
8)변경 사항 확인.(minicom에서 다시 print명령)
bootcmd=movi read kernel 30008000;movi read rootfs 31000000
180000;bootm 30008000 31000000
이부분은 변한게 없다 ㅡ.,ㅡ;;
movi read rootfs 31000000 180000;에서 180000부분만 키우면 LogoImage가 올라간다고 한다.
변화가 없다.
그냥 ramdisk-uboot.img를 올려 보자.
9)reset하고 Logo 이미지를 보자.
역시 "Verifying Checksum ... XXX"에서 Error가 난다.(다른 Error형태로 출력될수도 있다.-여러가지 정황을 봐선)
이것저것 건드려 보니 ㅡ,.ㅡ U-Boot도 안뜬다 Reset도 안되고 ㅡ.,ㅡ;
받아둔 이미지로 다시 처음 부터 다운로드 해야 했다.
(ODROID_TF_Burner_22a.exe로 odroidt-20110119를 다시 다운로드했음.)
10)여러가지 시도와 웹문서 찾기 시도.
아무리 찾아도 위에 항목만 해주면 된다고들 한다...
거짓말 조금 보태서 설정 바꿔가며 수백번 해도 print문 후에
bootcmd=movi read kernel 30008000;movi read rootfs 31000000
180000;bootm 30008000 31000000
이문장의 변화가 없었다.
set bootcmd 'movi read kernel 30008000;movi read rootfs 31000000 480000;bootm 30008000 31000000'
를해도 Reset하고 나면 그대로 였음.
조금 다른 문서들을 찾아 보니 설정 변경을 하는데 바뀌질 않아서 Parameter부분을 Reset하고,
다시 저장 해야 한다는 말이 있었다.
Parameter? 코드상에 변경 한거 말고 다른곳에 저장 되는 무언가가 있나 보다.
한참을 찾아다녔다.......뭐가 빠진걸까???????????????????????????????
parameter를 저장하려면
"saveenv"를 해야 한단다.(으미 찾은거 같다 !!!)
set bootcmd 'movi read kernel 30008000;movi read rootfs 31000000 480000;bootm 30008000 31000000'
saveenv
Reset하고 확인
bootcmd=movi read kernel 30008000;movi read rootfs 31000000 480000;bootm 30008000 31000000
드디어 바뀌었다 ㅠㅠ...감격~!
11) Reset하고 Logo Image 보기.
울 이쁜 아들 사진이 화면 중앙에 뜬다~ㅎㅎ
이상 Odroid-T에서 24Bit Image 그대로 올리기 였습니다.
************************************************************************************************************************
사실 "ramdisk-uboot.img File 올리기."를 먼저 해본것입니다.
BMP Logo Image올리는건 큰용량 uboot.img가 올라가는걸 먼저 해보고
24bit뿌리는 프로그램을 한겁니다.
여러가지 Image Size와 rgb2565변환 해가면서 많은 시도를 해보았습니다.
너무 쉽게 되었다면 얻지 못했을것들도 얻고 ㅎㅎ 좀 짜증도 나긴했지만.. ^^;;;
결과를 보니 속이 후련하내요.
사용한 파일들 첨부해서 올립니다. 참고 하세요.
처음 안드로이드나 임베디드 시스탬에 접하시는 분들은
Logo 바꾸기 해보시면 재미를 느끼실꺼 같습니다 ^^*
*혹시 코드에 저작권 같은거 있음 바로 내릴께요 첨부 파일.
- 주석으로 "seeingthesky"로 된부분이 수정한 부분입니다.
여러가지 파일과 관련 문서들을 작성해주신
모든 분들께 감사 드립니다.(*^^*)