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

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
번호 제목 글쓴이 날짜 조회 수
6168 flash를 양산 image로 만들 때... [3] 김경식 2015-03-06 597
6167 멀티코어 환경에서 리눅스 IRQ 프로세싱 관련 질문드립니다. [2] Supsupi 2015-03-06 241
6166 reloc_library[1453]: 1210 unknown reloc type 19 이 나오면... [1] ice179 2015-03-05 432
6165 CodeSourcery에 보면arm-none-linux-gnueabi 라이브러리가 세폴더로 ... biokk 2015-03-05 206
6164 sleep 방지 [6] jackson 2015-02-27 410
6163 wifi module 문의 [3] gudrl 2015-02-25 356
6162 리눅스 드라이버 제작 방법 문의 [2] 박용순 2015-02-13 427
6161 ffmpeg 하드웨어 가속기 사용 방법 [3] 박용순 2015-02-13 612
6160 rtsp 스트리밍 미디어 재생 관련 질문 드립니다. [2] 톳끼아빠 2015-02-13 550
» Nand Flash 변경 질문드려요. [4] FOLIMM 2015-02-11 406
6158 안드로이드 i2c 관한 질문 [1] 뿌삐뿌삐 2015-02-03 314
6157 카메라 프레임데이터를 안드로이드 어플로 받아올수 있는 방법이 있을... [3] pedor11 2015-01-30 589
6156 check_usb_vfs("/dev/bus/usb") 에러 [1] 생생맥주 2015-01-25 200
6155 차량용에서 구글 GMS를 쓰려고 구글에 연락해봤더니... [6] 천동이 2015-01-16 597
6154 wifi usb 동글관련 질문 [2] 문철민 2015-01-15 392
6153 루트파일시스템에 gcc 기능을 넣어보신분 계신가요? [1] 흰둥아놀자 2015-01-09 315
6152 u-boot 올리는 주소는 어떻게 알수 있나요? sinwho 2014-12-21 398
6151 android 에서 mknod 명령을 지원안하면 노드파일은 어떻게 생성시키... [1] ice179 2014-12-17 500
6150 부트로더가 날라갔습니다... [1] 코딩코딩열매 2014-12-06 604
6149 nexell 칩을 한번 사용해볼까하는데요... [5] 천동이 2014-12-04 1291

사용자 로그인