Based on kernel version 3.9. Page generated on 2013-05-02 23:17 EST.
1 Chinese translated version of Documentation/gpio.txt 2 3 If you have any comment or update to the content, please contact the 4 original document maintainer directly. However, if you have a problem 5 communicating in English you can also ask the Chinese maintainer for 6 help. Contact the Chinese maintainer if this translation is outdated 7 or if there is a problem with the translation. 8 9 Maintainer: Grant Likely <grant.likely@secretlab.ca> 10 Linus Walleij <linus.walleij@linaro.org> 11 Chinese maintainer: Fu Wei <tekkamanninja@gmail.com> 12 --------------------------------------------------------------------- 13 Documentation/gpio.txt çä¸æç¿»è¯ 14 15 妿æ³è¯è®ºææ´æ°æ¬æçå 容ï¼è¯·ç´æ¥èç³»åææ¡£çç»´æ¤è ãå¦æä½ ä½¿ç¨è±æ 16 äº¤æµæå°é¾çè¯ï¼ä¹å¯ä»¥å䏿çç»´æ¤è æ±å©ã妿æ¬ç¿»è¯æ´æ°ä¸åæ¶æè ç¿» 17 è¯åå¨é®é¢ï¼è¯·èç³»ä¸æçç»´æ¤è ã 18 è±æçç»´æ¤è ï¼ Grant Likely <grant.likely@secretlab.ca> 19 Linus Walleij <linus.walleij@linaro.org> 20 䏿çç»´æ¤è ï¼ å ç Fu Wei <tekkamanninja@gmail.com> 21 䏿çç¿»è¯è ï¼ å ç Fu Wei <tekkamanninja@gmail.com> 22 ä¸æçæ ¡è¯è ï¼ å ç Fu Wei <tekkamanninja@gmail.com> 23 24 25 以ä¸ä¸ºæ£æ 26 --------------------------------------------------------------------- 27 GPIO æ¥å£ 28 29 æ¬ææ¡£æä¾äºä¸ä¸ªå¨Linuxä¸è®¿é®GPIOçå ¬çº¦æ¦è¿°ã 30 31 è¿äºå½æ°ä»¥ gpio_* ä½ä¸ºåç¼ãå ¶ä»ç彿°ä¸å 许使ç¨è¿æ ·çåç¼æç¸å ³ç 32 __gpio_* åç¼ã 33 34 35 ä»ä¹æ¯GPIO? 36 ========== 37 "éç¨è¾å ¥/è¾åºå£"(GPIO)æ¯ä¸ä¸ªçµæ´»çç±è½¯ä»¶æ§å¶çæ°åä¿¡å·ãä»ä»¬å¯ 38 ç±å¤ç§è¯çæä¾,ä¸å¯¹äºä»äºåµå ¥å¼åå®å¶ç¡¬ä»¶ç Linux å¼åè æ¥è¯´æ¯ 39 æ¯è¾çæãæ¯ä¸ªGPIO é½ä»£è¡¨ä¸ä¸ªè¿æ¥å°ç¹å®å¼èæçæ éµå(BGA)å°è£ ä¸ 40 âçç âçä¸ä¸ªä½ãçµè·¯æ¿åç徿¾ç¤ºäº GPIO ä¸å¤é¨ç¡¬ä»¶çè¿æ¥å ³ç³»ã 41 驱å¨å¯ä»¥ç¼åæéç¨ä»£ç ï¼ä»¥ä½¿æ¿çº§å¯å¨ä»£ç å¯ä¼ éå¼èé ç½®æ°æ®ç»é©±å¨ã 42 43 çä¸ç³»ç» (SOC) å¤çå¨å¯¹ GPIO æå¾å¤§çä¾èµãå¨æäºæ åµä¸,æ¯ä¸ª 44 éä¸ç¨å¼èé½å¯é 置为 GPIO,ä¸å¤§å¤æ°è¯ç齿尿ä¸äº GPIOã 45 å¯ç¼ç¨é»è¾å¨ä»¶(类似 FPGA) å¯ä»¥æ¹ä¾¿å°æä¾ GPIOãåçµæºç®¡çå 46 é³é¢ç¼è§£ç å¨è¿æ ·çå¤åè½è¯çç»å¸¸çæä¸äºè¿æ ·çå¼èæ¥å¸®å©é£äºå¼è 47 å®ä¹ç SOCãåæ¶è¿æéè¿ I2C æ SPI ä¸²è¡æ»çº¿è¿æ¥çâGPIOæ©å±å¨â 48 è¯çã大夿° PC çåæ¡¥æä¸äºæ¥æ GPIO è½åçå¼è (åªæBIOS 49 åºä»¶æç¥éå¦ä½ä½¿ç¨ä»ä»¬)ã 50 51 GPIO çå®é åè½å ç³»ç»èå¼ãéå¸¸ç¨æ³æ: 52 53 - è¾åºå¼å¯å (é«çµå¹³=1ï¼ä½çµå¹³=0)ãä¸äºè¯ç乿å¦ä½é©±å¨è¿äºå¼çé项, 54 ä¾å¦åªå 许è¾åºä¸ä¸ªå¼ãæ¯æâ线ä¸âåå ¶ä»åå¼ç±»ä¼¼ç模å¼(å¼å¾æ³¨æçæ¯ 55 â弿¼âä¿¡å·) 56 57 - è¾å ¥å¼å¯è¯»(1ã0)ãä¸äºè¯çæ¯æå¼èå¨é 置为âè¾åºâæ¶å读ï¼è¿å¯¹äºç±»ä¼¼ 58 â线ä¸âçæ åµ(ä»¥æ¯æååä¿¡å·)æ¯é常æç¨çãGPIO æ§å¶å¨å¯è½æè¾å ¥ 59 廿¯åº/æ¶æé»è¾,è¿ææ¶éè¦è½¯ä»¶æ§å¶ã 60 61 - è¾å ¥é常å¯ä½ä¸º IRQ ä¿¡å·,ä¸è¬æ¯æ²¿è§¦å,ä½ææ¶æ¯çµå¹³è§¦åãè¿æ ·ç IRQ 62 å¯è½é 置为系ç»å¤éäºä»¶,以å°ç³»ç»ä»ä½åèç¶æä¸å¤éã 63 64 - é常ä¸ä¸ª GPIO æ ¹æ®ä¸å产åçµè·¯æ¿çéæ±,å¯ä»¥é 置为è¾å ¥æè¾åº,ä¹æä» 65 æ¯æååçã 66 67 - 大é¨å GPIO å¯ä»¥å¨ææèªæéæ¶è®¿é®,使¯é常ç±ä¸²è¡æ»çº¿æ©å±ç GPIO 68 ä¸å 许ææèªæéã使äºç³»ç»ä¹æ¯æè¿ç§ç±»åã 69 70 对äºç»å®ççµè·¯æ¿,æ¯ä¸ª GPIO é½ç¨äºæä¸ªç¹å®çç®ç,å¦çæ§ MMC/SD å¡ç 71 æå ¥/ç§»é¤ãæ£æµå¡çåä¿æ¤ç¶æãé©±å¨ LEDãé ç½®æ¶åå¨ã模æä¸²è¡æ»çº¿ã 72 å¤ä½ç¡¬ä»¶çé¨çãæç¥å¼å ³ç¶æççã 73 74 75 GPIO å ¬çº¦ 76 ========= 77 注æ,è¿ä¸ªå«åâå ¬çº¦âï¼å 为è¿ä¸æ¯å¼ºå¶æ§çï¼ä¸éµå¾ªè¿ä¸ªå ¬çº¦æ¯æ 伤大é çï¼ 78 å ä¸ºæ¤æ¶å¯ç§»æ¤æ§å¹¶ä¸éè¦ãGPIO 常ç¨äºæ¿çº§ç¹å®ççµè·¯é»è¾,çè³å¯è½ 79 éççµè·¯æ¿ççæ¬èæ¹åï¼ä¸ä¸å¯è½å¨ä¸å走线ççµè·¯æ¿ä¸ä½¿ç¨ãä» æå¨å°æ° 80 åè½ä¸æå ·æå¯ç§»æ¤æ§ï¼å ¶ä»åè½æ¯å¹³å°ç¹å®ãè¿ä¹æ¯ç±äºâè¶åâçé»è¾é æçã 81 82 æ¤å¤ï¼è¿ä¸éè¦ä»»ä½çæ§è¡æ¡æ¶ï¼åªæ¯ä¸ä¸ªæ¥å£ãæä¸ªå¹³å°å¯è½éè¿ä¸ä¸ªç®åå° 83 访é®è¯çå¯åå¨çå è彿°æ¥å®ç°å®ï¼å ¶ä»å¹³å°å¯è½éè¿å§æä¸ç³»åä¸åçGPIO 84 æ§å¶å¨çæ½è±¡å½æ°æ¥å®ç°å®ã(æä¸äºå¯éç代ç è½æ¯æè¿ç§çç¥çå®ç°,æ¬ææ¡£ 85 åé¢ä¼ä»ç»ï¼ä½ä½ä¸º GPIO æ¥å£ç客æ·ç«¯é©±å¨ç¨åºå¿ é¡»ä¸å®çå®ç°æ å ³ã) 86 87 ä¹å°±æ¯è¯´,妿å¨ä»ä»¬çå¹³å°ä¸æ¯æè¿ä¸ªå ¬çº¦ï¼é©±å¨åºå°½å¯è½ç使ç¨å®ãå¹³å° 88 å¿ é¡»å¨ Kconfig ä¸å£°æå¯¹ GENERIC_GPIOçæ¯æ (å¸å°å true)ï¼å¹¶æä¾ 89 ä¸ä¸ª <asm/gpio.h> æä»¶ãé£äºè°ç¨æ å GPIO 彿°ç驱å¨åºè¯¥å¨ Kconfig 90 å ¥å£ä¸å£°æä¾èµGENERIC_GPIOãå½é©±å¨å 嫿件: 91 92 #include <linux/gpio.h> 93 94 å GPIO 彿°æ¯å¯ç¨,æ 论æ¯âçå®ä»£ç âè¿æ¯ç»ä¼åè¿çè¯å¥ãå¦æä½ éµå® 95 è¿ä¸ªå ¬çº¦ï¼å½ä½ ç代ç 宿åï¼å¯¹å ¶ä»çå¼åè æ¥è¯´ä¼æ´å®¹æçæåç»´æ¤ã 96 97 注æï¼è¿äºæä½å 嫿ç¨å¹³å°ç I/O å±é代ç ï¼é©±å¨æ é¡»æ¾å¼å°è°ç¨ä»ä»¬ã 98 99 100 æ è¯ GPIO 101 --------- 102 GPIO æ¯éè¿æ ç¬¦å·æ´åæ¥æ è¯ç,èå´æ¯ 0 å° MAX_INTãä¿çâè´âæ° 103 ç¨äºå ¶ä»ç®ç,ä¾å¦æ è¯ä¿¡å·âå¨è¿ä¸ªæ¿åä¸ä¸å¯ç¨âææç¤ºéè¯¯ãæªæ¥è§¦åºå± 104 硬件ç代ç ä¼å¿½ç¥è¿äºæ´æ°ã 105 106 å¹³å°ä¼å®ä¹è¿äºæ´æ°çç¨æ³,ä¸éå¸¸ä½¿ç¨ #define æ¥å®ä¹ GPIOï¼è¿æ · 107 æ¿çº§ç¹å®çå¯å¨ä»£ç å¯ä»¥ç´æ¥å ³èç¸åºçåçå¾ãç¸å¯¹æ¥è¯´ï¼é©±å¨åºè¯¥ä» ä½¿ç¨ 108 å¯å¨ä»£ç ä¼ éè¿æ¥ç GPIO ç¼å·ï¼ä½¿ç¨ platform_data ä¿åæ¿çº§ç¹å® 109 å¼èé ç½®æ°æ® (åæ¶è¿æå ¶ä»é¡»è¦çæ¿çº§ç¹å®æ°æ®)ï¼é¿å å¯è½åºç°çé®é¢ã 110 111 ä¾å¦ä¸ä¸ªå¹³å°ä½¿ç¨ç¼å· 32-159 æ¥æ è¯ GPIO,èå¨å¦ä¸ä¸ªå¹³å°ä½¿ç¨ç¼å·0-63 112 æ è¯ä¸ç» GPIO æ§å¶å¨,64-79æ è¯å¦ä¸ç±» GPIO æ§å¶å¨,ä¸å¨ä¸ä¸ªå«æ 113 FPGA çç¹å®æ¿åä¸ä½¿ç¨ 80-95ãç¼å·ä¸ä¸å®è¦è¿ç»,é£äºå¹³å°ä¸ï¼ä¹å¯ä»¥ 114 使ç¨ç¼å·2000-2063æ¥æ è¯ä¸ä¸ª I2C æ¥å£ç GPIO æ©å±å¨ä¸ç GPIOã 115 116 å¦æä½ è¦åå§åä¸ä¸ªå¸¦ææ æ GPIO ç¼å·çç»æä½,å¯ä»¥ä½¿ç¨ä¸äºè´ç¼ç 117 (å¦"-EINVAL")ï¼é£å°ä½¿å ¶æ°¸è¿ä¸ä¼æ¯ææãæ¥æµè¯è¿æ ·ä¸ä¸ªç»æä½ä¸çç¼å· 118 æ¯å¦å ³èä¸ä¸ª GPIOï¼ä½ å¯ä½¿ç¨ä»¥ä¸æè¨: 119 120 int gpio_is_valid(int number); 121 122 妿ç¼å·ä¸åå¨ï¼å请æ±åéæ¾ GPIO ç彿°å°æç»æ§è¡ç¸å ³æä½(è§ä¸æ)ã 123 å ¶ä»ç¼å·ä¹å¯è½è¢«æç»,æ¯å¦ä¸ä¸ªç¼å·å¯è½åå¨ï¼ä½ææ¶å¨ç»å®ççµè·¯ä¸ä¸å¯ç¨ã 124 125 ä¸ä¸ªå¹³å°æ¯å¦æ¯æå¤ä¸ª GPIO æ§å¶å¨ä¸ºå¹³å°ç¹å®çå®ç°é®é¢ï¼å°±åæ¯å¦å¯ä»¥ 126 å¨ GPIO ç¼å·ç©ºé´ä¸æâ空æ´â忝å¦å¯ä»¥å¨è¿è¡æ¶æ·»å æ°çæ§å¶å¨ä¸æ ·ã 127 è¿äºé®é¢ä¼å½±åå ¶ä»äºæ ï¼å æ¬ç¸é»ç GPIO ç¼å·æ¯å¦åå¨çã 128 129 ä½¿ç¨ GPIO 130 --------- 131 对äºä¸ä¸ª GPIOï¼ç³»ç»åºè¯¥åç第ä¸ä»¶äºæ å°±æ¯éè¿ gpio_request() 132 彿°åé å®ï¼è§ä¸æã 133 134 æ¥ä¸æ¥æ¯è®¾ç½®I/Oæ¹åï¼è¿é常æ¯å¨æ¿çº§å¯å¨ä»£ç ä¸ä¸ºæä½¿ç¨ç GPIO 设置 135 platform_device æ¶å®æã 136 137 /* 设置为è¾å ¥æè¾åº, è¿å 0 æè´çé误代ç */ 138 int gpio_direction_input(unsigned gpio); 139 int gpio_direction_output(unsigned gpio, int value); 140 141 è¿åå¼ä¸ºé¶ä»£è¡¨æåï¼å¦åè¿åä¸ä¸ªè´çé误代ç ãè¿ä¸ªè¿åå¼éè¦æ£æ¥ï¼å 为 142 get/set(è·å/设置)彿°è°ç¨æ²¡æ³è¿åé误,䏿å¯è½æ¯é ç½®é误ãéå¸¸ï¼ 143 ä½ åºè¯¥å¨è¿ç¨ä¸ä¸æä¸è°ç¨è¿äºå½æ°ãç¶è,对äºèªæéå®å ¨ç GPIOï¼å¨æ¿å 144 å¯å¨çæ©æãè¿ç¨å¯å¨å使ç¨ä»ä»¬ä¹æ¯å¯ä»¥çã 145 146 对äºä½ä¸ºè¾åºç GPIOï¼ä¸ºå ¶æä¾åå§è¾åºå¼ï¼å¯¹äºé¿å å¨ç³»ç»å¯å¨æé´åºç° 147 ä¿¡å·æ¯åºæ¯å¾æå¸®å©çã 148 149 为äºä¸ä¼ ç»ç GPIO æ¥å£å ¼å®¹, å¨è®¾ç½®ä¸ä¸ª GPIO æ¹åæ¶ï¼å¦æå®è¿æªè¢«ç³è¯·ï¼ 150 åéå«äºç³è¯·é£ä¸ª GPIO çæä½(è§ä¸æ)ãè¿ç§å ¼å®¹æ§æ£å¨ä»å¯éç gpiolib 151 æ¡æ¶ä¸ç§»é¤ã 152 153 妿è¿ä¸ª GPIO ç¼ç ä¸åå¨ï¼æè ç¹å®ç GPIO ä¸è½ç¨äºé£ç§æ¨¡å¼ï¼åæ¹å 154 设置å¯è½å¤±è´¥ãä¾èµå¯å¨åºä»¶æ¥æ£ç¡®å°è®¾ç½®æ¹åé常æ¯ä¸ä¸ªå主æï¼å 为å®å¯è½ 155 é¤äºå¯å¨Linuxï¼å¹¶æ²¡æåæ´å¤çéªè¯å·¥ä½ã(åç, æ¿åçå¯å¨ä»£ç å¯è½éè¦ 156 å°è¿ä¸ªå¤ç¨çå¼è设置为 GPIOï¼å¹¶æ£ç¡®å°é ç½®ä¸æ/䏿çµé»ã) 157 158 159 访é®èªæéå®å ¨ç GPIO 160 ------------------- 161 大夿° GPIO æ§å¶å¨å¯ä»¥éè¿å å读/åæä»¤æ¥è®¿é®ãè¿äºæä»¤ä¸ä¼ä¼ç ,å¯ä»¥ 162 å®å ¨å°å¨ç¡¬(é线ç¨)䏿ä¾ç¨å类似çä¸ä¸æä¸å®æã 163 164 对äºé£äºç¨ gpio_cansleep()æµè¯æ»æ¯è¿å失败ç GPIO(è§ä¸æ)ï¼ä½¿ç¨ 165 以ä¸ç彿°è®¿é®: 166 167 /* GPIO è¾å ¥:è¿åé¶æéé¶ */ 168 int gpio_get_value(unsigned gpio); 169 170 /* GPIO è¾åº */ 171 void gpio_set_value(unsigned gpio, int value); 172 173 GPIO弿¯å¸å°å¼ï¼é¶è¡¨ç¤ºä½çµå¹³ï¼éé¶è¡¨ç¤ºé«çµå¹³ãå½è¯»åä¸ä¸ªè¾åºå¼èç弿¶ï¼ 174 è¿åå¼åºè¯¥æ¯å¼èä¸çå¼ãè¿ä¸ªå¼ä¸æ»æ¯åè¾åºå¼ç¸ç¬¦ï¼å 为åå¨å¼æ¼è¾åºä¿¡å·å 175 è¾åºå»¶è¿é®é¢ã 176 177 以ä¸ç get/set 彿°æ é误è¿åå¼ï¼å 为ä¹å gpio_direction_*()åºå·²æ£æ¥è¿ 178 å ¶æ¯å¦ä¸ºâæ æGPIOâãæ¤å¤ï¼è¿éè¦æ³¨æçæ¯å¹¶ä¸æ¯ææå¹³å°é½å¯ä»¥ä»è¾åºå¼è 179 ä¸è¯»åæ°æ®ï¼å¯¹äºä¸è½è¯»åçå¼èåºæ»è¿åé¶ãå¦å¤ï¼å¯¹é£äºå¨ååä¸ä¸æä¸æ æ³ 180 å®å ¨è®¿é®ç GPIO (è¯è 注ï¼å 为访é®å¯è½å¯¼è´ä¼ç )使ç¨è¿äºå½æ°æ¯ä¸åéç 181 (è§ä¸æ)ã 182 183 å¨ GPIO ç¼å·(è¿æè¾åºãå¼)为常æ°çæ åµä¸,é¼å±éè¿å¹³å°ç¹å®çå®ç°æ¥ä¼å 184 è¿ä¸¤ä¸ªå½æ°æ¥è®¿é® GPIO å¼ãè¿ç§æ åµ(读åä¸ä¸ªç¡¬ä»¶å¯åå¨)ä¸åªéè¦å æ¡æä»¤ 185 æ¯å¾æ£å¸¸ç,䏿 é¡»èªæéãè¿ç§ä¼å彿°æ¯èµ·é£äºå¨åç¨åºä¸è±è´¹è®¸å¤æä»¤ç 186 彿°å¯ä»¥ä½¿å¾æ¨¡ææ¥å£(è¯è 注:ä¾å¦ GPIO 模æ I2Cã1-wire æ SPI)ç 187 åºç¨(å¨ç©ºé´åæ¶é´ä¸é½)æ´å ·æçã 188 189 190 访é®å¯è½ä¼ç ç GPIO 191 ----------------- 192 æäº GPIO æ§å¶å¨å¿ é¡»éè¿åºäºæ»çº¿(å¦ I2C æ SPI)çæ¶æ¯è®¿é®ã读æåè¿äº 193 GPIO å¼çå½ä»¤éè¦çå¾ å ¶ä¿¡æ¯æå°é馿åéå½ä»¤ï¼åè·å¾å ¶åé¦ãæé´éè¦ 194 ä¼ç ï¼è¿ä¸è½å¨ IRQ ä¾ç¨(䏿ä¸ä¸æ)䏿§è¡ã 195 196 æ¯ææ¤ç±» GPIO çå¹³å°éè¿ä»¥ä¸å½æ°è¿åéé¶å¼æ¥åºååºè¿ç§ GPIOã(æ¤å½æ°éè¦ 197 ä¸ä¸ªä¹åéè¿ gpio_request åé å°çææ GPIO ç¼å·): 198 199 int gpio_cansleep(unsigned gpio); 200 201 为äºè®¿é®è¿ç§ GPIO,å æ ¸å®ä¹äºä¸å¥ä¸åç彿°: 202 203 /* GPIO è¾å ¥:è¿åé¶æéé¶ ,å¯è½ä¼ä¼ç */ 204 int gpio_get_value_cansleep(unsigned gpio); 205 206 /* GPIO è¾åº,å¯è½ä¼ä¼ç */ 207 void gpio_set_value_cansleep(unsigned gpio, int value); 208 209 210 访é®è¿æ ·ç GPIO éè¦ä¸ä¸ªå 许ä¼ç çä¸ä¸æï¼ä¾å¦çº¿ç¨ IRQ å¤çä¾ç¨ï¼å¹¶ç¨ä»¥ä¸ç 211 访é®å½æ°æ¿æ¢é£äºæ²¡æ cansleep()åç¼çèªæéå®å ¨è®¿é®å½æ°ã 212 213 é¤äºè¿äºè®¿é®å½æ°å¯è½ä¼ç ï¼ä¸å®ä»¬æä½ç GPIO ä¸è½å¨ç¡¬ä»¶ IRQ å¤çä¾ç¨ä¸è®¿é®ç 214 äºå®ï¼è¿äºå¤çä¾ç¨å®é ä¸åèªæéå®å ¨ç彿°æ¯ä¸æ ·çã 215 216 ** 餿¤ä¹å¤ ** è°ç¨è®¾ç½®åé ç½®æ¤ç±» GPIO ç彿°ä¹å¿ é¡»å¨å 许ä¼ç çä¸ä¸æä¸ï¼ 217 å 为å®ä»¬å¯è½ä¹éè¦è®¿é® GPIO æ§å¶å¨è¯ç: (è¿äºè®¾ç½®å½æ°é叏卿¿çº§å¯å¨ä»£ç æè 218 驱卿¢æµ/æå¼ä»£ç ä¸ï¼æä»¥è¿æ¯ä¸ä¸ªå®¹ææ»¡è¶³ççº¦ææ¡ä»¶ã) 219 220 gpio_direction_input() 221 gpio_direction_output() 222 gpio_request() 223 224 ## gpio_request_one() 225 ## gpio_request_array() 226 ## gpio_free_array() 227 228 gpio_free() 229 gpio_set_debounce() 230 231 232 233 声æåéæ¾ GPIO 234 ---------------------------- 235 ä¸ºäºæå©äºæè·ç³»ç»é ç½®é误,å®ä¹äºä¸¤ä¸ªå½æ°ã 236 237 /* ç³è¯· GPIO, è¿å 0 æè´çé误代ç . 238 * é空æ ç¾å¯è½æå©äºè¯æ. 239 */ 240 int gpio_request(unsigned gpio, const char *label); 241 242 /* éæ¾ä¹å声æç GPIO */ 243 void gpio_free(unsigned gpio); 244 245 å°æ æç GPIO ç¼ç ä¼ éç» gpio_request()ä¼å¯¼è´å¤±è´¥ï¼ç³è¯·ä¸ä¸ªå·²ä½¿ç¨è¿ä¸ª 246 彿°å£°æè¿ç GPIO ä¹ä¼å¤±è´¥ãgpio_request()çè¿åå¼å¿ é¡»æ£æ¥ãä½ åºè¯¥å¨ 247 è¿ç¨ä¸ä¸æä¸è°ç¨è¿äºå½æ°ãç¶è,对äºèªæéå®å ¨ç GPIO,卿¿åå¯å¨çæ©æã 248 è¿å ¥è¿ç¨ä¹åæ¯å¯ä»¥ç³è¯·çã 249 250 è¿ä¸ªå½æ°å®æä¸¤ä¸ªåºæ¬çç®æ ã䏿¯æ è¯é£äºå®é ä¸å·²ä½ä¸º GPIO 使ç¨çä¿¡å·çº¿ï¼ 251 è¿æ ·ä¾¿äºæ´å¥½å°è¯æ;ç³»ç»å¯è½éè¦æå¡å ç¾ä¸ªå¯ç¨ç GPIOï¼ä½æ¯å¯¹äºä»»ä½ä¸ä¸ª 252 ç»å®ççµè·¯æ¿éå¸¸åªæä¸äºè¢«ä½¿ç¨ãå¦ä¸ä¸ªç®çæ¯æè·å²çªï¼æ¥æé误:å¦ä¸¤ä¸ªæ 253 æ´å¤é©±å¨é误å°è®¤ä¸ºä»ä»¬å·²ç»ç¬å äºæä¸ªä¿¡å·çº¿,ææ¯é误å°è®¤ä¸ºç§»é¤ä¸ä¸ªç®¡çç 254 æä¸ªå·²æ¿æ´»ä¿¡å·ç驱卿¯å®å ¨çãä¹å°±æ¯è¯´ï¼ç³è¯· GPIO çä½ç¨ç±»ä¼¼ä¸ç§éæºå¶ã 255 256 æäºå¹³å°å¯è½ä¹ä½¿ç¨ GPIO ä½ä¸ºçµæºç®¡çæ¿æ´»ä¿¡å·(ä¾å¦éè¿å ³éæªä½¿ç¨è¯çåºå 257 ç®åå°å ³éæªä½¿ç¨æ¶é)ã 258 259 å¯¹äº GPIO ä½¿ç¨ pinctrl åç³»ç»å·²ç¥çå¼èï¼åç³»ç»åºè¯¥è¢«åç¥å ¶ä½¿ç¨æ åµï¼ 260 ä¸ä¸ª gpiolib 驱å¨ç .request()æä½åºè°ç¨ pinctrl_request_gpio()ï¼ 261 è gpiolib 驱å¨ç .free()æä½åºè°ç¨ pinctrl_free_gpio()ãpinctrl 262 åç³»ç»å 许 pinctrl_request_gpio()å¨æä¸ªå¼èæå¼èç»ä»¥å¤ç¨å½¢å¼âå±äºâ 263 ä¸ä¸ªè®¾å¤æ¶é½æåè¿åã 264 265 ä»»ä½é¡»å° GPIO ä¿¡å·å¯¼åéå½å¼èçå¼èå¤ç¨ç¡¬ä»¶çç¼ç¨åºè¯¥åçå¨ GPIO 266 驱å¨ç .direction_input()æ .direction_output()彿°ä¸ï¼ä»¥å 267 ä»»ä½è¾åº GPIO å¼ç设置ä¹åãè¿æ ·å¯ä½¿ä»å¼èç¹æ®åè½å° GPIO çè½¬æ¢ 268 ä¸ä¼å¨å¼èäº§çæ¯åºæ³¢å½¢ãææ¶å½ç¨ä¸ä¸ª GPIO å®ç°å ¶ä¿¡å·é©±å¨ä¸ä¸ªé GPIO 269 硬件模åçè§£å³æ¹æ¡æ¶ï¼å°±éè¦è¿ç§æºå¶ã 270 271 æäºå¹³å°å 许é¨åæææ GPIO ä¿¡å·ä½¿ç¨ä¸åçå¼èã类似çï¼GPIO æå¼èç 272 å ¶ä»æ¹é¢ä¹éè¦é ç½®ï¼å¦ä¸æ/䏿ãå¹³å°è½¯ä»¶åºè¯¥å¨å¯¹è¿äº GPIO è°ç¨ 273 gpio_request()åå°è¿ç±»ç»èé 置好ï¼ä¾å¦ä½¿ç¨ pinctrl åç³»ç»çæ å°è¡¨ï¼ 274 ä½¿å¾ GPIO çç¨æ·æ é¡»å ³æ³¨è¿äºç»èã 275 276 è¿æä¸ä¸ªå¼å¾æ³¨æçæ¯å¨éæ¾ GPIO åï¼ä½ å¿ é¡»åæ¢ä½¿ç¨å®ã 277 278 279 注æ:ç³è¯·ä¸ä¸ª GPIO 并没æä»¥ä»»ä½æ¹å¼é ç½®å®ï¼åªä¸è¿æ è¯é£ä¸ª GPIO å¤äºä½¿ç¨ 280 ç¶æãå¿ é¡»æå¦å¤çä»£ç æ¥å¤çå¼èé ç½®(妿§å¶ GPIO 使ç¨çå¼èã䏿/䏿)ã 281 èèå°å¤§å¤æ°æ åµä¸å£°æ GPIO ä¹åå°±ä¼ç«å³é ç½®å®ä»¬,æä»¥å®ä¹äºä»¥ä¸ä¸ä¸ªè¾ å©å½æ°: 282 283 /* ç³è¯·ä¸ä¸ª GPIO ä¿¡å·, åæ¶éè¿ç¹å®ç'flags'åå§åé ç½®, 284 * å ¶ä»å gpio_request()çåæ°åè¿åå¼ç¸å 285 * 286 */ 287 int gpio_request_one(unsigned gpio, unsigned long flags, const char *label); 288 289 /* å¨åä¸ªå½æ°ä¸ç³è¯·å¤ä¸ª GPIO 290 */ 291 int gpio_request_array(struct gpio *array, size_t num); 292 293 /* å¨åä¸ªå½æ°ä¸éæ¾å¤ä¸ª GPIO 294 */ 295 void gpio_free_array(struct gpio *array, size_t num); 296 297 è¿é 'flags' å½åå®ä¹å¯æå®ä»¥ä¸å±æ§: 298 299 * GPIOF_DIR_IN - é ç½®æ¹å为è¾å ¥ 300 * GPIOF_DIR_OUT - é ç½®æ¹å为è¾åº 301 302 * GPIOF_INIT_LOW - å¨ä½ä¸ºè¾åºæ¶,åå§å¼ä¸ºä½çµå¹³ 303 * GPIOF_INIT_HIGH - å¨ä½ä¸ºè¾åºæ¶,åå§å¼ä¸ºé«çµå¹³ 304 * GPIOF_OPEN_DRAIN - gpioå¼èä¸ºå¼æ¼ä¿¡å· 305 * GPIOF_OPEN_SOURCE - gpioå¼èä¸ºæºæå¼è·¯ä¿¡å· 306 307 * GPIOF_EXPORT_DIR_FIXED - å° gpio 导åºå° sysfsï¼å¹¶ä¿ææ¹å 308 * GPIOF_EXPORT_DIR_CHANGEABLE - åæ ·æ¯å¯¼åº, ä½å 许æ¹åæ¹å 309 310 å 为 GPIOF_INIT_* ä» æå¨é 置为è¾åºçæ¶åæåå¨,æä»¥ææçç»å为: 311 312 * GPIOF_IN - é 置为è¾å ¥ 313 * GPIOF_OUT_INIT_LOW - é 置为è¾åº,å¹¶åå§å为ä½çµå¹³ 314 * GPIOF_OUT_INIT_HIGH - é 置为è¾åº,å¹¶åå§å为é«çµå¹³ 315 316 å½è®¾ç½® flag 为 GPIOF_OPEN_DRAIN æ¶ï¼åå设å¼èæ¯å¼æ¼ä¿¡å·ãè¿æ ·çå¼è 317 å°ä¸ä¼å¨è¾åºæ¨¡å¼ä¸ç½®1ãè¿æ ·çå¼èéè¦è¿æ¥ä¸æçµé»ãéè¿ä½¿è½è¿ä¸ªæ å¿ï¼gpioåº 318 å°ä¼å¨è¢«è¦æ±è¾åºæ¨¡å¼ä¸ç½®1æ¶å°å¼èå为è¾å ¥ç¶ææ¥ä½¿å¼èç½®é«ãå¼èå¨è¾åºæ¨¡å¼ä¸ 319 éè¿ç½®0ä½¿å ¶è¾åºä½çµå¹³ã 320 321 å½è®¾ç½® flag 为 GPIOF_OPEN_SOURCE æ¶ï¼åå设å¼èä¸ºæºæå¼è·¯ä¿¡å·ãè¿æ ·çå¼è 322 å°ä¸ä¼å¨è¾åºæ¨¡å¼ä¸ç½®0ãè¿æ ·çå¼èéè¦è¿æ¥ä¸æçµé»ãéè¿ä½¿è½è¿ä¸ªæ å¿ï¼gpioåº 323 å°ä¼å¨è¢«è¦æ±è¾åºæ¨¡å¼ä¸ç½®0æ¶å°å¼èå为è¾å ¥ç¶ææ¥ä½¿å¼èç½®ä½ãå¼èå¨è¾åºæ¨¡å¼ä¸ 324 éè¿ç½®1ä½¿å ¶è¾åºé«çµå¹³ã 325 326 å°æ¥è¿äºæ å¿å¯è½æ©å±å°æ¯ææ´å¤ç屿§ã 327 328 æ´è¿ä¸æ¥,ä¸ºäºæ´ç®åå°å£°æ/éæ¾å¤ä¸ª GPIO,'struct gpio'被å¼è¿æ¥å°è£ ææ 329 è¿ä¸ä¸ªé¢å: 330 331 struct gpio { 332 unsigned gpio; 333 unsigned long flags; 334 const char *label; 335 }; 336 337 ä¸ä¸ªå ¸åçç¨ä¾: 338 339 static struct gpio leds_gpios[] = { 340 { 32, GPIOF_OUT_INIT_HIGH, "Power LED" }, /* é»è®¤å¼å¯ */ 341 { 33, GPIOF_OUT_INIT_LOW, "Green LED" }, /* é»è®¤å ³é */ 342 { 34, GPIOF_OUT_INIT_LOW, "Red LED" }, /* é»è®¤å ³é */ 343 { 35, GPIOF_OUT_INIT_LOW, "Blue LED" }, /* é»è®¤å ³é */ 344 { ... }, 345 }; 346 347 err = gpio_request_one(31, GPIOF_IN, "Reset Button"); 348 if (err) 349 ... 350 351 err = gpio_request_array(leds_gpios, ARRAY_SIZE(leds_gpios)); 352 if (err) 353 ... 354 355 gpio_free_array(leds_gpios, ARRAY_SIZE(leds_gpios)); 356 357 358 GPIO æ å°å° IRQ 359 -------------------- 360 GPIO ç¼å·æ¯æ ç¬¦å·æ´æ°;IRQ ç¼å·ä¹æ¯ãè¿äºææäºä¸¤ä¸ªé»è¾ä¸ä¸åçå½åç©ºé´ 361 (GPIO 0 ä¸ä¸å®ä½¿ç¨ IRQ 0)ãä½ å¯ä»¥éè¿ä»¥ä¸å½æ°å¨å®ä»¬ä¹é´å®ç°æ å°: 362 363 /* æ å° GPIO ç¼å·å° IRQ ç¼å· */ 364 int gpio_to_irq(unsigned gpio); 365 366 /* æ å° IRQ ç¼å·å° GPIO ç¼å· (å°½éé¿å 使ç¨) */ 367 int irq_to_gpio(unsigned irq); 368 369 å®ä»¬çè¿åå¼ä¸ºå¯¹åºå½å空é´çç¸å ³ç¼å·ï¼ææ¯è´çé误代ç (å¦ææ æ³æ å°)ã 370 (ä¾å¦,æäº GPIO æ æ³å为 IRQ 使ç¨ã)以ä¸çç¼å·éè¯¯æ¯æªç»æ£æµç:使ç¨ä¸ä¸ª 371 æªéè¿ gpio_direction_input()é 置为è¾å ¥ç GPIO ç¼å·ï¼æè 使ç¨ä¸ä¸ª 372 并鿥æºäºgpio_to_irq()ç IRQ ç¼å·ã 373 374 è¿ä¸¤ä¸ªæ å°å½æ°å¯è½ä¼å¨ä¿¡å·ç¼å·çå å计ç®è¿ç¨ä¸è±äºæ¶é´ãå®ä»¬ä¸å¯ä¼ç ã 375 376 gpio_to_irq()è¿åçéé误å¼å¯ä»¥ä¼ éç» request_irq()æè free_irq()ã 377 å®ä»¬é常éè¿æ¿çº§ç¹å®çåå§å代ç åæ¾å°å¹³å°è®¾å¤ç IRQ èµæºä¸ã注æ:IRQ 378 触åéé¡¹æ¯ IRQ æ¥å£çä¸é¨åï¼å¦ IRQF_TRIGGER_FALLINGï¼ç³»ç»å¤éè½å 379 乿¯å¦æ¤ã 380 381 irq_to_gpio()è¿åçéé误å¼å¤§å¤æ°é常å¯ä»¥è¢« gpio_get_value()æä½¿ç¨ï¼ 382 æ¯å¦å¨ IRQ æ¯æ²¿è§¦åæ¶åå§åææ´æ°é©±å¨ç¶æã注ææäºå¹³å°ä¸æ¯æåæ å°,æä»¥ 383 ä½ åºè¯¥å°½éé¿å 使ç¨å®ã 384 385 386 模æå¼æ¼ä¿¡å· 387 ---------------------------- 388 ææ¶å¨åªæä½çµå¹³ä¿¡å·ä½ä¸ºå®é 驱å¨ç»æ(è¯è 注:å¤ä¸ªè¾åºè¿æ¥äºä¸ç¹ï¼é»è¾çµå¹³ 389 ç»æä¸ºææè¾åºçé»è¾ä¸)çæ¶å,å ±äº«çä¿¡å·çº¿éè¦ä½¿ç¨â弿¼âä¿¡å·ã(该æ¯è¯ 390 éç¨äº CMOS 管ï¼è TTL ç¨âéçµæå¼è·¯âã)ä¸ä¸ªä¸æçµé»ä½¿ä¿¡å·ä¸ºé«çµå¹³ãè¿ 391 ææ¶è¢«ç§°ä¸ºâ线ä¸âãå®é ä¸ï¼ä»è´é»è¾(ä½çµå¹³ä¸ºç)çè§åº¦æ¥çï¼è¿æ¯ä¸ä¸ªâ线æâã 392 393 ä¸ä¸ªå¼æ¼ä¿¡å·ç常è§ä¾åæ¯å ±äº«çä½çµå¹³ä½¿è½ IRQ ä¿¡å·çº¿ãæ¤å¤,ææ¶ååæ°æ®æ»çº¿ 394 ä¿¡å·ä¹ä½¿ç¨æ¼æå¼è·¯ä¿¡å·ã 395 396 æäº GPIO æ§å¶å¨ç´æ¥æ¯æå¼æ¼è¾åºï¼è¿æè®¸å¤ä¸æ¯æãå½ä½ éè¦å¼æ¼ä¿¡å·ï¼ä½ 397 硬件åä¸ç´æ¥æ¯æçæ¶åï¼ä¸ä¸ªå¸¸ç¨çæ¹æ³æ¯ç¨ä»»ä½å³å¯ä½è¾å ¥ä¹å¯ä½è¾åºç GPIO 398 å¼èæ¥æ¨¡æ: 399 400 LOW: gpio_direction_output(gpio, 0) ... è¿ä»£ç 驱å¨ä¿¡å·å¹¶è¦ç 401 䏿é ç½®ã 402 403 HIGH: gpio_direction_input(gpio) ... è¿ä»£ç å ³éè¾åº,æä»¥ä¸æçµé» 404 (æå ¶ä»çä¸äºå¨ä»¶)æ§å¶äºä¿¡å·ã 405 406 å¦æä½ å°ä¿¡å·çº¿â驱å¨â为é«çµå¹³ï¼ä½æ¯ gpio_get_value(gpio)æ¥åäºä¸ä¸ª 407 ä½çµå¹³(å¨éå½çä¸åæ¶é´å)ï¼ä½ å°±å¯ä»¥ç¥éæ¯å ¶ä»çä¸äºç»ä»¶å°å ±äº«ä¿¡å·çº¿æä½äºã 408 è¿ä¸ä¸å®æ¯é误çãä¸ä¸ªå¸¸è§çä¾åå°±æ¯ I2C æ¶éçå»¶é¿ï¼ä¸ä¸ªéè¦è¾æ ¢æ¶éç 409 ä»è®¾å¤å»¶è¿ SCK çä¸å沿ï¼è I2C 主设å¤ç¸åºå°è°æ´å ¶ä¿¡å·ä¼ è¾éçã 410 411 412 è¿äºå ¬çº¦å¿½ç¥äºä»ä¹? 413 ================ 414 è¿äºå ¬çº¦å¿½ç¥çæå¤§ä¸ä»¶äºå°±æ¯å¼èå¤ç¨ï¼å 为è¿å±äºé«åº¦è¯çç¹å®ç屿§ä¸ 415 没æå¯ç§»æ¤æ§ãæä¸ªå¹³å°å¯è½ä¸éè¦æç¡®çå¤ç¨ä¿¡æ¯ï¼æç对äºä»»æç»å®çå¼è 416 å¯è½åªæä¸¤ä¸ªåè½éé¡¹ï¼æçå¯è½æ¯ä¸ªå¼èæå «ä¸ªåè½éé¡¹ï¼æçå¯è½å¯ä»¥å° 417 å 个å¼èä¸çä»»ä½ä¸ä¸ªä½ä¸ºç»å®ç GPIOã(æ¯çï¼è¿äºä¾å齿¥èªäºå½åè¿è¡ 418 Linux çç³»ç»ã) 419 420 卿äºç³»ç»ä¸,ä¸å¼èå¤ç¨ç¸å ³çæ¯é ç½®å使è½éæçä¸ãä¸ææ¨¡å¼ã并䏿¯ææ 421 å¹³å°é½æ¯æè¿ç§æ¨¡å¼,æè ä¸ä¼ä»¥ç¸åçæ¹å¼æ¥æ¯æè¿ç§æ¨¡å¼ï¼ä¸ä»»ä½ç»å®ççµè·¯æ¿ 422 å¯è½ä½¿ç¨å¤ç½®ç䏿(æä¸æ)çµé»,è¿æ¶è¯çä¸çå°±ä¸åºè¯¥ä½¿ç¨ã(å½ä¸ä¸ªçµè·¯éè¦ 423 5kOhm çæå¨çµé»,è¯çä¸ç 100 kOhm çµé»å°±ä¸è½åå°ã)åæ ·çï¼é©±å¨è½å 424 (2 mA vs 20 mA)åçµå(1.8V vs 3.3V)æ¯å¹³å°ç¹å®é®é¢,就忍¡å䏿 ·å¨ 425 å¯é ç½®å¼èå GPIO ä¹é´(没)æä¸ä¸å¯¹åºçå ³ç³»ã 426 427 è¿æå ¶ä»ä¸äºç³»ç»ç¹å®çæºå¶æ²¡æå¨è¿éæåºï¼ä¾å¦ä¸è¿°çè¾å ¥å»æ¯åºå线ä¸è¾åº 428 é项ã硬件å¯è½æ¯ææ¹é读æå GPIOï¼ä½æ¯é£ä¸è¬æ¯é ç½®ç¸å ³çï¼å¯¹äºå¤äºåä¸ 429 ååº(bank)çGPIOã(GPIO é常以 16 æ 32 ä¸ªç»æä¸ä¸ªåºåï¼ä¸ä¸ªç»å®ç 430 çä¸ç³»ç»ä¸è¬æå ä¸ªè¿æ ·çåºåã)æäºç³»ç»å¯ä»¥éè¿è¾åº GPIO 触å IRQï¼ 431 æè ä»å¹¶é以 GPIO 管ççå¼èåå¼ãè¿äºæºå¶çç¸å ³ä»£ç 没æå¿ è¦å ·æå¯ç§»æ¤æ§ã 432 433 å½åï¼å¨æå®ä¹ GPIO 并䏿¯æ åçï¼ä¾å¦ä½ä¸ºé ç½®ä¸ä¸ªå¸¦ææäº GPIO æ©å±å¨ç 434 éå çµè·¯æ¿çå¯ä½ç¨ã 435 436 GPIO å®ç°è çæ¡æ¶ (å¯é) 437 ===================== 438 å颿å°äºï¼æä¸ä¸ªå¯éçå®ç°æ¡æ¶ï¼è®©å¹³å°ä½¿ç¨ç¸åçç¼ç¨æ¥å£ï¼æ´å ç®åå°æ¯æ 439 ä¸åç§ç±»ç GPIO æ§å¶å¨ãè¿ä¸ªæ¡æ¶ç§°ä¸º"gpiolib"ã 440 441 ä½ä¸ºä¸ä¸ªè¾ å©è°è¯åè½ï¼å¦æ debugfs å¯ç¨ï¼å°±ä¼æä¸ä¸ª /sys/kernel/debug/gpio 442 æä»¶ãéè¿è¿ä¸ªæ¡æ¶ï¼å®å¯ä»¥ååºæææ³¨åçæ§å¶å¨,以åå½åæ£å¨ä½¿ç¨ä¸ç GPIO 443 çç¶æã 444 445 446 æ§å¶å¨é©±å¨: gpio_chip 447 ------------------- 448 卿¡æ¶ä¸æ¯ä¸ª GPIO æ§å¶å¨é½å è£ ä¸ºä¸ä¸ª "struct gpio_chip"ï¼ä»å å«äº 449 该类åçæ¯ä¸ªæ§å¶å¨ç常ç¨ä¿¡æ¯: 450 451 - 设置 GPIO æ¹åçæ¹æ³ 452 - ç¨äºè®¿é® GPIO å¼çæ¹æ³ 453 - åç¥è°ç¨å ¶æ¹æ³æ¯å¦å¯è½ä¼ç çæ å¿ 454 - å¯éç debugfs ä¿¡æ¯å¯¼åºæ¹æ³ (æ¾ç¤ºç±»ä¼¼ä¸æé ç½®ä¸æ ·çé¢å¤ç¶æ) 455 - è¯ææ ç¾ 456 457 ä¹å å«äºæ¥èª device.platform_data çæ¯ä¸ªå®ä¾çæ°æ®ï¼å®ç¬¬ä¸ä¸ª GPIO ç 458 ç¼å·åå®å¯ç¨ç GPIO çæ°éã 459 460 å®ç° gpio_chip ç代ç åºæ¯æå¤æ§å¶å¨å®ä¾ï¼è¿å¯è½ä½¿ç¨é©±å¨æ¨¡åãé£äºä»£ç è¦ 461 é ç½®æ¯ä¸ª gpio_chipï¼å¹¶åèµ·gpiochip_add()ãå¸è½½ä¸ä¸ª GPIO æ§å¶å¨å¾å°è§ï¼ 462 ä½å¨å¿ è¦çæ¶åå¯ä»¥ä½¿ç¨ gpiochip_remove()ã 463 464 大é¨å gpio_chip æ¯ä¸ä¸ªå®ä¾ç¹å®ç»æä½çä¸é¨åï¼èå¹¶ä¸å° GPIO æ¥å£åç¬ 465 æ´é²åºæ¥,æ¯å¦ç¼åãçµæºç®¡ççã类似ç¼è§£ç å¨è¿æ ·çè¯ç伿夿çé GPIO 466 ç¶æã 467 468 ä»»ä½ä¸ä¸ª debugfs ä¿¡æ¯å¯¼åºæ¹æ³é常åºè¯¥å¿½ç¥è¿æªç³è¯·ä½ä¸º GPIO çä¿¡å·çº¿ã 469 ä»ä»¬å¯ä»¥ä½¿ç¨ gpiochip_is_requested()æµè¯ï¼å½è¿ä¸ª GPIO å·²ç»ç³è¯·è¿äº 470 å°±è¿åç¸å ³çæ ç¾ï¼å¦åè¿å NULLã 471 472 473 平尿¯æ 474 ------- 475 ä¸ºäºæ¯æè¿ä¸ªæ¡æ¶ï¼ä¸ä¸ªå¹³å°ç Kconfig æä»¶å°ä¼ "select"(éæ©) 476 ARCH_REQUIRE_GPIOLIB æ ARCH_WANT_OPTIONAL_GPIOLIBï¼å¹¶è®©å®ç 477 <asm/gpio.h> å å« <asm-generic/gpio.h>ï¼åæ¶å®ä¹ä¸ä¸ªæ¹æ³: 478 gpio_get_value()ãgpio_set_value()å gpio_cansleep()ã 479 480 å®ä¹åºæä¾ä¸ä¸ª ARCH_NR_GPIOS çå®ä¹å¼ï¼è¿æ ·å¯ä»¥æ´å¥½å°åæ è¯¥å¹³å° GPIO 481 çå®é æ°é,èçéæè¡¨ç空é´ã(è¿ä¸ªå®ä¹å¼åºè¯¥å å«çä¸ç³»ç»å 建 GPIO å 482 GPIO æ©å±å¨ä¸çæ°æ®ã) 483 484 ARCH_REQUIRE_GPIOLIB æå³ç gpiolib æ ¸å¿å¨è¿ä¸ªææ¶ä¸å°æ»æ¯ç¼è¯è¿å æ ¸ã 485 486 ARCH_WANT_OPTIONAL_GPIOLIB æå³ç gpiolib æ ¸å¿é»è®¤å ³é,ä¸ç¨æ·å¯ä»¥ 487 使è½å®,å¹¶å°å ¶ç¼è¯è¿å æ ¸(å¯é)ã 488 489 妿è¿äºé项齿²¡è¢«éæ©,该平å°å°±ä¸éè¿ GPIO-lib æ¯æ GPIO,ä¸ä»£ç ä¸å¯ä»¥ 490 è¢«ç¨æ·ä½¿è½ã 491 492 以ä¸è¿äºæ¹æ³çå®ç°å¯ä»¥ç´æ¥ä½¿ç¨æ¡æ¶ä»£ç ,å¹¶æ»æ¯éè¿ gpio_chip è°åº¦: 493 494 #define gpio_get_value __gpio_get_value 495 #define gpio_set_value __gpio_set_value 496 #define gpio_cansleep __gpio_cansleep 497 498 è¿äºå®ä¹å¯ä»¥ç¨æ´çæ³çå®ç°æ¹æ³æ¿ä»£ï¼é£å°±æ¯ä½¿ç¨ç»è¿é»è¾ä¼åçå è彿°æ¥è®¿é® 499 åºäºç¹å®çä¸ç³»ç»ç GPIOãä¾å¦,è¥å¼ç¨ç GPIO (å¯åå¨ä½åç§»)æ¯å¸¸éâ12âï¼ 500 读åæè®¾ç½®å®å¯è½åªéå°å两æä¸ä¸ªæä»¤ï¼ä¸ä¸ä¼ä¼ç ãå½è¿æ ·çä¼åæ æ³å®ç°æ¶ï¼ 501 é£äºå½æ°å¿ é¡»ä½¿ç¨æ¡æ¶æä¾ç代ç ï¼é£å°±è³å°è¦å åæ¡æä»¤æå¯ä»¥å®ç°ã对äºç¨ GPIO 502 模æç I/O æ¥å£, 妿¤ç²¾ç®æä»¤æ¯å¾ææä¹çã 503 504 对äºçä¸ç³»ç»ï¼å¹³å°ç¹å®ä»£ç 为çä¸ GPIO æ¯ä¸ªåº(bank)å®ä¹å¹¶æ³¨å gpio_chip 505 å®ä¾ãé£äº GPIO åºè¯¥æ ¹æ®è¯çååçææ¡£è¿è¡ç¼ç /æ ç¾,å¹¶ç´æ¥åçµè·¯æ¿åçå¾ 506 对åºãä»ä»¬åºè¯¥å¼å§äºé¶å¹¶ç»æ¢äºå¹³å°ç¹å®çéå¶ãè¿äº GPIO(代ç )éå¸¸ä» 507 arch_initcall()æè æ´æ©çå°æ¹éæè¿å¹³å°åå§å代ç ï¼ä½¿è¿äº GPIO æ»æ¯å¯ç¨ï¼ 508 ä¸ä»ä»¬é常å¯ä»¥ä½ä¸º IRQ 使ç¨ã 509 510 æ¿çº§æ¯æ 511 ------- 512 对äºå¤é¨ GPIO æ§å¶å¨(ä¾å¦ I2C æ SPI æ©å±å¨ãä¸ç¨è¯çãå¤åè½å¨ä»¶ãFPGA 513 æ CPLD)ï¼å¤§å¤æ°å¸¸ç¨æ¿çº§ç¹å®ä»£ç é½å¯ä»¥æ³¨åæ§å¶å¨è®¾å¤ï¼å¹¶ä¿è¯ä»ä»¬ç驱å¨ç¥é 514 gpiochip_add()æä½¿ç¨ç GPIO ç¼å·ãä»ä»¬çèµ·å§ç¼å·é常è·å¨å¹³å°ç¹å®ç GPIO 515 ç¼å·ä¹åã 516 517 ä¾å¦æ¿çº§å¯å¨ä»£ç åºè¯¥åå»ºç»æä½ææè¯çå ¬å¼ç GPIO èå´ï¼å¹¶ä½¿ç¨ platform_data 518 å°å ¶ä¼ éç»æ¯ä¸ª GPIO æ©å±å¨è¯çãç¶åè¯ç驱å¨ä¸ç probe()ä¾ç¨å¯ä»¥å°è¿ä¸ª 519 æ°æ®ä¼ éç» gpiochip_add()ã 520 521 åå§å顺åºå¾éè¦ãä¾å¦ï¼å¦æä¸ä¸ªè®¾å¤ä¾èµåºäº I2C ç(æ©å±)GPIOï¼é£ä¹å®ç 522 probe()ä¾ç¨å°±åºè¯¥å¨é£ä¸ª GPIO ææä»¥åæå¯ä»¥è¢«è°ç¨ãè¿æå³ç设å¤åºè¯¥å¨ 523 GPIO å¯ä»¥å·¥ä½ä¹åæå¯è¢«æ³¨åãè§£å³è¿ç±»ä¾èµççä¸ç§æ¹æ³æ¯è®©è¿ç§ gpio_chip 524 æ§å¶å¨åæ¿çº§ç¹å®ä»£ç æä¾ setup()å teardown()åè°å½æ°ã䏿¦ææå¿ é¡»ç 525 èµæºå¯ç¨ä¹åï¼è¿äºæ¿çº§ç¹å®çåè°å½æ°å°ä¼æ³¨å设å¤ï¼å¹¶å¯ä»¥å¨è¿äº GPIO æ§å¶å¨ 526 设å¤åææ ææ¶ç§»é¤å®ä»¬ã 527 528 529 ç¨æ·ç©ºé´ç Sysfs æ¥å£(å¯é) 530 ======================== 531 使ç¨âgpiolibâå®ç°æ¡æ¶çå¹³å°å¯ä»¥éæ©é ç½®ä¸ä¸ª GPIO ç sysfs ç¨æ·æ¥å£ã 532 è¿ä¸åäº debugfs æ¥å£ï¼å ä¸ºå®æä¾çæ¯å¯¹ GPIOæ¹ååå¼çæ§å¶ï¼èä¸åªæ¾ç¤º 533 ä¸ä¸ªGPIO çç¶ææè¦ãæ¤å¤,å®å¯ä»¥åºç°å¨æ²¡æè°è¯æ¯æç产å级系ç»ä¸ã 534 535 ä¾å¦ï¼éè¿éå½çç³»ç»ç¡¬ä»¶ææ¡£ï¼ç¨æ·ç©ºé´å¯ä»¥ç¥é GIOP #23 æ§å¶ Flash 536 åå¨å¨çåä¿æ¤(ç¨äºä¿æ¤å ¶ä¸ Bootloader ååº)ã产åçç³»ç»å级å¯è½éè¦ 537 临æ¶è§£é¤è¿ä¸ªä¿æ¤ï¼é¦å å¯¼å ¥ä¸ä¸ª GPIOï¼æ¹åå ¶è¾åºç¶æï¼ç¶åå¨éæ°ä½¿è½åä¿æ¤ 538 åå级代ç ãé常æ åµä¸,GPIO #23 æ¯ä¸ä¼è¢«è§¦åçï¼å¹¶ä¸å æ ¸ä¹ä¸éè¦ç¥éä»ã 539 540 æ ¹æ®éå½çç¡¬ä»¶ææ¡£ï¼æäºç³»ç»çç¨æ·ç©ºé´ GPIO å¯ä»¥ç¨äºç¡®å®ç³»ç»é ç½®æ°æ®ï¼ 541 è¿äºæ°æ®æ¯æ åå æ ¸ä¸ç¥éçã卿äºä»»å¡ä¸ï¼ç®åçç¨æ·ç©ºé´ GPIO 驱å¨å¯è½æ¯ 542 ç³»ç»çæ£éè¦çã 543 544 注æï¼æ åå æ ¸é©±å¨ä¸å·²ç»åå¨éç¨çâLED åæé®âGPIO ä»»å¡ï¼å嫿¯: 545 "leds-gpio" å "gpio_keys"ã请使ç¨è¿äºæ¥æ¿ä»£ç´æ¥è®¿é® GPIOï¼å 为éæå¨ 546 å æ ¸æ¡æ¶ä¸çè¿ç±»é©±å¨æ¯ä½ å¨ç¨æ·ç©ºé´çä»£ç æ´å¥½ã 547 548 549 Sysfs ä¸çè·¯å¾ 550 -------------- 551 å¨/sys/class/gpio 䏿 3 ç±»å ¥å£: 552 553 - ç¨äºå¨ç¨æ·ç©ºé´æ§å¶ GPIO çæ§å¶æ¥å£; 554 555 - GPIOs æ¬èº«;以å 556 557 - GPIO æ§å¶å¨ ("gpio_chip" å®ä¾)ã 558 559 é¤äºè¿äºæ åçæä»¶,è¿å å«âdeviceâ符å·é¾æ¥ã 560 561 æ§å¶æ¥å£æ¯åªåç: 562 563 /sys/class/gpio/ 564 565 "export" ... ç¨æ·ç©ºé´å¯ä»¥éè¿åå ¶ç¼å·å°è¿ä¸ªæä»¶ï¼è¦æ±å æ ¸å¯¼åº 566 ä¸ä¸ª GPIO çæ§å¶å°ç¨æ·ç©ºé´ã 567 568 ä¾å¦: å¦æå æ ¸ä»£ç 没æç³è¯· GPIO #19,"echo 19 > export" 569 å°ä¼ä¸º GPIO #19 å建ä¸ä¸ª "gpio19" èç¹ã 570 571 "unexport" ... 导åºå°ç¨æ·ç©ºé´çéæä½ã 572 573 ä¾å¦: "echo 19 > unexport" å°ä¼ç§»é¤ä½¿ç¨"export"æä»¶å¯¼åºç 574 "gpio19" èç¹ã 575 576 GPIO ä¿¡å·çè·¯å¾ç±»ä¼¼ /sys/class/gpio/gpio42/ (å¯¹äº GPIO #42 æ¥è¯´)ï¼ 577 å¹¶æå¦ä¸ç读/å屿§: 578 579 /sys/class/gpio/gpioN/ 580 581 "direction" ... 读åå¾å° "in" æ "out"ãè¿ä¸ªå¼é常è¿è¡åå ¥ã 582 åå ¥"out" æ¶,å ¶å¼èçé»è®¤è¾åºä¸ºä½çµå¹³ã为äºç¡®ä¿æ æ éè¿è¡ï¼ 583 "low" æ "high" ççµå¹³å¼åºè¯¥åå ¥ GPIO çé ç½®ï¼ä½ä¸ºåå§è¾åºå¼ã 584 585 注æ:å¦æå æ ¸ä¸æ¯ææ¹å GPIO çæ¹åï¼æè å¨å¯¼åºæ¶å æ ¸ä»£ç æ²¡æ 586 æç¡®å è®¸ç¨æ·ç©ºé´å¯ä»¥éæ°é ç½® GPIO æ¹åï¼é£ä¹è¿ä¸ªå±æ§å°ä¸åå¨ã 587 588 "value" ... 读åå¾å° 0 (ä½çµå¹³) æ 1 (é«çµå¹³)ã妿 GPIO é 置为 589 è¾åº,è¿ä¸ªå¼å 许åæä½ãä»»ä½éé¶å¼é½ä»¥é«çµå¹³çå¾ ã 590 591 妿å¼èå¯ä»¥é ç½®ä¸ºä¸æä¿¡å·ï¼ä¸å¦æå·²ç»é ç½®äºäº§çä¸æçæ¨¡å¼ 592 ï¼è§"edge"çæè¿°ï¼ï¼ä½ å¯ä»¥å¯¹è¿ä¸ªæä»¶ä½¿ç¨è½®è¯¢æä½(poll(2))ï¼ 593 ä¸è½®è¯¢æä½ä¼å¨ä»»ä½ä¸æè§¦åæ¶è¿åãå¦æä½ ä½¿ç¨è½®è¯¢æä½(poll(2))ï¼ 594 è¯·å¨ events ä¸è®¾ç½® POLLPRI å POLLERRãå¦æä½ ä½¿ç¨è½®è¯¢æä½ 595 (select(2))ï¼è¯·å¨ exceptfds è®¾ç½®ä½ ææçæä»¶æè¿°ç¬¦ãå¨ 596 轮询æä½(poll(2))è¿åä¹åï¼æ¢å¯ä»¥éè¿ lseek(2)æä½è¯»å 597 sysfs æä»¶çå¼å§é¨åï¼ä¹å¯ä»¥å ³éè¿ä¸ªæä»¶å¹¶éæ°æå¼å®æ¥è¯»åæ°æ®ã 598 599 "edge" ... 读åå¾å°ânoneâãârisingâãâfallingâæè âbothâã 600 å°è¿äºå符串åå ¥è¿ä¸ªæä»¶å¯ä»¥éæ©æ²¿è§¦å模å¼ï¼ä¼ä½¿å¾è½®è¯¢æä½ 601 (select(2))å¨"value"æä»¶ä¸è¿åã 602 603 è¿ä¸ªæä»¶ä» æå¨è¿ä¸ªå¼èå¯ä»¥é 置为å¯äº§ç䏿è¾å ¥å¼èæ¶ï¼æåå¨ã 604 605 "active_low" ... 读åå¾å° 0 (å) æ 1 (ç)ãåå ¥ä»»ä½éé¶å¼å¯ä»¥ 606 翻转è¿ä¸ªå±æ§ç(读å)å¼ãå·²å卿ä¹åéè¿"edge"屿§è®¾ç½®äº"rising" 607 å "falling" æ²¿è§¦åæ¨¡å¼ç轮询æä½(poll(2))å°ä¼éµå¾ªè¿ä¸ªè®¾ç½®ã 608 609 GPIO æ§å¶å¨çè·¯å¾ç±»ä¼¼ /sys/class/gpio/gpiochip42/ (对äºä»#42 GPIO 610 å¼å§å®ç°æ§å¶çæ§å¶å¨),å¹¶æç以ä¸åªè¯»å±æ§: 611 612 /sys/class/gpio/gpiochipN/ 613 614 "base" ... ä¸ä»¥ä¸ç N ç¸å,代表æ¤è¯ç管çç第ä¸ä¸ª GPIO çç¼å· 615 616 "label" ... ç¨äºè¯æ (并䏿»æ¯åªæå¯ä¸å¼) 617 618 "ngpio" ... æ¤æ§å¶å¨æç®¡çç GPIO æ°é(è GPIO ç¼å·ä» N å° 619 N + ngpio - 1) 620 621 大夿°æ åµä¸,çµè·¯æ¿çææ¡£åºå½æ ææ¯ä¸ª GPIO ç使ç¨ç®çã使¯é£äºç¼å·å¹¶ä¸æ»æ¯ 622 åºå®ç,ä¾å¦å¨æ©å±å¡ä¸ç GPIO伿 ¹æ®æä½¿ç¨çä¸»æ¿ææå¨å å æ¶æä¸å ¶ä»çæ¿åè 623 ææä¸åãå¨è¿ç§æ åµä¸,ä½ å¯è½éè¦ä½¿ç¨ gpiochip èç¹(å°½å¯è½å°ç»åçµè·¯å¾)æ¥ 624 ç¡®å®ç»å®ä¿¡å·æç¨ç GPIO ç¼å·ã 625 626 627 ä»å æ ¸ä»£ç ä¸å¯¼åº 628 ------------- 629 å æ ¸ä»£ç å¯ä»¥æç¡®å°ç®¡çé£äºå·²éè¿ gpio_request()ç³è¯·ç GPIO ç导åº: 630 631 /* å¯¼åº GPIO å°ç¨æ·ç©ºé´ */ 632 int gpio_export(unsigned gpio, bool direction_may_change); 633 634 /* gpio_export()çéæä½ */ 635 void gpio_unexport(); 636 637 /* å建ä¸ä¸ª sysfs è¿æ¥å°å·²å¯¼åºç GPIO èç¹ */ 638 int gpio_export_link(struct device *dev, const char *name, 639 unsigned gpio) 640 641 /* æ¹å sysfs ä¸çä¸ä¸ª GPIO èç¹çææ§ */ 642 int gpio_sysfs_set_active_low(unsigned gpio, int value); 643 644 å¨ä¸ä¸ªå æ ¸é©±å¨ç³è¯·ä¸ä¸ª GPIO ä¹åï¼å®å¯ä»¥éè¿ gpio_export()ä½¿å ¶å¨ sysfs 645 æ¥å£ä¸å¯è§ã该驱å¨å¯ä»¥æ§å¶ä¿¡å·æ¹åæ¯å¦å¯ä¿®æ¹ãè¿æå©äºé²æ¢ç¨æ·ç©ºé´ä»£ç æ æé´ 646 ç ´åéè¦çç³»ç»ç¶æã 647 648 è¿ä¸ªæç¡®çå¯¼åºæå©äº(éè¿ä½¿æäºå®éªæ´å®¹ææ¥)è°è¯ï¼ä¹å¯ä»¥æä¾ä¸ä¸ªå§ç»åå¨çæ¥å£ï¼ 649 ä¸ææ¡£é åä½ä¸ºæ¿çº§æ¯æå çä¸é¨åã 650 651 å¨ GPIO 被导åºä¹åï¼gpio_export_link()å è®¸å¨ sysfs æä»¶ç³»ç»çä»»ä½å°æ¹ 652 å建ä¸ä¸ªå°è¿ä¸ª GPIO sysfs èç¹ç符å·é¾æ¥ãè¿æ ·é©±å¨å°±å¯ä»¥éè¿ä¸ä¸ªæè¿°æ§ç 653 ååï¼å¨ sysfs ä¸ä»ä»¬ææ¥æç设å¤ä¸æä¾ä¸ä¸ª(å°è¿ä¸ª GPIO sysfs èç¹ç)æ¥å£ã 654 655 驱å¨å¯ä»¥ä½¿ç¨ gpio_sysfs_set_active_low() æ¥å¨ç¨æ·ç©ºé´éèçµè·¯æ¿ä¹é´ 656 GPIO çº¿çææ§å·®å¼ãè¿ä¸ªä» 对 sysfs æ¥å£èµ·ä½ç¨ãææ§çæ¹åå¯ä»¥å¨ gpio_export() 657 ååè¿è¡,ä¸ä¹å使è½ç轮询æä½(poll(2))æ¯æ(ä¸åæä¸é沿)å°ä¼è¢«éæ°é ç½®æ¥éµå¾ª 658 è¿ä¸ªè®¾ç½®ã