서울에 사람들이 없네요 ..
확실히 휴가 기간이죠?

나도 정말 잃하기 싫군요... 으으으...

이번엔 진짜 NAND를 제어하는 방법에 대하여 알아 봅시당..
동작 원리하고...

지금 부터 쓰는 강좌가 사실 가장 핵심 강좌죠...
(시선 집중하세요!!!)

우리가 NAND 를 저장 장치로 쓰기 위해서는 다음과 같은
6가지 행동을 합니다.

  1. NAND 디바이스 리셋
  2. NAND 디바이스 정보 읽기
  3. NAND 상태 읽기
  4. NAND 지우기
  5. NAND 쓰기
  6. NAND 읽기

이걸 수행하려면 명령 레지스테에 해당하는 기능 값을 써 넣어야 합니다

레퍼런스 매뉴얼을 보면 다음과 같이 나와 있습니다.

function 1st. Cycle 2nd. Cycle Accept Command During
Read 1 00h/01h(1) -  
Read 2 50h -  
Read ID 90h -  
Reset FFh - 0
Page Program 80h 10h  
Block Erase 60h D0h  
Read Status 70h - 0
       

뭐 첫번째 뭐 하고 두번쨰 뭐하고 ..
아직은 잘 모르겠죠?

이제 하나씩 설명 하지용...

가장 첫번째...

***** 리셋하기 *****

뭐 이전 강좌에서 보거나 레퍼런트 매뉴얼을 보시면 아시겠지만
NAND 플래쉬 메모리의 칩 핀에는 리셋 핀이 없습니다.

당근 전원이 꺼졌다 새로 켜지기 이전에는 리셋이 동작하지 않겠죠..
흠...

그렇다면 어떻게 NAND 플래쉬를 제어 하다가 RESET을 주어야 할까용...

뭐 간단합니다.

리셋 명령을 써 넣으면 됩니다.

어떻게 써 넣어야 할까요?

메뉴얼에 이것에 대한 타이밍도가 없으므로
그냥 저도 말로 때우겠습니다.

뭐 간단합니다.

CLE 즉 명령 래치 이네이블 핀을 HIGH 로 하고 데이터 버스에 0xFF 를 써 넣으면 됩니다.
넘 간단하지 않아요?

여기서 기억할것!

앞으로도 당연히 생략할 건데...

이런 행위를 하기 이전에는 반드시 nCS 를 LOW로 NAND 처리가 끝났으면 nCS 를 HIGH로
만든다...

이것이 생략함을 기억해 주세요.

정리 합시다...

NAND 플래쉬를 리셋하려면

  • nCS = LOW
  • CLE = HIGH
  • DATA <== 0xFF
  • CLE = LOW
  • nCS = HIGH

쉽죠?

근데 이때 반드시 해 주어야 할것이 바로

대기죠..

즉 RESET 명령을 쓰면 NAND 플래쉬 메모리는 자체적으로 RESET 을 수행하게 되는데
이때 시간이 좀 걸립니다.

그래서 RESET 하고 난 이후에는 반드시 NAND 플래쉬 메모리가 바쁜지를 상태를 읽어서
체크 해야 하죠

그런데...

이거 귀찮거든요...

그리고 하드웨어라는 것이 대부분 어떤 시간은 일정하걸랑요

그래서

그냥 딜레이 줍니다....

괜히 귀찮게 상태 읽는 것 코딩 하기 싫으니깐...

뭐 편집증 계신분은 직접 상태 읽어서 하면 되겠지만

이거 읽으려면 R/nB 핀을 읽는게 좋은데...

보통 하드웨어에 이 핀 연결 안 하거든요

그리고 RESET은 딱 한번 씁니다.

처음 ID 디텍션 할때 ...

그러니깐...

그냥 딜레이로 처리 하세요...

그냥 널널 하게 1 msec 정도 주면 됩니다.

원래 레퍼런스를 보면 5 ~ 500 u Sec 인데 그냥 1 m Sec 주는 것이
안전 합니다.

뭐 한번만 할건데.. 조금 시간 낭비 하면 어떻습니까 ㅋㅋ

***** 생산회사 ID 와 디바이스 ID 읽기 *****

NAND 플래쉬를 제어 하려면 제어하려고 하는 프로그램은 다음과 같은 사항을
알아야 합니다.

  • 전체 용량
  • 지우기(erase) 단위 크기 블록 크기
  • 페이지 레지스터 크기
  • 데이터 버스 크기 (8비트, 16비트)
  • 등등...

근데 이것을 NAND 플래쉬 메모리에 내부적으로 저장하고 있는 것이 아니고
각 NAND 플래쉬 마다 고정되어 있기 땜시

디바이스 ID 를 읽어서 프로그램 내부에 자체적으로 설정해야 합니다.

그렇다면 여러분은 각 NAND 플래쉬 메모리 데이터 시트를 모두 구해서
그때 그때 프로그램을 짜야 할까요?

아.니.죠...

그런건 이미 누군가가 해 놨습니다.

어디에?

예 바로 리눅스죠...

그러면 이런 정보는 리눅스 소스 어디에 있을까요?

친절한 제가 여러분에게 알려 주죠...

바로 여기에 있습니다. ==>> drivers/mtd/nand/nand_ids.c

정말 리눅스 좋지 않습니까? ㅋㅋ

뭐 이 파일에 각 필드가 어떤 내용인지는
역시 리눅스 디바이스 드라이버인 MTD의 NAND 를 이야기 할때
설명하겠죠?

그러므로 지금은 이런 파일이 있다는 정도만 알려주고

NAND 동작에 대한 설명을 중점적으로 써 갑니다. 짜잔..

우선 ID 를 읽는 것에 대한 것은 레퍼런스에 나오므로 참조해 봅시당...


[그림 3-9] NAND ID 읽기 타이밍

그림을 보면 알수 있듯이

ID를 읽기 위한 명령은 0x90 입니다...

그 다음에 주소를 00 을 줍니다.

그리고 그냥 데이터를 두번 읽으면 됩니다.

쉽죠?

그러면 첫번째 읽는 데이터가 제조사 ID이고 그 다음 읽은 데이터가 디바이스 ID입니다.

솔찍히 제조사 ID는 별로 의미가 없습니다.

중요한것은 디바이스 ID죠

디바이스 ID는 중복되지 않기 때문에 이 ID를 보고 NAND를 제어하기 위한 파라메터를
설정 합니다.

보통 하드웨어를 테스트 할때 NAND 관련 회로는 이 ID만 정상적으로 읽어 오면
하드웨어는 정상인 겁니다.

그 나머지는 소프트웨어 문제로 봐야 합니다.

왜냐하면 ALE CLE nWE nRE 등 필요로 하는 모든 신호가 동작하기 때문이죠...

글을 맺으면서... 오늘도 시간이 다 되어서 절단 신공을 발휘 합니다. 내일 오전에 쓸 시간이 있을지 모르겠네요 ㅜㅜ
아.. 더구나 다음주는 휴가 가서 강좌도 잠시 중지 해야 할듯 하군요 ㅋㅋ

태그: *유영창 *디바이스드라이버