개요
테스트 환경
준비할 것들
커널 수정하기
make menuconfig 실행
프레임 버퍼 커널 소스 수정
이미지 파일을 PNM 파일로 변환하기
커널 이미지 컴파일
EZ-보드로 커널 이미지 전송 및 재 부팅
에러 참고
이 강좌는 커널 부팅시 LCD로 나오는 펭귄 로고 이미지를 바꾸는 방법에 대한 기술 문서입니다.
내용 | 버전 |
리눅스 배포판 |
|
EZ-보드 커널 | linux-2.6.21 |
EZ-보드를 부팅할 때 출력되는 이미지는 이미지 파일을 그대로 읽어다가 출력하는 것이 아니라 출력할 이미지 파일을 C 소스 파일로 생성한 후, 컴파일 과정을 거쳐 커널 이미지에 추가하는 것입니다. 그러므로 이미지를 C 소스 파일을 만들기 위한 pnm 프로그램이 필요합니다.
이 프로그램을 미리 준비합니다.
■ 프로그램이 있는지 확인
아래의 프로그램 파일이 있는지 확인합니다. 이미지를 pnm 으로 변환하는 많은 실행 파일이 있지만 여기서는 gif, png, bmp, jpeg 를 예로 듭니다.
]# ls /usr/bin/giftopnm /usr/bin/giftopnm ]# ls /usr/bin/pngtopnm /usr/bin/pngtopnm ]# ls /usr/bin/bmptopnm /usr/bin/bmptopnm ]# ls /usr/bin/jpegtopnm /usr/bin/jpegtopnm ]# ls /usr/bin/pnmtoplainpnm /usr/bin/pnmtoplainpnm ]# ls /usr/bin/pnmquant /usr/bin/pnmquant ]# ls /usr/bin/pnmnoraw /usr/bin/pnmnoraw위의 파일 정도만 확인 하면 됩니다.
■ 프로그램 설치
위의 파일들이 없다면 netpbm 이라는 패키지를 설치 해 주어야 합니다.
- 우분투의 경우 설치
]# apt-get install netpbm
- Fedora Core 3 이상
http://rpmfind.net/linux/rpm2html/search.php?query=netpbm+&submit=Search+...
해당 배포판 버젼에 맞는 netpbm-xxx rpm을 다운받아서 설치를 합니다.
Fedora Core 의 경우 배포판 설치시 모든 파일 설치를 하면 기본적으로 포함되어 있습니다.
- CentOS 5 경우
yum install로 설치합니다.
]# yum install netpbm-progs설치 작업 후에 /usr/bin에 프로그램이 제대로 설치되었는지 확인합니다.
- 커널 이미지 준비
EZ-PXA270을 구매했을 때 동봉된 CD 안의 커널 이미지 또는 EZ-PXA270의 자료실 게시판에서 커널 이미지 파일을 내려 받아 적당한 곳에 압축 풀기를 합니다.
커널 이미지 파일 이름은 linux-2.6.21.tar.gz 입니다.
]# tar zxvf linux-2.6.21.tar.gz ]# cd linux-2.6.21 // 압축이 풀린 디렉토리로 이동 ]# make distclean // 모든 환경 설정 및 컴파일 결과를 삭제 ]# ./falinux-config.sh ez-pxa270 // 미리 준비된 기본 설정 파일로 환경값을 생성
- drivers/video/logo/Kconfig 파일 내용 수정
]# vi drivers/video/logo/Kconfig 23 config LOGO_LINUX_CLUT224 24 bool "Standard 224-color Linux logo" 25 depends on LOGO 26 default y 27 아래의 노랑색 문자열을 입력합니다. 28 config LOGO_FALINUX_CLUT224 29 bool "FALINUX 224-color Linux logo" 30 depends on LOGO 31 default y 32 33 config LOGO_DEC_CLUT224 34 bool "224-color Digital Equipment Corporation Linux logo" 35 depends on LOGO && (MACH_DECSTATION || ALPHA) 36 default y
- drivers/video/logo/Makefile 파일 내용 수정
]# vi drivers/video/logo/Makefile 5 obj-$(CONFIG_LOGO_LINUX_VGA16) += logo_linux_vga16.o 6 obj-$(CONFIG_LOGO_LINUX_CLUT224) += logo_linux_clut224.o 7 obj-$(CONFIG_LOGO_FALINUX_CLUT224) += logo_falinux_clut224.o <----- 추가 8 obj-$(CONFIG_LOGO_DEC_CLUT224) += logo_dec_clut224.o 9 obj-$(CONFIG_LOGO_MAC_CLUT224) += logo_mac_clut224.o
- drivers/video/logo/logo.c 파일 내용 수정
]# vi drivers/video/logo/logo.c 26 extern const struct linux_logo logo_linux_clut224; 27 extern const struct linux_logo logo_falinux_clut224; <---- 추가 28 extern const struct linux_logo logo_dec_clut224; : 65 if (depth >= 8) { 66 #ifdef CONFIG_LOGO_LINUX_CLUT224 67 /* Generic Linux logo */ 68 logo = &logo_linux_clut224; 69 #endif 70 #ifdef CONFIG_LOGO_FALINUX_CLUT224 <---- 추가 71 /* Generic Linux logo */ 72 logo = &logo_falinux_clut224; 73 #endif 74 #ifdef CONFIG_LOGO_DEC_CLUT224 75 /* DEC Linux logo on MIPS/MIPS64 or ALPHA */ 76 #ifndef CONFIG_ALPHA
]# make menuconfig Device Drivers ---> Graphics support ---> [ ] Backlight & LCD device support ---> <*> Support for frame buffer devices [ ] Enable firmware EDID [ ] Enable Video Mode Handling Helpers [ ] Enable Tile Blitting Support --- Frame buffer hardware drivers < > EP93xx frame buffer support < > EP93xx Mono frame buffer support < > Epson S1D13XXX framebuffer support <*> PXA LCD framebuffer support [*] LCD 640x480 Display [ ] LCD 480x272 Display [*] PXA LCD command line parameters < > 2700G LCD framebuffer support < > Virtual Frame Buffer support (ONLY FOR TESTING!) Console display driver support ---> Logo configuration ---> [*] Bootup logo [ ] Standard black and white Linux logo <---- 선택을 해지합니다. [ ] Standard 16-color Linux logo <---- 선택을 해지합니다. [ ] Standard 224-color Linux logo <---- 선택을 해지합니다. [*] FALINUX 224-color Linux logo <---- 선택합니다.
커널에서 타겟보드에 맞는 프레임버퍼에서 다음과 같이 수정해 줘야합니다.
수정할 부분은 xxx_probe 함수를 찾아서 return 하기 전에 다음의 소스를 추가해 주면 됩니다.
#if !defined(CONFIG_FRAMEBUFFER_CONSOLE) && defined(CONFIG_LOGO) if (fb_prepare_logo(&fbi->fb, FB_ROTATE_UR)) { printk("Start display and show logo\n"); /* Start display and show logo on boot */ fb_set_cmap(&fbi->fb.cmap, &fbi->fb); fb_show_logo(&fbi->fb, FB_ROTATE_UR); } #endif
■ 수정 예
]# vi drivers/video/xxxxfb.c int __init xxx_probe(struct platform_device *dev) { ..... ..... ..... #if !defined(CONFIG_FRAMEBUFFER_CONSOLE) && defined(CONFIG_LOGO) if (fb_prepare_logo(&fbi->fb, FB_ROTATE_UR)) { printk("Start display and show logo\n"); /* Start display and show logo on boot */ fb_set_cmap(&fbi->fb.cmap, &fbi->fb); fb_show_logo(&fbi->fb, FB_ROTATE_UR); } #endif return 0; }
예로 EZ-PXA270은 pxafb.c 입니다.
]# vi drivers/video/pxafb.c int __init pxafb_probe(struct platform_device *dev) { struct pxafb_info *fbi; struct pxafb_mach_info *inf; int ret; : /* * Ok, now enable the LCD controller */ set_ctrlr_state(fbi, C_ENABLE); #if !defined(CONFIG_FRAMEBUFFER_CONSOLE) && defined(CONFIG_LOGO) if (fb_prepare_logo(&fbi->fb, FB_ROTATE_UR)) { printk("Start display and show logo\n"); /* Start display and show logo on boot */ fb_set_cmap(&fbi->fb.cmap, &fbi->fb); fb_show_logo(&fbi->fb:set, FB_ROTATE_UR); } #endif return 0; failed: platform_set_drvdata(dev, NULL);
설정된 이미지 해상도에 맞는 이미지를 만듭니다.
테스트를 위해 타겟보드의 프레임 버퍼 해상도를 640x480으로 설정하고, 640x480이미지를 만듭니다.
이미지 파일 명은 image640x480.gif 이며, 최종 파일은 logo_falinux_clut224.ppm 입니다.
]# giftopnm image640x480.gif | pnmtoplainpnm > image640x480.ppm --> 준비한 gif로 ppm 파일을 생성 ]# pnmquant -fs 223 image640x480.ppm > image640x480_256.ppm --> ppm 파일을 가공 ]# pnmnoraw image640x480_256.ppm > logo_falinux_clut224.ppm --> ppm 파일을 가공 ]# cp -a logo_falinux_clut224.ppm drivers/video/logo/ --> 생성된 ppm 파일을 커널 소스로 복사
]# make clean ]# make zImage 정상적으로 컴파일되면 아래와 같이 생성된 이미지 이름이 출력됩니다. GZIP arch/arm/boot/compressed/piggy.gz AS arch/arm/boot/compressed/piggy.o CC arch/arm/boot/compressed/misc.o AS arch/arm/boot/compressed/head-xscale.o LD arch/arm/boot/compressed/vmlinux OBJCOPY arch/arm/boot/zImage Kernel: arch/arm/boot/zImage is ready ]# 생성된 커널 이미지를 tftp를 이용하여 전송하겠습니다. 전송을 위해 /tftpboot 로 커널 이미지를 이동합니다. ]# mv arch/arm/boot/zImage /tftpboot/zImage.ez-pxa270
이제 커널 이미지를 EZ-보드로 전송합니다. 커널 이미지를 보드로 전송하는 방법에 대해서 통합 메뉴얼- 에 자세히 설명되어 있습니다. 내용을 참고하세요.
아래 내용은 EZ-PXA270에서의 커널 전송을 예로 들겠습니다.
WELCOME EZBOOT V2.2.49 (FALINUX Co.,Ltd) ..........PXA270(EZ-PXA270) Program by You Young-chang, Oh Jae-Kyoung, Jang Hyung-Gi Last Modify May 27 2008 Detect ES29LV400_B Flash : vid=4A pid=22BA SIZE 4-Mbits [512-Kbytes] Detect Samsung NAND 64M 3.3V 8-bit Flash : vid=EC pid=76 SIZE 64-Mbytes (page=512, block=16K) Quickly Autoboot [ENTER] / Goto BOOT-MENU press [space bar]. <--스페이스바를 누릅니다. AX88796B MAC : [ 00 FA 08 25 00 06 ]
AX88796B_Init : OK! EZBOOT>set <-- set 입력 후 엔터키를 누릅니다. ^^; 1) mac address : 00:FA:08:25:00:06 2) local ip : 192.168.10.95 3) local netmask : 255.255.255.0 4) local gateway : 192.168.10.1 5) server ip : 192.168.10.100 <-- 개발 호스트 IP와 다르다면 수정합니다. 6) zImage file name : zImage.ez-pxa270 <-- 전송될 커널 이미지 파일 이름입니다. 7) ram disk file name : ramdisk-1.10-12M.gz 8) boot loader file name : ezboot.ez-pxa270 9) logo image file name : 10) auto execute full name : 11) autoboot wait time : 3 12) copy ramdisk [Y/N] : Y 13) arm kernel arch number : 3003 14) nand part (B,C,L,K,R,A): 0,1,0,3,5,55 15) watchdog (sec, off=0) : 0 16) KCMD 1 : mem=64M 17) KCMD 2 : initrd=0xA0800000,5M root=/dev/ram ramdisk=16384 18) KCMD 3 : console=ttyPXA2,115200 19) KCMD 4 : 20) KCMD 5 : 21) KCMD 6 : L) Load default LF) load KCMD2 root=flash LR) load KCMD2 root=ramdisk S) Save to flash P) aPply & exit Q) Quit Select >> q <-- q와 엔터키로 set 모드를 빠져 나갑니다. EZBOOT> tfk <-- tfk 명령으로 서버로부터 커널 이미지를 내려 받습니다. receive zImage.ez-pxa270 tx ARP rx ARP HOST MAC : 00:0C:29:EB:0B:33 HOST IP : 192.168.10.51 LOCAL IP : 192.168.10.95 option [timeout 120 tsize 1920060] size = 1914880 size = 1920060 ...write 1920060 complete ...verify complete EZBOOT>rst <-- 보드를 재 부팅합니다. System Soft Reset....... EZBOOT> WELCOME EZBOOT V2.2.49 (FALINUX Co.,Ltd) ..........PXA270(EZ-PXA270) Program by You Young-chang, Oh Jae-Kyoung, Jang Hyung-Gi Last Modify May 27 2008 Detect ES29LV400_B Flash : vid=4A pid=22BA SIZE 4-Mbits [512-Kbytes] Detect Samsung NAND 64M 3.3V 8-bit Flash : vid=EC pid=76 SIZE 64-Mbytes (page=512, block=16K) ... Copy Kernel Image ..... Copy Ramdisk Image ..... Starting kernel [MARCH 3003]... kernel command [EZBOOT mem=64M initrd=0xA0800000,5M root=/dev/ram ramdisk=16384 console=ttyPXA2,115200 ip0=192.168.10.95 mac=00:FA:08:25:00:06 netmask=255.255.255.0 gw=192.168.10.1 host=192.168.10.51 nandparts=1,8,55 ] Uncompressing Linux........ ....중략... yaffs: dev is 32505858 name is "mtdblock2" yaffs: passed flags "" yaffs: Attempting MTD mount on 31.2, "mtdblock2" yaffs: auto selecting yaffs1 Starting system logger: [ OK ] Starting INET services: [ OK ] eth0 Link mode : 100 Mb/s Duplex mode. Welcome to FALinux (www.falinux.com) Linux Kernel 2.6.21-falinux falinux login: <-- 로그인 메시지가 출력되면 성공한 것입니다.
자, 재부팅을 하면 새로 지정한 이미지 파일이 출력됩니다.
커널 이미지 생성 중에 아래와 같이 에러가 난다면,
]# make clean ]# make zImage 컴파일 중에 아래와 같은 에러가 발생하는 경우가 있습니다. AR lib/lib.a GEN .version CHK include/linux/compile.h UPD include/linux/compile.h CC init/version.o LD init/built-in.o LD .tmp_vmlinux1 drivers/built-in.o(.text+0xb624): In function `fb_find_logo': : undefined reference to `logo_falinux_clut224' make: *** [.tmp_vmlinux1] 오류 1 // drivers/video/logo/에는 logo_falinux_clut224.ppm 뿐만 아니라 // logo_falinux_clut224.c 파일도 정상적으로 생성되었는데도 // 위의 에러가 발생한다면, 이는 Makefile 에서 C 소스 파일을 참고할 환경 값이 // 올바르게 지정되지 않았을 경우 발생합니다. 예로 환경 값 이름의 오타일 경우입니다. ]# vi drivers/video/logo/Makefile 5 obj-$(CONFIG_LOGO_LINUX_VGA16) += logo_linux_vga16.o 6 obj-$(CONFIG_LOGO_LINUX_CLUT224) += logo_linux_clut224.o 7 obj-$(CONFIG_LOGO_FALINUXCLUT224) += logo_falinux_clut224.o ---> FALINUX와 CLUT2244 사이에 밑줄이 없습니다. 8 obj-$(CONFIG_LOGO_DEC_CLUT224) += logo_dec_clut224.o 9 obj-$(CONFIG_LOGO_MAC_CLUT224) += logo_mac_clut224.o // 그러므로 drivers/video/logo/logo.c 에서 사용한 환경변수 이름과 // Makefile에서 지정한 환경 변수 이름이 다르지 않은 지를 확인하십시오.
따라서 다른 프레임버퍼에서 이 구조체를 보시고 수정해 주셔야 합니다.
현재 위의 화면에서 콘솔 메세지가 이미지 위에 나오는 것을 볼 수 있습니다.
프레임 버퍼 커널 소스 수정이라는 부분은 아래와 같이 하여 콘솔을 제거할 경우에 실행되게 되어 있습니다.
#make menuconfig 에서
Device Drivers --->
Graphics support --->
Console display driver support --->
[ ] VGA text console
< > Framebuffer Console support
이렇게 Framebuffer Console support 체크를 없애주셔야 합니다.
이렇게 체크를 없애면
#if !defined(CONFIG_FRAMEBUFFER_CONSOLE) && defined(CONFIG_LOGO)
에서 !defined(CONFIG_FRAMEBUFFER_CONSOLE) 를 만족하게 됩니다.
Device Drivers --->
Graphics support --->
Console display driver support --->
Logo configuration --->
[*] Bootup logo
Bootup logo 를 체크하시면 defined(CONFIG_LOGO) 의 조건은 만족합니다.
따라서 위의 두 조건이 만족하면 이미지 위에 콘솔 메세지가 나오지 않고 이미지만 나오게 됩니다.
[참고]
강좌에서는 gif 로 설명이 되어 있지만 bmp, png, jpeg 등 여러가지 이미지포맷을 지원합니다.
리눅스 시스템에서 원하는 이미지 포맷일 있는지 확인해 보시고 작업을 해 보세요.
anytopnm bmptopnm fiascotopnm fitstopnm gemtopnm giftopnm jpegtopnm palmtopnm pngtopnm pstopnm rasttopnm rletopnm sgitopnm sirtopnm tifftopnm xwdtopnm zeisstopnm
[---]
EZ-S2440의 경우 Framebuffer Console support 체크를 없애면 화면에 표출이 되지 않습니다.
체크옵션을 선택해 주세요..