UART Q&A

Q1:如何关掉串口打印?

有如下两种方法:

  1. 在串口(在telnet敲是没用的)敲11111,正常敲到第5个1时就会提示disable uart,再敲11111可以恢复回来。

  2. 在串口(在telnet敲是没用的)敲22222,无法恢复,需要断电重启才能恢复。

Q2:uart关串口可以改个方式吗?或者把数字改长一点。

可以,在kernel\drivers\sstar\serial\ms_uart.c 文件 ms_getchar 函数中,如下位置进行修改。

static void ms_getchar(struct uart_port p) { ... ... / while data ready, start to read data from UART FIFO / do{ flag = TTY_NORMAL; / read data from UART IP */ ch = INREG8(REG_DLL_THR_RBR(p)); p->icount.rx++;

    if (isConsole)
    {
        //when receive '11111', disable UART RX to use TV tool
        <font color=red>if(ch == '1')</font>
            rx_disable++;
        else
            rx_disable=0;

        if(rx_disable == 5)
        {
            silent_state = 1 - silent_state;

            if (silent_state)
            {
                printk("disable uart\n");
                ch = 0;
            }
           else
           {
               printk("enable uart\n");
           }
           //CLRREG16(0x1F001C24, 0x1<<11);
           rx_disable=0;
        }
        //when receive '22222', disable UART PAD to use TV tool
       <font color=red>if(ch == '2')</font>
           pad_disable++;
       else
           pad_disable=0;

       if(pad_disable == 5)
      {
         #if defined(CONFIG_ARCH_INFINITY2)
            CLRREG16(0x1F001C24, 0x1<<11);
        #else
            CLRREG16(0x1F203D4C, 0x000F);
        #endif
        pad_disable=0;
      }
   }
}
... ...

}

Q3:uart串口每次只能读取到1个字节,例如:就是PC发送10个字节数据,sigma串口read 32字节,实际每次只能读到1个字节。

目前默认档位是L0,每次只能读取一个字节。如果一次需要读写多个字节,需要调整 tty 挡位,同时需要关掉urdma模式(urdma的timeout有问题可能还是每次读一个byte)。

代码如下:

kernel\drivers\sstar\serial\ms_uart.c => ms_uart_set_termios

static void ms_uart_set_termios(struct uart_port *p, struct ktermios *pTermios_st, struct ktermios *pOld_st)

{

    ... ...

    OUTREG8(REG_IIR_FCR(p), UART_FCR_FIFO_ENABLE |UART_FCR_TRIGGER_TX_L1 | <font color=red>UART_FCR_TRIGGER_RX_L0)</font>;
    INREG8(REG_DLL_THR_RBR(p));

    ... ...

}

目前有如下4个挡位可以设置:

#define UART_FCR_TRIGGER_RX_L0 0x00  /* Trigger Read when there is 1 char*/  /*L0每次读1个字节*/

#define UART_FCR_TRIGGER_RX_L1 0x40  /* Trigger Read when 1/4 full */  /*L0每次读8个字节*/

#define UART_FCR_TRIGGER_RX_L2 0x80  /* Trigger Read when 1/2 full */  /*L0每次读16个字节*/

#define UART_FCR_TRIGGER_RX_L3 0xC0  /* Trigger Read when 2 less then full */  /*L0每次读30个字节*/