移植u-boot到GEC210
一、 编译u-boot
国内嵌入式厂商研发的S5PV210开发板大都基于SMDKV210评估板做了减法和调整,所以三星提供的u-boot、内核、文件系统大都适用于这些S5PV210开发板,我们就将三星提供的u-boot移植到GEC210开发板,提高起点,降低难度。
1. 解压:
tar jxvf android_uboot_smdkv210.tar.bz2 -C /home/
进入目录:
cd /home/u-boot-samsung-dev
2. 安装交叉编译器: Vim Makefile
在147行,我们发现u-boot使用arm-2009q3编译器: 143 ifeq ($(ARCH),arm)
144 #CROSS_COMPILE = arm-linux-
145 #CROSS_COMPILE = /usr/local/arm/4.4.1-eabi-cortex-a8/usr/bin/arm-linux- 146 #CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux- 147 CROSS_COMPILE =arm-none-linux-gnueabi-
148 endif
安装编译器:
#tar zxvf arm_gcc-4.4.1.tar.gz -C /usr/local/ 设置环境变量
vim /etc/bash.bashrc
#export PATH=/usr/local/4.4.1/bin:$PATH #source /etc/bash.bashrc
3. 修改配置文件:
vim include/configs/smdkv210single.h
将:
#define CONFIG_SERIAL3 1 /* we use UART1 on SMDKC110 */
修改为:
#define CONFIG_SERIAL1 1 /* we use UART1 on SMDKC110 */
4. 配置:
make smdkv210single_config
5. 编译: make -j 2
编译完毕后可以得到u-boot.bin。 6. 下载运行:(dnw下载不了的话,接着后面的步骤,将u-boot烧写到SD里面启动) 将GEC210开发板的启动方式开关打到SD--BOOT一侧,连接好USB下载线,打开DNW.exe,然后复位开发板。几秒后窗口上方的USB:X应该会变成USB:OK,如下:
下载gec210_usb.bin到0xd0020010地址: 初始化DDR内存
下载完毕后,USB连接会自动断开并再次自动连接上,再下载u-boot.bin到0x23e00000地址,下面是串口的输出:
U-Boot 1.3.4 (Jan 17 2013 - 10:51:36) for SMDKV210
CPU: S5PV210@1000MHz(OK)
APLL = 1000MHz, HclkMsys = 200MHz, PclkMsys = 100MHz MPLL = 667MHz, EPLL = 96MHz
HclkDsys = 166MHz, PclkDsys = 83MHz HclkPsys = 133MHz, PclkPsys = 66MHz SCLKA2M = 200MHz Serial = CLKUART Board: SMDKV210 DRAM: 1 GB Flash: 8 MB
SD/MMC: Card init fail! 0 MB
NAND: 256 MB
*** Warning - using default environment
In: serial Out: serial Err: serial
checking mode for fastboot ... Hit any key to stop autoboot: 0
SMDKV210 #
可以成功运行,S5PV210运行在1GHz,但认出来的DRAM大小(内存总数)有误。
二、 修改内存
我们的GEC210核心板有四块DDR2内存芯片,每块128MB,总共512MB:
我们再来看看S5PV210的地址映射图,S5PV210有两个DRAM区域:0x20000000-0x3FFFFFFF与0x40000000-0x7FFFFFFF:
由GEC210核心板的原理图可以看出,两块DDR芯片按高低16位数据线模式挂在DRAM0区域,另外两块DDR芯片按高低16位数据线模式挂在DRAM1区域。
由于DDR0映射起始地址Start 0x20000000 size 0x10000000 Hole 0x10000000
DDR1映射起始地址 Start 0x40000000 size 0x10000000
1. 修改配置文件:
vim include/configs/smdkv210single.h 加入:
32 #define MEMORY_BASE_ADDRESS1 0x40000000 33 #define DMC0_MEMCONTROL 0x00202400
修改:
410 #define DMC0_MEMCONFIG_0 0x20F00313 在vim cpu/s5pc11x/s5pc110/cpu_init.S 125调用到 ,在datasheet里面614可以查看到 411 #define DMC0_MEMCONFIG_1 0x00F00313
417 #define DMC1_MEMCONTROL 0x00202400 418 #define DMC1_MEMCONFIG_0 0x40F00313
419 #define DMC1_MEMCONFIG_1 0x00F00313
471 #define SDRAM_BANK_SIZE 0x10000000 /* 256 MB */
474 #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. 重新编译: #make
三、去掉SRAM电源管理芯片
由于我们的开发板并不像SMDKV210那样拥有16MB的SRAM和电源管理芯片,所以我们还要对代码进一步修改,修改底层初始化文件: vim board/samsung/smdkc110/lowlevel_init.S 使用条件编译屏蔽掉下面的代码:
#if 0
/* SRAM(2MB) init for SMDKC110 */ /* GPJ1 SROM_ADDR_16to21 */ ldr r0, =ELFIN_GPIO_BASE ……省略部分代码……
/* PS_HOLD pin(GPH0_0) set to high */
ldr r0, =(ELFIN_CLOCK_POWER_BASE + PS_HOLD_CONTROL_OFFSET) ldr r1, [r0]
orr r1, r1, #0x300 orr r1, r1, #0x1 str r1, [r0] #endif
使用条件编译屏蔽掉下面的代码:
#if 0
/* init PMIC chip */ bl PMIC_InitIp #endif
4. 重新编译: #make
5.制作SD启动,将sd连接到ubuntu里面 在u-boot源码目录下,进入sd_fusing # cd sd_fusing
编译 #make
# ./sd_fusing.sh /dev/sdb