超详细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
- 超详细uboot的移植(GEC210开发板)
- 移植官方uboot到GEC210开发板
- 移植boa服务器到gec210开发板
- 详细解析uboot移植(针对开发板mini2440)
- 2440超详细uboot移植笔记(四)------剪裁uboot
- 2440超详细uboot移植笔记(十二)------移植网卡驱动
- (转)uboot移植到S3C44B0X开发板的经历
- 2440超详细uboot移植笔记(一)------分析源码
- 2440超详细uboot移植笔记(二)------新建单板
- 2440超详细uboot移植笔记(五)------设置时钟
- 2440超详细uboot移植笔记(六)------修改内存控制器
- 2440超详细uboot移植笔记(七)------去掉 "-pie"选项
- 2440超详细uboot移植笔记(八)------支持NAND启动
- 2440超详细uboot移植笔记(九)------修改错误
- 2440超详细uboot移植笔记(十)------支持NOR FLASH
- 2440超详细uboot移植笔记(十一)------支持NAND FLASH
- 2440超详细uboot移植笔记(十四)------设置MTD分区
- 2440超详细uboot移植笔记(十五)------支持YAFFFS文件系统
- zynq虐我千百遍——第3篇 Linaro之kernel
- 从编译原理的角度理解面向对象----0
- 实习生入职第一天感想与收获
- 每天一个linux命令(60):scp命令
- iOS(iPhone,iPad))开发(Objective-C)开发库常用库索引
- 超详细uboot的移植(GEC210开发板)
- java中如何运行jar文件
- VMware中centos6的网络配置
- 栈的程序演示
- 第六章总结
- 如何禁用防火墙激活CleanMyMac 3
- ZOJ 2770 Burn the Linked Camp( 差分约束啊 )
- 数据库性能优化(MySQL)
- loadView和viewDidLoad的用法