ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RK3568 MIPI转LVDS调试全攻略:从Kernel到UEFI点亮屏幕

RK3568 MIPI转LVDS调试全攻略:从Kernel到UEFI点亮屏幕 做嵌入式显示调试这行最怕听到的一句话就是“板子回来了屏幕不亮”。这不光是工程量的问题更糟心的是你不知道该从哪查起是SoC没输出桥接芯片没配置还是屏参不对如果把这个问题放到“MIPI转LVDS”这个特定场景里情况还要再复杂一层。我手上这个项目就是典型主控是瑞芯微RK3568屏幕是一块工控常用的17寸LVDS屏分辨率1366x768接口却只有MIPI DSI输出。一边是SoC原生只出MIPI一边是屏厂只认LVDS中间只能挂一颗转接桥。更头疼的是客户要求开机就要看到Logo这意味着不只Linux内核里要把它点亮UEFI/固件阶段就得让屏幕工作起来。这篇文章就把我从Kernel到UEFI完整点亮的全过程拆开讲一遍包括芯片选型、硬件设计的坑、设备树和驱动配置、波形实测的排查方法以及最后怎么把初始化时序搬进BIOS的VBT。全程不带水分全是实际项目里验证过的套路和教训适合正在做MIPI转LVDS调试、或者打算把显示点亮流程从OS下移到固件阶段的工程师参考。1. 为什么非要挂一颗桥接芯片方案选型的门道先说清楚一个底层矛盾现在主流的应用处理器瑞芯微、全志、高通、MTK显示控制器几乎全都是MIPI DSI接口输出有的还保留了RGB或LVDS但数量和配置都受限。而工控、医疗、车载这些领域存量最大的屏幕偏偏是LVDS接口——它们耐高温、抗干扰、寿命长已经在产线上跑了十几年了。两边标准不同又不能互相直连唯一的路就是加一颗MIPI转LVDS的桥接芯片。桥接芯片的本质两个功能第一把MIPI DSI的高速串行包解码成并行的RGB数据和同步信号第二再按照LVDS规范把并行数据重新编码成差分串行信号发给屏端的LVDS接收器。整个过程对SoC来说是透明无感的——SoC只当自己在驱动一块MIPI屏而屏端只当自己连了一个原生LVDS主控。市面上的方案我大致可分三类芯片型号厂商DSI LaneLVDS通道典型能力主要印象LT8912B龙迅1/2/4 Lane单/双通道1080P60Hz国产方案资料全RK/全志平台例子多TC358775东芝4 Lane单/双通道1080P60Hz老牌寄存器复杂资料偏日文SN65DSI84TI4 Lane单通道1080P60Hz可靠性好但只有单通道LVDS输出LT9211龙迅4 Lane单/双通道4K60Hz带HDR处理适合高端屏我当时选了LT8912B理由很现实RK3568的官方SDK里有现成的适配案例龙迅的FAE响应也快遇到问题能拉到人一起看波形。在这个领域技术支持力度往往比芯片本身那几毫瓦功耗差异重要得多。选型还有一个经常被忽略的点接口方式。有的桥接芯片配置走I2C有的走I2CSPI有的是寄存器映射式有的是流式配置。如果板子上还有别的I2C设备就要确认地址有没有冲突、速率要求是不是一致。LT8912B是纯I2C配置默认地址0x487bit挂在I2C2上和触摸芯片错开这个就清爽很多。另外展频时钟SSC也要考虑。有些SoC为了让MIPI信号过EMC测试默认开了扩频扩频比例可能到±0.5%。LVDS输出再放大这个抖动屏端面板时序就容易被打破。所以我在选型时专门确认过LT8912B的SSC透传和内部时钟重整能力后面实测也证明它在SSC开启时依然能稳定工作只是LVDS输出的时钟抖动会稍微大一点在屏的容忍范围内。2. 硬件设计不做对软件再怎么调也白搭很多人以为MIPI转LVDS是纯软件活其实硬件布线的好坏直接决定调试点亮要花一周还是半天。这块我踩过不少坑挨个说。2.1 MIPI差分对布线不是“连上就行”MIPI DSI在高速模式下一对差分线的速率通常是几百Mbps到1Gbps以上。这么高的速率下差分阻抗如果偏离100Ω太多反射就会把眼图搞残导致桥接芯片收不到干净信号。所以PCB布线时注意三点差分阻抗控制在100Ω±10%。这个要靠叠层计算不能凭感觉制板前一定要让PCB厂确认阻抗设计。对内等长差分的两根线长度差控制在5mil以内。长度差会造成共模噪声严重时直接导致接收端误码。远离时钟线、电源开关节点和其他高频信号。MIPI走线尽量不要跨过分割的参考平面跨了阻抗就断了。串阻也是常被忽略的细节。SoC的MIPI发射端驱动能力比较强如果走线很短建议源端串22Ω电阻做阻抗匹配和过冲抑制如果走线超过8cm可以适当减小到10Ω或直接不串。这个值没有绝对标准根据实际波形调。2.2 LVDS侧时钟对和数据对的映射关系LVDS输出侧常见的接口是18bit RGB用四对线3对数据1对时钟24bit RGB用五对线双通道就是翻倍。LT8912B这类桥接芯片的LVDS输出引脚基本是固定的但不同屏厂的映射可能不一样。拿我用的17寸屏举例子它的LVDS接口是单通道18bit数据映射方式是VESA格式。桥接芯片内部也分VESA格式和JEIDA格式两种映射配置错一个位屏幕要么显示颜色错乱、雪花噪点要么直接黑屏。这个映射格式必须在初始化序列里和屏参对应好不能靠猜要查屏规格书的LVDS Timing部分。还有LVDS的摆幅和共模电压。如果走线太长信号衰减严重可以把桥接芯片的LVDS输出摆幅调大一点。LT8912B有寄存器控制LVDS驱动电流我为了压EMC把驱动电流从默认的3.5mA降到2.5mA左右实测2米LVDS线还能稳定显示但如果线缆超过3米建议用默认值或者放大一档。2.3 电源和复位时序桥接芯片不会告诉你它没起来桥接芯片的电源方面一般需要三路电压核心1.2V、IO 1.8V/3.3V、模拟供电。上电时序通常要求核心先于IO但不同芯片要求不同必须看手册。有的SoC平台GPIO上电时序默认是乱的需要在bootloader里先做好电源控制。复位引脚的时序更要命。如果复位信号释放太早芯片内部的PLL还没准备好后面就算I2C往死里写寄存器也没用。我自己的习惯是上电稳定后保持复位拉低至少20ms然后拉高再等100ms才开始I2C配置。这个时间看起来保守但比起“查半天发现芯片没起来”多等几十毫秒完全值得。还有一点LVDS屏的供电和背光控制不要用SoC的IO直接驱动。最好加MOS管或专门的背光驱动IC来切换屏供电再通过GPIO控制背光使能。因为屏的瞬间拉电流可能到几百毫安直接挂在GPIO上要么把SoC拉死要么把GPIO烧了这都是教训。3. Kernel侧点亮的第一步从设备树和驱动把链路跑通到了软件阶段基本思路是先让桥接芯片“被SoC看到”再让SoC的DSI控制器“认为自己驱动了一块正常屏”。这两步在设备树上一一对应调不出来基本都是配置不匹配。3.1 设备树节点怎么搭RK3568上MIPI DSI的设备树结构大致是dsi0 { status okay; #address-cells 1; #size-cells 0; panel0 { compatible lontium,lt8912b-lvds; reg 0; backlight backlight; enable-gpios gpio1 RK_PB2 GPIO_ACTIVE_HIGH; reset-gpios gpio1 RK_PB1 GPIO_ACTIVE_LOW; pinctrl-names default; pinctrl-0 lcd_panel_pins; ports { #address-cells 1; #size-cells 0; port0 { reg 0; panel_in_dsi: endpoint { remote-endpoint dsi0_out_panel; }; }; }; }; ports { #address-cells 1; #size-cells 0; port1 { reg 1; dsi0_out_panel: endpoint { remote-endpoint panel_in_dsi; }; }; }; };这里要注意的是把LT8912B和屏“合并”成了一个panel节点挂在DSI下。对SoC来说它看到的是一块MIPI屏至于屏后面挂了什么SoC是不关心的。reset引脚和enable引脚要明确指定GPIO这是后面亮屏时序控制的关键。3.2 像素时钟计算这是最容易算错的地方面板能否稳定工作像素时钟PCLK是核心参数。这个值不是屏规格书直接写的要按下面的公式推PCLK H_Total × V_Total × 刷新率H_Total H_Active H_FrontPorch H_BackPorch H_SyncPulseV_Total 同理。我那块1366x768的屏的时序参数长这样参数值H Active1366H Front Porch20H Back Porch20H Sync Pulse32V Active768V Front Porch10V Back Porch10V Sync Pulse3刷新率60Hz代入算一下H_Total 1366 20 20 32 1438V_Total 768 10 10 3 791PCLK 1438 × 791 × 60 ≈ 68.3MHz但LT8912B的MIPI接收端需要根据PCLK推导出MIPI的lane速率MIPI_bit_clock PCLK × 24 / Lane数这里按MIPI 4 Lane、每像素24bit算68.3 × 24 / 4 ≈ 410Mbps per lane这个410Mbps就是告诉SoC的DSI控制器让它按这个速率发包。很多黑屏挂死的问题根源就是先按默认速率发包屏显不出来才想起来回来算数。3.3 初始化序列从寄存器到DCS命令LT8912B的初始化本质上是通过I2C往芯片内部寄存器写一串配置值。通用的流程大概是static int lt8912b_panel_prepare(struct drm_panel *panel) { struct lt8912b *lt panel_to_lt8912b(panel); /* 复位桥接芯片 */ gpiod_set_value(lt-reset_gpio, 1); msleep(20); gpiod_set_value(lt-reset_gpio, 0); msleep(100); /* 通过I2C配置LT8912B */ lt8912b_i2c_write(lt, 0x04, 0x03); /* 芯片软复位 */ msleep(10); lt8912b_i2c_write(lt, 0x04, 0x00); msleep(10); /* 配置MIPI接收端4 lane、速率范围、连续时钟 */ lt8912b_i2c_write(lt, 0x10, 0x93); lt8912b_i2c_write(lt, 0x20, 0x04); /* 配置LVDS输出单通道、VESA映射、18bit、驱动电流 */ lt8912b_i2c_write(lt, 0x30, 0x0A); /* 配置PLL分频配合PCLK */ ... /* 使能视频通路 */ lt8912b_i2c_write(lt, 0x40, 0x01); return 0; }具体寄存器地址每个芯片不同我这里不贴全表只强调逻辑顺序复位→确认ID→配PLL→配MIPI接收→配LVDS发送→使能输出。这个顺序错了两两之间都会出问题尤其是PLL必须先锁定后面的视频通路才能有效输出。另外有些SDK喜欢把桥接芯片的初始化放在MIPI DSI的pre_enable回调里有些放在panel的prepare里。逻辑上都可以但要注意一点I2C配置必须在MIPI高速时钟开启之前完成否则桥接芯片的接收端还没准备好SoC这边就发了高速数据芯片根本不会应。3.4 亮屏顺序和灭屏顺序我在驱动里固定了一套亮灭屏顺序实测下来没有闪屏或雪花帧亮屏顺序使能屏供电释放复位等待桥接稳定通过I2C初始化桥接芯片启动MIPI DSI高速时钟等待一小段时间比如100ms亮背光灭屏顺序相反先关背光停MIPI高速时钟关屏供电为什么背光必须最后开、最先关因为如果在链路没就绪时就亮背光人会看到花屏、噪点或者一条条的滚屏这在客户现场特别容易被说成“屏幕不行”。屏本身的物理响应其实没毛病只是时序错了。4. 黑屏花屏排查链路从波形到寄存器的逐级定位法调试阶段最怕的就是“黑屏”问题出现之后手足无措。我的排查逻辑是从源头往后查链路的每一站每一站都先用仪器或命令确认“这一站有没有通”通了再往下一站走。4.1 第一站SoC到底有没有发MIPI信号最常见的情况是软件自以为配置好了实际上SoC的DSI控制器根本没使能或者因为某些错误进入异常状态。这时候用示波器测MIPI时钟P/N差分对高速模式下应该看到一对幅度几百mV的差分时钟波形频率和SoC配置的lane速率对应。要是看不到波形先看以下几个方面DSI节点有没有status okay相关时钟是否被关闭clk_summary查dsi相关时钟的enable状态是否因为lcdc/VP绑定问题显示控制器没有真正输出画面数据我在RK3568上调过一个问题设备树里把VP0绑给了HDMIVP1绑给了MIPI DSI但驱动里默认还指着VP0输出结果MIPI那边一直是黑屏。后来在sysfs里手动切到VP1MIPI输出立刻就有波形了。这属于平台层面集成的问题单看一个文件完全发现不了。4.2 第二站桥接芯片有没有正常工作如果MIPI侧波形正常下一步确认桥接芯片的I2C是否可读。Linux下直接用i2cdetect扫一下总线i2cdetect -y 2如果总线上能看到0x48这个地址说明芯片上电成功I2C通路正常。接着读一下芯片ID寄存器验证型号和修订版本i2cdump -y 2 0x48如果I2C读不到地址大概率是硬件问题芯片没上电、复位没释放、I2C引脚接反、地址上拉不对。这种问题软件怎么调都没用老老实实回去查原理图用万用表量芯片供电和复位引脚的电压。4.3 第三站LVDS输出有信号吗桥接芯片配置完之后用示波器差分探头测LVDS时钟对正常应该能看到一对LVDS时钟波形频率和PCLK对应。这里注意LVDS差分信号摆幅一般350mV左右共模电压1.2V左右示波器要开差分测量或者用差分探头否则测出来全是噪声。如果波形幅度正常但屏依然不亮那就要怀疑屏端LVDS接收器的工作状态。有些屏特别是医用、工业屏有一个LOCK输出引脚接收器成功锁定时钟和数据后会拉高。如果LOCK为低说明屏幕根本没锁住链路问题要么在LVDS映射格式不对要么在PCLK频率偏移太大超出了面板的锁定范围。4.4 典型故障汇总表我把这项目过程中遇到的和同行群里讨论的典型场景整理成了一个表方便对不同现象做初步判断现象可能原因排查方法背光不亮背光供电没开/GPIO没生效量背光电压和使能脚背光亮但屏幕全黑MIPI无输出/桥接没配置示波器量MIPI波形、i2cdetect确认I2C屏幕有微弱光斑LVDS无锁定量LVDS时钟、查LOCK信号花屏/斜纹PCLK不对或时序参数错误逐项核对HFP/HBP/VSync等参数白屏LVDS映射格式错误检查VESA/JEIDA映射颜色偏色/闪烁18bit和24bit配置错检查数据位宽配置屏闪但显示内容正常背光频率不够或SSC干扰检查PWM频率、关闭SSC对比试验开机一段时间后花屏时钟漂移或ESD干扰加长复位时间、检查电源纹波这个表格的价值不只是给出答案而是每次遇到问题都能按照某一行快速切入对应的仪器和命令不用从头把整个流程再走一遍。5. 从Kernel到UEFI把点亮动作搬进BIOS客户说“开机就要看到Logo”这就把问题从Linux内核级别直接拉到了固件级别。在UEFI阶段把MIPI转LVDS点亮和在Linux下是完全两个世界没有设备树、没有i2c-dev工具、没有现成的DRM/KMS驱动一切都要手动操作寄存器、手动配置I2C控制器。5.1 VBT到底是什么为什么它决定开机能不能亮VBTVideo BIOS Table是Intel主导的一种结构化的显示配置数据块存放在固件的OptionROM或NVRAM区域UEFI GOP驱动在初始化显示时从VBT读取面板信息包括时序参数、输出接口类型、lane数等。不仅仅是Intel平台现在很多国产SoC的UEFI实现也在参考这个架构。热搜里有人问“如何将MIPI的时序导入BIOS的VBT”其实就是指把设备树里的panel时序参数翻译成VBT的数据结构。VBT里面每一条数据项是有固定偏移的不能用文本编辑器随便改得用Intel的VBT编辑器或者脚本解析修改然后打包进固件镜像里再刷写。我在这个项目里就遇到一个典型的坑VBT默认配置的是HDMI输出里面记录的时序是1920x108060。我把MIPI转LVDS屏接上去GOP驱动根本不认连初始化流程都不走。后来把VBT的显示控制器类型改成MIPI DSI把时序参数改成1366x768对应的H_Total 1438、V_Total 791再刷进固件GOP才正常初始化MIPI输出。5.2 UEFI驱动里怎么初始化桥接芯片如果平台固件没有现成的MIPI panel支持也可以直接在UEFI驱动里写死桥接芯片的初始化序列。这种方式更直接不需要依赖VBT的修改工具链我这次项目就用的是这个方案。UEFI阶段SoC侧输出的初始化其实和Linux内核的思路一致只是没有现成API要用I2C协议栈直接操作。下面是一段简化的UEFI下写LT8912B寄存器的代码思路EFI_STATUS InitLt8912b ( VOID ) { EFI_STATUS Status; /* 1. 配置GPIO释放桥接芯片复位 */ GpioSetValue (RESET_GPIO, LOW); // 复位拉低 MicroSecondDelay (20000); GpioSetValue (RESET_GPIO, HIGH); // 释放复位 MicroSecondDelay (100000); /* 2. 初始化平台I2C控制器 */ Status I2cInitialize (); if (EFI_ERROR (Status)) { return Status; } /* 3. 通过I2C配置桥接芯片 */ Status I2cWriteByte (LT8912B_I2C_ADDR, 0x04, 0x03); // 软件复位 Status I2cWriteByte (LT8912B_I2C_ADDR, 0x04, 0x00); /* 4. 先配LVDS输出再配MIPI输入 */ Status I2cWriteByte (LT8912B_I2C_ADDR, 0x30, 0x0A); // 单通道VESA 18bit Status I2cWriteByte (LT8912B_I2C_ADDR, 0x20, 0x04); // MIPI 4 lane /* 5. 使能视频通路 */ Status I2cWriteByte (LT8912B_I2C_ADDR, 0x40, 0x01); return EFI_SUCCESS; }看到没有这和Linux内核里那段初始化代码逻辑一模一样区别只是I2C操作的底层实现变了Linux里是调i2c_transferUEFI里是调I2C DXE驱动的Protocol接口。所以完全可以把内核驱动里的初始化序列直接翻译成UEFI版本前提是你要维护两套代码或者做一次寄存器配置导出的抽象。5.3 UEFI中GOP驱动的时序配置注意点UEFI的GOP驱动负责把framebuffer内容送给显示控制器它和你自己初始化的桥接芯片是两个层面但要配合好。GOP驱动需要知道输出多少分辨率、什么时序这些配置通常放在VBT或者平台特定的EFI Variable里。我这次的做法是写了一个平台专用的DisplayConfigDxe驱动在Start()函数里先调用InitLt8912b()配置桥接芯片然后根据VBT中的panel时序数据配置SoC的显示控制器最后通知GOP驱动输出指定分辨率的framebuffer。有一个特别容易踩的坑UEFI阶段的MIPI时钟频率和内核阶段不一定一样。因为UEFI启动阶段的PLL配置策略不同可能主频都还没拉高DSI的时钟范围也不一样。所以要确认UEFI阶段的MIPI lane速率能否满足桥接芯片和屏的PCLK需求。如果UEFI下的主频较低导致MIPI速率不够可以降低启动阶段的刷新率比如从60Hz降到50Hz来保证PCLK在限定范围内等内核起来后再切回60Hz。这个方法实测完全可行只是会有一个从固件到OS的分辨率切换过程需要内核里的drm驱动支持modeset切换。5.4 在内核驱动里复用UEFI的验证结果在UEFI阶段点亮没问题后内核阶段至少能确认两件事桥接芯片的初始化序列是对的、LVDS屏的LVDS线序和面板规格没有问题。如果内核还点了不亮那就是内核驱动注册、DSI时钟、背光控制之类的OS级问题和芯片初始化无关了。这样排查范围就缩小了一大半非常提效。6. 点亮只是开始稳定性和量产阶段的几个细节屏幕能亮只是调试的第一步真正令人头疼的是“过了几天客户说又黑屏了”。量产环境里各种干扰和极端场景才是考验这个桥接方案稳不稳的关键。6.1 ESD复位后的恢复逻辑RTOS/工业现场最常见的故障就是ESD干扰导致显示闪断。MIPI走线和LVDS走线的线缆本身就是天线一旦ESD打进来桥接芯片的状态机很容易被打乱表现出来就是花屏、无信号、背光正常但屏全黑。对策有两个一是硬件上在MIPI差分对和LVDS差分对上增加ESD保护器件比如PESD1CAN这类二是软件上要有监控和自恢复逻辑。我在Linux内核里写了一个简单的心跳检查线程每隔几百毫秒通过I2C读一次桥接芯片的状态寄存器如果状态异常就执行一次重新初始化。具体代码层面也不复杂static void lt8912b_monitor_work(struct work_struct *work) { struct lt8912b *lt container_of(work, struct lt8912b, monitor_work.work); u8 val; int ret; ret lt8912b_i2c_read(lt, LT8912B_STATUS_REG, val); if (ret 0 || (val STATUS_LINK_LOCK) 0) { dev_warn(lt-dev, LT8912B link lost, reinit...\n); lt8912b_panel_prepare(lt-panel); lt8912b_panel_enable(lt-panel); } schedule_delayed_work(lt-monitor_work, HZ / 2); }这里的核心思路是把“恢复”做成一个闭环动作而不是打印一条日志就完事。实际测试下来恢复时间大概在500ms近1秒加上背光又重新亮一次虽然避免不了瞬间黑屏但至少不会死机客户还能继续操作体验比彻底卡死好很多。6.2 屏幕唤醒的消闪处理另一个容易忽略的场景是系统suspend/resume。LVDS屏在恢复时如果时序不对经常会闪一下白屏或花屏这是“背光先亮、但链路还没来得及恢复”导致。我总结的稳妥策略是Resume时先恢复MIPI高速时钟和桥接配置确保画面稳定输出再过几百毫秒开背光。这个顺序和Linux内核里panel驱动的enable/disable回调要做到位。像RK平台suspend时drm/mipi_dsi的关机序列会调用panel_disable和panel_unprepare这两个回调里要把背光关了、DSI高速时钟停了。Resume时反过来调用panel_prepare和panel_enable。如果不把背光和链路分开管理suspend/resume几轮之后必然出现花屏或闪烁问题。6.3 批次屏体差异的适配还有一个量产常见的坑同一个型号的屏不同批次用的玻璃可能来自不同的供应商时序参数会有一点偏差。比如我项目里的屏早期批次HBP设20正常到了新批次HBP设20会发生右侧有1~2像素漏白边调整到24才正常。解决这种批次差异的通用做法是把时序参数做成可配置项不要硬编码在驱动里。设备树里通过panel-timing节点动态加载UEFI里通过VBT的Firmware Interface去覆盖默认值这样即使屏的批次有变现场人员改一个配置再刷机就行不用动代码。7. u-boot也可以插一脚如果你想在启动日志阶段就看到画面有些场景不只是Logo客户想看启动日志这就需要在U-Boot阶段同样点亮屏幕。U-Boot里点MIPI转LVDS的原理和UEFI一样也是直接操作寄存器只是用的API不一样。U-Boot的显示框架通常有video driver和panel driverRK平台一般会在u-boot里面使能CONFIG_DM_VIDEO然后配置对应的panel node和解码器节点。对于LT8912B如果不做专门的U-Boot驱动最简单的办法是在board files里直接写死I2C初始化函数在video初始化之前调用一次。void lt8912b_pre_init(void) { int i; u8 lst8912b_init[] { 0x04, 0x03, 0x04, 0x00, 0x10, 0x93, 0x20, 0x04, 0x30, 0x0A, 0x40, 0x01, }; for (i 0; i sizeof(lst8912b_init) / 2; i) { i2c_reg_write(LT8912B_I2C_ADDR, lst8912b_init[i*2], lst8912b_init[i*21]); } }U-Boot那套i2c API和内核完全不是一回事i2c_reg_write是U-Boot提供的标准接口初始化时序靠usb键盘/串口单独看日志去对反正先把这个逻辑跑通再说。这个阶段的调试核心是确认U-Boot阶段的显示控制器时钟配置是否和后面内核里一致不一致的时候画面会偏色或偏移因为在U-Boot阶段PLL通常跑不到最高频率最好用一个统一的、兼容性的时序参数比如60Hz时H_Total允许小幅调整。到这一步从Kernel到UEFI再到U-Boot阶段的显示链路就全部打通了。我个人最大的感受是MIPI转LVDS这种桥接方案本质上是“把两个互不完全认识的设备硬凑成一对”调试的时候心态一定不能急。波形仪、I2C命令、寄存器读取这些手段要合理地组合使用一层层剥开问题的外衣。不管是Kernel还是UEFI底层要回答的问题都只有一个信号在每一站到底有没有到达、有没有锁住。如果你手上也有类似的项目按照我上面这套顺序去调试——选型、硬件确认、Kernel点亮、UEFI移植、量产恢复大概率能少走一大半弯路。尤其记住一点芯片初始化序列虽然代码不长但它是这套链路的心脏务必先在硬件上用示波器验证再往上层移不要拿软件层怼一个硬件还没搞清楚的问题。
返回列表