/* * (C) Copyright 2013 * Dirk Eibach, Guntermann & Drunck GmbH, dirk.eibach@gdsys.cc * * based on cmd_mem.c * (C) Copyright 2000 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. * * SPDX-License-Identifier: GPL-2.0+ */ #include #include #include #include static uint dp_last_fpga; static uint dp_last_addr; static uint dp_last_length = 0x40; /* * FPGA Memory Display * * Syntax: * fpgad {fpga} {addr} {len} */ #define DISP_LINE_LEN 16 int do_fpga_md(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { unsigned int k; unsigned int fpga; ulong addr, length; int rc = 0; u16 linebuf[DISP_LINE_LEN/sizeof(u16)]; ulong nbytes; /* * We use the last specified parameters, unless new ones are * entered. */ fpga = dp_last_fpga; addr = dp_last_addr; length = dp_last_length; if (argc < 3) return CMD_RET_USAGE; if ((flag & CMD_FLAG_REPEAT) == 0) { /* * FPGA is specified since argc > 2 */ fpga = simple_strtoul(argv[1], NULL, 16); /* * Address is specified since argc > 2 */ addr = simple_strtoul(argv[2], NULL, 16); /* * If another parameter, it is the length to display. * Length is the number of objects, not number of bytes. */ if (argc > 3) length = simple_strtoul(argv[3], NULL, 16); } 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; dp_last_length = length; return rc; } U_BOOT_CMD( fpgad, 4, 1, do_fpga_md, "fpga register display", "fpga address [# of objects]" );