嵌入式学习之uboot移植

 

uboot版本:uboot2010.03

硬件平台:NUAA2440开发板

主机编译环境:linux --- enterprise5

交叉编译器:arm-linux-gcc 4.1.2 支持EABI

 

一、基础移植,增加对S3C2440平台的支持

修改主目录下的Makefile文件,找到

smdk2410_config   :      unconfig

@$(MKCONFIG)$ (@:_config=)arm arm920t smdk2410 samsung s3c24x0

仿照smdk2410的配置编写自己开发板的配置:

nuaa2440_config :   unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t  nuaa2440 why s3c24x0

(注意:第二行前面是TAB键,而不是空格!!)

 

修改第160行,指定交叉编译器:

CROSS_COMPILE =  arm-linux-

各项的意思如下:

arm: CPU的架构(ARCH)

arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。

NUAA2440: 开发板的型号(BOARD),对应于board/NUAA2440目录。
NULL: 开发者/或经销商(vender)。
s3c24x0: 片上系统(SOC)。

 

board目录下,新建自己的开发板目录NUAA2440,把samsung目录下的smdk2410目录下的所有文件拷到NUAA2440目录下,把smdk2410.c改为NUAA2440.c。修改该目录下的Makefile,(第28行)把smdk2410.o改为NUAA2440.o。用的命令cp-a board/Samsung/smdk2410/*  board/nuaa2440,

删除board目录下其他开发板文件,mv nuaa2440 ../,rm –rf *,mv ../nuaa2440 ./。

 

开发板的SDRAM接的是BANK6,BANK6的起始地址为0x30000000。

 

修改lowlevel_init.S文件,修改REFRESH的刷新周期 

 

/* REFRESH parameter */

#define REFEN                    0x1 /* Refresh enable */

#define TREFMD                  0x0 /* CBR(CAS before RAS)/Auto refresh */

#define Trc               0x3 /* 7clk */

#define Tchr                    0x2 /* 3clk */

 

#if defined(CONFIG_S3C2440)

#define Trp               0x2 /* 4clk */

#define REFCNT                  1012

#else

#define Trp               0x0 /* 2clk */

#define REFCNT                  0x0459

#endif

 

include/configs目录下创建开发板的配置头文件,把smdk2410.h改名为nuaa2440.h,再把所有的文件全部删除,只留nuaa2440.h,为开发板添加新的软硬件配置文件cp smdk2410.h nuaa2440.h。mv nuaa2440.h  ../,rm  –rf *,

Mv ../nuaa2440.h ./。

修改nuaa2440.h,取消S3C2410的定义,加入S3C2440定义:

//#define CONFIG_S3C2410     1   /* specifically a SAMSUNG S3C2410 SoC  */

//#define CONFIG_SMDK2410 1     /* on a SAMSUNG SMDK2410 Board  */

#define CONFIG_S3C2440 1  /* specifically a SAMSUNG S3C2440 SoC */

 

增加对S3C2440处理器的支持,首先要修改2440的时钟设置

对于2440开发板,将FCLK设为400MHz,分频比为FCLK:HCLK:PCLK=1:4:8

修改nuaa2440.c文件,注释掉前面配置时钟寄存器的内容

#if 0

#define FCLK_SPEED 1

 

#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 = 202.8MHz */

#define M_MDIV     0xA1

#define M_PDIV     0x3

#define M_SDIV     0x1

#endif

 

#define USB_CLOCK 1

 

#if USB_CLOCK==0

#define U_M_MDIV       0xA1

#define U_M_PDIV       0x3

#define U_M_SDIV       0x1

#elif USB_CLOCK==1

#define U_M_MDIV       0x48

#define U_M_PDIV       0x3

#define U_M_SDIV       0x2

#endif

#endif

 

下面开始加入2440的时钟配置:

#if defined(CONFIG_S3C2440)

/* Fout = 405MHz */

#define M_MDIV 0x7f  

#define M_PDIV 0x2

#define M_SDIV 0x1

#endif

 

#if defined(CONFIG_S3C2440)

#define U_M_MDIV 0x38

#define U_M_PDIV 0x2

#endif

 

#define U_M_SDIV       0x2

 

指定MACH_TYPE,在board_init函数中,查看bi_arch_number:

/* arch number of S3C2440-Board */

gd->bd->bi_arch_number = MACH_TYPE_S3C2440;

 

MACH_TYPE在include/asm-arm/mach-types.h中定义,其中MACH_TYPE_S3C2440是362,这个要和内核中的mach-types一致

 

修改cpu/arm920t/s3c24X0/speed.c

在get_PLLCLK函数中加入:

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

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

       s = r & 0x3;

      

/*why add begin*/

#if defined(CONFIG_S3C2440)

       if (pllreg == MPLL)

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

       else if (pllreg == UPLL)

#endif

/*why add end*/

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

 

 

include 目录是uboot使用的头文件该目录下的asm目录有于cpu体系结构相关的头文件,在include/asm-arm/arch-s3c24x0目录下的s3c24x0.h中定义了/* CLOCK & POWER MANAGEMENT (see S3C2400 manual chapter 6) */

/*                          (see S3C2410 manual chapter 7) */

struct s3c24x0_clock_power {

       u32 LOCKTIME;

       u32 MPLLCON;

       u32 UPLLCON;

       u32 CLKCON;

       u32 CLKSLOW;

       u32 CLKDIVN;

};

 

修改get_HCLK函数:

/* return HCLK frequency */

ulong get_HCLK(void)

{

       struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();

 

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

/*why add begin*/

#if defined(CONFIG_S3C2440)

       if (readl(&clk_power->CLKDIVN) & 0x6)

       {

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

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

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

                     return(get_FCLK());

       }

       else

              return(get_FCLK());

#else

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

#endif

/*why add end*/

}

 

 

修改include/asm-arm/arch-s3c24x0/s3c24x0_cpu.h:

仿照前两项,在后面加入:

/*why add begin*/

#elif defined CONFIG_S3C2440

       #include <asm/arch/s3c2410.h>

/*why add end*/

 

修改s3c24x0.h的寄存器定义头文件include/asm-arm/arch-s3c24x0/s3c24x0.h:将该文件中所有的“#ifdef CONFIG_S3C2410”替换成

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

 

在struct s3c24x0_clock_power结构体中加入2440的CAMDIVN寄存器定义:

       u32       CLKSLOW;

       u32       CLKDIVN;

#if defined (CONFIG_S3C2440)

       u32 CAMDIVN;

#endif

 

 

修改cpu/arm920t/s3c24x0/timer.c,在get_tbclk函数中加入:

#elif defined(CONFIG_SBC2410X) || \

      defined(CONFIG_SMDK2410) || \

defined(CONFIG_S3C2440)  || \

      defined(CONFIG_VCMA9)

 

修改cpu/arm920t/start.S:

# if defined(CONFIG_S3C2400)

#  define pWTCON      0x15300000

#  define INTMSK 0x14400008      /* Interupt-Controller base addresses */

#  define CLKDIVN      0x14800014      /* clock divisor register */

#else

#  define pWTCON      0x53000000

#  define INTMSK 0x4A000008     /* Interupt-Controller base addresses */

#  define INTSUBMSK       0x4A00001C

#  define CLKDIVN      0x4C000014     /* clock divisor register */

# endif

/*why add begin*/

#define CLK_CTL_BASE   0x4C000000

#define MDIV_405 0x7f << 12

#define PSDIV_405      0x21

#define MDIV_200 0xa1 << 12

#define PSDIV_200      0x31

/*why add end*/

 

/*why add begin*/

#if defined(CONFIG_S3C2440)

       ldr   r1, =0x7fff  

       ldr   r0, =INTSUBMSK

       str   r1, [r0]

#endif

 

#if defined(CONFIG_S3C2440)

       /* FCLK:HCLK:PCLK = 1:4:8 */

       ldr   r0, =CLKDIVN

       mov       r1, #5

       str   r1, [r0]

      

       mrc p15, 0, r1, c1, c0, 0 

       orr  r1, r1, #0xc0000000             

       mcr p15, 0, r1, c1, c0, 0 

      

      

       mov       r1, #CLK_CTL_BASE  

       mov       r2, #MDIV_405

       add       r2, r2, #PSDIV_405

       str   r2, [r1, #0x04]

 

#else

/*why add end*/

       /* FCLK:HCLK:PCLK = 1:2:4 */

       /* default FCLK is 120 MHz ! */

       ldr   r0, =CLKDIVN

       mov       r1, #3

       str   r1, [r0]

 

/*why add begin*/   

       mrc p15, 0, r1, c1, c0, 0 

       orr  r1, r1, #0xc0000000      

       mcr p15, 0, r1, c1, c0, 0

      

      

       mov       r1, #CLK_CTL_BASE

       mov       r2, #MDIV_200

       add       r2, r2, #PSDIV_200

       str   r2, [r1, #0x04]

#endif

/*why  add end*/

 

到此,uboot在S3C2440平台的基础移植工作已完成,接下来就要编译u-boot,然后在开发板上运行一下,验证是否可以正常启动。

make nuaa2440_config

编译命令:#make all,生成u-boot.bin镜像文件,用JTAG工具将其烧入Nor Flash中,运行效果如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值