前言
内核版本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

RK3399之8250串口驱动相关推荐

  1. 慢慢欣赏linux之串口驱动代码分析 - 基于powerpc 2.6.x版本

    串口驱动分两阶段初始化 第一阶段  串口驱动没有初始化前的准备工作,包括设备树的解析,platform设备注册 asmlinkage void __init start_kernel(void)    ...

  2. Linux串口驱动阅读笔记

    sccv串口驱动学习–8250.c 本文主要记录学习CGEL3(基于Linux version 2.6.21.7) 中关于8250串口驱动代码的心得.代码位于Z:\CGEL3\archto\mips\ ...

  3. linux8250驱动支持5路串口,LINUX串口驱动(8250)的编写与调试

    串口控制器都是大同小异,用3条地址线就可以完全对串口控制器进行控制.针对ST554芯片来说,控制寄存器主要有THR(发送保持寄存器),RHR(接收保持寄存器),IER(中断使能寄存器),FCR(缓冲控 ...

  4. linux串口驱动分析

    linux串口驱动分析 硬件资源及描写叙述 s3c2440A 通用异步接收器和发送器(UART)提供了三个独立的异步串行 I/O(SIO)port,每一个port都能够在中断模式或 DMA 模式下操作 ...

  5. linux串口驱动分析【转】

    转自:http://blog.csdn.net/hanmengaidudu/article/details/11946591 硬件资源及描述 s3c2440A 通用异步接收器和发送器(UART)提供了 ...

  6. linux 串口驱动(二)初始化 【转】

    转自:http://blog.chinaunix.net/uid-27717694-id-3493611.html 8250串口的初始化: (1)定义uart_driver.uart_ops.uart ...

  7. GPS NMEA 0183 4.10协议/GPS Linux串口驱动

      NMEA 0183是美国国家海洋电子协会(National Marine Electronics Association)为海用电子设备制定的标准格式.现在已经成为GPS导航设备统一的RTCM(R ...

  8. 从串口驱动的移植看linux2.6内核中的驱动模型 platform device platform driver【转】...

    转自:http://blog.csdn.net/bonnshore/article/details/7979705 写在前面的话: 博主新开了个人站点:你也可以在这里看到这篇文章,点击打开链接 本文是 ...

  9. Linux 8250串口控制器

    1 8250串口类型的识别 Intel HW都使用DesignWare 8250: drivers/mfd/intel-lpss-pci.c drivers/tty/serial/8250/8250_ ...

最新文章

  1. 安徽自考计算机基础考试时间,安徽2021年4月自考考试时间
  2. 特殊用户邮箱附件大小设置
  3. “DNS隧道”盗号木马分析——类似hjack偷密码然后利用dns tunnel直传数据发送出去...
  4. Linux块设备驱动程序原理
  5. linux 下简单的ftp客户端程序
  6. ubuntu用户目录安装pip(无root权限)
  7. (42)System Verilog 例化Verilog模块
  8. 用户名错误则一直登录
  9. CentOS SSH配置
  10. WPF 微信 MVVM 【续】发送部分QQ表情
  11. Nuxt3 服务端渲染 、elementplus多皮肤黑暗模式
  12. 设备指纹技术分析和应用分析
  13. 基于FPGA的cameralink编解码测试系统设计
  14. python学习14:字典和集合
  15. (2)马裤分:七分裤(长度为 70cm
  16. 利用 conda install --use-local 安装 解决 Tensorflow: illegal instruction (core dumped)
  17. 微信小程序开发学习第二天 按部就班的名片小程序
  18. 玫瑰李文案:玫瑰李水果店的文案怎么写
  19. B站哔哩哔哩21届秋招算法岗笔试 假设货币系统包含面值1元、4元、16元、64元共计4种硬币,以及面值1024元的纸币。现在小明使用1024元的纸币购买了一件价值为N(0<N<=1024)的商品
  20. 基于 Spring Boot 的个人博客系统设计与实现(源码+数据库+42页论文)

热门文章

  1. 射频识别(RFID)原理总结
  2. 【软件测试自动化-QTP系列讲座 11】== AOM应用(一)+QuickTest+Automation ==
  3. rdflib解析protege的owl文件
  4. IOU Tracker
  5. Coreseek安装指南和使用指南
  6. 【SSL1759】连通分量【五种方法】
  7. python超链接格式_Openpyxl中的超链接样式
  8. 瑞吉外卖文件上传数据库优化
  9. php 侧边栏效果,侧边栏效果:如何在跳转后保持侧边栏已有的展开状态
  10. 初识C++与Visual Studio(3)——解决方案资源管理器及常用项目属性介绍