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 了..