 嵌入式linux下(xia)GPIO驅動程(cheng)序操作方法(還有實例)
							時間:2018-08-10      來源:未知
							嵌入式linux下(xia)GPIO驅動程(cheng)序操作方法(還有實例)
							時間:2018-08-10      來源:未知 
							嵌(qian)入(ru)式linux下GPIO驅動(dong)程(cheng)序,這(zhe)是(shi)在(zai)嵌(qian)入(ru)式設備中(zhong)最基本的操作,也是(shi)菜(cai)鳥進階必經之路,,今(jin)天(tian)我們就用各(ge)個(ge)實例來(lai)讓你深(shen)刻的了解GPIO驅動(dong)程(cheng)序,這(zhe)都(dou)是(shi)我自己親(qin)手做過的,可以(yi)慢慢來(lai)理解。
首先我們(men)在看驅動(dong)程序的代碼之前(qian),先要知道庫(ku)函數:
內核GPIO庫函(han)數(shu):
int gpio_request(unsigned gpio,const char *label)//申(shen)請GPIO資源(yuan)
參數gpio表示GPIO所對應的編號,由于(yu)在(zai)平臺代碼中(zhong),已經將CPU所有的GPIO進行(xing)統一的規劃和編號
參數(shu)*label表示標簽
因為gpio在內(nei)核中,就和內(nei)存一(yi)樣,所(suo)以(yi)你(ni)需要(yao)的就是申(shen)請
當返回的值小(xiao)于(yu)(yu)0的話,那么(me)就表(biao)示失敗,如(ru)果大于(yu)(yu)0那就表(biao)示功能
gpio_direction_output(unsigned gpio,int value)//配置GPIO為輸出口,并輸出value(0,1)
gpio_direction_input(unsigned gpio)//配(pei)置(zhi)為(wei)輸入口
gpio_set_value(unsigned gpio,int value);
//將GPIO寄存(cun)器(qi)設(she)置為0或1,該函數并不設(she)置GPIO為輸出,只是把相應的寄存(cun)器(qi)設(she)置為0
gpio_get_value(unsigned gpio);//同理,設置為輸入
gpio_free(unsigned gpio);//釋放GPIO資源
以上函數返回值表示GPIO的狀態
上(shang)面這些就(jiu)是(shi)GPIO驅動(dong)(dong)程序的(de)(de)基本概(gai)念理(li)解(jie),你必須要了解(jie),才能(neng)進行接(jie)(jie)下(xia)來(lai)(lai)(lai)的(de)(de)操(cao)作(zuo),接(jie)(jie)下(xia)來(lai)(lai)(lai)就(jiu)是(shi)GPIO驅動(dong)(dong)程序的(de)(de)操(cao)作(zuo),我們就(jiu)來(lai)(lai)(lai)通過一(yi)個蜂鳴器的(de)(de)例子,來(lai)(lai)(lai)讓你對GPIO驅動(dong)(dong)程序的(de)(de)操(cao)作(zuo)有深(shen)刻理(li)解(jie),蜂鳴器的(de)(de)例子是(shi)這樣的(de)(de):要求驅動(dong)(dong)加載(zai)(zai)的(de)(de)時候,打開蜂鳴器,卸載(zai)(zai)驅動(dong)(dong)時,關閉(bi)蜂鳴器,下(xia)面就(jiu)來(lai)(lai)(lai)解(jie)答。
#include
#include
#include
#include
#define LED_ON 1//宏(hong)定(ding)義一下(xia),為(wei)了美觀
#define LED_OFF 0
//定義硬件GPIO結構體
struct led_resource{
unsigned long gpio;//gpio的(de)(de)編號,每個GPIO都有一個內核分配的(de)(de)唯一編號
char *name; //gpio的標簽(qian)
};
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);//這句表示先(xian)把當前GPIO口設置為(wei)輸出口,并且輸出0
gpio_set_value(gpio,flags);//然后在輸(shu)出想要(yao)設置的電平,前面先設置0是為了防止干擾
}
static int led_init(void)
{
gpio_request(led_inf0[0].gpio,led_inf[0].name);//申請GPIO資源
led_control(led_inf0[i].gpio,LED_ON);//調(diao)用(yong)函數(shu)來設置輸出口為1
return 0;
}
static void led_exit(void)
{
led_control(led_inf0[0].gpio,LED_OFF);//調(diao)用函數輸出0關(guan)閉(bi)蜂(feng)鳴器
gpio_free(led_inf0[0].gpio);//釋放(fang)GPIO資源(yuan)
}
module_init(led_init);//注(zhu)冊入(ru)口函(han)數
module_exit(led_exit);//注(zhu)冊出口函數
MODULE_LICENSE("GPL V2");//聲明該程序符合國際(ji)GPL委員會制定的標(biao)準(zhun)
切記:在加載(zai)(zai)的時候,內核(he)會(hui)(hui)有調用(yong)入口(kou)(kou)函(han)(han)數(shu)(shu),他(ta)就會(hui)(hui)執行入口(kou)(kou)函(han)(han)數(shu)(shu)的命(ming)令,燈就會(hui)(hui)亮(liang),蜂鳴器就會(hui)(hui)叫,一但(dan)卸(xie)載(zai)(zai)驅(qu)(qu)動(dong)(dong)程(cheng)(cheng)(cheng)序(xu)的時候,內核(he)就會(hui)(hui)自動(dong)(dong)調用(yong)出(chu)口(kou)(kou)函(han)(han)數(shu)(shu),當然(ran)也會(hui)(hui)執行出(chu)口(kou)(kou)函(han)(han)數(shu)(shu)的內容。寫(xie)好程(cheng)(cheng)(cheng)序(xu)后(hou),把代(dai)碼寫(xie)成.C文件(jian)然(ran)后(hou)放(fang)在linux內核(he)源代(dai)碼字符設備(bei)驅(qu)(qu)動(dong)(dong)所(suo)在的文件(jian)夾(jia)(jia)下,然(ran)后(hou)用(yong)當前目錄的makefile編(bian)譯一下,然(ran)后(hou)把編(bian)譯好的驅(qu)(qu)動(dong)(dong)程(cheng)(cheng)(cheng)序(xu)通過(guo)tftp或其他(ta)方式傳到開發板的文件(jian)系(xi)統的任(ren)意一個(ge)文件(jian)夾(jia)(jia)。然(ran)后(hou)用(yong)命(ming)令加載(zai)(zai)這個(ge)驅(qu)(qu)動(dong)(dong)程(cheng)(cheng)(cheng)序(xu)或者卸(xie)載(zai)(zai)
這樣你就看到現象了,是不是不是那么難,不管是什么樣的例子,你只要掌握GPIO驅動程序操作方法,那你就都可以迎刃而解了,想要了解更多GPIO驅動程序操作方法,你可以參考Linux內核驅(qu)動之gpio子系統的(de)使用(yong)

