U-boot-2009.03移植之十一:第一阶段之支持2440

经过前面的一些列修改,大部分文件已经改得差不多了。

到了这个阶段,主要是修改一些宏,已经针对2440特有的一些寄存器和特性做一些添加。使UBOOT支持2440

 

这部分主要参考:

http://home.eeworld.com.cn/my/space.php?uid=135723&do=blog&id=25347

(1)/include/common.h文件的第492行:/*一些公用的常用函数,例如get_fclk()*/

 

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_LH7A40X) || defined(CONFIG_S3C2440)

 

(2)/include/s3c24x0.h:文件的第85、95、99、110、148、404行:/*一些关于S3C2440寄存器的结构体*/

 

#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)

 

(3)/cpu/arm920t/s3c24x0/interrupts.c文件的第33行:/*主要把一些头文件包含进去*/

 

#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined (CONFIG_S3C2440)

 

第38行:

 

#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)

 

(4)/cpu/arm920t/s3c24x0/serial.c文件的第22行:/*主要把一些头文件包含进去*/

 

#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined (CONFIG_S3C2440)

 

第26行:

 

#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)

 

(5)/cpu/arm920t/s3c24x0/speed.c文件的第33行:

 

#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined (CONFIG_S3C2440)

 

第37行:

 

#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)

 

顺便修改源代码,以匹配s3c2440:

 

static ulong get_PLLCLK(int pllreg)

{

   ......

 

    m = ((r & 0xFF000) >> 12) + 8;

    p = ((r & 0x003F0) >> 4) + 2;

    s = r & 0x3;

//qljt  /*这两个PLL的算法参见S3C2440datasheet的254页*/

#if defined(CONFIG_S3C2440)

   if (pllreg == MPLL)

    return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s)); /* CONFIG_SYS_CLK_FREQ 在qljt2440.h中定义*/

    else if (pllreg == UPLL)

#endif

//qljt

    return((CONFIG_SYS_CLK_FREQ * m) / (p << s));

}

 

......

 

/* return FCLK frequency */

 

ulong get_FCLK(void)

 

{

 

    return(get_PLLCLK(MPLL));

 

}

 

 

 

/* return HCLK frequency */

 

ulong get_HCLK(void)

 

{

 

    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();

 

 /*看看s3c2410与s3c2440的datasheet就知道s3c2440的HCLK可选择的值多很多*/

 

  if (clk_power->CLKDIVN & 0x6)    

 

  {/*这里注意:编译的时候发现CLKDIVN ,这个将会在12节解决*/

 

       if ((clk_power->CLKDIVN & 0x6)==2)        return(get_FCLK()/2);

 

if ((clk_power->CLKDIVN & 0x6)==6)        return((clk_power->CAMDIVN & 0x100) ? get_FCLK()/6 : get_FCLK()/3);        

 

 /*注意这里的CAMDIVN还没有被定义,在/include/s3c24x0.h中定义 */

 

      if ((clk_power->CLKDIVN & 0x6)==4)        return((clk_power->CAMDIVN & 0x200) ? get_FCLK()/8 : get_FCLK()/4);  

 

 

 

        return(get_FCLK());

 

 } 

 

 else   {

 

        return(get_FCLK());

 

     }

 

//    return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());

 

}

 

......

 

(6)/cpu/arm920t/s3c24x0/usb_ohci.c文件的第45行:

 

#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)

 

(7)drivers/rtc/s3c24x0_rtc.c文件的第35行:

 

#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) 

 

(8)在文件中添加“defined(CONFIG_qljt2440)”,使得原来SBC2410X开发板的代码可以编译进来,

 

/cpu/arm920t/s3c24x0/interrupts.c文件的第181行:  

 

   #elif defined(CONFIG_SBC2410X) || /

 

      defined(CONFIG_SMDK2410) || /

 

      defined(CONFIG_VCMA9) || defined(CONFIG_qljt2440)

 

         tbclk = CFG_HZ;      /*对于CFG_HZ 的值,结合uboot的说明和s3c2440的datasheet就比较容易理解*/

 

#else

 

(9)/cpu/arm920t/s3c24x0/usb.c文件的第31行: 

#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)

 

(10)/cpu/arm920t/s3c24x0/i2c.c文件的第35行: 

#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)

第66、85、142、150、174行:

将“#ifdef CONFIG_S3C2410”改为 

#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)

 

(11)drivers/usb/usb_ohci.c文件的第68行附近:

#if defined(CONFIG_ARM920T) || /

    defined(CONFIG_S3C2400) || /

    defined(CONFIG_S3C2410) || /

    defined(CONFIG_S3C2440) || /

    defined(CONFIG_440EP) || /

    defined(CONFIG_PCI_OHCI) || /

    defined(CONFIG_MPC5200)

 

11. 在/include/s3c24x0.h中加入2440 的NAND FLASH 寄存器定义和CAMDIVN定义:

 

typedef struct {

 

         S3C24X0_REG32   LOCKTIME;

 

         S3C24X0_REG32   MPLLCON;

 

         S3C24X0_REG32   UPLLCON;

 

         S3C24X0_REG32   CLKCON;

 

         S3C24X0_REG32   CLKSLOW;

 

         S3C24X0_REG32   CLKDIVN;

 

         S3C24X0_REG32   CAMDIVN;

 

} S3C24X0_CLOCK_POWER;

 

......

 

