4.30.2009

MBR and partition table

Windows CE 有在看 parition table,partition table 的

Disk 的 Driver 要寫好,放在 StorageManager\AutoLoad\
系統啟動後就會自動 load 這個 driver 進來,丟入 disk parameter 要求初始化,
這個 driver 就要讀入 partition table,回應給system。

system 依照 partition table 的內容,filesystem type,load 對應的 driver 進來。

msdn 說 partition table 是 mbr 的一部分,描述 disk 的 partition layout。最多可以包含 4 個 partition。

mbr 會有一個 end mark : 0x55AA。
在這個 end mark 的前面,擺 partition table [4]。

一般的mbr 是 512 bytes,所以parition table 的 offset 就是:
512 - 2 - (16x4) =

partition table 的entry (一個parititon) 的structure 定義在 COMMON\OAK\INC\bootpart.h
typedef struct _PARTENTRY {
BYTE Part_BootInd; // If 80h means this is boot partition
BYTE Part_FirstHead; // Partition starting head based 0
BYTE Part_FirstSector; // Partition starting sector based 1
BYTE Part_FirstTrack; // Partition starting track based 0
BYTE Part_FileSystem; // Partition type signature field
BYTE Part_LastHead; // Partition ending head based 0
BYTE Part_LastSector; // Partition ending sector based 1
BYTE Part_LastTrack; // Partition ending track based 0
DWORD Part_StartSector; // Logical starting sector based 0
DWORD Part_TotalSectors; // Total logical sectors in partition
} PARTENTRY;
size是16 bytes.
Part_BootInd 的value 也定義在 bootpart.h;
// Flags for Part_BootInd
#define PART_IND_ACTIVE 0x1
#define PART_IND_READ_ONLY 0x2
#define PART_IND_HIDDEN 0x4

其中Filesystem 定義在 COMMON\OAK\INC\bootpart.h
#define PART_UNKNOWN            0
#define PART_DOS2_FAT 0x01 // legit DOS partition
#define PART_DOS3_FAT 0x04 // legit DOS partition
#define PART_EXTENDED 0x05 // legit DOS partition
#define PART_DOS4_FAT 0x06 // legit DOS partition
#define PART_DOS32 0x0B // legit DOS partition (FAT32)
#define PART_DOS32X13 0x0C // Same as 0x0B only "use LBA"
#define PART_DOSX13 0x0E // Same as 0x06 only "use LBA"
#define PART_DOSX13X 0x0F // Same as 0x05 only "use LBA"

// CE only partition types for Part_FileSystem

#define PART_CE_HIDDEN 0x18
#define PART_BOOTSECTION 0x20
#define PART_BINFS 0x21 // BINFS file system
#define PART_XIP 0x22 // XIP ROM Image
#define PART_ROMIMAGE 0x22 // XIP ROM Image (same as PART_XIP)
#define PART_RAMIMAGE 0x23 // XIP RAM Image
#define PART_IMGFS 0x25 // IMGFS file system
#define PART_BINARY 0x26 // Raw Binary Data

4.28.2009

geotate 的即時定位技術

將RF收到的 raw data 存到照片中,回去後再用 PC 解出真正的 nmea 資訊,這樣不僅可以省去dsp 與計算的功耗,也可以省掉定位的時間。
利用這樣的方式,所有 相機都只需要增加一點硬體 (GPS RF + AD),就可以有 geotag 的能力。不需要開機等鎖定,也不會多耗很多電池。

ref : interview

4.27.2009

mythbuntu

原來ubuntu有for media center 的版本,叫 mythbuntu , 就是myth + ubuntu

要注意 繁體中文叫 Hanzi(Traditional)

但是看不到什麼feature...大概在Myth吧..

還有 backend 就是 TV card 的意思

Linux GPRS

Linux GPRS Howto 的說明比一些 GPRS Module 的application Notes 還清楚

PDP : packet data protocol. 資料封包 (對應的,語音連線送的是聲音封包)。
APN : Access Point Name。

用minicom 來下 command。要注意 屬於 dialout groupe。

下 AT 回應 OK 代表RS232 線連線 OK. (其實有看到 AT 就代表 正常,因為 AT 也 modem echo back )

