8.31.2007

VisualStudio 2005 : build for ARMV4

VisualStudio 2005 原來內建 smartphone sdk.
在create project 時,選platform 選 ppc smartphone 就可以,
接下來會問你藥用哪個sdk,他內建 smartphone 2003 ARMv4 的SDK。
但是你有另外安裝的SDK,也會出現。
然後就跟 eVC類似,選MFC DLL是要static link 和是share,在VS2005後建議 MFC DLL用static link。

8.30.2007

TFAT Overview

MSDN 翻的:

傳統的FAT 檔案系統在修改檔案的過程中有機會被中斷.所以Data Loss 和檔案系統毀損的現象常常會在拔出Stroage Card或是斷電時發生.

TFAT 檔案系統利用"transaction-safe"的操作, 讓這樣的狀況部會發生.

TFAT利用兩個FAT Table : FAT0, FAT1。 所有的檔案操作會先對FAT1操作。當操作完成時,再將FAT1 copy 到FAT0。

在確認所有的操作都完成後後,才會修改到 FAT0,所以如果操作完成前被中斷,FAT0 還是維持上一個完整的狀態。

TFAT的預設是在對目錄操作時,才會backup FAT。

如果想要在作 file 操作時也backup FAT. 可以把 TransactData registry key 設為 1.
如果把 ForceWriteThrough 也設為 1, 每次 write operations 完成後,都會 backup FAT。

當修改某一筆檔案資料時, TFAT 先找到一個 new cluster ,儲存修改的部份,然後修改FAT chain,把這個clust 替代原來的部份. 這樣是為了避免在修改完成前,被中斷掉,導致原來的檔案資料被修改,但又沒有修改完畢 ( currupt).

TFAT 檔案系統適用於 non-removable media 例如 NAND and NOR flash memory.
Removable media 也能能使用 TFAT, 但是在Desktop 環境(Windows)使用TFAT 裝置可能會有問題. 因為Desktop 環境的作業系統並沒有實做TFAT 檔案系統, 他還是會用舊有的FAT 檔案系統來處理TFAT 的裝置.

如果TFAT裝置是在某種(critical operation)下從ce裝置取出,Windows 可能沒辦法正確辨識TFAT 內容.

在Windows desktop operating system中對TFAT裝置所作的修改,即使放回CE裝置下,都不再是 Transaction Safe。
如果Windows 在TFAT 裝置中create一個目錄,在放到CE裝置,則從此所有對該目錄的操作都不是transation sage.
除此之外TFAT裝置在正確操作下(也就是在CE中) Create的目錄,放到Desktop後將無法被刪除。I


歸納一下
  • TFAT 就是利用backup FAT的方法,防止在 currpt。
  • bacup FAT 的時機,default 是在有目錄操作時才作,但是可以修改registry ,讓他可以在所有修改後都backup。
  • Windows 可以讀寫TFAT,但是會對TFAT有不好的影響,所以最好不要這樣作,不好的影響包括:
    • 經過 Windows 修改的file,不再是transation safe.
    • CE create的目錄,在Windows無法刪除。

實際操作:
在registry 加上FormatTFat,將partition 刪掉,重新安裝OS。

  • 如果該partition 是以FAT32 (相容)模式format,用mass storage 看是一切正常的 (只有看)。
  • 如果該partition 是以FAT16 (相容)模式format,用mass storage 看,會出現一個HIDDEN_ROOT 的folder,原來在根目錄的data都變成在這個 HIDDEN_ROOT 下。
也如說明所述:
在CE中create的folder,在mass storage mode,Windows 無法刪除 (但是file是可以刪除的)。
自己連一下.. 上次寫過的 .. TFAT : Transation Safe FAT

8.28.2007

Nice - Display resolution

這個在Wiki中看到的resolution 說明圖片很不錯,除了可以看到各規格的大小之外,他的"對角線"設計可以看出喇些規格是可以等比例放大,縮小。

圖片下面的link 是我自己加上去的。

ANStek , Analog Device

ADV7180


代理 : 安馳科技

02 26982526
陳國龍 Eric Chen (好像離職了)
eric@anstek.com.tw


Justin Wu

Justin.Wu@anstek.com.tw
02-26982526
0987-131872




原廠 : Analog Device

02 27195612 ext 274
陳奎光 Rocky Chen
rocky.chen@analog.com


0932929702

Jerry

SDTV Video Decoder ADV7180

就是把analog的CVBS或是Y/C或是YPrPb信號轉為digital的BT.656 YCbCr 4:2:2。
控制介面和一般的video decoder一樣 - I2C。

雖然根據datasheet 說明,內部有很多fancy 的功能,但是對software engineer來說,就是AD converter 而已。

Analog Input 介面:

有4-6個input 可以選(隨package而有不同)。
每個channel 可以輸入 CVBS, Y/C 或是 YCbCr。
  1. 當輸入 CVBS時,每個AIN都可以獨立使用。
  2. 當輸入Y/C時,(1,4),(2,5),(3,6)各成一組。
  3. 當輸入 YCbCr時,(1,4,5),(2,3,6)各成一組
AIN的輸入類型(CVBDS, Y/C,YCbCr),必須要由register 0x00 來設定。

有關 interrupt 部份,這裡 還有一些說明..

Linux in Airplane

最近的新聞
新加坡航空將在新的Airbus A380 和Boeing 787 的每個座位上安裝含40GB 容量的PC。
用來提供每個座位自行決定播放的影片。
這些PC都是run Redhat。

目前的影片播放系統,或說是獨立的lcd 系統,好像是run Novel Netware。
有一次在飛機降落時,LCD reboot,我看到boot log上的顯示....

DVBT Module - ASUKA

包含 DBCOM 的的RF和 MPEG2 decoder,並且有作customize software integration.

Jeff Chen

03 6667117 ext 208
jeffchen@asuka-semi.com.tw

Super Cool PND - Provia

這個韓國的PND做得太cool了點,他的3D根本就跟Game 一樣:


LCD 還是7"的。

這個網站也直接說 too cool!

