linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Chinese translation of Documentation/gpio.txt
@ 2012-08-28 14:03 Ninja Tekkaman
  2012-08-28 15:43 ` harryxiyou
  2012-09-05 12:00 ` Dong Aisheng
  0 siblings, 2 replies; 7+ messages in thread
From: Ninja Tekkaman @ 2012-08-28 14:03 UTC (permalink / raw)
  To: Harry Wei
  Cc: Greg-Kroah-Hartman, linux-kernel, linux-doc, Grant Likely,
	Linus Walleij, kernel

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=GB2312, Size: 26045 bytes --]

This is a Chinese translated version of Documentation/gpio.txt

Signed-off-by: Fu Wei <tekkamanninja@gmail.com>
---
 Documentation/zh_CN/gpio.txt |  662 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 662 insertions(+)
 create mode 100644 Documentation/zh_CN/gpio.txt

diff --git a/Documentation/zh_CN/gpio.txt b/Documentation/zh_CN/gpio.txt
new file mode 100644
index 0000000..0484387
--- /dev/null
+++ b/Documentation/zh_CN/gpio.txt
@@ -0,0 +1,662 @@
+Chinese translated version of Documentation/gpio.txt
+
+If you have any comment or update to the content, please contact the
+original document maintainer directly.  However, if you have a problem
+communicating in English you can also ask the Chinese maintainer for
+help.  Contact the Chinese maintainer if this translation is outdated
+or if there is a problem with the translation.
+
+Maintainer: Grant Likely <grant.likely@secretlab.ca>
+		Linus Walleij <linus.walleij@linaro.org>
+Chinese maintainer: Fu Wei <tekkamanninja@gmail.com>
+---------------------------------------------------------------------
+Documentation/gpio.txt µÄÖÐÎÄ·­Òë
+
+Èç¹ûÏëÆÀÂÛ»ò¸üб¾ÎĵÄÄÚÈÝ£¬ÇëÖ±½ÓÁªÏµÔ­ÎĵµµÄά»¤Õß¡£Èç¹ûÄãʹÓÃÓ¢ÎÄ
+½»Á÷ÓÐÀ§ÄѵĻ°£¬Ò²¿ÉÒÔÏòÖÐÎÄ°æά»¤ÕßÇóÖú¡£Èç¹û±¾·­Òë¸üв»¼°Ê±»òÕß·­
+Òë´æÔÚÎÊÌ⣬ÇëÁªÏµÖÐÎÄ°æά»¤Õß¡£
+Ó¢ÎÄ°æά»¤Õߣº Grant Likely <grant.likely@secretlab.ca>
+		Linus Walleij <linus.walleij@linaro.org>
+ÖÐÎÄ°æά»¤Õߣº ¸µì¿ Fu Wei <tekkamanninja@gmail.com>
+ÖÐÎÄ°æ·­ÒëÕߣº ¸µì¿ Fu Wei <tekkamanninja@gmail.com>
+ÖÐÎÄ°æУÒëÕߣº ¸µì¿ Fu Wei <tekkamanninja@gmail.com>
+
+
+ÒÔÏÂΪÕýÎÄ
+---------------------------------------------------------------------
+GPIO ½Ó¿Ú
+
+±¾ÎĵµÌṩÁËÒ»¸öÔÚLinuxÏ·ÃÎÊGPIOµÄ¹«Ô¼¸ÅÊö¡£
+
+ÕâЩº¯ÊýÒÔ gpio_* ×÷Ϊǰ׺¡£ÆäËûµÄº¯Êý²»ÔÊÐíʹÓÃÕâÑùµÄǰ׺»òÏà¹ØµÄ
+__gpio_* ǰ׺¡£
+
+
+ʲôÊÇGPIO?
+==========
+"ͨÓÃÊäÈë/Êä³ö¿Ú"(GPIO)ÊÇÒ»¸öÁé»îµÄÓÉÈí¼þ¿ØÖƵÄÊý×ÖÐźš£ËûÃÇ¿É
+ÓɶàÖÖоƬÌṩ,ÇÒ¶ÔÓÚ´ÓÊÂǶÈëʽºÍ¶¨ÖÆÓ²¼þµÄ Linux ¿ª·¢ÕßÀ´ËµÊÇ
+±È½ÏÊìϤ¡£Ã¿¸öGPIO ¶¼´ú±íÒ»¸öÁ¬½Óµ½Ìض¨Òý½Å»òÇòÕ¤ÕóÁÐ(BGA)·â×°ÖÐ
+¡°ÇòÖ顱µÄÒ»¸öλ¡£µç·°åÔ­ÀíͼÏÔʾÁË GPIO ÓëÍⲿӲ¼þµÄÁ¬½Ó¹Øϵ¡£
+Çý¶¯¿ÉÒÔ±àд³ÉͨÓôúÂ룬ÒÔʹ°å¼¶Æô¶¯´úÂë¿É´«µÝÒý½ÅÅäÖÃÊý¾Ý¸øÇý¶¯¡£
+
+ƬÉÏϵͳ (SOC) ´¦ÀíÆ÷¶Ô GPIO ÓкܴóµÄÒÀÀµ¡£ÔÚijЩÇé¿öÏÂ,ÿ¸ö
+·ÇרÓÃÒý½Å¶¼¿ÉÅäÖÃΪ GPIO,ÇÒ´ó¶àÊýоƬ¶¼×îÉÙÓÐһЩ GPIO¡£
+¿É±à³ÌÂß¼­Æ÷¼þ(ÀàËÆ FPGA) ¿ÉÒÔ·½±ãµØÌṩ GPIO¡£ÏñµçÔ´¹ÜÀíºÍ
+ÒôƵ±à½âÂëÆ÷ÕâÑùµÄ¶à¹¦ÄÜоƬ¾­³£ÁôÓÐһЩÕâÑùµÄÒý½ÅÀ´°ïÖúÄÇЩÒý½Å
+ØÑ·¦µÄ SOC¡£Í¬Ê±»¹ÓÐͨ¹ý I2C »ò SPI ´®ÐÐ×ÜÏßÁ¬½ÓµÄ¡°GPIOÀ©Õ¹Æ÷¡±
+оƬ¡£´ó¶àÊý PC µÄÄÏÇÅÓÐһЩӵÓÐ GPIO ÄÜÁ¦µÄÒý½Å (Ö»ÓÐBIOS
+¹Ì¼þ²ÅÖªµÀÈçºÎʹÓÃËûÃÇ)¡£
+
+GPIO µÄʵ¼Ê¹¦ÄÜÒòϵͳ¶øÒ졣ͨ³£Ó÷¨ÓÐ:
+
+  - Êä³öÖµ¿Éд (¸ßµçƽ=1£¬µÍµçƽ=0)¡£Ò»Ð©Ð¾Æ¬Ò²ÓÐÈçºÎÇý¶¯ÕâЩֵµÄÑ¡Ïî,
+    ÀýÈçÖ»ÔÊÐíÊä³öÒ»¸öÖµ¡¢Ö§³Ö¡°ÏßÓ롱¼°ÆäËûÈ¡ÖµÀàËƵÄģʽ(ÖµµÃ×¢ÒâµÄÊÇ
+    ¡°¿ªÂ©¡±ÐźÅ)
+
+  - ÊäÈëÖµ¿É¶Á(1¡¢0)¡£Ò»Ð©Ð¾Æ¬Ö§³ÖÒý½ÅÔÚÅäÖÃΪ¡°Êä³ö¡±Ê±»Ø¶Á£¬Õâ¶ÔÓÚÀàËÆ
+    ¡°ÏßÓ롱µÄÇé¿ö(ÒÔÖ§³ÖË«ÏòÐźÅ)ÊǷdz£ÓÐÓõġ£GPIO ¿ØÖÆÆ÷¿ÉÄÜÓÐÊäÈë
+    ȥë´Ì/Ïû¶¶Âß¼­,ÕâÓÐʱÐèÒªÈí¼þ¿ØÖÆ¡£
+
+  - ÊäÈëͨ³£¿É×÷Ϊ IRQ ÐźÅ,Ò»°ãÊÇÑØ´¥·¢,µ«ÓÐʱÊǵçƽ´¥·¢¡£ÕâÑùµÄ IRQ
+    ¿ÉÄÜÅäÖÃΪϵͳ»½ÐÑʼþ,ÒÔ½«ÏµÍ³´ÓµÍ¹¦ºÄ״̬Ï»½ÐÑ¡£
+
+  - ͨ³£Ò»¸ö GPIO ¸ù¾Ý²»Í¬²úÆ·µç·°åµÄÐèÇó,¿ÉÒÔÅäÖÃΪÊäÈë»òÊä³ö,Ò²Óнö
+    Ö§³Öµ¥ÏòµÄ¡£
+
+  - ´ó²¿·Ö GPIO ¿ÉÒÔÔÚ³ÖÓÐ×ÔÐýËøʱ·ÃÎÊ,µ«ÊÇͨ³£ÓÉ´®ÐÐ×ÜÏßÀ©Õ¹µÄ GPIO
+    ²»ÔÊÐí³ÖÓÐ×ÔÐýËø¡£µ«Ä³Ð©ÏµÍ³Ò²Ö§³ÖÕâÖÖÀàÐÍ¡£
+
+¶ÔÓÚ¸ø¶¨µÄµç·°å,ÿ¸ö GPIO ¶¼ÓÃÓÚij¸öÌض¨µÄÄ¿µÄ,Èç¼à¿Ø MMC/SD ¿¨µÄ
+²åÈë/ÒƳý¡¢¼ì²â¿¨µÄд±£»¤×´Ì¬¡¢Çý¶¯ LED¡¢ÅäÖÃÊÕ·¢Æ÷¡¢Ä£Äâ´®ÐÐ×ÜÏß¡¢
+¸´Î»Ó²¼þ¿´ÃŹ·¡¢¸ÐÖª¿ª¹Ø״̬µÈµÈ¡£
+
+
+GPIO ¹«Ô¼
+=========
+×¢Òâ,Õâ¸ö½Ð×ö¡°¹«Ô¼¡±£¬ÒòΪÕâ²»ÊÇÇ¿ÖÆÐԵģ¬²»×ñÑ­Õâ¸ö¹«Ô¼ÊÇÎÞÉË´óÑŵģ¬
+ÒòΪ´Ëʱ¿ÉÒÆÖ²ÐÔ²¢²»ÖØÒª¡£GPIO ³£ÓÃÓڰ弶Ìض¨µÄµç·Âß¼­,ÉõÖÁ¿ÉÄÜ
+Ëæ×ŵç·°åµÄ°æ±¾¶ø¸Ä±ä£¬ÇÒ²»¿ÉÄÜÔÚ²»Í¬×ßÏߵĵç·°åÉÏʹÓ᣽öÓÐÔÚÉÙÊý
+¹¦ÄÜÉϲžßÓпÉÒÆÖ²ÐÔ£¬ÆäËû¹¦ÄÜÊÇƽ̨Ìض¨¡£ÕâÒ²ÊÇÓÉÓÚ¡°½ººÏ¡±µÄÂß¼­Ôì³ÉµÄ¡£
+
+´ËÍ⣬Õâ²»ÐèÒªÈκεÄÖ´Ðпò¼Ü£¬Ö»ÊÇÒ»¸ö½Ó¿Ú¡£Ä³¸öƽ̨¿ÉÄÜͨ¹ýÒ»¸ö¼òµ¥µØ
+·ÃÎÊоƬ¼Ä´æÆ÷µÄÄÚÁªº¯ÊýÀ´ÊµÏÖËü£¬ÆäËûƽ̨¿ÉÄÜͨ¹ýίÍÐһϵÁв»Í¬µÄGPIO
+¿ØÖÆÆ÷µÄ³éÏóº¯ÊýÀ´ÊµÏÖËü¡£(ÓÐһЩ¿ÉÑ¡µÄ´úÂëÄÜÖ§³ÖÕâÖÖ²ßÂÔµÄʵÏÖ,±¾Îĵµ
+ºóÃæ»á½éÉÜ£¬µ«×÷Ϊ GPIO ½Ó¿ÚµÄ¿Í»§¶ËÇý¶¯³ÌÐò±ØÐëÓëËüµÄʵÏÖÎ޹ء£)
+
+Ò²¾ÍÊÇ˵,Èç¹ûÔÚËûÃǵÄƽ̨ÉÏÖ§³ÖÕâ¸ö¹«Ô¼£¬Çý¶¯Ó¦¾¡¿ÉÄܵÄʹÓÃËü¡£Æ½Ì¨
+±ØÐëÔÚ Kconfig ÖÐÉùÃ÷¶Ô GENERIC_GPIOµÄÖ§³Ö (²¼¶ûÐÍ true)£¬²¢Ìṩ
+Ò»¸ö <asm/gpio.h> Îļþ¡£ÄÇЩµ÷Óñê×¼ GPIO º¯ÊýµÄÇý¶¯Ó¦¸ÃÔÚ Kconfig
+Èë¿ÚÖÐÉùÃ÷ÒÀÀµGENERIC_GPIO¡£µ±Çý¶¯°üº¬Îļþ:
+
+	#include <linux/gpio.h>
+
+Ôò GPIO º¯ÊýÊÇ¿ÉÓÃ,ÎÞÂÛÊÇ¡°Õæʵ´úÂ롱»¹ÊǾ­ÓÅ»¯¹ýµÄÓï¾ä¡£Èç¹ûÄã×ñÊØ
+Õâ¸ö¹«Ô¼£¬µ±ÄãµÄ´úÂëÍê³Éºó£¬¶ÔÆäËûµÄ¿ª·¢ÕßÀ´Ëµ»á¸üÈÝÒ׿´¶®ºÍά»¤¡£
+
+×¢Ò⣬ÕâЩ²Ù×÷°üº¬ËùÓÃƽ̨µÄ I/O ÆÁÕÏ´úÂ룬Çý¶¯ÎÞÐëÏÔʽµØµ÷ÓÃËûÃÇ¡£
+
+
+±êʶ GPIO
+---------
+GPIO ÊÇͨ¹ýÎÞ·ûºÅÕûÐÍÀ´±êʶµÄ,·¶Î§ÊÇ 0 µ½ MAX_INT¡£±£Áô¡°¸º¡±Êý
+ÓÃÓÚÆäËûÄ¿µÄ,ÀýÈç±êʶÐźš°ÔÚÕâ¸ö°å×ÓÉϲ»¿ÉÓá±»òָʾ´íÎó¡£Î´½Ó´¥µ×²ã
+Ó²¼þµÄ´úÂë»áºöÂÔÕâЩÕûÊý¡£
+
+ƽ̨»á¶¨ÒåÕâЩÕûÊýµÄÓ÷¨,ÇÒͨ³£Ê¹Óà #define À´¶¨Òå GPIO£¬ÕâÑù
+°å¼¶Ìض¨µÄÆô¶¯´úÂë¿ÉÒÔÖ±½Ó¹ØÁªÏàÓ¦µÄÔ­Àíͼ¡£Ïà¶ÔÀ´Ëµ£¬Çý¶¯Ó¦¸Ã½öʹÓÃ
+Æô¶¯´úÂë´«µÝ¹ýÀ´µÄ GPIO ±àºÅ£¬Ê¹Óà platform_data ±£´æ°å¼¶Ìض¨
+Òý½ÅÅäÖÃÊý¾Ý (ͬʱ»¹ÓÐÆäËûÐëÒªµÄ°å¼¶Ìض¨Êý¾Ý)£¬±ÜÃâ¿ÉÄܳöÏÖµÄÎÊÌâ¡£
+
+ÀýÈçÒ»¸öƽ̨ʹÓñàºÅ 32-159 À´±êʶ GPIO,¶øÔÚÁíÒ»¸öƽ̨ʹÓñàºÅ0-63
+±êʶһ×é GPIO ¿ØÖÆÆ÷,64-79±êʶÁíÒ»Àà GPIO ¿ØÖÆÆ÷,ÇÒÔÚÒ»¸öº¬ÓÐ
+FPGA µÄÌض¨°å×ÓÉÏʹÓà 80-95¡£±àºÅ²»Ò»¶¨ÒªÁ¬Ðø,ÄÇЩƽ̨ÖУ¬Ò²¿ÉÒÔ
+ʹÓñàºÅ2000-2063À´±êʶһ¸ö I2C ½Ó¿ÚµÄ GPIO À©Õ¹Æ÷ÖÐµÄ GPIO¡£
+
+Èç¹ûÄãÒª³õʼ»¯Ò»¸ö´øÓÐÎÞЧ GPIO ±àºÅµÄ½á¹¹Ìå,¿ÉÒÔʹÓÃһЩ¸º±àÂë
+(Èç"-EINVAL")£¬Äǽ«Ê¹ÆäÓÀÔ¶²»»áÊÇÓÐЧ¡£À´²âÊÔÕâÑùÒ»¸ö½á¹¹ÌåÖеıàºÅ
+ÊÇ·ñ¹ØÁªÒ»¸ö GPIO£¬Äã¿ÉʹÓÃÒÔ϶ÏÑÔ:
+
+	int gpio_is_valid(int number);
+
+Èç¹û±àºÅ²»´æÔÚ£¬ÔòÇëÇóºÍÊÍ·Å GPIO µÄº¯Êý½«¾Ü¾øÖ´ÐÐÏà¹Ø²Ù×÷(¼ûÏÂÎÄ)¡£
+ÆäËû±àºÅÒ²¿ÉÄܱ»¾Ü¾ø,±ÈÈçÒ»¸ö±àºÅ¿ÉÄÜ´æÔÚ£¬µ«ÔÝʱÔÚ¸ø¶¨µÄµç·Éϲ»¿ÉÓá£
+
+Ò»¸öƽ̨ÊÇ·ñÖ§³Ö¶à¸ö GPIO ¿ØÖÆÆ÷Ϊƽ̨Ìض¨µÄʵÏÖÎÊÌ⣬¾ÍÏñÊÇ·ñ¿ÉÒÔ
+ÔÚ GPIO ±àºÅ¿Õ¼äÖÐÓС°¿Õ¶´¡±ºÍÊÇ·ñ¿ÉÒÔÔÚÔËÐÐʱÌí¼ÓеĿØÖÆÆ÷Ò»Ñù¡£
+ÕâЩÎÊÌâ»áÓ°ÏìÆäËûÊÂÇ飬°üÀ¨ÏàÁÚµÄ GPIO ±àºÅÊÇ·ñ´æÔڵȡ£
+
+ʹÓà GPIO
+---------
+¶ÔÓÚÒ»¸ö GPIO£¬ÏµÍ³Ó¦¸Ã×öµÄµÚÒ»¼þÊÂÇé¾ÍÊÇͨ¹ý gpio_request()
+º¯Êý·ÖÅäËû£¬¼ûÏÂÎÄ¡£
+
+¶ø½ÓÏÂÀ´Òª×öµÄÊDZêʶËüµÄ·½Ïò£¬Õâͨ³£ÊÇÔڰ弶Æô¶¯´úÂëÖÐΪ GPIO ÉèÖÃ
+Ò»¸ö platform_device ʱ×öµÄ¡£
+
+	/* ÉèÖÃΪÊäÈë»òÊä³ö, ·µ»Ø 0 »ò¸ºµÄ´íÎó´úÂë */
+	int gpio_direction_input(unsigned gpio);
+	int gpio_direction_output(unsigned gpio, int value);
+
+·µ»ØֵΪÁã´ú±í³É¹¦£¬·ñÔò·µ»ØÒ»¸ö¸ºµÄ´íÎó´úÂë¡£Õâ¸ö·µ»ØÖµÐèÒª¼ì²é£¬ÒòΪ
+get/set(»ñÈ¡/ÉèÖÃ)º¯Êýµ÷ÓÃû·¨·µ»Ø´íÎó,ÇÒÓпÉÄÜÊÇÅäÖôíÎó¡£Í¨³££¬
+ÄãÓ¦¸ÃÔÚ½ø³ÌÉÏÏÂÎÄÖе÷ÓÃÕâЩº¯Êý¡£È»¶ø,¶ÔÓÚ×ÔÐýËø°²È«µÄ GPIO£¬ÔÚ°å×Ó
+Æô¶¯µÄÔçÆÚ¡¢½ø³ÌÆô¶¯Ç°Ê¹ÓÃËûÃÇÒ²ÊÇ¿ÉÒԵġ£
+
+¶ÔÓÚ×÷ΪÊä³öµÄ GPIO£¬ÎªÆäÌṩ³õʼÊä³öÖµ£¬¶ÔÓÚ±ÜÃâÔÚϵͳÆô¶¯ÆÚ¼ä³öÏÖ
+ÐźÅë´ÌÊǺÜÓаïÖúµÄ¡£
+
+ΪÁËÓ봫ͳµÄ GPIO ½Ó¿Ú¼æÈÝ, ÔÚÉèÖÃÒ»¸ö GPIO ·½Ïòʱ£¬Èç¹ûËü»¹Î´±»ÉêÇ룬
+ÔòÒþº¬ÁËÉêÇëÄǸö GPIO µÄ²Ù×÷(¼ûÏÂÎÄ)¡£ÕâÖÖ¼æÈÝÐÔÕýÔÚ´Ó¿ÉÑ¡µÄ gpiolib
+¿ò¼ÜÖÐÒƳý¡£
+
+Èç¹ûÕâ¸ö GPIO ±àÂë²»´æÔÚ£¬»òÕßÌض¨µÄ GPIO ²»ÄÜÓÃÓÚÄÇÖÖģʽ£¬Ôò·½Ïò
+ÉèÖÿÉÄÜʧ°Ü¡£ÒÀÀµÆô¶¯¹Ì¼þÀ´ÕýÈ·µØÉèÖ÷½Ïòͨ³£ÊÇÒ»¸ö»µÖ÷Ò⣬ÒòΪËü¿ÉÄÜ
+³ýÁËÆô¶¯Linux£¬²¢Ã»ÓÐ×ö¸ü¶àµÄÑéÖ¤¹¤×÷¡£(ͬÀí, °å×ÓµÄÆô¶¯´úÂë¿ÉÄÜÐèÒª
+½«Õâ¸ö¸´ÓõÄÒý½ÅÉèÖÃΪ GPIO£¬²¢ÕýÈ·µØÅäÖÃÉÏÀ­/ÏÂÀ­µç×è¡£)
+
+
+·ÃÎÊ×ÔÐýËø°²È«µÄ GPIO
+-------------------
+´ó¶àÊý GPIO ¿ØÖÆÆ÷¿ÉÒÔͨ¹ýÄÚ´æ¶Á/дָÁîÀ´·ÃÎÊ¡£ÕâЩָÁî²»»áÐÝÃß,¿ÉÒÔ
+°²È«µØÔÚÓ²(·ÇÏß³Ì)ÖжÏÀý³ÌºÍÀàËƵÄÉÏÏÂÎÄÖÐÍê³É¡£
+
+¶ÔÓÚÄÇЩÓà gpio_cansleep()²âÊÔ×ÜÊÇ·µ»Øʧ°ÜµÄ GPIO(¼ûÏÂÎÄ)£¬Ê¹ÓÃ
+ÒÔϵĺ¯Êý·ÃÎÊ:
+
+	/* GPIO ÊäÈë:·µ»ØÁã»ò·ÇÁã */
+	int gpio_get_value(unsigned gpio);
+
+	/* GPIO ÊäÈë */
+	void gpio_set_value(unsigned gpio, int value);
+
+·µ»ØÖµÊDz¼¶ûÖµ£¬Áã±íʾµÍµçƽ£¬·ÇÁã±íʾ¸ßµçƽ¡£µ±¶ÁÈ¡Ò»¸öÊä³öÒý½ÅµÄֵʱ£¬
+·µ»ØÖµÓ¦¸ÃÊÇÒý½ÅÉϵÄÖµ¡£Õâ¸öÖµ²»×ÜÊǺÍÊä³öÖµÏà·û£¬ÒòΪ´æÔÚ¿ªÂ©Êä³öÐźźÍ
+Êä³öDZ·üÆÚµÄÎÊÌâ¡£
+
+ÒÔÉ쵀 get/set º¯Êý²»»á¶ÔÔçÆÚÒѾ­Í¨¹ý gpio_direction_*()±¨¸æ¡°ÎÞЧµÄ
+GPIO¡±·µ»Ø´íÎó¡£´ËÍâ,»¹ÐèҪעÒâµÄÊDz¢²»ÊÇËùÓÐƽ̨¶¼¿ÉÒÔ´ÓÊä³öÒý½ÅÖжÁÈ¡
+Êý¾ÝµÄ£¬ÄÇЩÒý½ÅÒ²²»×ÜÊÇ·µ»ØÁã¡£ÇÒ¶ÔÄÇЩÎÞ·¨°²È«·ÃÎÊ(¿ÉÄÜ»áÐÝÃß)µÄ GPIO
+(¼ûÏÂÎÄ)ʹÓÃÕâЩº¯ÊýÊÇ´íÎóµÄ¡£
+
+ÔÚ GPIO ±àºÅ(»¹ÓÐÊä³ö¡¢Öµ)Ϊ³£ÊýµÄÇé¿öÏÂ,¹ÄÀøͨ¹ýƽ̨Ìض¨µÄʵÏÖÀ´ÓÅ»¯
+ÕâÁ½¸öº¯ÊýÀ´·ÃÎÊ GPIO Öµ¡£ÕâÖÖÇé¿ö(¶Áдһ¸öÓ²¼þ¼Ä´æÆ÷)ÏÂÖ»ÐèÒª¼¸ÌõÖ¸Áî
+ÊǺÜÕý³£µÄ,ÇÒÎÞÐë×ÔÐýËø¡£ÕâÖÖÓÅ»¯º¯Êý±ÈÆðÄÇЩÔÚ×Ó³ÌÐòÉÏ»¨·ÑÐí¶àÖ¸ÁîµÄ
+º¯Êý¿ÉÒÔʹµÃÄ£Äâ½Ó¿Ú(ÒëÕß×¢:ÀýÈç GPIO Ä£Äâ I2C¡¢1-wire »ò SPI)µÄ
+Ó¦ÓÃ(ÔÚ¿Õ¼äºÍʱ¼äÉ϶¼)¸ü¾ßЧÂÊ¡£
+
+
+·ÃÎÊ¿ÉÄÜÐÝÃßµÄ GPIO
+-----------------
+ijЩ GPIO ¿ØÖÆÆ÷±ØÐëͨ¹ý»ùÓÚ×ÜÏß(Èç I2C »ò SPI)µÄÏûÏ¢·ÃÎÊ¡£¶Á»òдÕâЩ
+GPIO ÖµµÄÃüÁîÐèÒªµÈ´ýÆäÐÅÏ¢Åŵ½¶ÓÊײŷ¢ËÍÃüÁÔÙ»ñµÃÆä·´À¡¡£ÆÚ¼äÐèÒª
+ÐÝÃߣ¬Õâ²»ÄÜÔÚ IRQ Àý³Ì(ÖжÏÉÏÏÂÎÄ)ÖÐÖ´ÐС£
+
+Ö§³Ö´ËÀà GPIO µÄƽ̨ͨ¹ýÒÔϺ¯Êý·µ»Ø·ÇÁãÖµÀ´Çø·Ö³öÕâÖÖ GPIO¡£(´Ëº¯ÊýÐèÒª
+Ò»¸ö֮ǰͨ¹ý gpio_request ·ÖÅäµ½µÄÓÐЧ GPIO ±àºÅ):
+
+	int gpio_cansleep(unsigned gpio);
+
+ΪÁË·ÃÎÊÕâÖÖ GPIO,Äں˶¨ÒåÁËÒ»Ìײ»Í¬µÄº¯Êý:
+
+	/* GPIO ÊäÈë:·µ»ØÁã»ò·ÇÁã ,¿ÉÄÜ»áÐÝÃß */
+	int gpio_get_value_cansleep(unsigned gpio);
+
+	/* GPIO ÊäÈë,¿ÉÄÜ»áÐÝÃß */
+	void gpio_set_value_cansleep(unsigned gpio, int value);
+
+
+·ÃÎÊÕâÑùµÄ GPIO ÐèÒªÒ»¸öÔÊÐíÐÝÃßµÄÉÏÏÂÎÄ£¬ÀýÈçÏß³Ì IRQ ´¦ÀíÀý³Ì£¬²¢ÓÃÒÔÉϵÄ
+·ÃÎʺ¯ÊýÌæ»»ÄÇЩûÓÐ cansleep()ºó׺µÄ×ÔÐýËø°²È«·ÃÎʺ¯Êý¡£
+
+³ýÁËÕâЩ·ÃÎʺ¯Êý¿ÉÄÜÐÝÃߣ¬ÇÒËüÃDzÙ×÷µÄ GPIO ²»ÄÜÔÚÓ²¼þ IRQ ´¦ÀíÀý³ÌÖзÃÎʵÄ
+ÊÂʵ£¬ÕâЩ´¦ÀíÀý³Ìʵ¼ÊÉϺÍ×ÔÐýËø°²È«µÄº¯ÊýÊÇÒ»ÑùµÄ¡£
+
+** ³ý´ËÖ®Íâ ** µ÷ÓÃÉèÖúÍÅäÖôËÀà GPIO µÄº¯ÊýÒ²±ØÐëÔÚÔÊÐíÐÝÃßµÄÉÏÏÂÎÄÖУ¬
+ÒòΪËüÃÇ¿ÉÄÜÒ²ÐèÒª·ÃÎÊ GPIO ¿ØÖÆÆ÷оƬ: (ÕâЩÉèÖú¯Êýͨ³£Ôڰ弶Æô¶¯´úÂë»òÕß
+Çý¶¯Ì½²â/¶Ï¿ª´úÂëÖУ¬ËùÒÔÕâÊÇÒ»¸öÈÝÒ×Âú×ãµÄÔ¼ÊøÌõ¼þ¡£)
+
+	gpio_direction_input()
+	gpio_direction_output()
+	gpio_request()
+
+## 	gpio_request_one()
+##	gpio_request_array()
+## 	gpio_free_array()
+
+	gpio_free()
+	gpio_set_debounce()
+
+
+
+ÉùÃ÷ºÍÊÍ·Å GPIO
+----------------------------
+ΪÁËÓÐÖúÓÚ²¶»ñϵͳÅäÖôíÎó,¶¨ÒåÁËÁ½¸öº¯Êý¡£
+
+	/* ÉêÇë GPIO, ·µ»Ø 0 »ò¸ºµÄ´íÎó´úÂë.
+	 * ·Ç¿Õ±êÇ©¿ÉÄÜÓÐÖúÓÚÕï¶Ï.
+	 */
+	int gpio_request(unsigned gpio, const char *label);
+
+	/* ÊÍ·Å֮ǰÉùÃ÷µÄ GPIO */
+	void gpio_free(unsigned gpio);
+
+½«ÎÞЧµÄ GPIO ±àÂë´«µÝ¸ø gpio_request()»áµ¼ÖÂʧ°Ü£¬ÉêÇëÒ»¸öÒÑʹÓÃÕâ¸ö
+º¯ÊýÉùÃ÷¹ýµÄ GPIO Ò²»áʧ°Ü¡£gpio_request()µÄ·µ»ØÖµ±ØÐë¼ì²é¡£ÄãÓ¦¸ÃÔÚ
+½ø³ÌÉÏÏÂÎÄÖе÷ÓÃÕâЩº¯Êý¡£È»¶ø,¶ÔÓÚ×ÔÐýËø°²È«µÄ GPIO,ÔÚ°å×ÓÆô¶¯µÄÔçÆÚ¡¢
+½øÈë½ø³Ì֮ǰÊÇ¿ÉÒÔÉêÇëµÄ¡£
+
+Õâ¸öº¯ÊýÍê³ÉÁ½¸ö»ù±¾µÄÄ¿±ê¡£Ò»ÊDZêʶÄÇЩʵ¼ÊÉÏÒÑ×÷Ϊ GPIO ʹÓõÄÐźÅÏߣ¬
+ÕâÑù±ãÓÚ¸üºÃµØÕï¶Ï;ϵͳ¿ÉÄÜÐèÒª·þÎñ¼¸°Ù¸öDZÔÚµÄ GPIO£¬µ«ÊǶÔÓÚÈκÎÒ»¸ö
+¸ø¶¨µÄµç·°åͨ³£Ö»ÓÐһЩ±»Ê¹Óá£ÁíÒ»¸öÄ¿µÄÊDz¶»ñ³åÍ»£¬²éÃ÷´íÎó:ÈçÁ½¸ö»ò
+¸ü¶àÇý¶¯´íÎóµØÈÏΪËûÃÇÒѾ­¶ÀÕ¼ÁËij¸öÐźÅÏß,»òÊÇ´íÎóµØÈÏΪÒƳýÒ»¸ö¹ÜÀí×Å
+ij¸öÒѼ¤»îÐźŵÄÇý¶¯ÊÇ°²È«µÄ¡£Ò²¾ÍÊÇ˵£¬ÉêÇë GPIO µÄ×÷ÓÃÀàËÆÒ»ÖÖËø»úÖÆ¡£
+
+ijЩƽ̨¿ÉÄÜҲʹÓà GPIO ×÷ΪµçÔ´¹ÜÀí¼¤»îÐźÅ(ÀýÈçͨ¹ý¹Ø±ÕδʹÓÃоƬÇøºÍ
+¼òµ¥µØ¹Ø±ÕδʹÓÃʱÖÓ)¡£
+
+¶ÔÓÚ GPIO ʹÓà pinctrl ×ÓϵͳÒÑÖªµÄÒý½Å£¬×ÓϵͳӦ¸Ã±»¸æÖªÆäʹÓÃÇé¿ö£»
+Ò»¸ö gpiolib Çý¶¯µÄ .request()²Ù×÷Ó¦µ÷Óà pinctrl_request_gpio()£¬
+¶ø gpiolib Çý¶¯µÄ .free()²Ù×÷Ó¦µ÷Óà pinctrl_free_gpio()¡£pinctrl
+×ÓϵͳÔÊÐí pinctrl_request_gpio()ÔÚij¸öÒý½Å»òÒý½Å×éÒÔ¸´ÓÃÐÎʽ¡°ÊôÓÚ¡±
+Ò»¸öÉ豸ʱ¶¼³É¹¦·µ»Ø¡£
+
+ÈκÎÐ뽫 GPIO Ðźŵ¼ÏòÊʵ±Òý½ÅµÄÒý½Å¸´ÓÃÓ²¼þµÄ±à³ÌÓ¦¸Ã·¢ÉúÔÚ GPIO
+Çý¶¯µÄ .direction_input()»ò .direction_output()º¯ÊýÖУ¬ÒÔ¼°
+ÈκÎÊä³ö GPIO ÖµµÄÉèÖÃÖ®ºó¡£ÕâÑù¿Éʹ´ÓÒý½ÅÌØÊ⹦Äܵ½ GPIO µÄת»»
+²»»áÔÚÒý½Å²úÉúë´Ì²¨ÐΡ£ÓÐʱµ±ÓÃÒ»¸ö GPIO ʵÏÖÆäÐźÅÇý¶¯Ò»¸ö·Ç GPIO
+Ó²¼þÄ£¿éµÄ½â¾ö·½°¸Ê±£¬¾ÍÐèÒªÕâÖÖ»úÖÆ¡£
+
+ijЩƽ̨ÔÊÐí²¿·Ö»òËùÓÐ GPIO ÐźÅʹÓò»Í¬µÄÒý½Å¡£ÀàËƵģ¬GPIO »òÒý½ÅµÄ
+ÆäËû·½ÃæÒ²ÐèÒªÅäÖã¬ÈçÉÏÀ­/ÏÂÀ­¡£Æ½Ì¨Èí¼þÓ¦¸ÃÔÚ¶ÔÕâЩ GPIO µ÷ÓÃ
+gpio_request()Ç°½«ÕâÀàϸ½ÚÅäÖúã¬ÀýÈçʹÓà pinctrl ×ÓϵͳµÄÓ³Éä±í£¬
+ʹµÃ GPIO µÄÓû§ÎÞÐë¹Ø×¢ÕâЩϸ½Ú¡£
+
+»¹ÓÐÒ»¸öÖµµÃ×¢ÒâµÄÊÇÔÚÊÍ·Å GPIO Ç°£¬Äã±ØÐëֹͣʹÓÃËü¡£
+
+
+×¢Òâ:ÉêÇëÒ»¸ö GPIO ²¢Ã»ÓÐÒÔÈκη½Ê½ÅäÖÃËü£¬Ö»²»¹ý±êʶÄǸö GPIO ´¦ÓÚʹÓÃ
+״̬¡£±ØÐëÓÐÁíÍâµÄ´úÂëÀ´´¦ÀíÒý½ÅÅäÖÃ(Èç¿ØÖÆ GPIO ʹÓõÄÒý½Å¡¢ÉÏÀ­/ÏÂÀ­)¡£
+¿¼Âǵ½´ó¶àÊýÇé¿öÏÂÉùÃ÷ GPIO Ö®ºó¾Í»áÁ¢¼´ÅäÖÃËüÃÇ,ËùÒÔ¶¨ÒåÁËÒÔÏÂÈý¸ö¸¨Öúº¯Êý:
+
+	/* ÉêÇëÒ»¸ö GPIO ÐźÅ, ͬʱͨ¹ýÌض¨µÄ'flags'³õʼ»¯ÅäÖÃ,
+	 * ÆäËûºÍ gpio_request()µÄ²ÎÊýºÍ·µ»ØÖµÏàͬ
+	 *
+	 */
+	int gpio_request_one(unsigned gpio, unsigned long flags, const char *label);
+
+	/* ÔÚµ¥¸öº¯ÊýÖÐÉêÇë¶à¸ö GPIO
+	 */
+	int gpio_request_array(struct gpio *array, size_t num);
+
+	/* ÔÚµ¥¸öº¯ÊýÖÐÊͷŶà¸ö GPIO
+	 */
+	void gpio_free_array(struct gpio *array, size_t num);
+
+ÕâÀï 'flags' µ±Ç°¶¨Òå¿ÉÖ¸¶¨ÒÔÏÂÊôÐÔ:
+
+	* GPIOF_DIR_IN		- ÅäÖ÷½ÏòΪÊäÈë
+	* GPIOF_DIR_OUT		- ÅäÖ÷½ÏòΪÊä³ö
+
+	* GPIOF_INIT_LOW	- ÔÚ×÷ΪÊä³öʱ,³õʼֵΪµÍµçƽ
+	* GPIOF_INIT_HIGH	- ÔÚ×÷ΪÊä³öʱ,³õʼֵΪ¸ßµçƽ
+	* GPIOF_OPEN_DRAIN	- gpioÒý½ÅΪ¿ªÂ©ÐźÅ
+	* GPIOF_OPEN_SOURCE	- gpioÒý½ÅΪԴ¼«¿ªÂ·ÐźÅ
+
+	* GPIOF_EXPORT_DIR_FIXED	- ½« gpio µ¼³öµ½ sysfs£¬²¢±£³Ö·½Ïò
+	* GPIOF_EXPORT_DIR_CHANGEABLE	- ͬÑùÊǵ¼³ö, µ«ÔÊÐí¸Ä±ä·½Ïò
+
+ÒòΪ GPIOF_INIT_* ½öÓÐÔÚÅäÖÃΪÊä³öµÄʱºò²Å´æÔÚ,ËùÒÔÓÐЧµÄ×éºÏΪ:
+
+	* GPIOF_IN		- ÅäÖÃΪÊäÈë
+	* GPIOF_OUT_INIT_LOW	- ÅäÖÃΪÊä³ö,²¢³õʼ»¯ÎªµÍµçƽ
+	* GPIOF_OUT_INIT_HIGH	- ÅäÖÃΪÊä³ö,²¢³õʼ»¯Îª¸ßµçƽ
+
+µ±ÉèÖà flag Ϊ GPIOF_OPEN_DRAIN ʱ£¬Ôò¼ÙÉèÒý½ÅÊÇ¿ªÂ©Ðźš£ÕâÑùµÄÒý½Å
+½«²»»áÔÚÊä³öģʽÏÂÖÃ1¡£ÕâÑùµÄÒý½ÅÐèÒªÁ¬½ÓÉÏÀ­µç×衣ͨ¹ýʹÄÜÕâ¸ö±êÖ¾£¬gpio¿â
+½«»áÔÚ±»ÒªÇóÊä³öģʽÏÂÖÃ1ʱ½«Òý½Å±äΪÊäÈë״̬À´Ê¹Òý½ÅÖøߡ£Òý½ÅÔÚÊä³öģʽÏÂ
+ͨ¹ýÖÃ0ʹÆäÊä³öµÍµçƽ¡£
+
+µ±ÉèÖà flag Ϊ GPIOF_OPEN_SOURCE ʱ£¬Ôò¼ÙÉèÒý½ÅΪԴ¼«¿ªÂ·Ðźš£ÕâÑùµÄÒý½Å
+½«²»»áÔÚÊä³öģʽÏÂÖÃ0¡£ÕâÑùµÄÒý½ÅÐèÒªÁ¬½ÓÏÂÀ­µç×衣ͨ¹ýʹÄÜÕâ¸ö±êÖ¾£¬gpio¿â
+½«»áÔÚ±»ÒªÇóÊä³öģʽÏÂÖÃ0ʱ½«Òý½Å±äΪÊäÈë״̬À´Ê¹Òý½ÅÖõ͡£Òý½ÅÔÚÊä³öģʽÏÂ
+ͨ¹ýÖÃ1ʹÆäÊä³ö¸ßµçƽ¡£
+
+½«À´ÕâЩ±êÖ¾¿ÉÄÜÀ©Õ¹µ½Ö§³Ö¸ü¶àµÄÊôÐÔ¡£
+
+¸ü½øÒ»²½,ΪÁ˸ü¼òµ¥µØÉùÃ÷/ÊͷŶà¸ö GPIO,'struct gpio'±»Òý½øÀ´·â×°ËùÓÐ
+ÕâÈý¸öÁìÓò:
+
+	struct gpio {
+		unsigned	gpio;
+		unsigned long	flags;
+		const char	*label;
+	};
+
+Ò»¸öµäÐ͵ÄÓÃÀý:
+
+	static struct gpio leds_gpios[] = {
+		{ 32, GPIOF_OUT_INIT_HIGH, "Power LED" }, /* ĬÈÏ¿ªÆô */
+		{ 33, GPIOF_OUT_INIT_LOW,  "Green LED" }, /* ĬÈÏ¹Ø±Õ */
+		{ 34, GPIOF_OUT_INIT_LOW,  "Red LED"   }, /* ĬÈÏ¹Ø±Õ */
+		{ 35, GPIOF_OUT_INIT_LOW,  "Blue LED"  }, /* ĬÈÏ¹Ø±Õ */
+		{ ... },
+	};
+
+	err = gpio_request_one(31, GPIOF_IN, "Reset Button");
+	if (err)
+		...
+
+	err = gpio_request_array(leds_gpios, ARRAY_SIZE(leds_gpios));
+	if (err)
+		...
+
+	gpio_free_array(leds_gpios, ARRAY_SIZE(leds_gpios));
+
+
+GPIO Ó³Éäµ½ IRQ
+--------------------
+GPIO ±àºÅÊÇÎÞ·ûºÅÕûÊý;IRQ ±àºÅÒ²ÊÇ¡£ÕâЩ¹¹³ÉÁËÁ½¸öÂß¼­Éϲ»Í¬µÄÃüÃû¿Õ¼ä
+(GPIO 0 ²»Ò»¶¨Ê¹Óà IRQ 0)¡£Äã¿ÉÒÔͨ¹ýÒÔϺ¯ÊýÔÚËüÃÇÖ®¼äʵÏÖÓ³Éä:
+
+	/* Ó³Éä GPIO ±àºÅµ½ IRQ ±àºÅ */
+	int gpio_to_irq(unsigned gpio);
+
+	/* Ó³Éä IRQ ±àºÅµ½ GPIO ±àºÅ (¾¡Á¿±ÜÃâʹÓÃ) */
+	int irq_to_gpio(unsigned irq);
+
+ËüÃǵķµ»ØֵΪ¶ÔÓ¦ÃüÃû¿Õ¼äµÄÏà¹Ø±àºÅ£¬»òÊǸºµÄ´íÎó´úÂë(Èç¹ûÎÞ·¨Ó³Éä)¡£
+(ÀýÈç,ijЩ GPIO ÎÞ·¨×öΪ IRQ ʹÓá£)ÒÔϵıàºÅ´íÎóÊÇδ¾­¼ì²âµÄ:ʹÓÃÒ»¸ö
+δͨ¹ý gpio_direction_input()ÅäÖÃΪÊäÈëµÄ GPIO ±àºÅ£¬»òÕßʹÓÃÒ»¸ö
+²¢·ÇÀ´Ô´ÓÚgpio_to_irq()µÄ IRQ ±àºÅ¡£
+
+ÕâÁ½¸öÓ³É亯Êý¿ÉÄÜ»áÔÚÐźűàºÅµÄ¼Ó¼õ¼ÆËã¹ý³ÌÉÏ»¨Ð©Ê±¼ä¡£ËüÃDz»¿ÉÐÝÃß¡£
+
+gpio_to_irq()·µ»ØµÄ·Ç´íÎóÖµ¿ÉÒÔ´«µÝ¸ø request_irq()»òÕß free_irq()¡£
+ËüÃÇͨ³£Í¨¹ý°å¼¶Ìض¨µÄ³õʼ»¯´úÂë´æ·Åµ½Æ½Ì¨É豸µÄ IRQ ×ÊÔ´ÖС£×¢Òâ:IRQ
+´¥·¢Ñ¡ÏîÊÇ IRQ ½Ó¿ÚµÄÒ»²¿·Ö£¬Èç IRQF_TRIGGER_FALLING£¬ÏµÍ³»½ÐÑÄÜÁ¦
+Ò²ÊÇÈç´Ë¡£
+
+irq_to_gpio()·µ»ØµÄ·Ç´íÎóÖµ´ó¶àÊýͨ³£¿ÉÒÔ±» gpio_get_value()ËùʹÓã¬
+±ÈÈçÔÚ IRQ ÊÇÑØ´¥·¢Ê±³õʼ»¯»ò¸üÐÂÇý¶¯×´Ì¬¡£×¢ÒâijЩƽ̨²»Ö§³Ö·´Ó³Éä,ËùÒÔ
+ÄãÓ¦¸Ã¾¡Á¿±ÜÃâʹÓÃËü¡£
+
+ËüÃǵķµ»ØֵΪ¶ÔÓ¦ÃüÃû¿Õ¼äµÄÏà¹Ø±àºÅ£¬»òÊǸºµÄ´íÎó´úÂë(Èç¹ûÎÞ·¨Ó³Éä)¡£
+(ÀýÈç,ijЩ GPIO ÎÞ·¨×öΪ IRQ ʹÓá£)ÒÔϵıàºÅ´íÎóÊÇδ¾­¼ì²âµÄ£º
+ʹÓÃÒ»¸öδͨ¹ý gpio_direction_input()ÅäÖÃΪÊäÈëµÄ GPIO ±àºÅ£¬
+»òÕßʹÓÃÒ»¸ö²¢·ÇÀ´Ô´ÓÚgpio_to_irq()µÄ IRQ ±àºÅ¡£
+
+
+Ä£Ä⿪©ÐźÅ
+----------------------------
+ÓÐʱÔÚÖ»Óе͵çƽÐźÅ×÷Ϊʵ¼ÊÇý¶¯½á¹û(ÒëÕß×¢:¶à¸öÊä³öÁ¬½ÓÓÚÒ»µã£¬Âß¼­µçƽ
+½á¹ûΪËùÓÐÊä³öµÄÂß¼­Óë)µÄʱºò,¹²ÏíµÄÐźÅÏßÐèҪʹÓá°¿ªÂ©¡±Ðźš£(¸ÃÊõÓï
+ÊÊÓÃÓÚ CMOS ¹Ü£»¶ø TTL Óá°¼¯µç¼«¿ªÂ·¡±¡£)Ò»¸öÉÏÀ­µç×èʹÐźÅΪ¸ßµçƽ¡£Õâ
+ÓÐʱ±»³ÆΪ¡°ÏßÓ롱¡£Êµ¼ÊÉÏ£¬´Ó¸ºÂß¼­(µÍµçƽΪÕæ)µÄ½Ç¶ÈÀ´¿´£¬ÕâÊÇÒ»¸ö¡°Ïß»ò¡±¡£
+
+Ò»¸ö¿ªÂ©Ðźŵij£¼ûÀý×ÓÊǹ²ÏíµÄµÍµçƽʹÄÜ IRQ ÐźÅÏß¡£´ËÍâ,ÓÐʱ˫ÏòÊý¾Ý×ÜÏß
+ÐźÅҲʹÓ鼫¿ªÂ·Ðźš£
+
+ijЩ GPIO ¿ØÖÆÆ÷Ö±½ÓÖ§³Ö¿ªÂ©Êä³ö£¬»¹ÓÐÐí¶à²»Ö§³Ö¡£µ±ÄãÐèÒª¿ªÂ©Ðźţ¬µ«
+Ó²¼þÓÖ²»Ö±½ÓÖ§³ÖµÄʱºò£¬Ò»¸ö³£Óõķ½·¨ÊÇÓÃÈκμ´¿É×÷ÊäÈëÒ²¿É×÷Êä³öµÄ GPIO
+Òý½ÅÀ´Ä£Äâ:
+
+ LOW:	gpio_direction_output(gpio, 0) ... Õâ´úÂëÇý¶¯ÐźŲ¢¸²¸Ç
+	ÉÏÀ­ÅäÖá£
+
+ HIGH:	gpio_direction_input(gpio) ... Õâ´úÂë¹Ø±ÕÊä³ö,ËùÒÔÉÏÀ­µç×è
+	(»òÆäËûµÄһЩÆ÷¼þ)¿ØÖÆÁËÐźš£
+
+Èç¹ûÄ㽫ÐźÅÏß¡°Çý¶¯¡±Îª¸ßµçƽ£¬µ«ÊÇ gpio_get_value(gpio)±¨¸æÁËÒ»¸ö
+µÍµçƽ(ÔÚÊʵ±µÄÉÏÉýʱ¼äºó)£¬Äã¾Í¿ÉÒÔÖªµÀÊÇÆäËûµÄһЩ×é¼þ½«¹²ÏíÐźÅÏßÀ­µÍÁË¡£
+Õâ²»Ò»¶¨ÊÇ´íÎóµÄ¡£Ò»¸ö³£¼ûµÄÀý×Ó¾ÍÊÇ I2C ʱÖÓµÄÑÓ³¤£ºÒ»¸öÐèÒª½ÏÂýʱÖÓµÄ
+´ÓÉ豸ÑÓ³Ù SCK µÄÉÏÉýÑØ£¬¶ø I2C Ö÷É豸ÏàÓ¦µØµ÷ÕûÆäÐźŴ«ÊäËÙÂÊ¡£
+
+
+ÕâЩ¹«Ô¼ºöÂÔÁËʲô?
+================
+ÕâЩ¹«Ô¼ºöÂÔµÄ×î´óÒ»¼þʾÍÊÇÒý½Å¸´Óã¬ÒòΪÕâÊôÓڸ߶ÈоƬÌض¨µÄÊôÐÔÇÒ
+ûÓпÉÒÆÖ²ÐÔ¡£Ä³¸öƽ̨¿ÉÄܲ»ÐèÒªÃ÷È·µÄ¸´ÓÃÐÅÏ¢£»ÓеĶÔÓÚÈÎÒâ¸ø¶¨µÄÒý½Å
+¿ÉÄÜÖ»ÓÐÁ½¸ö¹¦ÄÜÑ¡ÏÓеĿÉÄÜÿ¸öÒý½ÅÓа˸ö¹¦ÄÜÑ¡ÏÓеĿÉÄÜ¿ÉÒÔ½«
+¼¸¸öÒý½ÅÖеÄÈκÎÒ»¸ö×÷Ϊ¸ø¶¨µÄ GPIO¡£(Êǵģ¬ÕâЩÀý×Ó¶¼À´×ÔÓÚµ±Ç°ÔËÐÐ
+Linux µÄϵͳ¡£)
+
+ÔÚijЩϵͳÖÐ,ÓëÒý½Å¸´ÓÃÏà¹ØµÄÊÇÅäÖúÍʹÄܼ¯³ÉµÄÉÏ¡¢ÏÂÀ­Ä£Ê½¡£²¢²»ÊÇËùÓÐ
+ƽ̨¶¼Ö§³ÖÕâÖÖģʽ,»òÕß²»»áÒÔÏàͬµÄ·½Ê½À´Ö§³ÖÕâÖÖģʽ£»ÇÒÈκθø¶¨µÄµç·°å
+¿ÉÄÜʹÓÃÍâÖõÄÉÏÀ­(»òÏÂÀ­)µç×è,ÕâʱоƬÉϵľͲ»Ó¦¸ÃʹÓá£(µ±Ò»¸öµç·ÐèÒª
+5kOhm µÄÀ­¶¯µç×è,оƬÉ쵀 100 kOhm µç×è¾Í²»ÄÜ×öµ½¡£)ͬÑùµÄ£¬Çý¶¯ÄÜÁ¦
+(2 mA vs 20 mA)ºÍµçѹ(1.8V vs 3.3V)ÊÇƽ̨Ìض¨ÎÊÌâ,¾ÍÏñÄ£ÐÍÒ»ÑùÔÚ
+¿ÉÅäÖÃÒý½ÅºÍ GPIO Ö®¼ä(û)ÓÐÒ»Ò»¶ÔÓ¦µÄ¹Øϵ¡£
+
+»¹ÓÐÆäËûһЩϵͳÌض¨µÄ»úÖÆûÓÐÔÚÕâÀïÖ¸³ö£¬ÀýÈçÉÏÊöµÄÊäÈëȥë´ÌºÍÏßÓëÊä³ö
+Ñ¡Ïî¡£Ó²¼þ¿ÉÄÜÖ§³ÖÅúÁ¿¶Á»òд GPIO£¬µ«ÊÇÄÇÒ»°ãÊÇÅäÖÃÏà¹ØµÄ£º¶ÔÓÚ´¦ÓÚͬһ
+¿éÇø(bank)µÄGPIO¡£(GPIO ͨ³£ÒÔ 16 »ò 32 ¸ö×é³ÉÒ»¸öÇø¿é£¬Ò»¸ö¸ø¶¨µÄ
+ƬÉÏϵͳһ°ãÓм¸¸öÕâÑùµÄÇø¿é¡£)ijЩϵͳ¿ÉÒÔͨ¹ýÊä³ö GPIO ´¥·¢ IRQ£¬
+»òÕß´Ó²¢·ÇÒÔ GPIO ¹ÜÀíµÄÒý½ÅÈ¡Öµ¡£ÕâЩ»úÖƵÄÏà¹Ø´úÂëûÓбØÒª¾ßÓпÉÒÆÖ²ÐÔ¡£
+
+µ±Ç°£¬¶¯Ì¬¶¨Òå GPIO ²¢²»ÊDZê×¼µÄ£¬ÀýÈç×÷ΪÅäÖÃÒ»¸ö´øÓÐijЩ GPIO À©Õ¹Æ÷µÄ
+¸½¼Óµç·°åµÄ¸±×÷Óá£
+
+GPIO ʵÏÖÕߵĿò¼Ü (¿ÉÑ¡)
+=====================
+Ç°ÃæÌáµ½ÁË£¬ÓÐÒ»¸ö¿ÉÑ¡µÄʵÏÖ¿ò¼Ü£¬ÈÃƽ̨ʹÓÃÏàͬµÄ±à³Ì½Ó¿Ú£¬¸ü¼Ó¼òµ¥µØÖ§³Ö
+²»Í¬ÖÖÀàµÄ GPIO ¿ØÖÆÆ÷¡£Õâ¸ö¿ò¼Ü³ÆΪ"gpiolib"¡£
+
+×÷Ϊһ¸ö¸¨Öúµ÷ÊÔ¹¦ÄÜ£¬Èç¹û debugfs ¿ÉÓ㬾ͻáÓÐÒ»¸ö /sys/kernel/debug/gpio
+Îļþ¡£Í¨¹ýÕâ¸ö¿ò¼Ü£¬Ëü¿ÉÒÔÁгöËùÓÐ×¢²áµÄ¿ØÖÆÆ÷,ÒÔ¼°µ±Ç°ÕýÔÚʹÓÃÖÐµÄ GPIO
+µÄ״̬¡£
+
+
+¿ØÖÆÆ÷Çý¶¯: gpio_chip
+-------------------
+ÔÚ¿ò¼ÜÖÐÿ¸ö GPIO ¿ØÖÆÆ÷¶¼°üװΪһ¸ö "struct gpio_chip"£¬Ëû°üº¬ÁË
+¸ÃÀàÐ͵Äÿ¸ö¿ØÖÆÆ÷µÄ³£ÓÃÐÅÏ¢:
+
+ - ÉèÖà GPIO ·½ÏòµÄ·½·¨
+ - ÓÃÓÚ·ÃÎÊ GPIO ÖµµÄ·½·¨
+ - ¸æÖªµ÷ÓÃÆä·½·¨ÊÇ·ñ¿ÉÄÜÐÝÃߵıêÖ¾
+ - ¿ÉÑ¡µÄ debugfs ÐÅÏ¢µ¼³ö·½·¨ (ÏÔʾÀàËÆÉÏÀ­ÅäÖÃÒ»ÑùµÄ¶îÍâ״̬)
+ - Õï¶Ï±êÇ©
+
+Ò²°üº¬ÁËÀ´×Ô device.platform_data µÄÿ¸öʵÀýµÄÊý¾Ý£ºËüµÚÒ»¸ö GPIO µÄ
+±àºÅºÍËü¿ÉÓÃµÄ GPIO µÄÊýÁ¿¡£
+
+ʵÏÖ gpio_chip µÄ´úÂëÓ¦Ö§³Ö¶à¿ØÖÆÆ÷ʵÀý£¬Õâ¿ÉÄÜʹÓÃÇý¶¯Ä£ÐÍ¡£ÄÇЩ´úÂëÒª
+ÅäÖÃÿ¸ö gpio_chip£¬²¢·¢Æðgpiochip_add()¡£Ð¶ÔØÒ»¸ö GPIO ¿ØÖÆÆ÷ºÜÉÙ¼û£¬
+µ«ÔÚ±ØÒªµÄʱºò¿ÉÒÔʹÓà gpiochip_remove()¡£
+
+´ó²¿·Ö gpio_chip ÊÇÒ»¸öʵÀýÌض¨½á¹¹ÌåµÄÒ»²¿·Ö£¬¶ø²¢²»½« GPIO ½Ó¿Úµ¥¶À
+±©Â¶³öÀ´,±ÈÈç±àÖ·¡¢µçÔ´¹ÜÀíµÈ¡£ÀàËƱà½âÂëÆ÷ÕâÑùµÄоƬ»áÓи´ÔႠGPIO
+״̬¡£
+
+ÈκÎÒ»¸ö debugfs ÐÅÏ¢µ¼³ö·½·¨Í¨³£Ó¦¸ÃºöÂÔ»¹Î´ÉêÇë×÷Ϊ GPIO µÄÐźÅÏß¡£
+ËûÃÇ¿ÉÒÔʹÓà gpiochip_is_requested()²âÊÔ£¬µ±Õâ¸ö GPIO ÒѾ­ÉêÇë¹ýÁË
+¾Í·µ»ØÏà¹ØµÄ±êÇ©£¬·ñÔò·µ»Ø NULL¡£
+
+
+ƽ̨֧³Ö
+-------
+ΪÁËÖ§³ÖÕâ¸ö¿ò¼Ü£¬Ò»¸öƽ̨µÄ Kconfig Îļþ½«»á "select"(Ñ¡Ôñ)
+ARCH_REQUIRE_GPIOLIB »ò ARCH_WANT_OPTIONAL_GPIOLIB£¬²¢ÈÃËüµÄ
+<asm/gpio.h> °üº¬ <asm-generic/gpio.h>£¬Í¬Ê±¶¨ÒåÈý¸ö·½·¨:
+gpio_get_value()¡¢gpio_set_value()ºÍ gpio_cansleep()¡£
+
+ËüÒ²Ó¦Ìṩһ¸ö ARCH_NR_GPIOS µÄ¶¨ÒåÖµ£¬ÕâÑù¿ÉÒÔ¸üºÃµØ·´Ó³¸Ãƽ̨ GPIO
+µÄʵ¼ÊÊýÁ¿,½ÚÊ¡¾²Ì¬±íµÄ¿Õ¼ä¡£(Õâ¸ö¶¨ÒåÖµÓ¦¸Ã°üº¬Æ¬ÉÏϵͳÄÚ½¨ GPIO ºÍ
+GPIO À©Õ¹Æ÷ÖеÄÊý¾Ý¡£)
+
+ARCH_REQUIRE_GPIOLIB Òâζ×Å gpiolib ºËÐÄÔÚÕâ¸ö¹¹¼ÜÖн«×ÜÊDZàÒë½øÄںˡ£
+
+ARCH_WANT_OPTIONAL_GPIOLIB Òâζ×Å gpiolib ºËÐÄĬÈϹرÕ,ÇÒÓû§¿ÉÒÔ
+ʹÄÜËü,²¢½«Æä±àÒë½øÄÚºË(¿ÉÑ¡)¡£
+
+Èç¹ûÕâЩѡÏû±»Ñ¡Ôñ,¸Ãƽ̨¾Í²»Í¨¹ý GPIO-lib Ö§³Ö GPIO,ÇÒ´úÂë²»¿ÉÒÔ
+±»Óû§Ê¹ÄÜ¡£
+
+ÒÔÏÂÕâЩ·½·¨µÄʵÏÖ¿ÉÒÔÖ±½ÓʹÓÿò¼Ü´úÂë,²¢×ÜÊÇͨ¹ý gpio_chip µ÷¶È:
+
+  #define gpio_get_value	__gpio_get_value
+  #define gpio_set_value	__gpio_set_value
+  #define gpio_cansleep		__gpio_cansleep
+
+ÕâЩ¶¨Òå¿ÉÒÔÓøüÀíÏëµÄʵÏÖ·½·¨Ìæ´ú£¬ÄǾÍÊÇʹÓþ­¹ýÂß¼­ÓÅ»¯µÄÄÚÁªº¯ÊýÀ´·ÃÎÊ
+»ùÓÚÌض¨Æ¬ÉÏϵͳµÄ GPIO¡£ÀýÈç,ÈôÒýÓà GPIO µÄ(¼Ä´æÆ÷µØÖ·)Êdz£Á¿¡°12¡±£¬
+¶ÁÈ¡»òÉèÖÃËü¿ÉÄÜÖ»ÐèÉÙÔòÁ½»òÈý¸öÖ¸ÁÇÒ²»»áÐÝÃß¡£µ±ÕâÑùµÄÓÅ»¯ÎÞ·¨ÊµÏÖʱ£¬
+ÄÇЩº¯Êý±ØÐëʹÓÿò¼ÜÌṩµÄ´úÂ룬ÄǾÍÖÁÉÙÒª¼¸Ê®ÌõÖ¸Áî²Å¿ÉÒÔʵÏÖ¡£¶ÔÓÚÓà GPIO
+Ä£ÄâµÄ I/O ½Ó¿Ú, Èç´Ë¾«¼òÖ¸ÁîÊǺÜÓÐÒâÒåµÄ¡£
+
+¶ÔÓÚƬÉÏϵͳ£¬Æ½Ì¨Ìض¨´úÂëΪƬÉÏ GPIO ÿ¸öÇø(bank)¶¨Òå²¢×¢²á gpio_chip
+ʵÀý¡£ÄÇЩ GPIO Ó¦¸Ã¸ù¾ÝоƬ³§É̵ÄÎĵµ½øÐбàÂë/±êÇ©,²¢Ö±½ÓºÍµç·°åÔ­Àíͼ
+¶ÔÓ¦¡£ËûÃÇÓ¦¸Ã¿ªÊ¼ÓÚÁã²¢ÖÕÖ¹ÓÚƽ̨Ìض¨µÄÏÞÖÆ¡£ÕâЩ GPIO(´úÂë)ͨ³£´Ó
+arch_initcall()»òÕ߸üÔçµÄµØ·½¼¯³É½øƽ̨³õʼ»¯´úÂ룬ʹÕâЩ GPIO ×ÜÊÇ¿ÉÓã¬
+ÇÒËûÃÇͨ³£¿ÉÒÔ×÷Ϊ IRQ ʹÓá£
+
+°å¼¶Ö§³Ö
+-------
+¶ÔÓÚÍⲿ GPIO ¿ØÖÆÆ÷(ÀýÈç I2C »ò SPI À©Õ¹Æ÷¡¢×¨ÓÃоƬ¡¢¶à¹¦ÄÜÆ÷¼þ¡¢FPGA
+»ò CPLD)£¬´ó¶àÊý³£Óð弶Ìض¨´úÂ붼¿ÉÒÔ×¢²á¿ØÖÆÆ÷É豸£¬²¢±£Ö¤ËûÃǵÄÇý¶¯ÖªµÀ
+gpiochip_add()ËùʹÓÃµÄ GPIO ±àºÅ¡£ËûÃǵÄÆðʼ±àºÅͨ³£¸úÔÚƽ̨Ìض¨µÄ GPIO
+±àºÅÖ®ºó¡£
+
+ÀýÈç°å¼¶Æô¶¯´úÂëÓ¦¸Ã´´½¨½á¹¹ÌåÖ¸Ã÷оƬ¹«¿ªµÄ GPIO ·¶Î§£¬²¢Ê¹Óà platform_data
+½«Æä´«µÝ¸øÿ¸ö GPIO À©Õ¹Æ÷оƬ¡£È»ºóоƬÇý¶¯ÖÐµÄ probe()Àý³Ì¿ÉÒÔ½«Õâ¸ö
+Êý¾Ý´«µÝ¸ø gpiochip_add()¡£
+
+³õʼ»¯Ë³ÐòºÜÖØÒª¡£ÀýÈ磬Èç¹ûÒ»¸öÉ豸ÒÀÀµ»ùÓÚ I2C µÄ(À©Õ¹)GPIO£¬ÄÇôËüµÄ
+probe()Àý³Ì¾ÍÓ¦¸ÃÔÚÄǸö GPIO ÓÐЧÒÔºó²Å¿ÉÒÔ±»µ÷Óá£ÕâÒâζ×ÅÉ豸Ӧ¸ÃÔÚ
+GPIO ¿ÉÒÔ¹¤×÷Ö®ºó²Å¿É±»×¢²á¡£½â¾öÕâÀàÒÀÀµµÄµÄÒ»ÖÖ·½·¨ÊÇÈÃÕâÖÖ gpio_chip
+¿ØÖÆÆ÷Ïò°å¼¶Ìض¨´úÂëÌṩ setup()ºÍ teardown()»Øµ÷º¯Êý¡£Ò»µ©ËùÓбØÐëµÄ
+×ÊÔ´¿ÉÓÃÖ®ºó£¬ÕâЩ°å¼¶Ìض¨µÄ»Øµ÷º¯Êý½«»á×¢²áÉ豸£¬²¢¿ÉÒÔÔÚÕâЩ GPIO ¿ØÖÆÆ÷
+É豸±ä³ÉÎÞЧʱÒƳýËüÃÇ¡£
+
+
+Óû§¿Õ¼äµÄ Sysfs ½Ó¿Ú(¿ÉÑ¡)
+========================
+ʹÓá°gpiolib¡±ÊµÏÖ¿ò¼ÜµÄƽ̨¿ÉÒÔÑ¡ÔñÅäÖÃÒ»¸ö GPIO µÄ sysfs Óû§½Ó¿Ú¡£
+ÕⲻͬÓÚ debugfs ½Ó¿Ú£¬ÒòΪËüÌṩµÄÊÇ¶Ô GPIO·½ÏòºÍÖµµÄ¿ØÖÆ£¬¶ø²»Ö»ÏÔʾ
+Ò»¸öGPIO µÄ״̬ժҪ¡£´ËÍâ,Ëü¿ÉÒÔ³öÏÖÔÚûÓе÷ÊÔÖ§³ÖµÄ²úÆ·¼¶ÏµÍ³ÖС£
+
+ÀýÈ磬ͨ¹ýÊʵ±µÄϵͳӲ¼þÎĵµ£¬Óû§¿Õ¼ä¿ÉÒÔÖªµÀ GIOP #23 ¿ØÖÆ Flash
+´æ´¢Æ÷µÄд±£»¤(ÓÃÓÚ±£»¤ÆäÖÐ Bootloader ·ÖÇø)¡£²úÆ·µÄϵͳÉý¼¶¿ÉÄÜÐèÒª
+ÁÙʱ½â³ýÕâ¸ö±£»¤£ºÊ×Ïȵ¼ÈëÒ»¸ö GPIO£¬¸Ä±äÆäÊä³ö״̬£¬È»ºóÔÚÖØÐÂʹÄÜд±£»¤
+Ç°Éý¼¶´úÂ롣ͨ³£Çé¿öÏÂ,GPIO #23 ÊDz»»á±»´¥¼°µÄ£¬²¢ÇÒÄÚºËÒ²²»ÐèÒªÖªµÀËû¡£
+
+¸ù¾ÝÊʵ±µÄÓ²¼þÎĵµ£¬Ä³Ð©ÏµÍ³µÄÓû§¿Õ¼ä GPIO ¿ÉÒÔÓÃÓÚÈ·¶¨ÏµÍ³ÅäÖÃÊý¾Ý£¬
+ÕâЩÊý¾ÝÊDZê×¼Äں˲»ÖªµÀµÄ¡£ÔÚijЩÈÎÎñÖУ¬¼òµ¥µÄÓû§¿Õ¼ä GPIO Çý¶¯¿ÉÄÜÊÇ
+ϵͳÕæÕýÐèÒªµÄ¡£
+
+×¢Ò⣺±ê×¼ÄÚºËÇý¶¯ÖÐÒѾ­´æÔÚͨÓõġ°LED ºÍ°´¼ü¡±GPIO ÈÎÎñ£¬·Ö±ðÊÇ:
+"leds-gpio" ºÍ "gpio_keys"¡£ÇëʹÓÃÕâЩÀ´Ìæ´úÖ±½Ó·ÃÎÊ GPIO£¬ÒòΪ¼¯³ÉÔÚ
+Äں˿ò¼ÜÖеÄÕâÀàÇý¶¯±ÈÄãÔÚÓû§¿Õ¼äµÄ´úÂë¸üºÃ¡£
+
+
+Sysfs ÖеÄ·¾¶
+--------------
+ÔÚ/sys/class/gpio ÖÐÓÐ 3 ÀàÈë¿Ú:
+
+   -	ÓÃÓÚÔÚÓû§¿Õ¼ä¿ØÖÆ GPIO µÄ¿ØÖƽӿÚ;
+
+   -	GPIOs ±¾Éí;ÒÔ¼°
+
+   -	GPIO ¿ØÖÆÆ÷ ("gpio_chip" ʵÀý)¡£
+
+³ýÁËÕâЩ±ê×¼µÄÎļþ,»¹°üº¬¡°device¡±·ûºÅÁ´½Ó¡£
+
+¿ØÖƽӿÚÊÇֻдµÄ:
+
+    /sys/class/gpio/
+
+    	"export" ... Óû§¿Õ¼ä¿ÉÒÔͨ¹ýдÆä±àºÅµ½Õâ¸öÎļþ£¬ÒªÇóÄں˵¼³ö
+		Ò»¸ö GPIO µÄ¿ØÖƵ½Óû§¿Õ¼ä¡£
+
+		ÀýÈç: Èç¹ûÄں˴úÂëûÓÐÉêÇë GPIO #19,"echo 19 > export"
+		½«»áΪ GPIO #19 ´´½¨Ò»¸ö "gpio19" ½Úµã¡£
+
+    	"unexport" ... µ¼³öµ½Óû§¿Õ¼äµÄÄæ²Ù×÷¡£
+
+		ÀýÈç: "echo 19 > unexport" ½«»áÒƳýʹÓÃ"export"Îļþµ¼³öµÄ
+		"gpio19" ½Úµã¡£
+
+GPIO ÐźŵÄ·¾¶ÀàËÆ /sys/class/gpio/gpio42/ (¶ÔÓÚ GPIO #42 À´Ëµ)£¬
+²¢ÓÐÈçϵĶÁ/дÊôÐÔ:
+
+    /sys/class/gpio/gpioN/
+
+	"direction" ... ¶ÁÈ¡µÃµ½ "in" »ò "out"¡£Õâ¸öֵͨ³£ÔËÐÐдÈë¡£
+		дÈë"out" ʱ,ÆäÒý½ÅµÄĬÈÏÊä³öΪµÍµçƽ¡£ÎªÁËÈ·±£ÎÞ¹ÊÕÏÔËÐУ¬
+		"low" »ò "high" µÄµçƽֵӦ¸ÃдÈë GPIO µÄÅäÖã¬×÷Ϊ³õʼÊä³öÖµ¡£
+
+		×¢Òâ:Èç¹ûÄں˲»Ö§³Ö¸Ä±ä GPIO µÄ·½Ïò£¬»òÕßÔÚµ¼³öʱÄں˴úÂëûÓÐ
+		Ã÷È·ÔÊÐíÓû§¿Õ¼ä¿ÉÒÔÖØÐÂÅäÖà GPIO ·½Ïò£¬ÄÇôÕâ¸öÊôÐÔ½«²»´æÔÚ¡£
+
+	"value" ... ¶ÁÈ¡µÃµ½ 0 (µÍµçƽ) »ò 1 (¸ßµçƽ)¡£Èç¹û GPIO ÅäÖÃΪ
+		Êä³ö,Õâ¸öÖµÔÊÐíд²Ù×÷¡£ÈκηÇÁãÖµ¶¼ÒԸߵçƽ¿´´ý¡£
+
+		Èç¹ûÒý½Å¿ÉÒÔÅäÖÃΪÖжÏÐźţ¬ÇÒÈç¹ûÒѾ­ÅäÖÃÁ˲úÉúÖжϵÄģʽ
+		£¨¼û"edge"µÄÃèÊö£©£¬Äã¿ÉÒÔ¶ÔÕâ¸öÎļþʹÓÃÂÖѯ²Ù×÷(poll(2))£¬
+		ÇÒÂÖѯ²Ù×÷»áÔÚÈκÎÖжϴ¥·¢Ê±·µ»Ø¡£Èç¹ûÄãʹÓÃÂÖѯ²Ù×÷(poll(2))£¬
+		ÇëÔÚ events ÖÐÉèÖà POLLPRI ºÍ POLLERR¡£Èç¹ûÄãʹÓÃÂÖѯ²Ù×÷
+		(select(2))£¬ÇëÔÚ exceptfds ÉèÖÃÄãÆÚÍûµÄÎļþÃèÊö·û¡£ÔÚ
+		ÂÖѯ²Ù×÷(poll(2))·µ»ØÖ®ºó£¬¼È¿ÉÒÔͨ¹ý lseek(2)²Ù×÷¶ÁÈ¡
+		sysfs ÎļþµÄ¿ªÊ¼²¿·Ö£¬Ò²¿ÉÒԹرÕÕâ¸öÎļþ²¢ÖØдò¿ªËüÀ´¶ÁÈ¡Êý¾Ý¡£
+
+	"edge" ... ¶ÁÈ¡µÃµ½¡°none¡±¡¢¡°rising¡±¡¢¡°falling¡±»òÕß¡°both¡±¡£
+		½«ÕâЩ×Ö·û´®Ð´ÈëÕâ¸öÎļþ¿ÉÒÔÑ¡ÔñÑØ´¥·¢Ä£Ê½£¬»áʹµÃÂÖѯ²Ù×÷
+		(select(2))ÔÚ"value"ÎļþÖзµ»Ø¡£
+
+		Õâ¸öÎļþ½öÓÐÔÚÕâ¸öÒý½Å¿ÉÒÔÅäÖÃΪ¿É²úÉúÖжÏÊäÈëÒý½Åʱ£¬²Å´æÔÚ¡£
+
+	"active_low" ... ¶ÁÈ¡µÃµ½ 0 (¼Ù) »ò 1 (Õæ)¡£Ð´ÈëÈκηÇÁãÖµ¿ÉÒÔ
+		·­×ªÕâ¸öÊôÐÔµÄ(¶Áд)Öµ¡£ÒÑ´æÔÚ»òÖ®ºóͨ¹ý"edge"ÊôÐÔÉèÖÃÁË"rising"
+		ºÍ "falling" ÑØ´¥·¢Ä£Ê½µÄÂÖѯ²Ù×÷(poll(2))½«»á×ñÑ­Õâ¸öÉèÖá£
+
+GPIO ¿ØÖÆÆ÷µÄ·¾¶ÀàËÆ /sys/class/gpio/gpiochip42/ (¶ÔÓÚ´Ó#42 GPIO
+¿ªÊ¼ÊµÏÖ¿ØÖƵĿØÖÆÆ÷),²¢ÓÐ×ÅÒÔÏÂÖ»¶ÁÊôÐÔ:
+
+    /sys/class/gpio/gpiochipN/
+
+    	"base" ... ÓëÒÔÉ쵀 N Ïàͬ,´ú±í´ËоƬ¹ÜÀíµÄµÚÒ»¸ö GPIO µÄ±àºÅ
+
+    	"label" ... ÓÃÓÚÕï¶Ï (²¢²»×ÜÊÇÖ»ÓÐΨһֵ)
+
+    	"ngpio" ... ´Ë¿ØÖÆÆ÷Ëù¹ÜÀíµÄ GPIO ÊýÁ¿(¶ø GPIO ±àºÅ´Ó N µ½
+    		N + ngpio - 1)
+
+´ó¶àÊýÇé¿öÏÂ,µç·°åµÄÎĵµÓ¦µ±±êÃ÷ÿ¸ö GPIO µÄʹÓÃÄ¿µÄ¡£µ«ÊÇÄÇЩ±àºÅ²¢²»×ÜÊÇ
+¹Ì¶¨µÄ,ÀýÈçÔÚÀ©Õ¹¿¨É쵀 GPIO»á¸ù¾ÝËùʹÓõÄÖ÷°å»òËùÔڶѵþ¼Ü¹¹ÖÐÆäËûµÄ°å×Ó¶ø
+ÓÐËù²»Í¬¡£ÔÚÕâÖÖÇé¿öÏÂ,Äã¿ÉÄÜÐèҪʹÓà gpiochip ½Úµã(¾¡¿ÉÄܵؽáºÏµç·ͼ)À´
+È·¶¨¸ø¶¨ÐźÅËùÓÃµÄ GPIO ±àºÅ¡£
+
+
+´ÓÄں˴úÂëÖе¼³ö
+-------------
+Äں˴úÂë¿ÉÒÔÃ÷È·µØ¹ÜÀíÄÇЩÒÑͨ¹ý gpio_request()ÉêÇëµÄ GPIO µÄµ¼³ö:
+
+	/* µ¼³ö GPIO µ½Óû§¿Õ¼ä */
+	int gpio_export(unsigned gpio, bool direction_may_change);
+
+	/* gpio_export()µÄÄæ²Ù×÷ */
+	void gpio_unexport();
+
+	/* ´´½¨Ò»¸ö sysfs Á¬½Óµ½Òѵ¼³öµÄ GPIO ½Úµã */
+	int gpio_export_link(struct device *dev, const char *name,
+		unsigned gpio)
+
+	/* ¸Ä±ä sysfs ÖеÄÒ»¸ö GPIO ½ÚµãµÄ¼«ÐÔ */
+	int gpio_sysfs_set_active_low(unsigned gpio, int value);
+
+ÔÚÒ»¸öÄÚºËÇý¶¯ÉêÇëÒ»¸ö GPIO Ö®ºó£¬Ëü¿ÉÒÔͨ¹ý gpio_export()ʹÆäÔÚ sysfs
+½Ó¿ÚÖпɼû¡£¸ÃÇý¶¯¿ÉÒÔ¿ØÖÆÐźŷ½ÏòÊÇ·ñ¿ÉÐ޸ġ£ÕâÓÐÖúÓÚ·ÀÖ¹Óû§¿Õ¼ä´úÂëÎÞÒâ¼ä
+ÆÆ»µÖØÒªµÄϵͳ״̬¡£
+
+Õâ¸öÃ÷È·µÄµ¼³öÓÐÖúÓÚ(ͨ¹ýʹijЩʵÑé¸üÈÝÒ×À´)µ÷ÊÔ£¬Ò²¿ÉÒÔÌṩһ¸öʼÖÕ´æÔڵĽӿڣ¬
+ÓëÎĵµÅäºÏ×÷Ϊ°å¼¶Ö§³Ö°üµÄÒ»²¿·Ö¡£
+
+ÔÚ GPIO ±»µ¼³öÖ®ºó£¬gpio_export_link()ÔÊÐíÔÚ sysfs ÎļþϵͳµÄÈκεط½
+´´½¨Ò»¸öµ½Õâ¸ö GPIO sysfs ½ÚµãµÄ·ûºÅÁ´½Ó¡£ÕâÑùÇý¶¯¾Í¿ÉÒÔͨ¹ýÒ»¸öÃèÊöÐÔµÄ
+Ãû×Ö£¬ÔÚ sysfs ÖÐËûÃÇËùÓµÓеÄÉ豸ÏÂÌṩһ¸ö(µ½Õâ¸ö GPIO sysfs ½ÚµãµÄ)½Ó¿Ú¡£
+
+Çý¶¯¿ÉÒÔʹÓà gpio_sysfs_set_active_low() À´ÔÚÓû§¿Õ¼äÒþ²Øµç·°åÖ®¼ä
+GPIO Ïߵļ«ÐÔ²îÒì¡£Õâ¸ö½ö¶Ô sysfs ½Ó¿ÚÆð×÷Ó᣼«ÐԵĸıä¿ÉÒÔÔÚ gpio_export()
+Ç°ºó½øÐÐ,ÇÒ֮ǰʹÄܵÄÂÖѯ²Ù×÷(poll(2))Ö§³Ö(ÉÏÉý»òϽµÑØ)½«»á±»ÖØÐÂÅäÖÃÀ´×ñÑ­
+Õâ¸öÉèÖá£
-- 
1.7.9.5
ÿôèº{.nÇ+‰·Ÿ®‰­†+%ŠËÿ±éݶ\x17¥Šwÿº{.nÇ+‰·¥Š{±þG«éÿŠ{ayº\x1dʇڙë,j\a­¢f£¢·hšïêÿ‘êçz_è®\x03(­éšŽŠÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?™¨è­Ú&£ø§~á¶iO•æ¬z·švØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?–I¥

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH] Chinese translation of Documentation/gpio.txt
  2012-08-28 14:03 [PATCH] Chinese translation of Documentation/gpio.txt Ninja Tekkaman
@ 2012-08-28 15:43 ` harryxiyou
  2012-09-05 12:00 ` Dong Aisheng
  1 sibling, 0 replies; 7+ messages in thread
From: harryxiyou @ 2012-08-28 15:43 UTC (permalink / raw)
  To: Ninja Tekkaman
  Cc: Greg-Kroah-Hartman, linux-kernel, linux-doc, Grant Likely,
	Linus Walleij, kernel

2012/8/28 Ninja Tekkaman <tekkamanninja@gmail.com>:
> This is a Chinese translated version of Documentation/gpio.txt
>
> Signed-off-by: Fu Wei <tekkamanninja@gmail.com>
>

Acked-by: Harry Wei <harryxiyou@gmail.com>



-- 
Thanks
Harry Wei

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Chinese translation of Documentation/gpio.txt
  2012-08-28 14:03 [PATCH] Chinese translation of Documentation/gpio.txt Ninja Tekkaman
  2012-08-28 15:43 ` harryxiyou
@ 2012-09-05 12:00 ` Dong Aisheng
  2012-09-06  7:24   ` Linus Walleij
  1 sibling, 1 reply; 7+ messages in thread
From: Dong Aisheng @ 2012-09-05 12:00 UTC (permalink / raw)
  To: Ninja Tekkaman
  Cc: Harry Wei, Greg-Kroah-Hartman, linux-kernel, linux-doc,
	Grant Likely, Linus Walleij, kernel

Hi Wei,

On Tue, Aug 28, 2012 at 10:03:13PM +0800, Ninja Tekkaman wrote:
> This is a Chinese translated version of Documentation/gpio.txt
> 
> Signed-off-by: Fu Wei <tekkamanninja@gmail.com>
> ---
>  Documentation/zh_CN/gpio.txt |  662 ++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 662 insertions(+)
>  create mode 100644 Documentation/zh_CN/gpio.txt
> 
The doc mostly looks good.
A few minor comments.

> +而接下来要做的是标识它的方向,这通常是在板级启动代码中为 GPIO 设置
> +一个 platform_device 时做的。
How about as follows?
这通常是在板级启动代码中配置platform_device时为使用的GPIO设置方向。

> +	/* GPIO 输入:返回零或非零 */
> +	int gpio_get_value(unsigned gpio);
> +
> +	/* GPIO 输入 */
输出

> +	void gpio_set_value(unsigned gpio, int value);
> +
> +返回值是布尔值,零表示低电平,非零表示高电平。当读取一个输出引脚的值时,
GPIO值是布尔型

> +返回值应该是引脚上的值。这个值不总是和输出值相符,因为存在开漏输出信号和
> +输出潜伏期的问题。
输出延迟的问题

> +
> +以上的 get/set 函数不会对早期已经通过 gpio_direction_*()报告“无效的
> +GPIO”返回错误。此外,还需要注意的是并不是所有平台都可以从输出引脚中读取
> +数据的,那些引脚也不总是返回零。且对那些无法安全访问(可能会休眠)的 GPIO
> +(见下文)使用这些函数是错误的。
以上的 get/set 函数没有错误返回值,因为之前gpio_direction_*()已经检查过
是否是“无效的GPIO”。此外,还需要注意的是并不是所有平台都可以从输出引脚
中读取数据的,对于不能读的应该总是返回零。另外,对那些在不睡眠(见下文)
的情况下不能安全访问的GPIO使用这些函数是错误的。

> +为了访问这种 GPIO,内核定义了一套不同的函数:
> +
> +	/* GPIO 输入:返回零或非零 ,可能会休眠 */
> +	int gpio_get_value_cansleep(unsigned gpio);
> +
> +	/* GPIO 输入,可能会休眠 */
输出

> +这个函数完成两个基本的目标。一是标识那些实际上已作为 GPIO 使用的信号线,
> +这样便于更好地诊断;系统可能需要服务几百个潜在的 GPIO,但是对于任何一个
系统可能有几百个可用的GPIO

> +它们的返回值为对应命名空间的相关编号,或是负的错误代码(如果无法映射)。
> +(例如,某些 GPIO 无法做为 IRQ 使用。)以下的编号错误是未经检测的:使用一个
> +未通过 gpio_direction_input()配置为输入的 GPIO 编号,或者使用一个
> +并非来源于gpio_to_irq()的 IRQ 编号。
...
> +
> +这两个映射函数可能会在信号编号的加减计算过程上花些时间。它们不可休眠。
> +
> +gpio_to_irq()返回的非错误值可以传递给 request_irq()或者 free_irq()。
> +它们通常通过板级特定的初始化代码存放到平台设备的 IRQ 资源中。注意:IRQ
> +触发选项是 IRQ 接口的一部分,如 IRQF_TRIGGER_FALLING,系统唤醒能力
> +也是如此。
> +
> +irq_to_gpio()返回的非错误值大多数通常可以被 gpio_get_value()所使用,
> +比如在 IRQ 是沿触发时初始化或更新驱动状态。注意某些平台不支持反映射,所以
> +你应该尽量避免使用它。
> +
> +它们的返回值为对应命名空间的相关编号,或是负的错误代码(如果无法映射)。
> +(例如,某些 GPIO 无法做为 IRQ 使用。)以下的编号错误是未经检测的:
> +使用一个未通过 gpio_direction_input()配置为输入的 GPIO 编号,
> +或者使用一个并非来源于gpio_to_irq()的 IRQ 编号。
It looks these 4 lines are duplicated and should be removed.

> +这些定义可以用更理想的实现方法替代,那就是使用经过逻辑优化的内联函数来访问
> +基于特定片上系统的 GPIO。例如,若引用 GPIO 的(寄存器地址)是常量“12”,
例如,若引用的GPIO 是常量“12”

BTW, i meet a few whitespace warnings when applying your patch and
the Chinese in Documentation/zh_CN/gpio.txt can not be read by my
VIM, i tried many character set config such as UTF-8 and VSCII,
but still mess code. But the Windows Notepad can read it.
I don't know the reason, probably you could check it.

Otherwise you can add my ack.
Acked-by: Dong Aisheng <dong.aisheng@linaro.org>

Regards
Dong Aisheng


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Chinese translation of Documentation/gpio.txt
  2012-09-05 12:00 ` Dong Aisheng
@ 2012-09-06  7:24   ` Linus Walleij
  2012-09-06 13:47     ` harryxiyou
  0 siblings, 1 reply; 7+ messages in thread
From: Linus Walleij @ 2012-09-06  7:24 UTC (permalink / raw)
  To: Dong Aisheng, Harry Wei
  Cc: Ninja Tekkaman, Greg-Kroah-Hartman, linux-kernel, linux-doc,
	Grant Likely, kernel

2012/9/5 Dong Aisheng <b29396@freescale.com>:

Thanks for your help Dong, Wei can you please check Dong's
comments and submit a version with his ACK, and I'll apply it.

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Chinese translation of Documentation/gpio.txt
  2012-09-06  7:24   ` Linus Walleij
@ 2012-09-06 13:47     ` harryxiyou
  2012-09-06 16:47       ` Ninja Tekkaman
  0 siblings, 1 reply; 7+ messages in thread
From: harryxiyou @ 2012-09-06 13:47 UTC (permalink / raw)
  To: Linus Walleij, Ninja Tekkaman
  Cc: Dong Aisheng, Greg-Kroah-Hartman, linux-kernel, linux-doc,
	Grant Likely, kernel

On Thu, Sep 6, 2012 at 3:24 PM, Linus Walleij <linus.walleij@linaro.org> wrote:
> 2012/9/5 Dong Aisheng <b29396@freescale.com>:
>
> Thanks for your help Dong, Wei can you please check Dong's
> comments and submit a version with his ACK, and I'll apply it.
>

Acked-by: Harry Wei <harryxiyou@gmail.com>

This patch is made by Wei Fu, so i think he is the best one to
add  Dong's corrections and submit a version of Dong's ACK.
I have given my ACK. Any Comments?
Wei Fu, please submit a new one with Dong's ACK, thanks.



-- 
Thanks
Harry Wei

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Chinese translation of Documentation/gpio.txt
  2012-09-06 13:47     ` harryxiyou
@ 2012-09-06 16:47       ` Ninja Tekkaman
  2012-09-07 21:10         ` Linus Walleij
  0 siblings, 1 reply; 7+ messages in thread
From: Ninja Tekkaman @ 2012-09-06 16:47 UTC (permalink / raw)
  To: harryxiyou, Linus Walleij, Dong Aisheng
  Cc: Greg-Kroah-Hartman, linux-kernel, linux-doc, Grant Likely, kernel

OK, I am working on It.

I will sent a new patch for  Dong's corrections as quickly as possible.
Thanks alot for Dong's corrections.

The new patch will  base on the patch I have submitted,
because that patch has applied to Greg Kroah-Hartman's driver-core git tree.

So sorry about that mess code.
The  mess code is caused by Gmail web GUI, I won't use it again.
So the mess code will not happened again.

Thanks for all the help!

2012/9/6 harryxiyou <harryxiyou@gmail.com>:
> On Thu, Sep 6, 2012 at 3:24 PM, Linus Walleij <linus.walleij@linaro.org> wrote:
>> 2012/9/5 Dong Aisheng <b29396@freescale.com>:
>>
>> Thanks for your help Dong, Wei can you please check Dong's
>> comments and submit a version with his ACK, and I'll apply it.
>>
>
> Acked-by: Harry Wei <harryxiyou@gmail.com>
>
> This patch is made by Wei Fu, so i think he is the best one to
> add  Dong's corrections and submit a version of Dong's ACK.
> I have given my ACK. Any Comments?
> Wei Fu, please submit a new one with Dong's ACK, thanks.
>
>
>
> --
> Thanks
> Harry Wei

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH] Chinese translation of Documentation/gpio.txt
  2012-09-06 16:47       ` Ninja Tekkaman
@ 2012-09-07 21:10         ` Linus Walleij
  0 siblings, 0 replies; 7+ messages in thread
From: Linus Walleij @ 2012-09-07 21:10 UTC (permalink / raw)
  To: Ninja Tekkaman
  Cc: harryxiyou, Dong Aisheng, Greg-Kroah-Hartman, linux-kernel,
	linux-doc, Grant Likely, kernel

On Thu, Sep 6, 2012 at 6:47 PM, Ninja Tekkaman <tekkamanninja@gmail.com> wrote:

> The new patch will  base on the patch I have submitted,
> because that patch has applied to Greg Kroah-Hartman's driver-core git tree.

OK then the fixup has to go into Gregs tree as well and I
don't need to worry about it :-)

Yours,
Linus Walleij

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2012-09-07 21:10 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-08-28 14:03 [PATCH] Chinese translation of Documentation/gpio.txt Ninja Tekkaman
2012-08-28 15:43 ` harryxiyou
2012-09-05 12:00 ` Dong Aisheng
2012-09-06  7:24   ` Linus Walleij
2012-09-06 13:47     ` harryxiyou
2012-09-06 16:47       ` Ninja Tekkaman
2012-09-07 21:10         ` Linus Walleij

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).