免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1299 | 回复: 0
打印 上一主题 下一主题

AT91RM9200移植 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-20 16:25 |只看该作者 |倒序浏览
最近忙于移植Linux2.6.23操作系统入AT91RM9200板上,感觉比较费力。使用的网上有用资源整理归纳保存。
AT91RM9200引导程序的建立(一)--------建立交叉编译工具链
本系列文章将详细的讲述AT91RM9200引导程序的建立过程,其中包括建立交叉编译工具链,gdb+gdbserver的编译安装使用,tftp,NFS的安装使用,超级终端或者minicom的使用,内核的编译升级,U-Boot的移植,Ramdisk、根文件系统的建立制作,busybox的编译、应用等。从而重现完整的开发过程。在写这个文档的过程中,本人参考了许多资料,在这里要感谢互联网,感谢所有社区,论坛里无私提供帮助的同行们。特别感谢一下鲁郁先生,是他让我在AT91RM9200上成功的移植了U-Boot1.1.4。
本人是从不懂一路走来,走的过程中将开发过程详细记述下来,从一个初学者的角度来写下这个系列的文章,以方便其他初学者能得到一些帮助,少走一些弯路。本
系列文章主要讲述开发过程及实际应用,并不能很好的讲述一些原理性的东西,所以您在看这篇文章的时候最好要参考其他资料,以形成一个完整的知识链。祝你旅
途愉快。开发环境软件环境
              宿主机:Redhat9.0 ,虚拟机vmware5.5.1
U-Boot 1.1.4,    busybox1.2.2.1
硬件环境
              CPU:AT91RM9200 ,180MHz(200MIPS)
              存储器:32M   SDRAM(MT48LC8M16A2)
                            64Mbits   Flash(SST39VF6401B)
              USB接口:USB-Host     USB-Device
           网络接口: 10/100M    DM9161E
              DBGU串行调试接口
            JTAG接口

移植过程虚拟机
关于虚拟机的安装使用,这里就不介绍了。使用很方便,网上也有大量的资料。大家可自行查阅。我们使用的是5.5.1版本,当然,你也可以使用最新的版本。
建立交叉编译工具链。
交叉编译工具链就是为了在一个平台体系结构下(如X86 PC机)能编译,链接,处理和调试另一个平台体系结构下(如ARM)的程序,使得编译生成的程序能够在另一平台下运行。
Linux使用的工具链软件是:Binutils,gcc,glibc,gdb。
其中binutils是二进制程序处理工具。gcc是编译器。glibc是应用程序编程的函数库文件软件包。gdb是调试工具。
对交叉编译工具链的编译是很麻烦和琐碎的一件事,如果自己一个一个编译,很可能会遇到各种各样的麻烦。幸好有人做了一套脚本程序,可以很方便的生成你所需要的交叉编译工具链。我们使用的脚本就是crosstool,关于详细内容可以访问
http://kegel.com/crosstool/
,可以从该网站下载到它的脚本,补丁和文档。
本文以i686平台,虚拟机vmware5.5.1,redhat9.0来建立arm交叉编译工具链。
我们采用crosstool0.42来作为我们编译交叉编译工具链的脚本。详细的用法说明请阅读网站上的文档crosstool-how to 。
[zzl@localhost] tar -xzvf crosstool-0.42.tar.gz
[zzl@localhost]cd crosstool-0.42
我们可以看到目录下有很多.sh脚本和.dat配置文件。每一个支持的CPU都有它所相应的脚本,如我们选用demo-arm-softfloat.sh 就是建立目标为支持软浮点的arm的交叉编译工具链。其中需要我们记住的三个重要的变量:
             TARBALLS_DIR=$HOME/downloads   
