Bootloader移植简述

来源:互联网 发布:数据精灵破解版 编辑:程序博客网 时间:2024/06/07 07:18
1、Bootloader移植
A、引导过程
三星的S5PC100为例
(1)、片内是有固化的程序负责第一级引导
bootloader也在外存上,首先得解决其运行的问题。片内是有固化的程序负责必要的硬件初始化工作,并把外部NANDFLASH或是NORFLASH、SD卡及其他设备上的bootloader的第一阶段代码运行起来。

(2)、Bootloader需要的必要功能
由于片内内存较小,所以得实现自搬移,搬移内核,并执行内核。

B、作用
(1)作必要的硬件初始化工作
CPU(SOC片子:设置时钟、屏蔽中断、关MMU等)
内存(外部内存,程序需要上内存才能运行,BOOLOADER必须能够正确读写内存)
外存(BOOLOADER的工作是搬内核上内存,所以需要能够读写外存)
(2)自搬移并搬移内核并给内核传参
bootloader在外存上,其运行由片内固化程序引导,一般片内程序能读写的外存区域不大,所以bootloader仅仅有一部分能够运行起来,这个先运行起来的代码负责搬其他代码上内存(其他代码之于自搬移代码是数据)。bootloader真正的工作代码上了内存,就接管芯片,并把外存上的内核搬到内存上并执行,并传参数给内核(bootloader 结束时要传三个值给内核,通过r0 r1 r2三个寄存器。r0:CPUid,R1机器码,r3:内核参数链表;r2必须有,r0一般u-boot是0,不用,r3也不用)。BOOLOADER传给内核的启动参数一般是写死在内存偏移0x100的位置(ARM内核代码写死的),所以BOOLOADER负责向内存偏移0x100的位置写入内核启动参数。

C、ARM主流开源bootloader
u-boot、vivi、reboot等

D、u-boot两个阶段代码
第一阶段代码:自搬移(必要的硬件初始化,完成对外存读内核代码到内存,移植难点,必须对硬件很熟悉,一般是汇编编写的)
第二阶段代码:初始化相应设备及逻辑层代码(命令、协议等,U-BOOT还支持文件系统),C代码

第一阶段代码位置
S5PC100,u-boot-2012.10为例
arch\arm\cpu\armv7\start.S(有一定注释,这个是移植时候的重点,不熟悉硬件不行)
链接脚本arch\arm\cpu\armv7\u-boot.lds(这个说明那些是代码段,哪些代码先放到数据段——被其自搬移,如果第一阶段代码添加了代码,链接脚本也要改下)

第二阶段代码
\arch\arm\lib\board.c
这个就是u-boot自己把自己搬到内存上以后的代码,C写的,C入口函数随着版本变化在变,这个版本的是board_init_f,从第一阶段代码可以看到,第一阶段把u-boot其他代码搬上内存后,就会跳转到C入口,开始执行。

E、具体移植步骤
(1)选平台(一般芯片公司已经移植了主流bootloader代码,只需要根据实际板子情况来修改相应代码,主要是外存和外部内存)
顶层目录下有个boards.cfg,向里面添加:
板子名称        体系平台    ARM核     板子名称    公司名称    SOC芯片

fsc100            arm            armv7       fsc100        samsung    s5pc1xx

上面就是在指定如下目录需要编译:

cpu/arm目录

cpu/arm/arnv7目录

cpu/arm/arnv7/s5pc1xx目录

board/samsung/fsc100目录

也可以写进顶层目录下的Makefile,示例如下:
fsc100_config:    unconfig
    @$(MKCONFIG) $(@:_config=) arm armv7 fsc100 samsung s5pc1xx

在U-BOOT顶层目录执行
#make fsc100_config
这样就是在决定应该编译那些目录,配置基本平台相关的目录。

这时候就可以编译一下了,目的如下:
(a)、检验环境(交叉编译工具链安装及相应的一些库支持,u-boot不需要第三方库支持,可能会涉及一些工具及相应编译环境的库缺失);
(b)、验证平台选择

(2)制作及修改板文件
board\samsung\smdkc100 复制一份,改目录名为board\samsung\fsc100
目录下的相应文件一般也最好改成对应的文件名,Makefile对应修改
smdkc100.c--->fsc100.c
修改Makefile
COBJS-y    := smdkc100.o  --->COBJS-y    := fsc100.o
添加修改第一阶段代码
一般添加外存读写代码(譬如nandflash添加为nandflash.c)
修改Makefile
COBJS-y    := nandflash.o
修改初始化代码lowlevel_init.S

修改链接脚本arch\arm\cpu\armv7\u-boot.lds
    .text    :
    {
        arch/arm/cpu/armv7/start.o    (.text)
        *(.text)
    }
修改为:
    .text    :
    {
        arch/arm/cpu/armv7/start.o    (.text)
        board/samsung/fsc100/lowlevel_init.o
        board/samsung/fsc100/nandflash.o
        *(.text)
    }

同理板文件目录下添加了什么,板文件目录下的Makefile得改,链接脚本也得添加。
(3)、选配模块
复制include\configs\smdkc100.h ---> include\configs\fsc100.h
修改之,这里面除了参数(CPU时钟、内存基地址、环境变量等),还有模块开关。
譬如要nand命令:
得添加宏定义
#define CONFIG_CMD_NAND
则相应驱动代码及逻辑代码得有。
譬如网卡,逻辑代码就是选择(宏开关),但是驱动不一定有或是要修改,一定通过板文件或是C入口初始化代码来选。
那么这些宏开关从哪里来,就是相应目录下的Makefile中找,如果是自己添加的驱动或是逻辑代码,也应该在对应Makefile中设置这样的宏开关。
原创粉丝点击