# MBM (Motorola Boot Module) 工作流程全面分析 分析日期: 2026-07-10 | 平台: Intel PXA270 (PENGLAI/Motorola E6) | 版本: BOOT_G_00.02.21P_MACAU---## 一、基本信息| 项目 | 内容 ||------|------|| 二进制文件 | D:\DownLoads\Motorola\SBF\mbm — 48,393 字节 (47.3 KB) || ELF 文件 | mbm.elf — 6,186 字节 (ARM 反汇编用) || 二进制镜像 | mbm.bin — 3,724 字节 || 架构 | ARM32 Little-Endian (ARMv5TE) || CPU | Intel PXA270 Bulverde (XScale 核心) || 目标设备 | Motorola ROKR E6 / E6e (代号 **PENGLAI**) || 时钟频率 | 312 MHz (13 MHz * L16 * 2N3 / 2) || SDRAM | 48 MB 0xA0000000 (分区032MB 分区316MB) || Flash | 64 MB Intel StrataFlash (2x32MB K3 芯片 CS0CS1) || PMIC | PCAP2 (通过 SPI 通信) || 版本 | BOOT_G_00.02.21P_MACAU || 版权 | (c) Copyright Motorola 2004, All Rights Reserved. |---## 二、MBM 是否基于 apboot 构建**是确凿无疑。**### 证据 1start.S 中的条件编译apboot/src/blob/start.S 中遍布 #ifdef MBM / #ifndef MBM 编译分支。MBM 模式下执行启动原因保存、APD 清除等专属代码非 MBM 模式时执行时钟/Memory/MMU 等初始化。### 证据 2版本历史apboot 代码头部记载 Motorola 从 2002 年至 2006 年的持续修改最终于 **2006-06-15 加入 PengLai 支持**你的设备。### 证据 3文件级对应| MBM 文件 | apboot 源码 | 功能 ||----------|-------------|------|| startup.S | start.S | reset_handler, SDRAM 初始化 || mbm.c:mbm_hw_init() | HW_init.c:penglai_hw_init() | GPIO/串口/Flash 初始化 || mbm.c:mbm_detect_boot_mode() | boot_modes.c | 按键检测 模式判定 || mbm.c:mbm_enter_usb_flash() | boot_modes.c:naked_usb_flash() | USB 刷机循环 || platform.h | lubbock.h pxa.h | 硬件寄存器定义 |### 证据 4构建系统通过 -DMBM 编译选项启用 MBM 代码路径XIP 运行于 Flash 0x00020000。**结论MBM 是 apboot/blob 的子集 前置阶段完成硬件初始化后跳转到 blob (0x00080000)。**---## 三、Flash 分区布局| 偏移量 | 大小 | 名称 | 说明 ||--------|------|------|------|| 0x00000000-0x00008000 | 32 KB | mtd0 | 复位向量 (4字节分支指令) || 0x00008000-0x00010000 | 32 KB | mtd1 | 空 / 未使用 || 0x00010000-0x00018000 | 32 KB | mtd2 | 空 / 未使用 || 0x00018000-0x00020000 | 32 KB | mtd3 | 空 / 未使用 || 0x00020000-0x00060000 | 256 KB | mtd4 (MBM) | 完整 Bootloader || 0x00060000-0x00080000 | 128 KB | CONFIG | KCT 配置表 || 0x00080000-0x000A0000 | 128 KB | BLOB | blob bootloader || 0x000A0000-0x001A0000 | 1 MB | KERNEL | Linux zImage || 0x001A0000-0x00BA0000 | 10 MB | RESOURCE | 预置资源 || 0x00BA0000-0x011A0000 | 6 MB | USERFS_DB | 用户数据库 || 0x02200000-0x04000000 | 30 MB | ROOTFS | root 文件系统 |mtd0 仅含 4 字节BAL 0x00030224与 mtd4 构成冗余引导。---## 四、完整启动流程### Step 1: CPU 上电复位PC Flash 0x00000000 (mtd0) - BAL 0x30224 - CADDO 验证 - MBM 0x20000### Step 2-3: 异常向量表 CPU 初始化8 条 ARM B 指令。CP15 禁用 MMU/Cache/TLB设置 DomainManager屏蔽中断。### Step 4: SDRAM 初始化 (严格按 PXA270 手册 Step 1-10)MDCNFG0x0AAC2ACC, MDREFR0x205A602E, 200us 等待, 状态机转换, 8x CBR, MDMRS0x00220032### Step 5: 时钟切换CCCR0x02000190 - 312MHz, Turbo B1, BSCNTR/CKEN/PCFR 配置### Step 6: 标志检查 BP 握手REFLASH_FLAG/SLEEP_FLAG/USER_OFF_FLAG 检查, GPIO6/7 短路检测, MCU_INT_SW 握手序列### Step 7: 跳 C 代码SP0xA0100000-4, BL mbm_main()### Step 8: C 入口GPIO 配置, STUART 115200, K3Flash 同步, 模式检测 (充电/刷机/正常), LCDLogo, 链式加载 blob### Step 9: blob 加载内核复制自身到 SDRAM 0xA0001000, 加载 Kernel 到 0xA0200000, boot_linux()---## 五、反汇编函数映射| 地址 | 函数 | 功能 ||------|------|------|| 0x00020000 | _start / reset | 向量表 CPU/内存/时钟/握手 || 0x000201AC | change_frequency | CCCR0x02000190 - 312MHz || 0x00020250 | check_sleep_normal | 正常唤醒检查 || 0x00020278 | check_charge_boot | 充电/关机检测 BP 握手 || 0x000202E0 | user_off_handshake | 用户关机 BP 握手 || 0x0002036C | scrub_sdram | 清 SDRAM 设栈 跳 C || 0x00020410 | set_gpio_mode | GPIO 功能配置 || 0x000204D4/8 | gpio_set/clear | GPIO 置位/清零 || 0x00020554/8 | mbm_delay_us/ms | 延时函数 || 0x000205F0 | mbm_hw_init | 硬件初始化 || 0x000206C4 | mbm_stuart_init | STUART 串口 115200 || 0x00020770/C4/F0 | 串口输出 | putc/puts/puthex || 0x00020824 | mbm_k3flash_sync_mode | Flash 同步模式 || 0x00020870 | mbm_usb_gpio_init | USB GPIO (6-pin) || 0x000208E0 | mbm_is_key_pressed | 按键消抖检测 || 0x00020928 | mbm_detect_boot_mode | 启动模式检测 || 0x00020A58 | mbm_enter_usb_flash | USB 刷机入口 (死循环) || 0x00020AE4/28 | mbm_lcd_init/show_logo | LCD Logo || 0x00020B74 | mbm_main | C 主入口 |---## 六、关键硬件寄存器**CP15**: Control0x78/0x2001, TLB/Cache 刷新, Domain0xFFFFFFFF**CCCR**: 0x02000190 - 312MHz**MDCNFG**: 0x0AAC2ACC, **MDREFR**: 0x205A602E, **MDMRS**: 0x00220032**GPIO**: BP_RDY0, WDI_AP4, nSDCS321, MCU_INT_SW41, BB_RESET116, USB_READY99**引导标志**: FLAG_ADDR0xA0000000, POWERUP_REASON0xA000000CUSER_OFF0x5A5A5A5A, SLEEP0x6B6B6B6B, OFF0x7C7C7C7C, REFLASH0x0C1D2E3F**启动原因**: 0x01电源键, 0x02充电器, 0x03USB, 0x04看门狗, 0x05RTC, 0x06BP_WDI---## 七、TCMD 命令协议包格式: [0:3]CommandID [4:7]参数个数 [8:...]参数12 条命令: FLASH_WRITE/RED/ERASE/VERIFY, GET_VERSION/STATUS, SET_MODE, SECURITY_CHECK, OTP_READ/WRITE, BP_FORWARD, RESET---## 八、错误代码ERR_NONE0, ERR_TCMD_ISSUED1, ERR_OTP_REG_RW2, ERR_BP_NOT_READY3, ERR_UNKNOWN4, ERR_FLASHING_FAILED5, ERR_ADOGMBM_SEC6, ERR_SECURITY7, ERR_VERSION8---## 九、两种代码结构对比| 特征 | mbm_armv5te/ | mbm_penglai/ ||------|-------------|-------------|| CPU 假设 | TI OMAP850 (ARM926EJ-S) | Intel PXA270 (XScale) || SDRAM | 0x10000000 | 0xA0000000 || USB | MUSB | PXA270 UDC || 风格 | 教材级/16文件 | 还原级/单文件 |早期逆向误判为 Neptune (ARM7TDMI, 大端), 修正为 PXA270 (小端)。---## 十、关键发现1. **XIP 执行**: MBM 直接在 Flash 中执行, 不复制到 SDRAM2. **完整 SDRAM 初始化**: MBM 自行完成 PXA270 全部初始化流程3. **两级冗余引导**: mtd0 (4B) mtd4 (完整 MBM)4. **ADOG 安全**: 签名验证 版本检查 (防回滚)5. **BP 握手**: GPIO 序列 超时断电保护6. **无收发器 USB**: 6-pin 直连, GPIO99 模拟插拔7. **刷机按键**: \*#电源 (0x04000022), 40ms 消抖8. **电源管理**: 睡眠/关机恢复 GPIO6/7 短路检测---## 十一、时间线0ms复位 - 1usmtd0 - 1msMBM向量 - 2msCPU初始化 - 5msSDRAM - 10ms312MHz - 15ms跳C - 16msHW - 20ms模式检测 - 25msLogo - 50ms跳blob - 55msblob - 60msC入口 - 120ms加载Kernel - 130msboot_linux - **132msLinux引导**--- 分析日期: 2026-07-10 | 数据: D:\DownLoads\Motorola\SBF D:\DownLoads\Motorola\apboot