Blame view
common/cmd_dcr.c
6.01 KB
3863585bb
|
1 2 3 4 |
/* * (C) Copyright 2001 * Erik Theisen, Wave 7 Optics, etheisen@mindspring.com. * |
1a4596601
|
5 |
* SPDX-License-Identifier: GPL-2.0+ |
3863585bb
|
6 7 8 |
*/ /* |
0c8721a46
|
9 |
* AMCC 4XX DCR Functions |
3863585bb
|
10 11 12 13 14 |
*/ #include <common.h> #include <config.h> #include <command.h> |
3863585bb
|
15 |
|
af9e1f5b9
|
16 17 |
unsigned long get_dcr (unsigned short); unsigned long set_dcr (unsigned short, unsigned long); |
0c8721a46
|
18 19 20 |
/* ======================================================================= * Interpreter command to retrieve an AMCC PPC 4xx Device Control Register * ======================================================================= |
3863585bb
|
21 |
*/ |
54841ab50
|
22 |
int do_getdcr ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[] ) |
3863585bb
|
23 |
{ |
0c8721a46
|
24 25 |
unsigned short dcrn; /* Device Control Register Num */ unsigned long value; /* DCR's value */ |
3863585bb
|
26 |
|
0c8721a46
|
27 |
unsigned long get_dcr (unsigned short); |
8bde7f776
|
28 |
|
0c8721a46
|
29 |
/* Validate arguments */ |
47e26b1bf
|
30 |
if (argc < 2) |
4c12eeb8b
|
31 |
return CMD_RET_USAGE; |
3863585bb
|
32 |
|
0c8721a46
|
33 34 35 |
/* Get a DCR */ dcrn = (unsigned short) simple_strtoul (argv[1], NULL, 16); value = get_dcr (dcrn); |
3863585bb
|
36 |
|
0c8721a46
|
37 38 |
printf ("%04x: %08lx ", dcrn, value); |
3863585bb
|
39 |
|
0c8721a46
|
40 41 |
return 0; } |
3863585bb
|
42 43 44 |
/* ====================================================================== |
0c8721a46
|
45 |
* Interpreter command to set an AMCC PPC 4xx Device Control Register |
3863585bb
|
46 47 |
* ====================================================================== */ |
54841ab50
|
48 |
int do_setdcr (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) |
3863585bb
|
49 |
{ |
0c8721a46
|
50 51 52 53 54 |
unsigned short dcrn; /* Device Control Register Num */ unsigned long value; /* DCR's value */ int nbytes; |
0c8721a46
|
55 56 |
/* Validate arguments */ |
47e26b1bf
|
57 |
if (argc < 2) |
4c12eeb8b
|
58 |
return CMD_RET_USAGE; |
3863585bb
|
59 |
|
0c8721a46
|
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
/* Set a DCR */ dcrn = (unsigned short) simple_strtoul (argv[1], NULL, 16); do { value = get_dcr (dcrn); printf ("%04x: %08lx", dcrn, value); nbytes = readline (" ? "); if (nbytes == 0) { /* * <CR> pressed as only input, don't modify current * location and exit command. */ nbytes = 1; return 0; } else { unsigned long i; char *endp; i = simple_strtoul (console_buffer, &endp, 16); nbytes = endp - console_buffer; if (nbytes) set_dcr (dcrn, i); } } while (nbytes); return 0; } |
3863585bb
|
86 |
|
af9e1f5b9
|
87 88 89 90 91 |
/* ======================================================================= * Interpreter command to retrieve an register value through AMCC PPC 4xx * Device Control Register inderect addressing. * ======================================================================= */ |
54841ab50
|
92 |
int do_getidcr (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
af9e1f5b9
|
93 94 95 96 97 98 99 100 101 |
{ unsigned short adr_dcrn; /* Device Control Register Num for Address */ unsigned short dat_dcrn; /* Device Control Register Num for Data */ unsigned short offset; /* Register's offset */ unsigned long value; /* Register's value */ char *ptr = NULL; char buf[80]; /* Validate arguments */ |
47e26b1bf
|
102 |
if (argc < 3) |
4c12eeb8b
|
103 |
return CMD_RET_USAGE; |
af9e1f5b9
|
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
/* Find out whether ther is '.' (dot) symbol in the first parameter. */ strncpy (buf, argv[1], sizeof(buf)-1); buf[sizeof(buf)-1] = 0; /* will guarantee zero-end string */ ptr = strchr (buf, '.'); if (ptr != NULL) { /* First parameter has format adr_dcrn.dat_dcrn */ *ptr++ = 0; /* erase '.', create zero-end string */ adr_dcrn = (unsigned short) simple_strtoul (buf, NULL, 16); dat_dcrn = (unsigned short) simple_strtoul (ptr, NULL, 16); } else { /* * First parameter has format adr_dcrn; dat_dcrn will be * calculated as adr_dcrn+1. */ adr_dcrn = (unsigned short) simple_strtoul (buf, NULL, 16); dat_dcrn = adr_dcrn+1; } /* Register's offset */ offset = (unsigned short) simple_strtoul (argv[2], NULL, 16); /* Disable interrupts */ disable_interrupts (); /* Set offset */ set_dcr (adr_dcrn, offset); /* get data */ value = get_dcr (dat_dcrn); /* Enable interrupts */ enable_interrupts (); printf ("%04x.%04x-%04x Read %08lx ", adr_dcrn, dat_dcrn, offset, value); return 0; } /* ======================================================================= * Interpreter command to update an register value through AMCC PPC 4xx * Device Control Register inderect addressing. * ======================================================================= */ |
54841ab50
|
147 |
int do_setidcr (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[]) |
af9e1f5b9
|
148 149 150 151 152 153 154 155 156 |
{ unsigned short adr_dcrn; /* Device Control Register Num for Address */ unsigned short dat_dcrn; /* Device Control Register Num for Data */ unsigned short offset; /* Register's offset */ unsigned long value; /* Register's value */ char *ptr = NULL; char buf[80]; /* Validate arguments */ |
47e26b1bf
|
157 |
if (argc < 4) |
4c12eeb8b
|
158 |
return CMD_RET_USAGE; |
af9e1f5b9
|
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
/* Find out whether ther is '.' (dot) symbol in the first parameter. */ strncpy (buf, argv[1], sizeof(buf)-1); buf[sizeof(buf)-1] = 0; /* will guarantee zero-end string */ ptr = strchr (buf, '.'); if (ptr != NULL) { /* First parameter has format adr_dcrn.dat_dcrn */ *ptr++ = 0; /* erase '.', create zero-end string */ adr_dcrn = (unsigned short) simple_strtoul (buf, NULL, 16); dat_dcrn = (unsigned short) simple_strtoul (ptr, NULL, 16); } else { /* * First parameter has format adr_dcrn; dat_dcrn will be * calculated as adr_dcrn+1. */ |
2b2a40beb
|
175 176 177 |
adr_dcrn = (unsigned short) simple_strtoul (buf, NULL, 16); dat_dcrn = adr_dcrn+1; } |
af9e1f5b9
|
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 |
/* Register's offset */ offset = (unsigned short) simple_strtoul (argv[2], NULL, 16); /* New value */ value = (unsigned long) simple_strtoul (argv[3], NULL, 16); /* Disable interrupts */ disable_interrupts (); /* Set offset */ set_dcr (adr_dcrn, offset); /* set data */ set_dcr (dat_dcrn, value); /* Enable interrupts */ enable_interrupts (); printf ("%04x.%04x-%04x Write %08lx ", adr_dcrn, dat_dcrn, offset, value); return 0; } |
8bde7f776
|
198 |
/***************************************************/ |
0d4983930
|
199 200 |
U_BOOT_CMD( getdcr, 2, 1, do_getdcr, |
2fb2604d5
|
201 |
"Get an AMCC PPC 4xx DCR's value", |
a89c33db9
|
202 |
"dcrn - return a DCR's value." |
8bde7f776
|
203 |
); |
0d4983930
|
204 205 |
U_BOOT_CMD( setdcr, 2, 1, do_setdcr, |
2fb2604d5
|
206 |
"Set an AMCC PPC 4xx DCR's value", |
a89c33db9
|
207 |
"dcrn - set a DCR's value." |
8bde7f776
|
208 |
); |
af9e1f5b9
|
209 210 |
U_BOOT_CMD( getidcr, 3, 1, do_getidcr, |
2fb2604d5
|
211 |
"Get a register value via indirect DCR addressing", |
a89c33db9
|
212 |
"adr_dcrn[.dat_dcrn] offset - write offset to adr_dcrn, read value from dat_dcrn." |
af9e1f5b9
|
213 214 215 216 |
); U_BOOT_CMD( setidcr, 4, 1, do_setidcr, |
2fb2604d5
|
217 |
"Set a register value via indirect DCR addressing", |
a89c33db9
|
218 |
"adr_dcrn[.dat_dcrn] offset value - write offset to adr_dcrn, write value to dat_dcrn." |
af9e1f5b9
|
219 |
); |