Skip to content
Snippets Groups Projects
cmd_mem.c 27.5 KiB
Newer Older
  • Learn to ignore specific revisions
  • Wolfgang Denk's avatar
    Wolfgang Denk committed
    		*/
    		addr = simple_strtoul(argv[1], NULL, 16);
    		addr += base_address;
    	}
    
    
    #ifdef CONFIG_HAS_DATAFLASH
    	if (addr_dataflash(addr)){
    
    		puts ("Can't modify DataFlash in place. Use cp instead.\n\r");
    
    #ifdef CONFIG_BLACKFIN
    	if (addr_bfin_on_chip_mem(addr)) {
    		puts ("Can't modify L1 instruction in place. Use cp instead.\n\r");
    		return 0;
    	}
    #endif
    
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	/* Print the address, followed by value.  Then accept input for
    	 * the next value.  A non-converted value exits.
    	 */
    	do {
    		printf("%08lx:", addr);
    		if (size == 4)
    			printf(" %08x", *((uint   *)addr));
    		else if (size == 2)
    			printf(" %04x", *((ushort *)addr));
    		else
    			printf(" %02x", *((u_char *)addr));
    
    		nbytes = readline (" ? ");
    		if (nbytes == 0 || (nbytes == 1 && console_buffer[0] == '-')) {
    			/* <CR> pressed as only input, don't modify current
    			 * location and move to next. "-" pressed will go back.
    			 */
    			if (incrflag)
    				addr += nbytes ? -size : size;
    			nbytes = 1;
    #ifdef CONFIG_BOOT_RETRY_TIME
    			reset_cmd_timeout(); /* good enough to not time out */
    #endif
    		}
    #ifdef CONFIG_BOOT_RETRY_TIME
    		else if (nbytes == -2) {
    			break;	/* timed out, exit the command	*/
    		}
    #endif
    		else {
    			char *endp;
    			i = simple_strtoul(console_buffer, &endp, 16);
    			nbytes = endp - console_buffer;
    			if (nbytes) {
    #ifdef CONFIG_BOOT_RETRY_TIME
    				/* good enough to not time out
    				 */
    				reset_cmd_timeout();
    #endif
    				if (size == 4)
    					*((uint   *)addr) = i;
    				else if (size == 2)
    					*((ushort *)addr) = i;
    				else
    					*((u_char *)addr) = i;
    				if (incrflag)
    					addr += size;
    			}
    		}
    	} while (nbytes);
    
    	mm_last_addr = addr;
    	mm_last_size = size;
    	return 0;
    }
    
    
    #ifdef CONFIG_CMD_CRC32
    
    
    #ifndef CONFIG_CRC32_VERIFY
    
    
    int do_mem_crc (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    {
    
    	ulong addr, length;
    	ulong crc;
    	ulong *ptr;
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    	if (argc < 3)
    		return cmd_usage(cmdtp);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    	addr = simple_strtoul (argv[1], NULL, 16);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	addr += base_address;
    
    
    	length = simple_strtoul (argv[2], NULL, 16);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    	crc = crc32_wd (0, (const uchar *) addr, length, CHUNKSZ_CRC32);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    	printf ("CRC32 for %08lx ... %08lx ==> %08lx\n",
    
    			addr, addr + length - 1, crc);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    	if (argc > 3) {
    		ptr = (ulong *) simple_strtoul (argv[3], NULL, 16);
    		*ptr = crc;
    	}
    
    #else	/* CONFIG_CRC32_VERIFY */
    
    
    int do_mem_crc (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
    
    {
    	ulong addr, length;
    	ulong crc;
    	ulong *ptr;
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	ulong vcrc;
    
    usage:
    		return cmd_usage(cmdtp);
    
    	}
    
    	av = argv + 1;
    	ac = argc - 1;
    	if (strcmp(*av, "-v") == 0) {
    		verify = 1;
    		av++;
    		ac--;
    		if (ac < 3)
    			goto usage;
    	} else
    		verify = 0;
    
    	addr = simple_strtoul(*av++, NULL, 16);
    	addr += base_address;
    	length = simple_strtoul(*av++, NULL, 16);
    
    
    	crc = crc32_wd (0, (const uchar *) addr, length, CHUNKSZ_CRC32);
    
    
    	if (!verify) {
    		printf ("CRC32 for %08lx ... %08lx ==> %08lx\n",
    				addr, addr + length - 1, crc);
    		if (ac > 2) {
    			ptr = (ulong *) simple_strtoul (*av++, NULL, 16);
    			*ptr = crc;
    		}
    	} else {
    		vcrc = simple_strtoul(*av++, NULL, 16);
    		if (vcrc != crc) {
    			printf ("CRC32 for %08lx ... %08lx ==> %08lx != %08lx ** ERROR **\n",
    					addr, addr + length - 1, crc, vcrc);
    			return 1;
    		}
    	}
    
    	return 0;
    
    }
    #endif	/* CONFIG_CRC32_VERIFY */
    
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    /**************************************************/
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	md,	3,	1,	do_mem_md,
    
    Peter Tyser's avatar
    Peter Tyser committed
    	"memory display",
    
    	"[.b, .w, .l] address [# of objects]"
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	mm,	2,	1,	do_mem_mm,
    
    	"memory modify (auto-incrementing address)",
    	"[.b, .w, .l] address"
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	nm,	2,	1,	do_mem_nm,
    
    Peter Tyser's avatar
    Peter Tyser committed
    	"memory modify (constant address)",
    
    	"[.b, .w, .l] address"
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    );
    
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	mw,	4,	1,	do_mem_mw,
    
    Peter Tyser's avatar
    Peter Tyser committed
    	"memory write (fill)",
    
    	"[.b, .w, .l] address value [count]"
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    );
    
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	cp,	4,	1,	do_mem_cp,
    
    Peter Tyser's avatar
    Peter Tyser committed
    	"memory copy",
    
    	"[.b, .w, .l] source target count"
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    );
    
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	cmp,	4,	1,	do_mem_cmp,
    
    Peter Tyser's avatar
    Peter Tyser committed
    	"memory compare",
    
    	"[.b, .w, .l] addr1 addr2 count"
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    );
    
    
    #ifdef CONFIG_CMD_CRC32
    
    
    #ifndef CONFIG_CRC32_VERIFY
    
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	crc32,	4,	1,	do_mem_crc,
    
    Peter Tyser's avatar
    Peter Tyser committed
    	"checksum calculation",
    
    	"address count [addr]\n    - compute CRC32 checksum [save at addr]"
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    );
    
    
    #else	/* CONFIG_CRC32_VERIFY */
    
    U_BOOT_CMD(
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	crc32,	5,	1,	do_mem_crc,
    
    Peter Tyser's avatar
    Peter Tyser committed
    	"checksum calculation",
    
    	"address count [addr]\n    - compute CRC32 checksum [save at addr]\n"
    
    	"-v address count crc\n    - verify crc of memory area"
    
    );
    
    #endif	/* CONFIG_CRC32_VERIFY */
    
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	base,	2,	1,	do_mem_base,
    
    Peter Tyser's avatar
    Peter Tyser committed
    	"print or set address offset",
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	"\n    - print address offset for memory commands\n"
    
    	"base off\n    - set address offset for memory commands to 'off'"
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    );
    
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	loop,	3,	1,	do_mem_loop,
    
    Peter Tyser's avatar
    Peter Tyser committed
    	"infinite loop on address range",
    
    	"[.b, .w, .l] address number_of_objects"
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    );
    
    
    #ifdef CONFIG_LOOPW
    U_BOOT_CMD(
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	loopw,	4,	1,	do_mem_loopw,
    
    Peter Tyser's avatar
    Peter Tyser committed
    	"infinite write loop on address range",
    
    	"[.b, .w, .l] address number_of_objects data_to_write"
    
    );
    #endif /* CONFIG_LOOPW */
    
    
    	mtest,	5,	1,	do_mem_mtest,
    
    	"simple RAM read/write test",
    	"[start [end [pattern [iterations]]]]"
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    );
    
    
    #ifdef CONFIG_MX_CYCLIC
    U_BOOT_CMD(
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	mdc,	4,	1,	do_mem_mdc,
    
    Peter Tyser's avatar
    Peter Tyser committed
    	"memory display cyclic",
    
    	"[.b, .w, .l] address count delay(ms)"
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    	mwc,	4,	1,	do_mem_mwc,
    
    Peter Tyser's avatar
    Peter Tyser committed
    	"memory write cyclic",
    
    	"[.b, .w, .l] address value delay(ms)"
    
    );
    #endif /* CONFIG_MX_CYCLIC */