1. 注册tty的ldisc

ldisc全称 line discipline(线路规程),因为历史原因,tty属于一类设备,而串口设备只是其中一种,所以该模块负责将用户操作桥接到不同的tty驱动。从代码上来看就是一个数组 tty_ldiscs[],比如串口驱动对于的线路规程是tty_ldiscs[0]。

//tty_io.c
/** Initialize the console device. This is called *early*, so* we can't necessarily depend on lots of kernel help here.* Just do some early initializations, and do the complex setup* later.*/
void __init console_init(void)
{initcall_t *call;/* Setup the default TTY line discipline. */tty_ldisc_begin();/** set up the console device so that later boot sequences can* inform about problems etc..*/call = __con_initcall_start;while (call < __con_initcall_end) {(*call)();call++;}
}//tty_ldisc.c
void tty_ldisc_begin(void)
{/* Setup the default TTY line discipline. */(void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);
}int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc)
{tty_ldiscs[disc] = new_ldisc;   //即tty_ldiscs[N_TTY]=tty_ldisc_N_TTYnew_ldisc->num = disc;new_ldisc->refcount = 0;return ret;
}struct tty_ldisc_ops tty_ldisc_N_TTY = {.magic           = TTY_LDISC_MAGIC,.name            = "n_tty",.open            = n_tty_open,.close           = n_tty_close,.read            = n_tty_read,.write           = n_tty_write,······
};

2. 动态初始化

在Linux驱动代码中,实行代码和数据分离的思想,将外部设备的信息(基地址、中断号等)另外封装,不放到驱动代码中,通过将封装后的信息以参数形式传递给驱动代码。与外部设备具体信息相关的初始化我们一般放在probe函数中进行。

在《Linux串口驱动(1) - serial层》中注册了一个平台驱动serial_imx_driver,串口设备会以平台设备的形式注册到平台总线,当串口设备和这个平台驱动匹配以后就会执行 serial_imx_driver.probe函数。

//imx.c
static int serial_imx_probe(struct platform_device *pdev)
{ret = serial_imx_probe_dt(sport, pdev);res = platform_get_resource(pdev, IORESOURCE_MEM, 0);base = devm_ioremap_resource(&pdev->dev, res);sport->port.dev = &pdev->dev;sport->port.mapbase = res->start;sport->port.membase = base;sport->port.type = PORT_IMX,sport->port.iotype = UPIO_MEM;sport->port.irq = platform_get_irq(pdev, 0);sport->rxirq = platform_get_irq(pdev, 0);sport->txirq = platform_get_irq(pdev, 1);sport->rtsirq = platform_get_irq(pdev, 2);sport->port.fifosize = 32;sport->port.ops = &imx_pops;     //5.关键结构体的赋值sport->port.flags = UPF_BOOT_AUTOCONF;init_timer(&sport->timer);sport->timer.function = imx_timeout;sport->timer.data     = (unsigned long)sport;sport->clk_ipg = devm_clk_get(&pdev->dev, "ipg");sport->clk_per = devm_clk_get(&pdev->dev, "per");sport->port.uartclk = clk_get_rate(sport->clk_per);sport->port.uartclk = clk_get_rate(sport->clk_per);imx_ports[sport->port.line] = sport;platform_set_drvdata(pdev, sport);return uart_add_one_port(&imx_reg, &sport->port);
}

3. 总结

总结一下《Linux串口驱动(1) - serial层》和《Linux串口驱动(2) - 线路规程》两部分做了哪些初始化。

如上图所示,前面的初始化部分,主要就是对以上的四个操作函数集进行填充、注册。

现在串口驱动的整体框架也就出来了,tty_core层对于tty_io.c等文件,line discipline层对应于tty_ldisc.c等文件,serial_driver层对应serial_core.c、imx.c等文件。

下一篇博客详细分析串口设备的打开过程,这里提前预示一下:用户打开串口设备时,会调用tty_open-->uart_open-->n_tty_open-->imx_startup,经过层层封装的调用,最终调用imx串口设备相关的硬件操作函数。

