参考:
①.S5P4418启动镜像分析
①.NanoPi2-S5P4418启动流程分析
②.S5P4418裸机编程的实现(替换2ndboot)
③.【NanoPi2试用体验】-6 S5PV4418的启动过程分析-(结合原理图&datasheet)
④.【NanoPi2试用体验】-7 在 pi2上用裸机程序点亮LED的原理详细分析与实验
学习了大牛们的操作,自己再整理一下;
系统内存分布:
内部ROM(IROM,20KB,地址0x34000000)的介绍:
上电后,CPU从IROM的0地址的读取指令(开机的第一条指令),在系统内存中IROM映射在0x34000000处,但是配置CfgBOOTMODE
后,设置到0地址了;
IROM中的程序会读取User Bootcode(起始地址0x04000000,SD卡启动的话,SD卡会被映射在此处,Static #1),并将其复制到特定内存中运行,特定的内存时指Internal SRAM(内部SRAM,32KB?地址0xFFFF0000);
###系统镜像布局
Block [512(0x200)个字节称为一个Block] | data |
---|---|
Block 0 [0x0 - 0x1FF] | Sd/emmc卡信息 |
Block 1 [0x200 - 0x3FF] | Nsih.bin |
Block 2 [0x400 - 0x7FFF] | 2nboot.bin |
Block 64 [0x8000 - 0x81FF] | Nsih2.bin |
Block 65 [0x8200 - ?] | u-boot.bin |
再往后的应该就是linux,android系统相关的了 |
这里的Nsih.bin和2nboot.bin就是上面所说的User Bootcode;
4418启动流程
上电 -> IROM -> Nsih -> 2nboot -> (Nsih2不确定有没有执行) ->uboot -> linux kernel
- 下面是IROM加载2nboot的过程:
- 先执行IROM内的程序,将16KB的Nsih和2nboot复制到ISRAM中,然后Jump PC to execute boot code,开始执行Nsih.bin,地址为0xFFFF0000,2nboot的开始地址为0xFFFF0200;
- Nsih.bin的第一条指令就是
LDR PC, =0xFFFF0200
- 2nboot初始化CPU、片外RAM等一系列操作后,再将uboot(不确定带不带Nsih2)复制到SDRAM(外部RAM),不过SP指针指向片内RAM,然后跳向uboot,开始地址0x42C00000;
- 0x42C00000这个地址可以从开机时2nboot的打印信息看到:
执行裸机程序
现在知道了板子的运行流程,IROM里面的程序是芯片厂家写死了的,用户改不了,而2nboot和uboot都是User Code,所以大牛们想到了替换.bin的方法;
- 替换到Block64(uboot)时,生成.bin文件时ld链接地址要改为0x42C00000;
- 替换到Block2(2nboot)时,生成.bin文件时ld链接地址要改为0xFFFF0200,且文件大小不超过15.5Kb,如果超过了,超过的部分要自己加载到RAM中;
替换方法是使用winhex,具体操作可以看参考贴③,④;强调一点,winhex必须要以管理员方式打开,要不然物理磁盘打不开;
linux环境下用dd命令更方便,比如把led程序写到uboot块;
sudo dd if=led.bin of=/dev/sdx bs=512 seek=65