18.tty驅動程序框架

            tty驅動程序框架linux

   

 1、TTY概念解析架構

   在Linux系統中,終端是一類字符型設備,它包括多種類型,一般使用tty來簡稱各類類型的終端設備。框架

1.1串口終端(/dev/ttyS*)
  串口終端是使用計算機串口鏈接的終端設備。Linux把每一個串行端口都看做是一個字符設備。這些串行端口所對應的設備名稱是 /dev/ttySAC0;/dev/ttySAC1…函數

1.2虛擬終端(/dev/tty*)
  當用戶登陸時,使用的是虛擬終端。使用Ctcl+Alt+[F1—F6]組合鍵時,咱們就能夠切換到tty一、tty二、tty3等上面去。tty1–tty6等稱爲虛擬終端,而tty0則是當前所使用虛擬終端的一個別名.spa

 1.3控制檯終端(/dev/console)code

  在Linux系統中,計算機的輸出設備一般被稱爲控制檯終端(Console),這裏特指printk信息輸出到的設備。/dev/console是一個虛擬的設備,它須要映射到真正的tty上,好比經過內核啓動參數」 console=ttySAC0」就把console映射到了串口0blog

 2、TTY架構分析接口

   Linux tty子系統包含:tty核心,tty線路規程和tty驅動。tty核心是對整個tty設備的抽象,對用戶提供統一的接口,tty線路規程是對傳輸數據的格式化,tty驅動則是面向tty設備的硬件驅動。開發

   

 下面這張圖從函數調用來分析:it

  

 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)

  經過分析能夠知道和上面的過程吻合

相關文章
相關標籤/搜索