2009.07.16 22:10

2.6.28 커널로 갈아타기 - EZ-X7 시리얼 포팅

부트로더 버전 확인


PXA270 프로세서 보드인 EZ-X7 시리얼 포팅입니다.

EZ-X7 부트로더를 한번 확인해 봅시다.

제 것은 이렇게 나왔습니다. 

 

[A014_010_boot_loader_version.png]

오 예~~

좋네요 V2.3.04 군요

 

환경을 맞추어 봅시다.

set 명령을 사용해서

EZBOOT>set
^^;
   1) mac address            : 00:FA:07:78:27:04
   2) local ip               : 192.168.10.188
   3) local netmask          : 255.255.0.0
   4) local gateway          : 192.168.10.1
   5) server ip              : 192.168.10.61
   6) zImage      file name  : zImage.ez-pxa270
   7) ram disk    file name  : ramdisk-1.11-16M.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 : 1010
  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=ttyS2,115200
  19) KCMD 4 : video=ezfb:panel:2
  20) KCMD 5 :
  21) KCMD 6 :

  L)  Load default
      LF) load KCMD2 root=flash
      LR) load KCMD2 root=ramdisk
  M)  generlate Mac address
  S)  Save to flash
  P)  aPply & exit
  Q)  Quit

  Select >>

자신의 네트워크 상황에 맞도록 2,3,4,5 항을 수정하십시오.
위 예시는 제 보드의 네트워크 설정입니다.

그리고 환경 저장을 하시고

rst 명령을 사용하거나 전원을 껐다가 켜서 다시 보드를 부팅 시킵니다.

커널 소스 클리어


이제 싸~~악… 소스를 클리어 하는 것이 제일 좋겠죠?

이제 반복적이죠?

기억 나시죠 ? 다음 명령들

  
   [root@localhost linux]# make mrproper
   [root@localhost linux]# make distclean

예..

이제 소스 쌱~~ 청소 되었습니다.


커널 컴파일 환경 설정 준비


자 이제 이전에 설정된 환경을 찾아 보죠..

어디서요?

linux/arch/arm/configs/

에서요..

일단 이곳에서 PXA270용을 찾아 봅시당.

아무래도 인텔(지금은 마벨)에서 나왔던 평가 보드가 처음 선택에는 유리할지도...

mainstone_defconfig 란 이름이네요

밑져야 본전

이놈을 가지고 시작해 봅시다.

여기서 잠깐!

이전 강좌를 보지 않으신 분들이 가장 먼저 해야 하는 것은
Makefile을 약간 손보아야 합니다.

커널소스 linux\Makefiel 에서 193 라인 쯤에 가면

크로스 컴파일을 위한 처리 부분이 있습니다.

193 ARCH            ?= $(SUBARCH)
194 CROSS_COMPILE   ?=

이 부분을 arm 용 크로스 컴파일이 될 수 있도록 다음과 같이 고칩니다.

193 ARCH            ?= arm
194 CROSS_COMPILE   ?= arm-linux-


이 부분에 대한 약간(?)의 설명은 2410 부분의 강좌를 참조해 주세요

2410부터 따라한 분들은 이미 되어 있겠죠?
 

자 이제 커널 컴파일 옵션 적용을 해 봅시다.

make mainstone_defconfig

이렇게 하면 한방에

mainstone 컴파일 옵션 설정 상태로 만들어 버립니다.

[root@localhost linux]# make mainstone_defconfig
HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/basic/docproc
  HOSTCC  scripts/basic/hash
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/kxgettext.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/lex.zconf.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
#
# configuration written to .config
#
[root@localhost linux]#


시리얼 출력을 하기 위한 커널 소스 패치


이쯤 되면 시리얼 출력을 하기 위해서 다음 두 가지를 처리해야 한다는 것을 인식하시겠죠?

1)    시리얼 포트
2)    머신 아키텍쳐 번호

EZ-X7 의 콘솔용 시리얼 포트는 몇 번일까요?

이지부트 소스를 보면 알 수 있죠..
아니면 이지부트에서 전달하는 커널 커맨드 console= 에 어떤 포트가 지정되어 있는가를 보면 알 수 있죠..

