一篇uboot的移植文档(转载)

来源:互联网 发布:c语言基础教程 编辑:程序博客网 时间:2024/05/31 11:03
 

一篇uboot的移植文档(转载)

1     uboot的介绍及体系结构... 2
1.1 uboot的介绍... 2
1.2 uboot的体系结构... 2
2     uboot的运行过程分析... 3
2.1 启动模式介绍... 3
2.2 运行过程... 3
2.3      本开发板的地址分布(leopard2a)... 5
2.4      运行代码分析... 5
2.4.1 stage 1. 5
2.4.2 stage 2. 5
2.4.2.1 调用一系列初始化函数... 5
2.4.2.2 初始化网络设备... 7
2.4.2.3 进入主UBOOT 命令行... 7
3     uboot的移植和测试... 7
3.1 移植的过程... 7
3.2 移植主要修改的文件... 8
3.3 uboot网络下载功能的添加和RAM调试... 8
 
 
1          uboot的介绍及体系结构
 
1.1 uboot的介绍
 
Uboot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序, UBoot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。UBoot除了支持PowerPC系列的处理器外,还能支持MIPS、 x86、ARM、NIOS、XScale等诸多常用系列的处理器。
 
1.2 uboot的体系结构
 
目录树
 
|--board
|--common
|--cpu
|--disk
|--doc
|--drivers
|--dtt
|--examples
|--fs
|--include
|--lib_arm
|--lib_generic
|--net
|--post
|--rtc
|--tools
 
 
 
2. board:和一些已有开发板有关的文件. 每一个开发板都以一个子目录出现在当前目录中,比如说: leopard2a子目录中存放与我们开发板相关的配置文件.
3. common:实现uboot命令行下支持的命令,每一条命令都对应一个文件。例如bootm命令对应就是cmd_bootm.c。
4. cpu:与特定CPU架构相关目录,每一款Uboot下支持的CPU在该目录下对应一个子目录,比如有子目录arm926ejs就是我们开发板上使用的cpu架构目录。
5. disk:对磁盘的支持。
5. doc:文档目录。Uboot有非常完善的文档,推荐大家参考阅读。
6. drivers:Uboot支持的设备驱动程序都放在该目录,比如各种网卡、支持CFI的Flash、串口和USB等。
7. fs: 支持的文件系统,Uboot现在支持cramfs、fat、fdos、jffs2和registerfs。
8. include:Uboot使用的头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件。该目录下configs目录有与开发板相关的配置头文件,如leopard2a.h。该目录下的asm目录有与CPU体系结构相关的头文件,asm对应的是asmarm.
9. lib_xxxx: 与体系结构相关的库文件。如与ARM相关的库放在lib_arm中。
10. net:与网络协议栈相关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。
11. tools:生成Uboot
的工具,如:mkimage, crc等等。
2          uboot的运行过程分析
2.1 启动模式介绍
大多数 Boot Loader 都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。
启动加载(Boot loading)模式:这种模式也称为"自主"(Autonomous)模式。也即 Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是 BootLoader 的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。
下载(Downloading)模式:在这种模式下,目标机上的 Boot Loader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 BootLoader 保存到目标机的 RAM 中,然后再被 BootLoader 写到目标机上的FLASH 类固态存储设备中。BootLoader 的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用 BootLoader 的这种工作模式。工作于这种模式下的 Boot Loader 通常都会向它的终端用户提供一个简单的命令行接口。
UBoot这样功能强大的 Boot Loader 同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。
 
2.2 运行过程
       大多数bootloader都分为阶段1(stage1)和阶段2(stage2)两大部分,uboot也不例外。依赖于CPU体系结构的代码(如CPU初始化代码等)通常都放在阶段1中且通常用汇编语言实现,而阶段2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。
 
U - Boot 编译后的代码定义一般不超过100kB ,并且这100 kB 又分成两个阶段来执行. 第一阶段的代码在start . s 中定义,大小不超过10 kB ,它包括从系统上电后在0x00000000 地址开始执行的部分. 这部分代码运行在Flash 中,它包括对arm926ejs的一些寄存器的初始化和将U - Boot 的第二阶段代码从Flash 拷贝到SDRAM 中. 除去第一阶段的代码,剩下的部分都是第二阶段的代码. 第二阶段的起始地址是在第一阶段代码中指定的,被复制到SDRAM后,就从第一阶段跳到这个入口地址开始执行剩余部分代码. 第二阶段主要是进行一些BSS 段设置,堆栈的初始化等工作,最后会跳转到main -loop 函数中,接受命令并进行命令处理. 图1 给出了U - Boot 的详细的运行过程包括对内核的设置、装载及调用过程.
 
 
 
