九鼎创展论坛中文版English
登录 | 立即注册 设为首页收藏本站 切换到宽版
查看: 4162|回复: 2
打印 上一主题 下一主题

关于dnw下载uboot到0x23e00000运行的链接地址问题(已解决)

[复制链接]
跳转到指定楼层
楼主
发表于 2015-4-22 23:43:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 laotang365 于 2015-4-24 00:08 编辑

我的板子是512M的s5pv210,在usb启动模式下,可以通过dnw直接下载到三星的官方uboot中运行,具体步骤参考Sate210 android使用手册V1.0,百度文库就有。
我查看了源码,对链接地址有些疑惑。
三星的uboot在aftercopy之后开启了MMU功能,我的板子是512M内存,物理内存地址空间为0x3000 0000 ~0x4FFF FFFF,uboot源码设置的链接地址为0xc3e00000

根据uboot的mmu映射表:
#ifdef CONFIG_ENABLE_MMU

    #ifdef CONFIG_MCP_SINGLE
/*
* MMU Table for SMDKC110
* 0x0000_0000 -- 0xBFFF_FFFF => Not Allowed
* 0xB000_0000 -- 0xB7FF_FFFF => A:0xB000_0000 -- 0xB7FF_FFFF VA = PA
* 0xC000_0000 -- 0xCFFF_FFFF => A:0x3000_0000 -- 0x3FFF_FFFF 256M
* 0xD000_0000 -- 0xDFFF_FFFF => Not Allowed
* 0xE000_0000 -- 0xFFFF_FFFF => A:0xE000_0000 -- 0XFFFF_FFFF VA = PA
*/

    /* form a first-level section entry */
.macro FL_SECTION_ENTRY base,ap,d,c,b
    .word (\base << 20) | (\ap << 10) | \
          (\d << 5) | (1<<4) | (\c << 3) | (\b << 2) | (1<<1)
.endm
.section .mmudata, "a"
    .align 14
    // the following alignment creates the mmu table at address 0x4000.
    .globl mmu_table
mmu_table:
    .set __base,0
    // Access for iRAM
    .rept 0x100            //对应虚拟地址0 ~ 256M
    FL_SECTION_ENTRY __base,3,0,0,0
    .set __base,__base+1
    .endr

    // Not Allowed
    .rept 0x200 - 0x100    //对应虚拟地址256M ~ 512M
    .word 0x00000000
    .endr

    .set __base,0x200
    // should be accessed
    .rept 0x600 - 0x200//对应虚拟地址512M ~ 1.5G
    FL_SECTION_ENTRY __base,3,0,1,1
    .set __base,__base+1
    .endr

    .rept 0x800 - 0x600//对应虚拟地址1.5G ~ 2G
    .word 0x00000000
    .endr

    .set __base,0x800
    // should be accessed
    .rept 0xb00 - 0x800//对应虚拟地址2 ~ 2.75G
    FL_SECTION_ENTRY __base,3,0,0,0
    .set __base,__base+1
    .endr

/*    .rept 0xc00 - 0xb00
    .word 0x00000000
    .endr */

    .set __base,0xB00
    .rept 0xc00 - 0xb00//对应虚拟地址2.75G ~ 3G 256MB
    FL_SECTION_ENTRY __base,3,0,0,0
    .set __base,__base+1
    .endr

    .set __base,0x300
    // 256MB for SDRAM with cacheable
    .rept 0xD00 - 0xC00//对应虚拟地址3G ~ 3.25G, 256MB
    FL_SECTION_ENTRY __base,3,0,1,1
    .set __base,__base+1
    .endr

    // access is not allowed.
    @.rept 0xD00 - 0xC80//对应虚拟地址3G ~ 3.125G
    @.word 0x00000000
    @.endr

    .set __base,0xD00
    // 1:1 mapping for debugging with non-cacheable
    .rept 0x1000 - 0xD00//对应虚拟地址3.125G ~ 4G,
    FL_SECTION_ENTRY __base,3,0,0,0
    .set __base,__base+1
    .endr   
   
    #else    // CONFIG_MCP_AC, CONFIG_MCP_H, CONFIG_MCP_B

内存映射后的地址为:0xC0000000~0xCFFF FFFF请教各位前辈,dnw下载uboot到DDR中,链接地址(MMU转换后为0x33e00000)与0x23e0 0000并不对应,后面的代码为什么还能正常运行呢?
回复

使用道具 举报

沙发
 楼主| 发表于 2015-4-23 21:47:53 | 只看该作者
本帖最后由 laotang365 于 2015-4-23 22:55 编辑

以为想通了,还是不对
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2015-4-23 23:44:19 | 只看该作者
本帖最后由 laotang365 于 2015-5-7 20:19 编辑

我猜测是DDR初始化配置造成的,当CPU访问0x2000 0000的时候,其实和访问0x3000 0000是访问同一个DDR真实地址,因为MENCONFIG0寄存器可以屏蔽地址高位,恩,应该是因为这个。这不是MMU映射造成的,是cpuDDR初始化配置时屏蔽了地址高位。呵呵,三星的cpu真是方便阉割啊,1G内存变成512M还能用dnw下载uboot。唉,求人不如求己啊,虽然想通了这是很简单的问题,但是毕竟板子和程序都不是自己设计的,谁能想起还有这个细节。蛋疼。
我烧写三星uboot后重启执行md 20000000,此时死机了,比对uboot源码,说明uboot的DDR配置和x210_usb.bin(原名V210_USB.BL2.bin)的DDR配置是不同的,如果相同后面跑内核就有问题了。猜测x210_usb.bin(原名V210_USB.BL2.bin)的DDR应该配MENCONFIG0 = 0x30E01313,这样无论访问0x23e0 0000还是访问0x33e0 0000,都会打开Xm1_CS0片选。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳市九鼎创展科技官方论坛 ( 粤ICP备11028681号-2  

GMT+8, 2024-5-6 11:12 , Processed in 0.027774 second(s), 16 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表