MTK6577+Android GPIO
1. GPIO简介
MT6577提供232个通用输入/输出引脚(GPIO,GPIO0~GPIO231),通过设置它们的控制寄存器,MCU软件可以控制它们的方向(输入/输出)、输出值(低/高)和读取这些引脚的值(输入)。为了减少GPIO引脚的数量,MT6577的GPIO采用多路复用的设计机制,这点和freescale的IMX系列类似。
2. GPIO特性(features)
图1
常用的寄存器如下:
(1) GPIO_MODE寄存器组
包括有GPIO_MODE0~46、GPIO_MODE_SET0~46和GPIO_MODE_RESET0~46这些寄存器,最常用的是GPIO_MODE0~46,每个GPIO通过编程GPIO_MODE_SELx(x=0~46)命令寄存器来控制辅助模式(auxiliary mode),其实此寄存器就是用于配置GPIO模式的,比如下面我们以PWM1引脚来说明此寄存器的意义:
图2
就是说PWM1引脚(232个GPIO引脚之一),在内部可以通过软件编程来选择接通GPIO67、PWM1、EINT9、IRDA_PDN、MD_TXD2、USB_DRVVBUS、DBG_OUT1[16]之一,比如如果要让PWM1引脚作为GPIO67功能,我们来看GPIO_MODE_SEL13的设置:
图3
结合图2和图3,只需要设置GPIO_MODE_SEL13[8:6]=0就选通了GPIO67。
(2) GPIODIR寄存器组
包括有GPIODIR0~14、GPIODIR_SET0~14和GPIODIR_RESET0~14这些寄存器,最常用的是GPIODIR0~14,每个寄存器配置一个GPIO为输入(0)/输出(1),如下图:
图4
(3) PULLEN寄存器组
包括有PULLEN0~14、PULLEN_SET0~14、PULLEN_RESET0~14和PULLSEL0~14,最常用的是PULLEN0~14和PULLSEL0~14,分别用于disable(0)/enable(1)引脚上拉下拉功能,选择上拉还是下拉功能
图5
(4) GPIO_INV寄存器组
包括有GPI_INV0~14、GPI_INV_SET0~14和GPI_INV_RESET0~14,最常用的是GPI_INV0~14,用于控制是否反转(invert)GPIO的值,如下图:
图6
(5) GPO寄存器组
包括有GPO0~14、GPO_SET0~14和GPO_RESET0~14,最常用的是GPO0~14,用于控制GPIO引脚的输出电平,如下图:
图7
(6) GPI寄存器组
GPI0~14,通过此寄存器可以获取到连接到此IO口的输入状态,如下图:
图8
3. GPIO寄存器对应的一些枚举类型定义
/*----------------------------------------------------------------------------*/ #defineMAX_GPIO_PIN 232 /****************************************************************************** * Enumeration forGPIO pin ******************************************************************************/ typedef enumGPIO_PIN { GPIO_UNSUPPORTED = -1, GPIO0 , GPIO1 , GPIO2 , GPIO3 , GPIO4 , GPIO5 , GPIO6 , GPIO7 , GPIO8 , GPIO9 , GPIO10 , GPIO11 ,GPIO12 , GPIO13 , GPIO14 , GPIO15 , GPIO16 , GPIO17 , GPIO18 , GPIO19 , GPIO20, GPIO21 , GPIO22 , GPIO23 , GPIO24 , GPIO25 , GPIO26 , GPIO27 , GPIO28, GPIO29 , GPIO30 , GPIO31 , GPIO32 , GPIO33 , GPIO34 , GPIO35 , GPIO36, GPIO37 , GPIO38 , GPIO39 , GPIO40 , GPIO41 , GPIO42 , GPIO43 , GPIO44, GPIO45 , GPIO46 , GPIO47 , GPIO48 , GPIO49 , GPIO50 , GPIO51 , GPIO52, GPIO53 , GPIO54 , GPIO55 , GPIO56 , GPIO57 , GPIO58 , GPIO59 , GPIO60, GPIO61 , GPIO62 , GPIO63 , GPIO64 , GPIO65 , GPIO66 , GPIO67 , GPIO68, GPIO69 , GPIO70 , GPIO71 , GPIO72 , GPIO73 , GPIO74 , GPIO75 , GPIO76, GPIO77 , GPIO78 , GPIO79 , GPIO80 , GPIO81 , GPIO82 , GPIO83 , GPIO84, GPIO85 , GPIO86 , GPIO87 , GPIO88 , GPIO89 , GPIO90 , GPIO91 , GPIO92, GPIO93 , GPIO94 , GPIO95 , GPIO96 , GPIO97 , GPIO98 , GPIO99 ,GPIO100, GPIO101, GPIO102, GPIO103, GPIO104, GPIO105, GPIO106, GPIO107,GPIO108, GPIO109, GPIO110, GPIO111, GPIO112, GPIO113, GPIO114, GPIO115,GPIO116, GPIO117, GPIO118, GPIO119, GPIO120, GPIO121, GPIO122, GPIO123,GPIO124, GPIO125, GPIO126, GPIO127, GPIO128, GPIO129, GPIO130, GPIO131,GPIO132, GPIO133, GPIO134, GPIO135, GPIO136, GPIO137, GPIO138, GPIO139,GPIO140, GPIO141, GPIO142, GPIO143, GPIO144, GPIO145, GPIO146, GPIO147,GPIO148, GPIO149, GPIO150, GPIO151, GPIO152, GPIO153, GPIO154, GPIO155,GPIO156, GPIO157, GPIO158, GPIO159, GPIO160, GPIO161, GPIO162, GPIO163,GPIO164, GPIO165, GPIO166, GPIO167, GPIO168, GPIO169, GPIO170, GPIO171,GPIO172, GPIO173, GPIO174, GPIO175, GPIO176, GPIO177, GPIO178, GPIO179,GPIO180, GPIO181, GPIO182, GPIO183, GPIO184, GPIO185, GPIO186, GPIO187,GPIO188, GPIO189, GPIO190, GPIO191, GPIO192, GPIO193, GPIO194, GPIO195, GPIO196,GPIO197, GPIO198, GPIO199, GPIO200, GPIO201, GPIO202, GPIO203,GPIO204, GPIO205, GPIO206, GPIO207, GPIO208, GPIO209, GPIO210, GPIO211,GPIO212, GPIO213, GPIO214, GPIO215, GPIO216, GPIO217, GPIO218, GPIO219,GPIO220, GPIO221, GPIO222, GPIO223, GPIO224, GPIO225, GPIO226, GPIO227,GPIO228, GPIO229, GPIO230, GPIO231, GPIO_MAX }GPIO_PIN; /****************************************************************************** * Enumeration forClock output ******************************************************************************/ /* GPIO MODECONTROL VALUE*/ typedef enum { GPIO_MODE_GPIO = 0, GPIO_MODE_00 = 0, GPIO_MODE_01 = 1, GPIO_MODE_02 = 2, GPIO_MODE_03 = 3, GPIO_MODE_04 = 4, GPIO_MODE_05 = 5, GPIO_MODE_06 = 6, GPIO_MODE_07 = 7, GPIO_MODE_MAX, GPIO_MODE_DEFAULT = GPIO_MODE_01, } GPIO_MODE; /*----------------------------------------------------------------------------*/ /* GPIO DIRECTION*/ typedef enum { GPIO_DIR_IN = 0, GPIO_DIR_OUT = 1, GPIO_DIR_MAX, GPIO_DIR_DEFAULT = GPIO_DIR_IN, } GPIO_DIR; /*----------------------------------------------------------------------------*/ /* GPIO PULLENABLE*/ typedef enum { GPIO_PULL_DISABLE = 0, GPIO_PULL_ENABLE = 1, GPIO_PULL_EN_MAX, GPIO_PULL_EN_DEFAULT = GPIO_PULL_ENABLE, } GPIO_PULL_EN; /*----------------------------------------------------------------------------*/ /* GPIOPULL-UP/PULL-DOWN*/ typedef enum { GPIO_PULL_DOWN = 0, GPIO_PULL_UP = 1, GPIO_PULL_MAX, GPIO_PULL_DEFAULT = GPIO_PULL_DOWN } GPIO_PULL; /*----------------------------------------------------------------------------*/ /* GPIO INVERSION*/ typedef enum { GPIO_DATA_UNINV = 0, GPIO_DATA_INV = 1, GPIO_DATA_INV_MAX, GPIO_DATA_INV_DEFAULT = GPIO_DATA_UNINV } GPIO_INVERSION; /*----------------------------------------------------------------------------*/ /* GPIO OUTPUT */ typedef enum { GPIO_OUT_ZERO = 0, GPIO_OUT_ONE = 1, GPIO_OUT_MAX, GPIO_OUT_DEFAULT = GPIO_OUT_ZERO, GPIO_DATA_OUT_DEFAULT = GPIO_OUT_ZERO, /*compatible with DCT*/ } GPIO_OUT;
4. GPIO控制代码例子
比如我们要PWM1引脚作为GPIO67功能,用于输出低电平,控制代码如下:
mt_set_gpio_mode(GPIO67,GPIO_MODE_00); mt_set_gpio_dir(GPIO67,GPIO_DIR_OUT); mt_set_gpio_out(GPIO67,GPIO_OUT_ZERO);