2 Copyright © 1995-2011, The AROS Development Team. All rights reserved.
9 #include <aros/debug.h>
10 #include <exec/types.h>
11 #include <exec/interrupts.h>
12 #include <hardware/intbits.h>
13 #include <proto/exec.h>
14 #include <aros/symbolsets.h>
15 #include "card_intern.h"
17 AROS_UFP4 (APTR
, card_level2
,
18 AROS_UFPA(ULONG
, dummy
, A0
),
19 AROS_UFPA(void *, data
, A1
),
20 AROS_UFPA(ULONG
, dummy2
, A5
),
21 AROS_UFPA(struct ExecBase
*, mySysBase
, A6
));
23 AROS_UFP4 (APTR
, card_level6
,
24 AROS_UFPA(ULONG
, dummy
, A0
),
25 AROS_UFPA(void *, data
, A1
),
26 AROS_UFPA(ULONG
, dummy2
, A5
),
27 AROS_UFPA(struct ExecBase
*, mySysBase
, A6
));
29 void CardTask(struct Task
*parent
, struct CardResource
*CardResource
);
31 static BOOL
addpcmciaram(struct CardResource
*CardResource
, struct CardHandle
*ch
, struct DeviceTData
*dtd
)
33 ULONG size
= dtd
->dtd_DTsize
;
34 APTR addr
=(APTR
)GAYLE_RAM
;
40 AddMemList(size
, MEMF_FAST
| MEMF_PUBLIC
, -5, addr
, CardResource
->crb_LibNode
.lib_Node
.ln_Name
);
44 static BOOL
checkcard(struct CardResource
*CardResource
)
46 struct CardHandle
*ch
;
49 ch
= AllocVec(sizeof(struct CardHandle
), MEMF_CLEAR
);
51 ch
->cah_CardFlags
= CARDF_IFAVAILABLE
;
54 struct DeviceTData dtd
;
59 if (!CopyTuple(ch
, NULL
, 0, 0)) { /* debug log all tuples, check if tuple chain is valid */
60 CARDDEBUG(bug("Invalid tuple chain detected\n"));
64 CARDDEBUG(bug("CISTPL_AMIGAXIP found\n"));
65 } else if (CopyTuple(ch
, device
, CISTPL_DEVICE
, sizeof(device
) - 2)) {
66 if (DeviceTuple(device
, &dtd
)) {
67 if (dtd
.dtd_DTtype
== DTYPE_SRAM
|| dtd
.dtd_DTtype
== DTYPE_DRAM
) {
68 CARDDEBUG(bug("RAM card found, size %d bytes, speed %d\n", dtd
.dtd_DTsize
, dtd
.dtd_DTspeed
));
69 if (!CopyTuple(ch
, device
, CISTPL_FORMAT
, 0) && !CopyTuple(ch
, device
, CISTPL_GEOMETRY
, 0) && dtd
.dtd_DTspeed
<= 250) {
70 if (addpcmciaram(CardResource
, ch
, &dtd
)) {
71 CardAccessSpeed(ch
, dtd
.dtd_DTspeed
);
72 CARDDEBUG(bug("Mapped as System RAM.\n"));
76 CARDDEBUG(bug("Not usable as System RAM.\n"));
92 static int Cardres_Init(struct CardResource
*CardResource
)
95 struct CardMemoryMap
*cmm
;
96 struct Interrupt
*intr
;
97 volatile struct GayleIO
*gio
= (struct GayleIO
*)GAYLE_BASE
;
103 /* No Gayle = No PCMCIA slot */
107 /* Address space conflict? */
108 if (TypeOfMem((UBYTE
*)GAYLE_RAM
+ 0x1000) != 0)
111 NEWLIST(&CardResource
->handles
);
112 cmm
= &CardResource
->cmm
;
113 cmm
->cmm_CommonMemory
= (UBYTE
*)GAYLE_RAM
;
114 cmm
->cmm_AttributeMemory
= (UBYTE
*)GAYLE_ATTRIBUTE
;
115 cmm
->cmm_IOMemory
= (UBYTE
*)GAYLE_IO
;
116 cmm
->cmm_CommonMemSize
= GAYLE_RAMSIZE
;
117 cmm
->cmm_AttributeMemSize
= GAYLE_ATTRIBYTESIZE
;
118 cmm
->cmm_IOMemSize
= GAYLE_IOSIZE
;
120 CARDDEBUG(bug("PCMCIA slot enabled\n"));
122 pcmcia_reset(CardResource
);
125 CardResource
->removed
= TRUE
;
126 if (gio
->status
& GAYLE_CS_CCDET
) {
128 CARDDEBUG(bug("Inserted PCMCIA card detected\n"));
129 pcmcia_cardreset(CardResource
);
130 CardResource
->removed
= FALSE
;
131 if (checkcard(CardResource
)) {
132 CardResource
->resetberr
= GAYLE_IRQ_RESET
;
133 pcmcia_clear_requests(CardResource
);
134 /* Installed as Fast RAM. Do not initialize resource */
139 CardResource
->task
= NewCreateTask(
140 TASKTAG_PC
, CardTask
,
141 TASKTAG_NAME
, CardResource
->crb_LibNode
.lib_Node
.ln_Name
,
143 TASKTAG_ARG1
, FindTask(0),
144 TASKTAG_ARG2
, CardResource
,
146 if (!CardResource
->task
)
148 Wait(SIGBREAKF_CTRL_F
);
152 intr
= &CardResource
->level2
;
153 intr
->is_Node
.ln_Pri
= 127;
154 intr
->is_Node
.ln_Type
= NT_INTERRUPT
;
155 intr
->is_Node
.ln_Name
= CardResource
->crb_LibNode
.lib_Node
.ln_Name
;
156 intr
->is_Code
= (APTR
)card_level2
;
157 intr
->is_Data
= CardResource
;
158 AddIntServer(INTB_PORTS
, intr
);
160 intr
= &CardResource
->level6
;
161 intr
->is_Node
.ln_Pri
= -127;
162 intr
->is_Node
.ln_Type
= NT_INTERRUPT
;
163 intr
->is_Node
.ln_Name
= CardResource
->crb_LibNode
.lib_Node
.ln_Name
;
164 intr
->is_Code
= (APTR
)card_level6
;
165 intr
->is_Data
= CardResource
;
166 AddIntServer(INTB_EXTER
, intr
);
168 pcmcia_clear_requests(CardResource
);
169 pcmcia_enable_interrupts();
176 ADD2INITLIB(Cardres_Init
, 0)