前言:
内核向外发送串口数据的时候,发送数据比较快,数据包是连在一起的,每个包之间的时间间隔可能小于1ms,如果接收方控制不好,来不及接收。有的时候需要给特殊的包增加延时。
Kernel: v3.0.36
Device: rk3188
Platform Version: Android 4.4.2
menuconfig配置UART:
Device Drivers
—->Character devices
————–>Serial drivers
源文件:
vim kernel/drivers/tty/serial/rk_serial.c
module_init;
—>serial_rk_init
——->serial_rk_driver
————>serial_rk_probe
—————–>serial_rk_pops
——————>serial_rk_startup
//注册中断,收到数据,发送数据都会触发此中断,再处理相应数据,每次处理32字节。
retval = request_irq(up->port.irq, serial_rk_interrupt, up->port.irqflags, up->name, up);
—————————–>serial_rk_interrupt
——————————>serial_rk_handle_port
———————————>receive_chars(处理接收数据)
———————————>transmit_chars(处理发送数据)
static void transmit_chars(struct uart_rk_port *up)
{
...
do {//依次发送32字节数据(可在此处给特殊的包增加延时)
serial_out(up, UART_TX, xmit->buf[xmit->tail]);//一个一个字节发送出去
xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
up->port.icount.tx++;
if (uart_circ_empty(xmit))
break;
} while (--count > 0);
}
转载请注明出处:http://www.wolfnx.com/2019/01/23/KernelAddSerialDelay
作者 : wolfnx
邮箱 : wolfnx@outlook.com
邮箱2 : lostnx@gmail.com