Chinaunix首页 | 论坛 | 博客
  • 博客访问: 150746
  • 博文数量: 18
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 222
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-24 22:24
个人简介

电子民工

文章存档

2011年(1)

2009年(16)

2008年(1)

我的朋友

分类: LINUX

2009-06-13 21:26:04

(一)使用工具及环境:

    使用开发板:友善之臂QQ2440V3

    linux版本: redhat9.0

    交叉工具链:arm-linux-gcc 3.4.1,在友善之臂网站可以下载编译好的直接使用

    u-boot版本:u-boot-1.1.6

    u-boot下载地址:

(二)u-boot分析:u-boot按功能可以分成两个阶段

    A.第一阶段:主要完成如下功能

      1)硬件初始化,包括关闭watchdog,关中断,设置cpu速度和时钟,ram初始化等;

      2)为加载u-boot第二阶段代码准备ram空间;

      3)复制u-boot第二阶段代码到ram空间;

      4)设置堆栈;

      5)跳转到第二阶段代码入口点;

    B.第二阶段:主要功能如下

      1)初始化本阶段所要使用的硬件设备,包括串口,网口,flash等;

      2)检测系统内存映射;

      3)将内存映相和根文件系统映相从flash上读到ram空间;

      4)为内核设置启动参数;

      5)调用内核;

