深入解析dw_mci_probe:MMC控制器驱动初始化的核心流程与调试指南
手头正好在调一块新板子的MMC子系统从bootloader起来之后uImage加载完成到rootfs挂在SD卡上中间最让人心里没底的就是这一步SD卡控制器到底有没有被正确初始化。运气好的时候一条dmesg就带过了运气不好的时候连个中断都等不到。而这一切的起点就是那个看起来低调但扛着整个存储栈核心职责的函数——dw_mci_probe。不论你是做嵌入式Linux方案、写板级驱动还是单纯想把内核的MMC子系统吃透这个函数都是绕不开的一关。这篇文章我就从源码实现、设备树配合、常见失败场景和排查手段几个维度把整个过程掰开揉碎讲清楚。1. dw_mci_probe 在MMC驱动体系里到底扮演什么角色1.1 从硬件控制器到块设备之间的那个桥梁先把视角拉高一点。当你往板子上插一张SD卡系统里的软件链路大概是这样的MMC控制器硬件位于SoC内部它负责发送CMD、处理DATA线、产生中断在此基础上Linux内核的MMC子系统分了三层——mmc core处理卡的状态机和协议细节host controller driver负责驱动具体的控制器芯片而最上层的块设备层则把卡抽象成/dev/mmcblk0这样的设备节点。dw_mci_probe这个名字对应的是DesignWare系列MMC/SDIO控制器在Linux内核中的probe入口。这一类控制器在手机主控、机顶盒、网络设备和工控板里出镜率极高因为DesignWare的IP被大量SoC厂商买去集成。dw_mci_probe被调用的时机是在设备驱动模型把设备树节点和驱动匹配上之后内核自动进入探测流程。换句话说这函数跑完且返回成功存储控制器才算真正“活”了。从功能上看dw_mci_probe不是只做初始化寄存器那么单薄。它需要完成资源申请、时钟使能、中断注册、DMA能力探测、MMC host注册、请求队列初始化等一系列动作。任何一个环节失败整个MMC栈都起不来表现出来就是系统完全看不到SD卡或者驱动加载报错、进程卡在dmesg的某个error后面。1.2 驱动模型匹配之前的准备工作在probe被执行之前内核的设备驱动模型已经做了一轮匹配。设备树里的节点比如sdmmc或者mmc它包含了reg、interrupts、clocks、pinctrl这些描述性信息。驱动侧则通过of_match_table声明自己支持哪些兼容字符串。两者匹配成功后内核分配一个struct platform_device接着就会去调用驱动的probe回调于是dw_mci_probe登场。很多人刚开始接触这块的时候以为probe就是“把驱动加载进去”这种理解过于笼统。我习惯把probe看成一次“资源集齐仪式”本驱动要正常工作所有依赖的资源必须在这个阶段申请到而且申请不到时不能直接报错退出而是要返回-EPROBE_DEFER告诉内核“先别急我依赖的东西还没好等会儿再叫我”。比如时钟控制器还没ready、电源域还没up那这次probe就会被推迟重试。理解了这层机制后面调试-EPROBE_DEFER相关的启动日志时就不会一头雾水。也正是因为probe阶段承担了这么多职责dmesg里开关驱动的日志顺序、.probe的实现质量直接决定了后续SD卡枚举是顺利还是磕绊。接下来我们逐行看dw_mci_probe内部到底做了什么。2. 源码视角下的dw_mci_probe核心流程2.1 私有数据结构与devm资源管理打开drivers/mmc/host/dw_mmc.c第一眼看到的probe实现通常长这样通过devm_kzalloc分配一个struct dw_mci作为私有数据结构然后把这个结构挂在platform_set_drvdata上。这里的“devm”前缀是设备资源管理机制它的好处是如果probe中途fail已经申请的内存、时钟、GPIO、中断都会自动释放不用每一步都手写错误处理goto标签。到这一步有个特别容易踩的坑struct dw_mci里包含了大量硬件相关成员比如寄存器基地址、DMA描述符基址、fifo地址、当前请求列表、中断屏蔽状态等等。你如果只把这个私有结构当成一个“存储配置的地方”后面写中断处理函数和完结请求的路径时就会特别被动。我见过有同事在probe里把flag设置得挺好但忘了初始化cmd和data状态机的标志位结果第一笔读写请求进来就直接死锁。顺带说一句dw_mci结构里还有个use_dma标志它是probe期间通过读取设备树参数或DMA能力探测来决定的。这直接决定后续是走IDMAC方式还是PIO方式选错的话要么数据搬运慢得离谱要么DMA传输一直报错。2.2 时钟与复位probe成功的首要关卡一个MMC控制器没有时钟所有寄存器访问都会卡死这是嵌入式开发里的常识但实际操作中还是经常看到人们在probe失败后选择一头扎进中断代码里排查最后发现只是某个时钟源没配对。dw_mci_probe里通常会有类似devm_clk_get或clk_get来获取biu和ciu两个时钟。所谓biu是总线接口单元时钟负责控制器内部寄存器和总线接口逻辑ciu是卡接口单元时钟负责产生MMC总线上的时钟信号。这两个时钟的父时钟源、频率是否匹配直接决定了SD卡能跑多快、时序对不对。我在一个基于ARM SoC的项目里就遇到过这种诡异现象dmesg显示dwmmcprobe成功但mmc卡识别不了频率只能勉强跑在400kHz的初始识别速率下一切到high speed就报数据超时。后来查清楚是ciu时钟被配置成了某个不可分频的固定源驱动不管怎么设置mmc-f_max实际总线频率都上不去。另外复位也是probe里的高频检查点。很多SoC的MMC控制器带rstc复位控制probe阶段需要先解除复位否则寄存器都处于复位状态写什么都没反应。这类问题典型特征是dmesg里没有报错但寄存器读出来全部是0或固定值。2.3 寄存器映射与中断申请把硬件资源握在手里probe接下来做的事情是把设备树里的reg映射成虚拟地址。Linux内核提供devm_platform_ioremap_resource它会自动根据平台设备的资源索引完成request_mem_region和ioremap。映射之后驱动就用dw_mci_reg之类的接口访问寄存器。紧接着是中断申请通常用的是devm_request_irq或平台相关的platform_get_irq。MMC控制器中断是整个驱动的心脏所有命令完成、数据传输完成、错误标志、卡检测事件全靠中断通知CPU。申请中断之后probe阶段还会做中断屏蔽的初始配置一般会把所有中断屏蔽掉等卡初始化时再逐个打开。这里有一个值得注意的细节DesignWare控制器支持两种中断处理风格。一种是单一中断号所有事件都在一个IRQ里处理另一种是分开的cmd、data、card detect等独立中断。如果你的平台接了多个中断源probe里没有分别申请可能卡能初始化但事件响应丢一半。别问为什么设备偶尔能识别但读写就超时往往是这里埋下的病根。2.4 IDMAC控制器初始化与FIFO配置对于支持DMA的DesignWare控制器dw_mci_probe里还会涉及IDMAC的初始化。IDMAC是控制器内置的DMA引擎驱动需要分配描述符表、把描述符地址写到控制器的DMAC寄存器里并且在DMA传输过程中维护一个描述符链。这一步如果配置不对轻则数据错乱重则控制器直接hang住。我在实际项目里看到过一个很典型的错误为DMA描述符分配的缓冲区没有做cache一致性维护CPU写好了描述符但DMA看到的是旧数据导致每次传输位置都不对。后来在probe初始化里强制做了dma_map_single并妥善处理了dma_unmap问题才消失。同时FIFO深度也会在probe阶段被读取并记录。DesignWare控制器的FIFO深度和总线宽度寄存器能告诉你一次突发传输最多能搬多少数据驱动要根据这个值设置合适的max_blk_count和max_seg_size。如果FIFO配置和实际硬件不符大块数据读写时会导致FIFO溢出或欠载。2.5 MMC host分配、注册与槽位初始化资源准备妥当之后probe的重头戏就是创建MMC主机。驱动会调用mmc_alloc_host分配一个struct mmc_host设置好ops指针、最大频率、最小频率、总线宽度标志然后再调用mmc_add_host把它注册到MMC核心框架里。mmc_add_host注册完成那一刻MMC核心会立刻开始卡检测流程。所以probe里注册host之前必须确保控制器已经处于可以正常接收命令的状态。这就是为什么有些驱动会在mmc_add_host之前先调一个dw_mci_init_slot之类的函数完成供电、卡检测GPIO注册、请求队列初始化。请求队列的概念容易被忽略。MMC驱动并不仅仅是处理“发一个命令、收一个响应”这么简单它要同时支持多个未完成的IO请求、命令排队、错误恢复重试等机制。dw_mci_init_slot里通常会注册mmc_request的提交接口后续的读写请求都会进入到这个队列统一调度。probe阶段忘了初始化队列后果就是每次提交request都crash而且crash位置往往在很后面让人完全摸不着头脑。3. 设备树配置如何左右probe的大局3.1 从of_match到与硬件频率的匹配逻辑设备树节点是驱动probe的资源来源但很多开发者把设备树理解成“写着玩儿的配置”这是完全错误的。一个典型的MMC节点至少包含compatible、reg、interrupts、clocks、clock-names还可能携带bus-width、cap-mmc-highspeed、cap-sd-highspeed、sd-uhs-sdr104、non-removable、cd-gpios等属性。其中compatible要和驱动的of_match_table严格对应。如果你把snps,dwmmc写成了snps,dw-mmc哪怕只差一个小横线驱动都匹配不上probe压根不会执行。我在帮同事review设备树patch时就见过好几次这类低级但极端难查的问题。clocks和clock-names则与probe里的clk_get一一绑定。设备树里通常给biu和ciu各分配一个时钟源并用clock-names标识。如果设备树少了ciu时钟定义probe里的clk_get就可能拿不到时钟从而选择跳过部分时钟配置系统照样能跑但性能一塌糊涂。3.2 卡检测机制轮询、映射GPIO和SDIO带内中断的取舍卡检测是MMC驱动里最容易被设备树配置带偏的环节。DesignWare控制器本身有一个CD引脚用来检测卡是否插入但很多SoC没有把这一物理信号直接连接到控制器而是通过一个GPIO来检测。设备树中的cd-gpios属性告诉驱动使用GPIO来做卡检测而broken-cd则告诉驱动“别依赖硬件检测老老实实轮询”。这两种方式各有利弊。GPIO检测响应快但占用一个引脚而且需要去抖处理轮询机制简单稳妥但延迟高插入一张卡可能要等几百毫秒甚至更久才被系统发现。还有一种情况是SDIO设备它支持带内中断卡自己通过DAT1线拉低来表示中断事件。这种情况下设备树需要设置cap-sdio-irq属性。SDIO的中断处理和普通卡检测完全是两套路径probe阶段如果没把相关flag正确设置SDIO设备可能出现中断风暴或者完全收不到中断。3.3 总线宽度、时序参数与高速模式的设备树表达bus-width属性决定了驱动将配置几条数据线。常见的值是1、4、8。如果你硬件上只连了4根数据线但设备树写了bus-width 8控制器在初始化时可能尝试8位模式而设备不支持最终降级到1位模式速度大打折扣。反过来硬件支持8位但你只写4位那就会白白浪费一倍的吞吐能力。高速模式参数则包括max-frequency、cap-mmc-hw-reset等。尤其max-frequency直接影响probe初始化时mmc-f_max的设定。如果这个值被设置成远高于物理时钟源能力实际的时钟分频后达不到目标值SD卡协商到某种高速模式后反而会因为时序偏移导致数据错误。这种情况调试起来特别恶心因为dmesg看起来一切正常卡也识别了但读写频繁超时。所以在调整设备树时别先急着把max-frequency调大。先确认SoC的时钟树能不能输出你想要的频率再看信号完整性是否扛得住。我在高速模式下踩过不少坑最后发现老老实实把频率从200MHz降到150MHz稳定性立刻上来了。4. 从probe出发的调试实例与避坑心得4.1 现象一probe返回EPROBE_DEFER卡在启动流程里在一个模拟项目X的开发板上A同学发现自己写的驱动dmesg里出现dwmmc相关的-EPROBE_DEFER信息系统启动流程在SD卡挂载这一步反复重试最后超时进入救援模式。第一步不要慌先看/sys/kernel/debug/devices_deferred或者直接在dmesg里搜deferred就能看到是哪个设备在等哪个资源。大多数情况下是clk或power-domain还没ready。A同学排查后确认是某个PMIC的时钟控制驱动加载太晚MMC驱动抢先probe于是依赖的时钟源还没注册。解决办法是给MMC驱动的probe加上合理的-EPROBE_DEFER返回机制同时检查各驱动的加载顺序依赖。另外如果你的内核配置了CONFIG_DEBUG_FS可以通过cat /sys/kernel/debug/devices_deferred查看等待列表。列表里会明确写出等待的资源和设备名比对着dmesg猜要高效太多。4.2 现象二probe成功但卡无法识别控制器寄存器全为0还有一次B同学反馈自己板子上dw_mci_probe打印成功MMC host也注册了但就是检测不到任何卡。后来发现是ciu时钟虽然拿到了但probe里没有先clk_prepare_enable。时钟没使能控制器内部逻辑根本没有运转寄存器读出来自然是全0。这个案例的教训是clk_get成功只能说明“时钟树里存在这个时钟”并不代表时钟已经使能。很多新手拿到一个时钟句柄就直接用结果所有寄存器操作都静默失败。probe里必须确保调用clk_prepare_enable并且驱动卸载时对应clk_disable_unprepare。如果你用的是devm_clk_get它只会管理时钟句柄的自动释放不会替你enable。这个细节真得刻在脑子里。4.3 现象三SDIO设备中断不触发或异常频繁在一个采用SDIO接口的WiFi模组项目中C同学发现WiFi驱动能加载但网络吞吐量极低而且/proc/interrupts里MMC的中断计数疯涨。排查发现是SDIO带内中断的触发条件配置错了控制器把DAT1线的每个边沿都当成中断事件而实际的SDIO协议要求的是电平中断。进入dw_mci中断处理函数一看发现中断状态寄存器里不断出现SDIO_INT标志但上层SDIO函数没有任何实际请求。最后通过设备树增加适当的属性并调整控制器寄存器配置把SDIO中断模式改成正确的电平触发问题解决。这个案例提醒我们SDIO中断不是普通的GPIO中断它依赖控制器特定的采样窗口和去抖电路probe阶段更要核对控制器版本对应的参考手册。4.4 避坑清单几个流传甚广的误解网上常有人说“dw_mci_probe修改起来很危险尽量只改设备树”这个说法不完全对。设备树能解决的是资源描述和参数选择的问题无法解决驱动源代码里的逻辑bug。比如控制器FIFO深度在某个芯片版本上和默认值不同光靠设备树是改不透的必须在驱动或平台数据里处理。还有人说“MMC驱动只要probe成功就可以不管了”这也是大错特错。probe成功只是拿到了入场券真正的难点在中断处理、DMA描述符回收、错误恢复和电源管理。很多时候probe期间看不出问题运行几天后偶发一次CRC错误才翻回去检查DMA缓冲区的对齐方式发现是某处代码写了kmalloc而不是dma_alloc_coherent。我再分享一个具体的优化建议如果你的平台SD卡读写性能明显偏低可以检查probe阶段是否正确设置了mmc-caps中的MMC_CAP_SD_HIGHSPEED或MMC_CAP_UHS_SDR104。如果只是默认的普通模式无论硬件多好读写速度都会限制在一个很低的水准。同时配合设备树里的max-frequency把控制器的实际工作频率提上去才谈得上性能调优。4.5 中断与DMA协作的独门调试技巧在调试DMA和中断配合时我最推荐的做法是先在probe里临时禁用DMA改用PIO模式跑一遍基本读写。如果PIO模式完全正常、切换DMA后问题复现那十有八九问题出在DMA描述符管理或cache一致性上而不是控制器本身。这个方法虽然粗暴但能快速缩小排查范围比对着寄存器反复猜高效得多。实际操作中还可以在中断处理函数的入口打印INT_STATUS和STATUS寄存器的原始值。DesignWare控制器的状态寄存器里包含FIFO空满、数据线忙、命令忙等关键信息一眼望去就能分辨是卡侧问题还是控制器侧问题。很多开发者只盯着一个错误标志debug最后绕了远路。用tracepoint或trace_mmc_request_done这类内核事件钩子也能够在不影响实时性的前提下记录请求生命周期。我建议在probe注册host之后先跑一轮mmc_test测试模块把各种尺寸的读写请求都过一遍确保数据完整性没问题再继续开发上层业务。5. 从probe到稳定存储的最后一公里探针函数只是万里长征第一步。我自己做过的几个项目里最深的体会是一个稳定好用的MMC驱动并不取决于probe写得多么花哨而是取决于probe阶段有没有把该做的硬件能力探测做扎实以及后续的错误恢复路径是否完备。很多产品在实验室里跑得好好的一到现场就偶发SD卡掉线最后查来查去问题恰恰出在probe阶段没有正确设置卡检测的中断触发方式导致热插拔事件被漏掉。还有一件值得做的小事在probe成功之后立即打印一份“能力摘要”日志把控制器版本、FIFO深度、时钟频率、DMA模式、总线宽度这些关键信息全部记录下来。这样后续无论是做性能调优还是排查现场问题都能有一个可靠的基础信息参考。如果你手头也正在调dw_mci_probe相关的驱动我特别推荐先仔细读一遍drivers/mmc/host/dw_mmc.c里的probe实现再对照自己板子的原理图把每个资源都梳理清楚。这个过程虽然枯燥但绝对值得。等哪一天SD卡在极端温度、频繁热插拔、高吞吐压力下依然稳定工作你就能真正体会到这个函数背后承载的分量。

相关新闻

基于MCP的Draw.io AI绘图:让大模型直接生成可编辑工程文件

基于MCP的Draw.io AI绘图:让大模型直接生成可编辑工程文件

AI画图这两年是真的热闹,但有个事儿我一直觉得别扭:你说让大模型画个架构图,它给你吐一段Mermaid还算顺手,可你真要拿这份图去开评审会、丢进文档里协作改,就傻眼了——要不就是坐标乱飞节点叠在一起,要不就…

2026/10/14 3:15:33 阅读更多 →
港口结构安全监测系统方案:从传感器选型到DTC平台预警的完整技术指南

港口结构安全监测系统方案:从传感器选型到DTC平台预警的完整技术指南

简介:港口设施结构数字化监测设备PPT由北京数泰科技有限公司编制,面向港口工程管理、结构安全监测及智慧港口建设从业者,系统展示港口设施从传感布设到软件平台的一体化监测思路。资料共1个文件,为约38.53MB的pptx演示文稿&#x…

2026/10/14 3:15:33 阅读更多 →
2026年10月静安动力电芯回收Top3品牌推荐及优缺点

2026年10月静安动力电芯回收Top3品牌推荐及优缺点

一块退役电芯值多少? 把回收了一枚20安时动力电芯这件事掰开揉碎来看, 它确实能省下3.2公斤的金属原矿, 并且还能让二氧化碳的排放量减少1.8公斤。再看那个静安片区, 在这个近两季的时间里, 他们那里退役电芯的回收数量同比实现了41%的增长。由此可见, 那种循环下来…

2026/10/14 3:15:33 阅读更多 →

最新新闻

从零构建每日晨报:信息过滤系统的设计与实现

从零构建每日晨报:信息过滤系统的设计与实现

1. 一份“每日晨报”到底在解决什么问题每天早上七点半,我习惯性打开自己维护的一个小工具,屏幕上会弹出一份排版干净的简报:昨天圈子里发生了什么、有哪些值得点进去看的链接、今天有什么值得留意的节点。这份东西我管它叫“每日晨报”&…

2026/10/14 3:59:41 阅读更多 →
TensorFlow工程实践:从数据流水线到模型部署的关键技术

TensorFlow工程实践:从数据流水线到模型部署的关键技术

TensorFlow这个标题一摆出来,懂行的人就知道,这不是在聊一个简单的开源库,而是在聊一套“深度学习工业化”的完整体系。我最早接触它的时候,还是在1.x时代,那时候写个模型要先搞placeholder、Session、global_variable…

2026/10/14 3:59:41 阅读更多 →
PyTorch本质:动态图张量系统与Python原生深度学习范式

PyTorch本质:动态图张量系统与Python原生深度学习范式

1. 项目概述:PyTorch不是“框架”,而是一套可编程的张量计算系统你点开这个标题,大概率是刚接触深度学习,被“PyTorch”三个字反复刷屏——课程推荐它、招聘要求它、论文代码用它、连隔壁做CV的同事都在说“我用PyTorch跑通了”。…

2026/10/14 3:59:41 阅读更多 →
小程序生日提醒应用开发全流程:云开发、定时触发与订阅消息实战

小程序生日提醒应用开发全流程:云开发、定时触发与订阅消息实战

简介:小程序作为轻量应用载体,常用于实现生日提醒、待办打卡等工具类场景。其核心价值不只是页面呈现,更在于数据模型设计与消息触达链路是否可靠。借助微信云开发环境,开发者可以免运维地使用云函数、文档型数据库与定时触发器&a…

2026/10/14 3:59:41 阅读更多 →
PyTorch深度学习实战:从动态计算图到模型部署的完整指南

PyTorch深度学习实战:从动态计算图到模型部署的完整指南

开篇先亮明我的态度:PyTorch这个框架,早就不只是“学术界玩具”了。如果你去翻各大厂的生产环境、顶会论文的复现代码、甚至Kaggle前排方案,十有八九跑的都是它。我最早从另一个框架转过来的时候,心里也犯嘀咕——动态图是不是太慢…

2026/10/14 3:59:41 阅读更多 →
SAS信号处理中停-走-停假设的局限与修正方法

SAS信号处理中停-走-停假设的局限与修正方法

1. SAS信号处理中的"停-走-停"假设概述合成孔径声呐(SAS)成像技术中,"停-走-停"假设是传统信号处理的基础模型。这个假设认为声呐平台在发射脉冲和接收回波时处于静止状态,实际运动只在脉冲间隔期间发生。听起来很理想化对吧&#x…

2026/10/14 3:58:41 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →