'eboot'에 해당되는 글 2건

  1. 2008.05.27 LX800에서 이더넷 다운로드 시 리붓되는 문제
  2. 2007.12.05 Windows CE Boot Loader의 흐름
2008. 5. 27. 12:03

LX800에서 이더넷 다운로드 시 리붓되는 문제



LX800을 가지고 Windows Embedded CE 6.0작업을 했었고.. 요즘도 틈틈히 작업을 하고 있는데... ^^;
계속 USB를 가지고 Nk.bin 이미지를 HDD또는 SSD에 하드카피해서 부팅하는 방식을 사용했었다.

그러다 문득.. 하드카피 말고.. eboot를 사용해 이더넷으로 다운로드를 해야할 상황이 발생해 버린것..
여기 저기 자료도 찾고, 아는 분을 통해 질문도 하고 해서 정상적으로 다운로드를 할 수 있게 되었다. 하는 도중 몇가지 팁이랄까? 그런게 있어서 일단 포스팅!!

기억력의 감퇴로.. 다음에 하면.. 해결을 하지 못할 듯 해서.. -_-;;

아... 이것도 대략 두 주 전에 했던 작업이라.. 기억이 ㄷㄷㄷ

음..
아... 이더넷으로 다운로드 할 때 문제점 중 하나가 다운로드 중 자꾸 죽는 현상이 발생했다. 리붓되고,  또 리붓되고... -_-

이에 대한 문제점은 RTL8139의 소스를 약간 손을 보는 것으로 해결을 했다. 물론.. 검색의 힘으로.. ^^;
아.. 참고로 이더넷 다운로드를 하려면.. RTL8139를 사용하는게 가장 나을 듯 하다.. 아니면.. 다른 CE Platform Builder가 제공하는 이더넷 카드를 사용하던지..
이에 대한 부분은 "..\PUBLIC\COMMON\OAK\DRIVERS\ETHDBG" 이 부분을 참조하면 될 듯 하다. CE에서 제공하는 이더넷 드라이버들인듯...

아.. 다시 원점으로 돌아가서.. 다운로드 시 리붓되는 현상을 막기 위해서는..
"..\PUBLIC\COMMON\OAK\DRIVERS\ETHDBG\RTL8139\rtl8139.c"
에서 RTL8139GetFrame()이라는 함수를 수정해 주면 된다... 된다고 한다.. ^^;

RTL8139GetFrame()에서 다음의 부분을 찾아서 주석처리를 해주자!!
if (PacketHeader.usPacketHeader & BAD_RX_PACKET)
{
 /*   
            PRINTF (1, ("Bad RX packet [Header: 0x%x -- Length : [%d]]...\r\n",
                PacketHeader.usPacketHeader,
                PacketHeader.usPacketLength));

            // ack the interrupt so we can get interrupted again
            WRITE_PORT_USHORT(
                RTL_ISR,
                dwISR & 5 );
   
            pucRxBuffer = ExtractData(
                            pucRxBuffer,
                            sRTL8139.pucRxBuffer,
                            sRTL8139.puLastRxAddress,
                            pbData,
                            PacketHeader.usPacketLength);

            sRTL8139.dwCurrentRxOffset =
                (pucRxBuffer - sRTL8139.pucRxBuffer + 3) & ~3;

            WRITE_PORT_USHORT(
                RTL_CAPR,
                (USHORT)(sRTL8139.dwCurrentRxOffset - 0x10));

*/
            return 0x00;
}

다시 빌드하고 이더넷 다운로드를 해보면, 기존의 다운로드 중 리붓되는 현상을 보지 않아도 될 것이다.
괜히 기분이 좋아진다. ㅋ

출처 : WEEG

WEEG 사이트는 CE를 하면서 많은 도움을 받는 곳 중 하나이다. 그것두.. 한글로 되어있다 ㅋㅋ
다만... X86계열의 자료가... -_-;;


'작업장 > LX800' 카테고리의 다른 글

LX800 QVGA(320x240) 해상도 적용  (0) 2008.02.05
LX800(X86) Hive Based Registry 구성..  (0) 2007.11.22
X86 보드에서 HDD로 바로 부팅하기!  (0) 2007.11.15
2007. 12. 5. 14:11

Windows CE Boot Loader의 흐름



Windows CE에서의 'Boot Loader'라는 녀석의 흐름은 대충 이렇다.
$(_PUBLICROOT)\COMMON\OAK\DRIVER\ETHDBG\BLCOMMON
이라는 폴더를 살펴보게 되면, EBOOT(Ethernet Booterloader)의 작성을 도와주기 위한 라이브러리 소스가 있다.

