u-boot-2009.08在mini2440上的移植 建立mini2440工程环境

发布者:HeavenlyClouds最新更新时间:2024-07-01 来源: elecfans关键字:u-boot  mini2440  移植  工程环境 手机看文章 扫描二维码
随时随地手机看文章

移植环境

1,主机环境:VMare下CentOS 5.5 ,1G内存。

2,集成开发环境:Elipse IDE

3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-eabi-gcc v4.5.1。

4,开发板:mini2440,2M nor flash,128M nand flash。

5,u-boot版本:u-boot-2009.08

6,参考文章:

下载并解压源文件

1,下载u-boot-2009.08,可以从官方网站下载u-boot-2009.08

2,#tar -jxvf u-boot-2009.08.tar.bz2    //解压源码

移植步骤

1.1,了解u-boot目录结构和启动流程,请参考U-Boot启动过程分析

相关阅读:U-Boot源代码下载地址 http://www.linuxidc.com/Linux/2011-07/38897.htm

【1】目录结构

u-boot-2009.08在mini2440上的移植(一)

【2】启动流程

u-boot-2009.08在mini2440上的移植(一)

 

1.2,建立mini2440开发板文件并编译测试

在项目根目录u-boot-2009.08上单击右键->浏览文件夹

【1】定位到board/samsung,将目录smdk2410复制并粘贴到当前目录下,将其重命名为mini2440。

【2】打开mini2440目录,将smdk2410.c重命名为mini2440.c,

【3】用gedit打开当前目录下的Makefile(在Makefile上单击右键->使用“文本编辑器”打开),定位到28行,修改后代码如下所示(修改部分用灰色背景颜色标出):

include $(TOPDIR)/config.mk
LIB = $(obj)lib$(BOARD).a
COBJS := mini2440.o flash.o
SOBJS := lowlevel_init.o
然后保存。

【4】在根目录下定位到include/configs,将smdk2410.h复制并粘贴到当前目录下,将其重命名成mini2440.h。

【5】用gedit打开根目录下的Makefile文件,然后搜索smdk2410,定位到2997行,找到下列语句

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

然后将其复制并粘贴到其下面,并修改成如下语句

mini2440_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm arm920t mini2440 samsung s3c24x0

然后保存。
*说明:

       arm    :CPU的架构(ARCH)
       arm920t:CPU的类型
       mini2440 :对应在board目录下建立新的开发板项目的目录
       samsung:新开发板项目目录的上级目录,如直接在board下建立新的开发板项目的目录,则这里就为NULL
       s3c24x0:CPU型号
*注意:编译选项格式的第二行要用Tab键开始,否则编译会出错。

【6】编译测试

打开终端,进入到u-boot-2009.08根目录下执行

[root@localhost u-boot-2009.08]# make distclean
[root@localhost u-boot-2009.08]# make mini2440_config
Configuring for mini2440 board...
[root@localhost u-boot-2009.08]# make
... .... .... ....

