老查的ARM学习笔记:chapter-3(串口驱动程序分析 )

本文详细介绍了Linux内核中串口驱动的初始化、设备打开、数据发送和接收的流程。从tty子系统架构开始,讲解了串口驱动初始化涉及的函数调用关系和数据结构,如uart_driver、uart_port、uart_ops和uart_state。接着分析了串口设备的打开过程,涉及uart_open和uart_startup函数。然后阐述了数据发送,包括write系统调用如何找到驱动的start_tx函数,以及串口发送中断处理程序的工作原理。最后讨论了数据接收,讲解了tty_read和串口接收数据的处理。整个分析旨在理解串口驱动的内部工作机制。
摘要由CSDN通过智能技术生成

串口驱动分析-初始化

tty子系统架构概念简述

在Linux系统中,终端是一类字符型设备,它包括多种类型,通常使用tty来简称各种类型的终端设备。
1 串口终端(/dev/ttyS*)
串口终端是使用计算机串口连接的终端设备。Linux把每个串行端口都看作是一个字符设备。这些串行端口所对应的设备名称是/dev/ttySAC0; /dev/ttySAC1……

2 控制台终端(/dev/console)
在Linux系统中,计算机的输出设备通常被称为控制台终端(Console),这里特指printk信息输出到的设备。/dev/console是一个虚拟的设备,它需要映射到真正的tty上,比如通过内核启动参数” console=ttySAC0”就把console映射到了串口0。

3 虚拟终端(/dev/tty*)
当用户登录时,使用的是虚拟终端。使用Ctcl+Alt+[F1—F6]组合键时,我们就可以切换到tty1、tty2、tty3等上面去。tty1–tty6等称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名.

Linux tty子系统包含:tty核心,tty线路规程和tty驱动。tty核心是对整个tty设备的抽象,对用户提供统一的接口,tty线路规程是对传输数据的格式化,tty驱动则是面向tty设备的硬件驱动。

这里写图片描述

串口驱动分析之初始化

分析串口驱动程序要先记住两个文件sumsung.c和s3c6400,这两个文件很重要,路径是在…/drivers/tty/serial 下。

首先,当用户使用write函数通过串口发送数据的时候,write通过系统调用会找到file_operation中相应的指针,tty_fops这个结构就是对应的file_operations,其中tty_write来进行响应系统调用。

这里写图片描述

接下来进入到tty_write函数中,在tty_write函数中找到了线路规程ops,我们这里需要找到线路规程,tty_ldisc_N_TTY结构就是我们需要找的一个结构,在这个结构中,可以看到n_tty_write,这个就是tty_write需要调用的函数。

这里写图片描述

接下来我们再进入到n_tty_write函数中看一下,可以看到n_tty_write会调用ops,ops实际上是一个tty_operations,这里我们需要知道由tty_operations定义的一个结构uart_ops,这个结构就是我们想要的ops,其中又有uart_write这个函数。

这里写图片描述

这里写图片描述

至此,在tty层面上就已经把write的调用关系给列出来了,简单的说,就是用户在执行write系统调用的时候,首先是找到tty_write,然后再找到n_tty_write,最后找到了uart_write函数。接下来我们就要看看在驱动中怎么进行系统调用并主要学习一些重要的数据结构。

在uart_write函数中首先会使用到uart_state数据结构,还有一个是uart_port,我们可以看出uart_port是从state中获取到的。

这里写图片描述

在port中,我们还可以得到一个数据结构uart_ops,在这个数据结构中,有很多函数指针,利用这些函数指针可以操作硬件。

这里写图片描述

除了这三个数据结构外,还有一个重要的数据结构uart_driver,我们可以回去看看uart_write这个函数,第一行tty->driver_data,说明了state是根据driver_data中获得的,那么driver_data又是从哪里获得的呢,我们可以打开uart_open函数一探究竟,这个函数中又得到这样的信息,driver_data是从state获得的,而state是通过uart_get这个函数通过driver获得的。这样我们就把uart_driver,uart_state ,uart_port ,uart_ops这四个比较重要的数据结构关系给大致理清楚了。

这里写图片描述

下面列出了几个重要的数据结构,接下来我们就深入来理解一下这些结构,并开始分析初始化。

• UART驱动程序结构:struct uart_

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值