嵌入式BootLoader移植实验三

  • 格式:doc
  • 大小:3.26 MB
  • 文档页数:17

合肥学院嵌入式系统设计实验报告(2013- 2014第二学期)专业:实验项目:实验三 BootLoader移植实验实验时间: 2014 年 5 月 7实验成员:___指导老师:干开峰电子信息与电气工程系2014年4月制一、实验目的1、熟悉Bootloader工作原理。

2、了解U-Boot的代码结构。

3、掌握U-Boot移植过程。

二、实验内容本实验熟悉Bootloader工作原理,了解U-Boot源码结构,基于S3C2440处理器,完成U-Boot移植,并在目标开发板上测试通过。

三、移植环境u-boot版本:u-boot-2011-03Linux平台:Fedora 14交叉编译工具:arm-linux-gcc-4.3.3arm开发板:micro2440CPU:S3C2440SDRAM:64M 1Nor Flash:2MNand Flash:256M网卡:DM9000EP四、实验过程1、建立Micro2440配置(1)按下图所示命令解压u-boot-2011.03-micro2440.tar压缩包(2)输入命令:gedit boards.cfg打开boards.cfg文件。

在boards.cfg中添加一行:micro2440 arm arm920t - samsung s3c24x0 语句。

(3)创建板级支持文件输入命令:cp -r board/samsung/smdk2410 board/samsung/micro2440cd board/samsung/micro2440/mv smdk2410.c micro2440.cgedit Makefile将COBJS := smdk2410.o flash.o 改为COBJS := micro2440.o flash.o输入命令: cd ../../..cp include/configs/smdk2410.h include/configs/micro2440.hgedit include/configs/micro2440.h修改内容一:#define CONFIG_SYS_PROMPT "[Micro2440]# " /* Monitor Command Prompt */ 修改内容二:#define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM_1#define CONFIG_SYS_INIT_SP_ADDR(CONFIG_SYS_SDRAM_BASE+0x1000-GENERATED_GBL_DATA_SIZE)(4)测试编译环境输入命令:make micro2440_config出现:Configuring for micro2440 board...输入命令:makeGenerating include/autoconf.mkGenerating include/autoconf.mk.dep............arm-linux-objcopy -O srec u-boot u-boot.srecarm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin2、在RAM 中运行(1)在根目录下进入 include/configs文件夹输入命令:gedit micro2440.h ,打开micro2440.h文件。

(2) 在micro2440.h中删除:#define CONFIG_S3C2410 1 /* specifically a SAMSUNG S3C2410 SoC */ #define CONFIG_SMDK2410 1 /* on a SAMSUNG SMDK2410 Board */ 添加:#define CONFIG_S3C2440 1 /* specifically a SAMSUNG S3C2440 SoC */ #define CONFIG_MICRO2440#define CONFIG_SKIP_LOWLEVEL_INIT(3)在根目录下进入arch/arm/cpu/arm920t文件夹输入命令:gedit start.S按下图所示进行修改部分内容:(4)在根目录board/samsung/micro2440下中输入gedit micro2440.c 命令(5)测试在根目录下输入命令:make编译完成后将 u-boot.bin 下载到 SDRAM 的 0x33f80000 地址处,u-boot 已经能在RAM 中运行。

3、支持DM900(1)在根目录下打开include/configs文件夹,执行gedit micro2440.h命令删除:#define CONFIG_CS8900 /* we have a CS8900 on -board */#define CONFIG_NETMASK 255.255.255.0#define CONFIG_IPADDR 10.0.0.110#define CONFIG_SERVERIP 10.0.0.1添加:#define CONFIG_CMD_NET#define CONFIG_DRIVER_DM9000 1#define CONFIG_DM9000_NO_SROM 1#define CONFIG_DM9000_BASE 0x20000300#define DM9000_IO CONFIG_DM9000_BASE#define DM9000_DATA (CONFIG_DM9000_BASE + 4)#define CONFIG_CMD_PING#define CONFIG_ETHADDR 08:00:3e:26:0a:5b //开发板 MAC 地址#define CONFIG_NETMASK 255.255.255.0#define CONFIG_IPADDR 192.168.10.126 //开发板 IP 地址#define CONFIG_SERVERIP 192.168.10.124 //主机 IP 地址(2)在根目录下进入board/samsung/micro2440文件夹执行gedit micro2440.c命令(3)在根目录下进入arch/arm/lib文件夹执行gedit eabi_compat.c命令(4)在根目录下进入drivers/net文件夹执行gedit dm9000x.c命令在修改static int dm9000_init(struct eth_device *dev, bd_t *bd)函数中内容,如下图所示:(5)测试在根目录下输入命令:make编译完成后将 u-boot.bin 下载到 SDRAM 的 0x33f80000 地址处,u-boot 已经能在RAM中运行。

