tiny4412 uboot ok用光盘带的uboot 引导android系统报错怎么办

于16年2月多购买了tiny4412sdk-1506,用友善之臂(以下简称友善)的superboot是可以进入linux,而用三星原始的uboot_tiny9则不可以。出现现象是卡在&OK&,偶尔能继续跑下去。根据以往开发的经验,可以知道这绝对是ddr3配置的问题,查看&Tiny-Schematic&是4颗ddr3@16bit,用到一个控制器两个片选(chip0,chip1),而&Tiny-Schematic&(对应我购买的PCB)是2颗ddr3@16bit,只需要一个控制器一个片选(chip0)。
(1306版本最好是两个控制器一个片选,能把ddr3带宽提升到64bit,可能技术/成本原因没实现)
以下是我做的补丁包,代码如下:
diff -uNrp uboot_tiny4412/board/samsung/tiny4412/mem_init_tiny4412.S uboot_tiny4412_kevin/board/samsung/tiny4412/mem_init_tiny4412.S
--- uboot_tiny4412/board/samsung/tiny4412/mem_init_tiny4412.S
2016-04-11 12:32:03. +0800
+++ uboot_tiny4412_kevin/board/samsung/tiny4412/mem_init_tiny4412.S
2016-04-01 01:39:09. +0800
@@ -67,12 +67,12 @@ mem_ctrl_asm_init:
r1, =0x0FFF301A
r1, [r0, #DMC_CONCONTROL]
@这里只有一个chip0
r1, [r0, #DMC_MEMCONTROL]
r1, =0x40e01323
r1, =0x40C01333
@Row是15bit,偏移地址是0x3FFFFFFF(1GB)
r1, [r0, #DMC_MEMCONFIG0]
r1, =0x60e01323
r1, =0x80C01333
@可以不修改,这里只为了说明控制器0地址到达0x7FFFFFFF
r1, [r0, #DMC_MEMCONFIG1]
#ifdef CONFIG_IV_SIZE
@@ -97,11 +97,11 @@ mem_ctrl_asm_init:
r1, [r0, #DMC_TIMINGPOWER]
#ifdef MCLK_400
r1, =0x4046654f
r1, =0x6946654f
@根据ddr3颗粒规格书微调参数
r1, [r0, #DMC_TIMINGROW] @TimingRow
@根据ddr3颗粒规格书微调参数
r1, [r0, #DMC_TIMINGDATA] @TimingData
r1, =0x52000a3c
r1, =0x5200183c
@根据ddr3颗粒规格书微调参数
r1, [r0, #DMC_TIMINGPOWER] @TimingPower
@@ -133,7 +133,7 @@ mem_ctrl_asm_init:
r2, r2, #1
@去掉chip1代码
/* chip 1 */
r1, [r0, #DMC_DIRECTCMD]
@@ -209,12 +209,12 @@ mem_ctrl_asm_init:
r1, =0x0FFF301A
r1, [r0, #DMC_CONCONTROL]
r1, [r0, #DMC_MEMCONTROL]
r1, =0x40e01323
@Interleaved?
r1, =0x40c01333
@Interleaved?
r1, [r0, #DMC_MEMCONFIG0]
r1, =0x60e01323
r1, =0x80C01323
r1, [r0, #DMC_MEMCONFIG1]
#ifdef CONFIG_IV_SIZE
@@ -239,11 +239,11 @@ mem_ctrl_asm_init:
r1, [r0, #DMC_TIMINGPOWER]
#ifdef MCLK_400
r1, =0x4046654f
r1, =0x6946654f
@根据ddr3颗粒规格书微调参数
r1, [r0, #DMC_TIMINGROW] @TimingRow
@根据ddr3颗粒规格书微调参数
r1, [r0, #DMC_TIMINGDATA] @TimingData
r1, =0x52000a3c
r1, =0x5200183c
@根据ddr3颗粒规格书微调参数
r1, [r0, #DMC_TIMINGPOWER] @TimingPower
@@ -275,7 +275,7 @@ mem_ctrl_asm_init:
r2, r2, #1
@去掉chip1代码
/* chip 1 */
r1, [r0, #DMC_DIRECTCMD]
diff -uNrp uboot_tiny4412/board/samsung/tiny4412/tiny4412.c uboot_tiny4412_kevin/board/samsung/tiny4412/tiny4412.c
--- uboot_tiny4412/board/samsung/tiny4412/tiny4412.c
2016-04-11 12:32:03. +0800
+++ uboot_tiny4412_kevin/board/samsung/tiny4412/tiny4412.c
2016-03-29 21:37:21. +0800
@@ -195,6 +195,14 @@ void dram_init_banksize(void)
gd-&bd-&bi_dram[2].size = PHYS_SDRAM_3_SIZE;
gd-&bd-&bi_dram[3].start = PHYS_SDRAM_4;
gd-&bd-&bi_dram[3].size = PHYS_SDRAM_4_SIZE;
gd-&bd-&bi_dram[4].start = PHYS_SDRAM_5;
//BANK数量改变
gd-&bd-&bi_dram[4].size = PHYS_SDRAM_5_SIZE;
gd-&bd-&bi_dram[5].start = PHYS_SDRAM_6;
gd-&bd-&bi_dram[5].size = PHYS_SDRAM_6_SIZE;
gd-&bd-&bi_dram[6].start = PHYS_SDRAM_7;
gd-&bd-&bi_dram[6].size = PHYS_SDRAM_7_SIZE;
gd-&bd-&bi_dram[7].start = PHYS_SDRAM_8;
gd-&bd-&bi_dram[7].size = PHYS_SDRAM_8_SIZE;
#ifdef CONFIG_TRUSTZONE
gd-&bd-&bi_dram[nr_dram_banks - 1].size -= CONFIG_TRUSTZONE_RESERVED_DRAM;
diff -uNrp uboot_tiny4412/drivers/mmc/mmc.c uboot_tiny4412_kevin/drivers/mmc/mmc.c
--- uboot_tiny4412/drivers/mmc/mmc.c
2016-04-11 12:32:04. +0800
+++ uboot_tiny4412_kevin/drivers/mmc/mmc.c
2016-03-30 01:03:42. +0800
@@ -955,7 +955,7 @@ static int mmc_read_ext_csd(struct mmc *
ext_csd_struct = ext_csd[EXT_CSD_REV];
host-&ext_csd.boot_size_multi = ext_csd[BOOT_SIZE_MULTI];
if (ext_csd_struct & 5) {
if (ext_csd_struct & 7) {
//若不修改,进入uboot会提示无法识别版本,原因是友善用的emmc颗粒版本较高
printf("unrecognised EXT_CSD structure "
"version %d\n", ext_csd_struct);
diff -uNrp uboot_tiny4412/include/configs/tiny4412.h uboot_tiny4412_kevin/include/configs/tiny4412.h
--- uboot_tiny4412/include/configs/tiny4412.h
2016-04-11 20:37:03. +0800
+++ uboot_tiny4412_kevin/include/configs/tiny4412.h
2016-04-11 16:13:01. +0800
@@ -278,9 +278,9 @@
#ifdef CONFIG_EVT0_STABLE
#define CONFIG_NR_DRAM_BANKS
-#define CONFIG_NR_DRAM_BANKS
+#define CONFIG_NR_DRAM_BANKS
//BANK提高到8
-#define SDRAM_BANK_SIZE
/* 256 MB */
+#define SDRAM_BANK_SIZE
/* 128 MB */
//每个BANK容量减小
#define PHYS_SDRAM_1
CONFIG_SYS_SDRAM_BASE /* SDRAM Bank #1 */
#define PHYS_SDRAM_1_SIZE
SDRAM_BANK_SIZE
#define PHYS_SDRAM_2
(CONFIG_SYS_SDRAM_BASE + SDRAM_BANK_SIZE) /* SDRAM Bank #2 */
@@ -326,7 +326,7 @@
/* Fastboot variables */
#define CFG_FASTBOOT_TRANSFER_BUFFER
-#define CFG_FASTBOOT_TRANSFER_BUFFER_SIZE
/* 384MB */
+#define CFG_FASTBOOT_TRANSFER_BUFFER_SIZE
/* 768MB */ //当初为了调原生uboot启动android5.0修改,这里跟uboot启动无关
#define CFG_FASTBOOT_ADDR_KERNEL
#define CFG_FASTBOOT_ADDR_RAMDISK
#define CFG_FASTBOOT_PAGESIZE
// Page size of booting device
以上的注释都是patch之后后续加上,只为了方便阅读。修改后的uboot启动android 4.2是可以正常启动,但无法运行android 5.0(启动一段时间后自动跑飞),问了其他人均表示此现象。
询问友善说是uboot问题。应该是superboot做了其他处理,这里没有能力继续研究下去。
1:友善的售后做的很差,把客户当傻X;
2:开源力度相当低;
3:硬件&PCB设计很差。
以上三点理由让我不会再选择友善的产品!
阅读(...) 评论()uboot(6)
本人是第一次在此发帖,希望大家多多支持,发帖目的是为了分享,分享的目的是传递开源的精神。
Tiny4412开发板刚拿到手是,看了下介绍,发现superboot是个好东西,但是不开源,这个严重与开源思想不符合。
按照光盘介绍编译烧写U-boot也无法启动板子,只有superboot使用后才可以启动板子。到此大家估计很多和我想的一样,如何使用开源的u-boot来启动开发板。
言归正传,我们的目的是要用u-boot来运行tiny4412.
首先要注意的是,原版的内核配置把CONFIG_ARM_TRUSTZONE给打开了,这个与superboot.bin是配套使用的,但是u-boot经研究发现暂不支持TZ模式,所以内核配置要把这个选项去掉。不然按照教程会出现死机。论坛也有很多网友发现了此现象,不再赘述。(后面有时间本人会研究下trustzone机制)
把TZ选项去掉后,通过SD卡烧录u-boot可以把板子带起来,这个不是我们要讲述的重点,我们要讲的是如何把u-boot烧录到emmc中,这个友善没有提供方法,其实不难。
emmc其实和SD卡类似,都是SD设备,emmc是8-bit模式,SD是4-bit模式。TINY4412是eMMC4.4. 既然sd卡能烧,那么emmc一定可以烧。
SD卡烧录,其实通过友善教程,在U-boot源码目录下有sd_fusing.sh,打开看下即可知道烧录原理。这个不讲了,有兴趣的朋友可以看下,很见到。就是把各个bin文件按照指定位置烧到SD卡的系统分区中。
那么eMMC如何烧写呢,这是我们要讲的重点。在这里不得不讲一下DNW工具,这个可以通过USB把电脑端的文件烧录到目标板的内存中。附件是dnw Linux完整源码包,解要到一个文件夹,里面有dnw.c , Makefile, 预编译dnw(x86_64). 大家可以直接使用或是自己编译,编译后的dnw 可以复制到/usr/bin,并chmod 777 /usr/bin/dnw.
u-boot中断也支持dnw指令,所以eMMC烧录就有可能了,因为电脑上的u-boot.bin固件可以通过dnw烧录到开发板的内存了。。。。
编译uboot过程友善的文档已经写的很完善,大家自己参考并编译u-boot. 编译完成后u-boot目录下有:
u-boot.bin
进入u-boot/sd_fuse/执行make,可以生成mkbl2工具,
进入u-boot/sd_fuse/tiny4412目录下可以看到bl2.bin&&E4412_N.bl1.bin&&E4412_tzsw.bin三个bin,其中bl2.bin在制作SD启动卡时会生成,我们也需要此文件。
下面讲如何使用dnw下载固件到开发板内存, 注意本人是以Ubuntu环境来调试,使用Windows的朋友自己对照流程。
1 下载附件dnw编译,上面已经讲了,
2 按照友善文档,制作SD启动卡,开发板SW2开关选择SD启动.
3 把串口先连接PC与开发板。
4 插制作好的SD卡到开发板,并给开发板上电SW1.
5 键盘按任意键盘进入uboot终端,此时输入help可以看到很多指令。
6 现在我们进入了SD卡模式启动的u-boot. 现在我们看下mmc设备信息:
u-boot模式下输入:
&mmcinfo 0
省略。。。
&mmcinfo 1
Device: S5P_MSHC4
Manufacturer ID: 15
Name: M4G1Y
Tran Speed: 0
Rd Block Len: 512
MMC version 4.0
High Capacity: Yes
Size: 3728MB (block: 7634944)
Bus Width: 8-bit
Boot Partition Size: 2048 KB
上面两条指令分别执行,可以发现 mmc 0就是我们的SD卡,mmc 1设备就是我们要烧录的设备eMMC,uboot返回提示是8-bit,内存容量是4G的eMMC卡。
7 继续输入:
&fdisk -p 0
&fdisk -p 1
partion #&&&&size(MB)&&&& block start #&&&&block count&&&&partition_Id
&& 1&&&&&&&&&& 695&&&&&&&&&&6070812&&&&&&&& 1424478&&&&&&&&&&0x0C
&& 2&&&&&&&&&& 320&&&&&&&&&& 134244&&&&&&&&&&656304&&&&&&&&&&0x83
&& 3&&&&&&&&&&2057&&&&&&&&&& 790548&&&&&&&& 4213770&&&&&&&&&&0x83
&& 4&&&&&&&&&& 520&&&&&&&&&&5004318&&&&&&&& 1066494&&&&&&&&&&0x83
这两条指令是分别查看mmc 0/1设备的分区表信息。设备mmc1的分区信息,即eMMC分析,注意这个是superboot分区信息,我们就用这个分区。
分区1 是FAE分区, 分区2 是给system的,分区3是user-data, 分区4 是 cache.
8 格式化eMMC, u-boot模式下输入如下指令来格式化eMMC设备。
&fdisk -c 1 320
执行后会返回分区信息,继续格式话分区1,2,3,4
&fatformat mmc 1:1
这句话意思是对mmc 1设备的第一分区格式作fat格式化。
&ext3format mmc 1:2
&ext3format mmc 1:3
&ext3format mmc 1:4
上面三个指令是分别对eMMC的分区2,3,4作ext3格式化。
到此我们完成了对eMMC的设备的格式化。
接下来我们要想办法烧录bl1.bin, bl2.bin, u-boot.bin, tzsw.bin烧录到eMMC中。
9 从PC端下载固件到开发板Memory中。
刚才我们重点介绍了dnw, 接下来我们要使用此工具来下载固件到开发板内存中。注意是下载到内存,把固件数据缓存起来,到时要烧录到eMMC中。
首先我们要打开emmc设备
u-boot下输入:
&emmc open 1
eMMC OPEN Success.!!
&&&&&&&&&&&&&&&&&&&&&&&&!!!Notice!!!
!You must close eMMC boot Partition after all image writing!
!eMMC boot partition has continuity at image writing time.!
!So, Do not close boot partition, Before, all images is written.!
上面提示emmc开启成功,注意说明,emmc一旦打开,需要连续烧录,烧录完成后可以关闭emmc.
10 接下来我们要运行dnw
u-boot下面输入:
OTG cable Connected!
Now, Waiting for DNW to transmit data
提示等待数据输入,这里就是等待我们从PC端通过DNW传送数据过来。
此时在PC端终端串口,cd到u-boot目录所在路径
user@~/u-boot/:
输入: dwn sd_fuse/tiny_N.bl1.bin
此时u-boot中断会提示传送校验完成,此时已经把bl1.bin通过USB传送到了memeory的0xc0000000起始地址,大小8KB.
接下来我们烧录bl1.bin到eMMC中,u-boot下继续输入:
&mmc write 1 0xc 0x10
会提示写入信息,说明已经写入成功。这个是把刚才从PC端通过dnw下载下来的bl1.bin固件下载到emmc中,起始0, 16个block, 一个block是512B, 16*512=8*1024=8KB. 这个是bl1.bin的存放位置。
以此类推,烧录bl2.bin. u-boot.bin, tzsw.bin
-----------------------------------------------------------------------------------------------------------------------------------------------------
u-boot终端继续输入:
PC端输入: (注意输入内容是以 dnw 开始的,前面是当前路径,便于理解)
user@~/u-boot/:&&dwn sd_fuse/tiny4412/bl2.bin
u-boot下继续输入:
&mmc write 1 0xcx10 0x1C
bl2.bin实际大小约14K,分配的空间是16K. 其实是第16个block开始,写入28个block, 28*512B=14*1024=14K
注意这个区域预分配是32个Block,所以下一个开始是32+16=48
------------------------------------------------------------------------------------------------------------------------------------------------------
u-boot终端继续输入:
PC端输入: (注意输入内容是以 dnw 开始的,前面是当前路径,便于理解)
user@~/u-boot/:&&dwn u-boot.bin
u-boot下继续输入:
&mmc write 1 0xcx30 0x21D
u-boot.bin实际大小约270K,分配的空间是328K. 其实是第48个block开始,写入541个block, 541*512B=270.5*1024 约270K
------------------------------------------------------------------------------------------------------------------------------------------------------
u-boot终端继续输入:
PC端输入: (注意输入内容是以 dnw 开始的,前面是当前路径,便于理解)
user@~/u-boot/:&&dwn sd_fuse/tiny_tzsw.bin
u-boot下继续输入:
&mmc write 1 0xcx2c0 0xB8
tzsw.bin实际大小约92K,分配的空间是160K. 其实是第704个block开始,写入184个block, 184*512=92*1024=92K
------------------------------------------------------------------------------------------------------------------------------------------------------
启动分区到此全部写入完成,注意一定要关闭emmc,
u-boot下继续输入:
&emmc close 1
eMMC CLOSE Success.!!
关闭emmc设备,提示关闭成功。此时我们已经把启动文件全部烧录到了eMMC中。
-------------------------------------------------------------------------------------------------------------------------------------------------------
接下来我们可以把开发板的SW2拨动到NAND启动,同时u-boot中断输入reset, 并在电脑键盘按下任意键,此时我们可以看到:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
U-Boot 00-g3e284d5-dirty (Jul 04 2014 - 17:40:58) for TINY4412
CPU:&&&&S5PC220 [Samsung SOC on SMP Platform Base on ARM CortexA9]
&&&&&&&&APLL = 1400MHz, MPLL = 800MHz
Board:&&TINY4412
DRAM:&& 1023 MiB
vdd_arm: 1.2
vdd_int: 1.0
vdd_mif: 1.1
BL1 version:&&N/A (TrustZone Enabled BSP)
Checking Boot Mode ... EMMC4.41
REVISION: 1.1
MMC Device 0: 3728 MB
MMC Device 1: 1876 MB
MMC Device 2: N/A
Read... Bootmode reg 0x
Get Bootmode reg 0xf3ca4c36
ModeKey Check... run normal_boot
Net:&&&&No ethernet found.
Hit any key to stop autoboot:&&0
TINY4412 #
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
大功告成啊,我们的u-boot已经成功写入到了eMMC中,并可以成功启动。
还有一件非常重要的事情我们还有做,就是启动参数写入,我们bootargs写入到env分区,注意ENV分区在TZSW分区后面,内核分区之前。即 TZSW | ENV | KERNEL
从eMMC启动u-boot后,在u-boot终端输入:
&setenv bootargs console=ttySAC0, androidboot.console=ttySAC0 uhost0=n ctp=2 skipcali=y vmalloc=512m lcd=S70
设置并保存启动参数,此时再重启板子,进入U-boot。
u-boot下输入:
查看刚才烧录的启动参数是否成功。
11 烧写kernel, system, ramdisk
下面烧kernel, system,ramdisk和SD卡烧录一样。
u-boot继续输入
进入fastboot模式
PC端使用fastboot flash kernel zImag, fastboot flash system system.img, fastboot flash ramdisk ramdisk-u.img即可把剩下全部的img烧录到eMMC中。重启开发板,就可以启动开发板。
虽然没有开源的superboot,但是依然无法阻挡我们一个开源的心。
还有本人已经成功在u-boot加入按键启动u-boot的fastboot功能,在此贴一并发出。。。
使用开发板底板的K1按键,按住K1,开机即可进入系统的fastboot模式。 同时支持fastboot下载完成后执行fastboot reboot bootloader重启模式。
功能已经全部验证。
到此位置,针对u-boot烧录eMMC的过程基本已经讲解完毕,希望给大家带来帮助,给友善的开源u-boot添砖加瓦。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:12059次
排名:千里之外
转载:27篇
(3)(2)(2)(1)(1)(2)(3)(7)(11)(4)主题 : 使用uboot for tiny4412 这篇文章,烧写系统不成功。。求解
级别: 新手上路
金钱: 145 两
威望: 29 点
贡献值: 0 点
综合积分: 58 分
&使用uboot for tiny4412 这篇文章,烧写系统不成功。。求解
README for FriendlyARM Tiny4412说明:本u-boot源代码由三星原厂提供,并由友善之臂修改移植,以适用于Tiny4412开发板平台。仅供嵌入式爱好者学习研究之用,友善之臂不对此提供任何技术支持和维护。-----------------------------------------------------1. Build uboota) 安装好toolchain (arm-linux-gcc-4.5.1-v6-vfp-.tgz)并设置好&& 环境变量PATH,保证可以正常使用。b) 解压 uboot_tiny9.tgz 并进入相应的目录&& tar xzf uboot_tiny9.tgzc) 配置 uboot 并编译&& cd uboot_tiny4412&& make tiny4412_config&& maked) 编译 用于生成bl2 的工具&& make -C sd_fuse&& 或者&& cd sd_ make-----------------------------------------------------2. 制作启动 Tiny4412 的SD卡a) 先准备一张4G或以上的SDHC卡&& 注意:该卡的已有数据将会被破坏,因此请先对SD卡上的数据进行备份。b) fusing SD card&& 假设SD卡已被PC Linux识别为/dev/sdb, 以root用户运行以下命令即可:&& cd sd_fuse/tiny4412&& ./sd_fusing.sh /dev/sdb-----------------------------------------------------3. 使用SD卡启动 Tiny4412 并烧写Androida) 将已经制作好的SD卡插到 Tiny4412 板上,拨动S2切换到SDBOOT,同时连接&& 串口线到PC且假设已经准备好。b) 开发板加电,然后在串口控制台(如minicom),按任意键进入uboot 命令行模式c) 对SD卡进行分区&& 输入以下uboot命令即可对SD卡进行分区:&& fdisk -c 0 320 806 518&& 重新分区后,可重新格式化FAT分区&& fatformat mmc 0:1d) 进入fastboot模式以烧写Android&& 使用USB线连接Tiny4412的MICRO_USB口到PC,然后输入以下uboot命令:&& fastboote) 烧写 Android 到SD卡&& 首先请准备好Android image,包括: zImage, ramdisk-u.img, system.img&& 在PC端输入以下命令进行烧写:&& fastboot flash kernel zImage&&&&&&&&&&&&&&(烧写kernel)&& fastboot -w&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (格式化userdata和cache)&& fastboot flash ramdisk ramdisk-u.img&&&&&&(烧写ramdisk)&& fastboot flash system system.img&&&&&&&&&&(烧写system)按照上面的烧写方法,做到最后一步时fastboot flash system system.img&&出错了。。。。我的TF卡时8G的。在串口终端打印信息是:Received 17 bytes: download:11ec65f8Starting download of
bytes..............................................................................................................................................................................................................................................................................................downloading of
bytes finishedReceived 12 bytes: flash:systemflashing 'system'Compressed ext4 image*** erase start block 0x21390 ****** erase block length 0x201140 ***mmc erase user 0 1248START: 136192 BLOCK: 2101248high_capacity: 1Capacity: Erase.................................................................................................................................................................................................................. 1.0 GB erase DoneMMC erase Success.!!MMC write: dev # 0, block # 136080, count 8 ... error:
cmd 25count: 1# Tx: Inverter delay / Rx: Inverter delayCMD resetDATA resetcount: 2## Tx: Basic delay / Rx: Inverter delayCMD resetDATA resetcount: 3## Tx: Inverter delay / Rx: Basic delayCMD resetDATA resetcount: 4### Tx: Basic delay / Rx: Basic delayCMD resetDATA resetcount: 5# Tx: Disable / Rx: Basic delayCMD resetDATA resetcount: 6## Tx: Disable / Rx: Inverter delayCMD resetDATA resetcount: 7### Tx: Basic delay / Rx: DisableCMD resetDATA resetcount: 8### Tx: Inverter delay / Rx: DisableCMD resetDATA resetmmc write failed ERROR: -19data.dest: 0xdata.blocks: 8data.blocksize: 512MMC_DATA_WRITE-19 blocks written: ERRORMMC write: dev # 0, block # 136088, count 8 ... count: 1# Tx: Inverter delay / Rx: Inverter delayCMD resetDATA resetcount: 2## Tx: Basic delay / Rx: Inverter delayCMD resetDATA resetcount: 3## Tx: Inverter delay / Rx: Basic delayCMD resetDATA resetcount: 4### Tx: Basic delay / Rx: Basic delayCMD resetDATA resetcount: 5# Tx: Disable / Rx: Basic delayCMD resetDATA resetcount: 6## Tx: Disable / Rx: Inverter delayCMD resetDATA resetcount: 7### Tx: Basic delay / Rx: DisableCMD resetDATA resetcount: 8### Tx: Inverter delay / Rx: DisableCMD resetDATA resetmmc write failed ERROR: -19data.dest: 0xdata.blocks: 8data.blocksize: 512MMC_DATA_WRITE-19 blocks written: ERRORMMC write: dev # 0, block # 136096, count 184 ... count: 1# Tx: Inverter delay / Rx: Inverter delayCMD resetDATA resetcount: 2## Tx: Basic delay / Rx: Inverter delayCMD resetDATA resetcount: 3## Tx: Inverter delay / Rx: Basic delayCMD resetDATA resetcount: 4### Tx: Basic delay / Rx: Basic delayCMD resetDATA resetcount: 5# Tx: Disable / Rx: Basic delayCMD resetDATA resetcount: 6## Tx: Disable / Rx: Inverter delay求解。
级别: 新手上路
金钱: 80 两
威望: 16 点
贡献值: 0 点
综合积分: 32 分
^很多问题的背后都是简单的原因......
级别: 荣誉会员
发帖: 1218
金钱: 6220 两
威望: 1244 点
贡献值: 0 点
综合积分: 2436 分
可能是uboot中的eMMC的配置存在问题,可以尝试修改uboot,调整一下eMMC的GPIO驱动能力、降低频率。
级别: 新手上路
金钱: 25 两
威望: 5 点
贡献值: 0 点
综合积分: 10 分
发表于: 17天前
将脚本sd_fusing.sh中改一下tszw_position=1105就行了 ,但是后面往emmc中烧写的时候又出现emmc加载失败,不知道为何?
Powered by下次自动登录
现在的位置:
Tiny4412裸机程序之代码在DDR SDRAM中运行
上一此实验我们讲解了如何对代码进行重定位,但是将代码重定位到只有256K的IRAM中作用不大。正确的做法是将代码重定位到容量更大的主存中,即DRAM中。
Exynos4412中有两个独立的DRAM控制器,分别叫DMC0和DMC1。DMC0和DMC1分别支持最大1.5GB的DRAM,它们都支持DDR2/DDR3和LPDDR2等,512 Mb, 1 Gb, 2 Gb, 4 Gb and 8 Gbit的内存设备,支持16/32bit的位宽。DRAM0 对应的地址是0xxAFFF_FFF共1.5GB,DRAM1 对应的地址是0xA000_000~0x共1.5GB。
DRAM控制器地址映射
Tiny4412的1GB的DRAM是由4片大小为128MX16的DDR3芯片组合而成,下面看一下Tiny4412的原理图:
Tiny4412 DDR电路图
Tiny4412 DDR电路图
从上两图可以看出,这四片DDR 芯片被分成了两两一组,组成32位数据,四片都是挂接到DMC0处。
如何才能使用DRAM?对应Tiny4412而言,由于用到了DMC0,所有我们需要初始化DMC0和DDR3 DRAM芯片。
声明一下:
从这一节开始我们的程序结构发生了一些变化,前几个实验我们只生成一个文件,从这个实验开始我们生成两个文件,BL2.bin和main.bin,其中BL2.bin文件的链接地址是0x;(使用的是位置无关码,程序可以在任意可用的内存中运行),main.bin 文件的链接地址是0x43E00000(使用的并不是位置无关码,所有程序必须位于该地址处才能正常运行)。需要在SD卡上烧写三部分程序,分别是:
1.BL1(由三星提供):实现一些初始化
2.BL2(我们自己编写源码,用mkbl2工具生成):板级初始化,并完成代码重定位到DDR SDRAM,完成跳转
3.主代码:实现我们想要的功能
三部分代码在SD卡的位置如下:
程序在SD卡的位置分布
从图中可以看出,BL1.bin烧写到SD卡扇区1,BL2.bin烧写到sd卡的扇区17,main.bin烧写到sd卡的扇区49处。
整个程序的运行过程大致如下:系统上电后,首先将sd卡扇区1处的bl1拷贝到IRAM的0x地址处,然后运行该部分代码,该部分代码首先又会加载BL2.bin,BL2.bin会进行时钟和DRAM初始化,然后把位于sd卡中扇区49处的main.bin拷贝到DRAM的0x43E00000地址处,最后跳转到该地址处继续运行。
一、程序说明
DDR的初始化顺序在前一篇文章我们已经经过,下面就根据前面提及的步骤一一来进行设置。
注:看到这么多设置步骤,实在太繁琐了,我们参考u-boot for Tiny4412中的代码,搞明白它设置了哪些东西:
* (C) Copyright 2011 Samsung Electronics Co. Ltd
* See file CREDITS for list of people who contributed to this
* project.
* This prog you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
#include &config.h&
#include &asm/arch/cpu.h&
#define MCLK_400
.globl mem_ctrl_asm_init
mem_ctrl_asm_init:
/* Async bridge configuration at CPU_core:
* 1: half_sync
* 0: full_sync */
ldr r0, =0x
mov r1, #1
str r1, [r0]
/*这几行代码不知道什么意思,以及这样做的原因*/
/*****************************************************************/
/*DREX0***********************************************************/
/*****************************************************************/
ldr r0, =APB_DMC_0_BASE
ldr r1, =0xe0000086
str r1, [r0, #DMC_PHYCONTROL1]
/*2. If on die termination is required, enable PhyControl1.term_write_en,
PhyControl1.term_read_en.*/
ldr r1, =0xE3854C03
str r1, [r0, #DMC_PHYZQCONTROL]
/*3. If ZQ calibration is required, disable PhyZQControl.
ctrl_zq_mode_noterm and enable PhyZQCon-trol.
ctrl_zq_start so that the PHY automatically calibrates
the I/Os to match the driving and termination impedance
by referencing resistor value of an external resistor
and updates the matched value during auto re-fresh cycles.*/
mov r2, #0x100000
1: subs r2, r2, #1
ldr r1, =0x7110100A
str r1, [r0, #DMC_PHYCONTROL0]
/*4. Set the PhyControl0.ctrl_start_point and PhyControl0.
ctrl_inc bit-fields to correct value according to clock frequency.
Set the PhyControl0.ctrl_dll_on bit-field to &1& to activate the PHY DLL.*/
ldr r1, =0xe0000086
str r1, [r0, #DMC_PHYCONTROL1]
/*5. DQS Cleaning: set the PhyControl1.ctrl_shiftc and PhyControl1.
ctrl_offsetc bit-fields to the proper value according to clock frequency,
board delay and memory tDQSCK parameter.*/
ldr r1, =0x7110100B
str r1, [r0, #DMC_PHYCONTROL0]
/*6. Set the PhyControl0.ctrl_start bit-field to &1&.*/
ldr r1, =0x
str r1, [r0, #DMC_PHYCONTROL2]
/*DQS offset*/
/*实验了一下可以省略,默认值就是全零*/
ldr r1, =0x0FFF301A
str r1, [r0, #DMC_CONCONTROL]
/*7. Set the ConControl. At this moment,
an auto refresh counter should be off.*/
ldr r1, =0x
str r1, [r0, #DMC_MEMCONTROL]
/*8. Set the MemControl. At this moment,
all power down modes and periodic ZQ(pzq_en) should be off.*/
ldr r1, =0x40e01323
str r1, [r0, #DMC_MEMCONFIG0]
ldr r1, =0x60e01323
str r1, [r0, #DMC_MEMCONFIG1]
/*9. Set the MemConfig0 register. If there are two external memory chips,
also set the MemConfig1 register.*/
ldr r1, =(0x | CONFIG_IV_SIZE)
str r1, [r0, #DMC_IVCONTROL]
/*Memory Channel Interleaving*/
/*实验了一下可以省略,用默认值就可以*/
ldr r1, =0xff000000
str r1, [r0, #DMC_PRECHCONFIG]
/*10. Set the PrechConfig and PwrdnConfig registers.*/
ldr r1, =0x000000BB
str r1, [r0, #DMC_TIMINGAREF] @TimingAref
ldr r1, =0x4046654f
str r1, [r0, #DMC_TIMINGROW] @TimingRow
ldr r1, =0x
str r1, [r0, #DMC_TIMINGDATA] @TimingData
ldr r1, =0x52000a3c
str r1, [r0, #DMC_TIMINGPOWER] @TimingPower
/*11. Set the TimingAref, TimingRow, TimingData and
TimingPower registers according to memory AC parame-ters.*/
/* chip 0 */
ldr r1, =0x
str r1, [r0, #DMC_DIRECTCMD]
/*19. Issue a NOP command using the DirectCmd register to assert and to hold CKE to a logic high level.*/
mov r2, #0x100000
2: subs r2, r2, #1
/*20. Wait for tXPR(max(5nCK,tRFC(min)+10ns)) or set tXP to tXPR value before step 17. If the system set tXP to tXPR, then the system must set tXP to proper value before normal memory operation.*/
ldr r1, =0x
str r1, [r0, #DMC_DIRECTCMD]
ldr r1, =0x
str r1, [r0, #DMC_DIRECTCMD]
ldr r1, =0x
str r1, [r0, #DMC_DIRECTCMD]
ldr r1, =0x
str r1, [r0, #DMC_DIRECTCMD]
/*没搞明白这里发的什么指令*/
mov r2, #0x100000
3: subs r2, r2, #1
ldr r1, =0x0a000000
str r1, [r0, #DMC_DIRECTCMD]
/*26. Issues a ZQINIT commands using the DirectCmd register.*/
mov r2, #0x100000
4: subs r2, r2, #1
/*27. If there are two external memory chips, perform steps 19 ~ 26 procedures for chip1 memory device.*/
/* chip 1 */
ldr r1, =0x
str r1, [r0, #DMC_DIRECTCMD]
mov r2, #0x100000
5: subs r2, r2, #1
ldr r1, =0x
str r1, [r0, #DMC_DIRECTCMD]
ldr r1, =0x
str r1, [r0, #DMC_DIRECTCMD]
ldr r1, =0x
str r1, [r0, #DMC_DIRECTCMD]
ldr r1, =0x
str r1, [r0, #DMC_DIRECTCMD]
mov r2, #0x100000
6: subs r2, r2, #1
ldr r1, =0x0a100000
str r1, [r0, #DMC_DIRECTCMD]
mov r2, #0x100000
7: subs r2, r2, #1
ldr r1, =0xe000008e
str r1, [r0, #DMC_PHYCONTROL1]
ldr r1, =0xe0000086
str r1, [r0, #DMC_PHYCONTROL1]
mov r2, #0x100000
8: subs r2, r2, #1
/*****************************************************************/
/*DREX1***********************************************************/
/*****************************************************************/
ldr r0, =APB_DMC_1_BASE
ldr r1, =0xe0000086
str r1, [r0, #DMC_PHYCONTROL1]
ldr r1, =0xE3854C03
str r1, [r0, #DMC_PHYZQCONTROL]
mov r2, #0x100000
1: subs r2, r2, #1
ldr r1, =0xe000008e
str r1, [r0, #DMC_PHYCONTROL1]
ldr r1, =0xe0000086
str r1, [r0, #DMC_PHYCONTROL1]
ldr r1, =0x
str r1, [r0, #DMC_PHYCONTROL0]
ldr r1, =0x7110100A
str r1, [r0, #DMC_PHYCONTROL0]
ldr r1, =0xe0000086
str r1, [r0, #DMC_PHYCONTROL1]
ldr r1, =0x7110100B
str r1, [r0, #DMC_PHYCONTROL0]
ldr r1, =0x
str r1, [r0, #DMC_PHYCONTROL2]
ldr r1, =0x0FFF301A
str r1, [r0, #DMC_CONCONTROL]
ldr r1, =0x
str r1, [r0, #DMC_MEMCONTROL]
ldr r1, =0x40e01323 @Interleaved?
str r1, [r0, #DMC_MEMCONFIG0]
ldr r1, =0x60e01323
str r1, [r0, #DMC_MEMCONFIG1]
ldr r1, =(0x | CONFIG_IV_SIZE)
str r1, [r0, #DMC_IVCONTROL]
ldr r1, =0xff000000
str r1, [r0, #DMC_PRECHCONFIG]
ldr r1, =0x000000BB
str r1, [r0, #DMC_TIMINGAREF] @TimingAref
ldr r1, =0x4046654f
str r1, [r0, #DMC_TIMINGROW] @TimingRow
ldr r1, =0x
str r1, [r0, #DMC_TIMINGDATA] @TimingData
ldr r1, =0x52000a3c
str r1, [r0, #DMC_TIMINGPOWER] @TimingPower
/* chip 0 */
ldr r1, =0x
str r1, [r0, #DMC_DIRECTCMD]
mov r2, #0x100000
2: subs r2, r2, #1
ldr r1, =0x
str r1, [r0, #DMC_DIRECTCMD]
ldr r1, =0x
str r1, [r0, #DMC_DIRECTCMD]
ldr r1, =0x
str r1, [r0, #DMC_DIRECTCMD]
ldr r1, =0x
str r1, [r0, #DMC_DIRECTCMD]
mov r2, #0x100000
3: subs r2, r2, #1
ldr r1, =0x0a000000
str r1, [r0, #DMC_DIRECTCMD]
mov r2, #0x100000
4: subs r2, r2, #1
/* chip 1 */
ldr r1, =0x
str r1, [r0, #DMC_DIRECTCMD]
mov r2, #0x100000
5: subs r2, r2, #1
ldr r1, =0x
str r1, [r0, #DMC_DIRECTCMD]
ldr r1, =0x
str r1, [r0, #DMC_DIRECTCMD]
ldr r1, =0x
str r1, [r0, #DMC_DIRECTCMD]
ldr r1, =0x
str r1, [r0, #DMC_DIRECTCMD]
mov r2, #0x100000
6: subs r2, r2, #1
ldr r1, =0x0a100000
str r1, [r0, #DMC_DIRECTCMD]
mov r2, #0x100000
7: subs r2, r2, #1
ldr r1, =0xe000008e
str r1, [r0, #DMC_PHYCONTROL1]
ldr r1, =0xe0000086
str r1, [r0, #DMC_PHYCONTROL1]
mov r2, #0x100000
8: subs r2, r2, #1
/*****************************************************************/
/*Finalize********************************************************/
/*****************************************************************/
ldr r0, =APB_DMC_0_BASE
ldr r1, =0x0FFF303A
str r1, [r0, #DMC_CONCONTROL]
/*28. Set the ConControl to turn on an auto refresh counter.*/
ldr r0, =APB_DMC_1_BASE
ldr r1, =0x0FFF303A
str r1, [r0, #DMC_CONCONTROL]
/*28. Set the ConControl to turn on an auto refresh counter.*/
mov pc, lr
二、编译、烧写、运行
通过FTP或者其他工具将文件上传到服务器上去,输入make命令进行编译将得到make_bl2.bin和main.bin文件。
将SD卡插入电脑,并让VmWare里的Ubuntu识别出来,然后执行如下命令:
sudo ./sd_fusing.sh /dev/sdb ../9_reload_ddr/BL2/make_bl2.bin ../9_reload_ddr/MAIN/main.bin
二、运行现象
将SD卡插入Tiny4412开发板,连接串口工具,上电,你会看到和上一节的运行效果一样(因为我们没有修改LED的显示效果,只是修改了程序的运行地址,这个对外是看不出区别的)。
串口可以看到如下显示信息;
从图的信息室打印的地址0x43E00000处的内容(main.bin文件的链接地址)
我们将上述打印的信息和main.bin文件进行对比,发现完全一样,说明代码已经拷贝到了正确的链接地址。
完整的程序下载地址(解压密码:):
【上篇】【下篇】
您可能还会对这些文章感兴趣!
百度站内搜索
日志:232篇
评论:356条
分类:38个
标签:302个
运行:1041天
最后更新:日

我要回帖

更多关于 tiny4412 uboot烧写 的文章

 

随机推荐