您的位置:首页 > 编程语言 > PHP开发

U-boot用tftp命令直接烧写到NandFlash V2.0

2013-03-12 22:09 337 查看
U-boot用tftp命令直接烧写到NandFlash V2.0

/****************************************************

版本:v2.0
功能:可以实现小于1024的字节的写入了。大于1024的也可以了。

不足:就是下边的“没解决的问题”

*****************************************************/

1、定义一块tftp_nand_buffer[2048];

2、每次store_block调用的时候,首先从tftp_nand_buffer[(tftp_nand_counter & 1) << 10]开始拷贝数据;

3、nand_write_skip_bad(nand, off, &length, buffer);

nand_write_skip_bad:

nand :

off  :写入flash的位置(off + ((tftp_nand_counter-1)*1024)) //里边的off为0.

length:数据长度,为2048

buffer: 数据位置 tftp_nand_buffer

改动如下:

--- 6Ubootnand/net/tftp.c 2013-03-10 20:45:12.448500276 +0800

+++ 7UbootTftp/net/tftp.c 2013-03-12 21:05:20.092097048 +0800

@@ -9,6 +9,11 @@

#include <net.h>

#include "tftp.h"

#include "bootp.h"

+#ifdef CONFIG_SYS_DIRECT_FLASH_TFTP

+#include <nand.h>

+static ulong tftp_nand_counter = 0;

+static u_char tftp_nand_buffer[2048];

+#endif



#if defined(CONFIG_CMD_NET)



@@ -131,7 +136,11 @@

ulong newsize = offset + len;

#ifdef CONFIG_SYS_DIRECT_FLASH_TFTP

int i, rc = 0;

-

+ int data_end_flag = 0;

+ nand_info_t *nand;

+ loff_t off = 0;

+ size_t length;

+ u_char *buffer;

for (i=0; i<CONFIG_SYS_MAX_FLASH_BANKS; i++) {

/* start address in flash? */

if (flash_info[i].flash_id == FLASH_UNKNOWN)

@@ -142,19 +151,37 @@

}

}



- if (rc) { /* Flash is destination for this packet */

- rc = flash_write ((char *)src, (ulong)(load_addr+offset), len);

+ nand = &nand_info[nand_curr_device];

+ off = 0x0;

+ length = 2048;

+ memcpy((uchar *)(tftp_nand_buffer+((tftp_nand_counter & 1) << 10)), (uchar *)src, 1024);

+ buffer = (u_char *)tftp_nand_buffer;

+ printf("\nlen = %d, tftp_nand_counter = %d\n", len, tftp_nand_counter);

+ if(len < 1024)

+ {

+ data_end_flag = 1; //不足1k的。
+
if (0 == tftp_nand_counter)

+ tftp_nand_counter
= 1;

+ //buffer = (u_char *)src;

+ }

+ if ( rc && ( data_end_flag || (0 != (tftp_nand_counter & 1))) ) { /* Flash is destination for this packet */

+ rc = nand_write_skip_bad(nand, (off + ((tftp_nand_counter-1)*1024)), &length, buffer);

+ printf("\nhaha\n");

if (rc) {

flash_perror (rc);

NetState = NETLOOP_FAIL;

return;

}

+

}

else

#endif /* CONFIG_SYS_DIRECT_FLASH_TFTP */

{

(void)memcpy((void *)(load_addr + offset), src, len);

}

+

+#ifdef CONFIG_SYS_DIRECT_FLASH_TFTP

+ tftp_nand_counter ++;

+#endif /* CONFIG_SYS_DIRECT_FLASH_TFTP */

+

#ifdef CONFIG_MCAST_TFTP

if (Multicast)

ext2_set_bit(block, Bitmap);

另外在板级配置文件中smdk2440.h中:

/*

* tftp 烧写到flash中

*/

#define CONFIG_SYS_DIRECT_FLASH_TFTP 1

#define CONFIG_TFTP_BLOCKSIZE 1024

代码修改完。

然后tftp了一个led.bin(<1k)的,OK了。

tftp了一个vboot.bin (3k<size<4k)也OK了。

这说明大体没有问题了。(如图1)图2 是运行成功截图。



图1



图2

没解决的问题:

1.但是是烧写102k的会出现超时:Retry count exceeded; starting again 。不过应该是tftp延时参数的问题了。一次能计79次。说明能80k烧写。(如图3)

2.计数的全局变量没有函数去给它清零,如果开机时tftp再次,这个全局变量会还会是上次tftp时候计数的值。要在tftp这个命令的执行函数里边清零这个全局变量。(如图4)



图3



图4

重点参考:《以1024收,以2048存的算法》 http://bbs.csdn.net/topics/390389188
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: