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

📄 adc.c

📁 基于s3c44b0的rtc,watchdog,adc,ads的驱动程序
💻 C
字号:
#include <linux/config.h>#include <linux/utsname.h>#include <linux/kernel.h>#include <linux/major.h>#include <linux/string.h>#include <linux/fcntl.h>#include <linux/timer.h>#include <linux/sched.h>#include <linux/tty.h>#include <linux/module.h>#include <linux/init.h>#include <linux/miscdevice.h>#include <linux/delay.h>#include <linux/types.h>#include <linux/miscdevice.h>#include <linux/ioport.h>#include <linux/mc146818rtc.h>#include <linux/poll.h>#include <linux/proc_fs.h>#include <linux/spinlock.h>#include <linux/sysctl.h>#include <linux/pci.h>#include <asm/mach/irq.h>#include <asm/hardware.h>#include <asm/io.h>#include <asm/irq.h>#include <asm/system.h>#include <asm/uaccess.h>#include <asm/arch/io.h>#include "44b.h"
#define DEVICE_NAME	"adc"
#define MCLK 64000000typedef struct {	int  a0;	int  a1;	int  a2;	int  a3;	int  a4;	int  a5;	int  a6;	int  a7;}ADCDATA;static ADCDATA adcdata;static int delayLoopCount=400;void Delay(int);void Test_Adc(void);int ReadAdc(int);int ReadAdc(int ch)
{
    int i;
    static int prevCh=-1;

    if(prevCh!=ch)
    {
    	rADCCON=0x0 | (ch<<2);	//设置采样通道
    	for(i=0;i<150;i++);	
    }
    rADCCON=0x1 | (ch<<2);	//启动A/D转换
    while(rADCCON &0x1);			
    while(!(rADCCON & 0x40));	//A/D转换是否结束
    for(i=0;i<rADCPSR;i++); 
    prevCh=ch;
    return rADCDAT;
}
void Test_Adc(void)
{
    rCLKCON=0x7ff8;		//时钟控制寄存器,使能MCLK作为ADC的时钟电源
    rADCCON=0x1 | (0<<2);	//启动A/D转换
    Delay(100);	

    rADCPSR=255;		//设置预分频值
    
    adcdata.a0=ReadAdc(0);		//分别读取转换后的数字量
    adcdata.a1=ReadAdc(1);
    adcdata.a2=ReadAdc(2);
    adcdata.a3=ReadAdc(3);
    adcdata.a4=ReadAdc(4);
    adcdata.a5=ReadAdc(5);
    adcdata.a6=ReadAdc(6);
    adcdata.a7=ReadAdc(7);    //	printk("%d,%d,%d,%d,%d,%d,%d,%d\n",adcdata.a0,adcdata.a1,adcdata.a2,adcdata.a3,adcdata.a4,adcdata.a5,adcdata.a6,adcdata.a7);
}
static int adc_open(struct inode *inode, struct file *filp){	return 0;}static int adc_release(struct inode *inode, struct file *filp){  	return 0;}static int adc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){	switch(cmd) 	{		case 0:			Test_Adc();			return 0;        	default:                        printk("ERROR\n");    	}    	return 0;}static int adc_read(struct file *fp, char *buf, size_t count)
{    put_user(adcdata.a0, (int *)buf);    put_user(adcdata.a1, (int *)(buf+4));    put_user(adcdata.a2, (int *)(buf+8));    put_user(adcdata.a3, (int *)(buf+12));    put_user(adcdata.a4, (int *)(buf+16));    put_user(adcdata.a5, (int *)(buf+20));    put_user(adcdata.a6, (int *)(buf+24));    put_user(adcdata.a7, (int *)(buf+28));    return count;
}static struct file_operations adc_fops = {  	open:	adc_open,	ioctl:	adc_ioctl,  	release:	adc_release,	read:	adc_read,};int adc_init(void){	int ret;	ret = register_chrdev(252, DEVICE_NAME, &adc_fops);	if (ret < 0) {		printk(DEVICE_NAME " can't get major number\n");		return ret;	}	else 		printk("OK\n");		return 0;}

⌨️ 快捷键说明

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