8.25.2006

8.24.2006

CE BSP Installation & Deploy Image to DOM

Windows CE的BSP安裝方式... BSP的提供廠商會提供一個msi 安裝檔。
執行就可以安裝。
以VIA CLE266為例,公司網站有提供下載viacle-cn bsp 下載。
安裝後,會在Third Party下,出現BSP分支。有VIA CN400/CLE266 CEPC:x86

然後在New Platform 時,BSP部份就會有VIA這一項可以選。

Application 部份選Digital Media Receiver (Window CE devices)

新platform會出現VIA CN400/CLE266 CEPC:x86這一個category。
展開後可以看到包含Device Drier這一個分之而已,分為Audio, Display, Networking三項。

由於network card不是使用CLE266內建的 Via Rhine NIC,而是外加RTL8139。所以在右邊 Catalog - Device Drivers - Networking - Local Area Networking (LAN) device 中,選Realtek RTL8139 加入到OS中。


之後 BuildOS - Sysgen 開始 generate system base image(要一段時間)。
完成後,會放在 WINCE500\PBWorkspace\ViaTrial1\RelDir\VIACN_x86_Release

這個動作完成後,會在release folder下產生一個nk.bin 的檔案。
這個檔案包含了kernel和一些resource。

要在PC的平台下開機,必須要作開機磁片。要利用CE Platformbuild的tool來作

這個build boot image的tool所在位置比較奇怪,在 Windows CE tools install folder中(Program Files那一個,不是WINCE500那一個)。

這個動作是要做出一個用來boot nk.bin的environment,並不會自動將剛剛build好的nk.bin copy進去。
  1. 準備一個floppy disk (如果沒有,就用vfdwin 這個floppy emulator,類似DaemonTools)。
  2. 執行websetup,會出現dialog,要求安裝目錄,安裝websetup(因為是win2000,所以他default是Win2000)。
  3. 完成後,準備1.44的floppy (真的或是vfd)。
  4. 執行 CEPB\Utility的cepcboot.144 這個image (double click on this file, though its extension is not 'EXE')
  5. 出現dialog,選floppy driver。progress bar 到100% (之後又回到0, vfd的話很快)。
  6. OK! floppy內就是 boot environment。
將DOM format成fat,DOS bootable (也就是會包含command.com)。
將剛剛做好的boot floppy內的data都copy到DOM。
到release folder,把nk.bin 複製過來。

開機,出現start DOS。接著出現resolution選單,然後screen switch,顯示Jumping to 0x0022ae8..
black screen。

所以算是 Fail.. :P

查到..應該要選local boot,那些jump xxxx的message是eboot和sboot的message。
還有即使選eboot,出現jump to 0x00XXXXX 的message,等3 min後 還是會boot起來。

在boot floppy image中有readme.txt。有一些說明:

製作boot disk的方法,除了用剛剛cepcboot.144 這個image外,也可以用format dos bootable的方式。
如果可以自己做出dos boot disk,建議使用這個方法。
CE work folder中包含一個dos boot environment : public\common\oak\csp\i486\dos\bootdisk
  1. create一個dos bootable disk
  2. 將dos 的himen.sys copy到disk中
  3. 將 ce500\public\common\oak\csp\i486\dos\bootdisk的所有內容都copy到disk中
  4. 如果需要作ether boot,就copy eboot.bin。需要由serial boot就copy sboot.bin
  5. copy 自己build好的nk.bin到disk中
  6. 修改autoexec.bat。(也可以用default的,但是啟動時要選)。
開機,出現選單,選local boot。下方出現progress bar。完成,等1 min。CE才出來 (非常的慢)。

開機出現選單是因為Autoexec.bat 和 config.sys內有選單設定。



很奇怪的是,很多application (*.exe)都是在Windows目錄下,但是大多是隱藏起來。要開啟command prompt,用dir/a 命令才會全部顯示出來。

網路的部份,開機後是顯示xx,要等約1 min才會正常。



接著

8.18.2006

XPE : Use Prebuild Environment to get the Taret's device list

使用XPE的prebuild environment (也就是XPE CD第一片)來開機,會進入只有console的XPE。
利用這個console,執行TAP。產生taret board's device list。

所以在開啟電源前,先把要裝device都加上去:
  • Wifi USB Dangle
  • Touch Panel
還要準備一個HD (DOM),是writeable的,讓CD BOOT的Prebuild Environment能將TAP的probe結果寫到HD (DOM)中。不然就要用網路硬碟的方法,寫入到其他host share出來的HD。

