天嵌 ARM开发社区

 找回密码
 注册
查看: 3086|回复: 1

移植uboot2009.11到TQ2440时 saveenv出现错误 求助

[复制链接]
zhu04303661 发表于 2010-1-26 11:32:45 | 显示全部楼层 |阅读模式
我的环境是:TQ2440   U-Boot 2009.11      arm-linux-gcc-4.3.3  Nor Flash的型号是EN29LV160AB
我先移植过程是这样的:
首先复制board/samsung/smdk2410为board/samsung/arm2440
复制board/samsung/arm2440/smdk2410.c为board/samsung/arm2440/arm2440.c
还要记得修改自己的开发板arm2440目录下的Makefile文件,不然编译时会出错:
vim Makefile
COBJS    := arm2440.o flash.o
拷贝include/configs/smdk2410.h到arm2440.h,
修改Makefile文件在其中添加:
arm2440_config  :       unconfig
        @$(MKCONFIG) $(@:_config=) arm arm920t arm2440 NULL s3c24x0
然后就可以运行:
make arm2440_config
能够编译成功说明当前配置成功
修改include/configs/arm2440.h
/*
c *  网卡的配置信息
*/
#define CONFIG_DRIVER_DM9000    1
#define CONFIG_DM9000_BASE    0x20000300
#define DM9000_IO   CONFIG_DM9000_BASE
#define DM9000_DATA      (CONFIG_DM9000_BASE + 4)
#define CONFIG_DM9000_USE_16BIT
并删除原来的网卡配置
运行:
make arm2440_config
出现了错误net/net.c:252: undefined reference to `eth_send'..........
这是因为在做网卡配置时有个宏定义被我屏蔽了需要改回来:
/*
* Hardware drivers
*/
#define CONFIG_NET_MULTI
//#define CONFIG_CS8900         /* we have a CS8900 on-board */
//#define CONFIG_CS8900_BASE    0x19000300
//#define CONFIG_CS8900_BUS16   /* the Linux driver does accesses as shorts */
然后就能够编译成功说明当前配置成功
并指定norflash
#define CONFIG_AMD_LV800  1 /* uncomment this if you have a LV800 flash */
#define CONFIG_SYS_MAX_FLASH_BANKS      1       /* max number of memory banks */
#ifdef CONFIG_AMD_LV800
#define PHYS_FLASH_SIZE         0x00200000 /* 1MB */
#define CONFIG_SYS_MAX_FLASH_SECT       (19)    /* max number of sectors on one chip */
#define CONFIG_ENV_ADDR         (CONFIG_SYS_FLASH_BASE + 0x1F0000) /* addr of environment */

修改board/samsung/arm2440/arm2440.c
  这个文件是由原来的 board/samsung/arm2440/smdk2410.c 来的。笔者修改了这段:
#if FCLK_SPEED==0    /* Fout = 203MHz, Fin = 12MHz for Audio */
#define M_MDIV  0xC3
#define M_PDIV 0x4
#define M_SDIV 0x1
#elif FCLK_SPEED==1    /* Fout = 75MHz */
#define M_MDIV  42  /* 42*/
#define M_PDIV 0x2   /* 0x3 */
#define M_SDIV 0x2
#endif
  这段代码修改了 MPLL的时钟。它是为了迎合波特率计算公式的设置的。然
后在该文件里的 board_init 函数, 笔者把UPLLCON的配置和 MPLLCON的配置
顺序颠倒下。可能这是 2410 与 2440 的区别。S3C2440 的 datasheet 文档中明确
规定,必须先初始化 UPLLCON,然后延迟一段时间后才能初始化 MPLLCON。
      /* configure UPLL */
        clk_power->UPLLCON = ((U_M_MDIV << 12) + (U_M_PDIV << 4) + U_M_SDIV);
                                                                                
        /* some delay between MPLL and UPLL */
        delay (0xffff);
        delay (0xffff);
        delay (0xffff);
                                                                                
        /* configure MPLL */
        clk_power->MPLLCON = ((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV);
                                                                                
        /* some delay between MPLL and UPLL */
        delay (0xffff);
        delay (0xffff);
        delay (0xffff);
gpio->GPACON = 0x007FFFFF;
gpio->GPBCON = 0x00055555;
gpio->GPBUP = 0x000007FF;
gpio->GPCCON = 0xAAAAAAAA;
gpio->GPCUP = 0x0000FFFF;
gpio->GPDCON = 0xAAAAAAAA;
gpio->GPDUP = 0x0000FFFF;
gpio->GPECON = 0xAAAAAAAA;
gpio->GPEUP = 0x0000FFFF;
gpio->GPFCON = 0x000055AA;
gpio->GPFUP = 0x000000FF;
gpio->GPGCON = 0xFF94FFBA;
gpio->GPGUP = 0x0000FFEF;
gpio->GPGDAT = gpio->GPGDAT & (~(1<<4)) | (1<<4) ;
gpio->GPHCON = 0x002AFAAA;
gpio->GPHUP = 0x000007FF;
gpio->GPJCON = 0x02aaaaaa;
gpio->GPJUP = 0x00001fff;

在include/s3c24x0.h中的/* I/O PORT (see manual chapter 9) */添加端口定义
   /* s3c2440 */
    S3C24X0_REG32   res9[4];
    S3C24X0_REG32   GPJCON;
    S3C24X0_REG32   GPJDAT;
    S3C24X0_REG32   GPJUP;
修改cpu/arm920t/s3c24x0/speed.c
static ulong get_PLLCLK(int pllreg)
{
    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
    ulong r, m, p, s;
                                                                                
    if (pllreg == MPLL)
        r = clk_power->MPLLCON;
    else if (pllreg == UPLL)
        r = clk_power->UPLLCON;
    else
        hang();
    if (pllreg == MPLL)
    m = 2*(((r & 0xFF000) >> 12) + 8);
    else if (pllreg == UPLL)
       m = ((r & 0xFF000) >> 12) + 8;
    else
        hang();
                                                                                
//    m = ((r & 0xFF000) >> 12) + 8;
    p = ((r & 0x003F0) >> 4) + 2;
    s = r & 0x3;
                                                                                
    return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
}
修改include/configs/arm2440.h
#define CONFIG_SYS_PROMPT               "uboot-zhu # "        /* Monitor Command Prompt       */
这句是修改在uboot的命令行前的提示符前面的SMDK2410变成我自己定义的
这个时候已经能下到板子上了。
由于当前并未配置从nandflash启动的代码,所有现在启动方式是默认的
也是uboot自带的代码从norfalsh启动,通过TQ2440上原有的norflash启动
uboot1.1.6来用USB口把刚编译的u-boot.bin烧写到norflash中,再重新启动得到串口显示:
U-Boot 2009.11 ( 1鏈?25 2010 - 14:49:38)
DRAM:  64 MB
Flash:  2 MB
*** Warning - bad CRC, using default environment
In:    serial
Out:   serial
Err:   serial
Net:   No ethernet found.
uboot-zhu #
uboot-zhu # flinfo
Bank # 1: AMD: 1x Amd29LV800BB (8Mbit)
  Size: 2 MB in 19 Sectors
  Sector Start Addresses:
    00000000 (RO) 00004000 (RO) 00006000 (RO) 00008000 (RO) 00010000 (RO)
    00020000      00030000      00040000      00050000      00060000
    00070000      00080000      00090000      000A0000      000B0000
    000C0000      000D0000      000E0000      000F0000 (RO)
uboot-zhu #
我们的Nor Flash的型号是EN29LV160AB而上面显示为AMD的,但是现在也完全可以对NORFLASH进行读操作
并打印出了NORFLASH内的数据,证明当前的NORFLASH驱动已经可用了
但是在uboot保存环境变量时saveenv,出现
uboot-zhu # saveenv
Saving Environment to Flash...
Error: start address not on sector boundary

请问这是什么原因啊?现在网卡和NORFLASH都好像不大对
tyblly 发表于 2010-1-26 15:10:21 | 显示全部楼层
#define CONFIG_SYS_MAX_FLASH_SECT       (19)    /* max number of sectors on one chip */

将这个宏的 19 改为 35即可解决问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-10-6 20:40 , Processed in 1.030313 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表