mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 18:35:42 +01:00 
			
		
		
		
	As part of bringing the master branch back in to next, we need to allow for all of these changes to exist here. Reported-by: Jonas Karlman <jonas@kwiboo.se> Signed-off-by: Tom Rini <trini@konsulko.com>
		
			
				
	
	
		
			102 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0+
 | |
| /*
 | |
|  * (C) Copyright 2013
 | |
|  * Dirk Eibach,  Guntermann & Drunck GmbH, dirk.eibach@gdsys.cc
 | |
|  *
 | |
|  * based on cmd_mem.c
 | |
|  * (C) Copyright 2000
 | |
|  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 | |
|  */
 | |
| 
 | |
| #include <command.h>
 | |
| #include <console.h>
 | |
| #include <display_options.h>
 | |
| #include <vsprintf.h>
 | |
| 
 | |
| #include <gdsys_fpga.h>
 | |
| 
 | |
| static uint	dp_last_fpga;
 | |
| static uint	dp_last_addr;
 | |
| static uint	dp_last_length = 0x40;
 | |
| 
 | |
| /*
 | |
|  * FPGA Memory Display
 | |
|  *
 | |
|  * Syntax:
 | |
|  *	fpgad {fpga} {addr} {len}
 | |
|  */
 | |
| #define DISP_LINE_LEN	16
 | |
| int do_fpga_md(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 | |
| {
 | |
| 	unsigned int k;
 | |
| 	unsigned int fpga;
 | |
| 	ulong	addr, length;
 | |
| 	int rc = 0;
 | |
| 	u16 linebuf[DISP_LINE_LEN/sizeof(u16)];
 | |
| 	ulong nbytes;
 | |
| 
 | |
| 	/*
 | |
| 	 * We use the last specified parameters, unless new ones are
 | |
| 	 * entered.
 | |
| 	 */
 | |
| 	fpga = dp_last_fpga;
 | |
| 	addr = dp_last_addr;
 | |
| 	length = dp_last_length;
 | |
| 
 | |
| 	if (argc < 3)
 | |
| 		return CMD_RET_USAGE;
 | |
| 
 | |
| 	if ((flag & CMD_FLAG_REPEAT) == 0) {
 | |
| 		/*
 | |
| 		 * FPGA is specified since argc > 2
 | |
| 		 */
 | |
| 		fpga = hextoul(argv[1], NULL);
 | |
| 
 | |
| 		/*
 | |
| 		 * Address is specified since argc > 2
 | |
| 		 */
 | |
| 		addr = hextoul(argv[2], NULL);
 | |
| 
 | |
| 		/*
 | |
| 		 * If another parameter, it is the length to display.
 | |
| 		 * Length is the number of objects, not number of bytes.
 | |
| 		 */
 | |
| 		if (argc > 3)
 | |
| 			length = hextoul(argv[3], NULL);
 | |
| 	}
 | |
| 
 | |
| 	nbytes = length * sizeof(u16);
 | |
| 	do {
 | |
| 		ulong linebytes = (nbytes > DISP_LINE_LEN) ?
 | |
| 				  DISP_LINE_LEN : nbytes;
 | |
| 
 | |
| 		for (k = 0; k < linebytes / sizeof(u16); ++k)
 | |
| 			fpga_get_reg(fpga,
 | |
| 				     (u16 *)fpga_ptr[fpga] + addr
 | |
| 				     / sizeof(u16) + k,
 | |
| 				     addr + k * sizeof(u16),
 | |
| 				     &linebuf[k]);
 | |
| 		print_buffer(addr, (void *)linebuf, sizeof(u16),
 | |
| 			     linebytes / sizeof(u16),
 | |
| 			     DISP_LINE_LEN / sizeof(u16));
 | |
| 
 | |
| 		nbytes -= linebytes;
 | |
| 		addr += linebytes;
 | |
| 		if (ctrlc()) {
 | |
| 			rc = 1;
 | |
| 			break;
 | |
| 		}
 | |
| 	} while (nbytes > 0);
 | |
| 
 | |
| 	dp_last_fpga = fpga;
 | |
| 	dp_last_addr = addr;
 | |
| 	dp_last_length = length;
 | |
| 	return rc;
 | |
| }
 | |
| 
 | |
| U_BOOT_CMD(
 | |
| 	fpgad,	4,	1,	do_fpga_md,
 | |
| 	"fpga register display",
 | |
| 	"fpga address [# of objects]"
 | |
| );
 |