#if defined(CONFIG_S3C2410)  //2440 的NAND FLASH 寄存器

 

typedef struct {

 

         S3C24X0_REG32   NFCONF;

 

         S3C24X0_REG32   NFCMD;

 

         S3C24X0_REG32   NFADDR;

 

         S3C24X0_REG32   NFDATA;

 

         S3C24X0_REG32   NFSTAT;

 

         S3C24X0_REG32   NFECC;

 

} S3C2410_NAND;

 

#endif

 

#if defined (CONFIG_S3C2440)

 

typedef struct {

 

         S3C24X0_REG32   NFCONF;

 

         S3C24X0_REG32   NFCONT;

 

         S3C24X0_REG32   NFCMD;

 

         S3C24X0_REG32   NFADDR;

 

         S3C24X0_REG32   NFDATA;

 

         S3C24X0_REG32   NFMECC0;

 

         S3C24X0_REG32   NFMECC1;

 

         S3C24X0_REG32   NFSECC;

 

         S3C24X0_REG32   NFSTAT;

 

         S3C24X0_REG32   NFESTAT0;

 

         S3C24X0_REG32   NFESTAT1;

 

         S3C24X0_REG32   NFECC;

 

} S3C2410_NAND;

 

#endif

 

12. 修改/lib_arm中的board.c。 

......

#include <common.h>

#include <command.h>

#include <malloc.h>

#include <devices.h>

#include <version.h>

#include <net.h>

#include <s3c2410.h> 

 

......

 

13. 修改common/env_nand.c 

......

#ifdef CONFIG_INFERNO

#error CONFIG_INFERNO not supported yet

#endif

 

int nand_legacy_rw (struct nand_chip* nand, int cmd,

        size_t start, size_t len,

        size_t * retlen, u_char * buf);

extern struct nand_chip nand_dev_desc[CFG_MAX_NAND_DEVICE];

extern int nand_legacy_erase(struct nand_chip *nand, size_t ofs, size_t len, int clean);

 

/* info for NAND chips, defined in drivers/nand/nand.c */

nand_info_t nand_info[CFG_MAX_NAND_DEVICE];

 

......

 

#else /* ! CFG_ENV_OFFSET_REDUND */

int saveenv(void)

{

    size_t total;

    int ret = 0;

    nand_erase_options_t nand_erase_options;

 

    nand_erase_options.length = CFG_ENV_RANGE;

    nand_erase_options.quiet = 0;

    nand_erase_options.jffs2 = 0;

    nand_erase_options.scrub = 0;

    nand_erase_options.offset = CFG_ENV_OFFSET;

 

    if (CFG_ENV_RANGE < CFG_ENV_SIZE)

        return 1;

    puts ("Erasing Nand.../n");

 

/*在248行附近*/

//    if (nand_erase_opts(&nand_info[0], &nand_erase_options))

  if (nand_legacy_erase(nand_dev_desc + 0, CFG_ENV_OFFSET, CFG_ENV_SIZE, 0))           

 

    return 1;

    puts ("Writing to Nand... ");

    total = CFG_ENV_SIZE;

 

/*在254行附近*/

//    if (writeenv(CFG_ENV_OFFSET, (u_char *) env_ptr)) {

//        puts("FAILED!/n");

//        return 1;

//    }

 

ret = nand_legacy_rw(nand_dev_desc + 0,0x00 | 0x02, CFG_ENV_OFFSET, CFG_ENV_SIZE,&total, (u_char*)env_ptr);

 if (ret || total != CFG_ENV_SIZE)

        return 1;

    puts ("done/n");

    return ret;

}

 

 

#else /* ! CFG_ENV_OFFSET_REDUND */

.......

/*

 * The legacy NAND code saved the environment in the first NAND device i.e.,

 * nand_dev_desc + 0. This is also the behaviour using the new NAND code.

 */

void env_relocate_spec (void)

{

#if !defined(ENV_IS_EMBEDDED)

    size_t total;

    int ret;

 

    total = CFG_ENV_SIZE;

 

/*在360行附近*/

//    ret = readenv(CFG_ENV_OFFSET, (u_char *) env_ptr);

     ret = nand_legacy_rw(nand_dev_desc + 0, 0x01 | 0x02, CFG_ENV_OFFSET,CFG_ENV_SIZE, &total, (u_char*)

 

env_ptr);/*edited by yaoyi 20090314,1.3.4是先进入到readenv,而非直接调用nand_legacy_rw。 因此干脆就不用到readenv了,

 

直接注释掉,添加以上代码 */

    if (ret || total != CFG_ENV_SIZE)

        return use_default();

 

    if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc)

        return use_default();

#endif /* ! ENV_IS_EMBEDDED */

}

 

/*

u-boot运行至第二阶段进入start_armboot()函数。其中nand_init()函数是对nand flash的最初初始化函数。Nand_init()函数在两

 

个文件中实现。其调用与CFG_NAND_LEGACY宏有关,如果没有定义这个宏,系统调用 drivers/nand/nand.c中的nand_init();否则调

 

用自己在board/qljt/qljt2440/qljt2440.c中的nand_init()函数。这里我选择第二种方式。*/

 

14. 修改include/nand.h

 

.......

//#ifndef CFG_NAND_LEGACY 

#include <linux/mtd/compat.h> 

#include <linux/mtd/mtd.h> 

#include <linux/mtd/nand.h> 

.......

 

//#endif /* !CFG_NAND_LEGACY */

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值