Linux串列埠驅動分析read

2021-06-28 06:05:55 字數 2301 閱讀 7865

/*串列埠read函式分析

* 當應用程式呼叫read系統呼叫時,會呼叫tty_fops中的tty_read

* 接下來分析tty_read函式

** 其中最重要的就是ld->ops->read(tty,file,buf,count);

* 也就是呼叫線路規程中read函式

*/static ssize_t tty_read(struct file *file, char __user *buf, size_t count,

loff_t *ppos)

/* 線路規程的ops是: tty_ldisc_n_tty

* read = = n_tty_read,

* buf代表的是使用者空間傳下來的buf, 將來需要我們把資料寫到buf中去

*/static ssize_t n_tty_read(struct tty_struct *tty, struct file *file,unsigned char __user *buf, size_t nr)

/*** 其實從copy_from_read_buf中可以很明顯的看見*/

static int copy_from_read_buf(struct tty_struct *tty,unsigned char __user **b,size_t *nr)

spin_unlock_irqrestore(&tty->read_lock, flags);

*b += n;

*nr -= n;

} return retval;

}/*接下來分析tty->read_buf中的資料是從那裡來的?

* 首先: 資料當然是從硬體裡read出來的。

* 那麼當我們的串列埠有資料的話,當然就呼叫我們以前註冊的rx中斷函式了。

*/static irqreturn_t s3c24xx_serial_rx_chars(int irq, void *dev_id)

} else

continue;

}} /* insert the character into the buffer */

flag = tty_normal;

port->icount.rx++;

if (unlikely(uerstat & s3c2410_uerstat_any))

if (uerstat & s3c2410_uerstat_frame)

port->icount.frame++;

if (uerstat & s3c2410_uerstat_overrun)

port->icount.overrun++;

uerstat &= port->read_status_mask;

if (uerstat & s3c2410_uerstat_break)

flag = tty_break;

else if (uerstat & s3c2410_uerstat_parity)

flag = tty_parity;

else if (uerstat & (s3c2410_uerstat_frame |

s3c2410_uerstat_overrun))

flag = tty_frame;

} if (uart_handle_sysrq_char(port, ch))

goto ignore_char;

/*插入ch也就是資料到tty->tty_bufhead中去。 當whiel大迴圈完後, 整個64位元組資料都存放到tty->tty_bufhead中去*/

uart_insert_char(port, uerstat, s3c2410_uerstat_overrun,

ch, flag);

}/*這是才將整個資料送tty->read_buf中去*/

tty_flip_buffer_push(tty);

}/* 將串列埠產生的資料送進tty->buf.tail中去。 */

static inline int tty_insert_flip_char(struct tty_struct *tty,unsigned char ch, char flag)

return tty_insert_flip_string_flags(tty, &ch, &flag, 1);

}static void flush_to_ldisc(struct work_struct *work)

static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,char *fp, int count)

}

串列埠驅動流程分析

tty驅動程式架構 tty概念解析 tty架構分析 1.tty概念解析 在linux系統中,終端是一類字元型裝置,它包括多種型別,通常使用tty來簡稱各種型別的終端裝置。1.1串列埠終端 dev ttys 串列埠終端是使用計算機串列埠連線的終端裝置。linux把每個串列埠都看作是乙個字元裝置。這些序...

RT Thread串列埠驅動分析 一

筆記 2016年12月9日10 19 00 串列埠配置在drivers rt hw uart.c rt hw uart init rt hw serial register 這裡可以設定串列埠的工作模式,中斷接收還有dma傳送.具體設定在rt serial init 函式裡 分析下串列埠初始化 是怎...

linux下串列埠(serial)和串列埠驅動

pc上的串列埠一般是ttys,板子上linux的串列埠一般叫做ttysac,是usb口轉串列埠的是ttyusb 外插串列埠卡的話預設是dev下的ttys 一般ttys0對應com1,ttys1對應com2 1.檢視串列埠的驅動資訊 cat proc tty driver serial 2.檢視串列埠...