금요일, 10월 10, 2008

Makefile에서 :: (double colon, two consecutive colon) 은?

wince에서 makefile을 보면 target과 그것의 dependency를 지정하는 : 는 알겠지만 빈번히 등장하는 ::은 무엇인가?

이것은 두개이상의 description block을 사용하여 target을 update할 때 사용한다.target이 하나 description block에서 어떤 dependency와 command가 정의되어 있고, 다음에 또 다른 description block에서 이전과는 다른 dependency와 command가 정의될 경우 :: 가 쓰인다.

이럴경우 update된 dependent가 어떤거냐에 따라 처리하는 description block이 달라진다.모든 description block이 처리될 수도 있고, 일부 description block이 처리될 수도 있고, 모든 description block이 처리되지 않을 수도 있다. 즉 마치 서로 완전히 다른 target을 처리하는 것과 같이 행동하므로 별개의 description block이라고 볼 수 있다.

target.lib :: one.asm two.asm three.asm
ML one.asm two.asm three.asm
LIB target -+one.obj -+two.obj -+three.obj;

target.lib :: four.c five.c
CL /c four.c five.c
LIB target -+four.obj -+five.obj;

이 경우 asm file이 update되었을 경우 첫번째 description block이 수행되고 c file이 update되면 두번째 description block이 수행된다. asm file과 c file이 모두 update 되었다면 두 description block이 모두 수행되고, 아무것도 update되지 않았다면 어떤 description block도 수행되지 않는다.

이것은 주로 target을 update할때 사용되는데 dependent의 종류에 따라서 target을 update하기 위한 command의 종류가 다른 경우 사용한다.

Touch sound를 바꾸기

wince에 기본으로 들어 있는 touch sound는 틱틱 거리는 소리로 듣기에 별로 좋은소리는 아닌것 같다.
이 소리의 수정은 다음 directory에서
WINCE600\PUBLIC\COMMON\OAK\DRIVERS\WAVEUI
waveui.rc와 원하는 wav file을 이 directory에 추가시켜 줌에 의해서 가능하다.

원하는 file이 mysound.wav일 경우 이것을 이 directory에 copy해 두고
waveui.rc를 열어 가장 마지막 부분에서 다음과 같이 수정한다.
ID_WAVE_KEYLOUD WAVE keyloud.wav
ID_WAVE_KEYSOFT WAVE keysoft.wav
ID_WAVE_TCHLOUD WAVE mysound.wav
ID_WAVE_TCHSOFT WAVE mysound.wav

그리고 build하면 waveui.lib이 생성된다.
결과물이 lib 이므로 이대로는 OS에 반영이 안된다.

makefile들을 추적하면
waveapi:: $(WAVEAPI_COMPONENTS)
@set TARGETNAME=$@
@set RELEASETYPE=OAK
@set DLLENTRY=_DllMainCRTStartup
@set TARGETLIBS=%%TARGETLIBS%% $(SG_OUTPUT_OAKLIB)\audevman.lib
@set TARGETLIBS=%%TARGETLIBS%% $(SG_INPUT_LIB)\wapistub.lib
@set SOURCELIBS=%%SOURCELIBS%% $(SG_INPUT_LIB)\waveui.lib
@set TARGETLIBS=%%TARGETLIBS%% $(SG_INPUT_LIB)\0409\waveapi.res
@set TARGETTYPE=DYNLINK
@set DEFFILE=$(SG_INPUT_LIB)\$@.def
$(MAKECMD) /NOLOGO $@.dll

즉 최종결과물이 waveapi.dll이라는 소리.
다음과 같은 순서로 build하면 된다.
  1. WINCE600\PUBLIC\COMMON\OAK\DRIVERS\WAVEUI 로 이동
  2. build -cp
  3. sysgen -p common waveapi
  4. makeimg

Wince 소리 조절 관련 (volume control panel 설정)

다음 값을 통해서 설정 가능하다.

[HKEY_CURRENT_USER\ControlPanel\Volume]
"Key"=dword:0 ; Keyclicks: 1=soft, 0x10002=loud
"Screen"=dword:10002 ; ScreenTaps: 1=soft, 0x10002=loud
"Mute"=dword:2 ; 7=Enable all sounds (1=Notifications, 2=Apps, 4=Events.)
"Volume"=dword:FFFFFFFF ; 0=off, 0xFFFFFFFF=maximum


Key는 keyboard key 입력시의 틱틱 소리 나는 것을 이야기 하고 Screen은 touch input시 틱틱 소리 나는 것을 이야기 한다.
Wince 제어판의 볼륨과 소리 설정을 보고 비교하면 알기 쉬울 것이다.

위의 예에서는 keyboard 소리는 아주 안나게 했고 touch 소리는 크게, 응용프로그램 소리만 나게 했고, 볼륨은 최대로 했다.

또 전에 말해던 것 처럼 keyboard hardware가 enable되지 않았다고 다음과 같이 알리면

[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\KEYBD]
"Status"=dword:0


실제 제어판 볼륨과 소리에서 keyboard관련 항목이 사라지는 것을 확인할 수 있다.

목요일, 10월 09, 2008

Touch calibration 화면의 문구 바꾸기 (public common module build추적하기)

Touch calibration의 문구를 내 맘대로 바꾸려면 어떻게 해야 하나?
Touch calibration UI을 수정은 아래 public directory의 calibrui.lib에 의해서 이루어 진다.
WINCE600\PUBLIC\COMMON\OAK\DRIVERS\CALIBRUI
그리고 default는 영어지만 locale을 정해줄 경우 locale에 따라서 다른 resource를 사용하게 되는데, 만일 한국어의 경우 아래의 resource을 사용하게 된다.
WINCE600\PUBLIC\COMMON\OAK\LIB\ARMV4I\RETAIL\0412\calibrui.res

그러나 이 calibrui.lib만 가지고는 아무것도 되지 않는다. 수정내용이 반영되려면 최종 DLL이나 exe와 같은 module이 build되어야 하는데 platform쪽의 module build들은 sources들에 의해서 쉽게 추적되지만, public common쪽의 module build은 sysgen과정에서 여러 makefile과 batch file들의 복잡한 동작에 의해서 이루어 진다.
물론 그냥 sysgen을 처음부터 다시 해 주면 되지만, sysgen을 다시하는 전체 build는 보통 30분 이상의 시간이 소요되므로, 자주 수정을 해야 하는 상황에서는 필요한 부분만을 빨리 build하여 반영하는 방법을 알아두어 작업의 효율을 높아진다.
이 경우 makefile들과 batch file들을 추적해 최종 target은 gwes.dll이 된다는 것을 알게 되었다.

그리고 다음과 같은 순서로 build해야 한다.

WINCE600\PUBLIC\COMMON\OAK\LIB\ARMV4I\RETAIL\0412\calibrui.res 에서 문구 수정
set CURRENT_LANGID=0412
WINCE600\PUBLIC\COMMON\OAK\DRIVERS\CALIBRUI\build -cp
sysgen -p common gwes2
sysgen -p common gwes
makeimg

이것은 나중에 별도의 글에서 다시 소개하겠지만 순전히 sysgen_capture tool과 일반 editor의 find in files 기능으로 주요 makefile류의 file들에서 원하는 문구를 추적해 들어감에 의해서 알아낼 수 있다.

우선 calibrui를 검색하여 winceos.bat에서 다음과 같이 calibrui가 사용된다는 것을 알게 된다.

set GWE2_COMPONENTS=%GWE2_COMPONENTS% tchui calibrui

GWE2_COMPONENTS로 다시 검색하면 makefile에서 gwes2.lib가 GWE2_COMPONENTS에 depend on하다는 것과 gwes2.lib은 GWESLIBS로 정의된다는 것을 알게된다.

gwes2::$(GWE2_COMPONENTS)
gwe1 gwe2 gwe3 gwe4::
@set DEFFILE=
@set DLLENTRY=
@set EXEENTRY=
@set TARGETNAME=$@

@set RELEASETYPE=OAK
@set TARGETLIBS=
@set TARGETTYPE=LIBRARY
$(MAKECMD) /NOLOGO $(SG_OUTPUT_OAKLIB)\$@.lib
@set GWELIBS=%%GWELIBS%% $(SG_OUTPUT_OAKLIB)\$@.lib

그리고 GWESLIBS는 gwes_lib.lib를 build하는데 사용된다.

lib_gwes: ceosutil
@set TARGETTYPE=LIBRARY
@set TARGETNAME=gwes_lib
@set RELEASETYPE=OAK
@set TARGETLIBS=
@set SOURCELIBS=%%GWELIBS%% $(SG_OUTPUT_SDKLIB)\ceosutil.lib
@set SOURCEPDBS=$(SG_INPUT_LIB)\mgdi.pdb
@echo Creating gwes_lib.lib $(MAKECMD) /NOLOGO $(SG_OUTPUT_OAKLIB)\gwes_lib.lib

또한 lib_gwes는 gwes.dll이 depend on하는 target이다.

gwes::$(GWES_REPLACE) $(GWES_REPLACE_COMPONENTS) $(GWES_COMPONENTS) lib_gwes
gwes:: 0409_base_resources gwestubs
@set TARGETTYPE=DYNLINK
@set TARGETNAME=$@
@set RELEASETYPE=OAK
@set DEFFILE=$(SG_OUTPUT_OAKLIB)\$@.def
$(SG_TOKENFILTER) $(SG_INPUT_LIB)\$@.def $(SG_OUTPUT_OAKLIB)
@set SOURCELIBS=
@set TARGETLIBS=$(SG_OUTPUT_SDKLIB)\coredll.lib $(SG_OUTPUT_OAKLIB)\gwes_lib.lib $(SG_OUTPUT_SDKLIB)\gwestubs.lib %GWES_TARGET_RESOURCE% $(MAKECMD) /NOLOGO $(SG_OUTPUT_OAKTGT)\gwes.dll
@set DLLENTRY=_DllMainCRTStartup

즉 gwes를 target으로 sysgen하면 denpency에 의해 우선 gwes_lib.lib이 build된다는 것을 알 수 있다. 그리고 또한 gwes_lib.lib을 build하기 위해서는 gwes2.lib이 미리 만들어져 있어야 하지만 따로 dependency가 정의되어 있지 않기 때문에 gwes2.lib을 만들기 위해 gwes2를 target으로 한 sysgen이 먼저 실행되어야 한다. gwes2 또한 calibrui에 depend on하지만 막상 calibrui target은 어떤 library나 module을 build하기 위한 동작을 하지 않는다. calibrui.lib은 sources에 의해서 따로 build된다.

그리고 이런 방식으로 console에서 부분적으로 build하니깐 locale이 반영되지 않아 무조건 미국 locale로만 나온다. 역시 makefile을 보면 CURRENT_LANID가 정의되어 있지 않으면 무조건 미국 locale인 0409가 할당되는 것을 확인 할 수 있다.
그래서 CURRENT_LANID를 0412로 따로 할당해 주는 작업을 한다.

이렇게 해서 결과적으로 처음 이야기한 것과 같은 build 순서가 나오게 된다.
이것을 batch file로 만들어 놓아 source를 조금씩 수정하면서 신속히 build해 수정내용이 어떻게 반영되는지 확인해 가며 coding할 수 있다.

만일 우리가 처음부터 어떤 dll이나 exe가 필요한지 알고있고 있다면 depend on하는 것은 비교적 쉽게 찾을 수 있다. sysgen_capture tool을 사용하면 된다.
'sysgen_capture -p common gwes'명령을 console창에 내리면 sources.gwes를 생성하는데 여기서 다음 정보를 얻을 수있다.
TARGETLIBS=\
$(_SYSGENSDKROOT)\lib\$(_CPUINDPATH)\coredll.lib \
$(_SYSGENOAKROOT)\lib\$(_CPUINDPATH)\gwes_lib.lib \
$(_SYSGENSDKROOT)\lib\$(_CPUINDPATH)\gwestubs.lib \
$(_SYSGENOAKROOT)\target\$(_CPUINDPATH)\0409\gwes.res


그리고 여기에 나열된 lib들이 sources에 의해서 build되는 것이면 상황이 쉬워지는 거고 그렇지 않고 sysgen과정에 생성되는 것이라면 처음과 같은 방법으로 찾아야한다.
sources에 의해서 만들어지는 아닌지는 일반 editorfind in files기능을 사용해서 전체 sources file중에 gwes_lib등의 lib 이름이 있는지 찾아보면 알수 있다.

쉽지 않다.
wince에서 build가 제일 어렵다.

Touch calibraion화면 문구중에서 keyboard관련 내용 없애기

wince 제품 중에는 실제 keyboard hardware가 없고 keybopard hardware를 연결할 수없는 경우가 많다.
그러나 touch calibration 화면에서는 기본적으로 항상 다음과 같은 keyboard관련 문구가 뜬다.
'취소하려면 키를 누르십시오'
'새 설정을 사용하려면 키를 누르십시오'
'기존 설정을 유지하려면 키를 누르십시오'

하지만 keyboard hardware가 없는 환경에서 이런 문구는 말이 되지 않는다.
그럼 keyboard hardware가 없는 환경에서 상황에 맞는 message가 나오게 하려면 어떻게 해야 할까?

다음 registry 값을 추가함에 의해서 가능하다.
[HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\KEYBD]
"Status"=dword:0

이 status는 GetKeyboardStatus() call의 return값중 KBDI_KEYBOARD_ENABLED bit을 나타내게 되어 궁극적으로 keyboard hardware가 enable되지 않았다고 알리게 된다. touch calibration은 이 함수의 return값을 참조하여 출력할 문구를 정하게 된다.

수요일, 10월 01, 2008

한글 IME 상태 창 제거하기

wince booting 후 우측 하단에 보면 한글과 한자가 표시된 IME 상태창이 표시된다.
이것을 안보이게 하기 위해서는 다음의 registry 설정을 한다.

[HKEY_CURRENT_USER\ControlPanel\Korean IME UI\Settings]
"ShowState"=dword:0