瑞芯微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”表示打开设备