NextPF 三大作业实战指南MTK8788 / Android 15平台MTK8788SoC 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_mtkautosuspend闲一会自动断电串口被休眠会丢字节pm_runtime内核运行时电源管理autosuspend归它管clk时钟硬件心跳关时钟省电停工APDMAMTK串口搬运工自动搬数据省CPUdts/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.hUSB配置kernel-6.6/arch/arm64/configs/gki_defconfigFTDI桥驱动kernel-6.6/drivers/usb/serial/ftdi_sio.c链路图open(/dev/ttyS1) → tty框架 → 8250_port.c → 8250_mtk.c → mt6771.dts apuart1 → 硬件 SoC UART 0x110030008250_mtk.c 函数行号已核实函数行作用mtk8250_dma_enable155开APDMAmtk8250_set_flow_ctrl243流控mtk8250_set_termios306波特率mtk8250_runtime_suspend429关baud/bus时钟mtk8250_runtime_resume444开时钟mtk8250_do_pm455开关口唤醒/挂起mtk8250_probe_of473取时钟DMAmtk8250_probe518开runtime PMmtk8250_suspend/resume604/628深睡唤醒中断mtk8250_of_match648mediatek,mt6577-uart3. 作业一USB-UART → 原生 USB现状gki_defconfig 已核实542: CONFIG_USB_SERIALm 543: CONFIG_USB_SERIAL_FTDI_SIOm # 现在靠FTDI桥路径MCU→FTDI芯片→USB→主机。目标MCU→SoC apuart→ttyS*匹配mediatek,mt6577-uart8250_mtk.c:649。dts 节点mt6771.dts 已核实apuart1: serial11003000 { 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-0uart1_pin; statusokay; };FTDI 留m兼容旧机。4. 真实引脚号mt6771-pinfunc.h 已核实信号引脚宏URXD1GPIO19PINMUX_GPIO19__FUNC_URXD1UTXD1GPIO20PINMUX_GPIO20__FUNC_UTXD1UCTS1GPIO23PINMUX_GPIO23__FUNC_UCTS1URTS1GPIO24PINMUX_GPIO24__FUNC_URTS1URXD0GPIO95/96PINMUX_GPIO95__FUNC_URXD0UTXD0GPIO96/95PINMUX_GPIO96__FUNC_UTXD0pinctrl 示例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_activepm_runtime_enablesuspend(L429):while(serial_in DEBUG0)等空闲→关uart_clk/bus_clkdo_pm(L455): 开口get_sync 关口put_sync_suspend深睡(L604):pinctrl_pm_select_sleep_stateenable_irq_wake(rx_wakeup_irq)禁法A 验证echo on.../power/controlautosuspend_delay_ms-1B dts不写延时C 改驱动去掉pm_runtime_enable查runtime_statusactiveidle后不丢。6. 作业三型号兼容statusokay/disabledoverlay 切驱动内置应用打不开ttyS1容错。7. 流控(L243) / 8. DMA(L155)HWEFR_HW_FC开CTSI/RTSISWXON1/XOFF1DMAdma-names tx/rx需CONFIG_SERIAL_8250_DMA。9. 排错现象查无ttyS1status okaynr_uarts丢前几字节autosuspend未禁乱码波特率/引脚高速丢RTS/CTS或DMAprobe失败“Can’t get uart clock” 时钟名baud/bus10. 自检echo/dev/ttyS1收发 [ ] idle后不丢 [ ] active [ ] 双机型同镜像 [ ] dmesg无错