12.30.2006

build cross toolchain from source

ref Nelson's notes ,想不到現在cross build 已經簡化很多了。所以也來試試看。

binutils:
README 中沒有說明configure時可以用的option 有哪些,當然,也沒說明cross-build的方法。
在configure中看到
./configure --help
會列出簡略的build option。
但是沒說--enable, --dieable 可以用的option 有哪些..(大概知道要enable, disable哪些東西的人自然就會 知道吧 :p)。
Nelson's Notes中的
  • --target=arm-elf
  • --prefix=/gnutools
只有兩項。還蠻直觀的..試試:
./configure --prefix=/gnutools --target=arm-elf
很順利,產生Makefile,
之後
make all
install path在/gnutools,所以要是root:
sudo make install
到install path (gnutools) 去看,可以看到binutil 已經裝好了。
接著作gcc...
download gcc-core和g++,unpack (g++會unpack到core中)。
看一下README,再看看FAQ,,需要autoconfig,先安裝autoconf。
grep 一下出現arm的地方..
在INSTALL目錄有比較詳細的安裝說明,是html格式的,從index.html開始看起。
  • --target=arm-elf
  • --with-gnu-as:
    說明系統使用gnu assembler,make process會去尋找build時需要的assembler,如果找到的assembler 不是gnu,卻指定了這個option,會產生conflict。
    同理,如果找到的assembler 是gnu,卻沒有指定這個option,也會有conflict。
    assembler 包含在binutility。
  • --with-gnu-ld
    和--with-gnu-as的意思一樣。說明ld的程式版本。
最後一個section 是有關cross的(終於)。
  • --with-headers=dir
    作cross build時,必須要用這個option 指定target使用的hear files所在的位置。如果 prefix/target/sys-include 目錄不存在的話,build process會將這個option 指定的header修正後,copy到gcc 安裝目錄。
  • --with-libs="dir1 dir2 .... dirN"
    說明target 所用的libary 所在位置,build 過程中會將這些library copy到gcc 安裝位置。
  • --with-newlib
    指定使用newlib。
這一段有點問題,build gcc 需不需要先準備好assembler和library ?
可以參考crosstools的script...

做到這裡,開始懷疑這個步驟和自己的觀念...
先暫停一下..

12.29.2006

USBFN - MDD -PDD

Driver 要export的funciton 有
  • Init
  • -PreDeInit
  • DeInit
  • Open
  • -PreClose
  • Close
  • PowerUp
  • PowerDown
  • IOControl
但是Driver分成MDD, PDD兩部份,MDD是MS寫好的,PDD要vendor自己寫。
MDD和PDD最後會Link啟程成為Dll。
最後Dll name和export function 在PDD的build file中定義 *.def。
因為MDD在上層,是MS為了統一driver interface所寫的,所以export funciton 也通常會是implement在MDD中。

MDD, PDD 雖然是Link在一起,但是溝通並不是直接使用funcion name,
而是透過function table (array)。

在MDD呼叫PDD的Init function時,MDD, PDD 互傳需要的function array。

( 既然PDD_Init都直接call了,為甚麼其他的就要透過function array ?
又不兩個DLL,動態load,沒辦法直接call..)



UfnPdd_Init(
LPCTSTR pszActiveKey,
PVOID pvMddContext,
PUFN_MDD_INTERFACE_INFO pMddInterfaceInfo,
PUFN_PDD_INTERFACE_INFO pPddInterfaceInfo
)
pszActiveKey : 好像是registry Key
pvMddContext : 指向使用Mdd Class ?
pMddInterfaceInfo : 只是一個version string 和一個function pointer - PUFN_MDD_INTERFACE_INFO. Callback funciton.
pPddInterfaceInfo : Init Function 就是要把這個function table 都填好,給Mdd使用。


Ufn_Init 從registry 中取出chip access memory base address, range, isrname, 做好access chip 的準備。
create需要的event, critical section, thread. BusAccessHandle
安裝isr : KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR...)

USB 的Pdd 好像只需要MDD的一個function : Notify。
PDD則要準備好 PUFN_PDD_INTERFACE_INFO 內的20個function,供MDD使用:

MDD呼叫的順序是
  • DllEntry
  • Init
  • IOControl
  • IsConfigurationSupportable
  • IsEndpointSupportable x 3
  • RegisterDevice
  • InitEndpoint
  • IOControl
  • Start
之後就是usb data傳輸動作,在插入PC後才會有.
enumeration process:
  • IssueTransfer
  • SendControlStatusHandshake
  • SetAddress
  • SendControlStatusHandshake
  • IssueTransfer
  • SendControlStatusHandshake
反覆以上"IssueTransfer" - "SendControlStatusHandshake" N次
之後
  • InitialEndpoint
  • ClearEndpointStall
以上重複兩次,
  • IssueTransfer
  • SendControlStatusHandshake
重複兩次,之後,就都是 IssueTransfer..

IsAPIReady - WaitForAPIReady

http://msdn2.microsoft.com/en-us/library/bb202819.aspx

需要知道某service 是否存在(或是已啟動),可以用這兩個API來詢問:
BOOL       IsAPIReady(  DWORD hAPI );
DWORD WaitForAPIReady( DWORD dwAPISlotIndex, DWORD dwTimeout);
從名子就可以知道,一個是polling,一個是Wait Timeout。

WaitForAPIReady 比較好用,但是比較麻煩(? CE 6.0 and above ),IsAPIReady 比較容易用:
argument hAPI 是API 的分類:
  • SH_SHELL : All the Shell Service
  • SH_GDI : All the GDI API
  • SH_WMGR : Window Manager API
用在driver, service比較常用,call 某shell service 前,先確認一下該service 已經啟動(load and start)。

IsAPIReady 宣告在 : WINDEV.H

12.27.2006

download Debian DVD by jigdo

照著 http://www.debian.org/CD/jigdo-cd/ ...
download windows version jigdo . unzip.
將整個folder放到你要的位置,double click jidgo-lite.bat
出現message,問jidgo 檔。
到debian iso download page,選一個jidgo link. 輸入。
http://cdimage.debian.org/debian-cd/current/i386/jigdo-dvd/debian-31r4-i386-binary-1.jigdo
第二片是
http://cdimage.debian.org/debian-cd/current/i386/jigdo-dvd/debian-31r4-i386-binary-2.jigdo
要一片一片作

接著問有沒有上次download過的iso檔,有就輸入。沒就return.

問 debian package site - 去找台灣的mirror ,輸入
http://ftp.tw.debian.org/debian/

開始download template, 接著download iso packge...


會先download template deb, 形成一個4.2G 的DVD iso image (因為我是選dvd)。
然後再download package填入。

使用jigdo 的好處是 下次要download 新版本的DVD iso ,jidgo 會check,只download 不一樣的部份。

README有說明如何設定proxy。
這個用來download testing .比叫核算

http://cdimage.debian.org/cdimage/weekly-builds/i386/jigdo-dvd/

12.26.2006

Device Driver 呼叫另一個Device Driver

這個是 Auron 發現,先說明一般使用方法:

Device Driver Code要使用到另一個Device Driver,和一般Applicaiton 一樣
  • CreateFile( ) 取得要使用的Driver的hadle。
  • DeviceIoControl( ) 對該Driver 進行控制。
  • Device Driver 退出時(unload, deinit...) CloseHandle( )
當然,Create後,使用一般的File Operation (Read, Write, Open..)也可以。

另一種方法(Auron's Way):

利用所有Device Driver都在DEVICE.EXE 的address space的這個特性,各device driver 間的記憶體不經轉換,可以直接呼叫。

所以 另一個作法就是在callie driver 中implement 一個iocontrol,將所有funciton pointer 放在talble中傳遞出來。

這樣同在DEVICE.EXE中的所有driver都可以利用這個 IoControl 取得那個driver 的function pointer,直接呼叫。 (減少不必要的kernel-user space 轉換的overhead)。

為了防止不當呼叫,Callie 的IoControl中該function code implement時,會check..
  if (GetCallerProcess( ) != self->hProc )
Error..
其中self->hProc 會是DEVICE.EXE

Auron 發現這樣的code,雖然是在同一個 process space,但是呼叫時,參數傳遞不可以用local variable (in stack)。否則會發生"access violation"。
所以要呼叫時,傳遞pointer參數一定要指向global variable。

Address Space , Device Driver and DeviceIoControl

提供DeviceIoControl( ) function 的有兩個 EXE : Service.EXE, Device.EXE。
在 devcore.c 和 service. cpp 中 都有這樣的function table :

DevFileApiMethods[] 其中第11個entry 就是 DeviceIoControl。

這個Set API function array 要經由CreateApiSet( )向kernel 註冊,才能成為一個經由"File Handler"呼叫的function。

Kernel 的SC_DeviceIoControl ( ) 會經由 pci->ppfnMethods[11] 呼叫 entry11 - DeviceIoControl。

SC_DeviceIoControl( )是 g_KmodeEntries 中的一個entry。

在CoreDllInit( ) 的DLL_PROCESS_ATTACH時, copy 一份到Coredll的位址空間。
-- 但是找不到 invoke g_KmodeEntries( )的code :(

因為 API entry (wrapper) 的code完全沒有 (例如 DeviceIoControl( ) ),只能找到下一層,所以不知道user program call DeviceIoControl( )後,有沒有切換到其他process (device.exe ? kernel ?) 的位址空間。
所以不知道 各Driver 的Iocontrol Function 是 run 在那一個process 的address space (猜大概是device.exe吧)。

http://blogs.msdn.com/ce_base/archive/2006/02/02/Inside-Windows-CE-API-Calls.aspx
有說明這一段,wrapper implement在coredll中,所有user application link coredll.dll。
coredll 經由 coredll.def 修改 export 出來的function 名稱:
   DeviceIoControl=xxx_DeviceIoControl @179 
所以呼叫DeviceIoControl( )是會呼叫到 xxx_DeviceIoControl ( )。


在oak\inc\pkfunc.h 中可以看到memory model 的constant 宣告:
http://140.114.71.71/WinCE/templates/chapters/chapter10.v1.doc
FIRST_MAPPER_ADDRESS
LAST_MAPPER_ADDRESS 0x7C000000
在這段code的附近可以看到有關"slot", 每個slot 32M (25bit) ,slot 0 reserve 給 running process 和MAX_PROCESS = 32的宣告。

driver, user mode, kernel mode

因為我不知道 CE 5.0 的driver 到底是在user mode還是在kernel mode,還有各個driver 是不是共用一個位址空間。所以..凡而要由 CE 6.0 的文章來看 5.0 的說明:

from : http://blogs.msdn.com/mikehall/archive/2006/09/07/745261.aspx

Windows CE 是 32-bit OS,所以定址能力是 4GB ,從 CE 1.0 到through CE 5.0 高位址 2GB 空間是給 kernel 使用, 低 2GB 則是給..memory mapped files 和切割成很多 32MB 的"slots" 給process - "core o/s" services, 包含device.exe,GWES, file system manager。
With CE 6.0 一些 core o/s services 移到 kernel space :driver manager, GWES, file system manager。
以往 CE 的device driver 都是user mode driver,到了 CE 6.0 你可以選擇是要user mode還是kernel mode.

CE 5.0 所有的driver 都是在 device.exe 中的一個instance, CE 6.0 你可以讓每個 user mode driver 有自己的process。
所以 5.0 中,所有driver 似乎共用一個memory space (pointer 不用轉換 ? ),而且都是在user mode (所以要call virtual - physical 轉換 allocate, transfer 一塊記憶體位址。

其他

Windows 的device driver 只是為了統一API,不是為了保護或管理 hardware resource。

http://www.windowsfordevices.com/articles/AT5839010990.html
Windows 的 driver 只是 DLL. DLLs 被載入 parent process 的位址空間。

parent process 可以呼叫 DLL expose 的funcion .
parent process 用 LoadLibrary( ) or LoadDriver( ) 載入DLL.
LoadDriver 載入 DLL ,同時設定DLL不會被pageout

build Device Driver Dll 和一般Dll 有什麼不同?
Device Driver 最後會被DEVICE.EXE load進入memory。

Dll 可以用DOS Toool : dumpbin 看看exports出來的function 有哪些。


http://blogs.msdn.com/ce_base/archive/2006/02/02/Inside-Windows-CE-API-Calls.aspx
說明 device.exe, service.exe, coredll.exe 也不是在kernel space。而是在所屬的process 自己的space。
device driver 由device.exe load,所以屬於 device.exe 的address space。

READ/WRITE_PORT_USHORT

不知道是不是為了跨平台,driver 對hardware port access (read/write)都用PORT 來作
WRITE_PORT_USHORT(reg, val)
以arm platform 來看,

PUBLIC\COMMON\DDK\INC\ddkmacro.h  
中直接define 為
(*(volatile unsigned short * const)(reg) = (val)
所以就是直接位址寫入。

ddkmacro.h 由ceddk.h include.
ddkmacro.h -- ceddk.h (when define CEDDK_USEDDKMACRO )
driver source (header) include ceddk.h

12.25.2006

On Schedule ..

因為進度落後,所以想出從豎井再開挖

....想出這個辦法的人在工作完成前應該住在豎井底層.....

? 結果還是用鑽炸法完成 ? 那當初決定要用TBM 的人是誰 (顧問公司)?
想花大錢,減少工時,結果反而得到反效果.

12.23.2006

Screen - Terminal (agent)?

screen - 真奇怪,這麼普通的字彙,google 起來第一名竟然是 linux 的terminal agent。
很久以前就看過很多介紹,覺得真是超讚的軟體,尤其在連線環境很差的情況,用ssh 連線常常斷線,每次一段,就要重連,所有都要再來一次。

有screen 就方便了,他幫你開啟一個 shell (?) 讓你操作,幫你保持login,所以即使斷線了,重新連線,再進入剛剛的screen section ,一切都好像沒發生過一樣。

使用方法很簡單,ap-get install screen。
輸入 screen ,就啟動screen ,進入screen。 - 首次進入會有一些message。

第二次進入screen,看起來好像沒什麼改變,但是你目前的操作,都是在screen 之中了。

要記得的命令只有:

在screen 中..

Ctrl-a d : 退出目前的screen (把screen 放到background),回到shell。

在 screen 外 (shell) ,..

看看目前有幾個screen section ..

screen -ls
回到screen ..
 screen -r
要是有很多screen section ..要回到哪一個呢?

有時候,還在screen 中,網路斷了,再連線,用screen -r 恢復失敗,用screen -ls 看,發現screen 那個session 是"Attached"。
所以用
screen -d -r
意思使說。恢復剛剛的session,如果需要的話detach 後再attach..
這樣就OK了。

12.22.2006

USB 1.1 enumeration .. XP's EP0 SETUP sequence

已知OK的裝置,USB1.1看enumeration process:
Request. Value(H). Length(L)
0x06 . 0x01 . 0x40 Get Device Descriptor, Length 0x40
0x05 . 0x00 . 0x00 Set Address
0x06 . 0x01 . 0x12 Get Device Descriptor, (again) with accurate length
0x06 . 0x02 . 0x09 Get Configuration Descriptor, 1st 9 byte section.
0x06 . 0x02 . 0xFF Get Configuration Descriptor, full size
0x06 . 0x03 . 0xFF Get String ID 1
0x06 . 0x03 . 0xFF Get String ID 2
0x06 . 0x03 . 0xFF Get Stirng ID 3
0x06 . 0x03 . 0xFF Get String ID 4
0x06 . 0x03 . 0xFF Get String ID 5
0x06 . 0x01 . 0x12 Get Device Descriptor, (again) with accurate length
0x06 . 0x02 . 0x09 Get Configuration Descriptor, 1st 9 bytes section
0x09 . 0x00 . 0x00 Set Configuration
...
次序不一樣,這個device的device descriptor中, iManufacturer=1, iProduct=2.

USB 2.0 enumeration..

前次USB enumeration process.. 收到. PC 的setup packet sequence..

Request. wValueH(Type)
06. 01 Get Device Descriptor
05. 00 Set Device Address
06. 01 Get Device Descriptor
06. 02 Get Config Descriptor (Length=9 )
06. 02 Get Config Descriptor (Length=0xFF)
..Get Config Descriptor 連續兩次.

若是Device Descriptor 中iSerialNumber 這個欄位不是0的話,在Get Config Descriptor 後會接著Get String ID。

白高興了一下,以為可以從 第二個 Get Configuration Descriptor 的0xFF中跳出...

?

新的防盜版機制:

推出有一堆bug的東西,然後要你認證,如果認證沒過,你就沒辦法修正這些bug。

新的business:

推出有一堆漏洞的東西,再賣給你補洞的工具。

新的?

這個東西我賣給你,但是盒子你可得收藏好,不然哪天我到你家去看,你沒這個盒子,我可以報警抓你。

12.21.2006

GET_DESCRIPTOR - TotalLebngth - XP's behave

在收到 GET_DESCRIPTOR 後,第一次,request length 是 9。剛好是 configuration descriptor 的size。

configuration descriptor 中有一個field 是"Total descriptor length" ,total 就是所有descriptor 的意思,包含這個device 所有的configuration, interface, endpoint。
所以要把這些descriptor 的長度都加起來。

XP 收到9 個byte 的configuration descriptor 後,會知道"totoal descriptor size",於是,會再送出一次相同的 GET_DESCRIPTOR request,但是這次request 的legth 就不只是 9了。

根據"USB complete" 說,XP 會送出你第一次傳給他的configuration descriptor 中total length 的值。

但是我收到的是 0xFF. - 不管我第一次的configuration descriptor 中total length 的值寫的是什麼。

USB 2.0 spec 說 ..(p.253 sec 9.4,3..)
The wLength field specifies the numbers of bytes to return. If the descriptor is longer than the wLength field, only the initial bytes of the descriptor are returned. If the descriptor is shorter than the wLength field, the device indicates the end of the control transfer by sending a short packet when further data is requested. A short packet is defined as a packet shorter than the maximum payload size or a zero length data packet(refer to Chapter 5).

也就是說,XP 第一次要求9 byte,第二次要求0xFF bytes 都是合理的。而且我還真的要follow request bytes length, 第一次只送9 bytes, 第二次送全部的,多的部份送 Null Data.

因為0xFF 這一段跟"USB complete" 說得不一樣,所以google 一下source code..
有一個比較近的.. http://www.google.com/codesearch?hl=zh-TW&q=+USB_DESCRIPTOR_TYPE_CONFIGURATION+show:_S5IVIQqAzc:jVtJyZxm8xs:2mzD8Tn8zNc&sa=N&cd=2&ct=rc&cs_p=http://cq.cx/dl/at91sam7sXXX.zip&cs_f=bootrom/usb.c#a0

 switch(usd.bRequest) {
case USB_REQUEST_GET_DESCRIPTOR:
.....
} else if((usd.wValue >> 8) == USB_DESCRIPTOR_TYPE_CONFIGURATION) {
UsbSendEp0((BYTE *)&ConfigurationDescriptor,
min(sizeof(ConfigurationDescriptor), usd.wLength));
} else if(...
...
..也是一樣。
. 所以是我看錯了 :P

Structure Padding in ARM Compiler (ADS)

USB 的standard configuration descriptor 宣告:
typedef __packed struct CONFIGURATION_DESCRIPTOR
{
char bLength;
char bDescriptorType;
unsigned short wTotalLength;
char bNumInterfaces;
char bConfigurationValue;
char iConfiguration;
char bmAttributes;
char MaxPower;
} CONFIGURATION_DESCRIPTOR;
嗯。size是9 (bytes)。奇數。

在code中,sizeof(this structure) 的話,會顯示 10 - 偶數。

這是因為ARM Compiler (ADS) 自動加上padding 的關係,可以在compiler 選項中enable "warning padding",就可以看到這個structure 出現warning。

如果要compiler 不加上padding 的話,就要將上"__packed " 這個修飾字 (ref DUI0067D_ADS1_2_CompLib.pdf )。

這樣,sizeof( this structure ) 就會是9了。

12.20.2006

Feescale MX31 bootloader Program : HAB Toolkit

MX31 內含一個ROM,boot ROM,裡面的code是Freescake預先寫好的。
boot rom code在boot時會detect boot config pin 的high low狀態,決定boot 的動作:
  1. 執行loader
  2. from NOR flash (8/16 bit)
  3. from NAND Flash (8/16 bit, 256/512 block)
利用rom 的loader 程序,可以用來dowload code/data到RAM。

loader 提供由UART和 USB download 的介面。

Freescale有將loader 的protocol, command open 出來。

Freescale 提供一個too : HAB Toolkit,方便和 rom loader溝通。

rom loader 啟動後,只會initial UART和USB週邊,所以在download之前,要另外下command 設定DDR controller。這部份由init file 提供。

HAB Kit 也提供將RAM DATA燒寫到flash 的功能,這部份是利用MX31的ARM Code執行一段code 來完成,燒寫flash 的command被包裝起來,放在RAM中,
所以當 designer 更換 flash 時,可以follow Freescale 的instruction ,implement 需要的flash command,包裝成bin 後讓HAB Toolkit download到RAM中讓 rom loader 使用。

HAB Toolkit 也可以作download and run 的動作,但是固定jmp 到download 的start address。

HAB toolkit 在download 時,出現 DDR Error的話,可能是 DDR controller設定不良,也可以是target board沒電,或是cable 沒接等問題。

Freescale MX31

FAE
Jim Lin 林良璟
0932023335

12.19.2006

USB 2.0 bus signal. device states on startup.

用示波器量 isp1582 pci 的 3.3 V power,在2440a cpu running時,noise 很大(4V p-p),break時noise 很小(200mV p-p幾乎沒有)。

將code 放到internal SRAM來run 也一樣。

所以把RESET pin 拉到Vcc 應該也無效。

請Ricky 加上粗一點的地線,連接targetboard和demoboard,並且加上大電容。

結果還是一樣。


USB D+/D- Signal Definition:

H.H : Single Ended One - 無效,不應該出現在bus上
H.L : Differential 1
L.H : Differential 0
L.L : Single Ended Zero - End of Packet, Disconnect, Reset。

其中Differential 0, 1被用來定義傳輸資料。
根據speed 不同,Differential 0/1的代表意義也不同。
USB 用J.K 狀態來代表通訊時bus的電壓狀態。
J. K 的定義在Low Speed, Full Speed, High Speed時不一樣。
其中Full Speed, High Speed的J, K定義是一樣的。

Low Speed
J : Differential 0
K : Differential 1

Full/High Speed
J : Differential 1
K : Differential 0

以下對Full/High Speed Bus 描述

BUS Idle : 維持Different 1 (J)

Reset : 當bus處於SingleEndedZero (D+/- both 0) 2.5us 之後,bus 轉換進入 Reset狀態。


USB 2.0 hub 在偵測到某device 是Idle時,就會進行HighSpeed Handshaking 偵測。

  1. Device偵測到VBUS有電壓,將D+接到High,作Softct。
  2. Device 作Softct (D+ high for 3ms?)讓Host偵測到。
  3. Host將bus 維持在SigleEndedZero(2.5us),讓device進入Reset。
  4. Host接著送出一串快速的J.K信號,讓 device 進入HighSpeed。
  5. Host送出Endpoint 0 Setup ,Request Descriptor。
所以device收到interrupt的順序是:
  1. VBUS
  2. BUS RESET
  3. HSpeed State
  4. SETUP0
ref : Book "Usb Complete 3rd edition" Chapter 18 : 信號與編碼。

12.18.2006

ISP1582 data..

DataSheet上說.. 在3.3V Vcc 下..

耗電:
high speed : 60mA
full speed : 25mA

Minimum High Voltage : 0.7V
Maximum Low Voltage : 0.3V

VBUS valid rage : 2.0 ~ 4.0V

Bus Timing :

Minimum WR width : 15ns
Minimim CS_L to WR_L delay : 2 ns
Minimum WR_H to CS_H delay : 0ns
所以CS最小寬度是15+2 = 17ns

也就是說,CS有低於0.3V 的 pulse 維持17ns 以上,就會被可為bus access。

另外RESET pin 腳,minimum pulse = 500us

12.15.2006

ISP 1582/3 debuging..

Mode Register 的PWRON ,描述上雖說是LED pin control,實際上是設定chip always poweron 的bit(reference Unlock register 的說明)。

Isp 1582/3 在一時間 (很短) timeout後 ,就會進入suspend,default setting 在suspend 中,register 只可以read,不能write,所以write 動作都會無效。
若要作write 動作,要先作unlock (write 0xAA37 進入unlock register)。

設定Mode Register的 PWRON,可以讓 ISP1582/3 不要作" timeout 進入suspend" 的動作。

另外,reset 後,chip 需要一段時間才能initialize OK,可以用read chip id 來判斷是否initialize OK。
(但是在未intialize OK前 對chip 作read 動作好像會干擾chip 的動作)

另外一個bit : WKUPCS,是設定對ISP1582/3 的任何動作,都會讓chip 維持wakeup 。
當set時,要持續對chip read/write 才能讓chip alive,否則一下子就進入suspend。

現象: 當設定softct 後,量測D+. D- 只有25ns的 pulse,但是在softct後立即對chip read

USB hardware 相關:

D+. D- pin 很敏感,有時候可以用oscillator 量測,有時候會因此干擾到Pc host 的反應,所以當量測到 D+,D- 有2ms 的pulse 後,就可以確認device 的動作正常,pc host應該要送出setup message。
(如果沒有,就把oscallator 移除,再試一次,正常時,pc 約在 2 sec 內發出 "不認識的usb 裝置" 訊息)。

device 送出2ms的D+ pulse後,host緊接著送出messasge (D+ 不到500mv),約100ms的message。
總共有3個message。
很奇怪的是,第一個message開始的3.3V 2ms pulse確認是device發出的。第二,三個message開頭一樣有3.3V的pulse,不知道是host還是device產生的。
int register state change
  • VBUS, SUSP
  • RESM
  • SUSP
  • RESM
  • BRST
  • HS_STA
  • SOF
  • RESM, SUSP
  • repeat BRST - 2 times
  • SUSP
可以看到BRST 三次: detection of a bus reset。

12.14.2006

About USB. hardware pin

USB 有四個pin : VBUS, GND,D+, D-

D+,D- 平時host 有1.5k 到GND的電阻,所以host detect both 0V。

接上device時,device 要把D+ 加到3.3V (維持2ms ?),host 偵測到這個"Pulse" ?
就會從D+, D- 送出SETUP Command ,

SETUP 的8 bytes data內含request command,

然後是一個IN packet,要求device把descriptor送上來。

如果用oscillator 量D+, D- 的波形,可以看到...
  1. 沒接device時,0V,
  2. 接上device時,會有一個pulse - 放電 的波形 (chip defect ?),
  3. 然後device送出一個2ms 的3.3V pulse。
  4. 然後約1sec以內host 會送出一連串 high-low,然後維持high。等device送出data。
所以...偵測

12.10.2006

在main loop 中 處理:
  • suspend. : receive suspend command, INT。
    處理 : 設mode register,suspend 1-0
  • REQUESTPROC
    處理host送來的request..
  • CONTROLOUTDON
    依照該ENDPOINT狀太,設定endpoint register的stall bit.
  • bulk_out
    處理CBW command
USB Host 的request 可以分為三類:
  • STANDARD
  • CLASS
  • VENDOR

Standard 的request 用一個index來選取以下服務:
沒有implement的就用StallEP0
  • GetStatus
  • ClearFeature
  • StallEP0
  • SetFeature
  • StallEP0
  • SetAddress
  • GetDescriptor
  • StallEP0
  • GetConfiguration
  • SetConfiguration
  • GetInterface
  • SetInterface
  • StallEP0
Class 的request 只有一個
  • Reserved
Vendor 有15個,但是沒有implement,所以都是StallEP0

Request type, and Request index 是在 USB 的SETUP封包中。

SETUP 封包的內容是:
 struct _device_request{
char bmRequestType;
char bRequest;
unsigned short wValue;
unsigned short wIndex;
unsigned short wLength;
} DEVICE_REQUEST;
.當USB插入host後,host會送這個OUT Token (封包的一種),給device的ENDPOINT0。

Device

12.08.2006

ISP1582 sample code

PCI Sample code :
  • 先unlockdeive : *(0x7C) = 0xAA37; 由suspend mode喚醒,對任何register 動作前要對 unlock register寫入AA37。
  • testmodereg 寫入0x10 : *(0x84) = 0x10 ; FORCEFS - force Full Speed.
  • mode register, clear SOFTCT (soft-connect) ,也就是將D+ pullup 移除(變成full speed)。
  • 對interrupt register 寫入0xFFFFFF,將所有interrupt source 清除。 *(0x18) = 0xFFFFFFFF.
    interrupt register register 代表目前產生interrupt的原因,對該bit寫入1可以將該source clear。
Register Reading: - debug 才需要
  • 對scratch register寫入0xAA55,讀出確認OK。
  • Interrupt Config (0x10)
  • Interrupt mast L.H (x014, 0x16)
  • Interrupt register L.H (0x18, 0x1A)
  • DMA config (0x38)
  • DMA counter L.H (0x34,0x36)
  • Current Frame Number (0x74)
  • Mode (0x0C)
  • Address (0x00)
Install ISR

Read Chip ID 0x70.74.76

開始connect USB:
 Address Enable : *(0x00) = 0x80;
Mode : *(0x0C) = 0x08 | 0x01 | 0x80 | 0x200; GLINTENA, SOFTCT, CLKAON, 0x200
Test : *(0x84) = 0x00; exit test mode
IntConfig: (0x10) = 0x40 | 0x10 | 0x04; cdbgmod_as,ddbgmodin_a, ddbgmodout_asy,
control interrupt : on ack,stall
in interrupt : ack only
out interrupt : ack and stall
IntEnableLow :*(0x14) = 0x0001 | 0x0008 | 0x0010 | 0x0020 | 0x0100 | 0x0080
0x0400 | 0x0800 | 0x1000 | 0x2000 | 0x4000 | 0x8000 ;
butreset,susp,resume,hs_state,ep0set,
vbus,ep0rx, ep0tx, ep1rx, ep1tx,
ep2rx, ep2tx.
IntEnableHi : *(0x16) = 0x00;


Config Endpoint
先將7個endpoint的tx,rx type 都設為0

12.04.2006

something about NAND Flash

NAND Flash 依照每個cell 所能儲存的位元數,可以分為SLC和MLC兩種。
可以猜到,MLC除了price外,比起SLC來,沒有其他的優點。

但是市場還是以價格導向,所以2006以後,MLC的產品大出現,許多SLC的廠家也將轉換至MLC。

目前MCU直接支援MLC的還是很少(還沒做出來),所以市場對SLC的需求還是大宗。
(迫不得已)

有鑑於此,一些公司就推出使用MMC (SD)介面的MLC,因為直接支援 SLC 的MCU通常也都有SD 介面,所以可以利用這個介面存取MLC,這類MLC+MMC controller的產品,算是過度時期的產品,當MCU將SLC NAND Flash interface改為MLC後,這類產品就失去價值。
但在目前MLC price 約為SLC 50%的現況來說,一些price critica 的大容量需求產品,還是很有新引力。
預測,在大多數供應商將SLC轉為MLC後,SLC的價格將會升高,對比MLC逐漸下降的趨勢,SLC極有可能退出市場。
另外,將多組MLC加上IDE controller後,成為HD的替代品,這類產品也漸漸成熟。
雖然最終不可能達到和HD一樣的價格,但是耗電量,防震,溫度和速度的優勢以足以吸引一定的產品類別。
車用 ?
對於某些需求高速access time的mcu,有一種NOR+NAND type的產品,據說interface是NOR,所以可以符合XIP的需求。同時又具有NAND 大容量,低價格的優點。

12.03.2006

排毒?

食材能夠不煮就不煮,盡量生吃。
到時候吃下一些寄生蟲,在腸子中寄生。
再用灌腸液把他灌出來。

12.02.2006

La Fonera.. Setup OK

真的收到了.. La Fonera.



馬上就照著說明...去註冊,然後...把Fonera 插上 hub...等三個綠燈都亮了...
打開NB,搜尋.....

只有出現MyPlace.. 沒有FON_AP!!
所以follow 說明,連到MyPlace,連是連上了,但是出不去..

大概是我家裏的網路配置太複雜了吧..
我在說明書上有看到,如果沒見到FON_AP,就要設定一下網路...
有空的時候在試試看吧。

update :

設定成功!
和一般 的ap一樣,要自己設定internet連線方式。在我家是用static。
然後重開機就可以。

他還很聰明的知道分成wan,lan,internet三部份。

因為家裏的網路配置很複雜..

所以剛拿到的Fonera接上去後不能直接用。Fonera沒有 ethernet hub ,所以也不能用來替換internet的ipshare+hub。只好放在最末端。

這樣,他就要經過一個AP的轉換,IpShare,才到internet。

由於中間的AP--AP途徑,有些裝置無法取得dhcp 位址。(目前只有Windows系統可以取得)。
所以大部分經過 AP-HUB途徑的裝置都要設定static IP。

Fonera也一樣。
Fonera會broadcast兩個SSID : MyPlace,FON_AP。

MyPlace 這個SSID,就像是一般的AP一樣,是可以自己使用的,private network (說明書上寫是經過encrypt),FON_AP這個SSID,就是給FON 網路的public SSID,會經過FON 管理。要login FON 後才能使用。

所以FON_AP 這個SSID要在Fonera連到internet後,才會出現。
如果你的Fonera沒有出現FON_AP這個SSID,就要check一下Fonera到internet的path是不是OK。

設定Fonera的internet 參數要進入管理頁面。
  1. 連上MyPlace。- 需要S/N作password。
  2. browser : http://192.168.10.1
  3. user/password : admin/admin
  4. status : 可以看看目前的狀態
  5. Advance : internet,可以選dhcp, static,我的例子就要選static,然後設定為家中ipshare的一個client。gateway, dns 都要設對。
  6. 可以設定public, wan, private 間的互通關係。public -- wan default 是deny。很奇怪的是,deny 的話,fonera沒辦法連上internet,要先"allow"一下。
  7. 還有,和一般的ap一樣,設定完static後,要重新開機。
  8. NB重新搜尋AP,就出現FON_AP了。
接著,就可以follow 一般Fonera的設定動作,到Fon 網站註冊你的fonera router type,位置。

完成後,記得回到設定中,把public-- wan 設回deny,否則,以我加的網路設定,經由FON_AP進入的client,可以和家中所有client溝通,很危險的喔。

Fonera很有趣,即使在自己家中要連上FON_AP這個SSID,都要先進入FON login,在FON 網站,自己的管理頁面,還可以看到有那些人利用過你的 router,使用的流量是多少。

還會紀錄你使用過哪些router,當作是你"travel"的紀錄。

還是實際操作比較容易了解FON的作業方式,原來,和一般的Wifi provider一樣,連線進入FON後,都要login,才能到internet,username/password可以到FON註冊。

可以買點數或是買Fonera(變成linus),取得連線的credit。

像我有一台fonera(感謝hemi),並且設定成Linus,所以用我的username/password 可以login任何人的FON_AP。
任何有FON account的人也可以login我的fonera。

真有趣。


若是說有什麼不方便的地方,大概是要在google map上設定自己的位置,很難設,因為住在小地方,google map 解析度沒那麼高,所以很難設定精確。

11.30.2006

劣等財

劣等財

因為目前的經濟能力不足以買心中想要的東西,所買的替代物 (?)

Notes on CCIR 656 (BT.656)

CCIR656 - BT.656

基於Recommandation 601
Considering:
  1. 世界的電視標準已經建立,有525 (NTSC) 和625 (PAL)兩種掃描線。
  2. 需要一個共通的標準方便設備商在世界交換資料(也就是在525和625間轉換)。
  3. 因為2,有關的digitial television單位已經同意encoding parameter需要有一個標準(recommandation 601)。
  4. 要達到Recommandation 601的目的,需要對data stream和interface作規範。
  5. 這個規範必須要再525和625間有共通性。
  6. that in practical implementation of Recommendation 601 it is desirable that interface be defined in both serial and parallel forms.
  7. that digital television signal produced by these interfaces must be a potential source of interface to other services, and due notice must be taken of No.964 of the Radio Regulation.
1.Introduction

這份Recommendation說明了digital television設備如何在5252和625的interface連接,並且符合4:2:2的encoding parameters.


Part I

COMMON SIGNAL FORMAT OF THE INTERFACES

1.General description of the interfaces

這個interface用來作為一個單向的資料介面。
資料的傳輸利用8bit的資料來傳輸,要傳送的資料有:
video data
timing reference codes
ancillary data
identification codes

2.Video data

2.1 Coding characteristics

符合Recommendation 601,資料中field-blanking的部分在525和625不同,如下表:
625 525
_______________________________________________________
V-digital field blanking Start Line 624 Line 1
Field 1 (V = 1) Finish Line 23 Line 10 (V = 0)
___________________________________ Start Line 311 Line 264
Field 2 (V = 1) Finish Line 336 Line 273 (V = 0)
_______________________________________________________
F-digital field
identification
Field 1 (F = 0) Line 1 Line 4
Field 2 (F = 1) Line 313 Line 266
______________________________________________________
這部分看不懂

2.2 Video data format

8 bit資料中的0和255 (0xFF)預留為identification用,不能用來代表資料。
video data word轉換為17M words/s的data stream,並且依照Cb, Y, Cr, Y, Cb, Y, Cr, etc.
其中Cb, Y, Cr代表相鄰兩pixle的 ?

2.3 Timing relationship between video data and analogue synchronizing waveform

2.3.1 Line interval

digital active line從analog line synchronzing pluse 的leading edge後的第244 word(525 standard), 或是264 word (625 standard)開始,this line being specified between half-amplitude points.

2.3.2 Field interval

digital line的開始同時也是digital field的開始:the digital field starts 32 words(in 525 line) and 24 words (625 line) prior to the lines indicated in Table I

2.4 Video timing reference codes (SAV, EAV)

有兩個地方有timing reference code :每個data block的開始(Start of Active Video, SAV),和結尾(End of Active Video, EAV)。

Timing reference code由4個word組成: FF 00 00 XY (hex form)
FF 00 不能表示data,就是預留給timging reference code。
FF 00 00 是固定的Timing reference code開頭,
第四個byte的bit定義field 2的identification,內容如下(Timeing reference codes)

Table II Video timing reference codes

Bit No.
word (MSB) 7 6 5 4 3 2 1 0 (LSB)
_____________________________________________________
First 1 1 1 1 1 1 1 1
_____________________________________________________
Second 0 0 0 0 0 0 0 0
_____________________________________________________
Third 0 0 0 0 0 0 0 0
_____________________________________________________
Fourth 1 F V H P3 P2 P1 P0
_____________________________________________________
F = 0 during field 1, 1 during field 2 V = 0 elsewhere, 1 during field
blanking
H = 0 in SAV, 1 in EAV
P0, P1, P2, P3: protection bits (see Table III).
MSB: most significant bit.
LSB: least significant bit.
其中P0,P1,P2,P3和F,V,H的資料有關,從下表
Protection bits

Bit No. 7 6 5 4 3 2 1 0
___________________________________________________
Function Fixed 1 F V H P3 P2 P1 P0
___________________________________________________
0 1 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 1
2 1 0 1 0 1 0 1 1
3 1 0 1 1 0 1 1 0
4 1 1 0 0 0 1 1 1
5 1 1 0 1 1 0 1 0
6 1 1 1 0 1 1 0 0
7 1 1 1 1 0 0 0 1
___________________________________________________


可以用P0~P3可以correct 1 bit的error和detect出2bit的error。

2.5 Ancillary Data

Ancillary Data必須要預先準備,並且同步的插入multiplex的blanking interval。
Ancillary Data是7 bit,LSB是用來作odd parity用。

2.6 Data words during blanking

data stream中不用作timing reference code和ancillary data的部分是blanking interval,必須填入以下的sequence : 80 10 80 10, etc. (hex form).這相當於是空白時的Cb, Y, Cr, Y的直。


Part II

BIT-PARALLEL INTERFACE

1.General description of the interface

介面是8 bit data和一個clk pin,
----------------------------------------------------------------------------------------------------------
以下是google所得資料
BT.656 (CCIR656)
規範一個Video資料傳輸的時序和格式,其資料格式符合BT.601 (CCIR601)所規定的Y.Cb.Cr 4:2:2方式。
BT.656定義了:
blanking
embedded sync words
video multiplexing format
for both parallel and serial interface

intersil : BT.656 Video Interface for ICs

使用 8 or 10 bit data 傳送YCbCr,使用27MHz的clock作同步
用特殊的data 代表同步信號,不必使用另外的HSYNC, VSYNC,BLABK 信號。
輔助資料可以放在blanking interval中
00和FF不得使用,作為特殊標記(EAV,SAV用)
SAV (Start Active Video)和EAV (End Active Vidwo)的code是 FF.00.00l.XY
XY的bit用來標示SAV,EAV,during Vertical Blanking,Field 1 or 2.

每一條掃描線都要以SAV開頭,EAV結尾:
EAV.Blanking.SAV.Line Data.EAV....

規定一條掃描線有720點。
因為採用4:2:2的格式,所以傳送序列;
Cb0.Y0.Cr0. Y1. Cb2.Y2.Cr2. Y3. Cb4.Y4.Cr4....
所以一條掃描線720點的資料總需要
Y : 720
Cb : 720/2
Cr : 720/2
共1440 byte的資料。

在傳送Video Frame時採用交錯的方式,先送Even line的field,在送Odd line的field,
總line no依照PAL/NTSC格式而有不同。
除了每一條line之前會有一段的blanking外,一個field的開頭幾條scan line也是blanking。

----------------------------------------------------------------------------------------------------------

以下是"Video Demystified"上的BT.656 說明 (Chapter 6.Digital Video Interface)

Ran out of space in ROM for ***.exe.

上次的makeimg error : "Ran out of space in ROM for ***.exe"。
問 Loyal 後,他給的答案:

給的rom image size 太小,所以要修改config.bib 中

#define NANDIMGLEN 00F00000

將 00F00000 改大就可以。

注意不要超出,影響到別人。
奇怪的是config.bib 出現在三個地方:
  • platform\yourplatform\cesysgen\files
  • platform\yourplatform\files
改platform\yourplatform\files下的config.bib,要作sysgen ..check "copy files to release direcory".

sysgen 後,可以檢查一下最後reldir 下的config.bib 有沒有跟著改掉。

11.29.2006

Headphone socket diagram


很常看到phone jack 的電路圖:
這種jack 是可以偵測插入動作的,利用 pin 4。
沒插入時,會和pin 2 短路,
一旦插入earphone 後,就會和2斷開。變成open。
利用這兩種狀態來detect earphone有沒有插入。

11.27.2006

Philip USB 2.0 : ISP1583/2 - Initialize

reset後,可以先read Chip ID (70h),datasheet說
byte 0 : version = 0x30
byte 1 : ID - low byte = 0x82
byte 2: ID - high byte = 0x15

所以讀起來就是 0x158230。 (雖然是1583,chip id 也是1582)。
確認bus timing and chip connectin OK。

然後作 register 初始化設定:

ModeReg (0Ch) = 0x0208; DMA Clock ON. Global INT enable
IntConfig (10h) = 0x54; INT on all ACK. NYET
IntEnable(14h) = 0x00000979; IEP0TX. IEP0SETUP. IEDMA. IEHS_STA. IERESM. IEUSP. IEBRST.
DmaConfig(38h) = 0x2201; ATA_Mode. PIOMode1. 8-bit.
DmaIntEnable (54h) = 0x00000979 : ?
DmaConfig
DmaIntEnable

初始 使用到的Endpoint
一部分要分成FULL_SPEED, High_SPEED 的 FIFO buffer size不同

EndpointIndex = 4 : Endpoint Index = 4, direction = 0 (out)
MaxPacksize = 0x0040 : 1 packet per microframe. fifo size : 64 bytes - for Full Speed
// = 0x0200 : 1 packet per microframe. fifo size : 512 bytes - for High Speed
EndpointIndex = 5 : Endpoint Index = 4, dircetion = 1 (in )
MaxPacksize = 0x0040
// = 0x0200

EndpointIndex = 4
EndpointType = 0x0016 : No Empty Packet. Disable. Double Buffer. Bulk.
EndpintIndex = 5
EndpointType = 0x0016

EndpointIndex = 4
EndpointType |= 0x08 : Enable Endpoint
EndpointIndex = 5
EndpointType |= 0x08


DmaEndpoint = 2
EndpointIndex = 5
ControlFunction ?

Address = 0x80 : enable device and clear device address to 0x00 (un-assigned value)

新中文編碼..

這一期 OSSF 電子報有一篇專欄 將中文編碼說得很清楚,附上例子很容易讓人了解。

中文編碼,一字一碼不方便的原因是 限制了 新字 的創造。
---- 所謂的"新字",就是由原有的部首或偏旁組成。

所以,"新"編碼是不是就是先將所有部首,偏旁 編碼起來,再用這些 部首,偏旁 來作所有 文字 的編碼 ?

聽起來好像是 以前聽過的 中文基因,就是倉頡 發明人的新計畫,好像還有設計一顆自行引擎,自動產生字型。

11.23.2006

Philip USB 2.0 : ISP1583/2

每次...
  • System Powerup
  • bus-reset event
  • 由full-speed 轉為 high-speed
都要作Initialize:
  • Mode Register
  • Interrupt Configuration Register
  • Interrupt Enable Register
  • DMA Configuration Register
  • DMA Hardware Register
  • Endpoint (A lot Registers)
其中 Initialize Endpoint..

即使不是所有的Endpoint都要用到,還是要將所有Endpoint都Initialize :
  • 設定每一個Endpoint 的 MaxPacketSize
  • 設定每一個Endpoint 的 Type,並且Enable。
    不能同時將同一個的Endpoint的MaxPacketSize,Type 設定好並且Enable後,再作下一個?
Source Code:
SourceCode中,HighByte和LowByte好像是相反的 : BigEnding ?

Mode = 0x0802; 有點問題,bit 10-12是reserved,竟然有值。
應該是0x0208
IntConfig = 0x54;
CDBGMOD =01.(Int on all ACK),
DDBGMODIN =01 (Int on ACK),
DDBGMODOUT=01 (Int on ACK and NYET)
IntEnable = 0x79090000; 有點問題..bit 26-31 是reserved,竟然有值

Endpoint Config : 只有Config Endpoint 4.5

EndPointIndex = 4;
MaxPackSize = 0x4000;
EndPointIndex = 5;
MaxPackSize = 0x4000;

EndPointIndex = 4;
Type = 0x1600;

Enumeration Process


USB 的 enumeration 動作可以區分為3個stages:
  • SETUP token with data IN stage
  • SETUP token with data OUT stage
  • SETUP token with no data stage

真倒楣,CS, RD, WR, ADD 都正確,但是DATA就是不會動作,main cpu board : smdk2440 的address/data bus又通過一個CPLD,無法知道是不是要對他做什麼動作。
DATA BUS好像是Lock起來一樣,一直維持在High/Low。
ANDY 說:
  • BWSCON 的 ST2 (因為用CS2),要設為1 : Using UB/LB
  • BWSCON 的 WS2(因為用CS2),要設為0 : Wait disable。
查UB/LB 是用在muti-byte width (>8 bit)時使用的,主要是在write動作,要指示target address是哪一個byte 的signal。
WS 是外部wait signal,用來延長access cycle time。

11.22.2006

Philip USB 2.0 : ISP1583/2

ISP 1582 的Access Mode 只有 Generic Processor Mode。bus寬度是16 bit。當要存取sigle byte時,請自動將high byte捨棄。
這一點值得商榷,因為demo電路從A0開始連接,所以是byte addressable。要測試看看對奇數位址read時,是不是也OK。
因為內部register的address都是偶數,所以即使沒有bank selection (enable) pin也沒有關係。

和USB 的Endpoint相關的register只有一組,利用Endpoint index register來決定mapping到哪一個endpoint(有一點像PIC的 bank selection register)。


Address Register (00h)

在power-on reset,soft reset 和 bus reset 後,DEVADDR[6:0]會被clear。
在power-on reset,soft reset 後 DEVEN 會clear,bus reset後會set。


Endpoint Index Register (2Ch)

決定以下registers mapping到哪一個endpoint:
  • Buffer Length
  • Buffer Status
  • Control Function
  • Data Port
  • Endpoint MaxPackSize
  • Endpoint Type
DMA Register也有一個Endpoint index register,這兩個 index register不可以同時指到同一個endpoint (chip's bug ?)

Endpoint 0 有 兩個buffer : SETUP,Data。Index Register 的EP0SETUP 可以用來決定是要對哪一個buffer動作。
在存取其他Endpoint時,EP0SETUP 要是0。


Control Function Register (28)


用來控制該Endpoint的狀態:
  • CLBUF : Clear RX Buffer (FIFO ?)。
    平時不用作,因為在對FIFO作read動作時,會自動紀錄FIFO 剩餘資料的長度,當==0時也就自動clear了。
    這個bit只有在需要強制將RX buffer清除時才有用。
  • VENDP : 強制將FIFO 內的資料送到SIE中,等待in token 後送出。
    平時不用作,因為每次wirte FIFO,FIFO counter 會自動增加,當FIFO counter = MaxPacketSize時,就會自動將FIFO data送到SIE中。
    這個bit只有在送出 data length < MaxPacketSize 的資料時,才需要設定。
  • DSEN : 將 controller設定為DATA Stage,處於這個Stage時,controller會follow In/Out Token 的內容動作,
    否則,
    Controller會回應NAK給所有Token,直到programmer 主動回應SETUP Command為止。
    然後呢?回應SETUP Command後,programmer需不需要自己設定DSEN這個bit呢?還是controller會自行改變?
  • STATUS : Status Acknowledge,這個bit決定SETUP command 中STATUS Stage的動作。
    0 : 回應NAK
    1 : 回應一個空packet 給IN Token,回應 ACK給OUT token。
    當Status Stage結束時,這個bit會被自動clear。
  • STALL : Stall Endpoint,中斷這個Endpoint的動作。
    任意中斷傳送會導致NRZ 邏輯錯誤,所以每次中斷後, 要再恢復時,要reset 這個endpoint : disable - enable 這個endpoint 一次。


Data Port Register (20h)

提供該Endpoint 內部 FIFO 的對外介面(對這個register作讀取就等於對該Endpoint的FIFO讀取)。
Endpoint FIFO 的寬度是16bit,所以每次R/W,FIFO count 會自動+-2。

如果是Write動作,當FIFO counter == MaxPacketSze,就會自動將FiFO 的內容送到SIE controller去,等待USB 的IN Token 進來後,自動送出。
同理。
如果是Read動作,當FIFO couter == 0,在下一個 OUT token 時,就會將USB 資料自動放到FIFO中。


Buffer Length Register (1Ch)

內含Endpoint的PacketSize (DATACOUNT)。
這個register很奇怪,好像是用來"validate" 每次pacjet sent。剛剛的register說道,當FIFO counter == MaxPacketSize 時,就會自動validate和送出。
所以要傳送一個MaxPacketSize 整數倍的資料長度時,是OK的。
但是如果...MaxPacketSize 設為64,要傳送 510 bytes的資料,那在最後一個packet時,記得要將Buffer Length Register設為62,這樣FIFO才不會一直等FIFO counter == 64 才送出。
不能改MaxPacketSize嗎?

EndPoint MaxPacketSize register (04h)

這是所有endpoint共用的一個register,決定除了endpoint 0以外,所有endpoint的MaxPacketSize (這就是為甚麼每個Endpoint還要有一個 BufferLength Register的原因了)。


Interrupt register (18h)

Endpoint0 ~7 每個Endpoint都有TX/RX兩個 interrupt.
另外 Endpoint0 還有一個獨有的 SETUP interrupt : 代表收到 SETUP Token
VBUS : vbus is on.
DMA : DMA status register 有改變
HS_STAT : 正由full_speed 轉為 high_speed
RESUME : 正由 active 轉為suspend
PSOF : ?


Frame Number Register (74h)

從上一個SOF (Start Of Frame) 到現在,共收到幾個frame,microframe。


Unlock Device Register (7Ch)

為了避免ISP1582 在suspened 時,register 的資料被塗改(?),
當 Mode Register中的 PWRON bit 是 0 的時候,所以write 的動作都是無效的。
配合這個動作,當chip resume,作第一次write 之前,要先作個Unlock 動作:寫入AA37h 到Unlock Device Register。

接下來的說明有點奇怪..

當ModeRegister的PWRON=1時,chip 有power,RD_N,WR_N,CS_N 都正常動作。所以可以直接對chip 作write動作。 不需要作Unlock。

當ModeRegister的PWRON=0時,chip 沒有power,RD_N,WR_N,CS_N都是floating,這時候chip處於suspend狀態,這時如果要作write動作,就要先作Unlock。
又說是resume時要下,又說PWRON時不用作。又說在no power時要作,所以?到底什麼時候要作?
還有..RD_N, CS_N也是floating,所以read動作也沒效呀,怎摩會在Write之前才要作?
再挑剔一點,如果RD.WR,CS都floating,那連Unlock command也寫不進去呀。


Test Mode Regster (84h)

可以強制設定USB D+/- 的pin腳High/Low。作測試用。

Bus Timing..

整個read/write cycle (CS enabled time) min = 50ns。

SVN worklog - check SMDK2440A BSP.

SVN 是一個filesystem,具有history record的filesystem。
使用SVN,就像是對一個folder動作:將資料copy 到folder中,讓SVN幫你紀錄資料的變更,需要時,將SVN的資料copy 出來使用。
因為有history record功能,所以可以將任一時間的 folder "狀態" copy 出來。

利用這樣的功能,作source code的version control。

SVN 的 verison control 方式是利用folder的方式。
一個project 的source code分成三種狀態:
trunk : code developement history
tag : 特殊 狀態的snapshot。
release : releaes 的snapshot。
branch : 需要作branch 可以用這個,也可以跟tag 一起用。

所以在要利用SVN 管理一個project時,要先在SVN 的repository 中create 三個folder。
在SVN repository 中Creat Folder 沒有那麼直接:
  • 在Repository Folder中 New 個 folder : WINCE500_VSS0611
  • 在WINCE500_VSS0611處案右鍵,選"Create Repository"。
這樣,就create了一個Repository,預計給WINCE500_VSS0611用。
  • 另外在其他無關的的地方create 一個folder,裡面create三個sub folder : trunk, release, tag。
  • 在這個無關的folder 上按右鍵,選"import",URL 指定到WINCE500_VSS0611。
這樣,就藉由 "import" 動作,在WINCE500_VSS0611這個repoitory 內create了三個folder : trunk, release, tag。

接下來就可以將source code加到WINCE500_VSS0611:
  • 只要加入platform/smdk2440 這個folder,但是裡面有很多file 是不需要的,所以按右鍵,選"Setting",有一個ignore-list,加入以下字串,中間用space隔開:
    *.exe *.str *.lin *.exp *.pdb *.bin *.nb0 *.mac *.obj *.old *.bak *.dll *.map *.rel *.sre *.a *.log *.db

  • 在 SMDK2440A按右鍵,選check out,url 是repository 的WINCE500_VSS0611\trunk
  • check out後是空的,現在要加入檔案,同樣在SMDK2440A按右鍵,選Add。出現一些list,check 一下,有沒有你不要check in 的file,把他uncheck。
  • 右鍵,commit
以上就把SMDK2440A 這個folder commit 進WINCE500_VSS0611\trunk 中了。
可以開始修改source code,覺得需要record一下state時,就在該file(或是整個SMDK2440A)commit。

修改一陣子,若是覺得OK,要紀錄一下,就在SMDK2440A按右鍵,選branch/tag,URL 選WINCE500_VSS0611\Release\0.0.1 (0.0.1自己選)。
SVN會把目前的snapshot copy到Release\0.0.1 這個folder中。
這時候,若是要繼續改,記得要 "switch " 回trunk。

11.21.2006

A different thought to ..

....當我們釐清問題後,就會發現公眾WiFi的目標使用者是非常小的一群人。必須具備筆記型電腦,經常在戶外而且有上網需求,戶外活動範圍必須經常在大馬路邊才有良好訊號。

典型的想像,這種人無非是電腦玩家及業務員。我們應當心安理得的說:目前能有這麼多公眾WiFi付費用戶真是足堪告慰。然而,我們居然為了服務這種小眾而鋪設人口覆蓋率超過 90%的WiFi無線基地台?!
這句話應該是錯的,他沒有考慮到越來越多的portable device都具有Wifi能力,所以接下來的推論也都....

配合目前各種資訊網站,擁有這些Wifi ready, portable裝置的人很容易而且隨時取得附近有哪些好吃,好玩的資訊,甚至在公車亭打wifi phone..
像這類使用方式,唯一要考慮的就是 費率,職不值得為了這些 時間 花錢申請Wifly 服務。
所以...
台北市目前的公眾WiFi包月大約近 400元台幣,如果降到 200元能不能使付費用戶數量大幅提升?老實講,在筆者實地使用過後,並不太有信心。而這個價格對服務提供者來說,也實在太傷了。
200塊對公車通勤族來說,可能還是太貴。
不過要是家裏也可以用同樣的線路上網的話,200 可能就可以接受。

當然,200/month 所得到的品質當然不能讓你 打online game,看網路電視,但是則足夠用來上msn, google, 拍賣,和blogging。

這樣,應該會有很多低頻寬使用者 會心動吧...

try coLinux

即使在作CE的東西,Linux 還是需要的,因為有很多driver 可以參考Linux的source code。(用Google Code Search 就可以知道open source的資源有多少...)

實際上不需要另外download debian image,因為安裝coLinux 0.6.4 時就會有一個rootfs選項,選Debian就會自動download。
但是也只有負責download,沒有解開和設定xml。
安裝在c:\colinux下比較方便,不用改default.colinux.xml。
解開debian image (變成1G),rename成root_fs (這樣就符合xml 設定)。

開啟cmd:
 c:\coLinux\colinux-daemon.exe -c default.colinux.xml
就可以看到colinux啟動了..

嗯,interface果然很醜,follow letoh 的好了,加上 "-t nt",就會用原cmd視窗,login root 的password也真的是root。

所以follow letoh 的作法,用NAT(Windows的網路共享)。
  • 將Windows上實際接到網路的interface設定分享。
  • 將接到coLinux的interface設定IP 為192.168.0.1, 255.255.255.0 default GW 和DNS 跟實際網路介面的default GW一樣(ipconfig/all)。
這樣就不用修改任何colinux的網路設定。
內建的editor 不是vi, 使用editor 可以啟動該editor。

修改 apt.conf,設定proxy, follow 以前的說明,加入Proxy.
從 /usr/share/doc/apt/examples下copy過來。

copy完後,在 "Acquire" 那個{ } section中,加上:
Http
{
Proxy "http://10.3.3.194:8888";
};
OK。可以apt-get update了。
第一件事 : install vi..
apt-get update,apt-get upgrad後已經有一堆要upgrade了。
follow letoh 作法,用testing,apt-get update 會有error。出現
"E:Dynamic MMap ran out of room"
Google說,在apt.conf加一行
APT::Cache-Limit 10000000;
就OK了。

adduser charles

source.list 改用這邊的內容:
deb http://ftp.tw.debian.org/debian/ etch main contrib non-free
deb-src http://ftp.tw.debian.org/debian/ etch main contrib non-free
deb http://security.debian.org/ etch/updates main contrib non-free
deb-src http://security.debian.org/ etch/updates main contrib non-free
再apt-get update..

openssh 的安裝,用 apt-get install openssh 沒有找到,有些link說要加入 http://non-us.debian.org 也沒用(甚至404)。所以用 apt-cache search openssh 。發現兩個package: openssh-server, openssh-client。
  • 安裝 openssh-server,出現要temporily remove e2fsprogs,, error。說要加上APT::Force-LoopBreak; 加入後依然無效。
  • 手動remove e2fsprogs - 掛點,path 失效。
  • 安裝 openssh-server - 一樣失敗。
  • 再install e2fsprogs.. 失敗。
只好重新untar debian root_fs,重頭再來..
嗯,改 apt-get install ssh .. .從安裝列表中竟然還是看到有openssh-server, openssh-client...
結果? 一樣Fail ,不過,從 這裡 install 時加上 -o APT::Force-Loopbreak=true 可以繼續安裝..
結果,一樣,remove e2fsprogs 後,出現 找不到rc.d。
這裡這裡 有作法 (就是作一個假的rc.d騙過dpkg.)
cp /bin/false /tmp
cd /tmp
ln -s false update-rc.d
export PATH=$PATH:/tmp
然後就可以 install sysv-rc 然後會要用
apt-get -f install
將所有package 修好。
這樣就OK了 ?
restart,還是沒看到ssh的蹤跡,
再install 一次 ssh,OK。安裝成功。
ps -aux 已經可以看到ssh。

但是實際登入會失敗,close connection,到/var/log/auth.log看,好像是PAM的關係..
@_@.. 怎麼這麼複雜...
update..

由於letoh 的協助(詳見"留言"),我去download了 1.5G 版本的debian image (正確的說是1.6G)。
一樣,照著安裝,然後把 sources.list的 unstable 改成 stable 後,就可以安裝ssh 了。

如果不把unstable 改成stable的話,連裝個vim 都會出現e2fsprogs 的問題喔。

看看這個1.5G版本的root image,sourcces.list有一個不一樣:
deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free
跟openssh 的安裝網頁說得一樣,要加上non-us site。
所以apt-cache search 可以看到ssh (openssh)。 這樣也就可以安裝 sshd了。

在此感謝letoh的協助。

其他相關的還有..

sudo : 安裝完sudo 後,要
 export VISUAL="vi"
然後用visudo 編輯..
User_Alias ADMINS = charles
ADMINS ALL=ALL
將charles 加入admin中。
然後sudo 會出現cannot resolve.. gethostbyname..要新增一個 /etc/hosts 內含..
 127.0.0.1  colinux
還要把charles加到root group (?)

lynx 不能連出去,因為dns和proxy都沒設, proxy要設是用環境變數:
 export http_proxy="http://10.1.1.242:3128"
如果嫌麻煩,可以寫在home的.profile中。

這一個rootfs真的和loteh說的一樣,沒有shadow password,要轉成使用shadow,follow letoh 的說明:
#touch shadow
#pwconv
這樣pwconv就會將password convert成shadow。

使用這一個 rootfs ,也可以follow letoh's instruction,改為 testing,然後用 apt-get update,apt-get dist-upgrade 升級到testing。
但是 non-us 和 security 都還是stable,否則會找不到feed。
過程中有找不到feed得情況,不知道是連線中斷還是真的找不到,加上 --fix-missing 後OK。
--是連線的問題,在 X32上就OK。

Root Disk size太小,Tony 找到windows mode tools - toporesize.
http://www.henrynestler.com/colinux/tools/

11.19.2006

gmail new "function" ? track DHL


只要在mail 中出現9位數字,右邊就會出現 "Track DHL package"。

SigmaDesigns

業務經理
徐偉強
0935595824

周文國
0922970982

美商SigmaDesigns
台北縣汐止新台五路一段79號8樓5之8 (遠東世界中心C棟)
02-2698-2066

系統設計顧問
鄭博文
0910092512

11.17.2006

另一個web msg 的選擇


叫 wablet ,也是綜合式的,提供web base 的login 和管理介面,和其他web base messager不一樣的的地方是 提供一個 link,可以貼在自己的網頁上,讓人可以經由wablet 連上你,不用特地去開啟msn。

Install GIVEIO.SYS in XP

Nelson try 出來GiveIO 在XP上的 安裝方式:
安裝順序 giveioio.inf

For Windows* 2000, use the following procedure:
1) Login as administrator
2) Copy the giveio.sys file to %systemroot%\system32\drivers.
3) Choose Control Panel, and choose Add/Remove Hardware.
4) Select 'Add/Troubleshoot a device'
5) Select 'Add a new device' and choose Next, and select 'No, I want to select the hardware from a list'
6) Select Other devices and choose 'Have Disk...'.
7) Choose 'Browse...', locate the folder where giveio.inf file.
8) Complete the remained process.

實際安裝流程
1) Login as administrator
2) Copy the giveio.sys file to C:\WINDOWS\system32\drivers.
3) 開啟控制台 -> 新增硬體 -> 下一步 -> 是,我已連結硬體 -> 新增硬體裝置 ->
安裝我從清單中手動選取的硬體(建議選項)(M) -> 下一步 ->連接埠(COM和LPT) ->
從磁片安裝 -> 從磁片安裝(選擇gvioio.inf ) -> 下一步 完成
原來以前2000的instdrv已經不能用了。

SVN . add files and reverse back

CE 的source 實在太多了,obj (lib) 和source 又都混在一起,所以要用version control實在很麻煩。

把全部都check-in 幾乎不可能。
所以想...當有修改時,再把那個file check-in。
但是這樣又會有問題,因為revision 無法回溯修改,所以若是reverse (update) back,會造成後來加入的file 被刪除。
這樣跟我要的動作不符。


原project 中有10 files : 1 ~ 10.

先將1,2 加入,commit。 - 1
modify 1,commit。 - 2
將3加入,commit。 - 3
modify 3,commit。- 4
將4加入,commit。 - 5

reverse back to revision 2,導致 3, 4 被detect 掉。
所以要手動將一個file,一個file的 "reverse back to revision .. 當初加入的revision"。
然後..再commit一次,這一次commit算是重新tag 一次file。

