• 18.tty驱动程序框架


                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-ok6410drivers tyserial里面有个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
    ");
     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)

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

  • 相关阅读:
    Kafka架构
    MapReduce执行流程解析
    ZooKeeper选举机制
    Zookeeper全局一致性
    HDFS的快照
    在CentOS 6.5上安装NodeJS
    Node v0.12.5 稳定版发布
    CentOS6.5手动升级gcc4.8.2
    centos6 yum 安装 install c++4.8 gcc4.8
    Linux CentOS6系统安装最新版本Node.js环境及相关文件配置
  • 原文地址:https://www.cnblogs.com/wmx-learn/p/5371215.html
Copyright © 2020-2023  润新知