eboot启动之烦恼!

xuefeng_baggio 2009-11-05 10:31:28
各位朋友!小弟经过几天努力eboot问题终于有成绩了!我现在想把我bsp升级成三星官方的?我的nboot是ads编译的。现在 FMD_ReadSector(dwSector,(LPBYTE)dwRAM,NULL, 1);函数读取nand中数据,调试信息如下:

WinCE NAND Boot v1.00
Nov 05 2009 10:14:53
dwSector:0x00000040
dwLength:0x00000100
dwRAM:0x30038000

这段下面都是读取的数据:
0x000000fe
0x00000003
0x00000000
0x000000ea
0x00000000
0x00000000
0x00000000
0x00000000
0x00000000
0x00000000
0x00000000
0x00000000
0x00000000
0x00000000

我比较了下这个数据和我的eboot.nb0竟然是一样的?那么问题出来了?为什么我的eboot还起不来呢??我在eboot中点灯了没发应。我把点灯也给大家看看。因为是汇编我不敢确信自己是对的。
; Hanson Test LED ++
; Led_Display
ldr r0,=GPFCON
ldr r1,=0x5500
str r1,[r0]
ldr r0,=GPFDAT
ldr r1,=0x0
str r1,[r0]

b .
; Hanson Test LED -- 我的小灯是GPIOF4-GPIOF7.请各位帮俺分析下。不胜感激!

...全文
441 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
逸萌 2011-01-08
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 veabol 的回复:]
我没用点灯调试过,直接用的AXD看通过反汇编调试,因为板子最初没设计灯
[/Quote]up
xuefeng_baggio 2009-11-09
  • 打赏
  • 举报
回复
b main之前的开启是mmu开启之后的!
博说医械研发 2009-11-06
  • 打赏
  • 举报
回复
s2440IOP->GPFCON &=0x5500; 设置输出不要用与
xuefeng_baggio 2009-11-06
  • 打赏
  • 举报
回复
为什么在main函数中点灯没反应呢??

volatile S3C2440A_IOPORT_REG *s2440IOP = (S3C2440A_IOPORT_REG *)OALPAtoVA(S3C2440A_BASE_REG_PA_IOPORT, FALSE);
s2440IOP->GPFCON &=0x5500;
s2440IOP->GPFDAT &= 0x0;
点灯程序。大家看看这会出什么问题?感觉是不是没跳转过来??还是什么原因?想问下OALPAtoVA这个函数要实现吗?好像这个函数只有一个定义??
xuefeng_baggio 2009-11-06
  • 打赏
  • 举报
回复
韦伯大哥,讲的有道理!真糊涂!那看样子已经跳到main那了?我在看看怎么回事??
guopeixin 2009-11-06
  • 打赏
  • 举报
回复
印象中“b main ”的位置在MMU开启之后,进入C函数之前,楼主b main之前点灯是在MMU开启之后还是之前呢?

博说医械研发 2009-11-06
  • 打赏
  • 举报
回复
我没用点灯调试过,直接用的AXD看通过反汇编调试,因为板子最初没设计灯
博说医械研发 2009-11-06
  • 打赏
  • 举报
回复
1、确定一下OALPAtoVA函数是否正确
2、跳的main是否有问题
第一条看源代码,第二条用AXD查看
xuefeng_baggio 2009-11-06
  • 打赏
  • 举报
回复
我查出来了。好像是mmu出问题了?我在b main之前点灯
mov r0, #0x91000000
orr r0, r0, #0x600000
orr r0, r0, #0x54
ldr r1, =0x91600054

mov r0, #0x60
str r0, [r1]
小灯亮了?但是在main中还是不行?
volatile S3C2440A_IOPORT_REG *s2440IOP = (S3C2440A_IOPORT_REG *)OALPAtoVA(S3C2440A_BASE_REG_PA_IOPORT, FALSE);
s2440IOP->GPFCON = (0x1 << 8) |(0x1 <<10) | (0x1 << 12) | (0x1 <<14);
s2440IOP->GPFDAT =((s2440IOP->GPFDAT) & 0xF) | ((0x0 & 0xF) << 4);
各位帮我看看是怎么回事??头都大了??韦伯大哥?gooogleman??
博说医械研发 2009-11-05
  • 打赏
  • 举报
回复
最有效的办法就是通过ADS连接之后,通过查看反汇编与源代码比较,我当时这么做的,分析问题很有效
gooogleman 2009-11-05
  • 打赏
  • 举报
回复
那就在main之前点灯。

还有看看你的MMU初始化部分,

开了MMU就不能再用物理地址,和开始的部分不同的。
xuefeng_baggio 2009-11-05
  • 打赏
  • 举报
回复
gooogleman讲的有道理!这个问题就是我在starup中点灯!已经有效果了 但是eboot调试信息没出来!不知道eboot的main函数有没有执行!
gooogleman 2009-11-05
  • 打赏
  • 举报
回复
晕,你说起不来

别人还要反问你为什么起不来,这个太多原因了。
不好说啊。

所以很多人就不敢回答了。
xuefeng_baggio 2009-11-05
  • 打赏
  • 举报
回复
失败!没人顶!自己顶下吧!现在点灯可以了!但是eboot还是起不来??我用的是三星官方的eboot??
博说医械研发 2009-11-05
  • 打赏
  • 举报
回复
ldr r0, = GPFDAT(可是这里的灯缺不亮)
mov r1, #0xC0
str r1, [r0]

你用的是物理地址吧?
上边已经开了MMU,要访问虚拟地址才行,没看到下边是用的0x80000000开始的地址吗?
你在这个地方用物理地址点灯肯定会出错的
xuefeng_baggio 2009-11-05
  • 打赏
  • 举报
回复
大侠们!我的eboot停在这个最好的地方时为什么呀?

ldr r0, =VirtualStart(在这句前面和后面点灯都是亮的)

cmp r0, #0 ; make sure no stall on "mov pc,r0" below
mcr p15, 0, r1, c1, c0, 0
mov pc, r0 ; & jump to new virtual address
nop

; MMU & caches now enabled.
; (r10) = physcial address of 1st level page table
;

VirtualStart
ldr r0, = GPFDAT(可是这里的灯缺不亮)
mov r1, #0xC0
str r1, [r0]

mov sp, #0x80000000
add sp, sp, #0x30000 ; arbitrary initial super-page stack pointer
b main

这最后几句是什么作用呀?我困惑了!??
博说医械研发 2009-11-05
  • 打赏
  • 举报
回复
ands r9, pc, #0xFF000000 ; see if we are in flash or in ram
bne %f20
这两句是判断要不要复制,正常情况下会直接向下跳转到标号20处的,你的没跳吗?
看下执行ands r9, pc, #0xFF000000 时候的PC值是多少
xuefeng_baggio 2009-11-05
  • 打赏
  • 举报
回复
请教下eboot中还要做这个工作吗?nboot不是以前copy到ram中了为什么三星的代码还要做copy呢??不懂等到高人指点!韦伯大哥?帮我讲讲!
xuefeng_baggio 2009-11-05
  • 打赏
  • 举报
回复
大家好!最新进展程序死在这个里面了
; Copy boot loader to memory

ands r9, pc, #0xFF000000 ; see if we are in flash or in ram
bne %f20 ; go ahead if we are already in ram

; This is the loop that perform copying.
ldr r0, = 0x38000 ; offset into the RAM
add r0, r0, #PHYBASE ; add physical base
mov r1, r0 ; (r1) copy destination
ldr r2, =0x0 ; (r2) flash started at physical address 0
ldr r3, =0x10000 ; counter (0x40000/4)
10 ldr r4, [r2], #4
str r4, [r1], #4
subs r3, r3, #1
bne %b10

不知道什么原因??难道这不要cpoy??
gooogleman 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 veabol 的回复:]
ADS可以用的,在你eboot的startup.s中认为确定能通过的地方加一句b .  这样执行过程中就会停在那里,直接启动AXD,查看当前PC值,再通过setpc跳到 b .的下一句,然后单步执行就可以了。
另外,在这种情况下不需要加HJTAG等软件的初始化脚本,如果开了MMU,再加脚本会出错。
[/Quote]

这个要顶!嘿嘿。学习了!以前我一直不懂如何调试eboot,veabol 老大,有空写个好的博客吧,
让后辈们学习啊!
加载更多回复(3)

19,498

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