在s3c2440a的mon程序中支持SD Card时要注意:在2440addr.h

[复制链接]
 楼主| 阿南 发表于 2007-11-23 22:14 | 显示全部楼层 |阅读模式
中的rSDIDAT寄存器地址定义有误.<br /><br />最近想在2440a的一个bootloader中增加SD卡的读写功能,该bootloader的原始代码是官方的u2440amon,由于官方的2440a&nbsp;test程序中包含了SD&nbsp;Card的测试代码sdi.c和sdi.h,直接将这两个文件加进工程中,运行时确出现了问题。后来直接对官方的2440a_fw_testcode_rev06_040607和u2440amon_rev03_20040315进行了测试,将sdi.c和sdi.h从前者复制到后者,且加入到工程中,及增加测试调用,结果是前者测试正常,后者出现了问题,如图:<br />&nbsp;https://bbs.21ic.com/upfiles/img/200711/2007112322516528.jpg<br />将相关的时钟、GPIO口、中断等所有能想到的都找了,还是没找出原因!后来没办法,只能对照数据手册上的寄存器说明,跟踪、分析代码,查看运行过程中有关的寄存器值。<br />程序死循环在Wt_Block函数中的Chk_DATend函数里,如下图:<br />https://bbs.21ic.com/upfiles/img/200711/2007112322836630.jpg<br />&nbsp;<br />原因是“Data&nbsp;Transfer&nbsp;Finish”位一直都没有置位,即写数据没有完成。原先以为是和时钟、I/O口等有关,但没找到原因,只好单步跟踪写数据的过程,分别跟踪test和mon两个工程的Wt_Block函数,查看寄存器值,后来发现他们有些不一样,特别是每次将数据写入rSDIDAT(SDI数据寄存器)时,umon中的0x5A00003C值就加1,后来终于在反汇编代码中发现,在umon中,rSDIDAT地址居然是0x5A00003C,而test中是0x5A000040,如下图:<br />https://bbs.21ic.com/upfiles/img/200711/20071123221043789.jpg<br />&nbsp;<br />请看图中的649行的最后一句反汇编代码,就是将数据写入rSDIDAT,在umon中,rSDIDAT地址为r3(0x5a000000)+0x3c;在test中为r3+0x40。所以就分别在mon、test该部分的源程序中双击选rSDIDAT,点右键的”go&nbsp;to&nbsp;macro&nbsp;declaration&nbsp;of&nbsp;rSDIDAT”跳到2440addr.h文件中的该定义出,发现如下图:<br />&nbsp;https://bbs.21ic.com/upfiles/img/200711/2007112322141245.jpg<br />此时将该寄存器地址修改过来,再编译运行就正常了。<br />
 楼主| 阿南 发表于 2007-11-23 22:15 | 显示全部楼层

图1

<br /> 相关链接:<a href='https://bbs.21ic.com/upfiles/img/200711/2007112322516528.jpg'>https://bbs.21ic.com/upfiles/img/200711/2007112322516528.jpg</a>
 楼主| 阿南 发表于 2007-11-23 22:19 | 显示全部楼层
 楼主| 阿南 发表于 2007-11-23 22:19 | 显示全部楼层
 楼主| 阿南 发表于 2007-11-23 22:20 | 显示全部楼层
icecut 发表于 2007-11-24 15:42 | 显示全部楼层

我的是这个版本的

#ifdef&nbsp;__BIG_ENDIAN&nbsp;&nbsp;/*&nbsp;edited&nbsp;for&nbsp;2440A&nbsp;*/<br />#define&nbsp;rSDIDAT&nbsp;&nbsp;&nbsp;&nbsp;(*(volatile&nbsp;unsigned&nbsp;*)0x5a00004c)&nbsp;&nbsp;&nbsp;&nbsp;//SDI&nbsp;data<br />#define&nbsp;SDIDAT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x5a00004c&nbsp;&nbsp;<br />#else&nbsp;&nbsp;//&nbsp;Little&nbsp;Endian<br />#define&nbsp;rSDIDAT&nbsp;&nbsp;&nbsp;&nbsp;(*(volatile&nbsp;unsigned&nbsp;*)0x5a000040)&nbsp;&nbsp;&nbsp;&nbsp;//SDI&nbsp;data&nbsp;<br />#define&nbsp;SDIDAT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x5a000040&nbsp;&nbsp;<br />#endif&nbsp;&nbsp;&nbsp;//SD&nbsp;Interface<br />
xieqin 发表于 2007-11-24 18:49 | 显示全部楼层

2440 手册上有讲到吧

SDIDAT&nbsp;<br /><br />0x5A000040,&nbsp;44,&nbsp;48,<br />4C(Li/W,&nbsp;Li/HW,&nbsp;Li/B,&nbsp;Bi/<br />0x5A000041(Bi/HW),<br />0x5A000043(Bi/B)<br /><br />NOTE:<br />!&nbsp;(Li/W,&nbsp;Li/HW,&nbsp;Li/B):&nbsp;Access&nbsp;by&nbsp;Word/HalfWord//Byte&nbsp;unit&nbsp;when&nbsp;endian&nbsp;mode&nbsp;is&nbsp;Little<br />!&nbsp;(Bi/W):&nbsp;Access&nbsp;by&nbsp;Word&nbsp;unit&nbsp;when&nbsp;endian&nbsp;mode&nbsp;is&nbsp;Big<br />!&nbsp;(Bi/HW):&nbsp;Access&nbsp;by&nbsp;HalfWord&nbsp;unit&nbsp;when&nbsp;endian&nbsp;mode&nbsp;is&nbsp;Big<br />!&nbsp;(Bi/B):&nbsp;Access&nbsp;by&nbsp;Byte&nbsp;unit&nbsp;when&nbsp;endian&nbsp;mode&nbsp;is&nbsp;Big<br /><br />像2440addr.h这种头文件本身设计就不好,如果想用MMU把寄存器保护起来,都没法用了.<br /><br />下面这样就好多了:<br />typedef&nbsp;struct{<br />&nbsp;&nbsp;&nbsp;&nbsp;reg32&nbsp;SDICON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;//0x5a000000)&nbsp;&nbsp;&nbsp;&nbsp;//SDI&nbsp;control<br />&nbsp;&nbsp;&nbsp;&nbsp;reg32&nbsp;SDIPRE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;//0x5a000004)&nbsp;&nbsp;&nbsp;&nbsp;//SDI&nbsp;baud&nbsp;rate&nbsp;prescaler<br />&nbsp;&nbsp;&nbsp;&nbsp;reg32&nbsp;SDICARG&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;//0x5a000008)&nbsp;&nbsp;&nbsp;&nbsp;//SDI&nbsp;command&nbsp;argument<br />&nbsp;&nbsp;&nbsp;&nbsp;reg32&nbsp;SDICCON&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;//0x5a00000c)&nbsp;&nbsp;&nbsp;&nbsp;//SDI&nbsp;command&nbsp;control<br />&nbsp;&nbsp;&nbsp;&nbsp;reg32&nbsp;SDICSTA&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;//0x5a000010)&nbsp;&nbsp;&nbsp;&nbsp;//SDI&nbsp;command&nbsp;status<br />&nbsp;&nbsp;&nbsp;&nbsp;reg32&nbsp;SDIRSP0&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;//0x5a000014)&nbsp;&nbsp;&nbsp;&nbsp;//SDI&nbsp;response&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;reg32&nbsp;SDIRSP1&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;//0x5a000018)&nbsp;&nbsp;&nbsp;&nbsp;//SDI&nbsp;response&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;reg32&nbsp;SDIRSP2&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;//0x5a00001c)&nbsp;&nbsp;&nbsp;&nbsp;//SDI&nbsp;response&nbsp;2<br />&nbsp;&nbsp;&nbsp;&nbsp;reg32&nbsp;SDIRSP3&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;//0x5a000020)&nbsp;&nbsp;&nbsp;&nbsp;//SDI&nbsp;response&nbsp;3<br />&nbsp;&nbsp;&nbsp;&nbsp;reg32&nbsp;SDIDTIMER&nbsp;&nbsp;;&nbsp;//0x5a000024)&nbsp;&nbsp;&nbsp;&nbsp;//SDI&nbsp;data/busy&nbsp;timer<br />&nbsp;&nbsp;&nbsp;&nbsp;reg32&nbsp;SDIBSIZE&nbsp;&nbsp;&nbsp;;&nbsp;//0x5a000028)&nbsp;&nbsp;&nbsp;&nbsp;//SDI&nbsp;block&nbsp;size<br />&nbsp;&nbsp;&nbsp;&nbsp;reg32&nbsp;SDIDCON&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;//0x5a00002c)&nbsp;&nbsp;&nbsp;&nbsp;//SDI&nbsp;data&nbsp;control<br />&nbsp;&nbsp;&nbsp;&nbsp;reg32&nbsp;SDIDCNT&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;//0x5a000030)&nbsp;&nbsp;&nbsp;&nbsp;//SDI&nbsp;data&nbsp;remain&nbsp;counter<br />&nbsp;&nbsp;&nbsp;&nbsp;reg32&nbsp;SDIDSTA&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;//0x5a000034)&nbsp;&nbsp;&nbsp;&nbsp;//SDI&nbsp;data&nbsp;status<br />&nbsp;&nbsp;&nbsp;&nbsp;reg32&nbsp;SDIFSTA&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;//0x5a000038)&nbsp;&nbsp;&nbsp;&nbsp;//SDI&nbsp;FIFO&nbsp;status<br />&nbsp;&nbsp;&nbsp;&nbsp;reg32&nbsp;SDIIMSK&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;//0x5a00003c)&nbsp;&nbsp;&nbsp;&nbsp;//SDI&nbsp;interrupt&nbsp;mask.&nbsp;edited&nbsp;for&nbsp;2440A<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />#ifdef&nbsp;__BIG_ENDIAN&nbsp;&nbsp;/*&nbsp;edited&nbsp;for&nbsp;2440A&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;reg32&nbsp;rsvd[3];<br />&nbsp;&nbsp;&nbsp;&nbsp;reg32&nbsp;SDIDAT&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;//0x5a00004c)&nbsp;&nbsp;&nbsp;&nbsp;//SDI&nbsp;data<br /><br />#else&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;reg32&nbsp;SDIDAT&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;//0x5a000040)&nbsp;&nbsp;&nbsp;&nbsp;//SDI&nbsp;data&nbsp;<br />#endif&nbsp;&nbsp;&nbsp;//SD&nbsp;Interface<br />}&nbsp;&nbsp;&nbsp;&nbsp;regSD_CTR;<br /><br />void&nbsp;Main(&nbsp;void&nbsp;)<br />{<br />#define&nbsp;SD_CONTROL_BASE&nbsp;0x5a000000<br />&nbsp;&nbsp;regSD_CTR&nbsp;*pSDCtr&nbsp;=&nbsp;((regSD_CTR&nbsp;*)SD_CONTROL_BASE)<br />.....<br />}<br /><br /><br />
 楼主| 阿南 发表于 2007-11-26 20:34 | 显示全部楼层

呵呵,尽管2440addr.h设计不好,但还是懒得去改,去换

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

本版积分规则

5786

主题

10224

帖子

463

粉丝
快速回复 在线客服 返回列表 返回顶部