1.31.2008

nuviphone - Garmin's GPS phone

Garmin 也出手機了 - nuviphone.
大概是3.5 inch lcd. 還有Wifi。
裡面run的是Garmin自己的OS (就是nuvi用的)。


專業PND製造商終於也找不到創新的方法,而必須要向手機靠近...(?)

所以..這是PND的喪鐘 ?

1.27.2008

回來了....

在上海的 雪夜中行走 近4公里後,現在,終於回到家了..

真好...上網要去哪就去哪,不會被Block! 真是自由啊!

1.24.2008

最近的Linux Journal 沒有以前那麼好看了,像以前那樣的hard-core 文章變少了,主題也都一直重複。 大概是網路的關係,很多資訊都沒有網上資料來的清楚。還有chief editor換人,所以雜誌走向有點不同,前一陣子還推出另一本線上雜誌 (TUX ?),focus在novice linux user..

而且,最近 開始一些促銷 活動,像是續訂2年送 LJ Archive DVD。
還有免費試閱3期,再決定是否續訂 的活動..

感覺起來...很可怕,跟以前Linux Journal "穩健"的作風不一樣,有點像是 ..天充文化快倒之前一樣:推出一堆新雜誌,對續訂戶提供大量優惠,對新訂戶提供"讀者文摘式"的試閱活動。

Linux Journal ,,,該不會...也要停刊了吧...
empower technology 推出自有品牌PND (因為目前在GFW後,所以ref link 就不貼了)

規格都差不多,只有 P2800 比較特殊 :支援 Wireless backup, rearview camera。

不曉得這個 Wireless backup/review camera 哪裡有賣 ,他的interface/protocol 是不是已經統一了。

如果是的話,看來 PND裝置就需要有Wifi功能囉
奇怪的是,google了一下 wifi backup camera 和 rearview camera,都沒有真正的產品呀。

倒是google wireless backup review camera 有一堆,但是是用 2.4G 的系統,不是Wifi。

有關review camera 用 wireless 這一點雖然不錯,不用拉video線。但是 camera power 還是要拉線吧..又不能從 後車燈拉。這樣只有開燈時會有電。

比較適當的是從 倒車燈拉出電源線,雖然只有倒車時才有,也還好,但是....倒車燈有提供這麼多電流嗎 ???

bookmark memo

紀錄一下...因為這裡GFW block 很多東西,用proxy 又不能直接subscribe..

http://www.navigadget.com/

1.23.2008

到了上海

不怎麼冷,hotel 可以上網,但是 有好多網站上不去.. (像這個 realchecko.blogspot.com)。
還好gmail 和google上得去。

查了一下,好像是GFW的關係,所以要看 blogspot的 blog,要到 http://www.pkblogs.com/


我真是蠢蛋,就已經進不來了,還寫在這..

應該要bookmark起來才對

1.18.2008

現在Sleep時,插上LCD,會多出2mA。
=== Sleep 時,LCD bus 的 pin 腳要設成 output,low, pull-down enable。

USB 沒有插入時,要把USB Control Block + USB PHY 的power 關掉。

Battery Low Sleep 要改 為3.1V - 還要test一下新的average recal 是否work
明天要作的事:
  1. 清天花板
    1. 買拖把。
    2. 買漂白水。
  2. 整理房間。
  3. 洗衣服。
  4. 準備東西。
    1. 買12" NB 包包 ?
    2. 拿小行李箱 ?
    3. 衣服 ?
  5. 吃eStork 尾牙。
    1. 到南莰
    2. 到新竹

1.17.2008

WAVEDEV - Volume

HandleWaveMessage():
SetGain(newgain) [ By pStreamContext or DeviceContext ]

StreamContext (SetGain )
GainChange( )
{
m_fxGain = MapGain(newgain);
}

MapGain( )
translate and tablet from GainMap[ ]
可以知道最後update到m_fxGain 這個variable中。

這個variable 給很多 ouput.cpp 的 Render( ) 使用。
有趣的地方:

CMidiNote::Render( ) 中,會由 SineTable[] 取出 amplititude,然後 * m_fxGain。

加上log message:
StreamContext:SetGain 19991999
StreamContext:GainChange
StreamContext:MapGain 1999
SecondaryGain fff, Total Gain 1998e667
Index 39, Result 9EF
result 就是經過GainMap[] 後的值。

