本文主要目的是如何从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_INIT7.重新编译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卡启动烧写uboota)连接串口和板子,运行串口通信程序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









