]>
Commit | Line | Data |
---|---|---|
1cb8e980 WD |
1 | /* |
2 | * (C) Copyright 2002 | |
3 | * Denis Peter, MPL AG Switzerland, d.peter@mpl.ch | |
4 | * | |
5 | * adapted for VCMA9 | |
6 | * David Mueller, ELSOFT AG, d.mueller@elsoft.ch | |
7 | * | |
8 | * See file CREDITS for list of people who contributed to this | |
9 | * project. | |
10 | * | |
11 | * This program is free software; you can redistribute it and/or | |
12 | * modify it under the terms of the GNU General Public License as | |
13 | * published by the Free Software Foundation; either version 2 of | |
14 | * the License, or (at your option) any later version. | |
15 | * | |
16 | * This program is distributed in the hope that it will be useful, | |
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 | * GNU General Public License for more details. | |
20 | * | |
21 | * You should have received a copy of the GNU General Public License | |
22 | * along with this program; if not, write to the Free Software | |
23 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | |
24 | * MA 02111-1307 USA | |
25 | * | |
26 | */ | |
27 | ||
28 | #include <common.h> | |
29 | #include <command.h> | |
88685b5f | 30 | #include <net.h> |
1cb8e980 WD |
31 | #include "vcma9.h" |
32 | #include "../common/common_util.h" | |
33 | ||
b1c0eaac | 34 | #if defined(CONFIG_CS8900) |
2439e4bf | 35 | #include <../drivers/net/cs8900.h> |
1cb8e980 WD |
36 | |
37 | static uchar cs8900_chksum(ushort data) | |
38 | { | |
39 | return((data >> 8) & 0x00FF) + (data & 0x00FF); | |
40 | } | |
41 | ||
42 | #endif | |
43 | ||
1218abf1 WD |
44 | DECLARE_GLOBAL_DATA_PTR; |
45 | ||
1cb8e980 | 46 | extern void print_vcma9_info(void); |
531716e1 | 47 | extern int vcma9_cantest(int); |
1cb8e980 | 48 | extern int vcma9_nandtest(void); |
531716e1 WD |
49 | extern int vcma9_nanderase(void); |
50 | extern int vcma9_nandread(ulong); | |
51 | extern int vcma9_nandwrite(ulong); | |
52 | extern int vcma9_dactest(int); | |
54841ab5 | 53 | extern int do_mplcommon(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]); |
1cb8e980 WD |
54 | |
55 | /* ------------------------------------------------------------------------- */ | |
56 | ||
54841ab5 | 57 | int do_vcma9(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
1cb8e980 | 58 | { |
b1c0eaac BW |
59 | struct eth_device *dev; |
60 | char cs8900_name[10]; | |
1cb8e980 WD |
61 | if (strcmp(argv[1], "info") == 0) |
62 | { | |
63 | print_vcma9_info(); | |
53677ef1 WD |
64 | return 0; |
65 | } | |
b1c0eaac | 66 | #if defined(CONFIG_CS8900) |
a2663ea4 | 67 | if (strcmp(argv[1], "cs8900") == 0) { |
b1c0eaac BW |
68 | sprintf(cs8900_name, "%s-0", CS8900_DRIVERNAME); |
69 | dev = eth_get_dev_by_name(cs8900_name); | |
70 | if (!dev) { | |
71 | printf("Couldn't find CS8900 driver"); | |
72 | return 0; | |
73 | } | |
1cb8e980 WD |
74 | if (strcmp(argv[2], "read") == 0) { |
75 | uchar addr; ushort data; | |
76 | ||
77 | addr = simple_strtoul(argv[3], NULL, 16); | |
b1c0eaac | 78 | cs8900_e2prom_read(dev, addr, &data); |
1cb8e980 WD |
79 | printf("0x%2.2X: 0x%4.4X\n", addr, data); |
80 | } else if (strcmp(argv[2], "write") == 0) { | |
81 | uchar addr; ushort data; | |
82 | ||
83 | addr = simple_strtoul(argv[3], NULL, 16); | |
84 | data = simple_strtoul(argv[4], NULL, 16); | |
b1c0eaac | 85 | cs8900_e2prom_write(dev, addr, data); |
1cb8e980 WD |
86 | } else if (strcmp(argv[2], "setaddr") == 0) { |
87 | uchar addr, i, csum; ushort data; | |
b6b4625d | 88 | uchar ethaddr[6]; |
1cb8e980 WD |
89 | |
90 | /* check for valid ethaddr */ | |
b6b4625d | 91 | if (eth_getenv_enetaddr("ethaddr", ethaddr)) { |
1cb8e980 WD |
92 | addr = 1; |
93 | data = 0x2158; | |
b1c0eaac | 94 | cs8900_e2prom_write(dev, addr, data); |
1cb8e980 WD |
95 | csum = cs8900_chksum(data); |
96 | addr++; | |
97 | for (i = 0; i < 6; i+=2) { | |
88685b5f WD |
98 | data = ethaddr[i+1] << 8 | |
99 | ethaddr[i]; | |
b1c0eaac | 100 | cs8900_e2prom_write(dev, addr, data); |
1cb8e980 WD |
101 | csum += cs8900_chksum(data); |
102 | addr++; | |
103 | } | |
104 | /* calculate header link byte */ | |
105 | data = 0xA100 | (addr * 2); | |
b1c0eaac | 106 | cs8900_e2prom_write(dev, 0, data); |
1cb8e980 WD |
107 | csum += cs8900_chksum(data); |
108 | /* write checksum word */ | |
b1c0eaac | 109 | cs8900_e2prom_write(dev, addr, (0 - csum) << 8); |
1cb8e980 | 110 | } else { |
a2663ea4 | 111 | puts("\nplease defined 'ethaddr'\n"); |
1cb8e980 WD |
112 | } |
113 | } else if (strcmp(argv[2], "dump") == 0) { | |
06d01dbe | 114 | uchar addr = 0, endaddr, csum; ushort data; |
1cb8e980 | 115 | |
a2663ea4 | 116 | puts("Dump of CS8900 config device: "); |
b1c0eaac | 117 | cs8900_e2prom_read(dev, addr, &data); |
1cb8e980 WD |
118 | if ((data & 0xE000) == 0xA000) { |
119 | endaddr = (data & 0x00FF) / 2; | |
120 | csum = cs8900_chksum(data); | |
121 | for (addr = 1; addr <= endaddr; addr++) { | |
b1c0eaac | 122 | cs8900_e2prom_read(dev, addr, &data); |
1cb8e980 WD |
123 | printf("\n0x%2.2X: 0x%4.4X", addr, data); |
124 | csum += cs8900_chksum(data); | |
125 | } | |
126 | printf("\nChecksum: %s", (csum == 0) ? "ok" : "wrong"); | |
127 | } else { | |
a2663ea4 | 128 | puts("no valid config found"); |
1cb8e980 | 129 | } |
a2663ea4 | 130 | puts("\n"); |
1cb8e980 WD |
131 | } |
132 | ||
133 | return 0; | |
134 | } | |
135 | #endif | |
136 | #if 0 | |
137 | if (strcmp(argv[1], "cantest") == 0) { | |
531716e1 WD |
138 | if (argc >= 3) |
139 | vcma9_cantest(strcmp(argv[2], "s") ? 0 : 1); | |
140 | else | |
141 | vcma9_cantest(0); | |
1cb8e980 WD |
142 | return 0; |
143 | } | |
144 | if (strcmp(argv[1], "nandtest") == 0) { | |
145 | vcma9_nandtest(); | |
146 | return 0; | |
147 | } | |
531716e1 WD |
148 | if (strcmp(argv[1], "nanderase") == 0) { |
149 | vcma9_nanderase(); | |
150 | return 0; | |
151 | } | |
152 | if (strcmp(argv[1], "nandread") == 0) { | |
153 | ulong offset = 0; | |
154 | ||
155 | if (argc >= 3) | |
156 | offset = simple_strtoul(argv[2], NULL, 16); | |
157 | ||
158 | vcma9_nandread(offset); | |
159 | return 0; | |
160 | } | |
161 | if (strcmp(argv[1], "nandwrite") == 0) { | |
162 | ulong offset = 0; | |
163 | ||
164 | if (argc >= 3) | |
165 | offset = simple_strtoul(argv[2], NULL, 16); | |
166 | ||
167 | vcma9_nandwrite(offset); | |
168 | return 0; | |
169 | } | |
1cb8e980 | 170 | if (strcmp(argv[1], "dactest") == 0) { |
531716e1 WD |
171 | if (argc >= 3) |
172 | vcma9_dactest(strcmp(argv[2], "s") ? 0 : 1); | |
173 | else | |
174 | vcma9_dactest(0); | |
1cb8e980 WD |
175 | return 0; |
176 | } | |
177 | #endif | |
178 | ||
179 | return (do_mplcommon(cmdtp, flag, argc, argv)); | |
180 | } | |
531716e1 WD |
181 | |
182 | U_BOOT_CMD( | |
183 | vcma9, 6, 1, do_vcma9, | |
2fb2604d | 184 | "VCMA9 specific commands", |
a89c33db | 185 | "flash mem [SrcAddr]\n - updates U-Boot with image in memory" |
531716e1 | 186 | ); |