[U-Boot] [PATCH v2 3/7] common: Fix cmd_fpgad addressing

dirk.eibach at gdsys.cc
2014-11-13T18:21:14Z

From: Dirk Eibach <dirk.eibach@gdsys.cc>

Addressing was completely broken for cmd_fpgad.

Signed-off-by: Dirk Eibach <dirk.eibach@gdsys.cc>
---

Changes in v2: None

common/cmd_fpgad.c | 32 ++++++++++++++++++++++++--------
1 file 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;
--
1.8.3