• 沒有找到結果。

USB Device 程式說明

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

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

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 資料方向非為上述等情形,則顯示警告訊息。

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

相關文件