​【迅为电子】RK3568驱动指南|第十七篇 串口-第199章 串口子系统框架

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。


【公众号】迅为电子

【粉丝群】258811263(加群获取驱动文档+例程)

【视频观看】嵌入式学习之Linux驱动(第十七篇 串口_全新升级)_基于RK3568

【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板


第199章 串口子系统框架

在串口通信协议和串口通信接口类型的基础上,串口子系统框架为串口设备的驱动和管理提供了完整的架构。通过串口子系统框架的层级设计,我们可以更加深入地了解 Linux 内核中串口设备的处理流程和组成结构。让我们继续探索串口子系统框架,深入了解串口设备在 Linux 内核中的工作原理吧!

199.1 串口子系统框架

串口子系统框架是Linux内核中专门用于处理串口设备的模块化框架,框架图如下图所示。

在上图中,包含了多个层级,每个层级负责处理不同的功能和任务,从而实现串口设备的完整驱动和管理。接下来依次介绍每个层级的作用。

  • 应用层:位于最顶层,是串口子系统中用户空间应用程序与内核空间之间的接口,应用层包括了用户空间的串口应用程序,如串口通信工具minicom等。
  • 字符设备层:位于应用层的下方,负责将用户空间的串口读写请求传递给内核空间的tty_core层。字符设备层将串口设备看作一个特殊的字符设备,通过字符设备接口来进行操作。
  • tty_core层:位于字符设备层的下方,是Linux内核中用于管理串口设备的核心模块,它处理串口设备的基本功能,如数据传输,控制,缓冲管理等。tty_core层与具体的串口硬件无关,是串口设备的通用处理层。
  • uart_core 层:位于 tty_core 层的下方,提供了串口设备的底层驱动接口,负责与具体的串口硬件进行通信。uart_core 层负责控制串口数据的发送和接收、中断处理、时钟管理等底层操作。
  • 硬件层:位于最底层,是串口子系统中与具体硬件有关的部分。硬件层包括了串口硬件的驱动程序,与具体的串口控制器进行通信,实现对硬件的底层控制和操作。

串口子系统框架的层级设计将串口设备的功能分解为不同的层次,实现了功能的模块化和抽象化,方便开发者进行串口设备的驱动开发和维护。

 

199.2 内核配置串口驱动

在瑞芯微官方提供的SDK内核源码里面,串口驱动使用的是8250通用串口驱动,以下是主要驱动文件。

drivers/tty/serial/8250/8250_core.c # 8250 串口驱动核心

drivers/tty/serial/8250/8250_dw.c # Synopsis DesignWare 8250 串口驱动

drivers/tty/serial/8250/8250_dma.c # 8250 串口 DMA 驱动

drivers/tty/serial/8250/8250_port.c # 8250 串口端口操作

drivers/tty/serial/8250/8250_early.c # 8250 串口 early console 驱动

接下来在内核menuconfig配置界面选中8250驱动,如下图所示: 

迅为提供的SDK源码设备树中默认打开了串口9,打开kernel/arch/arm64/boot/dts/rockchip/rk3568.dtsi设备树文件,串口9控制器的设备树节点如下所示: 

	uart9: serial@fe6d0000 {
		compatible = "rockchip,rk3568-uart", "snps,dw-apb-uart";
		reg = <0x0 0xfe6d0000 0x0 0x100>;
		interrupts = <GIC_SPI 125 IRQ_TYPE_LEVEL_HIGH>;
		clocks = <&cru SCLK_UART9>, <&cru PCLK_UART9>;
		clock-names = "baudclk", "apb_pclk";
		reg-shift = <2>;
		reg-io-width = <4>;
		dmas = <&dmac0 18>, <&dmac0 19>;
		pinctrl-names = "default";
		pinctrl-0 = <&uart9m0_xfer>;
		status = "disabled";
	};

这段代码是设备树中对 UART9(串口设备)的描述,主要包括了以下信息:

  • compatible:指定设备的兼容性字符串,表示此串口设备兼容于 rockchip,rk3568-uart 和 snps,dw-apb-uart 两种串口控制器。这有助于设备树绑定相应的驱动程序。
  • reg:指定串口设备的地址和大小,0xfe6d0000 是串口设备的基地址,0x100 表示地址空间的大小。
  • interrupts:指定串口设备的中断信息,包括中断类型和中断号。
  • clocks:指定串口设备所使用的时钟源,包括波特率时钟和 APB 时钟。
  • clock-names:指定时钟源的名称,用于与时钟源的具体配置相匹配。
  • reg-shift:表示地址偏移量的位数,即每个寄存器的偏移量是按字节还是按字(byte)。
  • reg-io-width:表示对设备地址和数据的访问宽度,这里是 4 表示 4 字节宽度。
  • dmas:指定串口设备使用的 DMA 控制器以及 DMA 通道号,用于数据传输的 DMA 操作。
  • dma-names:可选值为“tx”“rx”“!tx”“!rx”,“tx”打开tx dma、“rx”打开rx dma

、“!tx”关闭tx dma、“!rx”关闭rx dma

  • pinctrl-names 和 pinctrl-0:用于串口设备的管脚控制,以配置和管理串口设备的引脚设置。可选参数为如下所示:
  • &uart9m0_xfer 配置tx和rx引脚为iomux group 0
  • &uart9m1_xfer 配置tx和rx引脚为iomux group 1
  • &uart9m0_ctsn和&uart1m0_rtsn配置硬件自动流控cts和rts引脚为iomux group 0
  • &uart9m1_ctsn和&uart1m1_rtsn配置硬件自动流控cts和rts引脚为iomux group 1
  • status:表示串口设备的状态,这里是 "disabled" 表示设备当前处于禁用状态。如果设置为“okay”表示打开设备

  • 19
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值