부트로더를 굽기위해 BSDL 을 이용하여 NAND 플래시에 쓰기를 하였지만..  쓸데없는(?) 일이 되었다.

S5PV210 의 iROM  프로그램에서 다음과 같은 일을 하기 때문이다.

 

RESET 이 되면 iROM 이 기동되며 이 iROM 에서는 조건에 따라 부트디바이스를 SRAM 에 로드하는데

(우리는 NAND 플래시를 부트 디바이스로 사용한다.) NAND ECC 까지 확인한다.

NAND 를 읽었지만 ECC 에러이기 때문에  더 이상 진행을 하지 않는다.

 

그럼 ECC 를  계산하여 NAND 의 OOB 영역에 쓰면 되겠지만 여기도 또 문제가 있다.

ECC 는 8bit 버스의 2K-page 난드 기준으로 8bit ECC 를 사용한다.

이 말은 S5PV210 의 하드웨어 블럭을 사용한 ECC 계산이란 것이다.

소프트웨어를 사용하여 계산하는 방법이 없다(?) 라는 것이다. 무조건 S5PV210 에 의해 계산해야 한다.

 

삼성에서는 이런것을 위해 UART or USB 부팅을 지원한다.

UART 를 사용하여 SRAM 에 필요한 프로그램( 이것을  BL1 이라고 한다.) 을 올린 후 이 BL1 을 사용하여

사용자가 원하는 일을 하라는 것이다.  즉 BL1 에서 난드에 필요한 부트로더를 구우면 된다.

 

어찌됬든 BL1 을 올리기 위해서는 UART 프로토콜을 알고 필요한 진행을 해야한다.

DRAGIN 또는 DNW 프로그램을 사용하여 올릴 수 있다.

Dragin 실행파일은 삼성에서 S5PV210 을 위해 제공되는 WinCE6.0 압축파일안에서 찾을 수 있으며

DNW 는 이전부터 많이 사용하는 것이니 쉽게(?) 찾을 수 있을 것이다.

 

최초 iROM 이 기동하며 S5PV210 3번째 TXD2 포트를 통해 0x55 라는 데이타를 수십바이트 보낸다.

이때 PC 쪽에서 0xCC 를 보내면 iROM에서 다운로드 준비 상태로 된다,.

PC 는 보내고자 하는 데이타의 개수를 4바이트 리틀엔디언으로 보낸 후 데이타를 전송한다.

데이타를 보낸 후 체크섬도 함께 보낸다.

count / data / check-sum 이런 순서일것이라고 예상하고 있으며 정확한 것은 추후 프로토콜을 분석하여 올릴 예정이다.

 

다운로드되는 데이타는 무조건 0xD0020000   주소에 저장되며  점프번지는  이보다 0x10 증가한 0xD0020010 번지이다.

이번지는 SRAM 번지이며 리셋시에는 0x00000000 와 동일한 곳이다.

 

리셋시 NAND 플래시에 데이타가 있었다면 NAND 의 데이타를 바로 위의 0xD0020000 번지에 복사한다.

중요한 점은 NAND 플래시의 선두 16바이트 이다.

첫번째 4바이트에는 iROM 이 SRAM 에 복사할 데이타의 갯수가 32비트 리틀엔디언으로 저장되어야 한다.

다음 32비트는 0x00000000 으로 예약되어 있으며 세번째 32비트는 체크섬 다음 32비트는 0x00000000 예약이다.

물론 난드플래시의 페이지마다 8bit ECC (2K-page 기준)가 있어야 한다.

 

다시 UART 부트에서 고민할 것이 있다.

UART 부트에서 처음 다운로드되는 BL1 의 크기가 최대 16KB 라는 것이다.

헉 EZ-BOOT 가 64KB 인데..  아무리 부트로더가 가볍다고 해도 16KB 는 너무작다.

이런 이유로 16KB 안에서 동작하는 작은 부트로더를 하나 작성한 후 이곳에서 다시 큰 부트로더를 올리는

방법을 고민하여야 한다.

좋은 방법은 16KB 부트로더( BL1 ) 에서 다시 시리얼을 통해 정상부트로더를 받은 후 플래시에 저장하는 것이다.

삼성에서 제공한 SDK 에는 BL1 바이너리 코드가 있다.  나는 이것을 받지 못했다.

문제가 될것은 없다. 어차피 내가 원하는 형태가 아니다. 다시 작성할 예정이다.

ㅜ.ㅜ 기술자의 자존심인가 ...

 

SRAM 는 총 96KB 이고 BL1 이 16KB 사용하고 남은 80KB 를 사용할 수 있다.

즉 코드는 16KB 이지만 사용할 메모리는 이렇게 믾으니 C 로 작성하는것도 문제가 안되다.

iROM 에는 난드에서 페이지 데이타를 읽고 ECC 처리까지 하는 함수를 제공한다.

write with ECC  는 없다..  이것도 만들지 ㅜ,ㅜ

 

기술적인 문제는 바로 ECC 계산이다.

커널코드나 다른 코드를 참조하여 만들어야 겠다.

 

iROM 부트에 관한 내용은 삼성에서 제공하는  Application Note (Intenal ROM Booting ) 파일에 자세히 나와있다.