借用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的问题。

描述太多了,请各位大侠耐心看看,小妹提前感谢!!
...全文
194 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
宇帆 2010-11-19
  • 打赏
  • 举报
回复
谢谢各位,先结贴了

读写那还有点问题,最近忙,只能业务时间自己在慢慢看,应该可以解决。如果还有问题,会开贴请教的。
loongembedded 2010-11-18
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 cfanlwn 的回复:]
引用 21 楼 loongembedded 的回复:

谢谢楼主的分享,不过正常的用法是
DWORD dwErr = ERROR_SUCCESS;

................
return TRUE;
_error_exit:
return dwErr;


说的很正确,这个是我参考Camera做的,忘了return TRUE;才出这样的问题,是我太粗心了。
[/Quote]
没事,下次就不会犯同样的错误了,^_^。
宇帆 2010-11-18
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 licaiyuren 的回复:]

这样子啊,还是LZ为了方便看打印错误信息,才用的啊

长见识了,我之前自己编了一个小的驱动加载成功,初始化都OK,就是最后总是提示驱动卸载,
刚才看一下也是这个问题,没有返回ture......
[/Quote]
那是我粗心,返回return dwErr;
宇帆 2010-11-18
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 loongembedded 的回复:]

谢谢楼主的分享,不过正常的用法是
DWORD dwErr = ERROR_SUCCESS;

................
return TRUE;
_error_exit:
return dwErr;
[/Quote]

说的很正确,这个是我参考Camera做的,忘了return TRUE;才出这样的问题,是我太粗心了。
ele01 2010-11-17
  • 打赏
  • 举报
回复
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\ZLG]
"Dll"="ZLG.dll"
"Prefix"="ZLG"
"Index"=dword:1
"order"=dword:0


把order字段写的比IIC的order字段大,这里是确定加载顺序的。 如果ZLG比IIC先加载就会有问题。LZ可以试试
luixing67 2010-11-17
  • 打赏
  • 举报
回复
你估计是把ERROR_SUCCESS定义为0,Init函数是要返回TRUE的
试一下,直接return TRUE,不要return ERROR_SUCCESS
宇帆 2010-11-17
  • 打赏
  • 举报
回复
还是我在Init的时候,缺少点什么东西?

影响到驱动打不开的原因是初始化的么?
宇帆 2010-11-17
  • 打赏
  • 举报
回复

加载顺序是I2C-->Camera->ZLG
Camera中也有打开I2C驱动,但是我把Camera给去除了,ZLG也是打不开驱动

系统启动,Camera出来的信息:
CIS::CIS_Init()
CIS::Virtual_Alloc
interrupt g_CamSysIntr 26.
CIS::InitializeCriticalSection
CIS::CreateFile("I2C0")
CIS::DeviceIoControl
CAMERA.DLL::InterruptThread Initialized.
CAMERA: CIS_Open
CIS: IOCTL_POWER_CAPABILITIES
CAMERA: CIS_Open
CAMERA: CIS_Close


刚开始,DWORD dwErr = ERROR_SUCCESS;
如果打开I2C和DeviceIoControl出错,我就给dwErr = GetLastError();如果OK,返回ERROR_SUCCESS


根据打印信息
打开I2C和DeviceIoControl是OK的,下面两句话都打印出来了
RETAILMSG(1, (TEXT("ZLG::CreateFile(\"I2C0\") OK \r\n")));
RETAILMSG(1, (TEXT("ZLG::DeviceIoControl IOCTL_I2C_GET_FASTCALL OK \r\n")));

但是串口出来ZLG: DLL_PROCESS_DETACH 也挺奇怪的,怎么会执行这个呢?

PUBLIC BOOL WINAPI
DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
{
switch ( dwReason )
{
case DLL_PROCESS_ATTACH:
RETAILMSG(1, (TEXT("ZLG: DLL_PROCESS_ATTACH\r\n")));
DisableThreadLibraryCalls((HMODULE) hInstDll);
break;

case DLL_PROCESS_DETACH:
RETAILMSG(1, (TEXT("ZLG: DLL_PROCESS_DETACH\r\n")));
break;
}

return (TRUE);
}
luixing67 2010-11-17
  • 打赏
  • 举报
回复
你估计是把ERROR_SUCCESS定义为0,Init函数是要返回TRUE的
luixing67 2010-11-17
  • 打赏
  • 举报
回复
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

最后驱动为什么给卸载了。会不会DeviceIoControl IOCTL_I2C_GET_FASTCALL OK 这个之后遇到错误
luixing67 2010-11-17
  • 打赏
  • 举报
回复
1.加载顺序先,加载I2C,再加载ZLG7290
2.i2c是不是在被ZLG7290之前被别的驱动打开了,如CAMERA,
loongembedded 2010-11-17
  • 打赏
  • 举报
回复
谢谢楼主的分享,不过正常的用法是
DWORD dwErr = ERROR_SUCCESS;

................
return TRUE;
_error_exit:
return dwErr;
宇帆 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 loongembedded 的回复:]

1.更加串口信息应该ZLG.dll驱动是被成功加载了,但楼主还是到注册表的active中确认是否被成功加载了。
2.楼主调用CreateFile函数如果没有调用到ZLG_Open函数,应该还是传递给CreateFile函数的参数有问题。
[/Quote]

注册表确实加载成功了

CreateFile我的驱动,都是hFile=CreateFile(_T("ZLG1:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
这样写的,只是扁扁第一个参数,第一个参数是根据注册表得到的
"Prefix"="ZLG"
"Index"=dword:1

打开驱动的CreateFile应该没有错,因为我这个是从我以前独立的IIC驱动上面改过来的,应该还是哪里初始化不对。
licaiyuren 2010-11-17
  • 打赏
  • 举报
回复
这样子啊,还是LZ为了方便看打印错误信息,才用return dwErr;的啊

长见识了,我之前自己编了一个小的驱动加载成功,初始化都OK,就是最后总是提示驱动卸载,
刚才看一下也是这个问题,没有返回ture......
  • 打赏
  • 举报
回复
大牛们真牛
丰满 2010-11-17
  • 打赏
  • 举报
回复
嘿嘿,学习了,恭喜楼主,
宇帆 2010-11-17
  • 打赏
  • 举报
回复
是初始化的问题 对dwErr设定初值改成了DWORD dwErr = TRUE;
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;
}
宇帆 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 loongembedded 的回复:]

楼主ZLG驱动的导出文件(我猜测你这个文件的名字为)中有导出流接口函数吗?其中要包含ZLG_Open函数啊
[/Quote]
名字是ZLG.def 里面导出流接口函数

LIBRARY ZLG

EXPORTS ZLG_Init
ZLG_Deinit
ZLG_Open
ZLG_Close
ZLG_Read
ZLG_Write
ZLG_Seek
ZLG_IOControl
ZLG_PowerDown
ZLG_PowerUp
宇帆 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 luixing67 的回复:]

你估计是把ERROR_SUCCESS定义为0,Init函数是要返回TRUE的
试一下,直接return TRUE,不要return ERROR_SUCCESS
[/Quote]

真的是这里的问题,我改成return TRUE,就可以打开驱动了。
串口输出:
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

我在看看刚才为什么初始化函数会失败

多谢多谢
loongembedded 2010-11-17
  • 打赏
  • 举报
回复
楼主ZLG驱动的导出文件(我猜测你这个文件的名字为ZLG.def)中有导出流接口函数吗?其中要包含ZLG_Open函数啊
加载更多回复(4)

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