之後,要回到以前的state,就reverse 到這個revision,然後依照需要再手動update 個別的file .... ? 這還不是一樣 ?

所以?還是全部check in 好啦 !! (?)

11.15.2006

build platform and Version control

CE的建構環境很糟糕,source, obj, lib, configure file 都混在一起,所以沒有辦法和versioncontrol 配合得很好。

像linux 平台的package (甚至linux kernel),source 和 working directory 是分開的,所以在commit 時,可以很清楚的將整個source directory 都commit 進去。commit 時也不會花很多時間filter binary file。

Private folder won't auto build..

在Catalog 新增Battery Driver後,"build and sysgen" 或 "Build and sysgen current BSP" 都出現coredll.def 中export 的幾個 Battery Relative Function unsolved.

rebuild BSP driver中Battery driver部份,說 找不到coredll.dll (因為上次沒有build成功)。

這時候,要到 private\....\core 下,build -c,force rebuild。

之後,再 sysgen 就 OK了。

當初由PowerManagement Miminum 改到Full時也一樣,build backlight driver時一直complain找不到 GetSystemPowerStatusEx2 ,一樣,rebuild core 後OK。

再到bsp 的battery driver處build也ok (其實這一步已經不用作了)。

所以,如果有新增category item,但是sysgen 卻complain 該item的function 找不到,大概就是要手動到 coredll 去build...

