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

相关文章

第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

Cortex-A7:ARM官方推荐的嵌套中断实现机制

0 参考资料 ARM Cortex-A(armV7)编程手册V4.0.pdf ARM体系结构与编程第2版 1 前言 Cortex-M系列内核MCU中断硬件原生支持嵌套中断,开发者不需要为了实现嵌套中断而进行额外的工作。但在Cortex-A7中,硬件原生是不支持嵌套中断的,这从Cortex-A7中断向量表中仅为外部中断设置了一个中断向量可以看出。本文介绍ARM官方推荐使用的嵌套中断实现机

电脑驱动分类

电脑驱动程序(驱动程序)是操作系统与硬件设备之间的桥梁,用于使操作系统能够识别并与硬件设备进行通信。以下是常见的驱动分类: 1. 设备驱动程序 显示驱动程序:控制显卡和显示器的显示功能,负责图形渲染和屏幕显示。 示例:NVIDIA、AMD 显示驱动程序。打印机驱动程序:允许操作系统与打印机通信,控制打印任务。 示例:HP、Canon 打印机驱动程序。声卡驱动程序:管理音频输入和输出,与声卡硬件

麒麟系统安装GPU驱动

1.nvidia 1.1显卡驱动 本机显卡型号:nvidia rtx 3090 1.1.1下载驱动 打开 https://www.nvidia.cn/geforce/drivers/ 也可以直接使用下面这个地址下载 https://www.nvidia.com/download/driverResults.aspx/205464/en-us/ 1.1.3安装驱动 右击,

windows10 卸载网络驱动以及重新安装

右键桌面此电脑的图标,点击管理,设备管理器—网络适配器,找到下图中的驱动(不同的系统或者显卡会导致网卡驱动名称与下图不一样,多为Realtek开头),右键选择卸载设备,然后重启电脑,系统会自动重新安装驱动 新电脑首次安装驱动: 根据主板厂家,比如华硕,进入华硕官网,点击服务支持,点击下载中心,选择型号,点击右侧驱动程序和工具软件,选择windows版本,下载相应的驱动,下载完之后在对应文件中找