手把手教你搞定HI3798MV200的SPI NAND启动:从EMMC切换到Flash的完整避坑指南
HI3798MV200 SPI NAND启动全流程实战从EMMC迁移到Flash的深度避坑手册当我们需要为HI3798MV200平台更换存储介质时从EMMC切换到SPI NAND Flash启动是一个常见但充满挑战的任务。这不仅涉及硬件启动模式的变更还需要对UBOOT配置、内核驱动和硬件接口有深入理解。本文将带你一步步完成这个转换过程重点解决那些容易忽略的关键配置项和编译依赖关系。1. 准备工作与环境搭建在开始之前确保你已经准备好以下工具和环境HiTool工具链必须使用与HI3798MV200芯片匹配的版本。版本不兼容会导致各种难以排查的问题。HiRegBin工具用于修改寄存器配置这是调整启动模式的关键。开发板硬件确认你的HI3798MV200开发板支持SPI NAND Flash并了解其硬件连接方式。提示建议在开始前备份原始的EMMC启动镜像以防转换失败需要回退。配置文件的路径结构通常如下source/ ├── boot/ │ ├── sysreg/ │ │ ├── hi3798mv200_reg_base_v1.5.9.bin │ │ └── hi3798mv2dmc_hi3798mv200_DDR4-2133_2GB_16bitx2_4layers.reg │ └── fastboot.mak └── config/ └── hi3798mv200/ └── hi3798mv2dmo_hi3798mv200_cfg.mak2. UBOOT配置的关键修改2.1 寄存器配置调整使用HiRegBin工具加载寄存器配置文件时需要注意以下几点选择正确的芯片型号HI3798MV200加载基础寄存器文件source/boot/sysreg/hi3798mv200_reg_base_v1.5.9.bin导入具体配置source/boot/sysreg/hi3798mv2dmc_hi3798mv200_DDR4-2133_2GB_16bitx2_4layers.reg在配置表中特别关注以下SPI NAND相关设置配置项原始值(EMMC)修改值(SPI NAND)备注启动方式EMMCSPI自动修改管脚复用SPI时钟-适当频率根据Flash规格调整片选信号-正确片选通常CS02.2 关键宏定义修改一个常见的陷阱是SPI NAND驱动未被编译进去这通常是因为缺少必要的宏定义。检查并修改以下文件// config/hi3798mv2x.h #define CONFIG_SPI_NAND_SUPPORT 1 // 必须添加此定义 #ifdef CONFIG_SPI_NAND_SUPPORT #define CONFIG_HIFMC100_SPI_NAND_SUPPORT #endif这个修改会影响到两个关键驱动文件drivers/mtd/nand/hinfc_init.cdrivers/mtd/nand/nand.c注意如果这些修改后SPI NAND仍然不工作建议在驱动中添加调试打印确认相关代码段是否被执行。3. 硬件启动模式切换实战3.1 管脚复用配置在从EMMC切换到SPI NAND时管脚复用配置至关重要在配置工具中找到SPI NAND相关管脚确保启动方式选择为SPI验证以下关键信号线SPI_CLKSPI_MOSISPI_MISOSPI_CS3.2 烧写流程调整SPI NAND的烧写流程与EMMC有所不同使用HiTool选择SPI NAND作为目标设备调整烧写参数页大小(Page Size)块大小(Block Size)ECC设置确认烧写结果检查校验和尝试读取烧写的内容常见问题排查表问题现象可能原因解决方案烧写失败片选信号错误检查CS管脚配置读取异常时钟频率过高降低SPI时钟频率数据校验错误ECC配置不当调整ECC参数4. 驱动移植与内核配置4.1 SPI NAND驱动移植确保内核中包含SPI NAND驱动支持make ARCHarm CROSS_COMPILEarm-histbv320-linux- menuconfig导航到Device Drivers → Memory Technology Device (MTD) support → NAND Device Support → * Support for NAND Flash on HIFMC100 controller * Support for SPI NAND Flash on HIFMC100 controller4.2 设备树配置在设备树文件中添加SPI NAND节点hifmc { status okay; nand0 { compatible spi-nand; reg 0; spi-max-frequency 50000000; #address-cells 1; #size-cells 1; }; };5. 网络功能调试技巧5.1 PHY复位问题解决当遇到网络不通时PHY复位是常见问题。修改设备树中的PHY复位配置phy-gpio-base 0xF8B27000; // GPIO7基地址 phy-gpio-bit 1; // GPIO7_1同时需要修改驱动代码确保正确处理硬复位// drivers/net/ethernet/hisilicon/higmac/board.c if (use_gpio_reset) { higmac_hw_phy_gpio_reset(priv); } else { higmac_hw_phy_soft_reset(priv); }5.2 网络状态灯配置对于RTL8211 PHYLED配置可以通过phy_fix.c中的修复函数实现static void rtl8211f_phy_fix(struct phy_device *phydev) { // 配置LED行为 phy_write(phydev, 0x1F, 0x0000); // 选择page 0 phy_write(phydev, 0x10, 0x71B7); // LED0作为链接指示灯 phy_write(phydev, 0x11, 0xE407); // LED1作为活动指示灯 }6. 系统集成与测试6.1 启动参数调整修改UBOOT环境变量以适应SPI NAND启动setenv bootargs mem512M consolettyAMA0,115200 root/dev/mtdblock2 rootfstypesquashfs mtdpartshifmc100:1M(boot),4M(kernel),11M(rootfs) setenv bootcmd nand read 0x42000000 0x100000 0x400000; bootm 0x42000000 saveenv6.2 性能优化建议根据实际使用情况可以调整以下参数提升SPI NAND性能增加SPI时钟频率在Flash规格允许范围内优化ECC配置平衡可靠性和性能调整MTD分区减少擦写操作对性能的影响7. 高级调试技巧当遇到难以解决的问题时以下调试方法可能会有所帮助UBOOT下的SPI NAND访问测试nand info # 查看NAND信息 nand read addr off size # 读取测试 nand write addr off size # 写入测试内核驱动调试 在驱动关键函数添加打印如printk(KERN_DEBUG hinfc_init: entering probe function\n);信号测量 使用示波器检查以下信号SPI时钟信号是否正常片选信号是否在操作期间有效数据线是否有正确的波形移植过程中最耗时的往往是那些不起眼的配置细节比如那个未定义的CONFIG_SPI_NAND_SUPPORT宏就让我花费了两天时间排查。建议在修改任何配置后都进行完整的清理和重新编译避免缓存导致的奇怪问题。