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

여기 가입한 이후 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
번호 제목 글쓴이 날짜 조회 수
1928 RNDIS/Ethernet Gadget 드라이버? [2] 두현택 2009-04-04 2323
» SMDK6410에서의 OneNAND booting sequence [1] 김영문 2009-04-04 2444
1926 6410 SPI에 대해서 물어보겠습니다. [2] 주의이름으로 2009-04-04 1089
1925 nand 관련 질문입니다. [2] 임지영 2009-04-03 1016
1924 하드디스크 연결 [4] 신승식 2009-04-03 763
1923 MFC demo관련 에러 [2] 오영종 2009-04-03 1216
1922 6410 커널 부팅중 멈추는 현상 [1] 최종환 2009-04-03 763
1921 u-boot 부팅 [2] 이진영 2009-04-03 1015
1920 aesop 6410 보드 usb 관련 질문드립니다. [2] 이향수 2009-04-02 770
1919 6410에 카메라 관련~ [5] 김명엽 2009-04-02 831
1918 keypad 드라이버 관련 질문 [4] 여정휘 2009-04-02 953
1917 nfs boot 질문입니다. [5] 박인순 2009-04-02 734
1916 우분투 리눅스 ip 변경 도중에 "No such process" [5] 이세종 2009-04-01 45994
1915 리눅스 부팅중에 다음과 같은 에러가 나는데요.. [3] 이성호 2009-04-01 1101
1914 김제훈씨게서 올린 Aesop s3c6410 부트로드 코드 질문이 있습니다 [6] 최종환 2009-04-01 1052
1913 microSD 지원 용량 [5] 송의석 2009-03-31 654
1912 eth0가 안잡혀요. [3] 이진영 2009-03-31 656
1911 WinCE를 올리려고 하는데 ... 문제가 있네요. [6] 윤영기 2009-03-30 888
1910 NAND 부팅후 터치 켈리브레이션 [2] 이학남 2009-03-30 784
1909 [완료]E-BOOT 실행이후 U-boot 동작이상 [6] 홍성만 2009-03-30 1107

사용자 로그인