
1. 先摸清SDK的底细RV1126B移植前要理清的几个层次拿到一块RV1126B的板子第一件事不是急着编译而是先搞清楚SDK里哪些东西是需要你动的哪些是芯片原厂已经帮你兜底的。RV1126B是瑞芯微面向IPC、智能摄像头这类视觉场景的芯片集成了2T算力的NPU自带ISP和视频编解码单元整体定位就是一颗专门干视觉的SoC。它跑的是LinuxSDK是基于Buildroot那一套来组织的从Loader到内核再到根文件系统全部打在一个工程里。我第一次接触这颗芯片的时候最大的感受是SDK里东西很全但正因为全反而不知道该从哪里下手。后来我把整个启动链路拆开看才慢慢理清楚移植的本质工作就三件事让DDR跑稳、让外设认到、让sensor出图。USB调试虽然排在标题最后但往往是你前期排查问题的主要通道所以我会把它和系统启动、烧录放在一起讲。先说说SDK的目录结构概念。Rockchip的SDK一般包含这几个核心部分u-boot/负责早期初始化、DDR初始化、加载内核kernel/Linux内核包含所有外设驱动buildroot/根文件系统构建系统生成rootfsdevice/rockchip/各板级的配置文件、DTS设备树、BoardConfigrockdev/编译产物输出目录rkbin/瑞芯微的闭源bin集合包含ddr初始化代码、miniloader、ATF等这里我需要重点提醒一点DDR初始化的代码并不在u-boot/源码里而是在rkbin/里的闭源bin文件。Rockchip把DDR这一块做成了参数化的形式你拿到的DDR初始化镜像通常叫ddrbin是根据你的DDR颗粒参数生成的源码不可见你只需要通过官方工具配置参数。所以移植这件事其实可以分为几个层次Loader层idbloader包含DDR init和miniloader这一层决定你的DDR能不能工作U-Boot层决定存储、网络、USB这些能不能在启动早期用起来Kernel层决定最终系统里外设能不能工作sensor、USB、网口都在这层Buildroot/根文件系统层决定你调试手段全不全adb、串口工具、v4l2工具都靠它我刚拿到板子时犯过一个典型的错误拿到SDK就全量编译然后烧进去发现起不来串口log卡在DDR初始化根本不知道是DDR参数问题还是硬件焊接问题。后来养成的习惯是移植前先把硬件原理图从头到尾过一遍特别是DDR wiring、电源时序、USB的DP/DM走线、sensor的MCLK和复位引脚下到了哪个GPIO。这些信息会在你后面的配置中反复用到。配套的开发工具也要先准备齐全。Windows下用RKDevTool烧录Linux下用upgrade_toolDDR参数配置用瑞芯微的DDR Parameter工具有的版本叫DDR工具在SDK的tools目录里能找到或者找FAE要串口调试用minicom或PuTTY波特率一般是1500000。这些都是老熟人但每一样都可能在某个环节给你使绊子后面我会逐个提到。2. DDR配置三板斧1GB DDR3选型、初始化参数、内存跑稳2.1 RV1126B到底需要什么样的DDR3颗粒热搜里有个问题问得很实在rv1126b可用的ddr3内存1gb的有哪些。这个问题背后其实是很多硬件工程师刚接触RV1126B时的共同困惑——这颗芯片的DDR控制器对颗粒有什么要求怎么搭出1GB容量。RV1126B的DDR控制器支持DDR3、DDR3L、DDR4、LPDDR3、LPDDR4这些类型。做消费级IPC产品成本敏感DDR3L是当下的主流选择因为颗粒成熟、供货稳定、价格也友好。单颗DDR3的位宽一般是16bit容量有256Mb、512Mb、1Gb甚至2Gb的颗粒但要注意这里说的容量是以bit为单位的内部存储密度对应到我们拿到的一颗内存颗粒常见的规格是512MB x16bit这种写法意思是一颗512MB、数据总线16bit。RV1126B的DDR总线和大多数瑞芯微SoC一样需要32bit数据总线才能发挥完整带宽。所以1GB的标准方案就是2颗512MB x16的DDR3L颗粒拼出32bit总线、总容量1GB。当然也有4颗256MB x16的搭配但占板面积大、成本也没优势除非你手头有存量料否则不推荐。我整理了几个在RV1126B板子上比较常见的1GB DDR3方案都是经过实际项目验证过的品牌型号规格速率等级备注南亚NT5CC256M16ER-EKI512MB x16, DDR3L1866IPC方案里很常见镁光MT41K256M16HA-125512MB x16, DDR3L1600老牌型号稳定三星K4B4G1646E-BYMA512MB x16, DDR3L1866注意和DDR3E区分SK海力士H5TC4G63EFR-PBA512MB x16, DDR3L1866工业级有货华邦W632GU6NB-11512MB x16, DDR3L1600国产方案常用选型的时候有几个坑要提前避开。第一DDR3和DDR3L电压不同DDR3是1.5VDDR3L是1.35V如果原理图上DDR供电按照1.35V设计你千万别焊一颗DDR3上去工作不稳定是小事长期下来还会影响颗粒寿命。第二注意封装版本DDR3常用的78-ball BGA不同厂家引脚定义基本兼容但要确认你板子上的焊盘和物料封装对得上。第三尽量选瑞芯微DDR工具下拉列表里已有的型号如果没有你需要手动输入全套时序参数那才是真正的痛苦起点。2.2 DDR初始化参数在哪里配置、怎么填瑞芯微平台的DDR初始化流程是这样的芯片上电后固化在芯片内部的ROM先跑起来然后加载idbloader开头的DDR初始化bin这段代码负责把DDR控制器的寄存器按照你选的颗粒参数配置好然后才把U-Boot主程序加载到DDR里运行。所以DDR跑不跑得起来跟你u-boot源码改了多少没关系关键在DDR参数工具生成的那个bin文件。具体操作流程大致如下打开瑞芯微DDR Parameter工具选择芯片型号为RV1126B在DDR类型里选择DDR3L设定目标频率比如DDR3-1600频率就是800MHz因为是双倍速率填入颗粒厂商、密度512M x16、位宽、bank数、row/col地址位数等参数有些版本的工具有自动检测功能连接板子后可以直接读出非法DDR信息但不建议第一次就依赖它先把参数手工填对工具会生成一个ddrbin_param.bin之类的文件把它替换到SDK对应位置一般在rkbin或u-boot的配置目录下然后重新编译loader烧录进去看串口log。跑通之后你会在log里看到类似这样的信息DDR Version 1.16 20230315 In channel 0 DDR3-160M 10-10-10-28 Bus Width32 Col10 Bank8 Row15 CS1 Die Bus-Width16 Size1024MB这行log信息量很大它告诉你内存跑在DDR3-1600总线32bit列地址10位、行地址15位、单CS最终识别容量1024MB。如果这里显示的Size不对或者直接卡死在DDR版本号之后不动基本可以判定是DDR参数和实际颗粒不匹配。还有一点瑞芯微的DDR工具通常会让你填频率表也就是把从低到高的几个频率档都填进去。这是因为系统启动初期可能用低频跑再逐步提频。建议至少配置三档400MHz、800MHz、最高频率比如1866。如果你只填了最高档有些不成熟的板子在DDR训练阶段反而容易失败配一个低频兜底档能让启动更稳。2.3 U-Boot与内核DTS里的内存衔接DDR初始化bin跑通之后还有一个容易漏掉的环节U-Boot和内核的设备树里内存信息也得对上。虽然DDR控制器自己会检测容量但U-Boot和内核在某些场景下还会读取设备树里的memory节点来做内存布局比如给内核传参、预留CMA内存等。U-Boot的dts里一般有类似这样的节点memory1000000 { device_type memory; reg 0x0 0x01000000 0x0 0x40000000; };这里的reg第二段0x40000000就是1GB大小如果DDR实际是512MB这里要改成0x20000000。内核的dts里同样要检查Rockchip平台通常在/device/rockchip/rv1126b/这个目录下找到你对应板型的dts文件里面可能有memory-region这样的节点用来划分cma、iommu保留内存等。这些区域如果超过实际内存大小内核启动时会报错表现就是蓝牙、摄像头、GPU这类需要申请连续内存的模块起不来。我见过一个案例DDR实际只有512MB但内核dts里cma预留了0x20000000512MB导致系统启动后内存所剩无几rknpu驱动加载直接失败。排查了一整天才发现是dts里的内存预留参数没跟着实际DDR容量改。所以我的建议是DDR参数配置完成后顺手把U-Boot dts和内核dts里的内存相关节点全部过一遍确认和实际容量一致。这一条写进你的移植检查清单可以省掉后面很多莫名其妙的随机死机和驱动加载失败问题。3. 从DDR到系统启动U-Boot与内核移植的衔接细节DDR跑通只是第一步紧接着就是U-Boot能不能找到它想找的东西存储、网络、显示还有最关键的——能不能把内核镜像加载起来。RV1126B的启动介质一般用eMMC或SPI NOR Flash。U-Boot移植的重点是确认存储控制器时序、分区表和env参数这些配置分散在U-Boot的dts和defconfig里。编译U-Boot之前先确认板级配置。在SDK的U-Boot目录下执行make rv1126b_defconfig之前你需要确认这个defconfig对应的是你板子上的DDR、存储、外设配置。Rockchip的U-Boot中CONFIG_DEFAULT_FDT_FILE和CONFIG_DEFAULT_DEVICE_TREE这两个配置项决定了最终打包进U-Boot的DTS是哪一份。如果你的板子是基于公板改的最省事的做法是拷贝一份公板dts改名后放到arch/arm/dts/下再在defconfig里指定它。U-Boot阶段如果DDR参数没问题串口log会往下走到这里Net: eth0: ethernetffc90000 Hit any key to stop autoboot: 0看到Hit any key to stop autoboot说明U-Boot主体已经正常工作。如果卡在这一步之前比如MMC: no card present或者No ethernet found那是U-Boot dts里的外设节点没配对优先检查eMMC的时钟、复位、电源引脚配置以及SDIO/MMC控制器的reg地址是不是和硬件对得上。内核部分的移植我习惯按这个顺序走先编译一个最小配置只保证串口、内存、SD/MMC、USB host能用确认内核启动到根文件系统挂载成功再逐步添加sensor、WiFi、音频等外设驱动每加一个外设单独测试别一次全开内核dts里最容易出问题的几个点pinctrl引脚功能复用、regulator供电节点、clock时钟树。RV1126B的pinctrl配置规则和大部分Rockchip芯片一样在dts里通过pinctrl-0引用来描述。比如你要用一个GPIO控制sensor的reset脚需要确认这个GPIO有没有被其他外设复用否则sensor永远拉不起来。启动到内核后建议先用dmesg | grep -i err扫一遍把报错先处理掉。很多报错不影响启动但积累到一定程度会导致某些功能静默失效。比如rockchip-i2c报timeout waiting for bus可能意味着某条I2C总线上挂了一个地址冲突的设备或者总线被其他驱动占用了。这些都要在这个阶段解决别拖到后面做sensor调试时再回头查。另外U-Boot的env参数里bootargs的mem参数千万不要乱加。有些工程师为了给内核传内存大小在bootargs里写死mem512M后面如果换了大容量DDR系统只会用到512M这个坑很隐蔽排查起来极其浪费感情。正常Rockchip平台的内核是从DTS的memory节点自动获取内存大小的不需要也不建议在bootargs里手动限制。4. USB调试链路搭建烧录模式、ADB、驱动配置与排查USB调试这条链路是我在RV1126B移植过程中花时间最多、也最值得拿出来单独讲的一个环节。为什么因为前期板子没起来的时候唯一能和你交互的就是串口但串口速率低、不能传文件调试效率很低。而一旦USB通了你可以用ADB传文件、跑命令、抓log、看dmesg效率完全不是一个量级。4.1 烧录模式Loader和Maskrom的区别先讲烧录模式因为你第一次拿到板子最可能的操作就是烧录SDK默认镜像。RV1126B有几种USB相关的运行模式Normal模式正常启动连接USB后是一个ADB设备Loader模式预下载模式按住板上的RECOVERY/LOADER按键后上电芯片只加载DDR和miniloader不启动内核等待烧录工具下发镜像Maskrom模式连Loader都没能起来比如DDR参数错误芯片进入ROM引导状态此时可以用工具强制烧录板子上Loader模式的进入方法一般是先按住RECOVERY键不放再上电持续3秒左右松开。在Windows设备管理器里会看到一个USB设备Rockchip USB这就是进入Loader模式了。如果DDR初始化代码本身有问题连Loader模式都进不了芯片会掉到Maskrom模式这时候设备管理器里会显示Rockchip Maskrom。别慌这不是板子坏了只是DDR初始化bin还没调好Maskrom模式依然可以用工具烧录——只是烧录动作会先擦除原来错误的loader所以这种方式也被叫做救砖。Linux环境下用upgrade_tool操作先列设备upgrade_tool L然后整体烧录upgrade_tool uf update.img如果是单独的loader镜像用upgrade_tool ld xxx.bin。Windows下RKDevTool的操作逻辑一样界面上分Loader模式和Maskrom模式两个烧录分区。这里有一个我踩过的坑板子第一次连接电脑无法识别为Rockchip USB设备用的是一根只能充电不能传数据的USB线。这个低级错误导致我一度以为是板子USB PHY供电有问题浪费了大半天。换了一根正经的数据线之后秒识别。USB调试出问题先换线再排查驱动这是第一原则。4.2 系统起来之后如果让ADB工作起来系统正常启动之后USB OTG口默认应该枚举成一个ADB设备。RV1126B的USB OTG控制器是DWC2具体看SDK版本内核里对应的驱动节点在dts里长这样usbdrd_dwc3 { status okay; dr_mode otg; extcon u2phy0; }; usb_host0_ehci { status okay; };如果你的板子USB口没反应按这个顺序排查看内核logdmesg | grep -i dwc3确认控制器有没有probe成功看PHYdmesg | grep -i phyU2PHY有没有正常工作供电和时钟是否配好看gadgetls /sys/kernel/config/usb_gadget/如果目录存在说明configfs支持已开启看adbd进程ps aux | grep adbd确认adbd有没有跑起来Rockchip的Linux SDK默认会通过init脚本把usb_gadget配置好核心逻辑是挂载configfs创建gadget目录然后设置VID/PID、创建ADB function并绑定到配置里。如果系统默认没有启动adbd你可以手动配置mount -t configfs none /sys/kernel/config mkdir /sys/kernel/config/usb_gadget/rk cd /sys/kernel/config/usb_gadget/rk echo 0x2207 idVendor echo 0x0010 idProduct mkdir functions/ffs.adb mkdir configs/c.1 ln -s functions/ffs.adb configs/c.1/然后启动adbd/usr/bin/adbd 连接电脑后执行adb devices如果有xxxxxxx device输出说明ADB链路已通。如果显示unauthorized那是电脑端adb的公钥指纹没确认在adb对话框里允许即可。如果是Linux开发机还要确保udev规则里有瑞芯微的VID0x2207否则adb会提示no permissions需要加一条规则echo SUBSYSTEMusb, ATTR{idVendor}2207, MODE0666 /etc/udev/rules.d/51-rockchip.rules udevadm control --reload4.3 USB枚举失败与不稳定问题的排查思路最常见的USB问题有两类。第一类是插上电脑完全没反应设备管理器里连未知设备都没有。这种基本是硬件层的问题VBUS没供上、DP/DM差分线接反或断开、PHY的模拟供电没打开。软件上能查的有限优先确认dts里USB PHY节点有没有status okay以及电源LDO有没有给PHY供上电。如果PHY配置正常但依然没反应用示波器量USB D/D-上的波形没有波形基本上就是硬件问题。第二类是能识别但一传数据就断或者烧录工具写了一半报错。这种多半是信号完整性问题USB DP/DM走线过长、地平面不连续、或者VBUS电容没焊。当然也不要排除dts里PHY的tuning参数问题有时候减小驱动强度可以缓解不稳定但这是治标不治本真正原因大概率还是layout。还有一类运行时的诡异问题系统跑了好几个小时ADB突然断开然后重连此后再也不稳定。这种我倾向怀疑是USB PHY进入了低功耗模式而驱动的电源管理策略有bug。排查方法是在内核dts里把usb控制器节点加上pm_qos限制或者直接关闭runtime PMusbdrd_dwc3 { status okay; pm_qos 5; };Rockchip的某些内核版本里DWC3的runtime PM和extcon的交互确实有坑把pm_qos设为0可以强制不休眠。这个参数视SDK版本而定建议查一下你的SDK内核里是否有相关字段如果没有直接改驱动代码里对应runtime_suspend的调用也可以。5. sensor接入让ISP真正出图热搜里另一个高频词是rv1126b sensor。RV1126B干的就是视觉的活所以sensor接入是几乎所有项目都会遇到的需求。sensor这部分涉及硬件接口、内核驱动、ISP调优三块任何一个环节有问题最终结果都是不出图。5.1 选型参考哪些sensor配RV1126B比较顺RV1126B的ISP对各种sensor的适配性不错常见的IPC类sensor基本都有现成的驱动。我列几个在RV1126B项目里比较常见的型号给选型做个参考Sensor分辨率接口像素尺寸典型场景GC20532MPMIPI 1/2-lane2.8um入门级IPCSC33363MPMIPI 2-lane3.0um性价比方案OV56475MPMIPI 2-lane1.4um树莓派老搭档IMX2912MPMIPI 1-lane2.9um星光级低照度JX-H654MPMIPI 2-lane2.0um中端IPC选sensor时要先确认你的ISP和MIPI controller支不支持这个分辨率、lane数、虚拟通道数。RV1126B的MIPI CSI一般支持2-lane或4-lanesensor的MIPI lane数、速率要和SoC侧匹配速率太高可能过不了信号完整性校验。驱动方面Rockchip SDK的kernel里已经带了不少主流sensor驱动位置在kernel/drivers/media/i2c/下。如果你选型的sensor刚好有驱动那就省事很多。没有的话SDK里通常有类似型号可以改比如GC2053改GC2063大部分寄存器映射是兼容的但要仔细对照datasheet。5.2 DTS配置从电源到MCLK一个都不能漏sensor在设备树里要配置的东西比想象中多。以一个典型的MIPI sensor节点为例i2c2 { status okay; clock-frequency 400000; gc2053: gc205337 { compatible galaxycore,gc2053; reg 0x37; pinctrl-names default; pinctrl-0 gc2053_pwdn gc2053_rst; reset-gpios gpio2 RK_PB6 GPIO_ACTIVE_LOW; pwdn-gpios gpio2 RK_PB5 GPIO_ACTIVE_HIGH; rockchip,camera-module-index 0; rockchip,camera-module-facing back; rockchip,camera-module-name CMK-OT1972-6B30; rockchip,camera-module-lens-name default-lens; port { gc2053_out: endpoint { remote-endpoint mipi_in_ucam0; >media-ctl -p你会看到类似这样的节点列表sensor的entity、csi2的entity、isp的entity都在里面。确认sensor entity存在的下一步是设置格式把sensor输出格式配成它支持的格式比如UYVY 8bit、1920x1080media-ctl -v -V gc2053 2-0037:0[fmt:UYVY8_2X8/1920x1080] media-ctl -v -V mipi-csi2:0[fmt:UYVY8_2X8/1920x1080]然后是抓帧v4l2-ctl --device /dev/video0 --set-fmt-videowidth1920,height1080,pixelformatNV12 --stream-mmap --stream-count1 --stream-toframe.raw抓下来之后把frame.raw拉回电脑用YUV查看工具看一眼。如果能看到画面但颜色不对或者画面有彩条那是ISP参数没调好需要做3A校准如果是全黑或者全绿多半是sensor寄存器初始化序列不对或者MIPI时序没配好优先查dmesg | grep -i mipi和dmesg | grep -i isp。sensor的不出图问题80%出在供电或MCLK上10%出在I2C地址或复位时序剩下10%才是MIPI和ISP的配置。所以排查的时候别一开始就冲着寄存器去先用万用表和示波器量硬件硬件没问题再查软件。这个排查顺序基本能让你少走一半弯路。6. 移植路上值得记下来的坑位清单与排查顺序写到这里把我这些年在RV1126B以及类似Rockchip平台上踩过、或亲眼见过的坑集中整理一下。它们单独出现时都很好解决但一旦叠加在一起很容易让人怀疑人生。关于DDR的坑选了DDR3L颗粒但DDR参数工具里选成了DDR3启动能起来但长时间运行偶发死机。这种问题最难查因为不是必现的跑压力测试跑几个小时才崩一次。排查时建议用memtester或stressapptest跑至少12小时能过再放量。频率档里只填了最高档DDR训练偶发失败。启动log有时能过有时卡死看起来就像硬件接触不良。实际上把低频档配回来就稳定了。容量识别出来只有512MB实际焊了1GB。原因多半是DDR参数里Bank或Row/Col地址位数填少了控制器寻址范围不够。关于USB的坑ADB能识别但烧录不了镜像。检查USB线是否支持OTG有些线只支持host侧供电device模式插上会被识别成未知设备。Linux开发机上adb devices显示no permissions。udev规则没配好加一条0x2207的规则即可。烧录到一半报USB通信失败。优先怀疑USB走线过长导致信号劣化试试把烧录波特率降到低速工具的低格选项就是干这个的。dmesg里报dwc2_hsotg_ep0: timeout但设备又能在设备管理器里看到。这种一般是gadget曲线配置有问题重新走一遍configfs配置流程。关于sensor的坑I2C不通但电压、MCLK都正常。检查reset/pwdn两个GPIO的active电平很多sensor的pwdn是高电平时工作低电平是掉电dts里的GPIO_ACTIVE_HIGH/LOW对应关系一定要对着sensor datasheet逐字核对。MIPI信号已配置为2-lane但sensor寄存器初始化里设置的是4-lane输出导致ISP收不到有效数据。sensor自身的寄存器初始化和dts lane配置必须一致。出图了但画面有横向条纹。大概率是MCLK频率和sensor输出像素时钟关系不对检查sensor的PLL配置和MCLK实际频率用示波器量一下MCLK24MHz标称值实际跑成24.5MHz也会导致花屏。关于启动链路的坑内核起来了但rootfs挂载失败提示VFS: Unable to mount root fs。检查rootfs镜像格式和bootargs里的root参数Rockchip SDK的rootfs一般是ext4或squashfsbootargs要对应。U-Boot的env里bootcmd指向的boot分区偏移和实际烧录位置不一致导致每次启动都进不了内核。烧录之前用upgrade_tool df看一下分区表和U-Boot env里的partitions变量对一遍。系统跑了几天发现日期不对、时间总是回到1970这是RTC没配好可以用i2c外接一个RTC芯片也可以直接用SoC内部的RTC但要把对应的PMU电源在dts里打开。调试工具方面我的建议是串口log和dmesg永远开着别关。很多偶发问题需要翻历史log如果没有完整log问题重现一次的时间成本会非常高昂。加一个dmesg -n 7让所有级别的log都输出到串口量大的时候用CRT或minicom的scrollback buffer兜底。另外在rootfs里提前放好这些命令i2cdetect、media-ctl、v4l2-ctl、memtester、stressapptest、adb。这些工具在你调试的时候每一样都会救你的命。回到开头那句话RV1126B的SDK移植本质上就是在跟启动链路的每一层打交道。DDR配置是地基地基不稳后面全白搭USB是手脚手脚不灵效率就上不去sensor是眼睛眼睛不亮这个芯片存在的意义就没了。按这个顺序逐层打通每一步都做好验证再往下走整个移植过程其实没有真正意义上难到卡死的坎。