10.25.2010

New (?) Blog

終於又可以回到 linux 了。

就跟當初因為 Windows CE 而轉換 blog一樣,這次也要轉換 blog (反正 blogger 新開 blog 不用錢 X)

R40eUbuntu

這麼奇怪的名字是因為當初是 R40e 的維護記錄。後來就當做 linux 相關blog 記錄。


* 希望我以後再也不用更新這個 site 的資料.. (>_<)

10.22.2010

倫敦交易所創下最快交易記錄

記得這一連串的事件 -- 倫敦交易所

今天的新聞: 倫敦交易所創下最快交易記錄

但是..好像還只是試運轉.

9.24.2010

latest ffmpeg rev can play logged 1seg TS

使用 v0.6 以後 (2010 09 23) 的 ffmpeg
ffplay 可以播放 1seg log stream..

9.17.2010

write code to parse logged 1SEG TS Data. with ISO/IEC 13818-1

所包含的 PID 有:
  • 0x0010
  • 0x0011
  • 0x0014
  • 0x0024
  • 0x0301
  • 0x0400
  • 0x0500
  • 0x0600
  • 0x1FC8
  • 0x1FFF
下面是兩個同樣 log 10M 的 STREAM。
COLORBAR:
0010: 202
0011: 101
0014: 40
0024: 202
0301: 3486
0400:21145
0500: 9451
1FC8: 1008
1FFF:20144

TESTVIDEO
0010: 202
0011: 101
0014: 40
0024: 202
0400:35010
0500: 9450
0600: 3486
1FC8: 1009
1FFF: 6276

下面是 log 1M 的 TESTVIDEO
0010: 20
0011: 10
0014: 4
0024: 20
0400: 3499
0500: 946
0600: 349
1FC8: 101
1FFF: 635

當 CN 低時,會有 error,這時候 bit : transport_error_indicator 就會是 1. 有時候,該 packet 的 pid 就不在上述範圍內。

Color Bar TEST STREAM 有很多 priority packet (priority bit = 1)。
一般影片的 TEST STREAM 就沒有 priority packet。
priority packet 的 pid 是 0x0301 和 0x0010。0x0010 同時是 start packet.

9.16.2010

use VLC to play 1SEG TS file

用 VLC 1.0.2:

vlc --ts-extra-pmt=15=0x400:27 log.trp

可以撥 save 起來的 1SEG TS file.

9.15.2010

Serial TS (Transport Stream) bus signal definition

Serial Type Transport Stream 的信號 pin 有:
  • TSCLK : clock
  • TSO : Data
  • TSEN : TS valid (有點類似 chip select)
  • TSPAC : Syn Byte (在送出 sync byte 的data 時會有動作)
  • TSER : TS Packet Error flag (packet 有 error 時會有動作)
Transport Stream 分為 3 部份:

Sync --- Stream Data -- Pariry

其中 Sync + Stream Data == 188 byte
Parity 有 16 byte

一般的 chip 可以指定 TSEN 要不要把 parity 的data 也算進去。
另外,除了 stream packet 外,在沒有信號,或是有 error 時,會有 NULL packet。
也可以決定在送 null packet 時,clock 要不要動作。

9.14.2010

奇怪mcu的I2C奇怪波形

悲哀的cheap mcu,送出的 I2C 撥波行徑然是..
poormcubadi2cwave
可以看到在 START command 前,會送出一個 CLK, SDA 都是 Low 的 plus,然後 start condition 後, SDA 竟然會有一個 high-puls。
雖然這樣沒有違反 I2C wave form standard(?)
ref : wiki

但是有些 chip 就是不吃這樣的波形呀。

能偷就偷,不知道這種 chip design house 的品質是怎樣做出來的...

9.09.2010

ULPI -- USB interface standard

USB Controller 與 PHY 的介面原為 22 pin 以上的 UTMI 介面。
後來為了減少 pin count,重新定義了12 pin 的 ULPI (UTMP+ Low Pin Interface)介面。

從此,USB controller 與 PHY 只要是標準 ULPI 介面的,都可以互換。

ULPI 的標準竟然含一個 由 PHY 輸出的 CLKOUT(60MHz)。
也就是說,ULPI 標準,規定了 crystal 要裝在 PHY 那一端。(?)

ULPI 也規定了內部的 register map,所以才能達到 chip 可以互換的要求。
規定了四類 register:
  • ID
  • Mode
  • Interrupt
  • Extra

9.07.2010

接上 USB ActiveSync 後,一連線上就中斷,然後反覆。

這是因為由 KITL image 換成 NOKITL後,沒有重新sysgen 的關係。
>blddemo clean -q後,就可以了。

9.03.2010

OpenGL ES 筆記 - III

from : http://www.sunsetlakesoftware.com/2008/08/05/lessons-molecules-opengl-es


原來的OpenGL 包涵很多none-effecicent api,OpenGL ES 把所有none-effiicienct api 都拿掉了。

Config

EGLConfig 是要告訴 OpenGL 目前這個hardware platform surface 的 rendering format。
使用 eglGetConfigs( ) 可以取出目前這個platform 所有 support 的 rendering format。

要決定 config 有很多複雜的動作:

詢問目前 platform support 的 config 有哪些。
設定目前要用的config

config 是由一堆 attrib 組成,EGL 用一維 array 來代表:分別是
{attrib1,value1,attrib2,value2...EGL_NONE};

Attrib

EGL_BUFFER_SIZE
Color buffer depth (bit 數)
= RED_SIZE + GREEN_SIZE + BLUE_SIZE + ALPHA_SIZE



輸入Vertex array 與 繪圖

畫圖的動作分成兩部份:
  • 將 定義 Vertext Point 的 Array 丟進 OpenGL
  • 要 OpenGL 以 XXX 的順序畫圖
所以需要提供兩種資料:
  • Vertex point array
  • Vertex Draw Sequence
第一個資料用 glVertexPointers( ) function 來送入 OpenGL。
第二個資料用 glDrawElements( ) 時傳入。
void glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);其中 size 是每一個 vertex 的 coordinate number -- 就是一個Vertex 需要幾筆資料來表示。因為是3維座標,所以寫 3 (default 是 4).

void glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);其中 indices 就是繪出的順序。
indices 的內容通常是:{0,4,1,0,9,4,9,5,4}這是說,先由點 0,4,1 畫出一個三角形,再用點 0,9,4 話一個,然後是點 9,5,4 的三角形。

OpenGL ES 筆記 - II

一樣,ref http://blog.jayway.com


OpenGL ES 採用 右手直角座標 -- 也就是說
右手方向是 X
上方是Y
背後是 Z

而初始的 view 位置就是在 0.0.0
Transformation 就是把要描繪的物體在座標軸上轉換,有以下的轉換動作:
  1. Translate 平移
  2. Rotate 旋轉
  3. Scale 放大/縮小
以上的動作都有一function 可以作,參數分別是對 x, y ,z 軸的參數,其中 Rotate 的參數單位是 degree。


OpenGL ES 筆記

一堆opengl 的筆記。
ref:
http://wiki.forum.nokia.com/
http://blog.jayway.com/


OpenGL 的繪圖步驟:
  1. 取得 display --- 就是 pc monitor,或是手機的 lcd panel.
  2. initialize EGL
  3. 選一個 config/mode
  4. create一個 context
  5. create一個 用來繪圖的 surface
  6. enable 剛剛create的 context
OpenGL ES 繪圖基本元素(Primitives)
  1. Vertex ( Vertices) : 最小的基本繪圖單位,就是兩線交會的點。(point)
    Vertex 在 OpenGL ES 中被用作描繪3D model 的元素,也被用來指定 camera , light 的位置。
  2. Edge : 連接兩個 Vertex 的直線
  3. Face : 由三個 Vertex 包成的三角形區域。
    當要定義一個face 時,他的三個vertex 的順序是很重要的,vertex 順序被用來判定face 的正面和背面(右手定則?)。有時候,可以指定只 render 正面,好節省時間。
定義一個多邊形 (Polygon)
多邊型的每個面要被拆解成一個一個的三角型,然後把每個三角形的端點(vertex) 寫出來就可以。

所以寫出來,會是一個array:
{
-1.0f, 1.0f, 0.0f, // 0 Top Left
-1.0f, -1.0f, 0.0f, // 1 Bottom Left
1.0f, -1.0f, 0.0f, // 2 Bottom Right
1.0f, 1.0f, 0.0f // 3. Top Right
}


把 vortex 訂出來後,還需要一個資料,告訴OpenGL 哪幾點構成一個 triangle,這個資料叫 indices:
{
0,1,2, // 第一個triangle 由 vertex 0.1.2 構成
0,2,3
};
OpenGL ES 描繪的方式 (render primitive)
剛剛 OpenGL ES 的 primitives 定義 "描述物體的基本元素",現在要講得是如何把這些 "描述" 畫出來。
  1. GL_POINTS : 只描出 定義的點
  2. GL_LINE_STRIP : 依順序描出點之間的線
  3. GL_LINE_LOOP : 和 GL_LINE_STRIP 一樣,但是再加一條 : 最後一點到第一點的線
  4. GL_LINES : 兩兩描出一線
  5. GL_TRIANGLES : 每三點描出一triangle
  6. GL_TRIANGLE_STRIP :有點難,就是每三點描出一triangle外,再包圍起來。
  7. GL_TRIANGLE_FAN : 一樣,有點難,每三點描出一 triangle外,再用扇形圍起來。
所以一般常用的rendering primitives 是 GL_TRIANGLES

8.23.2010

抱怨:PANASONIC DVD 錄放影機 一過保就壞了

去年 5 月底買的 PANASONIC DVD 錄放影機 DMR ES15,5200。
結果保固一年一過就壞了,而且是壞在最貴的雷射頭。修理1900。 超過原價的 1/3 。

這樣的設計功力應該才是最厲害的...剛好過保固就壞。


L 提供的: http://se.sunfar.com.tw/promo/9908/05.htm 順發延長保固 -- 就像 apple care, IBM, Dell 一樣,可以加買保固。

8.12.2010

Modify DDCAPS for CE 6.0

DDCAPS 是 platform builder 提供,偵測 platform 支援 directdraw 的程度。
但是 CE 6.0 後,DirectDraw interface 大幅改變,所以這個 code 就不能用了。要修改後才行。

修改後的 code:

Index: ddcaps.c
===================================================================
--- ddcaps.c (revision 23142)
+++ ddcaps.c (working copy)
@@ -74,7 +74,7 @@
LPDWORD caps;
LPCAPSDEFSTYPE defs;

-} gCaps[10];
+} gCaps[12];

struct
{
@@ -102,131 +102,83 @@
LPDIRECTDRAW lpDD; // DirectDraw object

// Map caps bits to readable strings
-CAPSDEFSTYPE ddCapsDefs[MAX_BOXES] =
-{
- {TEXT("3D"), DDCAPS_3D},
- {TEXT("ALIGNBOUNDARYDEST"), DDCAPS_ALIGNBOUNDARYDEST},
- {TEXT("ALIGNSIZEDEST"), DDCAPS_ALIGNSIZEDEST},
- {TEXT("ALIGNBOUNDARYSRC"), DDCAPS_ALIGNBOUNDARYSRC},
- {TEXT("ALIGNSIZESRC"), DDCAPS_ALIGNSIZESRC},
- {TEXT("ALIGNSTRIDE"), DDCAPS_ALIGNSTRIDE},
- {TEXT("BLT"), DDCAPS_BLT},
- {TEXT("BLTQUEUE"), DDCAPS_BLTQUEUE},
- {TEXT("BLTFOURCC"), DDCAPS_BLTFOURCC},
- {TEXT("BLTSTRETCH"), DDCAPS_BLTSTRETCH},
- {TEXT("GDI"), DDCAPS_GDI},
- {TEXT("OVERLAY"), DDCAPS_OVERLAY},
- {TEXT("OVERLAYCANTCLIP"), DDCAPS_OVERLAYCANTCLIP},
- {TEXT("OVERLAYFOURCC"), DDCAPS_OVERLAYFOURCC},
- {TEXT("OVERLAYSTRETCH"), DDCAPS_OVERLAYSTRETCH},
- {TEXT("PALETTE"), DDCAPS_PALETTE},
- {TEXT("PALETTEVSYNC"), DDCAPS_PALETTEVSYNC},
- {TEXT("READSCANLINE"), DDCAPS_READSCANLINE},
- {TEXT("STEREOVIEW"), DDCAPS_STEREOVIEW},
- {TEXT("VBI"), DDCAPS_VBI},
- {TEXT("ZBLTS"), DDCAPS_ZBLTS},
- {TEXT("ZOVERLAYS"), DDCAPS_ZOVERLAYS},
- {TEXT("COLORKEY"), DDCAPS_COLORKEY},
- {TEXT("ALPHA"), DDCAPS_ALPHA},
- {TEXT("CKEYHWASSIST"), DDCAPS_COLORKEYHWASSIST},
- {TEXT("NOHARDWARE"), DDCAPS_NOHARDWARE},
- {TEXT("BLTCOLORFILL"), DDCAPS_BLTCOLORFILL},
- {TEXT("BANKSWITCHED"), DDCAPS_BANKSWITCHED},
- {TEXT("BLTDEPTHFILL"), DDCAPS_BLTDEPTHFILL},
- {TEXT("CANCLIP"), DDCAPS_CANCLIP},
- {TEXT("CANCLIPSTRETCHED"), DDCAPS_CANCLIPSTRETCHED},
-};

+
CAPSDEFSTYPE CKeyCapsDefs[MAX_BOXES] =
{
- {TEXT("DESTBLT"), DDCKEYCAPS_DESTBLT},
- {TEXT("DESTBLTCLRSPACE"), DDCKEYCAPS_DESTBLTCLRSPACE},
+ {TEXT("BOTHBLT"), DDCKEYCAPS_BOTHBLT},
+ {TEXT("DESTBLT"), DDCKEYCAPS_DESTBLT },
+ {TEXT("DESTBLTCLRSPACE"), DDCKEYCAPS_DESTBLTCLRSPACE },
{TEXT("DESTBLTCLRSPACEYUV"), DDCKEYCAPS_DESTBLTCLRSPACEYUV},
- {TEXT("DESTBLTYUV"), DDCKEYCAPS_DESTBLTYUV},
- {TEXT("DESTOVERLAY"), DDCKEYCAPS_DESTOVERLAY},
- {TEXT("DESTOVERLAYCLRSPACE"), DDCKEYCAPS_DESTOVERLAYCLRSPACE},
- {TEXT("DESTOVERLAYCLRSPACEYUV"), DDCKEYCAPS_DESTOVERLAYCLRSPACEYUV},
- {TEXT("DESTOVERLAYONEACTIVE"), DDCKEYCAPS_DESTOVERLAYONEACTIVE},
- {TEXT("DESTOVERLAYYUV"), DDCKEYCAPS_DESTOVERLAYYUV},
- {TEXT("SRCBLT"), DDCKEYCAPS_SRCBLT},
+ {TEXT("SRCBLT"), DDCKEYCAPS_SRCBLT },
{TEXT("SRCBLTCLRSPACE"), DDCKEYCAPS_SRCBLTCLRSPACE},
- {TEXT("SRCBLTCLRSPACEYUV"), DDCKEYCAPS_SRCBLTCLRSPACEYUV},
- {TEXT("SRCBLTYUV"), DDCKEYCAPS_SRCBLTYUV},
- {TEXT("SRCOVERLAY"), DDCKEYCAPS_SRCOVERLAY},
- {TEXT("SRCOVERLAYCLRSPACE"), DDCKEYCAPS_SRCOVERLAYCLRSPACE},
- {TEXT("SRCOVERLAYCLRSPACEYUV"), DDCKEYCAPS_SRCOVERLAYCLRSPACEYUV},
- {TEXT("SRCOVERLAYONEACTIVE"), DDCKEYCAPS_SRCOVERLAYONEACTIVE},
- {TEXT("SRCOVERLAYYUV"), DDCKEYCAPS_SRCOVERLAYYUV}
+ {TEXT("SRCBLTCLRSPACEYUV"), DDCKEYCAPS_SRCBLTCLRSPACEYUV },
};

-CAPSDEFSTYPE FXCapsDefs[MAX_BOXES] =
-{
- { TEXT("BLTARITHSTRETCHY"), DDFXCAPS_BLTARITHSTRETCHY },
- { TEXT("BLTARITHSTRETCHYN"), DDFXCAPS_BLTARITHSTRETCHYN },
- { TEXT("BLTMIRRORLEFTRIGHT"), DDFXCAPS_BLTMIRRORLEFTRIGHT },
- { TEXT("BLTMIRRORUPDOWN"), DDFXCAPS_BLTMIRRORUPDOWN },
- { TEXT("BLTROTATION"), DDFXCAPS_BLTROTATION },
- { TEXT("BLTROTATION90"), DDFXCAPS_BLTROTATION90 },
- { TEXT("BLTSHRINKX"), DDFXCAPS_BLTSHRINKX },
- { TEXT("BLTSHRINKXN"), DDFXCAPS_BLTSHRINKXN },
- { TEXT("BLTSHRINKY"), DDFXCAPS_BLTSHRINKY },
- { TEXT("BLTSHRINKYN"), DDFXCAPS_BLTSHRINKYN },
- { TEXT("BLTSTRETCHX"), DDFXCAPS_BLTSTRETCHX },
- { TEXT("BLTSTRETCHXN"), DDFXCAPS_BLTSTRETCHXN },
- { TEXT("BLTSTRETCHY"), DDFXCAPS_BLTSTRETCHY },
- { TEXT("BLTSTRETCHYN"), DDFXCAPS_BLTSTRETCHYN },
- { TEXT("OVERLAYARITHSTRETCHY"), DDFXCAPS_OVERLAYARITHSTRETCHY },
- { TEXT("OVERLAYARITHSTRETCHYN"), DDFXCAPS_OVERLAYARITHSTRETCHYN },
- { TEXT("OVERLAYSHRINKX"), DDFXCAPS_OVERLAYSHRINKX },
- { TEXT("OVERLAYSHRINKXN"), DDFXCAPS_OVERLAYSHRINKXN },
- { TEXT("OVERLAYSHRINKY"), DDFXCAPS_OVERLAYSHRINKY },
- { TEXT("OVERLAYSHRINKYN"), DDFXCAPS_OVERLAYSHRINKYN },
- { TEXT("OVERLAYSTRETCHX"), DDFXCAPS_OVERLAYSTRETCHX },
- { TEXT("OVERLAYSTRETCHXN"), DDFXCAPS_OVERLAYSTRETCHXN },
- { TEXT("OVERLAYSTRETCHY"), DDFXCAPS_OVERLAYSTRETCHY },
- { TEXT("OVERLAYSTRETCHYN"), DDFXCAPS_OVERLAYSTRETCHYN },
- { TEXT("OVERLAYMIRRORLEFTRIGHT"), DDFXCAPS_OVERLAYMIRRORLEFTRIGHT },
- { TEXT("OVERLAYMIRRORUPDOWN"), DDFXCAPS_OVERLAYMIRRORUPDOWN },
-};
-
CAPSDEFSTYPE PalCapsDefs[MAX_BOXES] =
{
- {TEXT("1BIT"), DDPCAPS_1BIT},
- {TEXT("2BIT"), DDPCAPS_2BIT},
- {TEXT("4BIT"), DDPCAPS_4BIT},
- {TEXT("8BITENTRIES"), DDPCAPS_8BITENTRIES},
- {TEXT("8BIT"), DDPCAPS_8BIT},
- {TEXT("ALLOW256"), DDPCAPS_ALLOW256},
- {TEXT("INITIALIZE"), DDPCAPS_INITIALIZE},
+ {TEXT("ALPHA"), DDPCAPS_ALPHA},
{TEXT("PRIMARYSURFACE"), DDPCAPS_PRIMARYSURFACE},
- {TEXT("PRIMARYSURFACELEFT"), DDPCAPS_PRIMARYSURFACELEFT},
- {TEXT("VSYNC"), DDPCAPS_VSYNC}
-};
+ };