11.14.2006

Use SVN for Personal SourceCode control

其實自己寫code也有版本控制需求,否則一天到晚copy rename 也很浪費時間(空間),但是用到VSS又有點麻煩,也不適合個人使用。所以就用SVN。
安裝部份,為了怕麻煩,所以裝SVN就好,不裝apache。ref link : http://blog.yam.com/jaceju/archives/2150759.html
(為了避免lost,已將內容copy 到notes中)

安裝svn-win32-1.4.2
安裝其實很linux style,就是解開zip,放到硬碟裡,然後把folder的bin 加到系統的path中。
為了將repository folder區分開來,所以新增一個folder: C:\Repository,用來存放d repository用。

因為沒有安裝apache,所以create repository 都要用command line:
到C:\Repository下,svnadmin create test01
這樣就create一個"test01"的repository。

在C:\Repository下會產生一個test01 folder,conf folder裡面會有一些設定:
svnserv.conf , passwd, authz. 每個repository 都可以分別設定r/w權限。

client端為了方便,可以安裝TortoiseSVN,安裝完後,會跟shell整合在一起,所以用起來比較方便,但是shell 反應會比較慢。
使用上..

CE 中最常變更的就是platform 下的*.bib, *.reg。

  • 在repostory create mimicpc folder (project). 修改conf 下檔站,設好權限。
  • 在WINCE500 右鍵, checkout 選 svn://localhost/mimicpc
    這時候只有將WINCE500 和 mimicpc repository sync,沒有加入任何source。
  • 到WINCE500,對platform 右鍵,選"Add" 之後再"Commit",會等一陣子,將WINCE500下所有sorce都列出,讓你選擇實際要Add 的哪幾個file。
    可以選deselect all,然後再將platform.bib check - 這樣就只有platform.bib會被 commit。不用將整個folder都checkin。
  • SVN會將該folder的root folder 也 commit in,也就是說會perserve source hierichy。
之後,只要每次有修改source前,就把該file "Add" 就可以。
每次build success 也不要忘記 commit。

這樣,就可以任意修改,也可以隨時找回任一次的修改內容。

* 這樣作有一個壞處,因為file 是一點一點加進去的,SVN 會紀錄file加進去的時機,所以如果回到某一個file 還沒加進去的revision,SVN反而會把那一個file 刪掉。

如果是這樣,就要手動,用View Repository 把那個file "save as" 回來... 當然,你要知道有哪些file被刪掉才行。



採用incremental approach 開發(修改),每次修改一個不在svn control 的source時,記得將他Add and Commit 一次",之後修改過N次都不用處理,直到某一function 完成(build and test OK) 時,才將整個project commit。


有時候,update folder 時會出現"Not Authorize to open root of edit operation"。
這是一個buf,只要在該reposfitory folder的conf\svnserve.conf 中,有:
 anon-access = read
允許anonymouse read,同時在conf\authz 中[\] 有
 * = r
允許guest read,就會出現這個message。
所以..把svnserv.conf中anon-access=read comment掉就可以。
但是注意,[\]要加入 " * = r "

要將某個file 回到前面的revision:
  • 用 "Show Log" 列出 該file相關的revision history
  • 選擇你要的revision
  • 然後 "Revert to this revision"
這樣該file 就會顯示"not sync" (modified) 的狀態,如果要回到最新,要用"revert"。

要到任一個revision,一樣,用Show Log,然後 update to the revision

MEMO - Timer 相關..

搞了這麼久,好像又回到原點。
難道是 active thread number ?
還是 timer timeup ?
還是 memory usage ?

今天try一下timer有關的issue..

  1. RTC ? poweroff時停止RTC,PowerOn時回存。
  2. timer ? suspend時還繼續動作嗎?如果有,stop, save value, restore on resume.
  3. ? trace GetTickCount( ) code ?
  4. reschedule, schedule time-slice consume (?)

但是實際作還是...growup.. 從tinykernel 開始加東西...
from mimicpcXX 的codebase 開始 (修改過kernel, 加入monitor kernel thread..和poweroff button 偵測)。

11.13.2006

GPIO (Input) Driver : Automatic Singal on Interrupt

今天Jerry 寄了一個 gpio driver給我看,是很有趣的作法,這是作input用的GPIO。

一般 driver implement read function ,然後用polling 的方式,
這個driver則implement Write function ,
write 要接收signal 的process 的pid,然後driver在detect 到gpio pin level change 就會signal 該pid。


該gpio (實際上應該只有gpinput)的source 約略是:

module input function :
 program 好peripherial register,設定好pin function--
....
reguest_irq(IRQ_GPIO, gpinput_handler, SA_INTERRUPT, "gpinput");
interrupt handler 的內容是:
 偵測input pin..
if (pin0)
sys_kill(targetpid, SIGUSR1);
else if(pin1)
sys_kill(targetpid, SIGUSR2);
else if(pin2)
sys_kill(targetpid, SIGUSER3);
else...
targetpid 這個variale是由 write operation 設定的..
  ....
targetpid = atoi(buffer);
....
實際上IOCTL 的argument "buffer" 不能直接拿來用,要先copy_from_user( )複製到kernal space後,才能存取,atoi 也要用kernel 的funciton ,不能直接呼叫。


配合這樣的driver就可以先set sig hanelder,再用
 file = open("/dev/gpinput",O_RDRW);

char pidstr[20];
itoa(pidstr, getpid());
write(file, pidstr, strlen(pidstr));
來接收gpinput 送出的signal了。

完全用GNU/Linux工作

這裡看到的文章,大部分還好,有同感的是這段:
最重要的是,你用慣了的UNIX工具,它們可以伴隨你一生,而不會那麼容易變化或消失。你可以永遠不用再換另外的工具了。除非那個工具比你這個好的太多,而且可以完全模擬你現在的工具。

我們實驗室一個60多歲的老師,用vi, cc, make, ...都幾十年了,他以前的經驗絕對沒有白費,而且教會了我們一批又一批的學生。vi 伴隨著 UNIX 的最初發行而誕生,直到今天還是世界上頭兩號編輯器之一!有些人的 FVWM 配置文件已經用了 10 多年,現在完全不經修改還可以用。

看看 Windows 的工具,你從 Borland C++ 換到 VC, 就必需適應新的環境:菜單不同了,顏色不同了,按鈕不同了,幫助信息不同了,熱鍵不同了,編譯器參數,調試器功能也不同了,...... 那個時候恐怕花要花你很多時間去適應。當你剛剛適應了 VC, 你又要換成 VJ, PowerBuilder, C++Builder, ...

很多windows程序員都是這樣,開頭在dos下用Turbo C, 然後是 Borland C, VC, C++ Builder, ......不斷追趕微軟的潮流。而且微軟的SDK, MFC, .NET ...... 什麼都在不斷變化,不斷出問題,又不斷的在修改...... Windows 程序員不得不買又厚又重的 Microsoft Press 的書籍,看了才一個月,又過時了。今天你才學會了寫 VxD,明天你就必須用 WDM 了。你不得不註冊 MSDN 才能趕上 Microsoft 的步伐。很多人說:"計算機是貴族的專業。" 這就是微軟一手造成的。

這些東西才是沒完沒了的浪費大家的時間和金錢的。這是是浪費生命!我們為什麼不使用從誕生就那麼一致和完美的 UNIX?你需要理解先進工具的設計理念。UNIX 的工具就像我們用的汽車,它的離合器,油門,剎車,方向盤,後視鏡,永遠都在同樣的位置。用慣了的話,你對你的汽車的每一個部件都會瞭如指掌,甚至你自己都可以修車了。這難道不好嗎?
用MS的IDE,熟習的速度比不上IDE改版的速度,而每次改版,可以沿用的東西也不多。有改得比較好嗎? 也沒有 (應該說是原來做得太爛了)。 所以software programmer(對,programmer,也就是真正動手coding的人) 投資生命在MS上真是一項浪費。

那你就不要用MS呀!

也沒辦法,因為coding 的人不做MS沒有飯吃 Q_Q

11.12.2006

天哪...男的不帥,女的不美,劇情不知所云.... 這 是在作辛酸的?

11.10.2006

La Fonera is comming

親愛的HEMIDEMI朋友們,

在此要向所有熱愛 FON的朋友們致歉。

謝謝您們之前以行動支持FON社群,我們將如之前所承諾的,免費贈送一台La Fonera無線路由器!
也將在 12月初FON 台灣中文網站正式成立時,就會開始寄送La Fonera給大家。

謝謝您們的耐心等候及對FON的支持!

想知道fon在台灣的的最新消息,請點閱我們已恢復運作的部落格 http://blog.yam.com/twfon

FON Taiwan
本來以為大概沒有了,反正當初沒想到真的會得到。
結果,還真的會送勒。

Lucky !

iThome about FON ...

iThome 說有關FON :
不過,某些網路服務供應商認為用戶如果在未經同意下,加入FON社群並分享自己的頻寬,可能違反服務協議。例如Time Warner cable發言人Maureen Huff便指出,這跟小偷無異,就好像Cable用戶把線分給隔壁鄰居,以讓鄰居可以看免費電影一樣,很明顯是不對的行為。

Maureen Huff還說,如果發現有用戶非法分享頻寬,那麼該公司可能會切斷其網路服務。
這根本跟看第四台不一樣,我們申請ADSL是買"頻寬"。又不是買內容(音樂,電影)。
ISP怎能規定我裝ADSL是要給自己用 還是好心的給隔壁用。

這樣的比喻根本不對。

Computer Hangs After 49.7 Days

這大概是很古老的問題,但是為發生也蠻有趣的,在 MS的 knowedge base
有人的pc持續工作49天後,就停止工作了(當機,沒反應)。

回答:

這是Vtdapi.vxd 造成的,換掉這個VXD就可以了。

真有趣,為甚麼是49天呢?

因為Windows有一個system api :
DWORD GetTickCount(void)
會傳回從開機開始,每1 ms +1的 tick count, DWORD 的最大值是..

4,294,967.296 s = 71582.78827 min = 1193.046471 hr = 49.7103 days

所以....過了49天後,這個值就歸0了... 這就是當機的原因 @_@

這個題目在2004年好像很熱門,google一下就可以知道,有些甚至牽拖到LA機場管制49天當機的事件上。(據說當時機器是使用Windows)。