Prebuild Environment沒有USB Storage的driver,所以pen driver不能用。
Prebuild Environment會自動啟動網路(不知道支援的網卡有哪些,但是已經確認rtl8139可以用)。

TAP.EXE在CD的 XPE 目錄下。因為default會將probe的result存在當下目錄,所以要在HD所在目錄進行工作(由你IDE插曹位置決定,我的HD是在C:)
C:>D:\XPE\TAP.EXE
TAP的probe結果存成 "devices.pmq"

設法把HD(DOM)的devices.pmq拿出來..rename成C3VCM6.pmq
使用網路HD
  1. 當然要先再網路上,找一台pc(10.3.5.30),把一個folder share出來(sharefolder)。
  2. target board要接上網路。網路最好有dhcp server,比較簡單。
  3. 啟動 XPE prebuild environment
  4. 確認網路ok
  5. 連線網路磁碟機到driver X:net use x: \\10.3.5.30\sharefolder password /user:10.3.5.30\username
  6. 執行TAP,輸出到x:\C3VCM6.pmq : tap /o x:\C3VCM6.pmq
OK.

8.16.2006

WDM - Driver's Life

IRP (I/O Request Packet) : 內含command, data的一組封包。系統和Driver溝通時使用。

  1. 系統偵測到device,將對應的driver load到memory,呼叫driver的DeviceEntry()。
  2. 系統的PnP Manager 呼叫driver的AddDevice( )。
  3. PnP將IRP 傳送給driver,讓driver處理。
  4. Application 開啟裝置,導致系統將一些IRP傳送給driver。
  5. Application 讀取裝置,系統將對應的IRP傳送給driver,driver把data備妥,放到message中傳回給系統。
  6. device有INT 發生時,driver的中斷服務常式開始工作。
  7. 系統偵測到device移除,PnP Manager 送一些IRP給driver,然後呼叫driver的DriverUnload( )。完成後,系統將driver從memory中移出。

以上看來Driver要實做三類function:
  1. Basic
    DriverEntry( ), AddDevice( ), DriverUnload( )
  2. I/O control
    StartIo( ), AdapterControl( ), OnInterrupt( ),
  3. Dispatch
    DispatchPnP, DispatchPower, DispatchWmi
系統偵測到裝置時,如何找倒對應的driver呢?
  • PnP裝置:
    PnP裝置必須要包含自己的id,大概是像PCI device中的Vender-function-type code,所以當PCI controller可以讀取pci card的這個id。 對照 Registry 和 INF 檔,找到對應的driver
    • 有PnP功能的bus有: PCI,USB,PCMCIA。
  • 非PnP裝置:
    非PnP裝置沒有id,所以需要user作加入device的動作( Add New Hardware Wizard)。 之後,系統由registry和INF檔找到driver。
    • 沒有PnP功能的bus有:ISA。
WDM和以往NT, 95的VxD不一樣,WDM完全被動的由系統呼叫,VxD則要自己載入,自己偵測硬體。


WDM 至少包含兩種driver 程式:function driver 和 bus driver。
  • Function Driver : 處理device的function
  • Bus Driver : 處理device hardware - bus相關的動作
有些WDM還會有 Filter Driver: Upper-level Filter / Lower-Level Filter
這些driver的相依關係可以由IRP的傳遞過程來看,系統利用IRP和driver溝通
IRP -> UpperLevelFilter -> Function -> LowerLevel -> Bus
把一開始的第一點: "系統偵測到裝置,把對應的driver load到memory"的動作說得更詳細一點:
  1. 系統的bus drver (PCI, USB, PCMCIA)偵測到有hardware 加入,呼叫系統的IoInvalidate DeviceRelation( ),這個function 會通知PnP Manager 硬體裝置有改變。
  2. PnP Manager知道硬體裝置有改變後,發送一個IRP給bus driver,取得更新後的裝置PDO (Physical Device Object)序列。PnP可以對照序列中有哪一個PDO是新增加的。
  3. PnP Manager傳送另一個IRP給bus driver,詢問某個新增加的PDO他的device identifier是甚麼。
  4. device driver讀取該硬體的id,轉成device identifier傳給PnP Manager
    device identifier 是一個像這樣的字串: "PCI\VEN_100C&DEV_001E&SUBSYS_000001"
  5. PnP Manager將device_identifier的hardware_key(VEN_..以下)放到registry中 (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\...busname..)。

8.15.2006

Blogger 全面升級!


來試試這個Beta版有甚麼新功能。

喔,增加了 "Labels for this post"
? 就這樣 ?