本文主要目的是如何从0编译和移植uboot,增加串口、网络、emmc等功能,让他支持exynos4412开发板。

一、移植步骤1.Uboot配置

指定交叉编译工具链进入uboot代码根目录

nbsp;

修改Makefile在

ifeq($(HOSTARCH),$(ARCH))CROSS_COMPILE?=if

下添加

ifeq(arm,$(ARCH))CROSS_COMPILE?=arm-none-linux-gnueabi-if


交叉编译工具


指定产品CPU我们产品用的CPU是exynos4412;

查看u-boot源码:

arch/arm/cpu/armv7/exynos/

可见U-boot已支持该CPU。

指定产品BOARD三星公司已经为exynos4412发布了初始化的程序:


origen

cpu硬件信息对应的该CPU硬件信息头文件位于以下位置:

include/configs/

该文件定义了uboot启动必须关于exynos4412必须的一些资源信息。

在uboot-2013-01中,顶层目录下的文件中查看它支持的开发板和相应的信息,后续的编译过程需要根据配置名检索到相应的信息。文件格式如下:


和以前的老版本比,配置更加规范化了,其实这些就是相关文件分类的一个文件夹的描述。依照这个层次关系,我们可以很方便地对我们开发板进行配置。

编译u-boot

不同版本的uboot的配置命令可能是不同的,源码包的文件README通常会有相应的配置命令【其他版本的uboot会不一样】:


配置和编译命令如下:

nbsp;makedistcleannbsp;makeorigen_config

改配置命令会生成以下文件:

include/


编译:

nbsp;makeall

编译完成后生成的就是可执行的镜像文件。

但是并不会生成真正适配我们板子的uboot,只是适配参考板,该文件还不能在我们板子上运行,我们需要对u-boot源代码进行相应的修改。

2.确认第一条指令有运行到(点灯法)

在arch/arm/cpu/armv7/行后添加点灯程序

0xf0000000orrr1,r1,0xffstrr1,[r0]./mkuboot@@make-Csdfuse_q/@@!/bin/sh23sec_path="CodeSign4SecureBoot/"4CPU_JOB_NUM=$(grepprocessor/proc/cpuinfo|awk'{field=$NF};END{printfield+1}')5ROOT_DIR=$(pwd)6CUR_DIR=${ROOT_DIR*/}78case"$1"in9clean)10echomakeclean11makemrproper12;;13*)1415if[!-d$sec_path]16then17echo"**********************************************"18echo"[ERR]pleasegettheCodeSign4SecureBootfirst"19echo"**********************************************"20return21fi2223makeorigen_config2425make-j$CPU_JOB_NUM2627if[!-fchecksum_bl2_14]28then29echo"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"30echo"Therearesomeerror(s)whilebuildinguboot,pleaseusecommandmaketocheck."31echo"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"32exit033fi3435cp-rfchecksum_bl2_14$sec_$sec_path37rmchecksum_bl2_14$sec_path40catE4412___SMDK4412_SCP_2$ROOT_DIR4243rmchecksum_bl2_14;;4950esac

编译脚本

nbsp;/;./buildsh

注:脚本方式完成自动添加加密方式,编译生成所需文件u-boot_

root@ubuntu:/home/peng/uboot//*forclosewatchdog*//*PS-Holdhigh*/ldrr0,=0x1002330cldrr1,[r0]orrr1,r1,if

c)添加串口初始化代码:在uart_asm_init:的

351strr1,[r0,if0bltzpc_initifdefCONFIG_DRIVER_DM9000defineDM9000_Tacs(0x1)defineDM9000_Tacc(0x5)defineDM9000_Tah(0xC)defineDM9000_PMC(0x1)structexynos_sromc{unsignedintbw;unsignedintbc[6];};/**s5p_config_sromc()-selecttheproperSROMCBankandconfigurethe*bandwidthcontrolandbankcontrolregisters*srom_bank-SROM*srom_bw_conf-SMCBandwitdhregconfigurationvalue*srom_bc_conf-SMCBankControlregconfigurationvalue*/voidexynos_config_sromc(u32srom_bank,u32srom_bw_conf,u32srom_bc_conf){unsignedinttmp;structexynos_sromc*srom=(structexynos_sromc*)(EXYNOS4412_SROMC_BASE);/*ConfigureSMC_BWregistertohandleproperSROMCbank*/tmp=srom-bw;tmp=~(0xF(srom_bank*4));tmp|=srom_bw_conf;srom-bw=tmp;/*ConfigureSMC_BCregister*/srom-bc[srom_bank]=srom_bc_conf;}staticvoiddm9000aep_pre_init(void){unsignedinttmp;unsignedcharsmc_bank_num=1;unsignedintsmc_bw_conf=0;unsignedintsmc_bc_conf=0;/*gpioconfiguration*/writel(0x00220020,0x11000000+0x120);writel(0x00002222,0x11000000+0x140);/*16Bitbuswidth*/writel(0x22222222,0x11000000+0x180);writel(0x0000FFFF,0x11000000+0x188);writel(0x22222222,0x11000000+0x1C0);writel(0x0000FFFF,0x11000000+0x1C8);writel(0x22222222,0x11000000+0x1E0);writel(0x0000FFFF,0x11000000+0x1E8);smc_bw_conf=~(0xf4);smc_bw_conf|=(17)|(16)|(15)|(14);smc_bc_conf=((DM9000_Tacs28)|(DM9000_Tcos24)|(DM9000_Tacc16)|(DM9000_Tcoh12)|(DM9000_Tah8)|(DM9000_Tacp4)|(DM9000_PMC));exynos_config_sromc(smc_bank_num,smc_bw_conf,smc_bc_conf);}ifdefCONFIG_DRIVER_DM9000dm9000aep_pre_init();ifdefCONFIG_CMD_NETintboard_eth_init(bd_t*bis){intrc=0;ifreturnrc;}undefCONFIG_CMD_PING

undefCONFIG_CMD_NET

if/*__CONFIG_H*/

前面添加

defineCONFIG_NET_MULTIdefineCONFIG_DM9000_BASE0x05000000//内存基地址defineDM9000_DATA(CONFIG_DM9000_BASE+4)defineCONFIG_DM9000_NO_SROM1defineCONFIG__

其中CONFIG_DM9000_BASE地址为何是0x05000000,后续章节会详细分析。

6.FLASH移植(EMMC)

移植EMMC需要添加一些源文件:

cmd__mmc____

这些文件,由三星提供。

添加相关驱动

/arm/cpu/armv7/exynos/

修改文件arch/arm/cpu/armv7/exynos/Makefile在后添加

修改板级文件board/samsung/origen/,在

includeasm/arch/_GENERIC_MMC

后面添加

u32sclk_mmc4;/*clocksourceforemmccontroller*/defineCLK_SRC_FSYS__REGMY(EXYNOS4_CLOCK_BASE+CLK_SRC_FSYS_OFFSET)ifdefCONFIG_EMMC_8Bitwritel(0x04444000,0x11000060);writel(0x00003FC0,0x11000068);writel(0x00002AAA,0x1100006C);ifdefUSE_MMC4smdk_s5p_mshc_init();ifdefCONFIG_EMMCerr=emmc_init();ifdefCONFIG_BOARD_LATE_INITif

添加相关命令

nbsp;cpcmd_/nbsp;cpcmd_/nbsp;cpcmd_mmc_/

修改common/Makefile在

COBJS-$(CONFIG_CMD_MMC)+=cmd_

后添加

COBJS-$(CONFIG_CMD_MMC)+=cmd_mmc_$(CONFIG_CMD_MOVINAND)+=cmd_

添加驱动

nbsp;/mmc/nbsp;cps5p_/mmc/nbsp;/nbsp;/nbsp;cps5p_/

修改Makefile

$vimdrivers/mmc/Makefile

添加

COBJS-$(CONFIG_S5P_MSHC)+=s5p_

添加EMMC相关配置

$viminclude/configs/

添加

ifdefCONFIG_EVT1ifdefCONFIG_SDMMC_CH2undefDEBUG_S3C_HSMMCifdefineCONFIG_S5P_MSHCdefineUSE_MMC4/*defineCONFIG_EMMC_EMERGENCY/*defineemmcdbg(fmt,args)if/*CONFIG_EVT1*/defineCONFIG_CLK_1000_400_200defineCFG_PHY_KERNEL_BASECONFIG_SYS_SDRAM_BASE+0x8000defineBOOT_EMMC430x6defineCONFIG_BOARD_LATE_INIT
7.重新编译u-boot

修改顶层Makefile,注释掉spl的编译:

623$(MAKE)-Csplall

重新编译uboot:

nbsp;./

在根目录下会生成bin文件。

二、SD卡制作1.烧写脚本

三星公司已经给我们提供了制作SD卡启动的烧写的脚本:

echo"FuseFS4412trustzoneubootfileintoSDcard"if[-z$1]!/bin/sh2Copyright(C)2010SamsungElectronicsCo.,er_type1="/dev/sd"12reader_type2="/dev/mmcblk0"1314if[-z$2]判断参数1所指向的设备节点是否存在42then43echo"$1readerisidentified."44else45echo"$1isNOTidentified."46exit047fi484950烧写到SD卡(512+8K)字节处,512+8K=17x512,即第17个block57ddiflag=dsyncoflag=dsyncif=$2of=$1seek=1\58echo"$2imagehasbeenfusedsuccessfully."5960ddiflag=dsyncoflag=dsyncif=../../TC4_Kernel_3.0/arch/arm/boot/zImageof=$1seek=1024\62echo""65echo""676869_fusing_

d)进入sdfuse_q执行如下操作

root@ubuntu:/home/peng/uboot/sdfuse_q#.//dev/sdb


d)在SD卡中创建目录sdupdate,并把编译好的uboot镜像文件拷贝到这个目录。

3.通过sd卡启动烧写uboot

a)连接串口和板子,运行串口通信程序putty



b)关闭开发板电源,将拨码开关SW1调至(1000)(SD启动模式)后打开电源c)将刚才做好的SD启动盘插入SD卡插槽d)重新打开开发板能够看到如下界面


在这里插入图片描述

在读秒倒计时时按任意键。由上图所示,已经支持EMMC和dm9000网卡。

e)烧写在终端上执行

sdfuseflashall

注意:上面的命令把SD卡sdupdate目录下的烧写到emmc起始位置等待终端无输出是表示烧写结束

f)关闭开发板电源,将拨码开关SW1调至0110(EMMC启动模式)后打开电源即可以从emmc启动

4.网络烧写uboot

如果板子已经可以启动uboot,我们也可以通过网络烧写uboot。

步骤如下:

把编译好的拷贝到/tftpboot下

启动开发板,在u-boot下先下载到41000000;再运行

moviwriteu-boot41000000

若编译后的无法运行,可参考上一节,重新从SD卡引导烧写。

文中资料后台回复:uboot