移植u-boot到GEC210

来源:互联网 发布:卡巴斯基软件和nod软件 编辑:程序博客网 时间:2024/04/30 01:23

将三星提供的 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+0b1000x8) 。

 

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\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;

}

 

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卡启动

0 0