U-Boot在S3C2410上的移植

引言

  u-boot是用于初始化目标板硬件,为嵌入式操作系统提供目标板硬件配置信息,完成嵌入式操作系统装载、引导和运行的固件程序。它能够将系统的软硬件紧密衔接在一起。s3c2410是三星公司的一款基于arm920t-p.htm" target="_blank" title="arm920t货源和pdf资料">arm920t核的嵌入式通用处理器。本文将详细介绍u-boot在s3c2410开发板上的移植与运行。

u-boot简介

  u-boot支持arm、powerpc等多种架构的处理器,也支持linux、netbsd和vxworks等多种操作系统。它提供启动加载和下载两种工作模式。启动加载模式也称自主模式,一般是将存储在目标板flash中的内核和文件系统的镜像装载到sdram中,整个过程无需用户的介入。在使用嵌入式产品时,一般工作在该模式下。工作在下载模式时,目标板往往受外设(一般是pc机)的控制,从而将外设中调试好的内核和文件系统下载到目标板中去。u-boot允许用户在这两种工作模式间进行切换。通常目标板启动时,会延时等待一段时间,如果在设定的延时时间范围内,用户没有按键,u-boot就进入启动加载模式。

  开发板的主要配置包括三星arm9处理器s3c2410、1个串口和jtag接口,晶振为12mhz,系统主频为200mhz。另外,开发板上还包括1片4m×16位数据宽度的flash,地址范围为0x01000000~0x01800000和2片8m×16位数据宽度的sdram,地址范围为0x30000000~0x32000000。flash使用了2410处理器的bank0单元,由于2410中地址是循环映射的,因而0x01000000?和0x0地址等同。

  在本系统中,u-boot的主要功能包括:建立和初始化ram;初始化一个串口;检测机器的体系结构,传递mach_type_xxx的值(smdk2410)给内核;建立内核的标记列表(tagged list);调用内核镜像。

u-boot移植步骤

  为了使u-boot支持新的开发板,一种简便的做法是在u-boot已经支持的开发板中选择一种和目标板接近的,并在其基础上进行修改。代码修改的步骤如下:

1)在board目录下创建smdk2410目录,添加smdk2410.c、flash.c、memsetup.s、u-boot.lds和config.mk等;

2)在cpu目录下创建arm920t目录,主要包含start.s、interrupts.c、cpu.c、serial.c和speed.c等文件;

3)在include/configs目录下添加smdk2410.h,它定义了全局的宏定义等;

4)修改u-boot根目录下的makefile文件:

smdk2410_config:unconfig@./mkconfig $(@:_config=) arm arm920t smdk2410

5)运行make smdk2410_config,如果没有错误,就可以开始进行与硬件相关的代码移植工作。由于这部分代码与硬件紧密相关,所以要熟悉开发板的硬件配置,可参考各芯片的用户手册。

     

u-boot启动过程

  u-boot的启动过程可以分成3个阶段。首先在flash中运行汇编程序,将flash中的启动代码部分复制到sdram中,同时创造环境准备运行c程序;然后在sdram中执行,对硬件进行初始化;最后设置内核参数的标记列表,复制镜像文件,进入内核的入口函数。

  1) 程序首先在flash中运行cpu入口函数/cpu/arm920t/start.s。具体工作包括:设置异常的入口地址和异常处理函数;配置pllcon寄存器,确定系统的主频;屏蔽看门狗和中断;初始化i/o寄存器;关闭mmu功能;调用/board/smdk2410中的memsetup.s,初始化存储器空间,设置刷新频率;将u-boot的内容复制到sdram中;设置堆栈的大小,ldr pc, _start_armboot。

  board/s3c2410中config.mk文件(text_base=0x31f00000)用于设置程序编译连接的起始地址,在程序中要特别注意与地址相关指令的使用。

  当程序在flash中运行时,执行程序跳转时必须要使用跳转指令,而不能使用绝对地址的跳转(即直接对pc操作)。如果使用绝对地址,那么,程序的取指是相对于当前pc位置向前或者向后的32mb空间内,而不会跳入sdram中。

  2) 程序跳转到sdram中执行/lib_arm/board.c中的start_armboot()函数。该函数将完成如下工作:

*设置通用端口rgpxcon;rgpxup;设置处理器类型gd->bd->bi_arch_number=193;设置启动参数地址gd->bd->bi_boot_params=0x30000100;

*env_init:设置环境变量,初始化环境;

*init_baudrate:设置串口的波特率;

*serial_init:设置串口的工作方式;

*flash_init:设置id号、每个分页的起始地址等信息,将信息送到相应的结构体中;

*dram_init:设置sdram的起始地址和大小;

*env_relocate:将环境变量的地址送到全局变量结构体中(gd->env_addr=(ulong)&(env_ptr->data));

*enable_interrupts:开启中断;

*main_loop:该函数主要用于设置延时等待,从而确定目标板是进入下载操作

  • U-Boot在S3C2410上的移植已关闭评论
    A+
发布日期:2019年07月02日  所属分类:参考设计