關於牛津半導體 PCIe (Tornado) 950 序列埠裝置的說明

牛津半導體 PCIe (Tornado) 950 序列埠裝置由固定的 62.5MHz 時鐘輸入驅動,該時鐘輸入源自 100MHz PCI Express 時鐘。

波特率生成器產生的波特率從該輸入頻率獲得,方法是將其除以時鐘分頻器(clock prescaler),該分頻器可設定為 1 到 63.875 之間的任意值,步長為 0.125;然後使用與原始 8250 相同的常規 16 位除數(divisor),將頻率除以 1 到 65535 之間的一個值。最後,使用一個可程式設計的過取樣率(oversampling rate),它可以取 4 到 16 之間的任意值,以進一步分頻並確定實際使用的波特率。透過這種方式,可以獲得從 15625000bps 到 0.933bps 的波特率。

預設情況下,過取樣率設定為 16,時鐘分頻器設定為 33.875,這意味著用作常規 16 位除數參考的頻率是 115313.653,這與原始 8250 使用的 115200 頻率足夠接近,以便不瞭解額外時鐘控制的軟體可以使用相同的除數來獲得所需的波特率。

過取樣率透過 TCR 暫存器程式設計,時鐘分頻器透過 CPR/CPR2 暫存器對程式設計[OX200] [OX952] [OX954] [OX958]。然而,要改變分頻器 33.875 的預設值,必須透過設定 EFR 的第 4 位來顯式啟用增強模式。在該模式下,設定 MCR 中的第 7 位會啟用分頻器,否則它將被旁路,如同使用了值 1。此外,向 CPR 寫入任何值都會清除 CPR2,以相容為沒有 CPR2 中額外分頻器第 9 位的老式傳統 PCI 牛津半導體裝置編寫的舊軟體,因此 CPR/CPR2 暫存器對必須按正確的順序程式設計。

透過使用這些引數,可以獲得從 15625000bps 到 1bps 的速率,對於標準和許多非標準速率,可以獲得精確或高精度的實際位元率。

以下是標準和一些非標準波特率(包括牛津半導體文件中引用的波特率)的數值,給出了請求速率 (r)、實際產生的速率 (a) 及其與請求速率的偏差 (d),以及由新的 get_divisor 處理器產生的過取樣率 (tcr)、時鐘分頻器 (cpr) 和除數 (div) 的值

r: 15625000, a: 15625000.00, d:  0.0000%, tcr:  4, cpr:  1.000, div:     1
r: 12500000, a: 12500000.00, d:  0.0000%, tcr:  5, cpr:  1.000, div:     1
r: 10416666, a: 10416666.67, d:  0.0000%, tcr:  6, cpr:  1.000, div:     1
r:  8928571, a:  8928571.43, d:  0.0000%, tcr:  7, cpr:  1.000, div:     1
r:  7812500, a:  7812500.00, d:  0.0000%, tcr:  8, cpr:  1.000, div:     1
r:  4000000, a:  4000000.00, d:  0.0000%, tcr:  5, cpr:  3.125, div:     1
r:  3686400, a:  3676470.59, d: -0.2694%, tcr:  8, cpr:  2.125, div:     1
r:  3500000, a:  3496503.50, d: -0.0999%, tcr: 13, cpr:  1.375, div:     1
r:  3000000, a:  2976190.48, d: -0.7937%, tcr: 14, cpr:  1.500, div:     1
r:  2500000, a:  2500000.00, d:  0.0000%, tcr: 10, cpr:  2.500, div:     1
r:  2000000, a:  2000000.00, d:  0.0000%, tcr: 10, cpr:  3.125, div:     1
r:  1843200, a:  1838235.29, d: -0.2694%, tcr: 16, cpr:  2.125, div:     1
r:  1500000, a:  1492537.31, d: -0.4975%, tcr:  5, cpr:  8.375, div:     1
r:  1152000, a:  1152073.73, d:  0.0064%, tcr: 14, cpr:  3.875, div:     1
r:   921600, a:   919117.65, d: -0.2694%, tcr: 16, cpr:  2.125, div:     2
r:   576000, a:   576036.87, d:  0.0064%, tcr: 14, cpr:  3.875, div:     2
r:   460800, a:   460829.49, d:  0.0064%, tcr:  7, cpr:  3.875, div:     5
r:   230400, a:   230414.75, d:  0.0064%, tcr: 14, cpr:  3.875, div:     5
r:   115200, a:   115207.37, d:  0.0064%, tcr: 14, cpr:  1.250, div:    31
r:    57600, a:    57603.69, d:  0.0064%, tcr:  8, cpr:  3.875, div:    35
r:    38400, a:    38402.46, d:  0.0064%, tcr: 14, cpr:  3.875, div:    30
r:    19200, a:    19201.23, d:  0.0064%, tcr:  8, cpr:  3.875, div:   105
r:     9600, a:     9600.06, d:  0.0006%, tcr:  9, cpr:  1.125, div:   643
r:     4800, a:     4799.98, d: -0.0004%, tcr:  7, cpr:  2.875, div:   647
r:     2400, a:     2400.02, d:  0.0008%, tcr:  9, cpr:  2.250, div:  1286
r:     1200, a:     1200.00, d:  0.0000%, tcr: 14, cpr:  2.875, div:  1294
r:      300, a:      300.00, d:  0.0000%, tcr: 11, cpr:  2.625, div:  7215
r:      200, a:      200.00, d:  0.0000%, tcr: 16, cpr:  1.250, div: 15625
r:      150, a:      150.00, d:  0.0000%, tcr: 13, cpr:  2.250, div: 14245
r:      134, a:      134.00, d:  0.0000%, tcr: 11, cpr:  2.625, div: 16153
r:      110, a:      110.00, d:  0.0000%, tcr: 12, cpr:  1.000, div: 47348
r:       75, a:       75.00, d:  0.0000%, tcr:  4, cpr:  5.875, div: 35461
r:       50, a:       50.00, d:  0.0000%, tcr: 16, cpr:  1.250, div: 62500
r:       25, a:       25.00, d:  0.0000%, tcr: 16, cpr:  2.500, div: 62500
r:        4, a:        4.00, d:  0.0000%, tcr: 16, cpr: 20.000, div: 48828
r:        2, a:        2.00, d:  0.0000%, tcr: 16, cpr: 40.000, div: 48828
r:        1, a:        1.00, d:  0.0000%, tcr: 16, cpr: 63.875, div: 61154

