串口驱动分析-初始化
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_