zoukankan      html  css  js  c++  java
  • MTK GPIO 一些理解

    基于6575平台:

    GPIO驱动程序提供了两个接口:

    (1)内核空间:所提供的GPIO驱动程序,驱动程序可以调用其他函数
    (2)用户空间:用户空间的程序可以通过发送IOCTL   /dev/ mtgpio的操作GPIO



    1. GPIO_PIN

    枚举所有的GPIO引脚。它将被用于在每个gpio驱动

    1. typedef enum GPIO_PIN  
    2. {      
    3.     GPIO_UNSUPPORTED = -1,      
    4.   
    5.     GPIO0  , GPIO1  , GPIO2  , GPIO3  , GPIO4  , GPIO5  , GPIO6  , GPIO7  ,   
    6.     GPIO8  , GPIO9  , GPIO10 , GPIO11 , GPIO12 , GPIO13 , GPIO14 , GPIO15 ,   
    7.     GPIO16 , GPIO17 , GPIO18 , GPIO19 , GPIO20 , GPIO21 , GPIO22 , GPIO23 ,   
    8.     GPIO24 , GPIO25 , GPIO26 , GPIO27 , GPIO28 , GPIO29 , GPIO30 , GPIO31 ,   
    9.     GPIO32 , GPIO33 , GPIO34 , GPIO35 , GPIO36 , GPIO37 , GPIO38 , GPIO39 ,   
    10.     GPIO40 , GPIO41 , GPIO42 , GPIO43 , GPIO44 , GPIO45 , GPIO46 , GPIO47 ,   
    11.     GPIO48 , GPIO49 , GPIO50 , GPIO51 , GPIO52 , GPIO53 , GPIO54 , GPIO55 ,   
    12.     GPIO56 , GPIO57 , GPIO58 , GPIO59 , GPIO60 , GPIO61 , GPIO62 , GPIO63 ,   
    13.     GPIO64 , GPIO65 , GPIO66 , GPIO67 , GPIO68 , GPIO69 , GPIO70 , GPIO71 ,   
    14.     GPIO72 , GPIO73 , GPIO74 , GPIO75 , GPIO76 , GPIO77 , GPIO78 , GPIO79 ,   
    15.     GPIO80 , GPIO81 , GPIO82 , GPIO83 , GPIO84 , GPIO85 , GPIO86 , GPIO87 ,   
    16.     GPIO88 , GPIO89 , GPIO90 , GPIO91 , GPIO92 , GPIO93 , GPIO94 , GPIO95 ,   
    17.     GPIO96 , GPIO97 , GPIO98 , GPIO99 , GPIO100, .............   
    18.       
    19.     GPIO_MAX  
    20. }GPIO_PIN;          

    2.GPIO_MODE

    每个GPIO引脚支持四种模式,0为GPIO模式。

    1. /* GPIO MODE CONTROL VALUE*/  
    2. typedef enum {  
    3.     GPIO_MODE_UNSUPPORTED = -1,  
    4.     GPIO_MODE_GPIO  = 0,  
    5.     GPIO_MODE_00    = 0,  
    6.     GPIO_MODE_01    = 1,  
    7.     GPIO_MODE_02    = 2,  
    8.     GPIO_MODE_03    = 3,  
    9.     GPIO_MODE_04    = 4,  
    10.     GPIO_MODE_05    = 5,  
    11.     GPIO_MODE_06    = 6,  
    12.     GPIO_MODE_07    = 7,  
    13.   
    14.     GPIO_MODE_MAX,  
    15.     GPIO_MODE_DEFAULT = GPIO_MODE_01,  
    16. } GPIO_MODE;  

    3.GPIO_DIR

    在GPIO模式下,每一个GPIO引脚可配置为输入或输出。

    1. /* GPIO DIRECTION */  
    2. typedef enum {  
    3.     GPIO_DIR_UNSUPPORTED = -1,  
    4.     GPIO_DIR_IN     = 0,  
    5.     GPIO_DIR_OUT    = 1,  
    6.   
    7.     GPIO_DIR_MAX,  
    8.     GPIO_DIR_DEFAULT = GPIO_DIR_IN,  
    9. } GPIO_DIR;  
    4.GPIO_PULLEN

    每个GPIO引脚都可以被配置为上拉使能或拉禁用(pull enable or pull disable)。这取决于设备连接的GPIO引脚。  Q1:pull enable or pull disable?

    1. /* GPIO PULL ENABLE*/  
    2. typedef enum {  
    3.     GPIO_PULL_EN_UNSUPPORTED = -1,  
    4.     GPIO_PULL_DISABLE = 0,  
    5.     GPIO_PULL_ENABLE  = 1,  
    6.   
    7.     GPIO_PULL_EN_MAX,  
    8.     GPIO_PULL_EN_DEFAULT = GPIO_PULL_ENABLE,  
    9. } GPIO_PULL_EN;  

    5.GPIO_PULL

    After one GPIO pin is configured as pull enable, it could be configured as pull-up or pull-down. It depends on the device connecting to the GPIO pin. (下面都是英文了,翻译太简单了)

    1. /* GPIO PULL-UP/PULL-DOWN*/  
    2. typedef enum {  
    3.     GPIO_PULL_UNSUPPORTED = -1,  
    4.     GPIO_PULL_DOWN  = 0,  
    5.     GPIO_PULL_UP    = 1,  
    6.   
    7.     GPIO_PULL_MAX,  
    8.     GPIO_PULL_DEFAULT = GPIO_PULL_DOWN  
    9. } GPIO_PULL;  
    6.GPIO_INVERSION

    The GPIO data could be inverted or non-inverted. Q2:inverted or non-inverted ?

    1. /* GPIO INVERSION */  
    2. typedef enum {  
    3.     GPIO_DATA_INV_UNSUPPORTED = -1,  
    4.     GPIO_DATA_UNINV = 0,  
    5.     GPIO_DATA_INV   = 1,  
    6.   
    7.     GPIO_DATA_INV_MAX,  
    8.     GPIO_DATA_INV_DEFAULT = GPIO_DATA_UNINV  
    9. } GPIO_INVERSION;  


    7.GPIO_OUT

    After one gpio pin is configured as output pin, the output value could be configured as high (one) or low (zero).

    1. /* GPIO OUTPUT */  
    2. typedef enum {  
    3.     GPIO_OUT_UNSUPPORTED = -1,  
    4.     GPIO_OUT_ZERO = 0,  
    5.     GPIO_OUT_ONE  = 1,  
    6.   
    7.     GPIO_OUT_MAX,  
    8.     GPIO_OUT_DEFAULT = GPIO_OUT_ZERO,  
    9.     GPIO_DATA_OUT_DEFAULT = GPIO_OUT_ZERO,  /*compatible with DCT*/  
    10. } GPIO_OUT;  

    8.GPIO_IN

    After one gpio pin is configured as input pin, the input value could be configured as high (one) or low (zero).

    1. /* GPIO INPUT */  
    2. typedef enum {  
    3.     GPIO_IN_UNSUPPORTED = -1,  
    4.     GPIO_IN_ZERO = 0,  
    5.     GPIO_IN_ONE  = 1,  
    6.   
    7.     GPIO_IN_MAX,  
    8. } GPIO_IN;  
    9.GPIO_CLKOUT

    There are seven clock output sources inside the chip.

    1. /*CLOCK OUT*/  
    2. typedef enum {  
    3.     CLK_OUT_UNSUPPORTED = -1,  
    4.     CLK_OUT0,  
    5.     CLK_OUT1,  
    6.     CLK_OUT2,  
    7.     CLK_OUT3,  
    8.     CLK_OUT4,  
    9.     CLK_OUT5,  
    10.     CLK_MAX   
    11. }GPIO_CLKOUT;  

    10.GPIO_CLKSRC

    Each clock output source could be configured as the following clock mode.

    1. typedef enum CLK_SRC  
    2. {  
    3.     CLK_SRC_UNSUPPORTED = -1,     
    4.     CLK_SRC_F32K    = 0x2,  
    5.     CLK_SRC_F26M    = 0x4,  
    6.     CLK_SRC_FAXI0   = 0x6,  
    7.     CLK_SRC_FAXI1   = 0x8,  
    8.     CLK_SRC_FAXI2,  
    9.     CLK_SRC_FAXI3,  
    10.     CLK_SRC_FAXI4,  
    11.     CLK_SRC_DPI_PIXELPLL,  
    12.     CLK_SRC_3GPLL_123M,  
    13.     CLK_SRC_FMM,  
    14.   
    15.     CLK_SRC_MAX  
    16. }GPIO_CLKSRC;  

    11.Error Code

    1. //  Error Code No.  
    2. #define RSUCCESS        0  
    3. #define ERACCESS        1  
    4. #define ERINVAL         2  
    5. #define ERWRAPPER       3  


    Q1:pull enable or pull disable?

    上拉电阻&下拉电阻

    下面是转载的~

    上拉电阻、下拉电阻的作用在于,当GPIO引脚处于第三态(既不是输出高电平,也不是输出低电平,而是呈高阻态,即相当于没接芯片)时,它的电平状态由上拉电阻、下拉电阻确定。


    上拉电阻:

    1、当TTL电路驱动COMS电路时,如果TTL电路输出的高电平低于COMS电路的最低高电平(一般为3.5V),这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。

    ***********************************************************************

    补充说明:

    一:TTL电路;

    TTL电路就是TTL电路中流过的电流,TTL是晶体管-晶体管逻辑电路(Transistor-Transistor Logic)的缩写。TTL电路是电流控制器件。

    1、标准输出的TTL电路:标准TTL电路为16mA;LS-TTL电路为8mA;S-TTL电路为20mA;ALS-TTL电路为8mA;AS-TTL电路为20mA; 
    2、大电流输出的TTL电路:标准TTL电路为48mA;LS-TTL电路为24mA;S-TTL电路为64mA;ALS-TTL电路为24/48mA;AS-TTL电路为48/64mA。 
    电平方面:
    逻辑电平最小输出高电平VOHmin:2.4V ,输出低电平VOLmax:0.4V。在室温下,一般输出高电平是3.5V 输出低电平是0.2V。最小输入高电平VIHmin:2.0V ,最大输入低电平VILmax:0.8V ;它的噪声容限是0.4V。)

    二:COMS电路;

    CMOS是: 金属-氧化物-半导体(Metal-Oxide-Semiconductor)结构的晶体管简称MOS晶体管,有P型MOS管和N型MOS管之分。由MOS管构成的集成电路称为MOS集成电路,而由PMOS管和NMOS管共同构成的互补型MOS集成电路 称为 CMOS-IC 。
    CMOS集成电路是由P沟道型和N沟道型MOS场效应管构成的互补电路形式。它具有工作电压范围宽,功耗低和噪声容限大等优异特性。
    CMOS电路大致可分为两大类型: 
    一是标准型4000/4500系列,在此系列中有A型和B型(后缀)之分;4000B/4500B互换性好,符合EIA和JEDEC标准。
    二是1986年出现的74HC系列,是用来置换相应的TTL74系列的产品。HC几乎实现了与TTL电路相同的工作速度,弥补了4000/4500系列工作速度慢的不足,HCT系列是最高速的产品。                 
    CMOS集成电路的性能特点:
    微功耗----CMOS电路的单门静态功耗在毫微瓦(nw)数量级。
    高噪声容限----CMOS电路的噪声容限一般在40%电源电压以上。
    宽工作电压范围----CMOS电路的电源电压一般为1.5~18伏。
    高逻辑摆幅----CMOS电路输出高、低电平的幅度达到全电为VDD,逻辑“0”为VSS。
    高输入阻抗----CMOS电路的输入阻抗大于108Ω,一般可达1010Ω。
    高扇出能力----CMOS电路的扇出能力大于50。
    低输入电容----CMOS电路的输入电容一般不大于5PF。
    宽工作温度范围----陶瓷封装的CMOS电路工作温度范围为- 55 0C ~ 125 0C;塑封的CMOS电路为 – 40 0C ~ 85 0C。

    *************************************************************************

    虽然看了上面的补充,我还是不是很懂~~


    2、OC门电路必须加上拉电阻,才能使用。

    ***********************************************************************

    OC门,又称集电极开路(漏极开路)与非门门电路,Open Collector(Open Drain)。为什么引入OC门?
    实际使用中,有时需要两个或两个以上与非门的输出端连接在同一条导线上,将这些与非门上的数据(状态电平)用同一条导线输送出去。

    因此,需要一种新的与非门电路--OC门来实现“线与逻辑”。
    OC门主要用于3个方面:
    1、
    实现与或非逻辑,用做电平转换,用做驱动器。由于OC门电路的输出管的集电极悬空,使用时需外接一个上拉电阻Rp到电源VCC。OC门使用上拉电阻以输出高电平,此外为了加大输出引脚的驱动能力,上拉电阻阻值的选择原则,从降低功耗及芯片的灌电流能力考虑应当足够大;从确保足够的驱动电流考虑应当足够小。 
    2、
    线与逻辑,即两个输出端(包括两个以上)直接互连就可以实现“AND”的逻辑功能。在总线传输等实际应用中需要多个门的输出端并联连接使用,而一般TTL门输出端并不能直接并接使用,否则这些门的输出管之间由于低阻抗形成很大的短路电流(灌电流),而烧坏器件。在硬件上,可用OC门或三态门(ST门)来实现。 用OC门实现线与,应同时在输出端口应加一个上拉电阻。
    3、
    三态门(ST门)主要用在应用于多个门输出共享数据总线,为避免多个门输出同时占用数据总线,这些门的使能信号(EN)中只允许有一个为有效电平(如高电平),由于三态门的输出是推拉式的低阻输出,且不需接上拉(负载)电阻,所以开关速度比OC门快,常用三态门作为输出缓冲器。

    ***********************************************************************


    3、为加大输出引脚的驱动能力,有的单片机管脚上也常使用上拉电阻。

    4、在COMS芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻产生降低输入阻抗,提供泄荷通路。

    5、芯片的管脚加上拉电阻来提高输出电平,从而提高芯片输入信号的噪声容限增强抗干扰能力。

    6、提高总线的抗电磁干扰能力。管脚悬空就比较容易接受外界的电磁干扰。

    7、长线传输中电阻不匹配容易引起反射波干扰,加上下拉电阻是电阻匹配,有效的抑制反射波干扰。

    上拉电阻阻值的选择原则包括:


    1、从节约功耗及芯片的灌电流能力考虑应当足够大;电阻大,电流小。
    2、从确保足够的驱动电流考虑应当足够小;电阻小,电流大。
    3、对于高速电路,过大的上拉电阻可能边沿变平缓。综合考虑
    以上三点,通常在1k到10k之间选取。对下拉电阻也有类似道理

    对上拉电阻和下拉电阻的选择应结合开关管特性和下级电路的输入特性进行设定,主要需要考虑以下几个因素:

    1. 驱动能力与功耗的平衡。以上拉电阻为例,一般地说,上拉电阻越小,驱动能力越强,但功耗越大,设计是应注意两者之间的均衡。
    2. 下级电路的驱动需求。同样以上拉电阻为例,当输出高电平时,开关管断开,上拉电阻应适当选择以能够向下级电路提供足够的电流。
    3. 高低电平的设定。不同电路的高低电平的门槛电平会有不同,电阻应适当设定以确保能输出正确的电平。以上拉电阻为例,当输出低电平时,开关管导通,上拉电阻和开关管导通电阻分压值应确保在零电平门槛之下。
    4. 频率特性。以上拉电阻为例,上拉电阻和开关管漏源级之间的电容和下级电路之间的输入电容会形成RC延迟,电阻越大,延迟越大。上拉电阻的设定应考虑电路在这方面的需求。
    下拉电阻的设定的原则和上拉电阻是一样的。
    OC门输出高电平时是一个高阻态,其上拉电流要由上拉电阻来提供,设输入端每端口不大于100uA,设输出口驱动电流约500uA,标准工作电压是5V,输入口的高低电平门限为0.8V(低于此值为低电平);2V(高电平门限值)。
    选上拉电阻时:
    500uA x 8.4K= 4.2即选大于8.4K时输出端能下拉至0.8V以下,此为最小阻值,再小就拉不下来了。如果输出口驱动电流较大,则阻值可减小,保证下拉时能低于0.8V即可。
    当输出高电平时,忽略管子的漏电流,两输入口需200uA
    200uA x15K=3V即上拉电阻压降为3V,输出口可达到2V,此阻值为最大阻值,再大就拉不到2V了。选10K可用。COMS门的可参考74HC系列

    设计时管子的漏电流不可忽略,IO口实际电流在不同电平下也是不同的,上述仅仅是原理,一句话概括为:输出高电平时要喂饱后面的输入口,输出低电平不要把输出口喂撑了(否则多余的电流喂给了级联的输入口,高于低电平门限值就不可靠了)   


    在数字电路中不用的输入脚都要接固定电平,通过1k电阻接高电平或接地。
    1. 电阻作用:
    l 接电组就是为了防止输入端悬空

    l 减弱外部电流对芯片产生的干扰
    l 保护cmos内的保护二极管,一般电流不大于10mA

    l 上拉和下拉、限流

    l 1. 改变电平的电位,常用在TTL-CMOS匹配
    2. 在引脚悬空时有确定的状态
    3.增加高电平输出时的驱动能力。
    4、为OC门提供电流
    l 那要看输出口驱动的是什么器件,如果该器件需要高电压的话,而输出口的输出电压又不够,就需要加上拉电阻。

    如果有上拉电阻那它的端口在默认值为高电平你要控制它必须用低电平才能控制如三态门电路三极管的集电极,或二极管正极去控制把上拉电阻的电流拉下来成为低电平。反之,
    l 尤其用在接口电路中,为了得到确定的电平,一般采用这种方法,以保证正确的电路状态,以免发生意外,比如,在电机控制中,逆变桥上下桥臂不能直通,如果它们都用同一个单片机来驱动,必须设置初始状态.防止直通!

    2、定义:
    l 上拉就是将不确定的信号通过一个电阻嵌位在高电平!电阻同时起限流作用!下拉同理!

    l 上拉是对器件注入电流,下拉是输出电流
    l 弱强只是上拉电阻的阻值不同,没有什么严格区分
    l 对于非集电极(或漏极)开路输出型电路(如普通门电路)提升电流和电压的能力是有限的,上拉电阻的功能主要是为集电极开路输出型电路输出电流通道。 

    3、为什么要使用拉电阻:
    l 一般作单键触发使用时,如果IC本身没有内接电阻,为了使单键维持在不被触发的状态或是触发后回到原状态,必须在IC外部另接一电阻。
    l 数字电路有三种状态:高电平、低电平、和高阻状态,有些应用场合不希望出现高阻状态,可以通过上拉电阻或下拉电阻的方式使处于稳定状态,具体视设计要求而定!
    l 一般说的是I/O端口,有的可以设置,有的不可以设置,有的是内置,有的是需要外接,I/O端口的输出类似与一个三极管的C,当C接通过一个电阻和电源连接在一起的时候,该电阻成为上C拉电阻,也就是说,如果该端口正常时为高电平,C通过一个电阻和地连接在一起的时候,该电阻称为下拉电阻,使该端口平时为低电平,作用吗:
    比如:当一个接有上拉电阻的端口设为输如状态时,他的常态就为高电平,用于检测低电平的输入。

    l 上拉电阻是用来解决总线驱动能力不足时提供电流的。一般说法是拉电流,下拉电阻是用来吸收电流的,也就是你同学说的灌电流。



    看了一大堆,

    总结了一下:

    上拉是一个电阻接到一个电压,其实就是增强了IO的驱动能力;

    下拉是一个电阻接到地,保证IO口是低电平;

  • 相关阅读:
    蚂蚁金服合作的RISE实验室到底有多牛?
    2016年全球IC设计大厂营收排名:高通稳居龙头
    2016年全球IC设计大厂营收排名:高通稳居龙头
    2016年全球IC设计大厂营收排名:高通稳居龙头
    2016年全球IC设计大厂营收排名:高通稳居龙头
    C++模板遇到iterator时候遇到的问题和解决方法
    C++模板遇到iterator时候遇到的问题和解决方法
    C++模板遇到iterator时候遇到的问题和解决方法
    $("div span")选取里的所有的元素
    ParseError: Unrecognised input. Possibly missing something
  • 原文地址:https://www.cnblogs.com/LoongEmbedded/p/5298351.html
Copyright © 2011-2022 走看看