diff options
author | Dirk Eibach <dirk.eibach@gdsys.cc> | 2014-11-13 19:21:14 +0100 |
---|---|---|
committer | Stefan Roese <sr@denx.de> | 2014-11-19 08:48:41 +0100 |
commit | f1cdde28338806ebb309576d9235b3701aa00548 (patch) | |
tree | 43b315040f6057a7aaeacc8168bb5aadad814f2e /common/cmd_fpgad.c | |
parent | f3c89d9228157933cf3e34d09b54ea362a6d8838 (diff) | |
download | u-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.c | 32 |
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; |