V210 UART TX 流程

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值