铭一 發表於 2023-8-21 00:00:00

Linux中gpio接口的使用方法示例

<p>
        <span><strong>前言</strong></span></p>
<p>
        Linux内核中gpio是最简单,最常用的资源(和 interrupt ,dma,timer一样)驱动程序,应用程序都能够通过相应的接口使用gpio,gpio使用0~MAX_INT之间的整数标识,不能使用负数,gpio与硬件体系密切相关的,不过linux有一个框架处理gpio,能够使用统一的接口来操作gpio.在讲gpio核心(gpiolib.c)之前先来看看gpio是怎么使用的</p>
<p>
        <span><strong>使用gpio</strong></span></p>
<p>
        使用gpio接口需要包含<code>#include &lt;linux/gpio.h&gt;</code> ,在驱动中使用延时函数mdelay,需要包含<code>#include &lt;linux/delay.h&gt;</code>文件,Documentation/gpio.txt文件有作详细说明。</p>
<p>
        判断一个IO是否合法:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_296896">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">int gpio_is_valid(int number);</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        设置GPIO的方向,如果是输出同时设置电平:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_308180">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">/* </code><code class="bash functions">set</code> <code class="bash plain">as input or output, returning 0 or negative errno */</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">int gpio_direction_input(unsigned gpio);</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash plain">int gpio_direction_output(unsigned gpio, int value);</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        获取输入引脚的电平:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_921795">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">/* GPIO INPUT: </code><code class="bash keyword">return</code> <code class="bash plain">zero or nonzero */</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">int gpio_get_value(unsigned gpio);</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                         </div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash plain">/* GPIO OUTPUT */</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="bash plain">void gpio_set_value(unsigned gpio, int value);</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                         </div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="bash plain">int gpio_cansleep(unsigned gpio);</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                         </div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="bash plain">/* GPIO INPUT: </code><code class="bash keyword">return</code> <code class="bash plain">zero or nonzero, might </code><code class="bash functions">sleep</code> <code class="bash plain">*/</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="bash plain">int gpio_get_value_cansleep(unsigned gpio);</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                         </div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="bash plain">/* GPIO OUTPUT, might </code><code class="bash functions">sleep</code> <code class="bash plain">*/</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="bash plain">void gpio_set_value_cansleep(unsigned gpio, int value);</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        获取一个GPIO并声明标签:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_942004">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">/* request GPIO, returning 0 or negative errno.</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">* non-null labels may be useful </code><code class="bash keyword">for</code> <code class="bash plain">diagnostics.</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash plain">*/</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash plain">int gpio_request(unsigned gpio, const char *label);</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                         </div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="bash plain">/* release previously-claimed GPIO */</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="bash plain">void gpio_free(unsigned gpio);</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        将GPIO映射为IRQ中断:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_895112">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash plain">/* map GPIO numbers to IRQ numbers */</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">int gpio_to_irq(unsigned gpio);</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                         </div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash plain">/* map IRQ numbers to GPIO numbers (avoid using this) */</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="bash plain">int irq_to_gpio(unsigned irq);</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        设置GPIO的IRQ中断类型:</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_40500">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash keyword">if</code> <code class="bash plain">(!sw-&gt;both_edges) {</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash keyword">if</code> <code class="bash plain">(gpio_get_value(sw-&gt;gpio)) {</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">set_irq_type(gpio_to_irq(sw-&gt;gpio), IRQ_TYPE_EDGE_FALLING);</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">} </code><code class="bash keyword">else</code> <code class="bash plain">{</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">set_irq_type(gpio_to_irq(sw-&gt;gpio), IRQ_TYPE_EDGE_RISING);</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">}</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="bash plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        参考文章</p>
<p>
        Linux中的gpio口使用方法</p>
<p>
        <span><strong>总结</strong></span></p>
<p>
        以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。</p>
<p>
        原文链接:https://segmentfault.com/a/1190000011838979</p>
頁: [1]
查看完整版本: Linux中gpio接口的使用方法示例