📄 nand_write_yaffs.patch
字号:
+ ret = nand_read_oob (nand_dev_desc + curr_device,+ off, size, (size_t *) & total,+ (u_char *) addr);+ } else {+ ret = nand_write_oob (nand_dev_desc + curr_device,+ off, size, (size_t *) & total,+ (u_char *) addr);+ }+ return ret;+ } else if (cmdtail && !strncmp (cmdtail, ".jffs2", 2))+ cmd |= NANDRW_JFFS2; /* skip bad blocks */+ else if (cmdtail && !strncmp (cmdtail, ".jffs2s", 2)) {+ cmd |= NANDRW_JFFS2; /* skip bad blocks (on read too) */+ if (cmd & NANDRW_READ)+ cmd |= NANDRW_JFFS2_SKIP; /* skip bad blocks (on read too) */+ }+#ifdef SXNI855T+ /* need ".e" same as ".j" for compatibility with older units */+ else if (cmdtail && !strcmp (cmdtail, ".e"))+ cmd |= NANDRW_JFFS2; /* skip bad blocks */+#endif+#ifdef CFG_NAND_SKIP_BAD_DOT_I+ /* need ".i" same as ".jffs2s" for compatibility with older units (esd) */+ /* ".i" for image -> read skips bad block (no 0xff) */+ else if (cmdtail && !strcmp (cmdtail, ".i")) {+ cmd |= NANDRW_JFFS2; /* skip bad blocks (on read too) */+ if (cmd & NANDRW_READ)+ cmd |= NANDRW_JFFS2_SKIP; /* skip bad blocks (on read too) */+ }+#endif /* CFG_NAND_SKIP_BAD_DOT_I */+ else if (cmdtail) {+ printf ("Usage:\n%s\n", cmdtp->usage);+ return 1;+ }++ printf ("\nNAND %s: device %d offset %ld, size %ld ...\n",+ (cmd & NANDRW_READ) ? "read" : "write",+ curr_device, off, size);++ ret = nand_legacy_rw (nand_dev_desc + curr_device,+ cmd, off, size,+ (size_t *) & total,+ (u_char *) addr);++ printf (" %d bytes %s: %s\n", total,+ (cmd & NANDRW_READ) ? "read" : "written",+ ret ? "ERROR" : "OK");++ return ret;+ } else if (strcmp (argv[1], "erase") == 0 &&+ (argc == 4 || strcmp ("clean", argv[2]) == 0)) {+ int clean = argc == 5;+ ulong off =+ simple_strtoul (argv[2 + clean], NULL, 16);+ ulong size =+ simple_strtoul (argv[3 + clean], NULL, 16);+ int ret;++ printf ("\nNAND erase: device %d offset %ld, size %ld ...\n",+ curr_device, off, size);++ ret = nand_legacy_erase (nand_dev_desc + curr_device,+ off, size, clean);++ printf ("%s\n", ret ? "ERROR" : "OK");++ return ret;+ } else {+ printf ("Usage:\n%s\n", cmdtp->usage);+ rcode = 1;+ }++ return rcode;+ }+}++U_BOOT_CMD(+ nand, 5, 1, do_nand,+ "nand - legacy NAND sub-system\n",+ "info - show available NAND devices\n"+ "nand device [dev] - show or set current device\n"+ "nand read[.jffs2[s]] addr off size\n"+ "nand write[.jffs2] addr off size - read/write `size' bytes starting\n"+ " at offset `off' to/from memory address `addr'\n"+ "nand erase [clean] [off size] - erase `size' bytes from\n"+ " offset `off' (entire device if not specified)\n"+ "nand bad - show bad blocks\n"+ "nand read.oob addr off size - read out-of-band data\n"+ "nand write.oob addr off size - read out-of-band data\n"+);++int do_nandboot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])+{+ char *boot_device = NULL;+ char *ep;+ int dev;+ ulong cnt;+ ulong addr;+ ulong offset = 0;+ image_header_t *hdr;+ int rcode = 0;+ switch (argc) {+ case 1:+ addr = CFG_LOAD_ADDR;+ boot_device = getenv ("bootdevice");+ break;+ case 2:+ addr = simple_strtoul(argv[1], NULL, 16);+ boot_device = getenv ("bootdevice");+ break;+ case 3:+ addr = simple_strtoul(argv[1], NULL, 16);+ boot_device = argv[2];+ break;+ case 4:+ addr = simple_strtoul(argv[1], NULL, 16);+ boot_device = argv[2];+ offset = simple_strtoul(argv[3], NULL, 16);+ break;+ default:+ printf ("Usage:\n%s\n", cmdtp->usage);+ SHOW_BOOT_PROGRESS (-1);+ return 1;+ }++ if (!boot_device) {+ puts ("\n** No boot device **\n");+ SHOW_BOOT_PROGRESS (-1);+ return 1;+ }++ dev = simple_strtoul(boot_device, &ep, 16);++ if ((dev >= CFG_MAX_NAND_DEVICE) ||+ (nand_dev_desc[dev].ChipID == NAND_ChipID_UNKNOWN)) {+ printf ("\n** Device %d not available\n", dev);+ SHOW_BOOT_PROGRESS (-1);+ return 1;+ }++ printf ("\nLoading from device %d: %s at 0x%lx (offset 0x%lx)\n",+ dev, nand_dev_desc[dev].name, nand_dev_desc[dev].IO_ADDR,+ offset);++ if (nand_legacy_rw (nand_dev_desc + dev, NANDRW_READ, offset,+ SECTORSIZE, NULL, (u_char *)addr)) {+ printf ("** Read error on %d\n", dev);+ SHOW_BOOT_PROGRESS (-1);+ return 1;+ }++ hdr = (image_header_t *)addr;++ if (ntohl(hdr->ih_magic) == IH_MAGIC) {++ print_image_hdr (hdr);++ cnt = (ntohl(hdr->ih_size) + sizeof(image_header_t));+ cnt -= SECTORSIZE;+ } else {+ printf ("\n** Bad Magic Number 0x%x **\n", ntohl(hdr->ih_magic));+ SHOW_BOOT_PROGRESS (-1);+ return 1;+ }++ if (nand_legacy_rw (nand_dev_desc + dev, NANDRW_READ,+ offset + SECTORSIZE, cnt, NULL,+ (u_char *)(addr+SECTORSIZE))) {+ printf ("** Read error on %d\n", dev);+ SHOW_BOOT_PROGRESS (-1);+ return 1;+ }++ /* Loading ok, update default load address */++ load_addr = addr;++ /* Check if we should attempt an auto-start */+ if (((ep = getenv("autostart")) != NULL) && (strcmp(ep,"yes") == 0)) {+ char *local_args[2];+ extern int do_bootm (cmd_tbl_t *, int, int, char *[]);++ local_args[0] = argv[0];+ local_args[1] = NULL;++ printf ("Automatic boot of image at addr 0x%08lx ...\n", addr);++ do_bootm (cmdtp, 0, 1, local_args);+ rcode = 1;+ }+ return rcode;+}++U_BOOT_CMD(+ nboot, 4, 1, do_nandboot,+ "nboot - boot from NAND device\n",+ "loadAddr dev\n"+);++#endif /* (CONFIG_COMMANDS & CFG_CMD_NAND) */++#endif /* CFG_NAND_LEGACY */diff -uNr u-boot-1.2.0/common/env_nand.c bootloader/u-boot-1.2.0/common/env_nand.c--- u-boot-1.2.0/common/env_nand.c 2007-01-07 07:13:11.000000000 +0800+++ bootloader/u-boot-1.2.0/common/env_nand.c 2007-04-25 09:34:51.000000000 +0800@@ -56,9 +56,13 @@ int nand_legacy_rw (struct nand_chip* nand, int cmd, size_t start, size_t len, size_t * retlen, u_char * buf);+extern struct nand_chip nand_dev_desc[CFG_MAX_NAND_DEVICE];+extern int nand_legacy_erase(struct nand_chip *nand, size_t ofs,+ size_t len, int clean); /* info for NAND chips, defined in drivers/nand/nand.c */ extern nand_info_t nand_info[];+//nand_info_t nand_info[CFG_MAX_NAND_DEVICE]; /* references to names in env_common.c */ extern uchar default_environment[];@@ -76,9 +80,9 @@ /* local functions */-#if !defined(ENV_IS_EMBEDDED)+//#if !defined(ENV_IS_EMBEDDED) static void use_default(void);-#endif+//#endif DECLARE_GLOBAL_DATA_PTR; @@ -193,11 +197,13 @@ puts ("Erasing Nand..."); if (nand_erase(&nand_info[0], CFG_ENV_OFFSET, CFG_ENV_SIZE))+// if (nand_legacy_erase(nand_dev_desc + 0, CFG_ENV_OFFSET, CFG_ENV_SIZE, 0)) return 1; puts ("Writing to Nand... "); total = CFG_ENV_SIZE; ret = nand_write(&nand_info[0], CFG_ENV_OFFSET, &total, (u_char*)env_ptr);+// ret = nand_legacy_rw(nand_dev_desc + 0,0x00 | 0x02, CFG_ENV_OFFSET, CFG_ENV_SIZE,&total, (u_char*)env_ptr); if (ret || total != CFG_ENV_SIZE) return 1; @@ -273,6 +279,7 @@ total = CFG_ENV_SIZE; ret = nand_read(&nand_info[0], CFG_ENV_OFFSET, &total, (u_char*)env_ptr);+// ret = nand_legacy_rw(nand_dev_desc + 0, 0x01 | 0x02, CFG_ENV_OFFSET, CFG_ENV_SIZE, &total, (u_char*)env_ptr); if (ret || total != CFG_ENV_SIZE) return use_default(); @@ -282,7 +289,7 @@ } #endif /* CFG_ENV_OFFSET_REDUND */ -#if !defined(ENV_IS_EMBEDDED)+//#if !defined(ENV_IS_EMBEDDED) static void use_default() { puts ("*** Warning - bad CRC or NAND, using default environment\n\n");@@ -300,6 +307,6 @@ gd->env_valid = 1; }-#endif+//#endif #endif /* CFG_ENV_IS_IN_NAND */diff -uNr u-boot-1.2.0/cpu/arm920t/config.mk bootloader/u-boot-1.2.0/cpu/arm920t/config.mk--- u-boot-1.2.0/cpu/arm920t/config.mk 2007-01-07 07:13:11.000000000 +0800+++ bootloader/u-boot-1.2.0/cpu/arm920t/config.mk 2007-04-25 09:10:36.000000000 +0800@@ -22,7 +22,7 @@ # PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8 \- -msoft-float+#-msoft-float PLATFORM_CPPFLAGS += -march=armv4 # =========================================================================@@ -30,5 +30,5 @@ # Supply options according to compiler version # # =========================================================================-PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)+PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,$(-mabi=apcs-gnu)) PLATFORM_RELFLAGS +=$(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,))diff -uNr u-boot-1.2.0/cpu/arm920t/start.S bootloader/u-boot-1.2.0/cpu/arm920t/start.S--- u-boot-1.2.0/cpu/arm920t/start.S 2007-01-07 07:13:11.000000000 +0800+++ bootloader/u-boot-1.2.0/cpu/arm920t/start.S 2007-04-25 09:47:17.000000000 +0800@@ -219,11 +219,126 @@ str r1, [r0] /* END stuff after relocation */ #endif+/********************************************HHTECH wk****************/+#ifdef CONFIG_S3C2410_NAND_BOOT+ bl copy_myself+ @ jump to ram+ ldr r1,=on_the_ram+ add pc,r1,#0+ nop+1: b 1b @infinite loop++on_the_ram:+#endif+/********************************************HHTECH wk****************/ ldr pc, _start_armboot _start_armboot: .word start_armboot +/********************************************HHTECH wk****************/+#ifdef CONFIG_S3C2410_NAND_BOOT+copy_myself:+ mov r10, lr+ @ reset NAND+ mov r1, #NAND_CTL_BASE+ ldr r2, =0xf830 @ initial value+ str r2, [r1, #oNFCONF]+ ldr r2, [r1, #oNFCONF]+ bic r2, r2, #0x800 @ enable chip+ str r2, [r1, #oNFCONF]+ mov r2, #0xff @ RESET command+ strb r2, [r1, #oNFCMD]+ mov r3, #0 @ wait++1: add r3, r3, #0x1+ cmp r3, #0xa+ blt 1b+2: ldr r2, [r1, #oNFSTAT] @ wait ready+ tst r2, #0x1+ beq 2b+ ldr r2, [r1, #oNFCONF]+ orr r2, r2, #0x800 @ disable chip+ str r2, [r1, #oNFCONF]++ @ get read to call C functions (for nand_read())+ ldr sp, DW_STACK_START @ setup stack pointer+ mov fp, #0 @ no previous frame, so fp=0++ @ copy U-BOOT to RAM+ ldr r0, =UBOOT_RAM_BASE+ mov r1, #0x0+ mov r2, #0x40000+ bl nand_read_ll+ tst r0, #0x0+ beq ok_nand_read++#ifdef CONFIG_DEBUG_LL+bad_nand_read:+ ldr r0, STR_FAIL+ ldr r1, SerBase+ bl PrintWord+1: b 1b @ infinite loop+#endif++ok_nand_read:+#ifdef CONFIG_DEBUG_LL+ ldr r0, STR_OK+ ldr r1, SerBase+ bl PrintWord+#endif++ @ verify+ mov r0, #0+ ldr r1, =UBOOT_RAM_BASE+ mov r2, #0x400 @ 4 bytes * 1024 = 4K-bytes+go_next:+ ldr r3, [r0], #4+ ldr r4, [r1], #4+ teq r3, r4+ bne notmatch+ subs r2, r2, #4+ beq done_nand_read+ bne go_next++notmatch:+#ifdef CONFIG_DEBUG_LL+ sub r0, r0, #4+ ldr r1, SerBase+ bl PrintHexWord+ ldr r0, STR_FAIL+ ldr r1, SerBase+ bl PrintWord+#endif+1:b 1b+done_nand_read:+#ifdef CONFIG_DEBUG_LL+ ldr r0, STR_OK+ ldr r1, SerBase+ bl PrintWord+#endif+ mov pc, r10+ @ clear memory+ @ r0: start address+ @ r1: length+mem_clear:+ mov r2, #0+ mov r3, r2+ mov r4, r2+ mov r5, r2+ mov r6, r2+ mov r7, r2+ mov r8, r2+ mov r9, r2++clear_loop:+ stmia r0!, {r2-r9}+ subs r1, r1, #(8 * 4)+ bne clear_loop+ mov pc, lr++#endif /*@ CONFIG_S3C2410_NAND_BOOT*/+/********************************************HHTECH wk****************/ /* *************************************************************************@@ -432,3 +547,10 @@ bl do_fiq #endif+/********************************************HHTECH wk****************/+#ifdef CONFIG_S3C2410_NAND_BOOT+ .align 2+DW_STACK_START:+ .word STACK_BASE+STACK_SIZE-4+#endif+/********************************************HHTECH wk****************/diff -uNr u-boot-1.2.0/drivers/nand/nand.c bootloader/u-boot-1.2.0/drivers/nand/nand.c--- u-boot-1.2.0/drivers/nand/nand.c 2007-01-07 07:13:11.000000000 +0800+++ bootloader/u-boot-1.2.0/drivers/nand/nand.c 2007-04-25 13:35:16.000000000 +0800@@ -23,14 +23,159 @@ #include <common.h> +#if 0+#define DEBUGN printf+#else+#define DEBUGN(x, args ...) {}+#endif+ #if (CONFIG_COMMANDS & CFG_CMD_NAND) && !defined(CFG_NAND_LEGACY) #include <nand.h>-+#include <s3c2410.h> #ifndef CFG_NAND_BASE_LIST #define CFG_NAND_BASE_LIST { CFG_NAND_BASE } #endif +#define __REGb(x) (*(volatile unsigned char *)(x))+#define __REGi(x) (*(volatile unsigned int *)(x))++#define NF_BASE 0x4e000000+#define NFCONF __REGi(NF_BASE + 0x0)+#define NFCMD __REGb(NF_BASE + 0x4)+#define NFADDR __REGb(NF_BASE + 0x8)+#define NFDATA __REGb(NF_BASE + 0xc)+#define NFSTAT __REGb(NF_BASE + 0x10)+#define NFECC0 __REGb(NF_BASE + 0x14)+#define NFECC1 __REGb(NF_BASE + 0x15)+#define NFECC2 __REGb(NF_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -