0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

深入解析RK平台Debug串口实现:从硬件交互到安全适配

jf_44130326 来源:Linux1024 2026-02-06 16:40 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

嵌入式开发中,Debug串口是排查问题的"生命线",尤其在系统崩溃、内核挂死等极端场景下,稳定可靠的串口调试功能往往是定位问题的关键。Rockchip平台通过rk_fiq_debugger.c实现了一套高效、可靠的Debug串口机制,不仅支持基础的收发功能,还针对实时性、安全性做了深度优化。本文将从代码层面解析其实现原理。

wKgZPGkaixyAZCKMAAB6W6uip7k603.png

一、核心功能:UART硬件交互层

Debug串口的本质是通过UART(通用异步收发传输器)实现数据交互,其核心功能包括初始化UART、发送字符、接收字符和缓冲区管理。

1. UART初始化:奠定通信基础

debug_port_init函数负责UART的硬件初始化,主要完成以下工作:

波特率配置:根据需求设置波特率(支持1152001500000等常见速率),通过写入UART_DLL(除数锁存低位)和UART_DLM(除数锁存高位)寄存器实现。

寄存器复位:通过UART_SRR(软件复位寄存器)复位UART,确保初始状态一致。

工作模式配置:设置UART_LCR(线路控制寄存器)配置数据格式(默认8位数据位),关闭环路模式,启用接收中断(UART_IER_RDI)。

FIFO控制:通过UART_FCRFIFO控制寄存器)启用接收FIFO,避免单字符中断频繁触发导致的性能问题。

// 关键初始化代码片段rk_fiq_write(t,0x07,UART_SRR);// 复位UARTudelay(10);rk_fiq_write(t,0x83,UART_LCR);// 进入波特率配置模式rk_fiq_write(t, dll,UART_DLL); // 设置波特率除数rk_fiq_write(t, dlm,UART_DLM);rk_fiq_write(t,0x03,UART_LCR);// 恢复数据格式配置rk_fiq_write(t,UART_IER_RDI,UART_IER);// 启用接收中断

2.数据发送:确保可靠输出

debug_putc函数实现单字符发送,核心逻辑是轮询等待发送缓冲区非满,避免数据丢失:

通过读取UART_USR(状态寄存器)的UART_USR_TX_FIFO_NOT_FULL位,判断发送FIFO是否有空闲空间。

若缓冲区满,则短暂延时(udelay(10))后重试,最多重试10000次(避免无限阻塞)。

缓冲区空闲时,将字符写入UART_TX(发送寄存器)。

对于批量数据发送,debug_put函数通过循环调用debug_putc实现,并自动在换行符n前添加回车符r,适配终端显示习惯。

3.数据接收:处理输入与特殊指令

debug_getc函数负责接收字符,同时支持特殊指令检测(如触发调试中断的"fiq"指令):

先读取UART_IIR(中断识别寄存器)和UART_USR(状态寄存器),判断中断类型和接收状态。

若检测到接收超时(UART_IIR_RX_TIMEOUT)但无实际数据,通过读取UART_RX寄存器清除无效中断,避免死循环。

正常接收时,将字符存入缓冲区,若检测到连续输入"fiq"(无下划线或空格),返回FIQ_DEBUGGER_BREAK触发调试中断。

二、高级特性:线程化与缓冲区优化

在高负载场景下,直接操作UART硬件可能导致阻塞(如发送缓冲区满时)。RK平台通过CONFIG_RK_CONSOLE_THREAD配置项,引入线程化处理机制,提升调试可靠性。

1.FIFO缓冲区:解耦生产与消费

定义两个环形缓冲区(fifotty_fifo),大小均为64KB,分别用于普通调试信息和TTY设备数据。

发送数据时,先写入FIFOkfifo_in),由专门的线程负责将FIFO数据写入UART硬件,避免主流程阻塞。

FIFO满,则统计丢弃的消息数(console_dropped_messages),并在后续空闲时提示。

2.控制台线程:异步处理发送逻辑

console_thread作为后台线程,负责将FIFO中的数据发送到UART

线程处于TASK_INTERRUPTIBLE状态,仅在FIFO有数据或需退出时被唤醒(wake_up_process)。

循环读取FIFO数据,调用console_putc发送,每发送一行(遇到n)刷新一次,平衡效率与实时性。

处理完数据后,通过console_flush等待UART硬件完成发送(检测UART_LSR_TEMT位确认发送完成)。

