您的位置 首页 应用

Uboot在S3C2440上的移植详解(四)

一、移植环境主机:VMWare–Fedora9开发板:Mini2440–64MBNand,Kernel:2.6.30.4编译器:arm-linux-gcc-4.3.2.tgzu-boot:u-bo

一、移植环境

  • 主 机:VMWare–Fedora 9

  • 开发板:Mini2440–64MB Nand,Kernel:2.6.30.4

  • 编译器:arm-linux-gcc-4.3.2.tgz

  • u-boot:u-boot-2009.08.tar.bz2

二、移植过程

在这一篇中,咱们首要让开发板对CS8900或许DM9000X网卡的支撑,然后再剖析完成u-boot怎样来引导Linux内核发动。由于测验u-boot引导内核咱们要用到网络下载功用。

7)u-boot对CS8900或许DM9000X网卡的支撑。
u-boot-2009.08版别现已对CS8900和DM9000X网卡有比较完善的代码支撑(代码在drivers/net/目录下),而且在S3C24XX系列中默许对CS8900网卡进行装备运用。仅仅在单个当地要依据开发板的详细网卡片选进行设置,就能够对S3C24XX系列中CS8900网卡的支撑运用。代码如下:

现在修正对咱们开发板上DM9000X网卡的支撑。
首要,咱们看看drivers/net/目录下有关DM9000的代码,发现dm9000x.h中对CONFIG_DRIVER_DM9000宏的依靠,dm9000x.c中对CONFIG_DM9000_BASE宏、DM9000_IO宏、DM9000_DATA等宏的依靠,所以咱们修正代码如下:

#gedit include/configs/my2440.h

/* * Hardware drivers */ 屏蔽掉u-boot默许对CS8900网卡的支撑
//#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 */

//增加u-boot对DM9000X网卡的支撑

#define CONFIG_DRIVER_DM9000 1
#define CONFIG_NET_MULTI 1
#define CONFIG_DM9000_NO_SROM 1
#define CONFIG_DM9000_BASE 0x20000300 //网卡片选地址
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE + 4) //网卡数据地址

//#define CONFIG_DM9000_USE_16BIT 1

留意:
u-boot-2009.08 能够自动检测DM9000网卡的位数,依据开发板原理图可知网卡的数据位为16位,而且网卡坐落CPU的BANK4上,所以只需在 board/samsung/my2440/lowlevel_init.S中设置 #define B4_BWSCON (DW16) 即可,不需求此处的 #define CONFIG_DM9000_USE_16BIT 1

//给u-boot加上ping指令,用来测验网络通不通

#define CONFIG_CMD_PING

//康复被注释掉的网卡MAC地址和修正你适宜的开发板IP地址

#define CONFIG_ETHADDR 08:00:3e:26:0a:5b //开发板MAC地址
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.1.105 //开发板IP地址

#define CONFIG_SERVERIP 192.168.1.103 //Linux主机IP地址

增加板载DM9000网卡初始化代码,如下:

#gedit board/samsung/my2440/my2440.c

#include
#include

#ifdef CONFIG_DRIVER_DM9000
int board_eth_init(bd_t *bis)
{
return dm9000_initialize(bis);
}
#endif

修正MD9000网卡驱动代码,如下:

#gedit drivers/net/dm9000x.c

#if 0 //屏蔽掉dm9000_init函数中的这一部分,不然运用网卡的时分会报“could not establish link”的过错
i = 0;
while(!(phy_read(1)& 0x20)){/* autonegation complete bit */
udelay(1000);
i++;
if(i == 10000){
printf(“could not establish link “);
return 0;
}
}
#endif

然后从头编译u-boot,下载到Nand中从Nand发动,检查发动信息和环境变量并运用ping指令测验网卡,操作如下:

能够看到,发动信息里边显现了Net:dm9000,printenv检查的环境变量也和include/configs/my2440.h中设置的共同。可是现在有个问题便是ping不能通过。
通过一段时间在网上查找,本来有许多人都碰到了这种状况。呈现问题的当地可能是DM9000网卡驱动中封闭网卡的当地,如是就试着修正代码如下:

成果,仅仅第一次ping不通,今后都是能够ping通的(据网友们说这是正常的),如下图:

好了,现在只剩下一个问题了,便是运用tftp进行下载。关于tftp服务器在Linux中的装置和装备,这儿我就不讲了,在网上搜一下许多的。但是,在tftp下载时又遇到了问题,总是呈现传送不完整又从头传送的现象,不断的循环,如下图:

