int
cardbus_attach_card(
struct cardbus_softc *csc
)
void
cardbus_detach_card(
struct cardbus_softc *csc
)
int
cardbus_function_enable(
struct cardbus_softc *csc
, int function
)
int
cardbus_function_disable(
struct cardbus_softc *csc
, int function
)
int
cardbus_mapreg_map(
struct cardbus_softc *csc
int cf
int reg
cardbusreg_t type
int busflags
bus_space_tag_t *tagp
bus_space_handle_t *handlep
bus_addr_t *basep
bus_size_t *sizep
)
int
cardbus_mapreg_unmap(
struct cardbus_softc *csc
, int cf
, int reg
, bus_space_tag_t tag
, bus_space_handle_t handle
, bus_size_t size
)
int
cardbus_get_capability(
cardbus_chipset_tag_t cc
, cardbus_function_tag_t cf
, cardbustag_t tag
, int capid
, int *offsetp
, cardbusreg_t *valuep
)
cardbustag_t
cardbus_make_tag(
cardbus_chipset_tag_t cc
, int cf
, int bus
, int device
, int function
)
void
cardbus_free_tag(
cardbus_chipset_tag_t cc
, int cf
, cardbustag_t tag
)
cardbusreg_t
cardbus_conf_read(
cardbus_chipset_tag_t cc
, int cf
, cardbustag_t tag
, int offs
)
void
cardbus_conf_write(
cardbus_chipset_tag_t cc
, int cf
, cardbustag_t tag
, int offs
, busreg_t val
)
void
*
cardbus_intr_establish(
cardbus_chipset_tag_t cc
, cardbus_function_tag_t cf
, cardbus_intr_handle_t irq
, int level
, int (*handler)(void *)
, void *arg
)
void
cardbus_intr_disestablish(
cardbus_chipset_tag_t cc
, cardbus_function_tag_t cf
, void *ih
)
int
CARDBUS_VENDOR(
cardbusreg_t id
)
int
CARDBUS_PRODUCT(
cardbusreg_t id
)
int
Cardbus_function_enable(
cardbus_devfunc_t ct
)
int
Cardbus_function_disable(
cardbus_devfunc_t ct
)
int
Cardbus_mapreg_map(
cardbus_devfunc_t ct
, int reg
, cardbusreg_t type
, int busflags
, bus_space_tag_t *tagp
, bus_space_handle_t *handlep
, bus_addr_t *basep
, bus_size_t *sizep
)
int
Cardbus_mapreg_unmap(
cardbus_devfunc_t ct
, int reg
, bus_space_tag_t tag
, bus_space_handle_t handle
, bus_size_t size
)
cardbustag_t
Cardbus_make_tag(
cardbus_devfunc_t ct
)
void
Cardbus_free_tag(
cardbus_devfunc_t ct
, cardbustag_t tag
)
cardbusreg_t
Cardbus_conf_read(
cardbus_devfunc_t ct
, cardbustag_t tag
, int offs
)
void
Cardbus_conf_write(
cardbus_devfunc_t ct
, cardbustag_t tag
, int offs
, busreg_t val
)
The CardBus interface is an improvement to the PC-Card interface supported by pcmcia(9). It introduces several new capabilities such as 32-bit addressing, 33MHz operation, busmaster operation and 3.3 volt low-voltage power. It remains compatible with all features of the PC-Card standard.
The CardBus interface signaling protocol is derived from the PCI signaling protocol. There are some differences between PCI and CardBus, however operations are identical for most functions implemented. Since a 32-bit CardBus interface is also defined for 16-bit PC-Cards, the same Card Services client to be used to manage both CardBus and PCMCIA PC-Cards. By interrogating the card upon detection of an insertion event, NetBSD determines whether the card requires Cardbus support or not, and then applies the appropriate power and signaling protocol requirements.
cardbus_devfunc_t ca_ct;
bus_space_tag_t ca_iot; /* CardBus I/O space tag */
bus_space_tag_t ca_memt; /* CardBus MEM space tag */
bus_dma_tag_t ca_dmat; /* DMA tag */
u_int ca_device;
cardbustag_t ca_tag;
cardbusreg_t ca_id;
cardbusreg_t ca_class;
cardbus_intr_line_t ca_intrline; /* interrupt info */
struct cardbus_cis_info ca_cis;
csc
)
csc
)
csc
, function
)
function
on the card.
Power will be applied if it hasn't already.
csc
, function
)
function
on the card.
When no device functions are enabled, the turn is turned off.
csc
, cf
, reg
, type
, busflags
, tagp
, handlep
, basep
, sizep
)
reg
for device function
cf
.
The bus-space configuration is returned in
tagp
,
handlep
,
basep
,
and
sizep
.
csc
, cf
, reg
, tag
, handle
, bus_size_t size
)
cf
specified by
tag
,
handle
and
size
.
reg
is the offset of the BAR register.
cc
, cf
, tag
, capid
, offsetp
, valuep
)
cf
specified by
capid
.
Returns the capability in
offsetp
and
valuep
.
cc
, cf
, bus
, device
, function
)
).
cc
, cf
, tag
)
).
cc
, cf
, tag
, offs
)
).
cc
, cf
, tag
, offs
, val
)
).
cc
, cf
, irq
, level
, handler
, arg
)
cf
.
The priority of the interrupt is specified by
level
.
When the interrupt occurs the function
handler
is called with argument
arg
.
The return value is a handle for the interrupt handler.
cardbus_intr_establish(
)
returns an opaque handle to an event descriptor if it succeeds, and
returns NULL on failure.
cc
, cf
, ih
)
cf
with handle
ih
.
The handle was returned from
cardbus_intr_establish(
).
id
)
id
.
id
)
id
.
The
Cardbus_*()
functions are convenience functions taking a
cardbus_devfunc_t
argument and perform the same operation as their namesake described
above.
struct
isapnp_attach_args
describing the device attaches to the CardBus.
Drivers match the device using the
ca_id
member using
CARDBUS_VENDOR(
)
and
CARDBUS_PRODUCT(
).
During the driver attach step, drivers should initially map the device
I/O and memory resources using
cardbus_mapreg_map()
or
Cardbus_mapreg_map(
).
Upon successful allocation of resources, power can be
applied to the device with
cardbus_function_enable(
)
or
Cardbus_function_enable(
).
so that device-specific interrogation can be performed.
Finally, power should be removed from the device using
cardbus_function_disable(
)
or
Cardbus_function_disable(
).
Since CardBus devices support dynamic configuration, drivers should
make use of
powerhook_establish(9
).
Power can be applied and the interrupt handler should be established
through this interface.
/usr/src
.
The CardBus subsystem itself is implemented within the files
sys/dev/cardbus/cardbus.c
,
sys/dev/cardbus/cardbus_map.c
and
sys/dev/cardbus/cardslot.c
.
The database of known devices exists within the file
sys/dev/cardbus/cardbus_data.h
and is generated automatically from the file
sys/dev/cardbus/cardbusdevs
.
New vendor and product identifiers should be added to this file.
The database can be regenerated using the Makefile
sys/dev/cardbus/Makefile.cardbusdevs
.