검색결과

'Boot Loader'에 해당되는 글 4건

플래시 메모리 접근하기

2010. 10. 28. 21:53
목적 : 플래시 메모리는 어디서 어떻게 초기화되고 작동이 되는지 알아보자.

필자가 사용하는 망고보드의 부트로더는 U-boot이다. U-boot안에 있는 Startup.S파일이 가장 먼저 실행이 되는데 Startup.S의 메모리 컨트롤러 초기화 부분이 있다. 바로 이부분부터 접근해보도록 하자.

Startup.S는 메모리 컨트롤러 레지스터 설정을 해준다. 왜냐하면 시피유가 SD RAM에 접근이 가능하도록 메모리 컨트롤러 레지스터에 테이타 값을 넣어 초기화가 요구되기 떄문이다.

Startup.S 파일은 시피유가 에스디램 메모리를 읽기, 쓰기 가능하도록 하기 위해서 메모리 컨트롤러를 초기화한다. 이 과정이 끝나면 프로그램이 동작하기 위한 스택 영역을 지정해 주고 씨 언어의 메인 함수로 점프한다.

그럼 Startup.S 파일을 컴파일 과정을 거쳐서 바이너리 파일이 완성이 되었다고 치자. 그럼 이 파일을 임베디드 보드에 어디에 저장할것인가?

보드의 메모리 종류에 따라 바이너리 파일을 전송해야 할 위치가 다르다.
흔히 사용되는 NAND 플래시 메모리 경우에는 바이너리 파일이 바로 동작되지 않기 때문에 부트로더가 반드시 필요하다. 부트로더를 통해서 Startup.S의 바이너리 파일이 실행될 수 있도록 sd램으로 복사해주기 때문이다. 그래서 Startup.S파일은 부트로더 안에 존재해야 한다.
그러나 노어 플래시 메모리는 바로 바이너리 파일을 실행시킬수 있기 때문에 부트로더 필요없이 Startup.S의 바이너리 파일만 있으면 된다.
 SDRAM은 프로그램을 수행하며 주기적으로 변하는 데이타를 저장하거나 읽기를 함
 앞에 낸드 플래시에 대해 짧막하게 소개가 되었다. 지금부터는 필자가 사용하는 mango-100이라는 보드에 낸드플래시를 지원하기 때문에 이에 관련되어 좀 더 알아보도록 하자.
낸드플래시는 부트로더가 필요하다고 언급했는데 아래와 같은 방법으로 동작하게 된다.
 보드에 전원이 들어가면 CPU는 어떤 플래시 메모리를 사용하는지 판단을 한다. (mango-100에서는 스위치를 조절하여 설정을 할 수 있다.) 낸드 플래시로 설정이 되어 있다면, 낸드 컨트롤러에 의해 낸드 플래시에 있는 부트로더를 시피유 내에 있는 인터널램으로 자동으로 복사하여 부트로더를 실행한다. 이 부트로더는 보드에서 실행시킬 바이너리 파일을 에스디렘으로 복사를 하여 실행되게 하는 역할을 한다.

 낸드 플래시는 읽기/쓰기는 페이지 단위, 지우기는 블록단위로 동작을 한다. 또한, 모든 동작 사이클은 CLE로 동작되는 커맨드 사이클, ALE로 동작되는 어드레스 사이클, 그리고 데이타 사이클과 같이 크게 3가지로 분류된다. 낸드 플래시는 주소의 개념이 없기 떄문에 낸드 플래시 컨트롤러를 사용하여 위 과정을 수행할 수 있다. 

위 회로도는 망고100보드에서 사용하는 NAND메모리다. 모든 동작 사이클은 CLE로 동작되는 커맨드 사이클, ALE로 동작되는 어드래스 사이클, 그리고 데이타 사이클과 같이 크게 3가지로 분류된다. 
 핀 I/O(input/output Pin)0~7은 비동기 통신을 할 뿐 아니라 기존의 메모리와 다르게 Address 및 Data Line이 하나의 포트에서 공용으로 사용하고 있다. 이러한 I/O 구분을 위해 사용되는 Pin이 ALE와 CLE입니다. 






 위 Timing Chart는 1page를 READ 할때의 타이밍 동작이다. 
1. 처음에 CLE가 High가 된걸 알수 있는데 이떄 I/O에 있는 값은 Command로 인식하게 된다.
2. ALE 사이클이 긴 이유는 용량에 따라 필요한 만큼 주소를 할당해야 하기 떄문이다.
3. ALE와 CLE가 둘다 내려가면 실제 Data가 처리가 된다. DATA의 READ는 RE, WRITE는 WE로 구분      된다.
4. WP은 쓰기 방지 기능으로 low일떄 Erase 및 Write동작이 금지한다.
5.  RD/BY은 NAND 메모리가 자신의 동작상태를 유저에게 알려주는 역할을 한다.