-CAPSDEFSTYPE SurfCapsDefs[MAX_BOXES] =
+CAPSDEFSTYPE BltCapsDefs[MAX_BOXES] =
{
- {TEXT("3DDEVICE"), DDSCAPS_3DDEVICE},
- {TEXT("ALPHA"), DDSCAPS_ALPHA},
- {TEXT("BACKBUFFER"), DDSCAPS_BACKBUFFER},
- {TEXT("COMPLEX"), DDSCAPS_COMPLEX},
- {TEXT("FLIP"), DDSCAPS_FLIP},
- {TEXT("FRONTBUFFER"), DDSCAPS_FRONTBUFFER},
- {TEXT("MIPMAP"), DDSCAPS_MIPMAP},
- {TEXT("OFFSCREENPLAIN"), DDSCAPS_OFFSCREENPLAIN},
- {TEXT("OVERLAY"), DDSCAPS_OVERLAY},
- {TEXT("PALETTE"), DDSCAPS_PALETTE},
- {TEXT("PRIMARYSURFACE"), DDSCAPS_PRIMARYSURFACE},
- {TEXT("PRIMARYSURFACELEFT"), DDSCAPS_PRIMARYSURFACELEFT},
- {TEXT("SYSTEMMEMORY"), DDSCAPS_SYSTEMMEMORY},
- {TEXT("TEXTURE"), DDSCAPS_TEXTURE},
- {TEXT("VIDEOMEMORY"), DDSCAPS_VIDEOMEMORY},
- {TEXT("VISIBLE"), DDSCAPS_VISIBLE},
- {TEXT("WRITEONLY"), DDSCAPS_WRITEONLY},
- {TEXT("ZBUFFER"), DDSCAPS_ZBUFFER}
-};
+ { TEXT("READSYSMEM"), DDBLTCAPS_READSYSMEM },
+ { TEXT("WRITESYSMEM"), DDBLTCAPS_WRITESYSMEM },
+ { TEXT("FOURCCTORGB"), DDBLTCAPS_FOURCCTORGB },
+ { TEXT("COPYFOURCC"), DDBLTCAPS_COPYFOURCC },
+ { TEXT("FILLFOURCC"), DDBLTCAPS_FILLFOURCC },
+ };

+CAPSDEFSTYPE AlphaCapsDefs[MAX_BOXES] =
+{
+ { TEXT("ALPHAPIXELS"), DDALPHACAPS_ALPHAPIXELS },
+ { TEXT("PREMULT"), DDALPHACAPS_PREMULT },
+ { TEXT("NONPREMULT"), DDALPHACAPS_NONPREMULT },
+ { TEXT("ALPHAFILL"), DDALPHACAPS_ALPHAFILL },
+ { TEXT("ALPHANEG"), DDALPHACAPS_ALPHANEG },
+ };

+CAPSDEFSTYPE OverlayCapsDefs[MAX_BOXES] =
+{
+ {TEXT("FLIP"), DDOVERLAYCAPS_FLIP},
+ {TEXT("FOURCC"), DDOVERLAYCAPS_FOURCC},
+ {TEXT("ZORDER"), DDOVERLAYCAPS_ZORDER},
+ {TEXT("MIRRORLEFTRIGHT"), DDOVERLAYCAPS_MIRRORLEFTRIGHT},
+ {TEXT("MIRRORUPDOWN"), DDOVERLAYCAPS_MIRRORUPDOWN},
+ {TEXT("CKEYSRC"), DDOVERLAYCAPS_CKEYSRC},
+ {TEXT("CKEYSRCCLRSPACE"), DDOVERLAYCAPS_CKEYSRCCLRSPACE},
+ {TEXT("CKEYSRCCLRSPACEYUV"), DDOVERLAYCAPS_CKEYSRCCLRSPACEYUV},
+ {TEXT("CKEYDEST"), DDOVERLAYCAPS_CKEYDEST},
+ {TEXT("CKEYDESTCLRSPACE"), DDOVERLAYCAPS_CKEYDESTCLRSPACE},
+ {TEXT("CKEYDESTCLRSPACEYUV"), DDOVERLAYCAPS_CKEYDESTCLRSPACEYUV},
+ {TEXT("CKEYBOTH"), DDOVERLAYCAPS_CKEYBOTH},
+ {TEXT("ALPHADEST"), DDOVERLAYCAPS_ALPHADEST},
+ {TEXT("ALPHASRC"), DDOVERLAYCAPS_ALPHASRC},
+ {TEXT("ALPHADESTNEG"), DDOVERLAYCAPS_ALPHADESTNEG},
+ {TEXT("ALPHASRCNEG"), DDOVERLAYCAPS_ALPHASRCNEG},
+ {TEXT("ALPHACONSTANT"), DDOVERLAYCAPS_ALPHACONSTANT},
+ {TEXT("ALPHAPREMULT"), DDOVERLAYCAPS_ALPHAPREMULT},
+ {TEXT("ALPHANONPREMULT"), DDOVERLAYCAPS_ALPHANONPREMULT},
+ {TEXT("ALPHAANDKEYDEST"), DDOVERLAYCAPS_ALPHAANDKEYDEST},
+ {TEXT("OVERLAYSUPPORT"), DDOVERLAYCAPS_OVERLAYSUPPORT},
+ };

+ CAPSDEFSTYPE MiscCapsDefs[MAX_BOXES] =
+{
+ {TEXT("READSCANLINE"), DDMISCCAPS_READSCANLINE},
+ {TEXT("READMONITORFREQ"), DDMISCCAPS_READMONITORFREQ},
+ {TEXT("READVBLANKSTATUS"), DDMISCCAPS_READVBLANKSTATUS},
+ {TEXT("FLIPINTERVAL"), DDMISCCAPS_FLIPINTERVAL},
+ {TEXT("FLIPODDEVEN"), DDMISCCAPS_FLIPODDEVEN},
+ {TEXT("FLIPVSYNCWITHVBI"), DDMISCCAPS_FLIPVSYNCWITHVBI},
+ {TEXT("COLORCONTROLOVERLAY"), DDMISCCAPS_COLORCONTROLOVERLAY},
+ {TEXT("COLORCONTROLPRIMARY"), DDMISCCAPS_COLORCONTROLPRIMARY},
+ {TEXT("GAMMACONTROLOVERLAY"), DDMISCCAPS_GAMMACONTROLOVERLAY},
+ {TEXT("GAMMACONTROLPRIMARY"), DDMISCCAPS_GAMMACONTROLPRIMARY}
+ };
+
+
//*------------------------------------------------------------------------
//| Dlg_OnCommand
//*------------------------------------------------------------------------
@@ -254,14 +206,16 @@
int i;
TCHAR szTitle[256];
static TCHAR *rgszCaps[] = {
- TEXT("Direct Draw Caps Bits"),
TEXT("Direct Draw Color Key Caps Bits"),
- TEXT("Direct Draw FX Caps Bits"),
TEXT("Direct Draw Palette Caps Bits"),
- TEXT("Direct Draw Surface Caps Bits")};
+ TEXT("Direct Draw Blt Caps Bits"),
+ TEXT("Direct Draw Alpha Caps Bits"),
+ TEXT("Direct Draw Overlay Caps Bits"),
+ TEXT("Direct Draw Misc Caps Bits")
+ };

- wsprintf(szTitle, TEXT("%s (%s)"), rgszCaps[Which%5],
- (Which < 5) ? TEXT("HAL") : TEXT("HEL"));
+ wsprintf(szTitle, TEXT("%s (%s)"), rgszCaps[Which%6],
+ (Which < 6) ? TEXT("HAL") : TEXT("HEL"));
SetWindowText(hwnd, szTitle);

ShowWindow(GetDlgItem(hwnd, IDC_RESTORE), SW_HIDE);
@@ -285,11 +239,8 @@
return TRUE;
}

-//*------------------------------------------------------------------------
-//| ddCapsDlg_Proc
-//*------------------------------------------------------------------------
BOOL CALLBACK
-ddCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+CKeyCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fProcessed = TRUE;

@@ -306,11 +257,8 @@
return (fProcessed);
}

-//*------------------------------------------------------------------------
-//| CKeyCapsDlg_Proc
-//*------------------------------------------------------------------------
BOOL CALLBACK
-CKeyCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+PalCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fProcessed = TRUE;

@@ -327,15 +275,12 @@
return (fProcessed);
}

-//*------------------------------------------------------------------------
-//| SurfCapsDlg_Proc
-//*------------------------------------------------------------------------
BOOL CALLBACK
-SurfCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+BltCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fProcessed = TRUE;

- Which = 4;
+ Which = 2;
switch (uMsg)
{
HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);
@@ -348,15 +293,12 @@
return (fProcessed);
}

-//*------------------------------------------------------------------------
-//| FXCapsDlg_Proc
-//*------------------------------------------------------------------------
BOOL CALLBACK
-FXCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+AlphaCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fProcessed = TRUE;

- Which = 2;
+ Which = 3;
switch (uMsg)
{
HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);
@@ -370,15 +312,12 @@
}


-//*------------------------------------------------------------------------
-//| PalCapsDlg_Proc
-//*------------------------------------------------------------------------
BOOL CALLBACK
-PalCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+OverlayCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fProcessed = TRUE;

- Which = 3;
+ Which = 4;
switch (uMsg)
{
HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);
@@ -391,12 +330,8 @@
return (fProcessed);
}

-
-//*------------------------------------------------------------------------
-//| HELddCapsDlg_Proc
-//*------------------------------------------------------------------------
BOOL CALLBACK
-HELddCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+MiscCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fProcessed = TRUE;

@@ -413,9 +348,7 @@
return (fProcessed);
}

-//*------------------------------------------------------------------------
-//| HELCKeyCapsDlg_Proc
-//*------------------------------------------------------------------------
+
BOOL CALLBACK
HELCKeyCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
@@ -434,15 +367,12 @@
return (fProcessed);
}

-//*------------------------------------------------------------------------
-//| HELSurfCapsDlg_Proc
-//*------------------------------------------------------------------------
BOOL CALLBACK
-HELSurfCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+HELPalCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fProcessed = TRUE;

- Which = 9;
+ Which = 7;
switch (uMsg)
{
HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);
@@ -455,15 +385,12 @@
return (fProcessed);
}

-//*------------------------------------------------------------------------
-//| HELFXCapsDlg_Proc
-//*------------------------------------------------------------------------
BOOL CALLBACK
-HELFXCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+HELBltCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fProcessed = TRUE;

- Which = 7;
+ Which = 8;
switch (uMsg)
{
HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);
@@ -476,16 +403,31 @@
return (fProcessed);
}

+BOOL CALLBACK
+HELAlphaCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ BOOL fProcessed = TRUE;

-//*------------------------------------------------------------------------
-//| HELPalCapsDlg_Proc
-//*------------------------------------------------------------------------
+ Which = 9;
+ switch (uMsg)
+ {
+ HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);
+ HANDLE_MSG(hDlg, WM_COMMAND, Dlg_OnCommand);
+
+ default:
+ fProcessed = FALSE;
+ break;
+ }
+ return (fProcessed);
+}
+
+
BOOL CALLBACK
-HELPalCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+HELOverlayCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
BOOL fProcessed = TRUE;