线程唤醒逻辑还做了死锁防护:通过console_thread_running标记避免在usleep_range期间唤醒,防止pi_lockconsole_lock的嵌套死锁。

三、安全与兼容性:TrustZone与多CPU适配

在支持TrustZone(安全区)的RK平台上,Debug串口需兼容安全世界与非安全世界的交互,并支持多CPU核心间的FIQ(快速中断)迁移。

1. SDEI:软件委派异常接口

当启用CONFIG_FIQ_DEBUGGER_TRUST_ZONECONFIG_ARM_SDE_INTERFACE时,通过SDEISoftware Delegated Exception Interface)实现FIQ的安全管理:

注册SDEI事件回调(fiq_sdei_event_callback),将FIQ处理逻辑委派给内核。

通过fiq_debugger_sdei_enable函数初始化SDEI事件,配置事件路由(绑定到指定CPU核心)。

支持FIQ在不同CPU核心间迁移(_rk_fiq_dbg_sdei_switch_cpu),通过SDEI事件通知安全世界完成路由切换。

2.电源管理CPU离线适配

为确保调试功能在系统低功耗或CPU离线时可用,驱动做了针对性处理:

CPU离线:通过fiq_debugger_cpu_offine_migrate_fiq函数,在CPU离线前将FIQ迁移到其他在线CPU

休眠唤醒:注册PM通知器(fiq_dbg_sdei_pm_nb),在系统休眠前将FIQ迁移到指定核心,唤醒后恢复。

** idle状态**:通过fiq_debugger_cpuidle_resume_fiq函数,在CPUidle状态恢复时重新启用FIQ

四、设备树与初始化流程

驱动通过设备树(Device Tree)获取硬件信息,初始化流程如下:

1.rk_fiqdbg_probe函数解析设备树,读取rockchip,serial-id(指定调试串口ID)、rockchip,baudrate(波特率)等参数。

2.查找对应UART节点,验证其是否禁用(避免与正常串口功能冲突),获取物理地址、中断号等资源。

3.初始化时钟apb_pclkbaudclk),映射UART寄存器地址(of_iomap)。

4.调用rk_serial_debug_init完成最终初始化,注册平台设备(platform_device_register)。

总结

RK平台的Debug串口驱动通过分层设计实现了高可靠性与灵活性:

硬件层:直接操作UART寄存器,确保收发正确性;

缓冲层:通过FIFO和后台线程解耦数据生产与硬件发送,提升系统响应性;

安全层:适配TrustZoneSDEI,支持多CPU场景下的FIQ迁移,确保极端场景下的调试可用性。

这套实现不仅满足了日常开发的调试需求,更在系统崩溃、低功耗等特殊场景下提供了关键的问题定位能力,是RK平台稳定性的重要保障。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5209

    文章

    20656

    浏览量

    337011
  • 调试
    +关注

    关注

    7

    文章

    653

    浏览量

    35879
  • 串口
    +关注

    关注

    15

    文章

    1627

    浏览量

    83342
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何实现串口实时通信?

    如何实现串口实时通信?
    发表于 08-14 09:10

    STM32串口实验,入门放弃 精选资料分享

    的博文,并加以归纳总结,帮助新手入门放弃 。提示:以下是本篇文章正文内容一、串口串口是什么?串口通信(Serial Communicat
    发表于 08-03 06:17

    利用USART串口实现电脑与STM32单片机的命令交互

    1 功能需求利用USART串口实现电脑与STM32单片机的命令交互,类似Linux系统一样的shell功能,通过这个功能掌握STM32单片机USART串口的基本用法,具体我们实现以下功
    发表于 01-05 07:45

    基于F0040的debug口实现AT指令的设计

    ,若失败则返回错误”[AT] ERROR“给客户端。AT 适配器配置使用pokt-f0040的默认debug接口,UART1(PB6,和PB7),使用接收中断来接收串口助手发送的数据,具体实现
    发表于 08-19 15:51

    RK系列开发板音频驱动适配指南(二)

    RK系列开发板音频驱动适配指南(一)RK系列开发板音频驱动适配指南(二)RK系列开发板音频驱动适配
    发表于 10-09 11:30

    如何通过STM32的串口实现简易脱机编程器

    如何通过STM32的串口实现简易脱机编程器如何通过STM32的串口实现简易脱机编程器如何通过STM32的串口实现简易脱机编程器如何通过STM32的串口实现简易脱机编程器。
    发表于 04-25 09:38 60次下载

    ARM与FPGA的接口实现解析

    ARM与FPGA的接口实现解析(应广单片机)-该文档为ARM与FPGA的接口实现解析详述资料,讲解的还不错,感兴趣的可以下载看看…………………………
    发表于 07-22 09:47 14次下载
    ARM与FPGA的接<b class='flag-5'>口实现</b>的<b class='flag-5'>解析</b>

    基于FPGA的SDRAM串口实

    基于FPGA的SDRAM串口实验(嵌入式开发板实验报告)-基于FPGA的SDRAM串口实验,verilog语言编写
    发表于 08-04 09:43 37次下载
    基于FPGA的SDRAM<b class='flag-5'>串口实</b>验

    【技术分享】RK3568适配RK628 RGB to HDMI

    RK628是一款多功能视频桥接芯片,支持多种显示接口的转换。本文基于RK3568平台,分享使用RK628桥接芯片实现RGB信号转换为HDMI
    的头像 发表于 07-21 16:49 3364次阅读
    【技术分享】<b class='flag-5'>RK</b>3568<b class='flag-5'>适配</b><b class='flag-5'>RK</b>628 RGB to HDMI

    深入解析RK平台GPIO驱动:原理到调试,开发者必看指南

    平台上,GPIO 驱动的实现直接影响着硬件交互的稳定性与效率。本文将带你深入剖析 RK
    的头像 发表于 02-03 15:53 1245次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>RK</b><b class='flag-5'>平台</b>GPIO驱动:<b class='flag-5'>从</b>原理到调试,开发者必看指南

    RK 平台 USB 摄像头成像调试指南:信号画质的全流程优化

    在 RK(瑞芯微)平台开发中,USB 摄像头成像效果不佳是高频问题,其根源多与 USB 信号质量、PHY 寄存器配置及硬件环境相关。本文结合 Rockchip USB SQ Tool 工具,分享
    的头像 发表于 11-26 07:05 1248次阅读
    <b class='flag-5'>RK</b> <b class='flag-5'>平台</b> USB 摄像头成像调试指南:<b class='flag-5'>从</b>信号<b class='flag-5'>到</b>画质的全流程优化

    深入解析 RK 平台显示驱动:格式支持、处理流程与实现原理

    、驱动处理流程、核心实现原理三个维度,带您深入了解  RK  平台显示驱动的工作机制。 一、 RK  显示驱动支持的显示格式  
    的头像 发表于 12-02 07:10 514次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b> <b class='flag-5'>RK</b> <b class='flag-5'>平台</b>显示驱动:格式支持、处理流程与<b class='flag-5'>实现</b>原理

    RK3506 MIPI转HDMI显示开发实战:硬件驱动全解析

    接芯片,可完美实现信号转换。 本文将从硬件选型、驱动流程、核心机制三个维度,详细拆解RK3506平台MIPI转HDMI的开发全过程,尤其聚焦驱动
    的头像 发表于 01-06 07:09 1112次阅读
    <b class='flag-5'>RK</b>3506 MIPI转HDMI显示开发实战:<b class='flag-5'>从</b><b class='flag-5'>硬件</b><b class='flag-5'>到</b>驱动全<b class='flag-5'>解析</b>

    深入解析rk平台Android Bootloader核心代码:启动流程AVB验证

    下android_bootloader.c的核心代码,带你读懂Android设备Bootloader内核的完整启动逻辑,以及开发者关注这些代码的核心价值。 一、代码整体定位 这份代码是Rockchip(瑞芯微)平台
    的头像 发表于 01-22 07:06 486次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>rk</b><b class='flag-5'>平台</b>Android Bootloader核心代码:<b class='flag-5'>从</b>启动流程<b class='flag-5'>到</b>AVB验证

    深入解析U-Boot image.c:RK平台镜像处理核心逻辑

    在瑞芯微(RK平台的嵌入式开发中,U-Boot作为核心的启动加载程序,负责完成镜像解析、校验、加载等关键流程。而image.c正是U-Boot中处理镜像(uImage)的核心文件,尤其针对R
    的头像 发表于 02-24 16:46 1798次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b>U-Boot image.c:<b class='flag-5'>RK</b><b class='flag-5'>平台</b>镜像处理核心逻辑