全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 接口/总线/驱动 >

Linux下CPLD驱动程序

时间:2012-05-10 13:57

人气:

作者:admin

标签: 驱动  Linux  cpld  C程序 

导读:Linux下CPLD驱动程序-Linux下CPLD驱动程序:static struct class *cpld_class; //自动创建设备文件时需要先创建类static struct class_device *cpld_class_dev; //再创建驱动static DECLARE_WAIT_QUEUE_HEAD(eint1_waitq);...

/* ========================================================================== */
/*                                                                            */
/*   Filename.c                                                               */
/*   (c) 2001 Author  Zhang Haibo                                             */
/*                                                                            */
/*   Description  driver program with interrupt and poll                      */
/*                                                                            */
/* ========================================================================== */

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

static struct class *cpld_class;                  //自动创建设备文件时需要先创建类
static struct class_device *cpld_class_dev;       //再创建驱动
static DECLARE_WAIT_QUEUE_HEAD(eint1_waitq);      //将中断放入等待队列
static struct fasync_struct *eint1_async;         //
static volatile int ev_eint1 = 0;                 //中断标志,为1表示中断发生,在中断服务程序里置1
volatile unsigned long *cpld_data = NULL;         //CPLD的物理地址映射的虚拟地址指针  0x08000000
volatile unsigned long *gpfcon = NULL;            //GPF控制寄存器
volatile unsigned long *gpfdat = NULL;            //GPF数据寄存器,0位为使能位

static irqreturn_t eint1_irq(int irq, void *dev_id) //中断服务程序
{
    ev_eint1 = 1;                                   //中断标志位置1
    *gpfdat &= ~(1<<2);                             //进入中断GPF2清0
    wake_up_interruptible(&eint1_waitq);            //唤醒休眠的进程
    kill_fasync (&eint1_async, SIGIO, POLL_IN);     //产生中断后,驱动向应用程序发送信号     
    return IRQ_RETVAL(IRQ_HANDLED);
}

static int cpld_drv_open(struct inode *inode, struct file *file)
{
    request_irq(IRQ_EINT1,  eint1_irq, IRQ_TYPE_EDGE_FALLING, "EINT1", 1);//注册中断:中断号,中断程序入口,中断方式,中断名,代号
    return 0;
}
 
static ssize_t cpld_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
{
    int val;
    *gpfdat &=~(1<<0);                //使能位置0,使能CPLD产生PWM,计数器开始计数
    copy_from_user(&val, buf, count); //产生PWM的值从用户空间传入
    iowrite16(val,cpld_data);         //写入CPLD
    return 0;
}
 

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信