하드웨어
랄랄랄...
강좌를 오랫만에 쓰니 은근히 즐겁네요
이거 몇일이나 갈까요? 흠..
어째든 리눅스에서 NAND 플래쉬를 다루기 위한 강좌를 진행하겠습니다.
제 실력이 워낙 허접해서리
중급 이상의 임베디드 리눅서나 실력있는 하드웨어 엔지니어들은 쨉싸게 이 강좌를
닫고 다른 좀더 수준높은 강좌를 찾아가 주세요 제발~~
이제 남은 분들은 초보자 들임을 가정하고 글을 쓰겠습니당.
(에혀 자꾸 습자가 읍자로 써지네 , 옛날 한글 교육세대의 비애로다... )
여러분이 임베디드 시스템을 하다보면 반드시 듣게되는 것이 플래쉬 메모리입니다.
플래쉬 메모리가 뭐냐구요?
뭐 그 있잖습니까?
USB 메모리...
그거 안에 있는 것이 플래쉬 메모리 입니다.
근디 이 플래쉬 메모리에는 두가지 종류가 있습니다.
NOR 하고 NAND라고 하는 플래쉬 메모리입니당.
이 두가지의 차이점을 초보자용 풀이를 하면요
(웬지 비유가 더 어렵당 ㅜㅜ )
이왕 강좌를 쓰는 김에 NOR와 NAND가 어떤 것의 약자인가를 찾아 볼까요?
이럴때는 저는 www.google.co.kr 이나 네이버를 찾아 봅니다.
허거덕... 별뜻이 없군요... 참내...
NAND 는 Not AND 즉 논리 회로중 NAND 회로를 의미합니다.
NOR 는 Not OR 즉 논리 회로중 NOR 회로를 의미합니다.
뭔가 특별한 다른 뜻을 가진 단어 인줄 알았는데 ... 별거 없군요 ㅜㅜ
하지만 앞에서 이야기 했듯이 동작하는 방법은 두가지가 정말 다릅니다.
어쨌든 NAND 가 되었든 NOR 가 되었든 이 두가지는 모두 플래쉬 메모리 입니다.
자 플래쉬 메모리가 일반 메모리와 다른 점은 뭘까요?
ROM 이야 읽기 전용 메모리라고 알고 있고
RAM 이야 읽고 쓸수 있는 메모리라고 알고 있습니다.
그렇다면 Flash 메모리는 ?
예 읽고 쓸수 있습니다.
또 전원이 꺼져도 내용이 지워지지 않습니다.
오호 이런면으로 보면 RAM 보다 좋아 보이네요 ?
ROM하고 같아 보이고요...
근디 안 좋습니다. ㅡㅡ;
RAM은 일단 고속으로 읽고 쓸수 있습니다만
플래쉬 메모리는 읽고 쓰는 속도가 저속입니다
요즘의 발빠른 프로세서 못 따라 갑니당 ㅜㅜ
또한 NAND의 경우 읽는 방법이 아주 복잡(?) 합니다.
플래쉬에 쓰는 방법은 솔찍히 G랄 같습니다. (여기는 한글로 G랄이 안 써지는 군요. ㅡㅡ;)
도대체 제가 왜 이렇게 투덜거릴까요?
하나씩 알아봅시다.
아직도 제어용 8비트 컨트롤러에 ROM이 많이 쓰입니다.
그런에 이 롬에는 여러가지 타입이 있었습니다.
제가 처음 하드웨어를 만지던 시기에는
ROM에 프로그램을 써 넣으려면 먼저 ROM을 지워야 했습니다.
ROM 중에 웃기게도 유리창이 달린 놈이 있었습니다.
이런 롬은 자외선을 유리창에 비춰서 칩에 썬텐(?)을 해야 했습니다. ㅋㅋ
음식점에서 사용하는 형광등중에 자외선 형광등 있잖습니까...
그거로 지워야 했습니다. 보통 30분이상 지워야 하기 땜시
보드의 디버깅 과정에서 기다림이 많았지요
덕분에 제가 좋아 하는 무협지 많이 봤습니다.
핑계 좋지 않습니까?
롬 지우는 중이라 무협지 본다고 ㅋㅋ
사장님, 아무 소리 못했습니다. 음하하..
다 지워진 롬은 롬 라이터라는 놈으로 프로그램을 써 넣습니다.
보통 이때 롬이 뜨끈 뜨끈 해지거든요..
그래서 롬에 프로그램을 써 넣는 것을 롬 굽는다고 했답니다.
그런데 나중에 EEPROM 이라고 하는 놈이 나옵니다.
이놈은 전기적으로 지워 버리죠...
그래서 롬을 지우는 시간이 짧습니다.
덕분에 그 뒤로는 무협지 못 읽었습니다. ( 삶에 낙이 없어져 버렸다는 이야그 입니다. ㅜㅜ )
이렇게 전기적으로 지우지만 지울때의 전압과 읽을때의 전압이 다릅니다.
보통 지우고 쓸때는 12V 또는 24V 를 사용하고 읽을때는 5V를 사용합니다.
뭐 용량도 무척 작습니다.
아직까지도 이런 롬이 쓰입니다. LAN 카드나 기타 디바이스의 정보 저장용으로도 쓰입니다.
컨트롤러용으로도 쓰입니다.
정보 저장용은 읽고 쓸때 I2C 라는 방식으로 많이 쓰고요
아마도 다른 강좌에서 이에 대한 내용을 쓸겁니다.
제어용은 현재 계속 ROM 형식을 사용합니다.
어쨌든 이런 것들을 ROM 이라고 하는데
이런 메모리는 보통 보드의 부팅과 동작을 위한 프로그램 용으로 사용합니다.
이런 ROM 이 발전한것이 바로 플래쉬 메모리 입니다.
플래쉬 메모리는 EEPROM과 비슷합니다.
하지만 몇가지 차이가 있습니다.
여기서 잠깐 ROM이 어떤식으로 동작하는지 봅시다.
왜냐하면 이런 동작 방식은 플래쉬와 같기 때문입니다.
ROM은 내부에 퓨즈가 있는 것으로 보면됩니다.
퓨즈가 뭐냐구요?
에헤라....
거 있잖습니까...
전기가 과열되면 끊어지는 거...
역쉬 세대차이가 나는 군요..
요즘은 두꺼비집이 없다보니 휴즈가 없는 경우가 많죠...
어쨌든 열이 나면 녹아 없어지는 납줄이 그겁니다.
근데 ROM은 이런 퓨즈가 연결되어 있을때 즉 끊어지기 전 상태를 1 로 봅니다.
반대로 끊어져 있으면 0 으로 봅니다.
그래서 ROM에 프로그램을 써 넣는다는 것은 1 상태는 무시하고 0 인상태인 경우에 해당하는
퓨즈를 끊어 버리는 겁니다.
예를 들어 8 비트 데이터가 있다고 합시다.
00101011
이 각 비트당 하나의 퓨즈가 할당되는데
퓨즈가 연결되어 있으면 1 이고 끊어지면 0 이므로 0 에 해당하는 퓨즈만 끊어 버리는 거죠..
그렇다는 이야기는
ROM을 지운후에 읽어 보면 모두 11111111 로 읽힌다는 거죠
쯕 모두 0xFF 로 읽히면 제대로 지워진 겁니다.
이렇게 연결된 퓨즈중 0으로 만들기 위해서 끊어버리는 것이 데이터를 써 넣는 행위가 되는 겁니당
끊긴 퓨즈를 다시 연결하려면 자외선을 쬐 주거나 높은 전압을 가해서 연결해 버리는 겁니다.
이것을 롬을 지운다고 합니다.
플래쉬도 ROM 과 마찬가지로 이렇게 지우는 과정이 필요한거죠...
그래서 플래쉬를 지우면 모두 11111111로 읽히게 됩니다.
프로그램을 써 넣는 다는 것은 ROM과 마찬가지로 0으로 만드는 부분만 끊어 버리는 거죠..
뭐 끊는다는 표현이 딱 맞는 표현은 아니지만 어쨌든 이렇게 지우고 씁니다.
그런데
잘 생각해 봅시다.
이렇게 지울때....
한꺼번에 지우게 되지요...
즉 각각 특정 비트만 지울수가 없는 겁니다.
지우게 되면 통짜로 지우게 되기 땜시 RAM 처럼 쓸수 없는 겁니다.
물론 지우는 속도도 느리지만요...
그래도 다행인것은 플래쉬는 전체를 모두 지우지 않고 일정한 크기 단위로 지울수 있어서
약간의 숨통을 띄어 놓았다는 거죠...
자 이제 정리해 봅시다.
플래쉬 메모리는 ROM 과 같은 특성를 갖지만 단일 전원으로 지울수도 있고 읽을수도 있습니다.
또한 써 넣을수도 있습니다.
보통 플래쉬 메모리에 행하는 행동을 다음과 같이 이야기 합니다.
READ : 읽기
ERASE : 지우기
PROGRAM : 데이터 써 넣기 또는 프로그램 써 넣기
그래서 플래쉬 메모리는 다음과 같은 순서로 사용합니다.
1. ERASE
2. PROGRAM
3. READ
참! 플래쉬에는 지우지 않고 쓸수 있는 방법이 있기는 있습니다.
하지만 그 제약이 너무 엄청나서 쓰지 않습니다.
아까 원리를 설명 했죠?
퓨즈를 끊으면 0으로 된다고
그래서 이런 경우라면 또 쓸수 있죠
처음에 써 넣는 데이터가 00110010 이라고 하고
다시 써 넣는 데이터가 00010010 이라고 하면
1 이 0으로 바뀐는 경우이므로
또 써 넣을수 있습니다.
근디 누가 이렇게 사용하겠습니다.
꼼꼼한 개발자이거나 상황이 최악인 경우 아닌다음에야..
저같은 게으른 사람은 절.....대.....로.... 시도 하지 않습니다.
하지만 쓰는 분들이나 프로그램이 있다는 것은 기억해 주기 바랍니다.
오늘은 여기까지만 ...
손가락이 아프네요 ㅜㅜ
태그: *유영창 *디바이스드라이버
안녕하세요 이 글이 07년도에 올리신 글인데 답변이 가능할 지 모르겠습니다...
저는 대학 학부생인데 요즘 Atmega128을 이용해서 nandflash memory를 제어하는 것을 공부하고있습니다,
인터넷에서 자료를 구하려고 하면 작성자분이 올리신 글이 제일 많이 나와서 이 글에 질문을 올리게 되었습니다.
다름이 아니고 Atmega128을 이용해서 nandflash address에 접근하여 각 셀이 몇번 읽고 쓰였는지 count한 후
count횟수가 많다면 다른 셀에 정보를 저장하려고 합니다.
이런 일련의 과정들이 가능할지 또 어떤 방향으로 공부를 해야하는지 조언을 부탁드립니다.