- Which = 8;
+ Which = 10;
switch (uMsg)
{
HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);
@@ -498,7 +440,24 @@
return (fProcessed);
}

+BOOL CALLBACK
+HELMiscCapsDlg_Proc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ BOOL fProcessed = TRUE;

+ Which = 11;
+ switch (uMsg)
+ {
+ HANDLE_MSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);
+ HANDLE_MSG(hDlg, WM_COMMAND, Dlg_OnCommand);
+
+ default:
+ fProcessed = FALSE;
+ break;
+ }
+ return (fProcessed);
+}
+
//*------------------------------------------------------------------------
//| DDEnumCallback
//*------------------------------------------------------------------------
@@ -539,7 +498,7 @@
//*------------------------------------------------------------------------
static int gCurMode = 0;

-DWORD DDAPI
+DWORD CALLBACK
EnumModesCallback(LPDDSURFACEDESC pddsd, LPVOID context)
{
Modes[ModeCnt].dwWidth = pddsd->dwWidth;
@@ -568,6 +527,8 @@
//| nCmdShow - Integer value specifying how to start app.,
//| (Iconic [7] or Normal [1,5])
//*------------------------------------------------------------------------
+typedef HRESULT (WINAPI * LPDIRECTDRAWENUMERATEEX)(LPDDENUMCALLBACKEX lpCallback, LPVOID lpContext, DWORD dwFlags);
+
int WINAPI
WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
@@ -586,22 +547,22 @@

// You need to do a GetModuleHandle and GetProcAddress in order to get the
// DirectDrawEnumerateEx
- hDDrawDLL = GetModuleHandle(TEXT("DDRAW"));
+ hDDrawDLL = LoadLibrary(TEXT("DDRAW.dll"));
if (!hDDrawDLL)
{
OutputDebugString(TEXT("LoadLibrary() failed - ddcaps: Can't list display modes"));
return (-1);
}
pDirectDrawEnumerateEx = (LPDIRECTDRAWENUMERATEEX )
- GetProcAddress(hDDrawDLL,TEXT("DirectDrawEnumerateExW"));
+ GetProcAddress(hDDrawDLL,TEXT("DirectDrawEnumerateEx"));

if (pDirectDrawEnumerateEx)
pDirectDrawEnumerateEx( DDEnumCallbackEx, (LPVOID) NULL,
DDENUM_ATTACHEDSECONDARYDEVICES |
- DDENUM_DETACHEDSECONDARYDEVICES |
- DDENUM_NONDISPLAYDEVICES);
+ DDENUM_DETACHEDSECONDARYDEVICES
+ );
else // Old DirectDraw, so do it the old way
- DirectDrawEnumerate(DDEnumCallback, NULL);
+ MessageBox(NULL,TEXT("EnumerateEx Call Fail"),TEXT("Error"),MB_OK);

ddrval = DirectDrawCreate(gpSelectedDriverGUID, &lpDD, NULL);
if (ddrval != DD_OK)
@@ -635,35 +596,41 @@

lpDD->lpVtbl->GetCaps(lpDD, &ddcapsHAL, &ddcapsHEL);

- gCaps[0].caps = &(ddcapsHAL.dwCaps);
- gCaps[0].defs = ddCapsDefs;
+ gCaps[0].caps = &(ddcapsHAL.dwCKeyCaps);
+ gCaps[0].defs = CKeyCapsDefs;

- gCaps[1].caps = &(ddcapsHAL.dwCKeyCaps);
- gCaps[1].defs = CKeyCapsDefs;
+ gCaps[1].caps = &(ddcapsHAL.dwPalCaps);
+ gCaps[1].defs = PalCapsDefs;

- gCaps[2].caps = &(ddcapsHAL.dwFXCaps);
- gCaps[2].defs = FXCapsDefs;
+ gCaps[2].caps = &(ddcapsHAL.dwBltCaps);
+ gCaps[2].defs = BltCapsDefs;

- gCaps[3].caps = &(ddcapsHAL.dwPalCaps);
- gCaps[3].defs = PalCapsDefs;
+ gCaps[3].caps = &(ddcapsHAL.dwAlphaCaps);
+ gCaps[3].defs = AlphaCapsDefs;

- gCaps[4].caps = &(ddcapsHAL.ddsCaps.dwCaps);
- gCaps[4].defs = SurfCapsDefs;
+ gCaps[4].caps = &(ddcapsHAL.dwOverlayCaps);
+ gCaps[4].defs = OverlayCapsDefs;

- gCaps[5].caps = &(ddcapsHEL.dwCaps);
- gCaps[5].defs = ddCapsDefs;
+ gCaps[5].caps = &(ddcapsHAL.dwMiscCaps);
+ gCaps[5].defs = MiscCapsDefs;

gCaps[6].caps = &(ddcapsHEL.dwCKeyCaps);
gCaps[6].defs = CKeyCapsDefs;

- gCaps[7].caps = &(ddcapsHEL.dwFXCaps);
- gCaps[7].defs = FXCapsDefs;
+ gCaps[7].caps = &(ddcapsHEL.dwPalCaps);
+ gCaps[7].defs = PalCapsDefs;

- gCaps[8].caps = &(ddcapsHEL.dwPalCaps);
- gCaps[8].defs = PalCapsDefs;
+ gCaps[8].caps = &(ddcapsHEL.dwBltCaps);
+ gCaps[8].defs = BltCapsDefs;

- gCaps[9].caps = &(ddcapsHEL.ddsCaps.dwCaps);
- gCaps[9].defs = SurfCapsDefs;
+ gCaps[9].caps = &(ddcapsHEL.dwAlphaCaps);
+ gCaps[9].defs = AlphaCapsDefs;
+
+ gCaps[10].caps = &(ddcapsHEL.dwOverlayCaps);
+ gCaps[10].defs = OverlayCapsDefs;
+
+ gCaps[11].caps = &(ddcapsHEL.dwMiscCaps);
+ gCaps[11].defs = MiscCapsDefs;
}


@@ -794,56 +761,63 @@
DialogBox(ghInstance, TEXT("About"), hWnd, (DLGPROC)AboutDlgProc);
break;

- case ID_VIEW_DRIVERCAPS:
- CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
- NULL, ddCapsDlg_Proc);
- break;
-
+
case ID_VIEW_DRIVERCOLORKEYCAPS:
CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
NULL, CKeyCapsDlg_Proc);
break;

- case ID_VIEW_DRIVERFXCAPS:
+ case ID_VIEW_DRIVERPALETTECAPS:
CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
- NULL, FXCapsDlg_Proc);
+ NULL, PalCapsDlg_Proc);
break;

- case ID_VIEW_DRIVERPALETTECAPS:
+ case ID_VIEW_DRIVERBLTCAPS:
CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
- NULL, PalCapsDlg_Proc);
+ NULL, BltCapsDlg_Proc);
break;

- case ID_VIEW_DRIVERSURFACECAPS:
+ case ID_VIEW_DRIVERALPHACAPS:
CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
- NULL, SurfCapsDlg_Proc);
+ NULL, AlphaCapsDlg_Proc);
break;

- case ID_VIEW_HELCAPS:
+ case ID_VIEW_DRIVEROVERLAYCAPS:
CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
- NULL, HELddCapsDlg_Proc);
+ NULL, OverlayCapsDlg_Proc);
break;
+
+ case ID_VIEW_DRIVERMISCCAPS:
+ CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
+ NULL, OverlayCapsDlg_Proc);
+ break;

+//----------------
case ID_VIEW_HELCOLORKEYCAPS:
CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
NULL, HELCKeyCapsDlg_Proc);
break;

- case ID_VIEW_HELFXCAPS:
- CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
- NULL, HELFXCapsDlg_Proc);
- break;
-
case ID_VIEW_HELPALETTECAPS:
CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
NULL, HELPalCapsDlg_Proc);
break;
-
- case ID_VIEW_HELSURFACECAPS:
+ case ID_VIEW_HELBLTCAPS:
CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
- NULL, HELSurfCapsDlg_Proc);
+ NULL, HELBltCapsDlg_Proc);
break;
-
+ case ID_VIEW_HELALPHACAPS:
+ CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
+ NULL, HELAlphaCapsDlg_Proc);
+ break;
+ case ID_VIEW_HELOVERLAYCAPS:
+ CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
+ NULL, HELOverlayCapsDlg_Proc);
+ break;
+ case ID_VIEW_HELMISCCAPS:
+ CreateDialog(ghInstance, MAKEINTRESOURCE(IDD_DIALOG1),
+ NULL, HELMiscCapsDlg_Proc);
+ break;
case ID_PRINTF_LISTBOX:
if (HIWORD(wParam) == LBN_DBLCLK)
{
@@ -852,18 +826,18 @@
if (sel < (UINT)ModeCnt)
{
ddrval = lpDD->lpVtbl->SetCooperativeLevel(lpDD,
- hWnd,
- DDSCL_EXCLUSIVE |
- DDSCL_NOWINDOWCHANGES |
+ hWnd,
+ DDSCL_NORMAL |
DDSCL_FULLSCREEN);
if (ddrval == DD_OK)
{
ddrval = lpDD->lpVtbl->SetDisplayMode(lpDD,
- Modes[sel].dwWidth,
- Modes[sel].dwHeight,
- Modes[sel].dwBPP);
+ Modes[sel].dwWidth,
+ Modes[sel].dwHeight,
+ Modes[sel].dwBPP,0,0);
ddrval = lpDD->lpVtbl->SetCooperativeLevel(lpDD,
- hWnd, DDSCL_NORMAL);
+ hWnd,
+ DDSCL_NORMAL);
}
}
}
Index: ddcaps.rc
===================================================================
--- ddcaps.rc (revision 23142)
+++ ddcaps.rc (working copy)
@@ -66,19 +66,21 @@
END
POPUP "&Driver"
BEGIN
- MENUITEM "Driver &Caps", ID_VIEW_DRIVERCAPS
MENUITEM "Driver C&olor Key Caps", ID_VIEW_DRIVERCOLORKEYCAPS
- MENUITEM "Driver &FX Caps", ID_VIEW_DRIVERFXCAPS
MENUITEM "Driver &Palette Caps", ID_VIEW_DRIVERPALETTECAPS
- MENUITEM "Driver &Surface Caps", ID_VIEW_DRIVERSURFACECAPS
+ MENUITEM "Driver &Blt Caps", ID_VIEW_DRIVERBLTCAPS
+ MENUITEM "Driver &Alpha Caps", ID_VIEW_DRIVERALPHACAPS
+ MENUITEM "Driver &Overlay Caps", ID_VIEW_DRIVEROVERLAYCAPS
+ MENUITEM "Driver &Misc Caps", ID_VIEW_DRIVERMISCCAPS
END
POPUP "&HEL"
BEGIN
- MENUITEM "HEL &Caps", ID_VIEW_HELCAPS
MENUITEM "HEL C&olor Key Caps", ID_VIEW_HELCOLORKEYCAPS
- MENUITEM "HEL &FX Caps", ID_VIEW_HELFXCAPS
MENUITEM "HEL &Palette Caps", ID_VIEW_HELPALETTECAPS
- MENUITEM "HEL &Surface Caps", ID_VIEW_HELSURFACECAPS
+ MENUITEM "HEL &Blt Caps", ID_VIEW_HELBLTCAPS
+ MENUITEM "HEL &Alpha Caps", ID_VIEW_HELALPHACAPS
+ MENUITEM "HEL &Overlay Caps", ID_VIEW_HELOVERLAYCAPS
+ MENUITEM "HEL &Misc Caps", ID_VIEW_HELMISCCAPS
END
END