MS에서 제공하는 것으로 개발자가 부트로더를 개발할 때 이 라이브러리들을 참고해 손쉽게 부트로더를 개발할 수 있도록 하는 것이라고 한다.

BLCOMMON(blcommon.c)라는 녀석의 함수중 크게 중요(?)한 것은 BootloaderMain()과 DownloadImage()이다.  대부분의 부트로더 관련 함수들은 이 두 함수에서 호출하여 사용하고 있다.
사용자 삽입 이미지
BLCOMMON에서의 흐름
StartUp()
대부분 어셈블러로 작성된 코드이다. CPU에 전원이 공급괴고, Reset되어 실행되는 최초의 코드이기 때문에 'StartUp'이라고 한다. 이 녀석은 CPU를 초기화 한다. MMU, 캐시 등을 초기화해 가상 메모리 사용을 가능하도록 한다.
일반적으로 StartUp()은 C 로 작성된 main()으로 점프한다.

BootLoadMain()
Boot Loader의 Main이다.
StartUp()에서 main()으로 점프한 뒤 바로 BootLoaderMain()으로 점프한다. 이 녀석은 OEMDebugInit(), OEMPlatformInit(), OEMPreDownLoader(), DownloadImage(), OEMLaunch()를 호출하여 BootLoader의 동작을 수행하게 된다.
이 후의 과정은 BootloaderMain()이 통제하게 된다.
각각의 OEM Function을 호출하기 전에 BootLoaderMain()은 KernelRelocate()를 먼저 실행하게 된다. 이는 BootLoader의 Global Variable을 DRAM에 롬기는 과정을 수행한다.
KernelRelocate()에서 사용하는 pTOC에서는 BootLoader와 Windows CE Kernel에 필요한 정보를 point하는데 Platfrom Builder에 포함된 tool인 'RomInage.exe'에 해당 값들이 고정되어 있어 Boot Loader 생성시 해당 값들이 넣어진다.
KernelRelocate()가 수행되기 전에는 Global Variable을 사용할 수 없다.

OEMDebugInit()
Boot Loader에서 사용하는 Message들을 Debug output port에 출력하기 위한 시리얼포트 초기화 함수이다.
일반적으로 Boot Loader는 Serial Port를 사용하여 Boot Loader의 Message나 status, menu등을 출력한다.
개발자가 준비해야 할 함수이다.

OEMPlatformInit()
OS를 Download받기 위해 필요한 device(Ethernet, Flash, Clock)를 초기화 하는 함수이다. 부트로더로서 역할을 수행하기 위해서 필요한 타겟 플랫폼을 초기화하라는 의미이며, 이더텟 포트를 초기화 하는 부을 포함하고 있다.
이 과정에서 사용자로부터 Boot option(설정)을 입력받기 위한 menu를 출력하고, 사용자로부터 입력받은 Boot option에 따라 Boot Loader를 동작시킨다.

OEMPreDownLoad()
OEMDebugInit()와 OEMPlatformInit()를 통해 디버그 포트와 다운로드 포트의 초기화가 이루어지면, 다운로드 포트를 통해 원격지에 있는 호스트들로부터 타겟 플랫폼과 연결될 호스트를 찾기 위해 BOOTME 패킷을 Broadcast형식으로 내보내는 작업(Target Device Name, IP Address, Mac Address를 이용)을 한다.
리턴값으로 이미 플래시 메모리에 다운로드돼있는 이미지를 사용해 바로 부팅할 것인지, 호스트로 부터 새로운 이미지를 다운로드를 할지를 결정한다.

DownLoadImage()
OEM이 제공하는 OEMReadData() 함수를 사용해 다운로드 포트로부터 운영체제 이미지를 원하는 양만큼 레코드 단위로 반복적인 읽기를 시도한다.
이 함수는 부트로더의 정책에 의해 플래시 메모리에 기록하는 작업을 시도하는데, 이때 플래시 기록작업을 도와주는 OEM의 플래시 관련 함수들을 호출하게 된다.

OEMLaunch()
다운로드가 완료된 OS Image를 launch하는 함수이다.

'jay_korea님의 블로그'와 노란책을 참조해서 작성한 문서이고, 부트로더(Boot Loader)에 대한 간략한 개념은 '여기'를 참조하면 될 듯 하다.