查看: 202|回复: 0

[原创] 芯灵思SinlinxA33开发板Linux中断编程4-最终代码(1)

[复制链接]

主题

好友

1171

积分

进士

  • TA的每日心情
    奋斗
    2016-4-14 10:16
  • 签到天数: 9 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2019-2-13 16:11:17 |显示全部楼层
    按键驱动代码:
    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
    1.PNG



    回复

    使用道具 举报

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

    关闭

    站长推荐上一条 /5 下一条

    手机版|爱板网

    GMT+8, 2019-3-25 19:07 , Processed in 0.093235 second(s), 13 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-5   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001056号

    Powered by Discuz!

    返回顶部