@@ -228,7 +230,7 @@
BEGIN
DEFPUSHBUTTON "&OK",IDOK,132,58,50,14
LTEXT "DirectDraw Caps Viewer for Windows CE",-1,15,14,165,8
- LTEXT "Copyright ?1995-2003 Microsoft Corporation",-1,15,28,
+ LTEXT "Copyright ?1995-2003 Microsoft Corporation",-1,15,28,
165,8
LTEXT "Version",-1,15,42,24,8
LTEXT "1.0",-1,40,42,66,8
Index: lbprintf.c
===================================================================
--- lbprintf.c (revision 23142)
+++ lbprintf.c (working copy)
@@ -49,102 +49,8 @@
//
// Error string table
//
-static ERRLIST elErrors[] =
-{
- { DD_OK ,TEXT("DD_OK") },
- { DDERR_ALREADYINITIALIZED ,TEXT("DDERR_ALREADYINITIALIZED")},
- { DDERR_CANNOTATTACHSURFACE ,TEXT("DDERR_CANNOTATTACHSURFACE")},
- { DDERR_CANNOTDETACHSURFACE ,TEXT("DDERR_CANNOTDETACHSURFACE")},
- { DDERR_CURRENTLYNOTAVAIL ,TEXT("DDERR_CURRENTLYNOTAVAIL")},
- { DDERR_EXCEPTION ,TEXT("DDERR_EXCEPTION")},
- { DDERR_GENERIC ,TEXT("DDERR_GENERIC")},
- { DDERR_HEIGHTALIGN ,TEXT("DDERR_HEIGHTALIGN")},
- { DDERR_INCOMPATIBLEPRIMARY ,TEXT("DDERR_INCOMPATIBLEPRIMARY")},
- { DDERR_INVALIDCAPS ,TEXT("DDERR_INVALIDCAPS")},
- { DDERR_INVALIDCLIPLIST ,TEXT("DDERR_INVALIDCLIPLIST")},
- { DDERR_INVALIDMODE ,TEXT("DDERR_INVALIDMODE")},
- { DDERR_INVALIDOBJECT ,TEXT("DDERR_INVALIDOBJECT")},
- { DDERR_INVALIDPARAMS ,TEXT("DDERR_INVALIDPARAMS")},
- { DDERR_INVALIDPIXELFORMAT ,TEXT("DDERR_INVALIDPIXELFORMAT")},
- { DDERR_INVALIDRECT ,TEXT("DDERR_INVALIDRECT")},
- { DDERR_LOCKEDSURFACES ,TEXT("DDERR_LOCKEDSURFACES")},
- { DDERR_NO3D ,TEXT("DDERR_NO3D")},
- { DDERR_NOALPHAHW ,TEXT("DDERR_NOALPHAHW")},
- { DDERR_NOCLIPLIST ,TEXT("DDERR_NOCLIPLIST")},
- { DDERR_NOCOLORCONVHW ,TEXT("DDERR_NOCOLORCONVHW")},
- { DDERR_NOCOOPERATIVELEVELSET ,TEXT("DDERR_NOCOOPERATIVELEVELSET")},
- { DDERR_NOCOLORKEY ,TEXT("DDERR_NOCOLORKEY")},
- { DDERR_NOCOLORKEYHW ,TEXT("DDERR_NOCOLORKEYHW")},
- { DDERR_NOEXCLUSIVEMODE ,TEXT("DDERR_NOEXCLUSIVEMODE")},
- { DDERR_NOFLIPHW ,TEXT("DDERR_NOFLIPHW")},
- { DDERR_NOGDI ,TEXT("DDERR_NOGDI")},
- { DDERR_NOMIRRORHW ,TEXT("DDERR_NOMIRRORHW")},
- { DDERR_NOTFOUND ,TEXT("DDERR_NOTFOUND")},
- { DDERR_NOOVERLAYHW ,TEXT("DDERR_NOOVERLAYHW")},
- { DDERR_NORASTEROPHW ,TEXT("DDERR_NORASTEROPHW")},
- { DDERR_NOROTATIONHW ,TEXT("DDERR_NOROTATIONHW")},
- { DDERR_NOSTRETCHHW ,TEXT("DDERR_NOSTRETCHHW")},
- { DDERR_NOT4BITCOLOR ,TEXT("DDERR_NOT4BITCOLOR")},
- { DDERR_NOT4BITCOLORINDEX ,TEXT("DDERR_NOT4BITCOLORINDEX")},
- { DDERR_NOT8BITCOLOR ,TEXT("DDERR_NOT8BITCOLOR")},
- { DDERR_NOTEXTUREHW ,TEXT("DDERR_NOTEXTUREHW")},
- { DDERR_NOVSYNCHW ,TEXT("DDERR_NOVSYNCHW")},
- { DDERR_NOZBUFFERHW ,TEXT("DDERR_NOZBUFFERHW")},
- { DDERR_NOZOVERLAYHW ,TEXT("DDERR_NOZOVERLAYHW")},
- { DDERR_OUTOFCAPS ,TEXT("DDERR_OUTOFCAPS")},
- { DDERR_OUTOFMEMORY ,TEXT("DDERR_OUTOFMEMORY")},
- { DDERR_OUTOFVIDEOMEMORY ,TEXT("DDERR_OUTOFVIDEOMEMORY")},
- { DDERR_OVERLAYCANTCLIP ,TEXT("DDERR_OVERLAYCANTCLIP")},
- { DDERR_OVERLAYCOLORKEYONLYONEACTIVE,TEXT("DDERR_OVERLAYCOLORKEYONLYONEACTIVE")},
- { DDERR_PALETTEBUSY ,TEXT("DDERR_PALETTEBUSY")},
- { DDERR_COLORKEYNOTSET ,TEXT("DDERR_COLORKEYNOTSET")},
- { DDERR_SURFACEALREADYATTACHED ,TEXT("DDERR_SURFACEALREADYATTACHED")},
- { DDERR_SURFACEALREADYDEPENDENT ,TEXT("DDERR_SURFACEALREADYDEPENDENT")},
- { DDERR_SURFACEBUSY ,TEXT("DDERR_SURFACEBUSY")},
- { DDERR_SURFACEISOBSCURED ,TEXT("DDERR_SURFACEISOBSCURED")},
- { DDERR_SURFACELOST ,TEXT("DDERR_SURFACELOST")},
- { DDERR_SURFACENOTATTACHED ,TEXT("DDERR_SURFACENOTATTACHED")},
- { DDERR_TOOBIGHEIGHT ,TEXT("DDERR_TOOBIGHEIGHT")},
- { DDERR_TOOBIGSIZE ,TEXT("DDERR_TOOBIGSIZE")},
- { DDERR_TOOBIGWIDTH ,TEXT("DDERR_TOOBIGWIDTH")},
- { DDERR_UNSUPPORTED ,TEXT("DDERR_UNSUPPORTED")},
- { DDERR_UNSUPPORTEDFORMAT ,TEXT("DDERR_UNSUPPORTEDFORMAT")},
- { DDERR_UNSUPPORTEDMASK ,TEXT("DDERR_UNSUPPORTEDMASK")},
- { DDERR_VERTICALBLANKINPROGRESS ,TEXT("DDERR_VERTICALBLANKINPROGRESS")},
- { DDERR_WASSTILLDRAWING ,TEXT("DDERR_WASSTILLDRAWING")},
- { DDERR_XALIGN ,TEXT("DDERR_XALIGN")},
- { DDERR_INVALIDDIRECTDRAWGUID ,TEXT("DDERR_INVALIDDIRECTDRAWGUID")},
- { DDERR_DIRECTDRAWALREADYCREATED ,TEXT("DDERR_DIRECTDRAWALREADYCREATED")},
- { DDERR_NODIRECTDRAWHW ,TEXT("DDERR_NODIRECTDRAWHW")},
- { DDERR_PRIMARYSURFACEALREADYEXISTS ,TEXT("DDERR_PRIMARYSURFACEALREADYEXISTS")},
- { DDERR_NOEMULATION ,TEXT("DDERR_NOEMULATION")},
- { DDERR_REGIONTOOSMALL ,TEXT("DDERR_REGIONTOOSMALL")},
- { DDERR_CLIPPERISUSINGHWND ,TEXT("DDERR_CLIPERISUSINGHWND")},
- { DDERR_NOCLIPPERATTACHED ,TEXT("DDERR_NOCLIPPERATTACHED")},
- { DDERR_NOHWND ,TEXT("DDERR_NOHWND")},
- { DDERR_HWNDSUBCLASSED ,TEXT("DDERR_HWNDSUBCLASSED")},
- { DDERR_HWNDALREADYSET ,TEXT("DDERR_HWNDALREADYSET")},
- { DDERR_NOPALETTEATTACHED ,TEXT("DDERR_NOPALETTEATTACHED")},
- { DDERR_NOPALETTEHW ,TEXT("DDERR_NOPALETTEHW")},
- { DDERR_BLTFASTCANTCLIP ,TEXT("DDERR_BLTFASTCANTCLIP")},
- { DDERR_NOBLTHW ,TEXT("DDERR_NOBLTHW")},
- { DDERR_NODDROPSHW ,TEXT("DDERR_NODDROPSHW")},
- { DDERR_OVERLAYNOTVISIBLE ,TEXT("DDERR_OVERLAYNOTVISIBLE")},
- { DDERR_NOOVERLAYDEST ,TEXT("DDERR_NOOVERLAYDEST")},
- { DDERR_INVALIDPOSITION ,TEXT("DDERR_INVALIDPOSITION")},
- { DDERR_NOTAOVERLAYSURFACE ,TEXT("DDERR_NOTAOVERLAYSURFACE")},
- { DDERR_EXCLUSIVEMODEALREADYSET ,TEXT("DDERR_EXCLUSIVEMODEALREADYSET")},
- { DDERR_NOTFLIPPABLE ,TEXT("DDERR_NOTFLIPPABLE")},
- { DDERR_CANTDUPLICATE ,TEXT("DDERR_CANTDUPLICATE")},
- { DDERR_NOTLOCKED ,TEXT("DDERR_NOTLOCKED")},
- { DDERR_CANTCREATEDC ,TEXT("DDERR_CANTCREATEDC")},
- { DDERR_NODC ,TEXT("DDERR_NODC")},
- { DDERR_WRONGMODE ,TEXT("DDERR_WRONGMODE")},
- { DDERR_IMPLICITLYCREATED ,TEXT("DDERR_IMPLICITLYCREATED")},
-};


-
HWND LBCreate( HWND hWnd, HINSTANCE hInst, DWORD pos, BOOL debug )
{
hWndListBox = CreateWindow(
@@ -198,28 +104,3 @@
}


-static LPTSTR getErrorString( HRESULT ddrval )
-{
- int i;
-
- for( i=0;i<sizeof( elErrors )/sizeof( elErrors[0] );i++ )
- {
- if( ddrval == elErrors[i].rval )
- {
- return elErrors[i].str;
- }
- }
-
- return TEXT("Unknown Error Code");
-}
-
-
-void __cdecl LBPrintfRC( HRESULT ddrval, LPTSTR fmt, ... )
-{
- TCHAR buff[512];
-
- wvsprintf( buff, fmt, (LPVOID)(&fmt+1) );
-
- LBPrintf( TEXT("%s, rc=%ld (0x%08lx:%s)"), buff, LOWORD( ddrval ),
- ddrval, getErrorString( ddrval ) );
-}
Index: resource.h
===================================================================
--- resource.h (revision 23142)
+++ resource.h (working copy)
@@ -70,16 +70,19 @@
#define IDC_COMBO_DRIVERS 1035
#define ID_FILE_RESTORE 40001
#define ID_FILE_EXIT 40002
-#define ID_VIEW_DRIVERCAPS 40003
-#define ID_VIEW_DRIVERCOLORKEYCAPS 40004
-#define ID_VIEW_DRIVERFXCAPS 40005
-#define ID_VIEW_DRIVERPALETTECAPS 40006
-#define ID_VIEW_DRIVERSURFACECAPS 40007
-#define ID_VIEW_HELCAPS 40008
+#define ID_VIEW_DRIVERCOLORKEYCAPS 40003
+#define ID_VIEW_DRIVERPALETTECAPS 40004
+#define ID_VIEW_DRIVERBLTCAPS 40005
+#define ID_VIEW_DRIVERALPHACAPS 40006
+#define ID_VIEW_DRIVEROVERLAYCAPS 40007
+#define ID_VIEW_DRIVERMISCCAPS 40008
#define ID_VIEW_HELCOLORKEYCAPS 40009
-#define ID_VIEW_HELFXCAPS 40010
-#define ID_VIEW_HELPALETTECAPS 40011
-#define ID_VIEW_HELSURFACECAPS 40012
+#define ID_VIEW_HELPALETTECAPS 40010
+#define ID_VIEW_HELBLTCAPS 40011
+#define ID_VIEW_HELALPHACAPS 40012
+#define ID_VIEW_HELOVERLAYCAPS 40013
+#define ID_VIEW_HELMISCCAPS 40014
+
#define IDC_STATIC -1

// Next default values for new objects


source 所在位置是 C:\WINCE600\PUBLIC\DIRECTX\SDK\SAMPLES\DXMISC\DDCAPS

build ddcaps 的 command 是:
sysgen -p directx ddcaps
因為 ddcaps 是在 public 下的 directx 目錄,所以 -p 後面要寫 directx ,意思是(path = directx)。
project name 就是 ddcaps.

DirectDraw Capability in CE 6.0

要知道系統哪些 DirectDraw Function 是 hardware support,哪些是用 software emulate,
可以用 IDirectDraw::GetCaps 來取得 ddraw capability 列表:
HRESULT GetCaps(
LPDDCAPS lpDDDriverCaps,
LPDDCAPS lpDDEmulCaps
);

傳進去的兩個 argument 都是用來取出 capability 的 structure pointer,結構完全一樣,一個是 hardware support list,一個是 software emulation list
  • lpDDDriverCaps : hardware
  • lpDDEmulCaps : software
Support List structure 的definition 是 DDCAPS

typedef struct _DDCAPS {
DWORD dwSize;
DWORD dwCKeyCaps;
DWORD dwPalCaps;
DWORD dwBltCaps;
DWORD dwAlphaCaps;
DWORD dwOverlayCaps;
DWORD dwVidMemTotal;
DWORD dwVidMemFree;
DWORD dwVidMemStride;
DWORD dwMaxVisibleOverlays;
DWORD dwCurrVisibleOverlays;
DWORD dwNumFourCCCodes;
DWORD dwAlignBoundarySrc;
DWORD dwAlignSizeSrc;
DWORD dwAlignBoundaryDest;
DWORD dwAlignSizeDest;
DWORD dwRops[DD_ROP_SPACE];
DWORD dwMinOverlayStretch;
DWORD dwMaxOverlayStretch;
DWORD dwMiscCaps;
} DDCAPS,FAR *LPDDCAPS;

每個 DWORD的每個 bit 都代表一個 function,宣告在 ddraw.h (C:\WINCE600\PUBLIC\COMMON\SDK\INC\ddraw.h)

platform builder public folder 附有一個 DDCAPS 的 sample program,可以列出 platform ddraw hardware/software support .
很悲慘的是,ddcaps structure 在 CE 6.0 大幅修改,所以DDCAPS sample code 在 6.0 不能 build 了!!
看這一篇: DirectDraw Migration.




我做了修改: Modify DDCAPS for CE 6.0

8.11.2010

CListBox : ListBox control in WTL

WTL 也包裝了一些 common control,例如 ListBox,名稱叫 CListBox, 在 atlctrls.h.

像 前面的 example : http://realchecko.blogspot.com/2010/05/win32-listbox-control.html
改用 WTL 來寫,就是:
#pragma once
#define WINVER 0x0600

#include <atlbase.h>
#include <atlapp.h>
#include <atlwin.h>
#include <atlctrls.h>

#include "resource.h"

class CMainDialog : public CDialogImpl<CMainDialog>
{
public:
enum {IDD = IDD_DIALOG1 };
int addi;
CListBox list;


BEGIN_MSG_MAP(CMainDialog)
MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)
COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
COMMAND_ID_HANDLER(IDC_BTNADD,OnBtnAdd)
END_MSG_MAP()

LRESULT OnInitDialog(UINT,WPARAM,LPARAM,BOOL&)
{
addi=0;
RETAILMSG(1,(TEXT("OnInitDialog\r\n")));
list.Attach(GetDlgItem(IDC_LIST1));
return TRUE;
}


LRESULT OnCancel(WORD,WORD wID,HWND,BOOL&)
{
::PostQuitMessage(wID);
return 0;
}

LRESULT OnBtnAdd(WORD,WORD wID,HWND,BOOL& hHandled)
{
TCHAR outmsg[10];
swprintf(outmsg,_T("%d"),addi++);
list.AddString(outmsg);
int cnt = list.GetCount();
if(cnt>30)
list.DeleteString(0);
cnt = list.GetCount();
if(cnt>=14)
list.SetTopIndex(cnt-14);
RETAILMSG(1,(TEXT("Button Add\r\n")));
return TRUE;
}

};

CAppModule _Module;

int WINAPI _tWinMain(HINSTANCE hInstance,HINSTANCE,LPTSTR lpstrCmdLine,int nCmdShow)
{
HRESULT hRes = ::CoInitializeEx(NULL,COINIT_MULTITHREADED);
::DefWindowProc(NULL,0,0,0L);
AtlInitCommonControls(NULL);
hRes = _Module.Init(NULL,hInstance);

CMainDialog dlgMain;
hRes = dlgMain.DoModal();
::CoUninitialize();

return hRes;
}

可以看到,大概是用 Attach( GetDlgItem(IDC_LIST1)) 把 WTL class: CListBox 和 ListBox control 建立關係。

相關的說明: http://www.cchsu.com/arthur/prg_bg5/wtl3.htm

8.10.2010

Build Assembly code in VS2005

這是參考 tcpmp 的 project 檔。

大概也跟 eVC 一樣,就是為 assembly.asm 加上 custom build command.
  1. 先把 assembly code 的 source file 寫好
  2. 開啟 VS2005,把 assembly file 加到 source folder 中
  3. 在 assembly file 按右鍵,選 properties
  4. Custom Build Step -- General --Command Line,, 寫armasm.exe -cpu xscale "$(InputPath)" "$(IntDir)/$(InputName).obj"
  5. Output 寫$(IntDir)/$(InputName).obj

8.09.2010

CpuId - 紀錄一下

因為 CE 6.0 沒有辦法 SetKMode,所以只好... 寫一個 driver,然後 load 進去..,

這就是 copy 自 tcpmp getcpuid 的 code 後,run 起來:
  • 我們的: 4117B362,1D152152,0,0
  • 測試的: 410FB764,1D992992,0,0
第一個,cpu id

4117B362:ref(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/CACEDHJG.html)
所以是 ARM1136, rev2

410FB764: ref (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/CACEDHJG.html)
所以是 ARM1176 , rev 4

第二個,cache type register

ref : http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211k/I67616.html

  • [31:29] : always 0
  • [28:25] : ctype - cache type b1110 means "write back","register 7 operation","format C"
  • [24] : separate D and I cache
  • [23:12] : D cache size
  • [11:0] : I cache size
其中 D 和 I cache size encoding format:
  • [11] : P
  • [10:9] : always 0
  • [8:6] : size
  • [5:3] : association (way)
  • [2] : M
  • [1:0] Length
所以
1D152152 : 16K, 4 way, len=32 bytes.
1D992992: 32K, 4 way, len=32 bytes.


driver code

GETID.C:
#include <windows.h>
#include <drvlib.h>


//----- Code Control -----
#define GID_DEBUG

#ifdef DEBUG
DBGPARAM dpCurSettings = { TEXT("Getid"), {
TEXT("Verbose"), TEXT(""), TEXT(""), TEXT(""),
TEXT(""), TEXT(""), TEXT(""), TEXT(""),
TEXT(""), TEXT(""), TEXT(""), TEXT(""),
TEXT(""), TEXT(""), TEXT(""), TEXT("")},
0x00000000
};
#endif

extern void GetCpuId(int,DWORD*);

void SafeGetCpuId(int Id, DWORD* p)
{
memset(p,0,4*sizeof(DWORD));
GetCpuId(Id,p);
}


//--- GID_Init
DWORD GID_Init(DWORD dwContext)
{
DWORD CpuId[4];
DWORD dwErr;
TCHAR outmsg[60];

RETAILMSG(1, (TEXT("[GID] GID_Init+\r\n")));

SafeGetCpuId(0,CpuId);
RETAILMSG(1,(TEXT("%X,%X,%X,%X\r\n"),CpuId[0],CpuId[1],CpuId[2],CpuId[3]));
swprintf(outmsg,TEXT("%X,%X,%X,%X"),CpuId[0],CpuId[1],CpuId[2],CpuId[3]);

MessageBox(NULL,outmsg,TEXT("GID"),MB_OK);


RETAILMSG(1, (TEXT("[GID] GID_Init OK \r\n")));
return TRUE;

}



//--- GID_Deinit
BOOL GID_Deinit(DWORD dwContext)
{
RETAILMSG(1, (TEXT("[GID] GID_Deinit+\r\n")));


return TRUE;
}



//--- GID_Open
DWORD GID_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode)
{
RETAILMSG(1, (TEXT("[GID] GID_Open+\r\n")));

return dwData;
}



//--- GID_Close
BOOL GID_Close(DWORD Handle)
{
RETAILMSG(1, (TEXT("[GID] GID_Close+\r\n")));

return TRUE;
}



//--- GID_Read
DWORD GID_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)
{
RETAILMSG(1, (TEXT("[GID] GID_Read+\r\n")));
return 0;
}



//--- GID_Write
DWORD GID_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes)
{
RETAILMSG(1, (TEXT("[GID] GID_Write+\r\n")));


return 0;
}



//--- GID_Seek
DWORD GID_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod)
{
RETAILMSG(1, (TEXT("[GID] GID_Seek+\r\n")));

return (DWORD) -1;
}



//--- GID_IOControl
BOOL GID_IOControl(
DWORD Handle,
DWORD dwCode,
PBYTE pBufIn,
DWORD dwLenIn,
PBYTE pBufOut,
DWORD dwLenOut,
PDWORD pdwActualOut
)
{

RETAILMSG(1, (TEXT("[GID] GID_IOControl+\r\n")));
return (FALSE);
}

BOOL
GID_DllEntry(
HINSTANCE hinstDll, /*@parm Instance pointer. */
DWORD dwReason, /*@parm Reason routine is called. */
LPVOID lpReserved /*@parm system parameter. */
)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls((HMODULE) hinstDll);
}


return (TRUE);
}


arm.s
INCLUDE kxarm.h

EXPORT GetCpuId

TEXTAREA

LEAF_ENTRY GetCpuId
export GetCpuId
mrs r0,cpsr

and r0,r0,#15
cmp r0,#15
bne UserMode
mrc p15,0,r0,c0,c0,0
nop
nop
mrc p15,0,r2,c0,c0,1
nop
nop
str r0,[r1,#0]
str r2,[r1,#4]
UserMode
mov pc,lr

ref (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0360f/CACEDHJG.html) CpuID 取的是 opcode2 = 0 和 1 : cpu id 跟 cache type.
GETID.DEF
LIBRARY getid

EXPORTS
GID_Init
GID_Deinit
GID_Open
GID_Close
GID_Read
GID_Write
GID_IOControl

sources

TARGETNAME=getid
TARGETTYPE=DYNLINK
RELEASETYPE=PLATFORM

DLLENTRY=GID_DllEntry
DEFFILE=$(_TARGETPLATROOT)\SRC\DRIVERS\getid\getid.def

PREPROCESSDEFFILE=1
SYNCHRONIZE_DRAIN=1
WINCEREL=1

TARGETLIBS= \
$(_COMMONSDKROOT)\LIB\$(_CPUINDPATH)\coredll.lib \

SOURCELIBS= \

SOURCES= \
getid.c \
arm.s


load driver 的程式就是以前哪個 activedriverex( ). 改一下 dll name 就可以


ref http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211k/I67616.html

c0, Core feature ID registers

好像可以得到更多 cpu feature

8.07.2010

to replace t3

t3
  • 500萬 1/2.4" CCD
  • 3x optical zoom
  • 38 - 114 mm
  • F3.5 - F4.4
  • 640 x 480, 30 fps m jpg
  • 2.5" lcd
COOLPIX S620 nt 5980
  • 1,220 萬 1/2.33 英寸 CCD
  • 4倍變焦 28-112mm
  • F2.7-5.8
  • 640 x 480@30fps mjpeg
  • 2.7" lcd
  • VR 光學防震
OLYMPUS FE-4030 nt 5900
  • 1400 萬像素
  • 4X 26 mm 至 105 mm
  • 2.6 (wide) – 5.9 (tele)
  • 640 x 480 @ 30/15 fps mjpeg
  • 2.7" lcd
OLYMPUS μ1070 nt 4999 (costco)
  • 1,200萬
  • 38mm~114mm
  • F3.5(W)~F5.0(T)
  • 640 x 480 @ 30/15 fps mjpeg
  • 2.7" lcd
  • CCD移動式手震校正
FUJI F72EXR nt 5990

8.05.2010

pipeline bubble

利用 assembly 來optimize speed 時,要注意,並不是 instruction line 短就夠了。
還要注意 pipline 的特性。

pipeline 將指令分成幾個 stage:
  • fetch,
  • decode/register read,
  • alu,
  • memory write,
  • register update.
如果這樣個 assembly codes:
ldr r0,#1
add r3,r0,r1
第二行指令在 decode/register read 時,r0 還沒update,因為上一行才執行到alu operation。所以在pipeline中的第二行指令就要停下來,等兩個clock,等上一行指令執行到register update後,才可以繼續。
這樣,就白白浪費 2 個 clock 了。

為了避免這樣的情況,寫 assembly 的時候,就可以在中間插入下面要作的 assembly code,不要白白浪費這兩個clock

在 (很久)前面的文章:yuv - rgb color space convert 的 assembly code 可以看到。最後一個作者的assembly code 就有做到這個(所以整個 code 的 flow 變得不好trace)。實測的結果,也是最快的。

在 Wiki 里也有說明
instruction scheduling
Instruction scheduling is an important optimization for modern pipelined processors, which avoids stalls or bubbles in the pipeline by clustering instructions with no dependencies together, while being careful to preserve the original semantics.

8.04.2010

OEM 自訂 cache mode --- CE 6.0

這一篇 ( http://support.microsoft.com/kb/977855/ ) 超新的... An update that enables the Windows Embedded CE 6.0 kernel to support different cache mode bits is available

是 Microsoft as Windows Embedded CE 6.0 Platform Builder Monthly Update (June 2010). 才支援。

就是在 5.0 以前都有 support 的 OEMARMCacheMode( ) 回報 .

cache

cache 是一小塊和cpu時脈一樣的記憶體,作為 cpu 與 主記憶體間的 buffer。
當 cpu 要讀取 memory 時, cache 先把 memory 的資料讀進 cache 中,然後再讓 cpu 讀取。

cpu 每次讀取的單位是 int (32bit),但是 cache 為求效能,會一次讀入比 int 還多的資料。
cache 每次讀入的資料大小叫 line size,每次讀入的資料放入 一個 line。

cache 就是利用這樣預先讀取的能力,讓cpu 下次需要讀取記憶體時,可以直接由 cache 拿,不需要再向 主記憶體 讀取。


由於 cache 只有小小一塊,所以必須要有一個機制知道 cpu 需要存取記憶體時,那個 address的內容是不是已經在cache 里,如果在,是在 cache 的那一條 line ...

最直覺的方法就是去找每一個 cache line 的 address,看看那一個 line 所以 cache 的 記憶體位址是不是 cpu 現在要的。

這樣個 cache 叫 associative cache.

但是這樣作很耗空間(電路),因為每一個 line 都要作一個 address比較電路。
所以就有比較便宜的作法.. 把 把 address 分成兩部份:

tag, index

以 32 bit 的 address line 為例,可以分成:
  • tag : 31~20
  • index : 19~0
這樣要找cache 時就可以反過來用,用 address的 0~19作 index,找到那個 cache index line 的 tag,然後跟 31~20比較就可以。


後來又有折衷的辦法,就是...每個 index 可以有兩個 tag欄位和lines,這樣,每20 條位址線,就可以共用兩條 cache line。 -- 這就叫 2 way cache.
=>這樣就是:拿 index 找到對應的 2 個 tag ,比較和 address bit 31-20 一步一樣。

一此類推,可以有 4 way cache。

這一篇 (http://www.mirabilisdesign.com/Pages/Demonstrations/systemarchitecture/Cache_System/Functional_Cache_Model_Overview.html)雖然是 sim software 的說明,但是可以看到 ARM11 cache 的 impelement 圖例

cache line size 是 16 words (address 0~3), index size 是 4096 (address 4~15), tag filed 是 address 16~31,




所以 cache index size x byte size x way = cache size

8.02.2010

這個網站很不錯,範圍很廣,軟體與實際的應用.. http://yukuan.blogspot.com/

7.30.2010

CE 6 error : invalid parameters passwd to wince.bat

invalide parameters passed to wince.bat
最近要 show catalog item view 時,出現這個 error dialog,然後 vs2005 就 fail 了。


查到後來是 BSP 設定會自動 SET, UNSET 一些 SYSGEN_XX,所以不知道哪一個 SYSGEN_XX 被修改所導致。

Google 一下,唯一的一個解答,好像是說環境變數造成的....
結果我用 clean system,reinstall CE6 還是一樣會發生.

還沒有查到是哪一個 sysgen parameter..

7.20.2010

Mode Register Set - DDR

DDR 也有一堆參數可以設,但是 Memory 不像 MCU 或 periperial IC 一樣,有 register 可以設。
memory 的 address/data line 直接對應到內部的 cell,沒有 mapping到內部的 register。
所以 DDR Spec 規定了一個 bus pattern ,當 bus pattern 是這樣,A0~A14 就對應要寫入 register 的內容。 這個動作就叫做 Mode Register Set
一般好像 CS, CAS, RAS, WE 都是 low 的時候是 mode register set,這時後 A0~A14 的內容會被解讀為 mod register set command 的 op-code
好像在 chip power up sequence 中有MRS 的階段,所有 DDR 開機都要經過這個階段?有些把這個"寫入 DDR Mode Rester" 的動作叫 Load Mode Register - LMR)

Mode Register Set 還有 Extended Mode Register Set,可以用來設定 DDR 的 auto-refresh type (range) 和 DDR 的 output current/strength。

Mode Register Set 要 MCU 的 control 支援,通常 MCU 的 memory control unit 會提供 EMRS register 和 EMRS-cycle (設定 EMRS 鎖需要的clock)

7.19.2010

DDR

在 DRAM 的設計上,加快 memory core 的 clock rate 比較難,所以都朝著 增加 i/o bus clock 來改進。

DDR 的規格,就是這樣。設法從 memory core 一次提出多一點的 data,然後 queue 住,等 i/o 提取。
這樣就可以增加 i/o 的 clock rate.

RAS - Bank Select。所以 tRAS 就是 Bank open time.
RC - RAW Cycle 。tRC = tRAS + tRP.
Raw Access 的 cycle time =RAS pulse width + Precharge latency
RP 就是 precharge time.

為降低 power ,所以DDR2 由 2.5V 降到 1.8V
工作電壓降低也有助於增加clock rate (voltage swing).

高速後,layout trace delay 的問題也開始要考慮

DDR 解決的方法是在 data strobe 前加上 clock forwarding
DDR2 則再加入 different signal 的要求:DQS, /DQS.


Understanding RAM Timings
CL (CAS Latency) 是說,當 Read Cmd 後,需要多少 clock ,memory 的 data 才能 ready。
所以 CL=3 ,代表 read command 後,還要等 3 個 clock ,才能讀 data。

memory 有所謂的 burst mode,就是當下一個 data 和這一個 data 是連續的時候,下一個 data 不需要等 CL 個clock,可以在下一個 clock 就輸出。

DRAM Access 的 sequence 是這樣:

RAS -- CAS -- CMD -- Data Ready

  • RAS-- CAS 間需要的 clock : tRCD
  • CAS -- CMD 間需要的 clock : CL
  • 下完 PreCharge Command 後,接受下一個command需要的時間 : tRP
ODT - On Deivice Termination
就是把終端電阻放在chip 里,不是 lay在板子上。

SDRAM, DDR, and DDRII 示意圖

這一篇 有很好的圖示,說明 SDRAM, DDR, DDRII 的 clock 差異

因為直接連圖不好意思,所以說明一下大概的原理:

假設 RAM Cell clock 都是 100MHz...
  • SDRAM 的 data 輸出和 data clock 的 rising edge 同步,所以也是 100MHz,因為一次一筆,所以不用 buffer 就直接輸出。
  • DDR 的 data 輸出和 data clock 的 rising edge, falling edge 都同步,所以一樣用 100MHz,但是因為一個edge 只能 output 一筆,所以內部要先 buffer 一份
  • DDR II 把輸出clock 增加一倍,而且也是 rising/falling edge 都輸出,所以內部要 buffer 3 份 data
... 這樣說起來有點奇怪,還是直接看圖好了..
IMGP1396
本來以為內部buffer 的 data 用來解釋 CL (data - to CMD delay) ,但是好像不是喔。
內部 buffer 只需要 delay 待會 才要的 data,第一筆 data 還是可以直接 output 出去,不需要 delay 的喔。

VFP in CE 6.0

有關 CE 6 的 ARM VFP 支援

這一篇 google groupe討論
The VS2005 compiler used by PB for CE6.0 emits no VFP instructions and
unless you implement FPCRT.DLL for an ARM then all CE implementations
are integer (default MS implementation of FPCRT uses software
emulation), even if you have a hardware VFP in your core (e.g. ARM11
or Cortex-A8). To actually use the VFP you must do the following:

1. Use SYSGEN_OEM_FPCRT - catalog item "OEM Floating Point CRT (ARM
only)
2. Download the VFPv2 library support from the ARM website and
incorporate it into your build:
www.arm.com/products/os/windowsce_vfp_dl.html

Instructions are included with the download from ARM.

My tests show a 4x increase in performance on floating point
operations on a release build on an ARM1136JF-S core.

Andrew.

也就是說,CE 6 的 VFP driver(?) library f是由 ARM 提供的。

還有這一篇 MSDN 討論,說
The current version of Windows CE supports the ARMV4I architecture. Cortex A8 it's ARMv7 (ARM's naming can be even more confusing than ms one...) and currently the compiler does not use its specific features (NEON, VFP3 etc.).

The new release of Windows CE (named Windows Embedded Compact 7) will support the ARMv7 architecture.

Here you can find some information about the new features of this release:

http://www.microsoft.com/windowsembedded/en-us/products/windowsce/compact7.mspx

You can download a public beta from connect.microsoft.com.

If your project has not a very short time frame (you plan to release your device Q2 next year, for example), you may consider using this new release for your development to be able to "unleash" all the power of your CPU core.


Valter Minute
Windows Embedded MVP
http://geekswithblogs.net/WindowsEmbeddedCookbook

所以你藥用 CE 6 寫 VFP 或是 NEON 的 code 是不可能的,要等 Windows Embedded 7.

總合起來,可以要看一下 msdn :
Including a Replacement Floating Point C Run-Time Library in a Run-Time Image
還有這一篇的實做 copy 下來,免得不見:

Download and install the "ARM® VFPv2 Floating Point Support Library" from ARM.


If building with Platform Builder to build your OS image

simply add the FPCRT project to your solution, and set the following catalog feature

EVM_3530\Core OS\CEBASE\Applications and Services Development\C Libraries and Runtimes\OEM Floating Point CRT (ARM only)

A SYSGEN is required.


If building without Platform Builder, ensure the SYSGEN variable is set. I added the following to my "tinykernel DEBUG.bat" file.

set SYSGEN_OEM_FPCRT=1

Add entries to platform.bib

fpcrt.dll            $(_FLATRELEASEDIR)\fpcrt.dll               NK  SH
k.fpcrt.dll $(_FLATRELEASEDIR)\fpcrt.dll NK SHMK

I copied the contents of %WINCEROOT%\OTHERS\ARM\VFPv2\src\ARMVFPv2\obj to my prebuilt directory.
Then copied the DLL project to my %WINCEROOT%\OTHERS\ARM\VFPv2\src\FPCRT to my %PLATFORMROOT%\%_TGTPLAT%\src\drivers directory.
Modified dirs, and updated sources to point to new library location.

A SYSGEN is required.

Visual Studio 2008 VFP Support

VS2008 ARM compiler supports emulated and hardware floating point. To enable hardware based Vector Floating point you need to use this option

/QRfpe-

This means not floating point emulation.

If you use

/QRfpe

it will generate software floating point, as it means floating point emulation.

Microsoft KB 947894


Note: This is not related to NEON support



有關 multimedia (video/audio/graphic) 部份,ARM 有提供 OpenMax 的實做 (實際用 ARM11, Cortex A8 feature optimize) 的 library
Khronos Standards
...但是依照慣例,ARM的網頁連結 半年後一定又會改 >_<

要註冊才能download..
喔?是以 library 的方式提供,用 realview compile (當然不是 VS...)

7.12.2010

取得 4 種 size/範圍 的 DC (Device Context)
  • BeginPaint(hwnd, &ps) : 這個範圍最小,只有視窗中,client 的 "invalide" 區域,可以畫。
  • GetDC(hwnd) : 整個 Client area (也就是不含 menu, toolbar, statusbar,...)
  • GetWindowDC(hwnd) : 整個視窗 (含 client area, menu, toolbar , statusbar..)
  • CreateDC("DISPLAY",NULL,NULL,NULL) : 整個螢幕

7.08.2010

Speed up Windows CE boot time

以第一個 application 畫面顯示出來為準...

首先是,,改用 XIP。
XIP 的話,NK 被切成 tiny 和 BINFS 兩部份, bootloader 只要load binfs 就可以開始啟動 os 了,不用把整個 OS bin 都 load 進來 才動作,所以可以比較快。

用 msdn 的 delay load driver - busenum2
一些不急的 driver 等 gwes , ap load 完後再load。這樣 就可以比較快進入 ap.

bootloader
直接 load os,不要 作 2 step loading -- load eboot, eboot load os。這樣可以比較快。



但是怎麼作,好像都要 8 sec 以上,要做出 5 sec 開機好像不可能喔...

bootloader load tinybin, binfs 啟動就花 3 sec
load gwes, gmtt_o 又花 1.6 sec 以上

再加一些其他啦里啦鉔的....

7.05.2010

再作 celog.dll - boot time

因為要作 msdn 那個 delay load driver 的測試,所以把 celog 也 enable 起來:

在 os project 勾選
  • enable event tracking during boot
  • flush tracked event to release directory
然後 修改 makexip.js,把 celog.dll 放到 boot region。


參考 http://msdn.microsoft.com/en-us/library/aa450700.aspx
設定

[HKEY_LOCAL_MACHINE\System\CeLog]
"Transport"="LocalFile"
"FileName"="\\celog.clg"
"ZoneCE"=dword:00014040
"FlushTimeout"=dword:1F4

log 到 ram, 每 500ms flush 到 ram file一次 (避免 data loss)
log 的東西:
  • CELZONE_BOOT_TIME 0x00010000 -- 包含 boot event
  • CELZONE_LOADER 0x00004000 -- 包含 load module (dll) 的 event
  • CELZONE_PROCESS 0x00000040 -- 包含 create process (exe) 的 event
重 build 開機後,就可以看到 celog.clg 在 // 下, copy 到 SD。
開啟 build environment:
 readlog celog.clg output.txt
把 clg 轉為文字。

就可以看到 load module 和 create process event 的時間了。

clone public code

大概就是用 sysgen_capture 這個 tool 來作:

首先找到 sysgen 的 targetname。假設是 celogflush 好了
* 在 platform/yourbspname 下 create 一個 folder : celogflush
* 在 celogflush 下: sysgen_capture -p common celogflush
* copy public/common/sdk/samples/celog/flush/celogflush/flush.c 過來
* 因為 celogflush/sources 有列 include path : ..,所以把 ../*.h 也 copy 過來
* rename 剛剛 sysgen_capture 產生的 sources.celogflush 為 sources
* 修改 sources,把 source = 加上 flush.c
* copy Makefile 過來
這樣就可以下 build,產生 celogflush.exe 了

主要大概是用 sysgen_caputre 產生 target 的 source 檔,這樣才知道 target 用的 library 有哪些。

把 source file copy 過來,修改 sources。
雖然 library 中會有同樣的 sample,但是大蓋會以 source = 列出的優先(吧?)

6.29.2010

The master makefile of Windows CE

真是太感謝 Kun-Yi 啦!

從我進來這裡,RBT 就展示他sysgen XXX 的能力,讓我門少build 一些 code,少浪費一些時間。
但是我問他,怎麼知道 改 OOO 時要用 XXX ?
他也說不出個所以然來
不然就是他不願意說...
所以我就不斷的在找這個謎.....(找了好幾年..)

後來,上一篇,偉大而又無私的 資深 Windows CE 專家 Kun-Ki 直接給出答案:
就是 PUBLIC\COMMON\CESYSGEN\makefile

打開來看,果然有所有 target 的 name 和 dependency..

真是令人感動!!

終於看到 CE 的 master makefile ....

6.28.2010

output message on device on/off - sysgen and private

在查 system poweron/off 時,有時要列印出所以 driver 的 on/off message。
一個一個加很麻煩,可以直接在 device manger 加:
C:\WinCE600\PRIVATE\WINCEOS\COREOS\DEVICE\DEVCORE\Devapi.c
裡面的 DevMgrPowerOffHandler:
原來的
                DEBUGMSG(ZONE_PNP,(TEXT("Calling \'%s\' PowerDown at 0x%x\r\n"),
改為強制輸出的 RETAILMSG 就可以。


在該 folder build 完後,下 sysgen -p common devmgr 後,就可以makeimg 了。



-p common 的意思是 "在 wince600\public\common 下"
-p option 好像是指 public 下的 folder。
所以 sysgen -p common devmgr 的意思是要 sysgen public\common\ 下的 devmgr
-- 雖然不知道怎麼看出common folder 里有 devmgr 這個 target @_@..

可以測試一下:
sysgen -p directx 會 build 出 public\direct 下所有的 directx example
如果只要 build mosquito:
sysgen -p directx mosquito



sysgen 也是一個 batch 檔...

只是我一直找不到那些 sysgen 的 "target" 到底在哪裡...

關於 sysgen 的target ..大概可以到 retail folder 去找,, dll 或是 exe。
用 cesysgen_capture,會產生 該 project 的 sources file,然後去找該 target 是由哪些
library build 出來的。
cesysgen_capture -p common devmgr 
會產生一個 sources.devmgr

sysgen_capture device

會產生一堆 (相依?) 的 source 檔:
  • sources.ceddk -- ceddk.lib
  • sources.devmgr -- devmgr.lib
  • sources.pm -- pm.lib
  • sources.udevice -- udevice.exe
  • sources.device -- device.exe

6.24.2010

operator overwrite : conversion function

在WTL 的source code 看到:
operator HBITMAP() const { return m_hBitmap; }
所以不知道是哪一個 operator 被 overwrite。

有 HBITMAP 這個 operator 嗎?

的確,就是 conversion function

自動型別轉換.
CBitmap theBitmap;
HBITMAP hBitmap;

hBitmap = theBitmap; // 等於是 hBitmap = (HBITMAP)theBitmap;

這個就是 conversion
上面的 example 會讓 hBitmap = theBitmap.m_hBitmap;

... 好像也是為了好看...好吧,還有方便..

smart_ptr in WTL CBitmap

看到 WTL 的 AtlCopyBitmap ( ) 中,有:
CBitmap bmNew = NULL;
..
bmNew.CreateCompatibleBitmap( ..
覺得很奇怪。
所以看一下 CBitmap 的 implement (在 atlgdi.h),, 有這一段:
CBitmapT<t_bManaged>& operator =(HBITMAP hBitmap)
{
Attach(hBitmap);
return *this;
}

void Attach(HBITMAP hBitmap)
{
if(t_bManaged && m_hBitmap != NULL&& m_hBitmap != hBitmap)
::DeleteObject(m_hBitmap);
m_hBitmap = hBitmap;
}

HBITMAP Detach()
{
HBITMAP hBitmap = m_hBitmap;
m_hBitmap = NULL;
return hBitmap;
}

所以是 CBitmap overwrite 了 operator "="
配合 attach, detach 來看,這有點像 smart_ptr 的作法。... 雖然他是handle wrapper,不是 pointer wrapper..

typedef CBitmapT CBitmap;
true 代表 memory management 由 class 自己 handle。


所以那個 CBitmap bmNew = NULL 代表將 bmNew 的 member m_hBitmap 設為 NULL。
這應該只是為了好看吧..否則寫兩行也可以呀:
CBitmap bmNew;
bmNew.m_hBitmap = NULL;

6.23.2010

GDI - SelectObject

DC (Device Context) 是畫布
一堆 GDI 物件:Pen, Brush, Font, Bitmap, ..都是可以畫在畫布(DC)上的物件。


所以要用這些 GDI 畫圖時,要用 SelectObject(DC_A,Object_A) ,告訴kernel 我要 DC_A上用Object_A 畫圖了。

SelectObject( ) 會傳回那個 DC 原來的 Object 內容,讓你畫完後,可以 Select 回來原來物件。
例如原來是 12 點字,後來用 14 點字寫幾個字後,選回原來的 12點字


... 希望這個想法可以用....

6.17.2010

show progress bar when booting - CE

這一篇 說道如何作 開機動畫。

他的作法是在 CE driver 中作,他選 backlight driver。
-- 應該要把 backlight driver 放在前面一點。

在 backlight driver 啟動(Init or PowerOn ?)的時候 create 一個 thread,定時的 update lcd buffer。一直到 Stopflash 的 event 送達。

Stop event 可以由 shell 送出。代表開機完成了。


問題: Driver PowerUp/Down 時好像是 single thread,可以create thread 嗎?

auto_ptr

auto_ptr 是 smart_ptr 的一種。

利用 auto variable 在離開 scope 會自動被 delete 的特性。
讓 一般的 pointer variable 在 new object 後,也有這樣的特性。
這樣,就不必特地在 function return 前 手動 call delete 了。

參考 http://ootips.org/yonat/4dev/smart-pointers.html

原來 pointer 的寫法:
void foo()
{
MyClass* p(new MyClass);
p->DoSomething();
delete p;
}

改用 auto_ptr 後,可以這樣寫:
void foo()
{
auto_ptr<MyClass> p(new MyClass);
p->DoSomething();
}

針對 memory 管理這一點,auto_ptr 還提供一些其他的功能:
  • 指定;當一個 ptr = 另一個 ptr,原來 ptr 的 object 會先 delete 掉。
  • exception handling : 在所有動作作try-catch,這樣當 exception 時,還可以正常 free 掉 object

6.15.2010

Bookmark - Monte Carlo Profiler for CE 6.0 (MSDN)

http://msdn.microsoft.com/en-US/library/ee481579.aspx 這一篇 MSDN 有講 CE 6.0 Monte Carlo Profiler 的作法,可以試試看。

用 target control 下 prof 可以看到help

6.14.2010

WTL - request to send WM_PAINT message

WM_PAIN message 被送出的機會有:
  • OS 發現你的視窗區域需要重劃了,例如:被其他windows 蓋過,size 改變..
  • 你自己呼叫 function,叫 OS 送 message 給你
WTL 里要呼叫 Invalidate( ),實際上是 ATL implement 的,不是 WTL。
在 altwin.h 。
實際上他也是呼叫 InvalidateRect( ) 而已。


順便寫一下 CPaintDC

原本在 Win32SDK 中,要對 DC 作動作,都要 beginpaint, get xx 等一堆,然後畫完又要 endpaint.. etc.

CPaintDC 就把剛剛的動作包裝起來,在 constructor 中作 BeginPain,在Destrctor 作 EndPaint。

又 CPaintDC 繼承自 CDCT。

CDCT 是 WTL 把所有 Win32 的 DC 繪圖包裝起來的 class。
所以一旦生成 CPaintDC 後,就可以任意使用 DC繪圖 function 了。

6.10.2010

Simple Dialog Program with WTL

一個簡單的 Dialog 程式:
main.cpp:
#pragma once
#define WINVER 0x0420

#include <atlbase.h>
#include <atlapp.h>
#include <atlwin.h>

#include "resource.h"

class CMainDialog : public CDialogImpl<CMainDialog>
{
public:
enum { IDD = IDD_MAINDLG };

BEGIN_MSG_MAP(CMainDialog)
COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
END_MSG_MAP()

LRESULT OnCancel(WORD,WORD wID,HWND,BOOL&)
{
::PostQuitMessage(wID);
return 0;
}
};

CAppModule _Module;

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE,LPTSTR lpstrCmdLine, int nCmdShow)
{
HRESULT hRes = ::CoInitialize(NULL);

::DefWindowProc(NULL,0,0,0L);

AtlInitCommonControls(NULL);

hRes = _Module.Init(NULL,hInstance);

CMainDialog dlgMain;
hRes = dlgMain.DoModal();

_Module.Term();
::CoUninitialize();

return hRes;
}

resource.h
#define IDD_MAINDLG 101

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

resource.rc 就是一個 dialog,沒有 button。


奇怪,現在我自己照著作,反而要改這樣:
.c
#pragma once
#define WINVER 0x0600

#include <atlbase.h>
#include <atlapp.h>
#include <atlwin.h>

#include "resource.h"

class CMainDialog : public CDialogImpl<CMainDialog>
{
public:
enum { IDD = IDD_DIALOG1 };

BEGIN_MSG_MAP(CMainDialog)
COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
END_MSG_MAP()

LRESULT OnCancel(WORD,WORD wID,HWND, BOOL&)
{
::PostQuitMessage(wID);
return 0;
}
};

CAppModule _Module;

int WINAPI _tWinMain(HINSTANCE hInstance,HINSTANCE,LPTSTR lpstrCmdLine,int nCmdShow)
{
HRESULT hRes = ::CoInitializeEx(NULL,COINIT_MULTITHREADED);
::DefWindowProc(NULL,0,0,0L);
AtlInitCommonControls(NULL);
hRes = _Module.Init(NULL,hInstance);

CMainDialog dlgMain;
hRes = dlgMain.DoModal();
::CoUninitialize();

return hRes;
}


.h 大概就跟上面一樣。

Close button on Dialog Menu

原來 msdn 有寫

Dialog Create 時有加上 "WS_SYSMENU" flag 的話,dialog 上方就會出現 menu bar,然後有 minimize, maximum, close 三個方塊在右邊。

當按下 close 方塊時,windows 會送出 IDCANCEL 這個 command。

所以要加上 IDCANCEL 的 command id handler ,才會關掉 dialog。

6.09.2010

WTL : the simple ATL Windows Program


#define STRICT
#define VC_EXTRALEAN

#include <atlbase.h>
#include <atlwin.h>

class CMyWindow : public CWindowImpl<CMyWindow,CWindow,CFrameWinTraits>
{
public:
DECLARE_WND_CLASS(_T("My Window Class"))

BEGIN_MSG_MAP(CMyWindow)
MESSAGE_HANDLER(WM_CLOSE, OnClose)
MESSAGE_HANDLER(WM_DESTROY,OnDestroy)
END_MSG_MAP()

LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
DestroyWindow();
return 0;
}

LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
PostQuitMessage(0);
return 0;
}
};


int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, LPTSTR szCmdLine, int nCmdShow)
{

CMyWindow WndMain;
MSG msg;

if (NULL == WndMain.Create(NULL,CWindow::rcDefault,_T("Hello")))
{
return 1;
}

WndMain.ShowWindow(nCmdShow);
WndMain.UpdateWindow();

while(GetMessage(&msg,NULL,0,0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return msg.wParam;
}

可以用在 Win32 和 Win32_CE 上。

ISDBT Error Correction Code

ISDBT 信號使用 Reed Solomoon 作 Error Correction Code。

有時候,為了要能測試出 RF 接收的特性,必須把接收端的 Reed Solomoon Correction 關閉。

6.07.2010

WTL : Windows Template Library

WTL 是 Template Library,所以安裝的方法就是解開後,把 WTL\include 加到 project 的 include path 里就可以。
Tools--Options--ProjectAndSolutions--VC++Directory
這個option 每個 platform (Win32, Ce, SmartPhone..) 都不樣,所以要一一設定。


AppWiz 是安裝 WTL AppWizard 的javascript,根據 VS的不同,有不同的 script
  • setup80x.js 是 for VS2005 express 版本,但是 express 版不包含 ATL,所以要而外安裝一版 platform SDK 。
  • 也有提供 WinCE版本的 wizard install script
Wizard 執行完後,New Project,選 WTL, Dialog base ,就可以create 一個 dialog program。

就先由 Sample 的:ImageView 作練習,sample 是 for smart phone,照著 copy 到 standard sdk


看 起來好像是 SDI application。所以用 Wizard create 一個 SDI..
一開始就遇到一個問題....CString 宣告不認識 -- 結果好像是 WTL8 有改了,要 include atlmisc.h。


感覺起來就是利用 template ,做到針對 function implement class/template。
使用時依照需要繼承 class/template,然後改寫某 function。
這就跟 RBT 的 coding 構想一樣:找class繼承,然後修改

這樣的設計理念應該是每個 class/template 只做一件事。使用的方法就是繼承,修改,然後生成。

另一種理念應該是...萬能的 class,使用發法是生成(給予適當參數),然後使用。
所以 WTL 的程式設計好像是...了解MFC 原來 一些 event hander -- OnCreate, OnPaint, OnClick,,,, 在 WTL 中處理的 template/class,依照需要的時候繼承下來,然後就可以改寫 那些event handler。


唉~~對於 FrameWindow 跟 Window 的區別還是不了解..

在 atlcrack.h 的 BEGIN_MSG_MAP_EX 註解:
// Note about message maps with cracked handlers:
// For ATL 3.0, a message map using cracked handlers MUST use BEGIN_MSG_MAP_EX.
// For ATL 7.0 or higher, you can use BEGIN_MSG_MAP for CWindowImpl/CDialogImpl derived classes,
// but must use BEGIN_MSG_MAP_EX for classes that don't derive from CWindowImpl/CDialogImpl.
所以繼承 CWindowImpl和 CDialogImpl的話,就可以用 BEGIN_MSG_MAP,如果不是繼承這兩個,就要用 BEGIN_MSG_MAP_EX (?)
CWindowImpl和CDialogImpl 定義在 ATL。
  • CWindow (也定義在ATL),只包含 HWND這個資料結構的內容,還有一些標準 WIN32 function 。並沒有做出 message loop,message handler 這樣的架構出來。
  • CWindowImpl 就有 implement message loop/handler 的架構。
所以
  • 繼承 CWindow 的話,要自己作 message loop/handler -- WTL 提供 BEGIN_MSG_MAP_EX 這類 macro。
  • 繼承 CWindowImpl 的話,已經有 message loop 了,就用 BEGIN_MSG_MAP 就可以。
ATL 有關 Windows 部份可以參考 MSDN
http://wtl.wikispaces.com/ 這個有比較好的wiki說明。

6.04.2010

IJG - Inependent JPEG Group

IJG 提供一個JPEG 操作的 library,目前已經到 v8,有持續在 update。

download source code 下來後,看一下 install.txt,裡面有說在各 platform 的 build 方法。
在 Windows VC 的話,分為兩種:
  • 使用 command line
  • 使用 VS 開project
用 VS 開 project 的方法我不會用,project 開起來會 fail,所以我只好用 command line 的方法:
  1. VC command build 用 makefile.vc,config file 用 jconfig.vc
  2. 所以先 copy 一份 jconfig.vc 為 jconfig.h
  3. nmake -f makefile.vc
OK。

要注意,在 VC Command line 下 build,要先 run 過 VC 目錄下的 SETVCVAR.BAT 設好path.


build 好後:
  • cjpeg.exe 是壓縮
  • djpeg.exe 是解壓縮


看makefile.vc 可以看一下 libjpeg 的 source,
依照 compress,decompress分成
CLIBOBJECTS= jcapimin.obj jcapistd.obj jcarith.obj jctrans.obj jcparam.obj \
jdatadst.obj jcinit.obj jcmaster.obj jcmarker.obj jcmainct.obj \
jcprepct.obj jccoefct.obj jccolor.obj jcsample.obj jchuff.obj \
jcdctmgr.obj jfdctfst.obj jfdctflt.obj jfdctint.obj

DLIBOBJECTS= jdapimin.obj jdapistd.obj jdarith.obj jdtrans.obj jdatasrc.obj \
jdmaster.obj jdinput.obj jdmarker.obj jdhuff.obj jdmainct.obj \
jdcoefct.obj jdpostct.obj jddctmgr.obj jidctfst.obj jidctflt.obj \
jidctint.obj jdsample.obj jdcolor.obj jquant1.obj jquant2.obj \
jdmerge.obj

只需要 decompress 的就只要 build DLIBOBJECTS 就可以

CPU 與週邊 的速度

CPU 跑 600,週邊 IO 的 clock 是 60。
所以當 CPU 對 GPIO register 寫資料時,是同步在 60MHz...


ldr r0, =GPIO1_PAD_EN
mov r1, #0x00100000 ; pin 20
str r1,[r0]
ldr r0, =GPIO1_CTRL20
mov r1,#0x120
mov r2,#0x160
1
str r1,[r0]
nop
str r2,[r0]
nop
b %b1

這一段 code,有沒有加 nop 輸出的方波都是 10MHz。
但是把 nop 改為

str r1,[r0]
str r1,[r0]
str r2,[r0]
str r2,[r0]
b %b1

這樣改完,輸出方波變成 5MHz。


也就是說..如果一直 polling 週邊得的話,就等於是用 60MHz 在跑....

5.28.2010

Win32 Listbox Control 的操作

有時候要簡單的 log 來 show message,但是又不是 console mode ,這樣就要拉一個 ListBox 來作。

ListBox 的操作: MSDN - Listbox

首先 Win32 的 Control 就是預先寫好的小Dialog Window,所以要控制 Control Item ,只有用 SendMessage 的方式。

這種已經寫好的 Control (DialogWindow),每次要送message 過去,還要先從 ID 取得 hWnd 再送,有點麻煩,所以 Win32 提供一個直接對 ID 送 Message 的 function
SendDlgItemMessage
ListBox 的控制,用在 show log 的化,簡單的就是:
  1. 加入Item
  2. 移動 List
  3. 刪除 Item
三個都是用 SendDlgItemMesage 來完成的,三個function 的 Message ID 不一樣:
  1. 加入 Item : LB_ADDSTRING
  2. 移動List : LB_SETTOPINDEX
  3. 刪除 Item : LB_DELETESTRING
另外,ListBox 有一個 property - Sort,可以設定是否自動對 Item 排序,在作 Log 用時當然是不需要,但是 default 是 TRUE,要記得改。

ADDSTRING default 是作 "Append",所以剛好符合 log 的動作,從後面加上去。

ListBox 雖然有 scroll bar ,但是不會自己scroll 到最後,所以要用 LB_SETTOPINDEX 來指定第一個顯示的 item,好移動 scrollbar。
但是因為要讓最後一行對齊最後,所以反而要先用 LB_GETCOUNT 取得所有 item 的數量,自己減去 list 一面的 item 數好找到最後一頁的第一個 item 的 index...


以下就是簡單的 sample code,只有兩個 button - add, clear(all) 和一個 14 行的 list。
list 只保持 30 個 item,每按一下 add,就會加一行。
#include "stdafx.h"
#include <windows.h>
#include "ListBoxTest.h"


BOOL CALLBACK DialogProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
static int i=0;
switch (uMsg)
{
case WM_INITDIALOG:

return TRUE;
case WM_CLOSE:
EndDialog(hWnd,0);
return TRUE;
case WM_COMMAND:
switch(wParam)
{
case IDC_ADD :{
TCHAR outmsg[10];
swprintf(outmsg,_T("%d"),i++);

SendDlgItemMessage(hWnd,IDC_LIST1,LB_ADDSTRING,0,LPARAM(outmsg));
int cnt=SendDlgItemMessage(hWnd,IDC_LIST1,LB_GETCOUNT,0,0);
if(cnt>30)
SendDlgItemMessage(hWnd,IDC_LIST1,LB_DELETESTRING,0,0);
cnt=SendDlgItemMessage(hWnd,IDC_LIST1,LB_GETCOUNT,0,0);
if(cnt>=14)
SendDlgItemMessage(hWnd,IDC_LIST1,LB_SETTOPINDEX,cnt-14,0);
return TRUE;
}
case IDC_CLEAR:{
int cnt=SendDlgItemMessage(hWnd,IDC_LIST1,LB_GETCOUNT,0,0);
while(cnt-->0)
SendDlgItemMessage(hWnd,IDC_LIST1,LB_DELETESTRING,0,0);
return TRUE;
}
default:
return FALSE;
}
default:
return FALSE;
}
}


WTL 有包裝 ListBox,使用 WTL 的 example 是 http://realchecko.blogspot.com/2010/08/clistbox-listbox-control-in-wtl.html

5.21.2010

Change Mass Storage Volume Name/Label

變更 Mass Storage 的 Volume Name/Label

在這一篇 http://geekswithblogs.net/KMOS/archive/2010/04/17/fat-volume-and-ce.aspx
還有這一篇 http://www.tech-archive.net/Archive/WindowsCE/microsoft.public.windowsce.platbuilder/2010-04/msg00220.html

大概就是去改:public\common\oak\drivers\fsd\fatutil\MAIN\ 下面的檔案
很複雜

5.17.2010

tcpmp - sample prorgram

在 sample folder 下有比較簡單的 main sample:
把 sample_win32.c , dumpoutput.c, dumpoutput.h 拷貝到 player.c

開啟 player.sln,把原來的 source remove 掉,加入上面的兩個 .c。
build OK。

還沒測..

complian 一下 .... 無關的東西...其實是自己不好 XD

有點詞窮..
 {array Node;
...
struct node* Platform;
...}
Node 這個詞到處在用,還分大小寫..當 structure name,又當 variable name...
懷疑是不是故意的..
最好是 struct node* Platform 實際上是從 array Node 中挑出一個來的。

好像有用到 Singletone pattern,用 struct context *Context() 取出唯一的 context 指標。

用 C++寫就好,幹嘛要用C寫,然後又要做出C++的東西 (default constructer,class hierachy,function overwrite.. abstrator overwrite etc)。

用 define function 作 cast pointer 真是糟糕,看起來是 argument,卻拿來作 cast name。

然後整個 project sourcecode 就是 node 來 node 去的,什麼名字都有node,也就等於什麼名字都沒有 node...(難怪會重寫)

Module Name 先放在 string table裡,每個 id 代表一個 Module Name,然後再用 Id 來 load module。

還有..
 stringdef Def;
stringdef* Ptr = &Def;
..
(,,, &Ptr,,,)
這樣的code..

nodedef : node的定義,包含..
  • load setting
  • ID
  • parent class (的ID)
  • priority (?)
  • 這個 node (class?) 的 create function
  • delete function
ID 系統,使用 FOURCC : 四個 char (0x00~0xFF) 組成 8x4=32 bit (一個 int)。

又有node,又有 class,node define 的東西是 class。

static function,第一個 argument 在所有的caller 都是一樣的值,那為什麼不直接 reference ? 還要多一個標準?

NodeClass 就要用 FindClass 來操作。 -- 因為 FindClass 內部只對 NodeClass 這個 member 操作。(隱含的)

一堆 node, class 都 initial 完後,在 global unique variable - Context( ) 的 array xxx 就已經都註冊好所有 id 和對應的 create function。

NoteCreate( classid) 會從 context array 中找到那個 classid 的 node..
  1. LoadLibrary
  2. Call DLLRegister
  3. load parent class/node (recursive)
  4. call node 的 Create( )
所有都 Initialize 完後,call INTERFACE_ID 這個 class 起來 --- 這個 class 用 WinPopupClass( ) 叫起
又是一個 特例。所以 interface 這個 node 要用 NodeCreate( ) 出來後,要手動 cast 成 (win*) 然後取出 Popup( )

5.13.2010

code reading - tcpmp, node


NodeLoadModule( )
{
Module = LoadLibrary(path);
Proc = GetProcAddress(Module,"DLLRegister");
Result = (Proc)();
}

所有的 Node 在被 NodeLoadModule( ) load 進去的時候,Node 的 DLLRegister( ) 會被呼叫。

所以 node.h 中有宣告:

DLLEXPORT int DLLRegister(int ContextVersion);
DLLEXPORT void DLLUnRegister();

所有 作為 Node的 DLL ,都要 include node.h,所以都要 implement DLLRegister( ) 。

Node 的使用用類似 IOControl 的方式,統一一個 funciton interface : Set( ) ,再把需要的功能以 control code 傳進 Set( ) function:

Node->Set(Node,Msg,&Data,Size);

Node 的宣告是:
typedef struct node
{
int Class;
nodeenum Enum;
nodeget Get; //typedef int (*nodeget)(void* This,int No,void* Data,int Size);
nodeset Set; //typedef int (*nodeset)(void* This,int No,const void* Data,int Size);
} node;

...找不到 node 初值(內容) 設定的部份。

nod.Get, Set 設定是在 node 的 Create( ) 。
以 platform 為例:static int Create(platform* p)
{
cpudetect Info;
p->Node.Enum = (nodeenum)Enum;
p->Node.Get = (nodeget)Get;
p->Node.Set = (nodeset)Set;
p->Model = MODEL_UNKNOWN;
在 NodeRegisterClass( ) 時,該 Node的 Create( ) function 會被呼叫。

notes - code reading of ffmpeg


AVCodec h264_decoder = {
"h264", //name
CODEC_TYPE_VIDEO, //type
CODEC_ID_H264, //id
sizeof(H264Context), //private data size
decode_init, // (*init)()
NULL, // (*encode)()
decode_end, // (*close)()
decode_frame, // (*decode)()
/*CODEC_CAP_DRAW_HORIZ_BAND |*/ CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY, //capability
NULL, //next
flush_dpb, // (*flush)()
};

