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网卡的驱动,将在后面介绍。
转载于:https://blog.51cto.com/chenboqiang/484032
BootLoader引导程序制作及移植(一)相关推荐
- BootLoader引导程序制作及移植(二)
2.添加命令 U-Boot中提供了丰富的命令,smdk2410板增加一些命令.我们为我们的开发板配置了一部分命令,找到下面的几行: #define CONFIG_CMD_CACHE #define C ...
- linux根文件系统的移植 课程设计,定稿基基于ARM9嵌入式Linux引导程序研究与移植嵌入式综合实验报告完整版...
<基<基于ARM9嵌入式Linux引导程序研究与移植>嵌入式综合实验报告.doc>由会员分享,可免费在线阅读全文,更多与<(定稿)基基于ARM9嵌入式Linux引导程序研 ...
- grub2引导linux内核,一种基于grub2的linux系统启动bootloader的制作方法与流程
技术领域 本发明涉及服务器应用技术领域,具体涉及一种基于grub2的linux系统启动bootloader的制作方法. 背景技术: 当前linux系统的内核版本已经升级至4.0以上,最新的linux系 ...
- 国民技术N32G430开发笔记(9)- IAP升级 Bootloader的制作
IAP升级 Bootloader的制作 1.上节提到Flash的分区,0x8000000-0x8004000为Boot分区,我们的bootloader就烧录到此分区. Bootloader很简单,新建 ...
- USBISP/USBasp编程器给Atmega32U4下载Arduino bootloader引导程序
用USBISP/USBasp编程器给ATmega32U4下载Arduino bootloader引导程序 ATmega32U4 bootloader引导程序是什么 引导程序下载接口与连接 配置熔丝位与 ...
- STM32MP157 Linux系统移植开发篇4: BootLoader(Uboot)移植
本文章为<STM32MP157 Linux系统移植开发篇>系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板).stm32mp157是ARM双核,2 ...
- linux之文件系统制作及移植
目标:用busybox定制一个很小的文件系统. 一.文件系统介绍 文件系统:是操作系统用于明确磁盘或分区上的文件的方法和数据结构,即在磁盘上组织文件的方法.Linux文件系统是一个完整的统一体,组织到 ...
- 给Arduino烧录BootLoader引导程序,包括Atmega 16U2(通信芯片),Atmega 328P(主控芯片)
需要用到USBtiny下载器和下载工具,USBtiny下载器如下所示: 下载工具在如下链接:https://download.csdn.net/download/weixin_36815313/112 ...
- jffs2文件系统制作与移植(二)
**************************************************************************************************** ...
最新文章
- python路径拼接问题
- Py之PyWapFetion:PyWapFetion的简介、安装、使用方法之详细攻略
- canvas基础-绘制矩形(1)
- cs架构用什么语言开发_C、C++、Go 语言、Linux服务器开发高级架构师进阶之路
- 《大话数据结构》读后总结(六)
- python中正则表达式的使用
- Git常用命令——基本操作
- Unity Shader:雾的数学运算以及在Unity中使用Fog
- 三部门部署开展非学科类校外培训收费专项整治工作
- 软件工程概论第十三周学习进度
- 企业数字化劳动力-Srise RPA产品
- 天梯—谁先倒(C语言)
- Redis的持久化策略
- Atitit 视频编码与动画原理attilax总结
- 解决方案架构师的职责
- 微信小程序商城源码,带前后端,基于node
- hcfax2e伺服驱动器说明书_SD伺服驱动器说明书
- 伺服驱动器cn1引脚定义_关于三菱驱动器CN1端口的接线-专业自动化论坛-中国工控网论坛...
- SAM-BA 2.14 reconfiguration----DIY你的sam-ba
- 免费版企业级杀毒软件mcafee使用报告。
热门文章
- 【每周NLP论文推荐】从预训练模型掌握NLP的基本发展脉络
- PSAM卡---中国人民银行PSAM卡管理规范.doc
- 产业兴乡村稳天下安 农民丰收节·林裕豪:谋定乡村振兴基石
- Python学习日记(六) 浅深copy
- 【链表】BZOJ1588: [HNOI2002]营业额统计
- Kibana安装及简单使用
- 【转】Linux操作系统下/etc/hosts文件配置方法
- java的本地文件操作
- grep 打印出过滤字段及后3行内容
- could not initialize proxy - no Session