在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4846|回复: 6

[原创] SD卡启动调试

[复制链接]
发表于 2010-8-5 20:40:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
     前天有个PMU设计人员要我验一下PMU内部的i2C模块,这个I2C跟我之前验证的I2C模块有些不同,这个是比较简单的,专门与外部电源管理芯片通讯的。其他功能还好,比较好验,有个功能却比较麻烦,就是在PMU将整个系统设为低功耗时,I2C会从一已经配好的数据寄存器里取得数据发送给外部电源管理芯片(此时要求SOC总线进入空闲状态)。我是在FPGA环境上,用ICE调试这块SOC,为了得到发送的数据,我只能将数据通过I2C发送到EEPROM(取代外部电源管理芯片),然后再让系统转为正常模式,读取EEPROM数据,比对是否正确。为什么说这么简单的事情有些困难呢?原因是我们之前做的验证都是通过JTAG ICE加载到FPGA中的,直接从ESRAM或DDR2执行代码。但现在由于要系统总线进入Idle模式,就不能用ICE(Jtag 会对总线有控制作用,很难控制总线Idle状态)。那就得用SD卡启动了。
    注:我们全是裸机跑程序,没有操作系统。
    之前验I2C双主机竞争时,就想学一下SD启动,这样可以节省资源,不过最后还是没有学,用双份资源解决了。现在没办法了,还得学。
    还好有个学姐是做SD卡控制器验证的,她做过SD卡启动,向他求救,她先告诉我怎样用WinHex怎样将代码加载到SD卡里(发给我一份文档),然后呢,她又让我把我工程直接套到他工程里,结果不成功。只能自己搞了。
    我让学姐把她的工程给我,从工程看,启动过程是这样的。首先向SD加载两段代码数据,一段是在SD卡的0~4k里,另一段加载到4k以后的地址。第一段代码是在ESRAM里执行的,第二段是DDR2里执行的。第一段就是学姐写的工程,第二段代码是我的工程代码。
    整个启动过程是这样的:首先这个芯片SOC在FPGA上设置为上电默为ESRAM映射为0x0地址,当选择SD卡启动时,系统一上电会将总线控制权交给DMA,DMA从SD卡般4k(在这个芯片只能般4K,硬件做死的)代码到ESRAM,然后将总线控制权给ARM (cpu),他会从0地址取代码执行,此时执行的就是第一段代码。那么他在第一段代码里做了什么呢?配置SD和DMA,将SD卡里的第二段代码(即4k以后的)由DMA从SD搬到DDR2,然后将DDR2首地址映射为0x0地址,将PC指向DDR2首地址(即0x0),接下来程序就会从DDR2取指令了(在DDR2里跑程序了,在哪跑程序其实就是在哪取指和数据),这就是在执行我的工程代码了。
    为什么没有成功呢?我没有看她的SD和DMA配置程序,我相信这里不会有错(因为学姐验证的这两个模块,这两个模块都很棘手!),我看的是其他代码,结果我发现如下几个问题:
第一:他没有进行REMAP;
第二:她没有将PC指向DDR2;
第三:在她的main里结束时,她加个了死循环while(1);(这怎么会跳呢。。。。)
第四:第二段工程没有加载到DDR2首地址
    于是我按照上边的问题对代码进行了修改,最后从SD卡成功启动并能成功执行到了我的代码。结果新的问题出现了。。。
    由于不能用ICE,因此我只能Uart打印调试信息,结果发现我代码执行到了一半,停在了不应该停的地方,什么原因呢?为什么会跑飞?之前我的程序在用ICE加载程序时是可以成功执行的啊!由于现在板别人在用,于是我在RVDS RVISS(模拟指令集上跑跑试试)结果发现在一个浮点运算处出了问题,出现了未定义指令。于是乎我就将那个浮点运算改掉,最后可以成功运行了。存在一个疑问,为什么呢?之前在JTAG调试时是可以的啊,硬件条件没有变啊!没办法,向系统组的学长请教,经过一番探讨,最后我发现我在工程向SD启动移植时,RVDS选项做了一个小修改,原来的RVDs内核选项是的是ARM1136J_S,而现在我选的ARM1136JF_S,这个选项影响到具体的编译器、汇编器、连接器。然后学长让我改回再试试,果然,真的是这里出了问题!
    我猜测问题答案是这样的:我们这版芯片没有加浮点运算单元,因此原来选择ARM1136J_S内核,会用相应的编译器等编译指令(不支持浮点),如果出现浮点运算,会软解成一般整数指令。而如果选择ARM1136J_S,会用包含有浮点指令的编译器编译,这样我选项选择了ARM1136JF_S内核,而实际用的是ARM1136J_S这一内核,引起用J_S内核执行JF_S的指令,因此出现了未定义指令,因此出错了。
    搞了两天总算将SD卡启动的东西弄个差不多。虽然最终PMU内部的I2C没有将那个数据发送出去(奇怪,难道是RTL设计的问题,还是有其他因素没有考虑到?得分析一下),但收获还是有的。
   在此提供一个小小的常识,有的回想,为什么系统一上电CPU就从SD取程序执行呢?还要那么费事的搬到ESRAM执行。原因是,ARM取指令是一条一条的取值执行,而SD卡本质是NAND,只支持块读写,不支持随机读写,因此就不能再SD卡里执行了。
   顺便奉献上WinHex软件和SD卡烧写说明,希望有的人能够用到。

WinHex 11.2 SR-1.rar

667.83 KB, 下载次数: 63 , 下载积分: 资产 -2 信元, 下载支出 2 信元

发表于 2010-8-7 21:17:45 | 显示全部楼层
不错   正在研究 SD controller
发表于 2010-8-19 10:57:59 | 显示全部楼层
顶一下。。。。。。。。。。。。
发表于 2010-9-17 20:46:58 | 显示全部楼层
很好饿你找呀
发表于 2011-1-7 18:02:05 | 显示全部楼层
thanks for share
发表于 2011-1-7 18:52:43 | 显示全部楼层
回复 1# zslhutu


    haodong000000000000000
发表于 2012-8-14 15:55:35 | 显示全部楼层
感谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

X

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-6-7 14:41 , Processed in 0.027225 second(s), 12 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表