📄 main.c
字号:
/****************************************Copyright (c)**************************************************
** CH374做主机操作U盘读写程序
**
** 主函数
**
** VBeat 0.1
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: Main.C
**创 建 人: 徐亦朱
**最后修改日期: 2007年9月24日
**描 述: A.使用CH374作USB主机
** B.Bulkonly传输方式与大容量存储设备通信
** C.支持部分常用的UFI命令集
** D.目前支持FAT16格式操作
** E.速度有待进一步改进
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 徐亦朱
** 版 本: VBeat 0.1
** 日 期: 2007年9月24日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007年9月24日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include <stdio.h>
#include <string.h>
#include "Main.H"
/*********************************************************************************************************
** 函数名称: main
** 功能描述: 主函数
**
** 输 入:
** 输 出:
**
** 全局变量: 无
** 调用模块: 无
** 调试码: 无
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int main( void )
{
UINT8 i ;
UINT8 s ;
UINT8 idata buf[ 64 ] ;
mDelaymS( 50 ); //等待CH374复位完成
CH374_PORT_INIT( ); //CH374接口初始化
mInitSTDIO( ); //为了让计算机通过串口监控演示过程
printf( "Start CH374 Host\n" );
Init374Host( ); //初始化USB主机
while( 1 )
{
HostSetBusFree( ); //设定USB主机空闲
printf( "Wait Device In\n" );
while( 1 )
{
if ( Query374Interrupt( ) ) //如果有USB主机中断则处理
HostDetectInterrupt( ); //处理USB插拔事件中断
if ( Query374DeviceIn( ) ) //有USB设备,实际上是在查中断寄存器中BIT_IF_DEV_ATTACH
break;
}
mDelaymS( 250 ); //由于USB设备刚插入尚未稳定,故等待USB设备数百ms,消除插拔抖动
if ( Query374Interrupt( ) ) //如果有USB主机中断则处理
HostDetectInterrupt( );
printf( "Reset Device\n" );
HostSetBusReset( ); //总线复位
for ( i = 0; i < 100; i ++ ) // 等待USB设备复位后重新连接
{
if ( Query374DeviceIn( ) )
break;
mDelaymS( 1 );
}
if ( Query374Interrupt( ) ) //如果有USB主机中断则处理
HostDetectInterrupt( );
if ( Query374DeviceIn( ) ) //如果有USB设备
{
if ( Query374DevFullSpeed( ) )
{
printf( "Start Full-Speed Device\n" );
HostSetFullSpeed( ); //设定全速USB设备运行环境
}
else
{
printf( "Start Low-Speed Device\n" );
HostSetLowSpeed( ); //设定低速USB设备运行环境
}
}
else
{
printf( "Device gone !\n" );
continue; // 设备已经断开,继续等待
}
mDelaymS( 20 );
printf( "GetDeviceDescr: " );
s = GetDeviceDescr( buf ); // 获取设备描述符
if ( s != USB_INT_SUCCESS )
{
printf( "ERROR = %02X\n", (UINT16)s );
goto WaitDeviceOut; // 终止操作,等待USB设备拔出
}
for ( i = 0; i < ( (PUSB_SETUP_REQ)SetupGetDevDescr ) -> wLengthL; i ++ )
printf( "%02X ", (UINT16)( buf[ i ] ) );
printf( "\n" );
printf( "SetUsbAddress: " );
s = SetUsbAddress( 0x02 ); // 设置USB设备地址
if( s != USB_INT_SUCCESS )
{
printf( "ERROR = %02X\n", (UINT16)s );
goto WaitDeviceOut; // 终止操作,等待USB设备拔出
}
printf( "\n" );
printf( "GetConfigDescr: " );
s = GetConfigDescr( buf ); // 获取配置描述符
if ( s != USB_INT_SUCCESS )
{
printf( "ERROR = %02X\n", (UINT16)s );
goto WaitDeviceOut; // 终止操作,等待USB设备拔出
}
for ( i = 0; i < ( (PUSB_SETUP_REQ)SetupGetDevDescr ) -> wLengthL; i ++ )
printf( "%02X ", (UINT16)( buf[i] ) );
printf( "\n" );
//分析配置描述符
//获取端点数据/各端点地址/各端点大小等
//更新变量endp_addr和endp_size等
if ( ( ( PUSB_CFG_DESCR_LONG )buf ) -> itf_descr.bInterfaceClass != 0x08 )
goto WaitDeviceOut; // 终止操作,等待USB设备拔出
mDiskInterfNumber = ( ( PUSB_CFG_DESCR_LONG ) buf ) -> itf_descr.bInterfaceNumber;
mDiskBulkInEndp = 0;
mDiskBulkOutEndp = 0;
for ( i =0; i < 2; i ++ ) //分析前两个端点
{
if ( ( (PUSB_CFG_DESCR_LONG)buf ) -> endp_descr[ i ].wMaxPacketSize == 64 && ( (PUSB_CFG_DESCR_LONG)buf ) -> endp_descr[ i ].bmAttributes == 2 )
{
if ( ( ( PUSB_CFG_DESCR_LONG )buf ) -> endp_descr[ i ].bEndpointAddress & 0x80 )
//IN端点
mDiskBulkInEndp = ( ( PUSB_CFG_DESCR_LONG )buf ) -> endp_descr[ i ].bEndpointAddress & 0x0F ;
else
//OUT端点
mDiskBulkOutEndp = ( ( PUSB_CFG_DESCR_LONG )buf ) -> endp_descr[ i ].bEndpointAddress & 0x0F ;
}
}
//不是USB存储类设备,不支持
if ( ( ( PUSB_CFG_DESCR_LONG )buf ) -> itf_descr.bInterfaceClass != 0x08 || mDiskBulkInEndp == 0 || mDiskBulkOutEndp == 0 )
{
printf( " Not USB Mass Storage Device\n " );
goto WaitDeviceOut; // 终止操作,等待USB设备拔出
}
printf( "SetUsbConfig: " );
s = SetUsbConfig( ( (PUSB_CFG_DESCR)buf ) -> bConfigurationValue ); // 设置USB设备配置
if( s != USB_INT_SUCCESS )
{
printf( "ERROR = %02X\n", (UINT16)s );
goto WaitDeviceOut; // 终止操作,等待USB设备拔出
}
printf( "\n" );
mSaveDevEndpTog = 0x00; //清同步标志
printf( " Disk Inquiry : \n" );
s = mDiskInquiry( buf ); //获取磁盘特性
if ( s != USB_INT_SUCCESS )
{
printf( " ERROR = %02X \n ", (UINT16)s );
goto WaitDeviceOut; //终止操作,等待USB设备拔出
}
for ( i = 0; i < 8; i ++ )
printf( " %02X \n ", ( UINT16 ) ( buf[ i ] ) );
printf( " , " );
for ( i = 8; i < 36; i ++ )
printf( "%c", buf[ i ] );
printf( "\n" );
/*
s = mRequestSense( ) ;
printf( " ERROR = %02X \n ", ( UINT16 )s );
*//*
for ( i = 0; i < 5; i ++ )
{
mDelaymS( 100 );
printf( " Disk Capacity " );
s = mDiskCapacity( buf ); //获取磁盘容量
if ( s != USB_INT_SUCCESS )
{
printf( " ERROR = %02X \n ", ( UINT16 )s );
//mRequestSense( );
}
else
{
for ( i = 0; i < 8; i ++ )
printf( " %2X ", ( UINT16 ) ( buf[ i ] ) );
printf( " , %3d MB \n ", ( UINT16 )( ( ( ( ( UINT32 )( buf[ 0 ] ) << 24 ) | ( UINT32 )( buf[ 1 ] ) << 16 | ( UINT16 ) ( buf[ 2 ] ) << 8 | ( UINT16 ) buf[ 3 ] ) + 1 ) << 11 ) ) ;
break;
}
}
*/
printf( " Disk Ready : " );
s = mDiskTestReady( ) ; //测试磁盘是否就绪
if ( s != USB_INT_SUCCESS )
{
printf( " ERROR = %02X \n ", ( UINT16 )s );
}
else
printf( " \n " );
s = FATInit( ) ;
if ( s != InitSuccess )
{
printf( " The Init Process Has A BIG WRONG: " ) ;
printf( " ERROR = %02X \n ", ( UINT16 )s );
goto WaitDeviceOut; //终止操作,等待USB设备拔出
}
s = FATCopy( "/XUYIZHU.C", "/CH375/1.TXT" );
if ( s != CopySuccess )
{
printf( " The Copy Process Has A BIG WRONG: " ) ;
printf( " ERROR = %02X \n ", ( UINT16 )s );
goto WaitDeviceOut; //终止操作,等待USB设备拔出
}
s = FATOpen( "/X", ModeC1 ) ;
if ( s != OpenSuccess )
{
printf( " The Open Process Has A BIG WRONG: " ) ;
printf( " ERROR = %02X \n ", ( UINT16 )s );
goto WaitDeviceOut; //终止操作,等待USB设备拔出
}
s = FATOpen( "/X/Y", ModeC1 ) ;
if ( s != OpenSuccess )
{
printf( " The Open Process Has A BIG WRONG: " ) ;
printf( " ERROR = %02X \n ", ( UINT16 )s );
goto WaitDeviceOut; //终止操作,等待USB设备拔出
}
s = FATOpen( "/X/Y/Z", ModeC1 ) ;
if ( s != OpenSuccess )
{
printf( " The Open Process Has A BIG WRONG: " ) ;
printf( " ERROR = %02X \n ", ( UINT16 )s );
goto WaitDeviceOut; //终止操作,等待USB设备拔出
}
s = FATCopy( "/X/Y/Z/XU.H", "/CH375/1.TXT" );
if ( s != CopySuccess )
{
printf( " The Copy Process Has A BIG WRONG: " ) ;
printf( " ERROR = %02X \n ", ( UINT16 )s );
goto WaitDeviceOut; //终止操作,等待USB设备拔出
}
s = FATOpen( "/CH375/1.TXT", ModeC2 ) ;
if ( s != OpenSuccess )
{
printf( " The Open Process Has A BIG WRONG: " ) ;
printf( " ERROR = %02X \n ", ( UINT16 )s );
goto WaitDeviceOut; //终止操作,等待USB设备拔出
}
WaitDeviceOut: // 等待USB设备拔出
printf( "Wait Device Out\n" );
while( 1 )
{
if( Query374Interrupt( ) ) //如果有USB主机中断则处理
HostDetectInterrupt( );
if( Query374DeviceIn( ) == FALSE ) //没有USB设备
break;
}
mDelaymS( 100 ); //等待设备完全断开,消除插拔抖动
if( Query374DeviceIn( ) )
goto WaitDeviceOut; //没有完全断开
//HostSetBusFree( ); //设定USB主机空闲,主要目的是关闭SOF
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -