嵌入式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

wKioL1dwgDKScT0mAAHzn_-eH5g349.png

 

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

wKioL1dwgGWTm0ZWAAEnbkDJTQ8352.png

 

四片内存芯片并联后逻辑上只是一片内存芯片,大小为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为低电平时传输地址。

网卡电路原理图如下:

wKioL1dwgI6Dqy_2AADcdd8pT50534.png

修改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的地址分配表:

wKioL1dwgLDwtEThAAG260aGWf8232.png

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