go语言串口通话 golang串口( 六 )


06 u-boot的启动过程
大多数BootLoader都分为stage1和stage2两大部分,U-boot也不例外 。依赖于cpu体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能 , 而且有更好的可读性和移植性 。
1、 stage1(start.s代码结构)
U-boot的stage1代码通常放在start.s文件中 , 它用汇编语言写成 , 其主要代码部分如下:
(1) 定义入口 。由于一个可执行的image必须有一个入口点 , 并且只能有一个全局入口 , 通常这个入口放在rom(Flash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成 。
(2)设置异常向量(exception vector) 。
(3)设置CPU的速度、时钟频率及中断控制寄存器 。
(4)初始化内存控制器。
(5)将rom中的程序复制到ram中 。
(6)初始化堆栈。
(7)转到ram中执行,该工作可使用指令ldrpc来完成 。
2、 stage2(C语言代码部分)
lib_arm/board.c中的start armboot是C语言开始的函数,也是整个启动代码中C语言的主函数,同时还是整个u-boot(armboot)的主函数 , 该函数主要完成如下操作:
(1)调用一系列的初始化函数 。
(2)初始化flash设备 。
(3)初始化系统内存分配函数 。
(4)如果目标系统拥有nand设备,则初始化nand设备 。
(5)如果目标系统有显示设备 , 则初始化该类设备 。
(6)初始化相关网络设备,填写ip,c地址等 。
(7)进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作 。
07 基于cortex-a8的s5pc100bootloader启动过程分析
s5pc100支持两种启动方式,分别为USB启动方式和NandFlash启动方式:
1. S5PC100 USB启动过程
[1] A8 reset, 执行iROM中的程序
[2] iROM中的程序根据S5PC100的配置管脚(SW1开关4,拨到4对面),判断从哪里启动(USB)
[3] iROM中的程序会初始化USB,然后等待PC机下载程序
[4] 利用DNW程序,从PC机下载SDRAM的初始化程序到iRAM中运行 , 初始化SDRAM
[5] SDRAM初始化完毕 , iROM中的程序继续接管A8, 然后等待PC下载程序(BootLoader)
[6] PC利用DNW下载BootLoader到SDRAM
[7] 在SDRAM中运行BootLoader
2. S5PC100 Nandflash启动过程
[1] A8 reset, 执行IROM中的程序
[2] iROM中的程序根据S5PC100的配置管脚(SW1开关4,拨到靠4那边),判断从哪里启动(Nandflash)
[3] iROM中的程序驱动Nandflash
[4] iROM中的程序会拷贝Nandflash前16k到iRAM
[5] 前16k的程序(BootLoader前半部分)初始化SDRAM,然后拷贝完整的BootLoader到SDRAM并运行
[6] BootLoader拷贝内核到SDRAM,并运行它
[7] 内核运行起来后,挂载rootfs , 并且运行系统初始化脚本
08 u-boot移植(基于cortex_a8的s5pc100为例)
1.建立自己的平台
(1).下载源码包2010.03版本,比较稳定
(2).解压后添加我们自己的平台信息 , 以smdkc100为参考版,移植自己s5pc100的开发板
(3).修改相应目录的文件名,和相应目录的Makefile,指定交叉工具链 。
(4).编译
(5).针对我们的平台进行相应的移植,主要包括修改SDRAM的运行地址,从0x20000000
(6).“开关”相应的宏定义
(7).添加Nand和网卡的驱动代码
(8).优化go命令
(9).重新编译 make distclean(彻底删除中间文件和配置文件) make s5pc100_config(配置我们的开发板) make(编译出我们的u-boot.bin镜像文件)
(10).设置环境变量 , 即启动参数,把编译好的u-boot下载到内存中运行 , 过程如下:

推荐阅读