linux-串口驱动

一、概述

* 串口是字符设备驱动

 

二、串口驱动文件分析

1. 硬件相关: drivers/tty/serial/imx.c

2. 串口核心层: drivers/tty/serial/serial_core.c

3. TTY层: drivers/tty/tty_io.c   

4. n_tty.c:链路规层

 

三、函数分析

/*************************************************/

 

1. of_alias_get_id(np, "serial");//根据设备树里串口别名获得串口别名的序号,再tty_line_name设置后面的数字(也设置名字)

/***********imx.c***************************/

1.static irqreturn_t imx_rxint(int irq, void *dev_id)//串口接收中断

2.tty_insert_flip_char()//将串口接收到的数据放入行规层处理

3.

rxirq = platform_get_irq(pdev, 0);//从设备树里获得第0个中断号
txirq = platform_get_irq(pdev, 1);//从设备树里获得第1个中断号
rtsirq = platform_get_irq(pdev, 2);//从设备树里获得第2中断号

 

 

 

四、代码的调用过程

1. imx.c platfor_driver结构体里有serial_imx_probe函数:调用serial_imx_probe_dt得到设备树信息;最后构造出一个uart_port(每个uart都对应一个port)。

2. 应用程序open的调用过程 :tty_io.c中调用tty_open函数,设置tty->ops = driver->ops,安装tty,.....最后调用串口的start_up

3.read调用过程:

  3.1过程概要

  app_read会行规层buf,无数据就spleep。

  uart硬件接收到数据会触发中断给uart_ISR, ISP读取数据,存入buffer,再通知行规层。

  行规层接收数据处理完毕后,放入自己的buffer,唤醒应用程序读取数据

  3.2调用

  tty_read--->ld->ops->read(tty, file, buf, count);

4.write过程

  4.1过程概要

 user_write会调用tty_write(),

  tty_write()--->

      do_tty_write--->

            n_tty_write--->

                  __uart_start--->

                        imx_start_tx

 

 

tips:

搜索"N_TTY",可查看哪些设备有使用到行规层。

 

posted @   Charles_hui  阅读(182)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示