第四章 多個螢幕媒體設備傳輸相片之實作
4.2 USB Device 程式說明
USB Device 程式部分,逐一說明如下:
USB 裝置端中斷服務程式(UsbDeviceIsr;如圖 4.12(b))負責接收經由 USB Host 端的 USB 主機端控制器(USB Host Controller;如圖 4.12(d))至 USB Device 端的 USB 匯流介面(USB Bus Interface;如圖 4.12(c))所產生的中 斷,並將 USB Device 觸發的中斷訊號以訊息結構方式通知 USB 裝置端設備 任務程式(UsbDeviceTask;如圖 4.12(a))。C 語言程式碼請參考圖 4.13。
USB
USB Host USB Device
USB Cable
6 } ST_MESSAGE_CONTENT;
7
8 void UsbDevIsr(void) 9 {
10 ST_MESSAGE stMessage;
11 SystemIntDisable(UsbDevice);
12 stMessage.Argument1 = ReadUsbIntStatus( );
13 MessageSend(USB_DEVICE_ID, &stMessage);
14 }
圖 4.1326USB 裝置端中斷服務程式碼
Lines 1–6. 定義訊息結構類型。訊息結構內包涵參數一(dwArgument1)至參 數四(dwArgument4),俾藉參數傳遞資訊。
Line 10. 宣告訊息結構類型變數(stMessage)以儲存 USB Device 中斷值,
俾提供給 USB 裝置端設備任務程式(UsbDeviceTask)處理。
Line 11. 系統停止 USB Device 中斷。
Lines 12 and13. 將 USB Device 中斷狀態儲存至訊息結構的參數一內,爾 後再提供給 USB 裝置端設備任務程式處理。
USB 裝置端設備任務程式(UsbDeviceTask;如圖 4.14(b))使用廻圈方式不斷 地接收來自於 UsbDeviceIsr(如圖 4.14(c))的訊息時,會依據該事件執行相 對應的動作(UsbDeviceHandler;如圖 4.14(a))。C 語言程式碼請參考圖 4.15。
UsbDeviceIsr( ) UsbDeviceHandler( )
UsbDeviceTask( ) a
b
c
Message
Function call Status polling
圖 4.1427USB 裝置端設備任務模組
1 void UsbDeviceTask(void) 2 {
3 ST_MESSAGE stMessage;
4 while(1) 5 {
6 MessageReceive(USB_DEVICE_ID, &stMessage);
7 UsbDeviceHandler(stMessage.Argument1);
8 SystemIntEnable (UsbDevice);
9 } 10 }
圖 4.1528USB 裝置端設備任務程式碼
Line 3. 宣告訊息結構類型變數(stMessage)以儲存來自於 USB 裝置端中 斷服務程式(UsbDevIsr)的訊息,俾提供給 USB 裝置端處理程式 (UsbDeviceHandler)處理。
Lines 6 and 7. 在無窮廻圈內,不斷地接收訊息。爾後再以訊息結構的參數 一(stMessage.Argument1)提供給 USB 裝置端處理程式處理。
Line 8. 系統啟動 USB Device 中斷。
USB 裝置端處理程式(UsbDeviceHandler;如圖 4.16(b))經由 USB 裝置端設備 任務程式(UsbDeviceTask;如圖 4.16(c))呼叫,進而處理資料接收或傳送。
如需系統資源(System Resource;如圖 4.16(a);例如檔案資料),則會向其 存取資料,並依據 USB Host 的需求執行接收或傳送的動作
(UsbDeviceAction;如圖 4.16(d))。C 語言程式碼請參考圖 4.17。
System Resource
UsbDeviceHandler( ) a
b
UsbDeviceAction( ) d
UsbDeviceTask( ) c
Function call
圖 4.1629USB 裝置端處理模組
1 void UsbDeviceHandler(BYTE bUsbIntStatus) 2 {
3 BYTE* pbBuff;
4 if (bUsbIntStatus & USB_DATA_IN) {
5 Read pbBuff from System Resource Buffer Action 6 UsbDeviceAction(UsbDataIn, pbBuff); }
7 if (bUsbIntStatus & USB_DATA_OUT) { 8 UsbDeviceAction(UsbDataOut, pbBuff);
9 Write pbBuff to System Resource Buffer Action } 10 }
圖 4.1730USB 裝置端處理程式碼
Line 3. 宣告記憶體空間指標(pbBuff),俾提供資料存取。
Lines 4–6. 如果 USB 中斷狀態為 USB Device 需傳送資料至 USB Host 時 (如 USB_DATA_IN),可由 USB 裝置端行動程式(UsbDeviceAction)將系統 資源提供給 USB Host。
Lines 7–9. 如果 USB 中斷狀態為 USB Host 需傳送資料至 USB Device 時 (如 USB_DATA_OUT),可由 USB 裝置端行動程式將之提供至 USB Device 的系統資源內。
USB 裝置端行動程式(UsbDeviceAction;如圖 4.18(b))係經由 USB 裝置端處 理程式(UsbDeviceHandler;如圖 4.18(a))呼叫,負責控制 USB 匯流介面(USB Bus Interface;如圖 4.18(c))作實際資料的接收或傳送。例如 USB Device 需 傳送資料至 USB Host 時,則由 USB Device Action 程式將資料寫入 USB Bus Interface 內的硬體記憶暫存區(USB FIFO),爾後再送至 USB Host 端(如圖 4.18(d))。C 語言程式碼請參考圖 4.19。
UsbDeviceHandler( )
USB Bus Interface_
c
UsbDeviceAction( ) a
b USB
Host Controller
d
USB Host USB Device
USB Cable
Function call Hardware action 圖 4.1831USB 裝置端行動模組
1 void UsbDeviceAction(BYTE UsbDataIO, BTYE* pbData) 2 {
3 switch(UsbDataIO) 4 {
5 case UsbDataIn:
6 WriteUsbFifo(pbData);
7 break;
8 case UsbDataOut:
9 ReadUsbFifo(pbData);
10 break;
11 default:
12 MP_DEBUG("-E- UsbDeviceAction Invalid Data IO");
13 break;
14 } 15 }
圖 4.1932USB 裝置端行動程式碼
Lines 5–7. 如果 USB 資料方向為 USB Device 需傳送資料至 USB Host 時 (如 UsbDataIn),可由 WriteUsbFifo 程式將資料(如 pbData)寫入硬體記 憶暫存區(USB FIFO),爾後再送到 USB Host。
Lines 8–10. 如果 USB 資料方向為 USB Host 需傳送資料至 USB Device 時 (如 UsbDataOut),可由 ReadUsbFifo 程式從硬體記憶暫存區讀取資料至 USB Device。
Lines 11–13. 如果 USB 資料方向非為上述等情形,則顯示警告訊息。