UART Q&A
Q1:如何关掉串口打印?
有如下两种方法:
-
在串口(在telnet敲是没用的)敲11111,正常敲到第5个1时就会提示disable uart,再敲11111可以恢复回来。
-
在串口(在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个字节*/