]>
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 | * | |
1a459660 | 8 | * SPDX-License-Identifier: GPL-2.0+ |
1cb8e980 WD |
9 | */ |
10 | ||
11 | #include <common.h> | |
12 | #include <command.h> | |
88685b5f | 13 | #include <net.h> |
1cb8e980 WD |
14 | #include "vcma9.h" |
15 | #include "../common/common_util.h" | |
16 | ||
b1c0eaac | 17 | #if defined(CONFIG_CS8900) |
2439e4bf | 18 | #include <../drivers/net/cs8900.h> |
1cb8e980 WD |
19 | |
20 | static uchar cs8900_chksum(ushort data) | |
21 | { | |
22 | return((data >> 8) & 0x00FF) + (data & 0x00FF); | |
23 | } | |
24 | ||
25 | #endif | |
26 | ||
1218abf1 WD |
27 | DECLARE_GLOBAL_DATA_PTR; |
28 | ||
1cb8e980 WD |
29 | /* ------------------------------------------------------------------------- */ |
30 | ||
54841ab5 | 31 | int do_vcma9(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
1cb8e980 | 32 | { |
b1c0eaac BW |
33 | struct eth_device *dev; |
34 | char cs8900_name[10]; | |
1cb8e980 WD |
35 | if (strcmp(argv[1], "info") == 0) |
36 | { | |
f3108304 | 37 | vcma9_print_info(); |
53677ef1 WD |
38 | return 0; |
39 | } | |
b1c0eaac | 40 | #if defined(CONFIG_CS8900) |
a2663ea4 | 41 | if (strcmp(argv[1], "cs8900") == 0) { |
b1c0eaac BW |
42 | sprintf(cs8900_name, "%s-0", CS8900_DRIVERNAME); |
43 | dev = eth_get_dev_by_name(cs8900_name); | |
44 | if (!dev) { | |
45 | printf("Couldn't find CS8900 driver"); | |
46 | return 0; | |
47 | } | |
1cb8e980 WD |
48 | if (strcmp(argv[2], "read") == 0) { |
49 | uchar addr; ushort data; | |
50 | ||
51 | addr = simple_strtoul(argv[3], NULL, 16); | |
b1c0eaac | 52 | cs8900_e2prom_read(dev, addr, &data); |
1cb8e980 WD |
53 | printf("0x%2.2X: 0x%4.4X\n", addr, data); |
54 | } else if (strcmp(argv[2], "write") == 0) { | |
55 | uchar addr; ushort data; | |
56 | ||
57 | addr = simple_strtoul(argv[3], NULL, 16); | |
58 | data = simple_strtoul(argv[4], NULL, 16); | |
b1c0eaac | 59 | cs8900_e2prom_write(dev, addr, data); |
1cb8e980 WD |
60 | } else if (strcmp(argv[2], "setaddr") == 0) { |
61 | uchar addr, i, csum; ushort data; | |
b6b4625d | 62 | uchar ethaddr[6]; |
1cb8e980 WD |
63 | |
64 | /* check for valid ethaddr */ | |
b6b4625d | 65 | if (eth_getenv_enetaddr("ethaddr", ethaddr)) { |
1cb8e980 WD |
66 | addr = 1; |
67 | data = 0x2158; | |
b1c0eaac | 68 | cs8900_e2prom_write(dev, addr, data); |
1cb8e980 WD |
69 | csum = cs8900_chksum(data); |
70 | addr++; | |
71 | for (i = 0; i < 6; i+=2) { | |
88685b5f WD |
72 | data = ethaddr[i+1] << 8 | |
73 | ethaddr[i]; | |
b1c0eaac | 74 | cs8900_e2prom_write(dev, addr, data); |
1cb8e980 WD |
75 | csum += cs8900_chksum(data); |
76 | addr++; | |
77 | } | |
78 | /* calculate header link byte */ | |
79 | data = 0xA100 | (addr * 2); | |
b1c0eaac | 80 | cs8900_e2prom_write(dev, 0, data); |
1cb8e980 WD |
81 | csum += cs8900_chksum(data); |
82 | /* write checksum word */ | |
b1c0eaac | 83 | cs8900_e2prom_write(dev, addr, (0 - csum) << 8); |
1cb8e980 | 84 | } else { |
a2663ea4 | 85 | puts("\nplease defined 'ethaddr'\n"); |
1cb8e980 WD |
86 | } |
87 | } else if (strcmp(argv[2], "dump") == 0) { | |
06d01dbe | 88 | uchar addr = 0, endaddr, csum; ushort data; |
1cb8e980 | 89 | |
a2663ea4 | 90 | puts("Dump of CS8900 config device: "); |
b1c0eaac | 91 | cs8900_e2prom_read(dev, addr, &data); |
1cb8e980 WD |
92 | if ((data & 0xE000) == 0xA000) { |
93 | endaddr = (data & 0x00FF) / 2; | |
94 | csum = cs8900_chksum(data); | |
95 | for (addr = 1; addr <= endaddr; addr++) { | |
b1c0eaac | 96 | cs8900_e2prom_read(dev, addr, &data); |
1cb8e980 WD |
97 | printf("\n0x%2.2X: 0x%4.4X", addr, data); |
98 | csum += cs8900_chksum(data); | |
99 | } | |
100 | printf("\nChecksum: %s", (csum == 0) ? "ok" : "wrong"); | |
101 | } else { | |
a2663ea4 | 102 | puts("no valid config found"); |
1cb8e980 | 103 | } |
a2663ea4 | 104 | puts("\n"); |
1cb8e980 WD |
105 | } |
106 | ||
107 | return 0; | |
108 | } | |
109 | #endif | |
1cb8e980 WD |
110 | |
111 | return (do_mplcommon(cmdtp, flag, argc, argv)); | |
112 | } | |
531716e1 WD |
113 | |
114 | U_BOOT_CMD( | |
115 | vcma9, 6, 1, do_vcma9, | |
2fb2604d | 116 | "VCMA9 specific commands", |
f3108304 DMEA |
117 | "flash mem [SrcAddr] - updates U-Boot with image in memory\n" |
118 | "vcma9 info - displays board information" | |
531716e1 | 119 | ); |