系统复位进入u-boot stage l的入口点
 
硬件设备的初始化
 
为加载uboot stage 2准备ram空间
 
设置好堆栈
 
跳转到stage 2的C入口点
 
初始化本阶段要用到的设备
 
检查内存映射
 
将kernel映像和文件映像从flash中读到ram中
 
为内核设定启动参数
 
调用内核
 

 
                                图1
 
 
 
 
 
 
 
 
 
 
 
 
2.3     本开发板的地址分布(leopard2a)
 
本目标板是RAM 16M, Flash 8M,具体空间如图所示:
 
1F12FFFF
 
Uboot
 
 
Uboot_env
 
 
Kernel
 
 
Rootfs
 
 
1F000000
 
1F020000
 
1F01FFFF
 
1F02FFFF
 
1F030000
 
1F130000
 
1F7EFFFF
 
 
 
 
Kernel
 
 
 
Rootfs
 
 
FLASH
 
SDRAM
 
0x00030000
 
0x00130000
 
0x00430000
 

 
 
可以根据变换后的分区结构,设置
uboot_addr,uboot_addr_end,kernel_addr,kernel_addr_end,rootfs_addr,rootfs_addr_end,
config_addr, config_addr_end等环境变量,调整bootloader。
 
SDRAM的调整修改linux-2.4.20_mvl31/drivers/mtd/maps/physmap.c
 
2.4     运行代码分析
2.4.1 stage 1
 
uboot的stage1代码通常放在start.s文件中,它用汇编语言写成,其主要代码包括定义入口,设置异常向量,设置cpu的模式和频率,配置内存区控制寄存器,安装uboot的栈空间,关闭看门狗等。由于本人对ram的汇编不太熟悉,所以这一部分不作具体分析。
 
2.4.2 stage 2
lib_arm/board.c中的start armboot是C语言开始的函数,也是整个启动代码中C语言的主函数,同时还是整个uboot(armboot)的主函数,该函数主要完成如下操作:
 
2.4.2.1 调用一系列初始化函数
 
1. 指定初始函数表:
init_fnc_t *init_sequence[] = {
cpu_init, /* cpu的基本设置 */
board_init, /* 开发板的基本初始化 */
interrupt_init, /* 初始化中断 */
env_init, /* 初始化环境变量 */
init_baudrate, /* 初始化波特率 */
serial_init, /* 串口通讯初始化 */
console_init_f, /* 控制台初始化第一阶段 */
display_banner, /* 通知代码已经运行到该处 */
dram_init, /* 配制可用的内存区 */
display_dram_config,
#if defined(CONFIG_VCMA9) || defined (CONFIG_CMC_PU2)
checkboard,
#endif
NULL,
};
执行初始化函数的代码如下:
    for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
        if ((*init_fnc_ptr)() != 0) {
            hang ();
        }
    }
2. 配置可用的Flash区
flash_init ()
3. 初始化内存分配函数
mem_malloc_init()
4. nand flash初始化
#if (CONFIG_COMMANDS & CFG_CMD_NAND)
    puts ("NAND:");
    nand_init();        /* go init the NAND */
#endif
5. 初始化环境变量
env_relocate ();
6. 外围设备初始化
devices_init()
7. I2C总线初始化
i2c_init();
8. LCD初始化
drv_lcd_init();
9. VIDEO初始化
drv_video_init();
10. 键盘初始化
drv_keyboard_init();
11. 系统初始化
drv_system_init();
 
2.4.2.2 初始化网络设备
初始化相关网络设备,填写IP、MAC地址等。
1. 设置IP地址
    gd->bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
 
2. 设置mac地址  
{
        int i;
        ulong reg;
        char *s, *e;
        uchar tmp[64];
 
        i = getenv_r ((uchar*)("ethaddr"), tmp, sizeof (tmp));
        s = (i > 0) ? (char*)tmp : NULL;
 
        for (reg = 0; reg < 6; ++reg) {
            gd->bd->bi_enetaddr[reg] = s ? simple_strtoul (s, &e, 16) : 0;
            if (s)
                s = (*e) ? e + 1 : e;
        }
    }
2.4.2.3 进入主UBOOT 命令行
进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。
for (;;) {
        main_loop ();
    }}
