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 |
:heavy_check_mark: |
armv7m7-imxrt106x |
:x: |
ia32-generic-pc |
:x: |
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
andsdio_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 concurrentsdio_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 ofblocksz
when performing a block transfer withblockMode
set to true. NOTE:address
parameter specifies only the base address of the transfer. IfblockMode
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 withSDIO_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 withSDIO_EVENT
.
Returns:
code |
description |
---|---|
EOK |
success |
-EINVAL |
provided |