Read 동작 뿐만 아니라 다른 동작에 대해 좀 더 알아보도록 하자.
NAND의 크게 5가지 동작이 있다. 
1) ID Read
NAND메모리의 가장 기본 동작으로 NAND가  잘 연결되어 있는지 확인하는 Command이다. ID Read를 하고 나면 Factory, Device(메모리 고유 번호), 용량, Bus 정보도 얻을 수 있다.
2) Read
제조사 별로 약간은 상이하나, 기본적으로는 첫 Start Address를 지정하면 순차적으로 page단위로 계속 읽어드리는게 NAND의 Read 방식입니다.
3) Erase
Flash의 기본 특성상 Write 동작을 하기 위해서는 꼭 해당 영역을 Erase하고 난 후에 Write를 해주어야 하고 Erase는 Block단위로 수행이 된다. Write가 되면 '0', Erase가 되면 '1'의 상태로 나타낸다. 예를 들어, Erase가 끝난 후 각 page를 read해보면 전부 FFFFF....로 되어 있는걸 볼 수 있다.
4) Write
Erase가 끝난 Cell에 대해 쓰기를 하는 동작이다. 페이지 단위로 수행을 하며, 1 -> 0으로 바꾸는 과정이다. 참고로 0 -> 1로 바꾸는건 Erase이다.
5) Status Check
Erase, Write 동작이 끝난 후 수행하는 동작으로 메모리가 이와같은 동작을 정상적으로 잘 수행했는지 확인 하는 역할을 한다. 해당 기능이 동작후 Pass/Fail 중 하나의 결과를 리턴하는데 Fail이 발생한 경우에는 배드블럭 가능성이 높아서 Retry를 해보거나 배드블록으로 설정을 해서 다른 블럭에 Erase,Write를 다시 수행한다.


※ 위와 같은 동작을 하기 위해서는 메모리가 자동적으로 수행하는게 아니라, FTL을 통해서 수행됩니다. 파일시스템 <-> FTL <-> 플래시메모리, 즉 중간단계라고 생각하면 된다. 이 FTL을 통해서 우리는 파일시스템으로부터 오는 논리 주소를 플래시 메모리의 물리주소로 추상화하여 사용이 가능하다.
 
FTL에 대한 이야기는 추후에 더 알아보도록 하겠습니다.



 

NAND 작업 진행 상황(2)

2010. 10. 28. 21:09

NAND 작업 진행 상황(1) 까지의 내용을 계속하여 진행.


가정 : mango-2010-6 버전에 s5pc100의 nand driver가 존재 할 것이다.

근거 : mango-2010-6/cpu/s5pc1xx/nand.c 파일 존재.



진행 : mango-2010-6/cpu/s5pc1xx/nand.c   ->  U-Boot-2010.6.29   이식

결과 : NAND 드라이버 인식 .




진행과정 :
NAND 작업 진행 상황(1) 에서


다른 보드의 driver 이식
.../drivers/mtd/nand/s5pc100_nand.c 파일 생성 (s3c64xx.c 파일을 기반으로 복사 생성)

# cd drivers/mtd/nand
# cp s3c64xx.c ./s5pc100_nand.c

의 과정을,

   [mango-2010-6/cpu/s5pc1xx/]#  cp nand.c  U-Boot-2010.6.29/drivers/mtd/nand/s5pc100_nand.c

  로 대체하여 진행.


U-Boot-2010.6.29/drivers/mtd/nand/s5pc100_nand.c 수정내용
[C] line27>  #define <regs.h> -> #define <asm/arch-s5pc1xx/s5pc100.h>
변경이유 : regs.h의 내용은, s5pc100의 레지스터 내용을 참고하므로, 대체.

[D] line44, 55, 77>  .useecc
삭제이유 : 컴파일 에러, 정확한 원인은 확인하지 못했음. 삭제처리 후, 정상적인 컴파일 실행.

U-Boot-2010.6.29/include/nand.h 수정내용

[D] line33>  extern int board_nand_init(struct nand_chip *nand);
삭제이유 : s5pc100_nand.c 에서, 이미 #include <nand.h> 이므로, extern erro발생.




작업 결과의 의미
prompt를 띄우기 위해서는 NAND 초기화 sequence를 지나야 한다.
NAND가 동작하던 그렇지 않던, 부팅을 해야 한다.
부팅이 되어야, 다른 것들에 접근해보고, 생각해볼 수 있기 때문이다.
prompt를 띄우는 것. 불완전 하더라도, 부팅을 완료하는 것.
그런의미에서, 의미 있는 결과가 아닌가 생각된다.


 


생각해본 내용
드라이버의 동작을 이해하고 있다면, "NAND 작업 진행 상황(1)"  에서, s3c64xx.c을 기반하여,간단한 코드 수정만으로 nand를 초기화 시킬 수 있을 것이라 생각된다. ID를 추가시키는 것등으로 말이다.(nand의 동작상으로 버전상 큰차이는 없을 것이라 생각되기 때문이다. LAN9220의 경우 가 그 예이며, 실제로 No NAND DEVICE found!!! 라는 메세지를 출력했다.)  하지만, 우리는 드라이버의 동작을 알지 못하기 때문에, mango-2010-6(망고버전)에서 제공하는 nand driver를 U-Boot-2010.6 버전에 맞게 수정하여, NAND를 인식 시켰다.

NAND 다음 단계는  serial 관련 초기화라고 추측 된다.

NAND는 정상적으로 인식되었지만, In: serial , Out: serial, Err: serial 에서 멈춘 것인지,
아니면,
NAND가 정상적으로 동작되지 않아서, In: serial , Out: serial, Err: serial로 진입하지 못한 것인지를 판단하기 위해여 더 많은 공부와 분석이 필요할 것으로 생각된다.


하나를 해결하면, 하나가 막히고, 하나를 해결하면 하나가 막히고...
해결을 하기위해선 엄청난 시간이 걸린다.
근본적으로 드라이버가 코드로 어떻게 동작 하는지를 공부해야할 필요성을 느낀다.


 
다음 작업?
NAND 가 올바로 인식되었나 확인.
다음단계 초기화 내용 확인. (In: serial , Out: serial, Err: serial 이라 추측됨)

'Boot Loader > NAND' 카테고리의 다른 글

NAND 작업 진행 상황 (1)  (3) 2010.10.16
 

NAND 작업 진행 상황 (1)

2010. 10. 16. 18:50
1. 작업 배경

smdkc100 용 플랫폼으로 만들어낸 mango100 U-Boot 이미지 파일을 보드에 탑재했을 경우, NAND 에 대한 정보를 출력하다 다운. 고로 NAND device 에 대한 수정이 필요할 것이라는 가정을 세우게 됨.

2. 가정

시리얼과 SDRAM에 대한 초기화는 끝났다는 가정하에 작업을 진행 함.
smdkc100은 Onenand device를 사용하고 있고, mango100 은 NAND 디바이스를 사용.
그 때문에 mango100 에 맞는 NAND driver를 이식해 주어야 한다.

3. 방법 ([A] : add, [C] : Change, [D] : Delete)

다른 보드의 driver 이식
.../drivers/mtd/nand/s5pc100_nand.c 파일 생성 (s3c64xx.c 파일을 기반으로 복사 생성)

# cd drivers/mtd/nand
# cp s3c64xx.c ./s5pc100_nand.c


컴파일 할때 Object로 인식하도록 수정
.../drivers/mtd/nand/Makefile 수정

[A] 50 COBJS-$(CONFIG_NAND_S5PC100) += s5pc100_nand.o


Onenand 에 대한 설정을 NAND 에 대한 설정으로 전환
.../include/configs/smdkc100.h (.../common/Makefile 을 참조하여 수정하였음)

[A] #define CONFIG_NAND_S5PC100
[C] #define CONFIG_CMD_ONENAND -> CONFIG_CMD_NAND
[C] #define CONFIG_ENV_IS_IN_ONENAND -> CONFIG_ENV_IS_IN_NAND
[A] #define CONFIG_SYS_NAND_BASE
[A] #define CONFIG_SYS_MAX_NAND_DEVICE   1
[D] #define CONFIG_SAMSUNG_ONENAND
[D] #define CONFIG_SYS_ONENAND_BASE


필요한 Header파일 추가(s5pc100.h, s5pc1x0.h : 두파일 모두 S5PC100에 대한 Register address 정보를 포함하고 있음)

(1.3.4 버젼에서 가져옴)
# cp mango-2010-6/include/s5pc100.h
   U-Boot-2010.6.29/arch/arm/include/asm/arch-s5pc1xx/
# 복사한 s5pc100.h에 s5pc1x0을 붙여넣기..

s5pc100.h 파일 수정

[A] #define NFCONT_ENABLE (1<<0)
[A] #define __REG(x)  (*(vu_long *)(x)) // Register에 값 할당위해 함수 선언
[D] #include <asm/hardware.h>
[D] #include <asm/s5pc1xo.h> // 이미 s5pc100.h에 포함시켜줌

4. 향후 방향

