SMDK2440을 2년전에 다뤄보고 안 다뤄봤다. 그래서 자료도 있는 줄 알았는데, 어딘가에 감춰져 있었다.;; 여기저기 문의를 하고, 검색해보고 결국은 리눅스 커널을 포팅하고 부팅하는 데 성공하였다. 나중에 똑같은 실수를 안하기 위해 이렇게 기록한다.

SMDK2440에 리눅스 커널을 포팅하기 위해서는 기본적으로 SMDK2440에서 사용할 수 있는 부트로더(u-boot)가 필요하게 된다. 그리고, 커널 이미지 또한 필요하게 되며, 부팅하고 나서 파일시스템으로 사용할 Root File System(JFFS2나 YAFFS)이 필요하다. 일단, u-boot 이미지, 커널 이미지, 파일시스템 이미지는 있는 것으로 가정하고 보드 자체에 커널을 심고, 부팅하는 과정을 기술한다.
(나중에 qplus를 이용한 커널 이미지, 파일시스템 이미지 제작을 추가로 포스팅 할 예정임)

우선 SMDK2440 보드를 준비하고, 숫놈-암놈인 시리얼 케이블, USB 케이블, CD(없으면 주변에서 구해야 함. 인터넷에선 찾기가 여간 어려움...), tftpd 서버를 가동하고 있는 리눅스 서버가 필요하다.

1. DNW에서 S3C2440A USB Downloader 나오게 하는 방법
 - 시리얼쪽 점퍼 설정 (J17,J19 : 1-2, J16,J18 : 2-3) - 전원쪽 시리얼 포트(UART1) 사용
 - AMD boot mode 사용 (J1 : 1-2, J2 : 2-3, J3 : 2-3, J4 : 1-2)
 - DNW 실행한 상태에서 COM1,115200bps 환경
 - 전원인가 하면, 메시지 나옴

+---------------------------------------------+
| S3C2440A USB Downloader ver R0.03 2004 Jan  |
+---------------------------------------------+
FCLK=296.4MHz,DMA mode
USB: IN_ENDPOINT:1 OUT_ENDPOINT:3
FORMAT: <ADDR(DATA):4>+<SIZE(n+10):4>+<DATA:n>+<CS:2>
NOTE: 1. Power off/on or press the reset button for 1 sec
   in order to get a valid USB device address.
   2. For additional menu, Press any key.

USB host is not connected yet.

###### Select Menu ######
 [0] Download & Run
 [1] Download Only
 [2] Test SDRAM
 [3] Change The Console UART Ch.
 [4] Clear unused area in SDRAM


2. USB 드라이버 설치
 - 위 상태에서 USB 케이블을 컴퓨터에 연결하고 전원을 인가하면, 새 하드웨어 장치가 나옴
 - CD에서 USB Driver/DNW/secbulk.inf와 .sys 파일을 windows/system32/drivers에 복사한 후
 - 장치 드라이버를 위 경로에 주면 자동으로 설치됨

3. u-boot 이미지를 NAND에 쓰기
 - DNS-Configuration-Option에서 USB Port 주소를 0x30100000으로 설정함
 - 위에서 나오는 메뉴에서 1번 선택후 0x30100000 주소 친 후
 - USB Port-Transmit 선택후, u-boot-smdk2440-v.0.2.bin 선택하면 전송됨
 - Option에서 0x30000000 주소로 수정한 후
 - 초기 메뉴에서 0번 선택, USB Port-Transmit 선택후, 2440test.bin 선택하면 전송됨

+---------------------------------------------+
| S3C2440A Firmware-Test ver 0.03 Jan 2004.   |
+---------------------------------------------+
[CPU ID=32440001h]
[Core voltage: 1.20V]
[XTAL in = 16.9344]
[Fclk:Hclk:Pclk]=[296.4:98.8:49.4]Mhz
[Uclk=48.0Mhz]

[rSTATUS2=0x1]
[rSTATUS3=0x0]
[rSTATUS4=0x0]
[rSRCPND=0x2000000]
[rINTPND=0x0]


 0:User Test        1:Manual Reg. Set  2:PCMCIA test      3:Stepping stone 
 4:Nand test        5:Program Flash    6:DMA test         7:Interrupt      
 8:Power/Clk        9:Lcd test        10:Camera test     11:SPI Test       
12:IIC Test        13:RTC Test        14:IrDA Test       15:SD test        
16:ADC test        17:ADC TS test     18:Timer test      19:IIS test       
20:AC97 Test    21:Uart Test      

Select the function to test : 



 - 위 메뉴에서 4번 선택, 그리고 SMC는 Normal이므로 1번 선택

Select the function to test : 4

Nand test
Select Nand flash type, Normal(1)/Advanced(2) : 1
K9S1208 Nand flash test start.
 0:Read ID          1:Nand reset       2:Block erase      3:Page read      
 4:Page write       5:Nand R/W test    6:Check Badblock   7:Nand Block lock
 8:Soft Unlock      9:K9S1208 Program 



 - 위 메뉴에서 9번 선택

Select(-1 to exit): 9

[SMC(K9S1208V0M) NAND Flash writing program]
The program buffer: 0x30100000~0x31ffffff

Source size:0h~0h

Available target block number: 0~4095
Input target block number:0
Input program file size(bytes): 107100
File:107100[6-block,17-page,92-bytes].
.......

 0:Read ID          1:Nand reset       2:Block erase      3:Page read      
 4:Page write       5:Nand R/W test    6:Check Badblock   7:Nand Block lock
 8:Soft Unlock      9:K9S1208 Program



 - 위 화면과 같이 0번 블럭을 입력하고, 바이트수는 u-boot의 실제 크기를 적으면 된다.
 - 점퍼를 Nand boot mode로 설정(J1,J2,J3,J4 : 모두 2-3, J)
 - 시리얼 케이블은 UART0 (전원쪽에서 먼 UART)로 바꿔 끼움
 - 전원 인가하면 아래와 같은 화면 나옴

U-Boot 1.0.0 (Sep  6 2006 - 15:29:06)
U-Boot code: 33E00000 -> 33E1A25C  BSS: -> 33E1DBBC

IRQ Stack: 33e3ebb8

FIQ Stack: 33e3fbb8

DRAM Configuration:

Bank #0: 30000000 64 MB

NAND:64 MB

*** Warning - bad CRC, using default environment
In:    serial

Out:   serial

Err:   serial

Hit any key to stop autoboot:  0

## Booting image at 33000000 ...

Bad Magic Number

SMDK2440 #




4. 파티션 정보 확인 및 u-boot 환경 변수 설정 (특히 네트워크 부분)
 - NAND Flash Memory Partitions를 보면, 0x00000000에서 0x00020000만큼의 크기가 Bootloader(U-boot)로 잡혀있다.
   그리고, 0x00020000부터 0x00010000 만큼 ConfigArea,
   0x00030000(0xC 블럭)에서부터 0x001D0000 크기만큼의 Kernel 공간,
   0x00200000(0x80 블럭)에서부터 0x03000000 크기만큼의 Root File System 공간,
   0x03200000(0xC80 블럭)에서부터 0x00E00000 크기만큼의 User Area 공간이 각각 할당되어 있다.
   Tip) 해당 주소를 0x4000으로 나누면 블럭수가 나옴
 - 이 상태에서 NAND Flash Memory에 U-boot(생략 가능한 것으로 보임), 리눅스 커널, 램디스크 등을 올려야 한다.
   하지만, 이 전에 네트워크 설정을 해주어야 한다.
 - printenv로 먼저 현재의 ip주소와 서버ip 주소 등을 살펴보고 잘못 설정되어 있을 경우,
   # setenv ipaddr 해당IP 식으로 설정한다.
   단, serverip로 설정된 IP에 리눅스 서버가 가동중이어야 하며, TFTPD가 설치되어 있는 상태여야
   tftp를 통해 커널 및 램디스크 이미지를 다운받을 수 있게 된다.
   아래에서 xxx로 표시된 곳에 수식을 설정하고 saveenv 하면 저장된다.

SMDK2440 # printenv
bootdelay=1
baudrate=115200
ethaddr=08:00:3e:26:0a:5b
netmask=255.255.255.0
ipaddr=xxx.xxx.xx.xxx
serverip=xxx.xxx.xx.xxx
gatewayip=xxx.xxx.xx.x
bootargs=root=/dev/mtdblock2 rw rootfstype=jffs2 console=ttyS0,115200 mem=64M
bootcmd=nandr 0xc 0x1d0000 0x33000000; bootm 33000000
stdin=serial
stdout=serial
stderr=serial


5. 부트로더를 NAND Write하기

SMDK2440 # tftp 31000000 u-boot-smdk2440-V.0.2.bin
SMDK2440 # nande 0x0 0x20000 <- 위에서 Bootloader 시작 블럭값과 크기
SMDK2440 # nandw 0x0 다운받은사이즈 0x31000000

6. Kernel NAND Write하기

SMDK2440 # tftp 31000000 smdk2440-kernel
SMDK2440 # nande 0xc 0x1d0000 <- 위에서 Kernel 시작 블럭값과 크기
SMDK2440 # nandw 0xc 다운받은사이즈 0x31000000

7. Root File System(JFFS2) NAND Write하기

SMDK2440 # tftp 31000000 smdk2440.img
SMDK2440 # nande 0x80 0x3000000 <- 위에서 Root File System 시작 블럭값과 크기
SMDK2440 # nandw 0x80 다운받은사이즈 0x31000000

8. 자동 부팅을 위한 마지막 설정

SMDK2440 # printenv <- bootargs, bootcmd 등이 제대로 설정되어 있는지 확인한다.
SMDK2440 # setenv bootargs root=/dev/mtdblock2 rw rootfstype=jffs2 console=ttyS0,115200 mem=64M
SMDK2440 # setenv bootcmd nandr 0xc 0x1d0000 0x33000000\; bootm 33000000
SMDK2440 # saveenv


9. 리셋해서, 매직넘버 체크를 넘어가면 제대로 부팅이 될 것이다.
 - 매직넘버 체크에서 걸릴 경우, 위 주소가 맞지 않는 경우이다.

추가사항으로 로지텍 Pro4000 웹캠을 설치해야 한다. ㅡ.ㅜ;

Posted by wbhacker :