Linux串口驱动(2) - 线路规程相关推荐

  1. Linux串口驱动(3) - open详解

    1. 用户空间open的操作实现 串口设备是被注册为字符设备的,在注册过程中填充了struct file_operations tty_fops结构体,该结构体中的成员open.read.write等 ...

  2. linux串口驱动分析

    linux串口驱动分析 硬件资源及描写叙述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)port,每一个port都能够在中断模式或 DMA 模式下操作 ...

  3. GPS NMEA 0183 4.10协议/GPS Linux串口驱动

      NMEA 0183是美国国家海洋电子协会(National Marine Electronics Association)为海用电子设备制定的标准格式.现在已经成为GPS导航设备统一的RTCM(R ...

  4. linux 串口驱动 理解,linux 串口驱动 理解

    linux 串口 驱动 理解 一.核心数据结构 串口驱动有3个核心数据结构,它们都定义在 1.uart_driver uart_driver包含了串口设备名.串口驱动名.主次设备号.串口控制台(可选) ...

  5. 浅浅的 linux 串口驱动应用

    参考: Linux串口编程 Linux串口应用编程 主要流程 : 1.open打开串口设备,获取串口设备文件描述符(Linux一切都是文件~) 2.设置波特率.数据位.停止位.校验位等- 3.read ...

  6. Linux串口驱动阅读笔记

    sccv串口驱动学习–8250.c 本文主要记录学习CGEL3(基于Linux version 2.6.21.7) 中关于8250串口驱动代码的心得.代码位于Z:\CGEL3\archto\mips\ ...

  7. linux串口驱动分析【转】

    转自:http://blog.csdn.net/hanmengaidudu/article/details/11946591 硬件资源及描述 s3c2440A 通用异步接收器和发送器(UART)提供了 ...

  8. Linu系统编程---10(Linux的终端,线路规程,网络终端,进程组)

    终端 输入输出设备的总称 在 UNIX 系统中,用户通过终端登录系统后得到一个 Shell 进程,这个终端成为 Shell 进程的控制终端(Controlling Terminal), 进程中,控制终 ...

  9. linux串口发送数据程序,linux串口驱动分析——发送数据

    一.应用程序中write函数到底层驱动历程 和前文提到的一样,首先先注册串口,使用uart_register_driver函数,依次分别为tty_register_driver,cdev_init函数 ...

最新文章

  1. 不相交集类以及应用迷宫生成
  2. 关于微分方程的初值条件和边界条件(狄里克雷(Dirichlet)条件、诺依曼(Neumann)条件、洛平(Robin)条件)
  3. Smoke Test与Ad hoc Test
  4. u大侠pe系统桌面计算机,替换WinPE桌面背景的详细教程
  5. Azure 部署 Asp.NET Core Web App
  6. micropython esp32驱动舵机_PCA9685舵机控制板与MicroPython-ESP32-1Z实验室
  7. Alibaba Druid 源码阅读(一) 数据库连接池初步
  8. Gartner:2017年全球公有云服务市场增长18%
  9. flink基本程序架构
  10. 关于WPF绘图中的path.data在后台重新赋值的语法
  11. 【sciter】:鼠标移动到字体图标时不变色
  12. C++ map, 运用map统计单词出现的次数
  13. 独立游戏大电影观后感
  14. 已知两点坐标求水平距离_已知两点坐标,两点间距离是多少 ,求那个公式
  15. 网络系统设计综合布线方案
  16. C语言实现24点游戏算法
  17. 邮递员算法问题之c++实现
  18. 阿里云国际版服务器电子商务直播解决方案
  19. 基于PIE-Engine实现交互式植被覆盖度估算及分级统计
  20. 美丽的余霞风景mac高清动态壁纸

热门文章

  1. 《用户体验要素》读书笔记
  2. win10提示没有注册类,什么都打不开了
  3. python 人脸识别源码
  4. vue使用echarts实现地图预警展示
  5. java 爬取同花顺当日数据
  6. UDP socket 编程学习笔记
  7. 图像算法三 —— 贝叶斯和朴素贝叶斯
  8. win10安装postgresql提示缺少vc 2013
  9. 抓包工具(Android)
  10. android调用手机自带计算器,Android实现简易的计算器