GetTickCount( ) 是一個popular 的function (?),尤其是在embedded system上,目前在CE上還是有這個function 可以用,也有同樣的問題: 49 天overflow。

所以CE blog有特別說出這個function 的使用方法: 用來計算差值,不要拿絕對值來使用。
也就是說,像以下這樣,用vu:
DWORD starttime = GetTickCount();
.....
.....
if( GetTickCount( ) - starttime >100)
dosomething...
就不會有roll over問題,
因為 unsigned :
0 - 0xFFFFFFFF = 1
所以,只要不要超過49x2天(約),計算上就不會有問題。

CE 系統為了讓"粗心"的programmer 及早發現這個問題,
將GetTickCount( )的初始值設在2 min 後overflow。
所以 如果你的機器 發生 "謎樣的2 min 死亡" 事件,就該查察 是否有哪裡 用了 GetTickCount( )這個function 了。

但是... 10 sec 當機的原因是什麼?

11.09.2006

Difference #4: Kernel / OAL Separation

CE6 有一項對OEM而言,很大的進步, 但對application developers 來說沒有影響.
在 CE5 , kernel 和OAL 是Link 在一起,成 nk.exe.
CE6 將二者分開成 oal.exe (which ends up getting renamed to nk.exe) 和 kernel.dll.
另外 Kernel Independent Transport Layer (KITL) 也獨立成 kitl.dll.
這樣的改變要是為了讓Update 更方便,
以往當MS release一個kernel patch,OEM 必須要重新link整個nk.exe.
現在 OEM 只要換掉image中的 kernel.dll 就好了.
另外一個好處是,統一規定了 kernel, OAL 和 KITL 間的介面.
這三個components藉由交換 function pointers ,variable values table 讓彼此呼叫對方提供的function.

We tried to simplify this change as much as possible, to ease porting of CE5 OALs to CE6. We hid the existence of the function pointer tables inside wrapper functions that the OAL can use, so that exactly the same set of functions are available to the OAL. Anecdotal experience from our beta partners said that BSP porting to CE6 took them mostly between one day and one month. Travis Hobrla, a member of our BSP team, developed an awesome demo for MEDC 2006 (Mobile & Embedded DevCon) where he ported the CE5 CEPC OAL to CE6 in about 15 minutes. If you are an OEM, your experiences may vary, but we don’t anticipate it being too painful. It was our goal to make it an easy port. The main area where people will have to make big changes is if their OAL called kernel APIs that we did not intend to expose to the OAL. Since in CE5 the kernel and OAL were linked together, some people found that they could call kernel functions if they knew the function signatures (which they could get from our shared source code). In CE6 those people will have to move that functionality out of the OAL, into a kernel mode driver.

11.08.2006

Linux base, Open platform Mobile Phone by FIC


FIC (大眾?) 推出Linux Base 的GSM Phone (?)。
今天LinuxDeviceEngagedSlashGear 的新聞,雖然說得跟真的一樣,但是只有圖片,沒有實機照,SlashGear竟然還有一些fancy的User interface instructions:

這有點像是Apple的touchpad專利。

據LinuxDevice.com的報導,FIC 這隻手機預計採用雙系統,可以選擇Windows Mobile或是Linux OpenMoKo。
OpenMoKo是"Open Source In Mobile"的一個計畫。(但是卻google不到任何消息)
採用雙OS的原因是可以降低Cost,大概是因為光出Linux Phone的量不會很大吧,由於OpenMoKo必須用 open source 的application ,所以Neo 1973 出貨時只有內建一些基本的application,像撥號軟體,SMS, mail agent..,user 買回家後,可以用類似OpenZaurus, familiar Linux的apt-get 的安裝介面,由Feed安裝程式,據說大部分OpenZaurus, familiar Linux的package都可以安裝。

FIC希望藉由OpenMoKo做出像Nokia的Maemo platform一樣的ecosystem。FIC會直接銷售Neo 1973,讓客戶自行選擇營運商(也就是SIM card)。

Hardware :
  • S3C2410
  • 128M RAM/64M Flash
  • 2.8" VGA touch screen
  • A-GPS
  • 雙頻GSM/GPRS module (FIC 自己做的,TI ARM 7 + Nucleus offer standard UART AT command)
  • 可由USB充電
  • MicroSD (up to 1G)
OpenMoKo:
  • Linux 2.6.17 (to be 18)
  • GTK+ 2.x
OpenMoKo有對Linux Kernel 作patch,加上GSM multiplexing (也就是同時在radio 封包上承載voice/data 資料)的能力。

Neo 1973 base on OpenMoKo,將release所有的interface,SDK,供User Customize。是一個Open system的手機。

繼GreenPhone後又一個Open platform手機,希望真的可以買得到...

Update :

OpenMoKo : http://www.openmoko.com/press/index.html

該去download他的presentatio pdf,,,,
"a phone for a true geek , think they can change the world with technology"
"Wooh ! a Absolute Open Phone."

OpenMoKo 建在 X11, GTK+ 2上,kdriver上。提供 core, net , UI, PIM 幾個 application framework。
當然,也可以run x11 的application。

該手機的概念在利用完全open 的平台提供既有的Linux application和大量的 open source programmer (geeker)在上面工作。

後續:

知名人士的猜測,從規格和目前已經血流成河的手機市場來看,這個產品應該只是為了創造話題。搭上最近熱門的 linux 熱潮。 實際會不會上市,還不一定。

NAND Flash

NAND Flash 使用類似HD一樣的操作方式來動作,他和MCU 的interface是 8(some use 16) 條 command/Data/Address 控制線(稱為IO),配上CLE/ALE/CE/RE/WE 控制線來辨別目前IO 傳遞的內容。

NAND Flash 內存放資料的方式,也和HD類似,是以塊狀的方式存放,但是和HD不一樣的是,NAND Flash 保有Nor Flash 的特性,只能一塊一塊的erase。

NAND Flash 內的儲存單位有一些名稱:

Block : 最大的單位,也是erase的單位。
Pages: 內部buffer讀取的單位,一個Block有64 個Pages。

一個Page 內含 2k Bytes 的一般data,和額外64 bytes 的輔助資料空間。
雖然有這樣的區分,但是實際上2k和64 bytes之間並沒有區動作,64 byte的功能是讓programmer自行運用的。一般用來存放ECC,或是wearing 資料..
NAND Flash 內部和HD一樣 有一個buffer,buffer大小剛好是一個pages,buffer作為NAND Flash 內部儲存元件與外界溝通的空間,所有 data I/O 動作都要藉由buffer完成:
  • 讀取動作:下command要求buffer將某一pages的內容讀入buffer,MCU再一一將buffer的資料讀出。
  • 寫入動作:先告訴buffer要作write動作,接著輸入1個page的資料,完成後,請buffer將資料寫入(某一)page。
和NOR Flash 一樣,寫入的動作需要先作erase,Erase將所有data bit社為1,program是把bit 清為0。
programming guid 有說明:也可以不做erase 動作,只要你知道你要寫入的區域都是1111..也就是未曾使用過的區域。
同樣的,寫入資料時,"1"應視為"don't change",也就是不改變該bit內容的意思。
MCU Interface Protocol

如前所述,靠著CLE/ALE/RE/WE 來決定IOx8 的內容
  • CLE : Command Latch Enable - 目前IOx8的內容是command
  • ALE:Address Latch Enable - 目前IOx8的內容是Address
  • RE : Read Enable - 目前IOx8 作read 動作
  • WE: Write Enable - 目前IOx8 作write動作
RE/WE除了指示IOx8 的"方向"外,同時作 latch 的signal。
Protocol 區分為以下幾段:
  1. Command : 送出Command Code,表示目前的操作
  2. Address : 該Command 操作的 Address
  3. Data : 資料
  4. Command : 第二個command,通常代表command確認,結束。
不是所有的動作都需要有這四段,有些動作不需要Address,有些不需要Data。

Address

Address的指定方式和內部構造一樣,分為 Block Index (address), Pages Index (address) 和 Byte Address。 分別指定:第幾個Block,該Block中的第幾個Pages,和該Page中的第幾個Byte。
由於IO只有8條,所以address要分成多次輸入:
  1. Byte Address 0-7
  2. Byte Address 8-11
  3. Page Address 0-5 + Block Address 0 -1
  4. Block Address 2-9
  5. Block Address 10
這5個Address不是每一個command都需要,有些需要1, 2,有些需要4,5,有些command不需要Address資料。

以下針對各動作的protocol說明

Read
  1. 送出Command 00h
  2. 送出要讀取的Address ,如:的3個block,的100個pages的第34 bytes開始。-
  3. 送出Command 30h - Read Confirm
  4. 等NAND buffer將該page的資料讀進buffer中
  5. 每一個RE依序輸出一個byte的資料,從Address指定的位置開始,可以讀任意個,但是只能在同一個page中,當讀取超出該page時,會讀到錯的資料。
Random Read

在剛剛的Read 過程中,RE輸出data的階段,如果想跳到同一個pages的其他位置去讀取,可以在用 Command 05 插入RE的讀取動作中,修改讀取的address:
  1. RE.....
  2. Command 05h
  3. Address - 2 cycles就可以,因為限定在同一個page中,所以不用送pages 和block address。
  4. Command E0h - Confirm
  5. RE...從新的位置開始讀取...
Write (Program)

和Read 類似,對整個page動作:
  1. Command 80h
  2. Address - 5 cycles, 指定從block-pages-start address開始..
  3. Data - 開始輸入要write的資料, WE clock..依次輸入...
  4. Command 10h - Confirm
Command 80h 會將NAND Flash 內部的buffer 清為FFh,接下來的Address,代表你要對從哪一個Block的哪一個page的哪一個位址開始"修改資料",然後data cycle 就開始從那個位置開始將buffer的data update成你輸入的data。
Random input

和Random Read一樣,在輸入資料的階段 WR...,可以用Command 85 + 2 Address cycle 改變要輸入的位址,接著繼續輸入資料。


以上可以看出 NAND Flash 內部buffer有一個pointer,代表buffer R/W的位址,每次R/W後會自動+1, 85h command就是更動該pointer資料的command。
Technorati 要的Claim Link : Technorati Profile...待會刪掉..

11.07.2006

Program 的execution image : EXE, DLL, STACK, HEAP, UNUSED..
沒有virtual memory 的machine,因為各section 內不可中斷,所以一些object (DLL, heap) unload, load 後,就會出現memory fragementation。

section 內不可中斷: STACK 內用來存放stack ,當STACK用"滿"時,也就是pointer 頂到了在他前面的DLL section,不可能跳過這些區域,由未使用的UNUSED section 中,再找一塊memory 出來,當作是STACK,繼續工作。因為UNUSED Section 和STACK Section 並不連續,stack pointer沒辦法工作。

範例是用DLL來作比喻:假設DLL section load有兩個DLL : DLL1, DLL2,當DLL2 不需要使用了,program unload DLL2,然後load另一個DLL : DLL3,如果DLL 3 < DLL2,則可以順利的load到原DLL 2 空出來的區域,但是當DLL3 > DLL2時,DLL2 空出來的區域就浪費掉了。

使用virtial memory 的machine,同樣的 execution image : memory 的管理以4k 為單位,可以任意mapping到pysical memory中,所以即使physical memory 上兩塊不連續的區域,都可以藉由virtial memory translation 讓他們在virutal memory space中是連續的(一個接在另一個的後面),所以memory fragementation 最大不會超過4k。

11.06.2006

sysgen ,,, build - 不會作platform.bat 的dependent check

CEBUILD 有一個custom platform prebuild bat : <platform_name>.bat

這個bat檔會在所有build動作之前執行,所以會被用來宣告很多define, undefine function。
platform src 再follow 這個define 作condition compile。

但是

很愚蠢的是...如果修改了這個 bat 檔,執行sysgen (當然不會build)和用command line到 platform Src 下任何一個folder 作 "build" 動作,該 build program 並不會 "察覺" 到 batch file已經變更,必須要要compile source。

所以,必須要"手動",到改動batch file 相關定義有關的地方下 "build -c" (-c 是force clean),強制re compile,才行。

也就是說... source depnendency 是手動check 的 ( !!!! 沒有source depnendency check,加上close source, ... 又有人說"Build and Sysgen" + check "Clean befor Build" 會讓private folder的code掛掉 !!! 那,programmer又怎能保證 source module間的一致 ???? )


據Robert 所說,platform..bat 內所設定的environment variable 只和platform folder內的source code有關係,所以修改過 platform ...bat後,到platform 下作"build -c" 才是最保險的作法。

再來,build 只有作compile,沒有link,所以做完build -c 後,要sysgen重新link

OEMIoControl

debug 時,log 有:
OEMIoControl: Unsupported Code 0x10100fc - device 0x0101 func 63
所以查一下 OEMIoControl: http://msdn.microsoft.com/library/
default.asp?url=/library/en-us/wcedsn40/html/cmrefOEMIoControl.asp

OEMIoControl是OAL implement的,當 device driver或application 呼叫 KernelIoControl( )這個Kernel Sevice Function 時,kernel就會呼叫OEMIoControl,另外,SystemParametersInfo( )這個function call 也會呼叫OEMIoControl( ),由OAL 負責傳回system information。

既然名稱是IOCTL,參數也跟Linux 的IOCTRL一樣,是用function number配上structure pointer來傳遞參數。

OEMIoControl 是OAL 實做的,不是device driver,device driver。Device Driver實做的Io Control會是 Dll export的介面,不需要由kernel 呼叫。

Wiindows CE 6.0 Open Source (?)

今天在 jservOpen Source 新聞看到這個消息: CE 6.0 將開放原始碼。

開放的Source Code有多少呢? 依照 jserv 文章的link到 WindowsForDevice.com 的文章看,是 100 % (!)。但是其他的新聞都沒有說明是100%,只有說是比5.0多56%。

WindowsForDevice.com 的說明比較仔細,share source code只要在VS (6.0 的Platform builder 已經成為Visual Studio 2005的一個plug-in)的catalog item,如果該item是"private",則會出現一個License Agreement dialog要求你確認。
-- 所以,不用像5.0一樣要到MS網站去申請( 還不知道什麼時候會回覆)。

依照說明,open 的方式是BSD-like,也就是說,可以任意修改,不必附source code給customer,也不用 "交回" MS。 但是 jserv說,該license尚未獲得 OSI 認可。

c|net也有新聞說明 6.0 open source ,並且說是"完全" 開放。新聞中有一句話:

WinCE嵌入式系統產品平均開發時間為8個月,若以Linux開發則平均得拉長至14個月;此外WinCE具有各式各樣的模組,在Linux上可能得自行開發或另外授權,事實上Linux不見得免費或比較便宜,嵌入式系統廠商必須以上市時間等整體開發成本為考量。
如果embedded system design 就像一般軟體樣,只要東西拉一拉, build, rom 化 就OK的話,他說得倒是不錯。但是 embedded system 花最多時間的地方是在處理embedded system 的hardware 限制上,產品的prototype是很快,但是debug時間就要很長,當然你也可以就接受產品有那麼點defect,然後就上市,但是那看起來就會是有點"半吊子"的東西。

而在Debug 的時後,有source code跟沒source code的差別 有多大,應該是不用說明了,沒有source code 的東西,就算有一堆文件,也比不上有source code的東西 來的好用。
這一點有多重要?我有一次面試一家CE base 產品的公司,唯一的題目就是"一個沒有source code的東西如果有問題,要怎麼作 ? "

