基于OK6410的u-boot2010.03…
来源:互联网 发布:淘宝9块9包邮 编辑:程序博客网 时间:2024/05/21 19:55
在ftp://ftp.denx.de/pub/u-boot/中下载u-boot-2010.03,其实我之前用的是u-boot-2010.06,坑爹很久才发现,u-boot-2010.06是一个分界点,u-boot-2010.03是最后一个版本类似u-boot1.1.6.而u-boot-2010.06是一个新起点版本。我承认我是一个菜鸟,一个刚买OK6410不久的菜鸟,一个刚刚接触linux的菜鸟,既然是菜鸟,我就要从模仿开始,于是,我拖出u-boot-1.1.6开始研究,开始移植u-boot-2010.03。
下载好u-boot-2010.03之后,解压缩,这里的一切我都是在XP系统下完成的。
1.进入u-boot-2010.03/board,把除samsung以外的文件夹删除。
2.进入u-boot-2010.03/cpu,把除arm1176以外的文件夹删除。
3.进入u-boot-2010.03include,把asm-*(注意,仅仅是asm-开头的文件夹)中的,除了asm-arm和asm-generic以外的文件夹删除。
4.进入u-boot-2010.03includeconfigs,只要留下smdk6400.h,其他的东西删除。
5.在u-boot-2010.03,把lib_*开头的文件夹,除了lib_arm和lib_generic以外的文件夹删除。
6.
现在把u-boot-2010.03放入到ubuntu中,先配置:make
好戏还在后头。
我们先来看下删减之后的u-boot-2010.03的构架:
这里交大家一个指令:tree,怎么用呢?我也忘了,没关系,man
呵呵,那就是使用tree
我们来尝试下:
其中白色的是文件,蓝色的是目录,绿色的是可执行文件。
现在进入u-boot-2010.03boardsamsung,
进入u-boot-2010.03includeasm-arm,把除了arch-s3c64xx和proc-armv之外的文件夹删除。进入arch-s3c64xx,建立s3c6410.h,将s3c6400.h文件里面的程序原原本本复制到s3c6410.h。
进入根目录下的Makefile,这个我就不加详细分析,我想我也可能分析不过来。找到:
smdk6400_noUSB_config
smdk6400_config:unconfig
@mkdir
@mkdir
@echo
@if
echo
$(MKCONFIG)
else
echo
$(MKCONFIG)
fi
@echo
这个是smdk6400的配置,现在将它改成smdk6410的配置:
smdk6410_noUSB_config
smdk6410_config:unconfig
@mkdir
@mkdir
@echo
@if
echo
$(MKCONFIG)
else
echo
$(MKCONFIG)
fi
@echo
进入u-boot-2010.03boardsamsungsmdk6410,打开smdk6410.c,把#include
把u-boot-2010.03中所有的
这是第二版修改,我把下面这段代码做了适当修改:
#ifndef
movr0,
mcrp15,
mcrp15,
mrcp15,
bicr0,
bicr0,
orrr0,
orrr0,
mcrp15,
#endif
在start.S中,bl
这段代码是判断到底是从nandflash中启动还是从ram中启动。
1.如果是从nandflash中启动,那么PC的值一定在4K之内。那么执行完bic
2.如果是从ram中启动,那么PC的值为0x
承接上面分析,如果没有完成copy,则接下来就是copy_from_nand。
那么在beq
#ifdef
#endif
如果完成则会跳过这段代码,直接进入after_copy。
OK,在u-boot-2010.03cpuarm1176下面新建一个nand_cp.c文件:
#include
#ifdef
#include
#include
#include
static
{
{
}
static
{
{
{
{
}
int
{
}
#endif
在u-boot-2010.03cpuarm1176的makefile中:
COBJS=
其中nand_cp.o是新加。
然后返回start.S,在:
#ifdef
enable_mmu:
这段代码之前添加上:
after_copy:
接着在:
#ifdef
theLastJump:
这段代码之前添加下面代码:
.globl
copy_from_nand:
3:
1:
4:
copy_failed:
compare_failed:
接着进入u-boot-2010.03includeconfigs下面的smdk6410.h文件,
1.新添加下面代码,由于是宏定义,只要在smdk6410.h中,任何一个“可以”放置的地方放置都行,注意,是“可以”放置,自己体会什么意思:
#define
2.这句代码:
#define
其中"SMDK6400
3.注意下面这条宏定义:
#define
这里是适应于内存为128MB的OK6410,但是我购买的OK6410—A内存为256MB,所以要对这句话进行修改:
#define
为什么?
我们来分析一下:
我们知道2^10=1KB,
4.为了对号入座,我们就把nand_cp.c中用到的宏定义添加在
下面:
#define
#define
#define
上面3个宏定义在前面的nand_cp.c中我已经分析了,这里就不多费口舌。
这里也是第二版修改,额外加上了如下改动:
1.第一版没有更改6410的ID号!
//#define
#define
将smdk6400的ID注释掉,添加smdk6410的ID号
2.更改内存的分配大小
//#define
#define
#define
3.修改bootdelay时间
#define
4.修改SDROM大小
//#define
#define
5.时间的修改
//#define
#define
6.堆栈大小的修改
//#define
#define
7.Nand
//#define
#define
8.Total
//#define
#define
9.CONFIG_BOOTCOMMAND的修改
#define
"bootm
修改为:
#define
"bootm
10.CONFIG_ENV_OFFSET的修改:
#define
11.Nand
//#define
#define
12.Nand
//#define
#define
13.校验位
//#define
#define
在这里还需要一步完成,这里也是第二版本添加:
1.在u-boot-nand.lds中添加:
{
}
2.在u-boot.lds中添加:
{
cpu/arm1176/start.o(.text)
cpu/arm1176/s3c64xx/cpu_init.o(.text)
board/samsung/smdk6410/lowlevel_init.o
cpu/arm1176/nand_cp.o
lib_arm/board.o
*(.text)
}
3.删除nand_splboard除去samsung文件夹以外的文件夹,进入samsung,复制一个smdk6410.
进入makefile:
COBJS=
在下面代码
#
$(obj)cpu_init.S:
@rm
@ln
之后添加
$(obj)nand_cp.c:
@rm
@ln
在编译之前还有一个地方需要修改:
在lowlevel_init.S修改LED灯的测试代码,这个参考6410手册进行修改。
配置,编译,生成u-boot.bin
放进去OK6410开发版,可以看到下面效果:
于是乎,OK,u-boot-2010.03的移植就完成了第一步。
接下来就是网卡了。
U-boot-2010.03默认的网卡支持是CS8900,但是OK6410使用的是DM9000.
在smdk6410.h中将CS8900的宏定义注释掉:
//#define
//#define
//#define
//#define
然后添加DM9000网卡的宏定义:
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
//#define
上面的IP和网关、子网掩码等根据自己的具体情况进行修改。
接着打开u-boot-2010.03/net/eth.c,并且进入到函数int
#if
mv6446x_eth_initialize(bis);
#endif
后面添加下面代码:
#if
#endif
同样在u-boot-2010.03/net/net.c,
1.将//#
修改成:
#
2.将if
修改成:
if
3.将//NetSetTimeout
修改成:
NetSetTimeout
接着进入u-boot-2010.03/net/tftp.c,找到void
TftpStart
#if
if
TftpBlkSizeOption
if
TftpTimeoutMSecs
if
printf("TFTP
"set
TftpTimeoutMSecs);
TftpTimeoutMSecs
}
debug("TFTP
TftpBlkSizeOption,
#endif
网卡驱动终究完成。编译:
放进去OK6410效果:
上图即为移植好网卡后的效果图。
这是我移植u-boot的第一个版本,日后会渐渐在这份资料上进行完善。下一次更新在半月之后。
进入dm9000x.c,找到static
在do之前添加:
DM9000_ior(DM9000_MRRH);
DM9000_ior(DM9000_MRRL);
static
{
DM9000_DBG("%sn",
//phy_write(0,
//DM9000_iow(DM9000_GPR,
//DM9000_iow(DM9000_IMR,
//DM9000_iow(DM9000_RCR,
}
再把上面的//后面的程序屏蔽
这里是网络ping通之后的效果:
Nand
nand
在nand_cp.c中有这么一段代码很有意思,现在拿出来分析一下:
{
{
首先我们来看下buf是什么?
uchar
dst_addr又是什么?
static
我们再看一下下面这条程序:
return
也就是说buf的地址就是CONFIG_SYS_PHY_UBOOT_BASE。前面我们就分析过CONFIG_SYS_PHY_UBOOT_BASE
好了,我们现在开始分析第个for语句:
for
{
i
注意,每次是2K的操作,单独一句不奇怪,Ok,我们接着看第二个for语句。
for
{
但是执行四次之后每次是4K的操作,为什么?之前刚好执行了8K!!!
关键的8K代码不是在K9GAG08U0D型号(每页4K)的前两页存放,也不是在K9GAG08U0E型号(每页8K)的第一页存放,而是在K9GAG08U0E型号或者K9GAG08U0D型号的前四页中存放的,前四页分为每页2K,总共8K,这是由s3c6410芯片本身所规定的。这8K字节外后面的数据就是按实际的页数存放了,K9GAG08U0D型号每页存放4K字节,K9GAG08U0E型号每页存放8K字节。
再者,进入nand.ids,作如下修改:
//{"NAND
{"NAND
我把生成的u-boot烧写到OK6410当中运行,在u-boot上:
Set
Sav
按理说我复位启动之后应该是20S了,但是,这是我在启动瞬间接下来的图:
说明我们的环境变量没有储存在nand
没办法,找吧!
1.将s3c6410.h中的:
#define
和
#define
修改成如下:
#define
和
#define
2.在include/linux/mtd/mtd.h:
将结构体struct
//uint64_t
//uint64_t
//uint64_t
改成:
u_int32_t
u_int32_t
u_int32_t
将结构体struct
//uint64_t
改成:
3.在int
if
gd->env_addr
gd->env_valid
return
}
gd->env_valid
}
改成:
if
//gd->env_addr
//gd->env_valid
gd->env_valid
return
}
gd->env_valid
}
其实这步是违规的。但是只有这样强制性才能达到我想要的目标,至于为什么,请求高手指点。编译运行,OK!
按理说,u-boot的移植到此就应该结束了,但是什么都要智能化,那么现在我们就完成智能化。
U-boot有许多指令,nand
我们进入include/command.h头文件中
可以找到
typedef
在commad.h文件夹下面新建一个cmd_hello.c文件:
#include
#include
int
{
}
U_BOOT_CMD(hello,
然后在common/Makefile中的#command添加如下内容:
Ok,现在编译、运行:
我现在小试hello的指令,好了,我现在添加其他的指令。
我们现在在cmd_nand.c的基础上添加一个自动下载u-boot到nand
进入cmd_nand.c中,在:
if
return
}
之后添加:
if(strcmp(cmd,"uboot")==0)
{
printf("Re-program
if
goto
addr
run_command
//printf("nand
size
puts("nwrite
for
{
nand_write_skip_bad(nand,
}
puts("write
for(i=4;
{
nand_write_skip_bad(nand,
}
return
}
加上之后,编译运行:
这就是我们添加nand
接下来就是内核的引导了。这个就要根据内核来编译了。所以引导内核linux不同也会有所细微不同。
1.由于uboot只能引导uImage,因此需要把编译成的zImage转换成uImage,先进入u-boot根目录下,把tools/下mkimage复制到虚拟机/bin目录下,然后进入到linux-2.6.36/下输入指令:make
2.#define
static
{
.name=
.offset=
.size=
.mask_flags=
},
{
.name=
.offset=
.size=
.mask_flags=
},
{
.name=
.offset=
.size=
},
{
.name=
.offset=
.size=
}
};
分区而定。否则就算用这个可行的u-boot还是无法引导飞凌公司提供的编译好了的linux内核。
U-boot-2010.03的移植到此结束,历时2个月。想想我真的很菜,2个月才把u-boot2010.03移植成功。在此期间,牺牲了很多个周末和晚上休息时间,没办法,白天要去可恶的大教室上课。
本资料仅供初学u-boot者使用,因为里面可能会有错误,请各位指点。
借此五一放假,为了遵守我之前所说:
我把资料在此整理了一遍。希望会对初学者有用。——宁静致远
- 基于OK6410的u-boot2010.03…
- 2、 ok6410 uboot移植u-boot2010.03为蓝本,支持dm9000
- u-boot2010.03 Makefile分析
- u-boot2010.03 Makefile分析 .
- u-boot2010.03 Makefile分析
- u-boot2010.03 Makefile分析
- Mini2440 u-boot2010-3的移植
- u-boot2010.03 配置编译目标分析
- u-boot2010.03 第一阶段--start.S
- u-boot2010.03 配置编译目标分析 .
- u-boot2010.03 配置编译目标分析
- u-boot2010.03 配置编译目标分析
- u-boot2010.03 第一阶段--start.S
- U-boot2010代码框架
- OK6410的u-boot移植
- u-boot2010.06的移植(1)——准备移植
- u-boot2010.06的移植(4)——支持norflash
- u-boot2010.03 分析篇(二)-----lowlevel.init.S
- /opt/4.3.3/bin/../arm-none-linux…
- TQ2440成功移植linux-2.6.29…
- (*(volatile unsigned long *)详解
- 线程(一)——入门
- tiny64103G模块拨号问题
- 基于OK6410的u-boot2010.03…
- 嵌入式linux的tftp安装配置
- 更改嵌入式Linux中开机画面
- read与fread的区别
- SVM总结
- 手把手教你写基于C++ Winsock的图片下载的网络爬虫
- MySql数据库:数据查重、去重的实现
- java中位运算符与逻辑运算符
- JavaScript基础