SerCx2 I/O 交易概觀
SerCx2 會藉由向序列控制器驅動程式發出一或多個 I/O 交易,以處理用戶端的讀取或寫入要求。 此驅動程式會將每個交易視為獨立的 I/O 作業,以在序列控制器與要求中的資料緩衝區之間傳輸資料。
晶片上的系統 (SoC) 整合式線路經常包含串列控制器 (或 UART) ,以啟用與相同印刷電路板之其他整合電路的高速序列通訊。 這些 SoC 上的處理器可以使用程式化 I/O (PIO) ,將這些序列控制器中的記憶體對應資料暫存器直接傳輸資料。 此外,這些 SoC 通常會提供進階的 DMA 硬體,以在序列控制器與記憶體之間移動資料。
PIO 可能足以進行簡短資料傳輸,但使用 PIO 進行高資料速率的傳輸會造成處理器負擔太大。 需要 DMA 才能從處理器卸載這類傳輸。
I/O 交易的類型
SerCx2 定義下列三種一般 I/O 交易類型:
- PIO
- 系統 DMA
- Custom
所有序列控制器驅動程式都必須支援使用 PIO 傳輸資料的 I/O 交易。 序列控制器驅動程式也可能支援使用系統 DMA 或自訂資料傳輸機制的 I/O 交易,視序列控制器和相關聯的硬體功能而定。 驅動程式可以支援系統 DMA 交易或自訂交易,但不能同時支援兩者。
針對序列控制器硬體所支援的每個 I/O 交易類型,序列控制器驅動程式會向 SerCx2 註冊支援套件。 此套件描述相關的硬體功能,並包含一組驅動程式實作的事件回呼函式,SerCx2 呼叫以起始和控制這種類型的 I/O 交易。
如果序列控制器可以使用系統 DMA 控制器,這可能會與其他裝置共用,序列控制器驅動程式可能會支援系統 DMA 交易。 針對這些交易,SerCx2 會設定系統 DMA 控制器,並起始 DMA 傳輸。 序列控制器驅動程式在系統 DMA 交易期間會執行相對較少的工作。
如果序列控制器有一些自訂硬體機制可傳輸資料,序列控制器驅動程式可能會支援使用此機制的自訂交易。 例如,如果序列控制器硬體具有內建匯流排主機 DMA 功能,則序列控制器驅動程式可以支援自訂交易,讓此功能可供 SerCx2 使用。
自訂交易在可支援的資料傳輸機制類型方面具有彈性。 不過,這些交易比 PIO 交易或系統 DMA 交易更難實作。 若要支援自訂交易,序列控制器驅動程式通常必須設定並初始化用來傳輸資料的硬體。 此外,如果在相關聯的自訂接收或自訂傳輸交易完成之前解除擱置的讀取或寫入要求,驅動程式必須終止交易並完成要求。
每個 I/O 交易都是相對簡單的作業。 I/O 交易會從序列控制器讀取資料或將資料寫入控制器,而且永遠不會混合讀取和寫入。 I/O 交易使用單一傳輸模式—PIO、系統 DMA 或自訂,且永遠不會混合傳輸模式。
SerCx2 可以智慧地決定要使用 PIO 或 DMA 來滿足讀取或寫入要求。 例如,SerCx2 可能會選擇將非常短的讀取或寫入要求呈現給序列控制器驅動程式作為 PIO 交易。 或者,SerCx2 可能會將較長的讀取或寫入要求呈現給序列控制器作為 DMA 交易。
將讀取或寫入要求中斷至多個交易
某些系統 DMA 控制器可能會有一些限制,要求 SerCx2 將較長的讀取或寫入要求中斷至兩或多個 I/O 交易。 例如,如果系統 DMA 控制器需要 DMA 傳輸以啟動和結束記憶體中的位元組界限,但讀取要求中的資料緩衝區會以奇數位節界限開始和結束,SerCx2 可能會使用 PIO 將第一個和最後一個位元組傳輸至緩衝區,並使用系統 DMA 來傳輸第一個和最後一個位元組之間的所有資料。 在此範例中,SerCx2 會依顯示的順序,向序列控制器驅動程式發出下列三個 I/O 交易:
- 第一個位元組的 PIO 接收交易。
- 間隔位元組的系統 DMA 接收交易。
- 最後一個位元組的 PIO 接收交易。
同樣地,如果自訂資料傳輸機制可以在記憶體中的任意位元組界限上啟動和結束自訂傳輸交易,但寫入要求中的緩衝區大小超過自訂傳輸交易的最大傳輸長度,SerCx2 會將寫入要求分割成兩個 (或更多) 自訂傳輸交易,每個交易都不會超過最大傳輸長度。
如果 SerCx2 需要將讀取或寫入要求分割成兩個或多個 I/O 交易,序列控制器驅動程式可以安全地忽略這些交易彼此和要求的關聯性。 SerCx2 會序列化交易,以確保以正確的順序接收或傳輸資料。
當序列控制器驅動程式註冊一組回呼函式以支援 system-DMA 交易或自訂交易時,驅動程式會提供參數值來描述將執行這些交易的硬體功能。 例如,針對 system-DMA 交易,參數包括對齊需求,以及系統 DMA 控制器支援的最小和最大傳輸長度。 SerCx2 會使用這些參數來決定是否要將讀取或寫入要求當做 PIO 交易或系統 DMA 交易來處理,以及是否要將要求分割成兩個以上的 I/O 交易。
不過,序列控制器可能有特殊硬體功能,無法由序列控制器驅動程式提供給 SerCx2 的參數適當描述。 因此,驅動程式可以存取硬體相依資訊,讓驅動程式做出比 SerCx2 更好的決策,以瞭解如何將讀取或寫入要求分割成一或多個 I/O 交易。 例如,這類驅動程式可以實作 EvtSerCx2SelectNextReceiveTransactionType 和 EvtSerCx2SelectNextTransmitTransactionType 事件回呼函式。 SerCx2 會呼叫這些函式,如果實作這些函式,讓驅動程式決定要用來滿足讀取或寫入要求的 I/O 交易。