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口是低電平;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM