s3c6410的
gpio
引腳相對來說比較多,而且大部分引腳都具有多重複用功能,如何在
linux
上用最簡單的方式來控制
gpio
這需要我們好好研究一下底層的**了,其實方法有很多種,鑑於在作業系統端控制
gpio
並不像控制傳統的微控制器那樣。
這裡我將提及一種方法來講述,這種方法也是我至今看到最簡單的方法
首先我們開啟linux-3.0.1\arch\arm\plat-samsung\include\plat
下gpio-cfg.h
這個標頭檔案,仔細瀏覽後發現,我們可以使用的函式:
1.設定單一io口
int s3c_gpio_cfgpin(unsigned int pin, unsigned int to);
裡面有兩個引數,第乙個pin是選擇哪個引腳,第二個引數有三種定義
設定成輸出模式 #define s3c_gpio_input (s3c_gpio_special(0))
設定成輸入模式 #define s3c_gpio_output (s3c_gpio_special(1))
復用功能選擇 #define s3c_gpio_sfn(x) (s3c_gpio_special(x))
其實根據我使用的情況來說第1,2兩個定義根本就是雞肋,只有第3個s3c_gpio_sfn(x)才是最有用的,舉個例子:
ok6410的開發板的ds18b20的介面,器件被接在gpe0上,而gpe有如下復用功能
其中的引數x就是對應上表的復用功能,當
x=0時是輸入功能,
x=1時是輸出功能
......
下面我想不用我說大家也明白了吧。
這個例子s3c_gpio_cfgpin(s3c64xx_gpe(0), s3c_gpio_sfn(1));
說明gpe0
口配置為輸出模式。
1.獲取io
口的配置
unsigned s3c_gpio_getcfg(unsigned int pin);這個函式跟上面講到的剛好相反,是讀取當前乙個io口的配置,
pin引數是要獲得的引腳配置,函式會返回乙個相應的值
2.設定一組io
int s3c_gpio_cfgpin_range(unsigned int start, unsigned int nr, unsigned int cfg);
第乙個引數start是開始的引腳,第二個nr是從
start
開始到第乙個,注意配置的
io必須是同一組的
io,第三個
cfg是配置狀態
3.設定單一io
的上拉電阻
int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull);
設定單個io為不同的上拉模式,模式分別為
s3c_gpio_pull_none
s3c_gpio_pull_down
s3c_gpio_pull_up
5.獲取io
口的上拉電阻配置
s3c_gpio_pull_t s3c_gpio_getpull(unsigned int pin);
獲取單個io的上拉配置狀態,會返回乙個配置模式
6.設定一組io(
包括上拉電阻)
int s3c_gpio_cfgall_range(unsigned int start, unsigned int nr, unsigned int cfg, s3c_gpio_pull_t pull);
講了這麼多看到最後乙個函式不講也應該能看出到底是如何配置了吧
講了這麼多io口的配置方法,來看看如何來配置輸出的電平狀態。
開啟linux-3.0.1\include\linux
下的gpio.h
的標頭檔案,發現裡面有好多的引腳函式其中最重要的也就這麼幾句
1.設定乙個引腳的電平狀態
static inline void gpio_set_value(unsigned gpio, int value)
第乙個引數gpio為指定的引腳,第二個引數value為要設定的高低電平
2.獲得乙個引腳的電平狀態
static inline int gpio_get_value(unsigned gpio)
第乙個引數為gpio為指定的引腳,會返回乙個電平狀態
講了上面這些我們基本能控制乙個io了,現在我在介紹一種方法,這種方法只能進行輸入和輸出不能進行io的復用配置
1.io輸出
static inline int gpio_direction_output(unsigned gpio, int value)
第乙個引數gpio為指定的引腳,第二個引數為電平狀態
2.io輸入
static inline int gpio_direction_input(unsigned gpio)
第乙個引數gpio為指定的引腳,會返回乙個電平狀態
出了上面方法外我們還可以直接對gpio的位址訪問,linux已經為我們準備了這樣的介面函式
#define __raw_readl(a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a))
#define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a) = (v))
其中的a值為
s3c64xx_gpmcon
s3c64xx_gpmpud
s3c64xx_gpmdat
在reg-gpio.h中已經有了以上的定義
v為具體的數值。
linux之GPIO的使用
smdkc110的 gpio 引腳相對來說比較多,而且大部分引腳都具有多重複用功能,如何在 linux 上用最簡單的方式來控制 gpio 這需要我們好好研究一下底層的 了,其實方法有很多種,鑑於在作業系統端控制 gpio 並不像控制傳統的微控制器那樣。這裡我將提及一種方法來講述,這種方法也是我至今看...
linux之GPIO的使用
smdkc110的 gpio 引腳相對來說比較多,而且大部分引腳都具有多重複用功能,如何在 linux 上用最簡單的方式來控制 gpio 這需要我們好好研究一下底層的 了,其實方法有很多種,鑑於在作業系統端控制 gpio 並不像控制傳統的微控制器那樣。這裡我將提及一種方法來講述,這種方法也是我至今看...
Linux核心驅動之gpio子系統的使用
linux 核心中gpio 是最簡單,最常用的資源 和 interrupt dma,timer一樣 驅動程式,應用程式都能夠通過相應的介面使用 gpio gpio使用0 max int 之間的整數標識,不能使用負數 gpio 與硬體體系密切相關的,不過 linux 有乙個框架處理 gpio 能夠使用...