6678|5

6

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

TQ2440 WINCE6.0 ADC驱动无法加载 [复制链接]

刚开始学嵌入式,最近需要使用AD转换,可是TQ2440开发板没有提供WINCE6.0的ADC驱动,无奈找了很久,现在是在天嵌论坛找的一个WINCE5.0下开发的ADCDrv
(http://bbs.embedsky.net/viewthread.php?tid=1140&extra=page%3D2)
包含ADCDrv.cpp、ADCDrv.h、ADCDrv.def、makefile、sources、Build.log
主要对原BSP做了以下修改:
1. 将
ADCDrv文件夹复制到Drivers下,并将Drivers下的dirs增加语句:DIRS=······\ ADCDrv \······  ;
2. 修改platform.reg:

3. 修改platform.bib:

重新编译项目成功,烧写到开发板也正常,有人说ADC驱动会和触摸屏驱动冲突,这里触摸屏使用正常,
使用VS2005打开NK.bin发现包含ADCDrv.dll文件,使用远程工具查看注册表项[HKEY_LOCAL_MACHINE\Drivers\BuiltIn]里也有ADCDrv项,可是在进程查看器的NK里却没找到ADCDrv.dll,[HKEY_LOCAL_MACHINE\Drivers\Active]下也没有找到ADCDrv项,这究竟是为什么呢?
ADCDrv.cpp中包括各接口函数定义:
ADC_Close
ADC_Deinit
ADC_Init
ADC_IOControl
ADC_Open
ADC_PowerDown
ADC_PowerUp
ADC_Read
ADC_Seek
ADC_Write
这里附上部分代码:
DWORD ADC_Init(DWORD dwContext)
{
unsigned long unpreScaler=0;
unsigned long unADCFreq = 1000000; //ADC Frequence: 1M Hz

RETAILMSG(1,(TEXT("ADC Initialize ...")));
if (!InitializeAddresses())
return (FALSE);

unpreScaler= (5000000/unADCFreq)-1;
cbytPreScalerValue=(char)unpreScaler;
//pADCPort->ADCDLY

mInitialized = TRUE;
RETAILMSG(1,(TEXT(" ADC_Init OK !!!\n")));
return TRUE;
}
DllEntry(HANDLE hinstDLL, 
DWORD dwReason, 
LPVOID /* lpvReserved */)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
DEBUGREGISTER((HINSTANCE)hinstDLL);
return TRUE;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
#ifdef UNDER_CE
case DLL_PROCESS_EXITING:
break;
case DLL_SYSTEM_STARTED:
break;
#endif
}
return TRUE;
}
DWORD ADC_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
int i;

Count=sizeof(nADC_Value);
dwADCCON_Save=v_pADCregs->ADCCON;

for(i=0;i<4;i++)
{
nADC_Value=0;
if(!bADC_Enable) continue;
nADC_Value = ReadADC(i);
Sleep(10);
}

v_pADCregs->ADCCON = dwADCCON_Save;
Sleep(20);
memcpy(pBuffer,&nADC_Value[0],Count);

RETAILMSG(1,(TEXT("ADC_Control: ADC_Read\r\n")));
return TRUE;
}

int ReadADC(int ch)
{
v_pADCregs->ADCCON = (1<<14)|(cbytPreScalerValue<<6)|(ch<<3); //setup channel
v_pADCregs->ADCCON|=0x1; //start ADC
while(v_pADCregs->ADCCON & 0x1); //check if Enable_start is low
while(!(v_pADCregs->ADCCON & 0x8000)); //check if EC(End of Conversion) flag is high

RETAILMSG(1,(TEXT("NO: %d  Data: %d\r\n"),ch,(int)v_pADCregs->ADCDAT0 & 0x3ff));
return ( (int)v_pADCregs->ADCDAT0 & 0x3ff );
}
[ 本帖最后由 zhengtu2010 于 2011-7-21 15:25 编辑 ]

截图02.jpg (25.42 KB, 下载次数: 3)

截图02.jpg
此帖出自WindowsCE论坛

最新回复

不断的学习ARM新知识  详情 回复 发表于 2012-4-27 17:03
点赞 关注
 

回复
举报

6

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
无人问津吗,偶真是杯具

补充
1. ADC_Init里调用的InitializeAddresses函数代码:

bool InitializeAddresses(VOID)
{
        bool        RetValue = TRUE;

        /* AD Register Allocation --------------------------------------------*/
        v_pADCregs = (volatile S3C2440A_ADC_REG *)VirtualAlloc(0, sizeof(S3C2440A_ADC_REG), MEM_RESERVE, PAGE_NOACCESS);
        {
            ERRORMSG(1,(TEXT("For ADCreg: VirtualAlloc failed!\r\n")));
                return false;
        }
        else
        {
                if (!VirtualCopy((PVOID)v_pADCregs, (PVOID)(S3C2440A_BASE_REG_PA_ADC >> 8), sizeof(S3C2440A_ADC_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
                {
                        ERRORMSG(1,(TEXT("For ADPregs: VirtualCopy faiADC!\r\n")));
                        RetValue = FALSE;
                }
        }

        if (!RetValue)
        {
                if (v_pADCregs)
                {
                        VirtualFree((PVOID) v_pADCregs, 0, MEM_RELEASE);        if (v_pADCregs == NULL)

                }
                v_pADCregs = NULL;
        }

        return(RetValue);
}

2. BSP里GPIOdriver的Init代码做对比:
DWORD GIO_Init(DWORD dwContext)
{

        RETAILMSG(1,(TEXT("GPIO Initialize ...")));

        if (!InitializeAddresses())
                return (FALSE);

        v_pIOPregs->GPBCON  = (v_pIOPregs->GPBCON  &~(3 << 10)) | (1<< 10);        // GPB5 == OUTPUT.
        v_pIOPregs->GPBCON  = (v_pIOPregs->GPBCON  &~(3 << 12)) | (1<< 12);        // GPB6 == OUTPUT.
        v_pIOPregs->GPBCON  = (v_pIOPregs->GPBCON  &~(3 << 14)) | (1<< 14);        // GPB7 == OUTPUT.
        v_pIOPregs->GPBCON  = (v_pIOPregs->GPBCON  &~(3 << 16)) | (1<< 16);        // GPB8 == OUTPUT.
       
        mInitialized = TRUE;
        RETAILMSG(1,(TEXT("OK !!!\n")));
        return TRUE;
}

bool InitializeAddresses(VOID)
{
        bool        RetValue = TRUE;

        /* IO Register Allocation */
        v_pIOPregs = (volatile S3C2440A_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2440A_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
        if (v_pIOPregs == NULL)
        {
                ERRORMSG(1,(TEXT("For IOPregs : VirtualAlloc faiGPIO!\r\n")));
                RetValue = FALSE;
        }
        else
        {
                if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(S3C2440A_BASE_REG_PA_IOPORT >> 8), sizeof(S3C2440A_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
                {
                        ERRORMSG(1,(TEXT("For IOPregs: VirtualCopy faiGPIO!\r\n")));
                        RetValue = FALSE;
                }
        }

        if (!RetValue)
        {
                if (v_pIOPregs)
                {
                        VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);
                }

                v_pIOPregs = NULL;
        }

        return(RetValue);

}
此帖出自WindowsCE论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
有了点进展:(原因在下面)
超级终端打印出信息:
ADC Initialize ...ADC_Init OK !!!
但是进程里依旧没有发现ADCDrv.dll,active下也没有变化。
现在ADC_Init执行成功了,但是驱动依旧没有加载,怎么办呢?

之前我移植另一个驱动时,出现Warning: Image exceeds specified memory size by 4192 bytes and may not run.导致NK.bin无法烧写到开发板,于是我修改了PLATFORM\\FILES下的config.bib:
  NK 80200000 02200000 RAMIMAGE
  RAM 82400000 01c00000 RAM
  ROMSIZE = 02200000
改为
  NK 80200000 02300000 RAMIMAGE
  RAM 82500000 01b00000 RAM
  ROMSIZE = 02300000
现在我改回去,重新编译,依然有上面的Warning,但是烧写成功,而且打印出了上面的信息。

现在,参照http://topic.csdn.net/u/20080927/08/4083a1f7-05f1-4fa8-a74e-2f23cff9b91a.html
我修改了一下:
DllEntry(HANDLE        hinstDLL, 
DWORD dwReason, 
LPVOID /* lpvReserved */)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
RETAILMSG(1,(TEXT("ADC_DLL_PROCESS_ATTACH ...")));
DEBUGREGISTER((HINSTANCE)hinstDLL);
return TRUE;
case DLL_THREAD_ATTACH:
RETAILMSG(1,(TEXT("ADC_DLL_THREAD_ATTACH ...")));
break;
case DLL_THREAD_DETACH:
RETAILMSG(1,(TEXT("ADC_DLL_THREAD_DETACH ...")));
break;
case DLL_PROCESS_DETACH:
RETAILMSG(1,(TEXT("ADC_DLL_PROCESS_DETACH ...")));
break;
#ifdef UNDER_CE
case DLL_PROCESS_EXITING:
break;
case DLL_SYSTEM_STARTED:
break;
#endif
}
return TRUE;
}

结果打印出来的信息自GPIO Initialize ...OK !!!截取:
GPIO Initialize ...OK !!!
  ADC_DLL_PROCESS_ATTACH ...ADC Initialize ... ADC_Init O
K !!!
  INT_Init----
INT_GPIO_Setting----
ADC_DLL_THREAD_DETACH ...LCD: display instance 'Drivers\Display\S3C2440\CONFIG',
 num monitors 1
ADC_DLL_THREAD_DETACH ...LayMgr.cpp: Layout Manager successfully initialized to
 2
Maximum Allowed Error 7:
ADC_DLL_THREAD_DETACH ...CamClockOn = 0
Explorer(V2.0) taskbar thread started.
NDISPWR:: Found adapter [DM9CE1]
ADC_DLL_THREAD_DETACH ...ADC_DLL_THREAD_DETACH ...ADC_DLL_THREAD_DETACH ...ADC_D
LL_THREAD_DETACH ...

也就是初始化之后不断接打印ADC_DLL_THREAD_DETACH信息,也就是线程不断被停止,这是为什么呢?

[ 本帖最后由 zhengtu2010 于 2011-7-21 20:42 编辑 ]
此帖出自WindowsCE论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

4
 
问题已解决:
驱动未加载是由于之前更改config.bib里的NK、RAM、ROMSIZE大小引(见楼上)起的,现在看来config.bib还是少动为妙。
此帖出自WindowsCE论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

5
 
求wince5.0ADC流驱动源码,谢谢!!!272143219@qq.com
此帖出自WindowsCE论坛
 
 
 

回复

2734

帖子

0

TA的资源

裸片初长成(初级)

6
 
不断的学习ARM新知识
此帖出自WindowsCE论坛
 
个人签名我爱电子!
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表