linux GPIO讀取以及中斷註冊

2021-09-14 04:05:24 字數 3128 閱讀 7349

home→uart_ring→gpx1_1

back→sim_det→gpx1_2

switch3→ap_sleep→gpc0_3

switch4→xeint6→gpx0_6

步驟:申請gpio  gpio_request(exynos4_gpx1(1),"home");

設定模式,輸入模式  s3c_gpio_cfgpin(exynos4_gpx1(1),s3c_gpio_input);

設定上下拉,既不上拉也不下拉  s3c_gpio_setpull(exynos4_gpx1(1),s3c_gpio_pull_none);

讀取  gpio_get_value(exynos4_gpc0(3));

標頭檔案#include

#include

結合技術手冊查詢中斷號:

中斷註冊函式:

static inline int __must_check

request_irq(

unsigned int irq,

irq_handler_t handler,

unsigned long flags,

const char *name,

void *dev_id)

引數:

irq中斷號。(和平台架構相關,結合datasheet以及平台檔案) irq_eint(x)

中斷處理函式 中斷發生時,系統呼叫這個函式,dev_id引數將被傳遞給它

中斷標記  irq_type_edge_falling  上公升或下降中斷觸發

中斷名字

dev_id 一般使用裝置的裝置結構體或者null 

返回值:request_irq()返回0表示成功,返回-einval表示中斷號無效或處理函式指標為null,返回-ebusy表示中斷已經被占用,且不能被共享。

中斷解除安裝函式:

void free_irq(unsigned int irq, void *dev_id)
中斷服務函式:

irq_handler_t irq16_handler(int irq,void *dev_id)
驅動程式:

#include #include #include #include #include #include #include #include #include #include #include #include #include module_license("dual bsd/gpl");

module_author("sza");

static dev_t dev;

static int major_num;

static int minor_num;

#define chr_name "epic_chr"

#define cls_name "epic_cls"

#define dev_name "epic_dev"

static int gpios = ;

static irq_handler_t home_handler(int irq,void *dev_id)

static irq_handler_t back_handler(int irq,void *dev_id)

static int pocky330_open(struct inode *inode, struct file *file)

return 0;

}static int pocky330_release(struct inode *inode, struct file *file)

return 0;

}static long pocky330_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)

else if(cmd == 4)

else

return 0;

}static struct cdev my_cdev;

static struct file_operations my_fops = ;

static struct class *myclass;

static int pocky330_init(viod)

cdev_init(&my_cdev,&my_fops);

cdev_add(&my_cdev, dev, 1);

myclass = class_create(this_module,cls_name);

device_create(myclass,null,dev,null,dev_name);

gpio_request(gpios[4],"led");

s3c_gpio_cfgpin(gpios[4],s3c_gpio_output);

gpio_set_value(gpios[4],0);

request_irq(irq_eint(9),home_handler,irq_type_edge_falling,"home",null);

request_irq(irq_eint(10),back_handler,irq_type_edge_falling,"back",null);

return 0;

}static void pocky330_exit(void)

module_init(pocky330_init);

module_exit(pocky330_exit);

應用程式:

#include #include #include #include #include #include int main(void)

else

close(fd);

return 0;

}

Linux gpio 按鍵中斷學習

先說明一下按鍵與s3c2440晶元的連線方式 key1 eint8 gpg0 key2 eint11 gpg3 key3 eint13 gpg5 key4 eint14 gpg6 key5 eint15 gpg7 key6 eint19 gpg11 驅動程式原始碼如下 drivers char mi...

Linux GPIO中斷非同步通知

fasync機制是非同步通知機制,當驅動程式向應用程式傳送訊號量,觸發應用程式的訊號處理函式,以達到類似中斷的效果 驅動程式中 1 在檔案專屬的fasync函式中,呼叫了fasync helper,將屬主資訊通知給核心 2 當發生按鍵中斷,進入按鍵中斷服務程式,讀取鍵值,呼叫kill fasync,...

linux gpio子系統級聯中斷解析

linux 4.9 drivers pinctrl 中的gpio子系統中斷級聯解析 dts相關 中斷相關的device tree知識回顧 想要進行對映,首先要了解interrupt controller的拓撲結構。系統中的interrupt controller的拓撲結構以及其interrupt r...