关于作者

u-boot-2010.06移植(一)

上一篇 / 下一篇  2011-06-05 02:43:46 / 个人分类:嵌入式Linux

u-boot-2010.06移植(一)

硬件环境:

Intel Dual-Core E52002G DDR2-800ASUS P5QL/EPUSeagate SATAII-500G

S3C2440ALH57V2562GTR*2EN29LV160ABK9F2G08U0BCS8900A-CQ

J-Link V6.0

软件环境:

        Windows7 Ultimate

        VMware Workstation 6.0

        Redhat Enterprise Linux Server Release 5.1

        gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72)

一、 准备

1.1下载u-boot-2010.06

http://ftp.denx.de/pub/u-boot/u-boot-2010.06.tar.bz2

1.2解压u-boot-2010.06

tar jvxf u-boot-2010.06

1.3清除编译产生的中间件

make distclean

二、 开始移植

2.1、选择基础移植平台

因为u-boot中没有直接对S3C2440所支持的开发板,所以我们选择S3C2410的开发板SMDK2410作为蓝本进行移植。

2.2、创建自已的目标平台

board/Samsung/下建立自已的目标平台目录,将smdk2410目录下的内容全部复制到我们自已的平台目录下,并将新目录下的smdk2410.c更名为smdk2440.c,另外还需要将我们刚得到的smdk2440.c加入到编译链接项中。

mkdir board/samsung/smdk2440

cp board/samsung/smdk2410/* board/samsung/smdk2440/ -arf

mv board/samsung/smdk2440/smdk2410.c board/samsung/smdk2440/smdk2440.c

vim board/samsung/smdk2440/Makefile

将第28行内容更改为

COBJS  := smdk2440.o flash.o

2.3、创建smdk2440配置头文件

配置文件位于include/configs/目录,

cp include/configs/smdk2410.h include/configs/smdk2440.h

vim include/configs/smdk2440.h

将该文件第117行改为(这不是必需的,改不改无关紧要)

#define CONFIG_SYS_PROMPT              "SMDK2440 # "

大家一看都知道这就是u-boot命令行提示符

2.4、修改顶层Makefile文件(u-boot里有NMakefile,所谓顶层,就是u-boot根目录下的Makefile,别搞错了)

        vim Makefile

        修改159内容,设置交叉变译器为

        CROSS_COMPILE ?= arm-linux-

找到以下两行,大概在3051

smdk2410_config :      unconfig

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

复制并更改为以下内容

smdk2440_config :      unconfig

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

至此,我们的基本平台移植已完成,大家可以make make

2.5、针对S3C2440特性修改

2.5.1、修改时钟

首先,为了在程序中我们采用分支方式处理24402410代码兼容,我们需要定义一个宏,来作为我们的条件判断依据,当然你也可以直接修改代码使最终程序只支持2440

vim include/configs/smdk2440.h

在第40行上添加

#define CONFIG_SMDK2440 1      /**/

u-boot中,所有处理都是查询模式,所以我们需要屏蔽掉处理器的所有中断源,找到以下代码段,在后面添加红色部份

# if defined(CONFIG_S3C2410)

       ldr    r1, =0x3ff

       ldr    r0, =INTSUBMSK

       str    r1, [r0]

# endif

#if defined(CONFIG_SMDK2440)

       ldr    r1, =0x7FFF

       ldr    r0, =INTSUBMSK

       str    r1, [r0]

#endif

        紧接着,我们就来配置时钟部份,就在我们上面修改中断的代码后面,添加如下代码,

#if defined(CONFIG_SMDK2440)

#define LOCKTIME       0x4C000000

#define MPLLCON        0x4C000004

#define UPLLCON        0x4C000008

#define CAMDIVN        0x4C000018

       ldr    r0, =LOCKTIME

       mov    r1, #0x0FFFFFF

       str    r1, [r0]

       ldr    r0, =CLKDIVN

       mov    r1, #5

       str    r1, [r0]

       ldr    r0, =CAMDIVN

       mov    r1, #0

       str    r1, [r0]

       ldr    r0, =MPLLCON

       ldr    r1, =0x7F021

       str    r1, [r0]

       ldr    r0, =UPLLCON

       ldr    r1, =0x38022

       str    r1, [r0]

#else

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

       /* default FCLK is 120 MHz ! */

       ldr    r0, =CLKDIVN

       mov    r1, #3

       str    r1, [r0]

#endif /* end of CONFIG_SMDK2440 */

        #endif /* CONFIG_S3C24X0 */

以上仅仅是Start.S中的时钟初始化,除此之外,我们还需要对smdk2440.c进行修改

vim board/samsung/smdk2440/smdk2440.c

找到33行处,将这部份代码按以下内容修改

#if defined(CONFIG_SMDK2440)

#define FCLK_SPEED 2

#define USB_CLOCK 2

#else

#define FCLK_SPEED 1

#define USB_CLOCK 1

#endif

#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

#elif FCLK_SPEED==2            /* Fout = 405MHz */

#define M_MDIV 0x7F

#define M_PDIV 0x02

#define M_SDIV 0x01

#endif

 

/*此处删除了原USB_CLOCK定义*/

#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

#elif USB_CLOCK==2

#define U_M_MDIV       0x38

#define U_M_PDIV       0x02

#define U_M_SDIV       0x02

#endif

接下来,我们需要修改speed.c,这里主要是修改获取时钟频率的函数

vim arch/arm/cpu/arm920t/s3c24x0/speed.c

找到get_PLLCLK(int pllreg)函数,按如下内容进行修改

static ulong get_PLLCLK(int pllreg)

{

       struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();

       ulong r, m, p, s;

       if (pllreg == MPLL)

               r = readl(&clk_power->MPLLCON);

       else if (pllreg == UPLL)

               r = readl(&clk_power->UPLLCON);

       else

               hang();

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

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

       s = r & 0x3;

       #if defined(CONFIG_SMDK2440)

       if(pllreg == MPLL)

       {

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

       }

       #endif

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

}

找到get_HCLK(void)函数,按以下内容进行修改

ulong get_HCLK(void)

{

       struct s3c24x0_cl

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)