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

📄 ch375chk.c

📁 CH375的源代码
💻 C
字号:
/* TC 2.0 */

#define		MY_CH375_IO_ADDR		0x0260		/* 假定I/O地址为260H,该值应该与CONFIG.SYS文件中指定的I/O地址相同 */
/*#define		MY_CARD_IS_SERIAL		1*/		/* 如果是串口连接请恢复此定义 */

#define		DELAY_PORT_ADDR		0x61			/* 用于读I/O模拟延时的I/O端口地址,如果存在冲突可以另选地址 */
/*#define		DELAY_PORT_ADDR		( MY_CH375_IO_ADDR + 2 )*/	/* 如果是并口连接并且译码提供状态端口那么请恢复此定义 */

unsigned short PortBaseAddr;					/* 全局变量,I/O端口地址 */
/* 对于并口连接为CH375并口硬件I/O端口地址,+0为数据端口,+1为命令端口; 对于串口连接为串口控制芯片16C550的I/O端口地址 */


/* I/O操作延时 */
void	DelayuS( unsigned short Delay )
{
	unsigned short c;
	c = Delay * 3;
	do {  /* 至少延时一个I/O操作 */
		inportb( DELAY_PORT_ADDR );  /* 通过读I/O端口模拟延时 */
	} while ( c -- );
}


#ifdef	MY_CARD_IS_SERIAL

/* 等待串口发送完成 */
void	SerialWaitSend( void )
{
	unsigned short i;
	unsigned char  d;
	for ( i = 0; i < 10000; i ++ ) {  /* 10000uS超时 */
		DelayuS( 1 );
		d = inportb( PortBaseAddr + 0x05 );  /* SERIAL_LSR */
		if ( ( d & 0x60 ) == 0x60 ) break;  /* SERIAL_LSR_THRE | SERIAL_LSR_TSRE */
	}
	DelayuS( 0 );
}

/* 清除串口已经接收的数据 */
void	SerialClearRecv( void )
{
	unsigned short i;
	for ( i = 0; i < 100; i ++ ) {
		inportb( PortBaseAddr + 0x05 );  /* SERIAL_LSR */
		DelayuS( 0 );
		inportb( PortBaseAddr + 0x00 );  /* SERIAL_DIO */
	}
	DelayuS( 0 );
}

/* 通过串口向CH375发出命令码 */
void	CH375WriteCmd( unsigned char cmd )
{
	SerialWaitSend( );  /* 等待之前的发送完成 */
	SerialClearRecv( );  /* 清除之前的接收 */
	outportb( PortBaseAddr + 0x03, 0x2B );  /* SERIAL_LCR, (8位数据,MARK,1位停止位) */
	DelayuS( 0 );
	outportb( PortBaseAddr + 0x00, cmd );  /* SERIAL_DIO */
	SerialWaitSend( );  /* 等待发送完成 */
	outportb( PortBaseAddr + 0x03, 0x3B );  /* SERIAL_LCR, (8位数据,SPACE,1位停止位) */
	DelayuS( 0 );
}

/* 通过串口向CH375发出数据 */
void	CH375WriteData( unsigned char dat )
{
	unsigned char  d;
	outportb( PortBaseAddr + 0x00, dat );  /* SERIAL_DIO */
	do {
		DelayuS( 0 );
		d = inportb( PortBaseAddr + 0x05 );  /* SERIAL_LSR */
	} while ( ( d & 0x20 ) == 0 );  /* SERIAL_LSR_THRE */
	DelayuS( 0 );
}

/* 通过串口从CH375接收数据 */
unsigned char	CH375ReadData( void )
{
	unsigned short i;
	unsigned char  d;
	for ( i = 0; i < 10000; i ++ ) {
		d = inportb( PortBaseAddr + 0x05 );  /* SERIAL_LSR */
		if ( d & 0x1F ) break;
	}
	if ( d & 0x01 ) {
		d = inportb( PortBaseAddr + 0x00 );  /* SERIAL_DIO */
		return( d );
	}
	else {
		DelayuS( 2000 );  /* 延时2mS */
		SerialClearRecv( );  /* 清除接收 */
		return( 0x80 );
	}
}

#else

/* 通过并口向CH375发出命令码 */
void	CH375WriteCmd( unsigned char cmd )
{
	DelayuS( 2 );
	outportb( PortBaseAddr + 1, cmd );  /* 写命令口 */
	DelayuS( 2 );
}

/* 通过并口向CH375发出数据 */
void	CH375WriteData( unsigned char dat )
{
	outportb( PortBaseAddr + 0, dat );  /* 写数据口 */
	DelayuS( 1 );
}

/* 通过并口从CH375接收数据 */
unsigned char	CH375ReadData( void )
{
	unsigned char d;
	DelayuS( 1 );
	d = inportb( PortBaseAddr + 0 );  /* 读数据口 */
	return( d );
}

#endif


/* 读CH375寄存器 */
unsigned char	CH375ReadReg( unsigned char RegAddr )
{
	unsigned char d;
/*	disable( ); 如果可能会在中断服务程序中读写U盘数据,那么必须关闭中断 */
	CH375WriteCmd( 0x0A );  /* 写命令口 */
	CH375WriteData( RegAddr );  /* 写数据口 */
	d = CH375ReadData( );  /* 读数据口 */
/*	enable( ); 恢复中断 */
	return( d );
}

/* 用途: 在DOS系统中检查CH375连接的U盘是否在线
   输入: PortBaseAddr 为CH375EDM的I/O基址, 如果是PCI总线, 那么参考CH365DOS.C获取I/O基址
   输出: 0 说明U盘已经断开, 1 说明U盘已经连接 */
unsigned char	IsDiskOnLine( void )
{
	unsigned char status;
	status = CH375ReadReg( 0x20 );
	return( ( status & 0x20 ) ? 1 : 0 );  /* 判断CH375内部寄存器的状态 */
}

/* 用途: 在DOS系统中获取CH375连接的U盘的实际盘符
   输入: PortBaseAddr 为CH375EDM的I/O基址, 如果是PCI总线, 那么参考CH365DOS.C获取I/O基址
   输出: U盘对应的盘符, 有效值为字母A到Z, 由DOS系统自动分配, 通过执行DOS命令SUBST还可以将其指定为A盘等 */
unsigned char	GetDiskName( void )
{
	unsigned char drive;
	drive = CH375ReadReg( 0x3E );
	if ( drive < 'A' || drive > 'Z' ) return( 0 );  /* 盘符无效,请检查CH375硬件是否正常工作 */
	return( drive );  /* 返回盘符 */
}

main( ) {
	int i, last;
	PortBaseAddr = MY_CH375_IO_ADDR;
	i = GetDiskName( );
	if ( i ) {
		printf( "Disk name is %c:\n", i );
		printf( "DiskOnline now ? \n" );
		last = 0;
		for ( i = 0; i < 10000; i ++ ) {
			if ( kbhit( ) ) break;
			if ( IsDiskOnLine( ) ) {  /* U盘连接 */
				if ( last == 0 ) printf( "Disk_In\n" );
				last = 1;
			}
			else {  /* U盘断开 */
				if ( last == 1 ) printf( "Disk_Out\n" );
				last = 0;
			}
			sleep( 1 );  /* 仅作演示, 等待1秒后再查询 */
		}
	}
	else printf( "Please check CH375 hardware\n" );
}

⌨️ 快捷键说明

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