|
tty驅(qū)動(dòng)程序框架 一、TTY概念解析 在Linux系統(tǒng)中,終端是一類字符型設(shè)備,它包括多種類型,通常使用tty來(lái)簡(jiǎn)稱各種類型的終端設(shè)備。 1.1串口終端(/dev/ttyS*) 1.2虛擬終端(/dev/tty*) 1.3控制臺(tái)終端(/dev/console) 在Linux系統(tǒng)中,計(jì)算機(jī)的輸出設(shè)備通常被稱為控制臺(tái)終端(Console),這里特指printk信息輸出到的設(shè)備。/dev /console是一個(gè)虛擬的設(shè)備,它需要映射到真正的tty上,比如通過(guò)內(nèi)核啟動(dòng)參數(shù)” console=ttySAC0”就把console映射到了串口0 二、TTY架構(gòu)分析 Linux tty子系統(tǒng)包含:tty核心,tty線路規(guī)程和tty驅(qū)動(dòng)。tty核心是對(duì)整個(gè)tty設(shè)備的抽象,對(duì)用戶提供統(tǒng)一的接口,tty線路規(guī)程是對(duì)傳輸數(shù)據(jù)的格式化,tty驅(qū)動(dòng)則是面向tty設(shè)備的硬件驅(qū)動(dòng)。 下面這張圖從函數(shù)調(diào)用來(lái)分析: 2.1內(nèi)核代碼分析 找到內(nèi)核代碼的下面路徑: linux-ok6410\drivers\tty\serial里面有個(gè)samsung.c文件在里面搜索串口發(fā)送函數(shù)s3c24xx_serial_start_tx并在里面添加回朔打印函數(shù):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 }編譯內(nèi)核代碼并且將鏡像文件放到開(kāi)發(fā)板中下載:串口可以打印出回朔函數(shù)過(guò)程,但是由于我的優(yōu)先級(jí)別的問(wèn)題打印不出來(lái),因此運(yùn)行命令:dmesg 則可以看到如下代碼: 1 //dump_stack(); 調(diào)用過(guò)程 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 //系統(tǒng)調(diào)用接口過(guò)程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)通過(guò)分析可以知道和上面的過(guò)程吻合 |
|
|