1Chinese translated version of Documentation/gpio.txt 2 3If you have any comment or update to the content, please contact the 4original document maintainer directly. However, if you have a problem 5communicating in English you can also ask the Chinese maintainer for 6help. Contact the Chinese maintainer if this translation is outdated 7or if there is a problem with the translation. 8 9Maintainer: Grant Likely <grant.likely@secretlab.ca> 10 Linus Walleij <linus.walleij@linaro.org> 11Chinese maintainer: Fu Wei <tekkamanninja@gmail.com> 12--------------------------------------------------------------------- 13Documentation/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--------------------------------------------------------------------- 27GPIO æ¥å£ 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 51GPIO çå®é åè½å ç³»ç»èå¼ãéå¸¸ç¨æ³æ: 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 75GPIO å ¬çº¦ 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--------- 102GPIO æ¯éè¿æ ç¬¦å·æ´åæ¥æ è¯ç,èå´æ¯ 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 æ§å¶å¨,ä¸å¨ä¸ä¸ªå«æ 113FPGA çç¹å®æ¿åä¸ä½¿ç¨ 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 设置 135platform_device æ¶å®æã 136 137 /* 设置为è¾å ¥æè¾åº, è¿å 0 æè´çé误代ç */ 138 int gpio_direction_input(unsigned gpio); 139 int gpio_direction_output(unsigned gpio, int value); 140 141è¿åå¼ä¸ºé¶ä»£è¡¨æåï¼å¦åè¿åä¸ä¸ªè´çé误代ç ãè¿ä¸ªè¿åå¼éè¦æ£æ¥ï¼å 为 142get/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 173GPIO弿¯å¸å°å¼ï¼é¶è¡¨ç¤ºä½çµå¹³ï¼éé¶è¡¨ç¤ºé«çµå¹³ãå½è¯»åä¸ä¸ªè¾åºå¼èç弿¶ï¼ 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)çæ¶æ¯è®¿é®ã读æåè¿äº 193GPIO å¼çå½ä»¤éè¦çå¾ å ¶ä¿¡æ¯æå°é馿åéå½ä»¤ï¼åè·å¾å ¶åé¦ãæé´éè¦ 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 è°ç¨ 273gpio_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 358GPIO æ å°å° IRQ 359-------------------- 360GPIO ç¼å·æ¯æ ç¬¦å·æ´æ°;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 376gpio_to_irq()è¿åçéé误å¼å¯ä»¥ä¼ éç» request_irq()æè free_irq()ã 377å®ä»¬é常éè¿æ¿çº§ç¹å®çåå§å代ç åæ¾å°å¹³å°è®¾å¤ç IRQ èµæºä¸ã注æ:IRQ 378触åéé¡¹æ¯ IRQ æ¥å£çä¸é¨åï¼å¦ IRQF_TRIGGER_FALLINGï¼ç³»ç»å¤éè½å 379乿¯å¦æ¤ã 380 381irq_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ã(æ¯çï¼è¿äºä¾å齿¥èªäºå½åè¿è¡ 418Linux çç³»ç»ã) 419 420卿äºç³»ç»ä¸,ä¸å¼èå¤ç¨ç¸å ³çæ¯é ç½®å使è½éæçä¸ãä¸ææ¨¡å¼ã并䏿¯ææ 421å¹³å°é½æ¯æè¿ç§æ¨¡å¼,æè ä¸ä¼ä»¥ç¸åçæ¹å¼æ¥æ¯æè¿ç§æ¨¡å¼ï¼ä¸ä»»ä½ç»å®ççµè·¯æ¿ 422å¯è½ä½¿ç¨å¤ç½®ç䏿(æä¸æ)çµé»,è¿æ¶è¯çä¸çå°±ä¸åºè¯¥ä½¿ç¨ã(å½ä¸ä¸ªçµè·¯éè¦ 4235kOhm çæå¨çµé»,è¯çä¸ç 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 436GPIO å®ç°è çæ¡æ¶ (å¯é) 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"(éæ©) 476ARCH_REQUIRE_GPIOLIB æ ARCH_WANT_OPTIONAL_GPIOLIBï¼å¹¶è®©å®ç 477<asm/gpio.h> å å« <asm-generic/gpio.h>ï¼åæ¶å®ä¹ä¸ä¸ªæ¹æ³: 478gpio_get_value()ãgpio_set_value()å gpio_cansleep()ã 479 480å®ä¹åºæä¾ä¸ä¸ª ARCH_NR_GPIOS çå®ä¹å¼ï¼è¿æ ·å¯ä»¥æ´å¥½å°åæ è¯¥å¹³å° GPIO 481çå®é æ°é,èçéæè¡¨ç空é´ã(è¿ä¸ªå®ä¹å¼åºè¯¥å å«çä¸ç³»ç»å 建 GPIO å 482GPIO æ©å±å¨ä¸çæ°æ®ã) 483 484ARCH_REQUIRE_GPIOLIB æå³ç gpiolib æ ¸å¿å¨è¿ä¸ªææ¶ä¸å°æ»æ¯ç¼è¯è¿å æ ¸ã 485 486ARCH_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(代ç )éå¸¸ä» 507arch_initcall()æè æ´æ©çå°æ¹éæè¿å¹³å°åå§å代ç ï¼ä½¿è¿äº GPIO æ»æ¯å¯ç¨ï¼ 508ä¸ä»ä»¬é常å¯ä»¥ä½ä¸º IRQ 使ç¨ã 509 510æ¿çº§æ¯æ 511------- 512对äºå¤é¨ GPIO æ§å¶å¨(ä¾å¦ I2C æ SPI æ©å±å¨ãä¸ç¨è¯çãå¤åè½å¨ä»¶ãFPGA 513æ CPLD)ï¼å¤§å¤æ°å¸¸ç¨æ¿çº§ç¹å®ä»£ç é½å¯ä»¥æ³¨åæ§å¶å¨è®¾å¤ï¼å¹¶ä¿è¯ä»ä»¬ç驱å¨ç¥é 514gpiochip_add()æä½¿ç¨ç GPIO ç¼å·ãä»ä»¬çèµ·å§ç¼å·é常è·å¨å¹³å°ç¹å®ç GPIO 515ç¼å·ä¹åã 516 517ä¾å¦æ¿çº§å¯å¨ä»£ç åºè¯¥åå»ºç»æä½ææè¯çå ¬å¼ç GPIO èå´ï¼å¹¶ä½¿ç¨ platform_data 518å°å ¶ä¼ éç»æ¯ä¸ª GPIO æ©å±å¨è¯çãç¶åè¯ç驱å¨ä¸ç probe()ä¾ç¨å¯ä»¥å°è¿ä¸ª 519æ°æ®ä¼ éç» gpiochip_add()ã 520 521åå§å顺åºå¾éè¦ãä¾å¦ï¼å¦æä¸ä¸ªè®¾å¤ä¾èµåºäº I2C ç(æ©å±)GPIOï¼é£ä¹å®ç 522probe()ä¾ç¨å°±åºè¯¥å¨é£ä¸ª GPIO ææä»¥åæå¯ä»¥è¢«è°ç¨ãè¿æå³ç设å¤åºè¯¥å¨ 523GPIO å¯ä»¥å·¥ä½ä¹åæå¯è¢«æ³¨åãè§£å³è¿ç±»ä¾èµççä¸ç§æ¹æ³æ¯è®©è¿ç§ 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 549Sysfs ä¸çè·¯å¾ 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 576GPIO ä¿¡å·çè·¯å¾ç±»ä¼¼ /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 609GPIO æ§å¶å¨çè·¯å¾ç±»ä¼¼ /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() æ¥å¨ç¨æ·ç©ºé´éèçµè·¯æ¿ä¹é´ 656GPIO çº¿çææ§å·®å¼ãè¿ä¸ªä» 对 sysfs æ¥å£èµ·ä½ç¨ãææ§çæ¹åå¯ä»¥å¨ gpio_export() 657ååè¿è¡,ä¸ä¹å使è½ç轮询æä½(poll(2))æ¯æ(ä¸åæä¸é沿)å°ä¼è¢«éæ°é ç½®æ¥éµå¾ª 658è¿ä¸ªè®¾ç½®ã 659

