linux-串口驱动
一、概述
* 串口是字符设备驱动
二、串口驱动文件分析
1. 硬件相关: drivers/tty/serial/imx.c
2. 串口核心层: drivers/tty/serial/serial_core.c
3. TTY层: drivers/tty/tty_io.c
4. n_tty.c:链路规层
三、函数分析
/*************************************************/
1. of_alias_get_id(np, "serial");//根据设备树里串口别名获得串口别名的序号,再tty_line_name设置后面的数字(也设置名字)
/***********imx.c***************************/
1.static irqreturn_t imx_rxint(int irq, void *dev_id)//串口接收中断
2.tty_insert_flip_char()//将串口接收到的数据放入行规层处理
3.
rxirq = platform_get_irq(pdev, 0);//从设备树里获得第0个中断号 txirq = platform_get_irq(pdev, 1);//从设备树里获得第1个中断号 rtsirq = platform_get_irq(pdev, 2);//从设备树里获得第2中断号
四、代码的调用过程
1. imx.c platfor_driver结构体里有serial_imx_probe函数:调用serial_imx_probe_dt得到设备树信息;最后构造出一个uart_port(每个uart都对应一个port)。
2. 应用程序open的调用过程 :tty_io.c中调用tty_open函数,设置tty->ops = driver->ops,安装tty,.....最后调用串口的start_up
3.read调用过程:
3.1过程概要
app_read会行规层buf,无数据就spleep。
uart硬件接收到数据会触发中断给uart_ISR, ISP读取数据,存入buffer,再通知行规层。
行规层接收数据处理完毕后,放入自己的buffer,唤醒应用程序读取数据
3.2调用
tty_read--->ld->ops->read(tty, file, buf, count);
4.write过程
4.1过程概要
user_write会调用tty_write(),
tty_write()--->
do_tty_write--->
n_tty_write--->
__uart_start--->
imx_start_tx
tips:
搜索"N_TTY",可查看哪些设备有使用到行规层。
浙公网安备 33010602011771号