日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GPIO及中断API函数

發布時間:2025/3/15 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GPIO及中断API函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

#include <linux/gpio.h>?//?標準?GPIO_API

???int gpio_request(unsigned gpio, const char *label);

????獲得并占有?GPIO port?的使用權,由參數?gpio?指定具體?port,非空的lables指針有助于診斷。主要是告訴內核這地址被占用了。當其它地方調用同一地址的gpio_request就會報告錯誤,該地址已被申請。在/proc/mem應該會有地址占用表描述

這種用法的保護作用前提是大家都遵守先申請再訪問,有一個地方沒遵守這個規則,這功能就失效了。好比進程互斥,必需大家在訪問臨界資源的時候都得先獲取鎖一樣,其中一個沒遵守約定,代碼就廢了。

例1:void gpio_free(unsigned gpio);//釋放?GPIO port?的使用權,由gpio?指定具體?port

2gpio_free(RK29_PIN0_PA0);//釋放GPIO0_A0

int gpio_direction_input(unsigned gpio);//返回0

3gpio_direction_input (RK29_PIN0_PA0);//GPIO0_A0設置為輸入

int gpio_direction_output(unsigned gpio, int value)//返回0

????????例4gpio_direction_output(RK29_PIN0_PA0,GPIO_LOW);//GPIO0_A0設置為輸出口,且其電平拉低。????int gpio_get_value(unsigned gpio);//返回value

????????例5ret = gpio_get_value (RK29_PIN0_PA0);//?讀取GPIO0_A0的電平,并賦值給變量ret

void gpio_set_value(unsigned gpio, int value);

6gpio_set_value (RK29_PIN0_PA0, GPIO_HIGH);//?設置RK29_PIN0_PA0電平為高。

????????int gpio_pull_updown(unsigned gpio,unsigned value);

????????value = 0, normal

????????value = 1, pull up

????????value = 2, pull down

????????例7:gpio_pull_updown(RK29_PIN0_PA0,1)上拉

???????int gpio_cansleep(unsigned gpio);

支持這種gpio的平臺為了通過在這個函數中返回非零來區分其它類型的gpio(需要一個已經被??gpio_request申請的gpio號)為了訪問這些端口,定義了另一組函數接口:

???????int gpio_get_value_cansleep(unsigned gpio);

???????void gpio_set_value_cansleep(unsigned gpio, int value);

????????只能在允許睡眠的上下文中訪問這些端口,比如線程化的中斷中,

???????static inline int gpio_is_valid(int number)//判斷GPIO是否有效,有效返回0

???????int gpio_export(unsigned gpio, bool direction_may_change);//返回0成功

???????void gpio_unexport();??//返回0成功

???????int gpio_export_link(struct device *dev, const char *name, unsigned gpio)?

//創建到導出GPIO的 sysfs link??,第一個參數是在哪個dev下創建,第二個是參數名字,第三個是gpio編號?

?

中斷部分的API:

??static inline int gpio_to_irq(unsigned gpio)

????例8gpioToIrq = gpio_to_irq (RK29_PIN0_PA0);//?把GPIO0_A0PIN值轉換為相應的IRQ值,并賦值給變量gpioToIrq

???gpio_to_irq()返回的中斷編號可以傳給request_irq()和free_irq()。

???irq_to_gpio()返回的gpio編號通常用來調用gpio_get_value(),比如在沿觸發的中斷中獲取引腳的狀態。有些平臺不支持這種映射,應該避免調用映射函數

???static inline int __must_check request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev);

范例:irq是要申請的硬件中斷號;?handler是向系統登記的中斷處理函數,是一個回調函數,中斷發生時,系統調用這個函數,dev參數將被傳遞;?flags是中斷處理的屬性,若設置SA_INTERRUPT,標明中斷處理程序是快速處理程序,快速處理程序被調用時屏蔽所有中斷,慢速處理程序不屏蔽;若設置SA_SHIRQ,則多個設備共享中斷,*dev在中斷共享時會用到,一般設置為這個設備的device結構本身或者NULL。?flags發生時,觸發中斷。

???????例9static irqreturn_t PA0IntHandler(int irq, void *dev_id)

{

????????printk(KERN_INFO "PA0IntHandler:irq=%d ",irq);

????return IRQ_HANDLED;

}

void main(void)

{

//?GPIO0_A0PIN值轉換為相應的IRQ值,并賦值給變量gpioToIrq

unsigned long req_flags = IRQF_TRIGGER_RISING;

int gpioToIrq = gpio_to_irq (RK29_PIN0_PA0);

If(gpioToIrq != -1){

//注冊PA0IntHandler中斷處理函數,中斷號是RK29_PIN0_PA0,設置為上升沿觸發

????request_irq(gpioToIrq, PA0IntHandler,req_flags, "PA0_test", NULL);

????}

}

??????void free_irq(unsigned int irq, void *dev_id)//釋放中斷

irq:?釋放的中斷號???dev_id:?釋放的dev_id

10:?free_irq(gpio_to_irq(RK29_PIN0_PA0),NULL);//?釋放GPIO0_A0中斷。

?????int set_irq_type(unsigned int irq, unsigned int type)

irq:?指定的中斷號type???:?設置的中斷類型

11set_irq_type(gpio_to_irq(RK2818_PIN_PA0),IRQF_TRIGGER_LOW);//設置GPIO0_A0中斷為低電平觸發

??????void disable_irq_nosync(unsigned int irq)

強行關閉指定中斷,不會等待當前中斷處理程序執行完畢。,立即返回

12disable_irq_nosync(gpio_to_irq(RK29_PIN0_PA0));//關閉GPIO0_A0中斷。

??????void disable_irq(unsigned int irq)

將關閉硬件中斷并等待(可能有的)中斷處理完成才返回。

13disable_irq (gpio_to_irq(RK29_PIN0_PA0));//關閉GPIO0_A0中斷。

??????void enable_irq(unsigned int irq)

使能一個指定的中斷

14:?enable_irq (gpio_to_irq(RK29_PIN0_PA0));//使能GPIO0_A0中斷。

注意:使能IRQ和不使能IRQ應該配對使用。

????若調用enable_irq之前,并未關閉指定中斷(如調用disable_irq_nosync?關閉指定中斷),

????則調用enable_irq會報警告(WARNING: at kernel/irq/manage.c:274 enable_irq+0x48/0x68()Unbalanced enable for IRQ 58),此為正常現象。

?????int enable_irq_wake(unsigned int irq)//返回0成功

?????int disable_irq_wake(unsigned int irq)//返回0成功

???要enable和disable的次數相同

例15:static inline int enable_irq_wake(unsigned int irq)

{return set_irq_wake(irq, 1);

}

static inline int disable_irq_wake(unsigned int irq)

{

return set_irq_wake(irq, 0);

}

??void rk29_gpio_suspend(void)//?GPIO進入省電睡眠模式

調用此函數,是否會讓GPIO進入省電睡眠模式,與enable_irq_wakedisable_irq_wake函數相關,

16:如果先調用了enable_irq_wake(gpio_to_irq(RK29_PIN0_PA0)),則即使調用了

??void rk29_gpio_resume(void)//喚醒GPIO


轉自:?http://blog.sina.com.cn/s/blog_a6559d9201015vx9.html

總結

以上是生活随笔為你收集整理的GPIO及中断API函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。