超详细uboot的移植(GEC210开发板)

来源:互联网 发布:mac上的ps软件多少钱 编辑:程序博客网 时间:2024/06/06 01:05

uboot的移植是一个挺麻烦的过程,很多初学者都对此感到一头雾水,本文以GEC210开发板为例来介绍一下uboot的移植过程。首先介绍一下什么是移植。

一、概念和条件

将别人发布的源码做修改(针对自己的开发平台),然后让这段代码在自己的平台上运行。

移植的目标是GEC210ARM开发板,移植的源码是samsung公司的smdkv210开发板的源码。

 移植的条件:移植的源码所支持的cpu要和移植目标的cpu一致,否则移植时需要改动过的代码太多,很难成功。

二、移植前的准备工作

1、安装交叉编译工具链

本次所下载的源码是android_uboot_smdkv210.tar.bz2

1)、将交叉编译工具链copy到/usr/local/arm目录下

2)、交叉编译工具链是压缩文件需要解压,tar   -jxvf   android_uboot_smdkv210.tar.bz2

3)、vim   Makefile  检查 CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-    的路径是否与工具链安装的路径一致。

2、下载适用的源码

下载的来源有CPU的官方网站/代理商或者第三方:粤嵌、友善之臂、天嵌

三、uboot移植过程

uboot的移植是根据分析SMDKV210与GEC210两块电子板原理图的差异,针对差异做修改,完成移植的。下面来具体讲解移植的详细步骤。

1、修改串口设置文件

SMDKV210使用的是串口控制台是串口3,而GEC210使用的是是串口1,要将源码中的串口控制台修改为串口2.

1)、$vim include/configs/smdkv210single.h

2)、将#define CONFIG_SERIAL3  修改为:#define CONFIG_SERIAL1

2、针对特定平台(GEC210)做uboot源码的配置

1)、从Makefile中查找配置入口,smdkv210single_config :unconfig

2)、$make smdkv210single_config

3、编译 uboot

make

4、修改内存配置

两块电路板的内存情况如下:

SMDKV210 :ch0:512MB   8bits * 4 
              ch1:512MB   8bits * 4 


       GEC210: ch0:256MB  16bits*2
                            ch1:256MB  16bits*2

从上面可以看出SMDKV210 的内存有两个通道映射的,两块的内存分别是512MB,由影射图可知他们的地址分别是:0x20000000和0x40000000

GEC210的内存也有两个通道,两块的内存大小是256MB,由影射图可知他们的地址分别是0x20000000和0x40000000,由于ch0只有256MB所有GEC210的内存是不连续的,故需要将其映射到连续的区域,这样当ch0溢出时会自动溢出到ch1中所映射的内存中。如图,映射后的情况如下图中的最后一个示意图。根据ch0占256MB可知ch0映射后的基地址是0x30000000,所以修改源码时要将基地址改为0x30000000,即#define  MEMORY_BASE_ADDRESS   0x30000000 ,此外还要加上第二个通道的基地址,#define   MEMORY_BASE_ADDRESS    0x40000000  。



具体操作如下:

1 修改 DDR  参数文件
$vim include/configs/smdkv210single.h
加入:
#define MEMORY_BASE_ADDRESS1 0x40000000
#define DMC0_MEMCONTROL 0x00202400
修改:
#define DMC0_MEMCONFIG_0 0x20F00313
#define DMC0_MEMCONFIG_1 0x00F00313
#define DMC1_MEMCONTROL 0x00202400
#define DMC1_MEMCONFIG_0 0x40F00313
#define DMC1_MEMCONFIG_1 0x00F00313
#define SDRAM_BANK_SIZE 0x10000000 /* 256 MB */
#define PHYS_SDRAM_2 (MEMORY_BASE_ADDRESS1) /* SDRAM Bank #2 */

2 、修改 CPU  初始化文件

$vim cpu/s5pc11x/s5pc110/cpu_init.S
将 122 行:
ldr r1, =0x00212400
修改为:
ldr r1, =DMC0_MEMCONTROL

3 、修改 DDR0  的基地址和配置寄存器
$vim include/configs/smdkv210single.h
将:
#define MEMORY_BASE_ADDRESS 0x20000000
改为:
#define MEMORY_BASE_ADDRESS 0x30000000

#define DMC0_MEMCONFIG_0 0x20F00313 // MemConfig0
改为
#define DMC0_MEMCONFIG_0 0x30F00313 // MemConfig0

4、修改虚拟地址转物理地址函数
$vim board/samsung/smdkc110/smdkc110.c

#ifdef CONFIG_MCP_SINGLE
ulong virt_to_phy_smdkc110(ulong addr)
{
if ((0xc0000000 <= addr) && (addr < 0xd0000000))
return (addr - 0xc0000000 + 0x20000000);
else
printf("The input address don't need "\
"a virtual-to-physical translation : %08lx\n", addr);
return addr;
}
改为
#ifdef CONFIG_MCP_SINGLE
ulong virt_to_phy_smdkc110(ulong addr)
{
if ((0xc0000000 <= addr) && (addr < 0xd0000000))
return (addr - 0xc0000000 + MEMORY_BASE_ADDRESS);
else
printf("The input address don't need a virtual-to-physical translation : %08lx\n", addr);
return addr;
}

5、修改 MMU 转换表
$vim board/samsung/smdkc110/lowlevel_init.S
将:
.set __base,0x200
// 256MB for SDRAM with cacheable
.rept 0xD00 - 0xC00
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
.endr
改为:
.set __base,0x300
// 256MB for SDRAM with cacheable
.rept 0xD00 - 0xC00
FL_SECTION_ENTRY __base,3,0,1,1
.set __base,__base+1
.endr
















0 0
原创粉丝点击