Libsdio¶
General description¶
libsdio
is a static, precompiled library containing a generic SDIO driver
which directly controls the platform hardware.
This driver defines an API providing basic interface control functionality.
Platform support¶
Target |
Supported |
---|---|
armv7a7-imx6ull |
Yes |
armv7m7-imxrt106x |
No |
ia32-generic-pc |
No |
Limitations¶
only one library instance per system
no fallback SD protocol support (SDIO only)
no support for multiple SDIO devices
no support for SDIO in SPI mode
only 4-bit data transfer mode supported
only 50/25 MHz clock speeds available on imx6ull
API summary¶
Contents of <sdio.h>
header are listed below.
Functions:
int sdio_init(void);
void sdio_free(void);
int sdio_config(uint32_t freq, uint16_t blocksz);
int sdio_transferDirect(sdio_dir_t dir, uint32_t address,
uint8_t area, uint8_t *data);
int sdio_transferBulk(sdio_dir_t dir, int blockMode, uint32_t address,
uint8_t area, uint8_t *data, size_t len);
int sdio_eventRegister(uint8_t event,
sdio_event_handler_t handler,
void *arg);
int sdio_eventEnable(uint8_t event, int enabled);
Types:
typedef enum {
sdio_read,
sdio_write
} sdio_dir_t;
typedef void (*sdio_event_handler_t)(void *arg);
Definitions:
define |
description |
---|---|
SDIO_EVENT_CARD_IN |
SDIO device is inserted |
SDIO_EVENT_CARD_OUT |
SDIO device is removed |
SDIO_EVENT_CARD_IRQ |
SDIO device requested an interrupt |
Note
These definitions are meant for use with sdio_eventEnable
and sdio_eventRegister
functions exclusively.
API description¶
Following sections describe the API in detail, including the behavior of certain functions.
Note
Codes returned by API calls are defined in <errno.h>
header, which provides more detailed information
about specific values.
typedef enum {
sdio_read,
sdio_write
} sdio_dir_t;
Description:
This enumeration type is meant as parameter for sdio_transferDirect
and sdio_transferBulk
functions to indicate the
direction of a given data transfer.
typedef void (*sdio_event_handler_t)(void *arg);
Description:
This type describes a callback for an interrupt handler. Handlers of interrupts events are assigned to a specific event,
and every event can only have a single handler. Handler argument is provided during handler registration using
sdio_eventRegister
, and will remain unchanged until the handler registration is modified via the same function.
int sdio_init(void);
Description:
This function initializes the SDIO interface hardware and tries to detect and select the connected device. It has to be called before any other API function. Should no device be present, or it does not respond to SDIO initialization sequence, this function shall return an error code and free resources it acquired.
Note
Calling this function more than once after successful completion will have no effect. In order to
reinitialize the interface, sdio_free
should be called between concurrent sdio_init
calls instead.
Parameters:
none
Returns:
code |
description |
---|---|
EOK |
success |
EIO |
I/O hardware fault occurred |
ENOMEM |
not enough memory available |
void sdio_free(void);
Description:
This function frees the SDIO bus, reset the host controller, deregister and disable all previously registered event
handlers. Calling this function before sdio_init
has no effect.
Note
Due to its current implementation, calling this function does not allow for creation of new library instances in other running processes.
Parameters:
none
Returns:
nothing
int sdio_config(uint32_t freq, uint16_t blocksz);
Description:
This function provides a configuration interface for the SDIO bus controller. This function can be called at any time
after sdio_init
.
Parameters:
parameter |
description |
possible values |
---|---|---|
[in] |
SDIO clock frequency in Hz |
any |
[in] |
block size for bulk transfers |
25000000 / 50000000 |
Returns:
code |
description |
---|---|
EOK |
success |
EINVAL |
provided |
ETIMEDOUT |
device configuration took too long |
EIO |
I/O hardware fault occurred |
int sdio_transferDirect(sdio_dir_t dir, uint32_t address,
uint8_t area, uint8_t *data);
Description:
This function initiates a direct, single 8-bit register read/write operation. When dir
is specified as sdio_write
the byte inside the data
buffer is written to the device, otherwise if dir
equals sdio_read
, the buffer is set
to the value read from the device.
Note
This function is a blocking call which only returns upon successful transfer completion or failure.
Parameters:
parameter |
description |
possible values |
---|---|---|
[in] |
transfer direction |
sdio_read / sdio_write |
[in] |
card register address to access |
any 17-bit value |
[in] |
card I/O area index to access |
any 3-bit value |
[in/out] |
bidirectional single byte buffer |
any valid pointer |
Returns:
code |
description |
---|---|
EOK |
success |
EBUSY |
device is currently busy |
ETIMEDOUT |
device did not respond in time |
int sdio_transferBulk(sdio_dir_t dir, int blockMode, uint32_t address,
uint8_t area, uint8_t *data, size_t len);
Description:
This function initiates an indirect, multibyte transfer of up to 2048 bytes at once. As is the case with
sdio_transferDirect
, this call can service bidirectional transfers.
Note
This function is a blocking call which only returns upon successful transfer completion or failure.
Parameters:
parameter |
description |
possible values |
---|---|---|
[in] |
transfer direction |
sdio_read / sdio_write |
[in] |
divide transfer into blocks |
boolean |
[in] |
card base address to access |
any 17-bit value |
[in] |
card I/O area index to access |
any 3-bit value |
[in/out] |
bidirectional multibyte buffer |
any valid pointer |
[in] |
total transfer size in bytes |
<=2048 |
Note
len
parameter has to be a multiple of blocksz
when performing a block transfer with blockMode
set to
true.
Note
address
parameter specifies only the base address of the transfer. If blockMode
is set to true, then
the address is automatically incremented by the device with every completed block.
Returns:
code |
description |
---|---|
EOK |
success |
EIO |
I/O hardware fault occurred |
EBUSY |
interface is currently busy |
ETIMEDOUT |
transfer request was not serviced in time |
EINVAL |
see parameters section |
int sdio_eventRegister(uint8_t event,
sdio_event_handler_t handler,
void *arg);
This function registers an event handler to be called when a given interrupt event occurs. An interrupt event will not
be signalled until its detection is enabled by sdio_eventEnable
. Please note that only one handler can be registered
per event - calling this function multiple times for the same event will result in the previous handler being
overwritten. In order to deregister the handler one can pass NULL
as the handler
parameter.
Parameters:
parameter |
description |
possible values |
---|---|---|
[in] |
event to be handled |
see note below |
[in] |
pointer to event handler function |
any pointer |
[in/out] |
argument for the handler function |
any pointer |
Note
event
argument is passed using appropriate defines beginning with SDIO_EVENT
.
Returns:
code |
description |
---|---|
EOK |
success |
EINVAL |
provided |
Note
Codes returned are defined in <errno.h>
header.
int sdio_eventEnable(uint8_t event, int enabled);
This function can enable or disable interrupt event signalling of the SD host controller. If a handler is registered via
sdio_eventRegister
for a given enabled event, it will be called when an interrupt fires.
Parameters:
parameter |
description |
possible values |
---|---|---|
[in] |
event for which signalling enable is to be set |
see note below |
[in] |
state of signalling enable (1/0) |
boolean |
Note
event
argument is passed using appropriate defines beginning with SDIO_EVENT
.
Returns:
code |
description |
---|---|
EOK |
success |
EINVAL |
provided |