RK3399之8250串口驱动

这篇具有很好参考价值的文章主要介绍了RK3399之8250串口驱动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

关系如下图所示
RK3399之8250串口驱动

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

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文章来源地址https://www.toymoban.com/news/detail-493916.html

到了这里,关于RK3399之8250串口驱动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RK3399平台开发系列讲解(内核调试篇)spidev_test工具使用

    🚀 返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 在 Linux 系统上,“ spidev_test ” 是一个用于测试和配置 SPI ( Serial Peripheral Interface )设备的命令行工具。 SPI 是一种串行通信协议,通常用于连接微控制器、传感器和其他外部设备。“ spidev_test ”

    2024年02月09日
    浏览(40)
  • RK3399平台开发系列讲解(内核调试篇)IO 数据工具:iostat和iotop

    🚀 返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 在 Linux 系统上, iostat 和 iotop 这两个 IO 数据工具非常常用。它们都是性能分析领域中不可缺少的工具性软件。 iostat 命令,是用来展示系统中的 IO 设备和 CPU 使用情况的。它的最大优势在于能汇报

    2024年02月09日
    浏览(38)
  • RK3399驱动开发 | 15 - RTC实时时钟芯片HYM8563S调试(基于linux5.4.32内核)

    Linux内核中使用RTC设备来提供硬件时间,为了兼容各种各样的RTC硬件,Linux内核提供了R

    2024年02月09日
    浏览(50)
  • RK3399驱动开发 | 21 -Marvell交换机芯片88E6390X调试(基于linux主线5.4.32内核)

    88E6390X芯片是Marvell的一款11端口交换器芯片,有1个CPU端口、8个10/100/1000Mbsp以太网端口、两个XAUI/RXAUI/2500光口。 RK3399只有一个MAC控制器,所以只能外接一个PHY芯片作为网口,但有了外部的交换机芯片后,连接架构如下:

    2024年02月13日
    浏览(50)
  • Rockchip RK3399 - 移植uboot 2023.04和内核FIT uImage制作

    ---------------------------------------------------------------------------------------------------------------------------- 开发板   :NanoPC-T4开发板 eMMC   :16GB LPDDR3:4GB 显示屏   :15.6 HDMI接口显示屏 u-boot    :2023.04 linux      :6.3 -----------------------------------------------------------------------------------

    2024年02月06日
    浏览(45)
  • RK3399_PCIe_Host驱动分析_地址映射

    《PCI Express Technology 3.0》,Mike Jackson, Ravi Budruk; MindShare, Inc. 《PCIe扫盲系列博文》,作者Felix,这是对《PCI Express Technology》的理解与翻译 《PCI EXPRESS体系结构导读 (王齐)》 《PCI Express_ Base Specification Revision 4.0 Version 0.3 ( PDFDrive )》 《NCB-PCI_Express_Base_5.0r1.0-2019-05-22》 SOC中AXI总线是

    2024年02月06日
    浏览(42)
  • 瑞芯微RK3568/RK3588平台YOLOV5实时视频算法的部署小白教程

    本文实现整体的部署流程比较小白,首先在PC上分别实现工程中的模型仿真推理、yolov5-pytorch仿真推理、自己训练yolov5模型仿真推理,完成仿真之后再在板端分别实现rk提供模型的板端推理、yolov5-pytorch板端推理、自己训练的yolov5模型板端推理,最后实现自己训练的yolov5模型实

    2024年02月06日
    浏览(84)
  • RK3399平台开发系列讲解(入门篇)VIM的基础命令

    🚀返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将介绍Vim相关命令。 简单说明一下,这张图上展示了一个键盘。图中的“•”表示,单个字母不是完整的命令,必须再有进一步的输入。比如,单个“g”没有意义,而“gg”表示跳转到文件开头

    2024年02月08日
    浏览(39)
  • 【Linux】RK3399平台开发系列——设备树的学习笔记

    设备树(Device Tree)是用于描述硬件设备和系统关系的树形数据结构,主要用于 Linux 操作系统中的设备驱动程序。在嵌入式系统中,由于硬件的多样性和复杂性,设备树变得越来越流行,用户可以用设备树来描述各种外设的属性和配置信息,以帮助内核识别和管理外设。 在

    2024年02月04日
    浏览(45)
  • RK3399平台开发系列讲解(基础篇)Linux 传统间隔定时器

    🚀返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将详细 介绍 Linux 传统间隔定时器。 Linux 的传统间隔定时器设置接口是 setitimer,它可以设定在未来某个时

    2023年04月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包