2016-08-02 69 views
2

我目前使用16550兼容的UART,我希望能夠更改FIFO中斷觸發級別(我在高UART負載下丟棄字節,我想減少門檻 - 這是一個動力不足的嵌入式系統)。當然,我可以在8250_port.c駕駛員改變它,如果我想:從Linux用戶空間設置16550A UART硬件FIFO中斷級別

[PORT_NS16550A] = { 
    .name  = "NS16550A", 
    .fifo_size = 16, 
    .tx_loadsz = 16, 
    .fcr  = UART_FCR_ENABLE_FIFO | UART_FCR_R_TRIG_10, 
    .flags  = UART_CAP_FIFO | UART_NATSEMI, 
}, 

但它會更方便將其從用戶空間的改變而無需重新編譯內核。

我希望的following documentation已過時:

截至2000年年末,有沒有辦法在Linux用戶可以設置這些 直接(setserial的不能做到這一點)。雖然許多PC只有1650字節的緩衝區,但更好的UARTS具有更大的緩衝區。

如果這樣做(例如一些新十歲上下的ioctl)的手段,那麼seterial (8)stty (1)還沒有暴露的接口。

+0

哦,並且isaset -y -f 0x3fA 0x07(它直接掃描/ dev/ttyS0的FCR寄存器)不計數! – Damien

+0

如果'isaset'不計數,爲什麼其他解決方案會計數? –

+0

因爲只要端口重新打開,更改就會丟失。此外,它必須由特權用戶完成 - 並且從用戶空間中撥出隨機IO端口通常不是安全選項! – Damien

回答

0

我認爲這個問題的一般解決方案是使用setserial來使uart更改模式。例如,使用Pericom PI7C9X7958,您可以使用多種操作模式,例如「550」和950模式。這些對應於16550或16950標準uart類型。每種模式都有一個與其相關的特定fifo大小和一些其他功能。

所以,如果您的設備支持的話,你可以嘗試

的setserial -v的/ dev/UART就是ttyS1 16950

,然後驗證

的setserial -g的/ dev /就是ttyS1 的/ dev/ttyS1,UART:16950/954,端口:0xc800,IRQ:16

+0

我不想改變UART類型;我正在嘗試更改FIFO閾值級別,即原始帖子中的「UART_FCR_R_TRIG_10」標誌。 – Damien