2、 ok6410 uboot移植u-boot2010.03为蓝本,支持dm9000
来源:互联网 发布:淘宝加盟被骗怎么报案 编辑:程序博客网 时间:2024/06/07 06:40
转载自 http://blog.sina.com.cn/s/blog_79abea8a01012ruj.html
http://blog.163.com/tianjunqiang666@126/blog/static/87259119201243034639891/
在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是一个新起点版本。
下载好u-boot-2010.03之后,解压缩,这里的一切我都是在win7系统下完成的。
1.进入u-boot-2010.03/board,把除samsung以外的文件夹删除。
2.进入u-boot-2010.03/cpu,把除arm1176以外的文件夹删除。
3.进入u-boot-2010.03\include,把asm-*(注意,仅仅是asm-开头的文件夹)中的,除了asm-arm和asm-generic以外的文件夹删除。
4.进入u-boot-2010.03\include\configs,只要留下smdk6400.h,其他的东西删除。
5.在u-boot-2010.03,把lib_*开头的文件夹,除了lib_arm和lib_generic以外的文件夹删除。
6.
现在把u-boot-2010.03放入到linux中,先配置:make
我们先来看下删减之后的u-boot-2010.03的构架:
这里交大家一个指令:tree,怎么用呢?我也忘了,没关系,man
呵呵,那就是使用tree
其中白色的是文件,蓝色的是目录,绿色的是可执行文件。
现在进入u-boot-2010.03\board\samsung,
进入u-boot-2010.03\include\asm-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.03\board\samsung\smdk6410,打开smdk6410.c,把#include
把u-boot-2010.03中所有的
这是第二版修改,我把下面这段代码做了适当修改:
#ifndef
mov r0,
mcr p15,
mcr p15,
mrc p15,
bic r0,
bic r0,
orr r0,
orr r0,
mcr p15,
#endif
在start.S中,bl
这段代码是判断到底是从nandflash中启动还是从ram中启动。
1.如果是从nandflash中启动,那么PC的值一定在8K之内。那么执行完bic
2.如果是从ram中启动,那么PC的值为0x
承接上面分析,如果没有完成copy,则接下来就是copy_from_nand。
那么在beq
#ifdef
#endif
如果完成则会跳过这段代码,直接进入after_copy。
OK,在u-boot-2010.03\cpu\arm1176下面新建一个nand_cp.c文件:
#include
#ifdef
#include
#include
#include
static
{
{
}
static
{
{
{
{
}
int
{
}
#endif
在u-boot-2010.03\cpu\arm1176的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.03\include\configs下面的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_spl\board除去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("%s\n",
//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
在common文件夹下面新建一个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内核。
- 2、 ok6410 uboot移植u-boot2010.03为蓝本,支持dm9000
- u-boot2010.03 移植篇(四)-----支持DM9000,实现tftp下载
- u-boot2010.03 移植篇(四)-----支持DM9000,实现tftp下载
- u-boot2010.03 移植篇(四)-----支持DM9000,实现tftp下载
- u-boot2010.03 移植篇(四)-----支持DM9000,实现tftp下载
- ok6410 u-boot-2012.04.01移植五支持DM9000
- u-boot2010.03 移植篇(三)-----进一步修改start.S,smdk6410.h,支持nand启动及配置DM9000网卡
- U-Boot2010.06移植(2440)-----移植网卡DM9000驱动
- 基于OK6410的u-boot2010.03…
- UBOOT-2010.06 移植 支持 DM9000 (七)
- 移植uboot到fl2440支持DM9000网卡
- 移植uboot第七步:支持DM9000
- OK6410 UBOOT移植(2)
- u-boot2010.03 移植篇(二)-----修改start.S,支持nand启动
- u-boot2010.03 移植篇(二)-----修改start.S,支持nand启动 .
- u-boot2010.03 移植篇(二)-----修改start.S,支持nand启动
- u-boot2010.03 移植篇(二)-----修改start.S,支持nand启动
- u-boot2010.03 移植篇(二)-----修改start.S,支持nand启动
- 学习笔记——jQuery自定义动画
- ajax 数据提交
- Ubuntu下解决Eclipse无法输入中文问题
- Ubifs文件系统和mkfs.ubifs以及ubinize工具的用法
- 合并排序
- 2、 ok6410 uboot移植u-boot2010.03为蓝本,支持dm9000
- 努力成为优秀的工程师
- HDOJ--1856--More is better【并查集】
- SQL*PLUS使用(一)
- lucene实战
- LINUX内核部件之阻塞wait queue and poll
- 汇编指令速查
- UART0串口编程系列(三)
- 沙盘 Sandboxie Service 服务不能启动 SBIE2331 33/1056