您的位置:首页 > 其它

V210 UART TX 流程

2016-01-09 17:03 197 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: