在网上搜索了一会儿,很多人都遇到了这种情况。 出现问题的位置可能是DM9000网卡驱动程序关闭网卡的位置。 如果是,请尝试将代码更改为:
毕竟,只是第一次打不通,以后都打不通。 (据网友们说这很正常),如下图所示。
那么,现在只剩下一个问题。 就是使用tftp下载。 我们不在此讨论在Linux上安装和配置tftp服务器。 在网上多搜索一下吧。 但是,tftp下载时出现问题,总是出现传输不完整、重新传输的现象,循环如下图所示。
困惑了很久的tftp问题终于解决了。 心情真爽啊。 首先,分析了上图中的现象,表明下载过程中可以断断续续地下载。 但是,如果因为某种原因导致网络超时并重新下载,我认为这种可能性有两种。 1、u-boot下网络延迟设置; 2、我的物理网络结构。 首先,关于第一个,我们修改了net/net.c的网络延迟设置,但结果是不行的。 接下来,我们来试试第二种情况。 以前我的网络由路由器管理,主机和开发板也通过路由器连接,所以现在我用交叉网络直接连接主机和开发板。 试试看,果然很好啊。 哈哈。 至此,网络部分的移植总算完成了。
8 )实现u-boot引导Linux内核的启动。
上一节介绍了对Nor Flash和Nand Flash的u-boot启动支持,但本节介绍了u-boot如何启动Linux内核。
、机器代码的确定
u-boot和kernel通常都有名为MACH_TYPE的计算机代码,只有在匹配时才能引导内核。 如果不匹配,将显示与以下内容类似的mach错误消息:
首先,确定u-boot的MACH_TYPE。 在u-boot的include/asm-arm/mach-types.h文件中,为每个CPU定义了非常多的MACH_TYPE,您可以找到以下定义:
、准备可直接引导至u-boot的内核uImage
通常,要启动kernel,必须向u-boot提供参数信息,如ramdisk ram中的地址。 编译的u-boot在根目录下的tools目录中有一个名为mkimage的工具。 他可以在zImage中添加头。 也就是说,通常让我们编译的内核zImage添加标头信息部分。 添加标头的image通常称为uImage。 uImage被称为u-booge
以下是mkimage工具的使用方法。
用:大括号括起来是可选的
mkimage [-x ]-a arch-OOS-ttype-ccomp-aaddr-eep-nname-ddata _ file [ : data _ file . ] image
可选:
- a:set architecture to‘arch’//用于指定CPU类型。 例如,arm-o:setoperatingsystemto‘OS‘//用于指定操作系统,例如Linux-t:setimagetypeto‘//
- c :指定set compression type‘comp‘//压缩类型
- a :指定要将setloadaddressto‘addr‘(hex ) image加载到的位置
-e:setentrypointto‘EP‘(HEX ) /内核条目地址通常是image的加载地址0x40 (报头大小)
- n:set image name to‘name’//image头部结构中的命名
- d:useimagedatafrom‘datafile‘//无头信息的image文件名
- x :设定setx IP (execute in place )//执行位置
首先,将u-boot下的tools mkimage复制到主机上的/usr/local/勤奋香菇目录中,以便主机上的任何目录都可以使用该工具。 现在进入kernel生成目录(通常是arch/arm/boot目录),执行以下命令将在该目录下生成uImage.img镜像文件,并将其复制到tftp目录下这就是我们说的uImage。
mkimage-n‘Linux-2.6.30.4’- aarm-o Linux-t kernel-cnone-a0x 30008000-e0x 30008000-dzimageuimage.img
Nand Flash分区。 看看内核是如何在arch/arm/plat-s 3c 24 xx/common-smdk.c上进行分区的。
起始地址结束地址
uboot :0x00000000
0x00030000param : 0x00030000 0x00040000 //注意这个环境变量的地址范围要与上一节补充内容中配置的CONFIG_ENV_OFFSET一致kernel: 0x00050000 0x00200000
root : 0x00250000 0x03dac000
④、设置修改u-boot的启动参数,在u-boot命令行下输入:
//设置启动参数,意思是将nand中0x50000-0x00200000(和kernel分区一致)的内容读到内存0x31000000中,然后用bootm命令来执行
set bootcmd ‘nand read 0x31000000 0x50000 0x00200000;bootm 0x31000000‘
saveenv //保存设置
⑤、把uImage.img用tftp下载到内存中,然后再固化到Nand Flash中,操作和执行图如下:
tftp 0x30000000 uImage.img //将uImage.img下载到内存0x30000000处
nand erase 0x50000 0x200000 //擦除nand的0x50000-0x200000的内容
nand write 0x30000000 0x50000 0x200000 //将内存0x30000000处的内容写入到nand的0x50000处
最后,我们重新启动开发板,可以看到,内核被u-boot成功引导起来了,如图:
#define MACH_TYPE_SMDK2440 1008 //针对2440的MACH_TYPE码的值定义为1008
那么我们就修改u-boot的MACH_TYPE代码引用部分,确定u-boot的MACH_TYPE。如下:
#gedit board/samsung/my2440/my2440.c //修改board_init函数
/* arch number of SMDK2410-Board *///gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;改为:
gd->bd->bi_arch_number = MACH_TYPE_SMDK2440;
其次,确定kernel中的MACH_TYPE。在kernel的arch/arm/tools/mach-types文件中也针对不同的CPU定义了非常多的MACH_TYPE,也可以找到下面这个定义:
smdk2440 MACH_SMDK2440 SMDK2440 1008
那么我们就修改kernel的MACH_TYPE代码引用部分,确定kernel的MACH_TYPE。如下:
#geditarch/arm/mach-s3c2440/mach-smdk2440.c //修改文件最后面
//MACHINE_START(S3C2440, "SMDK2440")改为:
MACHINE_START(SMDK2440, "SMDK2440")
#gedit arch/arm/kernel/head.S //在ENTRY(stext)下添加如下代码(红色部分)
ENTRY(stext)
mov r0, #0
mov r1, #0x3f0 //上面的MACH_TYPE值1008换成十六进制就是0x3f0
ldr r2, =0x30000100msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE
.......
分别重新编译u-boot和kernel。u-boot下载后,记得要saveenv;kernel用tftp下载到内存后使用go命令来测试引导内核,结果可以引导了,如下: