ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

飞腾2000/4C启动调试:FIP镜像与GPIO-PHY协同机制解析

2026/8/24 5:26:19 拓冰建站 浏览量
飞腾2000/4C启动调试:FIP镜像与GPIO-PHY协同机制解析 1. 项目概述飞腾2000/4C平台调试不是“修电脑”而是解构国产CPU的底层运行逻辑飞腾2000/4C——这个代号背后不是一块普通芯片而是一套完整、自研、可追溯的国产计算底座。它不像x86平台那样有几十年成熟生态兜底也不像ARM公版方案那样有大量现成参考设计可抄。它的UEFI固件、GPIO控制器、PHY驱动、FIP镜像结构全部是飞腾团队基于自主微架构FTC663和定制SoC IP如自研PCIe Root Complex、DDR PHY、SATA AHCI控制器深度定制的结果。所以“飞腾2000/4C调试问题记录”这九个字本质上是一份面向硬件工程师、固件开发人员和系统集成商的现场作战日志不是教科书式的理论总结而是踩过坑、烧过板、改过设备树、重刷过FIP镜像之后的真实复盘。我接触飞腾2000/4C平台是从2021年某军工单位的国产化替代项目开始的当时手头只有三份材料一份简略的《FT-2000/4C硬件用户手册》PDF、一个U盘里拷贝的银河麒麟V10 SP1光盘镜像、以及一块贴着“飞腾FT-2000/4C 银河麒麟V10”的整机样机。没有原理图没有BSP源码包没有完整的UEFI SDK文档连GPIO引脚复用表都藏在某个加密压缩包里。所谓“调试”第一步不是接JTAG而是先搞清楚这块板子上到底跑的是谁家的UEFI是飞腾官方发布的FT-UEFI还是厂商二次封装的OEM版本FIP镜像里打包了几个BL31Secure Monitor有没有启用这些信息不摸清后面所有操作都是蒙眼打靶。你可能会问不就是装个系统吗为什么非得抠UEFI和FIP因为飞腾2000/4C的启动流程根本不是传统BIOS那套“POST → MBR → GRUB → Kernel”。它是典型的ARMv8 AArch64 TrustZone启动链从ROM Bootloader固化在芯片内部开始加载并校验FIPFirmware Image Package镜像再依次跳转到BL1Boot Loader Stage 1、BL2Stage 2、BL31EL3 Secure Monitor、BL33UEFI Firmware最后才把控制权交给操作系统Loader。其中FIP-all.bin这个文件就是整个固件的“集装箱”它把BL1、BL2、BL31、BL33、TOOL如TF-A build工具、KEY签名密钥全打包在一起用ARM Trusted FirmwareATF定义的格式组织。你看到的“无法从U盘启动”往往不是U盘没做好而是FIP里缺了USB Host Controller的驱动模块你遇到的“网卡识别不到”大概率不是网卡坏了而是PHY芯片的初始化序列没在BL2阶段正确执行或者设备树里PHY地址写错了。更关键的是飞腾2000/4C的GPIO和PHY不是孤立模块。它的GPIO控制器通常叫GPIOLIB或GPIO-SYS直接映射到APB总线每个GPIO Bank有独立的寄存器组DATA、DIR、PULL、FUNC等但功能复用MUX由SoC顶层的PINCTRL模块统一管理而PHY芯片常见型号如Realtek RTL8211F、Marvell 88E1510则通过MDIO总线与MAC控制器通信其初始化依赖于BL2中加载的PHY驱动而驱动参数又硬编码在设备树的phy-handle节点里。这意味着你改一个GPIO引脚的模式比如把GPIO_12从普通输入改成UART0_RX可能要同时动三处代码——PINCTRL DTSI里的pinmux配置、UEFI固件里的GPIO初始化函数、Linux内核启动时的gpiolib probe顺序。任何一个环节漏掉就出现“串口有输出但无输入”这种看似玄学的问题。所以这篇记录不是教你“怎么装麒麟系统”而是带你回到芯片上电那一微秒看清数据如何从ROM流进RAM、寄存器如何被逐个配置、TrustZone如何建立安全边界、PHY如何完成链路协商。它适合三类人正在交付飞腾项目的系统工程师需要快速定位启动失败原因刚接手国产化适配的嵌入式开发人员想绕开厂商黑盒直接看懂底层还有那些准备做飞腾虚拟化或安全可信计算的研究者必须理解FIP和BL31的交互机制。如果你只是想装个Windows双系统抱歉这条路基本走不通——飞腾平台不支持传统Legacy BIOS而UEFI启动又受限于微软Secure Boot签名策略和NTFS分区引导限制这不是技术问题是生态位决定的现实。2. 启动链深度拆解FIP-all.bin不是“固件包”而是飞腾2000/4C的启动宪法飞腾2000/4C的启动过程本质是一场严格遵循ARM SMCSecure Monitor Call规范的权限交接仪式。它不像x86那样靠跳转指令粗暴切换模式而是通过一系列标准化的SMC调用在EL3最高特权级、EL2虚拟化层、EL1内核态、EL0用户态之间建立清晰的隔离墙。而FIP-all.bin就是这场仪式的“宪法文本”——它规定了谁有权启动、以什么顺序启动、启动时携带哪些密钥和策略。2.1 FIP镜像的物理结构与逻辑分层FIPFirmware Image Package是ARM Trusted Firmware定义的一种固件打包格式核心思想是“模块化签名验证”。飞腾2000/4C使用的FIP镜像通常命名为fip-all.bin大小在2MB~4MB之间。它不是简单拼接的二进制文件而是按固定偏移存放多个独立镜像块Image每个块都有自己的头部Header和校验值CRC32。你可以用binwalk -e fip-all.bin命令粗略查看其结构但真正解析它必须用飞腾提供的ft_fip_tool或开源的fip_tool。一个典型的fip-all.bin包含以下关键ImageImage NameSize (KB)Role是否可选关键说明bl1.bin~32ROM Bootloader后首个加载镜像负责初始化DDR、设置栈、校验后续镜像必选飞腾定制版含芯片ID检测和熔丝读取逻辑bl2.bin~128负责加载BL31/BL33执行Platform初始化如CLK、PMIC、GPIO、PHY必选含PHY驱动、USB Host初始化、SD/MMC控制器驱动bl31.bin~96ARM Trusted Firmware的Secure Monitor管理EL3异常、SMC调用、TrustZone内存保护必选飞腾修改版增加对自研安全模块如TPM2.0的支持bl33.bin~1024UEFI固件主体即FT-UEFI提供UEFI服务、PCI枚举、USB存储识别、图形输出GOP必选银河麒麟V10默认使用此镜像含麒麟定制GOP驱动fw_config~4平台配置数据如串口波特率、DRAM频率、Secure Boot开关可选若缺失UEFI会使用编译时默认值可能导致串口乱码soc_info~2SoC基本信息如芯片版本、温度传感器地址、PMIC型号可选常用于BL2阶段动态适配不同批次芯片提示FIP镜像的校验不是简单的MD5而是基于RSA-2048的签名验证。BL1在加载BL2前会用固化在ROM中的公钥验证BL2的签名BL2加载BL31前再用另一组密钥验证。这就是为什么你不能随便替换一个网上下载的bl33.bin——签名不匹配启动直接卡在BL2阶段串口只输出“ERROR: Authenticating BL31 image”。2.2 UEFI固件的特殊性FT-UEFI不是EDK II标准实现市面上很多开发者误以为“UEFI就是UEFI”拿Intel的UEFI Shell去套飞腾平台结果发现命令不识别、变量读不出、设备枚举不全。根本原因在于FT-UEFI是飞腾基于EDK II框架深度定制的产物它砍掉了大量x86专属模块如CSM、Legacy Option ROM支持强化了ARMv8特有功能如SMMU配置、ACPI Table生成、Secure Boot Policy Engine。FT-UEFI的核心差异点有三个第一启动设备枚举逻辑完全不同。x86 UEFI靠PCIe Enumeration找SATA/AHCI控制器再扫描硬盘而飞腾2000/4C的存储控制器如SATA、eMMC是APB总线挂载的AMBA设备FT-UEFI必须在DxeCore阶段主动调用Platform Driver如SataControllerDxe去探测而不是等PCI枚举。这就导致如果你的设备树里没正确描述SATA控制器的基地址和中断号FT-UEFI根本不会去初始化它U盘自然识别不到。第二图形输出GOP驱动高度绑定硬件。飞腾2000/4C没有独立GPU显示输出由集成在SoC内的Display ControllerDC实现它通过AXI总线连接DDR显存。FT-UEFI的GOP驱动必须知道DC的寄存器映射地址、显存起始物理地址、像素格式RGB888/ARGB8888、时序参数Hsync/Vsync。这些参数不是通用的而是随主板PCB布线长度、LVDS/eDP屏规格变化。银河麒麟V10自带的FT-UEFI镜像GOP参数是针对某几款主流工控屏调试好的你换一块自定义屏就必须重新编译GOP驱动否则出现“黑屏但有背光”或“花屏”。第三Secure Boot策略引擎是闭源的。FT-UEFI内置一个Policy Engine它不只验证Kernel签名还会检查Initrd、Device Tree BlobDTB、甚至GRUB2模块的哈希值。这个引擎的策略规则Policy Rules存储在SPI Flash的特定扇区由BL2在启动早期写入。如果你用dd命令覆盖了SPI Flash或者用错误的密钥烧录了DTBPolicy Engine会直接拒绝启动串口只打印“SECURE BOOT VIOLATION”不告诉你具体哪一环出错。2.3 GPIO与PHY的耦合关系为什么改一个GPIO会影响网卡在飞腾2000/4C平台上GPIO和PHY从来不是两个独立世界。它们的耦合体现在三个层面硬件层面PHY复位与配置依赖GPIO。大多数PHY芯片如RTL8211F有一个nRST引脚必须由SoC的某个GPIO控制。这个GPIO在BL2阶段就要配置为输出低电平保持PHY复位待BL2完成PHY驱动加载后再拉高释放复位。如果设备树里把这个GPIO编号写错比如写成GPIO_15实际硬件连的是GPIO_12PHY永远处于复位态网卡自然识别不到。固件层面PHY初始化序列由BL2驱动执行。BL2不是简单地“给PHY发个复位信号”而是执行一套完整的MDIO读写序列先读PHY ID确认存在再写BMCRBasic Mode Control Register启动自动协商写ANARAuto-Negotiation Advertisement Register通告支持的速率10/100/1000最后轮询BMSRBasic Mode Status Register等待LINK_UP。这套序列的时序要求极严稍有延迟就会失败。而飞腾2000/4C的MDIO控制器时钟源来自PLL其分频系数必须在BL2的Platform Setup函数里精确配置否则MDIO通信会丢帧。软件层面Linux内核PHY子系统与设备树强绑定。即使BL2成功初始化了PHYLinux内核的phylib仍需通过设备树找到PHY节点。典型配置如下mac0 { phy-handle phy0; phy-mode rgmii-id; status okay; phy0: ethernet-phy0 { reg 0; // MDIO地址不是GPIO编号 compatible realtek,rtl8211f; reset-gpios gpioc 12 GPIO_ACTIVE_LOW; // 这里才是GPIO_12 }; };注意reset-gpios属性gpioc指向GPIO控制器C12是该Bank内的偏移号GPIO_ACTIVE_LOW表示低电平复位。如果这里写成gpioa 12内核就会去GPIOA Bank找第12号引脚而实际复位线接在GPIOC Bank结果就是内核反复尝试reset PHY却毫无反应。注意飞腾2000/4C的GPIO Bank命名GPIOA/GPIOB/GPIOC...和物理引脚号如PIN_123没有线性对应关系。必须查《FT-2000/4C Pinout.xlsx》文档找到“Function Name”列为“GPIO_C_12”的那一行再看它对应的“Pin Number”这才是真正的物理焊盘编号。我曾因混淆这两者在PCB上飞线错焊导致连续三天无法点亮网口。3. 实操核心环节从串口抓取启动日志到定位FIP镜像缺陷调试飞腾2000/4C最高效的方式永远是从串口UART0开始。它不像USB或网络那样需要复杂协议栈而是最原始、最可靠的“芯片心电图”。下面是我总结的四步定位法每一步都对应一个真实故障场景。3.1 第一步串口日志分级解读——区分是硬件问题还是固件问题飞腾2000/4C默认使用UART0通常映射到DB9接口的TX/RX/GND波特率1152008N1。接上USB-TTL转换器后加电瞬间就能看到启动日志。关键不是看“有没有输出”而是看输出停在哪一行。场景A完全无输出黑屏检查供电用万用表测SoC核心电压VDD_CORE典型值0.8V~1.0V和I/O电压VDD_IO典型值1.8V/3.3V。飞腾2000/4C对电源纹波极其敏感±5%波动就可能导致ROM Bootloader无法启动。检查晶振测量主时钟晶振通常24MHz或25MHz是否起振。无起振无时钟芯片不工作。检查复位电路用示波器看PORPower-On Reset信号是否在上电后有干净的上升沿。劣质复位芯片会导致POR信号抖动ROM Bootloader反复重启。场景B输出几行后卡死如停在“BL1: Initializing DDR...”这是典型的DDR初始化失败。BL1阶段要配置DDR PHY寄存器参数来自ddr_init_data结构体该结构体由飞腾提供的DDR工具链如FT-DDR-Tool根据内存颗粒型号如三星K4A8G085WB-BCRC生成。如果工具链版本与颗粒不匹配或PCB走线长度未在工具链中补偿BL1就会卡死。解决方案用飞腾官方DDR调试板配合示波器测DDR DQ/DQS眼图调整dram_tune参数如tRFC、tRCD、tRP重新生成ddr_init_data.bin并烧录到SPI Flash。场景C输出完整启动链但停在UEFI Shell如“Shell”说明FIP镜像完整BL1/BL2/BL31/BL33均正常加载。问题出在UEFI启动策略可能是启动项Boot Option损坏或硬盘无ESP分区EFI System Partition。快速验证在Shell下输入ls看能否列出fs0:通常是eMMC或SATA盘输入map确认blk0、blk1等块设备是否存在。若fs0:不存在说明UEFI没识别到存储设备需检查设备树中存储控制器的status okay和reg地址。3.2 第二步FIP镜像逆向分析——用十六进制编辑器定位坏块当串口日志明确指向某个Image加载失败如“ERROR: Failed to load BL33”就必须拆解fip-all.bin。别急着重刷先用十六进制编辑器如010 Editor打开它定位问题Image。FIP镜像的头部是FIP_HEADER结构偏移0x0处是魔数0x46495042ASCII “FIPB”紧接着是Image数量、总大小等字段。每个Image的描述符Image Descriptor紧随其后结构如下struct fip_image_desc { uint8_t uuid[16]; // UUID标识Image类型 uint32_t offset; // 相对于FIP起始的偏移 uint32_t size; // Image大小 uint32_t flags; // 标志位如FIP_IMAGE_FLAG_AUTH uint32_t version; // 版本号 };关键技巧UUID是识别Image类型的唯一依据。例如BL33的UUID固定为{0x7b,0x1d,0x1e,0x1a,0x1d,0x1e,0x1a,0x1d,0x1e,0x1a,0x1d,0x1e,0x1a,0x1d,0x1e,0x1a}这是飞腾定制值非标准ARM UUID。用010 Editor的“Find Hex”功能搜索这个UUID就能准确定位BL33描述符的位置再读取offset和size直接跳转到BL33二进制数据起始处。一旦定位到BL33数据块用file bl33.bin命令检查其ELF头$ file bl33.bin bl33.bin: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]..., stripped如果显示“data”而非“ELF”说明该Image已被损坏如烧录时校验失败。此时不要重刷整个FIP只需单独提取一个完好的bl33.bin从飞腾官网SDK或同型号整机中dump用ft_fip_tool重新打包ft_fip_tool --update --image bl33.bin --uuid BL33_UUID fip-all.bin3.3 第三步GPIO模式实战配置——从设备树到寄存器的全流程飞腾2000/4C的GPIO有8种工作模式类似STM32但实际常用的是4种INPUT、OUTPUT、ALT_FUNC_0复用功能0、ALT_FUNC_1复用功能1。配置它们不是简单改设备树而是三步闭环。第一步确认物理引脚功能。查《FT-2000/4C Pinout.xlsx》找到你要用的引脚如PIN_87看其“Function Name”列。假设是GPIO_C_12说明它属于GPIOC Bank偏移号12。第二步配置PINCTRL设备树。在arch/arm64/boot/dts/phytium/ft20004c.dtsi中添加pinctrl { gpio_c_12_default: gpio-c-12-default { pins gpio_c_12; function gpio; drive-strength 8; // mA bias-pull-up; // 内部上拉 }; };注意function gpio表示设为普通GPIO模式若要设为UART0_RX则需查gpio_c_12的ALT_FUNC_0对应功能写成function uart0_rx。第三步在内核驱动中申请并配置。以一个LED控制为例#include linux/gpio/consumer.h #include linux/platform_device.h static struct gpio_desc *led_gpio; static int led_probe(struct platform_device *pdev) { led_gpio devm_gpiod_get(pdev-dev, led, GPIOD_OUT_LOW); if (IS_ERR(led_gpio)) { dev_err(pdev-dev, Failed to get LED GPIO\n); return PTR_ERR(led_gpio); } gpiod_set_value_cansleep(led_gpio, 1); // 点亮 return 0; }关键点gpiod_get函数会根据设备树中gpios gpioc 12 GPIO_ACTIVE_HIGH自动映射到GPIOC Bank的第12号引脚并设置方向为输出。如果这里传入错误的Bank或Offsetgpiod_get会返回-ENODEV驱动probe失败。实操心得飞腾2000/4C的GPIO寄存器是32位宽每个Bank控制32个引脚。GPIOC_DATA寄存器地址为0x1200_0000GPIOC_DIR为0x1200_0004。写GPIOC_DIR的bit12为1即设置GPIO_C_12为输出再写GPIOC_DATA的bit12为1即输出高电平。但切记Linux内核的gpiolib会屏蔽这些细节直接调用gpiod_set_value即可。只有在UEFI固件或裸机程序中才需要手动操作寄存器。3.4 第四步PHY芯片调试实录——从MDIO扫描到链路协商网卡调试是飞腾2000/4C最耗时的环节。我曾为一块RTL8211F PHY调试了17小时最终发现是MDIO总线上的一个0.1uF退耦电容虚焊。诊断流程确认MAC与PHY物理连接。用万用表测MAC的MDIO/MDC引脚与PHY的MDIO/MDC引脚是否导通。飞腾2000/4C的MAC0 MDIO通常映射到GPIOA Bank的PIN_45/PIN_46必须确保PCB走线无断点。在UEFI Shell下扫描MDIO设备。输入mdio scan应返回类似PHY 0x00的设备列表。若无返回说明MDIO通信失败检查BL2是否加载了正确的MDIO驱动MdioDxe和时钟配置。读取PHY ID。输入mdio read 0 2读PHY地址0的寄存器2标准PHY的REG2是PHY ID的高16位应返回0x001cRTL8211F的ID。若返回0xffff说明PHY未响应重点查nRST引脚电平和供电。强制设置链路模式。若自动协商失败可手动设置mdio write 0 0 0x2100REG0写0x2100即100Mbps全双工。再用mdio read 0 1读REG1BMSRbit2Link Status应为1。Linux内核层面验证。启动进入麒麟V10后执行# 查看PHY绑定状态 cat /sys/class/net/eth0/device/phydev_name # 应输出0:00 # 查看链路状态 ethtool eth0 | grep Link detected # 应为yes # 查看PHY寄存器需root devmem2 0x12001000 w 0x00000000 # 写MDIO地址寄存器 devmem2 0x12001004 w 0x00000002 # 写MDIO数据寄存器读REG2devmem2直接操作内存映射的MDIO控制器寄存器比mii-tool更底层能绕过内核PHY子系统的缓存精准定位硬件问题。4. 常见问题与排查技巧实录那些官方文档绝不会写的坑飞腾2000/4C调试中80%的问题源于“文档没写”、“厂商隐瞒”、“生态不兼容”。以下是我在十几个项目中踩过的坑附带独家排查技巧。4.1 UEFI启动U盘识别失败不是U盘问题是FAT32分区表缺陷现象U盘在Windows下格式化为FAT32放入EFI/BOOT/BOOTAA64.EFI但在FT-UEFI中map命令看不到fs1:。根源FT-UEFI的FAT32驱动对分区表MBR有严格要求。它不支持“扩展分区”或“逻辑分区”只认主引导记录MBR中第一个活动分区Active Flag0x80且类型为0x0CFAT32 LBA。很多Windows磁盘管理工具格式化时默认创建的是“Microsoft Reserved Partition”“Basic Data Partition”后者类型为0x07UEFI无法识别。解决方案用diskpart在Windows下彻底清理U盘diskpart list disk select disk X # X是你的U盘编号 clean create partition primary active format fsfat32 quick assign exit手动复制EFI文件到根目录确保路径为\EFI\BOOT\BOOTAA64.EFI注意反斜杠和大小写。独家技巧FT-UEFI的FAT32驱动不支持长文件名LFN所有文件名必须是8.3格式。BOOTAA64.EFI不能写成bootaa64.efi或BOOTAA64.EFI.bak否则启动失败且无任何提示。4.2 银河麒麟V10安装后黑屏GOP驱动与屏参不匹配现象安装麒麟V10后GRUB菜单可见但进入系统后黑屏SSH可连。根源FT-UEFI的GOP驱动已初始化显示控制器但Linux内核的DRM驱动如phytium-drm试图接管显存导致冲突。更常见的是GOP驱动里硬编码的屏参如Hsync脉宽、Vsync前沿与你的LCD屏不一致造成时序错误。解决方案启动时按e编辑GRUB启动项在linux行末尾添加videoHDMI-A-1:1920x108060根据你的屏规格调整。若无效需重新编译内核DRM驱动修改drivers/gpu/drm/phytium/phytium_drm_crtc.c中的phytium_crtc_mode_set_nofb函数硬编码正确的时序参数。终极方案联系飞腾FAE索要针对你屏型号的定制GOP固件.efi文件用uefitool替换FIP中的bl33.bin。4.3 GPIO中断无法触发中断号映射错误现象配置GPIO_12为中断输入request_irq返回0但中断服务程序ISR从不执行。根源飞腾2000/4C的GPIO中断不是直连GICGeneric Interrupt Controller而是先汇聚到GPIO控制器的IRQ线再由GPIO控制器上报给GIC。GPIOC Bank的中断号不是固定的它取决于SoC设计——在FT-2000/4C中GPIOC的IRQ是GIC SPI 128但设备树中必须写成interrupts GIC_SPI 128 IRQ_TYPE_LEVEL_HIGH而非128。解决方案查《FT-2000/4C Interrupt Mapping.xlsx》确认GPIOC对应的GIC SPI号。在设备树中GPIO控制器节点必须包含interrupt-parent gic和interrupts属性。在驱动中request_irq的第一个参数必须是irq_of_parse_and_map(np, 0)获取的映射号而非硬编码的128。4.4 PHY链路时好时坏PCB布局与信号完整性现象网卡有时能up有时ethtool eth0显示Link detected: no且无规律。根源PHY的MDIO总线是半双工、低速2.5MHz但对信号完整性要求极高。PCB上MDIO/MDC走线若过长10cm、未包地、或靠近高速信号如PCIe就会引入噪声导致MDIO读写错误。解决方案用示波器测MDIO波形看上升沿是否过缓10ns或有过冲。理想波形是干净的方波。在MDIO/MDC线上各加一个100Ω串联电阻靠近PHY端抑制反射。将MDIO/MDC走线改为微带线两侧铺满地铜长度控制在5cm以内。若仍不稳定可在BL2的PHY驱动中增加MDIO重试次数默认3次改为10次。4.5 无法安装WindowsUEFI启动与NTFS的天然冲突现象将Windows 10 ISO写入U盘选择UEFI启动报错“Windows cannot be installed to this disk. The selected disk is of the GPT partition style.” 或 “This computers hardware may not support booting to this disk.”根源飞腾2000/4C的FT-UEFI只支持FAT32格式的ESP分区而Windows安装程序要求ESP分区必须是FAT32且包含/EFI/Microsoft/Boot/bootmgfw.efi。但Windows ISO解压后boot.wim中的启动文件是NTFS格式UEFI无法直接读取。解决方案无解。飞腾平台官方不支持Windows桌面版仅支持Windows Server 2019 ARM64版且需从微软官网下载专用ISO含ARM64 UEFI驱动。民用Windows 10/11 x64版因缺少飞腾CPU的微码和驱动无法启动。最后分享一个小技巧调试时与其反复烧录SPI Flash不如用JTAG调试器如J-Link加载BL33到DDR中运行。飞腾提供ft-jtag-loader工具可将bl33.bin直接加载到0x88000000地址并跳转绕过FIP验证极大加速固件迭代。但注意此方式不经过BL1/BL2DDR和PHY不会初始化只能用于纯UEFI逻辑调试。