嵌入式linux开发uboot移植(七)——三星官方uboot的移植

嵌入式linux开发uboot移植(七)——三星官方uboot的移植

友善之臂Smart210开发板是基于三星SMDKV210评估板裁剪、调整而来的。因此三星官方发布的基于SMDKV210评估板的uboot是移植uboot到Smart210开发板的最合适uboot版本。本文将SMDKV210的uboot移植到Smart210开发板。Smart210开发板的配置如下:

SoC:Samsung S5PV210

SDRAM:512MB DDR2 RAM

FLASH存储:2G MLC NAND Flash

一、uboot工程项目目录的剪裁

由于SMDKV210的uboot是针对SPV210芯片的,并且uboot工程内部保留了大量针对多种CPU架构和SoC的目录,因此需要将和S5PV210无关的目录剪裁删除。删除的目录、文件包括:

1、uboot工程根目录下与Smart210开发板无关的目录

删除下列目录onenand_ipl、onenand_bl1、lib_avr32、lib_blackfin、lib_i386、lib_m68k、lib_mips、lib_microblaze、lib_nios、lib_nios2、lib_ppc、lib_sh、lib_sparc。

2、board目录下与Smart210无关目录的删除

删除board目录下除samsung以外的所有目录

3、cpu目录下与Smart210无关目录的删除

删除cpu目录下除s5pc11x目录外的所有目录

4、include目录下与Smart210无关目录的删除

删除include目录下的asm-avr32、asm-blackfin、asm-i386、asm-m68k、asm-sh、asm-microblaze、asm-mips、asm-nios、asm-nios2、asm-ppc、asm-sparc目录

删除include/aasm-arm目录下的arch-arm720t、arch-arm925t、arch-arm926ejs、arch-at91rm9200、arch-at91sam9、arch-davinci、arch-imx、arch-ixp、arch-ks8695、arch-lpc2292、arch-mx31、arch-omap、arch-omap24xx、arch-pxa、arch-s3c24x0、arch-s3c24xx、arch-s3c44b0、arch-s3c64xx、arch-s5p64xx、arch-s5p644x、arch-s5pc1xx、arch-sa1100目录

5、uboot的Makefile文件的修改

找到Makefile中arm交叉编译器相关部分

ifeq ($(ARCH),arm)

#CROSS_COMPILE = arm-linux-

#CROSS_COMPILE = /usr/local/arm/4.4.1-eabi-cortex-a8/usr/bin/arm-linux-

#CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-

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

endif

修改交叉编译器:

ifeq ($(ARCH),arm)

CROSS_COMPILE = arm-linux-

#CROSS_COMPILE = /usr/local/arm/4.4.1-eabi-cortex-a8/usr/bin/arm-linux-

#CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-

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

endif

6、查找Makefile中与Smart210相关的配置

smdkv210single_config :unconfig

@$(MKCONFIG) $(@:_config=) arm s5pc11x smdkc110 samsung s5pc110

@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/smdkc110/config.mk

二、uboot工程项目的移植

通过对uboot工程的目录的剪裁,Makefile文件的修改查阅知道,uboot工程的编译命令如下:

make distclean;

make smdkv210single_config;

make -j4;

1、编译剪裁目录后的uboot工程

在对uboot工程目录进行剪裁后编译uboot:

make distclean;

make smdkv210single_config;

make -j4;

实验过程中发现uboot编译成功,但是串口没有输出信息,开发板无任何报警声音,电源灯正常,表明供电锁存是正常的。

2、PMIC模块的修改

由于开发板供电锁存是正常的,进入uboot工程中的start.S文件查阅lowlevel_init查阅供电锁存后的代码,发现Smart210无PMIC模块,将其注释。

/* init PMIC chip */

//bl PMIC_InitIp

编译后烧录发现,仍然没有任何串口信息输出。使用点亮led灯的方式对uboot在lowlevel_init阶段中的串口初始化打印’O’和’K’前后分别加入点亮led灯的汇编代码,发现作为调试使用的四个Led灯都能点亮。表明串口的初始化输出是没有问题的,不过没有输出到开发板连接的当前串口中。

3、修改串口输出

修改开发板配置的头文件include/configs/smdkv210single.h

找到串口端口的相关定义部分:

#define CONFIG_SERIAL3          1/* we use UART1 on SMDKC110 */

发现SMDKV210开发板默认使用串口COM3输出,而Smart210使用COM0输出,需要修改为:

#define CONFIG_SERIAL1          1/* we use UART1 on Smart210 */

编译工程后烧录u-boot.bin到SD卡启动运行,发现uboot已经正常打印出uboot启动的串口信息。但是DRAM显示的大小是错误的。

OK

U-Boot 1.3.4 (Jun 25 2016 - 03:29:22) for SMDKV210

CPU:  [email protected](OK)

APLL = 1000MHz, HclkMsys = 200MHz, PclkMsys = 100MHz

MPLL = 667MHz, EPLL = 80MHz

HclkDsys = 166MHz, PclkDsys = 83MHz

HclkPsys = 133MHz, PclkPsys = 66MHz

SCLKA2M  = 200MHz

