22273|1

139

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

芯灵思SinlinxA33开发板Linux中断编程4-最终代码(1) [复制链接]


按键驱动代码:
  1. #include <linux/module.h>
  2. #include <linux/fs.h>
  3. #include <linux/miscdevice.h>
  4. #include <linux/interrupt.h>
  5. #include <linux/irq.h>
  6. #include <linux/gpio.h>
  7. #include <asm/uaccess.h>
  8. #include <linux/delay.h>
  9. #include <linux/sched.h>  
  10. #define DEVICE_BUTTON  "mybtn"
  11. #define BTN_MAJOR   255
  12. static char keybuf[] = {"0"};
  13. static struct miscdevice misc = {
  14.     .minor = BTN_MAJOR,
  15.     .name  = DEVICE_BUTTON,
  16. };

  17. irqreturn_t key_isr(int irq, void* dev)
  18. {
  19.     int btn = 0;
  20.         //读取按键状态
  21.     btn= !gpio_get_value(GPIOL(14));       
  22.     printk("key %s\r\n",  btn ? "down" : "up");
  23.         //把按键状态更新到对应的按缓冲中
  24.         keybuf = “0” + btn;
  25.     return IRQ_HANDLED;
  26. }

  27. static ssize_t btn_read  (struct file *flp, char __user *buff, size_t count, loff_t * off)
  28. {
  29.     int ret ;
  30.         if(!count) {
  31.          return 0;
  32.     }
  33.     ret = copy_to_user(buff, keybuf, count);
  34.     if(ret) {
  35.         printk("error:copy_to_user\r\n");
  36.         return -EFAULT;
  37.     }
  38.     return count;
  39. }

  40. static const struct file_operations dev_fops = {
  41.     .read   =   btn_read ,
  42.     .owner  =   THIS_MODULE,
  43. };
  44. static int __init btn_init(void)
  45. {
  46.     int ret;
  47.     int irq;
  48.     int flags;
  49.     flags = IRQ_TYPE_EDGE_BOTH;
  50.     irq = gpio_to_irq( GPIOL(14) );
  51.         //发生中断号为irq的中断会执行key_isr函数。注册成功会在/proc/irq号/KEY文件夹出现或 cat /proc/interrupts, 记录了本中断发生的次数cat /proc/irq/442/spurious
  52.     ret = request_irq(irq,key_isr, flags, "KEY",NULL);
  53.     if(ret < 0)
  54.     {   
  55.            irq = gpio_to_irq( GPIOL(14) );
  56.            disable_irq(irq);
  57.            free_irq(irq, NULL);
  58.            return ret;
  59.     }
  60.     ret = misc_register(&misc);
  61.     printk(KERN_EMERG " Device registered \n ");
  62.     return ret;
  63. }
  64. static void __exit btn_exit(void)
  65. {
  66.     int irq;
  67.     irq = gpio_to_irq( GPIOL(14) );
  68.     disable_irq(irq);
  69.     free_irq(irq, NULL);
  70.     misc_deregister(&misc);
  71.     printk(KERN_EMERG " Equipment logged out \n");
  72. }
  73. module_init(btn_init);
  74. module_exit(btn_exit);
  75. MODULE_LICENSE("GPL");

复制代码



测试应用代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <fcntl.h>
  7. #include <unistd.h>
  8. #include <sys/ioctl.h>
  9. #include <sys/types.h>
  10. #include <errno.h>   
  11. #define  DEV_NAME    "/dev/mybtn"
  12. int main(int argc, char *args[])
  13. {
  14.     int fd = 0;
  15.     int ret = 0;
  16.     unsigned char recv_buf[1] = {"0"};

  17.     fd = open(DEV_NAME, O_RDONLY);
  18.     //fd = open(DEV_NAME, O_RDONLY|O_NONBLOCK);
  19.     if(fd < 0) {
  20.         perror("open");
  21.     }

  22.     while(1) {
  23.         strcpy(recv_buf, "0000");
  24.         //读取按键数据
  25.         ret = read(fd, recv_buf, 1);
  26.         if((ret < 0) && (errno != EAGAIN)) {
  27.             perror("read");
  28.             exit(-1);
  29.         }

  30.         //输出按键状态
  31.         printf("%s\r\n", recv_buf);
  32.     }

  33.     return 0;
  34. }
复制代码



Makefile代码:
  1. KERN_DIR = /work/lichee/linux-3.4
  2. all:
  3.         make -C $(KERN_DIR) M=`pwd` modules
  4.         arm-none-linux-gnueabi-gcc  btntest.c -o btntest
  5. clean:
  6.         make -C $(KERN_DIR) M=`pwd` modules clean
  7.         rm -rf modules.order
  8. obj-m        += btn_drv.o

复制代码



遗憾的是,代码虽然能编译成功,但是驱动加载有错误,等找出原因再发帖补充,同时也希望大神指点
开发板交流群 QQ:641395230





此内容由EEWORLD论坛网友babyking原创,如需转载或用于商业用途需征得作者同意并注明出处

最新回复

支持一下,持续更新的精神  详情 回复 发表于 2019-2-13 19:03
点赞 关注(1)

回复
举报

2057

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
支持一下,持续更新的精神
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表