当前位置: 首页 > news >正文

USB转原生UART_autosuspend_型号兼容

NextPF 三大作业实战指南(MTK8788 / Android 15)

平台:MTK8788(SoC = MT6771)/ Android 15 / kernel-6.6

读法:每节先"是什么/为什么"(小白看),再"代码在哪/长啥样"(带全路径+行号),最后"怎么改/怎么测/怎么排错"(专业落地)。


0. 这张图要做的三件事

#原文方针人话难度
1USB-UART → USB去掉"串口转USB"外挂芯片,改用 SoC 原生串口
2确认 SoC UART + 检查并禁用 auto-suspend别让串口自动休眠,否则丢数据高(核心)
3UART 有/无可切换(同一软件)同一镜像,有串口/无串口机器都能跑

1. 名词扫盲

名词大白话
UART串口,TX发RX收两根线,最稳的点对点通信
USB-UART桥接芯片CP2102/FTDI/PL2303,把串口翻成USB插电脑
原生UARTSoC自带串口控制器,不用外挂芯片
8250经典串口寄存器标准,MTK驱动叫8250_mtk
autosuspend闲一会自动断电,串口被休眠会丢字节
pm_runtime内核运行时电源管理,autosuspend归它管
clk时钟硬件心跳,关时钟=省电=停工
APDMAMTK串口搬运工,自动搬数据省CPU
dts/pinctrl设备树/引脚复用
defconfig开关清单:=y编入 =m模块 没写=关
RTS/CTS硬件流控线,防丢包
EFRMTK扩展功能寄存器,控流控

2. 关键文件全路径清单(照着打开)

用途全路径
UART驱动kernel-6.6/drivers/tty/serial/8250/8250_mtk.c
驱动开关kernel-6.6/drivers/tty/serial/8250/KconfigSERIAL_8250_MT6577,L477)
编译挂接kernel-6.6/drivers/tty/serial/8250/Makefileobj-$(CONFIG_SERIAL_8250_MT6577)+=8250_mtk.o
设备树kernel/kernel_device_modules-6.6/arch/arm64/boot/dts/mediatek/mt6771.dts
引脚定义kernel/kernel_device_modules-6.6/include/dt-bindings/pinctrl/mt6771-pinfunc.h
USB配置kernel-6.6/arch/arm64/configs/gki_defconfig
FTDI桥驱动kernel-6.6/drivers/usb/serial/ftdi_sio.c

链路图

open("/dev/ttyS1") → tty框架 → 8250_port.c → 8250_mtk.c → mt6771.dts apuart1 → 硬件 SoC UART @0x11003000

8250_mtk.c 函数行号(已核实)

函数作用
mtk8250_dma_enable155开APDMA
mtk8250_set_flow_ctrl243流控
mtk8250_set_termios306波特率
mtk8250_runtime_suspend429关baud/bus时钟
mtk8250_runtime_resume444开时钟
mtk8250_do_pm455开关口唤醒/挂起
mtk8250_probe_of473取时钟+DMA
mtk8250_probe518开runtime PM
mtk8250_suspend/resume604/628深睡+唤醒中断
mtk8250_of_match648mediatek,mt6577-uart

3. 作业一:USB-UART → 原生 USB

现状(gki_defconfig 已核实)

542: CONFIG_USB_SERIAL=m 543: CONFIG_USB_SERIAL_FTDI_SIO=m # 现在靠FTDI桥

路径:MCU→FTDI芯片→USB→主机。

目标

MCU→SoC apuart→ttyS*,匹配mediatek,mt6577-uart(8250_mtk.c:649)。

dts 节点(mt6771.dts 已核实)

apuart1: serial@11003000 { compatible = "mediatek,mt6577-uart"; reg = <0 0x11003000 0 0x1000>; interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH 0>; clocks = <&clk26m>, <&infracfg_ao INFRACFG_AO_UART1_CG>; clock-names = "baud", "bus"; dmas = <&apdma 2 &apdma 3>; dma-names = "tx", "rx"; };

改:&apuart1 { pinctrl-0=<&uart1_pin>; status="okay"; };,FTDI 留=m兼容旧机。


4. 真实引脚号(mt6771-pinfunc.h 已核实)

信号引脚
URXD1GPIO19PINMUX_GPIO19__FUNC_URXD1
UTXD1GPIO20PINMUX_GPIO20__FUNC_UTXD1
UCTS1GPIO23PINMUX_GPIO23__FUNC_UCTS1
URTS1GPIO24PINMUX_GPIO24__FUNC_URTS1
URXD0GPIO95/96PINMUX_GPIO95__FUNC_URXD0
UTXD0GPIO96/95PINMUX_GPIO96__FUNC_UTXD0

