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

📄 usbhost.c

📁 单片机读写U盘源码 基于51单片机和国产USB芯片CH374
💻 C
📖 第 1 页 / 共 3 页
字号:
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  HostCtrlTransfer374( PUINT8 ReqBuf, PUINT8 DatBuf, PUINT8 RetLen )
{
     UINT8 s;
     UINT8 len;
     UINT8 count;
     UINT8 total;
     
     mSaveDevEndpTog = 0x00 ; //初始化同步标志位
     Write374Block( RAM_HOST_TRAN, 8, ReqBuf );
     Write374Byte( REG_USB_LENGTH, 8 );
     mSetControlSetup( ) ;
     mDelayuS( 100 );
     s = HostTransactInter( ) ;    //SETUP 阶段,200ms超时
     if( s == USB_INT_SUCCESS )
     {
          total = *( ReqBuf + 6 );
          if ( total && DatBuf )   //需要收发数据
          {
               len = total;
               if( *ReqBuf & 0x80 )     //数据传输方向: IN
               {
                    mSaveDevEndpTog |= BIT_HOST_RECV_TOG ;  //IN端点的数据同步标志置位
                    while( len )
                    {
                         mSetControlIn( ) ;
                         mDelayuS( 100 );
                         s = HostTransactInter( ) ;
                         if( s != USB_INT_SUCCESS )
                              break;
                         count = Read374Byte( REG_USB_LENGTH );
                         Read374Block( RAM_HOST_RECV, count, DatBuf );
                         mSaveDevEndpTog ^= BIT_HOST_RECV_TOG ;  //IN端点的数据同步标志翻转
                         DatBuf += count;
                         if( count <= len )
                              len -= count;
                         else
                              len = 0;
                         if( count & ( UsbDevEndpSize - 1 ) )    //短包
                              break;
                    }
               }
               else                     //数据传输方向:  OUT
               { 
                    mSaveDevEndpTog |= BIT_HOST_TRAN_TOG ;  //OUT端点的数据同步标志置位
                    while( len )
                    {
                         count = len >= UsbDevEndpSize ? UsbDevEndpSize: len;
                         Write374Block( RAM_HOST_TRAN, count, DatBuf );
                         Write374Byte( REG_USB_LENGTH, count );
                         mSetControlOut( ) ;
                         mDelayuS( 100 );
                         s = HostTransactInter( ) ;
                         if( s != USB_INT_SUCCESS )
                              break;
                         DatBuf += count;
                         len -= count;
                         mSaveDevEndpTog ^= BIT_HOST_TRAN_TOG ;  //OUT端点的数据同步标志翻转
                    }
               }
               total -= len;       //减去乘余数据长度得实际长度
          }
          if( s == USB_INT_SUCCESS )//数据阶段成功
          {
               //STATUS阶段:OUT事务
               if ( mSaveUsbPid == DEF_USB_PID_IN )
               {
                    mSaveDevEndpTog |= BIT_HOST_TRAN_TOG ;  //OUT端点的数据同步标志置位
                    Write374Byte( REG_USB_LENGTH, 0 );
                    mSetControlOut( ) ;
                    mDelayuS( 100 );
                    s = HostTransactInter( ) ;     
               }
               ///STATUS阶段:IN事务
               else                         
               {
                    mSaveDevEndpTog |= BIT_HOST_RECV_TOG ;  //IN端点的数据同步标志置位
                    mSetControlIn( ) ;
                    s = HostTransactInter( ) ;              //STATUS阶段
                    if ( s == USB_INT_SUCCESS )             //检查IN状态返回数据长度
                    {
                         if( Read374Byte( REG_USB_LENGTH ) )
                              s = USB_INT_BUF_OVER;         //USB控制传输的数据太多, 缓冲区溢出
                    }
               }
          }
     }
     if( RetLen )
          *RetLen = total;    //实际成功收发的总长度
     return( s );
}

/*********************************************************************************************************
** 函数名称: GetDeviceDescr
** 功能描述: 获取设备描述符
**
** 输 入: buf: 指向存储传回描述符数据的数组首址
** 输 出: 
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8	 GetDeviceDescr( PUINT8 buf )           
{
	   UINT8	s ;
	   UINT8 len;
	   s = HostCtrlTransfer374( SetupGetDevDescr, buf, &len );  // 执行控制传输
	   if ( s == USB_INT_SUCCESS ) 
	   {
	        //端点0最大包长度,这是简化处理,正常应该先获取前8字节后立即更新UsbDevEndpSize再继续
		      UsbDevEndpSize = ( (PUSB_DEV_DESCR)buf ) -> bMaxPacketSize0;  
		      if ( len < ( (PUSB_SETUP_REQ)SetupGetDevDescr ) -> wLengthL )    // 描述符长度错误
		           s = USB_INT_BUF_OVER;    //USB_INT_BUF_OVER--USB控制传输的数据太多, 缓冲区溢出
	   } 
	   return( s );
}

/*********************************************************************************************************
** 函数名称: SetUsbAddress
** 功能描述: 设置USB设备地址
**
** 输 入: addr: 设备地址
** 输 出: 
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8	 SetUsbAddress( UINT8 addr )            
{
	   UINT8 s;
	   UINT8	BufSetAddr[ sizeof( SetupSetUsbAddr ) ] ;
	   memcpy ( BufSetAddr, SetupSetUsbAddr, sizeof( SetupSetUsbAddr ) );
	   ( (PUSB_SETUP_REQ)BufSetAddr ) -> wValueL = addr;      //USB设备地址
	   s = HostCtrlTransfer374( BufSetAddr, NULL, NULL );     //执行控制传输
	   if( s == USB_INT_SUCCESS ) 
	   {
		      SetHostUsbAddr( addr );            //设置USB主机当前操作的USB设备地址
	   }
	   mDelaymS( 3 );  //等待USB设备完成操作
	   return( s );
}

/*********************************************************************************************************
** 函数名称: GetConfigDescr
** 功能描述: 获取配置描述符
**
** 输 入: buf: 指向存储传回描述符数据的数组首址
** 输 出: 
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8	 GetConfigDescr( PUINT8 buf )           
{
	   UINT8 s ;
	   UINT8 len;
	   UINT8 BufLogDescr[ sizeof( SetupGetCfgDescr ) ] ;
	   s = HostCtrlTransfer374( SetupGetCfgDescr, buf, &len );     // 执行控制传输
	   if ( s == USB_INT_SUCCESS ) 
	   {
		      if( len < ( (PUSB_SETUP_REQ)SetupGetCfgDescr ) -> wLengthL )     //返回长度错误
		           s = USB_INT_BUF_OVER;  
		      else 
		      {
               memcpy ( BufLogDescr, SetupGetCfgDescr, sizeof( SetupGetCfgDescr ) );
               //完整配置描述符的总长度
			         ( (PUSB_SETUP_REQ)BufLogDescr ) -> wLengthL = ( (PUSB_CFG_DESCR)buf ) -> wTotalLengthL; 
			         s = HostCtrlTransfer374( BufLogDescr, buf, &len );          // 执行控制传输
			         if( s == USB_INT_SUCCESS ) 
			         {
				            if( len < ( (PUSB_CFG_DESCR)buf ) -> wTotalLengthL ) 
				                 s = USB_INT_BUF_OVER;              // 描述符长度错误
			         }
		      }
	   }
	   return( s );
}

/*********************************************************************************************************
** 函数名称: SetUsbConfig
** 功能描述: 设置USB设备配置
**
** 输 入: cfg: 设备配置值
** 输 出: 
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8 	SetUsbConfig( UINT8 cfg )              
{
	   UINT8 BufSetCfg[ sizeof( SetupSetUsbConfig ) ] ;
	   memcpy ( BufSetCfg, SetupSetUsbConfig, sizeof( SetupSetUsbConfig ) );
	   ( (PUSB_SETUP_REQ)BufSetCfg ) -> wValueL = cfg;             // USB设备配置
	   return( HostCtrlTransfer374( BufSetCfg, NULL, NULL ) );     // 执行控制传输
}

/*********************************************************************************************************
** 函数名称: mClearEndpStall
** 功能描述: 清除端点上的HALT特性
**
** 输 入: endp: 要操作的端点号
** 输 出: 
**         
** 全局变量: 无
** 调用模块: 无
** 调试码:   无
**  
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8  mClearEndpStall( UINT8 endp )
{
     UINT8  ReqBuf[ sizeof( SetupClrEndpStall ) ];
     memcpy( ReqBuf, SetupClrEndpStall, sizeof( SetupClrEndpStall ) ) ;
     ( ( PUSB_SETUP_REQ )ReqBuf ) -> wIndexL = endp ;
     //printf ( " 清除端点上的HALT特性 \n " ) ;
     return( HostCtrlTransfer374( ReqBuf, NULL, NULL ) ) ;
}

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

⌨️ 快捷键说明

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