Smart4418裸机开发(三):运行裸机程序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/M_N_N/article/details/82115556

参考:
①.S5P4418启动镜像分析
②.S5P4418裸机编程的实现(替换2ndboot)
③.【NanoPi2试用体验】-6 S5PV4418的启动过程分析-(结合原理图&datasheet)
④.【NanoPi2试用体验】-7 在 pi2上用裸机程序点亮LED的原理详细分析与实验

学习了大牛们的操作,自己再整理一下;

系统内存分布:

这里写图片描述

内部ROM(IROM,20KB,地址0x34000000)的介绍:

这里写图片描述
上电后,CPU从IROM的0地址的读取指令(开机的第一条指令),在系统内存中IROM映射在0x34000000处;
IROM中的程序会读取User Bootcode,并将其复制到特定内存中运行,特定的内存时指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进行一系列操作后,再将uboot(不确定带不带Nsih2)复制到SDRAM(外部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

猜你喜欢

转载自blog.csdn.net/M_N_N/article/details/82115556