1# SDIO<a name="ZH-CN_TOPIC_0000001053055057"></a> 2 3- [概述](#section1155271783811) 4 - [接口说明](#section08064247248) 5 6- [使用指导](#section1878939192515) 7 - [使用流程](#section1490685512255) 8 - [打开SDIO控制器](#section10782428132616) 9 - [独占HOST](#section11263172312715) 10 - [使能SDIO设备](#section17861486271) 11 - [注册SDIO中断](#section521213262286) 12 - [进行SDIO通信](#section85661522153420) 13 - [释放SDIO中断](#section1683449352) 14 - [去使能SDIO设备](#section15379324143611) 15 - [释放HOST](#section536018263713) 16 - [关闭SDIO控制器](#section4752739183716) 17 18- [使用实例](#section376910122382) 19 20## 概述<a name="section1155271783811"></a> 21 22- SDIO是安全数字输入输出接口(Secure Digital Input and Output)的缩写,是从SD内存卡接口的基础上演化出来的一种外设接口。SDIO接口兼容以前的SD内存卡,并且可以连接支持SDIO接口的设备。 23- SDIO的应用比较广泛,目前,有许多手机都支持SDIO功能,并且很多SDIO外设也被开发出来,使得手机外接外设更加容易。常见的SDIO外设有WLAN、GPS、CAMERA、蓝牙等。 24- SDIO总线有两端,其中一端是主机端(HOST),另一端是设备端(DEVICE)。所有的通信都是由HOST端发出命令开始的,在DEVICE端只要能解析HOST的命令,就可以同HOST进行通信了。SDIO的HOST可以连接多个DEVICE,如下图所示: 25 26 - CLK信号:HOST给DEVICE的时钟信号。 27 - VDD信号:电源信号。 28 - VSS信号:Ground信号。 29 - D0-3信号:4条数据线,其中,DAT1信号线复用为中断线,在1BIT模式下DAT0用来传输数据,在4BIT模式下DAT0-DAT3用来传输数据。 30 - CMD信号:用于HOST发送命令和DEVICE回复响应。 31 32 **图 1** SDIO的HOST-DEVICE连接示意图<a name="fig1185316527498"></a> 33 34 35  36 37- SDIO接口定义了操作SDIO的通用方法集合,包括打开/关闭SDIO控制器、独占/释放HOST、使能/去使能设备、申请/释放中断、读写、获取/设置公共信息等。 38 39### 接口说明<a name="section08064247248"></a> 40 41**表 1** SDIO驱动API接口功能介绍 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>功能分类</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>接口名</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>描述</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设备打开/关闭接口</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>打开指定总线号的SDIO控制器</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>关闭SDIO控制器</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读写接口</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>从指定地址开始,增量读取指定长度的数据</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>从指定地址开始,增量写入指定长度的数据</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>从固定地址读取指定长度的数据</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>向固定地址写入指定长度的数据</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>从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>向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设置块大小接口</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>设置块的大小</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获取/设置公共信息接口</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>获取公共信息</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>设置公共信息</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刷新数据接口</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>刷新数据</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接口</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>独占Host</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>释放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使能/去使能功能设备接口</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>使能SDIO功能设备</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>去使能SDIO功能设备</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申请/释放中断接口</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>申请中断</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>释放中断</p> 156</td> 157</tr> 158</tbody> 159</table> 160 161> **说明:** 162>本文涉及的所有接口,目前只支持在内核态使用,不支持在用户态使用。 163 164## 使用指导<a name="section1878939192515"></a> 165 166### 使用流程<a name="section1490685512255"></a> 167 168使用SDIO的一般流程如[图2](#fig1343742311264)所示。 169 170**图 2** SDIO使用流程图<a name="fig1343742311264"></a> 171 172 173 174 175### 打开SDIO控制器<a name="section10782428132616"></a> 176 177在使用SDIO进行通信前,首先要调用SdioOpen获取SDIO控制器的设备句柄,该函数会返回指定总线号的SDIO控制器的设备句柄。 178 179DevHandle SdioOpen\(int16\_t mmcBusNum, struct SdioFunctionConfig \*config\); 180 181**表 2** 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>参数</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>参数描述</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>总线号</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功能配置信息</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="b537017416272"><a name="b537017416272"></a><a name="b537017416272"></a>返回值</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="b1370134122712"><a name="b1370134122712"></a><a name="b1370134122712"></a>返回值描述</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>获取SDIO控制器的设备句柄失败</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>设备句柄</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>SDIO控制器的设备句柄</p> 213</td> 214</tr> 215</tbody> 216</table> 217 218打开SDIO控制器的示例如下: 219 220``` 221DevHandle handle = NULL; 222struct SdioFunctionConfig config; 223config.funcNr = 1; 224config.vendorId = 0x123; 225config.deviceId = 0x456; 226/* 打开总线号为1的SDIO控制器 */ 227handle = SdioOpen(1, &config); 228if (handle == NULL) { 229 HDF_LOGE("SdioOpen: failed!\n"); 230} 231``` 232 233### 独占HOST<a name="section11263172312715"></a> 234 235获取到SDIO控制器的设备句柄之后,需要先独占HOST才能进行SDIO后续的一系列操作,独占HOST函数如下所示: 236 237void SdioClaimHost\(DevHandle handle\); 238 239**表 3** 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>参数</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>参数描述</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>SDIO控制器的设备句柄</p> 251</td> 252</tr> 253</tbody> 254</table> 255 256独占HOST示例如下: 257 258``` 259SdioClaimHost(handle); /* 独占HOST */ 260``` 261 262### 使能SDIO设备<a name="section17861486271"></a> 263 264在访问寄存器之前,需要先使能SDIO设备,使能SDIO设备的函数如下所示: 265 266int32\_t SdioEnableFunc\(DevHandle handle\); 267 268**表 4** 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>参数</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>参数描述</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>SDIO控制器的设备句柄</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="b348754124819"><a name="b348754124819"></a><a name="b348754124819"></a>返回值</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="b134877434810"><a name="b134877434810"></a><a name="b134877434810"></a>返回值描述</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>SDIO使能成功</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>负数</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>SDIO使能失败</p> 295</td> 296</tr> 297</tbody> 298</table> 299 300使能SDIO设备的示例如下: 301 302``` 303int32_t ret; 304/* 使能SDIO设备 */ 305ret = SdioEnableFunc(handle); 306if (ret != 0) { 307 HDF_LOGE("SdioEnableFunc: failed, ret %d\n", ret); 308} 309``` 310 311### 注册SDIO中断<a name="section521213262286"></a> 312 313在通信之前,还需要注册SDIO中断,注册SDIO中断函数如下图所示: 314 315int32\_t SdioClaimIrq\(DevHandle handle, SdioIrqHandler \*handler\); 316 317**表 5** 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>参数</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>参数描述</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>SDIO控制器的设备句柄</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>中断服务函数指针</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="b1448911410486"><a name="b1448911410486"></a><a name="b1448911410486"></a>返回值</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="b13489104164810"><a name="b13489104164810"></a><a name="b13489104164810"></a>返回值描述</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>注册中断成功</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>负数</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>注册中断失败</p> 349</td> 350</tr> 351</tbody> 352</table> 353 354注册SDIO中的示例如下: 355 356``` 357/* 中断服务函数需要根据各自平台的情况去实现 */ 358static void SdioIrqFunc(void *data) 359{ 360 if (data == NULL) { 361 HDF_LOGE("SdioIrqFunc: data is NULL.\n"); 362 return; 363 } 364 /* 需要开发者自行添加具体实现 */ 365} 366 367int32_t ret; 368/* 注册SDIO中断 */ 369ret = SdioClaimIrq(handle, SdioIrqFunc); 370if (ret != 0) { 371 HDF_LOGE("SdioClaimIrq: failed, ret %d\n", ret); 372} 373``` 374 375### 进行SDIO通信<a name="section85661522153420"></a> 376 377- 向SDIO设备增量写入指定长度的数据 378 379对应的接口函数如下所示: 380 381int32\_t SdioWriteBytes\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size\); 382 383**表 6** 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>参数</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>参数描述</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>SDIO控制器的设备句柄</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>待写入数据的指针</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>待写入数据的起始地址</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>待写入数据的长度</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="b169231220183618"><a name="b169231220183618"></a><a name="b169231220183618"></a>返回值</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="b9924152013365"><a name="b9924152013365"></a><a name="b9924152013365"></a>返回值描述</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>SDIO写数据成功</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>负数</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>SDIO写数据失败</p> 425</td> 426</tr> 427</tbody> 428</table> 429 430向SDIO设备增量写入指定长度的数据的示例如下: 431 432``` 433int32_t ret; 434uint8_t wbuff[] = {1,2,3,4,5}; 435uint32_t addr = 0x100 + 0x09; 436/* 向SDIO设备起始地址0x109,增量写入5个字节的数据 */ 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- 从SDIO设备增量读取指定长度的数据 444 445对应的接口函数如下所示: 446 447int32\_t SdioReadBytes\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size\); 448 449**表 7** 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>参数</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>参数描述</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>SDIO控制器的设备句柄</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>接收读取数据的指针</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>待读取数据的起始地址</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>待读取数据的长度</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="b122757566365"><a name="b122757566365"></a><a name="b122757566365"></a>返回值</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="b15276185619361"><a name="b15276185619361"></a><a name="b15276185619361"></a>返回值描述</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>SDIO读数据成功</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>负数</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>SDIO读数据失败</p> 491</td> 492</tr> 493</tbody> 494</table> 495 496从SDIO设备增量读取指定长度的数据的示例如下: 497 498``` 499int32_t ret; 500uint8_t rbuff[5] = {0}; 501uint32_t addr = 0x100 + 0x09; 502/* 从SDIO设备起始地址0x109,增量读取5个字节的数据 */ 503ret = SdioReadBytes(handle, rbuff, addr, 5); 504if (ret != 0) { 505 HDF_LOGE("SdioReadBytes: failed, ret %d\n", ret); 506} 507``` 508 509- 向SDIO设备的固定地址写入指定长度的数据 510 511 对应的接口函数如下所示: 512 513 int32\_t SdioWriteBytesToFixedAddr\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size, uint32\_t scatterLen\); 514 515 **表 8** 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>参数</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>参数描述</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>SDIO控制器的设备句柄</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>待写入数据的指针</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>待写入数据的固定地址</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>待写入数据的长度</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>集散表的长度。如果该字段不为0,则data为集散表类型。</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="b621312451720"><a name="b621312451720"></a><a name="b621312451720"></a>返回值</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="b221311451226"><a name="b221311451226"></a><a name="b221311451226"></a>返回值描述</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>SDIO写数据成功</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>负数</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>SDIO写数据失败</p> 562 </td> 563 </tr> 564 </tbody> 565 </table> 566 567 向SDIO设备的固定地址写入指定长度的数据的示例如下: 568 569 ``` 570 int32_t ret; 571 uint8_t wbuff[] = {1,2,3,4,5}; 572 uint32_t addr = 0x100 + 0x09; 573 /* 向SDIO设备固定地址0x109写入5个字节的数据 */ 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- 从SDIO设备的固定地址读取指定长度的数据 581 582 对应的接口函数如下所示: 583 584 int32\_t SdioReadBytesFromFixedAddr\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size, uint32\_t scatterLen\); 585 586 **表 9** 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>参数</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>参数描述</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>SDIO控制器的设备句柄</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>接收读取数据的指针</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>待读取数据的起始地址</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>待读取数据的长度</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>集散表的长度。如果该字段不为0,则data为集散表类型。</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="b118106344137"><a name="b118106344137"></a><a name="b118106344137"></a>返回值</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="b281014341134"><a name="b281014341134"></a><a name="b281014341134"></a>返回值描述</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>SDIO读数据成功</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>负数</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>SDIO读数据失败</p> 633 </td> 634 </tr> 635 </tbody> 636 </table> 637 638 从SDIO设备的固定地址读取指定长度的数据的示例如下: 639 640 ``` 641 int32_t ret; 642 uint8_t rbuff[5] = {0}; 643 uint32_t addr = 0x100 + 0x09; 644 /* 从SDIO设备固定地址0x109中读取5个字节的数据 */ 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- 向SDIO function 0的指定地址空间写入指定长度的数据 653 654当前只支持写入一个字节的数据,对应的接口函数如下所示: 655 656int32\_t SdioWriteBytesToFunc0\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size\); 657 658**表 10** 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>参数</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>参数描述</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>SDIO控制器的设备句柄</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>待写入数据的指针</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>待写入数据的起始地址</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>待写入数据的长度</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="b1294103061611"><a name="b1294103061611"></a><a name="b1294103061611"></a>返回值</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="b179429301164"><a name="b179429301164"></a><a name="b179429301164"></a>返回值描述</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>SDIO写数据成功</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>负数</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>SDIO写数据失败</p> 700</td> 701</tr> 702</tbody> 703</table> 704 705向SDIO function 0的指定地址空间写入指定长度的数据的示例如下: 706 707``` 708int32_t ret; 709uint8_t wbuff = 1; 710/* 向SDIO function 0地址0x2中写入1字节的数据 */ 711ret = SdioWriteBytesToFunc0(handle, &wbuff, 0x2, 1); 712if (ret != 0) { 713 HDF_LOGE("SdioWriteBytesToFunc0: failed, ret %d\n", ret); 714} 715``` 716 717- 从SDIO function 0的指定地址空间读取指定长度的数据 718 719当前只支持读取一个字节的数据,对应的接口函数如下所示: 720 721int32\_t SdioReadBytesFromFunc0\(DevHandle handle, uint8\_t \*data, uint32\_t addr, uint32\_t size\); 722 723**表 11** 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>参数</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>参数描述</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>SDIO控制器的设备句柄</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>接收读取数据的指针</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>待读取数据的起始地址</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>待读取数据的长度</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="b1130151841813"><a name="b1130151841813"></a><a name="b1130151841813"></a>返回值</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="b19130141818183"><a name="b19130141818183"></a><a name="b19130141818183"></a>返回值描述</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>SDIO读数据成功</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>负数</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>SDIO读数据失败</p> 765</td> 766</tr> 767</tbody> 768</table> 769 770从SDIO function 0的指定地址空间读取指定长度的数据的示例如下: 771 772``` 773int32_t ret; 774uint8_t rbuff; 775/* 从SDIO function 0设备地址0x2中读取1字节的数据 */ 776ret = SdioReadBytesFromFunc0(handle, &rbuff, 0x2, 1); 777if (ret != 0) { 778 HDF_LOGE("SdioReadBytesFromFunc0: failed, ret %d\n", ret); 779} 780``` 781 782### 释放SDIO中断<a name="section1683449352"></a> 783 784通信完成之后,需要释放SDIO中断,函数如下所示: 785 786int32\_t SdioReleaseIrq\(DevHandle handle\); 787 788**表 12** 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>参数</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>参数描述</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>SDIO控制器的设备句柄</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="b154993419486"><a name="b154993419486"></a><a name="b154993419486"></a>返回值</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="b174998413486"><a name="b174998413486"></a><a name="b174998413486"></a>返回值描述</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>释放SDIO中断成功</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>负数</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>释放SDIO中断失败</p> 815</td> 816</tr> 817</tbody> 818</table> 819 820释放SDIO中断的示例如下: 821 822``` 823int32_t ret; 824/* 释放SDIO中断 */ 825ret = SdioReleaseIrq(handle); 826if (ret != 0) { 827 HDF_LOGE("SdioReleaseIrq: failed, ret %d\n", ret); 828} 829``` 830 831### 去使能SDIO设备<a name="section15379324143611"></a> 832 833通信完成之后,还需要去使能SDIO设备,函数如下所示: 834 835int32\_t SdioDisableFunc\(DevHandle handle\); 836 837**表 13** 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>参数</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>参数描述</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>SDIO控制器的设备句柄</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="b15001442488"><a name="b15001442488"></a><a name="b15001442488"></a>返回值</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="b125007414481"><a name="b125007414481"></a><a name="b125007414481"></a>返回值描述</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>去使能SDIO设备成功</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>负数</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>去使能SDIO设备失败</p> 864</td> 865</tr> 866</tbody> 867</table> 868 869去使能SDIO设备的示例如下: 870 871``` 872int32_t ret; 873/* 去使能SDIO设备 */ 874ret = SdioDisableFunc(handle); 875if (ret != 0) { 876 HDF_LOGE("SdioDisableFunc: failed, ret %d\n", ret); 877} 878``` 879 880### 释放HOST<a name="section536018263713"></a> 881 882通信完成之后,还需要释放去HOST,函数如下所示: 883 884void SdioReleaseHost\(DevHandle handle\); 885 886**表 14** 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>参数</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>参数描述</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>SDIO控制器的设备句柄</p> 898</td> 899</tr> 900</tbody> 901</table> 902 903释放HOST的示例如下: 904 905``` 906SdioReleaseHost(handle); /* 释放HOST */ 907``` 908 909### 关闭SDIO控制器<a name="section4752739183716"></a> 910 911SDIO通信完成之后,最后需要关闭SDIO控制器,函数如下所示: 912 913void SdioClose\(DevHandle handle\); 914 915该函数会释放掉申请的资源。 916 917**表 15** 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>参数</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>参数描述</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>SDIO控制器的设备句柄</p> 929</td> 930</tr> 931</tbody> 932</table> 933 934关闭SDIO控制器的示例如下: 935 936``` 937SdioClose(handle); /* 关闭SDIO控制器 */ 938``` 939 940## 使用实例<a name="section376910122382"></a> 941 942SDIO设备完整的使用示例如下所示,首先打开总线号为1的SDIO控制器,然后独占HOST、使能设备、注册中断,接着进行SDIO通信(读写等),通信完成之后,释放中断、去使能设备、释放HOST,最后关闭SDIO控制器。 943 944``` 945#include "hdf_log.h" 946#include "sdio_if.h" 947 948#define TEST_FUNC_NUM 1 /* 本测试用例中,使用编号为1的I/O function */ 949#define TEST_FBR_BASE_ADDR 0x100 /* 编号为1的I/O function的FBR基地址 */ 950#define TEST_ADDR_OFFSET 9 /* 本测试用例中,需要读写的寄存器的地址偏移 */ 951#define TEST_DATA_LEN 3 /* 本测试用例中,读写数据的长度 */ 952#define TEST_BLOCKSIZE 2 /* 本测试用例中,数据块的大小,单位字节 */ 953 954/* 中断服务函数,需要根据各自平台的情况去实现 */ 955static void SdioIrqFunc(void *data) 956{ 957 if (data == NULL) { 958 HDF_LOGE("SdioIrqFunc: data is NULL.\n"); 959 return; 960 } 961 /* 需要开发者自行添加具体的实现 */ 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 /* 打开总线号为1的SDIO设备 */ 974 handle = SdioOpen(1, &config); 975 if (handle == NULL) { 976 HDF_LOGE("SdioOpen: failed!\n"); 977 return; 978 } 979 /* 独占HOST */ 980 SdioClaimHost(handle); 981 /* 使能SDIO设备 */ 982 ret = SdioEnableFunc(handle); 983 if (ret != 0) { 984 HDF_LOGE("SdioEnableFunc: failed, ret %d\n", ret); 985 goto ENABLE_ERR; 986 } 987 /* 注册中断 */ 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 /* 设置块大小为2字节 */ 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 /* 从SDIO设备增量地址读取3字节的数据 */ 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 /* 向SDIO设备增量地址写入3字节的数据 */ 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 /* 从SDIO设备读取1字节的数据 */ 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 /* 向SDIO设备写入1字节的数据 */ 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 /* 从SDIO设备固定地址读取3字节的数据 */ 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 /* 向SDIO设备固定地址写入1字节的数据 */ 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 /* 从SDIO function 0读取1字节的数据 */ 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 /* 向SDIO function 0写入1字节的数据 */ 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 /* 释放中断 */ 1051 ret = SdioReleaseIrq(handle); 1052 if (ret != 0) { 1053 HDF_LOGE("SdioReleaseIrq: failed, ret %d\n", ret); 1054 } 1055CLAIM_IRQ_ERR: 1056 /* 去使能SDIO设备 */ 1057 ret = SdioDisableFunc(handle); 1058 if (ret != 0) { 1059 HDF_LOGE("SdioDisableFunc: failed, ret %d\n", ret); 1060 } 1061ENABLE_ERR: 1062 /* 释放HOST */ 1063 SdioReleaseHost(handle); 1064 /* 关闭SDIO设备 */ 1065 SdioClose(handle); 1066} 1067``` 1068 1069