exynos4412uboot移植笔记.docx
《exynos4412uboot移植笔记.docx》由会员分享,可在线阅读,更多相关《exynos4412uboot移植笔记.docx(13页珍藏版)》请在冰豆网上搜索。
exynos4412uboot移植笔记
Exynos4412uboot移植笔记
一、准备原料
三星原厂提供的UBOOT代码-u-boot-samsung-dev.
2、在4212平台代码基础上修改成自己的平台YYGY4412
1.用户目录下新建文件夹yygy4412-ubootcd,mkdiryygy4412-uboot
2.进入yygy4412-uboot文件夹,将三星平台代码压缩文件拷贝至此。
解压,重命名为:
yygy4412-uboottar-vxfu-boot-samsung-dev.tar.gzmvu-boot-samsung-devyygy4412-uboot
3.拷贝迅为的CodeSign4SecureBoot文件夹到当前目录。
至此当前目录结构为:
4.进入文件夹yygy4412-ubootcdyygy4412-uboot进入三星平台cdboard/samsung
cp-rfsmdk4212yygy4412cdyygy4412
Mvclock_init_smdk4212.Sclock_init_yygy4412.S
Mvmem_init_smdk4212.Smem_init_yygy4412.S
Mvsmdk4212.cyygy4412.c
Mvsmdk4212_val.hyygy4212_val.h
Mvsmdk4412_val.hyygy4412_val.h
Vilowlevel_init.S
#ifdefCONFIG_EXYNOS4412
#include"smdk4412_val.h"//改为#include"yygy4412_val.h"
#else
#include"smdk4212_val.h"//改为#include"yygy4212_val.h"
#endif
Viclock_init_yygy4412.S
#ifdefCONFIG_EXYNOS4412
#include"smdk4412_val.h"//改为#include"yygy4412_val.h"
#else
#include"smdk4212_val.h"//改为#include"yygy4212_val.h"
#endif
ViMakefile
33行:
COBJS-y:
=smdk4212.o//改为:
COBJS-y:
=yygy4412.o
37行;SOBJS+=mem_init_smdk4212.o//改为:
SOBJS+=mem_init_yygy4412.o
38;SOBJS+=clock_init_smdk4212.o//改为:
SOBJS+=clock_init_yygy4412.o
Cd,cdyygy4412-uboot/yygy4412-uboot
修改boards.cfg添加yygy4412armarmv7yygy4412samsungexynos
Cp-avinclude/configs/smdk4412.hinclude/configs/yygy4412.h
Viinclude/configs/yygy4412.h
265:
#defineCONFIG_SYS_PROMPT"SMDK4412#"
改为:
#defineCONFIG_SYS_PROMPT"YYGY4412#"
319:
#defineCONFIG_IDENT_STRING"forSMDK4412"
改为;#defineCONFIG_IDENT_STRING"forYYGY4412"
Viu-boot.lds
board/samsung/smdk4212/libsmdk4212.o(.text)
修改为:
board/samsung/yygy4412/libyygy4412.o(.text)
5.编译makeyygy4412_configmake
6.制作UBOOT
因CPUexynos_4412的启动过程是
BL0//BL0固化在iram中的程序(关闭看门狗,关闭中断及MMU,时钟设置,检测om决定启动方式,拷贝bl1到iram中
BL1<8k/*BL1初始化化环境(中断初始化,设置堆栈等),搬移bl2代码到RAM中,并允许它,
BL1是三星提供的,无源码,见CodeSign4SecureBoot/E4412_N.bl1.SCP2G.bin
|如果想看源码,可以反汇编分析,如arm-none-linux-gnueabi-objdump-D-bbinary-marmE4412_N.bl1.SCP2G.bin>b1.asm
BL2<14k//bl2完成基本硬件初始化(Low_init.s时钟串口内存flash等)
u-boot.bin
所以我们单独运行u-boot是不行的,需使用三星提供的BL1BL2进行打包加密校验
cp-rfsdfuse_q.///sdfuse_q三星提供的加密处理(checksum)
Cpmkuboot.///拷贝SD卡制作UBOOT脚本。
//cp-rfCodeSign4SecureBoot..///CodeSign4SecureBoot三星提供的安全启动方式前面已拷贝
vimMakefile
修改,添加sdfuse_q的编译(sdfuse_q主要是进行checksum,大小等检验,还有通过脚本可制作sd启动盘)
在354ifeq($(CONFIG_CPU_EXYNOS5250),y)
./mkbl2u-boot.binbl2.bin14336
Endif后添加
@split-b14336u-boot.binbl2
@+make-Csdfuse_q/
@./sdfuse_q/chksum
@./sdfuse_q/add_padding
@rmbl2a*
@echo
Cpbuild_uboot.sh./拷贝编译脚本
Vibuild_uboot.sh
修改路径:
sec_path="../CodeSign4SecureBoot/"
if[-z$1]
then
maketc4_android_config//改makeyygy4412_config
elif[$1=$option1]
then
maketc4_plus_android_config//改makeyygy4412_config
else
echopleaseinputrightparameter.//改makeyygy4412_config
exit0
Fi
catE4412_N.bl1.SCP2G.binbl2.binall00_padding.binu-boot.bintzsw_SMDK4412_SCP_2GB.bin>u-boot-iTOP-4412.bin改为>u-boot-yygy-4412.bin
mvu-boot-iTOP-4412.bin$ROOT_DIR
改为mvu-boot-yygy-4412.bin$ROOT_DIR
chmod777./build.sh
./build_uboot.sh编译生成u-boot-yygy-4412.bin
7.加入点灯代码,确认uboot运行。
Viboard/samsung/yygy4412/lowlevel_init.S
96:
/*PS-Holdhigh*/电源管理
ldrr0,=0x1002330c
ldrr1,[r0]
orrr1,r1,#0x300
strr1,[r0]后添加
ldrr0,=0x11000c08
ldrr1,=0x0
strr1,[r0]
/*ClearMASK_WDT_RESET_REQUEST*/
ldrr0,=0x1002040c
ldrr1,=0x00
strr1,[r0]
//ledtest
ldrr0,=0x11000060//GPK1[1]
ldrr1,[r0]
bicr1,r1,#0xf0
orrr1,r1,#0x10
strr1,[r0]
ldrr1,[r0,#4]
orrr1,r1,#2
strr1,[r0,#4]
保存重新编译,烧到开发板,运行,可以看灯一闪而过。
但是串口无任何输出。
8.开启串口
开发板串口为UART2.
Viinclude/configs/yygy4412.h
添加#defineDEBUG输出调试信息
161:
#defineCONFIG_SERIAL11
改为:
#defineCONFIG_SERIAL21
保存编译,烧到开发板,可以看到串口输出信息,进入UBOOT读秒,读取内核,但是EMMC读取速度超慢,无法忍受,但最终读取完成。
9.修改MMC驱动。
加快内核的读取速度。
Vidrivers\mmc\mmc.c
1271;在函数mmc_init中
mmc_set_clock(mmc,1);
mmc_set_bus_width(mmc,MMC_BUS_WIDTH_1);
修改为:
mmc_set_clock(mmc,40000000);//40M
mmc_set_bus_width(mmc,MMC_MODE_4BIT);
保存编译,烧到开发板,可以看到串口输出信息,进入UBOOT读秒,读取内核EMMC读取速度超快,读取完成。
但是无法加载内核。
打印信息如下:
###main_loop:
bootcmd="movireadkernel040008000;movireadrootfs041000000100000;bootm4000800041000000"
Hitanykeytostopautoboot:
0
readingkernel..device0Start1063,Count8192
MMCread:
dev#0,block#1063,count8192...8192blocksread:
OK
completed
readingRFS..device0Count9255,Start2048
MMCread:
dev#0,block#9255,count2048...2048blocksread:
OK
completed
##Currentstackendsat0xc3cfbdc8*kernel:
cmdlineimageaddress=0x40008000
WrongImageFormatforbootmcommand
ERROR:
can'tgetkernelimage!
10.修改EMMC分区信息。
Viarch\arm\include\asm\arch-exynos\Movi_partition.h
修改21-57行为:
#definePART_SIZE_FWBL1(8*1024)
#definePART_SIZE_BL1(16*1024)
#definePART_SIZE_UBOOT(495*1024)
#definePART_SIZE_KERNEL(6*1024*1024)
#definePART_SIZE_ROOTFS(2*1024*1024)//2M
////#definePART_SIZE_TZSW(156*1024)
#definePART_SIZE_TZSW(24*1024)//为了与迅为UBOOT中的environmentstart544一致。
#defineMOVI_FWBL1_BLKCNT(PART_SIZE_FWBL1/MOVI_BLKSIZE)
#defineMOVI_BL1_BLKCNT(PART_SIZE_BL1/MOVI_BLKSIZE)
#defineMOVI_ENV_BLKCNT(CONFIG_ENV_SIZE/MOVI_BLKSIZE)/*16KB*/
#defineMOVI_UBOOT_BLKCNT(PART_SIZE_UBOOT/MOVI_BLKSIZE)/*328KB*/
#defineMOVI_ZIMAGE_BLKCNT(PART_SIZE_KERNEL/MOVI_BLKSIZE)/*4MB*/
#defineMOVI_ROOTFS_BLKCNT(PART_SIZE_ROOTFS/MOVI_BLKSIZE)/*26MB*/
#defineMOVI_TZSW_BLKCNT(PART_SIZE_TZSW/MOVI_BLKSIZE)/*160KB*/
#defineMOVI_UBOOT_POS((eFUSE_SIZE/MOVI_BLKSIZE)+MOVI_FWBL1_BLKCNT+MOVI_BL1_BLKCNT)
#defineMOVI_TZSW_POS((eFUSE_SIZE/MOVI_BLKSIZE)+MOVI_FWBL1_BLKCNT\
+MOVI_BL1_BLKCNT+MOVI_UBOOT_BLKCNT)
#defineENV_START_BLOCKMOVI_FWBL1_BLKCNT+MOVI_BL1_BLKCNT+MOVI_UBOOT_BLKCNT+MOVI_TZSW_BLKCNT+1
Viarch\arm\cpu\armv7\exynos\Movi_partition.c
25:
修改函数init_raw_area_table
Image[2]部分修改为:
image[2].start_blk=location;
image[2].used_blk=MOVI_UBOOT_BLKCNT+MOVI_BL1_BLKCNT+MOVI_FWBL1_BLKCNT;
image[2].size=PART_SIZE_UBOOT+PART_SIZE_FWBL1+PART_SIZE_BL1;
image[2].attribute=0x2;
strcpy(image[2].description,"u-boot");
dbg("u-boot:
%d\n",image[2].start_blk);
Image[3]部分:
image[3].start_blk=image[2].start_blk+MOVI_UBOOT_BLKCNT;
修改为:
image[3].start_blk=image[2].start_blk+MOVI_UBOOT_BLKCNT+MOVI_BL1_BLKCNT+MOVI_FWBL1_BLKCNT;
Image[4]部分
image[4].attribute=0x10;
strcpy(image[4].description,"environment");
后改为:
if(location==0)
image[4].start_blk=image[4].start_blk+2;
else
image[4].start_blk=image[4].start_blk+1;
为了与迅为UBOOT中的environmentstart544一致。
保存编译,烧到开发板,可以看到串口输出信息,进入UBOOT读秒,读取内核EMMC读取速度超快,读取完成。
加载内核成功,文件系统也成功加载。
但是UBOOT下,fastboot失败!
Startingdownloadof527104bytes
---------ERROR:
DMAAddressisnotalignedby8---------
11.使用fastboot功能
Viinclude\configs\yygy4412.h
167:
#undefCONFIG_USB_CPUMODE
修改为#defineCONFIG_USB_CPUMODE
保存编译,烧到开发板.fastboot命令成功
12.环境变量的保存。
到目前为止,环境变量是默认的。
迅为开发板环境变量保存在错误的分区了,只要使用saveenv命令,就会破坏EMMC中的文件系统。
导致加载文件系统不断重启而失败。
最后连fastboot命令都失效。
EMMC分区被破坏。
重新分区,烧UBOOT,文件系统。
Vidrivers\mmc\mmc.c
在函数mmc_read_ext_csd中。
959:
if(ext_csd_struct>6){
printf("unrecognisedEXT_CSDstructure"
"version%d\n",ext_csd_struct);
err=-1;
gotoout;
}
改为
if((ext_csd_struct>5)&&(7!
=ext_csd_struct)){
printf("unrecognisedEXT_CSDstructure"
"version%d\n",ext_csd_struct);
err=-1;
gotoout;
}
因刚好version=7;
保存编译,烧到开发板.saveenv命令成功,现在读取的是EMMC中的环境变量。
13.疑问:
迅为提供的UBOOTE4412_N.bl1.SCP2G.bin已经将整个UBOOT拷贝到内存中。
测试是否如此?
修改lowlevel_init.S
load_uboot函数修改为:
/*****************************************************************************/
.globlload_uboot
load_uboot:
push{lr}
ldrr0,=INF_REG_BASE
ldrr1,[r0,#INF_REG3_OFFSET]
cmpr1,#BOOT_MMCSD
beqmmcsd_boot
cmpr1,#BOOT_EMMC
beqemmc_boot
cmpr1,#BOOT_EMMC_4_4
beqemmc_boot_4_4
cmpr1,#BOOT_SEC_DEV
beqmmcsd_boot
second_mmcsd_boot:
ldrr3,=BOOT_MMCSD
ldrr0,=INF_REG_BASE
strr3,[r0,#INF_REG3_OFFSET]
mmcsd_boot:
#ifdefCONFIG_CLK_1000_400_200
ldrr0,=ELFIN_CLOCK_BASE
ldrr2,=CLK_DIV_FSYS2_OFFSET
ldrr1,[r0,r2]
orrr1,r1,#0xf
strr1,[r0,r2]
#endif
movr0,#SDMMC_CH2
strr0,_boot_device
blload_uboot_image
bload_uboot_exit
emmc_boot:
#ifdefined(CONFIG_CLK_1000_400_200)||defined(CONFIG_CLK_1000_200_200)||defined(CONFIG_CLK_800_400_200)
ldrr0,=ELFIN_CLOCK_BASE
ldrr2,=CLK_DIV_FSYS1_OFFSET
ldrr1,[r0,r2]
orrr1,r1,#0x3
strr1,[r0,r2]
#endif
movr0,#EMMC
strr0,_boot_device
blload_uboot_image
bload_uboot_exit
emmc_boot_4_4:
#ifdefined(CONFIG_CLK_1000_400_200)||defined(CONFIG_CLK_1000_200_200)||defined(CONFIG_CLK_800_400_200)
ldrr0,=ELFIN_CLOCK_BASE
ldrr2,=CLK_DIV_FSYS3_OFFSET
ldrr1,[r0,r2]
orrr1,r1,#0x3
strr1,[r0,r2]
#endif
/*mmcch4devidervaluechange*/
//blmmc_ch4_devider_change
movr0,#EMMC_4_4
strr0,_boot_device
blload_uboot_image
/*storesecondbootinformationinDRAM*/
ldrr0,=CONFIG_PHY_UBOOT_BASE
ldrr1,[r0]
ldrr2,=0x2000
cmpr1,r2
bnesecond_mmcsd_boot
bload_uboot_exit
load_uboot_exit:
pop{pc}
/********************************************************************/
149行附近时钟,内存初始化部分。
ldrr0,=0xff000fff
bicr1,pc,r0/*r0<-currentbaseaddrofcode*/
ldrr2,_TEXT_BASE/*r1<-originalbaseaddrinram*/
bicr2,r2,r0/*r0<-currentbaseaddrofcode*/
cmpr1,r2/*comparer0,r1*/
beqafter_copy/*r0==r1thenskipsdraminitandu-boot.binloading*/
ldrr0,=CHIP_ID_BASE
ldrr1,[r0]
lsrr1,r1,#8
andr1,r1,#3
cmpr1,#2
bnev310_1
blmem_ctrl_asm_init
blsystem_cl