1.16.2008

Work Notes : Launch Shell cause system hang

新的Shell 在 Explorer Mode 啟動不起來 (cause system hang)。
Solution : Loyal 說,要手動加一個 Key (DWORD) :
 HKEY_LOCAL_MACHINE\Platform\ResetFlag = 1
設完後,就可以開啟Shell 了。
所以,在debug完之前,在release dir 的 platform.reg中加入
[HKEY_LOCAL_MACHINE\Platform]
IF BSP_ENABLE_SHELL !
"ResetFlag"=dword:1
ENDIF

Get, Set Thread Priority

要知道目前自己這個Thread的Priority,用
GetThreadPriority( GetCurrentThread() ); 
要改變/設定自己的Thread Priority,用
SetThreadPriority( GetCurrentThread( ), NewPri );
CE 的 Priority Number 越小,Priority越高。

但是 help 檔說,新版應該要用 CeGetThreadPriority( ), CeSetThreadPriority( ) 。

1.15.2008

Install PB 5.0 and PB 6.0 on the same PC

這是從CE blog 的chat log 出現的 :
http://blogs.msdn.com/dcook/archive/2007/05/13/does-pb-5-0-work-side-by-side-with-pb-6-0.aspx


大致上是說..

PB5.0 和 PB 6.0 不能在同一個PC上的原因大部分是IDE的關係,他們的build system 是完全獨立的,不會互相影響。

但是要讓5.0 和 6.0 一同安裝,要依照以下方法:

  1. 先安裝PB 5.0,因為PB5.0 會搞亂一些設定。
  2. 複製 C:\Program Files\Common Files\Microsoft Shared\Windows CE Tools\Platman\bin (不包含subfolder)到其他第方。
  3. Install VS2005 和所有SP
  4. Install PB 76.0 和所有SP
  5. 比較 Platman\bin 和妳剛剛複製出去的folder,看看PB 6.0 的folder有缺哪些file,把他copy 回去(注意不要覆蓋已有的file)。
  6. 所有先前PB 5.0 的Connection Manager 都要用PB 6.0 重新create。
大概是這樣,但是還包含很多但書,還有一堆要fix,最好還是去看一下源PO。

gcc + libc6-dev

每次都忘記
aptitude install gcc libc6-dev
Compiler 要加上 developement library ,才能順利build 出 c program。

1.14.2008

平鎮的

­ 兒童健檢

週一至週五

上午 8:30-11:15

下午 1:30-4:15

健保手冊

健保 IC 卡

免費 (七歲前共有9次)

現場掛號

­ 幼兒預防注射

每週二、四、五

下午 1:30-4:15

健保手冊

免費 (另有多項自費疫苗)

現場掛號

1.11.2008

查 board 在 849 ( 849/1024*246/196 *3.3) = 3.43 時停止動作。
此時,1.2 V channel 的值是 397。
所以 cal後 : 3.43 * 372/397 = 3.20。

trac : login fail

Trac 設定中,login 功能一直不能實現,每次都會出現
Internal Error:
Authentication information not available.
google了一堆,有關login 需要做的事:
  • apache2 中 trac 的conf要設定 login path 的section
  • 要用 trac-admin 命令create user,並授予權限 (因為trac default 是anonymouse)。
都做了,還是一樣不成功。

trac 的設置真是太多樣化了,可以選 tracd,cgi和 mod_python三種運作方式,
每種有不同的設定方法。

又,使用apache時,又可以選是不是使用 virtual host 。
設法又不一樣。

所以,真的是....



因為公司中dns不歸我們管,所以apache不能用virtual host,而大部分的說明都是用virtual host。

最後,原因找到就是因為virtual host 的原因,
因為我沒用,所以 trac 的conf 中...
<LocationMatch "/trac/[^/]+/login">
這個寫法有錯,
我的path應該是
/trac/login
而上述的寫法,trac和login間必須要有其他的字。所以login path 是錯的。

修改的方法是直接寫
/trac/login/
就好了。

