开发者社区> 余二五> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

BootLoader引导程序制作及移植(一)

简介:
+关注继续查看

U-Boot 实验指导书

一、获得U-Boot 源码

我们的光盘中提供了直接从U-Boot的官方网站下载的源代码,版本是1.3.2,放在src目录下。将u-boot-1.3.2.tar.bz2拷贝了工作目录下,解压源码包:

[root@localhost root]# mkdir 2410-s

[root@localhost root]# cd 2410-s/

[root@localhost 2410-s]# cp /mnt/hgfs/linux/u-boot-1.3.2.tar.bz2 ./

[root@localhost 2410-s]# tar xjvf u-boot-1.3.2.tar.bz2

 

二、建立板级支持包

board立一个目录,目名录字下叫,做每一块开发板都有一个对应的目录,因此我们需要为我们的开发板建up2410,并创建相应的文件:

[root@vm-dev u-boot-1.3.2]# cd board/

[root@vm-dev board]# mkdir up2410

[root@vm-dev board]# cp smdk2410/* up2410

[root@vm-dev board]# cd ../

 

上面的步骤中,我们把smdk2410目录下的所有文件都拷贝到了我们的up2410下,因为我们的开发板和目录smdk2410每个开发板都有一个自己的开配发置板的文配件置,差如不多。smdk2410开发板的配置文件为include/configs/smdk2410.h,我们也需要为我们的开发板建立自己的配置文件。可以直接从smdk2410开发板的配置文件中修改而来。因此我们先把smdk2410的配置文件复制到我们开发板的配置文件当中:

[root@vm-dev u-boot-1.3.2]# cp include/configs/smdk2410.h include/configs/up2410.h

然后,修改Makefile,使得可以配置我们的开发板:

[root@vm-dev u-boot-1.3.2]# vi Makefile

Makefile中找到下面两行:

smdk2400_config : unconfig

