按鍵中斷的platform bus裝置和驅動 收藏

2021-06-16 05:41:09 字數 2935 閱讀 1071

platform_device

#include

#include

#include

#include

//中斷

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

module_author("ecjtu cert xiesiyuan");

module_license("gpl");

//適用於平台裝置的按鍵裝置資源

struct resource button_res=,

[1]=,

[2]=,

[3]=,

[4]=, 

[5]=,  

};//struct platform_device *button;

struct platform_device button =

else

printk(kern_info"button device has hanged on the platform bus!/n");

return ret;

}static void __exit button_exit(void)

module_init(button_init);

module_exit(button_exit);

platform_driver

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

bool en_button=0;

static declare_wait_queue_head(button_waitq);  //申明乙個等待佇列

static char data_old[6]=;

struct button_irq_desc ;

static struct button_irq_desc button_irq=,,,

,,,};

static irqreturn_t button_irq_func(int irq,void *dev)

return irq_retval(irq_handled);

}static int btn_open(struct inode *inode,struct file *filp)

return -1;}}

en_button=1;

return 0;

}static int btn_read(struct file *filp,char __user *buf,size_t len,loff_t *offp)

//.阻塞程序

wait_event_interruptible(button_waitq,en_button);

}en_button=0;

ret=copy_to_user(buf,(void *)data_old,(len>sizeof(data_old))?sizeof(data_old):len);

if(ret!=0)

printk(kern_info"read len = %d!/n",(len>sizeof(data_old))?sizeof(data_old):len);

return (len>sizeof(data_old))?sizeof(data_old):len;

}static int btn_close(struct inode *inode,struct file *filp)

printk(kern_info"xsy-plat-buttons released!/n");

return 0;

}static unsigned int btn_poll(struct file *filp,struct poll_table_struct *wait)

static struct file_operations button_fops=;

//為按鍵申請混雜裝置

static struct miscdevice button_misc=;

static int __devinit btn_probe(struct platform_device *pdev)

printk("button_irq[%d] is %d/n",i,button_irq[i].irq);

}//註冊misc裝置,只有在發現裝置和驅動匹配時候才建立misc裝置,

ret=misc_register(&button_misc);   

return ret;

}static int __devexit btn_remove(struct platform_device *dev)

static struct platform_driver button=,

};static int __init button_init(void)

static void __exit button_exit(void)

module_init(button_init);

module_exit(button_exit);

module_author("ecjtu cert xiesiyuan");

module_license("gpl");

中斷掃瞄按鍵

之前都是使用軟掃瞄,參考 int button scan else 缺點是必須放到主函式的while 1 迴圈,如果while 1 中其他功能占用大量時間,就無法實現按鍵的連續掃瞄。但是如果採用中斷方式,當按鈕連線的pin來乙個上公升沿或下降沿,就會中斷主程序去執行中斷函式,從而實現連續掃瞄。1.f...

中斷 按鍵中斷驅動程式

中斷處理 1 外設的處理速度一般慢於 cpu。2 cpu不能一直等待外部事件,所以裝置必須有一種方法來通知 cpu它的工作進度,這個方法就是中斷,外設與 cpu資訊互動的機制,提高 cpu利用率。處理之外還有查詢,但是查詢會一直占有 cpu資源,導致 cpu低利用率,好處是實現簡單。linux系統中...

樹莓派的按鍵中斷

一 實驗現象 程式實現在樹莓派上通過中斷的方式檢測按鍵是否按下,如果按鍵按下的話,會列印出按鍵按下的提示資訊 二 操作步驟 1,初始化wiringpi庫 2,設定按鍵引腳為輸入模式 3,設定引腳為上拉模式 即 當按鍵沒有被按下時,該輸入腳為高電平 4,註冊中斷程式,並且設定中斷的觸發方式 5,判斷中...