board.c:127: error: inline function 'coloured_LED_init' cannot be declared weak
board.c:129: error: inline function 'red_LED_on' cannot be declared weak
board.c:131: error: inline function 'red_LED_off' cannot be declared weak
board.c:133: error: inline function 'green_LED_on' cannot be declared weak
board.c:135: error: inline function 'green_LED_off' cannot be declared weak
board.c:137: error: inline function 'yellow_LED_on' cannot be declared weak
board.c:139: error: inline function 'yellow_LED_off' cannot be declared weak
board.c:141: error: inline function 'blue_LED_on' cannot be declared weak
board.c:143: error: inline function 'blue_LED_off' cannot be declared weak
make[1]: *** [board.o] 错误 1
make[1]: Leaving directory `/root/workspace/u-boot-2009.08/lib_arm'
make: *** [lib_arm/libarm.a] 错误 2
[root@localhost u-boot-2009.08]#

出现错误,内嵌函数不能被声明为weak属性,打开lib_arm/board.c,定位到127行开始,将其注释掉,修改后结果如下:

void inline __coloured_LED_init (void) {}
//void inline coloured_LED_init (void) __attribute__((weak, alias('__coloured_LED_init')));
void inline __red_LED_on (void) {}
//void inline red_LED_on (void) __attribute__((weak, alias('__red_LED_on')));
void inline __red_LED_off(void) {}
//void inline red_LED_off(void)      __attribute__((weak, alias('__red_LED_off')));
void inline __green_LED_on(void) {}
//void inline green_LED_on(void) __attribute__((weak, alias('__green_LED_on')));
void inline __green_LED_off(void) {}
//void inline green_LED_off(void)__attribute__((weak, alias('__green_LED_off')));
void inline __yellow_LED_on(void) {}
//void inline yellow_LED_on(void)__attribute__((weak, alias('__yellow_LED_on')));
void inline __yellow_LED_off(void) {}
//void inline yellow_LED_off(void)__attribute__((weak, alias('__yellow_LED_off')));
void inline __blue_LED_on(void) {}
//void inline blue_LED_on(void)__attribute__((weak, alias('__blue_LED_on')));
void inline __blue_LED_off(void) {}
//void inline blue_LED_off(void)__attribute__((weak, alias('__blue_LED_off')));

[root@localhost u-boot-2009.08]# make clean

[root@localhost u-boot-2009.08]# make

... ...

cpu/arm920t/start.o: In function `start_code':
/root/workspace/u-boot-2009.08/cpu/arm920t/start.S:117: undefined reference to `coloured_LED_init'

/root/workspace/u-boot-2009.08/cpu/arm920t/start.S:118: undefined reference to `red_LED_on'
make: *** [u-boot] 错误 1
出现错误coloured_LED_init'未定义。打开cpu/arm920t/start.S,搜索“coloured_LED_init”定位到117行,找到如下代码:

 bl coloured_LED_init
 bl red_LED_on

将其注释掉

//这两行是AT91RM9200DK开发板的LED初始化,注释掉

//bl coloured_LED_init
 //bl red_LED_on


然后执行清除、编译命令

[root@localhost u-boot-2009.08]# make clean

[root@localhost u-boot-2009.08]# make

... ...

arm-linux-objcopy -O srec u-boot u-boot.srec
arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
[root@localhost u-boot-2009.08]#
编译通过。

【7】加入调试选项,启用DEBUG宏,有两种办法办法

<1>参考文章Makefile,如何传递宏定义DEBUG和Debug版和Release版的程序

在编译时,直接在make 后面传入参数 -d ,表示Debug模式,输出有关文件和检测时间的详细信息,如

make -d

可以输出源程序中定义的DEBUG宏定义的调试信息

<2>用gedit打开根目录下的config.mk文件,然后搜索“DDEBUG”,找到如下语句

DBGFLAGS= -g # -DDEBUG

将注释掉的DDEBUG选项打开,修改后下面语句

DBGFLAGS= -g  -DDEBUG

但是此种办法需要在调试完成时需要在将其注释掉。

1.3,根据启动流程修改或添加基本的u-boot源码,使其能够在内存中启动

【1】增加对S3C2440一些寄存器的支持,添加中断禁止部分和时钟设置部分

用gedit打开cpu/arm920t/start.S,定位到134行附近,如下代码

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
 /* turn off the watchdog */

由于2410和2440的寄存器及地址大部分是一致的,所以这里就直接在2410的基础上再加上对2440的支持即可,修改后代码如下:

#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440)
 /* turn off the watchdog */

 ... ...

# if defined(CONFIG_S3C2410)
    ldr  r1, =0x3ff
    ldr  r0, =INTSUBMSK
    str  r1, [r0]
# endif

# if defined(CONFIG_S3C2440)//添加s3c2440的中断禁止部分
    ldr  r1, =0x7fff        //根据2440芯片手册,INTSUBMSK寄存器有15位可用  
    ldr  r0, =INTSUBMSK
    str  r1, [r0]
# endif

# if defined(CONFIG_S3C2440)   //添加s3c2440的时钟部分
#define MPLLCON   0x4C000004   //系统主频配置寄存器基地址
#define UPLLCON   0x4C000008   //USB时钟频率配置寄存器基地址
    ldr  r0, =CLKDIVN          //设置分频系数FCLK:HCLK:PCLK = 1:4:8
    mov  r1, #5
    str  r1, [r0]
    ldr  r0, =MPLLCON  //设置系统主频为405MHz 
    ldr  r1, =0x7F021  //这个值参考芯片手册“PLL VALUE SELECTION TABLE”部分
    str  r1, [r0]
    ldr  r0, =UPLLCON  //设置USB时钟频率为48MHz 
    ldr  r1, =0x38022  //这个值参考芯片手册“PLL VALUE SELECTION TABLE”部分
    str  r1, [r0]
# else //其他开发板的时钟部分
  /* FCLK:HCLK:PCLK = 1:2:4 */
 /* default FCLK is 202.8 MHz ! */
   ldr r0, =CLKDIVN
   mov r1, #3
   str r1, [r0]

   ldr  r0, =MPLLCON  //设置系统主频为202.8MHz
   ldr  r1, =0xa1031  //这个值参考芯片手册“PLL VALUE SELECTION TABLE”部分
   str  r1, [r0]

#endif /* CONFIG_S3C2400 || CONFIG_S3C2410 || CONFIG_S3C2440 */

【2】S3C2440的时钟部分除了在start.S中添加外,还要分别在board/samsung/mini2440/mini2440.c和cpu/arm920t/s3c24x0/speed.c中修改或添加部分代码。

(1)用gedit打开board/samsung/mini2440/mini2440.c,定位到33行,修改或添加如下内容:

//设置主频和USB时钟频率参数与start.S中的一致

#define FCLK_SPEED  2       //设置默认等于2

#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     //这三个值根据S3C2440芯片手册“PLL VALUE SELECTION TABLE”部分进行设置
#define M_PDIV    0x2
#define M_SDIV    0x1
#endif


#define USB_CLOCK 2        //设置默认等于2

#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         /* Fout = 48MHz */
#define U_M_MDIV    0x38   //这三个值根据S3C2440芯片手册“PLL VALUE SELECTION TABLE”部分进行设置
#define U_M_PDIV    0x2
#define U_M_SDIV    0x2
#endif

(2)用gedit打开cpu/arm920t/s3c24x0/speed.c,定位到69行加入如下代码

    m = ((r & 0xFF000) >> 12) + 8;
    p = ((r & 0x003F0) >> 4) + 2;
    s = r & 0x3;

//根据设置的分频系数FCLK:HCLK:PCLK = 1:4:8修改获取时钟频率的函数
#if defined(CONFIG_S3C2440)
    if(pllreg == MPLL)//参考S3C2440芯片手册上的公式:PLL=(2 * m * Fin)/(p * 2s)
        return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));
    //else if (pllreg == UPLL) //warning: control reaches end of non-void function
#endif

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

为什么要再返回时加一个判断呢?因为在2440中MPLL的时钟为UPLL时钟的2倍,在s3c2440的数据手册里的227页这样写到MPLL和UPLL的计算方法
MPLL Control Register
Mpll = (2 * m * Fin) / (p * 2s)
m = (MDIV + 8), p = (PDIV + 2), s = SDIV
UPLL Control Register
Upll = (m * Fin) / (p * 2s)
m = (MDIV + 8), p = (PDIV + 2), s = SDIV
这个就是修改此函数的缘由。

由于S3C2410和S3C2440的设置方法也不一样,所以get_HCLK函数也需要修改:

/* return HCLK frequency */
ulong get_HCLK(void)
{
    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
#if defined(CONFIG_S3C2440)
 if (clk_power->CLKDIVN & 0x6)
    {
    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);
    if ((clk_power->CLKDIVN & 0x6)==4) return((clk_power->CAMDIVN & 0x200) ? get_FCLK()/8 : get_FCLK()/4);
    return(get_FCLK());
    }
 else return(get_FCLK());
#else
    return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());
#endif

 }

这里用到了将在include/s3c24x0.h文件里所添加的CAMDIVN 项,因为这一项的值决定了我们的时钟配置。
这样修改的原因是在s3c2440的数据手册的231页有这样一段话:
CLOCK DIVIDER CONTROL (CLKDIVN) REGISTER
Register Address R/W Description Reset Value
CLKDIVN 0x4C000014 R/W Clock divider control register 0x00000000
CLKDIVN               Bit            Description
DIVN_UPLL           [3]            UCLK select register(UCLK must be 48MHz for USB)
0:UCLK = UPLL clock
1:UCLK = UPLL clock / 2
Set to 0, when UPLL clock is set as 48Mhz
Set to 1. when UPLL clock is set as 96Mhz.
HDIVN                  [2:1]       00 : HCLK = FCLK/1.
01 : HCLK = FCLK/2.
10 : HCLK = FCLK/4 when CAMDIVN[9] = 0.
HCLK= FCLK/8 when CAMDIVN[9] = 1.
11 : HCLK = FCLK/3 when CAMDIVN[8] = 0.
HCLK = FCLK/6 when CAMDIVN[8] = 1.
PDIVN [0]                              0: PCLK has the clock same as the HCLK/1.
1: PCLK has the clock same as the HCLK/2.
我们到底应该返回FCLK的几分之一在这里就有秒数,其中必须根据HDIVN 的值与CAMDIVN的值来判断。

[1] [2] [3]
关键字:u-boot  mini2440  移植  工程环境 引用地址:u-boot-2009.08在mini2440上的移植 建立mini2440工程环境

上一篇:u-boot-2011.03在mini2440/micro2440上的移植 结束语及资源下载
下一篇:u-boot-2009.08在mini2440上的移植 增加nor flash功能

推荐阅读最新更新时间:2026-03-19 23:19

U-Boot 2010.09 支持mini2440
手头上只有mini2440的板子,移植也是针对它,感觉老了点,^.^!,本来uboot的版本想选定最新的,如2011.03等,但是uboot从2010年12月份的版本起,前面的初始化代码结构改动比较多,而且存在很多bug,尤其是开始搬运代码处的bug(没搬运代码就改变了全局变量,对norflash这是不可以的),开始琢磨着改,但是越到后来越发现,改就改回了旧式的结构,索性还不如用旧式结构的版本,因此移植的版本选定了旧式结构的最后一个版本2010.09。 移植期间参考了Tekkaman Ninja 关于03版本的部分源代码,在此对其表示感谢! U-Boot源代码下载地址 http://www.linuxidc.com/Linux/2
[单片机]
搭建一个mini2440开发板U-Boot的框架
一、移植环境 主 机: Ubuntu 开发板:友善之臂mini2440 编译器:arm-linux-gcc-4.3.2 u-boot:u-boot-2009.03.tar.bz2 二、移植步骤 目前u-boot对很多CPU直接支持,可以查看board目录的一些子目录,如:board/samsung/目录下就是对三星一些ARM处理器的支持,有smdk2400、smdk2410和smdk6400,但没有2440,所以我们就在这里建立自己的开发板项目。 1)因2440和2410的资源差不多,主频和外设有点差别,所以我们就在board/samsung/下建立自己开发板的项目,取名叫mini2440 #tar -jx
[单片机]
STM32原有的MDK工程移植到GCC环境
1. 增加 STM32F429IGTx_FLASH.ld 这个文件存放芯片内存信息 STM32F429IGTx_FLASH.ld主要存放的是芯片内存的信息,堆栈大小,RAM,Flash大小, MEMORY{ }中存放的内存段,程序中有使用明确内存的地址的地方要在这里定义。 /* Entry Point */ ENTRY(Reset_Handler) /* Highest address of the user mode stack */ _estack = 0x20020000; /* end of RAM */ /* Generate a link error if heap and stack don&
[单片机]
tiny210(s5pv210)移植u-boot(基于 2014.4 版本号)——移植u-boot.bin(打印串口控制台)
在之前我们移植的代码中,都没看到明显的效果,这节我们实现控制台的信息打印。 在上节。我们看到调用 relocate_code 重定位。在 u-boot 的帮助文档 doc/README.arm-relocation 中对重定位有说明。 u-boot 为了生成位置无关码,在链接时指定了-pie 选项,这个选项在 u-boot-2014.04/arch/arm/config.mk 中指定: 当使用-pie 选项后。链接器会生成一个修正表(fixup tables)。在终于的二进制文件 u-boot.bin 中表现为多了 2 个段 .rel.dyn 和 .dynsym。还须要在链接脚本文件里添加这 2 个段,u-boot.b
[单片机]
tiny210(s5pv210)<font color='red'>移植</font><font color='red'>u-boot</font>(基于 2014.4 版本号)——<font color='red'>移植</font>u-boot.bin(打印串口控制台)
tiny210(s5pv210)移植u-boot(基于 2014.4 版本号)——NAND 8位硬件ECC
这节我们实现nand的ecc,保存环境变量到nand flash 中。然后把我们之前的led灯烧写到nand flash 中。开机启动。在 tiny210.h 中定义宏 CONFIG_S5PV210_NAND_HWECC、CONFIG_SYS_NAND_ECCSIZE、CONFIG_SYS_NAND_ECCBYTES CONFIG_SYS_NAND_ECCSIZE 定义了消息长度。即每多少字节进行 1 次 ECC 校验 CONFIG_SYS_NAND_ECCBYTES 定义为 13Byte,将 drivers/mtd/nand/s5pv210_nand.c 中的 CONFIG_S3C2410_NAND_HWECC 替换为CON
[单片机]
tiny210(s5pv210)<font color='red'>移植</font><font color='red'>u-boot</font>(基于 2014.4 版本号)——NAND 8位硬件ECC
u-boot 移植 --->4、Tiny210核心板的DDR初始化下详解
RAM的原理简单学习 DDR是RAM的一种,RAM常见的类型有SRAM,SDRAM,DDR他们的共同特点是,随机存储意味着读写速度快,掉电后数据丢失,所以常用来存储程序中的变量。 SRAM 静态随机存储器英文是static random-access memory 就是保持上电就可以保存数据而不需要刷新。数据线和地址线分离以IS62WV51216这个芯片为例,他数据位宽为16,大小为1MB,地址线宽是19。所以可以访问的空间大小就是2的19次方即524288=512KB,然后数据线是16位了,所以512KB*2 就是这个芯片的全部容量。然后在加上一些必要的控制线比如片选,字节选择等就可以完成读写控制,他的特点是不需要刷新
[单片机]
<font color='red'>u-boot</font> <font color='red'>移植</font> --->4、Tiny210核心板的DDR初始化下详解
u-boot 移植 --->7、u-bootl流程粗线条梳理
通过前面的调试了解到s5pv210这个芯片的启动流程是需要将u-boot分为两部分的分别为SPL和u-boot。这里我使用网上的方式不直接使用u-boot的SPL连接脚本单独生成SPL的image而是用前面介绍的方法 (u-boot 移植 --- 3、S5PV210启动序列)将u-boot的前16k直接截取出来作为SPL。 IROM中 这一部分可以参考其他博文,或者三星的文档。 在IRAM中 通过启动连接脚本archarmcpuu-boot.lds 我们找到了整个代码的入口_start。全局寻找找到文件archarmlibvectors.S符合本次架构所以整个代码入口就在这里内容如下: _start: #ifdef CON
[单片机]
u-boot移植到s3c2440开发板(一)--建立单板
由于没有系统的学习shell,所以Makefile大多数看不懂,一个小小的细节,把我难住了几天。现在开始分享我的操作过程 本文所有linux下的操作是root用户,如果你使用普通用户,请在命令前加上 $ sudo xxxx 所有Linux命令都是加粗,需要加入的文本是斜体 /* *  Ubuntu 16.04 *  u-boot-2016.05.tar.bz2 *  arm-linux-gcc-4.4.3.tar.gz */ 准备工作 1.下载u-boot,我是用的u-boot-2016.05.tar.bz2,可以自己去官网下载 下载地址, ftp://ftp.denx.de/pub/u-boot/ 2.下载arm-linux-g
[单片机]
<font color='red'>u-boot</font><font color='red'>移植</font>到s3c2440开发板(一)--建立单板
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved