驱动: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

相关文章

如何在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

FreeRTOS学习笔记(四)Freertos的中断管理及临界保护

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Cortex-M 中断管理1.1 中断优先级分组1.2 相关寄存器1.3 相关宏定义1.4 FreeRTOS 开关中断 二、临界段及其保护2.1 taskENTER_CRITICAL( ) 和 taskEXIT_CRITICAL( )2.2 taskENTER_CRITICAL_FROM_ISR( )

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

UMDF驱动安装

VS2013 + WDF8.1,UMDF驱动选择User Mode Driver,不要选User Mode Driver 2.0,否则Win7安装有问题,如图 另外,在驱动安装时不要忘记WUDFUpdate_<主版本号><次版本号>.dll文件,具体文件名在INF中查找。此文件可在WDF的安装目录中找到。注意:在WDF的安装目录中会有3个WUDFUpdate_xxx.dll文件,x86,x6