tty驱动程序框架

  

一、TTY概念解析

  在Linux系统中,终端是一类字符型设备,它包括多种类型,通常使用tty来简称各种类型的终端设备。

1.1串口终端(/dev/ttyS*)
  串口终端是使用计算机串口连接的终端设备。Linux把每个串行端口都看作是一个字符设备。这些串行端口所对应的设备名称是 /dev/ttySAC0;/dev/ttySAC1…

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

1.3控制台终端(/dev/console)

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

二、TTY架构分析

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

  

下面这张图从函数调用来分析:

  

2.1内核代码分析

  找到内核代码的下面路径:

  linux-ok6410\drivers\tty\serial里面有个samsung.c文件在里面搜索串口发送函数s3c24xx_serial_start_tx并在里面添加回朔打印函数:dump_stack();

 1 static void s3c24xx_serial_start_tx(struct uart_port *port)
 2 {
 3     struct s3c24xx_uart_port *ourport = to_ourport(port);
 4     dump_stack();  //回朔
 5     static int a =1;//temp
 6     if (port->line == 3) {
 7 //        printk("485_start_tx\n");
 8
 9         if(a){
10             s3c_gpio_cfgpin(S3C64XX_GPK(5), S3C_GPIO_SFN(1));
11             a=0;
12         }
13         gpio_set_value(S3C64XX_GPK(5), 1);
14     }
15     if (!tx_enabled(port)) {
16         if (port->flags & UPF_CONS_FLOW)
17             s3c24xx_serial_rx_disable(port);
18
19         enable_irq(ourport->tx_irq);
20         tx_enabled(port) = 1;
21     }
22 }

  编译内核代码并且将镜像文件放到开发板中下载:串口可以打印出回朔函数过程,但是由于我的优先级别的问题打印不出来,因此运行命令:dmesg

  则可以看到如下代码:

 1 //dump_stack();  调用过程
 2 [<c0035ca8>] (unwind_backtrace+0x0/0xfc) from [<c049c7c0>] (dump_stack+0x18/0x1c)
 3 [<c049c7c0>] (dump_stack+0x18/0x1c) from [<c0237670>] (s3c24xx_serial_start_tx+0x14/0xb4)
 4
 5 [<c0237670>] (s3c24xx_serial_start_tx+0x14/0xb4) from [<c023374c>] (uart_start+0x64/0x68)
 6 [<c023374c>] (uart_start+0x64/0x68) from [<c0234cb4>] (uart_write+0xc0/0xe4)
 7 [<c0234cb4>] (uart_write+0xc0/0xe4) from [<c021dd84>] (do_output_char+0x16c/0x1d8)
 8 [<c021dd84>] (do_output_char+0x16c/0x1d8) from [<c021de28>] (process_output+0x38/0x54)
 9 [<c021de28>] (process_output+0x38/0x54) from [<c021e978>] (n_tty_write+0x204/0x444)
10 [<c021e978>] (n_tty_write+0x204/0x444) from [<c021b808>] (tty_write+0x14c/0x244)
11 [<c021b808>] (tty_write+0x14c/0x244) from [<c021b958>] (redirected_tty_write+0x58/0x68)
12 [<c021b958>] (redirected_tty_write+0x58/0x68) from [<c00e5ca4>] (vfs_write+0xbc/0x150)
13
14 //系统调用接口过程
15 [<c00e5ca4>] (vfs_write+0xbc/0x150) from [<c00e5e14>] (sys_write+0x44/0x74)
16 [<c00e5e14>] (sys_write+0x44/0x74) from [<c002fb40>] (ret_fast_syscall+0x0/0x30)

  通过分析可以知道和上面的过程吻合

时间: 2024-10-13 16:14:16

tty驱动程序框架的相关文章

18.tty驱动程序框架

tty驱动程序框架 一.TTY概念解析 在Linux系统中,终端是一类字符型设备,它包括多种类型,通常使用tty来简称各种类型的终端设备. 1.1串口终端(/dev/ttyS*) 串口终端是使用计算机串口连接的终端设备.Linux把每个串行端口都看作是一个字符设备.这些串行端口所对应的设备名称是 /dev/ttySAC0;/dev/ttySAC1… 1.2虚拟终端(/dev/tty*) 当用户登录时,使用的是虚拟终端.使用Ctcl+Alt+[F1—F6]组合键时,我们就可以切换到tty1.tty

网络设备驱动程序框架

1网络设备驱动程序框架可以分为四层 网络协议接口层----------------------------------------------------------------------------------------------------------数据的发送                                                                数据的接收                      hard_start_xmit(struct

linux字符设备驱动程序框架

#include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/fs.h> #include <linux/delay.h> #include <asm/uaccess.h> #include <asm/irq.h> #include <asm/io.h> #include <asm/a

linux字符设备驱动程序框架(老方法)

#include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/fs.h> #include <linux/delay.h> #include <asm/uaccess.h> #include <asm/irq.h> #include <asm/io.h> #include <asm/a

tiny4412 串口驱动分析五 --- LDD3上TTY驱动程序源码

关于tty这部分请参考: <Linux设备驱动开发详解 第二版>第14章 Linux终端设备驱动 <精通Linux设备驱动程序开发>第6章 串行设备驱动程序 <Linux设备驱动程序 第三版>第18章 TTY驱动程序 下面是一些串口相关的文档: http://pan.baidu.com/s/1mg20Umc Makefile: # Comment/uncomment the following line to disable/enable debugging #DEBU

《Linux Device Drivers》第十八章 TTY驱动程序——note

简介 tty设备的名称是从过去的电传打字机缩写而来,最初是指连接到Unix系统上的物理或虚拟终端 Linux tty驱动程序的核心紧挨在标准字符设备驱动层之下,并提供了一系列的功能,作为接口被终端类型设备使用 有三种类型的tty驱动程序:控制台.串口和pty /proc/tty/drivers 当前注册并存在于内核的tty设备在/sys/class/tty下都有自己的子目录 小型TTY驱动程序 <linux/tty_driver.h> struct tty_driver tiny_tty_dr

10. LCD驱动程序 ——框架分析

引言: 由LCD的硬件原理及操作(可参看韦哥博客:第017课 LCD原理详解及裸机程序分析) 我们知道只要LCD控制器的相关寄存器正确配置好,就可以在LCD面板上显示framebuffer中的内容. 若应用程序需要在LCD屏幕上显示文字或图像时,只需要把相应的显示内容以正确的格式写到Framebuffer中即可. (Framebuffer,中文名字是帧缓冲,这个帧也就是一副图像所需要的数据.因此,帧缓冲其实就是LCD设备的驱动程序) 一.LCD驱动程序框架 根据上述思路,Linux LCD 驱动

微软开源Windows驱动程序框架

WDF 团队的代表 J M Rossy 在博客里是这样讲述开源 WDF 的主要目标. 昨天我们在 WinHEC 很激动的对外宣布将 Windows Driver Frameworks (WDF) 的源代码最大化的开放在 GitHub 上.相关的报告文件可以在这里看到:github.com/Microsoft/Windows-Driver-Frameworks WDF 开源的主要目标 开源 WDF 的最主要的目标就是为了更加直接的开发高质量的驱动器.该框架提取了底层操作系统的核心部分,当需要的时候

linux驱动程序框架基础

============================      指引     ============================= 第一节是最基础的驱动程序: 第二节是/dev应用层接口的使用: 第三节是/sys应用层接口的使用: 第四节是对硬件的操作: 第五节是旧版platform_driver的简易说明: 第六节是设备树与新版platform的简易说明: ===========================   简易驱动程序   =========================