SW 개발

winCE / Kernel / OEMPowerOff(void) 의 수정..

. . . 2009. 5. 12. 01:39
반응형

Xeno's Study Blog (http://XenoStudy.tistory.com)
- 글쓴이 : xeno
- 출처 : [출처] Warm Boot 방법 |작성자 와니
- 기타사항 : 틀린사항은 댓글로 달아주세여~

 

윈 CE 배경화면의 '시작(start)'->Suspend를 누르시면 웜 부트가 됩니다.

컴맹이 아니신 분들은 읽지 마세요...

대부분 아시는 분도 많겠지만 저같은 초보들은 이런글이 많이 도움이 되리라 생각됩니다. 생각보다 쉽습니다. x86 CEPC의 경우인데 다른 보드도 비슷하지 않을까요?

C:\WinCE300\Platform\CEPC\Kernel\HAL\x86에 보시면 FWPC.C파일이 있습니다.

이걸 아무 에디터에서 열어서 다음과 같이 수정하십시오.

- 다음 -
1. void OEMPowerOff(void) 함수를 찾는다.
(요 함수가 Windows CE에서 보믄 '시작' 버튼의 'suspend'를 누르면 실행되는 부분임돠)

2. 요 함수의 브레이스 내부를 모두 주석처리 해버린다.
{ /* ... */ } <- 요렇게... 그럼 이함수는 아무것도 수행을 하지 않는 상태가 되겠지요...(브레이스({, })까지 주석처리하면 안됩니다^^.

3. 이제 요 함수의 기능을 웜부트만 하도록 만들면 됩니다. 간단합니다. 브레이스 내부 어디에든...(주석 처리한 부분에서는 하면 안되겠지요) OEMIoControl(IOCTL_HAL_REBOOT,NULL,NULL,NULL,NULL,NULL); 를 카피해서 붙여주세요.

결과적으로 요렇게 됩니다.

void OEMPowerOff(void)
{
/*
...기존의 코드들....
*/
OEMIoControl(IOCTL_HAL_REBOOT,NULL,NULL,NULL,NULL,NULL);
}

(주의, 그럼 왜 지우지 않고 굳이 주석처리를 하냐고 물으신다면 그건 제 맘입니다.주석처리 하지 않고 보기좋게 지워버릴 수도 있지만 이게 HAL부분을 이루는 공통적인 소스코드에 해당하기 때문에 나중에 다른 플랫폼이나 프로젝트를 개발 할 때 곤란한 일이 발생할 수 있기 때문에 주석처리만 하고 나중에라도 알 수 있도록 주석을 달아놓으세요)

아직 안 끝났습니다.

같은 소스 코드 중에

//
// Check if a reboot was requested.
//
if (dwRebootAddress) {
RebootHandler();
}

요 부분을 찾으세요.(문자열 찾기를 이용하든지.. 아님 눈을 크게 뜨고 찾으시든지) 찾았다면 if문 안에다가 담과 같이 어셈블리코드를 삽입하세요.

//
// Check if a reboot was requested.
//
if (dwRebootAddress) {
__asm{ // 추가
mov al, 020h // PCI Address
out 020h, al // EOI code
} // 추가 끝
RebootHandler();
}

모든 수정이 끝났습니다. 이제 가장 중요한 '저장'을 누르시고 이 부분을 컴파일하시변 됩니다. 요부분만 컴파일 어케하냐면.... 전 그냥 Rebuild Platform 해버립니다. 그러면 저절로 수정된 것이 컴파일 되서 알아서 HAL을 형성합니다.  이상입니다. 윈CE를 하시는 저같은 컴맹분들에게 도움이 되었길...

반응형