测试结果如下图所示:4、支持内核启动(1)在根目录下进入include/configs文件夹执行gedit micro2440.h命令添加:#define CONFIG_SETUP_MEMORY_TAGS 1 //如果没有定义这个参数,则 uboot 参数必须加入 men=内存大小(2)在根目录下进入arch/arm/lib文件夹执行gedit bootm.c命令在static void announce_and_cleanup(void)函数中添加:#ifndef CONFIG_MICRO2440cleanup_before_linux();#endif(3)自动启动内核如果要自动启动内核,需要include/conskfigs/micro2440.h 定义CONFIG_BOOTCOMMAND ,类似如下内容:#define CONFIG_BOOTCOMMAND"nand read 0x30008000 0x60000 0x300000;bootm 0x30008000"(4)测试在根目录下输入命令:make编译完成后将 u-boot.bin 下载到 SDRAM 的 0x33f80000 地址处,u-boot 已经能在RAM中运行。

测试结果如下图所示:5、支持Nand Flash(1)添加 s3c2440_nand.c文件在根目录下输入touch drivers/mtd/nand/s3c2440_nand.c 指令进行文件的创建,在根目录下输入gedit drivers/mtd/nand/s3c2440_nand.c命令打开文件。

在DEBUGN("board_nand_init()/n");下面修改如图所示的三句内容:(2)在根目录下进入drivers/mtd/nand文件夹中执行gedit Makefile命令添加:#COBJS-$(CONFIG_NAND_S3C2440) += s3c2440_nand.o如下图所示:(3)在根目录下进入include/conskfigs文件夹打开micro2440.h文件添加:#define CONFIG_MTD_DEVICE#define CONFIG_NAND_S3C2440#define CONFIG_CMD_NAND#if defined(CONFIG_C MD_NAND)#define CONFIG_SYS_NAND_BASE 0x4E000000 //Nand 配置寄存器基地址 #define CONFIG_SYS_MAX_NAND_DEVICE 1#define CONFIG_MTD_NAND_VERIFY_WRITE 1#endif#define CONFIG_ENV_IS_IN_NAND 1#define CONFIG_ENV_OFFSET 0x40000//将环境变量保存到nand中的0x40000位置 #define CONFIG_ENV_SIZE 0x10000 /* Total Size of Environment Sector */(4)测试在根目录下输入命令:make编译完成后将 u-boot.bin 下载到 SDRAM 的 0x33f80000 地址处,u-boot 已经能在RAM中运行。

