]>
Commit | Line | Data |
---|---|---|
83d290c5 | 1 | // SPDX-License-Identifier: GPL-2.0+ |
869b550e DE |
2 | /* |
3 | * (C) Copyright 2013 | |
4 | * Dirk Eibach, Guntermann & Drunck GmbH, [email protected] | |
5 | * | |
6 | * based on cmd_mem.c | |
7 | * (C) Copyright 2000 | |
8 | * Wolfgang Denk, DENX Software Engineering, [email protected]. | |
869b550e DE |
9 | */ |
10 | ||
869b550e | 11 | #include <command.h> |
24b852a7 | 12 | #include <console.h> |
4e4bf944 | 13 | #include <display_options.h> |
03de305e | 14 | #include <vsprintf.h> |
869b550e DE |
15 | |
16 | #include <gdsys_fpga.h> | |
17 | ||
18 | static uint dp_last_fpga; | |
19 | static uint dp_last_addr; | |
20 | static uint dp_last_length = 0x40; | |
21 | ||
22 | /* | |
23 | * FPGA Memory Display | |
24 | * | |
25 | * Syntax: | |
26 | * fpgad {fpga} {addr} {len} | |
27 | */ | |
28 | #define DISP_LINE_LEN 16 | |
09140113 | 29 | int do_fpga_md(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) |
869b550e DE |
30 | { |
31 | unsigned int k; | |
32 | unsigned int fpga; | |
33 | ulong addr, length; | |
34 | int rc = 0; | |
f1cdde28 DE |
35 | u16 linebuf[DISP_LINE_LEN/sizeof(u16)]; |
36 | ulong nbytes; | |
869b550e DE |
37 | |
38 | /* | |
39 | * We use the last specified parameters, unless new ones are | |
40 | * entered. | |
41 | */ | |
42 | fpga = dp_last_fpga; | |
43 | addr = dp_last_addr; | |
44 | length = dp_last_length; | |
45 | ||
46 | if (argc < 3) | |
47 | return CMD_RET_USAGE; | |
48 | ||
49 | if ((flag & CMD_FLAG_REPEAT) == 0) { | |
50 | /* | |
51 | * FPGA is specified since argc > 2 | |
52 | */ | |
7e5f460e | 53 | fpga = hextoul(argv[1], NULL); |
869b550e DE |
54 | |
55 | /* | |
56 | * Address is specified since argc > 2 | |
57 | */ | |
7e5f460e | 58 | addr = hextoul(argv[2], NULL); |
869b550e DE |
59 | |
60 | /* | |
61 | * If another parameter, it is the length to display. | |
62 | * Length is the number of objects, not number of bytes. | |
63 | */ | |
64 | if (argc > 3) | |
7e5f460e | 65 | length = hextoul(argv[3], NULL); |
869b550e DE |
66 | } |
67 | ||
f1cdde28 DE |
68 | nbytes = length * sizeof(u16); |
69 | do { | |
70 | ulong linebytes = (nbytes > DISP_LINE_LEN) ? | |
71 | DISP_LINE_LEN : nbytes; | |
72 | ||
73 | for (k = 0; k < linebytes / sizeof(u16); ++k) | |
74 | fpga_get_reg(fpga, | |
75 | (u16 *)fpga_ptr[fpga] + addr | |
76 | / sizeof(u16) + k, | |
77 | addr + k * sizeof(u16), | |
78 | &linebuf[k]); | |
79 | print_buffer(addr, (void *)linebuf, sizeof(u16), | |
80 | linebytes / sizeof(u16), | |
81 | DISP_LINE_LEN / sizeof(u16)); | |
82 | ||
83 | nbytes -= linebytes; | |
84 | addr += linebytes; | |
85 | if (ctrlc()) { | |
86 | rc = 1; | |
87 | break; | |
88 | } | |
89 | } while (nbytes > 0); | |
869b550e DE |
90 | |
91 | dp_last_fpga = fpga; | |
92 | dp_last_addr = addr; | |
93 | dp_last_length = length; | |
94 | return rc; | |
95 | } | |
96 | ||
97 | U_BOOT_CMD( | |
98 | fpgad, 4, 1, do_fpga_md, | |
99 | "fpga register display", | |
100 | "fpga address [# of objects]" | |
101 | ); |