RESULT_TOP=/opt/crosstool
GCC_LANGUAGES="c,c++"
第一行指明我们放置源代码软件包的目录,我的主目录是/home/zzl。第二行指明我们生成的交叉编译工具链在/opt/crosstool下。第三行表示,我们的交叉编译工具链支持c,c++语言。
我们需要如下压缩包:gcc-3.4.1.tar.gz                glibc-2.3.3.tar.gz         linux-2.6.17binutils-2.15.tar.gz            glibc-linuxthreads-2.3.3.tar.gz所以,你的首要任务是下载这些源代码软件包,并将它们放在/home/zzl/downloads下面,保证这些包的所有者为当前用户而不是根用户。
由于我们以后的内核版本为2.6.17,所以我们还需要下载linux2.6.17的内核包,并放在/home/zzl/downloads/下。
我们选择的配置是:demo-arm-softfloat.sh,其内容具体如下:
                #!/bin/sh
set -ex
TARBALLS_DIR=$HOME/downloads
RESULT_TOP=/opt/crosstool
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++"
export GCC_LANGUAGES

# Really, you should do the mkdir before running this,
# and chown /opt/crosstool to yourself so you don't need to run as root.
mkdir -p $RESULT_TOP

# Build the toolchain.  Takes a couple hours and a couple gigabytes.

#eval `cat arm-softfloat.dat gcc-3.3.3-glibc-2.3.2.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.4.0-glibc-2.3.2.dat` sh all.sh --notest
eval `cat arm-softfloat.dat gcc-3.4.1-glibc-2.3.3.dat` sh all.sh --notest
#eval `cat arm-softfloat.dat gcc-3.4.1-glibc-20040827.dat`  sh all.sh --notest

echo Done.
从这一行eval `cat arm-softfloat.dat gcc-3.4.1-glibc-2.3.3.dat` sh all.sh --notest
可以看出,我们的gcc版本采用3.4.1,glibc版本采用2.3.3。
       我们再来看gcc-3.4.1-glibc-2.3.3.dat这个文件
BINUTILS_DIR=binutils-2.15
GCC_DIR=gcc-3.4.1
GLIBC_DIR=glibc-2.3.3
LINUX_DIR=linux-2.6.8
GLIBCTHREADS_FILENAME=glibc-linuxthreads-2.3.3
由于我们采用的是Linux-2.6.17的内核包,所以这里要将linux-2.6.8改成linux-2.6.17。否则,脚本执行解压缩时,找不到linux源代码包。
建立我们的目标生成目录
[zzl@localhost]sudo mkdir /opt/crosstool
[zzl@localhost]sudo chown zzl /opt/crosstool

执行我们的配置文件arm-softfloat.sh
[zzl@localhost]sh demo-arm-softfloat.sh
    这里要注意运行该配置文件不能以root来运行,crosstool-0.42, /opt/crosstool为非root用户所有。
如果一切顺利的话,经过一段时间的等待,得到一个新目录:(如果不顺利且始终找不到错误原因的话,我建议你重新安装redhat9.0的操作系统,然后按照先前步骤进行。:))
/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu
交叉编译工具就在该目录的bin/下
[zzl@localhost]ls –l /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/bin
总用量 29184
-rwxr-xr-x    1 zzl      zzl       1806212 12月 29 09:02 arm-softfloat-linux-gnu-addr2line
-rwxr-xr-x    2 zzl      zzl       1864030 12月 29 09:02 arm-softfloat-linux-gnu-ar
-rwxr-xr-x    2 zzl      zzl       3248953 12月 29 09:02 arm-softfloat-linux-gnu-as
-rwxr-xr-x    2 zzl      zzl        287996 12月 29 09:43 arm-softfloat-linux-gnu-c++
-rwxr-xr-x    1 zzl      zzl       1761855 12月 29 09:02 arm-softfloat-linux-gnu-c++filt
-rwxr-xr-x    1 zzl      zzl        287111 12月 29 09:43 arm-softfloat-linux-gnu-cpp
-rwxr-xr-x    2 zzl      zzl        287996 12月 29 09:43 arm-softfloat-linux-gnu-g++
-rwxr-xr-x    2 zzl      zzl        285852 12月 29 09:43 arm-softfloat-linux-gnu-gcc
-rwxr-xr-x    2 zzl      zzl        285852 12月 29 09:43 arm-softfloat-linux-gnu-gcc-3.4.1
-rwxr-xr-x    1 zzl      zzl         16241 12月 29 09:43 arm-softfloat-linux-gnu-gccbug
-rwxr-xr-x    1 zzl      zzl        103366 12月 29 09:43 arm-softfloat-linux-gnu-gcov
-rwxr-xr-x    1 zzl      zzl       2286490 12月 29 09:02 arm-softfloat-linux-gnu-gprof
-rwxr-xr-x    2 zzl      zzl       2542659 12月 29 09:02 arm-softfloat-linux-gnu-ld
-rwxr-xr-x    2 zzl      zzl       1840205 12月 29 09:02 arm-softfloat-linux-gnu-nm
-rwxr-xr-x    1 zzl      zzl       2344807 12月 29 09:02 arm-softfloat-linux-gnu-objcopy
-rwxr-xr-x    1 zzl      zzl       2487727 12月 29 09:01 arm-softfloat-linux-gnu-objdump
-rwxr-xr-x    2 zzl      zzl       1864029 12月 29 09:02 arm-softfloat-linux-gnu-ranlib
-rwxr-xr-x    1 zzl      zzl        384396 12月 29 09:02 arm-softfloat-linux-gnu-readelf
-rwxr-xr-x    1 zzl      zzl       1712993 12月 29 09:01 arm-softfloat-linux-gnu-size
-rwxr-xr-x    1 zzl      zzl       1689683 12月 29 09:02 arm-softfloat-linux-gnu-strings
-rwxr-xr-x    2 zzl      zzl       2344806 12月 29 09:02 arm-softfloat-linux-gnu-strip
-rwxrwxr-x    1 zzl      zzl         19084 12月 29 09:43 fix-embedded-paths
我们可以看出,交叉编译的所有工具都在这里。
将这个路径加进PATH变量中:
[zzl@localhost]export PATH=$PATH :/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/bin
如果每次都要输入上面的shell命令,的确是比较烦人的事情。我们可以在linux启动脚本中添加该语句。从而避免每次开机后重新输入。我是在启动脚本/etc/profile中添加了环境变量。
找到这一行export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE  INPUTRC
在其上面一行添加:
PATH=$PATH :/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/bin

今后我们编译程序的时候,就用arm-softfloat-linux-gnu-gcc 来编译我们的程序。
当然,应用程序的调试是开发过程中必不可少的环节之一。Linux下的GNU的调试器即是GDB。所以我们有了这个交叉编译工具链之后,可以用它来编译gdb和gdbserver。如果你暂时不需要GDB的话,也可以先略过这一步。
GDB的编译安装
目前比较新的是版本是GDB6.6。其官方网站是
http://www.gnu.org/software/gdb/

下载gdb-6.6.tar.gz源代码包到/usr/src下。
[root@localhost]tar –zxvf gdb-6.6.tar.gz
[root@localhost]cd gdb-6.6
配置很简单,只需要指定目标板体系结构和安装路径即可。
[root@localhost]mkdir /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/gdb6.6
[root@localhost]./configure  --target=arm-softfloat-linux-gnu  --prefix=/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/gdb6.6 -v
[root@localhost]make
[root@localhost]make install
顺利的话,则在gdb6.6下生成新的目录,其中gdb工具就在bin目录下。
[root@localhost]ls –l /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/gdb6.6
/bin
总用量 30476
-rwxr-xr-x    1 root     root     14335251 12月 29 15:53 arm-softfloat-linux-gnu-gdb
-rwxr-xr-x    1 root     root     14335296 12月 29 15:53 arm-softfloat-linux-gnu-gdbtui
-rwxr-xr-x    1 root     root      2489663 12月 29 15:52 arm-softfloat-linux-gnu-run
同样在环境变量中添加gdb的路径
[root@localhost]export PATH=$PATH :/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/gdb6.6/bin
今后调试程序的时候,用arm-softfloat-linux-gnu-gdb 来调试。
gdbserver的编译
[root@localhost]cd gdb-6.6
[root@localhost]cd gdb/gdbserver
[root@localhost] ./configure --target=arm-softfloat-linux-gnu –-host=arm-softfloat-linux-gnu
[root@localhost] make CC=/opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-softfloat-linux-gnu/bin/arm-softfloat-linux-gnu-gcc
如果不出错的话,将在当前目录下生成两个可执行文件:gdbserver和gdbreplay。以后就可以用gdb+gdbserver调试我们开发板上的程序了。至此,我们的交叉编译工具链已经基本建立。可以用来作为我们bootloader的编译环境了。

GDB+GDBServer的使用
在目标系统上启动gdbserver,其实就是在超级终端下或者minicom下启动gdbserver。这里将gdbserver放在宿主机的NFS设置的共享目录下/home/zzl,该目录挂载在目标板/work下。宿主机的ip为192.168.1.1,目标板的ip为192.168.1.33
超级终端或者minicom下
[root@localhost]cd /work
[root@localhost]./gdbserver 192.168.1.1:1234 hello
出现提示:
Process /work/hello created: pid=69
Listening on port 1234
这时切换到宿主机的控制台,运行
[root@localhost] arm-softfloat-linux-gnu-gdb hello
(gdb) target remote 192.168.2.33:1234
出现提示:
Remote debugging using 192.168.1.33:1234
[New thread 80]
[Switching to thread 80]
0x40002a90 in ??()
同时在minicom下提示:
Remote debugging from host 192.168.2.100
(gdb)
连接成功,这时候就可以输入各种gdb命令如list、continue、next、step、break等进行程序调试了。

对于GDBServer出现的问题
1.  GDBServer调试时出现packet error 问题。
主要是虚拟机与目标机的网络连接要经过windows,数据包容易丢失。换到Linux系统下则恢复正常。
AT91RM9200引导程序的建立(二)--------TFTP和NFS服务的设置
TFTP服务器设置TFTP协议是简单的文件传输协议,适合目标板Bootloader的使用。TFTP文件传输基于UDP。我们通过TFTP来传输目标板启动需要的内核映象文件zImage和ramdisk首先必须安装tftp软件包,在RedHat Linux安装CD3中找到tftp文件包:tftp-0.32-4.i386.rpm,[root@localhost] rpm –ihv tftp-server-0.32-4.i386.rpm系统自动安装好tftp服务器;进入目录/etc/xinetd.d [root@localhost]cd /etc/xinetd.d [root@localhost]vi tftp –注:只有在安装了tftp服务后,才会出现tftp文件
  修改其中disable和server_args项,其余可保持不变。以下为一个完整的tftp文件:
  Service tftp
  {
  socket_type = dgram
  protocol = udp
  wait = yes
  user = root
  server =/usr/sbin/in.tftpd
  server_args = -s /tftpboot -- 根据需要设置tftp服务默认目录,缺省的指定输出文件目录是/tftpboot,文件必须放在该目录下才能被输出。
  disable = no -- 默认为yes,应修改成noper_source = 11
  cps = 100 2
  flags = IPv4
  }     NFS服务器NFS服务就是将宿主机的一个目录通过网络可以被挂载到其他计算机上,并且作为其他计算机的一个目录。我们通过NFS可以很方便的将修改的文件通过NFS传输到目标板上。1.进行网络设置,将eth0的网络地址指定为192.168.1.1,掩码255.255.255.0,网关不需要。设置完之后要重启网络[root@localhost]/etc/init.d/network restart  2.关闭防火墙,选择系统设置->安全级别,将安全级别改为“无防火墙”,如下图所示:

