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

여기 가입한 이후 SMDK6410 board 사용에 질문이 많이 올라오더군요..
OneNAND 에 관련된 질문도 가끔 올라오는 것을 보았습니다.
그래서 s3c6410의 irom booting을 하지 않고 OneNAND booting 을 할 수 있게 하는 tip을 알려드리고자 합니다.
일단 저는 s3c6410에 대해서는 사용해본 적이 없는지라 irom booting이 어떻게 동작하는지 모릅니다.
따라서 irom booting에 대한 것은 언급하지 않겠습니다.

일단 OneNAND의 특성에 대해 설명 드리겠습니다.
머 스펙에 나와 있고 이미 알고 계신 분들도 있겠지만...^^;;

첫번째 OneNAND는 단순한 NAND Flash가 아닙니다.
NOR flash의 장점과 NAND flash의 장점을 모두 갖고 있는 제품입니다.
이것을 가능하게 하는 것은 OneNAND 의 구조적 특성 때문입니다.
일반적인 pure NAND는 내부에서 code를 실행 할 수가 없습니다.
NAND는 block 단위로 I/O가 발생하기 때문이죠...
하지만 OneNAND는 내부에 Boot RAM과 Data RAM이 존재합니다.
이것으로 sector 단위까지 I/O가 가능해 집니다.
일반적으로 Boot RAM으로 code 실행을 하게 되고 Data RAM은 Buffer 로서 사용을 하게 됩니다.

두번째 OneNAND로 booting을 하기 위해선 정해진 boot sequence를 따라야 합니다.
스펙에는 ONBL(OneNAND Boot Loader)이라고 부르는 것을 이용하여 booting을 한다고 되어 있습니다.
참고로 ONBL은 2가지가 있습니다. ONBL1, ONBL2 이렇게 있는데
ONBL1이 Boot RAM에서 실행되는 녀석입니다.
ONBL1이 실행 되면서 ONBL2를 DRAM상에 올리게 되고 ONBL2가 실행되면서 OS image를 DRAM으로 올리게 됩니다.
그럼 Data RAM이 있는데  Data RAM상에서 실행을 하지 않느냐라고 질문 하시는 분도 계실것 같아
Data RAM에서 실행을 하게 되면 OS image를 DRAM으로 올리지 못합니다.
NAND와 DRAM사이에 Data RAM이 있는데 OS image를 DRAM으로 올리기 위해서는 Data RAM을 거쳐야 합니다.
그러나 Data RAM에는 ONBL2가 실행 중이기 때문에 갈 수 있는 길을 막고 있는 셈이 되는거죠..
이런 이유로 Data RAM을 Buffer로 사용하게 되고 ONBL1이 ONBL2를 DRAM에 올리고
ONBL2가 OS image를 DRAM에 올리게 되는 것입니다.
그럼 왜 바로 ONBL1에서 OS image를 올리지 못하느냐?
OS image올리기전에 bootloader에서 하드웨어에 대한 기본적인 세팅은 해줘야 합니다.
DRAM에 관한 세팅 CPU에 관한 세팅 등등....
이런 것들을 하기 위해선 ONBL1로서는 다 할 수가 없습니다.
왜냐 하면 ONBL1의 크기는 1KB로 제한이 되어 있기 때문입니다.
앞서 언급한 Boot RAM의 크기가 1KB이기 때문에 ONBL1의 최대 size가 1KB로 제한 적이기 때문입니다.
따라서 ONBL1이 세팅 하지 못한 것을 ONBL2가 나머지 세팅을 하게 됩니다.
이렇게 OneNAND의 boot sequence가 이루어 지게 됩니다.

여기 까지는 OneNAND의 일반적인 boot sequence였구요...

아래는 Linux에서의 boot sequence 입니다.

Linux에서의 boot sequence도 위에 적은 것과 크게 다르지 않는데요..
차이점이 있다면 ONBL3가 더 있다는 것입니다.
여기서 ONBL3는 일반적인 Linux bootloader입니다...
Redboot이라든지...u-boot이라든지...(여기서는 u-boot에 대해서만 설명 드리겠습니다...^^;;)
앞에서는 ONBL2가 OS image를 올린다고 했는데
여기에서는 ONBL2가 u-boot을 올리게 되겠죠..
그리고 u-boot이 Linux image를 DRAM으로 올리게 되는 것입니다.
마찬가지로 ONBL2가 Linux kernel image를 바로 올리지 못하는 이유는
ONBL2자체의 size 제한 문제도 있지만 직접적인 이유로는 boot parameter 를 kernel로 제공해주는 일을 하는 것이
u-boot이기 때문입니다.
그리고 개발상의 편리함을 주는 u-boot상의 기능중 하나가 tftp인데요...
이것을 포함해서 여러 다른 기능을 ONBL2에 넣을 수는 없을 것입니다...
OneNAND가 일반 NAND와는 다르다고는 했지만 OneNAND역시 NAND이기 때문에 내부적으로는 block단위로 read가 됩니다.
첫번째 block에 ONBL1, ONBL2가 들어가게 되고요...두번째 block부터 u-boot이 들어가게 됩니다.
그럼 ONBL2로서 u-boot을 넣어도 되지 않느냐?
물론 이론상으론 가능합니다.
하지만 ONBL2로서 u-boot을 넣게 되면 u-boot을 실행 하기 위해서는 효율성이 떨어지게 됩니다.
target의 전원이 ON 되면 첫번째 block의 ONBL1이 Boot RAM에 올라가고 ONBL2가 Data RAM에 올라갑니다.
그런 다음 ONBL1이 Data RAM에 있는 ONBL2가 DRAM상으로 올리게 됩니다.
그러나 ONBL1이 Boot RAM으로 올라갈 때 u-boot은 일부 code만 Data RAM에 올라가게 되고
ONBL1이 일부 code만 Data RAM에 올라간 u-boot을 DRAM에 올리게 되면 u-boot이 실행중에 더이상 실행 코드가 존재 하지 않아
page fault를 유발시키게 됩니다.
u-boot 자체에 page fault가 생겨 demand paging 처리를 하는 것이 있다면 문제가 되지 않겠지만
제가 알기로는 없는 것으로 알고 있습니다.
따라서 ONBL2에서 u-boot을 DRAM상으로 올리는 단계를 추가 해야 하는 것입니다.

여태 까지 장황하게 설명을 했지만
좀더 간단하게 boot sequence를 설명 하자면
target이 ON 되면 자동으로 ONBL1이 Boot RAM에 올라가고 실행 됩니다.
ONBL1은 ONBL2을 DRAM으로 올리게 되고 ONBL2는 실행 중에 u-boot을 DRAM으로 올리게 됩니다.
u-boot은 다들 아시겠지만 Linux image를 DRAM으로 올리게 되어 최종적으로 Linux booting이 시작 되게 됩니다.

따라서 s3c6410의 irom booting 없이 OneNAND의 booting을 하게 하려면
ONBL1, ONBL2를 따로 구현 해야 합니다.

이상입니다.
무지 길게 적긴 했는데 맞는 건지는 모르겠네요...
실수로 잘못 적은 것도 있을지도.....^^;;
아무튼 지금까지 허접한 저의 글을 읽어주셔서 감사합니다...^^


고현철

2009.04.04 12:34:06
*.111.183.138

정말.....자세한 설명을 곁들인 자료 감사합니다.

저도 안써본 device라 잘 몰랐었는데....이번에야 대충 알겠네요...
List of Articles
번호 제목 글쓴이 날짜 조회 수sort
6068 임베디드 리눅스를 포팅도 잘 된거 같은데 사용하는 것도 잘되고요.... [4] 혜민아빠 2012-04-26 2485
6067 PC -> 임배디드 보드 간 USB 통신질문 드립니다. [6] 황순일 2013-10-01 2479
6066 [질문] 아래 LCD 고장관련... [1] 이동술 2007-07-06 2477
6065 u-boot에서 커널을 로드 하지 못할 때 (can't get kernel image!)는... file [3] 혜민아빠 2012-03-16 2474
6064 PV210 보드에서 동작하는 sudo 명령 ARM Binary 파일 좀 부탁 ... 파란새 2013-12-26 2467
6063 [질문]Wince에서 터치에 관해서... [6] 김정렬 2007-10-16 2464
6062 module 로딩 관련 질문입니다. [2] 조현호 2011-11-23 2460
6061 안드로이드 부팅시 launcher 실행 관련 [2] wizard14 2013-02-21 2458
6060 [질문] 충전기 사용가능할까요? [2] 김은기 2007-05-24 2456
6059 [완료] USB slave [2] 김증일 2007-05-19 2447
6058 (요청)터치칩 구할 수 있을까요? [1] 문진호 2007-05-18 2447
6057 상용보드는 구글맵이 사용이 안되나요? ㅠㅠ [2] 손이시려 2013-07-23 2446
» SMDK6410에서의 OneNAND booting sequence [1] 김영문 2009-04-04 2444
6055 이더넷 포트 2개를 같은 대역아이피를 사용할수 있는지요? [11] 은민아빠 2012-08-16 2440
6054 SMDKC100 때문에.... [2] 송의석 2009-07-25 2434
6053 aesop-lx800에 우분투 설치하기... [1] 이태간 2009-03-26 2434
6052 [완료]lx800 주변 부품 [2] 임채현 2007-06-18 2429
6051 인터럽트 실행 순서 관련(모든task가 resume 이후에 인터럽트 핸들러호... [2] 로이1024 2013-05-26 2426
6050 S3C6410(SMDK6410) USB 통신 질문. [1] 이원석 2009-07-10 2424
6049 android.mk 파일 안에 LOCAL_MODULE_TAGS 의미가 궁금합니다. [1] 시안 2011-06-14 2420

사용자 로그인