1、UBoot移植U-Boot移植(博创up2410)2012-03-21 22:17:50|分类: 嵌入式系统移植 |标签: |字号大中小订阅 一、获得U-Boot源码 将u-boot-1.3.2.tar.bz2拷贝了工作目录下,解压源码包:rootvm-dev cpshare# mkdir u-bootrootvm-dev u-boot# cp /mnt/shared/u-boot-1.3.2.tar.bz2 ./rootvm-dev u-boot# tar jxvf u-boot-1.3.2.tar.bz2rootvm-dev u-boot# cd u-boot.1.3.2二、建立板级支持包
2、 在board目录下,每一块开发板都有一个对应的目录,因此我们需要为我们的开发板建立一个目录,名字叫做up2410,并创建相应的文件:rootvm-dev u-boot-1.3.2# cd board/rootvm-dev board# mkdir up2410rootvm-dev board# cp smdk2410/* up2410rootvm-dev board# cd ./上面的步骤中,我们把smdk2410目录下的所有文件都拷贝到了我们的up2410目录下,因为我们的开发板和smdk2410开发板的配置差不多。每个开发板都有一个自己的配置文件,如smdk2410开发板的配置文件为in
3、clude/configs/smdk2410.h,我们也需要为我们的开发板建立自己的配置文件。可以直接从smdk2410开发板的配置文件中修改而来。因此我们先把smdk2410的配置文件复制到我们开发板的配置文件当中:rootvm-dev u-boot-1.3.2# cp include/configs/smdk2410.h include/configs/up2410.h然后,修改Makefile,使得可以配置我们的开发板:rootvm-dev u-boot-1.3.2# vi Makefile在Makefile中找到下面两行:smdk2400_config : unconfig$(MKCO
4、NFIG) $(:_config=) arm arm920t smdk2400 NULL s3c24x0紧接这这两行添加如下两行:up2410_config : unconfig$(MKCONFIG) $(:_config=) arm arm920t up2410 NULL s3c24x0注意第二行开始部分的空白是按TAB键获得的!红色的部分显示了不同处!这样,我们自己的板级支持包就建好了。三、添加代码,支持从Nand Flash启动 由于我们的开发板上没有Nor Flash,只能从Nand Flash启动。而U-Boot默认不支持从Nand Flash启动,所以需要我们自己添加代码来实现从N
5、and Flash启动。1、修改start.S文件位于cpu/arm920t/目录下的start.S文件是开发板上电后运行的第一段代码,需要在这个文件中添加内容,以支持从Nand Flash启动。 rootvm-dev u-boot-1.3.2# vi cpu/arm920t/start.S 首先,删掉start.S中的第181行和201行的下面内容:#ifdef CONFIG_AT91RM9200.#endif 如果有这两句,这两句之间的内容将不会被编译。而我们的开发板需要执行这些内容。然后,找到这一行:#ifndef CONFIG_SKIP_RELOCATE_UBOOT 在紧接这这行的下面
6、添加下面几行:#ifdef CONFIG_S3C2410_NAND_BOOT bl copy_myself #else 再找到 ble copy_loop 在它的下面添加一行: #endif 做这些工作就是要完成一个简单的功能:如果我们定义了CONFIG_S3C2410_NAND_BOOT这个宏,那么就执行copy_myself这个子程序,否则就执行#else下面的程序。copy_myself这个子程序的功能就是把U-Boot自身的代码从Nand Flash拷贝到SDRAM中,需要我们自己实现,U-Boot自身并没有为我们实现。 我们把copy_myself也添加在start.S文件中。找到下
7、面的一行:_start_armboot: .word start_armboot 在这一行的下面添加如下的内容:/* * copy u-boot to ram*/ #ifdef CONFIG_S3C2410_NAND_BOOTcopy_myself:mov r10, lr save return address to r10ldr sp, DW_STACK_START 安装栈的起始地址mov fp, #0 初始化帧指针寄存器bl NF_Init 跳到复位C函数去执行read UBOOT from Nand Flash to RAMldr r0, =UBOOT_RAM_BASE 设置第1个参数:
8、 UBOOT在RAM中的起始地址 mov r1, #0x0 设置第2个参数:Nand Flash的起始地址mov r2, #0x30000 设置第3个参数: UBOOT的长度(192KB) bl nand_read_whole 调用nand_read_whole(), 该函数在board/up2410/nand.c中 tst r0, #0x0 如果函数的返回值为0,表示执行成功. beq ok_nand_read 执行内存比较1: b 1bok_nand_read: mov r0, #0x00000000 内部RAM的起始地址 ldr r1, =UBOOT_RAM_BASE UBOOT在RAM
9、中的起始地址 mov r2, #0x400 比较1024次, 每次4字节, 4 bytes * 1024 = 4Kbytesgo_next: ldr r3, r0, #4 ldr r4, r1, #4 teq r3, r4 bne notmatch subs r2, r2, #4 beq done_nand_read bne go_nextnotmatch:1: b 1bdone_nand_read: mov pc, r10#endifDW_STACK_START: .word STACK_BASE+STACK_SIZE-4上面是copy_myself的实现代码,添加完成以后,U-Boot启动
10、时就会执行我们的这段代码,将U-Boot的内容从Flash中拷贝到SDRAM中。 这样,start.S这个文件就修改完成了,保存刚才的修改。2、添加nand.c文件在copy_mysel这段程序中,我们调用了nand_read_whole子程序。这个程序是用C程序实现的,我们新建一个文件,board/up2410/nand.c,在这个文件中实现它:#include #include #include #define TACLS 0#define TWRPH0 3#define TWRPH1 0#define U32 unsigned intextern unsigned long nand_p
11、robe(unsigned long physadr);static void NF_Reset(void)int i;NF_nFCE_L();/* 使能Nand Flash */NF_CMD(0xFF);for(i=0;i10;i+);NF_WAITRB();NF_nFCE_H();void NF_Init(void)rNFCONF=(115)|(114)|(113)|(112)|(111)|(TACLS8)|(TWRPH04)|(TWRPH10);NF_Reset();int nand_read_whole(unsigned char *buf, unsigned long start_a
12、ddr, int size)int i, j;if (start_addr & NAND_BLOCK_MASK) | (size & NAND_BLOCK_MASK)return 1;NF_nFCE_L();for(i=0; i10; i+);i = start_addr;while(i 9) & 0xff;rNFADDR = (i 17) & 0xff;rNFADDR = (i 25) & 0xff;NF_WAITRB(); for(j=0; j NAND_SECTOR_SIZE; j+, i+) /* 读取每个扇区的所有指令*/*buf = (rNFDATA & 0xff);buf+;NF
13、_nFCE_H();/* 关闭NANDFLASH使能 */return 0; 上面就是nand.c文件的全部内容。为了使编译的时候能把这个文件编译进去,需要修改相应的Makefile:rootvm-dev u-boot-1.3.2# vi board/up2410/Makefile 找到这一行:COBJS := smdk2410.o flash.o 把这行的内容改为下面这行:COBJS := smdk2410.o flash.o nand.o 即在行尾加上了nand.o,这样,编译的时候就会把nand.c编译进去,并进行链接。3、修改up2410.h 前面提到,up2410.h是开发板的配置文件。关于nand.c中用到的一些宏或者其他需要定义的,我们都放在up2410.h中。注意,这里只介绍和从Nand启动相关的配置,因为up2410.h中还有很多其他配置,将在后面介绍! rootvm-dev u-boot-1.3.2# vi include/configs/up2410.h 光标移动到文件的末尾,在文件的最后一个#endif的前面添加如下内容:#define CONFIG_S3C2410_NAND_BOOT 1 #define STACK_BASE 0x33f00000#defin
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1