5.12.2010

Try VLC for WINCE

雖然網站說 因為沒有 developer 對這個有興趣,所以ce 的 port 中止了,
但是還有是 for CE 的 nightly build 可以 download (不知道是不是因為 auto build 的關係)

http://nightlies.videolan.org/build/wince/?C=M;O=D

說明是 for XScale,還是 dowload 下來試試。

使用KITL 來 run ,結果有 message ; find no plugin, check --plugin-path
所以改用 target control 來 run , command:
>s SDMMC\vlc\vlc --plugin-path SDMMC\vlc\plugins
就可以 load plugins 的 dll 了。
結果 load lib555 出現 exception
PB Debugger Loaded 'liblive555_plugin.dll', no matching symbolic information found.
Exception 'Data Abort' (4): Thread-Id=059c003e(pth=8e23815c), Proc-Id=059b002a(pprc=8ddbc36c) 'vlc.exe',
VM-active=059b002a(pprc=8ddbc36c) 'vlc.exe'
PC=42f14df8(liblive555_plugin.dll+0x00084df8) RA=42f0a1a8(liblive555_plugin.dll+0x0007a1a8) SP=0011f848,
BVA=6d9dc460

Data Abort: 0xC0000005 0x42F14DF8
把lib555 拿掉試試看..
變成
PB Debugger Loaded 'libyuy2_i422_plugin.dll', no matching symbolic information found.
PB Debugger Loaded 'libzip_plugin.dll', no matching symbolic information found.
Exception 'Raised Exception' (-1): Thread-Id=045f002e(pth=8e23815c), Proc-Id=05fc002a(pprc=8ddbc36c) 'vlc.exe',
VM-active=05fc002a(pprc=8ddbc36c) 'vlc.exe'
PC=4002c508(coredll.dll+0x0001c508) RA=93b3c4c8(kernel.dll+0x000064c8) SP=0011f648, BVA=ffffffff
一樣,rename掉,繼續..
奇怪,fail在
B Debugger Loaded 'libyuy2_i422_plugin.dll', no matching symbolic information found.
Exception 'Raised Exception' (-1): Thread-Id=0591003a(pth=8e23815c), Proc-Id=058a005a(pprc=8e946000) 'vlc.exe', VM-active=058a005a(pprc=8e946000) 'vlc.exe'
PC=4002c508(coredll.dll+0x0001c508) RA=93b3c4c8(kernel.dll+0x000064c8) SP=0011f648, BVA=ffffffff
猜是 memory 不夠的問題,刪掉一堆dll看看.