下 AT+CPIN? 檢查 pin number 是不是有輸入,回 READY 代表正常。
如果不是,用 AT+CPIN=1234 輸入 pin number (1234)

下 AT+CGATT? 檢查是不是已經attach 到 GPRS network 了,回應 1 是OK。
如果是 0,用 AT+CGATT=1 叫 modem attach。

設定PDP 傳送的 profile,modem 可以設很多 pdp profile,方便user 轉換。
AT+CGDCONT=1,"IP","INTERNET"
  • 1 : profile 1
  • "IP" : PDP type (ip packet, 好像一定要大寫)
  • "INTERNET" : APN (每一家電信公司不一樣)
撥號,GPRS Servie 的 number 固定是:
*99***1#
後面的 " 1" 是 PDP profile 號碼。

ATDT*99***1#
播完號,出現 CONNECT,然後就會看到一堆亂碼。

..到這裡,代表 linux 到 gprs modem 端已經OK了。



接下來設定 linux 的撥接動作。

GPRS Modem 是以 ppp 的方式傳送資料,所以要config ppp。

好像大多數網站都說 wvdial,所以也用wvdial,wvdial 是 ppp 的 front-end,用一個 config 檔而已。

修改 /etc/wvdial.conf:

[Dialer Defaults]
Modem = /dev/ttyS1
Baud = 115200
Init = AT+CGDCONT=1,"IP","INTERNET"
Phone = *99***1#
Username = any
Password = any
Dial Command = ATDT
New PPPD = yes
雖然不檢查username, password,但是還是要填值,否則 wvdial 會 complain。
然後..
 : ~$sudo wvdial
就會出現..
$ sudo wvdial
--> WvDial: Internet dialer version 1.60
--> Initializing modem.
--> Sending: AT+CGDCONT=1,"IP","INTERNET"
AT+CGDCONT=1,"IP","INTERNET"
OK
--> Modem initialized.
--> Sending: ATDT*99***1#
--> Waiting for carrier.
ATDT*99***1#
CONNECT
~[7f]}#@!}!}$} }<}!}$}&@}#}$@#}%}&},<eI}"}&} } } } }'}"}(}"{8~~~
--> Carrier detected. Waiting for prompt.
~[7f]}#@!}!}%} }<}!}$}&@}#}$@#}%}&},<eI}"}&} } } } }'}"}(}"3j~
--> PPP negotiation detected.
--> Starting pppd at Tue Apr 28 11:52:35 2009
--> Pid of pppd: 30572
--> Using interface ppp0
--> local IP address 116.59.14.180
--> remote IP address 10.0.0.1
--> primary DNS address 168.95.1.1
--> secondary DNS address 168.95.192.1
這樣好像連上了..
但是 routing table 好像沒update 耶..

把eth0 斷掉後,重新連線,roue -n
default gateway 是ppp0 (自己)


without flow control and modem signal


如果GPRS Modem 和 Linux 間只有 TX/RX/GND,沒有其他 flow control (CTS, RTS) 和 modem state (CD, DSR, CTR) 信號。

雖然有看到/etc/ppp/options 中有 crtscts 選項可以設,但是好像沒效,wvdial 一定會去 check ctsrts。
所以wvdial 在第一階段,AT+CGDCONT=1,"IP","INTERNET" 就不通了,會反覆兩次,然後fail : Modem No Response。

這樣就需要把 linux 這一端的 RS232 的 CTS 和 RTS 短路 (7-8)。
這樣就可以正確下命令,和撥號,撥通...

但是一但撥通,就會有 carrier lost 的message。
這樣就要將 linux 這一端的 modem status DTR, CD, DSR 短路 (1,4,6)。
這樣就OK了

ref Null Modem




Linux 同時啟動internal network

就是要設定好 routing path.

因為有設定bridge (br0),所以要把 br0 啟動起來,把 eth0 關掉。
把 192.168.0.0 設定 gatway : 192.168.144.254
route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.144.254 br0

用錢可以解決的事: 感度與範圍

比較敏感的 Sensor 比較容易飽和 -- 也就是說,量測尺範圍不夠。
量測範圍大的 Sensor,就比較遲鈍 -- 因為刻度變大了。

那要怎麼做出量測範圍大,靈敏度又好的 Sensor 呢?


就裝兩個 Sensor 就好了呀,小Sensor 飽和了就看大Sensor 的值....

0xlab 開張

0xlab 開張了

看看其中 Projects 的網頁,都是一些讓 emebedded system developer 很exciting 的東西。

其中 planet 部份是所有相關blogger 的blog 發佈處,裡面已經有很多有趣的文章了:像..我弄了很久弄不起來的EFL build 介紹,在andriod 中播放 youtube 影片,..

4.24.2009

撥接 GPRS..

撥接gprs 上網的動作到現在還是沒變(ref 2005)..

不同的地方就是 baudrate 變了-- 提昇到 115200。

所以在新建 modem 時,就沒得選了,只好先選一個低baudrate 的 (e.g 9600),create 完後,再將 baudrate 改 115200。

另外撥接的號碼也沒變,還是謎的 *99#
啊~不對,以前是 *99***1#
但是兩個號碼都可以..

接下來就要測 bandwidth 了..

4.23.2009

回顧 - 2006 的期望

今天在找以前作network flooding test 的筆記時,看到自己寫的:

......
想想目前一切需要都可以由網路服務取得。只要能跑firefox,似乎一切就OK。所以 也不介意OS是windows, linux還是OSX。 這樣想想...firefox + google似乎一切就搞定。

真希望會有一種full size keyboard,low speed cpu (enough to run firefox),long battery time,12" display ,wifi + 3G 並且重量輕的裝置。 我想,以目前的技術,應該是絕對可以做出來的吧 :)
這不就是現在的netbook 嗎?

想不到我在 2006 就這樣想了...

4.22.2009

build new rev openocd in msys

新rev 的 openpcd 需要作 bootstrap,(也就是說,需要 aclocal, autoconf, automake..)

follow 這一篇..安裝 msys, minGW 環境。

msys - 先安裝 1.0.10
msys-DTK : 是build 需要的一些 tool,像 perl, autoconf, automake... etc
然後 download msys-core-1.0.11,解開後,覆蓋 msys的安裝目錄。
msys 的 update 就是 untar , overwrite ?
之後安裝新版 autoconf, automake, libtool。
安裝方式都是 download mingw patch 過的 source code, /.configure , make , make install。

http://ftp.gnu.org/gnu/autoconf/autoconf-2.61.tar.bz2

http://ftp.gnu.org/gnu/automake/automake-1.10.tar.bz2

http://ftp.gnu.org/gnu/libtool/libtool-1.5.24.tar.gz

這些tool 會install 在 /usr/local/bin,和原先的 tool 位置 (/bin) 不同。

OK !

可以到 openocd 下作 bootstrap,configure and make.

因為已經是在 mingw 下作,所以 configure 時不用加 CC="gcc -mno-cygwin"
只需要加 -enable-ft2232_libftdi


  1. configure 發生exception ,說找不到 linusb0.dll ,是因為沒有install libusb-win32 driver 的關係,download 那個有 "filter" 字樣的 libusb-win32-exe 下來 安裝就可以。
  2. bootstrap 發生 Can't locate object method "path" via package "Autom4te::Request" at /usr/bin/autom4te line 81.

    說明
    是說把 autom4te.cache 刪掉就可以。
    的確是這樣,刪掉之後,這個 error 就沒了,但是出現其他的 error。

    其實這是 autom4te 版本不一致的關係,安裝過新版的 automake 後就 OK 了 (就不會出現這個 error).

build openocd under mingw - with ftd2232 chip interface

(有 update 喔)
openocd 在 mingw 下 build..

先要 install mingw(gcc for win) 和 msys(unix shell for win)

因為安裝 msys 會尋問 mingw在哪,所以要先install mingw:

mingw 現在以經有像 cygwin那樣的網路安裝了,download MinGW-5.1.4.exe
http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=240780

執行後就會出現問題,選安裝,然後而外的package 選 g++ 和 make..
之後就會 自己 download 和安裝完畢
我裝在 C:\MinGW
裝完後要手動把 c:\mingw\bin 加到 cmd 的環境變數。

