AT91RM9200 loader.bin 接收文件有问题


Living with you!
欢迎转载
http://blog.csdn.net/livingpark
Living Park

从atmel网站得到了loader.bin u-boot.bin 和boot.bin文件后按照片内启动的顺序烧录bootloader,片内启动后首先传入loader.bin文件没有问题,接着要传入u-boot.bin时出现了错误"超过了错误的极限值",不明白是什么原因,但是可以肯定是loader.bin的问题,于是找寻loader.bin的源代码,有人说从官网上找,无奈为人愚钝,在整个网站上面翻来覆去也没有找到,最后非常感谢CalmArrow(lqm)在他的blog上面提供源码,在此贴出该blog地址:
http://www.cublog.cn/u/21948/showart_264827.html
有需要的可以去下载。
当拿到源码激动的编译时,却出现错误找不到arm-linux-gcc,原来makefile中CalmArrow(lqm)使用的自己的编译工具地址:CROSS_COMPILE= /usr/local/arm/2.95.3/bin/arm-linux-,改成自己的arm-linux-gcc的地址,接着再来,又出现错误ld: final link failed: Bad value,不得其解,可能是arm-linux-gcc使用的版本不同吧,CalmArrow(lqm)使用的是2.95.3,而我使用的是3.2的,不过问题还是得解决啊,发现上面有个 warning: no memory region specified for section `.rodata.str1.4',找到文件ld.script中有如下内容:
.text : {
        _stext = . ;
        *(.text)
        *(.rodata)
        . = ALIGN(4);
        _etext = . ;
    } > ram
将其中的 *(.rodata)改为*(.rodata.str1.4),重新编译终于得到了想要的loader.bin了,怀着激动的心情按片内顺序再来,结果是同样的错误,简直是郁闷到了极点。直接使用有误,不过至少能看一下源码了,不至于太盲目。
发现是在main.c中的
xmodemPipe.Read(&xmodemPipe, (char *)AT91C_UBOOT_BASE_ADDRESS, AT91C_UBOOT_MAXSIZE, AT91F_XmodemProtocol, 0);   
while(XmodemComplete !=1);
出现的错误,这时想起了dugangxj在at91rm9200上移植u-boot一文(http://blog.csdn.net/dugangxj/archive/2007/02/12/1508313.aspx)中提到了相同的问题:"官方提供的loader.bin在SRAM启动会又启动了xmodem接收u-boot,但是xmodem接收数据出错。查看其源码,官方提供的loader.bin在SRAM启动会又启动了xmodem接收u-boot,但是
xmodem接收数据出错。
查看其源码,发现它使用了固化的rom中的服务接口函数,没看出哪里出问题。,没看出哪里出问题。",以前看到"发现它使用了固化的rom中的服务接口函数"不明白是什么意思,看了源码后才算知道了(还是有源码好啊:) )。
dugangxj接下来也提出了解决的方法如下:
*******************************************************************************************************
lader.bin主要有3个功能,初始化SDRAM,启动xmodem接收u-boot并写到SDRAM中,pc跳转到SDRAM运行。

AT91RM9200-GettingStarted-ADS1_2-1_1里面已经有了SDRAM和其他一次初始化,在init_ram.c中。

xmodem的实现
   只需要接收部分,发送部分用win下的”超级终端”等工具就可。
    先找来协议文档,熟悉协议,看看现有的xmodem协议源码。协议本身并不复杂,只是它的握手部分实现有点技巧。
    接收端要不停的发送字符“C”到串口(注意xmodem有3个版本,而超级终端对应的是xmodem-crc16),发送端收到“C”后发送数据SOH和第一个数据包。
接收端检测到SOH后停止发送“C”并开始处理数据。官方的loader启动了一个时间服务,每隔1s发送一个“C”,在这个我使用了偷懒的算法。
    while(Getchar()!=AT91C_XMODEM_SOH)
    {
        if (0xFFFF==++n )
        {
            SendChar(AT91C_XMODEM_CRCCHR);
            n=0;
        }
    }

Getchar()和GetWaitchar()是添加的,GetWaitchar等待直到从串口接收到数据。
显然不能用在上面的算法中,要导致忙等的。所以改了个Getchar()只用在这里。
握手解决了,后面的处理都没什么问题。

写SDRAM
    unsigned char *pSdram = (unsigned char *)AT91C_UBOOT_BASE_ADDRESS;
    for ( n = 0; n<128 ; n ++ )
    {
                *pSdram++=data[n];
    }
***********************************************************************************************************
几乎可以完全解决问题了(几乎?),其中while判断中Getchar()函数是添加的,但是并没有提供源码,最后问题的关键就是Getchar()的实现了,应该是每个人都有自己的方式吧。

PS:
不想自己实现Xmodem功能的可以到loader.bin下载使用。
:)

你可能感兴趣的:(c,算法,Blog,工具,makefile,终端)