将三星提供的 u-boot
移植到 GEC210开发板
一、编译u-boot
1、解压
$ tar jxvf android_uboot_smdkv210.tar.bz2
2、进入目录
$cd u-boot-samsung-dev
3、设置交叉编译器
$vi Makefile
在 147 行,使用
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 = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
148 endif
4、安装 arm-2009q3
编译器
$tar jxvf arm-2009q3.tar.bz2 -C /usr/local/arm/
5、修改串口设置文件
$vim include/configs/smdkv210single.h
将:
#define CONFIG_SERIAL3 1 /* we use UART1 on SMDKC110 */
修改为:
#define CONFIG_SERIAL1 1 /* we use UART1 on SMDKC110 */
6、配置 uboot
$make smdkv210single_config
7、编译 uboot
$make
二、修改内存
GEC210 核心板有四块 DDR2
内存芯片,每块 128MB,总共
512MB;
S5PV210 的地址映射图,S5PV210
有两个 DRAM
区域:0x20000000-0x3FFFFFFF
与
0x40000000-0x7FFFFFFF;
由 GEC210
核心板的原理图可以看出,两块 DDR 芯片按高低
16 位数据线模式挂在
DRAM0 区域,另外两块
DDR 芯片按高低
16 位数据线模式挂在
DRAM1 区域。
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
三、修改网卡
GEC210 使用 DM9000
芯片作为以太网芯片, GEC210开发板上
DM9000 芯片的片选线与
SMDKV210 评估板的不一样。
DM9000 的片选线 CS#接到了
S5PV210 的
CSn1,也就是
SROMC_BANK1,访问
DM9000的 基 址 是
0x88000000 ,
DM9000 的
CMD 接 到了 地 址 线
ADDR2 , 访 问
DM9000 数 据 的 地 址0x88000000+0b100(0x8)
。
1、修改配置参数
$vim include/configs/smdkv210single.h
将:
#define CONFIG_DM9000_BASE (0xA8000000)
修改为:
#define CONFIG_DM9000_BASE (0x88000000)
将:
#define DM9000_DATA (CONFIG_DM9000_BASE+2)
修改为:
#define DM9000_DATA (CONFIG_DM9000_BASE+8)
2、修改板级初始化文件
$vim board/samsung/smdkc110/smdkc110.c
修改 DM9000
预初始化函数 dm9000_pre_init:
static void dm9000_pre_init(void)
{
unsigned int tmp;
/* DM9000 on SROM BANK1, 16 bit */
SROM_BW_REG &= ~(0xf << 4);
SROM_BW_REG |= (0x1 << 4);
SROM_BC1_REG = ((0<<28)|(0<<24)|(5<<16)|(0<<12)|(0<<8)|(0<<4)|(0<<0));
/* Set MP01_1 as SROM_CSn[1] */
tmp = MP01CON_REG;
tmp &=~(0xf<<4);
tmp |=(2<<4);
MP01CON_REG = tmp;
}
3、重新编译
$make
四、修改 DDR0
基地址
将 DDR
的 ch0 由地址
0x20000000~0x30000000 映射到
0x30000000~0x40000000。这样
ch0 和
ch1 两个通道的
DDR 就可以连续,方便使用。
1、修改 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
2、修改虚拟地址转物理地址函数
$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
", 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
", addr);
return addr;
}
3、修改 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
五、修改 u-boot
其他设置
由于我们的开发板并不像 SMDKV210
那样拥有 16MB 的
SRAM 和电源管理芯片,所以我们还要对代码进一步修改,修改底层初始化文件:
$vim board/samsung/smdkc110/lowlevel_init.S
1、屏蔽 SRAM
初始化代码
使用条件编译屏蔽掉下面的代码:
#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
2、屏蔽初始化 PMIC
代码
$vim board/samsung/smdkc110/lowlevel_init.S
使用条件编译屏蔽掉下面的代码:
#if 0
/* init PMIC chip */
bl PMIC_InitIp
#endif
3、屏蔽 nor flash
初始化代码
$vim lib_arm/board.c
将:
#ifndef CFG_NO_FLASH
/* configure available FLASH banks */
size = flash_init ();
display_flash_config (size);
#endif /* CFG_NO_FLASH */
改为:
#define CFG_NO_FLASH
#ifndef CFG_NO_FLASH
/* configure available FLASH banks */
size = flash_init ();
display_flash_config (size);
#endif /* CFG_NO_FLASH */
六、修改 uboot
环境参数
1、修改主机名称
$vim include/configs/smdkv210single.h
修改:
#define CFG_PROMPT "GEC210 #" /* Monitor Command Prompt */
修改:
#define CONFIG_IDENT_STRING " for GEC210@2014"
2、默认网络参数配置
$vim include/configs/smdkv210single.h
修改:
#define CONFIG_ETHADDR 00:40:5c:26:0a:5a
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.1.3
#define CONFIG_SERVERIP 192.168.1.2
#define CONFIG_GATEWAYIP 192.168.1.1
3、修改驱动参数和命令
$vim include/configs/smdkv210single.h
修改为:
#define CONFIG_BOOTARGS "console=ttySAC0,115200 root=/dev/mtdblock4 rootfstype=yaffs rw"
修改为:
#define CONFIG_BOOTCOMMAND "nand read 0x30008000 0x600000 0x500000; bootm 0x30008000"
4、增加 uboot
命令补全功能
$vim include/configs/smdkv210single.h
增加:
#define CONFIG_AUTO_COMPLETE 1
5、编译
$make
七、固化 u-boot
注意:当将新编译生成的 u-boot.bin
固化到 nand 中时,会破坏原
nand 中的
u-boot。所以最好是将新编译的u-boot.bin
固化到 SD
卡启动卡中,测试没有问题后,再固化到 nand
中。
以下操作在 uboot
的命令行中完成。
1、使用 tftp
下载新生成的 u-boot.bin
# tftp 0x40000000 u-boot.bin
2、擦除 uboot
存放位置
# nand erase 0 0x100000
NAND erase: device 0 offset 0x0, size 0x100000
Erasing at 0x100000 -- 100% complete.
OK
3、将 uboot
写入 nand
# nand write 0x40000000 0 0x100000
把u-boot.bin烧写到sd里去:
把sd卡接上读卡器后, 接到pc, 接上后
在pc的/dev/目录下会出现
sdb sdb1 //此设备文件名不一定是这样的, 也可能是sdc sdc1
sdb表示整个sd卡, sdb1表示卡上一个分区
u-boot-smdkv210/sd_fusing下有个烧写的脚本sd_fusing.sh
在sd_fushing目录下运行
./sd_fusing.sh /dev/sdb
运行完后, u-boot.bin已烧到sd卡上了
把sd卡接到开发板,从sd卡启动