Linux串口驱动(2) - 线路规程
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) - 线路规程相关推荐
- Linux串口驱动(3) - open详解
1. 用户空间open的操作实现 串口设备是被注册为字符设备的,在注册过程中填充了struct file_operations tty_fops结构体,该结构体中的成员open.read.write等 ...
- linux串口驱动分析
linux串口驱动分析 硬件资源及描写叙述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)port,每一个port都能够在中断模式或 DMA 模式下操作 ...
- GPS NMEA 0183 4.10协议/GPS Linux串口驱动
NMEA 0183是美国国家海洋电子协会(National Marine Electronics Association)为海用电子设备制定的标准格式.现在已经成为GPS导航设备统一的RTCM(R ...
- linux 串口驱动 理解,linux 串口驱动 理解
linux 串口 驱动 理解 一.核心数据结构 串口驱动有3个核心数据结构,它们都定义在 1.uart_driver uart_driver包含了串口设备名.串口驱动名.主次设备号.串口控制台(可选) ...
- 浅浅的 linux 串口驱动应用
参考: Linux串口编程 Linux串口应用编程 主要流程 : 1.open打开串口设备,获取串口设备文件描述符(Linux一切都是文件~) 2.设置波特率.数据位.停止位.校验位等- 3.read ...
- Linux串口驱动阅读笔记
sccv串口驱动学习–8250.c 本文主要记录学习CGEL3(基于Linux version 2.6.21.7) 中关于8250串口驱动代码的心得.代码位于Z:\CGEL3\archto\mips\ ...
- linux串口驱动分析【转】
转自:http://blog.csdn.net/hanmengaidudu/article/details/11946591 硬件资源及描述 s3c2440A 通用异步接收器和发送器(UART)提供了 ...
- Linu系统编程---10(Linux的终端,线路规程,网络终端,进程组)
终端 输入输出设备的总称 在 UNIX 系统中,用户通过终端登录系统后得到一个 Shell 进程,这个终端成为 Shell 进程的控制终端(Controlling Terminal), 进程中,控制终 ...
- linux串口发送数据程序,linux串口驱动分析——发送数据
一.应用程序中write函数到底层驱动历程 和前文提到的一样,首先先注册串口,使用uart_register_driver函数,依次分别为tty_register_driver,cdev_init函数 ...
最新文章
- 不相交集类以及应用迷宫生成
- 关于微分方程的初值条件和边界条件(狄里克雷(Dirichlet)条件、诺依曼(Neumann)条件、洛平(Robin)条件)
- Smoke Test与Ad hoc Test
- u大侠pe系统桌面计算机,替换WinPE桌面背景的详细教程
- Azure 部署 Asp.NET Core Web App
- micropython esp32驱动舵机_PCA9685舵机控制板与MicroPython-ESP32-1Z实验室
- Alibaba Druid 源码阅读(一) 数据库连接池初步
- Gartner:2017年全球公有云服务市场增长18%
- flink基本程序架构
- 关于WPF绘图中的path.data在后台重新赋值的语法
- 【sciter】:鼠标移动到字体图标时不变色
- C++ map, 运用map统计单词出现的次数
- 独立游戏大电影观后感
- 已知两点坐标求水平距离_已知两点坐标,两点间距离是多少 ,求那个公式
- 网络系统设计综合布线方案
- C语言实现24点游戏算法
- 邮递员算法问题之c++实现
- 阿里云国际版服务器电子商务直播解决方案
- 基于PIE-Engine实现交互式植被覆盖度估算及分级统计
- 美丽的余霞风景mac高清动态壁纸