Blame view
cmd/pcmcia.c
7.07 KB
c609719b8 Initial revision |
1 |
/* |
8cba090c5 Add support for V... |
2 |
* (C) Copyright 2000-2006 |
c609719b8 Initial revision |
3 4 |
* Wolfgang Denk, DENX Software Engineering, wd@denx.de. * |
1a4596601 Add GPL-2.0+ SPDX... |
5 |
* SPDX-License-Identifier: GPL-2.0+ |
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 43 |
* ******************************************************************** * * 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... |
44 |
#include <asm/io.h> |
1f53a4160 Add LED indicatio... |
45 |
/* -------------------------------------------------------------------- */ |
c609719b8 Initial revision |
46 |
|
fd9bcaa35 common/cmd_[p-x]*... |
47 |
#if defined(CONFIG_CMD_PCMCIA) |
db01a2ea9 * Patch by Stephe... |
48 |
|
9d4079955 Major PCMCIA Clea... |
49 50 |
extern int pcmcia_on (void); extern int pcmcia_off (void); |
c609719b8 Initial revision |
51 |
|
54841ab50 Make sure that ar... |
52 |
int do_pinit (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) |
c609719b8 Initial revision |
53 54 55 56 57 58 59 60 61 |
{ int rcode = 0; if (argc != 2) { printf ("Usage: pinit {on | off} "); return 1; } if (strcmp(argv[1],"on") == 0) { |
9d4079955 Major PCMCIA Clea... |
62 |
rcode = pcmcia_on (); |
c609719b8 Initial revision |
63 64 65 66 67 68 69 70 71 72 |
} 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... |
73 |
|
9d4079955 Major PCMCIA Clea... |
74 |
U_BOOT_CMD( |
9912121f7 Change 'repeatabl... |
75 |
pinit, 2, 0, do_pinit, |
2fb2604d5 Command usage cle... |
76 |
"PCMCIA sub-system", |
9d4079955 Major PCMCIA Clea... |
77 78 |
"on - power on PCMCIA socket " |
a89c33db9 General help mess... |
79 80 |
"pinit off - power off PCMCIA socket" ); |
66fd3d1ce Add support for C... |
81 |
|
fd9bcaa35 common/cmd_[p-x]*... |
82 |
#endif |
66fd3d1ce Add support for C... |
83 |
|
9d4079955 Major PCMCIA Clea... |
84 |
/* -------------------------------------------------------------------- */ |
66fd3d1ce Add support for C... |
85 |
|
9d4079955 Major PCMCIA Clea... |
86 |
#undef CHECK_IDE_DEVICE |
db01a2ea9 * Patch by Stephe... |
87 |
|
9d4079955 Major PCMCIA Clea... |
88 89 |
#if defined(CONFIG_PXA_PCMCIA) #define CHECK_IDE_DEVICE |
c609719b8 Initial revision |
90 |
#endif |
9d4079955 Major PCMCIA Clea... |
91 |
#ifdef CHECK_IDE_DEVICE |
c609719b8 Initial revision |
92 |
|
9d4079955 Major PCMCIA Clea... |
93 94 95 96 97 |
int ide_devices_found; static uchar *known_cards[] = { (uchar *)"ARGOSY PnPIDE D5", NULL }; |
c609719b8 Initial revision |
98 |
|
9d4079955 Major PCMCIA Clea... |
99 100 |
#define MAX_TUPEL_SZ 512 #define MAX_FEATURES 4 |
c609719b8 Initial revision |
101 |
|
9d4079955 Major PCMCIA Clea... |
102 103 |
#define MAX_IDENT_CHARS 64 #define MAX_IDENT_FIELDS 4 |
c609719b8 Initial revision |
104 |
|
9d4079955 Major PCMCIA Clea... |
105 |
#define indent "\t " |
c609719b8 Initial revision |
106 |
|
9d4079955 Major PCMCIA Clea... |
107 108 109 110 111 112 |
static void print_funcid (int func) { puts (indent); switch (func) { case CISTPL_FUNCID_MULTI: puts (" Multi-Function"); |
a6cccaea5 * Patch by Wolter... |
113 |
break; |
9d4079955 Major PCMCIA Clea... |
114 115 |
case CISTPL_FUNCID_MEMORY: puts (" Memory"); |
c609719b8 Initial revision |
116 |
break; |
9d4079955 Major PCMCIA Clea... |
117 118 |
case CISTPL_FUNCID_SERIAL: puts (" Serial Port"); |
c609719b8 Initial revision |
119 |
break; |
9d4079955 Major PCMCIA Clea... |
120 121 |
case CISTPL_FUNCID_PARALLEL: puts (" Parallel Port"); |
c609719b8 Initial revision |
122 |
break; |
9d4079955 Major PCMCIA Clea... |
123 124 |
case CISTPL_FUNCID_FIXED: puts (" Fixed Disk"); |
7cb22f97e * Make CPU clock ... |
125 |
break; |
9d4079955 Major PCMCIA Clea... |
126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
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 |
140 |
break; |
ea909b760 * Added support f... |
141 |
} |
9d4079955 Major PCMCIA Clea... |
142 143 |
puts (" Card "); |
db01a2ea9 * Patch by Stephe... |
144 |
} |
9d4079955 Major PCMCIA Clea... |
145 |
static void print_fixed (volatile uchar *p) |
db01a2ea9 * Patch by Stephe... |
146 |
{ |
9d4079955 Major PCMCIA Clea... |
147 148 |
if (p == NULL) return; |
db01a2ea9 * Patch by Stephe... |
149 |
|
9d4079955 Major PCMCIA Clea... |
150 |
puts(indent); |
db01a2ea9 * Patch by Stephe... |
151 |
|
9d4079955 Major PCMCIA Clea... |
152 153 154 |
switch (*p) { case CISTPL_FUNCE_IDE_IFACE: { uchar iface = *(p+2); |
db01a2ea9 * Patch by Stephe... |
155 |
|
9d4079955 Major PCMCIA Clea... |
156 157 158 159 160 161 162 163 |
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... |
164 |
|
9d4079955 Major PCMCIA Clea... |
165 |
puts ((f1 & CISTPL_IDE_SILICON) ? " [silicon]" : " [rotating]"); |
db01a2ea9 * Patch by Stephe... |
166 |
|
9d4079955 Major PCMCIA Clea... |
167 168 |
if (f1 & CISTPL_IDE_UNIQUE) puts (" [unique]"); |
db01a2ea9 * Patch by Stephe... |
169 |
|
9d4079955 Major PCMCIA Clea... |
170 |
puts ((f1 & CISTPL_IDE_DUAL) ? " [dual]" : " [single]"); |
db01a2ea9 * Patch by Stephe... |
171 |
|
9d4079955 Major PCMCIA Clea... |
172 173 |
if (f2 & CISTPL_IDE_HAS_SLEEP) puts (" [sleep]"); |
db01a2ea9 * Patch by Stephe... |
174 |
|
9d4079955 Major PCMCIA Clea... |
175 176 |
if (f2 & CISTPL_IDE_HAS_STANDBY) puts (" [standby]"); |
db01a2ea9 * Patch by Stephe... |
177 |
|
9d4079955 Major PCMCIA Clea... |
178 179 |
if (f2 & CISTPL_IDE_HAS_IDLE) puts (" [idle]"); |
db01a2ea9 * Patch by Stephe... |
180 |
|
9d4079955 Major PCMCIA Clea... |
181 182 |
if (f2 & CISTPL_IDE_LOW_POWER) puts (" [low power]"); |
c609719b8 Initial revision |
183 |
|
9d4079955 Major PCMCIA Clea... |
184 185 |
if (f2 & CISTPL_IDE_REG_INHIBIT) puts (" [reg inhibit]"); |
c609719b8 Initial revision |
186 |
|
9d4079955 Major PCMCIA Clea... |
187 188 |
if (f2 & CISTPL_IDE_HAS_INDEX) puts (" [index]"); |
66fd3d1ce Add support for C... |
189 |
|
9d4079955 Major PCMCIA Clea... |
190 191 |
if (f2 & CISTPL_IDE_IOIS16) puts (" [IOis16]"); |
66fd3d1ce Add support for C... |
192 |
|
9d4079955 Major PCMCIA Clea... |
193 194 195 196 197 |
break; } } putc (' '); |
66fd3d1ce Add support for C... |
198 |
} |
db01a2ea9 * Patch by Stephe... |
199 |
|
9d4079955 Major PCMCIA Clea... |
200 |
static int identify (volatile uchar *p) |
c609719b8 Initial revision |
201 |
{ |
9d4079955 Major PCMCIA Clea... |
202 203 204 205 206 |
uchar id_str[MAX_IDENT_CHARS]; uchar data; uchar *t; uchar **card; int i, done; |
c609719b8 Initial revision |
207 |
|
9d4079955 Major PCMCIA Clea... |
208 209 |
if (p == NULL) return (0); /* Don't know */ |
c609719b8 Initial revision |
210 |
|
9d4079955 Major PCMCIA Clea... |
211 212 |
t = id_str; done =0; |
c609719b8 Initial revision |
213 |
|
9d4079955 Major PCMCIA Clea... |
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 |
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 |
229 |
} |
9d4079955 Major PCMCIA Clea... |
230 231 232 233 234 235 236 237 238 239 |
*t = '\0'; while (--t > id_str) { if (*t == ' ') *t = '\0'; else break; } puts ((char *)id_str); putc (' '); |
c609719b8 Initial revision |
240 |
|
9d4079955 Major PCMCIA Clea... |
241 242 243 244 245 246 247 248 249 |
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 |
250 |
|
9d4079955 Major PCMCIA Clea... |
251 |
return (0); /* don't know */ |
db01a2ea9 * Patch by Stephe... |
252 |
} |
c609719b8 Initial revision |
253 |
|
9d4079955 Major PCMCIA Clea... |
254 |
int check_ide_device (int slot) |
c609719b8 Initial revision |
255 256 257 |
{ volatile uchar *ident = NULL; volatile uchar *feature_p[MAX_FEATURES]; |
ea909b760 * Added support f... |
258 |
volatile uchar *p, *start, *addr; |
c609719b8 Initial revision |
259 260 261 262 263 264 |
int n_features = 0; uchar func_id = ~0; uchar code, len; ushort config_base = 0; int found = 0; int i; |
6d0f6bcf3 rename CFG_ macro... |
265 266 |
addr = (volatile uchar *)(CONFIG_SYS_PCMCIA_MEM_ADDR + CONFIG_SYS_PCMCIA_MEM_SIZE * (slot * 4)); |
d0fb80c30 * Restrict baudra... |
267 268 |
debug ("PCMCIA MEM: %08lX ", (ulong)addr); |
c609719b8 Initial revision |
269 |
|
ea909b760 * Added support f... |
270 |
start = p = (volatile uchar *) addr; |
c609719b8 Initial revision |
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 336 |
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... |
337 |
ide_devices_found |= (1 << slot); |
c609719b8 Initial revision |
338 |
/* set I/O area in config reg -> only valid for ARGOSY D5!!! */ |
ea909b760 * Added support f... |
339 |
*((uchar *)(addr + config_base)) = 1; |
e2ffd59b4 * Code cleanup, m... |
340 341 342 343 344 345 346 347 348 349 350 351 352 |
#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 |
353 354 |
return (0); } |
c609719b8 Initial revision |
355 |
|
9d4079955 Major PCMCIA Clea... |
356 |
#endif /* CHECK_IDE_DEVICE */ |