借用Camera驱动思想,做ZLG7290驱动问题
宇帆 2010-11-16 05:45:25 平台:WIN-CE 5.0 S3C2440
BSP有个IIC的驱动,Camera调用IIC驱动,来数据传输,现在想借用这个思想,做个驱动ZLG7290和E2PROM的驱动程序,现在的问题的是,打开驱动失败,不知道是什么原因??
应用程序打开驱动:
hFile=CreateFile(_T("ZLG1:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if (hFile== INVALID_HANDLE_VALUE)
{
MessageBox(_T("打开驱动失败!"));
return;
}
else MessageBox(_T("打开驱动成功!"));
驱动注册表:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\ZLG]
"Dll"="ZLG.dll"
"Prefix"="ZLG"
"Index"=dword:1
"order"=dword:0
在系统起来的时候,通过串口我让它输出了信息:可以看到已经加载成功了,而且可以打开I2C驱动。
ZLG: DLL_PROCESS_ATTACH
ZLG::ZLG_Init()
ZLG::Virtual_Alloc
ZLG::InitializeCriticalSection
ZLG::CreateFile("I2C0") OK
ZLG::DeviceIoControl IOCTL_I2C_GET_FASTCALL OK
ZLG: DLL_PROCESS_DETACH
在ZLG.c文件中 我还是保留流接口函数,而打开驱动应该是调用ZLG_Open,测试发现根本就没有执行这个函数
DWORD
ZLG_Open(
DWORD dwData,
DWORD dwAccess,
DWORD dwShareMode
)
{
RETAILMSG(1,(TEXT("ZLG_Open\r\n")));
return TRUE;
}
如果执行不到ZLG_Open函数,应该前边初始化不对,ZLG_Init这个函数,但是奇怪的是,这个函数里面根据打印信息,是OK的
PUBLIC DWORD
ZLG_Init(DWORD dwContext)
{
DWORD dwErr = ERROR_SUCCESS, bytes;
RETAILMSG(1, (TEXT("ZLG::ZLG_Init() \r\n")));
// Allocate for our main data structure and one of it's fields.
pZLG = (PZLG_CONTEXT)LocalAlloc( LPTR, sizeof(ZLG_CONTEXT) );//分配虚拟内存
if ( !pZLG )
return( NULL );
// Virtual Alloc
Virtual_Alloc();//物理地址 与 虚拟地址 的地址映射
RETAILMSG(1, (TEXT("ZLG::Virtual_Alloc \r\n")));
InitializeCriticalSection(&pZLG->RegCS);//初始化一个临界资源对象 参数为临界资源对象指针
RETAILMSG(1, (TEXT("ZLG::InitializeCriticalSection \r\n")));
// Init I2C
pZLG->hI2C = CreateFile( L"I2C0:", //创建一个I2C0的文件 可读可写
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, 0);
if ( INVALID_HANDLE_VALUE == pZLG->hI2C )
{
dwErr = GetLastError();
RETAILMSG(1, (TEXT("Error %d opening device '%u' \r\n"), dwErr, L"I2C0:" ));
goto _error_exit;
}
RETAILMSG(1, (TEXT("ZLG::CreateFile(\"I2C0\") OK \r\n")));
// Gat Fastcall driver-to-driver entrypoints
if ( !DeviceIoControl(pZLG->hI2C,
IOCTL_I2C_GET_FASTCALL,
NULL, 0,
&pZLG->fc, sizeof(pZLG->fc),
&bytes, NULL) )
{
dwErr = GetLastError();
RETAILMSG(1,(TEXT("IOCTL_I2C_GET_FASTCALL ERROR: %u \r\n"), dwErr));
goto _error_exit;
}
RETAILMSG(1, (TEXT("ZLG::DeviceIoControl IOCTL_I2C_GET_FASTCALL OK \r\n")));
_error_exit:
return dwErr;
}
还会是哪里影响打开驱动呢?
我刚开始怀疑Camera和ZLG都调用IIC,会有冲突影响,就把Camera去掉,还是不行,应该不是Camera的问题。
描述太多了,请各位大侠耐心看看,小妹提前感谢!!