⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adcdri.c

📁 ADC驱动[通过arg区分通道号]!!!!!!!!!
💻 C
字号:
#ifdef MODULE
#include <linux/module.h>
#include <linux/version.h>
#else
#define MOD_INC_USE_COUNT
#define MOD_DEC_USE_COUNT
#endif

#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/timer.h>
#include <linux/errno.h>
#include<asm/uaccess.h>
#include <asm/io.h>
#include <asm/hardware.h>
#include <asm/irq.h>
#include "adcioctl.h"


#define DEVICE_NAME   "adc"
#define adc_MAJOR      69
#define DEV_MAJOR     adc_MAJOR


#define BUTT_DEBUG


int ret,ADCRESULT,i;


static int adc_open(struct inode *inode , struct file *filp)
{  
   MOD_INC_USE_COUNT;
   outl(0x7ff8, S3C44B0X_CLKCON);       //配置时钟控制寄存器,全能MCLK作为ADC的时钟源
   outl(0x20, S3C44B0X_ADCPSR);         //设置时钟预分频值	
    return 0;
}

static ssize_t adc_read(struct file *filp,char *buf,size_t count,loff_t *ppos)
{
 
    return 0;
}




static int adc_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{

        if(_IOC_TYPE(cmd) != adc_MAGIC)
	{
		return -ENOTTY;	
	}
	if(_IOC_NR(cmd) >=adc_IOCTL_MAXNR)
	{
		return -ENOTTY;	
	}
 switch(cmd)        //设置采样通道
      {
       case READ_RESULT :  //通道0
                     outl((arg<<2),S3C44B0X_ADCCON); 
                     for(i=0;i<150;i++);                     outl((0x01|(arg<<2)),S3C44B0X_ADCCON);
                     for(i=0;i<150;i++);//这条语句必须要有,否则不能正常运行,配置寄存器需要时间,所以时隙上要注意     
                     break;   
     case DEFAULT :  
                    printk( KERN_ERR "nothing is done! \n");
		      break;
					   
      }      
      ret = (inl(S3C44B0X_ADCCON)) & 0x40;   //判断是否转换完毕 ret=1:转换结束 ret=0:正在转换
      while(!ret);		
      ADCRESULT=inl(S3C44B0X_ADCDAT);   //读取AD转换结果
      return ADCRESULT;
}



static int adc_release(struct inode *inode , struct file *filp)
{
    MOD_DEC_USE_COUNT;    
    return 0;
}

static struct file_operations button_fops = 
{

    open    : adc_open,
    read    : adc_read,
    ioctl    : adc_ioctl,
    release : adc_release,   
};



/*********************************************************************
*函数名    :adc_init
*传入参数  : 
*传出参数  : 0 --->正常   -1 ---> 错误
*作用      : 按键的初始化函数,用来初始化EXTINT4567,以及timer
*********************************************************************/
static int __init adc_init(void)
{

    if((register_chrdev(DEV_MAJOR, DEVICE_NAME , &button_fops)) < 0)
    {
        printk( KERN_ERR DEVICE_NAME":Unable to get major %d\n", DEV_MAJOR);
        
        return -1;
    }
   else     {      printk( "register dev is success!\n");     }
   

    #ifdef BUTT_DEBUG
        printk( KERN_ERR "adc0 initial ok!\n");
    #endif

    return 0;
}

static int __exit adc_clearup(void)
{
       
    unregister_chrdev(DEV_MAJOR ,DEVICE_NAME);
    printk( KERN_ERR "Button has already exit! \n");
    return 0;
}

#ifdef MODULE

module_init(adc_init);
module_exit(adc_clearup);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("mengzhiyi<zhc_mengzhiyi@yahoo.com.cn>");
MODULE_DESCRIPTION("button driver for S3C44B0");

#else

__initcall(adc_init);

#endif





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -