잉여력 dev
- HDMI sound conf 2014.08.12
- CEConfig.h 파일 사용법 2009.01.02
- Bluetoot JoyPad driver for winCE 500 2008.12.21
- Windows CE 5.0 Update 080531 2008.12.14
- Bluetooth Debug Console (BTDC) Debugging Tool for WinCE 5.0 2008.12.07
- WinCE 5.0 에서 사용되는 Standard SDK. 2008.09.30
- H/W Key에 window 버튼 연결. 2008.09.26
- TMS320 DM320 16bit OSD 살리기.. 2008.09.21
- error makefile(16) : U1020: 2008.07.16
- Dynamic Link Library 2008.05.12
HDMI sound conf
CEConfig.h 파일 사용법
모든 윈도우CE 기반 장치들은 Windows 폴더 아래에 CEConfig.h 파일을 가집니다.
이 파일은 각기 다른 프로젝트나 SDK에서 선택적인 컴파일 시에 사용됩니다.
그리고 해당 장치의 윈도우CE OS 라이센스 단계를 판별하는데 쓰입니다.
(ex 5.0 core, 5.0 pro, 5.0 pro plus )
CEConfig.h파일은 플랫폼 빌더를 이용하여 윈도우 CE OS프로젝트를 빌드 하거나
시스템을 생성(sysgen)할 때 만들어지며,
이 파일은 프로젝트에 포함된 OS 컴포넌트를 매크로 형태로 정의하고 있습니다.
예를 들어 런타임 정보등을 수집하는 ToolHelp API를 포함하는 윈도우 CE OS 존재할 수 있는데, 만약 사용자가 응용프로그램 작성시 해당 API에 종속된 프로그램을 만들 경우에는 ToolHelpAPI를 포함하지 않는 윈도우 CE OS에서는 오류를 발생합니다.
만약에 OS가 ToolHelp API를 포함하고 있다면
CEConfig.h 파일은
그러면 아래와 같이 체크하는 루틴을 추가해서 해당 API로 부터 독립된 빌드 형태의 응용 프로그램을 작성할 수 있습니다.
#ifdef CE_MODULES_TOOLHELP
#include "tlhelp32.h"
#endif
* OS 라이센스 단계를 검출해 낼수 있는 툴은 아래 링크에서 다운 받을 수 있습니다.
Microsoft® Windows® CE 5.0 Run-time Assessment Tool
- 원문출처 -
Bluetoot JoyPad driver for winCE 500
Bluetooth JoyPad Driver for WinCE 5.0 (Chainpus BGP-100)
Driver made by Bluetooth packet sniffering..
(BGP-100 use Bluetooth SPP profile.)
* Known Bugs
- Combination key not supported yet. such as CTL+x...
- Sometimes COM port opening failed or delayed. (it's kernel bug, maybe)
JoyPadwince500driver(BGP-100)20081221.rar
* 원래 대만산? 블루투스 조이패드인데, 포켓피시용 드라이버만 있어서 따로 만든 WinCE용 드라이버입니다.
* 이건 만드는 데 2~3일 걸렸습니다..;;
* 소스코드는 아직 정리를 안해서 올리지 않았죠.
* 언어는 한국어만 지원합니다.
Windows CE 5.0 Update 080531
기존에 없었던 A2DP, AVRCP, AVCTP, AVDTP 등의 소스가 새로 추가되어 있다.
(해당 업데이트 부분에 문제가 있어서 릴리즈 커널에는 그동안 적용하지 않고 있다.)
- 해당 업데이트 명세 -
QFE업데이트를 한다음 필요한 헤더만 뽑아서 쓰는게 원래 목표..
Private 코드는 완전하지 않을수 있다는 경고를 깜빡하고 QFE업데이트 이후에
Private을 Build 해버린 결과는 아래와 같다..
BUILD: [01:0000000341:ERRORE] d:\WINCE500\PRIVATE\WINCEOS\COMM\BLUETOOTH\HCI\BASE\hci.cxx(1003) : error C3861: 'btutil_IteratePeerInfo': identifier not found, even with argument-dependent lookup
BUILD: [01:0000000342:ERRORE] d:\WINCE500\PRIVATE\WINCEOS\COMM\BLUETOOTH\HCI\BASE\hci.cxx(1006) : error C3861: 'BTH_STATE_HCI_INQUIRY_RESULT': identifier not found, even with argument-dependent lookup
BUILD: [01:0000000343:ERRORE] d:\WINCE500\PRIVATE\WINCEOS\COMM\BLUETOOTH\HCI\BASE\hci.cxx(1695) : error C3861: 'BTH_STATE_HCI_INQUIRY_RESULT': identifier not found, even with argument-dependent lookup
BUILD: [01:0000000344:ERRORE] d:\WINCE500\PRIVATE\WINCEOS\COMM\BLUETOOTH\HCI\BASE\hci.cxx(1820) : error C2065: 'HCI_Accept_Synchronous_Connection_Request' : undeclared identifier
BUILD: [01:0000000345:ERRORE] d:\WINCE500\PRIVATE\WINCEOS\COMM\BLUETOOTH\HCI\BASE\hci.cxx(1821) : error C2065: 'HCI_Reject_Synchronous_Connection_Request' : undeclared identifier
BUILD: [01:0000000346:ERRORE] d:\WINCE500\PRIVATE\WINCEOS\COMM\BLUETOOTH\HCI\BASE\hci.cxx(1825) : error C2065: 'HCI_Setup_Synchronous_Connection' : undeclared identifier
BUILD: [01:0000000347:ERRORE] d:\WINCE500\PRIVATE\WINCEOS\COMM\BLUETOOTH\HCI\BASE\hci.cxx(1874) : error C2065: 'HCI_SynchronousConnectionCompleteEvent' : undeclared identifier
BUILD: [01:0000000348:ERRORE] d:\WINCE500\PRIVATE\WINCEOS\COMM\BLUETOOTH\HCI\BASE\hci.cxx(1874) : error C2146: syntax error : missing ';' before identifier 'pCallback'
BUILD: [01:0000000349:ERRORE] d:\WINCE500\PRIVATE\WINCEOS\COMM\BLUETOOTH\HCI\BASE\hci.cxx(1874) : error C2065: 'pCallback' : undeclared identifier
BUILD: [01:0000000350:ERRORE] d:\WINCE500\PRIVATE\WINCEOS\COMM\BLUETOOTH\HCI\BASE\hci.cxx(1874) : error C2039: 'hci_SynchronousConnectionCompleteEvent' : is not a member of '_HCI_EVENT_INDICATION'
BUILD: [01:0000000352:ERRORE] d:\WINCE500\PRIVATE\WINCEOS\COMM\BLUETOOTH\HCI\BASE\hci.cxx(1876) : error C3861: 'pCallback': identifier not found, even with argument-dependent lookup
BUILD: [01:0000000353:ERRORE] d:\WINCE500\PRIVATE\WINCEOS\COMM\BLUETOOTH\HCI\BASE\hci.cxx(1888) : error C3861: 'pCallback': identifier not found, even with argument-dependent lookup
BUILD: [01:0000000354:ERRORE] d:\WINCE500\PRIVATE\WINCEOS\COMM\BLUETOOTH\HCI\BASE\hci.cxx(1918) : error C3861: 'HCI_Setup_Synchronous_Connection': identifier not found, even with argument-dependent lookup
BUILD: [01:0000000355:ERRORE] d:\WINCE500\PRIVATE\WINCEOS\COMM\BLUETOOTH\HCI\BASE\hci.cxx(1945) : error C2065: 'BTH_LINK_TYPE_ESCO' : undeclared identifier
BUILD: [01:0000000356:ERRORE] d:\WINCE500\PRIVATE\WINCEOS\COMM\BLUETOOTH\HCI\BASE\hci.cxx(1945) : fatal error C1903: unable to recover from previous error(s); stopping compilation
에러 한무더기 출력. (필요한 헤더가 몇개 없다.)
Windows CE 5.0 에 Bluetooth A2DP를 적용하고자 한다면...
1. Broadcom 칩셋 + Broadcom 제공 솔루션 사용
2. Bluesoleil for WinCE 사용
3. Kowin 솔루션 사용
4. CSR 칩셋 + WPP 사용
위의 경우에서 선택해야 함.
WinCE 5.0의 MS Bluetooth Stack으로는 SPP, OBEX, HFP 정도가 고작이다.
핸즈프리 구현의 경우 별도의 하울링 제거용 솔루션도 사용해야
송화음이 수화음에 섞이지 않는다.
* 8월 QFE는 이후 것은 적용하지 말고, 이전 private 코드를 사용하자,
Build 시에 ndislink.h 가 없다고 나오는 에러는 다음의
파일을 \WINCE500\PRIVATE\WINCEOS\COMM\INC에
넣어주면 무리없이 Build 된다.
\WINCE500\PRIVATE\WINCEOS\COMM\BLUETOOTH
\TDI\ directory.
BUILD: [01:0000000906:PROGC ] Compiling .\tdi.cxx
BUILD: [01:0000000909:ERRORE]
\WINCE500\PRIVATE\WINCEOS\COMM\BLUETOOTH\TDI\tdi
.cxx(55) : fatal error C1083: Cannot open include file: 'ndislink.h': No
such fi
le or directory
BUILD: [01:0000000910:PROGC ] Linking
\WINCE500\public\COMMON\oak\lib\ARMV4I\r
etail\bttdi.lib
BUILD: [01:0000000912:ERRORE] LINK : fatal error LNK1181: cannot open input
file
'obj\ARMV4I\retail\tdi.obj'
Bluetooth Debug Console (BTDC) Debugging Tool for WinCE 5.0
Bluetooth Debug Console (BTDC) Debugging Tool은 WinCE 5.0 에서 MS Bluetooth Stack을 사용시에
HCI, SDP 등의 동작을 각기 Console 모드 상태에서 Test 및 디버깅하는데 사용한다.
내 경우는 커스텀 Prifile을(BT HID와 비슷한) 만들어야 하기에 BT Console이 필요했다.
\\WINCE500\PUBLIC\COMMON\OAK\INC\bt_ddi.h L126에 정의 되어있는
BTH_CONSOLE 을 풀어준다.
\WINCE500\PRIVATE\WINCEOS\COMM\BLUETOOTH 내의 코드들이 최초 build and sysgen 시에
컴파일 되어 각기 lib 파일이 되고 이후에 btd.lib 및 btdrt.lib 가 되어서 public의 bluetooth driver와 합쳐져서
btd.dll 및 btdrt.dll 로 만들어 진다.
-> 이 private의 Bluetooth 관련 코드를 public 또는 platform으로 이식한 후 컴파일 한다.
Sysgen을 수행하고 나면, 이제 Bluetooth Stack 내에 Bluetooth Debug Console
1. SYSGEN_BTH_UTILS 을 추가하여 btloader.exe가 생성 되도록한다.
2. CE_MODULES_BTLOADER 을 추가하여,
common.bib 에서 btloader.exe를 windows에 복사하도록 한다.
WinCE 5.0 에서 사용되는 Standard SDK.
Windows CE 5.0: Standard Software Development Kit (SDK)
의외로 찾기가 힘들었음..;;
EVC 서비스팩 4 상태에서는 5.0용 armv4i 가 없음.
wce400\STANDARDSDK 만 존재.
H/W Key에 window 버튼 연결.
if(dwFlags==0)
{
HWND hWndTaskBar = FindWindow(_T("HHTaskBar"),NULL);
ShowWindow(hWndTaskBar, SW_SHOWNORMAL);
Sleep(200);
}
keybd_event(VK_LWIN, 0, dwFlags, 0);
virtual keyboard event 사용~
H/W 버튼을 가진 WinCE 단말기에서 윈도우 키 + 태스크바 나타내기 기능을 달아주는 것.
TMS320 DM320 16bit OSD 살리기..
운영체제 : ingenient 제공 micro kernel.
기존 8but OSD를 16bit OSD로 변경하고,
기본적인 Graphic API를 구성하고, (dot, line, box, drawing)
확장 API를 추가한다. (alpha blending, sliding, etc..)
다음과 같이 16bit 모드로 레지스터를 설정해준다.
OSD_win_set_rgb16_ex(&wc0,1);
OSD_win_set_blend_ratio(&wc0,OSD_WIN_BLEND_0);
//Transparency Enable for ODS window
OSD_win_set_transparency(&wc0,OSD_WIN_TRANSPARENCY_ENABLE);
//set window rotation
memset(wc0.buf,0,wc0.disp_width*wc0.disp_height*2);
//OSD_win_set_rgb16(&wc0,1);
OSD_win_enable(&wc0);
일반적으로 포토샵 등에서 저장한 16bit BMP는
GGGB BBBB // low byte
XRRR RRGG // high byte
와 같이 배열되어 있다. RGB 가 각각 5,5,5
DM320에서는 RGB가 5,6,5 형태로 되어 있으므로,
GGGB BBBB // low byte
RRRR RGGG // high byte
와 같이 배열되어 있음을 알 수 있다.
여기서 Green color를 처리해주기 위해 low byte의 6번째 비트를 1로 셋팅해주며,
1~5번째 비트는 소스의 1~5번째 비트를 사용하도록 구성해본다.
타겟 low = (((low<<1)&0xC0)|0x20)|(low&0x1F);
//(UINT8)((low&0x1F)|((low&0x07)<<5));
// GGGB BBBB
타겟 high = (high<<1)|((low&0x8F)>>7);
//(UINT8)(((Green&0x38)>>3)|((Red&0x1F)<<3));
// RRRR RGGG
위와 같은 처리를 하게되면, 최대한 비슷한 color의 화면 display 처리가 가능하다.
문제는 0x00 0x00 을 가지는 transparency 칼라 처리가 되지 않는다는 것이다..
0xc0, 0x00 와 같이 항상 처리가 되어버린다.
그래서 MASK 용 color를 따로 지정해 주는 방법을 써보자..
color 중에 자주 쓰이지 않는 자주색을 MASK color로 써본다.
error makefile(16) : U1020:
BUILD: [00:0000000568:PROG ] 'NMAKE.EXE -i -c BUILDMSG=Stop. NOLINK=1 PASS0ONLY=1 CLEANBUILD=1'
BUILD: [01:0000000569:INFO ] makefile.def: BUILDROOT is D:\WINCE500\PLATFORM\DM644X
BUILD: [01:0000000570:INFO ] makefile.def: Including D:\WINCE500\PLATFORM\DM644X\sources.cmn
BUILD: [01:0000000571:INFO ] Directory: D:\WINCE500\PLATFORM\DM644X\SRC\COMMON\BMPLIB\800x480
BUILD: [01:0000000572:INFO ] TARGETNAME: bmplib_800X480
BUILD: [01:0000000573:INFO ] makefile.def: Including D:\WINCE500\public\common\oak\misc\sources.ReleaseType_PLATFORM
BUILD: [01:0000000574:ERRORE] makefile(16) : U1020: end-of-file found before next directive
-> source.cmn 에서 #IF 가 제대로 닫히지 않았을 때..
Dynamic Link Library
참조하는 프로그램에 정적 라이브러리가 아닌 동적 링크를 사용하게 해준다.
기존의 정적 라이브러리와는 달리 컴파일 시에 참조하는 함수의 코드가 실행 파일로
복사되는 것이 아니라 실행 중에 라이브러리에 있는 함수를 호출 하게된다.
단점 : 만들는 과정이 복잡하며,(DLL 까지 만들어줘야 하는경우)
프로그램 자체가 DLL에 의지하여 실행하는 독립적이지 못한 상태가 되고,
DLL 이 없거나 손상될 경우 프로그램 실행이 불가능하다.
장점 : 여러 프로그램에서 한 DLL을 동시 사용하기에 메모리가 절약된다.
같은 DLL을 사용하는 여러 프로그램이 동시에 실행되도 DLL은 딱 한번만 실행되면 되며,
DLL을 사용하는 프로그램 자체의 크기가 작아진다.
참조하는 DLL 내의 알고리즘이 개선되면 각각의 프로그램의 성능 또한 같이 개선된다.
다국어 지원 리소스로 쉽게 교체도 가능하다.
* DLL 내부의 코드의 경우는 최초 호출시에 한번만 실행된다.
단, DLL 내의 고유 변수 등은 사용하는 프로그램이 호출시에 다시 메모리를 할당받는다.
! 각 프로그램간 DLL 내부의 값 자체를 공유하지는 못한다.
-DLL의 연결방법-
1. 묵시적(Implicit)연결 : 프로그램이 실행될 때 DLL이 로드됨 (Load time Linking - 실행시 연결)
함수가 어느 DLL에 있는지 밝히지 않고 사용.
윈도우가 알아서 DLL을 로딩해주고 사용하는 모든 프로그램이 종료가 되어
사용 카운트가 0이되면 알아서 DLL을 언로딩해준다.
프로젝트내에서 임포트 라이브러리 해줘야한다.
2. 명시적(Explicit)연결 : 프로그램이 실행될 때 DLL이 로드되지않고
사용자가 DLL을 로드 하라는 명령을 했을 때 로드된다.
(Run time Linking - 실행중 연결)
다국어 같은 다양한 리소스를 사용할 때 선택적으로 같은 리소스를 가지고 있으나
언어 설정이 다른 DLL을 실시간으로 교체 하는 방법에 응용이 가능할 듯하다.
프로젝트 내에서 임포트 라이브러리를 해주지 않아도 된다.
* HINSTANCE LoadLibrary(LPCTSTR lpLibFileName);
* FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName);
( DLL에서 export한 함수의 번지를 찾아 그 함수의 함수 포인터를 리턴해 준다. )
* BOOL FreeLibrary(HMODULE hLibModule);
( DLL의 사용 카운트를 -1 해주고 카운트가 0이 되면 DLL을 메모리에서 삭제한다. )