RK3566 MIPI Camera 驱动调试:从 DTS 到 /dev/video0 全链路解析
简介本资源是一套面向嵌入式Linux驱动开发者的RK3566平台MIPI Camera内核驱动实战代码包适用于具备C语言基础与Linux内核模块开发经验的中高级工程师聚焦于RGBD相机如S5K33D、GC2053、SC2310等在瑞芯微平台上的底层适配与调试。压缩包共25个文件含18个核心C源文件涵盖不同帧率、AE模式及多传感器适配驱动如33d_60fps_ae、33d_30fps_no_ae、gc2053.c等和7个说明类TXT文档完整呈现驱动注册、设备树绑定、V4L2接口对接及交叉验证过程总大小仅220KB轻量但结构完整。已有918人学习下载适合用于快速复现MIPI摄像头Bring-up、理解Rockchip平台Camera子系统架构、参考自研驱动开发流程及常见问题调试路径。1. RK3566 上跑通 MIPI Camera 不是“插上线就能用”内核驱动才是图像流的真正闸门你手上有块 RK3566 开发板接了 OV5640 或 GC2053 这类主流 MIPI CSI-2 摄像头模组dmesg里能看到 sensor 被识别、clock 被 enable但v4l2-ctl --list-devices却空空如也gst-launch-1.0 v4l2src ! autovideosink直接报错“No such device”。这不是硬件坏了也不是你没装 gstreamer 插件——而是MIPI Camera 的内核驱动链没闭合从 PHY 层 clock/reset 控制、CSI host controller 初始化、到 sensor probe 和 subdev 注册再到 video device 节点生成缺一环整条图像通路就卡死在黑匣子里。本文讲的不是“怎么用 OpenCV 读摄像头”而是如何用 C 语言在 Linux 内核里亲手焊牢这条通路从 RK3566 的 ISP 子系统架构出发定位驱动缺失点补全 platform device 绑定、clock gating 配置、MIPI lane 数与 timing 校准、以及 sensor driver 中 v4l2_async_notifier 的正确注册方式。适合正在调试 RK3566 摄像头却卡在/dev/video0不出现的嵌入式工程师、Linux 驱动初学者以及需要把定制 camera 模组稳定接入 Ubuntu 22.04RK3566 平台的量产项目开发者。不讲抽象概念只拆真实代码段、参数含义和 dmesg 里每行报错背后的逻辑。2. 理清 RK3566 MIPI Camera 驱动栈为什么必须从 DTS 入口开始改RK3566 的 MIPI Camera 驱动不是单个.c文件能搞定的它是一条横跨设备树DTS、platform driver、CSI host controller driver、sensor driver 和 v4l2 core 的协作链。跳过 DTS 直接写 sensor driver90% 的人会发现 probe 函数根本没被调用——因为内核压根不知道你的 sensor 接在哪条 CSI bus 上。所以第一步永远是从设备树入口开始逆向定位。2.1 RK3566 DTS 中 MIPI CSI 子系统的标准结构RK3566 SDK如 Rockchip Linux SDK v1.0中MIPI CSI host controller 定义在arch/arm64/boot/dts/rockchip/rk3566.dtsi里关键节点是mipi_csi2mipi_csi2: csife410000 { compatible rockchip,rk3566-mipi-csi2; reg 0x0 0xfe410000 0x0 0x1000; interrupts GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH; clocks cru CLK_CSI0_MCLK, cru CLK_CSI0_PHY_REF, cru CLK_CSI0_HCLK, cru CLK_CSI0_PCLK; clock-names mclk, phy-ref, hclk, pclk; #address-cells 1; #size-cells 0; ranges; };注意三点reg地址0xfe410000是 CSI0 host controller 的寄存器基址不是 sensor 地址clocks列出了 4 个必需时钟源其中CLK_CSI0_MCLK是给 sensor 的主时钟通常需配置为 24MHz 或 37.125MHzCLK_CSI0_PHY_REF是 MIPI PHY 的参考时钟固定 100MHz#address-cells 1表明其子节点即 sensor将用一个 address如0标识挂载位置。2.2 在 board DTS 中绑定 sensorOV5640 示例以常见 OV5640 模组为例在rk3566-evb.dts或你的板级 dts中添加mipi_csi2 { status okay; ov5640_mipi: ov56403c { compatible ovti,ov5640; reg 0x3c; // I2C 地址注意不是 MIPI 地址这是 I2C 控制通道 clocks cru CLK_CIF_OUT; clock-names xvclk; dvdd-supply vcc_1v8; avdd-supply vcc_2v8; dovdd-supply vcc_1v2; reset-gpios gpio4 1 GPIO_ACTIVE_LOW; // GPIO4_B1低电平复位 pwdn-gpios gpio4 2 GPIO_ACTIVE_HIGH; // GPIO4_B2高电平休眠 port { ov5640_mipi_in: endpoint { remote-endpoint mipi_out; >static int ov5640_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct ov5640 *ov5640; int ret; ov5640 devm_kzalloc(client-dev, sizeof(*ov5640), GFP_KERNEL); if (!ov5640) return -ENOMEM; ov5640-client client; v4l2_i2c_subdev_init(ov5640-subdev, client, ov5640_subdev_ops); /* 1. 获取 regulator电源 */ ov5640-dvdd devm_regulator_get(client-dev, dvdd); ov5640-avdd devm_regulator_get(client-dev, avdd); ov5640-dovdd devm_regulator_get(client-dev, dovdd); if (IS_ERR(ov5640-dvdd) || IS_ERR(ov5640-avdd) || IS_ERR(ov5640-dovdd)) { dev_err(client-dev, failed to get regulators\n); return PTR_ERR(ov5640-dvdd); } /* 2. 获取 clockXVCLK */ ov5640-xvclk devm_clk_get(client-dev, xvclk); if (IS_ERR(ov5640-xvclk)) { dev_err(client-dev, failed to get xvclk\n); return PTR_ERR(ov5640-xvclk); } /* 3. 获取 reset/pwdn GPIO */ ov5640-reset_gpio devm_gpiod_get_optional(client-dev, reset, GPIOD_OUT_LOW); ov5640-pwdn_gpio devm_gpiod_get_optional(client-dev, pwdn, GPIOD_OUT_HIGH); if (IS_ERR(ov5640-reset_gpio) || IS_ERR(ov5640-pwdn_gpio)) { dev_err(client-dev, failed to get gpios\n); return PTR_ERR(ov5640-reset_gpio); } /* 4. 上电序列按 DVDD → AVDD → DOVDD → XVCLK 顺序 */ ret regulator_enable(ov5640-dvdd); if (ret) goto err_regulator; usleep_range(1000, 2000); // 等待 DVDD 稳定 ret regulator_enable(ov5640-avdd); if (ret) goto err_dvdd; usleep_range(1000, 2000); ret regulator_enable(ov5640-dovdd); if (ret) goto err_avdd; usleep_range(1000, 2000); ret clk_prepare_enable(ov5640-xvclk); if (ret) goto err_dovdd; usleep_range(1000, 2000); /* 5. 复位 sensor */ if (ov5640-reset_gpio) { gpiod_set_value_cansleep(ov5640-reset_gpio, 0); // active low usleep_range(10000, 15000); gpiod_set_value_cansleep(ov5640-reset_gpio, 1); usleep_range(5000, 10000); } /* 6. 初始化 sensor 寄存器重点MIPI timing */ ret ov5640_s_power(ov5640-subdev, 1); if (ret) goto err_clk; /* 7. 注册 v4l2_subdev */ ret v4l2_async_register_subdev(ov5640-subdev); if (ret) { dev_err(client-dev, v4l2_async_register_subdev failed\n); goto err_clk; } i2c_set_clientdata(client, ov5640); return 0; err_clk: clk_disable_unprepare(ov5640-xvclk); err_dovdd: regulator_disable(ov5640-dovdd); err_avdd: regulator_disable(ov5640-avdd); err_dvdd: regulator_disable(ov5640-dvdd); err_regulator: return ret; }逻辑说明v4l2_i2c_subdev_init()初始化 subdev 结构体并绑定ov5640_subdev_ops含s_stream,s_power,ioctl等回调regulator 和 clock 获取必须用devm_*系列函数确保资源自动释放上电顺序不可颠倒DVDD数字电源→ AVDD模拟电源→ DOVDDIO 电源→ XVCLK时钟否则 sensor 可能锁死ov5640_s_power(1)是关键它调用ov5640_write_reg()写入 sensor 寄存器配置 MIPI 输出格式如0x0100设置为 MIPI mode、lane 数、data rate如0x303a设置 PHY timing等这部分需严格参照 OV5640 datasheetv4l2_async_register_subdev()是整个链路的“点火开关”它触发 v4l2 async framework 搜索匹配的v4l2_async_notifier由 CSI host driver 提供一旦匹配成功host driver 就会调用subdev-ops-s_power(1)并创建/dev/video0。3.2 MIPI timing 配置data rate 与 PHY register 的硬编码陷阱OV5640 的 MIPI data rate 由寄存器0x303aPHY timing control决定其值计算公式为data_rate (xvclk_freq * pll_multiplier) / (2 * pre_divider * feedback_divider)常见配置XVCLK24MHz0x303a 0x000a→ data rate ≈ 450Mbps/lane0x303a 0x000c→ data rate ≈ 540Mbps/lane但不能直接写死0x303a因为 RK3566 CSI host driver 会根据>mipi_csi2 { rockchip,data-lanes 2; rockchip,max-data-rate 540; // 单 lane Mbps ... };4.2rkisp1_csi2的 clock gating 修复RK3566 的 CSI host controller 依赖多个 clock但 SDK 中rkisp1_csi2_clk_enable()存在 race condition它在phy_init前使能 clock而 PHY 需要 clock 稳定后才能 lock。现象是dmesg显示rkisp1-csi2 fe410000.csi: phy init fail重试几次偶尔成功。血泪经验是在rkisp1_csi2_phy_init()前插入 10us 延迟// drivers/media/platform/rockchip/isp/rkisp1_csi2.c static int rkisp1_csi2_phy_init(struct rkisp1_csi2_dev *csi2) { int ret; ret clk_prepare_enable(csi2-clks[CLK_PHY]); if (ret) return ret; udelay(10); // 关键修复等待 PHY clock 稳定 ret phy_init(csi2-phy); if (ret) { clk_disable_unprepare(csi2-clks[CLK_PHY]); return ret; } ... }4.3 video device 节点生成逻辑为什么/dev/video0总是不出现rkisp1_csi2创建 video device 的条件是v4l2_async_register_subdev()成功且 host driver 收到subdev-ops-s_power(1)rkisp1_csi2_start_streaming()被调用通常由v4l2_ioctl的VIDIOC_STREAMON触发rkisp1_csi2的video_device结构体已初始化并注册。若/dev/video0不出现90% 是第 1 步失败。排查命令# 查看 async framework 是否匹配 dmesg | grep -i async # 应看到 asynchronous subdev ov56403c bound to rkisp1-csi2 # 查看 subdev 是否注册 ls /sys/bus/i2c/drivers/ov5640/ # 应有设备目录 # 查看 video device 是否注册 ls /sys/class/video4linux/ # 若为空说明 rkisp1_csi2 未创建 vdev常见原因DTS 中remote-endpoint连接错误或ov5640_s_power()返回负值寄存器写失败。此时dmesg会显示rkisp1-csi2: subdev power on failed。5. 避坑RK3566 MIPI Camera 驱动开发的 4 个致命翻车点开发 RK3566 MIPI Camera 驱动时以下问题几乎每个工程师都踩过且 debug 成本极高。这里按“现象 → 原因 → 解决”给出可立即执行的方案。5.1 现象dmesg显示ov5640 1-003c: Failed to read chip idprobe 失败原因I2C 通信失败。可能因I2C bus 速率过高OV5640 最大支持 400kHz但 SDK 默认 1MHzI2C pull-up 电阻缺失或阻值过大推荐 4.7kΩcompatible字符串与 driverof_match_table不匹配如写成ovti,ov5640但 driver 中是ovti,ov5640_mipi。解决在 DTS 的 I2C controller 节点中强制限速i2c2 { clock-frequency 400000; status okay; };用万用表测 I2C SDA/SCL 对地电压确认 pull-up 有效应为 1.8V 或 3.3V检查 driver 的of_match_tablestatic const struct of_device_id ov5640_of_match[] { { .compatible ovti,ov5640 }, // 必须与 DTS 中完全一致 { /* sentinel */ } };5.2 现象dmesg显示rkisp1-csi2 fe410000.csi: phy init fail反复重试原因MIPI PHY 初始化超时。根源通常是>dev_info(csi2-dev, mclk rate: %lu, phy-ref rate: %lu, clk_get_rate(csi2-clks[CLK_MCLK]), clk_get_rate(csi2-clks[CLK_PHY_REF]));确认phy-ref为 100MHzmclk为 24MHz。5.3 现象v4l2-ctl --list-formats-ext显示格式但gst-launch-1.0 v4l2src ! ...报Buffer has no timestamp原因sensor 未正确输出 frame sync 信号VSYNC/HSYNC或rkisp1_csi2未配置 embedded data如 SOF/EoF。OV5640 默认输出 embedded data但 RK3566 driver 需显式启用。解决在ov5640_s_stream()中写入寄存器启用 embedded data// OV5640 寄存器 0x300a 控制 embedded data ov5640_write_reg(client, 0x300a, 0x0001); // enable embedded data并在rkisp1_csi2driver 的rkisp1_csi2_start_streaming()中确保csi2-embedded_data为 true。5.4 现象Ubuntu 22.04 下modprobe rkisp1_csi2报Unknown symbol in module原因RK3566 kernel config 中CONFIG_VIDEO_ROCKCHIP_ISP1未启用或CONFIG_MEDIA_SUPPORT、CONFIG_V4L_PLATFORM_DRIVERS等依赖项缺失。Ubuntu 22.04 的 generic kernel 不含 rkisp1 driver。解决必须使用 Rockchip 官方 kernel如kernel-rockchip-5.10make menuconfig确保以下选项为*built-in或mmoduleDevice Drivers --- * Multimedia support --- * Video capture adapters --- * Rockchip ISP1 driver * Rockchip MIPI CSI2 driver编译时指定ARCHarm64 CROSS_COMPILEaarch64-linux-gnu-生成rkisp1_csi2.ko后insmod。6. 验证与调优用v4l2-ctl和rkisp1工具链闭环验证驱动写完不等于能用必须用工具链验证每一层是否真正打通。RK3566 提供rkisp1工具集位于tools/isp/比通用v4l2-ctl更能暴露底层问题。6.1 分层验证法从 sensor 到 video device按顺序执行以下命令任一环节失败即定位故障层步骤命令预期输出故障定位1. I2C 通信i2cdetect -y 23c地址可见I2C bus 或 sensor 供电问题2. sensor probedmesggrep ov5640probedregistered as subdevice3. subdev 注册ls /sys/bus/i2c/devices/2-003c/of_node,name等文件存在v4l2_subdev 初始化失败4. video devicels /dev/video*/dev/video0出现rkisp1_csi2 未创建 vdev5. 格式协商v4l2-ctl -d /dev/video0 --list-formats-ext列出UYVY,RGB3等格式sensor 寄存器未正确配置 MIPI mode6. 流启动v4l2-ctl -d /dev/video0 --stream-mmap --stream-count10输出 10 帧 raw dataDMA 或 buffer allocation 失败提示--stream-mmap是最严苛测试它绕过 userspace buffer copy直接 mmap kernel buffer。若此处失败大概率是rkisp1_csi2的vb2_queue_init()或dma_alloc_coherent()问题需检查CONFIG_DMA_CMA是否启用及 CMA 区域大小建议cma256M。6.2rkisp1工具链深度诊断Rockchip 提供rkisp1专用工具位于 SDK 的tools/isp/目录编译后可获取 CSI link 状态# 编译工具需 arm64 交叉编译链 cd tools/isp make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- # 查看 CSI link 状态 ./rkisp1 -d /dev/video0 -c status # 输出示例 # CSI0 link status: OK # PHY lanes: 2, data rate: 540 Mbps/lane # Frame counter: 12345 # Errors: 0 # 抓取一帧 raw data 并保存为 yuv422 ./rkisp1 -d /dev/video0 -c capture -f yuv422 -o frame.yuv -n 1若status显示Errors 0说明 MIPI link 有 CRC error 或 sync loss需检查PCB 上 MIPI trace 长度是否匹配差分对长度差 5milsensor 的0x303aPHY timing 是否与 host driver 的max-data-rate一致clock-noncontinuous是否启用OV5640 必须。6.3 实战技巧用dmesg -w实时监控驱动状态开发时我习惯开两个终端终端1dmesg -w | grep -i csi\|ov5640\|rkisp实时过滤关键日志终端2执行modprobe -r ov5640; modprobe ov5640触发 probe观察日志流。重点关注三类信息probe成功后是否有v4l2_async_register_subdev: registered as ...rkisp1-csi2是否打印subdev bound和streaming startvideo_register_device是否成功以及/dev/video0的 minor number如video0: registered as /dev/video0。如果dmesg里没有video_register_device说明rkisp1_csi2的video_register_device()调用失败99% 是video_device结构体的.fops或.ioctl_ops未正确初始化需回查rkisp1_csi2_videodev_init()函数。最后说个血泪教训RK3566 的 MIPI CSI 驱动高度依赖 SDK 版本。我曾在一个基于 kernel 5.10 的旧 SDK 上调试成功升级到 5.10.118 后rkisp1_csi2的 clock handling 逻辑变更导致phy_init失败。解决方案不是降级 kernel而是仔细比对drivers/media/platform/rockchip/isp/目录下rkisp1_csi2.c的 diff尤其关注clk_prepare_enable()和phy_init()的调用顺序。嵌入式驱动开发没有银弹只有耐心读代码、看日志、量波形。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Amazon与Confluence协议级爬虫实战:绕过反爬与权限校验

Amazon与Confluence协议级爬虫实战:绕过反爬与权限校验

简介:本资源是一套面向Python中级开发者与数据采集实践者的多站点爬虫项目代码包,聚焦Amazon商品信息与Confluence企业知识库等典型场景的数据抓取需求,解决动态渲染、登录鉴权、反爬绕过等实战难点。压缩包共41个文件,含31个核心…

2026/10/7 10:42:25 阅读更多 →
Hi3519DV500:4K+AI视觉系统中ISP与NPU协同设计实战

Hi3519DV500:4K+AI视觉系统中ISP与NPU协同设计实战

1. 项目概述:一块芯片如何撑起4KAI视觉的完整链路 Hi3519DV500不是一块“普通开发板”,它是海思在2022年推出的面向边缘智能视觉场景的旗舰级SoC,定位非常明确——不做通用计算,专攻“看得清、判得准、跑得稳”这三件事。我第一次…

2026/10/7 10:42:25 阅读更多 →
校园招聘系统毕业设计实战:SpringBoot+Vue技术栈详解

校园招聘系统毕业设计实战:SpringBoot+Vue技术栈详解

这个题目在每年的毕业设计清单里几乎都不会缺席,原因很简单:话题安全、需求明确、技术栈主流,往届资料也多。但真正动手做过的同学都知道,从“看起来简单”到“跑通、能演示、能答辩”之间,隔着很多看不见的坑。我当年…

2026/10/7 10:42:25 阅读更多 →

最新新闻

嘉立创EDA的AI功能实测:智能生成、查错与自动布线效率提升指南

嘉立创EDA的AI功能实测:智能生成、查错与自动布线效率提升指南

1. 从一次画板子说起:嘉立创EDA的AI功能到底能干什么画PCB这件事,十年前我刚入行的时候,基本就是“手搓”两个字。原理图一笔一笔连,封装一个一个对,布线全靠经验和直觉,一块双层板磨两三天是常态。后来国产…

2026/10/7 11:14:00 阅读更多 →
phpstudy下MySQL服务启动失败?从日志到端口全排查指南

phpstudy下MySQL服务启动失败?从日志到端口全排查指南

phpstudy 里 MySQL 服务启动失败,这应该是国内 PHP 开发者本地环境里出现频率最高的问题之一。“MySQL服务无法启动”的提示,几乎每个用过 phpstudy 的人都被弹过,网上一搜同款问题能出来几十页。可真轮到自己处理时,很多人第一反…

2026/10/7 11:14:00 阅读更多 →
免费商务演示PPT视频素材全攻略:从选材到AI生成与高清导出

免费商务演示PPT视频素材全攻略:从选材到AI生成与高清导出

商务方案、技术培训、行业分享,这几年我经手的PPT少说也有几百份。最常遇到的状态不是“不会做”,而是“没素材”:方案写得很扎实,但打开第一页就透着一股敷衍感——背景是默认白色,排版是送风模板,整个电脑…

2026/10/7 11:14:00 阅读更多 →
AI Agent技能系统实战:从散装函数到可编排、稳定执行的技术路径

AI Agent技能系统实战:从散装函数到可编排、稳定执行的技术路径

做AI Agent开发的人,这两年应该都有一个共同的体感:模型能力越来越强,但真正让Agent“干活”的部分,反而越来越成为瓶颈。你给模型一堆工具函数,它调用起来总是差那么点意思——要么参数传错,要么流程走偏&…

2026/10/7 11:14:00 阅读更多 →
Agent-Reach:让智能体真正“够得着”真实世界的工程实践

Agent-Reach:让智能体真正“够得着”真实世界的工程实践

去年年底我在内部跑完一轮 Agent 项目复盘后,把整套方案单独抽出来,起名叫Agent-Reach。名字里的 Agent 不用解释,Reach 才是我想表达的东西——英文里 reach 是“触达、够得着”,但放到 AI Agent 的开发语境里,它其实…

2026/10/7 11:14:00 阅读更多 →
AWS 文档示例库中的 Amazon SES v2 优惠券周刊邮件场景:从联系人列表到模板化群发的完整实践指南

AWS 文档示例库中的 Amazon SES v2 优惠券周刊邮件场景:从联系人列表到模板化群发的完整实践指南

示例工程教程后端 【免费下载链接】aws-doc-sdk-examples Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below. 项目地…

2026/10/7 11:12:59 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

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

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

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

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

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

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 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/6 8:21:32 阅读更多 →
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/6 4:21:51 阅读更多 →
黑夜航拍船只数据集训练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/6 1:18:13 阅读更多 →