도와주세요!!
안녕하세요 임베디드를 공부하고 있는 서정무입니다.
다름이 아니라 조금 어려운 문제에 직면해서 도움을 구하고 싶습니다.
일단 제 보드를 사양은
MCU : HMS30C7210
U-boot : u-boot 1.1.2.1
Kernel : linux 2.4.21
Nand Flash : K9F1208X0C
위와 같습니다. 일단 보드는 정상 적으로 작동을 하던 상황이었는데 갑자기 문제가 터져서 보았더니
다음과 같이 bad eraseblock으로 인하여 부팅이 안됩니다.
2.NAND device: Manufacturer ID: 0xad, Chip ID: 0x75 (Unknown NAND 32MiB 3,3V 8-bit)
create_bbt:Scanning device for bad blocks
Bad eraseblock 1416 at 0x0162 0000
Bad eraseblock 1417 at 0x01624000
Bad eraseblock 1418 at 0x01628000
Bad eraseblock 1419 at 0x0162c000
~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~
Bad eraseblock 2043 at 0x01fec000
Bad eraseblock 2044 at 0x01ff0000
Bad eraseblock 2045 at 0x01ff4000
Bad eraseblock 2046 at 0x01ff8000
Bad eraseblock 2047 at 0x01ff c000
Creating 6 MTD partitions on "NAND 32MiB 3,3V 8-bit":
0x00008000-0x0003c000 : "partition 0 - u-boot"
0x00048000-0x000ac000 : "partition 1 - kernel"
0x00200000-0x00700000 : "partition 2 - rootfs"
0x00700000-0x00c00000 : "partition 3 - /usr/modules/2.4.21/"
0x00c00000-0x01600000 : "partition 4 - /usr/lib/"
0x01600000-0x02000000 : "partition 5 - JM"
위의 bad block 체크는 커널에서 체크 할 때 생겼으며 bad block을 위에는 많이 줄여 놓았지만
사실 600개가 넘는 bad block 이 발생이 되었습니다. 여기 저기 찾아 보았는데 Nand flash는
기본적으로 bad block을 가지고 있으며 보통 많이 생겨바야 7~8개도 많이 생긴다 던데
저한테는 600개가 넘는 block들이 발생 되었습니다.
그리고 bad block들의 영역은 partition 5에 영역에서 발생되었습니다.
이외에 한두개가 같은 문제가 생겨서 확인을 해보았더니 역시 600개가 넘는 bad block들이
동일한 영역에서 발생이 되었드라고요..
먼가 잘못 된 냄새는 나는데.. 어디서 어떻게 짚으면서 원인을 찾아내얄지 너무 답답합니다.
참, 그리고 혹시나 해서 u-boot 커맨드 모드에서
nand erase 700000 1900000
위 영역을 삭제 해보았습니다... 그랬더니;;;
u-boot 영역이 지워 졌는지;; 그다음 부터는 보드가 전원은 들어오나 부팅이 안되더라구요;;
그래서 결론적으로 정리 하자면
1. bad eraseblock의 갯수가 비이상적으로 많다.
2. bad block의 영역은 partiton 5인 Application 영역이다.
3. bad block영역을 erase 할 경우 다시는 부팅이 되지않는다.
조언좀 부탁드립니다. 비슷한 증상이나 원인을 아시면 좀 부탁드립니다..
답변 너무나 감사드립니다^^
현재 낸드의 스페어 영역부분의 badblock flag를 다 지우고 다시 낸드에 구웠습니다
그랬더니 bad block은 싹 다 사라지고 프로그램도 다시 제대로 작동을 하고 있습니다.
이렇게 되면 아무래도 두번째 문제인 커널에서 낸드 관련된 인터페이스 포팅이 잘 못되었다는
것이 분명한건지요?? (만약에 정말 물리적으로 낸드가 bad block을 표시 한거라면 설령 프로그램
적으로 spare 영역의 bad block flag를 초기화 하였어도 물리적으론 저장이 안되기 때문에 프로그램이
정상적으로 돌지 않아야 하는데 지금은 프로그램이 잘 돌고 있어서 이런 생각이 듭니다.)
그리고 자료를 찾아보니 보통 낸드 사용시에는 파일 시스템을 사용시에는 yaffs 을 사용하는것이
좋다하던데 저는 cramfs(리눅스 부팅속도를 줄이기에 좋은 파일시스템이라들어서;;)을 사용하고
있습니다. 이와 관련되어서 문제가 야기 될 수가 있을까요??
두가지 정도를 확인 하셔야 하겠네요.
먼저 낸드 관련된 타이밍이 적적한가.
부트로더에서는 저속으로 동작하기 때문에 문제가 없지만 커널에서는 고속으로 동작하기 때문에
타이밍이 문제가 되는지 확인해야 합니다.
두번째는 커널에서 낸드 관련된 인터페이스 포팅이 잘 되었는지 확인해야 합니다.
보통은 두번째에서 문제가 많이 생깁니다.
단순히 아이디나 뭐 그런건 잘 읽어 오는데 문제가 생기는 경우가 좀 있죠.