困惑良久的tftp问题现在总算搞定啦,心境真是爽啊!!首要剖析上面图中的现象,在下载过程中时断时续就阐明是能够下载的,仅仅由于某种原因使网络呈现超时然后从头下载,那我想呈现这种状况的可能性有两种:1、u-boot中对网络的延时设置;2、便是我的物理网络结构。首要针对第一种,我修正了net/net.c中对网络延时的设置,成果仍是不可。接着就试试第二种状况,由于之前我的网络是通过路由器来办理的,主机和开发板也是通过路由器来衔接的,所以现在我就改用一条穿插网线直接把主机和开发板衔接起来,一试,公然能够啦,哈哈哈哈….。至此,网络部分的移植总算完成了。

8)完成u-boot引导Linux内核发动。
在前面几节中,咱们讲了u-boot对Nor Flash和Nand Flash的发动支撑,那现在咱们就再来讨论一下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增加一个header,也便是说使得一般咱们编译的内核zImage增加一个数据头信息部分,咱们把增加头后的image一般叫uImage,uImage是能够被u-boot直接引导的内核镜像。
mkimage东西的运用介绍如下:

运用: 中括号括起来的是可选的

mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file…] image

选项:
-A:set architecture to arch //用于指定CPU类型,比方ARM
-O:set operating system to os //用于指定操作系统,比方Linux
-T:set image type to type //用于指定image类型,比方Kernel
-C:set compression type comp //指定紧缩类型
-a:set load address to addr (hex) //指定image的载入地址
-e:set entry point to ep (hex) //内核的进口地址,一般为image的载入地址+0x40(信息头的巨细)
-n:set image name to name //image在头结构中的命名
-d:use image data from datafile //无头信息的image文件名
-x:set XIP (execute in place) //设置履行方位

先将u-boot下的tools中的mkimage复制到主机的/usr/local/bin目录下,这样就能够在主机的任何目录下运用该东西了。现在咱们进入kernel生成目录(一般是arch/arm/boot目录),然后履行如下指令,就会在该目录下生成一个uImage.img的镜像文件,把他复制到tftp目录下,这便是咱们所说的uImage。

mkimage -n linux-2.6.30.4-A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage uImage.img

③、Nand Flash的分区。咱们检查内核在arch/arm/plat-s3c24xx/common-smdk.c中的分区状况如下:

开始地址 完毕地址

uboot : 0x00000000 0x00030000
param : 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处

650) this.width=650;” src=”http://www.embeddedlinux.org.cn/uploads/allimg/130316/1042325.png” style=”padding:0px;margin:0px;border:0px;” />
最终,咱们从头发动开发板,能够看到,内核被u-boot成功引导起来了,如图:
650) this.width=650;” src=”http://www.embeddedlinux.org.cn/uploads/allimg/130316/1042326.png” style=”padding:0px;margin:0px;border:0px;” />

#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。如下:

#gedit arch/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, =0x30000100

msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE

…….

别离从头编译u-boot和kernel。u-boot下载后,记得要saveenv;kernel用tftp下载到内存后运用go指令来测验引导内核,成果能够引导了,如下:
650) this.width=650;” src=”http://www.embeddedlinux.org.cn/uploads/allimg/130316/1042327.png” style=”padding:0px;margin:0px;border:0px;” />

#gedit drivers/net/dm9000x.c //屏蔽掉dm9000_halt函数中的内容

/*
Stop the interface.
The interface is stopped when it is brought.
*/
staticvoid dm9000_halt(struct eth_device *netdev)
{
//DM9000_DBG(“%sn”, __func__);

///* RESET devie */
//phy_write(0, 0x8000); /* PHY RESET */
//DM9000_iow(DM9000_GPR, 0x01); /* Power-Down PHY */
//DM9000_iow(DM9000_IMR, 0x80); /* Disable all interrupt */
//DM9000_iow(DM9000_RCR, 0x00); /* Disable RX */
}

#gedit include/configs/my2440.h

/*
* Hardware drivers
*/
#define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */
#define CS8900_BASE 0x19000300 //留意:对不同的开发板便是要修正这个片选地址参数,这个参数值就看开发板上网卡的片选引脚是接到ARM芯片存储控制器的哪个Bank上
#define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/277475.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部