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

Nand Flash 변경 질문드려요.

회사에서 사용하는 Nand 가 단종이 되는 바람에 다음 버전 제품으로 변경하려고하는데,
예상과 다르게 정상동작을 하지 않네요.
회사에 임베디드 관련 전문가 분이 없어서 염치 없지만 여기에 질문을 올립니다.

문제의 Nand Flash는 다음과 같습니다.

변경전의 Nand Flash : K9F4G08U0D
변경할 Nand Flash : K9F4G08U0E

K9F4G08U0A 부터 시작해서 K9F4G08U0D까지 사용하였습니다.
기록이나 코드를 봤을때, Kernel이나 Boot 변경없이 사용한것으로 보입니다.
K9F4G08U0E을 적용하면서... 문제가 발생하네요 ㅠ.ㅠ

두 Nand Flash의 Datasheet을 비교해보았을때의 차이점은 다음과 같습니다.

- Program Erase 타이밍 변화
1. Program Time:  Typ 250 -> 400 us, Max 750 -> 900 us
2. Number of Partial Program Cycles:  1 -> 4
3. Block Erase Time: Typ 2.0 -> 4.5 ms , Max 10 -> 16 ms

- AC 특성 변화
1. Data Transfer from Cell to Register: Max 25 -> 40 us


Nand Flash 변경시 Timing 수정을 해야 한다는 글이 있어.. Kernel 과 Boot에서 위 변경된 2내용에 대하여 소스를 찾아봤습니다.
혼자 찾아보긴했지만 확신이 들지않아..
실례가 되지않는다면 타이밍 수정을 어찌 하는건지 알려주셨으면 합니다.
일단 아래 타이밍 수정하는 코드로 의심되는 부분을 적어 보았습니다.
------------------------------------------------------------------------
- Kernel: drivers/mtd/nand/nand_base.c
static void nand_set_defaults(struct nand_chip *chip, int busw)
{
...
if (chip->waitfunc == NULL)
        chip->waitfunc = nand_wait;
...

}

/**
 * nand_wait - [DEFAULT]  wait until the command is done
 * @mtd:    MTD device structure
 * @chip:   NAND chip structure
 *
 * Wait for command done. This applies to erase and program only
 * Erase can take up to 400ms and program up to 20ms according to
 * general NAND and SmartMedia specs
 */
static int nand_wait(struct mtd_info *mtd, struct nand_chip *chip)
{
    unsigned long timeo = jiffies;
    int status, state = chip->state;

    if (state == FL_ERASING)
        timeo += (HZ * 400) / 100; <--- @@@ Erase Time
    else
        timeo += (HZ * 20) / 100; <--- @@@ Erase Time 이외 Program TIme

    led_trigger_event(nand_led_trigger, LED_FULL);

    /* Apply this short delay always to ensure that we do wait tWB in
     * any case on any machine. */
    ndelay(100);

    if ((state == FL_ERASING) && (chip->options & NAND_IS_AND)){
        chip->cmdfunc(mtd, NAND_CMD_STATUS_MULTI, -1, -1);
    }else{
        chip->cmdfunc(mtd, NAND_CMD_STATUS, -1, -1);
    }
    while (time_before(jiffies, timeo)) {
        if (chip->dev_ready) {
            if (chip->dev_ready(mtd)){
                break;
            }
        } else {
            if (chip->read_byte(mtd) & NAND_STATUS_READY){
                break;
            }
        }
        cond_resched();
    }
    led_trigger_event(nand_led_trigger, LED_OFF);

    status = (int)chip->read_byte(mtd);
    return status;
}

/*
 * Wait for the ready pin, after a command
 * The timeout is catched later.
 */
void nand_wait_ready(struct mtd_info *mtd)
{
    struct nand_chip *chip = mtd->priv;
    unsigned long timeo = jiffies + 2;

    led_trigger_event(nand_led_trigger, LED_FULL);
    /* wait until command is processed or timeout occures */
    do {
        if (chip->dev_ready(mtd))
            break;
        touch_softlockup_watchdog();
    } while (time_before(jiffies, timeo));
    led_trigger_event(nand_led_trigger, LED_OFF);
}
EXPORT_SYMBOL_GPL(nand_wait_ready);
------------------------------------------------------------------------
Boot도 시간 체크하는 부분을 제외하면 거의 동일하더군요...

flash erase 로 Nand Flash 지워 봤을때, 해당함수로 들어가는건 확인했으나,
Datasheet에 있는 값과 소스의 값의 차이가 심해 ... 저 코드를 수정해서 타이밍 조절하는건지는 확실히 모르겠습니다.
제가 찾지는 못했지만 저 타이밍 이외에 수정하는 부분이 있는건가요???
저 소스에있는 Wait Time을 크게 해도 상관이 없는건가요?
조언 부탁드립니다.

