common: Fix cmd_fpgad addressing
authorDirk Eibach <dirk.eibach@gdsys.cc>
Thu, 13 Nov 2014 18:21:14 +0000 (19:21 +0100)
committerStefan Roese <sr@denx.de>
Wed, 19 Nov 2014 07:48:41 +0000 (08:48 +0100)
Addressing was completely broken for cmd_fpgad.

Signed-off-by: Dirk Eibach <dirk.eibach@gdsys.cc>
Signed-off-by: Stefan Roese <sr@denx.de>
common/cmd_fpgad.c

index 1b25ed87475dd9aa7b0023ca0ff1822f2ffa1742..1f1d00f28ac92c352fe345256f29174ead675309 100644 (file)
@@ -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;