Mercurial > ecos
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 } |
