Win XP에서 SD카드를 FAT16으로 포맷하기

XP에서 FAT16으로 포맷하는 것은 통상 불가능하다고들 한다.

맞다. 내컴퓨터 메뉴에서는 항상 포맷메뉴가 FAT32로밖에 선택이 안된다. FAT는 아예 뜨지도 않는다.

방법은 카드리더기를 이용하는 것밖에 없다고들 한다.


그러나! XP에는 <관리도구>가 있다.

<관리도구>-<컴퓨터관리>-<디스크관리>로 차례로 들어가 실행하면,

하드디스크들이 주욱 나열되어 있는데 거기서 컴퓨터의 리더기에 꽂아놓은 SD카드(이동식 저장소)가 나타난다.

물론 파일시스템이 FAT32로 되어 있다.

마우스를 갖다 대고 지그시 오른쪽 버튼을 누르면 포맷을 할 수 있다. 된다! FAT메뉴 선택이 된다!

FAT를 선택하고 포맷을 실행하면 경고문이 뜬다.

지금 막 실행해 본 방법이라 이 방법의 사후 신뢰성은 보장할 수 없다.

그러나 포맷도 정상적으로 진행되고(빠른 포맷 할 필요없다. 금방 된다...) 용량도 줄지 않고 정상적으로 표시된다. 

by 배상영 | 2009/06/05 13:02 | 직장 | 트랙백 | 덧글(0)

Windows CE 5.0 FTDI 드라이버 설치 및 포팅

Windows CE 5.0 FTDI 드라이버 설치 및 포팅

사용장비

X-Hyper270-TKU Rev 1.0 2007.02.15 & X-Hyper270A

 

개 요

Windows CE 5.0 FTDI(USB to Serial) 드라이버를 포팅함으로써 리눅스가 아닌
Windows CE 5.0 상에서 Hmote를 사용할 수 있도록 한다.
본 문서는 Windows CE 5.0으로 구동하는 X-Hyper270TKU 보드에서 FTDI 칩을 사용하는
유저에게 FTDI 드라이버의 간단한 설치법과 포팅 과정에 대한 정보를 제공한다. 


 

내 용

 

1. VCP 드라이버 설치 및 포팅

 

Windows CE에서 1세대, 2세대 그리고 3세대 FTDI USB UART와 USB FIFO 칩은 다음 두 가지의 드라이버 셋트 중 하나로 설치될 수 있다.

첫 번째 드라이버 타입인 D2XX direct driver는 드라이버에서 제공하는 DLL(dynamic link library)을 통해 장치에 직접 접근하는 것을 제공한다. 어플리케이션은 장치를 직접 제어하기 위해서 DLL에서 가용한 함수로 작성되어야 한다.

두 번째 드라이버 타입인 가상(virtual) COM port(VCP) 드라이버는 표준 COM 포트를 대리로 실행한다. 이 드라이버는 PC에서의 COM 포트과 같은 방법으로 통신을 할 수 있다.

본 문서에서는 사용자가 어플리케이션을 쉽게 작성할 수 있는 VCP 드라이버를 기준으로 FTDI 드라이버의 설치 과정을 설명한다.

 

1.1 VCP 드라이버 설치


Windows CE 5.0에서 사용할 FT2232C, FT232BM, FT245BM, FT8U232AM 또는 FT8U245AM 장치를 위한 VCP 드라이버의 설치법은 다음과 같다.

•  FTDI 웹사이트에서 ARM 프로세서 모델에 해당하는 최신의 VCP 드라이버를 다운로드한 후 이를 압축해제 한다. 드라이버 패키지에서 꼭 필요한 파일들은 다음과 같다.

   ① ftdi_ser.dll - VCP 드라이버 파일
   ② FTDIPORT.inf - custom VID 와 PID 조합을 가지는 장치를 위해 사용자가 변경할 수 있는 파일

