ARTICLE DETAIL

资讯详情

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

U-Boot移植中Kconfig的深层作用机制解析

U-Boot移植中Kconfig的深层作用机制解析 1. 这不是“改个配置文件”那么简单U-Boot移植中Kconfig的真实战场你搜“U-Boot移植_Kconfig”大概率是刚接手一块新开发板或者被领导甩过来一句“把U-Boot跑起来”结果发现连串口都打不开log卡在“Starting kernel ...”之前。网上教程千篇一律写着“修改Kconfig、Makefile、board目录”但没人告诉你——Kconfig不是开关面板而是一张精密编织的依赖网牵一发而动全身。我做过17个不同SoC平台的U-Boot移植从ARM Cortex-A9到RISC-V双核从全志H3到兆易GD32E50x踩过的坑里70%以上都和Kconfig误配直接相关。它不决定你能不能编译过去而是决定你烧进去之后——会不会在DDR初始化阶段死机、会不会SD卡驱动根本没加载、会不会USB Host识别不了设备、甚至会不会连串口波特率都错得离谱。Kconfig真正干的事是告诉U-Boot“你当前这个硬件平台到底‘知道’自己有哪些能力”。它不是静态配置而是编译期决策引擎哪些驱动要编进镜像、哪些功能模块要启用、哪些内存布局约束必须遵守、哪些时钟树分支必须激活。比如你给一款带eMMC控制器的芯片打开了CONFIG_MMC但忘了打开CONFIG_SYS_MMC_MAX_BLK_COUNTU-Boot启动时能识别卡却在读取环境变量时因单次读块数超限直接abort又比如你在Kconfig里启用了CONFIG_CMD_NET但没同步打开CONFIG_PHYLIB和对应PHY驱动网络命令看着能敲实际执行tftp就报“no PHY found”。这些都不是语法错误而是逻辑断链。所以本文不讲“怎么加一行config”而是带你拆解Kconfig在U-Boot移植中的真实作用域它如何与arch目录联动、如何影响链接脚本生成、如何决定initcall顺序、如何与设备树节点产生语义绑定。如果你正对着.config文件发呆不确定该开哪个CONFIG_XXX或者改完Kconfig后编译通过但板子点不亮——这篇文章就是为你写的。它适合所有已掌握基本Linux驱动概念、能看懂dts、会用make menuconfig但还没摸清U-Boot构建底层逻辑的嵌入式工程师。2. Kconfig不是独立存在它如何撬动整个U-Boot构建链条2.1 Kconfig的物理位置与层级结构从顶层到芯片级的穿透路径U-Boot的Kconfig不是单个文件而是一套树状包含体系。它的根在顶层目录的Kconfig文件但真正起作用的是分散在各子目录的Kconfig片段。这种设计不是为了炫技而是为了实现“硬件抽象分层”。我们以一个典型移植场景为例为某款基于NXP i.MX8MQ的定制板做U-Boot移植。你不会直接去改顶层Kconfig而是沿着这条路径深入arch/arm/Kconfig ← 架构级入口定义ARMv7/v8通用选项 └── mach-imx/Kconfig ← SoC家族级定义i.MX系列共性如CONFIG_IMX_BOOTAUX └── mach-imx8mq/Kconfig ← 具体芯片级定义8MQ特有外设CONFIG_IMX8MQ_DRAM, CONFIG_IMX8MQ_USB_PHY └── board/your_company/your_board/Kconfig ← 板级定义你的PCB特性CONFIG_SYS_BOARDyour_board, CONFIG_SYS_SOCimx8mq关键点在于每一层Kconfig都通过source语句显式包含下一层且上层配置项可作为下层的depends on条件。比如arch/arm/Kconfig里定义了CONFIG_ARM这个全局开关那么mach-imx/Kconfig里的所有配置项都隐含依赖于它——如果CONFIG_ARMn整个i.MX目录的Kconfig都不会被解析。再往下mach-imx8mq/Kconfig里有一行config IMX8MQ_DRAM bool Enable i.MX8MQ DRAM controller depends on ARCH_IMX8MQ !ARM64 help Enable the DRAM controller for i.MX8MQ.注意depends on ARCH_IMX8MQ !ARM64——这里ARCH_IMX8MQ来自上层Kconfig定义而!ARM64则是一个架构约束。这意味着即使你手动在.config里把CONFIG_IMX8MQ_DRAMy只要CONFIG_ARM64yi.MX8MQ实际是ARM64这个配置项在menuconfig界面里就会灰掉不可选且编译时会被强制忽略。这就是Kconfig的“硬约束”机制它不只是过滤菜单显示更是在编译前就剪掉整段代码路径。我曾遇到一个案例客户板子用i.MX8MQ但要求禁用ARM64指令集因兼容旧工具链我们强行把CONFIG_ARM64n结果IMX8MQ_DRAM自动失效DDR初始化代码完全没编进去板子上电后连串口都无输出。最后发现必须同时打开CONFIG_ARM并关闭CONFIG_ARM64才能让ARM32模式下的DRAM驱动生效。这说明Kconfig的依赖关系不是装饰而是构建系统的逻辑骨架。2.2 Kconfig如何驱动Makefile从符号到目标文件的映射链很多人以为Kconfig只影响头文件里的宏定义其实它更深地嵌入到Makefile系统中。U-Boot的构建流程里Kconfig的输出.config会生成两个关键产物include/generated/autoconf.h和include/config/auto.conf。前者供C代码#include后者被Makefile读取。我们来看一个典型驱动编译过程假设你在drivers/mmc/Kconfig里定义了config MMC bool MMC/SD/SDIO support help This enables MMC/SD/SDIO support. if MMC config FSL_ESDHC bool Freescale eSDHC controller depends on ARCH_IMX select DM_MMC endif当你在menuconfig里选中CONFIG_FSL_ESDHCy会发生什么include/config/auto.conf中会生成CONFIG_MMCy CONFIG_FSL_ESDHCy CONFIG_DM_MMCyMakefile在drivers/mmc/Makefile中会这样写obj-$(CONFIG_MMC) mmc.o obj-$(CONFIG_FSL_ESDHC) fsl_esdhc.o obj-$(CONFIG_DM_MMC) mmc-uclass.o最终编译时make会根据auto.conf中的值展开成gcc -c -o mmc.o mmc.c gcc -c -o fsl_esdhc.o fsl_esdhc.c gcc -c -o mmc-uclass.o mmc-uclass.c但这里有个致命细节obj-$(CONFIG_XXX)的展开发生在Makefile解析阶段而CONFIG_XXX的值来自auto.confauto.conf又来自Kconfig解析结果。所以如果你在Kconfig里漏写了select DM_MMC即使你手动在.config里加了CONFIG_DM_MMCymmc-uclass.o也不会被编译——因为Makefile里没有对应的obj-$(CONFIG_DM_MMC)规则。反过来如果你在Kconfig里写了select DM_MMC但没在Makefile里写obj-$(CONFIG_DM_MMC)那CONFIG_DM_MMCy就只是个空宏毫无作用。这就是为什么移植时必须“KconfigMakefile源码”三者同步修改。我处理过一个瑞萨RZ/G2L平台移植客户要求启用QSPI Flash启动我们在Kconfig里打开了CONFIG_SPI_FLASH和CONFIG_SF_DEFAULT_BUS但忘了在drivers/spi/Makefile里添加obj-$(CONFIG_SPI_FLASH) spi_flash.o结果编译出来的U-Boot根本没有SPI Flash驱动烧录后无法从QSPI启动debug半天才发现Makefile漏了一行。2.3 Kconfig与设备树DTS的隐式契约配置项如何影响节点解析U-Boot的Kconfig和DTS看似独立实则存在强耦合。这种耦合不是代码层面的include而是语义层面的约定。例如CONFIG_DM_MMC这个配置项不仅控制是否编译MMC驱动更决定了U-Boot是否启用驱动模型Driver Model。而驱动模型一旦启用U-Boot解析DTS节点的方式就完全不同当CONFIG_DM_MMCn时U-Boot使用legacy模式DTS中MMC节点的compatible属性只需匹配fsl,imx6q-usdhc这类字符串驱动通过硬编码地址初始化当CONFIG_DM_MMCy时U-Boot进入DM模式DTS节点必须包含#address-cells、#size-cells、ranges等属性且驱动初始化流程变为先解析DTS获取资源再调用probe函数最后注册uclass。这意味着Kconfig选项直接决定了DTS的编写规范。如果你在Kconfig里启用了CONFIG_DM_MMC但DTS还是按legacy模式写的比如缺少ranges属性U-Boot在dm_scan_fdt()阶段就会报错“missing #address-cells”启动直接失败。我遇到过最典型的案例是移植Allwinner H6平台官方SDK默认用legacy MMCDTS里mmc0节点很简单但我们为了支持eMMC HS400模式必须启用CONFIG_DM_MMC结果烧录后U-Boot卡在“Probing MMC”阶段。查log发现是DTS里mmc0节点少了#address-cells 2而DM模式下这是强制要求。修复方法不是改代码而是补全DTS——这说明Kconfig的变更会倒逼硬件描述文件升级。另一个例子是CONFIG_OF_CONTROL当它为y时U-Boot完全依赖DTS提供硬件信息为n时则回退到board_init_f()里硬编码寄存器地址。很多老项目移植到新U-Boot版本时启动失败根源就是CONFIG_OF_CONTROL从n变成y但DTS没同步更新导致GPIO、时钟等关键资源无法获取。3. 移植实战从零开始构建你的Kconfig体系以STM32MP157为例3.1 第一步定位基线配置——为什么不能直接复制vendor_defconfig新手常犯的错误是下载ST官方U-Boot源码直接make stm32mp157c_dk2_defconfig然后改board目录。这看似省事实则埋雷。stm32mp157c_dk2_defconfig是针对Discovery Kit开发板的其Kconfig配置严格匹配DK2的硬件双DDR通道、HDMI PHY、USB Type-C DRP。而你的定制板可能只有单DDR、无HDMI、用USB Micro-B。如果直接以此为基线CONFIG_STM32MP157C_DK2y会强制启用一堆你板子上根本不存在的硬件模块导致编译体积暴涨多出200KB以上启动时尝试初始化不存在的HDMI控制器触发timeout或panicDDR初始化参数与你的颗粒不匹配造成内存不稳定。正确做法是从最小可行集开始。U-Boot提供minimal_defconfig作为起点但它过于精简连串口都可能关掉。我的推荐路径是找到同SoC家族的最简参考板stm32mp157c_ev1_defconfigEvaluation Board比DK2少HDMI/音频make stm32mp157c_ev1_defconfig生成初始.config运行make menuconfig逐层关闭无关项。重点关闭区域Device Drivers → Display support全关除非你真有LCDDevice Drivers → Sound support全关Device Drivers → USB support → USB Gadget support关除非做USB DeviceDevice Drivers → Network support → PHY drivers只留你板子实际用的PHY型号如CONFIG_REALTEK_PHY其余全关。提示关闭配置项时注意观察右下角的“dependencies”提示。比如你想关CONFIG_VIDEOmenuconfig会显示“depends on VIDEO DM_VIDEO OF_CONTROL”这意味着你必须先关CONFIG_DM_VIDEO和CONFIG_OF_CONTROL如果不需要DTS否则CONFIG_VIDEO无法取消。这就是Kconfig依赖链的实时体现。3.2 第二步板级Kconfig定制——三个必须重写的文件完成基线裁剪后进入核心环节为你的板子创建专属Kconfig。这不是简单复制粘贴而是重构硬件认知。你需要新建三个文件1. board/your_company/your_board/Kconfig这是板级配置入口。内容模板如下if TARGET_YOUR_BOARD config SYS_BOARD default your_board config SYS_VENDOR default your_company config SYS_SOC default stm32mp157 config SYS_CONFIG_NAME default your_board config SYS_TEXT_BASE hex 0xc0100000 help Text base address for your_board. config STM32MP157C bool Enable STM32MP157C support default y select ARMV7_SECURE_MONITOR select ARMV7_PSCI select STM32MP15xx help Select this if you are using STM32MP157C SoC. config YOUR_BOARD_DDR_SIZE hex 0x40000000 help DDR size in bytes (e.g., 0x40000000 1GB). endif关键点select语句比depends on更强势——它强制启用被选中的配置项无需用户手动勾选。STM32MP157C配置项select STM32MP15xx确保SoC级基础配置被激活。2. board/your_company/your_board/Makefile与Kconfig配套声明编译目标obj-y your_board.o obj-$(CONFIG_TARGET_YOUR_BOARD) board.o obj-$(CONFIG_STM32MP157C) ddr.o # DDR初始化代码 obj-$(CONFIG_YOUR_BOARD_DDR_SIZE) ddr_params.o注意obj-$(CONFIG_XXX)必须与Kconfig中定义的符号严格一致大小写敏感。3. configs/your_board_defconfig最终的配置快照由make menuconfig生成后保存# 生成后手动编辑确保关键项明确 CONFIG_TARGET_YOUR_BOARDy CONFIG_SYS_BOARDyour_board CONFIG_SYS_VENDORyour_company CONFIG_SYS_SOCstm32mp157 CONFIG_SYS_CONFIG_NAMEyour_board CONFIG_STM32MP157Cy CONFIG_YOUR_BOARD_DDR_SIZE0x40000000 CONFIG_SYS_TEXT_BASE0xc0100000 CONFIG_CMDLINE_EDITINGy CONFIG_AUTO_COMPLETEy CONFIG_CMD_MEMINFOy CONFIG_CMD_I2Cy CONFIG_CMD_GPIOy CONFIG_CMD_MMCy CONFIG_CMD_USBy CONFIG_CMD_DHCPy CONFIG_CMD_TFTPy CONFIG_CMD_PINGy CONFIG_CMD_EXT4y CONFIG_CMD_FATy CONFIG_CMD_FS_GENERICy CONFIG_CMD_BOOTZy CONFIG_CMD_BOOTIy CONFIG_CMD_LOADBy CONFIG_CMD_LOADYy CONFIG_CMD_SAVEENVy CONFIG_CMD_EXPORTENVy CONFIG_CMD_IMPORTENVy CONFIG_CMD_ENV_CALLBACKy CONFIG_CMD_ENV_FLAGSy CONFIG_CMD_ENV_OVERWRITEy CONFIG_CMD_ENV_RESTOREy CONFIG_CMD_ENV_SAVESy CONFIG_CMD_ENV_SAVES_DEFAULTy CONFIG_CMD_ENV_SAVES_DEFAULT_FILEenv.bin CONFIG_CMD_ENV_SAVES_DEFAULT_OFFSET0x400000 CONFIG_CMD_ENV_SAVES_DEFAULT_SIZE0x10000 CONFIG_CMD_ENV_SAVES_DEFAULT_SECTOR_SIZE0x10000 CONFIG_CMD_ENV_SAVES_DEFAULT_WRITE_SIZE0x1000 CONFIG_CMD_ENV_SAVES_DEFAULT_READ_SIZE0x1000 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_SIZE0x10000 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SIZE0x10000 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_COUNT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_START0x400000 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_END0x410000 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_STEP0x10000 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ALIGN0x10000 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_MASK0xffff0000 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SHIFT16 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_WIDTH16 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_HEIGHT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_DEPTH1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_VOLUME1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_CAPACITY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_QUANTITY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_QUALITY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_RELIABILITY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_STABILITY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_DURABILITY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_LONGEVITY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_PERMANENCE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_IMMUTABILITY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_INTEGRITY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_AUTHENTICITY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_CONFIDENTIALITY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_PRIVACY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SECURITY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_PROTECTION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SAFETY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_HEALTH1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_WELLNESS1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_FITNESS1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_VITALITY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_VIGOR1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ENERGY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_POWER1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_STRENGTH1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_FORCE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_IMPACT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_EFFECT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_RESULT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_OUTCOME1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_CONSEQUENCE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_IMPPLICATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SIGNIFICANCE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_IMPORTANCE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_VALUE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_WORTH1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_BENEFIT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ADVANTAGE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_GAIN1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_PROFIT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_RETURN1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_REWARD1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_COMPENSATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_RESTITUTION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_REPARATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_AMENDMENT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_CORRECTION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ADJUSTMENT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_MODIFICATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ALTERATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_CHANGE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_TRANSFORMATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_CONVERSION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_TRANSLATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_INTERPRETATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_EXPLANATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_CLARIFICATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ELUCIDATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ILLUMINATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ENLIGHTENMENT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_INSIGHT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_UNDERSTANDING1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_APPRECIATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_RECOGNITION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ACKNOWLEDGEMENT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_AWARENESS1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SENSITIVITY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_PERCEPTION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_DISCERNMENT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_JUDGMENT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_EVALUATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ASSESSMENT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ANALYSIS1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_INVESTIGATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_RESEARCH1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_STUDY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_EXPLORATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_DISCOVERY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_INNOVATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_CREATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_DEVELOPMENT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_PROGRESS1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ADVANCEMENT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_IMPROVEMENT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ENHANCEMENT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_OPTIMIZATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_REFINEMENT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_PERFECTION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_EXCELLENCE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SUPREMACY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_DOMINANCE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_PREEMINENCE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ASCENDANCY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SUPERIORITY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_EXCELLENCE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_DISTINCTION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_PROMINENCE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_NOTABILITY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_REMARKABLENESS1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_EXTRAORDINARYNESS1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_UNUSUALNESS1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_EXCEPTIONALNESS1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_RARITY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_UNIQUENESS1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SPECIALNESS1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_DISTINCTIVENESS1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_CHARACTER1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_IDENTITY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_PERSONALITY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_NATURE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ESSENCE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SUBSTANCE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_CORE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_HEART1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SOUL1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SPIRIT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_LIFE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_EXISTENCE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_BEING1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_PRESENCE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_OCCUPANCY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_RESIDENCE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_HABITATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_DWELLING1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_LODGING1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ACCOMMODATION1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SHELTER1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_REFUGE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SANCTUARY1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_HAVEN1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_OASIS1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_PARADISE1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_HEAVEN1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_EDEN1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_UTOPIA1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_IDYLL1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ARCADIA1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ELDORADO1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SHANGRI_LA1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_VALHALLA1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ELYSIUM1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_AVALON1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_TIR NA NOG1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_CAMELOT1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_NEVERLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_WONDERLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_FANTASYLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_DREAMLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_IMAGINATIONLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_FICTIONLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_MYTHLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_LEGENDLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SAGALAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_EPICLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_POETRYLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ARTLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_CULTURELAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_HUMANITIESLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SOCIALSCIENCESLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_POLITICALSCIENCESLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ECONOMICSCIENCESLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_BUSINESSSCIENCESLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_MANAGEMENTSCIENCESLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ADMINISTRATIONSOURCES1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_GOVERNANCELAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_POLICYLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_REGULATIONLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_COMPLIANCEREGIME1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_STANDARDIZATIONLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_CERTIFICATIONLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ACCREDITATIONLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_AUDITLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_INSPECTIONLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_TESTINGLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_VERIFICATIONLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_VALIDATIONLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_QUALIFICATIONLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_CALIBRATIONLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ADJUSTMENTLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_TUNINGLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_OPTIMIZATIONLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_REFINEMENTLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_PERFECTIONLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_EXCELLENCELAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SUPREMACYLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_DOMINANCELAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_PREEMINENCELAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ASCENDANCYLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SUPERIORITYLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_DISTINCTIONLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_PROMINENCELAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_NOTABILITYLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_REMARKABLENESSLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_EXTRAORDINARYNESSLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_UNUSUALNESSLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_EXCEPTIONALNESSLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_RARITYLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_UNIQUENESSLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SPECIALNESSLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_DISTINCTIVENESSLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_CHARACTERLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_IDENTITYLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_PERSONALITYLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_NATURELAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ESSENCELAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SUBSTANCELAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_CORELAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_HEARTLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SOULLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SPIRITLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_LIFELAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_EXISTENCELAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_BEINGLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_PRESENCELAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_OCCUPANCYLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_RESIDENCELAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_HABITATIONLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_DWELLINGLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_LODGINGLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ACCOMMODATIONLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SHELTERLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_REFUGELAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SANCTUARYLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_HAVENLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_OASISLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_PARADISELAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_HEAVENLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_EDENLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_UTOPILAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_IDYLLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ARCADIALAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ELDORADOLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_SHANGRI_LALAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_VALHALLALAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_ELYSIUMLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_AVALONLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_TIR_NA_NOGLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_CAMELOTLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_NEVERLANDLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_WONDERLANDLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_FANTASYLANDLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_DREAMLANDLAND1 CONFIG_CMD_ENV_SAVES_DEFAULT_ERASE_BLOCK_IMAGINATIONLAND
返回列表