• 沒有找到結果。

USB Host 程式說明

在文檔中 多個螢幕媒體設備之實作 (頁 36-48)

第四章 多個螢幕媒體設備傳輸相片之實作

4.1 USB Host 程式說明

USB Host 程式逐一說明如下:

 命令處理程式(CommandProcess;如圖 4.2(a))使用廻圈方式不斷的等待事件 發生,並依據事件值執行相關動作(UsbHostCommand;如圖 4.2(b)),例如 Multi-Panel 類別的應用命令 VENDOR_SEND_CMD(參見第 3.2.2 節) 與 VENDOR_CHG_CMD(參見第 3.2.3 節)。C 語言程式碼請參考圖 4.3。

UsbHostCommand( )_

CommandProcess( )_

a

b

Function call

圖 4.215命令處理模組

1 WORD CommandProcess (WORD wCmd) (WRITE_CMD)應用命令,將之以傳輸命令提供給 USB 主機端命令程式 (UsbHostCommand)。

Lines 11–16. 此為 Multi-Panel 類別之 VENDOR_SEND_CMD 與

VENDOR_CHG_CMD 應用命令,將之以傳輸命令提供給 USB 主機端命令程式 (UsbHostCommand)。

Lines 11–20. 如果 USB 傳輸命令非為上述等情形,則顯示警告訊息。

 USB 主機端命令程式(UsbHostCommand;如圖 4.4(b))負責將傳輸的命令轉為 USB 格式,並以事件方式通知 USB 主機端驅動任務程式

(UsbHostDriverTask;如圖 4.4(c))開始執行命令,後續再通知命令處理程 式(CommandProcess;如圖 4.4(a))該命令執行成功或失敗。C 語言程式碼請 參考圖 4.5。

UsbHostCommand( )_

CommandProcess( )_

UsbHostDriverTask( )_

a

b

c

Event Flag (E-ID:1)

Event Flag (E-ID:2)

Function call Status polling

圖 4.417 USB 主機端命令模組

1 WORD UsbHostCommand(BYTE bCmd) 2 {

3 DWORD dwEventFlag = 0;

4 WORD wRetValue = OS_STATUS_OK;

5 UsbBuilder(bCmd);

6 SetCurUsbState(COMMAND_STATE);

7 EventSet(USB_HOST_DRIVER_ID, EVENT_ACTIVE);

8 wRetValue = EventWaitWithTO(USB_HOST_COMMAND_ID,

9 &dwEventFlag, TIME_OUT_THRESS_SEC);

10 if(wRetValue == OS_STATUS_OK && dwEventFlag == EVENT_PASS) 11 return USB_NO_ERROR;

12 else

13 return USB_ERROR;

14 }

圖 4.518 USB 主機端命令程式碼

表 4.17 USB 主機端驅動任務程式事件說明(E-ID:1)

BIT Event Description

0 EVENT_PLUGIN 連接設備事件

1 EVENT_PLUGOUT 拔除設備事件

2 EVENT_ACTIVE 開始傳輸事件

3 EVENT_IOC 完成傳輸事件

4 EVENT_FINISH 整體完成事件

5 EVENT_ERROR 整體失敗事件

表 4.28 USB 主機端命令處理程式事件說明(E-ID:2)

BIT Event Description

0 EVENT_PASS 成功事件

1 EVENT_FAIL 失敗事件

Line 3. 宣告 dwEventFlag 變數以儲存事件值,俾提供後續判斷相關事件。

該變數每一位元代表之事件如表 4.2 所示。

Line 4. 宣告 wRetValue 變數以儲存事件狀態值,俾提供後續判斷事件成功 與否。

Lines 5 and 6. 呼叫 UsbCmdBuilder 程式將傳輸的命令轉為 USB 格式,並 將目前 USB 狀態設定為命令狀態(COMMAND_STATE)。

Line 7. 將開始傳輸事件(EVENT_ACTIVE;如表 4.1)提供給 USB 主機端驅動 任務程式(UsbHostDriverTask)。

Lines 8–12. 等待 USB 主機端驅動任務程式完成整體傳輸動作。如三秒內完 成並收到成功事件(EVENT_PASS;如表 4.2),則回傳 USB 正確

