第四章 多個螢幕媒體設備傳輸相片之實作
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 主機端驅動任 務程式處理。