从Linux用户空间设置16550A UART硬件FIFO中断级别

时间:2016-08-02 05:07:34

标签: c linux uart

我目前正在使用兼容16550的UART,我希望能够更改FIFO中断触发电平(我在高UART负载下丢弃字节,我想降低阈值 - 这是一个动力不足的嵌入式系统)。当然,如果我愿意,我可以在8250_port.c驱动程序中更改它:

[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只有16550   使用16字节缓冲区,更好的UARTS具有更大的缓冲区。

如果有办法这样做(例如一些新的ioctl),那么seterial (8)stty (1)尚未暴露界面。

1 个答案:

答案 0 :(得分:0)

我认为这个问题的一般解决方案是使用setserial来进行uart更改模式。例如,使用pericom PI7C9X7958,您可以使用多种操作模式,例如“550”和950模式。这些对应于16550或16950标准uart类型。每种模式都有一定的与其相关的fifo大小和一些其他功能。

因此,如果您的设备支持它,您可以尝试

setserial -v / dev / ttyS1 uart 16950

然后验证

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