(三)u-boot-1.1.6移植过程

    第一步:新建开发板相应目录及文件

         1)mkdir work

         2)cp u-boot-1.1.6.tar.gz /work/

         3)cd /work

         4)tar xzvf u-boot-1.1.6.tar.gz

         5)cd u-boot-1.1.6

         6)mkdir board/hb2440

         7)cp -r board/smdk2410 board/hb2440

         8)mv board/hb2440/smdk2410.c board/hb2440/hb2440.c

         9)cp include/configs/smdk2410.h include/configs/hb2440.h

         10)vi Makefile

            在顶层Makefile中添加两行代码如下:

            hb2440_config :        unconfig

               @$(MKCONFIG) $(@:_config) arm arm920t hb2440 NULL s3c24x0

         11)vi board/hb2440/Makefile

            COBJS    := smdk2410.o flash.o

            修改为

            COBJS    := hb2440.o flash.o

         12)此时可以先编译一下

            make hb2440_config

            显示Configuring for hb2440 board...

            make

    第二步:修改SDRAM配置

         1)由于s3c2440大部分配置和s3c2410一致,这里只需要修该一个参数

            vi board/hb2440/lowlevel_init.S

            修改#define REFCNT 1113为0x4f4,即设置HCLK为100MHZ

    第三步:设置时钟频率FCLK:HCLK:PCLK=1:4:8,UPLL为48MHZ

         1)修改board/hb2440/hb2440.c的board_init函数

         2)修改cpu/arm920t/s3c24x0/speed.c中的get_PCLK(),get_HCLK(),

           get_PCLK()等函数

         3)修改include/configs/hb2440.h中第111行修改"SMDK2410"为"HB2440"

         4)在include/s3c24x0.h第129行添加S3C24X0_REG32 CAMDIVN

         5)此时再进行编译(直接make即可),烧录进Nor flash重启系统,在串口终端

           就可以看到u-boot及各种基本命令了

         6)上面修改代码部分见附件里面的相应代码部分

    第四步:在上面启动u-boot后看到得flash信息不对,这一步添加对AM29LV800支持

         1)修改include/configs/hb2440.h中

           #define CONFIG_AMD_LV400 1

           #if 0

           #define CONFIG_AMD_LV800 1

           #endif

           修改为

           

           #if 0

           #define CONFIG_AMD_LV400 1

           #endif

           #define CONFIG_AMD_LV800 1

         2)此时的u-boot可以使用loadb,loady命令从串口下载文件了

    第五步:增加对串口xmodem协议命令,修改文件common/cmd_load.c

         1)修改代码如附件相应文件

    第六步:支持cs8900网卡芯片,可以再上面的基础上直接在串口终端里面设置环境参数

         1)直接修改环境参数如下

           HB2440# setenv ipaddr 192.168.1.17

           HB2440# setenv athaddr 08:00:3e:26:0a:5b

           HB2440# setenv serverip 192.168.1.100

           HB2440# saveenv

          2)或在代码里面修改相应的参数,代码在board/hb2440/lowlevel_init.S中

           修改

       #define CONFIG_ETHADDR 08:00:3e:26:0a:5b

            #define CONFIG_NETNASK 255.255.255.0

            #define CONFIG_IPADDR 192.168.1.17

            #define CONFIG_SERVERIP 192.168.1.100

           并增加对ping命令的支持

           在宏#define CONFIG_COMMANDS\

                                     (CONFIG_CMD_DFL |\

                                      ...

                                      CFG_CMD_CACHE  |\

                      增加            CFG_CMD_PING   |\

                                     ...

    第七步:支持nand flash读写操作及命令

         1)配置宏CFG_CMD_NAND,同上面Ping命令

         2)增加几个宏在include/configs/hb2440.h中

           #define CFG_NAND_DEVICE   0

           #define CFG_MAX_NAND_DEVICE 1

           #define NAND_MAX_CHIPS      1

         3)增加s3c2440的nand flash数据结构如下

           typedef struct {
                           S3C24X0_REG32   NFCONF;
                           S3C24X0_REG32 NFCONT;
                           S3C24X0_REG32   NFCMD;
                           S3C24X0_REG32   NFADDR;
                           S3C24X0_REG32   NFDATA;
                           S3C24X0_REG32 NFMECCD0;
                           S3C24X0_REG32 NFMECCD1;
                           S3C24X0_REG32 NFSECCD;
                           S3C24X0_REG32   NFSTAT;
                           S3C24X0_REG32 NFESTAT0;
                           S3C24X0_REG32 NFESTAT1;
                           S3C24X0_REG32 NFMECC0;
                           S3C24X0_REG32 NFMECC1;
                           S3C24X0_REG32 NFSECC;
                           S3C24X0_REG32 NFSBLK;
                           S3C24X0_REG32 NFEBLK;       
                         } /*__attribute__((__packed__))*/ S3C2440_NAND;

         4)在include/s3c2410.h中增加S3C2440_GetBase_NAND()函数如下

           static inline S3C2440_NAND * const S3C2440_GetBase_NAND(void)
           {
                return (S3C2440_NAND * const)S3C2410_NAND_BASE;
           }

         5)在cpu/arm920t/s3c24x0/下增加文件nand_flash.c文件,主要是实现

           board_nand_init()函数,参照内核中对NAND flash初始化编写,见附加

         6)修改cpu/arm920t/s3c24x0/Makefile文件

           添加刚加入的nand_flash.o如下

           COBJS = i2c.o interrupts.o serial.o speed.o \

                   usb_ohci.o nand_flash.o

         7)好了,此时可以进行编译了,但如果用arm-linux-gcc 3.4.1编译会遇到软浮

           点的问题,这个问题困扰了我好久,最后的解决办法如下

           修改cpu/arm920t/config.mk中

       PLATFORM_RELFAGS += -fno-strict-aliasing -fno-common -ffixed-r8 \

                 -msoft-float   

       为:

      PLATFORM_RELFAGS += -fno-strict-aliasing -fno-common -ffixed-r8 #\

                 -msoft-float 

      再次编译就可以了,此时可以对nand flash的命令操作了

    第八步:支持对nand flash的yaffs文件映相的烧写命令

         1)在common/cmd_nand.c中增加使用说明,当在串口中使用help nand时显示

           nand write/read.yaffs...说明

           修改见附件

         2)在include/nand.h中增加skipfristblk成员,因为前面用了,这里进行定义

           struct nand_write_options {
                     u_char *buffer;  
                     ulong length;  /* number of bytes to write */
                     ulong offset;  /* start address in NAND */
                     int quiet;  /* don't display progress messages */
                     int autoplace;  /* if true use auto oob layout */
                     int forcejffs2;  /* force jffs2 oob layout */
                     int forceyaffs;  /* force yaffs oob layout */
                     int noecc;  /* write without ecc */
                     int writeoob;  /* image contains oob data */
                     int pad;  /* pad to page size */
                     int blockalign;  /* 1|2|4 set multiple of

                                   eraseblocks
                                   * to align to */
                     int skipfristblk;
                     };

         3)修改drivers/nand/nand_util.c中第301行增加下面代码

           int skipfristblk = opts->skipfristblk;

           修改910行,注销掉该行,一面烧写时会报此警告

    第九步:修改默认参数,以便烧录内核和文件系统后可以自动运行

         1)在include/configs/hb2440.h增加linux3个启动相关的宏

         /*set para*/
         #define CONFIG_SETUP_MEMORY_TAGS 1
         #define CONFIG_CMDLINE_TAG  1
         #define CONFIG_BOOTARGS "noinitrd root=/dev/mtdblock 2 

          init=/linuxrc console=ttySAC0"

         2)自动启动命令

         #define CONFIG_BOOTDELAY 3
         #define CONFIG_BOOTCOMMAND "nboot 0x32000000 0 0; bootm

         0x32000000"

    第十步:以上步骤已经修改好了从Nor flash上启动的u-boot,并且可以操作nand flash,进行读写以下附件是上面所涉及到得代码文件

    第十一部:重新编译#make disclean

                    #make hb2440_config

                    #make all

             然后会在个根目录生成U-boot.bin

            

文件: u-boot-files.tar.gz
大小: 240KB
下载: 下载

  

阅读(3087) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~