검색결과

'Boot Loader/Flash'에 해당되는 글 1건

플래시 메모리 접근하기

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에 대한 이야기는 추후에 더 알아보도록 하겠습니다.



 

New Post