]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - packages/redboot/v2_0/src/dump.c
Initial revision
[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               (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%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 }