嵌入式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: S5PV210@1000MHz(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开发板的过程,但相对粗简,如果需要更精细的移植则需要做更深入的研究。