@$(MKCONFIG) $(@:_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启动,所以需要我们自己添加代码来实现从Nand Flash启动。

1、修改start.S

文件位于cpu/arm920t/目录下的start.S这个文件中添加内容,以支持从文件是开发板上电后运行的第一段代码,需要在Nand Flash启动。

[root@localhost u-boot-1.3.2]# vi +181 cpu/arm920t/start.S

首先,删掉start.S中的第181行和201行的下面内容:

#ifdef CONFIG_AT91RM9200

...............................................................

#endif

如果有这两句,这两句之间的内容将不会被编译。而我们的开发板需要执行这些内容。然后,找这到这一行:

#ifndef CONFIG_SKIP_RELOCATE_UBOOT

在紧接这行的下面添加下面几行:

#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文件中。找到下面的一行:

_start_armboot: .word start_armboot

在这一行的下面添加如下的内容:

上面是copy_myself的实现代码,添加完成以后,U-Boot段代码,将启动时就会执行我们的这U-Boot的内容从Flash中拷贝到SDRAM中。

这样,start.S这个文件就修改完成了,保存刚才的修改。

 

2、添加nand.c 文件

 

copy_mysel这段程序中,我们调用了nand_read_whole子程序。这个程序是用C程序实现的,我们新建一个文件,board/up2410/nand.c,在这个文件中实现它:

#include <common.h>

#include <s3c2410.h>

#include <config.h>

#define TACLS 0

#define TWRPH0 3

#define TWRPH1 0

#define U32 unsigned int

extern unsigned long nand_probe(unsigned long physadr);

static void NF_Reset(void)

{

       int i;

       NF_nFCE_L();

       NF_CMD(0xFF);

       for(i=0;i<10;i++);

       NF_WAITRB();

       NF_nFCE_H();

}

void NF_Init(void)

{

       rNFCONF=(1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0);

       NF_Reset();

}

int nand_read_whole(unsigned char *buf, unsigned long start_addr, int size)

{

       int i, j;

       if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK))

       return 1;

       NF_nFCE_L();

       for(i=0; i<10; i++);

       i = start_addr;

       while(i < start_addr + size) {

       rNFCMD = 0;

       rNFADDR = i & 0xff;

       rNFADDR = (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_nFCE_H();

       return 0;

}

 

[root@localhost u-boot-1.3.2]# vi board/up2410/nand.c

 

上面就是nand.c文件的全部内容。为了改相应的使编译的时候能把这个文件编译进去,需要修Makefile

[root@vm-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

中还有很多其他配置,将在后面介绍!

[root@vm-dev u-boot-1.3.2]# vi + include/configs/up2410.h

光标移动到文件的末尾,在文件的最后一个#endif的前面添加如下内容:

#define CONFIG_S3C2410_NAND_BOOT 1

#define STACK_BASE 0x33f00000

#define STACK_SIZE 0x8000

#define UBOOT_RAM_BASE 0x33f80000

#define CFG_NAND_BASE 0x4E000000

#define CFG_MAX_NAND_DEVICE 1

#define SECTORSIZE 512

#define NAND_SECTOR_SIZE SECTORSIZE

#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)

#define ADDR_COLUMN 1

#define ADDR_PAGE 2

#define ADDR_COLUMN_PAGE 3

#define NAND_ChipID_UNKNOWN 0x00

#define NAND_MAX_FLOORS 1

#define NAND_MAX_CHIPS 1

#define WRITE_NAND_COMMAND(d, adr) do {rNFCMD = d;} while(0)

#define WRITE_NAND_ADDRESS(d, adr) do {rNFADDR = d;} while(0)

#define WRITE_NAND(d, adr) do {rNFDATA = d;} while(0)

#define READ_NAND(adr) (rNFDATA)

#define NAND_WAIT_READY(nand) {while(!(rNFSTAT&(1<<0)));}

#define NAND_DISABLE_CE(nand) {rNFCONF |= (1<<11);}

#define NAND_ENABLE_CE(nand) {rNFCONF &= ~(1<<11);}

#define NAND_CTL_CLRALE(nandptr)

#define NAND_CTL_SETALE(nandptr)

#define NAND_CTL_CLRCLE(nandptr)

#define NAND_CTL_SETCLE(nandptr)

#define CONFIG_MTD_NAND_VERIFY_WRITE 1

#define rNFCONF (*(volatile unsigned int *)0x4e000000)

#define rNFCMD (*(volatile unsigned char *)0x4e000004)

#define rNFADDR (*(volatile unsigned char *)0x4e000008)

#define rNFDATA (*(volatile unsigned char *)0x4e00000c)

#define rNFSTAT (*(volatile unsigned int *)0x4e000010)

#define rNFECC (*(volatile unsigned int *)0x4e000014)

#define rNFECC0 (*(volatile unsigned char *)0x4e000014)

#define rNFECC1 (*(volatile unsigned char *)0x4e000015)

#define rNFECC2 (*(volatile unsigned char *)0x4e000016)

#define NF_CMD(cmd) {rNFCMD=cmd;}

#define NF_ADDR(addr) {rNFADDR=addr;}

#define NF_nFCE_L() {rNFCONF&=~(1<<11);}

#define NF_nFCE_H() {rNFCONF|=(1<<11);}

#define NF_RSTECC() {rNFCONF|=(1<<12);}

#define NF_RDDATA() (rNFDATA)

#define NF_WRDATA(data) {rNFDATA=data;}

#define NF_WAITRB() {while(!(rNFSTAT&(1<<0)));}

 

 

这样,关于从Nand启动的修改就做完了。保存文件。

三、开发板的配置。

前面已经提到,up2410.h文件中进行配置。是我们的开发板的配置文件,许多重要的内容都需要在这个

1、网卡配置

Smdk2410开发板上用的是CS8900网卡,而我们的开发板上使用的是AX88796网卡, 因此网卡的配置需要修改。找到下面三行:

#define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */

#define CS8900_BASE 0x19000300

#define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */

注释掉这三行,在这三行下面添加下面的两行:

#define CONFIG_DRIVER_DM9000 1

#define CONFIG_DRIVER_DM9000_BASE 0x10000000

#define DM9000_IO CONFIG_DM9000_BASE

#define DM9000_DATA (DM9000_IO + 2)

#define CONFIG_DM9000_USE_16BIT

这样定义主要是因为U-Boot中提供的DM9000X网卡驱动与我们的经典2410用的平台上使DM9000A网卡有一定的不同之处,不能直接驱动我们的DM9000A这里对网卡的信息进行配置以外,还需要修改网卡。因此,除了DM9000A网卡的驱动,将在后面介绍。










本文转自 chen138 51CTO博客,原文链接:http://blog.51cto.com/chenboqiang/484032,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
剑指Offer-Java-二进制中1的个数
剑指Offer-Java-二进制中1的个数
12 0
剑指offer之二进制中1的个数
剑指offer之二进制中1的个数
20 0
【重磅来袭】阿里小程序IDE上线8大功能
本次阿里小程序IDE 共更新上线了8项功能 分别是: uni-app 跨平台研发支持 开发监控 性能调试诊断升级 预检测新增代码扫描 预览和真机调试交互优化 沙箱重装上阵 IDE扩展市场 支付宝IoT小程序研发支持
2803 0
web程序员标准环境之DreamWeaver【…
Adobe Dreamweaver,简称“DW”,中文名称 "梦想编织者",是美国MACROMEDIA公司开发的集网页制作和管理网站于一身的所见即所得网页编辑器,DW是第一套针对专业网页设计师特别发展的视觉化网页开发工具,利用它可以轻而易举地制作出跨越平台限制和跨越浏览器限制的充满动感的网页。
1135 0
web程序员标准环境之DreamWeaver【推荐】
Adobe Dreamweaver,简称“DW”,中文名称 "梦想编织者",是美国MACROMEDIA公司开发的集网页制作和管理网站于一身的所见即所得网页编辑器,DW是第一套针对专业网页设计师特别发展的视觉化网页开发工具,利用它可以轻而易举地制作出跨越平台限制和跨越浏览器限制的充满动感的网页。
882 0
android studio 程序员有福了—从layout自动生成viewholder类
狂点这里下载 超级牛逼的插件啊,比那些使用SparseArray的强太多了! 在android studio 1.0上测试,没有问题。 不说了直接说功能 Android Toolbox Plugin for IDEA.
960 0
+关注
20377
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载