一、移植环境
- 主 机:VMWare–Fedora 9
- 开发板:Mini2440–64MB Nand,Kernel:2.6.30.4
- 编译器:arm123.com.cn/linux/arm-linux-gcc-4.3.2.tgz” target=”_blank”>arm-linux-gcc-4.3.2.tgz
- u-boot:u-boot-2009.08.tar.bz2
二、移植过程
上接:u-boot-2009.08在2440上的移植详解(三)
在这一篇中,咱们首要让开发板对CS8900或许DM9000X网卡的支撑,然后再剖析完成u-boot怎样来引导Linux内核发动。由于测验u-boot引导内核咱们要用到网络下载功用。
7)u-boot对CS8900或许DM9000X网卡的支撑。
u-boot-2009.08版别现已对CS8900和DM9000X网卡有比较完善的代码支撑(代码在drivers/net/目录下),而且在S3C24XX系列中默许对CS8900网卡进行装备运用。仅仅在单个当地要依据开发板的详细网卡片选进行设置,就能够对S3C24XX系列中CS8900网卡的支撑运用。代码如下:
#gedit include/configs/my2440.h
|
#defineCONFIG_DRIVER_CS89001 #defineCS8900_BASE0x19000300//留意:对不同的开发板便是要修正这个片选地址参数,这个参数值就看开发板上网卡的片选引脚是接到ARM芯片存储控制器的哪个Bank上 #defineCS8900_BUS161
|
现在修正对咱们开发板上DM9000X网卡的支撑。
首要,咱们看看drivers/net/目录下有关DM9000的代码,发现dm9000x.h中对CONFIG_DRIVER_DM9000宏的依靠,dm9000x.c中对CONFIG_DM9000_BASE宏、DM9000_IO宏、DM9000_DATA等宏的依靠,所以咱们修正代码如下:
#gedit include/configs/my2440.h
|
屏蔽掉u-boot默许对CS8900网卡的支撑 //#define CONFIG_DRIVER_CS8900 1 //#define CS8900_BASE 0x19000300 //#define CS8900_BUS16 1
//增加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_ETHADDR08:00:3e:26:0a:5b//开发板MAC地址 #define CONFIG_NETMASK255.255.255.0 #define CONFIG_IPADDR 192.168.1.105//开发板IP地址
#define CONFIG_SERVERIP192.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
|
#if0//屏蔽掉dm9000_init函数中的这一部分,不然运用网卡的时分会报“could not establish link”的过错 i=0; while(!(phy_read(1)&0x20)){ udelay(1000); i++; if(i==10000){ printf(“could not establish link “); return0; } } #endif
|
然后从头编译u-boot,下载到Nand中从Nand发动,检查发动信息和环境变量并运用ping指令测验网卡,操作如下:
能够看到,发动信息晒干显现了Net:dm9000,printenv检查的环境变量也和include/configs/my2440.h中设置的共同。可是现在有个问题便是ping不能通过。
通过一段时间在网上查找,本来有许多人都碰到了这种状况。呈现问题的当地可能是DM9000网卡驱动中封闭网卡的当地,如是就试着修正代码如下:
#gedit drivers/net/dm9000x.c//屏蔽掉dm9000_halt函数中的内容
|
staticvoiddm9000_halt(structeth_device*netdev) { //DM9000_DBG(“%sn”, __func__);
// //phy_write(0, 0x8000); //DM9000_iow(DM9000_GPR, 0x01); //DM9000_iow(DM9000_IMR, 0x80); //DM9000_iow(DM9000_RCR, 0x00); }
|
成果,仅仅第一次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,能够找到下面这个界说:
#defineMACH_TYPE_SMDK2440 1008//针对2440的MACH_TYPE码的值界说为1008
|
那么咱们就修正u-boot的MACH_TYPE代码引证部分,确认u-boot的MACH_TYPE。如下:
#gedit board/samsung/my2440/my2440.c//修正board_init函数
|
//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,也能够找到下面这个界说:
smdk2440MACH_SMDK2440SMDK24401008
|
那么咱们就修正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, =0x30000100
msrcpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE
…….
|
别离从头编译u-boot和kernel。u-boot下载后,记得要saveenv;kernel用tftp下载到内存后运用go指令来测验引导内核,成果能够引导了,如下:
②、预备能被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-nlinux-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处
|
最终,咱们从头发动开发板,能够看到,内核被u-boot成功引导起来了,如图:
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/chanpin/264563.html