3.28.2008

紀錄一下,首次成功(?)的LCD register 設定:
clkval:3
VIDCON0 F4
VIDCON1 8060
VIDTCON0 B0309
VIDTCON1 2C0128
VIDTCON2 879DF
WINCON0 14
VIDOSD0A 0
VIDOSD0B EF90F
這個設定用的參數是:
  lcd_horizon_value = 480;
lcd_line_value = 272;
lcd_vbpd = 12;
lcd_vfpd = 4;
lcd_vspw = 10;
lcd_hbpd = 45;
lcd_hfpd = 2;
lcd_hspw = 41;
g_lcd_frame_rate = 65;
數值完全是ref datasheet。

但是顯示出來,在顯示漸層的淡色區域,會有條狀線條。
同時,大塊貼色塊時,也有暈染現象。

Robert 修改一下參數,把 lcd_hpbd 改為 2 後,就正常了。
( 真是偉大的robert呀)



奇怪的是,datasheet明明寫 horizontal back porch : min 8, typ 45.
是建議用45。

而且,min 只能用8呀。

為甚麼用 2 才對呢?


所以 Robert 數十年的 lcd driver經驗 還是比念datasheet重要呀。

3.27.2008

The GPS party is about to End ?

雖然PND市場逐漸成長,Sirf 在前一陣子宣佈降低第一季的財測,並且將 解僱約50名員工。
主因是因為 客戶需求疲軟, 加上他們進入的Mobile TV市場 成長不如預期。
同時他們也宣佈將 停止Mobile TV 的部門。

這一篇,甚至以這個標題來報導: Why the GPS Party Is About to End.


有關這兩項:
  • 客戶需求降低。
  • Mobile TV 市場未成熟。
另外一篇有不同的看法:

broadcomm 就在mobile TV上接到大量訂單。在XX地區,mobile TV用戶也又大量成長。

而客戶需求降低...

會不會是因為其他 GPS chip vendor 的出現?



所以悲哀的結論是...目前的 PND市場,大部分客戶要的是"堪用的低價產品"?

3.26.2008

每個page 的spare area,第一個 byte 是 bad mark,第二個byte是clean mark,代表這一個page是不是clean (有沒有被寫入資料)。

Clean Mark = 0x00 ,代表這個page有被寫入資料。

Initial bad block

nand 出廠的時候,廠商就已經把bad的block mark好了。這些bad block是廠商在critical environment中測試出來的,在normal 的狀態下,可能是正常的block。

所以不可以擅自將這些mark erase 掉。

依照datasheet,mlc的 bad block mark 是在每個block的最後一個page (127)的spare area中。

spare area的第一個byte若不是0xFF,就是bad block了。

問題:MLC 會有bit error呀,會不會原來是0xFF的,因為bit error,然後變成0xFE ? 然後被誤認為是bad block ?

還是在check bad block時,也要先將spare area作ECC ?

nand flash read

LB Read Command:

  • CE assert
  • CMD 0x00
  • Address
    • Offset in one page
      • A[7:0]
      • A[12:8]
    • block + page address
      • A[20:13]
      • A[28:21]
      • A[32:29]
  • CMD 0x30
  • --- delay --
  • Wait RB ready
  • --- read data (many)
  • CE de-assert
說明:
  • 告訴nandflash,把 哪一個 page 導引到 output buffer
  • 告訴nandflash,將要從該page的哪一個byte 開始讀
等到 RB pin ready,就可以向nandflash 的data port讀取資料。
每讀一個byte,內部 address就會+1。

以 "讀取 第 1 個block的第 4 個page 的spare area" 為例:

先算出 "第1個block的第4個page" 是 整個算起來,block+page index是..

1 x 128 + 4 = 132

LB 的一個page,有 4k 的data, spare area在 data area的後面,所以 就是由第 4096 byte 開始讀。

這樣就決定了 command 中的offset in one page (4096) 和 block+page index (132)。

照著下給 nandflash 後,就可以向nand flash 的data port 讀資料了。

因為 LB 的 spare area 有 128 bytes。所以用for loop
  for(i=0;i<128;i++)
data[i]=readnanddata();
就可以把spare area都讀到data[ ]中了。

3.25.2008

Page Size = 4k (+128 spare)
Block = 128 Pages =
Device = 8192 Blocks = 1024k Pages

Total = (4k+128) x 128 x 8192

翻譯:

每個Block有128 個Pages。
每個Page有4K的Data,最後還加上128 bytes的spare area。

Initial Bad Block

出廠時,每個Block的最後一個Page (127) 的spare area 的第一個Byte (page的第4096 byte),如果不是0xFF,那這個block就是bad block。

"文章"所說的 "Colume Address"就是最後的Byte Address : 一個Page中的Byte Address (0-4097) [Addr 0 - 11].

所以:每個block的第127個page的第4096個byte如果不是0xFF,就是bad block.


LB 是由兩個 GA 組成的。
所以 LB 有兩個R/B (R/B1, R/B2)和 CE (CE1, CE2)。

3.24.2008

m-a : module assistant

m-a 是在debian上build module的command。
把 help 列出來看看..
要有root權限
#m-a prepare
下載,安裝 kernel header,並且設定好 symlink。
Getting source for kernel version: 2.6.22-3-686
Kernel headers available in /lib/modules/2.6.22-3-686/build
Creating symlink...
apt-get install build-essential
Reading package lists... Done
Building dependency tree
Reading state information... Done
build-essential is already the newest version.
build-essential set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 218 not upgraded.

Done!
安裝..
~$ sudo m-a -f auto-install virtualbox-ose-source

Updated infos about 1 packages
Getting source for kernel version: 2.6.22-3-686
Kernel headers available in /lib/modules/2.6.22-3-686/build
apt-get install build-essential
Reading package lists... Done
Building dependency tree
Reading state information... Done
build-essential is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 218 not upgraded.

Done!
download
Reading package lists... Done
Building dependency tree
Reading state information... Done
0 upgraded, 0 newly installed, 1 reinstalled, 0 to remove and 218 not upgraded.
Need to get 0B/205kB of archives.
After this operation, 0B of additional disk space will be used.
(Reading database ... 147773 files and directories currently installed.)
Preparing to replace virtualbox-ose-source 1.5.6-dfsg-2 (using .../virtualbox-ose-source_1.5.6-dfsg-2_all.deb) ...
Unpacking replacement virtualbox-ose-source ...
Setting up virtualbox-ose-source (1.5.6-dfsg-2) ...

Updated infos about 1 packages
unpack
Extracting the package tarball, /usr/src/virtualbox-ose.tar.bz2, please wait...
"/usr/share/modass/overrides/virtualbox-ose-source" build KVERS=2.6.22-3-686 KSRC=/lib/modules/2.6.22-3-686/build KDREV=2.6.22-6 kdist_image
Done with /usr/src/virtualbox-ose-modules-2.6.22-3-686_1.5.6-dfsg-2+2.6.22-6_i386.deb .
dpkg -i /usr/src/virtualbox-ose-modules-2.6.22-3-686_1.5.6-dfsg-2+2.6.22-6_i386.deb
dpkg - warning: downgrading virtualbox-ose-modules-2.6.22-3-686 from 2.6.22+1.5.2-dfsg2-9 to 1.5.6-dfsg-2+2.6.22-6.
(Reading database ... 147773 files and directories currently installed.)
Preparing to replace virtualbox-ose-modules-2.6.22-3-686 2.6.22+1.5.2-dfsg2-9 (using .../virtualbox-ose-modules-2.6.22-3-686_1.5.6-dfsg-2+2.6.22-6_i386.deb) ...
Unpacking replacement virtualbox-ose-modules-2.6.22-3-686 ...
Setting up virtualbox-ose-modules-2.6.22-3-686 (1.5.6-dfsg-2+2.6.22-6) ...
原來 m-a 就是協助install module from source package 的tool。
所以package 中一些只有附source的module,都可以用m-a簡單的作buil and install 。
像 qemu 也是..

m-a 是 module-assistant,安裝
aptitude install module-assistant

有關 kqemu

kqemu 是close source,所以無法提供 compile 好的package直接安裝。
所以debian 採用source code + obj code的方式 。

需要download source code,重新build成 module。

所以用 module-assistant 來作 get - build - install 的動作
--- 實際上只有build module,還是要手動 modprobe 安裝

3.21.2008

Power Up Down Funciton and IOControl

承上。

PowerUp, PowerDown function 和 IOControl 的SetPowerState有一點不同。

Power State 有 D0, D1, D2, D3, D4。

D0 : Normal
D2 : Standby
D4 : Sleep

Sleep 後,一定是 D4沒錯,但是Wakeup時,有可能是 D4-->D0 或是D4-->D2。

所以要將 PowerUp( ) 中的code移到 IOControl 的SetPowerState時,在D0和D2都要注意。

3.20.2008

OEMInit( ) boot 的while loop 有check ACIN 和USBIN和enable charge --- 要改。

Browser Support Standard

browser要支援的:
  • HTML 4
  • XHTML
  • CSS 2
  • DOM Level 2
  • HTTP 1.1 with keep-alive and gzip support
  • JavaScript 1.6 (1.7?) with XMLHttpRequest (AJAX)
  • TLS 1.0/SSL 3.0
  • I-Frame
大概是這些..

3.19.2008

wavedev : to know playing sound or not

一般device driver 藉由 IOControl 的 IOCTL_POWER_CAPABILITIES 回報自己support 的 power state (D0 ~ D4)。
然後 OS 就會依照需要用IOControl 的 IOCTL_POWER_SET 控制 driver 的Power State。

像 WAVEDEV ,在 Capability 時report D0(Normal), D2(Standby), D4(PowerOff)。

所以 ,,, 系統啟動後,在沒有聲音播出時,會將WAVEDEV設在D2 (standby)state,只有在有聲音播出時,才會設為 D0 (Normal) state。

所以... tap screen 的 "doo-doo-"聲,就會反覆 D0--D2, D0--D2, 然後PowerOff時,就會進入D4。

也就是說.... D0 就是 "現在要撥聲音了"... D2 就是 "現在聲音撥完了"。



另外,driver不可以自己改變power state,一定要由OS設定,Driver若是想要改變powerstate,要用
DevicePowerNotify(_T("WAV1:"), (_CEDEVICE_POWER_STATE)D2, POWER_NAME);
通知OS,然後OS就會用IOControl 叫 Driver變更 PowerState。

像:Driver Open 時,就要Notify OS 改變Power State為D0。
Driver Close時,要Notify OS改變Power State為D2。

3.18.2008

  • Noise ON Sleep ON Audio Playing .
  • Cannot Cold boot while battery voltage is very low.
  • Serial Port Lost data .. in BT file transfer.
  • Testing Program - FM transmitter
  • Testing Program - verify BT version.

  • Send Audio driver, weird code piece in official BSP.

3.14.2008

115200 with 64 Bytes FIFO

Baudrate : 115200

Start(1) + Data(8) + Parity(0) + Stop(1) = Total (10)

115200/10 = 11520 Bytes/sec

11.52 Bytes/ms

S3C2443 UART FIFO size = 64 Bytes

64/11.52 = 6 (ms)

400MHz
1/400 uS per inst

10 Bytes /ms =&gt 0.1 ms = 100 us pre byte.

100/400 = 40000 inst.
結論:

OVF : 40000 個instruction,, 也來不及.....

400MHz 敗給 66MHz.

3.13.2008

System Loading .. GetIdleTime

DWORD GetIdleTime (void);
CE 提供一個function call : GetIdleTime( ),用來取得系統啟動到目前,idle tick的總數。
配合 GetTickTime( ) 可以來算system cpu loading。

MSDN 的說明有reference code:
dwStartTick = GetTickCount();
dwIdleSt = GetIdleTime();
// Insert a call to the Sleep(sleep_time) function to allow idle time
// to accrue. An example of an appropriate sleep time is 1000 ms.
dwStopTick = GetTickCount();
dwIdleEd = GetIdleTime();
PercentIdle = ((100*(dwIdleEd - dwIdleSt)) / (dwStopTick - dwStartTick));
.. 就是算出這段時間的system tick和idle tick,然後算百分比。

根據msdn的說明,GetIdleTime( )需要OAL 的配合,OAL必須要mantain 三個kernel變數,宣告在 oal_nkxp.h
extern volatile UINT32 curridlehigh;
extern volatile UINT32 curridlelow;
extern UINT32 idleconv;
實際BSP在 OEMIdle( )中 update curridlelow, curridlehigh 這兩個variable。

其實 curridlehigh, low 剛好是 return value 的high word 和low word。
return value 是DWORD。

而在OEMIdle( )中,就是算出idle的tick數,累計到 curridlehigh/low。

-- 困難在計算 idle 的tick數 ==> 算出可以idle的tick數,設定timer,然後讓cpu進入idle......等timer timeup...

3.12.2008

FreeBSD mirror site : Taiwan, with http:

FreeBSD 7.0 的kernel 針對 multi-processor 作大幅度修改,移除 kernel code中的giant-lock,所以在多cpu 的benchmark上,有很大的進步。-- 效能幾乎是與cpu數量等比例的增加。

從 presentation 中的一頁(p 18):
  • 2007/Feb FreeBSD Release 7.0,當時的Linux 2.6.20.1 在多cpu的效能上還是不太好。
  • FreeBSD 7.0 的benchmarking 公佈。
    ==> Linux 受到"刺激",開始修改kernel code,改善效能。
  • Linux 2.6.22發佈,比FreeBSD 低 15%。
  • Linux 2.6.23採用CFS Scheduler。
所以說,Linux前一陣子突然改變scheduler是因為受到FreeBSD 7.0刺激的關係 ?

這樣,因為那benchmarking 實在太誇張,忍不住想拿FreeBSD 7.0試試看 (雖然我沒有 8 cpu machine)。

找了一下,iso download site都是ftp,沒有http的。

後來在 這裡(http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/
mirrors-ftp.html#HANDBOOK-MIRRORS-CHAPTER-SGML-MIRRORS-TW-FTP),找到所有Mirror Site的List,其中 Taiwan 的 這裡,有http download服務。

3.11.2008

A real $100 PC - ELONEX ONE

真正的百元電腦 (100歐元): Elonex ONE

規格大概是:
  • CPU : LNX Code8 300MHz
  • 512M DDR2
  • 7" 800x480 LCD
  • 1G Flash
  • 802.11b/g Wifi, 10/100Mbps ethernet
  • USB 2.0 x 2
  • 3 Cell Battery - 4 hours
  • Removable QWERTY Keyboard + 2 mouse (1 for Tablet use)
  • Speaker x 2 , headphone + Mic jack
  • 22cm x 15cm x 3 cm - 0.95kg
  • OS : Linos 2.6.21
圖的話就不(敢)貼了...看起來就像是eeePC一樣,但是鍵盤和螢幕可以分離,主機板是在螢幕上。
現在訂購,6月就可以拿到了。

內建的軟體也跟eeePC差不多.. Browser, Office, IM, Music Player, Photo Viewer
Problem : 快速在 touch panel 上移動一陣子後,系統就freeze,但是high priority thread 還依然動作中。
Solve 1 : 把 touch panel 的sampling frequence降低後,就不會 (容易?) 發生了。

結果,在接下來的測試中,High-loading情況下,快速click button icon也會造成當機 (freeze)。

在touch panel driver的 endless polling loop (wait ADC channel OK)中加入debug message。
由debug log發現果然hang在loop 中。

Robert說,ADC有很多driver在用 (battery, touch screen, light sensor),所以有對 ADC register作mutex。

查一下 ====> 這版 touch panel 中沒做!!

3.10.2008

bluetooth - linux command

紀錄一下 linux 使用bluetooth時的一些tool / command

  • hcitool
  • hciconfig
  • sdptool
  • l2ping
發現 這一篇 有很好的說明,使用的command和config都有列表。
virtual com port ,就是一個假的 seraial port driver,當有人open 這個comport時,他再去open其他的comport,把資料轉過來,不然就是丟一些假資料出去。
  1. 建立一個 comport skeleton driver。讓AP可以open, read/write。
  2. 被open時,去open另一個實體的comport (GPS ? TMC )
    1. 讀資料時,到實體comport去讀
    2. 寫資料時,寫入實體comport去
    3. -- 額外的功能:將讀的資料 log下來,存到 flash disk 中 (可能嗎 ?)
  3. 被open時,到flash disk去讀資料,"在適當時間"吐資料回去。

要作 1 :
  1. 為了維持相容性,要先把原來的(GPS, TMC channel 移開)。
--- 啊,有點麻煩,乾脆就直接修改 GPS的comport driver,作兩個特殊版本的GPS driver,一個作log,一個會吐log就可以了。

3.07.2008

bluetooth- protocol stack and service

翻譯這一篇 (http://developer.apple.com/documentation/DeviceDrivers/Conceptual/
Bluetooth/BT_Bluetooth_Basics/chapter_2_section_4.html
)
Bluetooth 的protocol stack:
  ---------------------------------
| Applications and Profile |
| ------------------
| | OBEX | A |
------- -------------- U |
| SDP | | RFCOMM | D |
--------------------------- I |
| L2CAP | O |
--------------------------- |
| HCI | |
--------------------------- |
| Link Manager | |
---------------------------------
| BaseBand/LinkControl |
---------------------------------
| RADIO |
---------------------------------
HCI 是 Host Controller Interface。

HCI 可以說是bluetooth 裝置與主機間的分界,bluetooth規範了詳細的HCI 介面,讓二間有一個統一的介面
也就是說,作bluetooth dongle的,只要做到HCI就可以了。
而寫 pc driver的,從HCI開始寫就可以。
HCI的下一層是 Link Manager

Link Manger 管理 Bluetooth 的底層,實際上只提供兩傳輸方式:
  • SCO : Synchronous, Connection Oriented : 給像voice 這種有即時性需求stream type 的資料用的,在RF中會reserve一定的頻寬給這一類通訊channel使用。
  • ACL : Asynchronous, Connectionless :給非即時性的資料傳輸用,像file, image, command 的傳送。
HCI的上一層是 L2CAP (Logical Link Control and Adaptation Protocol)

L2CAP 是上層通訊的管理者,負責將各種資料適當的以SCO,ACL方式經由HCI向Link Manager溝通,並且將收到的資料重新分給上層的共種ap和profile。
L2CAP利用"channel"的觀念,將一個連線區分成多個"channel",讓每個application使用一個(或多個) channel傳遞資料。

L2CAP之上的stack layer就沒有那麼清楚的階層區分了。就是所有profile。

Device/Host依照需要implement profile,但是有一個profile是每一個device/host都要做的:SDP
(Service Disconvering Protocol).

SDP 定義兩種角色:Service, Client。
  • 提供功能的叫Service
  • 要求使用的裝置叫Client。
Bluetooth可以同時是Service和Client。

(下表參考 Bluetooth - Application Developer's Guide - David Kammer)
..

根據 勇者昇 的說明,ftp 跟phonebook 實際上就用到 Object Push 這個service而已,
實際上,勇者昇 說,他當初是直接用OBEX溝通的,沒有什麼Object Push,,,因為MS就只有提供到OBEX而已。

3.05.2008

  • USB disable charge
  • Optimize Video display
  • SetClearReg - Factory Reset : Ask Nathan
有nUSB_IN,uUSB_ID,nUSB_ADP。
  • nUSB_IN : USB +5V 有電流
  • nUSB_ID : 利用USB_ID pin 來判斷是 USB 還是 Adaptor
  • nUSB_ADP : hardware use - not conneted to CPU.
uUSB_IN 和 USB+5V 狀態一致,所以和 nPWR_OK 的功能一樣。
所以 USB 的狀態只能由 nUSB_ID 來決定

但是未接入USB和接入USB的 nUSB_ID 狀態是一樣,所以要由 nUSB_IN (或 nPWR_OK) 來一同判斷。

只有 AC OK 而且 nUSB_ID 是High的時候,才代表 USB 是插入的。
似乎找到Hang on Booting - black screen with green led ON.

這是在SD card 插入,power button 按下的開機情況。
但是SD card中又沒有 正確的 file.
紀錄一下,Robert開始研究OS + Compiler (實際上已經開始2 weeks)。
目標是一個 "Support Source Level debugging" 的OS。
所以他想從TCC做起,做出一個可以run TCC的環境。
目前的進度是:
使用FreeDOS的 bootloader 和 "自己動手寫OS" 的範例,寫出一小段code,讓VM boot。
Mass Storage 有3G,copy 2G data 進入後,顯示只剩下10M,實際再copy 16M的資料進去會出現 "空間不足" 的訊息。

Robert 接入 PC 後,由PC執行 Format 動作後,再copy 2G data進入後,看來就OK了,顯示剩下 1G。

  • 原狀況是由SD copy 進入 Nandflash -- 也就是由 CE copy 進入
.... 查一下是TFAT還是FAT。

3.04.2008

TomTom Go 730, 930

TomTom 新發佈的 Go 730/930

大概摘錄一下:

有提供TomTom最新的routing計算法:IQ Route

TomTome利用已經蒐集了兩年的database,其中有各路段各時間的平均時速。採用這個平均時速作為各時段routing時的依據,而不是跟以往一樣,參考路段的速限。

TomTom說這樣的routing會是真正的"最快途徑",因為一個沒有紅綠燈的路段,會比一個高速限,但是有很多紅綠燈的路段,來得快。

TomTom說IQ route平均可以縮短50%的開車時間。

這個資料庫是由3百萬個匿名用戶經過超過一年的時間蒐集資料鎖建立的。

TomTom同時在北美推出HD Traffic 服務,HD traffic就是蒐集匿名用戶的行車資料。
TomTom將利用手機網路來搜及實際的行車資料。

除此之外的新功能還有內建3D 指示,DR和語音指令 (輸入地址,命令)。


看來PND還是軟體比較重要,現在已經進步到infra-struture的地步....
3D 實景指示,DR 好像變成標準。

3.03.2008

XP backup/restore with SystemRescueCD

Systemrescue CD 內建的 Partimage作 Windows XP 的 partition save/restore。

目前支援ntfs write了,要手動mount parition進來 (/dev/sda5是用來存放image的):
#ntfs-3g /dev/sda5 /mnt/windows
啟動 partimage :
#partimage
partimage是console模式,不用開啟X。
然後就 follow consol GUI.
要自己記得image path,輸入image path and name。然後一直按 'F5',OK。

Restore時也一樣,mount /dev/sda5後,記得image 的path, name。啟動Partimage...


systemrescue cd開啟進入linux,有些tool是需要X的,可以用'wizard' command開啟X

default 是用gzip壓縮。速度和大小還好。
  • SystemRescue CD 已經在今天正式Release 1.0 版囉
  • 利用Partimage也可以做到 "同時燒錄到DVD"囉。
* 以上只有在virtual machine上測試過...

原來SuperXXPRO附的GHOST8.3支援NTFS呀...