-- 我還真不知道怎麼作呢,只有一次同事使用pSXS的經驗,利用proxy + snipper 找出原來問題在pSXS沒有open 出來的IP Stack 上。還有一次用sample clip 證明是vendor 沒有release出來的decoder的問題,還有用B廠家的code+A廠家的library 輸出debug message,證明A vendor沒有release的module中parameter有錯誤。

但是證明了問題出在沒有open source的code上,新的感覺是如何呢?
當然是非常,非常的不好。
覺得浪費了自己的生命在非常無聊的事情上,
尤其是知道世界上有open 的source code有一大堆都研究不完了,
卻還要浪費生命為這些寫的爛又不release的code作debug.....
但是source open 出來終算是好事一件,光是這一點就想趕快切到6.0去。否則,依照慣例,MS的產品至少要到QFE出了兩月份後才能用。
這一篇,很明顯的,是一篇抱怨文 :P

11.02.2006

Usefule EXE in "SDK\BIN\I386"

CE的 "\SDK\BIN\I386" 里有很多有用的program,像errlook.exe就是error code的翻譯程式,當執行win32 program出現error code時,輸入error code,就會顯示eror code的名稱(中文的喔)。
像 執行 remote debug 時出現 Error Code : 126,查的結果是:"找不到指定的模組"。

Suspend/Resume

Suspend 狀態是將 CPU 中,所有週邊和cpu core的clock ,power 都停掉,只留下
  • DRAM refresh
  • RTC
  • INT
三個部份還有動作,這樣的目的是要減少電源消耗,同時盡量維持執行狀態。
讓裝置回到正常狀態的方式有
  • 外部中斷
  • RTC TimerUp (也是中斷)
從PowerOff中恢復後,要盡量讓系統回到當初power Off的狀態。

Suspend/Recover的動作有一點像Task Switch,就是Stack Frame的操作:在斷電前將StackFrame保存在固定的地方,Recover時到那個地方拿回Stack Frame回存,動作跟TaskSwitch一模一樣。

CE 的Suspend/Resume 動作 需要driver的配合,所以所有Driver都要implement (and export) PowerUp/PowerDown function。另外GUI 的部份也要response to WM_XX 這個power state change message。

在PUBLIC\COMMON\OAK\DRIVERS\PM\MDD\pmresume.cpp 的comment中有說明:
Application (Drvier) 中不可以直接呼叫 PowerOffSystem( )來suspend system,要藉由 SetSystemPowerState ( ) 這個 Win32 funtion 來轉換 power status 到 suspend/resume 狀態才行。 因為 SetSystemPowerState( ) 在呼叫PowerOffSystem( ) 之前,還會呼叫PM 的function 一一呼叫所有Device 的 PowerOn/PowerDown function,還會post necessary message to GWES server,最後才呼叫PowerOffSystem( )將所有cpu core關閉。
SetSystemPowerState()是一個手套,會去呼叫PlatformSetSystemPowerState(),

11.01.2006

CEC 和Platform Builder

PUBLIC\COMMON\OAK\CATALOG\ 目錄下都是PlatformBuilder 使用的設定資料。
  • CEC : 所有的 *.cec 檔案,所有import 進platform builder的cec都會有一份備份在這裡。這些cec file 可以作為create cec 物件的參考。
  • NewPlatformWizard : PlatformBuilder - New Platform 時幾個building template 的內容,在這些file中可以看出各template額外設定的Build Option, SYSGEN Variable。這些都是在platform builder中看不到的(尤其是SYSGEN_XXX變數)。
*.CEC是platform builder的元件定義檔(其實也很不完全,只有定義出一些該元件需要的資料),在Platform Builder中提供CEC Edit 工具來修改,Create CEC檔。

Goupe 的階層在CEC中使用類似目錄字串的方式表示(以"\"區分)。

CEC Editor的使用很不直觀,有些是要新增,修改property後,該item才會重新"落"在適當的階層下。還有先找個"地方"新增item完後,再edit property,或是按右鍵,讓隸屬於某一個item (造成item dependency)。

"Parent Node Require This Groupe" 就是dependency (?)

使用CEC Editor時,可以開啟一個複雜的CEC,然後New一個測試 File,用"右鍵"試試使用方法。

這個功能比較有用的地方在於 能知道 Catalog 中item 與該source code所在位置。(Catalog與SYSGEN_VAR 的關係在PB中就會自動顯示)。

由於 各Item間有dependency存在,所以在 Edit Platform時,有時後只有選一個item,卻有很多其他item被自動加入,這是PlatformBuilder依照該Item的dependency自動加進去的,在Platform Builder的 OSDesignView中有小小的icon,可以用來區分這是你選擇加入的還是因為depends on other item而被加入的:

上面兩個圖示,一個下面有小小的紅色檢箭頭就是你選擇加入的,沒有小小箭頭的就是因為dependency 加入的。

Workspace的description file : *.pbxml 只有紀錄 你選擇加入的item,dependent item沒有紀錄,但是在每次open Workspace時,platform builder會再自動依照該item 的CEC描述加入需要的item。
(所以修改過CEC file,要重新open一次workspace)

10.31.2006

"Build and Sysgen" won't build(compile?) the PRIVATE folder

修改PRIVATE下的folder,用IDE的"Build OS - Build and Sysgen" [no clean],並不會compile PRIVATE 下的folder,所以要手動:
  1. 開啟release directory,,,
  2. SET WINCEREL=1
  3. build -c
  4. 到parent folder再build 一次(make sure the target lib has been update)
這樣做完後,如果其他地方的code都沒有modify,只要作 "Sysgen" 就可以了。
..

Memo : modify source in source folders

修改Source Code Folder中的任一個source code時,將整個folder copy, rename 後常常會造成PB catalog 的錯誤,所以最好copy 到WINCE500 以外的folder,這樣很麻煩,所以當只有修改部份source code時,將原source file rename成 backup_XX.XX 放在原folder處就可以,這樣將來要改回時,可以利用search 功能 找到所有backup_XX.XX的file。

10.30.2006

worklog of last week

  • 想要rebuild device.exe,卻不行,開始trace nk.exe,找load device.exe的地方。
  • 在nk.exe中加入debug message,rebuild。
  • document說只有debug version 可以rebuild private folder codes。try building debug version。
  • debug version ROM太大,要enable > 64M image。
  • debug version boot speed too slow,而且不會output debug message。
  • 換回release version,nk.exe build ok (跟document 不合),會output debug message。
  • try tiny-kernel ,成功run tktest.exe...
  • 修改tktest 再build後就fail了,tktest.exe prefetch abort。
  • 開始try 各種configuration (item),設法找到fail 的原因。
  • 上QFE。build on another machine。
  • from a minimum configuration, add necessary item - TKTEST prefetch abort.
  • 以為是item沒有選對,所以一個一個try。結果不是item的原因,是...一定要先加一些奇怪的item,build fail後再移除才可以。但是再sysgen一次(沒有修改任何configuration)就fail。
  • enable KERNEL_MONITOR Thread,發現雖然tktest.exe abort,但是kernel依然是ok (kernel monitor thread ok)。所以決定用kernel monitor thread來作on/off process。
  • Trace power off process - power button trigger (timer) call to kernel - oal - off,找到power off 的kernel function。
  • kernel monitor thread 用sleep( )來auto off 是OK的。加入powerbutton oal,修改掉compile error (unresolved external)後,也可以用power button ON。
  • 在monitor thread加入polling power button .. access peripherial register - mapping ok, read 就會exception。
  • Virtual/Physical Translation在UserMode和KernelMode不一樣,Kernel Mode要用VALPAtoPA。
  • 開機後馬上進入PowerOff - 加入putton release check。
  • 發現 NB的building speed竟然是PC的4倍。
花這麼多時間,都是在find building process,source code (not disclosed),image上。跟真正的trace code沒有關係。
<-- 都是花在none-open source 上的effort。

10.28.2006

更換X32的HD

命運多舛80G HD終於拿到了,拿來換上X32。
換的時候順便看了一下兩個HD的spec:
原廠:Toshiba 40G 5400rpm
新買 : Seagate 80G 5400 8M.
重點是在電流上:
原來的是1A,新的這個是0.46A?是真的?還是Toshiba太保守了?

換上後 速度好像...有點影響(希望是心理上的..慢)。

順便試試上次做的X32 還原光碟。果然比以前的方便多了,放上第一片,不用進入bios設定security,直接就進入IBM 恢復程式,選恢復成開機(出廠)狀態....等...重開機。放入第二片。然後就不用管他,約1.5 hours後 就出現剛拿到的X32一樣....轉換FAT to NTFS...然後,後面就都一樣了。

這次新拿到的HD為了確認沒壞,所以有先用USB 裝置在widows下"初始化"和parition 成ntfs過(whole one partition)。

安裝過程中有一點疑問的的方式重開機時,問"是不是有IBM supplyment CD?"我以為有,所以放入恢復光碟,按Yes,結果都不是。

還有 安裝玩後,keyboard的" . " button 變得有點不靈,這個按鍵剛好在HD上面,該不會換Hd的問題?

還好我多按了幾次後,就恢復了。

還有... 今天的keroro配音好像換了...
後續:
隔天實際測試battery life : 播放30 min 照片後,一般web surfing, upload一個60M的video 到youtube,看兩段youtube 影片。..msn.. 除了一開始30min LCD backlight是FULL外,剩下時間調成1格。Wifi 全時開啟。
7:40 ~12:10 battery 剩下21%, 開始出現low battery warning 警訊,但是顯示還可以使用1:20 min。
所以猜測大概真的可以用到5:00。

10.26.2006

收到 銀箭線上 更換的HD了

今天忍不住又去pchome留言,問一下 已經快一個禮拜了,我的hd什麼時候才會回來。
回家後 就收到了,馬上測試了一下,這次OK。

但是..說會退郵費的,我花115,只有退90... 枉費我還特地問可不可以用宅急變,他還說可以。

算起來還真不划算,花時間測試,確認壞掉,自己去寄,浪費時間,還等了快一個禮拜才收到更換品,還倒貼20多塊郵資,真是 花錢,花時間。

這次 銀箭線上的hd 真的是非常不划算 (不過也沒差,他以後大概也不會再賣hd了吧)。

How to build nk.exe

先要上QFE : 2005 annually update 和2006的(到9月)。實際上好像是2004 的某一個QFE有update private folder source file,才可以build出nkmain.lib。

  1. modify your sourcecode in private\wincecore\coreos\nk\
  2. open release directory - set WINCEREL=1, build -c
  3. - 確認一下 public\common\oak\lib\nkmain.lib (或nkXXX.lib)的date-time。
  4. sysgen
  5. makeimg - output log中會有message " updated private data in nk.exe"
在nk.exe中,如果要print message,用NKPrintfW(L" format %x", data);

目前好像只有nk.exe可以build,device.exe依然不能 (雖然可以compile成lib,但是不會link成device.exe )。

the 1st Process launched by nk.exe

SchedInit( ) OpenExecutable ("nk.exe").. in nk.exe..

Kernel 的sheduler好像是在 NK\KERNEL\scheduler.c 中的 SystemStartupFunc ( )
  1. 在pROM 結構中找到sharedll 區域的位置
  2. Alloc Memory
  3. Load coredll.dll
  4. 在load 到memory 的coredll.dll 中找到需要的一些function pointer ( 用 function index的方法 )。
  5. Create Kernel need synchronize object - event, critical section..
  6. CreateThread : PowerHandlerGuardThrd,
  7. Load shimeng.dll
  8. CreateThread : CleanDirtyPagesThread
  9. CreateThread : RunApp
  10. Endless While - Wait Alarm (Time limit - oneday), give CleanDirtyPages a chance to run.
RunApp 在 kmisc.c
  1. CreateProcess : filesys.exe <-- this is the very 1st process Lives after nk.exe

New Platform - why I have somthing I don't want ?

New Platform

問題:每次New Platform 一個新的platform ,結果出來的OSDesign View Item 好像都不一樣。

回答:

這是因為 Platform Builder很自動(多事?)的幫你加入一些item 的關係(即使你選了"custom"也一樣)。

在platform builder中使用New Platform Create一個platform 時,第一個動作: "BSP"。
在選定BSP後,Platform builder會參考該BSP下的bat檔 (platform\<your_platform>\<your_platform>.bat),執行他,所以該BAT檔中所有設定的環境變數,都會在接下來的操作中繼承。

舉例來說:在 <your_platform>.bat中設定了SYSGEN_BINFS=1,則接下來Platform Builder就會自動在New Platform 中加入 Binary File System 這一個component (將游標移掉Catalog item 上, platform builder會顯示出該item 對應的SYSGEN_VAR)。即使你在接下來的各item 選擇中都沒有加入該item (Custom ),最後那一個item 還是會被 加入。

New Platform 完成後,在Workspace的OSD View中就可以看到被自動加入的item,如果去delete他,會有warning dialog出現,請你刪除掉 " SYSGEN_XX" 環境變數。

反過來說,當自己create一個platform時,可以藉由定義SYSGEN_XXX的方式來強制使用該BSP的設計加入需要的item。

另外Platform Setting 中build option 也會影響到被加入的item,可以在New Platform 的最後一步 "modify building options without leaving the dialog" 按下這個link,將不要的build option 拿掉,這樣最後Create出來的platform 才會包含你需要的item (不會被自動加入其他的item )。

10.25.2006

CE 的build 動作

一般的software , os run time image的 build 動作,不外乎是..
  1. config, generate heder and defines
  2. compile
  3. link
  4. relocate resource and exe files
  5. combine all to rom image
但是CE platform build卻看不出這幾個動作..

首先,這一篇(要用IE 或IE Tab來看,因為裡面的圖用了IE特殊的script )有說明build phase. 出乎意外的是:
  1. Compile
  2. Sysgen
  3. Release Copy
  4. Make run-time image
Compile在sysgen之前。

文章的圖對於各build tool 之間的關係說得很仔細:

所以blddemo.bat 是最大的batch program,做了所有的事。依據呼叫cebuild.bat, buildrel.bat 和makeimg.exe。

cebuild.bat 作 上面.. 1.Compile 和 2.sysgen 的動作。

所以sysgen 並沒有compile 囉?


blddemo.bat 可以有以下使用法:
blddemo [clean | noclean] [rel | norel] [-q | -qbsp] [Cebuild.bat parameters]
clean, noclean - clean 的目標是指%_PROJECTROOT%\Cesysgen 和 %_PLATFORMROOT%\Cesysgen。
當有修改 %_WINCEROOT%\Public\CEBASE\OAK\Misc\Cesysgen.bat 時,才需要clean。
含有environment variable 中,以SYSGEN 和BSP 開頭的變數有變更時,也需要clean。

rel, norel - norel 大概是指要不要自動將 compile完的file copy 到release folder,及之後的動作(makeimg)。

-q - 這是pass給cebuild.bat 的參數, -qbsp 是告訴cebuild 只要build plaform folder以下的source。 -q 是說 ? 有點conflict.. 好像說,所有source 和sysgen 變數都沒有改變。

cebuild.bat parameters - 是任何呼叫cebuild.bat 時傳遞的參數。


在command line 使用blddemo.bat 來build image的話,可以先設定好環境變數:
set BLDDEMO_MI_LOG=1
這樣blddemo.bat會在目前目錄下產生
  • Makeimg.out : makeimg.bat 的log
  • SysgenSettings.out : sysgen 在做完dependency check 後的setting.

Cebuild.bat
  1. 在%_WINCEROOT%\Public\ 中,所有env var : _DEPTREES 中所包含的 folder name,一一的到該目錄下執行 build.exe 來compile source code。
  2. 對每一個_DEPTREES 中包含的item XXX,執行 Sysgen.bat -p XXX 。
    Sysgen.bat 將會 還會依照cesysgen.bat 產生的module 需求,buid module。
    Sysgen.bat 還會build %PROJECTROOT%\Oak\Misc 下的module。
  3. 到%_PLATFORMROOT%\%_TGTPLAT% 作build.exe,compile hardware platform的module
猜測Build 作compile, sysgen 才作link。
為此,使用Cebuild.bat時,可以加上 " -q " 叫cebuild.bat不要呼叫build.exe將source code重新compile,直接叫sysgen 重新link就好。

Sysgen.bat

真的是作link的動作...

sysgen.bat 將Cesysgen.bat中指定的所有module,用nmake.exe將各個lib link起來。
  1. sysgen.bat 到%_PROJECTROOT%\Oak\Misc中參考Cesysgen.bat,設定好適當的envvar。
  2. 參考 %_WINCEROOT%\Public\Common\Cesysgen 下的makefile,如果有-p option時,則follow -p option 指定的 Project ,參考 %_WINCEROOT%\PBWorkspaces\<Project Name%gt;\Cestsgen 下的makefile。參考這些makefile,作以下..
    1. Create Target system directory
    2. 將Cesysgen.bat中指定的 .lib link 起來
    3. Call Res2res.exe, 將所有resource file 合併起來
    4. call Cefilter.exe 處理 CE header file 和其他source file,
      CE header file 中有些comment 被用來作condition statement : @CESYSGEN。
      利用這些condition statement,可以讓Cefilter變更處理的動作。
    5. Cefilter.exe處理%_COMMONPUBROOT%以下四個folder中的file,並且output到 %PROJECTROOT%\Cesysgen\的對應位置:
      1. \Sdk\Inc\*.* ==>\Sdk\Inc
      2. \Oak\Inc\*.* ==>\Oak\Inc
      3. \Ddk\Inc\*.* ==>\Ddk\Inc
      4. \Oak\Files\Common\*.* ==> \Oak\Files
    6. Copy modules 到target directory
  3. Sysgen.bat會將Error輸出log到%_WINCEROOT%\Build.log中
stsgen   [-c] [-p Tree] [NmakeTarget] [NmakeTarget] ...
-c : Run Nmake.exe時, 加上clean 參數
-p Tree : 對 Tree 作sysgen,當沒有指定時,對common project 作 (?)
NmakeTarget : 指定build Target module就好,當沒有指定時,sysgen 對所有Cesysgen.bat中列出的module作sysgen。
 sysgen -p wceshell
這個動作指示sysgen build/link wceshell module,並且copy 到 target folder

Cesysgen.bat
?

簡單的說:
  • build.exe 是compile,但是build.exe產生的是lib (也是就ar 起來的一堆obj)
  • sysgen 是link,依照cesysgen.bat 的內容將各 lib link成target : exe, dll
  • resource arrangement - 略
  • makeimge : 依照binary image script (*.bib) 將各exe, dll , res,... 合併成一個image。
以上整個動作可以由blddemo.bat完成。

10.24.2006

try build wth x32

1.7G 512M 5200rpm
tiny kernel w tktest smdk2440
10:15 start building
10:51 stop on build error
ok..rebuild again.. try suspend to hd during building..

? 好像比 C2.6 + 512M 還快... PM 1.7 會比 C2.6快??

CE : MISC Work Record : Tiny Kernel Mode ,, Test Program

在build log 中會出現:
CE_MODULES=coredll nk shell relfsd loaddbg shellcelog fsdmgr filesys toolhelp rt_tests
COREDLL_COMPONENTS=coremain lmem showerr thunks corecrt corestrw snotify coregwestub coreimmstub coresiow serdev locmini multiui full_crt crypthash rsa32
NK_COMPONENTS= nkcompr nkmapfile
FILESYS_COMPONENTS=fsheap fsmain fsreg fsysram msgqueue
可以看出NK.EXE, COREDLL.DLL, 各由哪一些 lib 組合而成,但是不知道決定dependency 的地方在哪裡。

New Platform : build 出來的platform在OS design View中會自動依照Platform-Setting - Build Option 的項目加入需要的item,所以刪除該item時,會出現一個dialog,說明同時要將 ENABLE_XXX 的item 關閉。

但是雖然OS Design View 中有該item,實際看workspace.pbxml 卻還是只有基本的item (就是有選的item),也就是說... 實際的和OS Design View 不符。

將 platform-Setting-build option 中的item 都不勾選,TinyKernel 就只有標準的nk, coredll 兩個。


  1. uncheck all "Platform - Settings - Build Options" except "FullKernelMode".
  2. uncheck "Clean befor build" and "make run-time image after build".
  3. build and sysgen
  4. modify platform.bib
    1. comment out FlashDrv.dll
    2. comment sdmmc ...
    3. comment pnashell.bib
  5. modify *.reg <- seems not need to do this


TinyKernel Test Program的位置在
PUBLIC\COMMON\OAK\tktest

在common.bib中有描述,當指定使用MODULE_TKTEST時,會將tktest.exe copy到 image中,rename成filesys.exe。

這是因為 CE 的 kernel : 寫死了 起動後 run ...
  • schedule.c : SchedInit( ) : CreateThread( ... SystemStartupFunc ...)
  • schedule.c : SystemStartupFunc : CreateKerelThread( ... RunApps ... )
  • kmisc.c : RunApps( ) : CreateProcess( ..filesys.exe... )
所以...第一個啟動的是filesys.exe (?)。
跟Linux一樣,kerel boot後,指定root filesystem, kernel 用內建node id找到後,找到裡面的init.. load, run。
所以makeimg完,用viewbin -top nk.bin 看 MODULE 只有看到filesys.exe,沒看到tktest.exe。
dir 出來看,tktest.exe 和 filesys.exe 的size一樣大。

download and Run ...
In TKTest
Page size=4096, 13426 total pages, 13402 free pages. 13401 MinFree pages (102400 MaxUsed bytes)
Event created successfully, About to set event
Look, a message from a thread
In thread, loop cnt = 0
In thread, loop cnt = 1
In thread, loop cnt = 2
In thread, loop cnt = 3
...
.成功。

很愚蠢的是 沒有單純build tktest.exe 的方法,tktest\source 中指定target是sharelib,所以build 出來會是 tktest.lib (!!)。
好像是到該folder build -c 後 sysgen ,修改platform.bib後再makeimg就可以..

這樣啟動的kernel,因為filesystem 沒有啟動,所以registry 都沒有用。

好笑的事

今天iThome的新聞..
...面對微軟下一代作業系統Windows Vista推出時程一延再延,與內建的PatchGuard與安全中心(Windows Security Center,WSC)兩項安全機制,許多國內資安業者紛站出來表達心中的不滿。 ..
這個...有點... 好笑。

10.23.2006

CE : Register an INT handler - Thread

Interrupt Handling Process..
用Thread來作
  1. Create an Event
  2. Associate this Event to specific INT
  3. while loop - WaitForSingleObject

讓event 和INT關聯起來的方法: IOCTL_HAL_REQUEST_SYSINTR
argument:
  • lpInBuf : 要"觀照"的 IRQ - 例如...EXT_INT0
  • lpOutBuf : 取得的ID
之後再用 InterruptInitialize ( ) 把剛拿到的ID和Event關聯在一起(跟kernel 註冊)。

但是不知道 .. INT ... sispatch .. int handler .. event .. waitObject thread.. 這個flow 的code再哪裡。

10.21.2006

CE book Notes : Process and IPC objects

以下是"Building Powerful Platform with Windows CE"的筆記..

和大部分的Realtime OS一樣...

Program ,Process,Thread

在Storage中,還沒活化(也就是說,還沒有依照program header alloc memory, 給他用,還沒將run-time 環境設好的狀態)。叫Program。
Program活化後,就叫Process,Process有自己的memory space,OS 用virtual memory的方式為每個process提供自己的memory space,並且保護不讓彼此影響,也不會影響到OS。
Thread是OS scheduler的排程單位,每個Process都是自己的"Pimary Thread",當然,可以create 多個Thread,方便設計,同一個Process的Thread都和share同一個memory space,所以可以互相access彼此宣告的變數。

Thread可以run在kernel mode或是user mode,這是由CE kernel決定的,一般ISR thread會run在kernel mode,其他就run在user mode,kernel mode的thread可以access所有kernel resource,所以也可以crash kernel。

在kernel mode執行的thread 效能會比較好一點,因為減少了access right check的時間。所以如果你很勇敢的話,可以啟動"full kernel mode"選項,讓所有的process (thread) 都run在kernel mode。


Process是用CreateProcess( )來啟動,argument是Process的對應program name,可以在argument中直接指定program所在的path,不然kernel會依照 "WINDOWS", "\","PPSHELL","."。OEM 可以在registry : HKEY_LOCAL_MACHINE\Loader\SystemPath 中寫入search path string。

Thread用CreateThread( )來啟動,argument是thread的function address (pointer),還有一個argument是用來傳遞給這個thread的working space,通常是一個structure。Thread可以啟動在suspend mode,然後用ResumeThread 恢富工作。


Schedler

CE的schedule是preemptive,priority, time-slice base。預設的tread quantum是100ms,OEM可以在kernel 啟動時設定自己要的thread quantum。

每個thread可以有0-255 的priority,0是最高的priority。當有很多thread是相同的priority時,scheduler採用round robin的方式。


Synchronization

和其他RTOS一樣,CE也有Mutex,Semaphore,Events,Critical Section用於IPC的object。每個object在使用前都要用create來取得一個handle作溝通用。thread可以用WaitForSingleObject 或是WaitForMultipleObject 來wait(取得)單一或多個IPC object。
所以syhchronization object的用法通常是宣告一個global variable 的object handle,在還沒使用前create他,然後各thread用這個global variable來操作。

Mutex 就是簡單的互斥物件,CE為了防止programmera acqure到一個mutex後還沒release就又acquire他,設計成"acquire一個已經擁有的mutex時,會馬上return,不會被block..。

Semaphore 可以看作是counting mutex,在create semaphore時可以決定他的available number是多少(32 bit int)。

Events是用來"通知"的object,一個thread可以signle 一個event,讓wait 這個event的thread知道該事件已經發生。CE的設計是:當有多個thread都在wait同一個event,只有第一個wait這個event的thread會return。

Critical Section 用EnterCriticalSection和LeaveCriticalSection來形成一個不會被swap out 的code section。(但是不清楚ISR會不會也被disable)。


Communication between Process


剛剛講的都是Thread之間的IPC,因為同一個process的thread都在同一個memory space,所以可以用共用變數來傳遞IPC object handle。但是在Process間就不能這樣用了,因為Process間有OS的virtual memory 隔開,不互相存取對方的變數。所以Process間的IPC就要用其他的方法。

CE利用Windows Message作為Process間同步的機制,一樣,要使用前,必須要用RegisterWindowsMessage向kernel 索取一個沒有人用的message id,然後用這個message來傳遞資料給其他Process (那其他Process怎麼會知道他要對哪一個Message ID反應?)。

傳遞message時,可以同時包含兩個參數: lParam, wParam。都是DWORD,這也就代表只能傳遞 8 bytes的資料,如果要傳更大的資料,就要先用structure包裝好,然後將structure pointer放在lParam中,但是因為Process間的virtual memory mapping是不同的,所以光傳address過去,對方也取不到你的memory 資料。為此,要使用WM_COPYDATA這一個message來傳遞參數才行,這個message的lParam是COPYDATASTRUCT型別,包含一個pointer和一個size,kernel會負責將size的資料copy到對方的空間。這樣的需求(kernel幫忙處理),就要用SendMessage這一個function來傳遞WM_COPYDATA,讓kernel在將message交到reciver process前,先將data copy好。

pchome : news 2.0 新聞評論網站

最近收到的 Pchome 電子報在每則新聞條目下都會多了一個"我要評論" icon。
進入後就會到PChome的News 2.0網站,雖然還是維持當初PChome 2.0 的"不知如何使用"的網站設計風格,但是從條目上:
  • 標籤
  • 民選頭條
  • 本日10大趣聞
  • 網友評論
大概可以看到,是和最近很有名的hemidemi 有點類似,不過hemidemi的"主體"可以是任意的網頁,blog和新文。
pchome news2.0 好像只能針對新聞而已(不知道所謂的"新聞"是要如何定義)。

使用上有一奇怪的是..從每一個條目,找不到原來的新聞原文。是可以讓user自己寫嗎?

是喔,那我來去找找pchome 亂寄垃圾信的新聞來po看看... :P

about MS Windows Embedde

MS要全面進入Embedded 市場囉(其實有很多地方都已經使用Windows了,從到處出現的"blue screen就可以知道)。

Windows Embedded 大概有幾項產品:
  • CE 6.0
  • XPE for POS
  • Embedded Server
  • XPE
核心其實只有三個:
  • CE
  • XP
  • 2003 Server
真正的Embedded其實只有CE,其他都是現有產品,只是不同的授權策略 (也就是說..同一個東西,嗯,為了特定的市場,採用不同的定價策略..)。

XPE 就是XP,MS另外寫了一個configuration tool,讓designer 自行決定安裝哪些component,以減少footprint (雖然如此,還是很大)。嗯,為了符合Embedded 的需求,另外加上EWF功能。免得到時候產品需要常常"重新安裝"。

XPE for POS其實就是XPE,大概是POS的市場佔Embedded 很大一塊,所以特地從XPE中拉出來另外定價。

Embedded Server其實就是Server 2003,只不過如過真的到retail價格來賣,大概沒人用得起。
面對越來越多用Linux的embedded server,MS不得已只好採用另外的價格。然後又怕將retail的價格打亂,所以Embedded Server的重點是在授權規定上...這個價錢只能用N顆HD喔,這個價錢不能裝上monitor, keyboard喔,這個.....

CE 6.0 的進步...嗯,除了32-32的process, memory 限制消失外,module 間的切割便得比較清楚,所以..MS要隱藏code更容易了(也就代表 designer以後要debug就更難了..)。還有? 多了一些feature..Wifi, BT..

ADS的奇怪符號

奇怪的符號

1. #<+/->數字,代表constant。 如#123, #-123,如果要表示16進制,用#0x123,#-0x123或是#&123, #-&123, 也就是說#後的&符號可以用來代表16進制符號。

2. 小逗點‘ . ’和其他的assembly一樣,一個小點‘ . ’代表compile時的“目前地址”,可以用來作運算。

3. [ ’ 代表IF ,‘ | ’ 代表ELSE, ‘ ] ’ 代表ENDIF。

4. ! ’ 代表INFO

5. RN是用來將register重新命名用, sqr RN r6 意指 :sqr就是r6

6. A,L,S字尾分別代表arithmetic,logical,string。如SETA,SETL,SETS分別代表設定arighmetic, logical, string變數。

7. ADS的Assembler的Operator都是以‘ : ’作開頭和結尾,像 :MOD:代表Mode,:AND:代表AND,:CC:代表Concatenate,其他Operator說明在3-24。

8. % ’ 代表SPACE。如data1 % 255代表在data1開始預留255個byte的空間並把資料清爲0。

9. ^ ’代表MAP

10. # ’ 代表FIELD

11. = ’代表DCB 。 c_string DCB C_string,0

12. & ’代表DCD

13. * ’代表EQU

14. a1-a4 (argument) = r0-r3

15. v1-v8 (variable) = r4-r11

16. sb (static base) = r9

17. sl (stack limit) = r10

18. fp (frame pointer) = r11

19. ip (inter-procedure-call scratch register) = r12