日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

龙芯2k按键中断驱动_外部中断按键驱动

發布時間:2025/3/13 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 龙芯2k按键中断驱动_外部中断按键驱动 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我的開發板上一共有四個按鍵,分別影射到GPF0、GPF2、GPG3、GPG11,當按下按鍵時分別產生0、2、11、19號外部中斷。由于沒有安裝驅動,當按下按鍵時,沒有任何反應。所以需要編寫一個驅動,將四個按鍵驅動起來。

下面是我寫的按鍵驅動的小例子,功能很簡單,當按下按鍵時打印出“key n(n = 1~4) is pressed!”的消息。

/********************************************************************

'?創建日期:?2006/05/04

'?文件名稱: ?keyboard_demo.c

'?文件作者:?Gene.Shao (E-Mail To: sjiang1981@163.com)

'

'?文件功能:?按鍵驅動

' 文件描述: 開發板上一共有四個按鍵,分別影射到GPF0、GPF2、GPG3、GPG11,

當按下按鍵時分別產生0、2、11、19號外部中斷。這個驅動十分簡

單,它僅僅是在按下了按鍵后打印出一串消息。如果希望按下按鍵

后做一些更有意義的事,需要改寫中斷處理程序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個按鍵,當按下按鍵時,分別產生0,2,11,19號中斷。

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},???//第一個按鍵

{ IRQ_EINT2, GPIO_F2, 2},???//第二個按鍵

{ IRQ_EINT11, GPIO_G3, 3},??//第三個按鍵

{ IRQ_EINT19, GPIO_G11, 4},??//第四個按鍵

};

//中斷處理程序

static void key_irq(int irq, void *dev_id, struct pt_regs *reg)

{

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;

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;

//設置與外部中斷號相對應的GPIO端口,上升沿和下降沿各產生一個中斷,禁用pull-up.

//set_external_irq是在../kernel/arch/arm/mach-s3c2410/iqr.c中定義的。

set_external_irq(k->irq_no, EXT_FALLING_EDGE, GPIO_PULLUP_DIS);

// 請求中斷,所有的按鍵都使用同一個中斷處理程序。中斷處理程序根據中斷號確定按下的是哪一個按鍵。

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;

//釋放中斷號

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功能,它只會在按下的時候產生中斷,所以這里不需要實現open,read,write,ioctl等功能,這樣整個程序也就十分簡單。uclinux不支持動態加載內核模塊,需要將驅動程序靜態編譯進內核:

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,會看到'Support keyboard demo'選項,這一項就是我的鍵盤驅動。

總結

以上是生活随笔為你收集整理的龙芯2k按键中断驱动_外部中断按键驱动的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。