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