/*串列埠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.檢視串列埠...