1*78acc472SPeter Tyser /* 2*78acc472SPeter Tyser * (C) Copyright 2000-2002 3*78acc472SPeter Tyser * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 4*78acc472SPeter Tyser * 5*78acc472SPeter Tyser * See file CREDITS for list of people who contributed to this 6*78acc472SPeter Tyser * project. 7*78acc472SPeter Tyser * 8*78acc472SPeter Tyser * This program is free software; you can redistribute it and/or 9*78acc472SPeter Tyser * modify it under the terms of the GNU General Public License as 10*78acc472SPeter Tyser * published by the Free Software Foundation; either version 2 of 11*78acc472SPeter Tyser * the License, or (at your option) any later version. 12*78acc472SPeter Tyser * 13*78acc472SPeter Tyser * This program is distributed in the hope that it will be useful, 14*78acc472SPeter Tyser * but WITHOUT ANY WARRANTY; without even the implied warranty of 15*78acc472SPeter Tyser * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*78acc472SPeter Tyser * GNU General Public License for more details. 17*78acc472SPeter Tyser * 18*78acc472SPeter Tyser * You should have received a copy of the GNU General Public License 19*78acc472SPeter Tyser * along with this program; if not, write to the Free Software 20*78acc472SPeter Tyser * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 21*78acc472SPeter Tyser * MA 02111-1307 USA 22*78acc472SPeter Tyser */ 23*78acc472SPeter Tyser 24*78acc472SPeter Tyser #include <config.h> 25*78acc472SPeter Tyser #include <common.h> 26*78acc472SPeter Tyser #include <linux/ctype.h> 27*78acc472SPeter Tyser #include <asm/io.h> 28*78acc472SPeter Tyser 29*78acc472SPeter Tyser int display_options (void) 30*78acc472SPeter Tyser { 31*78acc472SPeter Tyser extern char version_string[]; 32*78acc472SPeter Tyser 33*78acc472SPeter Tyser #if defined(BUILD_TAG) 34*78acc472SPeter Tyser printf ("\n\n%s, Build: %s\n\n", version_string, BUILD_TAG); 35*78acc472SPeter Tyser #else 36*78acc472SPeter Tyser printf ("\n\n%s\n\n", version_string); 37*78acc472SPeter Tyser #endif 38*78acc472SPeter Tyser return 0; 39*78acc472SPeter Tyser } 40*78acc472SPeter Tyser 41*78acc472SPeter Tyser /* 42*78acc472SPeter Tyser * print sizes as "xxx kB", "xxx.y kB", "xxx MB", "xxx.y MB", 43*78acc472SPeter Tyser * xxx GB, or xxx.y GB as needed; allow for optional trailing string 44*78acc472SPeter Tyser * (like "\n") 45*78acc472SPeter Tyser */ 46*78acc472SPeter Tyser void print_size (phys_size_t size, const char *s) 47*78acc472SPeter Tyser { 48*78acc472SPeter Tyser ulong m = 0, n; 49*78acc472SPeter Tyser phys_size_t d = 1 << 30; /* 1 GB */ 50*78acc472SPeter Tyser char c = 'G'; 51*78acc472SPeter Tyser 52*78acc472SPeter Tyser if (size < d) { /* try MB */ 53*78acc472SPeter Tyser c = 'M'; 54*78acc472SPeter Tyser d = 1 << 20; 55*78acc472SPeter Tyser if (size < d) { /* print in kB */ 56*78acc472SPeter Tyser c = 'k'; 57*78acc472SPeter Tyser d = 1 << 10; 58*78acc472SPeter Tyser } 59*78acc472SPeter Tyser } 60*78acc472SPeter Tyser 61*78acc472SPeter Tyser n = size / d; 62*78acc472SPeter Tyser 63*78acc472SPeter Tyser /* If there's a remainder, deal with it */ 64*78acc472SPeter Tyser if(size % d) { 65*78acc472SPeter Tyser m = (10 * (size - (n * d)) + (d / 2) ) / d; 66*78acc472SPeter Tyser 67*78acc472SPeter Tyser if (m >= 10) { 68*78acc472SPeter Tyser m -= 10; 69*78acc472SPeter Tyser n += 1; 70*78acc472SPeter Tyser } 71*78acc472SPeter Tyser } 72*78acc472SPeter Tyser 73*78acc472SPeter Tyser printf ("%2ld", n); 74*78acc472SPeter Tyser if (m) { 75*78acc472SPeter Tyser printf (".%ld", m); 76*78acc472SPeter Tyser } 77*78acc472SPeter Tyser printf (" %cB%s", c, s); 78*78acc472SPeter Tyser } 79*78acc472SPeter Tyser 80*78acc472SPeter Tyser /* 81*78acc472SPeter Tyser * Print data buffer in hex and ascii form to the terminal. 82*78acc472SPeter Tyser * 83*78acc472SPeter Tyser * data reads are buffered so that each memory address is only read once. 84*78acc472SPeter Tyser * Useful when displaying the contents of volatile registers. 85*78acc472SPeter Tyser * 86*78acc472SPeter Tyser * parameters: 87*78acc472SPeter Tyser * addr: Starting address to display at start of line 88*78acc472SPeter Tyser * data: pointer to data buffer 89*78acc472SPeter Tyser * width: data value width. May be 1, 2, or 4. 90*78acc472SPeter Tyser * count: number of values to display 91*78acc472SPeter Tyser * linelen: Number of values to print per line; specify 0 for default length 92*78acc472SPeter Tyser */ 93*78acc472SPeter Tyser #define MAX_LINE_LENGTH_BYTES (64) 94*78acc472SPeter Tyser #define DEFAULT_LINE_LENGTH_BYTES (16) 95*78acc472SPeter Tyser int print_buffer (ulong addr, void* data, uint width, uint count, uint linelen) 96*78acc472SPeter Tyser { 97*78acc472SPeter Tyser uint8_t linebuf[MAX_LINE_LENGTH_BYTES]; 98*78acc472SPeter Tyser uint32_t *uip = (void*)linebuf; 99*78acc472SPeter Tyser uint16_t *usp = (void*)linebuf; 100*78acc472SPeter Tyser uint8_t *ucp = (void*)linebuf; 101*78acc472SPeter Tyser int i; 102*78acc472SPeter Tyser 103*78acc472SPeter Tyser if (linelen*width > MAX_LINE_LENGTH_BYTES) 104*78acc472SPeter Tyser linelen = MAX_LINE_LENGTH_BYTES / width; 105*78acc472SPeter Tyser if (linelen < 1) 106*78acc472SPeter Tyser linelen = DEFAULT_LINE_LENGTH_BYTES / width; 107*78acc472SPeter Tyser 108*78acc472SPeter Tyser while (count) { 109*78acc472SPeter Tyser printf("%08lx:", addr); 110*78acc472SPeter Tyser 111*78acc472SPeter Tyser /* check for overflow condition */ 112*78acc472SPeter Tyser if (count < linelen) 113*78acc472SPeter Tyser linelen = count; 114*78acc472SPeter Tyser 115*78acc472SPeter Tyser /* Copy from memory into linebuf and print hex values */ 116*78acc472SPeter Tyser for (i = 0; i < linelen; i++) { 117*78acc472SPeter Tyser if (width == 4) { 118*78acc472SPeter Tyser uip[i] = *(volatile uint32_t *)data; 119*78acc472SPeter Tyser printf(" %08x", uip[i]); 120*78acc472SPeter Tyser } else if (width == 2) { 121*78acc472SPeter Tyser usp[i] = *(volatile uint16_t *)data; 122*78acc472SPeter Tyser printf(" %04x", usp[i]); 123*78acc472SPeter Tyser } else { 124*78acc472SPeter Tyser ucp[i] = *(volatile uint8_t *)data; 125*78acc472SPeter Tyser printf(" %02x", ucp[i]); 126*78acc472SPeter Tyser } 127*78acc472SPeter Tyser data += width; 128*78acc472SPeter Tyser } 129*78acc472SPeter Tyser 130*78acc472SPeter Tyser /* Print data in ASCII characters */ 131*78acc472SPeter Tyser puts(" "); 132*78acc472SPeter Tyser for (i = 0; i < linelen * width; i++) 133*78acc472SPeter Tyser putc(isprint(ucp[i]) && (ucp[i] < 0x80) ? ucp[i] : '.'); 134*78acc472SPeter Tyser putc ('\n'); 135*78acc472SPeter Tyser 136*78acc472SPeter Tyser /* update references */ 137*78acc472SPeter Tyser addr += linelen * width; 138*78acc472SPeter Tyser count -= linelen; 139*78acc472SPeter Tyser 140*78acc472SPeter Tyser if (ctrlc()) 141*78acc472SPeter Tyser return -1; 142*78acc472SPeter Tyser } 143*78acc472SPeter Tyser 144*78acc472SPeter Tyser return 0; 145*78acc472SPeter Tyser } 146