NAND Controller에 대한 이해없이, 단순 Error를 제거하는 방식으로 작업을 진행해 나감. Driver 자체의 인식은 성공했으나 어떤 흐름으로 NAND device 를 초기화하는지는 정확히 이해하지 못하며 이 때문에 Device를 찾지 못한다고 생각된다. 전체적인 컴파일 에러들은 모두 잡았고, Image 파일의 생성도 문제없이 이루어지니, 앞으로의 작업은 NAND Controller의 초기화 흐름에 대한 이해후 (남용씨..) NAND device 코드(s5pc100_nand.c) 에 대한 직접적 수정을 해 나가 주길 바람. Chip ID를 확인한다던지.. 특별한 부분이 있을거라고 생각됨.


소스 : 남용님 컴퓨터의   /working/kdj/u-boot-2010.06/

작성자 : 김 동준 / djkim@q.ssu.ac.kr


'Boot Loader > NAND' 카테고리의 다른 글

NAND 작업 진행 상황(2)  (1) 2010.10.28
 

시리얼 포트란?

2010. 10. 9. 14:29

시리얼 포트란?

시리얼 포트는 입/출력이 모두 가능합니다.

입력일 경우 : 호스트 피씨에서 타켓보드로 바이너리를 전송합니다. 즉, 시리얼 통신을 통해 타겟의 플래시 메모리에 전송해서 프로그램이 동작하게끔 해줍니다.

출력일 경우 : 디버깅용으로 사용하며 메시지가 타겟에서 호스트 피시로 출력을 시켜줍니다.


하드웨어 구성


망고보드에서는 rs-232c규격의 sp3232c 시러얼 전용칩을 사용했습니다.

RS-232C와 같은 규격의 시리얼 통신에서는 기본적으로 3개의 선이 사용됩니다.

데이터 전송을 위한 RxD, 수신을 위한 TxD, 그리고 GND로 이루어져있습니다.

추가적으로 RTS(Ready To Send)는 호스트가 받을 준비가 됐음을 나타내는 신호선,

CTS(Clear To Send)는 타겟보드가 받을 준비가 됐음을 나타내는 신호선을 뜻합니다.

RTS와 CTS는 주고 받을 때 동기식으로 통신하기 위해 사용하지만, 디버깅용으로 단순히 메시지 출력을 할땐 비동기식을 사용하므로 디버깅용으로 사용할때는 RTS,CTS는 사용하지 않는다고 봐도 무관합니다.

디버깅용으로는 CON307단자를 사용했습니다. 위 회로도를 보면 CON307단자는 SP3232c칩의 7,8핀에 연결되어 9,10번 핀에서 나옵니다.

sp3232c에서 나온 라인은 MCU(S5PC100)의 4개의 UART중 UART1번에 연결된 것을 볼 수 있습니다.

UART1_xxx가 GPA4, 5에 할당된 것을 알수 있습니다.

S5PC100의 datasheet를 통해 확인해보면

GPA4, 5는 UART1을 가리키는 것을 확인 할 수 있었습니다.

여기서 실제 소스 부분을 살펴보도록 하겠습니다.

../include/s5pc100.h

 

1430 #define ELFIN_UART_BASE 0XEC000000

1432 #define ELFIN_UART0_OFFSET 0x0000

1433 #define ELFIN_UART1_OFFSET 0x0400

1434 #define ELFIN_UART2_OFFSET 0x0800

1435 #define ELFIN_UART3_OFFSET 0x0c00

1437 #if defined(CONFIG_SERIAL1)

1438 #define ELFIN_UART_CONSOLE_BASE (ELFIN_UART_BASE + ELFIN_UART0_OFFSET)

1439 #elif defined(CONFIG_SERIAL2)

1440 #define ELFIN_UART_CONSOLE_BASE (ELFIN_UART_BASE + ELFIN_UART1_OFFSET)

1441 #elif defined(CONFIG_SERIAL3)

1442 #define ELFIN_UART_CONSOLE_BASE (ELFIN_UART_BASE + ELFIN_UART2_OFFSET)

1443 #elif defined(CONFIG_SERIAL4)

1444 #define ELFIN_UART_CONSOLE_BASE (ELFIN_UART_BASE + ELFIN_UART3_OFFSET)

1445 #else

1446 #define ELFIN_UART_CONSOLE_BASE (ELFIN_UART_BASE + ELFIN_UART0_OFFSET)

1447 #endif

위와 같이 s5pc100.h 부분을 보면 UART0는 CONFIG_SERIAL1이고, UART1은 CONFIG_SERIAL2 임을 알 수 있습니다.

../include/configs/smdkc100.h

#define CONFIG_SERIAL11 -> #define CONFIG_SERIAL2              1

망고보드는 UART1을 사용하기 때문에 CONFIG_SERIAL2를 define해주어야 합니다.

위와 같이 CONFIG_SERIAL2를 1로 설정해주도록 변경했습니다.


참고 : http://cafe.naver.com/embeddedcrazyboys/5271

 

New Post