Blame view
cmd/pcmcia.c
7.06 KB
83d290c56 SPDX: Convert all... |
1 |
// SPDX-License-Identifier: GPL-2.0+ |
c609719b8 Initial revision |
2 |
/* |
8cba090c5 Add support for V... |
3 |
* (C) Copyright 2000-2006 |
c609719b8 Initial revision |
4 5 |
* Wolfgang Denk, DENX Software Engineering, wd@denx.de. * |
c609719b8 Initial revision |
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
******************************************************************** * * Lots of code copied from: * * m8xx_pcmcia.c - Linux PCMCIA socket driver for the mpc8xx series. * (C) 1999-2000 Magnus Damm <damm@bitsmart.com> * * "The ExCA standard specifies that socket controllers should provide * two IO and five memory windows per socket, which can be independently * configured and positioned in the host address space and mapped to * arbitrary segments of card address space. " - David A Hinds. 1999 * * This controller does _not_ meet the ExCA standard. * * m8xx pcmcia controller brief info: * + 8 windows (attrib, mem, i/o) * + up to two slots (SLOT_A and SLOT_B) * + inputpins, outputpins, event and mask registers. * - no offset register. sigh. * * Because of the lacking offset register we must map the whole card. * We assign each memory window PCMCIA_MEM_WIN_SIZE address space. * Make sure there is (PCMCIA_MEM_WIN_SIZE * PCMCIA_MEM_WIN_NO * * PCMCIA_SOCKETS_NO) bytes at PCMCIA_MEM_WIN_BASE. * The i/o windows are dynamically allocated at PCMCIA_IO_WIN_BASE. * They are maximum 64KByte each... */ /* #define DEBUG 1 */ /* * PCMCIA support */ #include <common.h> #include <command.h> #include <config.h> #include <pcmcia.h> |
e2ffd59b4 * Code cleanup, m... |
43 |
#include <asm/io.h> |
1f53a4160 Add LED indicatio... |
44 |
/* -------------------------------------------------------------------- */ |
c609719b8 Initial revision |
45 |
|
fd9bcaa35 common/cmd_[p-x]*... |
46 |
#if defined(CONFIG_CMD_PCMCIA) |
db01a2ea9 * Patch by Stephe... |
47 |
|
9d4079955 Major PCMCIA Clea... |
48 49 |
extern int pcmcia_on (void); extern int pcmcia_off (void); |
c609719b8 Initial revision |
50 |
|
54841ab50 Make sure that ar... |
51 |
int do_pinit (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
c609719b8 Initial revision |
52 53 54 55 56 57 58 59 60 |
{ int rcode = 0; if (argc != 2) { printf ("Usage: pinit {on | off} "); return 1; } if (strcmp(argv[1],"on") == 0) { |
9d4079955 Major PCMCIA Clea... |
61 |
rcode = pcmcia_on (); |
c609719b8 Initial revision |
62 63 64 65 66 67 68 69 70 71 |
} else if (strcmp(argv[1],"off") == 0) { rcode = pcmcia_off (); } else { printf ("Usage: pinit {on | off} "); return 1; } return rcode; } |
66fd3d1ce Add support for C... |
72 |
|
9d4079955 Major PCMCIA Clea... |
73 |
U_BOOT_CMD( |
9912121f7 Change 'repeatabl... |
74 |
pinit, 2, 0, do_pinit, |
2fb2604d5 Command usage cle... |
75 |
"PCMCIA sub-system", |
9d4079955 Major PCMCIA Clea... |
76 77 |
"on - power on PCMCIA socket " |
a89c33db9 General help mess... |
78 79 |
"pinit off - power off PCMCIA socket" ); |
66fd3d1ce Add support for C... |
80 |
|
fd9bcaa35 common/cmd_[p-x]*... |
81 |
#endif |
66fd3d1ce Add support for C... |
82 |
|
9d4079955 Major PCMCIA Clea... |
83 |
/* -------------------------------------------------------------------- */ |
66fd3d1ce Add support for C... |
84 |
|
9d4079955 Major PCMCIA Clea... |
85 |
#undef CHECK_IDE_DEVICE |
db01a2ea9 * Patch by Stephe... |
86 |
|
9d4079955 Major PCMCIA Clea... |
87 88 |
#if defined(CONFIG_PXA_PCMCIA) #define CHECK_IDE_DEVICE |
c609719b8 Initial revision |
89 |
#endif |
9d4079955 Major PCMCIA Clea... |
90 |
#ifdef CHECK_IDE_DEVICE |
c609719b8 Initial revision |
91 |
|
9d4079955 Major PCMCIA Clea... |
92 93 94 95 96 |
int ide_devices_found; static uchar *known_cards[] = { (uchar *)"ARGOSY PnPIDE D5", NULL }; |
c609719b8 Initial revision |
97 |
|
9d4079955 Major PCMCIA Clea... |
98 99 |
#define MAX_TUPEL_SZ 512 #define MAX_FEATURES 4 |
c609719b8 Initial revision |
100 |
|
9d4079955 Major PCMCIA Clea... |
101 102 |
#define MAX_IDENT_CHARS 64 #define MAX_IDENT_FIELDS 4 |
c609719b8 Initial revision |
103 |
|
9d4079955 Major PCMCIA Clea... |
104 |
#define indent "\t " |
c609719b8 Initial revision |
105 |
|
9d4079955 Major PCMCIA Clea... |
106 107 108 109 110 111 |
static void print_funcid (int func) { puts (indent); switch (func) { case CISTPL_FUNCID_MULTI: puts (" Multi-Function"); |
a6cccaea5 * Patch by Wolter... |
112 |
break; |
9d4079955 Major PCMCIA Clea... |
113 114 |
case CISTPL_FUNCID_MEMORY: puts (" Memory"); |
c609719b8 Initial revision |
115 |
break; |
9d4079955 Major PCMCIA Clea... |
116 117 |
case CISTPL_FUNCID_SERIAL: puts (" Serial Port"); |
c609719b8 Initial revision |
118 |
break; |
9d4079955 Major PCMCIA Clea... |
119 120 |
case CISTPL_FUNCID_PARALLEL: puts (" Parallel Port"); |
c609719b8 Initial revision |
121 |
break; |
9d4079955 Major PCMCIA Clea... |
122 123 |
case CISTPL_FUNCID_FIXED: puts (" Fixed Disk"); |
7cb22f97e * Make CPU clock ... |
124 |
break; |
9d4079955 Major PCMCIA Clea... |
125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
case CISTPL_FUNCID_VIDEO: puts (" Video Adapter"); break; case CISTPL_FUNCID_NETWORK: puts (" Network Adapter"); break; case CISTPL_FUNCID_AIMS: puts (" AIMS Card"); break; case CISTPL_FUNCID_SCSI: puts (" SCSI Adapter"); break; default: puts (" Unknown"); |
c609719b8 Initial revision |
139 |
break; |
ea909b760 * Added support f... |
140 |
} |
9d4079955 Major PCMCIA Clea... |
141 142 |
puts (" Card "); |
db01a2ea9 * Patch by Stephe... |
143 |
} |
9d4079955 Major PCMCIA Clea... |
144 |
static void print_fixed (volatile uchar *p) |
db01a2ea9 * Patch by Stephe... |
145 |
{ |
9d4079955 Major PCMCIA Clea... |
146 147 |
if (p == NULL) return; |
db01a2ea9 * Patch by Stephe... |
148 |
|
9d4079955 Major PCMCIA Clea... |
149 |
puts(indent); |
db01a2ea9 * Patch by Stephe... |
150 |
|
9d4079955 Major PCMCIA Clea... |
151 152 153 |
switch (*p) { case CISTPL_FUNCE_IDE_IFACE: { uchar iface = *(p+2); |
db01a2ea9 * Patch by Stephe... |
154 |
|
9d4079955 Major PCMCIA Clea... |
155 156 157 158 159 160 161 162 |
puts ((iface == CISTPL_IDE_INTERFACE) ? " IDE" : " unknown"); puts (" interface "); break; } case CISTPL_FUNCE_IDE_MASTER: case CISTPL_FUNCE_IDE_SLAVE: { uchar f1 = *(p+2); uchar f2 = *(p+4); |
db01a2ea9 * Patch by Stephe... |
163 |
|
9d4079955 Major PCMCIA Clea... |
164 |
puts ((f1 & CISTPL_IDE_SILICON) ? " [silicon]" : " [rotating]"); |
db01a2ea9 * Patch by Stephe... |
165 |
|
9d4079955 Major PCMCIA Clea... |
166 167 |
if (f1 & CISTPL_IDE_UNIQUE) puts (" [unique]"); |
db01a2ea9 * Patch by Stephe... |
168 |
|
9d4079955 Major PCMCIA Clea... |
169 |
puts ((f1 & CISTPL_IDE_DUAL) ? " [dual]" : " [single]"); |
db01a2ea9 * Patch by Stephe... |
170 |
|
9d4079955 Major PCMCIA Clea... |
171 172 |
if (f2 & CISTPL_IDE_HAS_SLEEP) puts (" [sleep]"); |
db01a2ea9 * Patch by Stephe... |
173 |
|
9d4079955 Major PCMCIA Clea... |
174 175 |
if (f2 & CISTPL_IDE_HAS_STANDBY) puts (" [standby]"); |
db01a2ea9 * Patch by Stephe... |
176 |
|
9d4079955 Major PCMCIA Clea... |
177 178 |
if (f2 & CISTPL_IDE_HAS_IDLE) puts (" [idle]"); |
db01a2ea9 * Patch by Stephe... |
179 |
|
9d4079955 Major PCMCIA Clea... |
180 181 |
if (f2 & CISTPL_IDE_LOW_POWER) puts (" [low power]"); |
c609719b8 Initial revision |
182 |
|
9d4079955 Major PCMCIA Clea... |
183 184 |
if (f2 & CISTPL_IDE_REG_INHIBIT) puts (" [reg inhibit]"); |
c609719b8 Initial revision |
185 |
|
9d4079955 Major PCMCIA Clea... |
186 187 |
if (f2 & CISTPL_IDE_HAS_INDEX) puts (" [index]"); |
66fd3d1ce Add support for C... |
188 |
|
9d4079955 Major PCMCIA Clea... |
189 190 |
if (f2 & CISTPL_IDE_IOIS16) puts (" [IOis16]"); |
66fd3d1ce Add support for C... |
191 |
|
9d4079955 Major PCMCIA Clea... |
192 193 194 195 196 |
break; } } putc (' '); |
66fd3d1ce Add support for C... |
197 |
} |
db01a2ea9 * Patch by Stephe... |
198 |
|
9d4079955 Major PCMCIA Clea... |
199 |
static int identify (volatile uchar *p) |
c609719b8 Initial revision |
200 |
{ |
9d4079955 Major PCMCIA Clea... |
201 202 203 204 205 |
uchar id_str[MAX_IDENT_CHARS]; uchar data; uchar *t; uchar **card; int i, done; |
c609719b8 Initial revision |
206 |
|
9d4079955 Major PCMCIA Clea... |
207 208 |
if (p == NULL) return (0); /* Don't know */ |
c609719b8 Initial revision |
209 |
|
9d4079955 Major PCMCIA Clea... |
210 211 |
t = id_str; done =0; |
c609719b8 Initial revision |
212 |
|
9d4079955 Major PCMCIA Clea... |
213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 |
for (i=0; i<=4 && !done; ++i, p+=2) { while ((data = *p) != '\0') { if (data == 0xFF) { done = 1; break; } *t++ = data; if (t == &id_str[MAX_IDENT_CHARS-1]) { done = 1; break; } p += 2; } if (!done) *t++ = ' '; |
c609719b8 Initial revision |
228 |
} |
9d4079955 Major PCMCIA Clea... |
229 230 231 232 233 234 235 236 237 238 |
*t = '\0'; while (--t > id_str) { if (*t == ' ') *t = '\0'; else break; } puts ((char *)id_str); putc (' '); |
c609719b8 Initial revision |
239 |
|
9d4079955 Major PCMCIA Clea... |
240 241 242 243 244 245 246 247 248 |
for (card=known_cards; *card; ++card) { debug ("## Compare against \"%s\" ", *card); if (strcmp((char *)*card, (char *)id_str) == 0) { /* found! */ debug ("## CARD FOUND ## "); return (1); } } |
c609719b8 Initial revision |
249 |
|
9d4079955 Major PCMCIA Clea... |
250 |
return (0); /* don't know */ |
db01a2ea9 * Patch by Stephe... |
251 |
} |
c609719b8 Initial revision |
252 |
|
9d4079955 Major PCMCIA Clea... |
253 |
int check_ide_device (int slot) |
c609719b8 Initial revision |
254 255 256 |
{ volatile uchar *ident = NULL; volatile uchar *feature_p[MAX_FEATURES]; |
ea909b760 * Added support f... |
257 |
volatile uchar *p, *start, *addr; |
c609719b8 Initial revision |
258 259 260 261 262 263 |
int n_features = 0; uchar func_id = ~0; uchar code, len; ushort config_base = 0; int found = 0; int i; |
6d0f6bcf3 rename CFG_ macro... |
264 265 |
addr = (volatile uchar *)(CONFIG_SYS_PCMCIA_MEM_ADDR + CONFIG_SYS_PCMCIA_MEM_SIZE * (slot * 4)); |
d0fb80c30 * Restrict baudra... |
266 267 |
debug ("PCMCIA MEM: %08lX ", (ulong)addr); |
c609719b8 Initial revision |
268 |
|
ea909b760 * Added support f... |
269 |
start = p = (volatile uchar *) addr; |
c609719b8 Initial revision |
270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 |
while ((p - start) < MAX_TUPEL_SZ) { code = *p; p += 2; if (code == 0xFF) { /* End of chain */ break; } len = *p; p += 2; #if defined(DEBUG) && (DEBUG > 1) { volatile uchar *q = p; printf (" Tuple code %02x length %d \tData:", code, len); for (i = 0; i < len; ++i) { printf (" %02x", *q); q+= 2; } } #endif /* DEBUG */ switch (code) { case CISTPL_VERS_1: ident = p + 4; break; case CISTPL_FUNCID: /* Fix for broken SanDisk which may have 0x80 bit set */ func_id = *p & 0x7F; break; case CISTPL_FUNCE: if (n_features < MAX_FEATURES) feature_p[n_features++] = p; break; case CISTPL_CONFIG: config_base = (*(p+6) << 8) + (*(p+4)); debug (" ## Config_base = %04x ### ", config_base); default: break; } p += 2 * len; } found = identify (ident); if (func_id != ((uchar)~0)) { print_funcid (func_id); if (func_id == CISTPL_FUNCID_FIXED) found = 1; else return (1); /* no disk drive */ } for (i=0; i<n_features; ++i) { print_fixed (feature_p[i]); } if (!found) { printf ("unknown card type "); return (1); } |
6069ff265 * Add support for... |
336 |
ide_devices_found |= (1 << slot); |
c609719b8 Initial revision |
337 |
/* set I/O area in config reg -> only valid for ARGOSY D5!!! */ |
ea909b760 * Added support f... |
338 |
*((uchar *)(addr + config_base)) = 1; |
e2ffd59b4 * Code cleanup, m... |
339 340 341 342 343 344 345 346 347 348 349 350 351 |
#if 0 printf(" ## Config_base = %04x ### ", config_base); printf("Configuration Option Register: %02x @ %x ", readb(addr + config_base), addr + config_base); printf("Card Configuration and Status Register: %02x ", readb(addr + config_base + 2)); printf("Pin Replacement Register Register: %02x ", readb(addr + config_base + 4)); printf("Socket and Copy Register: %02x ", readb(addr + config_base + 6)); #endif |
c609719b8 Initial revision |
352 353 |
return (0); } |
c609719b8 Initial revision |
354 |
|
9d4079955 Major PCMCIA Clea... |
355 |
#endif /* CHECK_IDE_DEVICE */ |