이번회에서는 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 인터페이스