도와주세요!!
글 수 15,339
2009.03.16 22:28:59 (*.254.193.157)
7212
안녕하세요..
nand flash를 하드디스크처럼 사용할려고 하는데 잘 안되네요..
우선 칩은 K9F2G08U0A (2Gbit, 2k +64byte pagesize..)이고 커널은 2.6.9 를 사용하고있습니다.
현재까지 확인된 사항(문제)들입니다.
- bad block를 검색했을때 결과는 bad block이 3개로 나옵니다.
- nand flash read , write 관련해서 command와 신호가 제대로 나오는 지는 디바이스 소스에서 확인하였고,
오실로스코프를 이용해 확인했는데 제대로 나오는 거 같습니다.
사용하고 있는 nand driver 는 커널 2.6.9에서 사용하고 있는 소스 그대로 입니다.(driver/mtd/nand..)
- read 했을때 값은 0xff값으로 나옵니다.
- 처음에 제품 id와 device id를 얻어 오는 부분이 있는데 이부분이 좀 이상합니다.
디버그 메세지 (print ) 를 출력할때 device id를 잘 못 얻어올때가 있습니다.
전혀 상관없는 부분(id 얻는 부분보다 아래부분)에 디버그를 출력했는데 id를 잘못 얻어 온다는게
이해가 잘 안됩니다..ㅠ.ㅠ
- device id를 정상적으로 얻어 온 후 현재 소프트웨어 ecc 처리과정을 거치게 되어있습니다.
bad block 영역을 nand 에 write 할려고 하는데 write 가 되긴 되는데 제대로 안됩니다.
한페이지를 write 하는데 크기가 2k +oob(64byte) 입니다. 8bit databus 이기때문에 loop를 돌면서
write를 하고 있습니다. ex>writeb( buf[i] , baseaddress) //byte 단위 write를 하고 나면 분명히 chip의 data register에
저장될 테고 다음으로 command 0x10 을 주면 실제 nand flash cell 에 저장될텐데.. 여기 까지 실행하고 나서
읽어보면 제가 저장한 값하고 다릅니다.. page address 가 잘된건거 같진 않습니다.
중요한건 write 된 값을 read해보면 값이 다른 값이 들어가거나 혹은 일부부만 채워진 경우가 있습니다.
그래서 verify fail이 납니다.
문서를 아무리 찾아봐두 잘 모르겠네요.. 고수님들 좀 알려주세요~~ㅠㅠ
nand flash를 하드디스크처럼 사용할려고 하는데 잘 안되네요..
우선 칩은 K9F2G08U0A (2Gbit, 2k +64byte pagesize..)이고 커널은 2.6.9 를 사용하고있습니다.
현재까지 확인된 사항(문제)들입니다.
- bad block를 검색했을때 결과는 bad block이 3개로 나옵니다.
- nand flash read , write 관련해서 command와 신호가 제대로 나오는 지는 디바이스 소스에서 확인하였고,
오실로스코프를 이용해 확인했는데 제대로 나오는 거 같습니다.
사용하고 있는 nand driver 는 커널 2.6.9에서 사용하고 있는 소스 그대로 입니다.(driver/mtd/nand..)
- read 했을때 값은 0xff값으로 나옵니다.
- 처음에 제품 id와 device id를 얻어 오는 부분이 있는데 이부분이 좀 이상합니다.
디버그 메세지 (print ) 를 출력할때 device id를 잘 못 얻어올때가 있습니다.
전혀 상관없는 부분(id 얻는 부분보다 아래부분)에 디버그를 출력했는데 id를 잘못 얻어 온다는게
이해가 잘 안됩니다..ㅠ.ㅠ
- device id를 정상적으로 얻어 온 후 현재 소프트웨어 ecc 처리과정을 거치게 되어있습니다.
bad block 영역을 nand 에 write 할려고 하는데 write 가 되긴 되는데 제대로 안됩니다.
한페이지를 write 하는데 크기가 2k +oob(64byte) 입니다. 8bit databus 이기때문에 loop를 돌면서
write를 하고 있습니다. ex>writeb( buf[i] , baseaddress) //byte 단위 write를 하고 나면 분명히 chip의 data register에
저장될 테고 다음으로 command 0x10 을 주면 실제 nand flash cell 에 저장될텐데.. 여기 까지 실행하고 나서
읽어보면 제가 저장한 값하고 다릅니다.. page address 가 잘된건거 같진 않습니다.
중요한건 write 된 값을 read해보면 값이 다른 값이 들어가거나 혹은 일부부만 채워진 경우가 있습니다.
그래서 verify fail이 납니다.
문서를 아무리 찾아봐두 잘 모르겠네요.. 고수님들 좀 알려주세요~~ㅠㅠ
스몰블럭보다 좀더 길어야 합니다.
플래시 디바이스 입장에서 사용자가 특정주소를 읽으라고 하면 내부 버퍼에 페이지만큼의 데이타를 로드합니다.
사용자는 이 내부버퍼(래치레지스터정도 되죠)를 읽게 되는 것입니다.
내부버퍼로 로드되기 전에 읽어버리면 데이타가 앞쪽은 없어지고 뒤쪽 데이타만 정상으로 읽히게 됩니다.
라지블럭을 제어하시고자 한다면 왠만하면 커널 2.6.11 이상 사용하시는게 좋을것 같네요
제 기억으로 이 버젼정도에서 안정화 된걸로 압니다. ^^