本人也是刚开始涉及wince 6.0的驱动程序没经验,调试官方提供的IIC驱动花去了2天的时间。
在此总结一下希望遇到同样问题的朋友能借鉴一下相互交流经验。
最主要的问题是读写数据出错,其实网上的其他网友也有提出解决方案比如定义一个全局数据缓存提供给IST线程存数据,但如果收发数据多的话还是会错,没有从根本上解决问题。
驱动数据出错的原因是由IIC_IOControl调用HW_Write和HW_Read时传递的IIC_IO_DESC结构体里面的缓冲区数据指针Data引起的,该地址是应用程序传递进来的不属于内核模式地址空间,必须对缓冲区列集。在DeviceIoControl调用中,参数pBufIn和pBufOut所指向的缓冲区都自动的被Windows CE 所列集,但同时所有在结构体中传递给驱动程序的缓冲区指针,则必须被驱动程序所列集。
其实代码本身是没问题的只是它不支持应用程序调用,是给其他驱动程序调用的。因为在IIC_IOControl前面添加了个判断
if (GetDirectCallerProcessId() != GetCurrentProcessId()){ return FALSE; }
如果要在应用程序中调用该驱动必须先去掉这段代码。
回到刚才的缓冲区列集也叫内存地址重建。可以使用的函数如下:HRESULT CeOpenCallerBuffer( PVOID * ppDestMarshalled, PVOID pSrcUnmarshalled, DWORD cbSrc, DWORD ArgumentDescriptor BOOL ForceDuplicate ); HRESULT CeAllocAsynchronousBuffer( PVOID * ppDestAsyncMarshalled, PVOID pSrcSyncMarshalled, DWORD cbSrc, DWORD ArgumentDescriptor ); HRESULT CeFreeAsynchronousBuffer( PVOID pDestAsyncMarshalled, PVOID pSrcSyncMarshalled, DWORD cbSrc, DWORD ArgumentDescriptor ); HRESULT CeCloseCallerBuffer( PVOID pDestMarshalled, PVOID pSrcUnmarshalled, DWORD cbSrc, DWORD ArgumentDescriptor );
以上函数的用法说明请参考MSDN。
最后附上修改过的可用IIC驱动源码和测试程序。
调试 S3C6410 IIC 的wince驱动总结
最新推荐文章于 2022-02-23 15:02:25 发布