5.10.2010

ceappcompat.exe -- check if app runnable on CE 6.0

原來 CE 6.0 有附一個工具 ceappcompat.exe ,可以用來檢查 5.0 的 ap 在 6.0 能不能 run.

在:
http://blogs.msdn.com/mikehall/archive/2006/11/04/ceappcompat-location.aspx

C:\WINCE600\PUBLIC\COMMON\OAK\BIN\I386

tcpmp for WINCE 6.0

tcpmp 啟動時會自動 load 目錄下所有的 *.plg 檔。
其實這些檔就是 DLL,但是為了防止load 到騎他program 的 DLL,所以rename 成 plg。

tcpmp 的 VS2005 project 是一個基本的 project,只包涵 network, mpeg1.. etc 等少數的 codec 在裡面,這些 codec project 會 build 成 *.plg 檔,放在 release/output folder 中。

其他 project (ffmpeg, aac, ac3..) 要 build 的話,可以直接開啟該 codec project 的 vcp (for eVC 得的那個,不是VC6的),然後修改一下:
  • 要 把 common.lib 加入 -- 要把 common.lib 所在path 加到 linker 的 Additional Library Direction 中。把 common.lib 加到 Linker - Input - Additional Dependency 中
  • 修改 Linker - Output File : $(OutDir)\$(ProjectName).plg
  • 修改 Linker - Debugging - Generate Program Database : $(OutDir)/ffmpeg.pdb
這樣就可以了。
也可以直接把project 加到 tcpmp 中。

tcpmp 有使用 類似 llvm 的技巧,在 port.h 中定義 CONFIG_DYNCODE。
undefine 的話就可以不用 (但是code 沒有很完全)。

tcpmp 啟動會 load *.txt ,這是原來在 language folder 下的 界面字串定義檔,所以也要 copy 到 執行目錄下。





diff --git a/common/blit/blit_arm_fix.c b/common/blit/blit_arm_fix.c
index 7af2299..6131e95 100644
--- a/common/blit/blit_arm_fix.c
+++ b/common/blit/blit_arm_fix.c
@@ -25,7 +25,7 @@
#include "../dyncode/dyncode.h"
#include "blit_soft.h"

-#if defined(ARM)
+#if defined(ARM) && defined(CONFIG_DYNCODE)

typedef struct stack
{
diff --git a/common/blit/blit_arm_gray.c b/common/blit/blit_arm_gray.c
index 9b7797b..8d8b636 100644
--- a/common/blit/blit_arm_gray.c
+++ b/common/blit/blit_arm_gray.c
@@ -25,7 +25,7 @@
#include "../dyncode/dyncode.h"
#include "blit_soft.h"

-#if defined(ARM)
+#if defined(ARM) && defined(CONFIG_DYNCODE)

typedef struct stack
{
diff --git a/common/blit/blit_arm_half.c b/common/blit/blit_arm_half.c
index a59d66c..089109d 100644
--- a/common/blit/blit_arm_half.c
+++ b/common/blit/blit_arm_half.c
@@ -29,7 +29,7 @@
// DstAlignPos 4
// SrcAlignPos 2

-#if defined(ARM)
+#if defined(ARM) && defined(CONFIG_DYNCODE)

typedef struct stack
{
diff --git a/common/blit/blit_arm_packed_yuv.c b/common/blit/blit_arm_packed_yuv.c
index 494721b..871bd36 100644
--- a/common/blit/blit_arm_packed_yuv.c
+++ b/common/blit/blit_arm_packed_yuv.c
@@ -25,7 +25,7 @@
#include "../dyncode/dyncode.h"
#include "blit_soft.h"

-#if defined(ARM)
+#if defined(ARM) && defined(CONFIG_DYNCODE)

typedef struct stack
{
diff --git a/common/blit/blit_arm_rgb16.c b/common/blit/blit_arm_rgb16.c
index 3c153f1..6de28fb 100644
--- a/common/blit/blit_arm_rgb16.c
+++ b/common/blit/blit_arm_rgb16.c
@@ -25,7 +25,7 @@
#include "../dyncode/dyncode.h"
#include "blit_soft.h"

-#if defined(ARM)
+#if defined(ARM) && defined(CONFIG_DYNCODE)

// R0..R6 temporary
// R7 Pos(when Stretch)
diff --git a/common/blit/blit_arm_stretch.c b/common/blit/blit_arm_stretch.c
index 5855d9c..be36ed8 100644
--- a/common/blit/blit_arm_stretch.c
+++ b/common/blit/blit_arm_stretch.c
@@ -27,7 +27,7 @@
#include "../dyncode/dyncode.h"
#include "blit_soft.h"

-#if defined(ARM)
+#if defined(ARM) && defined(CONFIG_DYNCODE)

typedef struct stack
{
diff --git a/common/blit/blit_arm_yuv.c b/common/blit/blit_arm_yuv.c
index 3e4d612..38ae8cd 100644
--- a/common/blit/blit_arm_yuv.c
+++ b/common/blit/blit_arm_yuv.c
@@ -29,7 +29,7 @@
// DstAlignPos 8
// SrcAlignPos 8

-#if defined(ARM)
+#if defined(ARM) && defined(CONFIG_DYNCODE)

// R0..R4 temporary
// R5 DiffMask (when Diff)
diff --git a/common/blit/blit_soft.c b/common/blit/blit_soft.c
index 3b8770c..f4cb08f 100644
--- a/common/blit/blit_soft.c
+++ b/common/blit/blit_soft.c
@@ -1795,7 +1795,7 @@ static bool_t BlitCompile(blit_soft* p,
p->SrcPos[i] = BitMaskPos(p->Src.BitMask[i]);
}

-#if defined(ARM)
+#if defined(ARM) && defined(CONFIG_DYNCODE)
if ((p->Dst.Flags & PF_RGB) && p->Dst.BitCount==16 && !p->SrcYUV)
Any_RGB_RGB(p);
if (!p->SrcYUV && DstPlanarYUV && p->RScaleX==16 && p->RScaleY==16)
@@ -1848,11 +1848,14 @@ static bool_t BlitCompile(blit_soft* p,
}
#endif

+#if defined(ARM) && defined(CONFIG_DYNCODE)
+
CodeBuild(&p->Code);
if (p->Code.Size)
p->Entry = (blitsoftentry)p->Code.Code;
else
p->Entry = NULL;
+#endif

#if defined(_M_IX86) && !defined(TARGET_SYMBIAN)

diff --git a/common/blit/blit_wmmx_fix.c b/common/blit/blit_wmmx_fix.c
index 6ffb3bb..1b3ec38 100644
--- a/common/blit/blit_wmmx_fix.c
+++ b/common/blit/blit_wmmx_fix.c
@@ -32,7 +32,7 @@
// RScale==32 && !SwapXY 16x4 -> 8x2
// RScale==32 && SwapXY 4x16 -> 8x2

-#if defined(ARM)
+#if defined(ARM) && defined(CONFIG_DYNCODE)

typedef struct stack
{
diff --git a/common/cpu/cpu.c b/common/cpu/cpu.c
index a68bad6..6e410d1 100644
--- a/common/cpu/cpu.c
+++ b/common/cpu/cpu.c
@@ -64,8 +64,14 @@ void CPUDetect(cpudetect* p)

#ifdef ARM
p->Arch = T("ARM");
- SafeGetCpuId(0,CpuId);
+ //SafeGetCpuId(0,CpuId);

+ p->ICache = 16*1024;
+ p->DCache = 16*1024;
+ Caps |= CAPS_ARM_GENERAL;
+ p->Model = T("1020E");
+ Caps |= CAPS_ARM_5E;
+/*
if (CpuId[0])
{
p->ICache = 512 << ((CpuId[1] >> 6) & 7);
@@ -156,7 +162,7 @@ void CPUDetect(cpudetect* p)
}
}
}
-
+*/
#elif defined(MIPS)
SafeGetCpuId(0,CpuId);
p->Arch = T("MIPS");
diff --git a/common/pcm/pcm_arm.c b/common/pcm/pcm_arm.c
index 8ebe96e..269fdc1 100644
--- a/common/pcm/pcm_arm.c
+++ b/common/pcm/pcm_arm.c
@@ -25,7 +25,7 @@
#include "../dyncode/dyncode.h"
#include "pcm_soft.h"

-#if defined(ARM)
+#if defined(ARM) && defined(CONFIG_DYNCODE)

typedef struct stack
{
diff --git a/common/portab.h b/common/portab.h
index 3b47674..bce4701 100644
--- a/common/portab.h
+++ b/common/portab.h
@@ -71,7 +71,7 @@
#endif

#if defined(ARM) || defined(MIPS) || defined(SH3)
-#define CONFIG_DYNCODE
+#undef CONFIG_DYNCODE
#endif

#if defined(_M_IX86)
diff --git a/common/win32/platform_win32.c b/common/win32/platform_win32.c
index 0df8c42..78ae591 100644
--- a/common/win32/platform_win32.c
+++ b/common/win32/platform_win32.c
@@ -670,7 +670,7 @@ void Platform_Init()

BacklightEvent = CreateEvent(NULL, FALSE, FALSE, T("TIMEOUTDISPLAYOFF"));

- Power_Init();
+ //Power_Init();
#endif

if (!Context()->CodePage)
@@ -976,6 +976,7 @@ bool_t GetDisplayPower()

int SetDisplayPower(bool_t State,bool_t Force)
{
+/*
VIDEO_POWER_MANAGEMENT VPM;
HDC DC;

@@ -991,6 +992,7 @@ int SetDisplayPower(bool_t State,bool_t Force)
ExtEscape(DC, SETPOWERMANAGEMENT, sizeof(VPM), (LPCSTR) &VPM, 0, NULL);
ReleaseDC(NULL, DC);
}
+*/
return ERR_NONE;
}

diff --git a/common/win32/str_win32.c b/common/win32/str_win32.c
index 77bc3bf..04f8a34 100644
--- a/common/win32/str_win32.c
+++ b/common/win32/str_win32.c
@@ -24,6 +24,7 @@
#include "../common.h"
#include "../gzip.h"

+
#define MAXTEXT 20000

#if defined(TARGET_WIN32) || defined(TARGET_WINCE)
diff --git a/interface/win32/interface.c b/interface/win32/interface.c
index ac68894..375060f 100644
--- a/interface/win32/interface.c
+++ b/interface/win32/interface.c
@@ -2765,10 +2765,12 @@ static bool_t Proc(intface* p, int Msg, uint32_t wParam, uint32_t lParam, int* R
break;

case WM_KEYUP:
+/*
#if defined(TARGET_WINCE)
if (!GetDisplayPower())
SetDisplayPower(0,1);
#endif
+*/
Key = WinKeyState(KeyRotate(p,wParam));
for (i=0;i<HOTKEYCOUNT;++i)
if (p->HotKey[i] && (p->HotKey[i] & ~HOTKEY_KEEP) == Key)
@@ -2792,6 +2794,7 @@ static bool_t Proc(intface* p, int Msg, uint32_t wParam, uint32_t lParam, int* R
break;

case WM_HOTKEY:
+/*
#if defined(TARGET_WINCE)
if ((LOWORD(lParam) & MOD_KEYUP))
{
@@ -2800,7 +2803,8 @@ static bool_t Proc(intface* p, int Msg, uint32_t wParam, uint32_t lParam, int* R
}
else
#endif
- PostMessage(p->Win.Wnd,WM_COMMAND,wParam,0);
+*/
+ PostMessage(p->Win.Wnd,WM_COMMAND,wParam,0);
*Result = 0;
return 1;

diff --git a/interface/win32/win_win32.c b/interface/win32/win_win32.c
index 7c92a1f..821cbe4 100644
--- a/interface/win32/win_win32.c
+++ b/interface/win32/win_win32.c
@@ -2592,6 +2592,7 @@ static void HandleMessage(win* p,MSG* Msg)
{
int Result;

+/*
#if defined(TARGET_WINCE)
if (Msg->message == WM_HIBERNATE)
{
@@ -2599,7 +2600,7 @@ static void HandleMessage(win* p,MSG* Msg)
NodeHibernate();
}
#endif
-
+*/
if (Msg->message >= WM_APP + 0x200 &&
Msg->message <= WM_APP + 0x220)
{