3.去掉iptables 服务选择系统设置->服务器设置->服务,在弹出的界面上将optables前的“√”去掉,如下图:

4.确认是否安装了NFS服务。从redhat开始菜单查看系统设置->服务器设置下是否有NFS服务器。如果没有,则插入Linux安装盘重新添加该软件包。如果安装好了NFS服务,我们可以通过配置文件/etc/exports来允许目标板挂载你的目录。我的设置文件/etc/exports的内容是这样的/home/zzl    *(rw,no_root_squash)该句意思是:任何 IP地址都能挂载/home/zzl目录,并且如果是以root身份登录的话,那么他对该目录的权限也是root。配置好文件后,就可以启动NFS服务了。[root@localhost]/etc/init.d/nfs start启动后可以通过showmount 命令来查看开放的目录。[root@localhost]showmount –e localhost测试NFS是否设置成功,可将主机上的目录挂载到另一个目录下看看。如[root@localhost]mount 192.168.1.1:/home/zzl /mnt然后查看/mnt下是否显示/home/zzl下的文件。如果有的话,则NFS服务基本设置成功。今后可以在超级终端或者minicom下通过NFS挂载宿主机目录。如[root@localhost]mount –t vfat –o nolock 192.168.1.1:/home/zzl /work如果发现NFS在Linux系统启动后没有自动启动,则在/etc/rc.d/rc.local文件中添加一行/etc/init.d/nfs restart
AT91RM9200引导程序的建立(三)--------U-Boot1.1.4在AT91RM9200上的移植