目前高架道路一團亂的情況下,3D導航應該是趨勢吧。
要做到這樣(可以到http://blog.tmcnet.com/blog/tom-keating/gps/provia-a1-gps-too-cool.asp去看另一張圖,那個廟(牌樓)的樣子,還真的用3D 模型畫出來)。



因為是7",所以還有PIP功能喔。

這樣的device,cpu 不知道適用哪一顆.

8.27.2007

懲罰: 使用Windows (?)

有趣的新聞,一位因為上載影片到P2P的user 被判緩刑,同時規定,緩刑期間,如果他要使用電腦,必須要使用Windows. (他原來是使用 ubuntu 7.0)。

是說..要他使用Windows,作為一樣懲罰 :p ?

原因是..他的緩刑監察官必須要能Monitor他的網路行為,所以必須要安裝一個monitor軟體在他的電腦上,而這個軟體只支援Windows,所以..他必須要安裝Windows,好讓監察官能安裝他的軟體。

新聞是 cnet 看到的,哪個人的blog 在 "這裡"。

8.23.2007

Small Headphone AMP

MAX9723

是簡單的 Headphone AMP。

  1. 內含charge-pump,所以單電源就可以驅動。
  2. I2C介面 Gain (Volume) Control。
  3. BassMax enable/disable, Hardware 設定Bost level。

I2C Address 有四種可以選,但是有四種不同料號...
I2C 的command 只有一個 (也就是說...只有一個register)。只有write,沒有read動作。

PowerUp Reset 時,Register value 是在 "Shutdown" state。

慣性拖拉 - OpenMoko 也有囉

iPhone 介面中很有趣的"慣性拖拉"動作:就是說可以直接在list上上下拖動,然後放掉,list還會再動一下,然後停住,這個動作,openmoko的gnome interface team 也完成了。

developer的blog中有影片,跟iPhone一樣喔。
真有趣,可以去看看。


interface好像是用python寫的..馬上有人放到Nokia N800 上了。

follow link... 好像有提到 iPone like virtual keyboard. 照這樣看來,openmoko 會變得比iPhone更cool的手機了。

這一篇文章有提到,一堆有關 mobile device user interface 的新作法 (雖然有些都是模仿iPhone)。

希望就像 Mac 帶領PC由 text command 進入 GUI,iPhone也會讓所有的mobile device有新的風貌。

8.22.2007

MAX 9850 Audio Codec with headphone AMP

MAX 9850

內含charge-pump 產生headphone需要的負電壓,所以不需要 hearphone GND不需要耦合電容。
charge-pump 電路需要手動啟動/關閉 (但是要headphone sense pin active才有辦法啟動)。

可作 Ananlog input 與 Digital input 混音。

內建 headphone sense input detects,在無headphone時自動切斷headphone電源。
所以,不想使用這個功能時,要確保該detection pin 不至於將headphone AMP 關閉。
(所以要拿headphone output 作其他用途的要注意了..)

只有 headphone有volume控制。

混音後輸出至 LineOut,在由 LineOut 輸出到headphone AMP,所以將LineOut關閉,headphone也被關閉。
9850 沒有LineOut AMP,所以datasheet 上建議配合 MAX9773 (Stereo)。

MAX9773 是D類1.8W (4 ohms) AMP。gain 可由 hardware resister 決定 (所以不是software 可調),另附phase synch signal,可以配合另外的D type AMP 。

8.21.2007

DeviceIoControl

DeviceIoControl 的MSDN reference 在 http://msdn2.microsoft.com/en-us/library/ms960189.aspx

以 WAVEDEV 為例

IO Control Code 定義在 PUBLIC\COMMON\OAK\INC\WAVEDEV.H 中

這個 header file 的 comment 中有說明 audio driver 的複雜架構。

WAVDEV 處理的IO Control Cmd 有
  • IOCTL_MIX_MESSAGE
  • IOCTL_WAV_MESSAGE
都定義在這裡,這兩個 command code 都屬於 FILE_DEVICE_SOUND (分別是 3, 115)。

device io control 又把parameter 作進一步擴充,把argument 再定義為 message (PMMDRV_MESSAGE_PARMS):
typedef struct {
UINT uDeviceId;
UINT uMsg;
DWORD dwUser;
DWORD dwParam1;
DWORD dwParam2;
} MMDRV_MESSAGE_PARAMS;
所以.. WAVEDEV 的IO Control handler 再依照 uMsg 細分 command。

使用時,要先CreateFile("drivername"..),"drivername"就是那個 3 char + 1 index.
取得的handle 傳入 DevIoControl ( )作第一個argument,

prototype:
BOOL DeviceIoControl(
HANDLE hDevice,
DWORD dwIoControlCode,
LPVOID lpInBuffer,
DWORD nInBufferSize,
LPVOID lpOutBuffer,
DWORD nOutBufferSize,
LPDWORD lpBytesReturned,
LPOVERLAPPED lpOverlapped);
和 KernelIoControl( )比起來,除了一開始的 hDevice外,就是最後的 Overlapped. - 這個固定要用 NULL。

8.20.2007

KernelIoControl

ref msdn http://msdn2.microsoft.com/en-us/library/ms886729.aspx
argument 依序是
  1. CommandConde
  2. InBuffer Pointer
  3. InBuffer Size
  4. OutBuffer Pointer
  5. OutBuffer Size
  6. Buffer Pointer to Save the returned value (DWORD)
就和 Linux 的 IOControl 一樣。

但是這個 IOControl 是對 Kernel ,在source code上來說,也就是 OAL。

CE 的 Driver 都是run 在 User Space (6.0以前),所以driver 的access 方法不一樣。
driver 的iocontrol 和 linux 的比較類似,就是 open device,然後用iocontrol function。

但是 kernel 不是 driver,所以就不用open 了,直接呼叫 KernelIoControl( )就可以。

自己要加一些 Kernel IoControl command的話,要
  1. 先define IOControl code ,用 CTL_CODE 宣告,有很多argument和限制,ref http://msdn2.microsoft.com/en-us/library/ms904001.aspx
  2. 在oal 中寫好處理的function,通常會是 OALIoCtlXXX( ),這個funciton 的argument也是限制的,要符合iocontrol 的四個argument : in,insize,out,outsize。
  3. 在oak_ioctl_tab.h 中建立IOcontrol code和 iocontrol function 的關聯。



在 CTL_CODE的說明頁,有說明可以指定 cotrol type.(oal 的就是FILE_DEVICE_HAL)。
這樣看來,也可以用 FILE_DEVICE_BATTERY 來指定由battery 來handle ?

FM Transmitter

THG4649

使用 SPI ,但是data 只有write,沒有read動作 (也就是說 THG4649 沒有東西要給你知道)。
  • 有一個奇怪的規定,在CS Low (select)之前,CLK先作至少2個clock,在CS High(de-select)後,CLK至少再有兩個clock。
  • Data好像是 clock rising edge strobe。
command 內容並不嚴謹:大概就是把設定的資料串起來,一個bit一個bit的送出去。
後來發現不夠,又再增加一串資料。

大概說一下:
  1. command有 0 - 23 個bit組成
  2. bit 0.1.2 用來決定command內容 (datasheet依次命名為Word A, B,C)
  3. spi protocol 採用 big endian 所以D23先送
Word A, B, C對應的 D0.1.2 依次是
  • A : 0x07 - 主要是 N (program counter freq division ratio)
  • B : 0x06 - 主要是 R (reference counter freq division ratio)
  • C : 0x05 - 主要是 F (sub carrier counter freq division ratio)
N.F.R 決定 FM freq :
 FM頻率= [(8xN)+S] x (Fosc/R)/4
但是N.R.F 的bit都不是24-3 bit,所以剩下的bit 用來塞其他的參數。

這樣塞command倒楣的就是會有參數塞不下,被分到兩個command中: 參數A (Audio Signal Level adjustment bit) ,A[2.1]在Word A,A[0]在Word B。

慘的是,還規定了Word A, B, C 的寫入順序:
  • C, B, A
然後建議改頻率最好是改A或是B的data就好。
因為寫C時,PLL not lock。

8.09.2007

fopen with "w" cause file reset

fopen( )使用 "w" 作為 open mode。如果open的file已經存在,在一open時,file會被reset (清空)。
一直到fclose( )之後,file 內容才會真正的update。
除非在中途用fflush( )強制update。

所以..
若是系統在 fopen( )後,fclose( )之前。系統被reset (power down)的話,被open 的 file 就變成 empty 了。

MSDN fopen

使用CreateFile( ) , WriteFile( ),CloseHandle( )就不會。
即使是用 CREATE_ALWAYS, GENERIC_WRITE。

在CloseHandle( )之前被reset的話。原file內容不會改變 。

在CloseHandle( )之前,該file 的內容都是舊的 (不會被清空)。

MSDN CreateFile

這是只有WindowsCE的fopen( )才是這樣,還是所有的OS都是這樣 ?

PS : 以上動作跟 Media 有關,在Nandflash create的partition 是這樣。
在 SD card則不一樣。

SD card 在 fclose( ) 和 CloseHandle( ) 前reset 的話,該file 會keep 原內容。

8.08.2007

SD Card Identify

這裡,TI 的TMS320DM644x SD Card Controller User's Guid
Sec 3.1 Card Identification Operation
大略翻譯一下:

進行 SD/MMC Card的一般傳輸動動之前,先要對bus上所有的card作identify 和 configure。

先下 ALL_SEND_CID broadcast command。請bus 上的card回應。
controller收到回應後,再讀取card的 uniqure card identification address (CID)。
之後再assign 一個 relative adress (RCA)。

RCA 的長度比 CID短,

之後,controller和 card 之間的傳輸,都用這個RCA作為定址的方法。

SD Card的 identify procedure
  1. 送 GO_IDLE_STATE (CMD0) 給SD card。

    這個command讓所有的card進入idle mode。

  2. 送 APP_CMD (CMD5) 給SD card。card會回應 R1。

    這個command告訴card 接著會是application command。

  3. 送 SD_SEND_OP_COND (ACMD41) 並且包含一個argument告訴card support voltage ranage。card會回應 R3。

    這個command可以用來辨識card是否支援controller 提供的voltage range。

  4. 送 SD_SEND_CID (CMD2)給SD card。 card收到會回應 R2。

    這個command請所有的card送出他們的CID。由於SD card 的設計,會只有一個SD Card能夠成功的送出CID。送出CID的Card會進入identification state,不會再回應這個command,好將回應的機會留給其他還沒回的Card。

  5. 送出SEND_RELATIVE_ADDR (CMD3)給SD Card,請Card將Relative Address送回來。

    只有剛剛成功回覆 CID的SD Card會接受這個command。並且回應 R1和他的Relative Address (in R6)。之後,會進入 Data Transfer Mode。

  6. 反覆4, 5,當沒有SD Card回應 SD_SEND_CID command,代表所有的SD Card都進入 Data Transfer Mode。Identification 完畢。
上面提到的pdf,p 31 Figure 13 有一個清楚的procedure diagram。

MMC Card和 SD Card 不一樣的地方是 MMC Card需要 controller 指定 RCA,所以在procedure 5 後,要再下一個SET_RELATIVE_ADDR (CMD3) 設定MMC Card Address。

無解 : VC6 project migrate to VC8 (VS2005)

VC6 的project 轉到 VS2005後,完全不能用。
build error 一大堆。

像是..
unresolved external : __RTC_Shutdown
這個RTC不是embedded system中常用的 Real Time Clock。而是 Run Time Check 的意思。
所以要將 Project Property - C\C++ - Code Generation 中的 "Basic Run Time Check" 改成Default。

還有
unresolved external symbol : __security_cookie
這個是VS2005 的"Buffer Security Check"的mark,所以把 Project Property - C\C++ - Code Generation 中的 "Buffer Security Check" disable 就可以。


但是
 unreolved external symbol : ___CxxFrameHandler3
這個就沒救了,google了大半天,也沒有人有解答,即使是MSDN forume也沒有。
原因大概是在VS2005,Exception Handler internal class 已經改名為 CxxFrameHandler4了。
所以 ?


解法就是 .. 去check 你所有link 的library和prebuild code,有沒有和VC6 library link的。如果有的話就重新 build 那些code,改用 VS2005 library 。

8.06.2007

買產品還是買服務

TomorrowNow 提供PeopleSoft的軟體支援服務。

2005 年,Oracle 買下PeopleSoft。
之後, SAP就買下 TomorrowNow。

原來Oracle是希望併購PeopleSoft後,能讓原PeopleSoft的用戶改用Oracle的產品。
因為PeopleSoft被Orcale併購後,自己的軟體產品就終止了。

結果因為提供售後服務的TomorrowNow被SAP併購。
所以那些PeopleSoft的客戶在合約到期後,反而接受Tomorrow的建議,改採SAP。

8.04.2007

陰謀玩家的橘子蘋果經濟學

這禮拜買的..

其中.."Woznic 試讀本",實際上是...


橘子蘋果那本挺不錯的..
  • 房屋仲介不會認真的設法提高賣價,因為提高售價對他來說,只增加一點點利潤,倒不如快點賣掉,早點拿到錢。

8.03.2007

變更USB-SERIAL 的COMPORT index

Record : Samsung phone, phoneboook format.

SAMSUNG手機 的 phonebook log:
<U001247b57913SGH-E628><X15><O><Bb><#0><#
1><L1Service",,800><#2><#3><#4><#5><#6><#7><#8><#9><#:><Be>
所以知道是 format 1 type : L1.
所以 Format 1 的格式就是 ... Name 和 Number 都是 plain ascii。
-- 多一個 ',' 是幹什麼用的 ?

Value definition in FATFS

SDMMC\Driver\sdmmc.def 宣告了 SDMMC.DLL 公開的介面。
這幾個公開的介面,都實在 system.c 中。

結果:
決定 SDMMC card mount 行為的registry key:
HKEY_LOCAL_MACHINE\System\StorageManager\FATFS
中的
Flags
的各bit 定義在: COREOS\FSD\FATFS\fatfs.h。在MSDN 的FAT Filesystem registry Setting 這一篇也有說明:
FATFS_UPDATE_ACCESS         0x00000001  // update access times if set
FATFS_DISABLE_LOG 0x00000002 // disable event logging if set
FATFS_DISABLE_AUTOSCAN 0x00000004 // disable automatic ScanVolume()
FATFS_VERIFY_WRITES 0x00000008 // verify all writes (as opposed to a handful)
FATFS_ENABLE_BACKUP_FAT 0x00000010 // add a backup FAT to all formats
FATFS_FORCE_WRITETHROUGH 0x00000020 // Force fat to be always writethrough
FATFS_DISABLE_AUTOFORMAT 0x00000040 // disable automatic formatting of unformatted volumes

FATFS_WFWS_NOWRITETHRU 0x00010000 // disable writethrough on WriteFileWithSeek API, improve
// memory-mapped file performance
FATFS_DISABLE_FORMAT 0x00020000 // disable format
FATFS_TRANS_DATA 0x00040000 // transact data on a write (i.e. clone cluster on every write)
FATFS_TFAT_NONATOMIC_SECTOR 0x00080000 // Use cluster 1 entry in FAT table for TFAT transaction,
// since sector writes are non-atomic.
// By default, TFAT uses the NOF field of the boot sector
FATFS_DISABLE_TFAT_REDIR 0x00100000 // Indicates to disable redirect the root directory to
// another hidden director for FAT12 or 16, since root dir
// isn't transacted in those cases
FATFS_TFAT_ALWAYS 0x00200000 // Always mark transaction status, even only one sector in
// FAT is changed
FATFS_FORCE_TFAT 0x00400000 // Force TFAT transactioning even if volume isn't formatted
// as TFAT
FATFS_LFN_EXTENDED 0x00800000 // Generate LFN entries for extended characters always
FATFS_TFAT_DISABLE_MOVEDIR 0x01000000 // Disable MoveFile on a directory for TFAT because it isn't
// transaction-safe
所以要disable SD card 的 autoformat功能,就要設定 FATFS_DISABLE_AUTOFORMAT :
0x40

這個filesystem 好像會和nandflash 的filesystem 共用。所以大概會影響到nandflash filesystem..

building kernel in Debian's way

http://www.enterprisenetworkingplanet.com/netos/article.php/3691636

Debian 的 kernel source packages 叫做 linux-source-[version].
目前官方的kernel 版本是
  • linux-source-2.6.18 (stable)
  • linux-source-2.6.21 (testing and unstable)
  • linux-source-2.6.22 (unstable and experimental).

Binary kernel packages 會叫做 linux-image-[version].
從 2.6.12 版以後,開始使用這樣的方式。以前的package命名方式是 kernel-source 和 kernel-image packages.

取得kernel source 後,還需要build tool:
# aptitude install linux-source-2.6.22 kernel-package fakeroot
download 下來的source code會放在 /usr/src/。
我們先把他move 到 我們自己決定的 build directory:
# mv /usr/src/linux-source-2.6.22.tar.bz2 ~/kernel
到該目錄下,解開source
$ tar zxvf linux-source-2.6.22.tar.bz2
到解開的source 目錄下,開始config:
$ cd linux-source-2.6.22
$ make mrproper
$ make xconfig
Config完後,作:$ make-kpkg clean
$ make-kpkg -rootcmd fakeroot -rev kernel.1 linux_image
fakeroot 可以讓一般user 有build kernel 的權限,但不會讓你有run 其他command的權利.。

完成後,會有linux-image-2.6.22_kernel.1_i686.deb.
所以可以用dpkg來安裝(這樣,還會有機會用 -rev 解除安裝):
# dpkg -i linux-image-2.6.22_kernel.1_i686.deb
This installs the modules and handles module dependencies, creates a boot menu entry, and copies the kernel and related file to the /boot directory. Now you can reboot, select your new kernel from the boot menu, and play with your new kernel.
以上,純粹翻譯link文章的第一段。
原來是source 的package name不一樣了...

8.02.2007

eVC - enable unwind : /GX option

在eVC中用了try...catch( )結果build時出現:
warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify -GX

這可糟糕,沒有unwide,可能會有memory leak...

所以要follow 他的instruction,手動在eVC 的 "Project -- Settings -- C/C++" 的 Project Options 加入 "/GX " 這個option。