•  압축 해제한 모든 파일을 보드의 \\Windows디렉토리로 복사한다.
•  FTDI 장치를 보드의 USB 호스트 포트에 연결한다. 그러면 Windows CE가 드라이버 
  파일에 접근하도록 하는 대화상자가 나타난다.
•  아래와 같이 대화상자에 VCP 드라이버의 전체 이름을 기입한다.
  파일 이름을 부정확하게 입력하면 드라이버를 찾을 수 없고, 장치는 제대로 동작하지
  않을 것이다.

  

•  드라이버의 설치가 끝났다. 드라이버의 설치는 VCPTest 테스트 프로그램으로 확인할 수 있다.
 
 
1.2 VCP 드라이버 포팅
 
Windows CE 5.0에서 사용할 FT2232C, FT232BM, FT245BM, FT8U232AM 또는 FT8U245AM 장치를 위한 VCP 드라이버의 포팅은 다음 과정을 따른다. 드라이버의 포팅은 사용자에게 복사 및 입력과 같은 과정을 생략할 수 있도록 해준다.
 
•  모듈 추가(platform.bib)
IF XHYPER_FTDI_VCP
 ftdi_ser.dll $(_FLATRELEASEDIR)\ftdi_ser.dll  NK  SH
ENDIF XHYPER_FTDI_VCP
 
•  레지스트리 설정(platform.reg)
 

;-------------------------------------------------------------
; FTDI
;-------------------------------------------------------------
IF XHYPER_FTDI_VCP

[HKEY_LOCAL_MACHINE\Drivers\USB\FTDI_DEVICE_6001]
 "Index"=dword:0
 "DeviceArrayIndex"=dword:0
 "Dll"="ftdi_ser.dll"
 "InitialIndex"=dword:0
 "LatencyTimer"=dword:10
 "Prefix"="COM"

[HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients\1027_24577\Default\Default\FTDI_DEVICE]
"DLL"="ftdi_ser.dll"

ENDIF XHYPER_FTDI_VCP

 

•  배치 파일 수정에 추가(XHyper27xTKU_BSP.bat)

set XHYPER_FTDI_VCP=1

 

2. 설치 확인

 

VCPTest 프로그램을 실행한다.

•  Open : COM0 포트를 연다.
•  Write : Loopback 테스트를 실행한다.
•  Close : 열린 포트를 닫는다.
•  Ok : 프로그램을 종료한다.

 

by 배상영 | 2009/06/03 17:00 | 직장 | 트랙백 | 덧글(0)

[WinCE 5.0/6.0] Hive-Based Registry 사용하기

RAM기반의 Object Store가 구현되어 있는 CE기기에서는 Registry 설정이 Object Store(RAM)에 저장되기 때문에 전원공급이 중단될 경우(cold boot) 모든 설정이 기본값으로 돌아가게 됩니다. 따라서 사용자가 변경한 Registry 설정을 보존해야 할 경우 Hive-based Registry를 사용 하여야 합니다.

Hive-Based Registry를 사용하기 위해서는 Hive-based Registry Catalog아이템을 OS에 포함시켜야 하고 Registry가 저장될 장치에 대한 드라이버 컴포넌트와 파일 시스템에 대한 component도 추가합니다.

먼저 Hive-based Registry를 구현하기 위한 세부 설정들에 대해 알아보고, 실제 x86기반 보드의 USB Flash memory에 Registry를 저장시키는 방법을 적용해 보겠습니다.

1. Hive-Based Registry 시작 순서

Registry를 외장 파일 시스템에 저장하는 것은 시스템이 부팅되는 동안 발생되는 이벤트들의 순서를 복잡하게 만듭니다. 예를 들어, Registry 설정이 저장되어 있는 미디어(HDD, Flash등)에서 Registry 설정을 가져오기 위해서는 해당 미디어에 대한 드라이버가 로드 되어야 하는데, 드라이버가 로드 되기 위해서는 반대로 Registry 설정이 필요합니다. 이 문제에 대한 해결 방법으로 Hive-Based Registry환경에서는 미디어에 저장된 시스템 하이브(System.hv)에 접근하기 위해 부트 하이브(Boot.hv)를 이용해 필요한 일부 드라이버들을 먼저 로드 하는 방법을 사용합니다.

부트 하이브는 ROM(OS image: NK.bin)에 저장되어 있고 따라서 boot되는 동안 변경될 수 없습니다. 부팅 과정에서 드라이버가 부트 하이브를 변경시키면, 이 변경은 시스템 하이브에 적용되게 됩니다. 하지만 다음 부팅 때, 부트 Registry는 ROM에 있는 기본값으로 되돌려 질 것입니다.

Hive-Based Registry환경에서는 시스템이 드라이버를 로딩하는 것을 두 개의 부트 단계(boot phase)로 나눌 수 있습니다. 첫 번째 부트 단계에서 부트 Registry에 정의된 작은 드라이버들의 묶음이 로드 됩니다. 이 드라이버들이 바로 시스템 Registry가 저장된 파일시스템에 접근하기 위해 필요한 드라이버들 입니다.


첫 번째 단계에서 필요한 Registry들이 전부 로드 되었을 때, 두 번째 부트 단계가 시작되고 또 다른 드라이버들의 로딩이 시작됩니다. 첫 번째 부트 단계에서 이미 로딩된 드라이버들이 두 번째 부트단계에서 다시 로딩되는 것을 방지하기 위해 특정 flag값을 사용하게 됩니다.

이 드라이버들은 ROM에 위치한 부트 Registry를 통해 시작되기 때문에, 드라이버들은 절대 변하지 않는 기본값들로 시작됩니다. 만약 이 드라이버들을 기본값 이외의 값으로 설정하고자 한다면, 이 드라이버들은 두 번째 단계까지 기다려서 Registry 설정을 다시 읽어야 합니다.

파일 시스템 프로세스(Filesys.exe)는 부트 Registry를 가져오고, Device.exe를 시작하고, 시스템 Registry를 가지고 있는 파일시스템이 준비될 때까지 기다립니다. Device Manager(Device.exe)는 부트Registry에 지정된 몇몇 드라이버들을 로드하고 시스템 Registry가 사용 가능해질 때까지 기다리게 됩니다.

시스템 Registry를 포함하고 있는 파일 시스템의 드라이버는 bootable flag가 설정되어 있어야만 하고, 이것으로 Filesys.exe는 어떤 파일 시스템을 기다려야 하는지 알 수 있습니다. 파일 시스템이 준비가 되면 해당 파일 시스템에 있는 시스템 Registry가 로드 됩니다.

시스템 Registry가 다음 단계를 진행할 준비가 되고, Filesys.exe에 의해 어플리케이션들이 시작될 때가 두 번째 부트 단계의 시작입니다. 이 때 System/BootPhase2 이벤트가 두 번째 단계의 드라이버 로딩하도록 설정합니다. 이 이벤트는 Device.exe가 시스템 Registry 설정에 따라 드라이버들을 re-enumerate하도록 합니다.

아래 그림은 시작 순서를 구체적으로 보여줍니다.



Device.exe는 드라이버들을 re-enumerates하고 시작합니다. Filesys.exe는 나머지 초기화 key에 있는 나머지 어플리케이션들을 시작합니다.


다음으로 해야 할 작업은 하이브 설정이 제대로 적용되기 위해 OS디자인의 Common.reg의 아래 설정을 확인하는 부분입니다.

[HKEY_LOCAL_MACHINE\init\BootVars]
    "SystemHive"="<your system hive location>"
    "ProfileDir"="<your user hive location>"
    "Flags"=dword:<your value>


SystemHive는 시스템 하이브 파일(System.hv)의 위치와 이름에 대한 정보를 가지는 키값입니다. 파일이 저장될 파일시스템의 이름은 포함하지 않습니다. 파일 시스템에 대한 정보는 다른 Registry 키를 사용해 시스템이 결정하게 됩니다.