(USB_NO_ERROR),反之,則回傳 USB 錯誤(USB_ERROR)。

 USB 主機端驅動任務程式(UsbHostDriverTask;如圖 4.6(b))使用廻圈方式不 斷的等待事件發生。當收到從 USB 主機端中斷服務程式(UsbHostIsr;如圖 4.6(d))或 USB 主機端命令程式(UsbHostCommand;如圖 4.6(a))所發送相關 事件時,會依據該事件執行相對應的動作,如 USB 主機端硬體啟動程式 (UsbHostSendActive;如圖 4.6(c))或 UsbHostCommand。C 語言程式碼請參 考圖 4.7。

UsbHostDriverTask( ) UsbHostCommand( )

UsbHostSendActive( )_ UsbHostIsr( )_

a

1 void UsbHostDriverTask(void) 2 {

3 DWORD dwEventFlag = 0;

4 while (1) {

5 EventWait(USB_HOST_DRIVER_ID, &dwEventFlag);

6 If (dwEventFlag & EVENT_PLUGIN)

Line 3. 宣告 dwEventFlag 變數以儲存事件值,俾提供後續判斷相關事件。

Line 5. 無窮廻圈內不斷等待該事件發生並將事件值設定 dwEventFlag 變 數。

Lines 6 and 7. 如果 dwEventFlag 變數為連接設備事件(EVENT_PLUGIN;如 表 4.1),則呼叫 PlugInAction 程式處理連接設備的後續動作。

Lines 8 and 9. 如果 dwEventFlag 變數為拔除設備事件(EVENT_PLUGOUT),

則呼叫 PlugOutAction 程式處理拔除設備的後續動作。

Lines 10 and 11. 如果 dwEventFlag 變數為開始傳輸事件(EVENT_ACTIVE),

則呼叫 USB 主機端硬體啟動程式(UsbHostSendActive)開始執行硬體啟 動之動作。

Lines 12 and 13. 如果 dwEventFlag 變數為完成傳輸事件(EVENT_IOC),

則呼叫 USB 主機端硬體啟動程式(UsbHostSendActive)執行硬體完成之 動作。

Lines 14 and 15. 如果 dwEventFlag 變數為整體完成事件(EVENT_FINISH),

則提供成功事件給 USB 主機端命令程式(UsbHostCommand)。

Lines 16 and 17. 如果 dwEventFlag 變數為整體失敗事件(EVENT_ERROR),

則提供失敗事件給 USB 主機端命令程式(UsbHostCommand)。

 USB 主機端硬體啟動程式(UsbHostSendActive;如圖 4.8(b))經由

UsbHostDriverTask(如圖 4.8(a))呼叫並依據不同的傳輸狀態(亦即 dwState 可以為 Command、Data 或 Ack),控制 USB 主機端控制器(USB Host

Controller;如圖 4.8(c))傳送及接收 USB 封包資料。C 語言程式碼請參考圖 4.9。

USB Host Controller_

1 void UsbHostSendActive(BYTE bAction) 2 {

17 case ACK_STATE:

55 MP_DEBUG("-E- INVALID ACTION:0x%x", bAction);

56 EventSet(USB_HOST_DRIVER_ID, EVENT_ERROR);

57 break;

58 } 59 }

圖 4.922 USB 主機端硬體啟動程式碼

Line 3. 宣告 dwState 變數以儲存目前 USB 傳輸狀態值,俾提供後續判斷相 關狀態。

Line 4. 將目前 USB 傳輸狀態值儲存到 dwState 變數。

Line 5. 參數 bAction 提供判斷相關動作,如執行硬體啟動 (ACTION_ACTIVE)或收到硬體完成(ACTION_IOC)之動作。

Lines 8–10. 如果 USB 傳輸狀態(dwStat)為命令狀態(COMMAND_STATE),則 呼叫 SendCommand 程式設定 USB 主機端控制器(USB Host Controller) 暫存器並將命令傳輸到相連接的另一台數位相框。

Lines 11–13. 如果 USB 傳輸狀態為接收資料狀態(DATA_IN_STATE),則呼叫 ReceiveData 程式設定 USB Host Controller 暫存器並接收來自相連接 的另一台數位相框資料。

Lines 14–16. 如果 USB 傳輸狀態為傳送資料狀態(DATA_OUT_STATE),則呼 叫 SendData 程式設定 USB Host Controller 暫存器並將資料傳送到相連 接的另一台數位相框。

Lines 17–19. 如果 USB 傳輸狀態為回應狀態(ACK_STATE),則呼叫

ReceiveAck 程式設定 USB 主機端控制器之暫存器並接收來自相連接另 一台數位相框的完成傳輸流程回應通知。

Lines 20–23. 如果 USB 傳輸狀態非為上述等情形,則顯示警告訊息並提供 整體失敗事件給 USB 主機端驅動任務程式(UsbHostDriverTask)。

Lines 29–35. 如果目前 USB 狀態為命令狀態(COMMAND_STATE)且需接收資

料(DataInSize > 0),則將之設定為接收資料狀態(DATA_IN_STATE);反 之,則設定為傳送資料狀態(DATA_OUT_STATE)。爾後再提供開始傳輸事 件(EVENT_ACTIVE;如表 4.1)給 USB 主機端驅動任務程式。

Lines 36–39. 如果目前 USB 狀態為接收資料狀態,則將之設定為回覆狀態 (ACK_STATE)。爾後再提供開始傳輸事件給 USB 主機端驅動任務程式。

Lines 40–43. 如果目前 USB 狀態為傳送資料狀態,則將之設定為回覆狀態。

爾後再提供開始傳輸事件給 USB 主機端驅動任務程式。

Lines 44–46. 如果目前 USB 狀態為回應狀態,則將之以完成傳輸事件 (EVENT_FINISH)提供給 USB 主機端驅動任務程式。

Lines 47–50. 如果目前 USB 狀態非為上述等情形,則顯示警告訊息並提供 整體失敗事件給 USB 主機端驅動任務程式(UsbHostDriverTask)。

Lines 54–57. 如果 USB 動作非為上述等情形,則顯示警告訊息並提供整體 失敗事件給 USB 主機端驅動任務程式(UsbHostDriverTask)。

 USB 主機端中斷服務程式(UsbHostIsr;如圖 4.10(b))負責接收經由 USB Device 端的 USB 匯流介面(USB Bus Interface;如圖 4.10(d))至 USB Host 端的 USB 主機端控制器(USB Host Controller;如圖 4.10(c))所產生的中 斷,並將 USB Host 相關中斷以事件方式通知 USB 主機端驅動任務程式 (UsbHostDriverTask;如圖 4.10(a))。C 語言程式碼請參考圖 4.11。

UsbHostIsr( )_

1. void UsbHostIsr(void) 2. {

3. WORD wIntStatus = 0;

4. DWORD dwState = 0;

5. wIntStatus = ReadUsbIntStatus();

6. if (wIntStatus & CompletionOfTransaction) 7. EventSet(USB_HOST_DRIVER_ID, EVENT_IOC);

8. if (wIntStatus & DevicePlugIn)

9. EventSet(USB_HOST_DRIVER_ID, EVENT_PLUGIN);

10. if (wIntStatus & DevicePlugOut)

11. EventSet(USB_HOST_DRIVER_ID, EVENT_PLUGOUT);

}

圖 4.1124USB 主機端中斷程式碼

Line 3. 宣告 wIntStatus 變數以儲存 USB Host 中斷的狀態值,俾提供後續

判斷相關狀態。

Line 4. 宣告 dwState 變數以儲存目前 USB 傳輸狀態值,俾提供後續判斷相 關狀態。

Line 5. 讀取 USB Host 中斷的狀態並儲存至 wIntStatus 變數。

Lines 6 and 7. 如果 USB Host 中斷的狀態為傳輸完成狀態(CompletionOf Transaction),則將之以完成傳輸事件(EVENT_IOC)提供給 USB 主機端驅 動任務程式處理。

Lines 8 and 9. 如果 USB Host 中斷的狀態為連接設備狀態(DevicePlugIn ),則將之以連接設備事件(EVENT_PLUGIN)提供給 USB 主機端驅動任務程 式處理。

Lines 10 and 11. 如果 USB Host 中斷的狀態為拔除設備狀態(DevicePlug Out),則將之以拔除設備事件(EVENT_PLUGOUT)提供給 USB 主機端驅動任 務程式處理。

在文檔中 多個螢幕媒體設備之實作 (頁 36-48)

相關文件