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

BOOT LOADER 를 NAND FLASH에 WRITE 후 NAND를 ERASE 하였는 데

아래와 같이 이상하게 지워지지 않고 멈춥니다.

 

어떤 문제 일까요? U-BOOT는 JTAG로 쓴후에 읽어서 덤프해보니 이상없이 쓰기가 된 걸 확인하였습니다.

 

아래는 BOOT 메세지입니다.

 

OK


U-Boot 1.1.6 (Aug 30 2011 - 14:30:17) for AESOP6410

 

CPU:     S3C6410@666MHz

         Fclk = 666MHz, Hclk = 133MHz, Pclk = 66MHz, Serial = CLKUART (ASYNC Mode)

Board:   AESOP-S3C6410

DRAM:    128 MB

Flash:   0 kB

NAND:    512 MB

*** Warning - bad CRC or NAND, using default environment


In:      serial

Out:     serial

Err:     serial

Hit any key to stop autoboot:  0

aESOP-S3C6410 # nand erase 60000 100000


NAND erase: device 0 offset 0x60000, size 0x100000


Erasing at 0x60000 --  12   <------ 여기서 멈춤 -_-;  ENTER치면 계속 반복(두줄만 반복 출력)

                                           <------ 소스상에 시리얼로 뿌리면 다음 루틴으로 진해이 안되네요

                                          


만년설화

2012.11.13 18:13:20
*.33.183.148

 

추가적인 설명 첨부합니다.

고수님들 도와주세요!!

 

디버깅 메세지를 넣어서 보면 반복문에서 진행이 되지 않습니다.

 

실제 디버깅용 메세지를 출력하여 보면 아래와 같습니다

 

nand erase 명령 실행 후 step #16 에서ㄱ하여야  step#8 로 반복하여야 하는 데 안됩니다.

 

NAND erase: device 0 offset 0x60000, size 0x100000

Erasing at 0x60000 --  12  

 

위 상태에서 enter 치면 아래와 같은 메세지만 반복됩니다. 소스가 안도는 것처럼....

 

제 생각에는 SDRAM이 이상하지 않나 생각해 봅니다.

SD 부팅시에도 최초 4kB 읽을 때 CS 에러가 납니다

왜 소스가 수행이 안되는 걸가요?-_-;

 

erase.len = 262144

nanoeye step#5

erase.addr = 262144, erase_length=3932160

 NAND Type = 1

nanoeye step#8

nanoeye step#9

ret=0

nanoeye step#11

 nanoeye step#12 meminfo->erase() = 0

nanoeye step#14

 nanoeye step#15 n = 262144, erase_length=26214400

 nanoeye step#16 percent = 6, percent_complete=-1

 

 

u-boot 상의 소스

 

int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)
{
 struct jffs2_unknown_node cleanmarker;
 int clmpos = 0;
 int clmlen = 8;
 erase_info_t erase;
 ulong erase_length;
 int isNAND;
 int bbtest = 1;
 int result;
 int percent_complete = -1;
 int (*nand_block_bad_old)(struct mtd_info *, loff_t, int) = NULL;
 const char *mtd_device = meminfo->name;

 /* jsgood */
 struct mtd_oob_ops oob_ops;
 memset(&cleanmarker, 0, sizeof(cleanmarker));

 memset(&erase, 0, sizeof(erase));

 erase.mtd = meminfo;
 erase.len  = meminfo->erasesize;
 printf("erase.len = %ld\n", erase.len);
 
 if (opts->offset == 0 && opts->length == 0) {
  /* erase complete chip */
  puts("nanoeye step#4\r\n");
  
  erase.addr = 0;
  erase_length = meminfo->size;
 } else {
  puts("nanoeye step#5\r\n");
 
  /* erase specified region */
  erase.addr = opts->offset;
  erase_length = opts->length;
 }

 printf("erase.addr = %ld, erase_length=%ld\n", erase.addr,erase_length);

 isNAND = meminfo->type == MTD_NANDFLASH ? 1 : 0;

 printf(" NAND Type = %d\n", isNAND);

 if (opts->jffs2) {
  
  cleanmarker.magic = cpu_to_je16 (JFFS2_MAGIC_BITMASK);
  cleanmarker.nodetype = cpu_to_je16 (JFFS2_NODETYPE_CLEANMARKER);
  if (isNAND) {
   /* org: struct nand_oobinfo *oobinfo = &meminfo->oobinfo; */
   struct nand_ecclayout *oobinfo = meminfo->ecclayout;

   /* check for autoplacement */
   if (oobinfo->useecc == MTD_NANDECC_AUTOPLACE) {
    /* get the position of the free bytes */
    if (!oobinfo->oobfree[0].length) {
     printf(" Eeep. Autoplacement selected "
            "and no empty space in oob\n");
     return -1;
    }
    clmpos = oobinfo->oobfree[0].offset;
    clmlen = oobinfo->oobfree[0].length;

    /* jsgood */
    if (clmlen > 12)
     clmlen = 12;
   } else {
   
    /* legacy mode */
    switch (meminfo->oobsize) {
    case 8:
     clmpos = 6;
     clmlen = 2;
     break;
    case 16:
     clmpos = 8;
     clmlen = 8;
     break;
    case 64:
     clmpos = 16;
     clmlen = 8;
     break;
    }
   }

   cleanmarker.totlen = cpu_to_je32(8);
  } else {
   cleanmarker.totlen =
    cpu_to_je32(sizeof(struct jffs2_unknown_node));
  }
  /* jsgood */
  /* cleanmarker.hdr_crc =  cpu_to_je32(
   crc32_no_comp(0, (unsigned char *) &cleanmarker,
          sizeof(struct jffs2_unknown_node) - 4)); */
 }

 /* scrub option allows to erase badblock. To prevent internal
  * check from erase() method, set block check method to dummy
  * and disable bad block table while erasing.
  */
 if (opts->scrub) {
  puts("nanoeye step#7\r\n");
  
  struct nand_chip *priv_nand = meminfo->priv;

  nand_block_bad_old = priv_nand->block_bad;
  priv_nand->block_bad = nand_block_bad_scrub;
  /* we don't need the bad block table anymore...
   * after scrub, there are no bad blocks left!
   */
  if (priv_nand->bbt) {
   kfree(priv_nand->bbt);
  }
  priv_nand->bbt = NULL;
 }

 for (;
 
      erase.addr < opts->offset + erase_length;
      erase.addr += meminfo->erasesize) {
  puts("nanoeye step#8\r\n");

  WATCHDOG_RESET ();

  if (!opts->scrub && bbtest) {
   puts("nanoeye step#9\r\n");
   
   int ret = meminfo->block_isbad(meminfo, erase.addr);
   printf("ret=%d\r\n", ret);
   
   if (ret > 0) {
   puts("nanoeye step#9-1\r\n");
    
    if (!opts->quiet)
     printf("\rSkipping bad block at  "
            "0x%08x                   "
            "                         \n",
            erase.addr);
    puts("nanoeye step#9-2\r\n");
           
    continue;

   } else if (ret < 0) {
   puts("nanoeye step#10\r\n");
   
    printf("\n%s: MTD get bad block failed: %d\n",
           mtd_device,
           ret);
    return -1;
   }
  }

   puts("nanoeye step#11\r\n");

  result = meminfo->erase(meminfo, &erase);
  printf(" nanoeye step#12 meminfo->erase() = %d\n", result);
  
  if (result != 0) {
   printf("\n%s: MTD Erase failure: %d\n",
          mtd_device, result);
   puts("nanoeye step#12\r\n");
         
   continue;
  }

  /* format for JFFS2 ? */
  if (opts->jffs2) {
   puts("nanoeye step#13\r\n");

   /* write cleanmarker */
   if (isNAND) {
    /* org: result = meminfo->write_oob(meminfo,
           erase.addr + clmpos,
           clmlen,
           &written,
           (unsigned char *)
           &cleanmarker); */
    oob_ops.mode = MTD_OOB_AUTO;
    oob_ops.ooboffs = 0;
    oob_ops.ooblen = clmlen;    
    oob_ops.oobbuf = (unsigned char *)&cleanmarker;
    oob_ops.datbuf = NULL;
    
    result = meminfo->write_oob(meminfo, erase.addr, &oob_ops);
   
    if (result != 0) {
     printf("\n%s: MTD writeoob failure: %d\n",
            mtd_device, result);
     continue;
    }
   } else {
    printf("\n%s: this erase routine only supports"
           " NAND devices!\n",
           mtd_device);
   }
  }

  if (!opts->quiet) {
   puts("nanoeye step#14\r\n");
   
   unsigned long long n =(unsigned long long)
     (erase.addr+meminfo->erasesize-opts->offset)
    * 100;
   int percent;
  printf(" nanoeye step#15 n = %ld, erase_length=%ld\n", n, erase_length);

   do_div(n, erase_length);
   percent = (int)n;
  printf(" nanoeye step#16 percent = %d, percent_complete=%d\n", percent , percent_complete);

   /* output progress message only at whole percent
    * steps to reduce the number of messages printed
    * on (slow) serial consoles
    */
   if (percent != percent_complete) {
    percent_complete = percent;

    printf("\r\nErasing at 0x%lx -- %3d%% complete.\r\n",
           erase.addr, percent);

  printf("\r\nnanoeye step#16-1\n");

    if (opts->jffs2 && result == 0)
     printf(" Cleanmarker written at 0x%x.",
            erase.addr);
  printf("\r\nnanoeye step#16-2\n");
           
   }
  printf("\r\nnanoeye step#17\n");
   
  }
 }
 if (!opts->quiet)
  printf("\n");

 if (nand_block_bad_old) {
  struct nand_chip *priv_nand = meminfo->priv;

  priv_nand->block_bad = nand_block_bad_old;
  priv_nand->scan_bbt(meminfo);
 }

 return 0;
}

 

