RK3399之8250串口驱动

news/2024/11/22 23:37:13/

前言
内核版本4.4
平台 瑞芯微RK3399 8250串口

一、驱动整体框架

二、驱动结构体对象

1. struct uart_driver       串口驱动主要结构体,记录各个层对象,(tty层,和uart层)
2. |---struct tty_driver     tty层结构体
3. |---struct uart_state    uart层结构体
4.      |---struct tty_port	
5.      |---struct uart_port 每个结构体对应硬件上每个uart

关系如下图所示
图一

三、驱动代码流程
驱动加载由以下入口

8250_core.c-----> static int __init serial8250_init(void)这部分创建uart_driver结构体对象,结合上图,该结构体维系tty层与core层关系。
8250_dw.c-----> static int dw8250_probe(struct platform_device *pdev)这部分创建platform_driver,注册设备树中的uart口,生成uart_port对象,记录于uart_state中

1.8250_core.c的serial8250_init
个人理解代码里有三套串口设备注册代码,
方式一,嵌入式常用的方式,驱动通过与dts硬件信息匹配注册uart_port
方式二,PC机常用方式,注册PNP驱动,扫描PNP设备完成注册,
(PNP理解应该是pc板卡的superIO,比如PNP0501转换芯片可实现较少的GPIO转出多个GPIO和5个串口)
方式三,内核提供的初始化uart_port硬件信息的方式,目前看一般不用到。
参考链接: 内核实现的注册uart_port方式

注册对象:
struct uart_driver serial8250_reg
serial8250_init函数中主要代码:
ret = uart_register_driver(&serial8250_reg);
该函数主要完成以下动作:
(1)申请uart_state内存空间,uart_driver->uart_state[nr]
(2)申请tty_driver内存空间,并初始化成员
(3)初始化tty_port
(4)注册tty_driver驱动

2.8250_dw.c-----> static int dw8250_probe

static struct platform_driver dw8250_platform_driver = {.driver = {.name		= "dw-apb-uart",.pm		= &dw8250_pm_ops,.of_match_table	= dw8250_of_match,.acpi_match_table = ACPI_PTR(dw8250_acpi_match),},.probe			= dw8250_probe,.remove			= dw8250_remove,
};module_platform_driver(dw8250_platform_driver);

static int dw8250_probe(struct platform_device *pdev)
这个驱动入口通过platform总线,.of_match_table = dw8250_of_match,通过名字table与设备树信息匹配。调用probe函数(.probe = dw8250_probe)
dw8250_probe函数主要完成以下动作
(1)声明临时变量struct uart_8250_port uart,初始化uart成员uart_port的参数,
(2)获取串口编号(硬件上uart0,uart1的序号0,1),赋值给临时变量uart_port中
(3)data->line = serial8250_register_8250_port(&uart);
uart = serial8250_find_match_or_unused(&up->port);
根据(2)的串口编号,从前面初始化的static struct uart_8250_port serial8250_ports[UART_NR]数组中获取相应的uart_port,再将临时变量uart_port的初始值传给获取到的uart_port
(4)ret = uart_add_one_port(&serial8250_reg, &uart->port);

四、串口读写流程

五、代码文件
driver/tty/serial/8250/8250_core.c

8250_dw.c


http://www.ppmy.cn/news/142793.html

相关文章

13472—3

快速阅读 Online GFLCJHBIIE Question EIADGHBMLK I Think KBECLFAIDG Wildlife ADBFGJEHFJ V.Moving CECEJIGFBD Women LDNGKFAHCJ Work LHBFCKGJDI How HDCFABEICG Fashion DHCAIBFGEF English EAIBHIGCFD 阅读 In times bring living Falling irreparably The …

python maximum recursion depth exceeded解决方式

用Python写了一个递归脚本,脚本如下 def fact(n):return fact_iter(n, 1)def fact_iter(num, product):if num 1:return productreturn fact_iter(num - 1, num*product) 执行:fact(1000) 报错如下: File "D:/python/spider/qq-music-s…

ORA-39087,ORA-39070,ORA-39002

ORA-39002: 操作无效 ORA-39070: 无法打开日志文件。 ORA-39087: 目录名 DUMP_DIR 无效 先检查SELECT * FROM dba_directories;里面directory和主机下面对应的位置有没有创建好 再检查当前的账户有没有权限 GRANT READ,WRITE ON DIRECTORY DUMP_DIR to xxxx; 再次执行成功。

JSR303

文章目录 一.引入二.实例需求三.环境搭建1.依赖引入2.常用注解 四.使用1.简单使用2.自定义错误信息3.添加多个字段错误信息回去4.改进5.全局异常处理 五.异常代码1.图解2.实例 六.分组校验1.引入2.groups属性3.修改实体类3.controller修改 一.引入 日常开发中,需要…

ORA-39002

oracle 11g执行expdp导出脚本时报错: ORA-39002:操作无效 ORA39070:无法打开日志文件 ORA-29283:文件操作无效 ORA-06512:在“SYS.UTL_FILE”,line 536 ORA-29283:文件操作无效 解决方式: 这是由于导出的目录不存在,需要新建directory相关目…

as3930工作流程简述

奥地利微电子公司扩展旗下射频产品线,推出单通道、低功耗、低频唤醒接收器AS3930,以最低的电流消耗实现了最高灵敏度和业内最大范围。 AS3930全面优化了功耗、灵敏度和可编程性,支持广泛使用的125 kHz频带,适合各种应用。 AS3930芯片里包括一个接收通道,一个频率探…

【渝粤题库】国家开放大学2021春3930事故管理与应急处置题目

试卷代号:3930 2021年季学期期末统一考试 事故管理与应急处置 试题(开卷) 2021年7月 一、单选题(每题3分,共30分) 1.《突发事件应对法》规定,国家建立统一领导、综合协调、分类管理、分级负责、…

机器视觉怎么对陶瓷板的外观尺寸进行自动检测?

随着工业自动化的不断发展,机器视觉技术在制造业中的应用越来越广泛。在陶瓷板行业中,机器视觉技术可以用于自动检测陶瓷板的外观尺寸,提高生产效率和产品质量。下面我们来介绍机器视觉如何对陶瓷板的外观尺寸进行自动检测。 一、检测原理 …