⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch365dll.c

📁 PCI总线接口芯片CH365的应用层接口库
💻 C
📖 第 1 页 / 共 4 页
字号:
	if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
		return( TRUE );
	else return( FALSE );
}

BOOL	WINAPI	CH365mAbortWaitInt(  // 放弃等待中断
	ULONG			iIndex )  // 指定CH365设备序号
{
	ULONG			mLength;
	mWIN32_COMMAND	mCommand;
	mLength = sizeof( mWIN32_COMMAND );
	mCommand.mFunction = mFuncAbortWaitInter;  // 放弃等待中断
	mCommand.mAddress = NULL;
	mCommand.mLength = 0;
	if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
		return( TRUE );
	else return( FALSE );
}

BOOL	WINAPI	CH365mSetIntRoutine(  // 设定中断服务程序
	ULONG			iIndex,  // 指定CH365设备序号
	mPCH365_INT_ROUTINE	iIntRoutine )  // 指定中断服务程序,为NULL则取消中断服务,否则在中断时调用该程序
{
	HANDLE			mHandle = NULL;
	dllIntRoutine[ iIndex ] = NULL;
	while ( dllIntThreadId[ iIndex ] ) CH365mAbortWaitInt( iIndex );  // 放弃在此之前的等待中断,等待线程结束
	if ( iIntRoutine == NULL ) return( TRUE );  // 取消中断服务
	dllIntRoutine[ iIndex ] = iIntRoutine;
	mHandle = CreateThread( NULL, 0, dllInterruptThread, NULL, 0, & dllIntThreadId[ iIndex ] );  // 创建线程模拟中断事件
	if ( mHandle ) {  // 线程创建成功
		SetThreadPriority( mHandle, THREAD_PRIORITY_TIME_CRITICAL ); // 为了缩短中断服务程序响应时间,应该提高线程的优先级
		return ( TRUE );
	}
	else return ( FALSE );
}

BOOL	WINAPI	CH365mReadIntCommand(  // 读取中断命令缓冲区
	ULONG			iIndex,  // 指定CH365设备序号
	mPWIN32_COMMAND	oCommand,  // 指向一个足够大的缓冲区,用于保存读取的命令结构
	ULONG			iCmdIndex )  // 中断命令序号,为1或者2
{
	ULONG			mLength;
	mPWIN32_COMMAND	mCommand;
	mLength = mMAX_COMMAND_LENGTH;
	mCommand = LocalAlloc( LMEM_FIXED, mLength + mWIN32_COMMAND_HEAD );  // 分配内存
	if ( mCommand != NULL ) {
		mCommand -> mFunction = iCmdIndex == 1 ? mFuncReadBuffer1 : mFuncReadBuffer2;  // 读取指定的中断命令缓冲区
		mCommand -> mAddress = NULL;
		mCommand -> mLength = mLength;
		if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, mCommand, mLength + mWIN32_COMMAND_HEAD, mCommand, mLength + mWIN32_COMMAND_HEAD, &mLength, NULL ) ) {
			CopyMemory( oCommand, & mCommand -> mBuffer[0], mLength );  // 返回读取的中断命令
			LocalFree( mCommand );  // 释放内存
			return( TRUE );
		}
		LocalFree( mCommand );  // 释放内存
	}
	return( FALSE );
}

BOOL	WINAPI	CH365mWriteIntCommand(  // 写入中断命令缓冲区
	ULONG			iIndex,  // 指定CH365设备序号
	mPWIN32_COMMAND	iCommand,  // 指向作为中断命令的命令结构
	ULONG			iCmdIndex )  // 中断命令序号,为1或者2
{
	ULONG			mLength;
	mPWIN32_COMMAND	mCommand;
	mLength = min( mMAX_COMMAND_LENGTH, iCommand -> mLength + mWIN32_COMMAND_HEAD );
	mCommand = LocalAlloc( LMEM_FIXED, mLength + mWIN32_COMMAND_HEAD );  // 分配内存
	if ( mCommand != NULL ) {
		mCommand -> mFunction = iCmdIndex == 1 ? mFuncWriteBuffer1 : mFuncWriteBuffer2;  // 写入指定的中断命令缓冲区
		mCommand -> mAddress = NULL;
		mCommand -> mLength = mLength;
		CopyMemory( & mCommand -> mBuffer[0], iCommand, mLength );  // 将中断命令作为写入的数据
		if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, mCommand, mLength + mWIN32_COMMAND_HEAD, mCommand, mLength + mWIN32_COMMAND_HEAD, &mLength, NULL ) ) {
			LocalFree( mCommand );  // 释放内存
			return( TRUE );
		}
		LocalFree( mCommand );  // 释放内存
	}
	return( FALSE );
}

BOOL	WINAPI	CH365mReadIoByte(  // 从I/O端口读取一个字节
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iAddr,  // 指定I/O端口的地址
	PUCHAR			oByte )  // 指向一个字节单元,用于保存读取的字节数据
{
	PVOID			mAddress;
	ULONG			mLength;
	mWIN32_COMMAND	mCommand;
//	if ( iAddr >= (PVOID)dllIoBaseAddr[ iIndex ] ) mAddress = iAddr;  // 直接指定地址
	if ( iAddr >= (PVOID)0x0100 ) mAddress = iAddr;  // 本址定址功能的ISA兼容地址
	else mAddress = (PUCHAR)dllIoBaseAddr[ iIndex ] + (ULONG)iAddr;  // 只是指定偏移地址,要加上基址
	mLength = sizeof( mWIN32_COMMAND );
	mCommand.mFunction = mFuncReadIoByte;  // 以字节为单位读取I/O端口
	mCommand.mAddress = mAddress;
	mCommand.mLength = 1;
	if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) ) {
		*oByte = mCommand.mBuffer[0];  // 返回读取的字节数据
		return( TRUE );
	}
	else return( FALSE );
}

BOOL	WINAPI	CH365mReadIoWord(  // 从I/O端口读取一个字
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iAddr,  // 指定I/O端口的地址
	PUSHORT			oWord )  // 指向一个字单元,用于保存读取的字数据
{
	PVOID			mAddress;
	ULONG			mLength;
	mWIN32_COMMAND	mCommand;
//	if ( iAddr >= (PVOID)dllIoBaseAddr[ iIndex ] ) mAddress = iAddr;  // 直接指定地址
	if ( iAddr >= (PVOID)0x0100 ) mAddress = iAddr;  // 本址定址功能的ISA兼容地址
	else mAddress = (PUCHAR)dllIoBaseAddr[ iIndex ] + (ULONG)iAddr;  // 只是指定偏移地址,要加上基址
	mLength = sizeof( mWIN32_COMMAND );
	mCommand.mFunction = mFuncReadIoWord;  // 以字为单位读取I/O端口
	mCommand.mAddress = mAddress;
	mCommand.mLength = 2;
	if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) ) {
		*oWord = *(PUSHORT) & mCommand.mBuffer[0];  // 返回读取的字数据
		return( TRUE );
	}
	else return( FALSE );
}

BOOL	WINAPI	CH365mReadIoDword(  // 从I/O端口读取一个双字
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iAddr,  // 指定I/O端口的地址
	PULONG			oDword )  // 指向一个双字单元,用于保存读取的双字数据
{
	PVOID			mAddress;
	ULONG			mLength;
	mWIN32_COMMAND	mCommand;
	if ( iAddr >= (PVOID)dllIoBaseAddr[ iIndex ] ) mAddress = iAddr;  // 直接指定地址
	else mAddress = (PUCHAR)dllIoBaseAddr[ iIndex ] + (ULONG)iAddr;  // 只是指定偏移地址,要加上基址
	mLength = sizeof( mWIN32_COMMAND );
	mCommand.mFunction = mFuncReadIoDword;  // 以双字为单位读取I/O端口
	mCommand.mAddress = mAddress;
	mCommand.mLength = 4;
	if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) ) {
		*oDword = *(PULONG) & mCommand.mBuffer[0];  // 返回读取的双字数据
		return( TRUE );
	}
	else return( FALSE );
}

BOOL	WINAPI	CH365mWriteIoByte(  // 向I/O端口写入一个字节
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iAddr,  // 指定I/O端口的地址
	UCHAR			iByte )  // 待写入的字节数据
{
	PVOID			mAddress;
	ULONG			mLength;
	mWIN32_COMMAND	mCommand;
//	if ( iAddr >= (PVOID)dllIoBaseAddr[ iIndex ] ) mAddress = iAddr;  // 直接指定地址
	if ( iAddr >= (PVOID)0x0100 ) mAddress = iAddr;  // 本址定址功能的ISA兼容地址
	else mAddress = (PUCHAR)dllIoBaseAddr[ iIndex ] + (ULONG)iAddr;  // 只是指定偏移地址,要加上基址
	mLength = sizeof( mWIN32_COMMAND );
	mCommand.mFunction = mFuncWriteIoByte;  // 以字节为单位写入I/O端口
	mCommand.mAddress = mAddress;
	mCommand.mLength = 1;
	mCommand.mBuffer[0] = iByte;  // 待写入的字节数据
	if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
		return( TRUE );
	else return( FALSE );
}

