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

📄 adc.c

📁 MC2410A的ADC驱动
💻 C
字号:
#include <linux/kernel.h>#include <linux/init.h>#include <linux/module.h>#include <linux/ioport.h>#include <linux/miscdevice.h>#include <linux/sched.h>#include <linux/delay.h>#include <linux/poll.h>#include <linux/spinlock.h>#include <linux/delay.h>#include <linux/wait.h>#include <linux/device.h>#include <asm/irq.h>#include <linux/types.h>#include <linux/cdev.h>#include <linux/errno.h>#include <asm/arch/map.h>#include <asm/uaccess.h>#include <asm/hardware.h>#include <asm/io.h>#include <asm/arch/regs-gpio.h>#include <asm/arch-s3c2410/map.h>#include <asm/arch-s3c2410/regs-adc.h>#include <asm/arch-s3c2410/regs-clock.h>#include "adc.h"#define DEVICE_NAME "adc"//#define ADC_MAJOR 240#define ADCCON	(S3C24XX_VA_ADC + 0x00) //S3C2410_ADCCON#define ADCTSC	(S3C24XX_VA_ADC + 0x04) //S3C2410_ADCTSC#define ADCDAT0	(S3C24XX_VA_ADC + 0x0C) //S3C2410_ADCDAT0#define CLKCON	(S3C24XX_VA_CLKPWR + 0x0C) //S3C2410_CLKCONstatic int adc_major=254;MODULE_AUTHOR("akae_group");MODULE_DESCRIPTION("adc module");MODULE_LICENSE("GPL");static ssize_t adc_read(struct file *filp,char __user *buf,						size_t count,loff_t *f_pos){	int data=0;	unsigned int tmp;//	printk("1.........\n");	tmp=readl(ADCCON) | 0x01;	writel(tmp,ADCCON);//	printk("2..........\n");	do {		tmp=readl(ADCCON);	}while(((unsigned short)tmp) & 0x01);//	printk("3..........\n");		do {		tmp=readl(ADCCON);	}while(!(((unsigned short)tmp) & 0x8000));	//	printk("4.........\n");	data=readl(ADCDAT0) & 0x3ff;//	printk("5..........\n");//	printk("data=%d\n",data);	if(copy_to_user(buf,&data,sizeof(data)))		return -EFAULT;	return (sizeof(int));}static int adc_initial(void){	unsigned int tmp;	writel((readl(CLKCON) | S3C2410_CLKCON_ADC),CLKCON);		tmp=readl(ADCTSC);//	tmp &= (~S3C2410_ADCTSC_AUTO_PST) | S3C2410_ADCTSC_XY_PST(S3C2410_NOP_MODE);	tmp &= (~S3C2410_ADCTSC_AUTO_PST);	writel(tmp,ADCTSC);	tmp=readl(ADCCON);	tmp= S3C2410_ADCCON_PRSCEN | PRSCVL(49) | ADC_INPUT(0);	writel(tmp,ADCCON);	return 0;}static int adc_open(struct inode *inode,struct file *filp){	adc_initial();	printk("ad convert opened!\n");	return 0;}static int adc_release(struct inode *inode,struct file *filp){	printk("ad convert closed!\n");	return 0;}static void adc_setup_cdev(struct cdev *dev,int minor,						   struct file_operations *fops){	int err,devno=MKDEV(adc_major,minor);	cdev_init(dev,fops);	dev->owner=THIS_MODULE;	dev->ops=fops;	err=cdev_add(dev,devno,1);	if(err)		printk(KERN_NOTICE "Error %d adding adc %d",err,minor);}static struct cdev AdcDevs;static struct file_operations adc_remap_ops={	.owner=THIS_MODULE,	.open=adc_open,	.read=adc_read,	.release=adc_release,};int __initadc_init(void){	int result;	dev_t dev;	if(adc_major) {		dev=MKDEV(adc_major,0);		result=register_chrdev_region(dev,1,DEVICE_NAME);	}else {		result=alloc_chrdev_region(&dev,0,1,DEVICE_NAME);		adc_major=MAJOR(dev);	}	if(result<0) {		printk(KERN_WARNING "adc:unable to get major %d\n",adc_major);		return result;	}	adc_setup_cdev(&AdcDevs,0,&adc_remap_ops);	printk("adc device installed,with major %d\n",adc_major);	return 0;	}void __exitadc_cleanup(void){	cdev_del(&AdcDevs);	unregister_chrdev_region(MKDEV(adc_major,0),1);	printk("adc module exit\n");	return ;}module_init(adc_init);module_exit(adc_cleanup);

⌨️ 快捷键说明

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