[0x100] 启动类型
存储启动方式
- 支持 16位 /8位 外部静态内存启动 [External Static Memory Boot];
- 内部 ROM 启动 [Internal ROM Boot] ;
[0x200] 多种启动模式
[0X201] 系统引导模式的引脚 RST_CFG 配置差异
[0X202] 引脚 RST_CFG 位选项
[0x203] 引导模式启动顺序
[0x210] 拓展静态存储引导启动[External Static Memory Boot]
- 将 nSCS[0]设置为 ADDR[0x0000 0000],即为重置CPU配置操作;
- CPU 可以通过访问 MCU-S 来获取外部存储中的数据;
[0x220] 内部ROM引导启动 [Internal ROM Boot]
- 拥有 20K 大小的 inter ROM,需要设置 为 RST_CFG [2:0] = 2设置 inter ROM启动;
- 将引导 代码拷贝到 SRAM [片内内存]固定位置 ,存储程序栈和数据;
- 初始化设备完成后 跳转 SRAM 固定位置;
- 支持 异常向量表 不启动 MMU 方式;
- 通过设置 [核心快速电源请求] VDDPWRON 和 [内存快速电源请求] VDDPWRON_DDR 为高电平
[0x221] 启动模式类型
- NAND FLASH +纠错 引导;
- SD/MMC/SDFS 引导;
- SPI [串行外设接口] 串行 EEPROM 引导;
- UART [通用异步接收器] 引导;
- USB 引导;
[0x222] SPI 引导
- 协议类型 :SPI 协议;
- 时钟频率:16MHz
- 程序容量: 56KB
- 支持端口:SPI0、SPI1、SPI2
- 支持检查启动信号 与 启动镜像校验[CRC]
IROM 初始化 SPI 接口 与设备,跳转到 SRAM ADDR [0xFFFF_0000] ;
从 SPI FLASH 拷贝 引导代码 到 SRAM ADDR [0xFFFF_0000] 处执行引导启动;
[0x223] UART 引导
- 协议类型:UART 串口协议;
- 波特率:19200 bps, 115200 bps
- 程序容量: 16KB
- 支持端口:UART0、UART1
- 支持检查启动信号 与 启动镜像校验[CRC]
IROM 初始化 UART接口,跳转到 SRAM ADDR [0xFFFF_0000] ;
用户输入 引导代码 到 SRAM ADDR [0xFFFF_0000] 处执行引导启动;
[0x224] USB 引导
- 协议类型:USB大包传输;
- 传输速率:64Kbtye 、512 Kbtye;
- 程序容量: 56Kbtye;
- 支持端口:EP1 只向前兼容. EP2 只能接收数据;
IROM 初始化 USB接口,跳转到 SRAM ADDR [0xFFFF_0000] ;
通过 USB 高速传输引导代码 到 SRAM ADDR [0xFFFF_0000] 处执行引导启动
[0x225] SDHC 引导
- 存储设备:SD、MMC、eMMC;
- 时钟频率:认证 400 kHz SDCLK,传输 24 MHz SDCLK;
- 程序容量: 56Kbtye;[扇区0 =MBR 扇区[32:1] =引导程序]
- 端口定义:SD0, SD1, SD2;
IROM 初始化 USB接口,跳转到 SRAM ADDR [0xFFFF_0000] ;
不从 扇区0 [分区信息] 开始,忽略512字节;
通过 SD 获取引导代码 到 SRAM ADDR [0xFFFF_0000] 处执行引导启动
[0x225] SDFS 引导
- 存储设备:SD/MMC/eMMC;
- 时钟频率:认证 400 kHz SDCLK,传输 24 MHz SDCLK;
- 文件系统:FAT12, FAT16, FAT32
- 程序容量: 56Kbtye;
- 端口定义:SD0, SD1, SD2;
第一次引导,读取MBR 搜索分区或者文件系统,确定为FAT32 文件系统;
搜索两个文件 ”NXDATA.SBH" 、“NXDATA.SBL”, 总大小不能超过56Kb;
[0x226] NANDFLASH 引导
- 存储设备:nandflash;
- 纠错范围1:数据 512Btye + 校验39Btye = Cerror [24bits]
- 纠错范围2:数据1024Btye + 校验105Btye = Cerror [60bits]
- 内存页大小:512B, 2 KB, 4 KB, 8 KB, 16 KB
- 程序容量: 56Kbtye;
- 不支持坏块管理
内部ROM 初始化 ,NANDFLASH 控制器;
将 NANDFLASH 引导代码 到 SRAM ADDR [0xFFFF_0000] 处执行引导启动
[0x300] 其他引导信息
[0x310] 引导镜像规则
- 每个引导 镜像 必须拥有 512 字节的引导头 [Boot header];
- 等待引导信号值为 0x4849534E;
- 引导镜像必须存在这三个参数: LOADSIZE, LOADADDR, LAUNCHADDR ,前两个必须是16字节对齐的;
- 如果是SPI 还需要 CRC32的校验数据;
[0x320] 各个引导模式所需参数结构
struct NX_NANDBootInfo
{
unsigned char AddrStep;
unsigned char tCOS;
unsigned char tACC;
unsigned char tOCH;
unsigned int PageSize;
unsigned int CRC32;
};
struct NX_SPIBootInfo
{
unsigned char AddrStep;
unsigned char _Reserved0[3];
unsigned int _Reserved1;
unsigned int CRC32;
};
struct NX_SDMMCBootInfo
{
unsigned char PortNumber;
unsigned char _Reserved0[3];
unsigned int _Reserved1;
unsigned int CRC32;
};
union NX_DeviceBootInfo
{
struct NX_NANDBootInfo NANDBI;
struct NX_SPIBootInfo SPIBI;
struct NX_SDMMCBootInfo SDMMCBI;
};
struct NX_SecondBootInfo
{
unsigned int VECTOR[8]; // 0x000 ~ 0x01C
unsigned int VECTOR_Rel[8]; // 0x020 ~ 0x03C
unsigned int DEVICEADDR; // 0x040
unsigned int LOADSIZE; // 0x044
unsigned int LOADADDR; // 0x048
unsigned int LAUNCHADDR; // 0x04C
union NX_DeviceBootInfo DBI; // 0x050~0x058
unsigned int Stub[(0x1F8-0x05C)/4]; // 0x05C ~ 0x1F8
unsigned int SIGNATURE; // 0x1FC "NSIH"
};
[0x330] 异常向量表模版
- 前32 字节 放置 异常向量表,
- 发生异常时,将跳转到 0 地址(即IROM处)执行异常向量表;
- inter ROM 引导后,code 起始位置是SRAM,需要偏移0xFFFF0000 通过 LDR 将地址读出来执行;
#define BASEADDR_SRAM 0xFFFF0000
//;==================================================================
//; Vectors
//;==================================================================
.global Vectors
Vectors:
LDR pc, ResetV //; 00 - Reset
LDR pc, UndefV //; 04 - Undefined instructions
LDR pc, SWIV //; 08 - SWI instructions
LDR pc, PAbortV //; 0C - Instruction fetch aborts
LDR pc, DAbortV //; 10 - Data access aborts
LDR pc, UnusedV //; 14 - Reserved
LDR pc, IRQV //; 18 - IRQ interrupts
LDR pc, FIQV //; 1C - FIQ interrupts
ResetV:
.word Reset_Handler
UndefV:
.word (BASEADDR_SRAM + 0x04) //; 04 - undef
SWIV:
.word (BASEADDR_SRAM + 0x08) //; 08 - software interrupt
PAbortV:
.word (BASEADDR_SRAM + 0x0C) //; 0C - prefectch abort
DAbortV:
.word (BASEADDR_SRAM + 0x10) //; 10 - data abort
UnusedV:
.word 0 //; 14 - will reset if called...
IRQV:
.word (BASEADDR_SRAM + 0x18) //; 18 - IRQ
FIQV:
.word (BASEADDR_SRAM + 0x1C) //; 1C - FIQ