이것저것/Windows CE

Windows CE 5.0의 CEPC를 Windows Embedded CE 6.0으로 migration하는 방법

우담바라 2007. 4. 17. 10:16

CEPC 기반으로 Windows CE 5.0의 BSP를 Windows Embedded CE 6.0으로 migration하는 방법에 대해 설명한다.

Windows Embedded CE 6.0으로 넘어오면서 커널관련된 디렉토리 구조가 변경된 부분이 있다.
변경된 디렉토리 관련된 부분은 여기를 참고하면 된다.

아래의 migration관련 문서는 Windows Embedded CE 6 웹 캐스트 시리즈 8을 참고한 것이다.
migration 하는 방법(순서)는 아래와 같다. 단순히 따라하기만으로 가능할 것이다.

1. 기존의 Windows CE 5.0 의 CEPC bsp를 복사해서 가져온다. 6.0에도 같은 이름의 bsp가 있으므로 다른 이름(CEPCPort)로 변경하여 6.0의 PLATFORM폴더로 복사한다.

2. Windows CE 5.0의 CEPC의 cec파일을 복사한 CEPCPort로 가져와야 한다. 다른 이름(CEPCPort.cec)으로 바꾸어 가져오기 위해서 해주어야 할 작업이 있다. cec파일을 열어 기존의 있던 GUID들을 new버튼을 클릭해 모두 수정(새로생성)해주어야 한다. 그리고 에디터를 이용해 CEPC라는 단어를 모두 CEPCPort로 바꾸어 준다.

3. cec파일을 Windows Embedded CE 6.0에서 사용할 수 있도록 만들어 준다. 1에서 복사했던 폴더(C:\를 기준으로 했을 때 C:\WINCE600\PLATFORM\CEPCPort가 된다.)에 Catalog라는 폴더를 하나 생성한다. 6.0에서는 cec파일을 사용하지 않고 pbcxml이라는 것을 사용하게 되는데 이 파일이 위치해야 할 곳이 바로 Catalog라는 디렉토리 이다. 5.0에서 복사해온 bsp에는 존재하지 않으므로 만들어줘야 한다. 그리고 일단 2.에서 가져온 cec 파일을 이 디렉토리(Catalog)로 옮긴다.
cec파일을 Visual studio 2005의 에디트 창에 가져다 놓으면 알아서 pbcxml파일로 만들어 준다.

여기까지 했다면 bsp import까지 된 것이다.

4. CEPCPort BSP를 위한 환경설정을 해주어야 한다. CEPCPort폴더의 sources.cnn이라는 파일을 열어서 몇가지 수정을 해 준다. 6.0으로 오면서 경로가 바뀐 부분이 있기에 sources.cnn의 밑에서 세번째 줄의 path를 INCLUDES=$(_WINCEROOT)\platform\common\src\soc\x86_ms_v1\inc로 바꾸어 준다.

5. 6.0 디렉토리의 구조에 맞게 커널 부분을 수정해 준다. SRC폴더 밑에 OAL과 KITL폴더를 생성해 준다.
OAL과 KITL만을 사용할 것이므로 dirs파일을 이에 맞게 수정해 주어야 한다.

DIRS= \
    oal     \
    kitl

OAL폴더는 OALlib와 OALExe라는 폴더를 생성하고 dirs로 이에 맞게 수정해 준다.
여기까지는 폴더 구조를 완성한 것이다.

6. 수정한 폴더 구조에 맞게 내용을 수정하여 넣는다. 복사해온 파일부분을 아래처럼 수정해 주면 된다.
OALLib폴더는 기존 5.0의 SRC\KERNEL\OAL폴더의 파일을 그대로 복사해 넣으면 된다.
OALEXE폴더는 SRC\KERNEL\KERN폴더의 파일을 그대로 복사해 넣으면 된다. 그리고 OALExe의 sources.cnn파일을 다음과 같이 수정해 준다.

SYNCHRONIZE_DRAIN=1
RELEASETYPE=PLATFORM
EXEENTRY=StartUp
EXEBASE=0x80200000
TARGETTYPE=PROGRAM
TARGETNAME=oal

TARGETLIBS =    \
    $(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\nkstub.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\nkldr.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\oemmain.lib \
    $(_TARGETPLATROOT)\lib\$(_CPUINDPATH)\oal.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\PCIreg.lib \
    $(_PLATCOMMONLIB)\$(_CPUINDPATH)\oal_startup_x86.lib \
    $(_PLATCOMMONLIB)\$(_CPUINDPATH)\oal_intr_x86.lib \
    $(_PLATCOMMONLIB)\$(_CPUINDPATH)\oal_power_x86.lib \
    $(_PLATCOMMONLIB)\$(_CPUINDPATH)\oal_rtc_x86.lib \
    $(_PLATCOMMONLIB)\$(_CPUINDPATH)\oal_timer_x86.lib \
    $(_PLATCOMMONLIB)\$(_CPUINDPATH)\oal_qpc_x86.lib \
    $(_PLATCOMMONLIB)\$(_CPUINDPATH)\oal_memory_x86.lib \
    $(_PLATCOMMONLIB)\$(_CPUINDPATH)\oal_other_x86.lib \
    $(_PLATCOMMONLIB)\$(_CPUINDPATH)\oal_ioctl_x86.lib \
    $(_PLATCOMMONLIB)\$(_CPUINDPATH)\oal_io_x86.lib \
    $(_PLATCOMMONLIB)\$(_CPUDEPPATH)\oal_intr.lib \
    $(_PLATCOMMONLIB)\$(_CPUDEPPATH)\oal_ioctl.lib \
    $(_PLATCOMMONLIB)\$(_CPUDEPPATH)\oal_log.lib \
    $(_PLATCOMMONLIB)\$(_CPUDEPPATH)\oal_other.lib \
    $(_PLATCOMMONLIB)\$(_CPUDEPPATH)\oal_cache_x86.lib \
    $(_PLATCOMMONLIB)\$(_CPUDEPPATH)\oal_intr.lib \
    $(_PLATCOMMONLIB)\$(_CPUDEPPATH)\oal_ioctl.lib \
    $(_PLATCOMMONLIB)\$(_CPUDEPPATH)\oal_log.lib \
    $(_PLATCOMMONLIB)\$(_CPUDEPPATH)\oal_other.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\ddk_io.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\loadauth.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\fulllibc.lib


LDEFINES=-subsystem:native /DEBUG /DEBUGTYPE:CV /FIXED:NO

SOURCES=

KITL폴더는 SRC\KERNEL\KERNKITL폴더의 파일을 그대로 복사해 넣으면 된다. 여기서도 sources파일을 다음과 같이 수정해준다.

SYNCHRONIZE_DRAIN=1
RELEASETYPE=PLATFORM
DLLENTRY=KitlDllMain
TARGETTYPE=DYNLINK
TARGETNAME=kitl
DEFFILE=

TARGETLIBS =    \
    $(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\nkstub.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\oemstub.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\kitlcore.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\ddk_io.lib \
    $(_TARGETPLATROOT)\lib\$(_CPUINDPATH)\oal.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\PCIreg.lib \
    $(_PLATCOMMONLIB)\$(_CPUINDPATH)\oal_kitl_x86.lib \
    $(_PLATCOMMONLIB)\$(_CPUDEPPATH)\oal_log.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\rtl8139dbg.lib  \
    $(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\ne2kdbg.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\dp83815dbg.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\ne2kdbg.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\3c90xdbg.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\rne_mdd.lib  \
    $(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\net2890klib.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\vbridge.lib  \
    $(_COMMONOAKROOT)\lib\$(_CPUDEPPATH)\loadauth.lib \
    $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\fulllibc.lib

LDEFINES=-subsystem:native /DEBUG /DEBUGTYPE:CV /FIXED:NO

SOURCES=globals.c

global변수를 위해 globals.c를 SRC\KERNEL\OAL에서 복사해 온다. c파일이므로 위처럼 SOURCES에 추가시켜 준다.
globals.c를 에디터로 열어 IOCTL이 들어간 부분을 제거해 준다.

7. 새 프로젝트를 만들어 CEPCPort를 임포트해서 디자인을 만들고 빌드를 하면 된다.

실제 CEPC환경을 구축하지 않아서 테스트는 하지 않았지만 빌드까지는 아무런 에러 없이 이루어 졌다.
너무 어렵게 설명을 했나?? 이 포스트를 보고 잘 모르겠다면.. 한번 쯤 웹 캐스트를 보면 이해가 될 것이다.
웹 캐스트틑 시간이 오래 걸리므로 한 번 보고 이해를 한 뒤 대충 문서화 시켜 할 때마다 자신이 만든 문서를 참고하는것이 편할 것 같다.

참고 : Windows Embedded CE 6.0 웹 캐스트 시리즈 8