在波特率基數設定為 15625000 且受 serial8250_get_baud_rate 強制執行的無符號 16 位 UART_DIV_MAX 限制下,低於 300bps 的標準波特率無法以常規方式獲得,例如,200bps 的速率需要將波特率基數除以 78125,這超出了無符號 16 位的範圍。如果需要,仍可以透過以下方式編碼分頻器、過取樣率和時鐘除數(DLM/DLL)的值來使用歷史的 spd_cust 功能以獲得此類速率

 31 29 28             20 19   16 15                            0
+-----+-----------------+-------+-------------------------------+
|0 0 0|    CPR2:CPR     |  TCR  |            DLM:DLL            |
+-----+-----------------+-------+-------------------------------+

使用為 custom_divisor 欄位編碼的值,以及在透過 TIOCSSERIAL ioctl(2) 傳遞的 struct serial_structflags 欄位中設定的 ASYNC_SPD_CUST 標誌,例如使用 setserial(8) 工具及其 divisorspd_cust 引數,然後選擇 38400bps 的波特率。請注意,TCR 中的值 0 會將過取樣率設定為 16,而 CPR2/CPR 中小於 1 的分頻器值將被驅動程式鉗位為 1。

例如,值 0x1f4004e2 將分別把 CPR2/CPR、TCR 和 DLM/DLL 設定為 0x1f4、0x0 和 0x04e2,分別選擇分頻器值 62.500、過取樣率 16 和時鐘除數 1250。這些引數將把序列埠的波特率設定為 62500000 / 62.500 / 1250 / 16 = 50bps。

Maciej W. Rozycki <macro@orcam.me.uk>

[OX200]

“OXPCIe200 PCI Express 多埠橋接器”,牛津半導體公司,DS-0045,2008 年 11 月 10 日,“950 模式”部分,第 64-65 頁

[OX952]

“OXPCIe952 PCI Express 雙序列埠和並口橋接器”,牛津半導體公司,DS-0046,2008 年 3 月 6 日,“950 模式”部分,第 20 頁

[OX954]

“OXPCIe954 PCI Express 四序列埠橋接器”,牛津半導體公司,DS-0047,2008 年 2 月,“950 模式”部分,第 20 頁

[OX958]

“OXPCIe958 PCI Express 八序列埠橋接器”,牛津半導體公司,DS-0048,2008 年 2 月,“950 模式”部分,第 20 頁