最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

实现将uboot烧写到外部Nor Flash

工作和技术 crifan 2275浏览 0评论

实现将uboot烧写到外部Nor Flash

平台:
软件:
1.uboot 1.3.4
2.ARM RVDS 3.0
硬件:
1.AMS3527 Linux Board
2.Nor Flash 是ST M29W320DB (32 Mbit (4Mbx8 or 2Mbx16, Non-uniform Parameter Blocks,Boot Block), 3V Supply Flash memory)

在实现了Uboot中对应自己平台的Flash驱动之后
(相关此部分内容的理解,参考:
编写uboot下Nor Flash驱动的注意事项
http://hi.baidu.com/serial_story/blog/item/5f37926e4ce09cd380cb4a74.html

注:
所谓的外部的Nor Flash,据我目前的理解,是相对于SPI接口的Nor Flash接到内部SPI总线上的。(不知道这种解释对否?)
外部的Nor Flash一般是我这用到的,TSOP封装的,所以,pin脚很多,有48个。而内部的Nor Flash是SPI接口的,
所以pin很少,就8个pin。

就要考虑怎么将uboot烧写到Nor Flash里面去。
本来想的很简单的,到uboot的help中,找和Flash相关的命令。
但是发现好像只有erase和flinfo,觉得很奇怪,既然有erase,那么也应该有读和写的函数的。。。
实在是没找到,所以没办法,只能对于flash的写函数,自己尝试单独去实现一个。
暂定为fw,具体用法暂定为:
AS352X # help fw
fw mem_addr flash_addr len
         – write flash

命令里面的具体实现是在cmd_flash下,参考了setenv命令里面对应的代码。
先是自己手动先erase 整个Nor Flash:
erase bank 1
然后再暂停uboot运行,去通过ARM的RVDS,去load u-boot.bin 文件到我们板子上的SDRAM中某处。
此处是64M的SDRAM,起始地址是0x30000000,我把ubootload到0x31000000(16M)处。
然后继续运行uboot,调用我自己的函数
fw 0x31000000 0x10000000 0x2a714
其中,0x10000000 是我们的Nor Flash的起始地址;
0x2a714是u-boot.bin的大小。
然后就可以接着调试我们的写函数了。
在调试具体负责Nor Flash的写的函数wrire_buff过程中,遇到一个大小端的问题,
在写half word,即16bit的数据的时候,传入的数据,直接写进去,是和实际位置反得。
所以,加了代码,在写之前,把两个字节调换过来:

static int write_halfword (flash_info_t *info, ulong dest, ushort data)
{
……
ushort le_data = 0;
….
/* convert to little endian data */
le_data |= (data & 0xFF00) >> 8;
le_data |= (data & 0x00FF)<<8;
data = le_data;

/* Disable interrupts which might cause a timeout here */
flag = disable_interrupts();

addr[WRITE_ADDR1] = WRITE_DATA1;
addr[WRITE_ADDR2] = WRITE_DATA2;
addr[WRITE_ADDR3] = WRITE_DATA3;

*((vu_short *)dest) = data;
…..
}

这样写入的数据,才是对的,才和SDRAM中的一致。

在后来的调试过程中,发现,uboot本来就带了Flash的读写函数:
md和cp:
AS352X # help cp
cp [.b, .w, .l] source target count
    – copy memory

AS352X # help md
md [.b, .w, .l] address [# of objects]
          – memory display

其中的memory,也包括了Flash,这点,具体去看代码,就知道了:
cp的实现函数:
int do_mem_cp ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
….

#ifndef CFG_NO_FLASH
/* check if we are copying to Flash */
if ( (addr2info(dest) != NULL)
#ifdef CONFIG_HAS_DATAFLASH
    && (!addr_dataflash(dest))
#endif
    ) {
   int rc;

   puts ("Copy to Flash… ");

   rc = flash_write ((char *)addr, dest, count*size);
   if (rc != 0) {
    flash_perror (rc);
    return (1);
   }
   puts ("donen");
   return 0;
}
#endif

}

也就意味着,就不用我单独去实现一个命令了,
也就是,我前面那个命令实现,就是做无用功了。。。。

所以,其实在实现Nor Flash驱动后,就可以很简单的,
先把uboot以binary格式加载到SDRAM中:0x31000000,然后再通过cp去实现将SDRAM中的uboot烧写到Nor Flash中:
cp.b 0x31000000 0x10000000 0x0x2a714
就可以了。

转载请注明:在路上 » 实现将uboot烧写到外部Nor Flash

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
79 queries in 0.188 seconds, using 22.12MB memory