# SDIO Usage Guidelines
- [How to Use](#section1962415610383)
- [Opening an SDIO Controller](#section814751015461)
- [Claiming a Host Exclusively](#section49274582455)
- [Enabling the SDIO Device](#section1431520410489)
- [Claiming an SDIO IRQ](#section3662781537)
- [Performing SDIO Communication](#section391941913484)
- [Releasing the SDIO IRQ](#section56205204481)
- [Disabling the SDIO Device](#section181181621124815)
- [Releasing the Exclusively Claimed Host](#section657117215486)
- [Closing an SDIO Controller](#section1898172114818)
## How to Use
[Figure 1](spiusage-guidelines.md#fig23885455594) illustrates the process of using an SDIO.
**Figure 1** Process of using an SDIO

## Opening an SDIO Controller
Before performing SDIO communication, obtain the device handle of an SDIO controller by calling **SdioOpen**. This function returns the device handle of the SDIO controller with a specified bus number.
DevHandle SdioOpen\(int16\_t mmcBusNum, struct SdioFunctionConfig \*config\);
**Table 1** Parameters and return values of SdioOpen
Parameter
|
Description
|
mmcBusNum
|
Bus number.
|
config
|
SDIO functionality configurations.
|
Return Value
|
Description
|
NULL
|
Failed to obtain the device handle of an SDIO controller.
|
Device handle
|
Device handle of an SDIO controller.
|
The following example shows how to open an SDIO controller.
```
DevHandle handle = NULL;
struct SdioFunctionConfig config;
config.funcNr = 1;
config.vendorId = 0x123;
config.deviceId = 0x456;
/* Open an SDIO controller whose bus number is 1. */
handle = SdioOpen(1, &config);
if (handle == NULL) {
HDF_LOGE("SdioOpen: failed!\n");
}
```
## Claiming a Host Exclusively
After obtaining the device handle of an SDIO controller, exclusively claim the host before performing subsequent operations on the SDIO device.
void SdioClaimHost\(DevHandle handle\);
**Table 2** Parameter description of SdioClaimHost
Parameter
|
Description
|
handle
|
Device handle of an SDIO controller.
|
The following example shows how to exclusively claim a host.
```
SdioClaimHost(handle); /* Claim a host exclusively. */
```
## Enabling the SDIO Device
Before accessing a register, enable the SDIO device.
int32\_t SdioEnableFunc\(DevHandle handle\);
**Table 3** Parameters and return values of SdioEnableFunc
Parameter
|
Description
|
handle
|
Device handle of an SDIO controller.
|
Return Value
|
Description
|
0
|
The SDIO device is enabled.
|
Negative value
|
Failed to enable the SDIO device.
|
The following example shows how to enable the SDIO device.
```
int32_t ret;
/* Enable the SDIO device. */
ret = SdioEnableFunc(handle);
if (ret != 0) {
HDF_LOGE("SdioEnableFunc: failed, ret %d\n", ret);
}
```
## Claiming an SDIO IRQ
Before SDIO communication, claim an SDIO IRQ.
int32\_t SdioClaimIrq\(DevHandle handle, SdioIrqHandler \*handler\);
**Table 4** Parameters and return values of SdioClaimIrq
Parameter
|
Description
|
handle
|
Device handle of an SDIO controller.
|
handler
|
Pointer to the SDIO IRQ function.
|
Return Value
|
Description
|
0
|
The SDIO IRQ is claimed.
|
Negative value
|
Failed to claim an SDIO IRQ.
|
The following example shows how to claim an SDIO IRQ.
```
/* Implement the SDIO IRQ function based on the application. */
static void SdioIrqFunc(void *data)
{
if (data == NULL) {
HDF_LOGE("SdioIrqFunc: data is NULL.\n");
return;
}
/* You need to add specific implementations. */
}
int32_t ret;
/* Claim an SDIO IRQ. */
ret = SdioClaimIrq(handle, SdioIrqFunc);
if (ret != 0) {
HDF_LOGE("SdioClaimIrq: failed, ret %d\n", ret);
}
```
## Performing SDIO Communication
- Incrementally write a given length of data into the SDIO device.
The corresponding function is as follows:
int32\_t SdioWriteBytes\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size\);
**Table 5** Parameters and return values of SdioWriteBytes
Parameter
|
Description
|
handle
|
Device handle of an SDIO controller.
|
data
|
Pointer to the data to write.
|
addr
|
Start address where the data is written into.
|
size
|
Length of the data to write.
|
Return Value
|
Description
|
0
|
Data is written into the SDIO device.
|
Negative value
|
Failed to write data into the SDIO device.
|
The following example shows how to incrementally write a given length of data into the SDIO device.
```
int32_t ret;
uint8_t wbuff[] = {1,2,3,4,5};
uint32_t addr = 0x100 + 0x09;
/* Incrementally write 5-byte data into the start address 0x109 of the SDIO device. */
ret = SdioWriteBytes(handle, wbuff, addr, sizeof(wbuff) / sizeof(wbuff[0]));
if (ret != 0) {
HDF_LOGE("SdioWriteBytes: failed, ret %d\n", ret);
}
```
- Incrementally read a given length of data from the SDIO device.
The corresponding function is as follows:
int32\_t SdioReadBytes\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size\);
**Table 6** Parameters and return values of SdioReadBytes
Parameter
|
Description
|
handle
|
Device handle of an SDIO controller.
|
data
|
Pointer to the data to read.
|
addr
|
Start address where the data is read from.
|
size
|
Length of the data to read.
|
Return Value
|
Description
|
0
|
Data is read from the SDIO device.
|
Negative value
|
Failed to read data from the SDIO device.
|
The following example shows how to incrementally read a given length of data from the SDIO device.
```
int32_t ret;
uint8_t rbuff[5] = {0};
uint32_t addr = 0x100 + 0x09;
/* Incrementally read 5-byte data from the start address 0x109 of the SDIO device. */
ret = SdioReadBytes(handle, rbuff, addr, 5);
if (ret != 0) {
HDF_LOGE("SdioReadBytes: failed, ret %d\n", ret);
}
```
- Write a given length of data into the fixed address of an SDIO device.
The corresponding function is as follows:
int32\_t SdioWriteBytesToFixedAddr\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size, uint32\_t scatterLen\);
**Table 7** Parameters and return values of SdioWriteBytesToFixedAddr
Parameter
|
Description
|
handle
|
Device handle of an SDIO controller.
|
data
|
Pointer to the data to write.
|
addr
|
Fixed address where the data is written into.
|
size
|
Length of the data to write.
|
scatterLen
|
Length of the scatter list. If the value is not 0, the data is of the scatter list type.
|
Return Value
|
Description
|
0
|
Data is written into the SDIO device.
|
Negative value
|
Failed to write data into the SDIO device.
|
The following example shows how to write a given length of data into the fixed address of an SDIO device.
```
int32_t ret;
uint8_t wbuff[] = {1, 2, 3, 4, 5};
uint32_t addr = 0x100 + 0x09;
/* Write 5-byte data into the fixed address 0x109 of the SDIO device. */
ret = SdioWriteBytesToFixedAddr(handle, wbuff, addr, sizeof(wbuff) / sizeof(wbuff[0]), 0);
if (ret != 0) {
HDF_LOGE("SdioWriteBytesToFixedAddr: failed, ret %d\n", ret);
}
```
- Read a given length of data from the fixed address of an SDIO device.
The corresponding function is as follows:
int32\_t SdioReadBytesFromFixedAddr\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size, uint32\_t scatterLen\);
**Table 8** Parameters and return values of SdioReadBytesFromFixedAddr
Parameter
|
Description
|
handle
|
Device handle of an SDIO controller.
|
data
|
Pointer to the data to read.
|
addr
|
Start address where the data is read from.
|
size
|
Length of the data to read.
|
scatterLen
|
Length of the scatter list. If the value is not 0, the data is of the scatter list type.
|
Return Value
|
Description
|
0
|
Data is read from the SDIO device.
|
Negative value
|
Failed to read data from the SDIO device.
|
The following example shows how to read a given length of data from the fixed address of an SDIO device.
```
int32_t ret;
uint8_t rbuff[5] = {0};
uint32_t addr = 0x100 + 0x09;
/* Read 5-byte data from the fixed address 0x109 of the SDIO device. */
ret = SdioReadBytesFromFixedAddr(handle, rbuff, addr, 5, 0);
if (ret != 0) {
HDF_LOGE("SdioReadBytesFromFixedAddr: failed, ret %d\n", ret);
}
```
- Write a given length of data into the address space of SDIO function 0.
Currently, only 1-byte data can be written. The corresponding function is as follows:
int32\_t SdioWriteBytesToFunc0\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size\);
**Table 9** Parameters and return values of SdioWriteBytesToFunc0
Parameter
|
Description
|
handle
|
Device handle of an SDIO controller.
|
data
|
Pointer to the data to write.
|
addr
|
Start address where the data is written into.
|
size
|
Length of the data to write.
|
Return Value
|
Description
|
0
|
Data is written into the SDIO device.
|
Negative value
|
Failed to write data into the SDIO device.
|
The following example shows how to write a given length of data into the address space of SDIO function 0.
```
int32_t ret;
uint8_t wbuff = 1;
/* Write 1-byte data into the address 0x2 of SDIO function 0. */
ret = SdioWriteBytesToFunc0(handle, &wbuff, 0x2, 1);
if (ret != 0) {
HDF_LOGE("SdioWriteBytesToFunc0: failed, ret %d\n", ret);
}
```
- Read a given length of data from the address space of SDIO function 0.
Currently, only 1-byte data can be read. The corresponding function is as follows:
int32\_t SdioReadBytesFromFunc0\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size\);
**Table 10** Parameters and return values of SdioReadBytesFromFunc0
Parameter
|
Description
|
handle
|
Device handle of an SDIO controller.
|
data
|
Pointer to the data to read.
|
addr
|
Start address where the data is read from.
|
size
|
Length of the data to read.
|
Return Value
|
Description
|
0
|
Data is read from the SDIO device.
|
Negative value
|
Failed to read data from the SDIO device.
|
The following example shows how to read a given length of data from the address space of SDIO function 0.
```
int32_t ret;
uint8_t rbuff;
/* Read 1-byte data from the address 0x2 of SDIO function 0. */
ret = SdioReadBytesFromFunc0(handle, &rbuff, 0x2, 1);
if (ret != 0) {
HDF_LOGE("SdioReadBytesFromFunc0: failed, ret %d\n", ret);
}
```
## Releasing the SDIO IRQ
After the SDIO communication, release the SDIO IRQ.
int32\_t SdioReleaseIrq\(DevHandle handle\);
**Table 11** Parameters and return values of SdioReleaseIrq
Parameter
|
Description
|
handle
|
Device handle of an SDIO controller.
|
Return Value
|
Description
|
0
|
The SDIO IRQ is released.
|
Negative value
|
Failed to release the SDIO IRQ.
|
The following example shows how to release the SDIO IRQ.
```
int32_t ret;
/* Release the SDIO IRQ. */
ret = SdioReleaseIrq(handle);
if (ret != 0) {
HDF_LOGE("SdioReleaseIrq: failed, ret %d\n", ret);
}
```
## Disabling the SDIO Device
After the SDIO communication, disable the SDIO device.
int32\_t SdioDisableFunc\(DevHandle handle\);
**Table 12** Parameters and return values of SdioDisableFunc
Parameter
|
Description
|
handle
|
Device handle of an SDIO controller.
|
Return Value
|
Description
|
0
|
The SDIO device is disabled.
|
Negative value
|
Failed to disable the SDIO device.
|
The following example shows how to disable the SDIO device.
```
int32_t ret;
/* Disable the SDIO device. */
ret = SdioDisableFunc(handle);
if (ret != 0) {
HDF_LOGE("SdioDisableFunc: failed, ret %d\n", ret);
}
```
## Releasing the Exclusively Claimed Host
After the SDIO communication, release the exclusively claimed host.
void SdioReleaseHost\(DevHandle handle\);
**Table 13** Parameter description of SdioReleaseHost
Parameter
|
Description
|
handle
|
Device handle of an SDIO controller.
|
The following example shows how to release the exclusively claimed host.
```
SdioReleaseHost(handle); /* Release the exclusively claimed host. */
```
## Closing an SDIO Controller
After the SDIO communication, close the SDIO controller.
void SdioClose\(DevHandle handle\);
This function releases the resources requested.
**Table 14** Parameter description of SdioClose
Parameter
|
Description
|
handle
|
Device handle of an SDIO controller.
|
The following example shows how to close an SDIO controller.
```
SdioClose(handle); /* Close an SDIO controller. */
```