console=ttyS2,115200

이렇게 되어 있네요?

예 2 번째 포트를 사용합니다.

그런데 …

PXA 커널 옵션을 들여다 보면 삼성 프로세서 처럼 시리얼 포트를 컴파일 환경 설정 메뉴에서 지정할 수 없습니다.

즉 소스를 패치 해야 한다는 겁니다.

의심스러우시면 S3C2440이나 S3C2410 에서 했던 것처럼 커널 컴파일 환경 설정 메뉴를 따라 가 보시기 바랍니다.

어찌되었든 첫번째 압축 해제를 위해서 수정해야 할 소스는 여기 입니다.

arch/arm/mach-pxa/include/mach/uncompress.h

아주 심플하게 필요한 매크로 함수만 정의되어 있는 소스가 보이죠?

소스상에서 보면

static volatile unsigned long *UART = FFUART;

를 보면 알겠지만

메인스톤은 EZ-X7과 달리 UART0 으로 압축 해제 메시지를 처리 하고 있습니다.

그런데 저희는 UART2 로 해야죠? 이건 이름이 STUART 입니다.

그런데 소스상에 arch_decomp_setup 함수에 비슷하게 있는데 조건 문이 보이죠?

그래서 그냥 다음과 같이 수정해 버립니다.

static inline void arch_decomp_setup(void)
{
//      if (machine_is_littleton())
                UART = STUART;
}



자 시리얼 포트를 조정했으니
정상적으로 부팅이 진행되도록 머신 아키텍쳐 번호를 알아내야 합니다.

리눅스 소스에 있는 파일에서 찾아 봅시다.

linux/arch/arm/tools/mach-types

422 번째 라인을 보면 메인스톤이 보일 겁니다.

mainstone    MACH_MAINSTONE    MAINSTONE   406

예…

머신 아키텍쳐 번호는 406 번 되겠네요

이 값을 나중에 이지부트에서 설정하면 됩니다. 


커널 컴파일 및 tftp 복사


이제 커널 컴파일을 해야 겠죠?

[root@localhost linux]# make zImage

별 무리 없이 컴파일 될 겁니다.

한가지 흠이라면 약간의 시간이 걸리죠 ㅋㅋ

이제 생성된 zImage 를 tftp 디렉토리에 복사합니다.

[root@localhost linux]# cp arch/arm/boot/zImage /tftpboot/zImage.ez-pxa270

이지부트 머신 아키텍쳐 번호 수정


부트로더에서 set 명령을 이용하여 아키텍쳐 번호를 406으로 수정합니다. 

 

[A014_020_ezboot_set.png]

S 로 저장하고 Q 로 빠져 나옵니다. 



커널 다운 로드 와 부팅


tfk 명령을 통해서 커널 이미지를 다운 받습니다.

 
 
[A014_030_kernel_download.png]

rst명령을 사용하여 부팅합니다.


 

자 어떻게 될까요?

두근 두근…..

  

[A014_040_kernel_fail.png]

흑흑흑..

도대체 한번에 넘어가는 적이 없군요…

이번엔 또 무슨 문제 일까요?


디버그 메시지 처리



arch/arm/mach-pxa/include/mach/debug-macro.S

여기서  addruart 매크로는 rx 에 전달된 값에 디버그용 시리얼 포트 주소값을 전달하게 하는 매크로입니다.

그러므로 여기서 주소를 지정해 주어야 합니다.

원래는 이렇게 되어 있습니다.


               .macro  addruart,rx
                mrc     p15, 0, \rx, c1, c0
                tst     \rx, #1                 @ MMU enabled?
                moveq   \rx, #0x40000000                @ physical
                movne   \rx, #io_p2v(0x40000000)        @ virtual
                orr     \rx, \rx, #0x00100000
                .endm



이걸 다음과 같이 주소를 바꿉니다.
STUART  는 주소가 0x40700000 이므로


               .macro  addruart,rx
                mrc     p15, 0, \rx, c1, c0
                tst     \rx, #1                 @ MMU enabled?
                moveq   \rx, #0x40000000                @ physical
                movne   \rx, #io_p2v(0x40000000)        @ virtual
                orr     \rx, \rx, #0x00700000
                .endm


로 바꾸어 줍니다.

그리고 커널 컴파일 후 다시 실행해 봅니다.

역시~~ 마찬가지

도대체 왜 이럴까요?

X5 의 경험을 되살려 보자


X5의 경험을 되살려 봅시다.

아무래도

3가지를 점검할 필요가 있겠죠?

부트파라메터가 전달되고 있는가? 가 첫번째 점검 사항이죠?

arch/arm/mach-pxa/mainstone.c 파일에 다음 내용이 있는 가를 보는 거죠

.boot_params    = 0xa0000100,   /* BLOB boot parameter setting */

있군요..  쩝

그러면 LED와 프레임 버퍼를 꺼 봅시당.

make menuconfig 를 수행해서 다음 부분을 찾아 설정해 봅시다.

Kernel Features  --->
               [ ] Timer and CPU usage LEDs

Device Drivers  --->
              Graphics support  --->
                         < > Support for frame buffer devices  --->


위가 어떤 의미인지는 알겠지요?

다운로드 하고 다시 부팅해 봅시당..

그..러..나

결과는 마찬가지 ..


휴우~~~~ 거저 먹는 법이 없어요…


그래도 역시 인터럽트..


그렇다고 포기 하면 안되지요…

이런 경우 추정 가능한 원인은 인터럽트라고 말씀 드렸죠?

그렇다면 메인스톤 보드 역시 의심해 봐야 겠죠…

arch/arm/mach-pxa/mainstone.c 파일은 메인스톤의 설정 파일입니다.

이 파일안에서 mainstone_init_irq() 함수에서 기본 PXA270 인터럽트 설정 부분을 제외한 모든 부분을 주석 처리해 봅니다.

 

[arch/arm/mach-pxa/mainstone.c]
  

171 static void __init mainstone_init_irq(void)
    172 {
    173         int irq;
    174
    175         pxa27x_init_irq();
    176
    177         /* setup extra Mainstone irqs */
    178 //      for(irq = MAINSTONE_IRQ(0); irq <= MAINSTONE_IRQ(15); irq++) {
    179 //              set_irq_chip(irq, &mainstone_irq_chip);
    180 //              set_irq_handler(irq, handle_level_irq);
    181 //              if (irq == MAINSTONE_IRQ(10) || irq == MAINSTONE_IRQ(14))
    182 //                      set_irq_flags(irq, IRQF_VALID | IRQF_PROBE | IRQF_NOAUTOEN);
    183 //              else
    184 //                      set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
    185 //      }
    186 //      set_irq_flags(MAINSTONE_IRQ(8), 0);
    187 //      set_irq_flags(MAINSTONE_IRQ(12), 0);
    188
    189 //      MST_INTMSKENA = 0;
    190 //      MST_INTSETCLR = 0;
    191
    192 //      set_irq_chained_handler(IRQ_GPIO(0), mainstone_irq_handler);
    193 //      set_irq_type(IRQ_GPIO(0), IRQ_TYPE_EDGE_FALLING);
    194 }

그리고 컴파일 하고 다시 재 부팅…

> COM Port              : COM4
> Baud Rate             : 115200
> Data Bits             : 8
> Parity                : None
> Stop Bits             : 1
> Hardware Flow Control : None
> Software Flow Control : None

Connected to COM4...



WELCOME EZBOOT V2.3.05 (FALINUX Co.,Ltd) ......PXA270(EZ-PXA270) (520MHz)
Program by You Young-chang, Oh Jae-Kyong, Jang Hyung-Gi
Last Modify May  4 2009

  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)

  LCD setup 640x480
  draw logo bitmap Image .....
    File  Size  -  921654 Bytes
    Image Size  -  640 x 480


Quickly Autoboot [ENTER] / Goto BOOT-MENU press [space bar]......

Copy Kernel Image .....
Starting kernel [MARCH 406]...
kernel command [EZBOOT mem=64M initrd=0xA0800000,5M root=/dev/ram ramdisk=16384 console=ttyS2,115200 video=ezfb:panel:2   ip0=192.168.10.188 mac=00:FA:07:78:27:04 netmask=255.255.0.0 gw=192.168.10.1 host=192.168.10.61 nandparts=3,8,53 ]
Uncompressing Linux.................................................................................... done, booting the kernel.
Linux version 2.6.28.10 (root@localhost.localdomain) (gcc version 3.4.3) #5 Sat Jul 11 04:39:03 EDT 2009
CPU: XScale-PXA270 [69054117] revision 7 (ARMv5TE), cr=0000397f
CPU: VIVT data cache, VIVT instruction cache
Machine: Intel HCDDBBVA0 Development Platform (aka Mainstone)
Memory policy: ECC disabled, Data cache writeback
Run Mode clock: 208.00MHz (*16)
Turbo Mode clock: 520.00MHz (*2.5, active)
Memory clock: 104.00MHz (/2)
System bus clock: 104.00MHz
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 16256
Kernel command line: EZBOOT mem=64M initrd=0xA0800000,5M root=/dev/ram ramdisk=16384 console=ttyS2,115200 video=ezfb:panel:2   ip0=192.168.10.188 mac=00:FA:07:78:27:04 netmask=255.255.0.0 gw=192.168.10.1 host=192.168.10.61 nandparts=3,8,53
PID hash table entries: 256 (order: 8, 1024 bytes)
Console: colour dummy device 80x30
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 62212KB available (2384K code, 187K data, 84K init)
SLUB: Genslabs=12, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
Calibrating delay loop... 519.37 BogoMIPS (lpj=2596864)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
net_namespace: 288 bytes
NET: Registered protocol family 16
Mainstone configured to boot from processor-flash
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries: 2048 (order: 1, 8192 bytes)
TCP: Hash tables configured (established 2048 bind 2048)
TCP reno registered
NET: Registered protocol family 1
NetWinder Floating Point Emulator V0.97 (double precision)
JFFS2 version 2.2. (NAND) 짤 2001-2006 Red Hat, Inc.
msgmni has been set to 121
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered (default)
pxa2xx-uart.0: ttyS0 at MMIO 0x40100000 (irq = 22) is a FFUART
pxa2xx-uart.1: ttyS1 at MMIO 0x40200000 (irq = 21) is a BTUART
pxa2xx-uart.2: ttyS2 at MMIO 0x40700000 (irq = 20) is a STUART
console [ttyS2] enabled
smc91x: not found (-19).
Uniform Multi-Platform E-IDE driver
ide-gd driver 1.18
mice: PS/2 mouse device common for all mice
TCP cubic registered
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
XScale iWMMXt coprocessor detected.
VFS: Cannot open root device "ram" or unknown-block(1,0)
Please append a correct "root=" boot option; here are the available partitions:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)

음하하.. EZ-PXA270 보드도 가뿐하게 성공…

이것 역쉬 옮겨 봅니다.


이제까지 작업한 환경 설정을 저장하고

[root@localhost linux]# cp .config arch/arm/configs/ezpxa270_defconfig

커널을 클리어 합니다.
   
[root@localhost linux]# make clean


새로 추가된 파일이 있는가 확인 합니다.

[root@localhost linux]# svn st


새로 생성된 것중 서브버전에 추가 할 파일을 추가 합니다.

[root@localhost linux]# cd arch/arm/configs/
[root@localhost configs]#svn add ezpxa270_defconfig


서브 버전에 커밋 합니다.

[root@localhost configs]# cd ../../..
[root@localhost linux]#  svn ci -m "EZ-PXA270 serial first portign sucess"



우후~~   끝났당…


Trackback 0 Comment 2
  1. 이상한데... 2010.01.07 19:45 신고 address edit & del reply

    저기 중간에 커널 패닉 뜨셨는데 성공이라니요..???

  2. 나그네 2011.05.25 11:10 신고 address edit & del reply

    메시지를 다 읽어보진 않았지만 커널은 정상적으로 로딩된거 같네요
    파일시스템 마운트경로만 걸어주면 잘 작동할듯