驱动:irq中断

2024-08-27 02:12
文章标签 驱动 中断 irq

本文主要是介绍驱动:irq中断,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

按键中断 

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <asm/io.h>
#include <asm/string.h>
#include <asm/uaccess.h>
#include <linux/miscdevice.h>
#include <asm-generic/errno-base.h>
#include <linux/interrupt.h>
#include <linux/irqreturn.h>
#include <linux/wait.h>
#include <linux/sched.h>#define DEV_NAME "key"static wait_queue_head_t wq;
static int condition = 0;irqreturn_t irq_handler(int num, void * arg)
{printk("num = %d  arg = %d\n", num, *(int *)arg);condition = 1;wake_up_interruptible(&wq);return IRQ_HANDLED;
}static int open (struct inode * inode, struct file * file)
{printk("key open ...\n");return 0;
}static ssize_t read (struct file * file, char __user * buf, size_t len, loff_t * offset)
{//copy_to_user(buf, &value, sizeof(value));condition = 0;wait_event_interruptible(wq, condition);printk("key read ...\n");return 4;
}static ssize_t write (struct file * file, const char __user * buf, size_t len, loff_t * offset)
{return 0;
}static int close (struct inode * inode, struct file * file)
{printk("key close ...\n");return 0;
}static struct file_operations fops = 
{.owner = THIS_MODULE,.open = open,.read = read,.write = write,.release = close
};static struct miscdevice misc = 
{.minor = MISC_DYNAMIC_MINOR,.name = DEV_NAME,.fops = &fops
};static int arg = 100;static int __init key1_init(void)
{int ret = misc_register(&misc);if(ret < 0)goto err_misc_register;ret = request_irq(IRQ_EINT8, irq_handler, IRQF_TRIGGER_FALLING | IRQF_DISABLED, "key_irq", &arg);	if(ret < 0)goto err_request_irq;init_waitqueue_head(&wq);printk("key_init  ...\n");return ret;err_misc_register:misc_deregister(&misc);printk("key misc_register faikey\n");	return ret;err_request_irq:disable_irq(IRQ_EINT8);free_irq(IRQ_EINT8, &arg);return ret;
}static void __exit key_exit(void)
{disable_irq(IRQ_EINT8);free_irq(IRQ_EINT8, &arg);misc_deregister(&misc);printk("key_exit  ###############################\n");
}module_init(key1_init);
module_exit(key_exit);
MODULE_LICENSE("GPL");

adc

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <asm/io.h>
#include <asm/string.h>
#include <asm/uaccess.h>
#include <linux/miscdevice.h>
#include <asm-generic/errno-base.h>
#include <linux/interrupt.h>
#include <linux/irqreturn.h>
#include <linux/wait.h>
#include <linux/sched.h>#define DEV_NAME "adc"
#define ADCCON 0x58000000
#define ADCDAT0 0x5800000C
#define CLKCON 0x4C00000C
static volatile unsigned long * adccon;
static volatile unsigned long * adcdat0;
static volatile unsigned long * clkcon;static wait_queue_head_t wq;
static int condition = 0;irqreturn_t irq_handler(int num, void * arg)
{printk("num = %d  arg = %d\n", num, *(int *)arg);condition = 1;wake_up_interruptible(&wq);return IRQ_HANDLED;
}static void init_adc(void)
{*adccon = (1 << 14) | (49 << 6);
}static void start_adc(void)
{*adccon |= (1 << 0);	
}static unsigned short read_adc(void)
{unsigned short data = *adcdat0 & 0x3ff;return data;
}static int open (struct inode * inode, struct file * file)
{init_adc();printk("adc open ...\n");return 0;
}static ssize_t read (struct file * file, char __user * buf, size_t len, loff_t * offset)
{//copy_to_user(buf, &value, sizeof(value));unsigned short value = 0;printk("adc read start ...\n");condition = 0;start_adc();	wait_event_interruptible(wq, condition);value = read_adc();copy_to_user(buf, &value, sizeof(value));printk("adc read ...\n");return sizeof(value);
}static ssize_t write (struct file * file, const char __user * buf, size_t len, loff_t * offset)
{return 0;
}static int close (struct inode * inode, struct file * file)
{printk("adc close ...\n");return 0;
}static struct file_operations fops = 
{.owner = THIS_MODULE,.open = open,.read = read,.write = write,.release = close
};static struct miscdevice misc = 
{.minor = MISC_DYNAMIC_MINOR,.name = DEV_NAME,.fops = &fops
};static int arg = 100;static int __init adc_init(void)
{int ret = misc_register(&misc);if(ret < 0)goto err_misc_register;ret = request_irq(IRQ_ADC, irq_handler, IRQF_TRIGGER_FALLING | IRQF_DISABLED, "adc_irq", &arg);	if(ret < 0)goto err_request_irq;adccon = ioremap(ADCCON, sizeof(*adccon));adcdat0 = ioremap(ADCDAT0, sizeof(*adcdat0));clkcon = ioremap(CLKCON, sizeof(*clkcon));*clkcon |= (1 << 15);printk("clkcon = 0x%lx\n", *clkcon);init_waitqueue_head(&wq);printk("adc_init  ...\n");return ret;err_misc_register:misc_deregister(&misc);printk("adc misc_register faiadc\n");	return ret;err_request_irq:disable_irq(IRQ_ADC);free_irq(IRQ_ADC, &arg);return ret;
}static void __exit adc_exit(void)
{iounmap(clkcon);iounmap(adcdat0);iounmap(adccon);disable_irq(IRQ_ADC);free_irq(IRQ_ADC, &arg);misc_deregister(&misc);printk("adc_exit  ###############################\n");
}module_init(adc_init);
module_exit(adc_exit);
MODULE_LICENSE("GPL");

应用层adc

  1 #include <fcntl.h>                                                                                                2 #include <stdio.h>3 #include <stdlib.h>4 #include <string.h>5 #include <unistd.h>6 7 int main(int argc, const char *argv[])8 {9     int fd = open("/dev/adc",O_RDWR);10     if (fd < 0)11     {12         perror("open adc fail");13         return -1;14     }15 16     unsigned short value = 0;17     while(1)18     {19         int ret = read(fd, &value, sizeof(value));20         float v = 3.3 * value / 1024.0;21         printf("ret = %d adc value = %d v = %.3f\n",ret, value,v);22         sleep(2);23     }24 25     close(fd);26     return 0;27 }

这篇关于驱动:irq中断的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110341

相关文章

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

Nginx进行平滑升级的实战指南(不中断服务版本更新)

《Nginx进行平滑升级的实战指南(不中断服务版本更新)》Nginx的平滑升级(也称为热升级)是一种在不停止服务的情况下更新Nginx版本或添加模块的方法,这种升级方式确保了服务的高可用性,避免了因升... 目录一.下载并编译新版Nginx1.下载解压2.编译二.替换可执行文件,并平滑升级1.替换可执行文件

Linux之platform平台设备驱动详解

《Linux之platform平台设备驱动详解》Linux设备驱动模型中,Platform总线作为虚拟总线统一管理无物理总线依赖的嵌入式设备,通过platform_driver和platform_de... 目录platform驱动注册platform设备注册设备树Platform驱动和设备的关系总结在 l

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

如何在Ubuntu上安装NVIDIA显卡驱动? Ubuntu安装英伟达显卡驱动教程

《如何在Ubuntu上安装NVIDIA显卡驱动?Ubuntu安装英伟达显卡驱动教程》Windows系统不同,Linux系统通常不会自动安装专有显卡驱动,今天我们就来看看Ubuntu系统安装英伟达显卡... 对于使用NVIDIA显卡的Ubuntu用户来说,正确安装显卡驱动是获得最佳图形性能的关键。与Windo

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

嵌入式Linux驱动中的异步通知机制详解

《嵌入式Linux驱动中的异步通知机制详解》:本文主要介绍嵌入式Linux驱动中的异步通知机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、异步通知的核心概念1. 什么是异步通知2. 异步通知的关键组件二、异步通知的实现原理三、代码示例分析1. 设备结构

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta