Bläddra i källkod

common: Fix cmd_fpgad addressing

Addressing was completely broken for cmd_fpgad.

Signed-off-by: Dirk Eibach <dirk.eibach@gdsys.cc>
Signed-off-by: Stefan Roese <sr@denx.de>
Dirk Eibach 10 år sedan
förälder
incheckning
f1cdde2833
1 ändrade filer med 24 tillägg och 8 borttagningar
  1. 24 8
      common/cmd_fpgad.c

+ 24 - 8
common/cmd_fpgad.c

@@ -31,7 +31,8 @@ int do_fpga_md(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 	unsigned int fpga;
 	ulong	addr, length;
 	int rc = 0;
-	u16	linebuf[DISP_LINE_LEN/sizeof(u16)];
+	u16 linebuf[DISP_LINE_LEN/sizeof(u16)];
+	ulong nbytes;
 
 	/*
 	 * We use the last specified parameters, unless new ones are
@@ -63,13 +64,28 @@ int do_fpga_md(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 			length = simple_strtoul(argv[3], NULL, 16);
 	}
 
-	/* Print the lines. */
-	for (k = 0; k < DISP_LINE_LEN / sizeof(u16); ++k)
-		fpga_get_reg(fpga, (u16 *)fpga_ptr[fpga] + k, k * sizeof(u16),
-			     &linebuf[k]);
-	print_buffer(addr, (void *)linebuf, sizeof(u16),
-		     length, DISP_LINE_LEN / sizeof(u16));
-	addr += sizeof(u16)*length;
+	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;