UART Q&A

Q1:如何关掉串口打印?

有如下两种方法

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

2、在串口(在telant敲是没用的)敲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
            if(ch == '1')
                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
        if(ch == '2')
            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 | UART_FCR_TRIGGER_RX_L0);
    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 ¼ full / /*L0每次读8个字节/

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

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