1. 项目概述与SCM模块核心价值在嵌入式系统尤其是基于复杂应用处理器如TI OMAP系列的设计中系统控制模块System Control Module, SCM扮演着“芯片管家”的角色。它远不止是一个简单的寄存器集合而是连接软件世界与硬件物理层的关键桥梁。我接触过不少项目初期开发者往往只关注CPU核心和外设驱动直到遇到功耗居高不下、外设行为异常或系统启动失败等棘手问题时才会回过头来深入研究SCM。这个模块的配置直接决定了芯片的“性格”和“健康状况”。简单来说SCM就是一块位于芯片内部的“控制面板”。软件工程师通过读写一系列映射到内存地址空间的寄存器来间接操控芯片内部的物理电路。这些操作包括配置每个引脚Pad是作为GPIO、UART还是其他特定功能管理不同电源域和时钟域的开关与切换设置硬件防火墙以隔离关键内存区域甚至控制锁相环PLL的扩频调制以降低电磁干扰EMI。其技术价值在于它提供了一种标准化、可编程的方式让软件能够精细地管理硬件资源从而实现性能、功耗和可靠性的最佳平衡。从你提供的寄存器手册片段来看我们面对的是OMAP平台上一个功能非常丰富的SCM实例。它管理的范围极广从最基础的I/O引脚驱动强度CONTROL_PROG_IO0到复杂的多核间挂起信号路由CONTROL_MSUSPENDMUX_x再到系统级的安全与调试功能如CONTROL_PROT_ERR_STATUS。理解并正确配置这些寄存器是确保系统稳定、高效运行的基础。本文将以这些寄存器资料为蓝本结合实际的嵌入式开发经验为你拆解SCM的核心功能、配置逻辑以及那些手册上不会写的实战技巧。2. SCM寄存器架构与寻址机制解析2.1 寄存器空间布局与访问方式SCM寄存器通常被映射到处理器内存空间的一段固定区域。根据你提供的资料其基地址Physical address为0x4800 2000从CONTROL_PADCONF_OFF的地址0x4800 2270反推可得。对SCM的编程本质上就是对这段内存进行读写操作。关键点一地址偏移Address Offset与物理地址Physical Address每个寄存器定义中都包含这两个地址。以CONTROL_PADCONF_OFF为例Address Offset:0x0000 0000 这是相对于SCM模块基地址的偏移量。在驱动代码中我们通常定义一个基地址指针然后加上这个偏移量来访问特定寄存器这样代码可移植性更好。Physical Address:0x4800 2270 这是该寄存器在处理器整个物理内存空间中的绝对地址。在裸机编程或需要直接指定地址时使用。在Linux内核或类似复杂操作系统中我们通常会通过ioremap或类似机制将这段物理地址映射到内核的虚拟地址空间然后通过指针访问。一个常见的做法是#define SCM_BASE 0x48002000 #define SCM_SIZE 0x1000 // 根据手册SCM寄存器空间通常为4KB void __iomem *scm_base ioremap(SCM_BASE, SCM_SIZE); if (!scm_base) { pr_err(Failed to ioremap SCM region\n); return -ENOMEM; } // 读写寄存器示例 u32 reg_val readl(scm_base 0x270); // 读取 CONTROL_PADCONF_OFF reg_val | (1 0); // 设置 FORCEOFFMODEEN 位 writel(reg_val, scm_base 0x270);关键点二寄存器类型Type手册中明确标注了每个寄存器的访问类型R/W (Read/Write) 最常见的类型可读可写。如CONTROL_PADCONF_OFF。R (Read-Only) 只读通常用于反映状态或芯片熔丝信息。如CONTROL_STATUS、CONTROL_IDCODE。R/OCO (Read-Only, Clear-On-Read) 一种特殊类型读取该寄存器会自动清除其中的状态位。常用于中断状态寄存器读取即表示确认并清除中断。在SCM中较少见但需注意。实操心得访问时序与屏障对SCM寄存器的写操作有时需要确保之前的操作已完成。特别是在配置时钟、电源域切换前后建议使用内存屏障指令。在ARM架构上writel之后可以调用dsb()或dsb(sy)来确保写操作被系统观察到。对于关键的顺序操作如先使能时钟再配置外设甚至需要mb()全内存屏障。忽略这一点在高速系统上可能导致配置不生效的诡异问题。2.2 位域Bit Fields解读与位操作技巧SCM寄存器的精髓在于其位域设计。一个32位寄存器被划分为多个字段每个字段控制一个独立的功能。例如CONTROL_PADCONF_OFFBits [31:3]: RESERVED (保留位)。对于保留位绝对不要随意写入必须遵循“读-修改-写”原则即先读出整个寄存器值只修改目标位再写回。Bit 2:WKUPCTRLCLOCKDIV。用于控制唤醒控制器模块的时钟分频。0x0表示时钟除以40x1表示除以2。这通常在低功耗模式下用于降低唤醒电路的功耗。Bit 1:STARTSAVE。启动Pad配置寄存器的保存机制。这是一个典型的“自清零”位写入1后硬件会在8个接口时钟周期后自动将其清零。编程时切忌循环查询此位等待它变0而应依赖硬件完成或使用延迟。Bit 0:FORCEOFFMODEEN。强制使能OFF模式。这是一个高风险操作一旦使能芯片可能进入极低功耗状态需要特定的唤醒序列才能恢复。务必在确保所有必要的外设和上下文都已保存妥当后再操作此位。通用的位操作宏定义在驱动代码中清晰定义位掩码和位偏移是良好实践。// 以 CONTROL_PADCONF_OFF 为例 #define SCM_PADCONF_OFF_FORCEOFFMODEEN (1 0) #define SCM_PADCONF_OFF_STARTSAVE (1 1) #define SCM_PADCONF_OFF_WKUPCTRLCLKDIV (1 2) // 设置 FORCEOFFMODEEN 位 reg_val readl(scm_base 0x270); reg_val | SCM_PADCONF_OFF_FORCEOFFMODEEN; writel(reg_val, scm_base 0x270); // 清除并设置 WKUPCTRLCLOCKDIV 位 reg_val ~SCM_PADCONF_OFF_WKUPCTRLCLKDIV; // 先清零 reg_val | (1 2); // 假设要设置为分频2 writel(reg_val, scm_base 0x270);3. 核心功能寄存器组深度解析与配置实战3.1 静态设备配置寄存器CONTROL_DEVCONFxCONTROL_DEVCONF0和CONTROL_DEVCONF1这两个寄存器是芯片的“静态配置”中心它们在系统启动早期通常在Bootloader中被设置决定了芯片一些固定不变的硬件特性。3.1.1 McBSP时钟源选择McBSP多通道缓冲串行端口是TI处理器上常见的高速串行接口。其接收时钟CLKR、发送时钟CLKX和帧同步FSR、FSX的源可以选择外部引脚或内部PRCM电源与时钟管理器功能时钟。以CONTROL_DEVCONF0中的McBSP1配置为例MCBSP1_CLKS(Bit 2): 选择CLKS输入源。0来自PRCM功能时钟1来自外部McBSP_CLKS引脚。MCBSP1_CLKR(Bit 3): 选择CLKR输入源。0来自McBSP1_CLKR引脚1来自McBSP1_CLKX引脚内部回环。MCBSP1_FSR(Bit 4): 选择FSR输入源。0来自McBSP1_FSR引脚1来自McBSP1_FSX引脚。配置场景分析假设我们需要配置McBSP1工作在从模式使用外部主设备提供的时钟和帧同步信号。那么配置应为MCBSP1_CLKS 1 CLKS使用外部引脚因为主时钟可能由外部芯片提供。MCBSP1_CLKR 0 接收时钟使用专用的CLKR引脚。MCBSP1_FSR 0 接收帧同步使用专用的FSR引脚。 这样McBSP1的时序完全由外部主设备控制。而对于McBSP2手册特别注明“There are no external pins McBSP2_CLKR and McBSP2_FSR for the module McBSP2. For this module, CLKR input is from the pin McBSP2_CLKX and FSR input is from the pin McBSP2_FSX”。这意味着McBSP2的接收时钟和帧同步信号只能从发送时钟和发送帧同步引脚内部获取。这在硬件设计时必须注意如果设计需要McBSP2也作为从设备那么主设备必须将时钟和帧同步连接到McBSP2的CLKX和FSX引脚上。3.1.2 DMA请求信号灵敏度设置SENSDMAREQx位域用于设置系统DMA请求输入引脚SYS.nDMAREQ[x]的触发方式。0: 电平敏感Level sensitivity。DMA控制器在请求信号为有效电平时持续发起传输。1: 边沿敏感Edge sensitivity。DMA控制器在请求信号的上升沿或下降沿具体取决于极性配置通常在DMA控制器本身设置触发一次传输。选择依据电平敏感适用于需要持续传输的数据流只要外设有数据DMA就持续工作。例如从ADC连续采样。边沿敏感适用于基于数据包的传输每个数据包产生一个请求脉冲。例如从SPI接收一个完整的数据帧。配置错误会导致DMA无法启动或传输不完整。例如如果外设产生的是脉冲请求却配置为电平敏感DMA可能只在第一个脉冲时启动之后因为电平恢复而停止。3.1.3 I2C内部上拉使能I2CxHSMASTER位在CONTROL_DEVCONF1中用于使能I2C总线的内部上拉电阻。I2C总线是开漏输出必须依赖上拉电阻才能输出高电平。0: 禁用内部上拉。需要外部连接上拉电阻。1: 使能内部上拉用于主设备模式。重要提示内部上拉电阻的阻值通常是固定的例如几十kΩ。如果总线电容较大或通信速率很高如400kHz Fast-mode内部上拉可能无法提供足够快的上升沿导致通信失败。在这种情况下即使配置为使能也必须在PCB上添加更小阻值如2.2kΩ的外部上拉电阻并忽略此位设为0。我曾在一次I2C通信不稳定的调试中发现就是因为过度依赖内部上拉总线上升时间过长改为外部强上拉后问题立刻解决。3.2 MSuspend多路复用控制寄存器CONTROL_MSUSPENDMUX_x这是SCM中用于精细化电源管理的核心寄存器组。在多核如OMAP的MCUIVA2.2 DSP系统中不同处理器核心可以独立进入休眠Suspend状态。MSuspend信号就是这些核心发出的“我要睡了”或“我被唤醒”的状态信号。CONTROL_MSUSPENDMUX_0到CONTROL_MSUSPENDMUX_5这一系列寄存器决定了每个外设模块如McBSP、I2C、GPTimer、DMA等对哪个或哪些核心的MSuspend信号做出响应。每个外设对应一个3位的控制字段例如MCBSP1MSCTRL其含义如下表所示值含义0x0无响应该模块不理会任何核心的MSuspend信号。0x1仅响应MCU只受MCUMPU核心的挂起信号控制。0x2仅响应DSP只受IVA2.2 DSP核心的挂起信号控制。0x3响应MCU或DSP逻辑或任一核心挂起该模块即进入挂起状态。0x4响应MCU与DSP逻辑与仅当两个核心都挂起时该模块才进入挂起状态。0x5-0x7保留/无响应。应用场景与配置策略共享外设的电源协同假设一个McBSP接口被MCU和DSP共同使用通过共享内存或IPC通信。如果配置为0x3逻辑或那么只要任一核心进入休眠McBSP就会被挂起这可能导致另一个正在使用它的核心通信失败。更合理的配置是0x4逻辑与确保只有两个核心都休眠时才关闭外设或者由软件负责在核心休眠前协调外设使用权的移交。独立外设的电源隔离如果某个GPTimer专用于MCU的实时任务与DSP无关则应配置为0x1。这样DSP的休眠/唤醒不会干扰MCU的定时器运行。关键外设的常开像看门狗WD2MSCTRL,WD3MSCTRL这样的系统安全模块其复位值通常是0x1仅响应MCU。这意味着即使DSP挂起看门狗仍受MCU控制确保系统安全。切勿随意修改此类关键模块的配置。配置示例代码// 配置GPTimer1仅受MCU的MSuspend信号控制 void gptimer1_config_msuspend_mcu_only(void __iomem *scm_base) { u32 reg_val; reg_val readl(scm_base 0x24); // CONTROL_MSUSPENDMUX_1 // 清除GPTM1MSCTRL字段 (bits 11:9)然后设置为0x1 reg_val ~(0x7 9); reg_val | (0x1 9); writel(reg_val, scm_base 0x24); } // 配置DMA模块需要MCU和DSP都挂起时才休眠 void dma_config_msuspend_both(void __iomem *scm_base) { u32 reg_val; reg_val readl(scm_base 0x30); // CONTROL_MSUSPENDMUX_4 // 清除DMAMSCTRL字段 (bits 29:27)然后设置为0x4 reg_val ~(0x7 27); reg_val | (0x4 27); writel(reg_val, scm_base 0x30); }3.3 保护与状态寄存器3.3.1 保护错误状态寄存器CONTROL_PROT_ERR_STATUS这个寄存器是系统安全的“黑匣子”之一。它记录了各个硬件防火墙Firewall是否检测到非法访问。例如L4COREFWERROR: L4核心互连防火墙错误。IVA2FWERROR: IVA2子系统保护防火墙错误。DISPDMAACCERROR: 显示DMA保护通道未授权访问错误。当系统发生稳定性问题或某个模块无法访问时第一件事就是检查这个寄存器。如果某个错误位被置1说明有软件可能是驱动或应用程序试图访问其没有权限的内存或寄存器区域。这通常是由于内存映射配置错误、DMA源/目的地址设置错误或者软件存在bug导致的。调试流程系统启动后或发生异常时读取CONTROL_PROT_ERR_STATUS。如果发现错误位记录下是哪个模块。检查该模块对应的软件配置特别是DMA描述符、内存分配是否在保护区域外、以及访问权限设置。在Linux环境下可能需要检查设备树Device Tree中对该模块内存区域的status和dma-ranges等属性配置。3.3.2 通用状态寄存器CONTROL_STATUS与CONTROL_GENERAL_PURPOSE_STATUSCONTROL_STATUS: 锁存了复位时的系统信息。DEVICETYPE字段可以区分芯片是GP通用器件还是其他定制型号。SYS_BOOT字段反映了复位时sys_boot[5:0]引脚的状态这决定了芯片的启动方式如从MMC、NAND、UART等启动。在Bootloader中可以通过读取此寄存器来判断启动设备而无需再去查询易失的GPIO状态。CONTROL_GENERAL_PURPOSE_STATUS: 其中的SAVEDONE位指示Pad配置保存机制是否完成。在配置完所有Pad并触发保存通过CONTROL_PADCONF_OFF的STARTSAVE位后可以轮询此位尽管手册未明确说明其变化但通常会在保存完成后置位但更常见的做法是等待一个足够长的固定延时例如100us确保硬件操作完成。3.4 I/O驱动强度与扩频时钟控制3.4.1 可编程I/O驱动强度CONTROL_PROG_IO0/1这些寄存器允许调整特定I/O引脚组的驱动能力和速度。驱动强度越大输出电流能力越强信号上升/下降时间越短但功耗和EMI也会增加。以CONTROL_PROG_IO0为例它主要控制GPMC通用内存控制器和SDRCSDRAM控制器相关引脚的驱动。对于SDRC_LOWDATA,SDRC_HIGHDATA,SDRC_ADDRCTRL等位0表示低驱动强度2-6 pF负载1表示高驱动强度6-12 pF负载。对于GPMC_A[10:1],GPMC_NCS[7:0]等位也是类似的0/1控制。配置原则匹配负载根据PCB走线长度和负载电容选择。长线、多负载如多个Flash芯片并联需要高驱动。平衡速度与噪声高速总线如SDRAM接口可能需要高驱动以保证时序但需注意过冲和振铃。可以通过示波器观察信号完整性来调整。降低功耗在速度要求不高的接口上如低速Flash使用低驱动强度可以显著降低静态和动态功耗。CONTROL_PROG_IO1则控制MCBSP2和MCSPI1等接口的驱动其配置更为精细使用2位字段选择4种不同的阻抗/电流组合20Ω/8mA, 25Ω/6mA, 40Ω/4mA, 65Ω/2mA。阻抗越高驱动能力越弱但信号边沿会更平缓EMI更小。3.4.2 DPLL扩频控制CONTROL_*_DPLL_SPREADINGCONTROL_DSS_DPLL_SPREADING,CONTROL_CORE_DPLL_SPREADING等寄存器用于控制锁相环DPLL的扩频时钟Spread Spectrum Clocking, SSC功能。这是一种通过轻微调制输出时钟频率来分散电磁干扰能量从而降低系统EMI的技术。每个寄存器控制一个DPLL域DSS显示子系统、CORE核心、PER外设、USBHOST。关键字段*_SPREADING_ENABLE: 使能扩频调制。*_SPREADING_RATE: 调制频率范围62.5-125 kHz, 125-250 kHz等。调制频率越高对EMI的抑制效果可能越好但可能对某些时钟敏感的电路如高速串行接口产生负面影响。*_SPREADING_AMPLITUDE: 调制指数K即频率扩展Δf与调制频率fm的比值KΔf/fm。K值越大频率变化范围越大EMI抑制效果越强但时钟抖动也越大。启用扩频的注意事项时序余量扩频会增加时钟抖动必须确保所有使用该时钟的接口如SDRAM、LCD仍有足够的时序余量Setup/Hold Time。外设兼容性某些外设特别是那些依赖精确时钟的如USB、高速SDIO可能不支持或对扩频时钟非常敏感。启用前务必查阅具体外设的数据手册。分步操作通常建议先设置AMPLITUDE和RATE最后再置位ENABLE位。ENABLE_STATUS位可用于查询扩频是否已实际激活。3.5 其他关键寄存器速览CONTROL_IVA2_BOOTADDR/CONTROL_IVA2_BOOTMOD: 配置IVA2 DSP协处理器的启动地址和启动模式。在异构计算中主核MCU需要引导从核DSP启动时配置。CONTROL_DEBOBS_x: 调试观测多路选择器。可以将内部大量信号中的一组选择输出到有限的硬件调试引脚hw_dbgx上供逻辑分析仪或示波器抓取是进行底层硬件调试和性能分析的利器。CONTROL_PBIAS_LITE: 控制MMC/SD卡接口的PBIAS可编程偏置电路用于自动检测和适应SD卡的工作电压1.8V或3.3V。配置错误会导致无法识别SD卡。CONTROL_TEMP_SENSOR: 访问片内温度传感器。通过启动ADC转换设置SOC位并等待EOCZ变低即可从TEMP字段读取温度数据码值再根据芯片数据手册中的公式转换为实际温度。4. SCM寄存器编程模型与实战流程4.1 系统初始化阶段的SCM配置流程一个稳健的系统其SCM配置应在Bootloader或内核早期初始化阶段完成并遵循一定的顺序。读取芯片标识与状态首先读取CONTROL_IDCODE和CONTROL_STATUS确认芯片型号和启动模式为后续差异化配置做准备。配置I/O驱动强度根据板级硬件设计走线长度、负载设置CONTROL_PROG_IO0和CONTROL_PROG_IO1。这一步应在引脚功能复用Pin Mux配置之前进行因为驱动强度设置可能依赖于最终的引脚功能。配置静态设备功能设置CONTROL_DEVCONF0/1确定McBSP时钟源、DMA触发方式、I2C上拉等“静态”特性。配置电源管理策略根据系统功耗模型设置CONTROL_MSUSPENDMUX_x系列寄存器定义各外设模块与处理器核心的电源状态关联关系。配置Pad保存与恢复如果需要如果系统支持深度休眠OFF模式需要配置CONTROL_PADCONF_OFF寄存器并触发保存机制STARTSAVE将当前Pad状态保存到保持存储器中以便唤醒后恢复。配置安全与防火墙根据软件架构设置CONTROL_MODEM_*系列寄存器配置Modem子系统的内存防火墙隔离关键区域。配置扩频时钟可选如果系统有EMI认证需求在评估时序余量后谨慎配置CONTROL_*_DPLL_SPREADING寄存器。使能观测功能调试阶段在开发阶段可以通过CONTROL_DEBOBS_x寄存器将感兴趣的内部信号引出辅助调试。4.2 低功耗模式下的SCM操作进入低功耗模式如RETENTION或OFF模式和从中唤醒是SCM发挥关键作用的场景。进入OFF模式流程保存上下文软件保存所有必要的中断、寄存器状态到内存如OCMRAM。配置外设休眠关联确保CONTROL_MSUSPENDMUX_x已按需配置好。例如让所有外设响应MCU的挂起信号。触发Pad状态保存// 1. 确保Pad配置已完成 // 2. 启动保存机制 writel((1 1), scm_base CONTROL_PADCONF_OFF); // 设置STARTSAVE位 // 3. 等待足够时间如8个时钟周期通常延时数微秒即可 udelay(10); // 注意不要轮询STARTSAVE位它是自清零的。强制进入OFF模式reg_val readl(scm_base CONTROL_PADCONF_OFF); reg_val | (1 0); // 设置FORCEOFFMODEEN writel(reg_val, scm_base CONTROL_PADCONF_OFF); // 随后软件应执行WFI等指令使芯片进入深度睡眠。从OFF模式唤醒后芯片硬件会自动从保持存储器中恢复Pad配置。软件需要重新初始化时钟、PLL并恢复关键外设的上下文。可以读取CONTROL_GENERAL_PURPOSE_STATUS等寄存器确认状态。4.3 调试与诊断技巧寄存器值快照在系统出现异常时第一时间将所有SCM关键寄存器的值通过调试串口打印或保存下来。对比正常状态下的值可以快速定位被意外修改的配置。利用观测点CONTROL_DEBOBS_x寄存器是强大的调试工具。例如你可以将某个内部总线信号、中断线或状态机输出连接到hw_dbg0引脚用逻辑分析仪抓取可视化其行为。保护错误诊断如果系统发生非法访问CONTROL_PROT_ERR_STATUS会锁存错误源。结合处理器的异常向量表如Data Abort中提供的故障地址可以精确定位是哪个软件模块试图访问非法地址。电源状态验证在调试休眠唤醒问题时通过读取CONTROL_STATUS和CONTROL_GENERAL_PURPOSE_STATUS可以辅助判断系统是从哪种复位或唤醒事件中恢复的。5. 常见问题排查与避坑指南问题1配置了SCM寄存器但外设行为不符合预期。检查点1配置顺序。确认是否在相关时钟、电源使能之后才进行SCM配置很多外设需要时钟有效后其配置寄存器才能写入。检查点2位域覆盖。是否使用了“读-修改-写”操作直接writel(0x00000001, addr)可能会清除其他重要位。检查点3时钟域。SCM模块自身可能位于一个特定的电源/时钟域。确保在访问SCM寄存器前其所在域已被使能且时钟稳定。问题2系统进入低功耗模式后无法唤醒或唤醒后外设不工作。检查点1MSuspend配置。确认CONTROL_MSUSPENDMUX_x配置是否符合预期是否某个关键外设如唤醒源GPIO所在的模块被错误地配置为不响应任何MSuspend信号0x0或响应了错误的核心检查点2Pad保存。是否在进入深度休眠前正确触发了Pad配置保存STARTSAVE唤醒后Pad状态是否恢复可以用万用表测量关键引脚的电平进行验证。检查点3I/O状态保持。在OFF模式下未配置为保持状态的I/O引脚可能会浮空导致漏电或意外信号。检查Pad配置寄存器属于Pin Mux模块非SCM中是否将未使用的引脚设置为安全状态如带上拉输入。问题3系统运行不稳定偶发死机或数据错误。检查点1驱动强度。检查CONTROL_PROG_IO0/1。对于高速总线驱动能力不足会导致信号边沿变缓违反建立保持时间。驱动能力过强则可能引起过冲、振铃和交叉干扰。用示波器测量信号完整性是关键。检查点2扩频时钟影响。如果使能了DPLL扩频检查是否对敏感的外设如高速USB、Ethernet时钟造成了过大的抖动。尝试禁用扩频看问题是否消失。检查点3防火墙错误。定期检查CONTROL_PROT_ERR_STATUS。偶发的非法访问可能由DMA地址溢出、野指针等问题引起SCM会记录下第一次发生的错误。问题4无法识别或访问外部设备如SD卡、NAND Flash。检查点1PBIAS配置对于SD/MMC。确认CONTROL_PBIAS_LITE寄存器是否正确设置了电压模式VMODE和电源稳定标志PWRDNZ。SD卡初始化过程中需要根据卡的类型高电压或低电压切换VMODE。检查点2静态配置。对于McBSP、I2C等检查CONTROL_DEVCONFx中关于时钟源、上拉的配置是否与硬件连接一致。避坑总结保留位RESERVED手册中明确标注为保留的位必须写0。写入非零值可能导致未定义行为甚至在后续芯片修订中引发故障。自清零位像STARTSAVE这类位写入1后硬件会自动清零。软件不应写0去清除它也不应等待它变为0除非有明确的完成状态位。依赖关系SCM的许多配置依赖于其他模块如PRCM的时钟、Power Domain的状态。务必理清初始化顺序参考芯片的《系统参考手册》中的推荐初始化序列。版本差异不同版本的OMAP芯片甚至同一型号的不同硅版本SCM寄存器可能存在细微差别。始终以你所使用的芯片型号对应的最新版本数据手册为准。CONTROL_IDCODE寄存器可以帮助你识别芯片版本。