Serial = CLKUART

Board:   SMDKV210

DRAM:     0 kB

Flash:   8 MB

SD/MMC:  7580MB

NAND:    512 MB

The input address don‘t need a virtual-to-physical translation : 23e9d2a0

*** Warning - using default environment

In:      serial

Out:     serial

Err:     serial

checking mode for fastboot ...

4、修改内存配置信息

查阅Smart210核心板电路原理图,找到DDR相关部分,S5PV210有两个内存端口,分别为DRAM0和DRAM1,对应地址范围如下:

DRAM0:0x20000000——0x3FFFFFFF512MB

DRAM1:0x40000000——0x7FFFFFFF1024MB

Smart210开发板共有四片128MB的内存芯片,每片芯片有14根地址线Xm1ADDR[13:0],8根数据线Xm1DATA[7:0],其余为控制总线。

四片内存芯片并联后逻辑上只是一片内存芯片,大小为512MB,数据线为Xm1DATA[31:0],地址线不变Xm1ADDR[13:0]。根据DRAM原理图的片选引脚nCS、CKE、nWE选择知道,smart210开发板的四片内存芯片挂接到DMC0。

DRAM0:0x20000000——0x3FFFFFFF512MB

修改开发板头文件include/configs/smdkv210single.h 配置信息:

#define MEMORY_BASE_ADDRESS      0x20000000

#define DMC0_MEMCONTROL         0x00202400

#define DMC0_MEMCONFIG_0         0x20E00323

#define DMC0_MEMCONFIG_1         0x40F00323

#define DMC1_MEMCONTROL          0x00202400

#define DMC1_MEMCONFIG_0         0x40F00313

#define DMC1_MEMCONFIG_1         0x00F00313

#define SDRAM_BANK_SIZE          0x20000000  /* 512 MB */

#define CONFIG_NR_DRAM_BANKS    1        /* we have 1 bank of DRAM */

#if 0

#define PHYS_SDRAM_2         (MEMORY_BASE_ADDRESS + SDRAM_BANK_SIZE) /* SDRAM Bank #2 */

#define PHYS_SDRAM_2_SIZE    SDRAM_BANK_SIZE

#endif

修改cpu/s5pc11x/s5pc110/cpu_init.S文件:

ldr  r1, =0x00212400 //122行

修改为在smdkv210single.h头文件中定义的内容:

ldr  r1, =DMC0_MEMCONTROL

5、网卡驱动的移植

根据Smart210开发板底板电路原理图DM9000网卡的电路原理图可知,DM9000的片选线CS#接到了S5PV210的CSn1,即SROMC_BANK1,基地址为0x88000000。DM9000的CMD接到了地址线ADDR2,访问DM9000数据的地址0x88000000+0b100(0x8,ADDR2为高电平1)。DM9000的数据线与地址线复用,根据CMD引脚的电平信号确定传输的是数据还是地址,CMD为高电平为传输数据,CMD为低电平时传输地址。

网卡电路原理图如下:

修改uboot中开发板配置头文件include/configs/smdkv210single.h

#define CONFIG_DM9000_BASE(0xA8000000)

#define DM9000_DATA(CONFIG_DM9000_BASE+2)

修改为:

#define CONFIG_DM9000_BASE(0x88000000)

#define DM9000_DATA(CONFIG_DM9000_BASE+8)

对DM9000网卡进行初始化:

根据三星官方文档S5PV210_UM_REV1.1中的SROM控制器修改board/samsung/smdkc110/smdkc110.c文件中dm9000_pre_init函数

static void dm9000_pre_init(void)

{

unsigned int tmp;

#if defined(DM9000_16BIT_DATA)

//SROM_BW_REG &= ~(0xf << 20);

SROM_BW_REG &= ~(0xf << 4);

SROM_BW_REG |= (0x1 << 4);

//SROM_BW_REG |= (0<<23) | (0<<22) | (0<<21) | (1<<20);

#else

SROM_BW_REG &= ~(0xf << 20);

SROM_BW_REG |= (0<<19) | (0<<18) | (0<<16);

#endif

//SROM_BC5_REG = ((0<<28)|(1<<24)|(5<<16)|(1<<12)|(4<<8)|(6<<4)|(0<<0));

SROM_BC1_REG = ((0<<28)|(0<<24)|(5<<16)|(0<<12)|(0<<8)|(0<<4)|(0<<0));

tmp = MP01CON_REG;

//tmp &=~(0xf<<20);

tmp &=~(0xf<<4);

//tmp |=(2<<20);

tmp |=(2<<4);

MP01CON_REG = tmp;

}

S5PV210的地址分配表:

本文主要阐述了将三星SMDKV210开发板版本uboot移植到Smart210开发板的过程,但相对粗简,如果需要更精细的移植则需要做更深入的研究。

时间: 2024-12-07 00:22:32

嵌入式linux开发uboot移植(七)——三星官方uboot的移植的相关文章

嵌入式linux开发uboot移植(五)——uboot命令体系

嵌入式linux开发uboot移植(五)--uboot命令体系 本文将根据SMDKV210开发板的三星官方uboot源码分析uboot的命令体系.内容 包括uboot的命令体系的实现机制,uboot命令是如何执行的,以及如何在uboot中添加一个自定义的命令. 一.uboot命令体系简介 uboot命令体系代码放在uboot/common中,包括cmd_xxx.c.command.c .main.c源码文件.uboot实现命令体系的方法是每一个uboot命令对应一个函数,与shell的实现是一致

嵌入式linux开发uboot移植(二)——uboot工程源码目录分析

嵌入式linux开发uboot移植(二)--uboot工程源码目录分析 本文分析的uboot为uboot_smdkv210,是三星官方发布的基于S5PV210评估开发板对应的uboot. 一.uboot源码目录结构解析 1.cpu 本文件夹下的子文件与处理器相关,每个文件夹代表一种CPU系列.每个子目录中都包括cpu.c.interrupts.c.start.S文件. cpu.c主要用于初始化CPU.设置指令Cache和数据Cache等 interrupt.c主要用于设置系统的各种中断和异常 s

嵌入式linux开发uboot移植(三)——uboot启动过程源码分析

嵌入式linux开发uboot移植(三)--uboot启动过程源码分析 一.uboot启动流程简介 与大多数BootLoader一样,uboot的启动过程分为BL1和BL2两个阶段.BL1阶段通常是开发板的配置等设备初始化代码,需要依赖依赖于SoC体系结构,通常用汇编语言来实现:BL2阶段主要是对外部设备如网卡.Flash等的初始化以及uboot命令集等的自身实现,通常用C语言来实现. 1.BL1阶段 uboot的BL1阶段代码通常放在start.s文件中,用汇编语言实现,其主要代码功能如下:

嵌入式linux开发uboot移植(四)——uboot启动内核的机制

嵌入式linux开发uboot移植(四)--uboot启动内核的机制 一.嵌入式系统的分区 嵌入式系统部署在Flash设备上时,对于不同SoC和Flash设备,bootloader.kernel.rootfs的分区是不同的.三星S5PV210规定启动设备的分区方案如下: SD/MMC设备的分区方案: NandFlash设备的分区方案: 嵌入式系统在启动时,uboot.kernel.rootfs不能随意存放,必须存放在规划好的相应分区,在启动过程中uboot.kernel会到相应分区加载相应内容,

嵌入式linux开发uboot移植(一)——uboot项目简介

嵌入式linux开发uboot移植(一)--uboot项目简介 一.uboot简介 U-Boot,全称 Universal Boot Loader,是遵循GPL条款的从FADSROM.8xxROM.PPCBOOT逐步发展演化而来的开放源码项目. 在操作系统方面,U-Boot不仅支持嵌入式Linux系统的引导,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS, android嵌入式操作系统.目前支持的目标操作系统是OpenBSD, NetBSD, Fre

嵌入式 Linux开发Kernel移植(三)——Kernel工程Makefile分析

嵌入式 Linux开发Kernel移植(三)--Kernel工程Makefile分析 本文选择三星发布的基于SMDKV210开发板的linux 2.6.35.7版本kernel. 一.Kernel Makefle体系简介 1.Kernel Makefile体系组成 Kernel Makefile体系包含Kconfig和Kbuild两个系统. Kconfig系统 Kconfig 对应的是内核配置阶段,make xxconfig就是在使用Kconfig系统.Kconfig由三部分组成: script

向嵌入式linux开发板移植openSSH

向嵌入式linux开发板移植openSSH 晚上没事干,想着能不能把高大上的openSSH移植到我现在开发的嵌入式linux开发板上,前不久刚弄出来dropbear,但遇到一些小问题,一会说,所以把openSSH搞上去还是可以的.开发板端为服务器端,由宿主机客户端访问. 2016-8-16 背景 开发板:freescale i.mx6q 宿主机操作系统:ubuntu 14.04 开发板操作系统:linux 3.0.35 基本情况 使用dropbear后,ssh算是在板子上成功跑起来了,参见我另一

嵌入式 Linux开发Kernel移植(二)——kernel内核配置和编译

嵌入式 Linux开发Kernel移植(二)--kernel内核配置和编译 本文选择linux 2.6.35.7版本kernel进行实践. 一.linux kernel源码目录分析 Kbuild,Kernel Build,管理内核编译的文件 Makefile,kernel工程的Makefile. arch,体系架构,arch目录下的子目录存放的是不同种类的架构 block,块设备,一般是存储设备,存放的块设备管理的相关代码 crypto,加密相关,存放加密算法实现代码 Documentation

嵌入式 Linux开发Kernel移植(一)——kernel内核简介

嵌入式 Linux开发Kernel移植(一)--kernel内核简介 一.Linux Kernel 1.linux kernel简介 Linux kernel是芬兰黑客 Linus Torvalds 1991年在英特尔x86架构上用C语言开发的自由免费的符合POSIX标准的类Unix操作系统. Linux kernel是一个一体化内核(monolithic kernel)系统,提供硬件抽象层.磁盘及文件系统控制.多任务等功能的系统软件,不是一套完整的操作系统. 内核空间与用户空间是程序执行的两种