MSTK2440 보드가 정상 동작하는가 확인하기 위해서 간단한 startup 프로그램과 c프로그램을 만들어 봤다.
start.s 파일을 보면 진짜 별거 없다. Watch dog과 인터럽트를 disable하고 바로 C프로그램의 Main함수로 jump했다. Reset 이외의 exception들은 전부 처리하지 않았다. 일단 스택과 SDRAM 동작 설정을 아무 것도 하지 않았기 때문에 C프로그램에서 변수와 로컬함수 사용은 불가능하다. ㅋㅋ 그저 LED만 껐다 켰다 해볼뿐. delay함수 구현도 안되었기 때문에 Jlink로 하나의 step씩 실행해야 LED 점멸 결과를 알 수 있다ㅋㅋ 아래의 start.s 소스를 보면 이후 start up 코드의 기본 뼈대가 될 것이다.

; start.s
 AREA    Init, CODE, READONLY
 ENTRY
 
 ;Exception Vector Table
 b ResetHandler
 b HandlerUndef ;handler for Undefined mode
 b HandlerSWI  ;handler for SWI interrupt
 b HandlerPabort ;handler for PAbort
 b HandlerDabort ;handler for DAbort
 b .    ;reserved
 b HandlerIRQ  ;handler for IRQ interrupt
 b HandlerFIQ  ;handler for FIQ interrupt


 IMPORT  Main    ; The main entry of mon program

;=======
; ENTRY
;=======
ResetHandler
 ldr r0,=0x53000000   ;watch dog disable
 ldr r1,=0x0
 str r1,[r0]

 ldr r0,=0x4A000008
 ldr r1,=0xffffffff  ;all interrupt disable
 str r1,[r0]

 ldr r0,=0x4A00001C
 ldr r1,=0x7fff  ;all sub interrupt disable
 str r1,[r0]

 b Main
 b .
 
HandlerUndef
HandlerSWI
HandlerPabort
HandlerDabort
HandlerIRQ
HandlerFIQ
 b .



// Main.c
#define rGPBCON (*(volatile unsigned int*)0x56000010)
#define rGPBDAT (*(volatile unsigned int*)0x56000014)

// start.s에서 스택설정이 안되었기 때문에 아직 동작안함
void delay(int d)
{
 int i=0;
 for(i=0;i<d;i++);
}

void Main()
{
 // GPB5,6,7,8 output으로 설정 -> s3c2440 데이터 시트 참조
 rGPBCON = (0+(0x01<<10)+(0x01<<12)+(0x01<<14)+(0x01<<16));
 rGPBDAT = ~((1<<5) + (1<<8)); // GPB5, GPB8 LED ON
 
 while(1)
 {
  rGPBDAT = 0xffffffff; // LED OFF
  //delay(1000);
  
  rGPBDAT = 0x0;    // LED ON
  //delay(1000);
 };
}



'ARM > MSTK-2440' 카테고리의 다른 글

MSTK-2440 보드 회로 분석  (0) 2009.08.21
MSTK-2440 보드 소개  (0) 2009.08.21
 이번회에서는 MSTK-2440 보드에서 동작하는 Startup code를 작성하기 위해서 알아야하는 기본적인 하드웨어 부분(가장 중요한 부분 이라고 생각한다)을 분석하도록한다. 분석 할 부분들은 s3c2440 CPU의 Operating Mode를 결정하는 부분과 NAND 메모리 설정, SDRAM 인터페이스 부분들이다. 나머지 부분들은 필요할 때마다 언급하도록 하겠다.

1. MSTK-2440 메모리 맵

 s3c2440는 총 27개의 어드레스 라인(ADDR26:0)과 8개의 뱅크를 가지고 있다. 각 뱅크당 128Mbytes 공간을 가진다(이는 어드레스 라인이 27개이기 때문이다. 2의 27승은 127MBytes). MSTK-2440 보드는 8개의 뱅크중 5개를 사용하고 있다. 각 뱅크를 선택하는 Chip select 선이 있는데 nGCS0 ~ 7까지 존재 한다. nGCS0은 Nor 플래시 메모리가 연결되어있고, nGCS1에는 CPLD, nGCS3에는 CS8900A(이더넷 칩), nGCS6,7에는 SDRAM이 연결 되어있다. 나머지 nGCS2,4,5들은 사용하지 않는다.

s3c2440은 Nor 플래시(Boot ROM) 부팅과 Nand 플래시 부팅을 지원한다. Nor플래시 부팅 모드일 경우 0x0000_0000번지에 Nor플래시가 연결되어 있기 때문에 별다른 어려움 없이 사용할 수 있다(Nor 플래시 인터페이스는 어드레싱 방식, 꼭 Nor 플래시가 아니더래도 Boot ROM 종류면 사용 가능하다). 하지만 NAND 플래시 메모리는 어드레스 접근 방식이 아니라 페이지 접근 방식이라 Nor 플래시 접근 하듯이 주소로 접근할 수 가 없다. 따라서 Nand 플래시 부팅 모드일 경우에는 내부적 4KB짜리 SRAM을 사용한다. NAND 플래시 앞쪽 영역에서 4KB만큼만 SRAM에 복사하여 Boot ROM처럼 사용한다. 요즘은 Win CE, Embedded Linux등 대용량 OS를 많이 사용하기 때문에 NAND 플래시 부팅은 필수적이다.


2. BANK0(nGCS0) BUS WIDTH / NAND CONFIG
OM[1:0] 부분을 보자. 자세히 보면 OM0은 3.3v 풀업 저항 처리 되어있다. JP1(스위치)의 on/off 값에 따라 OM0값이 변화된다. OM1 부분은 풀다운 저항 처리 되어 항상 0이다(4.7KUNLOAD되어 있는 부분은 보드 PCB에 저항이 실장되어있지 않은 부분이다). s3c2440 데이터 시트를 보자.
여기서 OM1은 항상 0으로 고정되어 있고 OM0 부분만 0, 1로 변화 된다. 이 말은 Booting ROM Data width가 OM1이 0, OM0이 0일 경우 Nand Flash Mode이고, OM1이 0, OM0이 1일 경우 16비트 Nor Flash Mode이다.

OM[1:0] = 00일 경우 NAND 플래시 메모리 부트 모드 이다. Nand 플래시 메모리 부트 모드를 사용하기 위해서는 하드웨어 적으로 핀 설정을 해줘야 한다. 위 회로의 NCON, EINT21, EINT22, EINT23 부분을 보자. EINT21는 GPIO13과 핀이 동일하다(EINT22 = GPIO14, EINT23 = GPIO15). NCON은 풀다운 처리가 되어 항상 0이다. EINT21은 풀업 처리로 항상 1이다. EINT22는 풀업처리로 항상 1이다. 마지막으로 EINT23은 풀다운 처리되어 항상 0이다. 다시 s3c2440 데이터 시트를 보자. 아래의 내용은 데이터 시트에서 발췌한 내용이다. bold 처리된 부분이 위 회로에서 적용된 내용이다.

NCON: NAND flash memory selection(Normal / Advance)
0: Normal NAND flash(256Words/512Bytes page size, 3/4 address cycle)
1: Advance NAND flash(1KWords/2KBytes page size, 4/5 address cycle)

GPG13(EINT21): NAND flash memory page capacitance selection
0: Page=256Words(NCON = 0) or Page=1KWords(NCON = 1)
1: Page=512Bytes(NCON = 0) or Page=2KBytes(NCON = 1)

GPG14(EINT22): NAND flash memory address cycle selection
0: 3 address cycle(NCON = 0) or 4 address cycle(NCON = 1)
1: 4 address cycle(NCON = 0) or 5 address cycle(NCON = 1)

GPG15(EINT23): NAND flash memory bus width selection
0: 8-bit bus width
1: 16-bit bus width


정리하자면, 현재 하드웨어적으로 설정된 내용은 Nand 플래시의 페이지당 사이즈가 512Bytes, 메모리 어드레스 사이클은 4 어드레스 사이클, Nand 플래시 메모리 버스 폭은 8비트이다.


3. SDRAM 인터페이스
 MSTK-2440보드에서는 128MB(32MB * 4) 램 용량을 가진다(K4S561632E-TL75(16M * 16)을 4개를 사용한다). s3c2440에는 SDRAM 콘트롤러가 존재한다. 이는  nGCS6, nGCS7와 어드래스 라인, 데이터 라인등에 의해서 제어된다. K4S561632E-TL75는 16비트 데이터 버스와 A0~A12까지 13개의 어드레스 라인을 가지고 있다. 13개의 어드레스 라인이면 2의 13승으로 총 8K * 16의 용량을 가질 수 있다. 하지만 조금 이상하다. K4S561632E 칩은 데이터 시트에서도 보듯이 16M * 16의 용량(32MB)을 가진다. 어떻게 된 것일까? 데이터 시트에서 K4S561632E의 블록 다이어그램을 살펴 보자.



 위 두개의 블록다이어그램을 살펴보면 Bank Select, Row Decoder, Column Decoder가 존재한다. 그리고 Address Register 블럭이 하나 존재한다. Address Register로 클럭에 동기화되어 주소(ADD)가 들어오면 거기서 Row Address, Column Address, Bank Select를 사용 하는 것 처럼 보인다. 메모리 용량이 커지면 커질수록 메모리 번지를 어드레싱하는 어드레스 라인이 늘어나게 된다. 여기서 128MB 용량을 가지는데 정상적으로 제어하기 위해서는 A0 ~ A26로 27개가 필요하다. SDRAM용량이 커지면 이 개수는 더 늘어날 수 밖에 없다. 이제야 Bank Select, Row Decoder, Column Decoder가 왜 존재하는지 감이 온다. 어드레스를 제어할 때 일반적인 방법은 1차원적인 방법으로 제어한다. 하지만 SDRAM은 3차원 적인 방법으로 어드레스를 제어한다. Column Address, Row Address, Bank Address를 이용하면 작은 수의 어드래스 핀으로 많은 용량을 제어할 수 있다. 실제로  한 어드레스 라인을 사용하여 Column Address, Row Address를 입력한다. 이것이 가능한 이유는 이 두 주소간에 시간 차이를 두어 A0 ~ A12핀에다가 주소를 입력한다.


 여기서는 16비트 모드를 사용하기 때문에 16M * 16 부분을 위의 표에서 살펴 봐야된다. Row Address는 A0 ~ A12가 사용되고 Column Address는 A0 ~ A8까지 사용된다. 2의 13승 * 2의 9승 = 8K * 512 = 4M이다. K4S561632E칩에 보면 Bank Address가 2개있다(BA0, BA1). 각 뱅크당 크기가 4M이고 16비트 데이터 버스 폭을 가지므로 4M * 16비트, 총 256M bits(32MB)의 용량이 된다. SDRAM에 대한 기본 설명을 여기까지 하고(SDRAM에 대한 제어 스퀀스나 복잡한 구조는 알 필요가 없다. SDRAM 콘트롤러가 다 알아서 해주기 때문에 프로그래머 입장에서는 램 인터페이스 방법과 s3c2440의 SDRAM  콘트롤러 제어 레지스터만 알면된다. 하지만 여유가 된다면 SDRAM에 대해서 자세한 공부도 필요할 것 같다) 아래의 회로를 보자.


 MSTK-2440 보드는 총 128MB(뱅크당 64MB)의 SDRAM용량을 가진다. K4S561632E 칩을 4개를 사용한다. 그러면 32MB SDRAM을 가지고 어떻게 각 뱅크당 64MB를 할당 할 수 있을까?(아마 컴퓨터 구조를 공부했던 독자라면 한번쯤 배웠을 내용이다) 위 회로를 보면 해답이 나와있다. 지금 K4S561632E 칩을 살펴보면 데이터 버스 폭이 16비트이다. s3c2440에서 사용하는 32비트 데이터 버스 폭(ARM 모드로 프로그램을 하기 때문에 32비트 데이터 버스 폭 사용, THUMB 모드일 경우에는 16비트만 사용)을 만들기 위해서는 K4S561632E 칩을 병렬로 연결해야 한다. 위 회로에 LDATA[15:0] 라인을 첫 번째 K4S561632E칩의 데이터 라인(DQ[15:0])에 연결하였다(U2 부분 참조). 그리고 LDATA[31:16] 라인을 두 번째 K4S561632E칩의 데이터 라인(DQ[15:0])에 연결하였다(U3 부분 참조). 이는 총 64MB 영역 중에 상위 32MB 램 영역은 U3부분이고, 하위 32MB 램 영역은 U2부분을 의미한다. 상위 램영역과 하위 램영역을 제어할 수있는 핀이 U2, U3에서 LSCLK0(U2의 SCLK), LnWBE0(U2의 LDQM과 연결), LnWBE1(U2의 UDQM과 연결)과 LSCLK1(U3의 SCLK), LnWBE2(U3의 LDQM과 연결), LnWBE3(U3의 UDQM과 연결)이다. 나머지 U2, U3의 어드래스 라인과 nGCS6등은 공통적으로 묶인다. 어드레스 라인을 보면 한가지 의문점이 생긴다. 왜 K4S561632E의 A0자리에 s3c2440의 LADDR0부터 연결을 하지않고 LADDR2부터 연결 했을까? 또 왜 K4S561632E의 BA0, BA1에 LADDR24, LADDR25를 연결했을 까? 이는 s3c2440 데이터 시트를 보면 알 수 있다. SDRAM은 s3c2440의 SDRAM콘트롤러에 의해서 제어된다고 했다. 이는 SDRAM의 용량에 따라서 s3c2440에 주소 라인에 인터페이스하는 방법이 달라지는데 s3c2440의 데이터시트를 참조 해야된다( s3c2440 CPU 설계자가 이렇게 설계한것이기 때문에 이런 것에 대해서 심각하게 생각할 필요가 없다).
s3c2440 데이터 시트에서 SDRAM Memory Interface Examples부분을 살펴 보면 16비트 SDRAM 2개를 인터페이스 할경우의 예제를 보여준다(벤더에서 시키는 대로만 하면된다). nGCS7에 연결된 SDRAM 2개들도 동일하게 적용되는 내용이다(U6, U7 부분).


참고 할 만한 사이트 : http://kelp.or.kr/korweblog/stories.php?story=04/12/15/5293387&topic=30


4. NOR FLASH 인터페이스

ROM Memory Interface Examples



5. NAND FLASH 인터페이스




'ARM > MSTK-2440' 카테고리의 다른 글

MSTK2440 보드 테스트  (0) 2010.03.18
MSTK-2440 보드 소개  (0) 2009.08.21


보드 정보
네이버 카페 : http://cafe.naver.com/armpower.cafe
보드 제조사 : http://www.allstech.co.kr/sub2_2.php?PHPSESSID=fa6d14283353248d138f2596e3a4955c
보드 판매처 1 : http://www.edigitalworld.co.kr/index_item_view.html?pgCode=006351-000001
보드 판매처 2 : http://www.devicemart.co.kr/mart7/mall.php?cat=004019000&query=view&no=16825
교재 정보 : http://www.yes24.com/24/goods/1992901

 작년 말이였나 한참 보드 수집(?)에 열을 올리고 있을 때, 당근이 카페에서 중고로 싼가격에 좋은 물건이 올라왔다. 이미 "개발자를 위한 ARM 프로세서"라는 책을 가지고 있었다. 이책으로 공부를 할 때 보드를 가지고 있었다는 생각이 많이 들었는데 디바이스 마트에서 보드 가격을 보고 기절하는 줄 알았다. 뭔 2440 보드가 80만원씩이나.. 더구나 책까지 포함했을 경우에는 88만원에 파는 곳도 있었다. 결국 중고로 보드를 낼름 사버렸다. 여태껏 고이 모셔놓다가 공부할 일이 생겨서 꺼내 봤다. 테스트 프로그램을 램에 올리고 실행을 시켰는데 잘된다. ㅋ 당연히 잘되야지. 암튼 싼가격에 보드를 구입했는데 보드까지 이상이 없으니 기분이 좋다. 공부하는 김에 차근 차근 자료를 강좌 형식으로 정리할 생각이다. 언제 끝날지는 모르겠지만 첫번째 목표는 MSTK-2440 보드의 모든 내용(주변장치)을 펌웨어로 직접 제어하는 것 까지이다.

아래는 보드 스팩이다. 자세한 하드웨어 분석은 다음 강좌에서 할 생각이다.


1. CPU
 Samsung S3C2440A-40 (ARM920T with MMU)
 CPU Operation Frequency : Up to 400MHz

2. Boot ROM
 AM29LV800 Nor Flash (1MByte)
 K9F1208 Nand Flash (64MByte)

3. SDRAM
 K4S561632E 4EA (128MByte)

4. LCD
 2.8" LTP280QV-E01 (240× 320 Size TFT LCD, Touch Screen)

5. Peripheral
 IDE & CF Interface : XC95144XL-TQ100 (각각 1 Port)
 Ethernet : CS8900A (10 Based-T 1 Port)
   SD/MMC : 1 Slot
   Audio : UDA1341TS (Audio Jack)
   Serial : RS-232 2 Port
   USB : Host & Device
   Speaker : 0.25W/20mm
   JTAG : 20 Pin Box Header
   Infrared Receiver : KSM603LM
   Key Pad : 4EA & 1 External Interrupt SW
   Connector : Data, Address, Camera, IrDA, External Interrupt, GPIO
   Internal Function : IIC-AT24C16 EEPROM, Timer, Watch-Dog, RTC, ADC(10bit 8:1 Mux CH & Pen Drag)



'ARM > MSTK-2440' 카테고리의 다른 글

MSTK2440 보드 테스트  (0) 2010.03.18
MSTK-2440 보드 회로 분석  (0) 2009.08.21

+ Recent posts