一般来说,uboot会干这几件事;
1: 关开门狗
2:初开始时钟,PLL倍频。上电的时候,是以XTAL的12M运行的运行的,然后你要提高频率,三星2440能以最大400MHZ运行
3:初开始化内存,SDRAM或DDR(2440不支持DDR ,ARM11可以);
4:从NANDfalsh里面把内核读出来,放到SDRAM里面去,然后调转到SDRAM运行; uboot放到SDRAM哪里呢?这个是链接脚本决定的;
比如现在我放是的链接地址是0x33f80000 ; 那什么又是链接地址,就是程序运行时,这个程序应该位于哪个地址;比如我放在0x33f80000;
程序调转过去; 你的UBOOT读出来后必须拷贝到0x33f80000,假如不在这个地址会发生什么情况?
情况会出错嘛,因为你程序里面的全局变量,在编译的时候地址已经确定下来了;
比如你在uboot里面定义了一个变量a=1;那里a的基地址是0x33f80000+某个偏移,这个偏移是由编译确定的;假如是0x100;那么你的a的地址就是0x33f80100;
1就存放在0x33f80100这个地址里面;假如你的UBOOT地址不是放在这个链接地址0x33f80100; 你放在0x31000000;那么你的a的地址就是0x31000100;你去读
a的值就是去这个0x31000100这个地址去读,肯定读不到1,因为1在0x33f80100这个地址嘛,所以会出错;
5:设置栈;所谓栈;就是CPU里面的SP寄存器,你设置栈,就是让这个SP指向内存的某个地方;
你问我为什么设置栈,我擦,调用C语言你肯定要设置栈啊,不然你的C语言定义的一些局部变量;放在哪里呢,是吧
然后设置好了后咧,就是C语言程序了(前面都是汇编,称为UBOOT的第一阶段);C语言是第2阶段;那干了什么事;
主要是干了从nandflash read 读出内核,然后启动;
6:一些其他功能,主要是开发阶段需要用到的,比如USB (你要用USB uboot自己更新自己,下载内核,下载根文件系统),网卡,你要调试打印一些信息,那就是串口了
现在直接分析代码,从第一个文件开始分析 ,第1个文件是哪个?就是CPU/ARM920T/start.s