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",可查看哪些设备有使用到行规层。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通