linux系統gpio中斷的實現(提供例程)

2021-09-29 01:45:33 字數 2839 閱讀 1200

該介面基於linux提供的通用中斷api介面實現。

3.下面是驅動以及應用層的**:

driver.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ******_major 200

static

struct class *my_class;

int major;

static

struct fasync_struct *fasync_queue;

//非同步通知佇列

/*關鍵點!!!*/

#define gpio_num gpio_to_pin(3,5)

//假設中斷引腳為:gpio3_5

static

unsigned

int irq_num;

/* 開啟 */

int******_open

(struct inode *inode,

struct file *filp)

/* 關閉 */

int******_release

(struct inode *inode,

struct file *filp)

/*簡介:系統呼叫,應用層的read()將會呼叫該函式

count:傳輸資料長度

f_pos:偏移量

*/ssize_t ******_read

(struct file *filp,

char __user *buf,size_t count,loff_t *f_pos)

/*簡介:系統呼叫,應用層的write()將會呼叫該函式

count:傳輸資料長度

f_pos:偏移量

*/ ssize_t ******_write

(struct file *file,

const

char __user *buf,size_t count,loff_t *f_pos)

/*fasync方法的實現*/

static

intmy_fasync

(int fd,

struct file * filp,

int on)

/* 裝置驅動操作結構體,該結構體的每乙個成員的名字都對應著乙個系統呼叫 */

static

const

struct file_operations ******_fops=

;/* 在中斷服務函式中向應用層傳送訊息-非同步通知! */

void irq_callback (

unsigned

long date)

}/* 載入 */

int******_init_module

(void

)/* 自動建立裝置節點 */

my_class =

class_create

(this_module,

"my_class");

device_create

(my_class,

null

,mkdev

(major,0)

,null

,"my_device");

/*gpio申請*/

rtn =

gpio_request

(gpio_num,

"my_irq");

if(rtn!=0)

/*獲取gpio中斷號*/

irq_num =

gpio_to_irq

(gpio_num)

;/*gpio中斷服務函式註冊,*/

/*上公升沿觸發*/

rtn =

request_irq

(irq_num, irq_callback,irqf_trigger_falling,

"my_irq"

,null);

if(rtn<0)

else

printk

("module_init sucessful!!!\n");

return0;

}/* 解除安裝 */

void

******_cleanup_module

(void

)/* 巨集實現 */

module_init

(******_init_module)

;module_exit

(******_cleanup_module)

;/* 開源許可宣告 */

module_license

("dual bsd/gpl"

);

#include

#include

#include

#include

#include

#include

static

int fd;

/* 核心產生非同步通知,呼叫該應用層函式處理 */

void

sigterm_handler

(int signo)

intmain

(void

)close

(fd)

;return0;

}

Linux下ZYNQ中GPIO中斷號獲取

使用提供的gpio to irq是最佳的選擇,裝置樹配置起來也比較方便,都不需要將中斷父結點設定為gpio0。key 驅動程式申請一下對映後的終端號key test.irq int key test.irq gpio to irq key test.key gpio 使用key test.irq就可...

Linux中斷子系統

linux kernel的中斷子系統之 一 一 前言 乙個合格的linux驅動工程師需要對kernel中的中斷子系統有深刻的理解,只有這樣,在寫具體driver的時候才能 1 正確的使用linux kernel提供的的api,例如最著名的request threaded irq request ir...

linux中斷子系統

參考引用 wowotech 乙個很好的linux技術部落格。一 概述 目的kernel管理硬體裝置的方式 輪詢 中斷。中斷效率高且反應快於輪詢,因為它利用了硬體本身執行指令前會做的 中斷電訊號週期輪詢 分類中斷分為同步 synchronous 和非同步 asynchronous 同步也稱為異常,由c...