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)
經過分析能夠知道和上面的過程吻合