summaryrefslogtreecommitdiff
path: root/common/cmd_fpgad.c
diff options
context:
space:
mode:
authorDirk Eibach <dirk.eibach@gdsys.cc>2014-11-13 19:21:14 +0100
committerStefan Roese <sr@denx.de>2014-11-19 08:48:41 +0100
commitf1cdde28338806ebb309576d9235b3701aa00548 (patch)
tree43b315040f6057a7aaeacc8168bb5aadad814f2e /common/cmd_fpgad.c
parentf3c89d9228157933cf3e34d09b54ea362a6d8838 (diff)
downloadu-boot-imx-f1cdde28338806ebb309576d9235b3701aa00548.zip
u-boot-imx-f1cdde28338806ebb309576d9235b3701aa00548.tar.gz
u-boot-imx-f1cdde28338806ebb309576d9235b3701aa00548.tar.bz2
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>
Diffstat (limited to 'common/cmd_fpgad.c')
-rw-r--r--common/cmd_fpgad.c32
1 files changed, 24 insertions, 8 deletions
diff --git a/common/cmd_fpgad.c b/common/cmd_fpgad.c
index 1b25ed8..1f1d00f 100644
--- a/common/cmd_fpgad.c
+++ b/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;