1# SDIO<a name="EN-US_TOPIC_0000001053055057"></a> 2 3- [Overview](#section1155271783811) 4 - [Available APIs](#section08064247248) 5 6- [Usage Guidelines](#section1878939192515) 7 - [How to Use](#section1490685512255) 8 - [Opening an SDIO Controller](#section10782428132616) 9 - [Claiming a Host Exclusively](#section11263172312715) 10 - [Enabling the SDIO Device](#section17861486271) 11 - [Claiming an SDIO IRQ](#section521213262286) 12 - [Performing SDIO Communication](#section85661522153420) 13 - [Releasing the SDIO IRQ](#section1683449352) 14 - [Disabling the SDIO Device](#section15379324143611) 15 - [Releasing the Exclusively Claimed Host](#section536018263713) 16 - [Closing an SDIO Controller](#section4752739183716) 17 18- [Usage Example](#section376910122382) 19 20## Overview<a name="section1155271783811"></a> 21 22- Secure Digital Input/Output \(SDIO\) is a peripheral interface evolved from the Secure Digital \(SD\) memory card interface. The SDIO interface is compatible with SD memory cards and can be connected to devices that support the SDIO interface. 23- SDIO is widely used. Currently, many smartphones support SDIO, and many SDIO peripherals are developed for connections to smartphones. Common SDIO peripherals include WLAN, GPS, cameras, and Bluetooth. 24- The SDIO bus has two ends, named host and device. All communication starts when the host sends a command. The device can communicate with the host as long as it can parse the command of the host. An SDIO host can connect to multiple devices, as shown in the figure below. 25 26 - CLK signal: clock signal sent from the host to the device 27 - VDD signal: power signal 28 - VSS signal: ground signal 29 - D0-3 signal: four data lines. The DAT1 signal cable is multiplexed as the interrupt line. In 1-bit mode, DAT0 is used to transmit data. In 4-bit mode, DAT0 to DAT3 are used to transmit data. 30 - CMD signal: used by the host to send commands and the device to respond to commands. 31 32 **Figure 1** Connections between the host and devices in SDIO<a name="fig1185316527498"></a> 33 34 35  36 37- The SDIO interface defines a set of common methods for operating an SDIO device, including opening and closing an SDIO controller, exclusively claiming and releasing the host, enabling and disabling devices, claiming and releasing an SDIO IRQ, reading and writing data based on SDIO, and obtaining and setting common information. 38 39### Available APIs<a name="section08064247248"></a> 40 41**Table 1** APIs available for the SDIO driver 42 43<a name="table1731550155318"></a> 44<table><thead align="left"><tr id="row1625342317507"><th class="cellrowborder" valign="top" width="21.07%" id="mcps1.2.4.1.1"><p id="p1779183435016"><a name="p1779183435016"></a><a name="p1779183435016"></a>Capability</p> 45</th> 46<th class="cellrowborder" valign="top" width="34.04%" id="mcps1.2.4.1.2"><p id="p1879163417502"><a name="p1879163417502"></a><a name="p1879163417502"></a>Function</p> 47</th> 48<th class="cellrowborder" valign="top" width="44.89%" id="mcps1.2.4.1.3"><p id="p1379113410506"><a name="p1379113410506"></a><a name="p1379113410506"></a>Description</p> 49</th> 50</tr> 51</thead> 52<tbody><tr id="row1351945135614"><td class="cellrowborder" rowspan="2" valign="top" width="21.07%" headers="mcps1.2.4.1.1 "><p id="p146755118566"><a name="p146755118566"></a><a name="p146755118566"></a>SDIO device opening/closing</p> 53</td> 54<td class="cellrowborder" valign="top" width="34.04%" headers="mcps1.2.4.1.2 "><p id="p1151945185614"><a name="p1151945185614"></a><a name="p1151945185614"></a>SdioOpen</p> 55</td> 56<td class="cellrowborder" valign="top" width="44.89%" headers="mcps1.2.4.1.3 "><p id="p85110451565"><a name="p85110451565"></a><a name="p85110451565"></a>Opens an SDIO controller with a specified bus number.</p> 57</td> 58</tr> 59<tr id="row1062610995616"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p136261793568"><a name="p136261793568"></a><a name="p136261793568"></a>SdioClose</p> 60</td> 61<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p062614919566"><a name="p062614919566"></a><a name="p062614919566"></a>Closes an SDIO controller.</p> 62</td> 63</tr> 64<tr id="row337105133315"><td class="cellrowborder" rowspan="6" valign="top" width="21.07%" headers="mcps1.2.4.1.1 "><p id="p07631557153319"><a name="p07631557153319"></a><a name="p07631557153319"></a>SDIO reading/writing</p> 65</td> 66<td class="cellrowborder" valign="top" width="34.04%" headers="mcps1.2.4.1.2 "><p id="p34551320121416"><a name="p34551320121416"></a><a name="p34551320121416"></a>SdioReadBytes</p> 67</td> 68<td class="cellrowborder" valign="top" width="44.89%" headers="mcps1.2.4.1.3 "><p id="p748062291415"><a name="p748062291415"></a><a name="p748062291415"></a>Incrementally reads a given length of data from a specified SDIO address.</p> 69</td> 70</tr> 71<tr id="row9317134301618"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p10345104001412"><a name="p10345104001412"></a><a name="p10345104001412"></a>SdioWriteBytes</p> 72</td> 73<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p113452040141418"><a name="p113452040141418"></a><a name="p113452040141418"></a>Incrementally writes a given length of data into a specified SDIO address.</p> 74</td> 75</tr> 76<tr id="row131301734171616"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p713025410166"><a name="p713025410166"></a><a name="p713025410166"></a>SdioReadBytesFromFixedAddr</p> 77</td> 78<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p14130165418168"><a name="p14130165418168"></a><a name="p14130165418168"></a>Reads a given length of data from a fixed SDIO address.</p> 79</td> 80</tr> 81<tr id="row1434434011147"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p1913013546161"><a name="p1913013546161"></a><a name="p1913013546161"></a>SdioWriteBytesToFixedAddr</p> 82</td> 83<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p111301954131614"><a name="p111301954131614"></a><a name="p111301954131614"></a>Writes a given length of data into a fixed SDIO address.</p> 84</td> 85</tr> 86<tr id="row364393591410"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p1851815711620"><a name="p1851815711620"></a><a name="p1851815711620"></a>SdioReadBytesFromFunc0</p> 87</td> 88<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p751875761611"><a name="p751875761611"></a><a name="p751875761611"></a>Reads a given length of data from the address space of SDIO function 0.</p> 89</td> 90</tr> 91<tr id="row17455333175"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p1645519318173"><a name="p1645519318173"></a><a name="p1645519318173"></a>SdioWriteBytesToFunc0</p> 92</td> 93<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p114552320176"><a name="p114552320176"></a><a name="p114552320176"></a>Writes a given length of data into the address space of SDIO function 0.</p> 94</td> 95</tr> 96<tr id="row34145016535"><td class="cellrowborder" valign="top" width="21.07%" headers="mcps1.2.4.1.1 "><p id="p229610227124"><a name="p229610227124"></a><a name="p229610227124"></a>SDIO block size setting</p> 97</td> 98<td class="cellrowborder" valign="top" width="34.04%" headers="mcps1.2.4.1.2 "><p id="p74531720181413"><a name="p74531720181413"></a><a name="p74531720181413"></a>SdioSetBlockSize</p> 99</td> 100<td class="cellrowborder" valign="top" width="44.89%" headers="mcps1.2.4.1.3 "><p id="p247972241411"><a name="p247972241411"></a><a name="p247972241411"></a>Sets the block size.</p> 101</td> 102</tr> 103<tr id="row778816813238"><td class="cellrowborder" rowspan="2" valign="top" width="21.07%" headers="mcps1.2.4.1.1 "><p id="p1578958142317"><a name="p1578958142317"></a><a name="p1578958142317"></a>SDIO common information retrieval/setting</p> 104</td> 105<td class="cellrowborder" valign="top" width="34.04%" headers="mcps1.2.4.1.2 "><p id="p378918842311"><a name="p378918842311"></a><a name="p378918842311"></a>SdioGetCommonInfo</p> 106</td> 107<td class="cellrowborder" valign="top" width="44.89%" headers="mcps1.2.4.1.3 "><p id="p1078919892313"><a name="p1078919892313"></a><a name="p1078919892313"></a>Obtains common information.</p> 108</td> 109</tr> 110<tr id="row5667102342417"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p2668623182411"><a name="p2668623182411"></a><a name="p2668623182411"></a>SdioSetCommonInfo</p> 111</td> 112<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p14668192362419"><a name="p14668192362419"></a><a name="p14668192362419"></a>Sets common information.</p> 113</td> 114</tr> 115<tr id="row1165101111256"><td class="cellrowborder" valign="top" width="21.07%" headers="mcps1.2.4.1.1 "><p id="p8166161192511"><a name="p8166161192511"></a><a name="p8166161192511"></a>SDIO data flushing</p> 116</td> 117<td class="cellrowborder" valign="top" width="34.04%" headers="mcps1.2.4.1.2 "><p id="p121662112256"><a name="p121662112256"></a><a name="p121662112256"></a>SdioFlushData</p> 118</td> 119<td class="cellrowborder" valign="top" width="44.89%" headers="mcps1.2.4.1.3 "><p id="p171661711112519"><a name="p171661711112519"></a><a name="p171661711112519"></a>Flushes data.</p> 120</td> 121</tr> 122<tr id="row17388101522515"><td class="cellrowborder" rowspan="2" valign="top" width="21.07%" headers="mcps1.2.4.1.1 "><p id="p53101413268"><a name="p53101413268"></a><a name="p53101413268"></a>SDIO host exclusively claiming or releasing</p> 123</td> 124<td class="cellrowborder" valign="top" width="34.04%" headers="mcps1.2.4.1.2 "><p id="p1638881562520"><a name="p1638881562520"></a><a name="p1638881562520"></a>SdioClaimHost</p> 125</td> 126<td class="cellrowborder" valign="top" width="44.89%" headers="mcps1.2.4.1.3 "><p id="p143881715152517"><a name="p143881715152517"></a><a name="p143881715152517"></a>Claims a host exclusively.</p> 127</td> 128</tr> 129<tr id="row5352175517251"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p93537557259"><a name="p93537557259"></a><a name="p93537557259"></a>SdioReleaseHost</p> 130</td> 131<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p1235355511254"><a name="p1235355511254"></a><a name="p1235355511254"></a>Releases the exclusively claimed host.</p> 132</td> 133</tr> 134<tr id="row8759125415269"><td class="cellrowborder" rowspan="2" valign="top" width="21.07%" headers="mcps1.2.4.1.1 "><p id="p272143815359"><a name="p272143815359"></a><a name="p272143815359"></a>SDIO device enablement</p> 135</td> 136<td class="cellrowborder" valign="top" width="34.04%" headers="mcps1.2.4.1.2 "><p id="p6760195452615"><a name="p6760195452615"></a><a name="p6760195452615"></a>SdioEnableFunc</p> 137</td> 138<td class="cellrowborder" valign="top" width="44.89%" headers="mcps1.2.4.1.3 "><p id="p9760135417263"><a name="p9760135417263"></a><a name="p9760135417263"></a>Enables an SDIO device.</p> 139</td> 140</tr> 141<tr id="row1166105762620"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p5662175782616"><a name="p5662175782616"></a><a name="p5662175782616"></a>SdioDisableFunc</p> 142</td> 143<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p3662135722618"><a name="p3662135722618"></a><a name="p3662135722618"></a>Disables an SDIO device.</p> 144</td> 145</tr> 146<tr id="row12332331113517"><td class="cellrowborder" rowspan="2" valign="top" width="21.07%" headers="mcps1.2.4.1.1 "><p id="p188181849203614"><a name="p188181849203614"></a><a name="p188181849203614"></a>SDIO IRQ claiming/releasing</p> 147</td> 148<td class="cellrowborder" valign="top" width="34.04%" headers="mcps1.2.4.1.2 "><p id="p933383133517"><a name="p933383133517"></a><a name="p933383133517"></a>SdioClaimIrq</p> 149</td> 150<td class="cellrowborder" valign="top" width="44.89%" headers="mcps1.2.4.1.3 "><p id="p20333431203510"><a name="p20333431203510"></a><a name="p20333431203510"></a>Claims an SDIO IRQ.</p> 151</td> 152</tr> 153<tr id="row173103413357"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p2073123413515"><a name="p2073123413515"></a><a name="p2073123413515"></a>SdioReleaseIrq</p> 154</td> 155<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p1773634153518"><a name="p1773634153518"></a><a name="p1773634153518"></a>Releases an SDIO IRQ.</p> 156</td> 157</tr> 158</tbody> 159</table> 160 161> **NOTE:** 162>All functions provided in this document can be called only in kernel mode. 163 164## Usage Guidelines<a name="section1878939192515"></a> 165 166### How to Use<a name="section1490685512255"></a> 167 168[Figure 2](#fig1343742311264) illustrates the process of using an SDIO. 169 170**Figure 2** Process of using an SDIO<a name="fig1343742311264"></a> 171 172 173 174 175### Opening an SDIO Controller<a name="section10782428132616"></a> 176 177Before 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. 178 179DevHandle SdioOpen\(int16\_t mmcBusNum, struct SdioFunctionConfig \*config\); 180 181**Table 2** Parameters and return values of SdioOpen 182 183<a name="table1036944152712"></a> 184<table><thead align="left"><tr id="row4370114192717"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p737074112720"><a name="p737074112720"></a><a name="p737074112720"></a>Parameter</p> 185</th> 186<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p15370154102716"><a name="p15370154102716"></a><a name="p15370154102716"></a>Description</p> 187</th> 188</tr> 189</thead> 190<tbody><tr id="row3370184112716"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p337094142715"><a name="p337094142715"></a><a name="p337094142715"></a>mmcBusNum</p> 191</td> 192<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p8370154162718"><a name="p8370154162718"></a><a name="p8370154162718"></a>Bus number.</p> 193</td> 194</tr> 195<tr id="row10370746272"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p23706402717"><a name="p23706402717"></a><a name="p23706402717"></a>config</p> 196</td> 197<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p153701492715"><a name="p153701492715"></a><a name="p153701492715"></a>SDIO functionality configurations.</p> 198</td> 199</tr> 200<tr id="row173703417274"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p183701349276"><a name="p183701349276"></a><a name="p183701349276"></a><strong id="b11478182120013"><a name="b11478182120013"></a><a name="b11478182120013"></a>Return Value</strong></p> 201</td> 202<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p203701647275"><a name="p203701647275"></a><a name="p203701647275"></a><strong id="b277217221307"><a name="b277217221307"></a><a name="b277217221307"></a>Description</strong></p> 203</td> 204</tr> 205<tr id="row837016462716"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p937184172716"><a name="p937184172716"></a><a name="p937184172716"></a>NULL</p> 206</td> 207<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p1837184182720"><a name="p1837184182720"></a><a name="p1837184182720"></a>Failed to obtain the device handle of an SDIO controller.</p> 208</td> 209</tr> 210<tr id="row737116492712"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p537174122715"><a name="p537174122715"></a><a name="p537174122715"></a>Device handle</p> 211</td> 212<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p113715411274"><a name="p113715411274"></a><a name="p113715411274"></a>Device handle of an SDIO controller.</p> 213</td> 214</tr> 215</tbody> 216</table> 217 218The following example shows how to open an SDIO controller. 219 220``` 221DevHandle handle = NULL; 222struct SdioFunctionConfig config; 223config.funcNr = 1; 224config.vendorId = 0x123; 225config.deviceId = 0x456; 226/* Open an SDIO controller whose bus number is 1. */ 227handle = SdioOpen(1, &config); 228if (handle == NULL) { 229 HDF_LOGE("SdioOpen: failed!\n"); 230} 231``` 232 233### Claiming a Host Exclusively<a name="section11263172312715"></a> 234 235After obtaining the device handle of an SDIO controller, exclusively claim the host before performing subsequent operations on the SDIO device. 236 237void SdioClaimHost\(DevHandle handle\); 238 239**Table 3** Parameter description of SdioClaimHost 240 241<a name="table192822447271"></a> 242<table><thead align="left"><tr id="row192829443279"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p1128284452713"><a name="p1128284452713"></a><a name="p1128284452713"></a>Parameter</p> 243</th> 244<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p1528264418272"><a name="p1528264418272"></a><a name="p1528264418272"></a>Description</p> 245</th> 246</tr> 247</thead> 248<tbody><tr id="row328264472711"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p15282124420274"><a name="p15282124420274"></a><a name="p15282124420274"></a>handle</p> 249</td> 250<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p0282164432719"><a name="p0282164432719"></a><a name="p0282164432719"></a>Device handle of an SDIO controller.</p> 251</td> 252</tr> 253</tbody> 254</table> 255 256The following example shows how to exclusively claim a host. 257 258``` 259SdioClaimHost(handle); /* Claim a host exclusively. */ 260``` 261 262### Enabling the SDIO Device<a name="section17861486271"></a> 263 264Before accessing a register, enable the SDIO device. 265 266int32\_t SdioEnableFunc\(DevHandle handle\); 267 268**Table 4** Parameters and return values of SdioEnableFunc 269 270<a name="table144881047485"></a> 271<table><thead align="left"><tr id="row8487204184815"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p1648611415486"><a name="p1648611415486"></a><a name="p1648611415486"></a>Parameter</p> 272</th> 273<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p19487134124820"><a name="p19487134124820"></a><a name="p19487134124820"></a>Description</p> 274</th> 275</tr> 276</thead> 277<tbody><tr id="row16487044480"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p74878414810"><a name="p74878414810"></a><a name="p74878414810"></a>handle</p> 278</td> 279<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p17487184194819"><a name="p17487184194819"></a><a name="p17487184194819"></a>Device handle of an SDIO controller.</p> 280</td> 281</tr> 282<tr id="row13487748487"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p24873424811"><a name="p24873424811"></a><a name="p24873424811"></a><strong id="b048017216013"><a name="b048017216013"></a><a name="b048017216013"></a>Return Value</strong></p> 283</td> 284<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p4487174134813"><a name="p4487174134813"></a><a name="p4487174134813"></a><strong id="b87731622105"><a name="b87731622105"></a><a name="b87731622105"></a>Description</strong></p> 285</td> 286</tr> 287<tr id="row1748814494812"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p84878410488"><a name="p84878410488"></a><a name="p84878410488"></a>0</p> 288</td> 289<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p948715410483"><a name="p948715410483"></a><a name="p948715410483"></a>The SDIO device is enabled.</p> 290</td> 291</tr> 292<tr id="row54881416482"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p24881645489"><a name="p24881645489"></a><a name="p24881645489"></a>Negative value</p> 293</td> 294<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p10488247487"><a name="p10488247487"></a><a name="p10488247487"></a>Failed to enable the SDIO device.</p> 295</td> 296</tr> 297</tbody> 298</table> 299 300The following example shows how to enable the SDIO device. 301 302``` 303int32_t ret; 304/* Enable the SDIO device. */ 305ret = SdioEnableFunc(handle); 306if (ret != 0) { 307 HDF_LOGE("SdioEnableFunc: failed, ret %d\n", ret); 308} 309``` 310 311### Claiming an SDIO IRQ<a name="section521213262286"></a> 312 313Before SDIO communication, claim an SDIO IRQ. 314 315int32\_t SdioClaimIrq\(DevHandle handle, SdioIrqHandler \*handler\); 316 317**Table 5** Parameters and return values of SdioClaimIrq 318 319<a name="table1149014114815"></a> 320<table><thead align="left"><tr id="row114891042488"><th class="cellrowborder" valign="top" width="49.980000000000004%" id="mcps1.2.3.1.1"><p id="p1348864164811"><a name="p1348864164811"></a><a name="p1348864164811"></a>Parameter</p> 321</th> 322<th class="cellrowborder" valign="top" width="50.019999999999996%" id="mcps1.2.3.1.2"><p id="p14885410486"><a name="p14885410486"></a><a name="p14885410486"></a>Description</p> 323</th> 324</tr> 325</thead> 326<tbody><tr id="row048911404820"><td class="cellrowborder" valign="top" width="49.980000000000004%" headers="mcps1.2.3.1.1 "><p id="p248974174814"><a name="p248974174814"></a><a name="p248974174814"></a>handle</p> 327</td> 328<td class="cellrowborder" valign="top" width="50.019999999999996%" headers="mcps1.2.3.1.2 "><p id="p1848915494813"><a name="p1848915494813"></a><a name="p1848915494813"></a>Device handle of an SDIO controller.</p> 329</td> 330</tr> 331<tr id="row204894454813"><td class="cellrowborder" valign="top" width="49.980000000000004%" headers="mcps1.2.3.1.1 "><p id="p17489944488"><a name="p17489944488"></a><a name="p17489944488"></a>handler</p> 332</td> 333<td class="cellrowborder" valign="top" width="50.019999999999996%" headers="mcps1.2.3.1.2 "><p id="p1548984174813"><a name="p1548984174813"></a><a name="p1548984174813"></a>Pointer to the SDIO IRQ function.</p> 334</td> 335</tr> 336<tr id="row44898413488"><td class="cellrowborder" valign="top" width="49.980000000000004%" headers="mcps1.2.3.1.1 "><p id="p1548934124815"><a name="p1548934124815"></a><a name="p1548934124815"></a><strong id="b548120216017"><a name="b548120216017"></a><a name="b548120216017"></a>Return Value</strong></p> 337</td> 338<td class="cellrowborder" valign="top" width="50.019999999999996%" headers="mcps1.2.3.1.2 "><p id="p54891444485"><a name="p54891444485"></a><a name="p54891444485"></a><strong id="b877422211013"><a name="b877422211013"></a><a name="b877422211013"></a>Description</strong></p> 339</td> 340</tr> 341<tr id="row748994144811"><td class="cellrowborder" valign="top" width="49.980000000000004%" headers="mcps1.2.3.1.1 "><p id="p448918415484"><a name="p448918415484"></a><a name="p448918415484"></a>0</p> 342</td> 343<td class="cellrowborder" valign="top" width="50.019999999999996%" headers="mcps1.2.3.1.2 "><p id="p174892412489"><a name="p174892412489"></a><a name="p174892412489"></a>The SDIO IRQ is claimed.</p> 344</td> 345</tr> 346<tr id="row448914420489"><td class="cellrowborder" valign="top" width="49.980000000000004%" headers="mcps1.2.3.1.1 "><p id="p248912464817"><a name="p248912464817"></a><a name="p248912464817"></a>Negative value</p> 347</td> 348<td class="cellrowborder" valign="top" width="50.019999999999996%" headers="mcps1.2.3.1.2 "><p id="p34891645485"><a name="p34891645485"></a><a name="p34891645485"></a>Failed to claim an SDIO IRQ.</p> 349</td> 350</tr> 351</tbody> 352</table> 353 354The following example shows how to claim an SDIO IRQ. 355 356``` 357/* Implement the SDIO IRQ function based on the application. */ 358static void SdioIrqFunc(void *data) 359{ 360 if (data == NULL) { 361 HDF_LOGE("SdioIrqFunc: data is NULL.\n"); 362 return; 363 } 364 /* You need to add specific implementations. */ 365} 366 367int32_t ret; 368/* Claim an SDIO IRQ. */ 369ret = SdioClaimIrq(handle, SdioIrqFunc); 370if (ret != 0) { 371 HDF_LOGE("SdioClaimIrq: failed, ret %d\n", ret); 372} 373``` 374 375### Performing SDIO Communication<a name="section85661522153420"></a> 376 377- Incrementally write a given length of data into the SDIO device. 378 379The corresponding function is as follows: 380 381int32\_t SdioWriteBytes\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size\); 382 383**Table 6** Parameters and return values of SdioWriteBytes 384 385<a name="table6887174174111"></a> 386<table><thead align="left"><tr id="row10887144111419"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p181381751164113"><a name="p181381751164113"></a><a name="p181381751164113"></a>Parameter</p> 387</th> 388<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p19138115184116"><a name="p19138115184116"></a><a name="p19138115184116"></a>Description</p> 389</th> 390</tr> 391</thead> 392<tbody><tr id="row4887341174114"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p1534612017427"><a name="p1534612017427"></a><a name="p1534612017427"></a>handle</p> 393</td> 394<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p8179347434"><a name="p8179347434"></a><a name="p8179347434"></a>Device handle of an SDIO controller.</p> 395</td> 396</tr> 397<tr id="row18881041144120"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p10888154118412"><a name="p10888154118412"></a><a name="p10888154118412"></a>data</p> 398</td> 399<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p1288854115413"><a name="p1288854115413"></a><a name="p1288854115413"></a>Pointer to the data to write.</p> 400</td> 401</tr> 402<tr id="row191054911432"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p91054994311"><a name="p91054994311"></a><a name="p91054994311"></a>addr</p> 403</td> 404<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p111024915432"><a name="p111024915432"></a><a name="p111024915432"></a>Start address where the data is written into.</p> 405</td> 406</tr> 407<tr id="row14888144124119"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p1588814413412"><a name="p1588814413412"></a><a name="p1588814413412"></a>size</p> 408</td> 409<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p1288813411413"><a name="p1288813411413"></a><a name="p1288813411413"></a>Length of the data to write.</p> 410</td> 411</tr> 412<tr id="row18247654163519"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p486155173610"><a name="p486155173610"></a><a name="p486155173610"></a><strong id="b84827210012"><a name="b84827210012"></a><a name="b84827210012"></a>Return Value</strong></p> 413</td> 414<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p1686155113620"><a name="p1686155113620"></a><a name="p1686155113620"></a><strong id="b16775152213010"><a name="b16775152213010"></a><a name="b16775152213010"></a>Description</strong></p> 415</td> 416</tr> 417<tr id="row10574165663512"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p912141012364"><a name="p912141012364"></a><a name="p912141012364"></a>0</p> 418</td> 419<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p51219107363"><a name="p51219107363"></a><a name="p51219107363"></a>Data is written into the SDIO device.</p> 420</td> 421</tr> 422<tr id="row1490635883519"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p10121510133617"><a name="p10121510133617"></a><a name="p10121510133617"></a>Negative value</p> 423</td> 424<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p131212106365"><a name="p131212106365"></a><a name="p131212106365"></a>Failed to write data into the SDIO device.</p> 425</td> 426</tr> 427</tbody> 428</table> 429 430The following example shows how to incrementally write a given length of data into the SDIO device. 431 432``` 433int32_t ret; 434uint8_t wbuff[] = {1,2,3,4,5}; 435uint32_t addr = 0x100 + 0x09; 436/* Incrementally write 5-byte data into the start address 0x109 of the SDIO device. */ 437ret = SdioWriteBytes(handle, wbuff, addr, sizeof(wbuff) / sizeof(wbuff[0])); 438if (ret != 0) { 439 HDF_LOGE("SdioWriteBytes: failed, ret %d\n", ret); 440} 441``` 442 443- Incrementally read a given length of data from the SDIO device. 444 445The corresponding function is as follows: 446 447int32\_t SdioReadBytes\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size\); 448 449**Table 7** Parameters and return values of SdioReadBytes 450 451<a name="table5783755152110"></a> 452<table><thead align="left"><tr id="row19783355162116"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p635754142212"><a name="p635754142212"></a><a name="p635754142212"></a>Parameter</p> 453</th> 454<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p1035774182215"><a name="p1035774182215"></a><a name="p1035774182215"></a>Description</p> 455</th> 456</tr> 457</thead> 458<tbody><tr id="row137831055192118"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p14783155192114"><a name="p14783155192114"></a><a name="p14783155192114"></a>handle</p> 459</td> 460<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p9676437202218"><a name="p9676437202218"></a><a name="p9676437202218"></a>Device handle of an SDIO controller.</p> 461</td> 462</tr> 463<tr id="row4784155102111"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p1978455510217"><a name="p1978455510217"></a><a name="p1978455510217"></a>data</p> 464</td> 465<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p767683714223"><a name="p767683714223"></a><a name="p767683714223"></a>Pointer to the data to read.</p> 466</td> 467</tr> 468<tr id="row63651118499"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p73669113496"><a name="p73669113496"></a><a name="p73669113496"></a>addr</p> 469</td> 470<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p53661144916"><a name="p53661144916"></a><a name="p53661144916"></a>Start address where the data is read from.</p> 471</td> 472</tr> 473<tr id="row7784145510218"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p1078413554219"><a name="p1078413554219"></a><a name="p1078413554219"></a>size</p> 474</td> 475<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p14676163782210"><a name="p14676163782210"></a><a name="p14676163782210"></a>Length of the data to read.</p> 476</td> 477</tr> 478<tr id="row964182643610"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p7833639163612"><a name="p7833639163612"></a><a name="p7833639163612"></a><strong id="b84831021108"><a name="b84831021108"></a><a name="b84831021108"></a>Return Value</strong></p> 479</td> 480<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p3833939113619"><a name="p3833939113619"></a><a name="p3833939113619"></a><strong id="b17775192216016"><a name="b17775192216016"></a><a name="b17775192216016"></a>Description</strong></p> 481</td> 482</tr> 483<tr id="row199479312363"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p567424413611"><a name="p567424413611"></a><a name="p567424413611"></a>0</p> 484</td> 485<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p166741544113615"><a name="p166741544113615"></a><a name="p166741544113615"></a>Data is read from the SDIO device.</p> 486</td> 487</tr> 488<tr id="row5166203418361"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p1167416448361"><a name="p1167416448361"></a><a name="p1167416448361"></a>Negative value</p> 489</td> 490<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p9674114410364"><a name="p9674114410364"></a><a name="p9674114410364"></a>Failed to read data from the SDIO device.</p> 491</td> 492</tr> 493</tbody> 494</table> 495 496The following example shows how to incrementally read a given length of data from the SDIO device. 497 498``` 499int32_t ret; 500uint8_t rbuff[5] = {0}; 501uint32_t addr = 0x100 + 0x09; 502/* Incrementally read 5-byte data from the start address 0x109 of the SDIO device. */ 503ret = SdioReadBytes(handle, rbuff, addr, 5); 504if (ret != 0) { 505 HDF_LOGE("SdioReadBytes: failed, ret %d\n", ret); 506} 507``` 508 509- Write a given length of data into the fixed address of an SDIO device. 510 511 The corresponding function is as follows: 512 513 int32\_t SdioWriteBytesToFixedAddr\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size, uint32\_t scatterLen\); 514 515 **Table 8** Parameters and return values of SdioWriteBytesToFixedAddr 516 517 <a name="table1982918113010"></a> 518 <table><thead align="left"><tr id="row1582911114010"><th class="cellrowborder" valign="top" width="48.43%" id="mcps1.2.3.1.1"><p id="p28301411903"><a name="p28301411903"></a><a name="p28301411903"></a>Parameter</p> 519 </th> 520 <th class="cellrowborder" valign="top" width="51.57000000000001%" id="mcps1.2.3.1.2"><p id="p1883019111018"><a name="p1883019111018"></a><a name="p1883019111018"></a>Description</p> 521 </th> 522 </tr> 523 </thead> 524 <tbody><tr id="row10830141111014"><td class="cellrowborder" valign="top" width="48.43%" headers="mcps1.2.3.1.1 "><p id="p470818551018"><a name="p470818551018"></a><a name="p470818551018"></a>handle</p> 525 </td> 526 <td class="cellrowborder" valign="top" width="51.57000000000001%" headers="mcps1.2.3.1.2 "><p id="p18578510518"><a name="p18578510518"></a><a name="p18578510518"></a>Device handle of an SDIO controller.</p> 527 </td> 528 </tr> 529 <tr id="row48303111304"><td class="cellrowborder" valign="top" width="48.43%" headers="mcps1.2.3.1.1 "><p id="p127081955502"><a name="p127081955502"></a><a name="p127081955502"></a>data</p> 530 </td> 531 <td class="cellrowborder" valign="top" width="51.57000000000001%" headers="mcps1.2.3.1.2 "><p id="p1857841013110"><a name="p1857841013110"></a><a name="p1857841013110"></a>Pointer to the data to write.</p> 532 </td> 533 </tr> 534 <tr id="row9830111119019"><td class="cellrowborder" valign="top" width="48.43%" headers="mcps1.2.3.1.1 "><p id="p187085555011"><a name="p187085555011"></a><a name="p187085555011"></a>addr</p> 535 </td> 536 <td class="cellrowborder" valign="top" width="51.57000000000001%" headers="mcps1.2.3.1.2 "><p id="p257831016115"><a name="p257831016115"></a><a name="p257831016115"></a>Fixed address where the data is written into.</p> 537 </td> 538 </tr> 539 <tr id="row683091120012"><td class="cellrowborder" valign="top" width="48.43%" headers="mcps1.2.3.1.1 "><p id="p370819555013"><a name="p370819555013"></a><a name="p370819555013"></a>size</p> 540 </td> 541 <td class="cellrowborder" valign="top" width="51.57000000000001%" headers="mcps1.2.3.1.2 "><p id="p7578181015113"><a name="p7578181015113"></a><a name="p7578181015113"></a>Length of the data to write.</p> 542 </td> 543 </tr> 544 <tr id="row58301911309"><td class="cellrowborder" valign="top" width="48.43%" headers="mcps1.2.3.1.1 "><p id="p570810551107"><a name="p570810551107"></a><a name="p570810551107"></a>scatterLen</p> 545 </td> 546 <td class="cellrowborder" valign="top" width="51.57000000000001%" headers="mcps1.2.3.1.2 "><p id="p17579910915"><a name="p17579910915"></a><a name="p17579910915"></a>Length of the scatter list. If the value is not <strong id="b107381713254"><a name="b107381713254"></a><a name="b107381713254"></a>0</strong>, the data is of the scatter list type.</p> 547 </td> 548 </tr> 549 <tr id="row18215162810212"><td class="cellrowborder" valign="top" width="48.43%" headers="mcps1.2.3.1.1 "><p id="p1521319452211"><a name="p1521319452211"></a><a name="p1521319452211"></a><strong id="b648472113017"><a name="b648472113017"></a><a name="b648472113017"></a>Return Value</strong></p> 550 </td> 551 <td class="cellrowborder" valign="top" width="51.57000000000001%" headers="mcps1.2.3.1.2 "><p id="p162138457217"><a name="p162138457217"></a><a name="p162138457217"></a><strong id="b1277682210016"><a name="b1277682210016"></a><a name="b1277682210016"></a>Description</strong></p> 552 </td> 553 </tr> 554 <tr id="row2197123118210"><td class="cellrowborder" valign="top" width="48.43%" headers="mcps1.2.3.1.1 "><p id="p1921413451212"><a name="p1921413451212"></a><a name="p1921413451212"></a>0</p> 555 </td> 556 <td class="cellrowborder" valign="top" width="51.57000000000001%" headers="mcps1.2.3.1.2 "><p id="p32146451624"><a name="p32146451624"></a><a name="p32146451624"></a>Data is written into the SDIO device.</p> 557 </td> 558 </tr> 559 <tr id="row18629103314218"><td class="cellrowborder" valign="top" width="48.43%" headers="mcps1.2.3.1.1 "><p id="p132141245622"><a name="p132141245622"></a><a name="p132141245622"></a>Negative value</p> 560 </td> 561 <td class="cellrowborder" valign="top" width="51.57000000000001%" headers="mcps1.2.3.1.2 "><p id="p17214345328"><a name="p17214345328"></a><a name="p17214345328"></a>Failed to write data into the SDIO device.</p> 562 </td> 563 </tr> 564 </tbody> 565 </table> 566 567 The following example shows how to write a given length of data into the fixed address of an SDIO device. 568 569 ``` 570 int32_t ret; 571 uint8_t wbuff[] = {1, 2, 3, 4, 5}; 572 uint32_t addr = 0x100 + 0x09; 573 /* Write 5-byte data into the fixed address 0x109 of the SDIO device. */ 574 ret = SdioWriteBytesToFixedAddr(handle, wbuff, addr, sizeof(wbuff) / sizeof(wbuff[0]), 0); 575 if (ret != 0) { 576 HDF_LOGE("SdioWriteBytesToFixedAddr: failed, ret %d\n", ret); 577 } 578 ``` 579 580- Read a given length of data from the fixed address of an SDIO device. 581 582 The corresponding function is as follows: 583 584 int32\_t SdioReadBytesFromFixedAddr\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size, uint32\_t scatterLen\); 585 586 **Table 9** Parameters and return values of SdioReadBytesFromFixedAddr 587 588 <a name="table2724132220115"></a> 589 <table><thead align="left"><tr id="row8724142214115"><th class="cellrowborder" valign="top" width="48.699999999999996%" id="mcps1.2.3.1.1"><p id="p16752055131112"><a name="p16752055131112"></a><a name="p16752055131112"></a>Parameter</p> 590 </th> 591 <th class="cellrowborder" valign="top" width="51.300000000000004%" id="mcps1.2.3.1.2"><p id="p914434191218"><a name="p914434191218"></a><a name="p914434191218"></a>Description</p> 592 </th> 593 </tr> 594 </thead> 595 <tbody><tr id="row1372462214119"><td class="cellrowborder" valign="top" width="48.699999999999996%" headers="mcps1.2.3.1.1 "><p id="p2752175516113"><a name="p2752175516113"></a><a name="p2752175516113"></a>handle</p> 596 </td> 597 <td class="cellrowborder" valign="top" width="51.300000000000004%" headers="mcps1.2.3.1.2 "><p id="p1353155020125"><a name="p1353155020125"></a><a name="p1353155020125"></a>Device handle of an SDIO controller.</p> 598 </td> 599 </tr> 600 <tr id="row197244220117"><td class="cellrowborder" valign="top" width="48.699999999999996%" headers="mcps1.2.3.1.1 "><p id="p12752165581117"><a name="p12752165581117"></a><a name="p12752165581117"></a>data</p> 601 </td> 602 <td class="cellrowborder" valign="top" width="51.300000000000004%" headers="mcps1.2.3.1.2 "><p id="p9540508121"><a name="p9540508121"></a><a name="p9540508121"></a>Pointer to the data to read.</p> 603 </td> 604 </tr> 605 <tr id="row172519228116"><td class="cellrowborder" valign="top" width="48.699999999999996%" headers="mcps1.2.3.1.1 "><p id="p1675315521120"><a name="p1675315521120"></a><a name="p1675315521120"></a>addr</p> 606 </td> 607 <td class="cellrowborder" valign="top" width="51.300000000000004%" headers="mcps1.2.3.1.2 "><p id="p05415501125"><a name="p05415501125"></a><a name="p05415501125"></a>Start address where the data is read from.</p> 608 </td> 609 </tr> 610 <tr id="row137251922131117"><td class="cellrowborder" valign="top" width="48.699999999999996%" headers="mcps1.2.3.1.1 "><p id="p47531355111111"><a name="p47531355111111"></a><a name="p47531355111111"></a>size</p> 611 </td> 612 <td class="cellrowborder" valign="top" width="51.300000000000004%" headers="mcps1.2.3.1.2 "><p id="p1954165031214"><a name="p1954165031214"></a><a name="p1954165031214"></a>Length of the data to read.</p> 613 </td> 614 </tr> 615 <tr id="row972552281111"><td class="cellrowborder" valign="top" width="48.699999999999996%" headers="mcps1.2.3.1.1 "><p id="p2753755161114"><a name="p2753755161114"></a><a name="p2753755161114"></a>scatterLen</p> 616 </td> 617 <td class="cellrowborder" valign="top" width="51.300000000000004%" headers="mcps1.2.3.1.2 "><p id="p3541350111218"><a name="p3541350111218"></a><a name="p3541350111218"></a>Length of the scatter list. If the value is not <strong id="b498517146511"><a name="b498517146511"></a><a name="b498517146511"></a>0</strong>, the data is of the scatter list type.</p> 618 </td> 619 </tr> 620 <tr id="row15725162210117"><td class="cellrowborder" valign="top" width="48.699999999999996%" headers="mcps1.2.3.1.1 "><p id="p681073451314"><a name="p681073451314"></a><a name="p681073451314"></a><strong id="b144852215014"><a name="b144852215014"></a><a name="b144852215014"></a>Return Value</strong></p> 621 </td> 622 <td class="cellrowborder" valign="top" width="51.300000000000004%" headers="mcps1.2.3.1.2 "><p id="p17810134121316"><a name="p17810134121316"></a><a name="p17810134121316"></a><strong id="b127776221003"><a name="b127776221003"></a><a name="b127776221003"></a>Description</strong></p> 623 </td> 624 </tr> 625 <tr id="row1772511227119"><td class="cellrowborder" valign="top" width="48.699999999999996%" headers="mcps1.2.3.1.1 "><p id="p78105346133"><a name="p78105346133"></a><a name="p78105346133"></a>0</p> 626 </td> 627 <td class="cellrowborder" valign="top" width="51.300000000000004%" headers="mcps1.2.3.1.2 "><p id="p18810173411312"><a name="p18810173411312"></a><a name="p18810173411312"></a>Data is read from the SDIO device.</p> 628 </td> 629 </tr> 630 <tr id="row191829161138"><td class="cellrowborder" valign="top" width="48.699999999999996%" headers="mcps1.2.3.1.1 "><p id="p1581012340131"><a name="p1581012340131"></a><a name="p1581012340131"></a>Negative value</p> 631 </td> 632 <td class="cellrowborder" valign="top" width="51.300000000000004%" headers="mcps1.2.3.1.2 "><p id="p28101834161317"><a name="p28101834161317"></a><a name="p28101834161317"></a>Failed to read data from the SDIO device.</p> 633 </td> 634 </tr> 635 </tbody> 636 </table> 637 638 The following example shows how to read a given length of data from the fixed address of an SDIO device. 639 640 ``` 641 int32_t ret; 642 uint8_t rbuff[5] = {0}; 643 uint32_t addr = 0x100 + 0x09; 644 /* Read 5-byte data from the fixed address 0x109 of the SDIO device. */ 645 ret = SdioReadBytesFromFixedAddr(handle, rbuff, addr, 5, 0); 646 if (ret != 0) { 647 HDF_LOGE("SdioReadBytesFromFixedAddr: failed, ret %d\n", ret); 648 } 649 ``` 650 651 652- Writes a given length of data into the address space of SDIO function 0. 653 654Currently, only 1-byte data can be written. The corresponding function is as follows: 655 656int32\_t SdioWriteBytesToFunc0\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size\); 657 658**Table 10** Parameters and return values of SdioWriteBytesToFunc0 659 660<a name="table5339151811112"></a> 661<table><thead align="left"><tr id="row2033991881120"><th class="cellrowborder" valign="top" width="49.94%" id="mcps1.2.3.1.1"><p id="p1116916499117"><a name="p1116916499117"></a><a name="p1116916499117"></a>Parameter</p> 662</th> 663<th class="cellrowborder" valign="top" width="50.06%" id="mcps1.2.3.1.2"><p id="p13169174971115"><a name="p13169174971115"></a><a name="p13169174971115"></a>Description</p> 664</th> 665</tr> 666</thead> 667<tbody><tr id="row9339171871118"><td class="cellrowborder" valign="top" width="49.94%" headers="mcps1.2.3.1.1 "><p id="p16169194914117"><a name="p16169194914117"></a><a name="p16169194914117"></a>handle</p> 668</td> 669<td class="cellrowborder" valign="top" width="50.06%" headers="mcps1.2.3.1.2 "><p id="p10169114921110"><a name="p10169114921110"></a><a name="p10169114921110"></a>Device handle of an SDIO controller.</p> 670</td> 671</tr> 672<tr id="row93401118171116"><td class="cellrowborder" valign="top" width="49.94%" headers="mcps1.2.3.1.1 "><p id="p216919491118"><a name="p216919491118"></a><a name="p216919491118"></a>data</p> 673</td> 674<td class="cellrowborder" valign="top" width="50.06%" headers="mcps1.2.3.1.2 "><p id="p5169449121117"><a name="p5169449121117"></a><a name="p5169449121117"></a>Pointer to the data to write.</p> 675</td> 676</tr> 677<tr id="row534019182114"><td class="cellrowborder" valign="top" width="49.94%" headers="mcps1.2.3.1.1 "><p id="p2016934941114"><a name="p2016934941114"></a><a name="p2016934941114"></a>addr</p> 678</td> 679<td class="cellrowborder" valign="top" width="50.06%" headers="mcps1.2.3.1.2 "><p id="p8169649101112"><a name="p8169649101112"></a><a name="p8169649101112"></a>Start address where the data is written into.</p> 680</td> 681</tr> 682<tr id="row334011871113"><td class="cellrowborder" valign="top" width="49.94%" headers="mcps1.2.3.1.1 "><p id="p6169194913117"><a name="p6169194913117"></a><a name="p6169194913117"></a>size</p> 683</td> 684<td class="cellrowborder" valign="top" width="50.06%" headers="mcps1.2.3.1.2 "><p id="p71691449141119"><a name="p71691449141119"></a><a name="p71691449141119"></a>Length of the data to write.</p> 685</td> 686</tr> 687<tr id="row123407185111"><td class="cellrowborder" valign="top" width="49.94%" headers="mcps1.2.3.1.1 "><p id="p294173071617"><a name="p294173071617"></a><a name="p294173071617"></a><strong id="b848612215010"><a name="b848612215010"></a><a name="b848612215010"></a>Return Value</strong></p> 688</td> 689<td class="cellrowborder" valign="top" width="50.06%" headers="mcps1.2.3.1.2 "><p id="p39421830111616"><a name="p39421830111616"></a><a name="p39421830111616"></a><strong id="b27786221308"><a name="b27786221308"></a><a name="b27786221308"></a>Description</strong></p> 690</td> 691</tr> 692<tr id="row8950101811164"><td class="cellrowborder" valign="top" width="49.94%" headers="mcps1.2.3.1.1 "><p id="p9942730181613"><a name="p9942730181613"></a><a name="p9942730181613"></a>0</p> 693</td> 694<td class="cellrowborder" valign="top" width="50.06%" headers="mcps1.2.3.1.2 "><p id="p89421130141617"><a name="p89421130141617"></a><a name="p89421130141617"></a>Data is written into the SDIO device.</p> 695</td> 696</tr> 697<tr id="row42485216168"><td class="cellrowborder" valign="top" width="49.94%" headers="mcps1.2.3.1.1 "><p id="p1194223012167"><a name="p1194223012167"></a><a name="p1194223012167"></a>Negative value</p> 698</td> 699<td class="cellrowborder" valign="top" width="50.06%" headers="mcps1.2.3.1.2 "><p id="p19942630121617"><a name="p19942630121617"></a><a name="p19942630121617"></a>Failed to write data into the SDIO device.</p> 700</td> 701</tr> 702</tbody> 703</table> 704 705The following example shows how to write a given length of data into the address space of SDIO function 0. 706 707``` 708int32_t ret; 709uint8_t wbuff = 1; 710/* Write 1-byte data into the address 0x2 of SDIO function 0. */ 711ret = SdioWriteBytesToFunc0(handle, &wbuff, 0x2, 1); 712if (ret != 0) { 713 HDF_LOGE("SdioWriteBytesToFunc0: failed, ret %d\n", ret); 714} 715``` 716 717- Reads a given length of data from the address space of SDIO function 0. 718 719Currently, only 1-byte data can be read. The corresponding function is as follows: 720 721int32\_t SdioReadBytesFromFunc0\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size\); 722 723**Table 11** Parameters and return values of SdioReadBytesFromFunc0 724 725<a name="table1071931161814"></a> 726<table><thead align="left"><tr id="row771918171819"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p71291418171813"><a name="p71291418171813"></a><a name="p71291418171813"></a>Parameter</p> 727</th> 728<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p51291818101818"><a name="p51291818101818"></a><a name="p51291818101818"></a>Description</p> 729</th> 730</tr> 731</thead> 732<tbody><tr id="row9720113186"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p121294185189"><a name="p121294185189"></a><a name="p121294185189"></a>handle</p> 733</td> 734<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p20129141815184"><a name="p20129141815184"></a><a name="p20129141815184"></a>Device handle of an SDIO controller.</p> 735</td> 736</tr> 737<tr id="row672017114185"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p171291186185"><a name="p171291186185"></a><a name="p171291186185"></a>data</p> 738</td> 739<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p8129118171820"><a name="p8129118171820"></a><a name="p8129118171820"></a>Pointer to the data to read.</p> 740</td> 741</tr> 742<tr id="row5720910188"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p8129121816184"><a name="p8129121816184"></a><a name="p8129121816184"></a>addr</p> 743</td> 744<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p21296189182"><a name="p21296189182"></a><a name="p21296189182"></a>Start address where the data is read from.</p> 745</td> 746</tr> 747<tr id="row172020115189"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p18129418191816"><a name="p18129418191816"></a><a name="p18129418191816"></a>size</p> 748</td> 749<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p612921851820"><a name="p612921851820"></a><a name="p612921851820"></a>Length of the data to read.</p> 750</td> 751</tr> 752<tr id="row167202113189"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p1813001881810"><a name="p1813001881810"></a><a name="p1813001881810"></a><strong id="b164871218012"><a name="b164871218012"></a><a name="b164871218012"></a>Return Value</strong></p> 753</td> 754<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p1313081817184"><a name="p1313081817184"></a><a name="p1313081817184"></a><strong id="b17795221202"><a name="b17795221202"></a><a name="b17795221202"></a>Description</strong></p> 755</td> 756</tr> 757<tr id="row17720151101818"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p131307185182"><a name="p131307185182"></a><a name="p131307185182"></a>0</p> 758</td> 759<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p113019187182"><a name="p113019187182"></a><a name="p113019187182"></a>Data is read from the SDIO device.</p> 760</td> 761</tr> 762<tr id="row1972019118189"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p18130151815185"><a name="p18130151815185"></a><a name="p18130151815185"></a>Negative value</p> 763</td> 764<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p1013001861815"><a name="p1013001861815"></a><a name="p1013001861815"></a>Failed to read data from the SDIO device.</p> 765</td> 766</tr> 767</tbody> 768</table> 769 770The following example shows how to read a given length of data from the address space of SDIO function 0. 771 772``` 773int32_t ret; 774uint8_t rbuff; 775/* Read 1-byte data from the address 0x2 of SDIO function 0. */ 776ret = SdioReadBytesFromFunc0(handle, &rbuff, 0x2, 1); 777if (ret != 0) { 778 HDF_LOGE("SdioReadBytesFromFunc0: failed, ret %d\n", ret); 779} 780``` 781 782### Releasing the SDIO IRQ<a name="section1683449352"></a> 783 784After the SDIO communication, release the SDIO IRQ. 785 786int32\_t SdioReleaseIrq\(DevHandle handle\); 787 788**Table 12** Parameters and return values of SdioReleaseIrq 789 790<a name="table165006412481"></a> 791<table><thead align="left"><tr id="row15499849482"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p1549964114814"><a name="p1549964114814"></a><a name="p1549964114814"></a>Parameter</p> 792</th> 793<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p749915484816"><a name="p749915484816"></a><a name="p749915484816"></a>Description</p> 794</th> 795</tr> 796</thead> 797<tbody><tr id="row1499194104813"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p9499743481"><a name="p9499743481"></a><a name="p9499743481"></a>handle</p> 798</td> 799<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p184999434815"><a name="p184999434815"></a><a name="p184999434815"></a>Device handle of an SDIO controller.</p> 800</td> 801</tr> 802<tr id="row3499442485"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p649918414812"><a name="p649918414812"></a><a name="p649918414812"></a><strong id="b54881821905"><a name="b54881821905"></a><a name="b54881821905"></a>Return Value</strong></p> 803</td> 804<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p164991242486"><a name="p164991242486"></a><a name="p164991242486"></a><strong id="b1078062218018"><a name="b1078062218018"></a><a name="b1078062218018"></a>Description</strong></p> 805</td> 806</tr> 807<tr id="row1349919494810"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p24994484820"><a name="p24994484820"></a><a name="p24994484820"></a>0</p> 808</td> 809<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p1649920414482"><a name="p1649920414482"></a><a name="p1649920414482"></a>The SDIO IRQ is released.</p> 810</td> 811</tr> 812<tr id="row17500204154810"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p194990415489"><a name="p194990415489"></a><a name="p194990415489"></a>Negative value</p> 813</td> 814<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p74997419484"><a name="p74997419484"></a><a name="p74997419484"></a>Failed to release the SDIO IRQ.</p> 815</td> 816</tr> 817</tbody> 818</table> 819 820The following example shows how to release the SDIO IRQ. 821 822``` 823int32_t ret; 824/* Release the SDIO IRQ. */ 825ret = SdioReleaseIrq(handle); 826if (ret != 0) { 827 HDF_LOGE("SdioReleaseIrq: failed, ret %d\n", ret); 828} 829``` 830 831### Disabling the SDIO Device<a name="section15379324143611"></a> 832 833After the SDIO communication, disable the SDIO device. 834 835int32\_t SdioDisableFunc\(DevHandle handle\); 836 837**Table 13** Parameters and return values of SdioDisableFunc 838 839<a name="table25012415481"></a> 840<table><thead align="left"><tr id="row1050010474810"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p05002419488"><a name="p05002419488"></a><a name="p05002419488"></a>Parameter</p> 841</th> 842<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p17500114174811"><a name="p17500114174811"></a><a name="p17500114174811"></a>Description</p> 843</th> 844</tr> 845</thead> 846<tbody><tr id="row65001946482"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p1150054104814"><a name="p1150054104814"></a><a name="p1150054104814"></a>handle</p> 847</td> 848<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p1850014184812"><a name="p1850014184812"></a><a name="p1850014184812"></a>Device handle of an SDIO controller.</p> 849</td> 850</tr> 851<tr id="row175013494817"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p350013434816"><a name="p350013434816"></a><a name="p350013434816"></a><strong id="b1448917215019"><a name="b1448917215019"></a><a name="b1448917215019"></a>Return Value</strong></p> 852</td> 853<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p1750184104813"><a name="p1750184104813"></a><a name="p1750184104813"></a><strong id="b37811222007"><a name="b37811222007"></a><a name="b37811222007"></a>Description</strong></p> 854</td> 855</tr> 856<tr id="row1850113413481"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p11501164114818"><a name="p11501164114818"></a><a name="p11501164114818"></a>0</p> 857</td> 858<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p1550116416489"><a name="p1550116416489"></a><a name="p1550116416489"></a>The SDIO device is disabled.</p> 859</td> 860</tr> 861<tr id="row45015444817"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p7501184154816"><a name="p7501184154816"></a><a name="p7501184154816"></a>Negative value</p> 862</td> 863<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p35011040484"><a name="p35011040484"></a><a name="p35011040484"></a>Failed to disable the SDIO device.</p> 864</td> 865</tr> 866</tbody> 867</table> 868 869The following example shows how to disable the SDIO device. 870 871``` 872int32_t ret; 873/* Disable the SDIO device. */ 874ret = SdioDisableFunc(handle); 875if (ret != 0) { 876 HDF_LOGE("SdioDisableFunc: failed, ret %d\n", ret); 877} 878``` 879 880### Releasing the Exclusively Claimed Host<a name="section536018263713"></a> 881 882After the SDIO communication, release the exclusively claimed host. 883 884void SdioReleaseHost\(DevHandle handle\); 885 886**Table 14** Parameter description of SdioReleaseHost 887 888<a name="table1350214164813"></a> 889<table><thead align="left"><tr id="row6502134194814"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p18501945486"><a name="p18501945486"></a><a name="p18501945486"></a>Parameter</p> 890</th> 891<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p45028414817"><a name="p45028414817"></a><a name="p45028414817"></a>Description</p> 892</th> 893</tr> 894</thead> 895<tbody><tr id="row135027411483"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p16502174204816"><a name="p16502174204816"></a><a name="p16502174204816"></a>handle</p> 896</td> 897<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p6502164184816"><a name="p6502164184816"></a><a name="p6502164184816"></a>Device handle of an SDIO controller.</p> 898</td> 899</tr> 900</tbody> 901</table> 902 903The following example shows how to release the exclusively claimed host. 904 905``` 906SdioReleaseHost(handle); /* Release the exclusively claimed host. */ 907``` 908 909### Closing an SDIO Controller<a name="section4752739183716"></a> 910 911After the SDIO communication, close the SDIO controller. 912 913void SdioClose\(DevHandle handle\); 914 915This function releases the resources requested. 916 917**Table 15** Parameter description of SdioClose 918 919<a name="table950324124815"></a> 920<table><thead align="left"><tr id="row1050213424819"><th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.1"><p id="p18502134194818"><a name="p18502134194818"></a><a name="p18502134194818"></a>Parameter</p> 921</th> 922<th class="cellrowborder" valign="top" width="50%" id="mcps1.2.3.1.2"><p id="p2502154104813"><a name="p2502154104813"></a><a name="p2502154104813"></a>Description</p> 923</th> 924</tr> 925</thead> 926<tbody><tr id="row25035434810"><td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.1 "><p id="p175028434819"><a name="p175028434819"></a><a name="p175028434819"></a>handle</p> 927</td> 928<td class="cellrowborder" valign="top" width="50%" headers="mcps1.2.3.1.2 "><p id="p2050274194819"><a name="p2050274194819"></a><a name="p2050274194819"></a>Device handle of an SDIO controller.</p> 929</td> 930</tr> 931</tbody> 932</table> 933 934The following example shows how to close an SDIO controller. 935 936``` 937SdioClose(handle); /* Close an SDIO controller. */ 938``` 939 940## Usage Example<a name="section376910122382"></a> 941 942The following example shows how to use an SDIO device. First, open an SDIO controller whose bus number is 1, exclusively claim a host, enable the SDIO device, claim an SDIO IRQ, and then perform SDIO communication \(such as reading and writing\). After the SDIO communication, release the SDIO IRQ, disable the SDIO device, release the host, and close the SDIO controller. 943 944``` 945#include "hdf_log.h" 946#include "sdio_if.h" 947 948#define TEST_FUNC_NUM 1 /* The I/O function whose ID is 1 is used. */ 949#define TEST_FBR_BASE_ADDR 0x100 /* FBR base address of the I/O function whose ID is 1 */ 950#define TEST_ADDR_OFFSET 9 /* Address offset of the register to read or write */ 951#define TEST_DATA_LEN 3 /* Length of the data to read or write */ 952#define TEST_BLOCKSIZE 2 /* Size of a data block, in bytes */ 953 954/* Implement the SDIO IRQ function based on the application. */ 955static void SdioIrqFunc(void *data) 956{ 957 if (data == NULL) { 958 HDF_LOGE("SdioIrqFunc: data is NULL.\n"); 959 return; 960 } 961 /* You need to add specific implementations. */ 962} 963 964void SdioTestSample(void) 965{ 966 int32_t ret; 967 DevHandle handle = NULL; 968 uint8_t data[TEST_DATA_LEN] = {0}; 969 struct SdioFunctionConfig config = {1, 0x123, 0x456}; 970 uint8_t val; 971 uint32_t addr; 972 973 /* Open an SDIO controller whose bus number is 1. */ 974 handle = SdioOpen(1, &config); 975 if (handle == NULL) { 976 HDF_LOGE("SdioOpen: failed!\n"); 977 return; 978 } 979 /* Claim a host exclusively. */ 980 SdioClaimHost(handle); 981 /* Enable the SDIO device. */ 982 ret = SdioEnableFunc(handle); 983 if (ret != 0) { 984 HDF_LOGE("SdioEnableFunc: failed, ret %d\n", ret); 985 goto ENABLE_ERR; 986 } 987 /* Claim an SDIO IRQ. */ 988 ret = SdioClaimIrq(handle, SdioIrqFunc); 989 if (ret != 0) { 990 HDF_LOGE("SdioClaimIrq: failed, ret %d\n", ret); 991 goto CLAIM_IRQ_ERR; 992 } 993 /* Set the block size to 2 bytes. */ 994 ret = SdioSetBlockSize(handle, TEST_BLOCKSIZE); 995 if (ret != 0) { 996 HDF_LOGE("SdioSetBlockSize: failed, ret %d\n", ret); 997 goto COMM_ERR; 998 } 999 /* Read 3-byte data from the incremental address of an SDIO device. */ 1000 addr = TEST_FBR_BASE_ADDR * TEST_FUNC_NUM + TEST_ADDR_OFFSET; 1001 ret = SdioReadBytes(handle, data, addr, TEST_DATA_LEN); 1002 if (ret != 0) { 1003 HDF_LOGE("SdioReadBytes: failed, ret %d\n", ret); 1004 goto COMM_ERR; 1005 } 1006 /* Write 3-byte data into the incremental address of an SDIO device. */ 1007 ret = SdioWriteBytes(handle, data, addr, TEST_DATA_LEN); 1008 if (ret != 0) { 1009 HDF_LOGE("SdioWriteBytes: failed, ret %d\n", ret); 1010 goto COMM_ERR; 1011 } 1012 /* Read 1-byte data from the SDIO device. */ 1013 ret = SdioReadBytes(handle, &val, addr, 1); 1014 if (ret != 0) { 1015 HDF_LOGE("SdioReadBytes: failed, ret %d\n", ret); 1016 goto COMM_ERR; 1017 } 1018 /* Write 1-byte data into the SDIO device. */ 1019 ret = SdioWriteBytes(handle, &val, addr, 1); 1020 if (ret != 0) { 1021 HDF_LOGE("SdioWriteBytes: failed, ret %d\n", ret); 1022 goto COMM_ERR; 1023 } 1024 /* Read 3-byte data from the fixed address of an SDIO device. */ 1025 ret = SdioReadBytesFromFixedAddr(handle, data, addr, TEST_DATA_LEN, 0); 1026 if (ret != 0) { 1027 HDF_LOGE("SdioReadBytesFromFixedAddr: failed, ret %d\n", ret); 1028 goto COMM_ERR; 1029 } 1030 /* Write 1-byte data to the fixed address of an SDIO device. */ 1031 ret = SdioWriteBytesToFixedAddr(handle, data, addr, 1, 0); 1032 if (ret != 0) { 1033 HDF_LOGE("SdioWriteBytesToFixedAddr: failed, ret %d\n", ret); 1034 goto COMM_ERR; 1035 } 1036 /* Read 1-byte data from SDIO function 0. */ 1037 addr = 0x02; 1038 ret = SdioReadBytesFromFunc0(handle, &val, addr, 1); 1039 if (ret != 0) { 1040 HDF_LOGE("SdioReadBytesFromFunc0: failed, ret %d\n", ret); 1041 goto COMM_ERR; 1042 } 1043 /* Write 1-byte data into SDIO function 0. */ 1044 ret = SdioWriteBytesToFunc0(handle, &val, addr, 1); 1045 if (ret != 0) { 1046 HDF_LOGE("SdioWriteBytesToFunc0: failed, ret %d\n", ret); 1047 goto COMM_ERR; 1048 } 1049COMM_ERR: 1050 /* Release the SDIO IRQ. */ 1051 ret = SdioReleaseIrq(handle); 1052 if (ret != 0) { 1053 HDF_LOGE("SdioReleaseIrq: failed, ret %d\n", ret); 1054 } 1055CLAIM_IRQ_ERR: 1056 /* Disable the SDIO device. */ 1057 ret = SdioDisableFunc(handle); 1058 if (ret != 0) { 1059 HDF_LOGE("SdioDisableFunc: failed, ret %d\n", ret); 1060 } 1061ENABLE_ERR: 1062 /* Release the exclusively claimed host. */ 1063 SdioReleaseHost(handle); 1064 /* Close an SDIO controller. */ 1065 SdioClose(handle); 1066} 1067``` 1068 1069