BOOL	WINAPI	CH365mWriteIoWord(  // 向I/O端口写入一个字
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iAddr,  // 指定I/O端口的地址
	USHORT			iWord )  // 待写入的字数据
{
	PVOID			mAddress;
	ULONG			mLength;
	mWIN32_COMMAND	mCommand;
//	if ( iAddr >= (PVOID)dllIoBaseAddr[ iIndex ] ) mAddress = iAddr;  // 直接指定地址
	if ( iAddr >= (PVOID)0x0100 ) mAddress = iAddr;  // 本址定址功能的ISA兼容地址
	else mAddress = (PUCHAR)dllIoBaseAddr[ iIndex ] + (ULONG)iAddr;  // 只是指定偏移地址,要加上基址
	mLength = sizeof( mWIN32_COMMAND );
	mCommand.mFunction = mFuncWriteIoWord;  // 以字为单位写入I/O端口
	mCommand.mAddress = mAddress;
	mCommand.mLength = 2;
	*(PUSHORT) & mCommand.mBuffer[0] = iWord;  // 待写入的字数据
	if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
		return( TRUE );
	else return( FALSE );
}

BOOL	WINAPI	CH365mWriteIoDword(  // 向I/O端口写入一个双字
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iAddr,  // 指定I/O端口的地址
	ULONG			iDword )  // 待写入的双字数据
{
	PVOID			mAddress;
	ULONG			mLength;
	mWIN32_COMMAND	mCommand;
	if ( iAddr >= (PVOID)dllIoBaseAddr[ iIndex ] ) mAddress = iAddr;  // 直接指定地址
	else mAddress = (PUCHAR)dllIoBaseAddr[ iIndex ] + (ULONG)iAddr;  // 只是指定偏移地址,要加上基址
	mLength = sizeof( mWIN32_COMMAND );
	mCommand.mFunction = mFuncWriteIoDword;  // 以双字为单位写入I/O端口
	mCommand.mAddress = mAddress;
	mCommand.mLength = 4;
	*(PULONG) & mCommand.mBuffer[0] = iDword;  // 待写入的双字数据
	if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) )
		return( TRUE );
	else return( FALSE );
}

BOOL	WINAPI	CH365mReadMemByte(  // 从存储器读取一个字节
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iAddr,  // 指定存储器的地址,虚拟地址
	PUCHAR			oByte )  // 指向一个字节单元,用于保存读取的字节数据
{
	PVOID			mAddress;
	ULONG			mLength;
	mWIN32_COMMAND	mCommand;
	if ( iAddr >= (PVOID)dllMemBaseAddr[ iIndex ] ) mAddress = iAddr;  // 直接指定地址
	else mAddress = (PUCHAR)dllMemBaseAddr[ iIndex ] + (ULONG)iAddr;  // 只是指定偏移地址,要加上基址
	mLength = sizeof( mWIN32_COMMAND );
	mCommand.mFunction = mFuncReadMemByte;  // 以字节为单位读取存储器
	mCommand.mAddress = mAddress;
	mCommand.mLength = 1;
	if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) ) {
		*oByte = mCommand.mBuffer[0];  // 返回读取的字节数据
		return( TRUE );
	}
	else return( FALSE );
}

BOOL	WINAPI	CH365mReadMemDword(  // 从存储器读取一个双字
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iAddr,  // 指定存储器的地址,虚拟地址
	PULONG			oDword )  // 指向一个双字单元,用于保存读取的双字数据
{
	PVOID			mAddress;
	ULONG			mLength;
	mWIN32_COMMAND	mCommand;
	if ( iAddr >= (PVOID)dllMemBaseAddr[ iIndex ] ) mAddress = iAddr;  // 直接指定地址
	else mAddress = (PUCHAR)dllMemBaseAddr[ iIndex ] + (ULONG)iAddr;  // 只是指定偏移地址,要加上基址
	mLength = sizeof( mWIN32_COMMAND );
	mCommand.mFunction = mFuncReadMemDword;  // 以双字为单位读取存储器
	mCommand.mAddress = mAddress;
	mCommand.mLength = 4;
	if ( DeviceIoControl( dllHandle[ iIndex ], IOCTL_CH365_COMMAND, &mCommand, mLength, &mCommand, mLength, &mLength, NULL ) ) {
		*oDword = *(PULONG) & mCommand.mBuffer[0];  // 返回读取的双字数据
		return( TRUE );
	}
	else return( FALSE );
}

BOOL	WINAPI	CH365mWriteMemByte(  // 向存储器写入一个字节
	ULONG			iIndex,  // 指定CH365设备序号
	PVOID			iAddr,  // 指定存储器的地址,虚拟地址
	UCHAR			iByte )  // 待写入的字节数据

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -