//========================================================================
//TITLE:
// USB2DEMON烧录DBAU1200开发板flash入门教程
//AUTHOR:
// norains
//DATE:
// Friday 6-June-2008
//Environment:
// NONE
//========================================================================
因为AU1200的BOOT MODE先天不足,不能像很多ARM系列的CPU那样,可以通过从USB HOST启动,然后烧录片上FLASH,所以我们往往只能再购买一个仿真器,然后连接板子的EJTAG口来烧录FLASH。只是支持AU1200这款CPU的仿真器少之又少,RMI原厂推荐的仿真器也就只有BDI系列,可一个BDI2000售价就达3w,即使是从台湾带货,价格也在2.6w左右,所以让很多人望而却步。因为最近项目因素,需要一个仿真器烧录flash,在网上搜索,发现Macraigor公司的产品有支持AU1200的仿真器。经过权衡比较,最后决定购入该公司的一款usb2demon。不过由于文档不够详尽,很多细节没有表述清楚,以至于一开始自己走了不少弯路。在此将自己的烧录过程撰文,以使各位朋友少走点弯路。
首先当然是将仿真器连接到板子上的EJTAG口,安装驱动啊之类的琐屑东西,这部份就不详细说了,做这行的应该都知道。不过需要注意的是,EJTAG是14PIN的,插的时候注意不要插反了。仔细查看USB2DEMON的插座,会发现蓝色线的旁边有一个小三角符号,这个代表这个pin为1脚。
硬件连接好之后,因为需要烧录flash,所以必须要让AU1200处于调试状态。
首先打开配套的OCD Commander软件,最先弹出的是一个连接对话框。如图1:
这里根据文档,我们将OCD SPEED设置为2:12MHZ。好像默认的1:24也可以,不过没有试过,也不知道会不会在调试中一些奇奇怪怪的问题是因为该速度,所以我们还是老老实实按照文档设置为2:12MHZ。
确定之后,弹出命令对话窗口,如图2:
输入halt,让CPU进入debug状态。为了检查命令是否成功,可以输入status命令,查看是否成功进入debug状态,如图3:
接下这部就是非常重要,在命令行中键入reset,让CPU进行复位。然后我们再键入PC,如果返回的数值为BFC00000,即复位成功,如图4:
在图中我们可以看到,第一次复位后,PC为00000002,这次复位是不成功的,所以之后又再复位了一次,这次再检查PC值,为BFC00000,意味第二次复位成功。
在这里需要着重指出的是,如果复位不成功,俺么我们接下来的读取flash id,烧录flash等等一切操作,都将无一例外导致失败。
复位不成功的原因很多,在此先举例一种。有的开发板在对ejtag处理时,发送reset命令后并没有再对AU1200的nRESETIN发送低点评,导致复位失败。如果出现这种情况,我们依次进行下列操作,也许可以解决问题:
1)在OCD Commander中输入RESET
2)硬件复位,可以通过按板子上的RESET键实现。注意的是,这个操作不能通过关机再开机实现。
4)再次在OCD Commander中输入RESET,这时候检查PC应该已经是正确的BFC00000了。
复位成功之后,关闭OCD commander软件,打开配套的OCD FLASH PROGRAMMER。点击Configuration->communicated,连接的OCD SPEED参数和OCD commander一致,都设为2:12MHZ,如图5:
和BDI2000不同,USB2DEMON对DBAU1200的配置文件根本不可用,所以如果想通过OCD Programmer烧录flash的话,需要自己写相应的配置文件。在这里给出本人一个可用的ocd配置文件内容:
[SETUP]
CpuVendor=Alchemy/AMD
CpuChip=AU1200
CpuEndian=LITTLE
FlashVendor=Spansion
FlashChip=S29GL256M
RamAddress=0xA0100000
FlashAddress=0x1C000000
FlashWidth=16
FlashChipsPerSector=1
LittleEndian=1
SimCount=0
MemoryCount=28
Mem1=$B4000840:$3140060A:32:0
Mem2=$B4000848:$A00A000C:32:0
Mem3=$B4000800:$01272224:32:0
Mem4=$B4000808:$01272224:32:0
Mem5=$B4000820:$231003E0:32:0
Mem6=$B4000828:$231083E0:32:0
Mem7=$B4000848:$A00A008C:32:0
Mem8=$B40008C0:$00000000:32:0
Mem9=$B4000880:$C0000000:32:0
Mem10=$B4000888:$C0000000:32:0
Mem11=$B4000880:$80000000:32:0
Mem12=$B4000888:$80000000:32:0
Mem13=$B4000880:$40000440:32:0
Mem14=$B4000888:$40000440:32:0
Mem15=$B4000880:$00000532:32:0
Mem16=$B4000888:$00000532:32:0
Mem17=$B4000848:$A00A008C:32:0
Mem18=$B40008C0:$00000000:32:0
Mem19=$B40008c8:$00000000:32:0
Mem20=$B40008c8:$00000000:32:0
Mem21=$B4000880:$00000432:32:0
Mem22=$B4000888:$00000432:32:0
Mem23=$B4000840:$B140060A:32:0
Mem24=$B4000848:$A002000C:32:0
Mem25=$B4001000:$002D0043:32:0
Mem26=$B4001004:$066181D7:32:0
Mem27=$B4001008:$11C03F00:32:0
Mem28=$B1900038:$00000001:32:0
ScanChainCount=0
将这些配置内容复制粘贴到记事本,然后保存为一个以.ocd为后缀的文件,再通过“FILE -> Open .ocd file...”打开刚刚保存的文件,软件将自动读入配置,如图6:
在这里有一点需要注意的是,我所用的开发板的NOR FLASH是S29GL256M,如果实际与此不符,可修改相关字段。
为了确认配置是否正确,我们可以点击“FLASH ID”按钮进行检测。如果Expected和Read from Flash的数值相同,那么证明我们的设置为正确的,如图7:
如果FLASH ID读取正确,那么我们就可以进行erase操作。其实在烧录flash时可以同时选择在program之前进行擦写,在这里之所以先进行擦写,主要是为了排错方便。
点击“erase”按钮,弹出个对话框,会有两个选项:“Erase entire chip”和“Erase specific sector”。在这里比较倾向于选择第二项,没别的原因,仅仅是因为选择第一项的时候,进度条显示不准确,看着让人心焦。如果选择第二项,不用说,我们就选择所有的sector进行擦除,如图8:
擦除成功之后,就是我们的重中之中了,烧录FLASH!不过这里有个问题,因为USB2DEMON并不支持DBAU1200的这种双片FLASH的连接方式,所以我们在配置文件中FlashChipsPerSector只设置为1,这样一来的结果就是,我们flash的烧录地址只能是0x1C000000~0x1DFF0000。
不过没关系,树挪死,人挪活,这点小事还难不倒我们。现在以烧录BOOT FLASH为例:
1)将S1拨动到NO DOT位置。注意,是NO DOT位置,这时候D6 LED会亮起来。
2)点击“Program”按钮,选择需要烧录的SREC文件,然后将“Start Programming Flash Address”设置为0x1DC00000。注意,不是0xBFC00000,也不是1C000000,而是0x1DC00000,如图9:
至于为什么是该地址,请参考我另外一篇文章:小议DBAU1200 Development Board的Boot Flash更新(http://blog.csdn.net/norains/archive/2008/04/15/2293461.aspx)
3)点击“Program”进行烧录。如果当初的FLASH ID读取正确,erase又正常的话,在这里应该不会有什么问题。
如果是烧录PARAMETER FLASH的话,只需要将第一步的拨动开关打到DOT位置,其它步骤依旧即可。