2009年7月18日 星期六

WIA 流程簡介




流程說明:
Tip:refer to win DDK(xp) "Calling Order for Minidriver Functions"


1. 初始化:

STI---

IStiUSD::Initialize()
a. 用Createfile()取得Handle
b. 打開 驅動程式鍵(driver key)下的"DeviceData" key,可在此存放一些自訂的資訊。

IStiUSD::GetCapabilities()
a. 提供支援STI 的版本(xp: STI_VERSION, vista/7: STI_VERSION_3)
b. 告知是否支援wia, 支援何種 push mode(polling/ asynchronous)

IStiUSD::GetStatus()
a. 告知是否Device online
b. 有沒有Event pending 中


WIA---

IWiaMiniDrv::drvInitializeWia()
a. 保存 指向IStiDevice 的 pointer(間接呼叫IStiUSD)
b. 建立 Item Tree 中的 所有 Item ( xp: 0000\Root 和 0000\Root\Flatbed or 0000\Root\Feeder 這2個Item, vista/7: 0000\Root 和 0000\Root\Flatbed, 0000\Root\Flatbed, ..等至少2個以上的Item)


IWiaMiniDrv::drvGetCapabilities()
a. 告知支援的Event 及command

IWiaMiniDrv::drvInitItemProperties()
a. 建立Item Tree 中每一個Item 中所需的property
b. 如果Item Tree 中有2 個Item , 此function 會被呼叫 2次(呼叫次數為Item Tree 中 Item的個數) IWiaMiniDrv::drvValidateItemProperties()




2. (property validation) UI 改變掃描參數或硬體資訊

WIA---

IWiaMiniDrv::drvValidateItemProperties()

a. WIA AP 改變了 Item Tree 中 Item 裡的property所含的數值便會觸發此fucntion (如圖中 相片類型由 彩色相片->灰階圖片。)



3. 建立傳輸

STI---

IStiUSD::LockDevice()
IStiUSD::RawReadCommand()
IStiUSD::RawWriteCommand()
IStiUSD::RawReadData()
IStiUSD::RawWriteData()
IStiUSD::UnLockDevice()


WIA---

IWiaMiniDrv::drvLockWiaDevice()
IWiaMiniDrv::drvWriteItemProperties()
IWiaMiniDrv::drvAcquireItemData()
IWiaMiniDrv::drvUnLockWiaDevice()


3.1. Lock/UnLock:
依接口,效能考量而有不同。(因為STI 支援多個instance 同時呼叫一個Device所以在每次read/write時要做lock的動作)

STI---
read command-> parse command -> read/write data
write command-> read/write data

其實只要有read/ write function 就行了。
反正command 也只是一塊buffer 而已 所以只要
read: read: IStiUSD::LockDevice() ->IStiUSD::RawReadData()->IStiUSD::UnLockDevice()
write: write: IStiUSD::LockDevice() ->IStiUSD::RawWriteData()->IStiUSD::UnLockDevice()

//以下的function可以不用implement
IStiUSD::RawReadCommand()--no use
IStiUSD::RawWriteCommand()--no use

WIA---
Lock/UnLock: 和STI 的考量點一樣。


3.2 Transfer:

xp/nt:
3.2.1 WIA 對device 的read/write 由呼叫 以上的STI read/write function 完成。
3.2.2 IWiaMiniDrv::drvWriteItemProperties(): 寫入欲掃描的影像資訊到device 上
IWiaMiniDrv::drvAcquireItemData() : 透過callback function 回傳影像資料到WIA Service

3.2.3 [IWiaMiniDrv::drvWriteItemProperties() + IWiaMiniDrv::drvAcquireItemData()] :
為回傳從Device 取得的一頁影像到WIA Service. 如有4 頁影像,便連續進入4次(flatbed, simplex 一張紙只能掃出1頁,duplex 能掃出2頁)


Vista/7:
3.2.1 WIA 對device 的read/write 由呼叫 以上的STI read/write function 完成。
3.2.2 IWiaMiniDrv::drvWriteItemProperties(): 沒有作用
IWiaMiniDrv::drvAcquireItemData() : 透過IStream 回傳影像資料到WIA Service

3.2.3 [IWiaMiniDrv::drvAcquireItemData()] :
在此function 內完成一個scan job, 一次掃描只進來一次,一次完成所有頁數的掃描。

沒有留言:

張貼留言