基于s5pv210的Uboot配置--Uboot篇

U-Boot简介

每个操作系统都需要一个引导程序,如下表所示,是几种Linux支持的引导程序,目前还没有做到可以适应全部嵌入式产品的引导程序,所以只能尽量的让一个Boot Loader 代码支持多种不同的构架和操作系统,并让它有很好的可移植性。而U-boot 就是一个支持多平台多操作系统的引导程序,这也是U-boot 的优势所在,而且U-boot 的代码是开源的,对于新功能的添加也十分容易。

                                                               表3-1 Linux系统可以的BootLoader

Bootloader

Monitor

描述

X86

ARM

PC

LILO

Linux磁盘引导程序

GRUB

GNU的LILO代替程序

Loading

从DOS引导Linux

ROLO

从ROM引导Linux而不需要BIOS

LinuxBOIS

完全代替BUS的Linux引导程序

BLOB

LART等硬件平台的引导程序

U-Boot

通用引导程序

RedBoot

基于eCos的引导程序

 

U-Boot移植

本人的开发环境是window10、VMWare 12.5.2和Ubuntu 16.04,为GEC210移植uboot的具体操作如下:

(1)从三星官网下载uboot源码smdkv210.tar.bz2,在虚拟机上解压。.

(2)因为需要移植到GEC210,所以需要安装交叉编译器,下载安装包然后解压。

(3)得到了uboot的源码,进入解压后的文件根据自己的环境配置Makefile,设置好刚才解压的交叉编译器的绝对路径,将CROSS_COMPILE变量修改成自己的路径:

CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-

(4)修改串口设置文件和网络配置,因为开发板中用于与主机通讯的串口为UART1,修改smdkv210single.h文件:

将:

#define CONFIG_SERIAL3

#define CONFIG_DM9000_BASE (0xA8000000)

#define DM9000_DATA (CONFIG_DM9000_BASE+2)

修改为:

#define CONFIG_SERIAL1

#define CONFIG_DM9000_BASE (0x88000000)

#define DM9000_DATA (CONFIG_DM9000_BASE+8)

(5)GEC210 核心板有512MB的 DDR内存芯片,如下表所示的地址映射表S5PV210 有两个 DRAM 区域:0x20000000-0x3FFFFFFF 与0x40000000-0x7FFFFFFF,所以需要修改一下DDR参数,还是在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_2都屏蔽掉

 

                                                          表3-2 地址映射表

IROM & IRAM &Reserved

0x00000000~0x1FFFFFFF

DRAM0

0x20000000~0x3FFFFFFF

DRAM1

0x40000000~0x7FFFFFFF

SROMC_BANK0 & SROMC_BANK1

0x80000000~0x8FFFFFFF

SROMC_BANK2 & SROMC_BANK3

0x90000000~0x9FFFFFFF

SROMC_BANK4 & SROMC_BANK5

0xA0000000~0xAFFFFFFF

ONENAND/NAND

0xB0000000~0xBFFFFFFF

Low Power Audio SRAM

0xC0000000~0xCFFFFFFF

(6)修改cpu目录下的s5pc11x目录下的s5pc110目录下的cpu_init.S CPU初始化文件,将ldr r1, =0x00212400修改为 ldr r1, =DMC0_MEMCONTROL,即上面的0x00202400。

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

 

(7) 修改网卡板级初始化文件,修改board目录下的samsung目录下的smdkc110目录下的smdkc110.c文件,修改DM9000预初始化函数dm9000_pre_init:

 $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)|(1<<24)|(5<<16)|(1<<12)|(4<<8)|(6<<4)|(0<<0));
  /* Set MP01_1 as SROM_CSn[1] */
  tmp = MP01CON_REG;
  tmp &=~(0xf<<4);
  tmp |=(2<<4);
  MP01CON_REG = tmp;
}

(8)修改DDR0的基地址和配置寄存器将 DDR 的 ch0 由地址 0x20000000~0x30000000 映射到 0x30000000~0x40000000。修改include目录下的configs目录下的smdkv210single.h,将:

#define MEMORY_BASE_ADDRESS 0x20000000

#define DMC0_MEMCONFIG_0 0x20F00313

改为:

#define MEMORY_BASE_ADDRESS 0x30000000

#define DMC0_MEMCONFIG_0 0x30F00313

(9)修改虚拟地址转物理地址函数,打开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;

}

(10)修改 MMU 转换表,打开board目录下的samsung目录下的smdkc110目录下的lowlevel_init.S文件,将:

.set __base,0x200

.rept 0xD00 - 0xC00

FL_SECTION_ENTRY __base,3,0,1,1

.set __base,__base+1

.endr

改为:

.set __base,0x300

.rept 0xD00 - 0xC00

FL_SECTION_ENTRY __base,3,0,1,1

.set __base,__base+1

.endr

(11)因为本设计的开发板没有SRAM 和电源管理芯片,所以需要屏蔽SRAM初始化代码和PMIC 代码,还是打开lowlevel_init.S文件,屏蔽掉PMIC_InitIp这一行代码,然后使用条件编译屏蔽掉下面的代码:

#if 0

ldr r0, =ELFIN_GPIO_BASE

……省略部分代码……

ldr r1, [r0]

orr r1, r1, #0x300

orr r1, r1, #0x1

str r1, [r0]

#endif

(12)屏蔽 nor flash 初始化代码,打开lib_arm目录下的board.c文件,将:

#ifndef CFG_NO_FLASH

size = flash_init ();

display_flash_config (size);

#endif

改为:

#define CFG_NO_FLASH

#ifndef CFG_NO_FLASH

size = flash_init ();

display_flash_config (size);

#endif

(13)修改 uboot 环境参数

(1  修改主机名称

$vim include/configs/smdkv210single.h

修改主机名称:

#define CFG_PROMPT "GEC210 #" /* Monitor Command Prompt */

改为:

#define CONFIG_IDENT_STRING " for GEC210V1@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 "root=/dev/nfs init=/linuxrc nfsroot=192.168.1.141:/home/student/workdir/rootfs ip=192.168.1.20:192.168.1.141:192.168.1.1:255.255.255.0::eth0:on console=ttySAC0,115200"

(14).编译

make smdkv210single_config

make //生成u-boot.bin

将U-Boot烧到开发板上测试

使用tftp将u-boot.bin下载到开发板,然后从0地址擦除大小为1M的内容,存放的地址是根据uboot里维护了一份分区表,内核里面维护了一份分区表,这两份分区表必须一样,本设计的分区表如下表所示。最后使用命令nand erase 0 0x100000将uboot写入nand flash中。做好以上的工作后,uboot的移植就成功完成了,当重新上电后,uboot正常启动会根据默认设置来启动内核。

                                                              内核和uboot共同维护的分区表

分区名

起始地址

结束地址

大小

Uboot

0x000000000000

0x000000100000

0x000000100000 1MB

Recovery

0x000000100000

0x000000600000

0x000000500000 5MB

Kernel

0x000000600000

0x000000b00000

0x000000500000 5MB

Ramdisk

0x000000b00000

0x000000e00000

0x000000300000 3MB

Root

0x000000e00000

0x000020000000

0x00001F200000 498MB

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
s5pv210是一款基于ARM Cortex-A8内核的单片机,它广泛应用于嵌入式系统和智能设备中。而uboot是一种开放源代码的引导加载器,用于嵌入式系统中启动和控制硬件。 要进行s5pv210 uboot的下载,我们首先需要准备一个可用的开发环境。这包括一台支持Linux操作系统的计算机,并具备编译工具链、串口线等硬件设备。 第一步,我们需要从uboot的官方网站(http://www.denx.de/wiki/U-Boot)下载最新版本的uboot源代码。将源代码下载到本地计算机的一个目录中。 第二步,进入源代码所在的目录中,打开终端窗口,使用交叉编译工具链来编译uboot。交叉编译工具链是为了将源代码编译为适用于s5pv210架构的可执行程序。具体的编译命令可以在uboot的文档中找到。 第三步,编译完成后,在目录下生成了一个u-boot.bin的可执行文件。将这个文件通过串口线连接到s5pv210开发板上。 第四步,通过终端窗口进入串口终端模式,与s5pv210开发板建立串口通信。在终端中输入相关命令,如设置串口参数、选择烧录工具等。 第五步,选择合适的烧录工具,将编译好的u-boot.bin文件烧录到s5pv210开发板的存储设备中。具体的烧录工具和操作步骤视具体情况而定。 最后,当烧录完成后,重新启动s5pv210开发板,即可加载新的uboot固件并运行。此时,uboot将能够初始化和配置硬件设备,并提供启动操作系统的功能。 总结起来,s5pv210 uboot的下载过程主要包括源代码的获取、交叉编译、烧录和启动等步骤。这样就能够成功将uboot固件加载到s5pv210开发板上,为后续的操作系统启动提供支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值