Blame view

common/cmd_dcr.c 6.01 KB
3863585bb   wdenk   Initial revision
1
2
3
4
  /*
   * (C) Copyright 2001
   * Erik Theisen,  Wave 7 Optics, etheisen@mindspring.com.
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
5
   * SPDX-License-Identifier:	GPL-2.0+
3863585bb   wdenk   Initial revision
6
7
8
   */
  
  /*
0c8721a46   Wolfgang Denk   Cleanup (PPC4xx i...
9
   * AMCC 4XX DCR Functions
3863585bb   wdenk   Initial revision
10
11
12
13
14
   */
  
  #include <common.h>
  #include <config.h>
  #include <command.h>
3863585bb   wdenk   Initial revision
15

af9e1f5b9   Stefan Roese   Add monitor funct...
16
17
  unsigned long get_dcr (unsigned short);
  unsigned long set_dcr (unsigned short, unsigned long);
0c8721a46   Wolfgang Denk   Cleanup (PPC4xx i...
18
19
20
  /* =======================================================================
   * Interpreter command to retrieve an AMCC PPC 4xx Device Control Register
   * =======================================================================
3863585bb   wdenk   Initial revision
21
   */
54841ab50   Wolfgang Denk   Make sure that ar...
22
  int do_getdcr ( cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[] )
3863585bb   wdenk   Initial revision
23
  {
0c8721a46   Wolfgang Denk   Cleanup (PPC4xx i...
24
25
  	unsigned short dcrn;	/* Device Control Register Num */
  	unsigned long value;	/* DCR's value */
3863585bb   wdenk   Initial revision
26

0c8721a46   Wolfgang Denk   Cleanup (PPC4xx i...
27
  	unsigned long get_dcr (unsigned short);
8bde7f776   wdenk   * Code cleanup:
28

0c8721a46   Wolfgang Denk   Cleanup (PPC4xx i...
29
  	/* Validate arguments */
47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
30
  	if (argc < 2)
4c12eeb8b   Simon Glass   Convert cmd_usage...
31
  		return CMD_RET_USAGE;
3863585bb   wdenk   Initial revision
32

0c8721a46   Wolfgang Denk   Cleanup (PPC4xx i...
33
34
35
  	/* Get a DCR */
  	dcrn = (unsigned short) simple_strtoul (argv[1], NULL, 16);
  	value = get_dcr (dcrn);
3863585bb   wdenk   Initial revision
36

0c8721a46   Wolfgang Denk   Cleanup (PPC4xx i...
37
38
  	printf ("%04x: %08lx
  ", dcrn, value);
3863585bb   wdenk   Initial revision
39

0c8721a46   Wolfgang Denk   Cleanup (PPC4xx i...
40
41
  	return 0;
  }
3863585bb   wdenk   Initial revision
42
43
44
  
  
  /* ======================================================================
0c8721a46   Wolfgang Denk   Cleanup (PPC4xx i...
45
   * Interpreter command to set an AMCC PPC 4xx Device Control Register
3863585bb   wdenk   Initial revision
46
47
   * ======================================================================
  */
54841ab50   Wolfgang Denk   Make sure that ar...
48
  int do_setdcr (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
3863585bb   wdenk   Initial revision
49
  {
0c8721a46   Wolfgang Denk   Cleanup (PPC4xx i...
50
51
52
53
54
  	unsigned short dcrn;	/* Device Control Register Num */
  	unsigned long value;
  
  	/* DCR's value */
  	int nbytes;
0c8721a46   Wolfgang Denk   Cleanup (PPC4xx i...
55
56
  
  	/* Validate arguments */
47e26b1bf   Wolfgang Denk   cmd_usage(): simp...
57
  	if (argc < 2)
4c12eeb8b   Simon Glass   Convert cmd_usage...
58
  		return CMD_RET_USAGE;
3863585bb   wdenk   Initial revision
59

0c8721a46   Wolfgang Denk   Cleanup (PPC4xx i...
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   wdenk   Initial revision
86

af9e1f5b9   Stefan Roese   Add monitor funct...
87
88
89
90
91
  /* =======================================================================
   * Interpreter command to retrieve an register value through AMCC PPC 4xx
   * Device Control Register inderect addressing.
   * =======================================================================
   */
54841ab50   Wolfgang Denk   Make sure that ar...
92
  int do_getidcr (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
af9e1f5b9   Stefan Roese   Add monitor funct...
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   Wolfgang Denk   cmd_usage(): simp...
102
  	if (argc < 3)
4c12eeb8b   Simon Glass   Convert cmd_usage...
103
  		return CMD_RET_USAGE;
af9e1f5b9   Stefan Roese   Add monitor funct...
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   Wolfgang Denk   Make sure that ar...
147
  int do_setidcr (cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
af9e1f5b9   Stefan Roese   Add monitor funct...
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   Wolfgang Denk   cmd_usage(): simp...
157
  	if (argc < 4)
4c12eeb8b   Simon Glass   Convert cmd_usage...
158
  		return CMD_RET_USAGE;
af9e1f5b9   Stefan Roese   Add monitor funct...
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   Wolfgang Denk   Code cleanup.
175
176
177
  		adr_dcrn = (unsigned short) simple_strtoul (buf, NULL, 16);
  		dat_dcrn = adr_dcrn+1;
  	}
af9e1f5b9   Stefan Roese   Add monitor funct...
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   wdenk   * Code cleanup:
198
  /***************************************************/
0d4983930   wdenk   Patch by Kenneth ...
199
200
  U_BOOT_CMD(
  	getdcr,	2,	1,	do_getdcr,
2fb2604d5   Peter Tyser   Command usage cle...
201
  	"Get an AMCC PPC 4xx DCR's value",
a89c33db9   Wolfgang Denk   General help mess...
202
  	"dcrn - return a DCR's value."
8bde7f776   wdenk   * Code cleanup:
203
  );
0d4983930   wdenk   Patch by Kenneth ...
204
205
  U_BOOT_CMD(
  	setdcr,	2,	1,	do_setdcr,
2fb2604d5   Peter Tyser   Command usage cle...
206
  	"Set an AMCC PPC 4xx DCR's value",
a89c33db9   Wolfgang Denk   General help mess...
207
  	"dcrn - set a DCR's value."
8bde7f776   wdenk   * Code cleanup:
208
  );
af9e1f5b9   Stefan Roese   Add monitor funct...
209
210
  U_BOOT_CMD(
  	getidcr,	3,	1,	do_getidcr,
2fb2604d5   Peter Tyser   Command usage cle...
211
  	"Get a register value via indirect DCR addressing",
a89c33db9   Wolfgang Denk   General help mess...
212
  	"adr_dcrn[.dat_dcrn] offset - write offset to adr_dcrn, read value from dat_dcrn."
af9e1f5b9   Stefan Roese   Add monitor funct...
213
214
215
216
  );
  
  U_BOOT_CMD(
  	setidcr,	4,	1,	do_setidcr,
2fb2604d5   Peter Tyser   Command usage cle...
217
  	"Set a register value via indirect DCR addressing",
a89c33db9   Wolfgang Denk   General help mess...
218
  	"adr_dcrn[.dat_dcrn] offset value - write offset to adr_dcrn, write value to dat_dcrn."
af9e1f5b9   Stefan Roese   Add monitor funct...
219
  );