當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > Linux學(xué)習(xí) > linux入門 > 嵌入式linux下GPIO驅(qū)動(dòng)程序操作方法(還有實(shí)例)
嵌入式linux下GPIO驅(qū)動(dòng)程序,這是在嵌入式設(shè)備中最基本的操作,也是菜鳥進(jìn)階必經(jīng)之路,,今天我們就用各個(gè)實(shí)例來讓你深刻的了解GPIO驅(qū)動(dòng)程序,這都是我自己親手做過的,可以慢慢來理解。
首先我們?cè)诳打?qū)動(dòng)程序的代碼之前,先要知道庫(kù)函數(shù):
內(nèi)核GPIO庫(kù)函數(shù):
int gpio_request(unsigned gpio,const char *label)//申請(qǐng)GPIO資源
參數(shù)gpio表示GPIO所對(duì)應(yīng)的編號(hào),由于在平臺(tái)代碼中,已經(jīng)將CPU所有的GPIO進(jìn)行統(tǒng)一的規(guī)劃和編號(hào)
參數(shù)*label表示標(biāo)簽
因?yàn)間pio在內(nèi)核中,就和內(nèi)存一樣,所以你需要的就是申請(qǐng)
當(dāng)返回的值小于0的話,那么就表示失敗,如果大于0那就表示功能
gpio_direction_output(unsigned gpio,int value)//配置GPIO為輸出口,并輸出value(0,1)
gpio_direction_input(unsigned gpio)//配置為輸入口
gpio_set_value(unsigned gpio,int value);
//將GPIO寄存器設(shè)置為0或1,該函數(shù)并不設(shè)置GPIO為輸出,只是把相應(yīng)的寄存器設(shè)置為0
gpio_get_value(unsigned gpio);//同理,設(shè)置為輸入
gpio_free(unsigned gpio);//釋放GPIO資源
以上函數(shù)返回值表示GPIO的狀態(tài)
上面這些就是GPIO驅(qū)動(dòng)程序的基本概念理解,你必須要了解,才能進(jìn)行接下來的操作,接下來就是GPIO驅(qū)動(dòng)程序的操作,我們就來通過一個(gè)蜂鳴器的例子,來讓你對(duì)GPIO驅(qū)動(dòng)程序的操作有深刻理解,蜂鳴器的例子是這樣的:要求驅(qū)動(dòng)加載的時(shí)候,打開蜂鳴器,卸載驅(qū)動(dòng)時(shí),關(guān)閉蜂鳴器,下面就來解答。
#include
#include
#include
#include
#define LED_ON 1//宏定義一下,為了美觀
#define LED_OFF 0
//定義硬件GPIO結(jié)構(gòu)體
struct led_resource{
unsigned long gpio;//gpio的編號(hào),每個(gè)GPIO都有一個(gè)內(nèi)核分配的唯一編號(hào)
char *name; //gpio的標(biāo)簽
};
static struct led_resource led_info[]={
[0] = {
.gpio = S5PV210_GPD0(0),//管腳信息
.name = "GPC0_0"//管腳名稱
},
};
static void led_control(unsigned long gpio,int flags)
{
gpio_direction_output(gpio,0);//這句表示先把當(dāng)前GPIO口設(shè)置為輸出口,并且輸出0
gpio_set_value(gpio,flags);//然后在輸出想要設(shè)置的電平,前面先設(shè)置0是為了防止干擾
}
static int led_init(void)
{
gpio_request(led_inf0[0].gpio,led_inf[0].name);//申請(qǐng)GPIO資源
led_control(led_inf0[i].gpio,LED_ON);//調(diào)用函數(shù)來設(shè)置輸出口為1
return 0;
}
static void led_exit(void)
{
led_control(led_inf0[0].gpio,LED_OFF);//調(diào)用函數(shù)輸出0關(guān)閉蜂鳴器
gpio_free(led_inf0[0].gpio);//釋放GPIO資源
}
module_init(led_init);//注冊(cè)入口函數(shù)
module_exit(led_exit);//注冊(cè)出口函數(shù)
MODULE_LICENSE("GPL V2");//聲明該程序符合國(guó)際GPL委員會(huì)制定的標(biāo)準(zhǔn)
切記:在加載的時(shí)候,內(nèi)核會(huì)有調(diào)用入口函數(shù),他就會(huì)執(zhí)行入口函數(shù)的命令,燈就會(huì)亮,蜂鳴器就會(huì)叫,一但卸載驅(qū)動(dòng)程序的時(shí)候,內(nèi)核就會(huì)自動(dòng)調(diào)用出口函數(shù),當(dāng)然也會(huì)執(zhí)行出口函數(shù)的內(nèi)容。寫好程序后,把代碼寫成.C文件然后放在linux內(nèi)核源代碼字符設(shè)備驅(qū)動(dòng)所在的文件夾下,然后用當(dāng)前目錄的makefile編譯一下,然后把編譯好的驅(qū)動(dòng)程序通過tftp或其他方式傳到開發(fā)板的文件系統(tǒng)的任意一個(gè)文件夾。然后用命令加載這個(gè)驅(qū)動(dòng)程序或者卸載
這樣你就看到現(xiàn)象了,是不是不是那么難,不管是什么樣的例子,你只要掌握GPIO驅(qū)動(dòng)程序操作方法,那你就都可以迎刃而解了,想要了解更多GPIO驅(qū)動(dòng)程序操作方法,你可以參考Linux內(nèi)核驅(qū)動(dòng)之gpio子系統(tǒng)的使用