tty驱动程序框架 一、TTY概念解析 在Linux系统中,终端是一类字符型设备,它包括多种类型,通常使用tty来简称各种类型的终端设备。 1.1串口终端(/dev/ttyS*) 1.2虚拟终端(/dev/tty*) 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) 通过分析可以知道和上面的过程吻合 |
|