我的开发板上一共有四个按键,分别影射到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按键中断驱动_外部中断按键驱动相关推荐

  1. 龙芯2k按键中断驱动_龙芯2k1000的中断设计

    龙芯2k1000的中断设计 1.前言 2.龙芯2k1000的中断描述 2.1 mips设计上的通用中断处理 2.2 龙芯中断的设计 3.龙芯2k1000中断的产生与处理 4.龙芯2k1000中断处理概 ...

  2. 龙芯2k按键中断驱动_龙芯2k1000的中断处理逻辑

    龙芯2k1000的中断设计 1.前言 2.龙芯2k1000的中断描述 2.1mips设计上的通用中断处理 2.2龙芯中断的设计 3.龙芯2k1000中断的产生与处理 4.龙芯2k1000中断处理概述 ...

  3. 龙芯2k开发板Debian系统安装教程

    龙芯2k开发板Debian系统安装教程 1 准备安装u盘 1.1 获取u盘设备名 将U盘插入个人debian/ubuntu电脑,使用lsblk获取U盘设备名 我的u盘设备名为sdb(sda为我的主硬盘 ...

  4. 经验分享|在龙芯2K上运行RT-Thread系统并开源

    大家好,今天分享下群友老李在大四上学期做的一个项目.希望对大家有启发. 项目信息 项目名称:龙芯2K上的RT-Thread系统 学生姓名:李志锐 学校:聊城大学 大四在读 方案描述:该项目要求首先实现 ...

  5. 龙芯2k的X86环境交叉编译

    1.下载 龙芯内核交叉编译器(运行在X86_64机器上): http://ftp.loongnix.org/toolchain/gcc/release/gcc-4.4.7-7215-n64-loong ...

  6. TM4C123GLaunchPad教程三_外部中断

    TM4C123GLaunchPad教程三_外部中断 介绍 ​ TM4C的每个IO口都可以分别配置外部中断,每组IO口对应一个中断服务函数,例如PA0-PA7对应同一个中断服务函数,每个IO口可以配置为 ...

  7. esp32外部中断_玩转 ESP32 + Arduino (四) 电容按键 霍尔传感器 外部中断 延时 脉冲检测...

    一. 电容输入 touchRead(pin) 及电容输入中断touchAttachInterrupt(pin, TSR , threshold) ESP32专门提供了电容触摸传感器的功能, 共有T0, ...

  8. stm32l4 外部中断按键会卡死_【stm32f407】外部中断实现按键中断方式

    一.外部中断 STM32F4的每个IO都可以作为外部中断的中断输入口,这点也是STM32F4的强大之处.STM32F407的中断控制器支持22个外部中断/事件请求.每个中断设有状态位,每个中断/事件都 ...

  9. stm32l4 外部中断按键会卡死_STM32学习之路-按键中断测试(外部中断)

    void RCC_Config(void) { SystemInit(); //系统时钟初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); ...

最新文章

  1. TensorFlow2简单入门-加载及预处理文本
  2. 判断手机浏览器还是桌面浏览器
  3. 瑞柏匡丞_移动互联的发展现状与未来
  4. array_merge用法
  5. linux 批量进行:解压缩某一类压缩文件类型的文件
  6. BAT大揭秘:在腾讯、百度、阿里上班,差别竟然这么大?
  7. TZOJ 数据结构期末历年题目
  8. 手机电子词典_【摘要】陈玉珍:词典使用对搭配产出与记忆保持的效能研究—— 以手机在线词典为例...
  9. Java完全自学手册,你要悄悄努力,然后惊艳所有人
  10. Hive调优全方位指南(推荐收藏)
  11. 凤凰项目节选内容、记录和重新描述
  12. IGS Viewer / IGS 文件查看器
  13. 北京圣思园java视频教程全套_北京圣思园Java8新特性及实战视频教程完整版
  14. 如何用计算机ip连接打印机共享,ip共享打印机怎么设置
  15. C4D模型工具—连接点/边
  16. python基础教程-第1章节 基础知识
  17. Android:执行exec app_process启动jar失败原因
  18. 计算机二级请假条,单位员工病假请假条范文模板
  19. 文字相对于图片垂直居中
  20. Python-Django毕业设计钓鱼爱好者交流平台(程序+Lw)

热门文章

  1. hust1342(流量有上下界的最小流)
  2. POJ 1703 Find them, Catch them(并查集高级应用)
  3. chrome vue 未响应_VUE数据响应式
  4. java线程协作_java 线程间的协作
  5. 20210614 So-called的用法
  6. Way to configure the logon navigaion layouts via Business Roles in CRM
  7. 【i.MX6UL/i.MX6ULL开发常见问题】单独编译内核,uboot生成很多文件,具体用哪一个?...
  8. 关于Qt QFileDevice::map()接口的一些学习记录
  9. [原创]分布式系统之缓存的微观应用经验谈(三)【数据分片和集群篇】
  10. css层叠上下文和层叠顺序