测试结果如下图所示:6、支持yaffs下载(1)在根目录下进入include/conskfigs文件夹执行gedit micro2440.h命令添加:#define CONFIG_CMD_NAND_YAFFS(2)在根目录下进入drivers/mtd/nand文件夹打开nand_util.c文件修改部分内容:if (!need_skip && !withoob) { …… }ops.mode = MTD_OOB_RAWrval = nand->write_oob(nand, offset, &ops);if (rval)break;(3)下载yaffs镜像下载 yaffs 镜像的时候要注意分区的第一块不能写,比如友善之臂的默认分区如下:Number of partitions: 4name : offset size flag-------------------- ----------------------------------------vivi : 0x00000000 0x00040000 0param : 0x00040000 0x00020000 0kernel : 0x00060000 0x00500000 0root : 0x00560000 0x3fa80000 0也就是说 yaffs 镜像所在分区的起始地址在 0x560000,因此使用 nand write.yaffs 命令下载 yaffs 时要写的地址为0x560000 + 0x20000 (Nand Flash 每块的大小)= 0x580000,即下载命令类似如下: tftp 0x30008000 uImagenand write.yaffs 0x30008000 0x580000 0x3000007、支持Nand Flash启动(1)创建nand_read.c在根目录下执行touch board/samsung/micro2440/nand_read.c命令,在根目录下执行gedit board/samsung/micro2440/nand_read.c命令,将下列内容复制到nand_read.c文件中#define rNFCONF (*(volatile unsigned *)0x4E000000)#define rNFCONT (*(volatile unsigned *)0x4E000004)#define rNFCMD (*(volatile unsigned *)0x4E000008)#define rNFADDR (*(volatile unsigned *)0x4E00000C)#define rNFDATA8 (*(volatile unsigned char*)0x4E000010)#define rNFSTAT (*(volatile unsigned *)0x4E000020)#define CMD_READ1 0x00 /* 页读命令周期 1 */#define CMD_READ2 0x30 /* 页读命令周期 2 */#define CMD_RESET 0xFF /* 复位 */#define NF_CMD(cmd) {rNFCMD=(cmd);} /* 写命令 */#define NF_ADDR(addr) {rNFADDR=(addr);} /* 写地址 */#define NF_RDDATA8() (rNFDATA8) /* 读 8 位数据 */#define NF_nFCE_L() {rNFCONT&=~(1<<1);} /* 片选使能 */#define NF_nFCE_H() {rNFCONT|=(1<<1);} /* 片选禁用 */#define NF_WAITRB() {while(!(rNFSTAT&(1<<1)));} /* 等待就绪 */ #define NF_CLEAR_RB() {rNFSTAT |= (1<<2);} /* 清除就绪/忙位 */#define NF_DETECT_RB() {while(!(rNFSTAT&(1<<2)));} /* 等待就绪 */ #define TACLS 1#define TWRPH0 2#define TWRPH1 1void delay(int i){while(i-->0);}void Nand_Init(void){rNFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(0<<0);rNFCONT = (1<<4)|(1<<1)|(1<<0);}static void Nand_Reset(void){NF_nFCE_L(); /* 片选使能 */NF_CLEAR_RB(); /* 清除就绪/忙位 */NF_CMD(CMD_RESET); /* 写复位命令 */NF_DETECT_RB(); /* 等待就绪 */NF_nFCE_H(); /* 片选禁用 */}unsigned char Nand_ReadPage(const int page, unsigned char * const buffer) {int i;Nand_Reset();NF_nFCE_L();NF_CLEAR_RB();NF_CMD(CMD_READ1);NF_ADDR(0x0);NF_ADDR(0x0);NF_ADDR(page&0xff);NF_ADDR((page>>8)&0xff);NF_ADDR((page>>16)&0xff);NF_CMD(CMD_READ2);NF_DETECT_RB();for (i = 0; i < 2048; i++){buffer[i] = NF_RDDATA8();}NF_nFCE_H();}int nand_read(int start_page, int read_pages, unsigned char *buffer) {int i;Nand_Init();for(i=0; i<read_pages; i++){Nand_ReadPage(start_page, buffer + 2048*i);start_page++;}return 0;}(2)在根目录下进入board/samsung/micro2440文件夹执行gedit Makefile命令修改COBJS := micro2440.o flash.o nand_read.o(3)在根目录下执行gedit arch/arm/cpu/arm920t/u-boot.lds命令修改:.text :{arch/arm/cpu/arm920t/start.o (.text)board/samsung/micro2440/libmicro2440.o (.text)*(.text)}(4)在根目录下执行gedit arch/arm/cpu/arm920t/start.S 命令添加下面蓝色字体的内容,黑色字体用于定位#ifndef CONFIG_SKIP_LOWLEVEL_INITbl cpu_init_crit#endif#ifdef CONFIG_S3C2440_NAND_BOOTldr sp, =0x30008000ldr r0, =0x0;ldr r1, _end_ofsmov r1, r1, LSR #11add r1, r1, #1ldr r2, =(CONFIG_SYS_TEXT_BASE)bl nand_readldr pc, =relocations#endif............copy_loop:ldmia r0!, {r9-r10} /* copy from source address [r0] */ stmia r1!, {r9-r10} /* copy to target address [r1] */ cmp r0, r2 /* until s ource end address [r2] */blo copy_loop#ifdef CONFIG_S3C2440_NAND_BOOTrelocations:ldr r6, =CONFIG_SYS_TEXT_BASE#endif#ifndef CONFIG_PRELOADER/** fix .rel.dyn relocations*/............clbss_l:str r2, [r0] /* clear loop... */add r0, r0, #4cmp r0, r1bne clbss_lbl coloured_LED_initbl red_LED_on#endif#ifdef CONFIG_S3C2440_NAND_BOOTldr sp, =(CONFIG_SYS_INIT_SP_ADDR)bic sp, sp, #7 /* 8 -byte alignment for ABI compliance */ ldr r0,=0x00000000ldr pc, =board_init_f#endif/** We are done. Do not return, instead branch to second part of board * initialization, now running from RAM.*/#ifdef CONFIG_NAND_SPL(5)在根目录下进入include/configs文件夹执行gedit micro2440.h命令#define CONFIG_S3C2440_NAND_BOOT/* #define CONFIG_SKIP_LOW LEVEL_INIT */(6)在根目录下进入arch/arm/lib文件夹执行gedit board.c命令修改一下内容:void board_init_f (ulong bootflag){......gd->mon_len = _bss_end_ofs + 0x100000; /* why */....../* relocate_code (addr_sp, id, addr); */#ifdef CONFIG_S3C2440_NAND_BOOT /*add by wzc*/__asm__ __volatile__("mov sp,%0"::"r"(addr_sp):"sp");/*add by wzc*/ board_init_r(id, addr);#elserelocate_code (addr_sp, id, addr);/* NOTREACHED - relocate_code() does not return */#endif}(7)下载到Nand Flash将生成的bin文件下载到开发板就可以Nand Flash启动了。