BootLoader概述       Boot Loader就是在操作系统内核运行之前运行的一段小程序。通过这段BootLoader,我们来初始化硬件设备,为硬件设备准备地址空间,中断号等,建立内存空间的映射,从而将系统的软硬件环境带到一个合适的状态。AT91RM9200处理器启动有两种情况,一种是从外部启动,如Flash,EEPROM,DATAFLASH等;一种是从内部的BOOTROM固化代码引导。我们的ARM板是直接通过JTAG接口从主机下载到目标板的flash中直接启动。       系统上电后,我们的CPU从0x00000000取它的第一条指令,而我们的flash就是被映射到这个地址上。CPU就首先执行我们烧在flash上的BootLoader 程序,通过它来引导Linux系统。U-Boot是一个通用的Bootloader,可以方便地移植到其他硬件平台。现在已经成为ARM平台事实上的标准。U-Boot的源码包可以从sourceforge网站下载。我们使用U-Boot1.1.4来作为我们移植的Bootloader。 U-Boot1.1.4移植u-boot修改。由于我们的板子和atmel的DK板不同,所以针对我们的硬件,要重新修改u-boot代码,特别是flash驱动部分。 1)修改board/at91rm9200dk/config.mkTEXT_BASE=0x21f00000 将U-Boot载入32MSDRAM的高端部分,即最高端1M的空间留给U-Boot代码。 2)修改include/configs/at91rm9200dk.h 修改Flash和SDRAM的大小:    #define PHYS_SDRAM_SIZE 0x2000000 /* 32 megs */    #define PHYS_FLASH_SIZE 0x200000 /* 2 megs main flash */同时定义如下环境变量:#define CONFIG_DEFAULT_ENVIRONMENT
#define CONFIG_BOARDNAME "AT91RM9200DK"#define CONFIG_ETHADDR "00:11:22:33:44:55"#define CONFIG_IPADDR "192.168.1.100"#define CONFIG_SERVERIP "192.168.1.1"//#define CONFIG_GATEWAYIP "192.168.18.1"#define CONFIG_BOOTCOMMAND "tftp 0x20008000 zImage; tftp 0x20410000 ramdisk;go 0x20008000"#define CONFIG_DEFAULT_KERNEL "2.6.17"从上面可以看出,我们板子的IP地址是192.168.1.100,而我们的宿主机IP地址为192.168.1.1 ,我们的网卡Mac为:00:11:22:33:44:55。3)修改flash驱动borad/at91rm9200dk/flash.c这个文件修改的部分比较的多。1.     首先是OrgDef的定义,加上目前的flash。    OrgDef OrgSSTvF6401B[]={                                     {2048,4*1024},   /*2048*64KBytes sectors*/};修改函数flash_identification(flash_info_t * info),显示正确的信息。
void flash_identification (flash_info_t * info){       volatile u16 manuf_code, device_code, add_device_code;        MEM_FLASH_ADDR1 = FLASH_CODE1;       MEM_FLASH_ADDR2 = FLASH_CODE2;       MEM_FLASH_ADDR1 = ID_IN_CODE;        manuf_code = *(volatile u16 *) CFG_FLASH_BASE;       device_code = *(volatile u16 *) (CFG_FLASH_BASE + 2);       add_device_code = *(volatile u16 *) (CFG_FLASH_BASE + (3         MEM_FLASH_ADDR1 = FLASH_CODE1;       MEM_FLASH_ADDR2 = FLASH_CODE2;       MEM_FLASH_ADDR1 = ID_OUT_CODE;        /* Vendor type */       /*       if(info->flash_id = ATM_MANUFACT & FLASH_VENDMASK)       {                 printf ("Atmel: ");       }       */       if(info->flash_id=SST_MANUFACT & FLASH_VENDMASK)    //zzl061206       {                 printf("SST:");       }/*atmel identify*/       if ((device_code & FLASH_TYPEMASK) == (ATM_ID_BV1614 & FLASH_TYPEMASK)) {                  if ((add_device_code & FLASH_TYPEMASK) ==                            (ATM_ID_BV1614A & FLASH_TYPEMASK)) {                            info->flash_id |= ATM_ID_BV1614A & FLASH_TYPEMASK;                            printf ("AT49BV1614A (16Mbit)\n");                 } else {                                 /* AT49BV1614 Flash */                            info->flash_id |= ATM_ID_BV1614 & FLASH_TYPEMASK;                            printf ("AT49BV1614 (16Mbit)\n");                 }        } else if ((device_code & FLASH_TYPEMASK) == (ATM_ID_BV6416 & FLASH_TYPEMASK)) {                    info->flash_id |= ATM_ID_BV6416 & FLASH_TYPEMASK;                 printf ("AT49BV6416 (64Mbit)\n");       }       /*sst identify*/      else if((device_code & FLASH_TYPEMASK) == (SST_ID_xF6401B & FLASH_TYPEMASK)) //zzl061206      {               info->flash_id |= SST_ID_xF6401B & FLASH_TYPEMASK;               printf("vF6401B(64Mbit)\n");      }} 2. 修改初始化Flash函数ulong flash_init (void)ulong flash_init (void){       int i, j, k;       unsigned int flash_nb_blocks, sector;       unsigned int start_address;       OrgDef *pOrgDef;        ulong size = 0;        for (i = 0; i                  ulong flashbase = 0;                  flash_identification (&flash_info);                  if ((flash_info.flash_id & FLASH_TYPEMASK) ==                            (ATM_ID_BV1614 & FLASH_TYPEMASK)) {                             pOrgDef = OrgAT49BV16x4;                            flash_nb_blocks = sizeof (OrgAT49BV16x4) / sizeof (OrgDef);                 } else if ((flash_info.flash_id & FLASH_TYPEMASK) ==                            (ATM_ID_BV1614A & FLASH_TYPEMASK)){      /* AT49BV1614A Flash */                             pOrgDef = OrgAT49BV16x4A;                            flash_nb_blocks = sizeof (OrgAT49BV16x4A) / sizeof (OrgDef);                 } else if ((flash_info.flash_id & FLASH_TYPEMASK) ==                            (ATM_ID_BV6416 & FLASH_TYPEMASK)){       /* AT49BV6416 Flash */                             pOrgDef = OrgAT49BV6416;                            flash_nb_blocks = sizeof (OrgAT49BV6416) / sizeof (OrgDef);                 }                 /*zzl*/               else if((flash_info.flash_id & FLASH_TYPEMASK)==                        (SST_ID_xF6401B & FLASH_TYPEMASK))               {                        pOrgDef=OrgSSTvF6401B;                        flash_nb_blocks = sizeof (OrgSSTvF6401B) / sizeof (OrgDef);               }                 else {                            flash_nb_blocks = 0;                            pOrgDef = OrgAT49BV16x4;                 }                  flash_info.sector_count = flash_number_sector(pOrgDef, flash_nb_blocks);                 memset (flash_info.protect, 0, flash_info.sector_count);                  if (i == 0)                            flashbase = PHYS_FLASH_1;                 else                            panic ("configured too many flash banks!\n");                  sector = 0;                 start_address = flashbase;                 flash_info.size = 0;                  for (j = 0; j                             for (k = 0; k                                       flash_info.start[sector++] = start_address;                                      start_address += pOrgDef[j].sector_size;                                      flash_info.size += pOrgDef[j].sector_size;                            }                 }                  size += flash_info.size;                  if ((flash_info.flash_id & FLASH_TYPEMASK) ==                            (ATM_ID_BV6416 & FLASH_TYPEMASK)){       /* AT49BV6416 Flash */   /*zzl*/                             /* Unlock all sectors at reset */                            for (j=0; j                                      flash_unlock_sector(&flash_info, j);                            }                 }       }        /* Protect binary boot image */       flash_protect (FLAG_PROTECT_SET,                        CFG_FLASH_BASE,                        CFG_FLASH_BASE + CFG_BOOT_SIZE - 1, &flash_info[0]);        /* Protect environment variables */       flash_protect (FLAG_PROTECT_SET,                        CFG_ENV_ADDR,                        CFG_ENV_ADDR + CFG_ENV_SIZE - 1, &flash_info[0]);        /* Protect U-Boot gzipped image */       flash_protect (FLAG_PROTECT_SET,                        CFG_U_BOOT_BASE,                        CFG_U_BOOT_BASE + CFG_U_BOOT_SIZE - 1, &flash_info[0]);        return size; 3.修改 函数flash_erase(),将检测flash类型注释掉,因为先前已经检测过       /* first look for protection bits *//*zzl 20061206       if (info->flash_id == FLASH_UNKNOWN)                 return ERR_UNKNOWN_FLASH_TYPE;        if ((s_first  s_last)) {                 return ERR_INVAL;       }        if ((info->flash_id & FLASH_VENDMASK) !=                 (ATM_MANUFACT & FLASH_VENDMASK)) {                 return ERR_UNKNOWN_FLASH_VENDOR;       }*/但是这里出现了一个问题,编译后IP地址为0.192.168.1,serverip也是0.192.168.1。修改net/net.c中获得IP地址的函数。IPaddr_t getenv_IPaddr (char *var){       /*zzl*/       char tmp_str[64];       strcpy(tmp_str,getenv(var));if(isxdigit(*tmp_str))     /*测试环境变量字符是否是16进制,如果是,从第一个字符开始取4个字节,如果不是,则从第二个字符开始取4个字节。*/                 return (string_to_ip(tmp_str));       else                 return(string_to_ip(tmp_str+1));       /*old code       return (string_to_ip(getenv(var)));       */}重新编译#make distclean#make at91rm9200dk_config#make all编
译成功后得到u-boot.bin的二进制文件,即为需要的可执行映象文件,将其用仿真器通过JTAG烧进flash中。板子重新上电,U-Boot启动
成功。(注:U-Boot1.1.4已经不需要将其压缩为u-boot.gz。直接烧入flash的0地址后,便能启动,进入u-boot下。)
虽说内容残缺不全,但是还是对建立一个基本的启动平台还是很有帮助的。
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/54524/showart_426800.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP