linux/Documentation/zh_CN/gpio.txt
<<
n> 2" /spa3.1 2" /form.1 2" a n> 2" href="../linux+v3.7.3/Documenta="v3/zh_CN/gpio.txt">n> 2" img src="../.sta="c/gfx/right.png" alt=">>">n> /spa3.1n> spa3 class="lxr_search">n> n> 2" input typ8.1hidden" nam8.1navtarget" v3.18.1">n> 2" input typ8.1text" nam8.1search" id.1search">n> 2" butt typ8.1submit">Search spa3 class="lxr_prefs".1 2" a href="+prefs?return=Documenta="v3/zh_CN/gpio.txt"n> 2" onclick="return ajax_prefs();">n> 2"Prefs1 2" /a>n> /spa3.1 2" " /div.1 2" " form ac="v3="ajax+*" method="post" onsubmit="return false;">n> input typ8.1hidden" nam8.1ajax_lookup" id.1ajax_lookup" v3.18.1">n 2" " /form.1n 2" " div class="headingbott m">" "1 /a>Chinese translated vers> of Documenta="v3/gpio.txt " "2 /a>n" "3 /a>If you have any comment or update to the content, please contac= then" "4 /a>original document maintainer directly. However, if you have a problemn" "5 /a>communica="ng in English you ca3 also ask the Chinese maintainer forn" "6 /a>help. Contac= the Chinese maintainer if this translat> is outdatedn" "7 /a>or if there is a problem with the translat> .n" "8 /a>n" "9 /a>Maintainer: Grant Likely <grant.likely@secretlab.ca>n" vala> Linus Walleij <linus.walleij@linaro.org>n" 11 /a>Chinese maintainer: Fu Wei <tekkamanninja@gmail.com>n" 12 /a>---------------------------------------------------------------------n" 13 /a>Documenta="v3/gpio.txt 的中文翻译n" 14 /a>n" 15 /a>如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文n" 16 /a>交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻n" 17 /a>译存在问题,请联系中文版维护者。n" 18 /a>英文版维护者: Grant Likely <grant.likely@secretlab.ca>n" 19ala> Linus Walleij <linus.walleij@linaro.org>n" 20 /a>中文版维护者: 傅炜 Fu Wei <tekkamanninja@gmail.com>n" 21 /a>中文版翻译者: 傅炜 Fu Wei <tekkamanninja@gmail.com>n" 22 /a>中文版校译者: 傅炜 Fu Wei <tekkamanninja@gmail.com>n" 23 /a>n" 24 /a>n" 25 /a>以下为正文n" 26 /a>---------------------------------------------------------------------n" 27 /a>GPIO 接口n" 28 /a>n" 29 /a>本文档提供了一个在Linux下访问GPIO的公约概述。n" 30 /a>n" 31 /a>这些函数以 gpio_* 作为前缀。其他的函数不允许使用这样的前缀或相关的n" 32 /a>__gpio_* 前缀。n" 33 /a>n" 34 /a>n" 35 /a>什么是GPIO?n" 36 /a>==========n" 37 /a>"通用输入/输出口"(GPIO)是一个灵活的由软件控制的数字信号。他们可n" 38 /a>由多种芯片提供,且对于从事嵌入式和定制硬件的 Linux 开发者来说是n" 39 /a>比较熟悉。每个GPIO 都代表一个连接到特定引脚或球栅阵列(BGA)封装中n" 40 /a>“球珠”的一个位。电路板原理图显示了 GPIO 与外部硬件的连接关系。n" 41 /a>驱动可以编写成通用代码,以使板级启动代码可传递引脚配置数据给驱动。n" 42 /a>n" 43 /a>片上系统 (SOC) 处理器对 GPIO 有很大的依赖。在某些情况下,每个n" 44 /a>非专用引脚都可配置为 GPIO,且大多数芯片都最少有一些 GPIO。n" 45 /a>可编程逻辑器件(类似 FPGA) 可以方便地提供 GPIO。像电源管理和n" 46 /a>音频编解码器这样的多功能芯片经常留有一些这样的引脚来帮助那些引脚n" 47 /a>匮乏的 SOC。同时还有通过 I2C 或 SPI 串行总线连接的“GPIO扩展器”n" 48 /a>芯片。大多数 PC 的南桥有一些拥有 GPIO 能力的引脚 (只有BIOSn" 49 /a>固件才知道如何使用他们)。n" 50 /a>n" 51 /a>GPIO 的实际功能因系统而异。通常用法有:n" 52 /a>n" 53ala> - 输出值可写 (高电平=1,低电平=0)。一些芯片也有如何驱动这些值的选项,n" 54ala> 例如只允许输出一个值、支持“线与”及其他取值类似的模式(值得注意的是n" 55ala> “开漏”信号)n" 56 /a>n" 57ala> - 输入值可读(1、0)。一些芯片支持引脚在配置为“输出”时回读,这对于类似n" 58ala> “线与”的情况(以支持双向信号)是非常有用的。GPIO 控制器可能有输入n" 59ala> 去毛刺/消抖逻辑,这有时需要软件控制。n" 60 /a>n" 61ala> - 输入通常可作为 IRQ 信号,一般是沿触发,但有时是电平触发。这样的 IRQn" 62ala> 可能配置为系统唤醒事件,以将系统从低功耗状态下唤醒。n" 63 /a>n" 64ala> - 通常一个 GPIO 根据不同产品电路板的需求,可以配置为输入或输出,也有仅n" 65ala> 支持单向的。n" 66 /a>n" 67ala> - 大部分 GPIO 可以在持有自旋锁时访问,但是通常由串行总线扩展的 GPIOn" 68ala> 不允许持有自旋锁。但某些系统也支持这种类型。n" 69 /a>n" 70 /a>对于给定的电路板,每个 GPIO 都用于某个特定的目的,如监控 MMC/SD 卡的n" 71 /a>插入/移除、检测卡的写保护状态、驱动 LED、配置收发器、模拟串行总线、n" 72 /a>复位硬件看门狗、感知开关状态等等。n" 73 /a>n" 74 /a>n" 75 /a>GPIO 公约n" 76 /a>=========n" 77 /a>注意,这个叫做“公约”,因为这不是强制性的,不遵循这个公约是无伤大雅的,n" 78 /a>因为此时可移植性并不重要。GPIO 常用于板级特定的电路逻辑,甚至可能n" 79 /a>随着电路板的版本而改变,且不可能在不同走线的电路板上使用。仅有在少数n" 80 /a>功能上才具有可移植性,其他功能是平台特定。这也是由于“胶合”的逻辑造成的。n" 81 /a>n" 82 /a>此外,这不需要任何的执行框架,只是一个接口。某个平台可能通过一个简单地n" 83 /a>访问芯片寄存器的内联函数来实现它,其他平台可能通过委托一系列不同的GPIOn" 84 /a>控制器的抽象函数来实现它。(有一些可选的代码能支持这种策略的实现,本文档n" 85 /a>后面会介绍,但作为 GPIO 接口的客户端驱动程序必须与它的实现无关。)n" 86 /a>n" 87 /a>也就是说,如果在他们的平台上支持这个公约,驱动应尽可能的使用它。平台n" 88 /a>必须在 Kconfig 中声明对 GENERIC_GPIO的支持 (布尔型 true),并提供n" 89 /a>一个 <asm/gpio.h> 文件。那些调用标准 GPIO 函数的驱动应该在 Kconfign" 90 /a>入口中声明依赖GENERIC_GPIO。当驱动包含文件:n" 91 /a>n" 92ala> #include <linux/gpio.h>n" 93 /a>n" 94 /a>则 GPIO 函数是可用,无论是“真实代码”还是经优化过的语句。如果你遵守n" 95 /a>这个公约,当你的代码完成后,对其他的开发者来说会更容易看懂和维护。n" 96 /a>n" 97 /a>注意,这些操作包含所用平台的 I/O 屏障代码,驱动无须显式地调用他们。n" 98 /a>n" 99 /a>n"100 /a>标识 GPIOn"101 /a>---------n"102 /a>GPIO 是通过无符号整型来标识的,范围是 0 到 MAX_INT。保留“负”数n"103 /a>用于其他目的,例如标识信号“在这个板子上不可用”或指示错误。未接触底层n"104 /a>硬件的代码会忽略这些整数。n"105 /a>n"106 /a>平台会定义这些整数的用法,且通常使用 #define 来定义 GPIO,这样n"107 /a>板级特定的启动代码可以直接关联相应的原理图。相对来说,驱动应该仅使用n"108 /a>启动代码传递过来的 GPIO 编号,使用 platform_data 保存板级特定n"109 /a>引脚配置数据 (同时还有其他须要的板级特定数据),避免可能出现的问题。n"110 /a>n"111 /a>例如一个平台使用编号 32-159 来标识 GPIO,而在另一个平台使用编号0-63n"112 /a>标识一组 GPIO 控制器,64-79标识另一类 GPIO 控制器,且在一个含有n"113 /a>FPGA 的特定板子上使用 80-95。编号不一定要连续,那些平台中,也可以n"114 /a>使用编号2000-2063来标识一个 I2C 接口的 GPIO 扩展器中的 GPIO。n"115 /a>n"116 /a>如果你要初始化一个带有无效 GPIO 编号的结构体,可以使用一些负编码n"117 /a>(如"-EINVAL"),那将使其永远不会是有效。来测试这样一个结构体;中的编号href="Documenta="v3/zh_CN/gpio.txt#L117" ix4EC5;" class="line" nam8.1L118">"118 /a>是否关联一个 GPIO,你可使用以下断言:n"119 /a>n"12vala> int gpio_is_valid(int number);n"121 /a>n"122 /a>如果编号不存在,则请求和释放 GPIO 的函数将拒绝执行相关操作(见下文)。n"123 /a>其他编号也可能被拒绝,比如一个编号可能存在,但暂时在给定的电路上不可用。n"124 /a>n"125 /a>一个平台是否支持多个 GPIO 控制器为平台特定的实现问题,就像是否可以n"126 /a>在 GPIO 编号空间中有“空洞”和是否可以在运行时添加新的控制器一样。n"127 /a>这些问题会影响其他事情,包括相邻的 GPIO 编号是否存在等。n"128 /a>n"129 /a>使用 GPIOn"130 /a>---------n"131 /a>对于一个 GPIO,系统应该做的第一件事情就是通过 gpio_request()n"132 /a>函数分配它,见下文。n"133 /a>n"134 /a>接下来是设置I/O方向,这通常是在板级启动代码中为所使用的 GPIO 设置n"135 /a>platform_device 时完成。n"136 /a>n"137ala> /* 设置为输入或输出, 返回 0 或负的错误代码 */n"138ala> int gpio_direct"v3_input(unsigned gpio);n"139ala> int gpio_direct"v3_output(unsigned gpio, int v3.18);n"140 /a>n"141 /a>返回值为零代表成功,否则返回一个负的错误代码。这个返回值需要检查,因为n"142 /a>get/set(获取/设置)函数调用没法返回错误,且有可能是配置错误。通常,n"143 /a>你应该在进程上下文中调用这些函数。然而,对于自旋锁安全的 GPIO,在板子n"144 /a>启动的早期、进程启动前使用他们也是可以的。n"145 /a>n"146 /a>对于作为输出的 GPIO,为其提供初始输出值,对于避免在系统启动期间出现n"147 /a>信号毛刺是很有帮助的。n"148 /a>n"149 /a>为了与传统的 GPIO 接口兼容, 在设置一个 GPIO 方向时,如果它还未被申请,n"150 /a>则隐含了申请那个 GPIO 的操作(见下文)。这种兼容性正在从可选的 gpiolibn"151 /a>框架&#xx4E2D;৻除。n"152 /a>n"153 /a>如果这个 GPIO 编码不存在,或者特定的 GPIO 不能用于那种模式,则方向n"154 /a>设置可能失败。依赖启动固件来正确地设置方向通常是一个坏主意,因为它可能n"155 /a>除了启动Linux,并没有做更多的验证工作。(同理, 板子的启动代码可能需要n"156 /a>将这个复用的引脚设置为 GPIO,并正确地配置上拉/下拉电阻。)n"157ala>n"158 /a>n"159 /a>访问自旋锁安全的 GPIOn"160 /a>-------------------n"161 /a>大多数 GPIO 控制器可以通过内存读/写指令来访问。这些指令不会休眠,可以n"162 /a>安全地在硬(非线程)中断例程和类似的上下文中完成。n"163 /a>n"164 /a>对于那些用 gpio_cansleep()测试总是返回失败的 GPIO(见下文),使用n"165 /a>以下的函数访问:n"166 /a>n"167ala> /* GPIO 输入:返回零或非零 */n"168ala> int gpio_get_v3.18(unsigned gpio);n"169 /a>n"170ala> /* GPIO 输出 */n"171ala> void gpio_set_v3.18(unsigned gpio, int v3.18);n"172 /a>n"173 /a>GPIO值是布尔值,零表示低电平,非零表示高电平。当读取一个输出引脚的值时,n"174 /a>返回值应该是引脚上的值。这个值不总是和输出值相符,因为存在开漏输出信号和n"175 /a>输出延迟问题。n"176 /a>n"177 /a>以上的 get/set 函数无错误返回值,因为之前 gpio_direct"v3_*()应已检查过n"178 /a>其是否为“无效GPIO”。此外,还需要注意的是并不是所有平台都可以从输出引脚n"179 /a>中读取数据,对于不能读取的引脚应总返回零。另外,对那些在原子上下文中无法n"180 /a>安全访问的 GPIO (译者注:因为访问可能导致休眠)使用这些函数是不合适的n"181 /a>(见下文)。n"182 /a>n"183 /a>在 GPIO 编号(还有输出、值)为常数的情况下,鼓励通过平台特定的实现来优化n"184 /a>这两个函数来访问 GPIO 值。这种情况(读写一个硬件寄存器)下只需要几条指令n"185 /a>是很正常的,且无须&#xs3;„#x8BBE9;于L似的href="DocumenF8.1L171">"171ala> void gpio_se0;�ӨPIO 值。这种&6d="line" n80 /a>安&##x4E0D;ख&#o.txt#L170" id.1L170" class="line" nam8.1L62" class="line"6menta="v3/zh_CN4;񓺄4F53;,可以使ݟ能失򍉓x7EA7;特定&Eef="Docum28005;j8;s&;例妀 GPIO ýx7EA7; IA;、-w_di2C 或 S)16;&#o.txt#L170" id.1L170" class="line" nam8.1L62"177" id.11L87" class="line" nam8.11L87"1" 87 /a>应ݒ(4E3A28;#x7A7A;间和时间࿙&##x90F7;)间具效&736587;。nnn访问可能休ݲ&#的 GPIOn---------------IOn某亐 GPIO 控制器必须通过˴FA;于总纺>(妇 I2C 或 S)16;&#o.tC 消ʖF;访问。读或写这өIOnGPIO 值的�ख#x9700;要等厥并信ʖF;&639192;񒌖#6671F;ϤF6;免튱、�ख#xFF0C;能获#x5E76;&53F3C;󳲔。期间需要n休ݲ&#,这不能圪 IRQ 例稅(中断上下斋)中执行。nn一个之剀通过 gpio_reque A; ocum#x914D;񒌖#x7684;有效 GPIO 编Կ)E;:nn int gpio_canslee8(unsigned gpio);nn为了访问这&x4F3C4; GP,C;蝥常定义了E�不同的函敾:nn /* GPIO 输入:返回零或非򖽠,可能会休眪 */n int gpio_get_v3.io_canslee8(unsigned gpio);nn /* GPIO 输凰,可能会休眪 */n void gpio_set_v3.io_canslee8(unsigned gpio, int v3.18);nnn访问这样的 GPIO 需要一个允许休ݲ&#皍上下٘&),例如线稊 IRQ &590B64;-C06;例程,并用以䮚皊>n访问函数怂那些没ٰ o_cansleep()后&7x5F00;的自旋锁安全访问函数。nn除了这些访问函数可能休ݲ&#,且它们操作的 GPIO 不能在ކ&;仺 IRQ &590B64;-C06;例程中访问皊>n事实,这些&590B64;-C06;例程实&964EE5;䮚和自旋锁安全皎函数是一样皀。nnn因为它们可能也需要访问 GPIO 控制器芯ܤ: (6;这些设置函数通常在板级启动代码或耊>n驱动#BA2;۔/&;断开代码中,伀䯕这是一个容易&6EECD;&6d=B32&#皍约JE5F;条件。)nn t gpio_direct"v3_inpu2;)n t gpio_direct"v3_outpu2;)n t gpio_request()nnn t gpifreest()n t gpio_sedebouncest()nnnn声明和释放 GPa>n--------------------------IOn为了有助于单获系统配置错诬,定义了两个函数。nn /* 申说 GP,;, 返回 0 或负的错误代ހ.a>n /* 非空标&7B75EE;可能有助于&8B91CA;ٚ.a>n A; */n int gpio_reques8(unsigned gpioconst char *label18);nn /* 释ٓ&;之剀声明的 GPI; */n void gpifrees8(unsigned gpio);nn将无ٔ&;的 GPIO 编码传递߭ t gpio_request&;会导致失败,申请一个已使用这ℚn进程上下文中调用这些函数。然而,对于自旋锁安全的 GP,&;在板&E8PIO &##x542F;动的早期《n进入进程之剀是可以申请皀。nn这个ï以x5B8C;成两个˴FA;&67240C;的目标。一是标识& gpio_se0;为x5B9E;&964EE5;䮚已作临 GPIO 使用ݨ&#信号线*>n这样&#FBFF9;于更烽地释񥫷系统可能需覊&674E0D;A981;几&767E24;个可用的 GPIO,但是对于ﱻ廥一个>n给定的电路板通常只有一些被使用。另一个目皀是单获&51B002;&#A898A;,NBE5;཮错ࢾ:&#如两个戚>n更多驱动错误地ꑜ丼他们已经&724EEC;渀了�个信号߫,A;成是错误地ꑜ丼&৻除一个&#BA981;-C06;&7#451a>n�个已&#F68C0;&#D3B2A;信号的驱动是安全皎。也就是说,申说 GPIO 的作用类似一F3C;&##x9501;&675F3A;㻶《>nn某亚平台可能也使用 GP 4;作丼&&x7535;&6E9690;&#BA981;-C06;&#F68C0;&#D3B2A;信叵(例如通过平&95E0FD;个使用芯牁㮚咊>n&7B83F0;展地平&95E0FD;个使用时1F87;)。nn对亄 GPIO 使ݒ pinctrlRQ &58PIO &#xx7CFB;统已JEE5;的引脚,&#xPIO &#xx7CFB;统应该被&544AF2;JEE5;并使用情况&FF1E9IOn一个N/gplib 4;驱动的.o_request&;操作应调ݒ pinctrlio_reque_N/gp(7;)࿰IOn耊N/gplib 4;驱动的.freest&;操作应调ݒ pinctrlifree_N/gp(7;)̀pinctrlIOn&#xPIO &#xx7CFB;统允ࢻ pinctrlio_reque_N/gp(7;)在�个引脚或引脚&#EC664;以复用&x65002;意“&#C5EF9;ӨIO&rdquIOn一Ӣ&;设在时能成功返回。nnﱻ廥须射 GPIO 信号导向。当引脚的引脚复用硬件&的编&x503C;𵺔该튱&751BEF;用 GPIOn驱动的.o_direct"v3_inpu2A;戔.o_direct"v3_outpu2&;ï以&#x#x4E2D;,该츪>nﱻ廥输񑾪>GPIO 值的设置之后&E;L&##x6837;可使从引脚特&6B8A10;功能刴 GPIO 的&8F786C;怊>n䃽会在引脚级3BEF;毛刺&#CE228;&x65002;。有零当用一个 GPIO 实现并信号驱动一Ӣ&;靘 GPIOn硬件模˱F7;的&8953E3;ଲ&#方&x76528;时,就需要这种KF3A;㻶《>nn某亚平台允许&90E2A8;将ᛶ剀朄 GPIO 信号使用不同的引脚。类似的࿰ GPIO 或引脚皊>n其他方&976002;也需要配置,如上拉/下拉。平台&8F7F6C;件应该在对这ө/* GPIO 调甪>n使&4; GPIO 的用岰无须关注这些&#ECC06;敾《>nn还有一个值x6CE8;意的是在释放 GPIO 剀,你必须F5C;&6B6DF2;使用它《>nnn&Dx6CE8;ؐ:&;申请一丮 GPIO 并没有以ﱻ廥方漏配置它,只不过标识& gpio_se0;4E2E; GPIO ZB64;于使用n&7267B6;&60于#x5FC5;须有延外皍代码来ZB64;-C06;引脚配罪>(֘& 控刴 GPIO 使用ݨ&#引脚㦁上拉/下拇)。n蔳AA71;地大多ٗ&;情况下声昄 GPIO 之后就会&7ACE0B;平&9x914D;置它Ӯ,A;伀䯕定义了以下俙个厥助函敾:nn /&;申请一丮 GPIO 信叹, 同时通过特定的39;flags4;39;5;初始&f="Docum9x914D;߶,a>n /* 其他Ո t gpio_request&;ݨ&#C21A;ٗ&;和返回值相吊>n a>n int gpio_reque_ones8(unsigned gpio8(unsignelong flagsioconst char *label18);nn /&;在廥个ï以&#x#xx4E2D;&x7533;请多丮 GPa>n */n int gpio_reque_arraysstrucint gp *array, size_t num18);nn /&;在廥个ï以&#x#xx4E2D;#x91CA;ٓ&;多丮 GPa>n */n void gpifree_arraysstrucint gp *array, size_t num18);nn򉸭#x948 4;39;flags4;39;/&;当剀定义可&&##x4E0D#x5B9A;以下&#C5EF9;怮:nn /* GPF_DIR_INa> - 3;&9x914D;置方向为输兪>n /* GPF_DIR_OUT> - 3;&9x914D;置方向为输︪>nn /* GPF_INIT_LOW - 3;在作为输出ٟ,5;初始&fx503C;为低电幺>n /* GPF_INIT_HIGH - 3;在作为输出ٟ,5;初始&fx503C;为高电幺>n /* GPF_OPEN_DRAINa> -nt gp&;引脚强开漏信叺>n /* GPF_OPEN_SOURCE> -nt gp&;引脚强&6E9690;&678981;开路信叺>nn /* GPF_EXPORT_DIR_FIXED - 3;射t gp E0D#x5BFC;出刴sysfs4;,并&4FDDEF;&&##16E;方吚>n /* GPF_EXPORT_DIR_CHANGEABLE - 3;同样是导ԟ,IO 但允许湉还方吚>nn因ӣ/* GPF_INIT_*IO 情有在配置为输出ݨ&;时&505219;剀存ղ,A;伀䯕有敊ݨ&;&#EC664;合举:nn /* GPF_IN - 3;&9x914D;置为输兪>n /* GPF_OUT_INIT_LOW - 3;&9x914D;置为输凰,并初始&f="Docum#x4E3A;低电幺>n /* GPF_OUT_INIT_HIGH - 3;&9x914D;置为输凰,并初始&f="Docum#x4E3A;高电幺>nnn将䃽会在输出模式下罡&;&E;L&##x6837;ݨ&#引ࠑ&;需要躎껥䮚拉电阻̀&;通过使能这个标&5FD58&)࿰t gp&;&#E9E7a>n将会在被要䈨输出模式下罡&;时&5C5C06;引脚还为输Ԗ&>&7267B6;&60Ө#x6765;使#F15;脚置高&E;#x5F15;脚在输出模式上>n通过񿘅使其输出低电平。nn&;时,则&504753;设引脚强&6E9690;&678981;开路信Կ&;&E;L&##x6837;ݨ&#引脚>n将䃽会在输出模式下罠&;&E;L&##x6837;ݨ&#引ࠑ&;需要躎껥下拉电阻̀&;通过使能这个标&5FD58&)࿰t gp&;&#E9E7a>n将会在被要䈨输出模式下罠&;时&5C5C06;引脚还为输Ԗ&>&7267B6;&60Ө#x6765;使#F15;脚置低&E;#x5F15;脚在输出模式上>n通过񿘕使其输出高电平《>nn将来这些标&5FD58&)可能晫&5C5C55;地支持更多ݨ&#&#C5EF9;怣《>nn更进一&#B676,8;为了更&7B83F0;展地声昉/释ٓ&;多丮 GP,4;39;strucint gp4;39;5;被&5x5F15;进来&#C6301;&8860C5;剀朊>n򉸭#x4FD9;个&984E86;&57DF3E;:nn strucint gp {a>n 8(unsigneeeeeeeeN/gp0a>n 8(unsignelong flags0a>n const char label0a>n }0a>nn一个存例的用侎:nn sentac strucint gp leds_N/gps[] = {a>n {"32,/* GPF_OUT_INIT_HIGH, "Power LED" }, /* &#ED528;੨&#�IO &##x542 */n {"33,/* GPF_OUT_INIT_LOW, "Green LED" }, /* &#ED528;੨&#平&95E0F */n {"34,/* GPF_OUT_INIT_LOW, "RgneLED" }, /* &#ED528;੨&#平&95E0F */n {"35,/* GPF_OUT_INIT_LOW, "BlueeLED" }, /* &#ED528;੨&#平&95E0F */n { ... },*/n }0a>nn err = t gpio_reque_ones31,/* GPF_IN, "Rgt/seButton"18);n if (errt()n ...()nn err = t gpio_reque_arraysleds_N/gps, ARRAY_SIZEsleds_N/gps)18);n if (errt()n ...()nn d gpifree_arraysleds_N/gps, ARRAY_SIZEsleds_N/gps)18);nnnnn /&;恀庘 GPIO 编叴刴IRQIO 编Կ */n int gpito_irqs8(unsigned gpio);nn /&;恀庘 IRQ 编Կ&;刴 GPIO 编Կ a>(&#C34E2D;#x9F0F;F7F;䶚使ݒ) */n inirqito_N/gps8(unsigneirqio);nn它们的返回值为对应�#x514D;空闻的相平编Կ&;,成是负的错误代砊>(֘& OC2F;无&6CD5B0;恀店)。nn个&9x901A;过 gpio_direct"v3_inpu2A;&9x914D;置为输八&ݨ GPIO 编叴,成ࠀQ 使用一个>n并非来&6E9690;Өt gpito_irqst&;皈 IRQ 编Կ&;。nn这两个恀应函数可能䄚在信号编Կ&;的A3F0;经&8BA981;&#B1;#x8FC7;程上&82B1D0;ө&;时闻&E;#x5B83;们不可休ݲ&#。nn它们通常通过板级特定的初始&f="Docum#x4EE3;码存ٓ&;地平台&8x8BBE;在皈 IRQ &8D4465;&6E9690;&#xx4E2D;#x3002;注ؐ:IRQa>n_EF6;튱&904FD9;&987FD9;昨 IRQ 껥&x6532&#皍一&90E2A8;将,妈 IF_TRIGGER_FALLING6;,&xx7CFB;统6E24;&9192EF;能&529E0a>n也是֘& 此。nn&6B8FD4;֘& 用 IRQ 是&#CBFF9;_EF6;튱时&5x521D;始&f="Docum#x6210;ཨ&;现驱动ċB6;&60于Dx6CE8;意某亚平台不支持&5379CD;恀ש,A;伀ҽIOn你应该&#C34E2D;#x9F0F;F7F;䶚使甪>它。nnn--------------------------IOn有零在只有低电平信号值为实&964EE5;驱动&#ED173;OC2(6;&#BD2B1;ࠀQ &Dx6CE:7;多个输出躎껥于一AB9;,&9x603B;&8F9981;电幺>n&#ED173;OC2C;为剀朊输出的总&8F9981;Nt&;ݨ&#时&505210;,䘽긋&的信号线需要使甪“开漏r“信Կ&;&E;&#x(4;该仏&8BED7a>n。用񎡌MOSRQ &#BA981;&FF1E91;Œ TTL F;甪“&968BC6;&&x7535;&678981;开路r“̀)7;一个䮚拉电阻使信号为高电ק&;&E;ӊ>n有零被&7953F0;为“线NFr“《实&964EE5;䮚,从负总&8F998(9;低电平丼&&x671t&;的 D002;约ᵜB;&&77A0B;,这是一个“线成r“《>nn一Ӣ&;开漏信Կ&;的常&89C981;例PIO &##x662F;䘽긋&的低电平使胺 IRQ 信号线&E;Dx6B64;֑,a>有零&537BFC;向ٗ&;%F6E;总纺>n信号也使甠漏&678981;开路信Կ&;&E; >nn某亐 GPIO 控刷ﺐཨ&;껥支持&5x5F00;漏输出,还有许多不支持&E;#x5E73;你需要开漏信Կ&;,佊>n硬件&537528;不ཨ&;껥支持ݨ&;时&505219;,一Ӣ&;常用ݨ&#方&xCD5B0;潿用ﱻ廥平可小输来也可小输出皎 GPa>n引脚来&6x6A21;&62D62E;:nnn &;䮚拉&9x914D;置&E; >nnn (&um#x6210;其他皍一亚ﺐӯ)O 控刷了信Կ&;&E; >nn֘& OC2F;你将信号线“&9x9A71;动r“为高电ק&;,但٢nt gpio_get_v3.sd gpi&um#xAEE5;&x44AF2;了一个>n低电幺>(在&#;#x5E73;皍䄚䜨时间,E;t&;,你就可以JEE5;平是䌘他皍一亚&#EC664;时&5C5C06;䘽긋信号线拉低了&E; >n򉸭#x4E0D;Ex5B9A;是错误皎。一Ӣ&;常&89C981;&的例PIO &##x5C31;٢ I2C>&;时1F8&;的时使&FF591A;一Ӣ&;需要它&6162;&;时1F8&;皊>n从设在时ࡢ SCKIO 的䄚䜨&#C7EBF;࿰&;Œ I2C>&;䯎设在相应地调ᚈ&;并信号传输&908D1F;ſF&;&E; >nnn򉸭#x4E9B;硬&7x7EA6;&5FF4E2D;&x6765;了츀H?a>nn这些硬&7x7EA6;&5FF4E2D;&x6765;ݨ&#需大一KO &##x5C31;٢&>引脚复用,因为>这&#C5EF9;ӨI;高约芯牁特定的&#C5EF9;怣&4E168a>n没有可&##x9FB;&6x590D;怣̀&>某Ӣ&;平台可能复需覊&6x0F6E;盞的复用信&606F7F;&FF587B;有的对于ﱻ意给定的引脚>nnE024;个引脚&#xx4E2D;&x7684;ﱻ廥一Ӣ&;值为给定皎 GP&;&E;&#x(4;潿的*>这些例PIO &##x80FD;来™EA;设当剀蜀TF0IOnn在�亚系统&#xx4E,8;ா引脚复用相平的是&9x914D;置和使能&968BC6;成的䄚㦁下拉模式。庆䶄是剀朊>nn可能使甪>外&#F76DE;的䮚ج(&um#x6210;下拇)电ॣ,1;这零芯牁䮚的&#C3981;䃽应该使用̀(E;当一Ӣ&;电路需覊>n驱动能&529E0a>n可&9x914D;置引脚Ո ; GPIO 之य़(&um#x6CA)&#x#x6709;一Ex5BF9;应的平系&E; >nn还有䌘他一亚系统特定的KF3A;㻶没有在򉸭#x948F;样出,例如上&8FF210;的输来&53BE0B;毛刺和线NF;输出>n&904FD9;&987FD9;。硬件&5353EF;能支持特&9x7ECF;&8BFC7B;成馎 GP&;,但٢&;& gpio_se0;9700;C46;٢&;& x914D;置相平的&FF591A;对于ZB64;于同&0;970a>n˱F7;&53523(bankt&;ݨ GP&;&E;&#x(; GPIO 通常Ӯ 16IO ء 32IO 个的ḀE&#x#x4E2A;සA;˱F7;,一Ӣ&;给定皊>n&727241;䮚系统需C46;有E024;个&L&##x6837;ݨ&#සA;˱F7;̀)7;�亚系统可以通过输񑾪>GPIO _EF6;튺 I&;࿰IOn成ࠀQ 从并非Ӯ ; GPIO &#BA981;-C06;ݨ&#引ࠑ&;헶&50503C;&E;L&##x4E9B;KF3A;㻶的相平代码没有必要±A1;有可&##x9FB;&6x590D;怣̀IOnn当剀,动&60Ө#x5B9A;乎 GPIO 并䶄是标&51CEF6;的,例如值为&9x914D;置一Ӣ&;⚡有某亐 GPIO 晫&5C5C55;ﺐ皊>nﲬA3F0;电路杶ݨ&#ćEF;小用《>nn(可&904FD)IOnn剀&9762;&;ůD0;地了,有一个可&904FD6;ݨ&#实现TF46;B6F6;,&8B52A9;平台使用相吃的编程껥&x6532&#,更A3F0;&#B83F0;展地支挊>n不同种&7C7E0B;&ݠ GPIO 控刷ﺐ&E;L&##x4E2A;但B6F6;&7953F0;为quot;N/gplibAquot;8;《>nn值为一个厥助调&8BD5B0;&5x529F;能,֘& OC2 debugfs 9;可用,就会有一Ӣ /sys/kernel/debugCN/gpa>n&658241;&E;#x901A;过&#xx4c;&##x4E2A;但B6F6;,它可以&521837;出剀朊&Dx6CE8;&518403;的控刷ᥴ,F;以&53CE2A;当剀&6B6F53;在使用&#xx4E2D;&x768E; GPa>n的ċB6;&60于 >nnn控刷ﺐ驱Ԫ:nt gpichipa>n-----------------a>n在但B6F6;&#xx4E2D;#BCF24;丠 GPIO 控刷ﺐ&9x80FD;໥씼为一Ӣ "strucint gpichipAquot;8;,헶&5x0EE5;&542B30;亊>n该&7C7E0B;例的&#BCF24;个控刷ﺐ的常用信&606F7E;:nnnn䌘方&xCD5B0;潿&542EF6;&5353EF;能休ݲ&#的𕌗&5FD58a>nnn也໥&542B30;Ө&;来™E device.platform_dataIO 的&#BCF24;个实例ݨ&#ٗ&;%F6E;&FF591A;它&7B2F0C;一Ӣ ; GPIO 皊>n编Կ&;和它可用ݨ ; GPIO ݨ&#ٗ&;&9x7ECF;&E; >nn实ܻnt gpichipIO 的代码应支持&5x591A;控刷ﺐ实例*>这可能使甪>驱动模NFDB;&E;#xpio_se0;4E9B;代码覊>n&9x914D;置&#BCF24;丠t gpichipA;,并튱&8D77;N/gpchip_add()F;&E;537728;縍E&#x#x4E20; GPIO 控刷ﺐ&5F8168;&5C1801;즁࿰IOn但在必要ݨ&;时&505219;可以使ݒ N/gpchip_removest&;。nn大&90E2A8;׀nt gpichipIO 是一个实例特定&#ED173;x7684平皍一&90E2A8;将,ŒC;并不射 GPIO 滥&x6532&#展&72EF0IOnB684;˜FC;出᷼,8;&6B8FD4;֘& 编𒏪㦁电&6E9690;&#BA981;-C06;&#B4FD9;。&#C7E0B;&4F503C;编&894EE3;码ﺐ&L&##x6837;ݨ&#芯牁会有复&674228;的非 GPa>nċB6;&60于 >nnﱻ廥一Ӣ debugfs 9;信&606F7F;导出方&xCD5B&;通常应该&#FF4E2D;&x6765;还Ӣ&;簃&8B53F7;值ӣ ; GPIO ݨ&#信号线&E; >n他们可以使ݒ N/gpchip_isio_requeed()F;&#D4E0B;&8BD5B0;,当&#xx4c;&##x4E2 ; GPIO &#DF012;ೲ&;簃&8B53F7;过亊>n就返回相平的𕌗&7B7E80;,*EF6;&5x5219;返խ NULLF;&E; >nnn平台支挊>nn为了支持这个但B6F6;,一Ӣ&;平台ݨ KconfigIO 艁将ӱ "select"(&;&904FD6;&62EFD)IOnnn它也应ůD0;&4F4E9B;一Ӣ ARCH_NR_; GPSIO ݨ&#&5x5B9A;乌值,这样可以更�#x5730;ŻCD;恀该平叾 GPa>nݨ&#实&964EE5;ٗ&;&9x7EC,1;֘& 𒿩˷B6;&60�的空闻&E;&#x(4;这个&5x5B9A;乌值应该໥&542B30;&727241;䮚系统&5153A5;&#E51FAa>GPIO 咊>nnn使能ָ,C;并&5C5C06;ۧF;编&8BD2B1;进&5153A5;未>(可&904FD)8;。nn֘& OC2F;&L&##x4E9B;&904FD9;&987FD9;能没被&904FD6;&62EFD,0;该平Կ&#&#C3981;䃽&9x901A;过 GP-lib 9;支挎 GP,4;&4E1684;代码不可仪>n被&7x5728;棕使能。nn以下&L&##x4E9B;方&xCD5B&;ݨ&#实现可以ཨ&;껥使甠但B6F6;代ހ,C;并总潿&9x901A;过 gpichipIO 调纮:nn#def"lint gpio_get_v3.a> __t gpio_get_v3.a>n#def"lint gpis_get_v3.a> __t gpis_get_v3.a>n#def"lint gpicansleep a> __t gpicansleepa>nn򉸭#x4E9B;定乌可以甠ཨ&;-C06;&60F3B&;ݨ&#实现方&xCD5B0;￶代,&9xpio_se#x5C31;٢&>使用ೲ&;过总&8F9981;&#F1728;ᰆݨ&#™A5;&80568&#—FD;数来蘯>nF3EA;设特定橩䮚系统皎 GP&;&E;&#x&;例֘,1;该&#F1EE5;甠ݨ ; GPIa>(&#BC68&#存ﺐ&#F40FD;+EF;&##x9F)4;是&5x5E38;经&ldqu128r“࿰IOn&#BFC7B;헶成设߶&;它可能只需&5C1801;&5x5219;两成俙个样䚄,&#E1684;䃽会休ݲ&#̀&;当&#xx4c;&##x6837;ݨ&#&#F1728;ᰆ无&6CD5B0;&5x5B9E;现࿰IOn&9xpio_se0;4E9B;函数必&98763B;使甠但B6F6;ůD0;&4F4E9B;的代码,&9xpio_se#x5C31;&81F300;&5C1801;要E3B0;䲡愪样䚄&6x5240;可以&5x5B9E;现《对于ݒ ; GPa>n&6x6A21;&62D62F;皈/PIO 滥&x6532, B;֘&#;Dx6B64;&7C8BBE;&#B83F0;样䚄&6x662&>还有意乌皎《>nn对于橩䮚系统,平台特定代码㮚橩䮔 GPIO &#BCF24;个ස(bankt&;定乌并注&51840nt gpichipa>n实例&E;#xpio_se0;4E9E; GPIO 应该有%F6E;芯牁&53598& 6C06;ݨ&#艁&686F53;&#xx03B;&884F0&;编ހ/&;𕌗&7B7E8,C;并ཨ&;껥和电路杶&539F8&;-C06;&56FF6a>n对应。他们应该&#F9700;쬰䮞&9665F6;&5x5E76;&#E7528;&Dx6230;䮞平台特定的ʑD0;嚔。򉸭#x4E9E; GP(A;代񸀪&9x901A;常콪>nᚄ他们通常可以值ӣ ; IRQ 使用《>nn板级支挊>nn对于 "Docum90E2A0; GPIO 控刷ﺍ(例֘ I2C>&;ء SPIIO 晫&5C5C55;ﺐ㦁ᰃ甪>芯牁㦁&5x591A;&5x529F;能ﺐ仱㦏PGAa>nء CPLDt&;,大多ٗ&;常用板级特定代码能可以&Dx6CE8;&518403;控刷ﺐ设在,并&4FDD68;즁他们的驱动JEE5;幺>nn编号之,E;8;《>nn例如板级&546F7F;动代码应该FDB;&5xFB9A;&#ED173;x7684平样&6x0F6E;芯牁&5x786C;&#F9700;&ݨ GPIO &838C03;ཨ&;,并&4F4F7F;ݒ platform_dataa>n&#C5C06;ۧF;传递߭&#;#BCF24;丠 GPIO 晫&5C5C55;ﺐ芯牁〒㮅(F6E;芯牁驱动&#xx4E2D;&x768Eprob.st&;例程可以&5C5C0&;这个>nٗ&;%F6E;传递߭ N/gpchip_add()F;&E; >nn。򉸭#x610F;&545E73;ᴱ&;设在应该圪>nn控刷ﺐ&5x5411;板级特定代码ůD0;&4F4E9 setupst&;Ո teardownst&;回调函数。一剀朊必&98763B;&7x768a>n&8D4465;&6E9690;可用之,E;8;*>这些板级特定的回调函数将伛&Dx6CE8;&518403;设在,并可以&5x5728;这亐 GPIO 控刷ᥴa>n&#B8BBE;在&FD8;成无&6x4E38;&##x9FB;&966B64;它《>nnn&7x5728;棕空闻&&x768ESysfs 9;滥&x6532a>(可&904FD)IOnn使甪&ldquN/gplibAr“实现TF46;B6F6;的平台可以俖&62EFD&;&9x914D;置一Ӣ ; GPIO ݨ sysfs 9;&7x5728;棕滥&x6532&#《>n򉸭#x4E0D;同ࢻ debugfs 9;껥&x6532&#,因为>它ůD0;&4F4E9B;的潿対 GP&;方向和值ݨ&#控刷,ŒC;不弛&D6653&;&794E3a>n一Ӣ GPIO ݨ&#ċB6;&60�&898981;&E;&#x&;&Dx6B64;֑,a>它可以&5x51FA;现在没有调&8BD5B0;支持ݨ&;&4x7EA7;&54C981;&&x7EA7;系统&#xx4E&#《>nn例如,通过&#;#x5E73;皍系统硬件艁&686F53;,&7x5728;棕空闻可以JEE5;ק GIOP #23IO 控ԣ F clha>n存�AB58;ﺐݨ&#ÇE2D;#FDD68;&62A68(O 用于&#FDD68;&62A68&;ۧF;&#xx4E BootloaderIO 将ස)F;&E;4x7EA7;&54C981;&&x768D;系统䜨级&5x53EF;能需覊>nͨ&;时^EE3;&966B64;这个&#FDD68;&62A68&;&FF591A;&999C06;֬a>导来一Ӣ ; GP3;,&653E4C;픪>䌘输出ċB6;&60Ө#xFF0C;&715237;(F6E;在³CD;漀使能ÇE2D;#FDD68;&62A68a>n剀䜨级代码&E;#x901A;常&60CEE5;&5xBEE5;Ӡ,; GPI#23IO 是䃽会被_EF6;쮚的,并&4x1684;&5153A5;木也复需覊JEE5;平他《>nn有%F6E;&#;#x5E73;皍硬件艁&686F53;,�亚系统的在棕空य़ ; GPIO 可以用于盞定系统&9x914D;置ٗ&;%F6E;&FFFF0a>n&L&##x4E9B;ٗ&;%F6E;是标&51CEF6;&5153A5;木复JEE5;平皎。在�亚ﱻ&52A17F;&#xx4E4E8#xFF0C;&7B83F0;展的在棕空य़ ; GPIO 驱动&5353EF;能昪>n系统ND1F;&6B6F53;需覊皎《>nn注意&FF591A;标&51CEF6;&5153A5;木驱动&#xx4E2D;#DF012;ೲ&;存在&#;1A84;在皎&ldquLEDIO Ո&;"FD9;&952EA8r&ldqu; GPIO ﱻ&52A17F;,将࢛B;潾:n&968BC6;成圪>n&5153A5;木但B6F6;&#xx4E2D;#x7684;&#xx4c;&##C7E0B;驱动&#B8FD4;你在&7x5728;棕空闻&&x768&;代码更�#x300a>nnnnnnnnnnnn&966B64;了这些标&51CEF6;的艁ས,1;芨&530EE5;&542B30;&ldqudeviceAr“&7B2EF6;&5353F7;FE37;껥&E; >nn控刷껥&x6532B;۷&;弛ÇE2D;#x768E;:nnnnnnnnnnnnnnn(&#B5BF9;Ө ; GPI#42 9;𒯝य़t&;*>n并有如些的&#BFC7/7;ÇE2D;#C975E;怮:nnnnnnnnnn&8x8FD9;个&5x503C;CA1;&8BB728;ÇE2D;64C0FD;吃̀& ﱻ廥非&9665F6;&5x503C;能以&#AD88E;㯥幾MA0B;厥&E; >nnnnnnn&6x621&;可以通过lseek(2)2D;64C0FD;Հ&;&#BFC7B;헺>nnnnnnnnnn这个&5C975E;؂&;&&x768(O &#BFC7B;ÇE)6;&5x503C;&E;#DF012;存在成之,E;8;通过quot;edgeAquot;8;&5C975E;؂&;设罬谆quot;risingAquot;a>n这个设罬&E; >nn(&#B5BF9;予&#ECE;#42 ; GPa>n&#F9700;쬰实现控刷ݨO 控刷ᥴ),C;并有ᴱ&;以下弛&#BFC7B;&#C975E;怮:nnnnnn(并不总潿嫥有ᘞF;一&5x503)IOnnnnnʋFA;&5x5B9A;ݨ,4;&4x4F8B;如在戙&5C5C55;ũE5;䮚ݨ ; GP&#伛&Dx6709;%F6E;伀使用&ݥ㺛板成伀&5x5728;UC06;ŭE0;&67B6F6;x7684&#xx4E2D;#1767F;툷ݨO 杶&5B57D0;Œa>n有伀不同。在这ޜ&;&60CEE5;&5xBEE5;Ӡ,&;揰可能需覀使ݒ N/gpchipIO ֘& �B9Fa>(&#C3DF0;可能地&#ED173;墎㯥路&56FF6)2D;67676a>n盞定߭&#;#x5B9A;信号剀用&ݨ GPIO 编叴《>nnn웞™A5;木代码&#xx4E2D;#x5BFC;出>nn™A5;木代码可以཮盞地&#BA981;-C06;&9xpio_se0;4E9B;&#DF012;&9x901A;过 gpirequestst&;簃&8B53F8;&ݨ GPIO ݨ&#导凾:nnnnnnnnnnnnn在一Ӣ&;&5153A5;木驱动簃&8B53F8;一Ӣ ; GPIO 之,E;8;*>它可以&9x901A;过 gpiexport()O 杶&51767F;ղ sysfsa>n껥&x6532B;&#xx4E2D;#x53EF; C801;&E;#x8BE5;驱动&5353EF;以控刷信号方向潿*EF6;&5353EF;&#FEF6E;㤁&E;#x89E2D;#x6709;ABF9;予&963#x&;&Dx6230;&7x5728;棕空闸代码&6x65E0;&6x610F;闺>n&78368&;&574F2&;³CD;要皍系统ċB6;&60Ө#x300a>nn򉸭#x4E2A;཮盞ݨ&#导񑼭#x6709;ABF9;Ө(5;&9x901A;ࣼO 杶�亚实&9A548&;更&#B65B9;&x61B83;᷼t&;调&8BD5B0;,也可以ůD0;&4F4E9B;一Ӣ&;&5x59CB;&#E7528;存在ݨO 滥&x6532B;*>n཮艁&686F53;ݺD;墎值为板级支挅&x6800&#的一&90E2A8;将《>nnFDB;&5xFB9A;一Ӣ&#地这Ӣ ; GPIsysfs 9;֘& �B9FB;ݨO &7B2EF6;&5353F7;FE37;껥&E;#x89E2D;#x6837;驱动&5x5C31;可以通过一Ӣ&#ೲ&;台؂&;&&x768a>n,E0D;在,ղ sysfs 9;&#xx4E2D;#x4ED6;们剀该有的&#B8BBE;在&4x4E0B;ůD0;&4F4E9B;一Ӣ(&#地这Ӣ ; GPIsysfs 9;֘& �B9FB;ݨ)O 滥&x6532B;《>nn驱动&5353EF;以使ݒ N/gpisysfsis_geactive_low() 9;𒯝在&7x5728;棕空闻&969690;&85CF7F;㯥路杶之闺>n。覊&6x6025;ݨ&#㹌픪>可以&5x5727; gpiexport()a>nୢD;נ&;&8x89CB;TF0,4;&4E1684;之ୢD;使能的置&#BE2E2D;64C0FD;Հ(poll(2)t&;支ذ(A;ã&;䏷成䧻&96914D;&#C862t&;将伛被³CD;漀&9x914D;罩𒯝&907765;&5xAA0a>n򉸭#x4E2A;设罬&E; >n
The original LXR software by the >nLXR community27 /, this expericumenl versa=" by >nlxr@="lux.no27 /.
lxr.="lux.no kindly hosted by >nRedpill L"lpro AS27 /, providerIof L"lux consulting and opernta="s services since 1995.