我使用的是2.6.29内核+QT4在2440上做程序,我先是在2440里面做了个AD驱动程序,现在想把这个AD文件映射到我的QT用户程序里去。下面是我的程序,AD驱动应该是没有问题的,因为我把下面的程序放在完全的C语言环境编译(不使用QT编译)的话,可以驱动AD进行采样工作并可以正确得到数据,但是如果是把这段程序放在QT里面的话,程序也可以运行,不会出现死机之类的情况,只是得到的数据全部为0,请问是什么原因?谢谢了!
#define S3C2410_ADCCON 0x00
#define S3C2410_ADCDAT0 0x0C
#define S3C2410_ADCCON_PRSCEN (1<<14)
#define S3C2410_ADCCON_PRSCVL(x) (((x)&0xFF)<<6)
#define S3C2410_ADCCON_SELMUX(x) (((x)&0x7)<<3)
#define S3C2410_ADCCON_ENABLE_START (1<<0)
#define START_ADC(ch, prescale) S3C2410_ADCCON_PRSCEN | S3C2410_ADCCON_PRSCVL(prescale) \
| S3C2410_ADCCON_SELMUX(ch) | S3C2410_ADCCON_ENABLE_START
;
unsigned long int i;
volatile int *ADCCON;
volatile int *ADCDATA;
unsigned int result;
void *map_base;
unsigned char data[LOOP];
AD_fd = open("/dev/adc",O_RDWR);
if (AD_fd < 0)
{
perror("cannot open adc");
exit(1);
}
map_base = mmap(NULL,0x14,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
ADCCON = (volatile int*)((volatile int*)map_base + S3C2410_ADCCON);
ADCDATA = (volatile int*)((volatile int*)(map_base + S3C2410_ADCDAT0);
for (i=0;i<LOOP;i++)
{
*ADCCON = START_ADC(1,20);
do
{
result = (*ADCCON);
}
while(result & 0x01);
do
{
result = *ADCCON;
}
while(!(result & 0x8000));
data = (*ADCDATA) & 0x3ff;
}
[ 此帖被duancp在2009-08-18 11:08重新编辑 ]