기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

안녕하세요.

NAND bad block 처리에 관한 질문이 있어서 글을 남겼습니다. 양산 직전이라 매우 조심스럽네요.


u-boot v1.1.6 사용중입니다.


SIZE 정보:

    NAND 1block size  : 128K

    u-boot.bin             : 213K


NAND Flash 벤더가 1st block을 1천번 program/erase 보장한다는데, 

이 경우 u-boot는 2번째 block까지 사용하게 됩니다.


2번째 block은 bad가 날 수 있는데, 방법을 생각해 보자면...

    -후보 1번. u-boot를 128K (1block) 이하로 줄인다.

    -후보 2번. 작은 크기의 u-boot으로 부팅 후 원래 크기의 u-boot으로 다시 부팅한다.

    -후보 3번. 2번째 block이 bad 날 확율이 낮으니 그냥 무시한다.



NAND 5번 block ~ 10번 block 에서도 bad가 나는 걸 보면 '후보 3번'은 힘들 것 같네요. ㅠㅠ


실제 양산 과정에서 이런 경우 어떻게 해결하는지 고수님들의 답변 부탁드립니다.



P.S. SMT 과정과 NAND bad block 발생하는 것이 어떤 관계가 있을까요? 

       우연이겠지만, SMT 과정이 바뀜에 따라 NAND bad block 이 증가하고 있는 것 같이 느껴지네요..



고도리

2011.08.03 11:59:49
*.121.139.134

예전 썼던 방법은


128k 이내의 bootloader를 작성한 후(u-boot를 줄이는 것도 상관은 없습니다)

거기서 u-boot를 두번째 block서부터 읽어서 CRC32 check 한 후 로딩하는 것입니다.


물론, 두벌을 넣어야 겠지요....^^


block number로 써보면


0: 128k 안에 들어가는 작은 부트로더, CRC32 decode가 가능한

1 ~ 2: u-boot 1st

3 ~ 4: u-boot 2nd


단 u-boot binary는 CRC32 code를 들고 있을 것...


NAND의 bad block은 개인적인 경험으로는 인가전압에 있었습니다.

적절한 전압을 인가해 주시기 바랍니다.


ps> http://www.aesop.or.kr/?document_srl=442833#comment_442859 글의 이송호님의 답변도 아주 좋은 솔루션이 될 듯 합니다.


ps1> 위의 방법 중 CRC32 방법은 약간 무식한 방법일 수도 있지만, 예전에 이거 가지고 꽤 득본적이 있습니다...^^

funmoney

2011.08.03 18:49:08
*.169.251.167

고도리님의 조언도 좋은 방법으로 보입니다.

요새 NAND booting 이 일반화 되다보니 bad block 이나 양산관련하여 고민하시는 분들이 많은 것 같아

재사 사용하고 있는 방법을 정리해서 적어 봅니다.

 

1. 우선 배경설명을 드리면

NAND booting 을 지원하는 Processor 의 경우 내부에 MASK ROM 과 4KB ~ 32KB 정도의 SRAM 을 내장하고 있습니다.

ROM 에있는 booting configuration 에 따라서 다르게 동작하는 프로그램이 들어 있습니다. NAND booting 이 감지되면

NAND flash 의 manufacture ID / device ID 를 읽어 들여서 동작전압/전체크기/Block크기를 구별해 냅니다.

이후에 1st block 에서 자신이 내장한 SRAM 의 크기만큼 읽어서 SRAM 에 상주시키고 PC(Program Counter) 를 SRAM 으로

이동시켜서 SRAM 에 상주된 bootloader 를 실행하게 됩니다.

( 이런이유에서 NAND flash 를 만드는 업체에서 1st block 에대해서만 높은 안정성을 보장하도록 만들었습니다. )

이후 interfanal SRAM 에 상주된 bootloader 는 CLOCK/SDRAM controller 를 초기화 시키고 실제 OS 에대한 loader 기능을

서비스하는 main bootloader 를 NAND flash 에서 읽어서 SDRAM 에 상주시킨 후에 PC 를 main bootloader 에게 넘깁니다.

이후 과정을 일반적인 linux 부팅과정과 동일 합니다.

 

2. 즉, booting 과정중에 bootloader 가 총 3개동작합니다. 첫번째는 MASK ROM 에 있는 startup , 두번째는 NAND flash 의

1st block 에 있는  bootstrap 그리고 마지막으로 2st block 이후에 있는 main bootloader 입니다.

linux 에서는 main bootloader 가 u-boot 가 되겠지요.

 

3. 그럼, 이제 bad block 들이 2st 블럭부터 있는 NAND flash 를 양산에 적용해도 문제가 없도록 하는 방법을 생각해 봅니다.

NAND flash 의 bad block marking 은 모든 NAND flash 들이 반도체 제조업체에서 출하될 때 spare 영역에 marking 되어

나옵니다. ( jffs2/yaffs/yaffs2 의 bad block 처리는 이를 준수하여 구성되고 있습니다. )

따라서 이것을 이용하면 됩니다.

 

3.1 즉, 위에서 명명된 bootstrap 을 bad block skip reading 기능을 갖도록 만들어 주면 됩니다.

       또한 양산하는 공장에서 ROM writer 로 NAND flash 에 구울 때 반도체 공장에서 marking 된 bad block 을 지우지 말고

       bad block skip 방식으로 구우라고 작업지시서를 내려주어야 합니다. ( ROM writer 의 경우 bad block marking 을

       무시하고 writing 하는 기능도 함께 가지고 있으므로 , 무경험자가 처음 작업 하면 bad block skip burning 을

        하지않고 무작성 순서대로 burning 하는 경우도 있었습니다. )

 

4. 추가로 , 만약 2st ~5th block 에 연속으로 bad block 이 있을 경우를 대비하여 저같은 경우 mtdblock 을 찹을 때

     u-boot 가 실제로 2개의 block 만 사용하는 크기라고 하더라도 u-boot 의 mtdblock 을 6개 까지 잡아 줍니다.

     이렇게 되면 연속을 4개의 bad block 이 2st ~ 5th 까지 있어도 커버할 수 있습니다. ( 사실 이런경우는 경험상

      없었습니다. ^^ )

 

5. bootstrap 에 badblock skip 을 안정적으로 구성하기가  어려운 상황에 있으신 분들에게는 아래의 방법을

    추천해주곤 합니다. ( 사실상 2st ~ 5st 사이에 bad block 이 있을 확률은 높지 않습니다. )

    -- 아래 --

    NAND flash ROM writer 에서는 특정 block 에 공장 출하시 bad marking 이 된 것이 있으면 불량처리하여 burning 을

    하지 않도록 하는 기능을 지원해 줍니다. 이기능을 이용하여 u-boot 가 위치된 2st~3rd block 에 bad marking 이 된

    NAND flash 는 불량처리하여 제품에 투입되지 않도록 작업지시서를 내려주는 방법입니다.

    ( 이방법을 nand flash 를 버리는 수량도 아깝다면 bootstrap 에 bad block skip read 기능을 추가하셔야 합니다.

 

이상 제가 경험에서 채득한 방법을 적었습니다. 여러분들에게 도움이 되었으면 좋겠습니다.

List of Articles
번호 제목 글쓴이 날짜sort 조회 수
1548 안드로이드 터치 상하좌우 반전현상 [1] 나영찬 2011-08-03 1696
» NAND bad block 관련 질문 ( 2st bad block ) [2] 박영기1 2011-08-03 2357
1546 s5pc210보드에 arm ubuntu를 포팅하고 싶은데요.. [1] 앞에그만가지 2011-08-03 952
1545 ffmpeg을 ARM 컴파일해보시고 사용해보신분?? [2] 아토아밥통 2011-08-04 1031
1544 u-boot 초기 개발 어떻게 하시나요? [1] 박영기1 2011-08-05 1036
1543 V310 보드에 점퍼 띄울려고 하는데요. [1] 훌러덩 2011-08-05 855
1542 V310 uboot build error [2] 훌러덩 2011-08-05 1547
1541 fs/buffer.c에서 get_block error 난 경우 [1] 만봉부인 2011-08-06 919
1540 버추얼박스에서 tftp네트워크 설정 문제.. [1] 준히오빠 2011-08-06 1347
1539 system.img내에 특정 so 파일 변경 관련 문의 드립니다. [1] 나나리 2011-08-08 916
1538 임베디드 리눅스 콤파일 문제 [1] blue0sky 2011-08-08 1161
1537 우분투에서 이미 사용중인 파티션을 분할 할 수 있나요? 물고기 2011-08-08 1072
1536 aesop-c100 동영상 올려보기 [1] 이솝우와 2011-08-08 710
1535 CentOS 6.0 에서 tftp 데몬이 시작하자 않는 문제점 [2] blue0sky 2011-08-09 977
1534 V310 터치 관련 [1] 훌러덩 2011-08-09 846
1533 이더넷포트와 스위칭허브IC간의 MII연결 질문 [1] Happycpu 2011-08-09 1543
1532 alsa에서 어플의 write 명령 [2] 이정화 2011-08-10 906
1531 리눅스 어플리케이션 생성 및 ADB Sell에서 실행 [1] 정호정호 2011-08-10 946
1530 How to fall into "init 1" state in Android??? [2] Simba444 2011-08-10 775
1529 AESOP-6410의 TOUCH PANEL은 어디것을 적용하였나요 [1] 천해 2011-08-10 587

사용자 로그인