📄 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 + -