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

📄 bulkonly.c

📁 单片机读写U盘源码 基于51单片机和国产USB芯片CH374
💻 C
📖 第 1 页 / 共 2 页
字号:
     //确认Meaningful
     if ( mBOC.mCSW.mCSW_Status >= 2 && DataLength >= mBOC.mCSW.mCSW_Residue )
     {
          printf( " 收到的CSW: NON-Meaningful\n " ) ;
          return( mResetErrorBOC( USB_INT_DISK_ERR ) ) ;
     }
     else  if ( mBOC.mCSW.mCSW_Status == 0 )
          return( USB_INT_SUCCESS );
     else
     {
          printf( " 未知的Bulkonly传输错误,发生在CSW,该错误可能为CMD命令错误\n " ) ;
          return( USB_INT_DISK_ERR ) ;       //磁盘操作错误
     }
}

/*********************************************************************************************************
** 函数名称: mDiskInquiry
** 功能描述: 获取磁盘特性
**
** 输 入: DataBuf: 指向数据缓冲区
** 输 出: 
**         
** 全局变量: 无
** 调用模块: mBulkOnlyCmd
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  mDiskInquiry( PUINT8 DataBuf )
{
     mBOC.mCBW.mCBW_DataLen = 0x00000024 ;
     mBOC.mCBW.mCBW_Flag = 0x80 ;
     mBOC.mCBW.mCBW_CB_Len = 12 ;
     mBOC.mCBW.mCBW_CB_BUF[ 0 ] = 0x12 ;          //命令码  Operation Code
     mBOC.mCBW.mCBW_CB_BUF[ 1 ] = 0x00 ;          //Logical:Unit Number + Reserved + EVPD( Enable Vital Product Data )
     mBOC.mCBW.mCBW_CB_BUF[ 2 ] = 0x00 ;          //Page Code:The UFI device supports only Page Code zero,Standard Inquiry Data.
     mBOC.mCBW.mCBW_CB_BUF[ 3 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 4 ] = 0x24 ;          //Allocation Length
     mBOC.mCBW.mCBW_CB_BUF[ 5 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 6 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 7 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 8 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 9 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 10 ]= 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 11 ]= 0x00 ;          //Reserved
     return( mBulkOnlyCmd( DataBuf ) ) ;          //执行基于Bulk-only协议的命令 
}

/*********************************************************************************************************
** 函数名称: Read Capacity
** 功能描述: 获取磁盘容量
**
** 输 入: DataBuf: 指向数据缓冲区
** 输 出: 要求设备返回当前容量
**         
** 全局变量: 无
** 调用模块: mBulkOnlyCmd
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  mDiskCapacity( PUINT8 DataBuf )
{
     mBOC.mCBW.mCBW_DataLen = 0x00000008 ;
     mBOC.mCBW.mCBW_Flag = 0x80 ;
     mBOC.mCBW.mCBW_CB_Len = 12 ;
     mBOC.mCBW.mCBW_CB_BUF[ 0 ] = 0x25 ;          //命令码  Operation Code
     mBOC.mCBW.mCBW_CB_BUF[ 1 ] = 0x00 ;          //Logical:Unit Number + Reserved + RelAdr
     mBOC.mCBW.mCBW_CB_BUF[ 2 ] = 0x00 ;          //Logical Block Address( MSB )  -- Should be set to zero.
     mBOC.mCBW.mCBW_CB_BUF[ 3 ] = 0x00 ;          //Logical Block Address
     mBOC.mCBW.mCBW_CB_BUF[ 4 ] = 0x00 ;          //Logical Block Address
     mBOC.mCBW.mCBW_CB_BUF[ 5 ] = 0x00 ;          //Logical Block Address( LSB )
     mBOC.mCBW.mCBW_CB_BUF[ 6 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 7 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 8 ] = 0x00 ;          //Reserved + PMI
     mBOC.mCBW.mCBW_CB_BUF[ 9 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 10 ]= 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 11 ]= 0x00 ;          //Reserved
     return( mBulkOnlyCmd( DataBuf ) ) ;          //执行基于Bulk-only协议的命令 
}

/*********************************************************************************************************
** 函数名称: Test Unit Ready
** 功能描述: 测试磁盘是否就绪
**
** 输 入: DataBuf: 指向数据缓冲区
** 输 出: 请求设备报告是否处于Ready状态
**         
** 全局变量: 无
** 调用模块: mBulkOnlyCmd
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  mDiskTestReady( void )
{
     mBOC.mCBW.mCBW_DataLen = 0 ;
     mBOC.mCBW.mCBW_Flag = 0x00 ;
     mBOC.mCBW.mCBW_CB_Len = 12 ;
     mBOC.mCBW.mCBW_CB_BUF[ 0 ] = 0x00 ;          //命令码  Operation Code
     mBOC.mCBW.mCBW_CB_BUF[ 1 ] = 0x00 ;          //Logical:Unit Number + Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 2 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 3 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 4 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 5 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 5 ] = 0x00 ;          //Logical Block Address( LSB )
     mBOC.mCBW.mCBW_CB_BUF[ 6 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 7 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 8 ] = 0x00 ;          //Reserved 
     mBOC.mCBW.mCBW_CB_BUF[ 9 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 10 ]= 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 11 ]= 0x00 ;          //Reserved
     return( mBulkOnlyCmd( NULL ) ) ;             //执行基于Bulk-only协议的命令 
}


/*********************************************************************************************************
** 函数名称: Request Sense
** 功能描述: 检查磁盘错误状态
**
** 输 入: DataBuf: 指向数据缓冲区
** 输 出: 请求设备向主机返回执行结果
**         
** 全局变量: 无
** 调用模块: mBulkOnlyCmd
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  mRequestSense( void )
{
     UINT8  i ;
     UINT8  s ;
     UINT8  buf[ 18 ];

     mDelaymS( 20 );
     mBOC.mCBW.mCBW_DataLen = 0x00000012 ;
     mBOC.mCBW.mCBW_Flag = 0x80 ;
     mBOC.mCBW.mCBW_CB_Len = 12 ;
     mBOC.mCBW.mCBW_CB_BUF[ 0 ] = 0x03 ;          //命令码  Operation Code
     mBOC.mCBW.mCBW_CB_BUF[ 1 ] = 0x00 ;          //Logical:Unit Number + Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 2 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 3 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 4 ] = 0x12 ;          //Allocation Length
     mBOC.mCBW.mCBW_CB_BUF[ 5 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 6 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 7 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 8 ] = 0x00 ;          //Reserved 
     mBOC.mCBW.mCBW_CB_BUF[ 9 ] = 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 10 ]= 0x00 ;          //Reserved
     mBOC.mCBW.mCBW_CB_BUF[ 11 ]= 0x00 ;          //Reserved
     s = ( mBulkOnlyCmd( buf ) ) ;                //执行基于Bulk-only协议的命令
     printf( " The Sense Data is : " ) ;
     for ( i = 0; i < 0x12; i ++ )
     {
          printf( "%x\n", ( UINT16 )buf[ i ] ) ;
     }
     return( s );
}

/*********************************************************************************************************
** 函数名称: mReadSector  Read( 10 )
** 功能描述: 以扇区为单位从磁盘读取数据
**
** 输 入: StartLba:  操作的起始扇区号
**         SectCount: 扇区数量
**         DataBuf:   指向数据缓冲区  
** 输 出: 请求设备向主机返回执行结果
**         
** 全局变量: 无
** 调用模块: mBulkOnlyCmd
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  mReadSector( UINT32 StartLba, UINT8 SectCount, PUINT8 DataBuf )
{
     UINT32 len;
     len = ( UINT32 )SectCount << 9 ;

     mBOC.mCBW.mCBW_DataLen = len ;
     
     mBOC.mCBW.mCBW_Flag = 0x80 ;
     mBOC.mCBW.mCBW_CB_Len = 10 ;
     mBOC.mCBW.mCBW_CB_BUF[ 0 ] = 0x28 ;     //命令码
     mBOC.mCBW.mCBW_CB_BUF[ 1 ] = 0x00 ;
     mBOC.mCBW.mCBW_CB_BUF[ 2 ] = ( UINT8 )( StartLba >> 24 ) ;
     mBOC.mCBW.mCBW_CB_BUF[ 3 ] = ( UINT8 )( StartLba >> 16 ) ;
     mBOC.mCBW.mCBW_CB_BUF[ 4 ] = ( UINT8 )( StartLba >> 8  ) ;
     mBOC.mCBW.mCBW_CB_BUF[ 5 ] = ( UINT8 )(    StartLba    ) ;
     mBOC.mCBW.mCBW_CB_BUF[ 6 ] = 0x00 ;
     mBOC.mCBW.mCBW_CB_BUF[ 7 ] = 0x00 ;
     mBOC.mCBW.mCBW_CB_BUF[ 8 ] = SectCount ;
     mBOC.mCBW.mCBW_CB_BUF[ 9 ] = 0x00 ;
     return( mBulkOnlyCmd( DataBuf ) ) ;          //执行基于Bulk-only协议的命令 
}

/*********************************************************************************************************
** 函数名称: mWriteSector Write( 10 )
** 功能描述: 以扇区为单位将数据写入磁盘
**
** 输 入: StartLba:  操作的起始扇区号
**         SectCount: 扇区数量
**         DataBuf:   指向数据缓冲区  
** 输 出: 请求设备向主机返回执行结果
**         
** 全局变量: 无
** 调用模块: mBulkOnlyCmd
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  mWriteSector( UINT32 StartLba, UINT8 SectCount, PUINT8 DataBuf )
{
     UINT32 len;
     len = ( UINT32 )SectCount << 9 ;
     mBOC.mCBW.mCBW_DataLen = len ;
     
     mBOC.mCBW.mCBW_Flag = 0x00 ;
     mBOC.mCBW.mCBW_CB_Len = 10 ;
     mBOC.mCBW.mCBW_CB_BUF[ 0 ] = 0x2A ;     //命令码
     mBOC.mCBW.mCBW_CB_BUF[ 1 ] = 0x00 ;
     mBOC.mCBW.mCBW_CB_BUF[ 2 ] = ( UINT8 )( StartLba >> 24 ) ;
     mBOC.mCBW.mCBW_CB_BUF[ 3 ] = ( UINT8 )( StartLba >> 16 ) ;
     mBOC.mCBW.mCBW_CB_BUF[ 4 ] = ( UINT8 )( StartLba >> 8  ) ;
     mBOC.mCBW.mCBW_CB_BUF[ 5 ] = ( UINT8 )(    StartLba    ) ;
     mBOC.mCBW.mCBW_CB_BUF[ 6 ] = 0x00 ;
     mBOC.mCBW.mCBW_CB_BUF[ 7 ] = 0x00 ;
     mBOC.mCBW.mCBW_CB_BUF[ 8 ] = SectCount ;
     mBOC.mCBW.mCBW_CB_BUF[ 9 ] = 0x00 ;
     return( mBulkOnlyCmd( DataBuf ) ) ;          //执行基于Bulk-only协议的命令 
}

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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