• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# GPIO<a name="EN-US_TOPIC_0000001051777586"></a>
2
3-   [Overview](#section1635911016188)
4    -   [Available APIs](#section17715915181611)
5
6-   [Usage Guidelines](#section259614242196)
7    -   [How to Use](#section103477714216)
8    -   [Determining a GPIO Pin Number](#section370083272117)
9    -   [Using APIs to Operate GPIO Pins](#section13604050132118)
10
11-   [Usage Example](#section25941262111)
12
13## Overview<a name="section1635911016188"></a>
14
15Generally, a general-purpose input/output \(GPIO\) controller manages all GPIO pins by group. Each group of GPIO pins is associated with one or more registers. The GPIO pins are operated by reading data from and writing data to the registers.
16
17The GPIO APIs define a set of standard functions for performing operations on GPIO pins, including:
18
19-   Setting the pin direction, which can be input or output \(High impedance is not supported currently.\)
20
21-   Reading and writing level values, which can be low or high
22-   Setting an interrupt service routine \(ISR\) function and interrupt trigger mode for a pin
23-   Enabling or disabling a pin interrupt
24
25### Available APIs<a name="section17715915181611"></a>
26
27**Table  1**  APIs available for the GPIO driver
28
29<a name="table1731550155318"></a>
30<table><thead align="left"><tr id="row4419501537"><th class="cellrowborder" valign="top" width="19.74%" id="mcps1.2.4.1.1"><p id="p641050105320"><a name="p641050105320"></a><a name="p641050105320"></a>Capability</p>
31</th>
32<th class="cellrowborder" valign="top" width="32.36%" id="mcps1.2.4.1.2"><p id="p54150165315"><a name="p54150165315"></a><a name="p54150165315"></a>Function</p>
33</th>
34<th class="cellrowborder" valign="top" width="47.9%" id="mcps1.2.4.1.3"><p id="p941150145313"><a name="p941150145313"></a><a name="p941150145313"></a>Description</p>
35</th>
36</tr>
37</thead>
38<tbody><tr id="row34145016535"><td class="cellrowborder" rowspan="2" valign="top" width="19.74%" headers="mcps1.2.4.1.1 "><p id="p229610227124"><a name="p229610227124"></a><a name="p229610227124"></a>GPIO read/write</p>
39</td>
40<td class="cellrowborder" valign="top" width="32.36%" headers="mcps1.2.4.1.2 "><p id="p19389143041518"><a name="p19389143041518"></a><a name="p19389143041518"></a>GpioRead</p>
41</td>
42<td class="cellrowborder" valign="top" width="47.9%" headers="mcps1.2.4.1.3 "><p id="p8738101941716"><a name="p8738101941716"></a><a name="p8738101941716"></a>Reads the level value of a GPIO pin.</p>
43</td>
44</tr>
45<tr id="row5632152611414"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p143890309153"><a name="p143890309153"></a><a name="p143890309153"></a>GpioWrite</p>
46</td>
47<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p67306152404"><a name="p67306152404"></a><a name="p67306152404"></a>Writes the level value of a GPIO pin.</p>
48</td>
49</tr>
50<tr id="row17493124814141"><td class="cellrowborder" rowspan="2" valign="top" width="19.74%" headers="mcps1.2.4.1.1 "><p id="p321814526178"><a name="p321814526178"></a><a name="p321814526178"></a>GPIO settings</p>
51</td>
52<td class="cellrowborder" valign="top" width="32.36%" headers="mcps1.2.4.1.2 "><p id="p16390153015156"><a name="p16390153015156"></a><a name="p16390153015156"></a>GpioSetDir</p>
53</td>
54<td class="cellrowborder" valign="top" width="47.9%" headers="mcps1.2.4.1.3 "><p id="p1873761519408"><a name="p1873761519408"></a><a name="p1873761519408"></a>Sets the direction for a GPIO pin.</p>
55</td>
56</tr>
57<tr id="row10681146181417"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p15390153014151"><a name="p15390153014151"></a><a name="p15390153014151"></a>GpioGetDir</p>
58</td>
59<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p974061515406"><a name="p974061515406"></a><a name="p974061515406"></a>Obtains the direction for a GPIO pin.</p>
60</td>
61</tr>
62<tr id="row10288191441518"><td class="cellrowborder" rowspan="4" valign="top" width="19.74%" headers="mcps1.2.4.1.1 "><p id="p13927416134716"><a name="p13927416134716"></a><a name="p13927416134716"></a>GPIO interrupt settings</p>
63</td>
64<td class="cellrowborder" valign="top" width="32.36%" headers="mcps1.2.4.1.2 "><p id="p17390113013158"><a name="p17390113013158"></a><a name="p17390113013158"></a>GpioSetIrq</p>
65</td>
66<td class="cellrowborder" valign="top" width="47.9%" headers="mcps1.2.4.1.3 "><p id="p10314104354416"><a name="p10314104354416"></a><a name="p10314104354416"></a>Sets the ISR function for a GPIO pin.</p>
67</td>
68</tr>
69<tr id="row163795912473"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p523618345323"><a name="p523618345323"></a><a name="p523618345323"></a>GpioUnSetIrq</p>
70</td>
71<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p1138195912478"><a name="p1138195912478"></a><a name="p1138195912478"></a>Cancels the setting of the ISR function for a GPIO pin.</p>
72</td>
73</tr>
74<tr id="row155161515124816"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p657344273218"><a name="p657344273218"></a><a name="p657344273218"></a>GpioEnableIrq</p>
75</td>
76<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p115163154488"><a name="p115163154488"></a><a name="p115163154488"></a>Enables a GPIO interrupt.</p>
77</td>
78</tr>
79<tr id="row1742119174820"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p1865114616324"><a name="p1865114616324"></a><a name="p1865114616324"></a>GpioDisableIrq</p>
80</td>
81<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p97421219174820"><a name="p97421219174820"></a><a name="p97421219174820"></a>Disables a GPIO interrupt.</p>
82</td>
83</tr>
84</tbody>
85</table>
86
87>![](../public_sys-resources/icon-note.gif) **NOTE:**
88>All functions provided in this document can be called only in kernel mode.
89
90## Usage Guidelines<a name="section259614242196"></a>
91
92### How to Use<a name="section103477714216"></a>
93
94The GPIO APIs use the GPIO pin number to specify a pin.  [Figure 1](#fig1399416053717)  shows the general process of using a GPIO.
95
96**Figure  1**  Process of using a GPIO<a name="fig1399416053717"></a>
97
98
99![](figure/en-us_image_0000001170187071.png)
100
101### Determining a GPIO Pin Number<a name="section370083272117"></a>
102
103The method for converting GPIO pin numbers varies according to the GPIO controller model, parameters, and controller driver of different system on chips \(SoCs\).
104
105-   Hi3516DV300
106
107    A controller manages 12 groups of GPIO pins. Each group contains 8 GPIO pins.
108
109    GPIO pin number = GPIO group index \(0–11\) x Number of GPIO pins in each group \(8\) + Offset in the group
110
111    Example: GPIO number of GPIO10\_3 = 10 x 8 + 3 = 83
112
113-   Hi3518EV300
114
115    A controller manages 10 groups of GPIO pins. Each group contains 10 GPIO pins.
116
117    GPIO pin number = GPIO group index \(0–9\) x Number of GPIO pins in each group \(10\) + Offset in the group
118
119    Example: GPIO pin number of GPIO7\_3 = 7 x 10 + 3 = 73
120
121
122### Using APIs to Operate GPIO Pins<a name="section13604050132118"></a>
123
124-   Set the direction for a GPIO pin.
125
126    Before performing read/write operations on a GPIO pin, call the following function to set the direction:
127
128    int32\_t GpioSetDir\(uint16\_t gpio, uint16\_t dir\);
129
130    **Table  2**  Description of GpioSetDir
131
132    <a name="table63111557616"></a>
133    <table><tbody><tr id="row17311165469"><td class="cellrowborder" valign="top" width="48.120000000000005%"><p id="p53110515616"><a name="p53110515616"></a><a name="p53110515616"></a><strong id="b1142022718160"><a name="b1142022718160"></a><a name="b1142022718160"></a>Parameter</strong></p>
134    </td>
135    <td class="cellrowborder" valign="top" width="51.88%"><p id="p5311454616"><a name="p5311454616"></a><a name="p5311454616"></a><strong id="b93161228141614"><a name="b93161228141614"></a><a name="b93161228141614"></a>Description</strong></p>
136    </td>
137    </tr>
138    <tr id="row0312151666"><td class="cellrowborder" valign="top" width="48.120000000000005%"><p id="p1431265763"><a name="p1431265763"></a><a name="p1431265763"></a>gpio</p>
139    </td>
140    <td class="cellrowborder" valign="top" width="51.88%"><p id="p83121553613"><a name="p83121553613"></a><a name="p83121553613"></a>GPIO pin number.</p>
141    </td>
142    </tr>
143    <tr id="row11312151619"><td class="cellrowborder" valign="top" width="48.120000000000005%"><p id="p173121451664"><a name="p173121451664"></a><a name="p173121451664"></a>dir</p>
144    </td>
145    <td class="cellrowborder" valign="top" width="51.88%"><p id="p153122520615"><a name="p153122520615"></a><a name="p153122520615"></a>Direction to set.</p>
146    </td>
147    </tr>
148    <tr id="row165937126386"><td class="cellrowborder" valign="top" width="48.120000000000005%"><p id="p83111453613"><a name="p83111453613"></a><a name="p83111453613"></a><strong id="b42491732121614"><a name="b42491732121614"></a><a name="b42491732121614"></a>Return Value</strong></p>
149    </td>
150    <td class="cellrowborder" valign="top" width="51.88%"><p id="p83111151165"><a name="p83111151165"></a><a name="p83111151165"></a><strong id="b1116336166"><a name="b1116336166"></a><a name="b1116336166"></a>Description</strong></p>
151    </td>
152    </tr>
153    <tr id="row205931212123817"><td class="cellrowborder" valign="top" width="48.120000000000005%"><p id="p18312151463"><a name="p18312151463"></a><a name="p18312151463"></a>0</p>
154    </td>
155    <td class="cellrowborder" valign="top" width="51.88%"><p id="p103124517618"><a name="p103124517618"></a><a name="p103124517618"></a>Succeeded in setting the direction for a GPIO pin.</p>
156    </td>
157    </tr>
158    <tr id="row75931212153818"><td class="cellrowborder" valign="top" width="48.120000000000005%"><p id="p23121951261"><a name="p23121951261"></a><a name="p23121951261"></a>Negative value</p>
159    </td>
160    <td class="cellrowborder" valign="top" width="51.88%"><p id="p153121553610"><a name="p153121553610"></a><a name="p153121553610"></a>Failed to set the direction for a GPIO pin.</p>
161    </td>
162    </tr>
163    </tbody>
164    </table>
165
166
167-   Read or write the level value for a GPIO pin.
168
169    To read the level value of a GPIO pin, call the following function:
170
171    int32\_t GpioRead\(uint16\_t gpio, uint16\_t \*val\);
172
173    **Table  3**  Description of GpioRead
174
175    <a name="table20347743174816"></a>
176    <table><tbody><tr id="row17348144394816"><td class="cellrowborder" valign="top" width="48.120000000000005%"><p id="p19348164313481"><a name="p19348164313481"></a><a name="p19348164313481"></a><strong id="b4862227121610"><a name="b4862227121610"></a><a name="b4862227121610"></a>Parameter</strong></p>
177    </td>
178    <td class="cellrowborder" valign="top" width="51.88%"><p id="p134810432488"><a name="p134810432488"></a><a name="p134810432488"></a><strong id="b677332841611"><a name="b677332841611"></a><a name="b677332841611"></a>Description</strong></p>
179    </td>
180    </tr>
181    <tr id="row134874324814"><td class="cellrowborder" valign="top" width="48.120000000000005%"><p id="p183481437485"><a name="p183481437485"></a><a name="p183481437485"></a>gpio</p>
182    </td>
183    <td class="cellrowborder" valign="top" width="51.88%"><p id="p43481043194819"><a name="p43481043194819"></a><a name="p43481043194819"></a>GPIO pin number.</p>
184    </td>
185    </tr>
186    <tr id="row20348343144815"><td class="cellrowborder" valign="top" width="48.120000000000005%"><p id="p1534864310480"><a name="p1534864310480"></a><a name="p1534864310480"></a>val</p>
187    </td>
188    <td class="cellrowborder" valign="top" width="51.88%"><p id="p13689159154815"><a name="p13689159154815"></a><a name="p13689159154815"></a>Pointer to the level value.</p>
189    </td>
190    </tr>
191    <tr id="row19348043154813"><td class="cellrowborder" valign="top" width="48.120000000000005%"><p id="p1234812431480"><a name="p1234812431480"></a><a name="p1234812431480"></a><strong id="b10599632101619"><a name="b10599632101619"></a><a name="b10599632101619"></a>Return Value</strong></p>
192    </td>
193    <td class="cellrowborder" valign="top" width="51.88%"><p id="p434894334814"><a name="p434894334814"></a><a name="p434894334814"></a><strong id="b236513361617"><a name="b236513361617"></a><a name="b236513361617"></a>Description</strong></p>
194    </td>
195    </tr>
196    <tr id="row3348184311486"><td class="cellrowborder" valign="top" width="48.120000000000005%"><p id="p1934854315487"><a name="p1934854315487"></a><a name="p1934854315487"></a>0</p>
197    </td>
198    <td class="cellrowborder" valign="top" width="51.88%"><p id="p103481943114814"><a name="p103481943114814"></a><a name="p103481943114814"></a>Succeeded in reading the level value.</p>
199    </td>
200    </tr>
201    <tr id="row23485436482"><td class="cellrowborder" valign="top" width="48.120000000000005%"><p id="p1134834310486"><a name="p1134834310486"></a><a name="p1134834310486"></a>Negative value</p>
202    </td>
203    <td class="cellrowborder" valign="top" width="51.88%"><p id="p93491343144815"><a name="p93491343144815"></a><a name="p93491343144815"></a>Failed to read the level value.</p>
204    </td>
205    </tr>
206    </tbody>
207    </table>
208
209    To write the level value for a GPIO pin, call the following function:
210
211    int32\_t GpioWrite\(uint16\_t gpio, uint16\_t val\);
212
213    **Table  4**  Description of GpioWrite
214
215    <a name="table1214911207520"></a>
216    <table><tbody><tr id="row6149720175218"><td class="cellrowborder" valign="top" width="48.120000000000005%"><p id="p18149132005216"><a name="p18149132005216"></a><a name="p18149132005216"></a><strong id="b19864427181615"><a name="b19864427181615"></a><a name="b19864427181615"></a>Parameter</strong></p>
217    </td>
218    <td class="cellrowborder" valign="top" width="51.88%"><p id="p16149220145216"><a name="p16149220145216"></a><a name="p16149220145216"></a><strong id="b4774132861616"><a name="b4774132861616"></a><a name="b4774132861616"></a>Description</strong></p>
219    </td>
220    </tr>
221    <tr id="row16149102014526"><td class="cellrowborder" valign="top" width="48.120000000000005%"><p id="p31495206527"><a name="p31495206527"></a><a name="p31495206527"></a>gpio</p>
222    </td>
223    <td class="cellrowborder" valign="top" width="51.88%"><p id="p1014972085212"><a name="p1014972085212"></a><a name="p1014972085212"></a>GPIO pin number.</p>
224    </td>
225    </tr>
226    <tr id="row3149112095214"><td class="cellrowborder" valign="top" width="48.120000000000005%"><p id="p1815072011528"><a name="p1815072011528"></a><a name="p1815072011528"></a>val</p>
227    </td>
228    <td class="cellrowborder" valign="top" width="51.88%"><p id="p1931618337524"><a name="p1931618337524"></a><a name="p1931618337524"></a>Level value to write.</p>
229    </td>
230    </tr>
231    <tr id="row1115062015220"><td class="cellrowborder" valign="top" width="48.120000000000005%"><p id="p10150172015218"><a name="p10150172015218"></a><a name="p10150172015218"></a><strong id="b760183221611"><a name="b760183221611"></a><a name="b760183221611"></a>Return Value</strong></p>
232    </td>
233    <td class="cellrowborder" valign="top" width="51.88%"><p id="p1150192015527"><a name="p1150192015527"></a><a name="p1150192015527"></a><strong id="b14366123310160"><a name="b14366123310160"></a><a name="b14366123310160"></a>Description</strong></p>
234    </td>
235    </tr>
236    <tr id="row111503202526"><td class="cellrowborder" valign="top" width="48.120000000000005%"><p id="p171501320205216"><a name="p171501320205216"></a><a name="p171501320205216"></a>0</p>
237    </td>
238    <td class="cellrowborder" valign="top" width="51.88%"><p id="p15150102017522"><a name="p15150102017522"></a><a name="p15150102017522"></a>Succeeded in writing the level value.</p>
239    </td>
240    </tr>
241    <tr id="row1615002018528"><td class="cellrowborder" valign="top" width="48.120000000000005%"><p id="p15150182045212"><a name="p15150182045212"></a><a name="p15150182045212"></a>Negative value</p>
242    </td>
243    <td class="cellrowborder" valign="top" width="51.88%"><p id="p13150320105212"><a name="p13150320105212"></a><a name="p13150320105212"></a>Failed to write the level value.</p>
244    </td>
245    </tr>
246    </tbody>
247    </table>
248
249    Example:
250
251    ```
252    int32_t ret;
253    uint16_t val;
254    /* Set the output direction for GPIO3. */
255    ret = GpioSetDir(3, GPIO_DIR_OUT);
256    if (ret != 0) {
257        HDF_LOGE("GpioSerDir: failed, ret %d\n", ret);
258        return;
259    }
260    /* Write the low level GPIO_VAL_LOW for GPIO3. */
261    ret = GpioWrite(3, GPIO_VAL_LOW);
262    if (ret != 0) {
263        HDF_LOGE("GpioWrite: failed, ret %d\n", ret);
264        return;
265    }
266    /* Set the input direction for GPIO6. */
267    ret = GpioSetDir(6, GPIO_DIR_IN);
268    if (ret != 0) {
269        HDF_LOGE("GpioSetDir: failed, ret %d\n", ret);
270        return;
271    }
272    /* Read the level value of GPIO6. */
273    ret = GpioRead(6, &val);
274    ```
275
276
277-   Set the ISR function for a GPIO pin.
278
279    To set the ISR function for a GPIO pin, call the following function:
280
281    int32\_t GpioSetIrq\(uint16\_t gpio, uint16\_t mode, GpioIrqFunc func, void \*arg\);
282
283    **Table  5**  Description of GpioSetIrq
284
285    <a name="table16804111812466"></a>
286    <table><tbody><tr id="row880401834615"><td class="cellrowborder" valign="top" width="48.54%"><p id="p380491819469"><a name="p380491819469"></a><a name="p380491819469"></a><strong id="b0865192761614"><a name="b0865192761614"></a><a name="b0865192761614"></a>Parameter</strong></p>
287    </td>
288    <td class="cellrowborder" valign="top" width="51.459999999999994%"><p id="p48041318114619"><a name="p48041318114619"></a><a name="p48041318114619"></a><strong id="b1477520282162"><a name="b1477520282162"></a><a name="b1477520282162"></a>Description</strong></p>
289    </td>
290    </tr>
291    <tr id="row19805181812465"><td class="cellrowborder" valign="top" width="48.54%"><p id="p11805101874611"><a name="p11805101874611"></a><a name="p11805101874611"></a>gpio</p>
292    </td>
293    <td class="cellrowborder" valign="top" width="51.459999999999994%"><p id="p6805181818461"><a name="p6805181818461"></a><a name="p6805181818461"></a>GPIO pin number.</p>
294    </td>
295    </tr>
296    <tr id="row1080541817469"><td class="cellrowborder" valign="top" width="48.54%"><p id="p580541864611"><a name="p580541864611"></a><a name="p580541864611"></a>mode</p>
297    </td>
298    <td class="cellrowborder" valign="top" width="51.459999999999994%"><p id="p380511180463"><a name="p380511180463"></a><a name="p380511180463"></a>Interrupt trigger mode.</p>
299    </td>
300    </tr>
301    <tr id="row83541951134617"><td class="cellrowborder" valign="top" width="48.54%"><p id="p5355351104610"><a name="p5355351104610"></a><a name="p5355351104610"></a>func</p>
302    </td>
303    <td class="cellrowborder" valign="top" width="51.459999999999994%"><p id="p11355551174619"><a name="p11355551174619"></a><a name="p11355551174619"></a>ISR function to set.</p>
304    </td>
305    </tr>
306    <tr id="row6593577469"><td class="cellrowborder" valign="top" width="48.54%"><p id="p165985724619"><a name="p165985724619"></a><a name="p165985724619"></a>arg</p>
307    </td>
308    <td class="cellrowborder" valign="top" width="51.459999999999994%"><p id="p559185784619"><a name="p559185784619"></a><a name="p559185784619"></a>Pointer to the parameters passed to the ISR function.</p>
309    </td>
310    </tr>
311    <tr id="row16299193210587"><td class="cellrowborder" valign="top" width="48.54%"><p id="p7804101884614"><a name="p7804101884614"></a><a name="p7804101884614"></a><strong id="b126021932131615"><a name="b126021932131615"></a><a name="b126021932131615"></a>Return Value</strong></p>
312    </td>
313    <td class="cellrowborder" valign="top" width="51.459999999999994%"><p id="p680441818466"><a name="p680441818466"></a><a name="p680441818466"></a><strong id="b836716339162"><a name="b836716339162"></a><a name="b836716339162"></a>Description</strong></p>
314    </td>
315    </tr>
316    <tr id="row12299632125817"><td class="cellrowborder" valign="top" width="48.54%"><p id="p1180511189465"><a name="p1180511189465"></a><a name="p1180511189465"></a>0</p>
317    </td>
318    <td class="cellrowborder" valign="top" width="51.459999999999994%"><p id="p180521812465"><a name="p180521812465"></a><a name="p180521812465"></a>Succeeded in setting the ISR function for a GPIO pin.</p>
319    </td>
320    </tr>
321    <tr id="row029833235815"><td class="cellrowborder" valign="top" width="48.54%"><p id="p1080591814468"><a name="p1080591814468"></a><a name="p1080591814468"></a>Negative value</p>
322    </td>
323    <td class="cellrowborder" valign="top" width="51.459999999999994%"><p id="p18805141884611"><a name="p18805141884611"></a><a name="p18805141884611"></a>Failed to set the ISR function for a GPIO pin.</p>
324    </td>
325    </tr>
326    </tbody>
327    </table>
328
329    >![](../public_sys-resources/icon-caution.gif) **CAUTION:**
330    >Only one ISR function can be set for a GPIO pin at a time. If  **GpioSetIrq**  is called repeatedly, the previous IRS function will be replaced.
331
332    If the ISR function is no longer required, call the following function to cancel the setting:
333
334    int32\_t GpioUnSetIrq\(uint16\_t gpio\);
335
336    **Table  6**  Description of GpioUnSetIrq
337
338    <a name="table1157224664316"></a>
339    <table><tbody><tr id="row175721546174317"><td class="cellrowborder" valign="top" width="48.54%"><p id="p16572144694311"><a name="p16572144694311"></a><a name="p16572144694311"></a><strong id="b16866132761617"><a name="b16866132761617"></a><a name="b16866132761617"></a>Parameter</strong></p>
340    </td>
341    <td class="cellrowborder" valign="top" width="51.459999999999994%"><p id="p185721461435"><a name="p185721461435"></a><a name="p185721461435"></a><strong id="b1377613282167"><a name="b1377613282167"></a><a name="b1377613282167"></a>Description</strong></p>
342    </td>
343    </tr>
344    <tr id="row1257284664318"><td class="cellrowborder" valign="top" width="48.54%"><p id="p95721946144317"><a name="p95721946144317"></a><a name="p95721946144317"></a>gpio</p>
345    </td>
346    <td class="cellrowborder" valign="top" width="51.459999999999994%"><p id="p1557313464439"><a name="p1557313464439"></a><a name="p1557313464439"></a>GPIO pin number.</p>
347    </td>
348    </tr>
349    <tr id="row1857324618435"><td class="cellrowborder" valign="top" width="48.54%"><p id="p1257344624314"><a name="p1257344624314"></a><a name="p1257344624314"></a><strong id="b1160353241610"><a name="b1160353241610"></a><a name="b1160353241610"></a>Return Value</strong></p>
350    </td>
351    <td class="cellrowborder" valign="top" width="51.459999999999994%"><p id="p457384611439"><a name="p457384611439"></a><a name="p457384611439"></a><strong id="b133681833151617"><a name="b133681833151617"></a><a name="b133681833151617"></a>Description</strong></p>
352    </td>
353    </tr>
354    <tr id="row357318466439"><td class="cellrowborder" valign="top" width="48.54%"><p id="p1573164616438"><a name="p1573164616438"></a><a name="p1573164616438"></a>0</p>
355    </td>
356    <td class="cellrowborder" valign="top" width="51.459999999999994%"><p id="p857384614319"><a name="p857384614319"></a><a name="p857384614319"></a>Succeeded in canceling the ISR function.</p>
357    </td>
358    </tr>
359    <tr id="row18573124610433"><td class="cellrowborder" valign="top" width="48.54%"><p id="p165731146134311"><a name="p165731146134311"></a><a name="p165731146134311"></a>Negative value</p>
360    </td>
361    <td class="cellrowborder" valign="top" width="51.459999999999994%"><p id="p6573164613437"><a name="p6573164613437"></a><a name="p6573164613437"></a>Failed to cancel the ISR function.</p>
362    </td>
363    </tr>
364    </tbody>
365    </table>
366
367    After the ISR function is set, call the following function to enable a GPIO interrupt:
368
369    int32\_t GpioEnableIrq\(uint16\_t gpio\);
370
371    **Table  7**  Description of GpioEnableIrq
372
373    <a name="table26659291568"></a>
374    <table><tbody><tr id="row866632919566"><td class="cellrowborder" valign="top" width="50%"><p id="p066642985615"><a name="p066642985615"></a><a name="p066642985615"></a><strong id="b108661927171614"><a name="b108661927171614"></a><a name="b108661927171614"></a>Parameter</strong></p>
375    </td>
376    <td class="cellrowborder" valign="top" width="50%"><p id="p566613293568"><a name="p566613293568"></a><a name="p566613293568"></a><strong id="b10777228121617"><a name="b10777228121617"></a><a name="b10777228121617"></a>Description</strong></p>
377    </td>
378    </tr>
379    <tr id="row19666029165620"><td class="cellrowborder" valign="top" width="50%"><p id="p16660295566"><a name="p16660295566"></a><a name="p16660295566"></a>gpio</p>
380    </td>
381    <td class="cellrowborder" valign="top" width="50%"><p id="p1566632916566"><a name="p1566632916566"></a><a name="p1566632916566"></a>GPIO pin number.</p>
382    </td>
383    </tr>
384    <tr id="row84182176010"><td class="cellrowborder" valign="top" width="50%"><p id="p1566652915566"><a name="p1566652915566"></a><a name="p1566652915566"></a><strong id="b160443201612"><a name="b160443201612"></a><a name="b160443201612"></a>Return Value</strong></p>
385    </td>
386    <td class="cellrowborder" valign="top" width="50%"><p id="p966642917562"><a name="p966642917562"></a><a name="p966642917562"></a><strong id="b12369193319162"><a name="b12369193319162"></a><a name="b12369193319162"></a>Description</strong></p>
387    </td>
388    </tr>
389    <tr id="row154188171403"><td class="cellrowborder" valign="top" width="50%"><p id="p1866610292563"><a name="p1866610292563"></a><a name="p1866610292563"></a>0</p>
390    </td>
391    <td class="cellrowborder" valign="top" width="50%"><p id="p13666182975613"><a name="p13666182975613"></a><a name="p13666182975613"></a>Succeeded in enabling a GPIO interrupt.</p>
392    </td>
393    </tr>
394    <tr id="row1041891720012"><td class="cellrowborder" valign="top" width="50%"><p id="p766642911562"><a name="p766642911562"></a><a name="p766642911562"></a>Negative value</p>
395    </td>
396    <td class="cellrowborder" valign="top" width="50%"><p id="p1566652995613"><a name="p1566652995613"></a><a name="p1566652995613"></a>Failed to enable a GPIO interrupt.</p>
397    </td>
398    </tr>
399    </tbody>
400    </table>
401
402    >![](../public_sys-resources/icon-caution.gif) **CAUTION:**
403    >The configured ISR function can be responded only after the GPIO interrupt is enabled.
404
405    Use the following function to disable the GPIO interrupt:
406
407    int32\_t GpioDisableIrq\(uint16\_t gpio\);
408
409    **Table  8**  Description of GpioDisableIrq
410
411    <a name="table186682041918"></a>
412    <table><tbody><tr id="row186684413116"><td class="cellrowborder" valign="top" width="50%"><p id="p866844916"><a name="p866844916"></a><a name="p866844916"></a><strong id="b88678273169"><a name="b88678273169"></a><a name="b88678273169"></a>Parameter</strong></p>
413    </td>
414    <td class="cellrowborder" valign="top" width="50%"><p id="p46681413119"><a name="p46681413119"></a><a name="p46681413119"></a><strong id="b2077772812169"><a name="b2077772812169"></a><a name="b2077772812169"></a>Description</strong></p>
415    </td>
416    </tr>
417    <tr id="row4668243113"><td class="cellrowborder" valign="top" width="50%"><p id="p46681141919"><a name="p46681141919"></a><a name="p46681141919"></a>gpio</p>
418    </td>
419    <td class="cellrowborder" valign="top" width="50%"><p id="p136681241311"><a name="p136681241311"></a><a name="p136681241311"></a>GPIO pin number.</p>
420    </td>
421    </tr>
422    <tr id="row066884412"><td class="cellrowborder" valign="top" width="50%"><p id="p566824015"><a name="p566824015"></a><a name="p566824015"></a><strong id="b16605123251612"><a name="b16605123251612"></a><a name="b16605123251612"></a>Return Value</strong></p>
423    </td>
424    <td class="cellrowborder" valign="top" width="50%"><p id="p1766974515"><a name="p1766974515"></a><a name="p1766974515"></a><strong id="b1237063341617"><a name="b1237063341617"></a><a name="b1237063341617"></a>Description</strong></p>
425    </td>
426    </tr>
427    <tr id="row156694410112"><td class="cellrowborder" valign="top" width="50%"><p id="p14669141214"><a name="p14669141214"></a><a name="p14669141214"></a>0</p>
428    </td>
429    <td class="cellrowborder" valign="top" width="50%"><p id="p1266934818"><a name="p1266934818"></a><a name="p1266934818"></a>Succeeded in disabling a GPIO interrupt.</p>
430    </td>
431    </tr>
432    <tr id="row176691543117"><td class="cellrowborder" valign="top" width="50%"><p id="p7669941716"><a name="p7669941716"></a><a name="p7669941716"></a>Negative value</p>
433    </td>
434    <td class="cellrowborder" valign="top" width="50%"><p id="p4669164219"><a name="p4669164219"></a><a name="p4669164219"></a>Failed to disable a GPIO interrupt.</p>
435    </td>
436    </tr>
437    </tbody>
438    </table>
439
440    Example:
441
442    ```
443    /* ISR function */
444    */
445    int32_t MyCallBackFunc(uint16_t gpio, void *data)
446    {
447        HDF_LOGI("%s: gpio:%u interrupt service in! data=%p\n", __func__, gpio, data);
448        return 0;
449    }
450
451    int32_t ret;
452    /* Set the ISR function to MyCallBackFunc, the parameter to NULL, and the interrupt trigger mode to rising edge. */
453    ret = GpioSetIrq(3, OSAL_IRQF_TRIGGER_RISING, MyCallBackFunc, NULL);
454    if (ret != 0) {
455        HDF_LOGE("GpioSetIrq: failed, ret %d\n", ret);
456        return;
457    }
458
459    /* Enable an interrupt for GPIO3. */
460    ret = GpioEnableIrq(3);
461    if (ret != 0) {
462        HDF_LOGE("GpioEnableIrq: failed, ret %d\n", ret);
463        return;
464    }
465
466    /* Disable the interrupt for GPIO3. */
467    ret = GpioDisableIrq(3);
468    if (ret != 0) {
469        HDF_LOGE("GpioDisableIrq: failed, ret %d\n", ret);
470        return;
471    }
472
473    /* Cancel the ISR function for GPIO3. */
474    ret = GpioUnSetIrq(3);
475    if (ret != 0) {
476        HDF_LOGE("GpioUnSetIrq: failed, ret %d\n", ret);
477        return;
478    }
479    ```
480
481
482## Usage Example<a name="section25941262111"></a>
483
484In this example, we test the interrupt trigger of a GPIO pin as follows: Set the ISR function for the pin, set the trigger mode to rising edge and failing edge, write high and low levels to the pin alternately to generate level fluctuation, and observe the execution of the ISR function.
485
486Select an idle GPIO pin. This example uses a Hi3516D V300 development board and GPIO pin GPIO10\_3, which is numbered GPIO83.
487
488You can select an idle GPIO pin based on the development board and schematic diagram.
489
490```
491#include "gpio_if.h"
492#include "hdf_log.h"
493#include "osal_irq.h"
494#include "osal_time.h"
495
496static uint32_t g_irqCnt;
497
498/* ISR function */
499static int32_t TestCaseGpioIrqHandler(uint16_t gpio, void *data)
500{
501    HDF_LOGE("%s: irq triggered! on gpio:%u, data=%p", __func__, gpio, data);
502    g_irqCnt++; /* If the ISR function is triggered, the number of global interrupts is incremented by 1. */
503    return GpioDisableIrq(gpio);
504}
505
506/* Test case function */
507static int32_t TestCaseGpioIrqEdge(void)
508{
509    int32_t ret;
510    uint16_t valRead;
511    uint16_t mode;
512    uint16_t gpio = 83; /* Number of the GPIO pin to test */
513    uint32_t timeout;
514
515    /* Set the output direction for the pin. */
516    ret = GpioSetDir(gpio, GPIO_DIR_OUT);
517    if (ret != HDF_SUCCESS) {
518        HDF_LOGE("%s: set dir fail! ret:%d\n", __func__, ret);
519        return ret;
520    }
521
522    /* Disable the interrupt of the pin. */
523    ret = GpioDisableIrq(gpio);
524    if (ret != HDF_SUCCESS) {
525        HDF_LOGE("%s: disable irq fail! ret:%d\n", __func__, ret);
526        return ret;
527    }
528
529    /* Set the ISR function for the pin. The trigger mode is both rising edge and falling edge. */
530    mode = OSAL_IRQF_TRIGGER_RISING | OSAL_IRQF_TRIGGER_FALLING;
531    HDF_LOGE("%s: mode:%0x\n", __func__, mode);
532    ret = GpioSetIrq(gpio, mode, TestCaseGpioIrqHandler, NULL);
533    if (ret != HDF_SUCCESS) {
534        HDF_LOGE("%s: set irq fail! ret:%d\n", __func__, ret);
535        return ret;
536    }
537
538    /* Enable the interrupt for this pin. */
539    ret = GpioEnableIrq(gpio);
540    if (ret != HDF_SUCCESS) {
541        HDF_LOGE("%s: enable irq fail! ret:%d\n", __func__, ret);
542        (void)GpioUnSetIrq(gpio);
543        return ret;
544    }
545
546    g_irqCnt = 0; /* Reset the global counter. */
547    timeout = 0;  /* Reset the waiting time. */
548    /* Wait for the ISR function of this pin to trigger. The timeout duration is 1000 ms. */
549    while (g_irqCnt <= 0 && timeout < 1000) {
550        (void)GpioRead(gpio, &valRead);
551        (void)GpioWrite(gpio, (valRead == GPIO_VAL_LOW) ? GPIO_VAL_HIGH : GPIO_VAL_LOW);
552        HDF_LOGE("%s: wait irq timeout:%u\n", __func__, timeout);
553        OsalMDelay(200); /* wait for irq trigger */
554        timeout += 200;
555    }
556    (void)GpioUnSetIrq(gpio);
557    return (g_irqCnt > 0) ? HDF_SUCCESS : HDF_FAILURE;
558}
559```
560
561