自编bootloader测试-基于JZ2440

目的:仿写U-BOOT

      概念介绍:bootloader的作用就是初始化硬件设备,建立内存空间映射,为启动内核提供一个好的环境,所以说我们的最终目标是成功启动内核。



第一步:写start.S

1.关闭看门狗

2.设置时钟(包括设置分频系数,MPLLCON和设置CPU处于异步模式)

3.设置内存

4.重定位,设置栈指针

5.nand flash初始化

6.给拷贝代码至内存的函数分配参数(参数由链接文件指定地址)

7.拷贝代码至sdram,然后清理BSS段

8.设置中断跳转至main函数



第二步:编写boot.c

1.参考u-boot构建出启动内核的步骤:定义函数指针*kernel;串口初始化(因为我们需要通过串口向串口软件发送调试信息);nand_read(addr,*buf,size)从addr的地址开始,读取大小为size的数据到buf指定的地址里,;设置启动参数;设置内存参数;设置命令行参数;设置结束参数;调用内核函数:362在uboot源码里指的是s3c2440(其中设置启动、内存、命令行、结束参数的函数参考uboot源码)

图片发自App


第三步:编写init.c

分别写uart_init()、puts()、nand_init()、nand_read()、copy_code_to_sdram()


图片发自App


图片发自App


今日所得:学会从编译器的报错和警告中去调试代码,还有就是调用另外一个文件的函数时要用extern,这是c语言基础。编写Makefile的时候在-gcc后面加上-fno-builtin可以消去编译器关于函数参数不匹配的问题。最后就是要有耐心得坐着调,虽然会遇到一遍又一遍的问题但还是要一个个得解决。


 

你可能感兴趣的:(自编bootloader测试-基于JZ2440)