List of Articles
번호 제목 글쓴이 날짜 조회 수
5608 make_ext4fs를 통해 파일 시스템을 만들려고 하는데 error는 왜 나... file 혜민아빠 2012-11-27 1449
5607 어플에서 uboot 버전정보 보기? [4] lveritas 2012-11-27 1569
5606 삼성의 AP series 대리점에 대한 문의드립니다. [1] 어떤이의꿈 2012-11-26 1491
5605 이더넷 칩 선택 [3] 정창환 2012-11-23 1407
5604 터치동작관련 질문입니다~ [3] 박한수 2012-11-23 1241
5603 softfloat, hardfloat에 대해 궁금합니다. [1] 하나만파자 2012-11-23 1168
5602 linux wifi 관련 질문요.. ㅠ.ㅠ [2] 딴따라 2012-11-22 1377
5601 i.MX53 Start-Kit이용 Linux 개발환경 구성 문제 [3] 카보 2012-11-21 1719
5600 리눅스 디렉토리 자동이동구현에 대해 질문있습니다. file 원더풀 2012-11-20 957
5599 [ORIGEN-4412] 앱에서 /sdcard에 디렉토리, 파일 생성 시 이슈 건 [1] 램퍼 2012-11-17 1349
5598 ioremap에 관한 문제 - S5PV210 kernel-2.6.32 [2] 아침햇살 2012-11-16 1337
5597 리눅스 상에서 작은 파일시스템 만들고 있습니다. 저장 루틴 관련해... [3] 나론 2012-11-15 1313
5596 네트웍에 연결된 임베디드 장비들을 검색하는 방법에 관한 문의입니다... [2] mr 2012-11-14 1271
» [S3C6410] NAND ERASE 시 에러가 발생합니다. [1] 만년설화 2012-11-13 1401
5594 안드로이드 USB Host API의 packet buffer size 관련 질문 입니... [6] 임형각 2012-11-13 1716
5593 6410 USB OTG DEVICE 질문 문철민 2012-11-12 931
5592 Fimc 출력질문드립니다 [2] 공돌이남 2012-11-10 1263
5591 다음 주소의 게시글에 달린 자료 부탁드립니다.. Byed 2012-11-10 712
5590 안드로이드 overlay 질문입니다. [1] 공돌이남 2012-11-10 1031
5589 BT656 도움 부탁드립니다. [1] 사악깨비 2012-11-09 1406

사용자 로그인