這樣裝完後,就可以開啟cmd.exe,run gcc 了

但是要run make 和 bash file需要 msys。 download msys-1.0.10.exe
http://downloads.sourceforge.net/mingw/MSYS-1.0.10.exe

直接執行就可以,中途會問你postinstall,回 y。
然後問你有沒有 MinGW,回答有,並且把剛剛install MinGW的 path 寫出來
!!但是因為在 unix 中,目錄的左右斜線是相反的,要注意。
裝完後就可以在 programfile - MinGW- msys 啟動 msys 環境。



這個openocd 用 ftd232 (usb-232).
所以要 libftdi.a
libftdi.a 會用到 libusb.a

因為是 for windows 版,所以要dowload windows 版 libusb - libusb-win32-device-bin-0.1.12.1.tar.gz
http://libusb-win32.sourceforge.net/

下載的是bin 檔 (prebuild),所以把 usb.h copy 到 /mingw/include 把 libusb.a copy 到 /mingw/lib

還要安裝 libusb-win32 的 dll : libusb-win32-filter-bin-0.1.12.1.exe
http://sourceforge.net/project/downloading.php?group_id=78138&filename=libusb-win32-filter-bin-0.1.12.1.exe&a=96392657

這樣就可以 開始 build libftdi.a - download libftdi-0.15.tar.gz
http://www.intra2net.com/en/developer/libftdi/download.php

解開,到libftdi-0.15 下, /.configure 然後 make
會出現 error,但是 check 一下 error message,會發現 libftdi.a build 完,是 build example 時有 error,所以不管。

把 src/ftdi.h copy 到 /mingw/include
把 src/.libs/libftdi.a copy 到 /mingw/lib


最後就要 build openocd 了..

download trunk 的版本 (release 版支援的 cpu 比較少..)
解開, run ./bootstrap
./configure -enable-ft2232_libftdi CC="gcc -mno-cygwin"
make

4.17.2009

SD Register in SDBUS driver

MS SDBUS driver 的 SD Card Register Structure:
typedef struct _SDCARD_CARD_REGISTERS {
union {
UCHAR OCR[SD_OCR_REGISTER_SIZE]; // SD OCR
UCHAR IO_OCR[SD_IO_OCR_REGISTER_SIZE]; // IO OCR
};
UCHAR CID[SD_CID_REGISTER_SIZE]; // CID
UCHAR CSD[SD_CSD_REGISTER_SIZE]; // CSD
UCHAR SCR[SD_SCR_REGISTER_SIZE]; // SCR
}SDCARD_CARD_REGISTERS, *PSDCARD_CARD_REGISTERS;

在 \\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\SDCARD\SDBUS\sddevice.hpp

這個variable 宣告在 CSDDevice 中:
    SDCARD_CARD_REGISTERS   m_CachedRegisters;      // cached registers

OpenStore is CreateFile.

原來OpenStore("Disk1") 就是 CreateFile("\\StoreMgr\\Disk1",,,);

在 PrivateCode看到的..

但是沒差呀...還是先要知道 Disk1 這個name..

加一些keyword 好了: read raw partition data in windows ce

火車

這次Engadget介紹的火車概念很有趣:http://www.tubularrail.com/background.htm.

不需要鐵軌,只需要一站一站的中間支撐。

他說,這是利用火車車體剛性的原理,就像一隻鉛筆,你可以把鉛筆伸出桌外1/2,鉛筆不會掉下去。

這個idea 他們叫: reinvent the wheel by removing it.

4.16.2009

CE: SDBUS, load SDIO Client Driver

source : \\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\SDCARD

SDBUS 偵測到SD card 插入後,依據 SD card type load client driver (DLL) 的 code:

Slot-HandleAddDevice()
Device-SDLoadDevice()
DeviceFolder-LoadDevice()
ActiveDeviceEx( )

ActiveDeviceEx() 會把 DLL load進來,至於要load哪一個 DLL就要看 Registry 設定。

4.15.2009

plurk

用plurk後blog的文章真的少了 (其實本來也不多)。
因為一些簡單的,少量和bookmark性質的都丟plurk..

在MessageBox 中show 簡體

要show一個MessageBox,其中的Message是簡體。
但是show出來卻有一些是 ??

Loyal 說這是編輯器的問題,evc 把簡體中文顯示成??

但是evc中右眉辦法輸入中文,evc也沒 command line 模式。

所以?

偉大的Loyal 說,改成直接指定character value 好了..

TCHAR showstring[]={0x6546,0x8779,..0x00};
MessageBox(showstring);
這樣就可以了。

至於字串的內碼,可以貼到ultraeditor中,再用 HexMode開。

要注意的是,小Tony說,開始的0xFE, 0xFF是 encoding header,所以要忽略。

4.08.2009

acgenral.dll fault

安裝完 SP2 後,.偶而會出現 "Generic Host Process for Win32" Error。
是 acgenral.dll 發生。

查了一下,要安裝 KB958644 這個 update。

裝完後... 還不確定,到現在還沒發生...

4.07.2009

WPA, WEP in Windows XP

Windows XP 從 SP2 才支援 WPA 。
分辨的方法是在"搜尋到的 AP " 中,使用 WPA 的 AP,會有 (WPA)的標誌在後面。
所以直接輸入 密碼就可以。
換句話說,WPA, WEP是 Windows 決定的。
所以昨天的問題:FON的MyPlace 無法登入,是因為MyPlace 後方沒有(WPA) mark。也就是說,Windows 不認為MyPlace是用 WPA ,所以一直用 WEP 認證。

至於Windows 為什麼不知道 MyPlace 是WPA ?

或許是 FON 使用分裂 MyPlace -- FON_INTERNET 兩個 SSID的方式,Windows 不支援。
或者是..因為在 SP1 (還沒 update 到 SP2) 時,曾經搜尋過 MyPlace,並且連線失敗,所以之後就....

GPS by TV tower

很多人想在GPS上求取更高的精密度,這一篇就是利用電視廣播來增加精確度。

他說電視廣播信號的強度是GPS的10,000倍,而且頻率比較高,所以穿透力比較強。

這個系統同時使用GPS和電視信號。


所以說,現在的PND大多內建TV功能,可以利用這個來增加GP定位能力?

... 有點想太多 ...

4.03.2009

increase SD performance

MS 的 SDMemory Driver (DLL),最常用的 Read 大小是 0x10000 bytes。

在 SDLIB\sddebug.c 的 SDPerformSafeCopy( )。
這個SDPerformSafeCopy() 只是在memcpy()包上 Try - Catch。防止不正常的memory exception .所以可以照著作一個 assembly版的。
(或者乾脆不管 >< )
所以可以 optimize 這個。

用ldmia, stria。可以用的register 有:
r0, r1,r2 要作 argument,sp 不行,所以剩下..


要先看看call 這個function (以0x10000 size call) 時,是 Synchronize 還是 none-synchronize。
synchronize的話,才會有效 (否則只是降低 cpu useage)。

OK, 已經確認是Synchroniz,,

4.01.2009

Windows CE 的 SD BUS architecture

MS 的 SD card driver 分為三層:
source code 在 C:\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\SDCARD
  1. BUS : SD BUS 的動作。
  2. Hardware : 底層相關的 operation,呼叫和被 BUS driver 呼叫。
  3. SD card client : SDBUS Driver 會依照 SD card 種類和 regisry 內容 load client driver 進來。

BUS Driver 又區分為三層:
  • Host
  • Slot
  • Device
所有送 SD CMD 都要由 Device 這一層送出。
SD card 插入,移出由 Slot 這一層負責。
Host 和 Slot 在機器開機時就 initial 完了 (因為一個機器有多少 SD host,一個 Host 有多少 slot 都是固定的)。

Slot 偵測 SD card 插入,new 一個 Device 出來,然後開始下SD CMD,取得插入的 SD card 資訊。填入 Device Class。然後 load Client Driver 進來。

整個 SD BUS Driver 的 class 都有繼承 RefObj,所以可以 ObjectIndex 找出 object 實體。
所以到處在 FindObjectFromXXX
然後用 Host, Slot, Device 動作。


ref: http://bluefish.blog.51cto.com/214870/474653