OK6410的uboot代码设置同步模式时0x7E00F900的初始值是不是0x0000801E?如果是,为什么bne check_syncack不循环?

l502091250 2016-08-15 06:07:20
uboot是nand启动,所以CONFIG_SYNC_MODE定过。根据Others control register 0x7E00_F900初始值是0x0000_801E,下边代码执行后,
ldr r1, [r0, #OTHERS_OFFSET, r1等于0x0000_80DE,
and r1, r1, r2之后,r1等于0,
cmp r1, #0xf00不相等

应该跳转到check_syncack重新执行,一直在那里死循环。可实际代码貌似没有一直在那里循环,为什么?哪里修改了0x7E00_F900寄存器的值?如果说设置了值,那0x7E00_F900寄存器值至少是0xXXXX_XFXX才可以与操作之后依然是0xf00。但根据文档,寄存器的[11:8]是只读的,不能设置。
	ldr	r0, =ELFIN_CLOCK_POWER_BASE	@0x7e00F000

#ifdef CONFIG_SYNC_MODE
ldr r1, [r0, #OTHERS_OFFSET] @0x900
mov r2, #0x40
orr r1, r1, r2
str r1, [r0, #OTHERS_OFFSET]

nop
nop
nop
nop
nop

ldr r2, =0x80
orr r1, r1, r2
str r1, [r0, #OTHERS_OFFSET]

check_syncack:
ldr r1, [r0, #OTHERS_OFFSET]
ldr r2, =0xf00
and r1, r1, r2
cmp r1, #0xf00
bne check_syncack
#else /* ASYNC Mode */
nop
nop
nop
nop
nop

ldr r1, [r0, #OTHERS_OFFSET]
bic r1, r1, #0xC0
orr r1, r1, #0x40
str r1, [r0, #OTHERS_OFFSET]

wait_for_async:
ldr r1, [r0, #OTHERS_OFFSET]
and r1, r1, #0xf00
cmp r1, #0x0
bne wait_for_async

ldr r1, [r0, #OTHERS_OFFSET]
bic r1, r1, #0x40
str r1, [r0, #OTHERS_OFFSET]
#endif

寄存器截图
...全文
745 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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