Nand Flash 변경할때 다른 확인해야 할점이 있으면 알려주세요..
정말 간단한 힌트라도 좋으니.. 조언 부탁드립니다.

첨가) Read ID는 잘 동작합니다...


고도리

2015.02.12 13:46:29
*.151.11.141

Single Level Cell nand 포팅시 가끔 나오는 문제로 보여지네요...


일단, read/write쪽 timing diagram을 아주 자세하게 비교하시는게 우선일 듯 싶습니다.

너무 오래된 자료라 찾기가 힘든데, 예전에 비슷한 문제가 있었던 것으로 기억이 나네요.


이솝에도 어디 질문이 있었을텐데(timing diagram이 첨부된)....


틀린 부분을 보신 후 관련 diagram의 차이에 따라 nand code를 수정하시면 됩니다.

ex> write cycle에 CE가 맨 마지막에 한 번 더 들어가야 하는 경우....등등....

FOLIMM

2015.02.12 19:30:44
*.79.61.70

늦은 밤 피곤하실텐데 답변 주셔서 너무 감사합니다.

아직 원인은 찾지 못했지만 조금더 노력하면 보일것이라 믿고 파이팅할께요.

정말 감사합니다.

마음처럼

2015.03.07 04:29:12
*.115.113.222

늦었지만 똑같은 고민하시는 분을 위해서 남김니다.

저도 낸드플래쉬가 단종이라서 E다이 검토를 했었던적이 있습니다.

첨부한 D다이에서 E다이로 변경사항 문서 보시면 Number of Partial Program Cycles 이 4cycle에서 1cyle로 변경됐습니다.


CPU가 뭔지 모르겠지만  ID가 변경되서 IROM에서 인식 못하는 경우도 있습니다.

S3C6410에서는 ID가 D다이까지만 인식하고 새로나온 E다이는 인식 못합니다.


결론은 스팬션이나 마이크론으로 검토 하신는것이 좋을듯합니다.

첨부

고도리

2015.03.07 05:00:52
*.200.239.210

timing 문제가 맞는 듯 하네요.


6410이 D type만 인식한다면........이래저래 문제가 심각한 상태로 되어 버리는데,

다른 회사 것으로 바꾸던지 하는게 정상일 듯 합니다.


이런 좋은 정보는 좀처럼 보기 힘든데...........^^

List of Articles
번호 제목 글쓴이 날짜 조회 수sort
6168 노트북에서 VirtualBox 네트워크 셋팅 질문입니다 (스크린샷 포함) file [3] 의지박약인 2011-03-04 2874
6167 삼성 PV310 관련 MIPI CSI 4 Lane 규격 영상캡춰 문의 .... [7] 파란새 2011-12-22 2869
6166 메모리 어떻게 빼나요?[완료] [2] 조준동 2007-05-11 2859
6165 [질문]SDL에서 터치 화면 맞지않는 문제 <= 완료 [5] 김경복 2007-01-09 2857
6164 안드로이드 PDK 포함 Full Source 받는 방법을 자세히 알고 싶읍... [5] 장석원 2010-08-13 2844
6163 6410에 관련 몇가지 질문입니다. [5] 김혁민 2009-01-18 2843
6162 Aesop S3C6410 에 Android 설치 관련 질문이 있습니다. [3] 박순철 2009-08-03 2841
6161 [완료] 완전 초짜의 질문 GPIO는 어디서 뽑을지.. [3] 오주열 2007-05-18 2839
6160 안드로이드 버전 확인 방법 문의 [1] 임유신 2009-06-24 2830
6159 Origenboard (S5PV310) u-boot & kernel 다운로드 [1] gudrl 2013-04-17 2828
6158 git 서버 구축 하여 IP로 접근 할수 있는 방법? [3] 작두 2010-03-26 2827
6157 [완료] LX800 여유분이 남았나요? [2] 황순일 2007-06-04 2820
6156 USB bluetooth 동글을 Android에서 인식하게 하려면? [2] 정낙주 2010-02-10 2811
6155 RTL8100을 두개 붙이려면? [2] 임태진 2008-06-27 2808
6154 [완료] Linux CD에 굽는 방법좀 알려주세요.. [6] 정인권 2007-06-07 2801
6153 busybox compile(Toolchain-aesop6410-090320) [6] 김도윤 2009-04-23 2797
6152 wpa_supplicant에 있어서 문의드립니다. [2] 열심히 2013-07-12 2795
6151 gtk+-2.12.12 on DirectFB-1.4.9에서 gtk-demo 에러 양철심장 2011-07-19 2787
6150 nand erase error입니다 도움 부탁합니다. [2] 문철민 2007-11-24 2786
6149 smpeg질문 [1] 박진수 2006-04-13 2773

사용자 로그인