?? usbhost.c
字號:
** 日 期: 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 + -