1. 虽然V210的uart驱动是平台总线设备驱动模型,但实际上他还是以字符设备驱动存在,那么分析他的发送流程,
首先找到他的file_operations的write函数
drivers/char/tty_io.c
tty_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
2. drivers/serial/serial_core.c
uart_write(struct tty_struct *tty, const unsigned char *buf, int count)
uart_start(struct tty_struct *tty)
__uart_start(struct tty_struct *tty)
if (!uart_circ_empty(&state->xmit) && state->xmit.buf &&!tty->stopped && !tty->hw_stopped)
port->ops->start_tx(port);
对V210来说,uart0和uart1有流控,uart2和uart3没有流控,所以,如果应用程序对uart3设置的流控,那么
tty->hw_stopped这个参数会被置1,应用层的数据传到这里就停止了。
3. drivers/serial/samsung.c
static void s3c24xx_serial_start_tx(struct uart_port *port)
这个函数执行后,会调用发送中断处理函数
static irqreturn_t s3c24xx_serial_tx_chars(int irq, void *id)
从打印的log看,发送中断函数结束后,tty_write和uart_write才会返回
下面说一下log调试方法,因为uart2做为调试串口,因此,为了避免调试串口也打印log,可以在那些函数中,用
下面几个办法来区分
1. 对于tty_write函数来说,我们可以通过inode获得设备文件的子设备号来区分
int num = MINOR(inode->i_rdev);
2. 对于uart_write来说,我们可以通过uart_port数据结构的中断号来区分
if(port->irq != IRQ_S5P_UART_RX2)
为什么这么写,从arch/arm/plat-s5p/dev_uart.c中可以看到4个串口的硬件资源结构体定义
另外,从drivers/serial/samsung.c里的s3c24xx_serial_init_port函数里,可以看到下面几句
res = platform_get_resource(platdev, IORESOURCE_MEM, 0);
port->mapbase = res->start;
port->membase = S3C_VA_UART + res->start - (S3C_PA_UART & 0xfff00000);
ret = platform_get_irq(platdev, 0);
port->irq = ret;
ourport->rx_irq = ret;
ourport->tx_irq = ret + 1;
这几句就是在获取uart硬件资源的内存资源和中断资源,可以看到,platform_get_irq得到第一个中断号资源,即
接收中断,然后port->irq = ret, 即uart_port这个结构体的irq变量==IRQ_S5P_UART_RX2
然后s3c24xx_uart_port的rx_irq == IRQ_S5P_UART_RX2, tx_irq == IRQ_S5P_UART_TX2,因此可以通过判断
中断号来区分是哪个串口
3. 另外通过s3c24xx_uart_port结构体的channelnum也可以区分是哪个串口
在uart平台总线设备驱动的probe函数(s3c24xx_serial_probe)可以看到以下赋值
ourport->channelnum= dev->id
然后,从uart平台总线设备里可以看到
arch/arm/plat-samsung/dev-uart.c
因此可以知道channelnum实际就是0-3,分别对应了4个uart