comparison packages/redboot/current/src/dump.c @ 264:57f3c72256bb

Reorg CLI functions into separate files. Update CDL. Fix macros in scripts.
author gthomas
date Tue, 06 Aug 2002 14:29:11 +0000
parents
children c4355f101bf6
comparison
equal deleted inserted replaced
263:c0d53837cb68 264:57f3c72256bb
1 //==========================================================================
2 //
3 // dump.c
4 //
5 // RedBoot dump support
6 //
7 //==========================================================================
8 //####ECOSGPLCOPYRIGHTBEGIN####
9 // -------------------------------------------
10 // This file is part of eCos, the Embedded Configurable Operating System.
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
12 // Copyright (C) 2002 Gary Thomas
13 //
14 // eCos is free software; you can redistribute it and/or modify it under
15 // the terms of the GNU General Public License as published by the Free
16 // Software Foundation; either version 2 or (at your option) any later version.
17 //
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 // for more details.
22 //
23 // You should have received a copy of the GNU General Public License along
24 // with eCos; if not, write to the Free Software Foundation, Inc.,
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
26 //
27 // As a special exception, if other files instantiate templates or use macros
28 // or inline functions from this file, or you compile this file and link it
29 // with other works to produce a work based on this file, this file does not
30 // by itself cause the resulting work to be covered by the GNU General Public
31 // License. However the source code for this file must still be made available
32 // in accordance with section (3) of the GNU General Public License.
33 //
34 // This exception does not invalidate any other reasons why a work based on
35 // this file might be covered by the GNU General Public License.
36 //
37 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
38 // at http://sources.redhat.com/ecos/ecos-license/
39 // -------------------------------------------
40 //####ECOSGPLCOPYRIGHTEND####
41 //==========================================================================
42 //#####DESCRIPTIONBEGIN####
43 //
44 // Author(s): gthomas
45 // Contributors: gthomas
46 // Date: 2002-08-06
47 // Purpose:
48 // Description:
49 //
50 // This code is part of RedBoot (tm).
51 //
52 //####DESCRIPTIONEND####
53 //
54 //==========================================================================
55
56 #include <redboot.h>
57
58 RedBoot_cmd("dump",
59 "Display (hex dump) a range of memory",
60 "-b <location> [-l <length>] [-s] [-1|2|4]",
61 do_dump
62 );
63 RedBoot_cmd("x",
64 "Display (hex dump) a range of memory",
65 "-b <location> [-l <length>] [-s] [-1|2|4]",
66 do_x
67 );
68
69 void
70 do_dump(int argc, char *argv[])
71 {
72 struct option_info opts[6];
73 unsigned long base, len;
74 bool base_set, len_set;
75 static unsigned long _base, _len;
76 static char _size = 1;
77 bool srec_dump, set_32bit, set_16bit, set_8bit;
78 int i, n, off, cksum;
79 cyg_uint8 ch;
80
81 init_opts(&opts[0], 'b', true, OPTION_ARG_TYPE_NUM,
82 (void **)&base, (bool *)&base_set, "base address");
83 init_opts(&opts[1], 'l', true, OPTION_ARG_TYPE_NUM,
84 (void **)&len, (bool *)&len_set, "length");
85 init_opts(&opts[2], 's', false, OPTION_ARG_TYPE_FLG,
86 (void **)&srec_dump, 0, "dump data using Morotola S-records");
87 init_opts(&opts[3], '4', false, OPTION_ARG_TYPE_FLG,
88 (void *)&set_32bit, (bool *)0, "dump 32 bit units");
89 init_opts(&opts[4], '2', false, OPTION_ARG_TYPE_FLG,
90 (void **)&set_16bit, (bool *)0, "dump 16 bit units");
91 init_opts(&opts[5], '1', false, OPTION_ARG_TYPE_FLG,
92 (void **)&set_8bit, (bool *)0, "dump 8 bit units");
93 if (!scan_opts(argc, argv, 1, opts, 6, 0, 0, "")) {
94 return;
95 }
96 if (!base_set) {
97 if (_base == 0) {
98 diag_printf("Dump what [location]?\n");
99 return;
100 }
101 base = _base;
102 if (!len_set) {
103 len = _len;
104 len_set = true;
105 }
106 }
107
108 if (set_32bit) {
109 _size = 4;
110 } else if (set_16bit) {
111 _size = 2;
112 } else if (set_8bit) {
113 _size = 1;
114 }
115
116 if (!len_set) {
117 len = 32;
118 }
119 if (srec_dump) {
120 off = 0;
121 while (off < len) {
122 n = (len > 16) ? 16 : len;
123 cksum = n+5;
124 diag_printf("S3%02X%08X", n+5, off+base);
125 for (i = 0; i < 4; i++) {
126 cksum += (((base+off)>>(i*8)) & 0xFF);
127 }
128 for (i = 0; i < n; i++) {
129 ch = *(cyg_uint8 *)(base+off+i);
130 diag_printf("%02X", ch);
131 cksum += ch;
132 }
133 diag_printf("%02X\n", ~cksum & 0xFF);
134 off += n;
135 }
136 } else {
137 switch( _size ) {
138 case 1:
139 diag_dump_buf((void *)base, len);
140 break;
141 case 2:
142 diag_dump_buf_16bit((void *)base, len);
143 break;
144 case 4:
145 diag_dump_buf_32bit((void *)base, len);
146 break;
147 }
148 }
149 _base = base + len;
150 _len = len;
151 }
152
153 // Simple alias for the dump command
154 void
155 do_x(int argc, char *argv[])
156 {
157 do_dump(argc, argv);
158 }