개요
테스트 환경
준비할 것들
커널 수정하기
make menuconfig 실행
프레임 버퍼 커널 소스 수정
이미지 파일을 PNM 파일로 변환하기
커널 이미지 컴파일
EZ-보드로 커널 이미지 전송 및 재 부팅
에러 참고

개요

이 강좌는 커널 부팅시 LCD로 나오는 펭귄 로고 이미지를 바꾸는 방법에 대한 기술 문서입니다.

테스트 환경

내용 버전
리눅스 배포판
  • Fedora Core 3 이상
  • CentOS 5
  • 우분투
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으로 하겠습니다.
  • 또한 로고로 사용할 새로운 이미지 파일을 가지고
    1. logo_falinux_clut224.ppm 파일을 만든 후,
    2. 이 파일로 다시 logo_falinux_clut224.c 를 만들고,
    3. 이 C 소스 파일 안에 생성되는 logo_falinux_clut224 값을 이용하여
      커널 이미지를 생성하겠습니다.
  1. 커널 이미지 준비
    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   // 미리 준비된 기본 설정 파일로 환경값을 생성
  1. 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

  1. 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
  1. 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 실행

]# 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);

이미지 파일을 PNM 파일로 변환하기

설정된 이미지 해상도에 맞는 이미지를 만듭니다.

이미지 참고
  • 여기서 설명은 640x480으로 합니다.
  • 다른 해상도도 아래와 같은 방법으로 하면 됩니다.

테스트를 위해 타겟보드의 프레임 버퍼 해상도를 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-보드로 전송합니다. 커널 이미지를 보드로 전송하는 방법에 대해서 통합 메뉴얼- 에 자세히 설명되어 있습니다. 내용을 참고하세요.

아래 내용은 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에서 지정한 환경 변수 이름이 다르지 않은 지를 확인하십시오.