龙芯2k按键中断驱动_外部中断按键驱动
我的開(kāi)發(fā)板上一共有四個(gè)按鍵,分別影射到GPF0、GPF2、GPG3、GPG11,當(dāng)按下按鍵時(shí)分別產(chǎn)生0、2、11、19號(hào)外部中斷。由于沒(méi)有安裝驅(qū)動(dòng),當(dāng)按下按鍵時(shí),沒(méi)有任何反應(yīng)。所以需要編寫一個(gè)驅(qū)動(dòng),將四個(gè)按鍵驅(qū)動(dòng)起來(lái)。
下面是我寫的按鍵驅(qū)動(dòng)的小例子,功能很簡(jiǎn)單,當(dāng)按下按鍵時(shí)打印出“key n(n = 1~4) is pressed!”的消息。
/********************************************************************
'?創(chuàng)建日期:?2006/05/04
'?文件名稱: ?keyboard_demo.c
'?文件作者:?Gene.Shao (E-Mail To: sjiang1981@163.com)
'
'?文件功能:?按鍵驅(qū)動(dòng)
' 文件描述: 開(kāi)發(fā)板上一共有四個(gè)按鍵,分別影射到GPF0、GPF2、GPG3、GPG11,
當(dāng)按下按鍵時(shí)分別產(chǎn)生0、2、11、19號(hào)外部中斷。這個(gè)驅(qū)動(dòng)十分簡(jiǎn)
單,它僅僅是在按下了按鍵后打印出一串消息。如果希望按下按鍵
后做一些更有意義的事,需要改寫中斷處理程序key_irq。
*********************************************************************/
#i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude
/*
總共4個(gè)按鍵,當(dāng)按下按鍵時(shí),分別產(chǎn)生0,2,11,19號(hào)中斷。
IRQ_EINTx在../include/asm-arm/arch-s3c2410/irqs.h中定義。
GPIO_xx在../include/asm-arm/arch-s3c2410/S3C2410.h中定義。
*/
static struct key_info {
int irq_no;
unsigned int gpio_port;
int key_value;
} key_info_tab[4] = {
{ IRQ_EINT0, GPIO_F0, 1},???//第一個(gè)按鍵
{ IRQ_EINT2, GPIO_F2, 2},???//第二個(gè)按鍵
{ IRQ_EINT11, GPIO_G3, 3},??//第三個(gè)按鍵
{ IRQ_EINT19, GPIO_G11, 4},??//第四個(gè)按鍵
};
//中斷處理程序
static void key_irq(int irq, void *dev_id, struct pt_regs *reg)
{
struct key_info *k;
int i;
//掃描按鍵表,根據(jù)中斷號(hào),找出所按下的按鍵。
for (i = 0; i < sizeof key_info_tab / sizeof key_info_tab[1]; i++) {
k = key_info_tab + i;
if (k->irq_no == irq) {
printk("key %d is pressed!\n", k->key_value);
break;
}
}
return;
}
//初始化
static int __init keyboard_init(void)
{
struct key_info *k;
int i;
for (i = 0; i < sizeof key_info_tab / sizeof key_info_tab[1]; i++) {
k = key_info_tab + i;
//設(shè)置與外部中斷號(hào)相對(duì)應(yīng)的GPIO端口,上升沿和下降沿各產(chǎn)生一個(gè)中斷,禁用pull-up.
//set_external_irq是在../kernel/arch/arm/mach-s3c2410/iqr.c中定義的。
set_external_irq(k->irq_no, EXT_FALLING_EDGE, GPIO_PULLUP_DIS);
// 請(qǐng)求中斷,所有的按鍵都使用同一個(gè)中斷處理程序。中斷處理程序根據(jù)中斷號(hào)確定按下的是哪一個(gè)按鍵。
if (request_irq(k->irq_no, &key_irq, SA_INTERRUPT, "keyboard_demo", NULL)) {
printk("request irq failed!\n");
return -1;
}
}
return 0;
}
//退出
static void __exit keyboard_exit(void)
{
struct key_info *k;
int i;
//釋放中斷號(hào)
for (i = 0; i < sizeof key_info_tab / sizeof key_info_tab[1]; i++) {
k = key_info_tab + i;
free_irq(k->irq_no, key_irq);
}
}
module_init(keyboard_init);
module_exit(keyboard_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Gene.Shao (sjiang1981@163.com)");
由于按鍵不具有I/O功能,它只會(huì)在按下的時(shí)候產(chǎn)生中斷,所以這里不需要實(shí)現(xiàn)open,read,write,ioctl等功能,這樣整個(gè)程序也就十分簡(jiǎn)單。uclinux不支持動(dòng)態(tài)加載內(nèi)核模塊,需要將驅(qū)動(dòng)程序靜態(tài)編譯進(jìn)內(nèi)核:
1. 將keyboard_demo.c拷貝到../kernel/drivers/char/目錄下。
2. 在../kernel/drivers/char/Makefile中添加:obj-$(CONFIG_KEYBOARD_DEMO) += keyboard_demo.o。
3. 在../kernel/drivers/char/Config.in中添加:dep_tristate 'Support keyboard demo' CONFIG_KEYBOARD_DEMO。
4. 在../kernel目錄下make menuconfig, 選擇Character devices,會(huì)看到'Support keyboard demo'選項(xiàng),這一項(xiàng)就是我的鍵盤驅(qū)動(dòng)。
總結(jié)
以上是生活随笔為你收集整理的龙芯2k按键中断驱动_外部中断按键驱动的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: matlab批量储存变量_[转载]整理:
- 下一篇: 米兔积木机器人能飞吗_米兔积木机器人AP