conclusion :

  • apache中trac的conf 裡要有login 的path,並且要寫對 (移動游標到"login"上,看看path就知道了。
  • 用 trac-admin permission add 給user-name permission。
  • 重開 apache2
* 有關trac-admin 的用法,trac 的wiki (安裝trac就有),有詳細說明。

1.10.2008

最近還因為新停車位要多10 min 開關門和步行,覺得有點煩。

結果...

公司宣佈要搬到林口。


現在覺得..... "10 min 開關門+步行" 的時間 倒變成小 case。

1.09.2008

share resouce between drivers - mutex

Driver 之間要share resource,需要一個mutex,這個mutext是named mutex,需要的driver都要用一樣的name 來create,這樣就能用 wait/release 來達到同步。

所有要用的driver都要:

1. Create Mutex
    mtx = CreateMutex(NULL,FALSE, TEXT("I2CChannel"));
2.使用share device (這裡以I2C為例)前,要取得mutex :
    WaitForSingleObject(mtx,INFINITE);
argument "INFINITE"會一直wait到其他driver release 這個mutex。

3.使用完後,release :
    ReleaseMutex(mtx);
4.最後,要注意,driver unload 時要記得close mutex:
    CloseHandle(mtx);
重點就是 "named" mutex,利用unique name,達到driver間的同步。

1.08.2008

osrmt : open source requirement management tool

James要一個 Requirement Management System,直接google,好像就只有 osrmt (open-source requirement management tool)。

是用 java 寫的,所以install 方式也很java。
在 sourceforge page都找不到任何文件,download 回來解開也是一個 jar 檔而已,沒有 README和INSTALL。

到forume去看,原來要run 這個jar檔,就會產生install文件。
java -jar osrmt15.jar
這個jar 需要X,所以要在X下run (或是重導)。
依照內容"click-click-click"後,就出現osrmt目錄,裡面的配置就很像一般的opensource package了。

然後在 doc 下就有 : osrmt_installation.pdf

30 page的安裝說明,要決定是使用 2-tire 或是 3-tire的方式。
但是說明內容大部分都是Windows平台

哇!安裝起來真是麻煩呀,因為option 很多,連database 都可以選,還要自己改xml...

1.07.2008

found : usb no actin after waking up from sleep.

Wake up 後USB就不能動作了:

結果是 USB/UART multiplex chip 的問題,multiplex chip 的switch id pin 接到 cpu。
cpu 沒有program 成input (float),加上有 pull-up 電阻,所以真正的 USB_ID signale 沒辦法把 id pin 拉到 low,導致 multiplex一直切在 UART 端。

所以 USB 不會通。

sleep 後才發生問題:因為 initial boot 是設對的,但是 wakeup/sleep 的gpio program function 又把他設回去了。


結果 : 寫在function 的 power-up function 中比較保險。

最好還是不要在USB D+/D- 上動手腳。

1.05.2008

一直都是用wl-330,接到 hub上,來讓另一層的所有電腦能夠經由wl-330連到AP上網。
但是前一陣子想換到wl-330g後,不成功,換回wl-330時,竟然不能用了。

這樣使用的配置:要配置成adaptor mode,然後不clone mac。

問題大概就在clone mac上吧,config wl-330有兩種方法 : browser和config application。

browser好像不行,好像設好了,結果卻沒設。後來還是裝回wl-330的configuration applicaion才讓她動起來 (用wl-330g的設定程式不行)。

Sirf InstantFix II

Sirf 的新技術,可以將 cold start time由 30 sec縮短到 5sec。

從 其他站台的報導文件好像是說....利用前一次關機前定位的時間和定位資訊,猜測目前(利用目前時間)的衛星位址,來省去需要由衛星下載資訊的30sec時間。

以上都是我猜的....

1.04.2008

要configure (poweron) usb function controller,有一些register要設:

MISCCR
  • bit 12 (SEL_SUSPEND) : 0 Normal Mode, 1 Suspend Mode
PWRCFG
  • bit 4 (nSW_PHY_OFF_USB) : 0 Power Off USB PHY, 1 Power ON PHY
URSTCON (USB Reset Controller)
  • bit 2 (FUNC_RESET)
  • bit 1 (HOST_RESET)
  • bit 0 (PHY_RESET)
使用上bit 設為1 就是reset,但是要記得,要設回0。
code上的說明是,要先 reset PHY,10us 後再reset FUNC和HOST

PHYCTRL
設定PHY用的crystal,都是0就是...外接crystal 48MHz,device mode
PHYPWR
  • bit 31 (COMMON_ON_N) : ohci (host) crystal 在suspend mode是否仍要power on。 0 : Off
  • bit 5:4 (ANALOG_POWERDOWN) : 01 , 關掉 PHY2.0 的analog part。 其他的值:power on (normal)
  • bit 3 (PLL_REF_CLK) : 0 使用外部crystal
  • bit 2 (XO_ON) : 0 XO block power down in suspend mode.
  • bit 1 (PLL_POWERDOWN) : 0 : PHY2.0 PLL power down.
  • bit 0 (FORCE_SUSPEND) : 0 normal operation, 1 apply suspend signal for power saving,
很複雜,一個PHY竟然區分成 PLL, Analog Part

UCLKON (USB Clock Control)
一堆,DETECT_VBUS,host/function clock enable/disable

1.03.2008

ADV7180 - about interrupt

ADV7180 有一個中斷輸出 pin : INTRQ.

先看一些縮寫好了 -____-

VDP : (VBI Data Processor).
VBI : Vertical Blanking Interval.

這是因為analog的電視把一些data (例如:字幕),放到畫面的 vertical blanking interval (就是畫面裡,上,下不會顯示出來的區域)。
所以需要額外的processor 來處理這一段的資料。

放在這個區域的資料可能會有:
  • teletext
  • CC/CCAP (Close Caption)
  • CGMS (Copy Generation Management System)
  • WSS (Wide Screen Signaling)
所以ADV7180 的 VDP (Vertical Blanking Interval Data Processor) 可以decode 這些standard
因為這些 VBI 的資料不是一直都有,VDP處理也需要時間,所以VDP 可以trigger Interrupt,programmer 可以設定,當VDP處理完哪些資料後,trigger interrupt。


Interrupt System Register Map : register 0x40 ~ 0x9C (不連續)

這一段 的register 好像都是設定 interrupt,開頭有個小小的 * mark:
To access the registers listed in Table, SUB_USER_EN in register 0x0E must be programed to 1.
所以說,要access interrupt 相關的register,要先把 register 0x0E 寫入 0x20 才行..
那寫完後要不要寫回0x00?

configure interrupt 的trigger source 要program interrupt mask,總共有4個interrupt mask.

但是有說明的部份,只有和VDP相關的部份,對於video detection 則沒有提,只有在register map 中的 bit name... (是要自己猜 ?)。

要偵測 video signal 是否存在,猜測幾個 interrupt status bit:
  • SD_LOCK_Q
  • SD_H_LOCK
  • SD_V_LOCK
使用一個 polling thread,polling reg 0x42 (先set reg 0x0E =0x20 再read reg 0x42)。

只read 0x42 : SD_LOCK, SD_UNLOCK:
  • Video 插入時,會有SD_LOCK
  • Video 移出時,會有SD_UNLOCK
這兩個interrupt 只有在"狀態變化" 時,才會動作。 ( edge-trigger)。
也就是說:
  1. Video 插入
  2. SD_LOCK = 1
  3. 寫入 reg 0x43 = 0x01 (clear SD_LOCK)
  4. SD_LOCK = 0 (雖然這時候 Video 依然插著)
  5. 拔出 Video
  6. SD_UNLOCK = 1
  7. 寫入 reg 0x43 = 0x02 (clear SD_UNLOCK)
  8. SD_UNLOCK = 0 (雖然這時候 Video 還沒插入)
  9. --- 回到 1---繼續
上面 "寫入 reg 0x43" 是 ADV7180 的interrupt 動作機制,意思ack interrupt。
!!發現 initstate 是 assume video in,所以啟動時若是Video In,則 SD_LOCK bit 不會set,
但是若是啟動時是 Video OUT,會有SD_UNLOCK bit。


1.02.2008

Camera Interface.

CAMIF 的bus priority 只能比LCD 的priority 低,要比其她hardware都高。

CAMIF 有兩個path : preview, Capture。

preview 和 capture path 都各有4個target frame memory (4 pingpong frame memory)。
意思是依照1,2,3,4,1,2,3,4,,,依序放置 ?
pixel 的格式有YCbCr和RGB兩種方式。

YCbCr是Capture Path使用的方法,Y, Cb, Cr資料非別放在每個frame的獨立page,所以program 可以獨立得到image的Y frame資料 (或Cb, Cr資料)。

RGB是Preview Path使用的方法(Capture path好像也可以設定成這樣),可以選用 32 bit/16bit模式的RGB資料,但是每個pixel的RGB資料是組合在一起的(2或4bytes),依序放置的frame memory中,不像 YCbCr模式的方開放置。

MSDMA (不知道是什麼的縮寫)

MSDMA只能在previewpath使用 (SEL_DMA_CAM='1')。
MSDMA可以作memory data scaling,但是只支援 YCbCr Mode。
依照示意圖,MSDMA好像只是DMA,單純的作memory 到 memory的搬移,但是她還在搬移的時候作scaling的運算。
奇怪得的是,MSDMA在圖中,是作為 CAMIF--preview path的輸入端,也就是說,MSDMA處理過後的資料,進入camif的preivew path (?那MSDMA鎖需要的frame data是哪一個device放到memory中的?)


REGISTERS

CISRCFMT : 設定 source video 的format。
  • Bt601, Bt656 ?
  • YCbCr Order
  • H, V Size
CIWDOFST : 設定 source video 需不需要作clip (切割: 左右上下)。
  • 原來在 CISRCFMT中設定的source H, V size。經過這個register 中設定的上下
  • CIWDOFST只包含一側(上,左)的offset設定,另一側(下,右)在CIWDOFST2 設定。
設定這個clip (crop) 動作有一堆限制:
  • crop後的image 水平 pixel 必需要是8的倍數,同時又是PreHorRatio的4倍數
  • crop後的image 垂直 pixel ,作scale-down時,必需要是 PreVerRatio的倍數。
  • 左右切下來(不顯示)的pixel數 >= Source 水平pixel數 x PreHorRatio_Pr
CIGCTRL : 設定一些interface (PCLK, VSYNC, HREF 極性),Software/hardware reset,輸出test pattern,....etc。
要作software reset 有一定的sequence , 601 mode和656 mode還不一樣..
要配合 CISRCFMT register作設定...有點囉唆


接下來是frame memory 的設定.. CODEC Path 的 YCbCr Frame Memory.
  • CICOYSA1.2.3.4
  • CICOCBSA1.2.3.4
  • CICOCRSA1.2.3.4
上面的12個register分成3組 : Y, Cb, Cr,每組有4個區域,就是分別用來設定 Y, Cb, Cr的pin-pong frame memory 的start address。
camif 的DMA會自動將image的內容依照各個frame,依序送到這些register指定的位置。

CICOTRGFMT : 設定Codec path 的 target image (就是 camif 轉換後,放到frame memory的格式..)
  • Codec path 水平/垂直 pixel 數 (Horizontal/Vertical Size)
  • mirror / rotation
又有限制:水平/垂直pixel數一定要比 source 小 (因為crop關係 ?)
水平pixel數必需要是16的倍數
在RGB Mode,垂直pixel數比需要是8的倍數

CICOCTRL : 設定DMA每次要搬的byte(word?)數
  • DMA是一行一行 (一條一條水平線)的搬video 信號到 frame memory中,所以要告訴DMA 每一行要搬幾個byte(word)。
  • DMA的一次搬移動作分為兩個階段 : main burst, remained burst。

Preview Path 的registers

CIPRCLRSA1.2.3.4: ping-pong frame memory 的設定register。

CIPRTRGFMT : 設定 target (轉換後的) image format
  • Horizontal pixel number (16bpp時,4的倍數。 24bpp時,2的倍數)
  • Vertical pixel number (8的倍數)
  • mirror / rotate
一樣,target size不可以比source 大
CIPRCTRL : preview path 的DMA 控制。
DMA是一行(水平線)一行的搬,以 VGA ( 水平640 pixel),16 bpp 為例:
一個word可以放兩個pixel 。
所以一行 640/2 = 320 word。
320 % 16 = 0 (整除),所以 main brust = 16, remained brust = 16。


CIPRSCPRERATIO : pre-scaler ratio
  • 這部份要參考CODEC path 的說明 (設法一樣)。

camera interface 的重點好像就是在選擇 codec path 和camera interface上,這兩個path 是獨立的。

功能好像也一樣 (將codec path 的output設為 RGB的話,就和preview path 一樣了)。

preview path 有 水平處理數不得超過640的限制,Codec path 則沒有說明。
另外就是 preview path 還有一路 MSDMA可以選擇,但是...不知道要怎模用...