Skip to content
Snippets Groups Projects
cmd_mem.c 26.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • mod_mem(cmd_tbl_t *cmdtp, int incrflag, int flag, int argc, char * const argv[])
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    {
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    #ifdef CONFIG_BOOT_RETRY_TIME
    	reset_cmd_timeout();	/* got a good command to get here */
    #endif
    	/* We use the last specified parameters, unless new ones are
    	 * entered.
    	 */
    	addr = mm_last_addr;
    	size = mm_last_size;
    
    	if ((flag & CMD_FLAG_REPEAT) == 0) {
    		/* New command specified.  Check for a size specification.
    		 * Defaults to long if no or incorrect specification.
    		 */
    
    		if ((size = cmd_get_data_size(argv[0], 4)) < 0)
    			return 1;
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    		/* Address is specified since argc > 1
    		*/
    		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 {
    
    		ptr = map_sysmem(addr, size);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    		printf("%08lx:", addr);
    		if (size == 4)
    
    			printf(" %08x", *((uint *)ptr));
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    		else if (size == 2)
    
    			printf(" %04x", *((ushort *)ptr));
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    		else
    
    			printf(" %02x", *((u_char *)ptr));
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    		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 *)ptr) = i;
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    				else if (size == 2)
    
    					*((ushort *)ptr) = i;
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    				else
    
    					*((u_char *)ptr) = i;
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    				if (incrflag)
    					addr += size;
    			}
    		}
    	} while (nbytes);
    
    	if (ptr)
    		unmap_sysmem(ptr);
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    	mm_last_addr = addr;
    	mm_last_size = size;
    	return 0;
    }
    
    
    #ifdef CONFIG_CMD_CRC32
    
    
    static int do_mem_crc(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    {
    
    	int flags = 0;
    
    	if (argc < 3)
    
    
    	av = argv + 1;
    	ac = argc - 1;
    
    #ifdef CONFIG_HASH_VERIFY
    
    	if (strcmp(*av, "-v") == 0) {
    
    		flags |= HASH_FLAG_VERIFY;
    
    	return hash_command("crc32", flags, cmdtp, flag, ac, av);
    
    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 */
    
    
    #ifdef CONFIG_CMD_MEMINFO
    __weak void board_show_dram(ulong size)
    {
    	puts("DRAM:  ");
    	print_size(size, "\n");
    }
    
    static int do_mem_info(cmd_tbl_t *cmdtp, int flag, int argc,
    		       char * const argv[])
    {
    	board_show_dram(gd->ram_size);
    
    	return 0;
    }
    #endif
    
    
    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 */
    
    
    #ifdef CONFIG_CMD_MEMTEST
    
    	mtest,	5,	1,	do_mem_mtest,
    
    	"simple RAM read/write test",
    	"[start [end [pattern [iterations]]]]"
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    );
    
    #endif	/* CONFIG_CMD_MEMTEST */
    
    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 */
    
    
    #ifdef CONFIG_CMD_MEMINFO
    U_BOOT_CMD(
    	meminfo,	3,	1,	do_mem_info,
    	"display memory information",
    	""
    );
    #endif