AD驱动读函数:
/* ADC驱动的读函数 */
static ssize_t s3c2440adc_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)
{
unsigned long result = 0;
unsigned int data;
if (down_interruptible(&s3c2440adc_dev.lock)) /* 进入临界区 */
return -ERESTARTSYS;
/* 启动AD转换 */
iowrite32(START_ADC(s3c2440adc_dev.channel, s3c2440adc_dev.prescale), base_addr + S3C2410_ADCCON);
do {
result = ioread32(base_addr + S3C2410_ADCCON); /* 读取控制寄存器 */
}while((unsigned int)result & 0x01); /* 确认AD转换开始 */
do {
result = ioread32(base_addr + S3C2410_ADCCON); /* 读取控制寄存器 */
}while(!(((unsigned int)result) & 0x8000)); /* 直到AD转换完成 */
data = ioread32(base_addr + S3C2410_ADCDAT0) & 0x3ff; /* 保留转换数据寄存器的低10位 */
DPRINTK("AIN[%d] = %d mv\n", s3c2440adc_dev.channel, data*3300/1024;
copy_to_user(buffer, &data, sizeof(data)); /* 复制到用户空间 */
up(&s3c2440adc_dev.lock); /* 退出临界区 */
return sizeof(result);
}
其中#define START_ADC(ch, prescale) S3C2410_ADCCON_PRSCEN | S3C2410_ADCCON_PRSCVL(prescale) \
| S3C2410_ADCCON_SELMUX(ch) | S3C2410_ADCCON_ENABLE_START
channel初始化为0;prescale为255;调节滑动电阻,打印出来的电压值一直在1000mv与1200mv之间,读取的电压值应该有误,不知道程序哪里出错了。