⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nand_write_yaffs.patch

📁 uboot nandflash 启动补丁文件
💻 PATCH
📖 第 1 页 / 共 5 页
字号:
+        rc = ((ulong (*)(int, char *[]))addr) (0,gd->bd->bi_arch_number);+/////////////////////////////////////HHTECH wk/////////////////////////+	//rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]); #else 	/* 	 * Nios function pointers are address >> 1@@ -66,7 +74,7 @@ 	rc = ((ulong (*)(int, char *[]))(addr>>1)) (--argc, &argv[1]); #endif 	if (rc != 0) rcode = 1;-+     //   call_linux(0, 0xc1, addr); 	printf ("## Application terminated, rc = 0x%lX\n", rc); 	return rcode; }@@ -87,3 +95,25 @@ 	"reset   - Perform RESET of the CPU\n", 	NULL );+int do_cpImage (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])+{+	void * ret;+	ret = memcpy(0x30008000,0x40000,0x100000);+	if (ret != (void *)0x30008000)+               printf("Kernel copied failed\n");+	else+               printf("kernel copied done\n");+       ret = memcpy(0x30800000,0x140000,0x400000);+	if (ret != (void *)0x30800000)+             printf("Ramdisk copied failed\n");+	else+             printf("Ramdisk copied  done\n");+       return 0;+}++U_BOOT_CMD(+       cpImage, CFG_MAXARGS, 0,     do_cpImage,+       "cpImage  - cp kernel from flash to ram\n",+       "addr [arg ...]\n    - start application at address 'addr'\n"+       "      passing 'arg' as arguments\n"+);diff -uNr u-boot-1.2.0/common/cmd_bootm.c bootloader/u-boot-1.2.0/common/cmd_bootm.c--- u-boot-1.2.0/common/cmd_bootm.c	2007-01-07 07:13:11.000000000 +0800+++ bootloader/u-boot-1.2.0/common/cmd_bootm.c	2007-04-24 15:04:23.000000000 +0800@@ -467,6 +467,7 @@  	"[addr [arg ...]]\n    - boot application image stored in memory\n"  	"\tpassing arguments 'arg ...'; when booting a Linux kernel,\n"  	"\t'arg' can be the address of an initrd image\n"+/* #ifdef CONFIG_OF_FLAT_TREE 	"\tWhen booting a Linux kernel which requires a flat device-tree\n" 	"\ta third argument is required which is the address of the of the\n"@@ -474,6 +475,7 @@ 	"\tuse a '-' for the second argument. If you do not pass a third\n" 	"\ta bd_info struct will be passed instead\n" #endif+*/ );  #ifdef CONFIG_SILENT_CONSOLEdiff -uNr u-boot-1.2.0/common/cmd_nand.c bootloader/u-boot-1.2.0/common/cmd_nand.c--- u-boot-1.2.0/common/cmd_nand.c	2007-01-07 07:13:11.000000000 +0800+++ bootloader/u-boot-1.2.0/common/cmd_nand.c	2007-04-25 13:46:15.000000000 +0800@@ -351,6 +351,23 @@ 				opts.quiet      = quiet; 				ret = nand_write_opts(nand, &opts); 			}+#ifdef CFG_NAND_YAFFS_WRITE+		} else if (!read && s != NULL &&+			   (!strcmp(s, ".yaffs") || !strcmp(s, ".yaffs1"))) {+			nand_write_options_t opts;+			memset(&opts, 0, sizeof(opts));+			opts.buffer	= (u_char*) addr;+			opts.length	= size;+			opts.offset	= off;+			opts.pad	= 0;+			opts.blockalign = 1;+			opts.quiet      = quiet;+			opts.writeoob	= 1;+			opts.autoplace	= 1;+			if (s[6] == '1')+				opts.forceyaffs = 1;+			ret = nand_write_opts(nand, &opts);+#endif 		} else { 			if (read) 				ret = nand_read(nand, off, &size, (u_char *)addr);@@ -452,6 +469,23 @@  usage: 	printf("Usage:\n%s\n", cmdtp->usage);+	printf("info            - show available NAND devices\n");+        printf("nand device [dev]     - show or set current device\n");+        printf("nand read[.jffs2]     - addr off|partition size\n");+        printf("nand write[.jffs2]    - addr off|partiton size - read/write `size' bytes starting at offset `off' to/from memory address `addr'\n");+#ifdef CFG_NAND_YAFFS_WRITE+        printf("nand write[.yaffs[1]] - addr off|partition size - write `size' byte yaffs image starting at offset `off' from memory address `addr' (.yaffs1 for 512+16 NAND)\n");+#endif+	printf("nand erase [clean] [off size] - erase `size' bytes from offset `off' (entire device if not specified)\n");+        printf("nand bad - show bad blocks\n");+        printf("nand dump[.oob] off - dump page\n");+        printf("nand scrub - really clean NAND erasing bad blocks (UNSAFE)\n");+        printf("nand markbad off - mark bad block at offset (UNSAFE)\n");+        printf("nand biterr off - make a bit error at offset (UNSAFE)\n");+        printf("nand lock [tight] [status] - bring nand to lock state or display locked pages\n");+        printf("nand unlock [offset] [size] - unlock section\n");+                                                                                                 + 	return 1; } @@ -462,6 +496,10 @@ 	"nand read[.jffs2]     - addr off|partition size\n" 	"nand write[.jffs2]    - addr off|partiton size - read/write `size' bytes starting\n" 	"    at offset `off' to/from memory address `addr'\n"+#ifdef CFG_NAND_YAFFS_WRITE+	"nand write[.yaffs[1]] - addr off|partition size - write `size' byte yaffs image\n"+	"    starting at offset `off' from memory address `addr' (.yaffs1 for 512+16 NAND)\n"+#endif 	"nand erase [clean] [off size] - erase `size' bytes from\n" 	"    offset `off' (entire device if not specified)\n" 	"nand bad - show bad blocks\n"diff -uNr u-boot-1.2.0/common/cmd_nand.c.orig bootloader/u-boot-1.2.0/common/cmd_nand.c.orig--- u-boot-1.2.0/common/cmd_nand.c.orig	1970-01-01 08:00:00.000000000 +0800+++ bootloader/u-boot-1.2.0/common/cmd_nand.c.orig	2007-04-25 12:19:17.000000000 +0800@@ -0,0 +1,1004 @@+/*+ * Driver for NAND support, Rick Bronson+ * borrowed heavily from:+ * (c) 1999 Machine Vision Holdings, Inc.+ * (c) 1999, 2000 David Woodhouse <dwmw2@infradead.org>+ *+ * Added 16-bit nand support+ * (C) 2004 Texas Instruments+ */++#include <common.h>+++#ifndef CFG_NAND_LEGACY+/*+ *+ * New NAND support+ *+ */+#include <common.h>++#if (CONFIG_COMMANDS & CFG_CMD_NAND)++#include <command.h>+#include <watchdog.h>+#include <malloc.h>+#include <asm/byteorder.h>++#ifdef CONFIG_SHOW_BOOT_PROGRESS+# include <status_led.h>+# define SHOW_BOOT_PROGRESS(arg)	show_boot_progress(arg)+#else+# define SHOW_BOOT_PROGRESS(arg)+#endif++#include <jffs2/jffs2.h>+#include <nand.h>++#if (CONFIG_COMMANDS & CFG_CMD_JFFS2) && defined(CONFIG_JFFS2_CMDLINE)++/* parition handling routines */+int mtdparts_init(void);+int id_parse(const char *id, const char **ret_id, u8 *dev_type, u8 *dev_num);+int find_dev_and_part(const char *id, struct mtd_device **dev,+		u8 *part_num, struct part_info **part);+#endif++extern nand_info_t nand_info[];       /* info for NAND chips */++static int nand_dump_oob(nand_info_t *nand, ulong off)+{+	return 0;+}++static int nand_dump(nand_info_t *nand, ulong off)+{+	int i;+	u_char *buf, *p;++	buf = malloc(nand->oobblock + nand->oobsize);+	if (!buf) {+		puts("No memory for page buffer\n");+		return 1;+	}+	off &= ~(nand->oobblock - 1);+	i = nand_read_raw(nand, buf, off, nand->oobblock, nand->oobsize);+	if (i < 0) {+		printf("Error (%d) reading page %08x\n", i, off);+		free(buf);+		return 1;+	}+	printf("Page %08x dump:\n", off);+	i = nand->oobblock >> 4; p = buf;+	while (i--) {+		printf( "\t%02x %02x %02x %02x %02x %02x %02x %02x"+			"  %02x %02x %02x %02x %02x %02x %02x %02x\n",+			p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],+			p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]);+		p += 16;+	}+	puts("OOB:\n");+	i = nand->oobsize >> 3;+	while (i--) {+		printf( "\t%02x %02x %02x %02x %02x %02x %02x %02x\n",+			p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);+		p += 8;+	}+	free(buf);++	return 0;+}++/* ------------------------------------------------------------------------- */++static inline int str2long(char *p, ulong *num)+{+	char *endptr;++	*num = simple_strtoul(p, &endptr, 16);+	return (*p != '\0' && *endptr == '\0') ? 1 : 0;+}++static int+arg_off_size(int argc, char *argv[], nand_info_t *nand, ulong *off, ulong *size)+{+	int idx = nand_curr_device;+#if (CONFIG_COMMANDS & CFG_CMD_JFFS2) && defined(CONFIG_JFFS2_CMDLINE)+	struct mtd_device *dev;+	struct part_info *part;+	u8 pnum;++	if (argc >= 1 && !(str2long(argv[0], off))) {+		if ((mtdparts_init() == 0) &&+		    (find_dev_and_part(argv[0], &dev, &pnum, &part) == 0)) {+			if (dev->id->type != MTD_DEV_TYPE_NAND) {+				puts("not a NAND device\n");+				return -1;+			}+			*off = part->offset;+			if (argc >= 2) {+				if (!(str2long(argv[1], size))) {+					printf("'%s' is not a number\n", argv[1]);+					return -1;+				}+				if (*size > part->size)+					*size = part->size;+			} else {+				*size = part->size;+			}+			idx = dev->id->num;+			*nand = nand_info[idx];+			goto out;+		}+	}+#endif++	if (argc >= 1) {+		if (!(str2long(argv[0], off))) {+			printf("'%s' is not a number\n", argv[0]);+			return -1;+		}+	} else {+		*off = 0;+	}++	if (argc >= 2) {+		if (!(str2long(argv[1], size))) {+			printf("'%s' is not a number\n", argv[1]);+			return -1;+		}+	} else {+		*size = nand->size - *off;+	}++#if (CONFIG_COMMANDS & CFG_CMD_JFFS2) && defined(CONFIG_JFFS2_CMDLINE)+out:+#endif+	printf("device %d ", idx);+	if (*size == nand->size)+		puts("whole chip\n");+	else+		printf("offset 0x%x, size 0x%x\n", *off, *size);+	return 0;+}++int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])+{+	int i, dev, ret;+	ulong addr, off, size;+	char *cmd, *s;+	nand_info_t *nand;+	int quiet = 0;+	const char *quiet_str = getenv("quiet");++	/* at least two arguments please */+	if (argc < 2)+		goto usage;++	if (quiet_str)+		quiet = simple_strtoul(quiet_str, NULL, 0) != 0;++	cmd = argv[1];++	if (strcmp(cmd, "info") == 0) {++		putc('\n');+		for (i = 0; i < CFG_MAX_NAND_DEVICE; i++) {+			if (nand_info[i].name)+				printf("Device %d: %s, sector size %lu KiB\n",+					i, nand_info[i].name,+					nand_info[i].erasesize >> 10);+		}+		return 0;+	}++	if (strcmp(cmd, "device") == 0) {++		if (argc < 3) {+			if ((nand_curr_device < 0) ||+			    (nand_curr_device >= CFG_MAX_NAND_DEVICE))+				puts("\nno devices available\n");+			else+				printf("\nDevice %d: %s\n", nand_curr_device,+					nand_info[nand_curr_device].name);+			return 0;+		}+		dev = (int)simple_strtoul(argv[2], NULL, 10);+		if (dev < 0 || dev >= CFG_MAX_NAND_DEVICE || !nand_info[dev].name) {+			puts("No such device\n");+			return 1;+		}+		printf("Device %d: %s", dev, nand_info[dev].name);+		puts("... is now current device\n");+		nand_curr_device = dev;++#ifdef CFG_NAND_SELECT_DEVICE+		/*+		 * Select the chip in the board/cpu specific driver+		 */+		board_nand_select_device(nand_info[dev].priv, dev);+#endif++		return 0;+	}++	if (strcmp(cmd, "bad") != 0 && strcmp(cmd, "erase") != 0 &&+	    strncmp(cmd, "dump", 4) != 0 &&+	    strncmp(cmd, "read", 4) != 0 && strncmp(cmd, "write", 5) != 0 &&+	    strcmp(cmd, "scrub") != 0 && strcmp(cmd, "markbad") != 0 &&+	    strcmp(cmd, "biterr") != 0 &&+	    strcmp(cmd, "lock") != 0 && strcmp(cmd, "unlock") != 0 )+		goto usage;++	/* the following commands operate on the current device */+	if (nand_curr_device < 0 || nand_curr_device >= CFG_MAX_NAND_DEVICE ||+	    !nand_info[nand_curr_device].name) {+		puts("\nno devices available\n");+		return 1;+	}+	nand = &nand_info[nand_curr_device];++	if (strcmp(cmd, "bad") == 0) {+		printf("\nDevice %d bad blocks:\n", nand_curr_device);+		for (off = 0; off < nand->size; off += nand->erasesize)+			if (nand_block_isbad(nand, off))+				printf("  %08x\n", off);+		return 0;+	}++	/*+	 * Syntax is:+	 *   0    1     2       3    4+	 *   nand erase [clean] [off size]+	 */+	if (strcmp(cmd, "erase") == 0 || strcmp(cmd, "scrub") == 0) {+		nand_erase_options_t opts;+		/* "clean" at index 2 means request to write cleanmarker */+		int clean = argc > 2 && !strcmp("clean", argv[2]);+		int o = clean ? 3 : 2;+		int scrub = !strcmp(cmd, "scrub");++		printf("\nNAND %s: ", scrub ? "scrub" : "erase");+		/* skip first two or three arguments, look for offset and size */+		if (arg_off_size(argc - o, argv + o, nand, &off, &size) != 0)+			return 1;++		memset(&opts, 0, sizeof(opts));+		opts.offset = off;+		opts.length = size;+		opts.jffs2  = clean;+		opts.quiet  = quiet;++		if (scrub) {+			puts("Warning: "+			     "scrub option will erase all factory set "+			     "bad blocks!\n"+			     "         "+			     "There is no reliable way to recover them.\n"+			     "         "+			     "Use this command only for testing purposes "+			     "if you\n"+			     "         "+			     "are sure of what you are doing!\n"+			     "\nReally scrub this NAND flash? <y/N>\n");++			if (getc() == 'y' && getc() == '\r') {+				opts.scrub = 1;+			} else {+				puts("scrub aborted\n");+				return -1;+			}+		}+		ret = nand_erase_opts(nand, &opts);+		printf("%s\n", ret ? "ERROR" : "OK");++		return ret == 0 ? 0 : 1;+	}++	if (strncmp(cmd, "dump", 4) == 0) {+		if (argc < 3)+			goto usage;++		s = strchr(cmd, '.');+		off = (int)simple_strtoul(argv[2], NULL, 16);++		if (s != NULL && strcmp(s, ".oob") == 0)+			ret = nand_dump_oob(nand, off);+		else+			ret = nand_dump(nand, off);++		return ret == 0 ? 1 : 0;++	}++	/* read write */+	if (strncmp(cmd, "read", 4) == 0 || strncmp(cmd, "write", 5) == 0) {+		int read;++		if (argc < 4)+			goto usage;++		addr = (ulong)simple_strtoul(argv[2], NULL, 16);++		read = strncmp(cmd, "read", 4) == 0; /* 1 = read, 0 = write */+		printf("\nNAND %s: ", read ? "read" : "write");+		if (arg_off_size(argc - 3, argv + 3, nand, &off, &size) != 0)+			return 1;++		s = strchr(cmd, '.');+		if (s != NULL &&+		    (!strcmp(s, ".jffs2") || !strcmp(s, ".e") || !strcmp(s, ".i"))) {+			if (read) {+				/* read */+				nand_read_options_t opts;+				memset(&opts, 0, sizeof(opts));+				opts.buffer	= (u_char*) addr;+				opts.length	= size;+				opts.offset	= off;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -