TX53 Release 2011-12-20
[karo-tx-redboot.git] / packages / redboot / v2_0 / src / dump.c
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                         &base, &base_set, "base address");
83         init_opts(&opts[1], 'l', true, OPTION_ARG_TYPE_NUM,
84                         &len, &len_set, "length");
85         init_opts(&opts[2], 's', false, OPTION_ARG_TYPE_FLG,
86                         &srec_dump, NULL, "dump data using Morotola S-records");
87         init_opts(&opts[3], '4', false, OPTION_ARG_TYPE_FLG,
88                         &set_32bit, NULL, "dump 32 bit units");
89         init_opts(&opts[4], '2', false, OPTION_ARG_TYPE_FLG,
90                         &set_16bit, NULL, "dump 16 bit units");
91         init_opts(&opts[5], '1', false, OPTION_ARG_TYPE_FLG,
92                         &set_8bit, NULL, "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%08lX", 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 }