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,判斷中...