pinctrl 示例:

uart1_pin: uart1-pins { pins { pinmux = <PINMUX_GPIO19__FUNC_URXD1>, <PINMUX_GPIO20__FUNC_UTXD1>; }; };

带流控加 GPIO23/24。


5. 作业二:禁用 autosuspend(核心)

为什么:闲→关baud/bus时钟→来数据来不及上电→丢字节。

源码(已核实)

probe(L584):pm_runtime_set_active+pm_runtime_enable
suspend(L429):while(serial_in DEBUG0)等空闲→关uart_clk/bus_clk
do_pm(L455): 开口get_sync 关口put_sync_suspend
深睡(L604):pinctrl_pm_select_sleep_state+enable_irq_wake(rx_wakeup_irq)

禁法

  • A 验证:echo on>.../power/controlautosuspend_delay_ms=-1
  • B dts不写延时
  • C 改驱动去掉pm_runtime_enable
    查:runtime_status=active,idle后不丢。

6. 作业三:型号兼容

status="okay"/"disabled"overlay 切;驱动内置;应用打不开ttyS1容错。

7. 流控(L243) / 8. DMA(L155)

HW=EFR_HW_FC开CTSI/RTSI;SW=XON1/XOFF1;DMA=dma-names tx/rx需CONFIG_SERIAL_8250_DMA。

9. 排错

现象
无ttyS1status okay+nr_uarts
丢前几字节autosuspend未禁
乱码波特率/引脚
高速丢RTS/CTS或DMA
probe失败“Can’t get uart clock” 时钟名baud/bus

10. 自检

  • echo>/dev/ttyS1收发 [ ] idle后不丢 [ ] active [ ] 双机型同镜像 [ ] dmesg无错
http://www.jsqmd.com/news/1093911/

相关文章:

  • Rust Trait 泛型协作实现细节
  • GEO精准获客哪个更好
  • 系统架构设计原则
  • Arc + Mutex / RwLock / Atomic 才是 Rust 并发全貌!
  • 阿里最新“SpringCloud微服务”全解手册:程序员进阶必备!
  • 深度把玩二手欧米茄星座的老哥,建议先放大50倍看看这处机芯公差
  • 如何用 Claude API 总结客服工单,并找出高频问题
  • Python的__mro__方法解析顺序与super函数在多继承中的查找路径
  • 企业微信会话存档与SCRM实战:全链路客服数据统计
  • 前端音视频处理入门
  • 先说结论:C++/WinRT 不一定要专用模板
  • 在线音视频处理工具,不上传文件的在线视频压缩工具!
  • 已经能自动发抖音了
  • 收不到WhatsApp验证码?别急着砸手机,这5个坑你肯定踩过
  • Python Web 项目使用 PyInstaller 打包为 Windows EXE 的常见问题与解决方法
  • Keil MDK 编译输出内存分段详解
  • 收藏!小白程序员必看:手把手教你搭建可评测的RAG大模型系统
  • ManageEngine卓豪-企业为什么需要AD域审计工具?
  • AI FDE培训:让AI从能演示,到能干活
  • 高活性浓缩洗衣液怎么选?两款家用高性价比品牌实测
  • 千匠智元AI斩获第八届创新发展论坛金i奖,领跑产业AI创新
  • 新160个CrackMe039-eKH.1、040-DaNiEl-RJ.1、041-genocide1逆向分析
  • AI 赋能训练推理平台 Java + SpringBoot MySQL Maven EasyAI FFmpeg支持人脸识别、门禁、人员入出检测、人员跌倒检测等功能 基于深度学习模型,可自定义训练数据
  • VSCode插件变黑客后门!GitHub 3800个仓库被攻破
  • 湖北工业大学《线性代数》期末试卷及答案2016-2024学年PDF
  • 【从0到1构建一个ClaudeAgent】协作-团队协议
  • 2026年智泊第23期AGI大模型应用开发实践班v6.0,智泊-最新AGI大模型全栈课12期|2025年9月
  • 提示词三要素:角色锚定、任务边界与输出契约
  • 文科生怎么转型科创赛道-硕士进修选择与交大MTT培养路径详解
  • 基于Appium与Python的拼多多百亿补贴商品价格自动化监控方案