S3C2440的开发板,内核2.6.32自带的ADC驱动。
static ssize_t s3c2410_adc_read(struct file *filp, char
*buffer, size_t count, loff_t *ppos)
{
char str[20];
int value;
struct timeval tstart,tend; //添加
size_t len;
do_gettimeofday(&tstart); //添加
if (down_trylock(&ADC_LOCK) ==
0) {
OwnADC =
1;
START_ADC_AIN(adcdev.channel, adcdev.prescale);
wait_event_interruptible(adcdev.wait, ev_adc);
ev_adc =
0;
//while(!(ADCCON & ADC_ENDCVT));
//adc_data = ADCDAT0 & 0x3ff;//
value = adc_data;
OwnADC =
0;
up(&ADC_LOCK);
} else {
value =
-1;
}
do_gettimeofday(&tend); //添加
printk("AD time: %ld us value:%d \n", (tend.tv_usec-tstart.tv_usec),value); //添加
len = sprintf(str, "%d\n", value);
if (count >= len) {
int r;
r = copy_to_user(buffer, str, len);
return r ? r : len;
} else {
return
-EINVAL;
}
}
出来的结果是1380us,我又试了不要中断的方式,屏蔽wait_event,直接等待寄存器的15位置位,时间同样是1380us左右,没有变化。
我没改过PCLK那些,估计就是50M吧,另外我的预分频是0xFF,按照公式1/(50M/256/5)=25us
但实际程序为什么是1300多个us。我把AD中断里的程序都屏蔽掉了。
do_gettimeofday这个函数我验证过,算是正确的,虽然有点点误差,也不至于那么大。
哪位大侠帮忙解释下!试来试去都试不出datasheet上说的那个转换时间出来。 |