일반적으로 “System.hv” 또는 "Documents and Settings\System.hv"를 사용합니다.

"SystemHive"="Documents and Settings\\system.hv"

ProfileDir은 사용자 프로파일 파일의 위치를 설정합니다. 일반적으로 "System.hv" 또는 "Documents and Settings\System.hv"를 사용합니다.

"ProfileDir"="Documents and Settings\\system.hv

Flags값은 어느 부팅 단계(boot phase)에서 Storage Manager 또는 Device Manager가 시작될지, 해당 레지스트가 hive-base Registry에서 영향을 받는지, 외장 ROM의 Registry에 영향을 받는지를 알립니다. 이 값은 “Start DevMgr”값을 대체합니다.


<”Flags”값 테이블>
Flag 비트    설명
0x00000001 Storage Manager를 첫 번째 부트 단계에서 시작하고 hive-based Registry를 로드.
0x00000002 Device Manager를 첫 번째 부트 단계에서 시작하고 hive-based Registry를 로드
0x00000004 Storage Manager를 첫 번째 부트 단계에서 시작하고 BINFS같은 외장 ROM의 Registry를 로드.
0x00000008 Device Manager를 첫 번째 부트 단계에서 시작하고 BINFS같은 외장 ROM의 Registry를 로드.


Flags비트는 값들을 조합하여 사용 가능합니다.

예를 들어서 "Flags"=dword:3 은 bit 1과 bit 2의 합이며 "Start DevMgr"=dword:1 설정과 동일한 의미입니다.

만약 Flags값이 설정되어 있지 않은 경우, Device Manager와 Storage Manager는 시작되지 않고 Hive는 Object Store(RAM)에 저장되게 됩니다.


Object Store에 저장된 Hive데이터들은 시스템이 cold boot하면 전부 사라지기 때문에 hive데이터들은 보통 RAM이외의 저장장치에 저장하며, 이를 위해 Device Manager를 이용해야 합니다.


HKEY_LOCAL_MACHINE\init\BootVars에 위치하게 되는 DefaultUser값은 불러올 기본 사용자 하이브를 결정하게 됩니다.

DefaultUser는 시스템이 부팅되었을 때 기본 profile로 사용될 사용자 이름으로 설정됩니다.


만약 사용자 이름이 이미 존재한다면, 해당 사용자 하이브를 불러옵니다. 새로운 사용자라면 해당 사용자 profile이 생성되게 됩니다.


[HKEY_LOCAL_MACHINE\init\BootVars]
    "DefaultUser"="<username>"

첫 번째 부팅 단계에서 로딩될 드라이버들이 제대로 HIVE BOOT SECTION으로 묶여있는지 확인합니다.

; HIVE BOOT SECTION
<your Registry settings>
; END HIVE BOOT SECTION

첫 번째 부팅 단계에서 로딩되는 각 드라이버의 flag 비트를 설정합니다.


[HKEY_LOCAL_MACHINE\Drivers\...]
    "Flags"=dword:1000

이 flag는 기존 설정에 대한 OR 비트마스크 입니다. Device Manager는 이 값으로 첫 번째 부팅 단계에서 드라이버를 로드하고 두 번째 부팅단계에서 다시 로딩하여 드라이버가 두 번 로딩되는 것을 막아줍니다.


마운트 파티션 flag를 bootable로 설정하여야 합니다.


Windows CE 5.0이후 버전에서는, MountAsBootable Registry를 DWORD:1 로 설정합니다. 이전 버전에서는 MountFlags Registry 값을 DWORD:2로 설정합니다.


이 값을 파일시스템 드라이버의 Storage Manager 프로파일에 설정함으로써 해당 저장장치에 Registry가 저장되게 됩니다.

예를 들어, 만약 MyFileSystem드라이버를 사용하는 MyProfile 저장 장치에 하이브를 설정하고 싶다면 MountAsBootable 또는 MountFlags를 아래 Registry 키에 설정하면 됩니다.
 
[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\<MyProfile>\<MyFileSystem>]


Hive-based Registry를 적용한 상태라면 시스템이 shutdown될 때 자동적으로 Registry의 내용을 저장장치에 flush합니다. 그럼에도 불구하고 시스템의 전원이 갑자기 꺼져서 flushing이벤트가 발생하지 못했다면 설정된 데이터를 날려버릴 수 있습니다.
 
이를 방지하기 위해서는 개발자가 필요하다고 생각되는 때마다 RegFlushKey함수를 호출하거나, HKEY_LOCAL_MACHINE\init\BootVars의 “RegistryFlags” 키를 이용하는 Aggressive Registry를 통해 Aggressive flushing을 할 수 있습니다.


Aggressive flushing은 또한 flush-on-close라고 불리는데, OS가 RegCloseKey가 호출될 때마다 RegFlushKey를 호출하게 됩니다. RegCloseKey는 시스템이 Registry를 참조하거나 변경한 후 Registry Handle을 닫을 때 호출되는 API입니다.


“RegistryFlags”=dword:1로 설정하여 flush-on-close를 설정할 수 있습니다. 만약 이 키 값이 설정되어 있지 않다면 기본적으로 Aggressive flush를 수행하지 않습니다.

by 배상영 | 2009/06/02 00:57 | 직장 | 트랙백 | 덧글(0)

settimer

 

SetTimer

The SetTimer function creates a timer with the specified time-out value.

UINT SetTimer( HWND hWnd, // handle of window for timer messages 
UINT nIDEvent, // timer identifier 
UINT uElapse, // time-out value 
TIMERPROC lpTimerFunc // address of timer procedure );

 

The SetTimer function creates a timer with the specified time-out value.

첫번째 인수 : 타이머 받을 윈도우

두번째 인수 : 타이머의 번호 (하나 이용시 1을 쓰고, 그외에 타이머들은 번호를 고유한 부여시킨다 ) 

세번째 인수 : 타이머의 주기 단위는 1/1000초  ( 1000 == 1초 )

네번째 인수 : 타이머 발생시 호출하는 함수 지정.

 

 예) SetTimer(hWnd, 1, 1000, NULL );

 

//타이머는 시스템 전역 자원으로 이용 후 파괴하는것이 좋다.

 

BOOL KillTimer(
  HWND
 hWnd,      // handle of window that installed timer
  UINT uIDEvent   // timer identifier
);

by 배상영 | 2009/05/27 23:52 | 직장 | 트랙백 | 덧글(0)

WM_ACTIVATE

WM_ACTIVATE:

클라이언트가 무슨 동작을 하면..(ex, 포커스를 잃거나 되찾을경우..) 윈도우 메세지를 받는다.

wParam 값으로 플래그 값을 알아낸다....
int iActive = LOWORD(wParam);

switch(iActive)
{
case WA_CLICKACTIVE:     포커스를 잃엇을때... 자신의 클라이언트를 클릭하면 발생....

case WA_ACTIVE:    포커스를 잃었다가... 찾았을때 발생....

case WA_INACTIVE:  클라이언트가 포커스를 잃으면 발생..
}

----------------------------------------------------------------------------------------------------

// MAIN WINDOW MESSAGE CALLBACK FUNCTION
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) {

        switch(iMessage) {
        case WM_CREATE:
                return 0;

        case WM_PAINT:
                return OnPaint(hWnd);

        case WM_ACTIVATE:
                if(wParam == WA_INACTIVE)
                        ::bPaused = TRUE;
                else
                        ::bPaused = FALSE;
                SyncAcquire(hWnd);
                return 0;

        case WM_DESTROY:
                DirectInput_End();
                PostQuitMessage(0);
                return 0;
        }

        return DefWindowProc(hWnd, iMessage, wParam, lParam);
}


by 배상영 | 2009/05/27 23:51 | 직장 | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