uboot在s3c2440上的移植(4)

一、移植环境

  • 主  机: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 <net.h>
#include <netdev.h>

#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处

最后,我们重新启动开发板,可以看到,内核被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。如下:


#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命令来测试引导内核,结果可以引导了,如下:


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


/*
  Stop the interface.
  The interface is stopped when it is brought.
*/
static void 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 */

时间: 2024-10-22 03:05:32

uboot在s3c2440上的移植(4)的相关文章

uboot在s3c2440上的移植(6)

一.移植环境 主  机: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 二.移植步骤 10)u-boot利用tftp服务下载内核和利用nfs服务挂载nfs文件系统. 知识点: tftp服务的安装与配置及测试: nfs服务的安装与配置及测试: u-boot到kernel的参数传递(重点). 我们知道使用tftp下载内核

uboot在s3c2440上的移植(5)

一.移植环境 主  机: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 二.移植步骤 9)实现u-boot对yaffs/yaffs2文件系统下载的支持. 注意:此篇对Nand的操作是基于MTD架构方式,在“u-boot-2009.08在2440上的移植详解(三)”中讲到过. 通常一个Nnad Flash存储设备由若干

uboot在s3c2440上的移植(3)

一.移植环境 主  机: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 二.移植步骤 5)准备进入u-boot的第二阶段(在u-boot中添加对我们开发板上Nand Flash的支持).目前u-boot中还没有对2440上Nand Flash的支持,也就是说要想u-boot从Nand Flash上启动得自己去实现了.

uboot在s3c2440上的移植(1)

一.移植环境 主  机: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 二.移植步骤 本次移植的功能特点包括: 支持Nand Flash读写 支持从Nor/Nand Flash启动 支持CS8900或者DM9000网卡 支持Yaffs文件系统 支持USB下载(还未实现) 1. 了解u-boot主要的目录结构和启动流程

U-boot在S3C2440上的移植详解(一)

http://www.embeddedlinux.org.cn/html/jishuzixun/201303/16-2499.html 一.移植环境 主  机: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 二.移植步骤 本次移植的功能特点包括: 支持Nand Flash读写 支持从Nor/Nand Flash启动

uboot在s3c2440上的移植(2)

一.移植环境 主  机: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 二.移植步骤 4)准备进入u-boot的第二阶段(在u-boot中添加对我们开发板上Nor Flash的支持).通常,在嵌入式bootloader中,有两种方式来引导启动内核:从Nor Flash启动和从Nand Flash启动.u-boot中默

SPI在linux3.14.78 FS_S5PC100(Cortex A8)和S3C2440上驱动移植(deep dive)

由于工作的原因,对SPI的理解最为深刻,也和SPI最有感情了,之前工作都是基于OSEK操作系统上进行实现,也在US/OS3上实现过SPI驱动的实现和测试,但是都是基于基本的寄存器操作,没有一个系统软件架构的思想,感觉linux SPI驱动很强大,水很深,废话少说,SPI总线上有两类设备:一类是主机端,通常作为SOC系统的一个子模块出现,比如很多嵌入式MPU中都常常包含SPI模块.一类是从机被控端,例如一些SPI接口的Flash.传感器等等.主机端是SPI总线的控制者,通过使用SPI协议主动发起S

关于uboot在jz2440上的移植问题

由于书上的介绍与板子上不大一样,遇到很多问题,将查找到的资料综合一下,以便使用! 1)开发环境 1.开发板:勤研2440, nor flash:没移植改变nor flash前,显示Amd29LV400BB 512K,但实际是: Bank # 1: MXIC MX29LV160B FLASH (16 x 16)  Size: 2 MB in 35 Sectors  AMD Standard command set, Manufacturer ID: 0xC2, Device ID: 0x2249 

mini2440移植uboot 2011.03(上)

参考博文: <u-boot-2011.03在mini2440/micro2440上的移植> 本来我想移植最新版的uboot,但是移植却不太成功,所以先模仿他人的例子重新执行一遍,对uboot更熟悉后再开始新版本的移植. 操作系统: debian 7.4 uboot:   u-boot-2011.03(下载地址) 交叉编译器:arm-linux-gcc 4.4.3(下载地址) 执行过程如下: 移植(一)基本配置: 在boards.cfg下添加一行: mini2440 arm arm920t -