3         uboot的移植和测试
3.1 移植的过程
① 在宿主机上建立交叉编译开发环境
 
② 修改cpu/arm926ejst目录中的文件内容,
主要包含cpu.C,start.S,interrupts.C以及seria1.C,speed.C等文件
 
③ 在board目录下创建自己的目标板(开发板)目录leopard2a
在目录下创建leopard2a.C,flash.C,memsetup.S
以及Makefile,u-bot.1ds,config.mk文件
 
④在include/configs目录下创建leopard2a.h
 
⑤ 打开u-bot目录下Makefile文件,加入如下两行:
leopard2a_config :      unconfig
@./mkconfig $(@:_config=) arm arm926ejs leopard2a
 
⑨ 编译。运行命令:
1. make leopard2a_config
2. make
编译成功.生成基本的u—b00t.
 
⑦ 烧写.把编译成的u-bot.bin
至此移植u-bot过程结束.
 
3.2 移植主要修改的文件
移植u—boot到开发板上只需要修改和硬件相关的代码即可。这首先就联想到cpu目录下的启动代码,另外参考u—boot/readme文件可知其他还需要修改的主要文件有:
Makefile文件,和include目录下的目标板.h头文件(leopard2a.h),board目录下的目标板.C文件(leopard2a.c),flash.C文件,u-boot.1ds链接文件,以及cpu目录下的串口驱动文件。
 
具体修改如下:
①      cpu/arm926ejst目录下
 
◆ start.S启动代码。
 
②    board/leopard2a
  ◆  leopard2a.C文件。这个文件主要是SDRAM 的驱动程
序,主要完成SDRAM 的UPM 表设置,上电初始化。暂时不
改。
◆  flash.C文件。Flash的驱动程序就在此文件中。
 
◆      memsetup.S文件。
◆  config.mk文件.此文件用于设置程序链接的起始地
址.
◆u-boot.Ids文件。
 
③ include/configs目录下leopard2a.h文件.此文件是
leopard2a目标板头文件,大多数寄存器参数是在这一文件中
设置完成的.
 
3.3 uboot网络下载功能的添加和RAM调试
在commom/main.c 中的main_loop函数中添加tftp下载的函数,可以通过按钮触发下载rimage,kimage。
 
在烧录u-boot.bin之前,需要进行ram调试,保证uboot可以在EVB上正常运行。
先下載U-boot 到SDRAM上, 然後執行SDRAM 上的U-boot 程序, 以確認U-boot可以正常執行,
Command 如下:
1.       “tftp a00000 u-boot.bin” <= 下載程序到SDRAM
2.       “go a00000” <= 從SDRAM 執行程序
 
 
如果U-boot 可以相容於目前的硬件, 5VT EVB 會重新正常啟動
要是不能正常啟動,表示U-boot 不相容於目前的硬件, 請更換新的u-boot.
再重新測試, 直到被測試的U-boot可以正常啟動
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 眉毛在眉骨下面怎么办 踩到地雷怎么办知乎 在边境踩到地雷怎么办 插在花泥里的花怎么办 瓶插绣球花蔫了怎么办 水养绣球花蔫了怎么办 鲜切绣球花蔫了怎么办 崩坏2仓库满了怎么办 dnf88级没任务了怎么办 0号柴油冻住了怎么办 不小心喝了生水怎么办 不小心吃了蟑螂怎么办 以租代购还不起怎么办 孩子被教官打了怎么办 三岁宝宝叛逆期怎么办 三岁宝宝很叛逆怎么办 孩子不听话怎么办有什么方法呢 打了三岁的宝宝怎么办 2岁半宝宝不听话怎么办 心里素质不好容易紧张怎么办 孩子二年级成绩差怎么办 遇到素质低的人怎么办 孩子上课注意力不集中怎么办 素质报告册丢了怎么办 潞城镇剩下5个村怎么办 高三复读生学籍怎么办 被检精子总数少怎么办 前向运动精子17%怎么办 精子形态正常率1怎么办 精子形态正常率2怎么办 精子头部畸形率高怎么办 椎底动脉供血不足怎么办 颈椎动脉供血不足怎么办 颈椎病引起头晕脑供血不足怎么办 淘宝店被释放了怎么办 被枣蝎子蛰了怎么办 六角螺丝拧花了怎么办 苹果螺丝滑丝了怎么办 六角螺帽拧花了怎么办 六角螺母拧花了怎么办 内六角螺丝滑丝怎么办