본문 바로가기

Hello CE,Mobile

ActiveSync 연결창이 계속 뜨는 현상에 대하여


간만에 포스트를 올린다.

 최근 2440기반의 보드에 WinCE 5.0을 올리는 일을 가끔씩 도와주고 있는데

얼마전부터 ActiveSync가 이슈가 되었다.

USB Cable이 연결되지도 않았는데 불규칙 하지만 계속적으로 연결창이 뜨는 현상이 발생한것이다.

처음에는 당연히 USB단의 신호가 뭔가 흔들리나 했는데 찍어보면 깨끗했다.

WinCE를 몇년 다뤄보긴 했지만 처음 보는 현상이고 간만에 CE하는거라서 막막했는데...

 

일단 Driver를 최소로 줄이고 Display,Touch,USB Function정도만 올라가도록 줄여서 해보니 문제의 현상이 발생하지 않음을 알게되어 하나씩 나머지 드라이버들 추가해서 올려보았다.

결국 증상으로 판단컨데 문제는 ... "시리얼 드라이버" !!

그중에서도 4포트 확장 시리얼 드라이버가 문제였다.

 

해서 뭔일일가 따져보니 다음과 같은 연관관계가 있더란 말씀..

일단 ActiveSync를 사용하기 위해 USB Device Cable를 꼽으면 repllog.exe가 자동 실행된다.

이건 왜그런고 하니 Shell에서 NOTIFICATION_EVENT_RS232_DETECTED 이벤트가 발생하면 repllog.exe를 실행하도록 설정되어 있기 때문이다.

 

검색으로 찾은 자료에는 Wceappsfe.db에 되어 있다고 되어 있는데

실제로 찾아보니 datasync.db에 다음과 같이 정의되어 있었음

 Field : 0001001f : "repllog.exe"
 Field : 0002001f : "AppRunAtRs232Detect"
 Field : 00030013 : 9

 

어째튼 NOTIFICATION_EVENT_RS232_DETECTED 가 발생하면 실행되는 관계는 알았는데

그럼 어디서 이런 관계를 설정하는가...

이건 시리얼 드라이버 cserpdd.cpp에 보면 다음과 같이 되어 있을을 알수 있다.

BOOL CSerialPDD::NotifyPDDInterrupt(INTERRUPT_TYPE interruptType)
{
      ...

      if (GetModemStatus() & MS_RLSD_ON)
                CeEventHasOccurred (NOTIFICATION_EVENT_RS232_DETECTED, NULL);

      ...
}

 

자... 답은 나왔다! 모뎀상태를 체크해서 DCD가 체크되면 NOTIFICATION_EVENT_RS232_DETECTED 이벤트를 날리라고 되어 있지 않은가!

 

cserpdd.cpp에서 호출하는 GetModemStatus()는 CSerialPDD의 가상함수이고

실제 구현은 pdd16550.cpp의 CPdd16550에서 이루어 진다.

 ULONG   CPdd16550::GetModemStatus()

{

     ...

    ULONG Events = 0;
    UINT8 ubModemStatus = m_pReg16550->Read_MSR();
    ...

    if ( ubModemStatus  & SERIAL_MSR_DDCD )
        Events |= EV_RLSD;
    ...

    if ( ubModemStatus & SERIAL_MSR_DCD )
         ulReturn  |= MS_RLSD_ON;
    ...   

}

 

4포트 확장 드라이버는 CPdd16550를 상속받아 구현되므로 확장드라이버에서 GetModemStatus함수를 Overriding시켜서 DCD체크를 빼면 된다.

 

해서 DCD체크를 안하므로 NOTIFICATION_EVENT_RS232_DETECTED 이벤트가 발생하지 않고

따라서 repllog.exe가 실행되지 않으므로 연결창이 뜨는 현상은 ...

없어지고 말았던 것이었던 것이였다

'Hello CE,Mobile' 카테고리의 다른 글

CeGetUserNotification()  (0) 2010.05.28
Dotproject  (0) 2010.05.13
SecProcPermissions() API  (0) 2010.01.25
SetForegourndWindow  (0) 2010.01.18
DCB Structure  (0) 2009.12.29