?? usbhost.c
字號:
/*********************************************************************************************************
** 函數名稱: mSetControlIn
** 功能描述: 設置默認控制數據輸入
**
** 輸 入:
** 輸 出:
**
** 全局變量: 無
** 調用模塊: 無
** 調試碼: 無
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void mSetControlIn( void )
{
mSaveUsbPid = DEF_USB_PID_IN ;
Write374Byte( REG_USB_H_PID, M_MK_HOST_PID_ENDP( DEF_USB_PID_IN, mDiskDefaultEndp ) ) ;
Write374Byte( REG_USB_H_CTRL, mSaveDevEndpTog | BIT_HOST_START );
}
/*********************************************************************************************************
** 函數名稱: mSetControlOut
** 功能描述: 設置默認控制數據輸出
**
** 輸 入:
** 輸 出:
**
** 全局變量: 無
** 調用模塊: 無
** 調試碼: 無
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void mSetControlOut( void )
{
mSaveUsbPid = DEF_USB_PID_OUT ;
Write374Byte( REG_USB_H_PID, M_MK_HOST_PID_ENDP( DEF_USB_PID_OUT, mDiskDefaultEndp ) );
Write374Byte( REG_USB_H_CTRL, mSaveDevEndpTog | BIT_HOST_START );
}
/*********************************************************************************************************
** 函數名稱: mSetBulkIn
** 功能描述: 設置批量數據輸入
**
** 輸 入:
** 輸 出:
**
** 全局變量: 無
** 調用模塊: 無
** 調試碼: 無
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void mSetBulkIn( void )
{
mSaveUsbPid = DEF_USB_PID_IN ;
Write374Byte( REG_USB_H_PID, M_MK_HOST_PID_ENDP( DEF_USB_PID_IN, mDiskBulkInEndp ) ) ;
Write374Byte( REG_USB_H_CTRL, mSaveDevEndpTog | BIT_HOST_START );
}
/*********************************************************************************************************
** 函數名稱: mSetBulkOut
** 功能描述: 設置批量數據輸出
**
** 輸 入:
** 輸 出:
**
** 全局變量: 無
** 調用模塊: 無
** 調試碼: 無
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void mSetBulkOut( void )
{
mSaveUsbPid = DEF_USB_PID_OUT ;
Write374Byte( REG_USB_H_PID, M_MK_HOST_PID_ENDP( DEF_USB_PID_OUT, mDiskBulkOutEndp ) );
Write374Byte( REG_USB_H_CTRL, mSaveDevEndpTog | BIT_HOST_START );
}
/*********************************************************************************************************
** 函數名稱: HostTransactInter
** 功能描述: CH374傳輸事務
** 需預先輸入mSaveUsbPid,PID令牌+目的端點地址,同步標志
** NAK重試,超時出錯重試
** 輸 入:
** 輸 出: 返回同CH375
**
** 全局變量: 無
** 調用模塊: 無
** 調試碼: 無
**
**
** 作 者: 徐亦朱
** 日 期: 2007年9月24日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
UINT8 HostTransactInter( void )
{
UINT8 retry;
UINT8 s;
UINT8 r;
UINT8 u;
for ( retry = 3; retry != 0; retry -- )
{
s = Wait374Interrupt( ) ;
if ( s == ERR_USB_UNKNOWN ) //中斷超時,可能是硬件異常,返回錯誤值
return( s );
s = Read374Byte( REG_INTER_FLAG );
if ( s & BIT_IF_DEV_DETECT ) //USB設備插拔事件
{
mDelayuS( 200 ); // 等待傳輸完成
Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_DEV_DETECT | BIT_IF_TRANSFER ); // 清中斷標志
if ( s & BIT_IF_DEV_ATTACH ) //USB設備的當前連接狀態:1 = 已經連接/插入
{
u = Read374Byte( REG_USB_SETUP );
if( s & BIT_IF_USB_DX_IN ) //速度匹配,不需要切換速度
{
if ( u & BIT_SETP_USB_SPEED ) //低速USB設備
return( USB_INT_CONNECT_LS );
return( USB_INT_CONNECT ); // 全速USB設備
}
else //速度失配,需要切換速度
{
if ( u & BIT_SETP_USB_SPEED )
return( USB_INT_CONNECT ); // 全速USB設備
return( USB_INT_CONNECT_LS ); // 低速USB設備
}
}
else
return( USB_INT_DISCONNECT ); // USB設備斷開事件
}
else if ( s & BIT_IF_TRANSFER ) //傳輸完成
{
//mDelayuS( 200 ); // 等待傳輸完成
#ifdef DEBUG_NOW
printf( " 傳輸完成中斷.\n " ) ;
#endif
Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_TRANSFER ); // 清中斷標志
s = Read374Byte( REG_USB_STATUS ); // USB狀態
r = s & BIT_STAT_DEV_RESP; // USB設備應答狀態
if ( mSaveUsbPid == DEF_USB_PID_IN ) //IN事務
{
#ifdef DEBUG_NOW
printf ( " The PID is IN \n " ) ;
#endif
if ( M_IS_HOST_IN_DATA( s ) ) //DEF_USB_PID_DATA0 or DEF_USB_PID_DATA1
{
if ( s & BIT_STAT_TOG_MATCH )
{
#ifdef DEBUG_NOW
printf( " The In_PID's Hand is Right \n " ) ;
#endif
return( USB_INT_SUCCESS );
}
goto mHostTransRetry; //不同步則需丟棄后重試
}
}
else if ( mSaveUsbPid == DEF_USB_PID_OUT ) //OUT事務
{
#ifdef DEBUG_NOW
printf ( " The PID is OUT \n " ) ;
#endif
if ( r == DEF_USB_PID_ACK )
{
#ifdef DEBUG_NOW
printf( " The OUT_PID's Hand is ACK \n " ) ;
#endif
return( USB_INT_SUCCESS ) ;
}
}
else if ( mSaveUsbPid == DEF_USB_PID_SETUP )//SETUP事務
{
#ifdef DEBUG_NOW
printf ( " The PID is SETUP \n " ) ;
#endif
/*if ( r == DEF_USB_PID_ACK )
{
#ifdef DEBUG_NOW
printf( " The SETUP_PID's Hand is ACK \n " ) ;
#endif
return( USB_INT_SUCCESS ) ;
}*/
return( USB_INT_SUCCESS ) ;
}
if ( r == DEF_USB_PID_NAK ) //NAK重試
{
#ifdef DEBUG_NOW
printf ( " The Hand is NAK \n " ) ;
#endif
retry ++ ;
goto mHostTransRetry;
}
else if ( ! M_IS_HOST_TIMEOUT( s ) ) //錯誤或者無需重試或者意外應答,不是超時/出錯
{
#ifdef DEBUG_NOW
printf ( " The Hand is 錯誤或者無需重試或者意外應答,不是超時/出錯 \n " ) ;
#endif
return( r | 0x20 );
}
}
else //其他中斷,不應該發生的情況
{
mDelaymS( 200 ); //等待傳輸完成
#ifdef DEBUG_NOW
printf ( " 其他中斷,不應該發生的情況 \n " ) ;
#endif
Write374Byte( REG_INTER_FLAG, BIT_IF_USB_PAUSE | BIT_IF_INTER_FLAG ); //清中斷標志
}
mHostTransRetry:
if( retry > 1 ) //繼續重試
{
#ifdef DEBUG_NOW
printf ( " 繼續重試 \n " ) ;
#endif
Write374Byte( REG_USB_H_CTRL, Read374Byte( REG_USB_H_CTRL ) | BIT_HOST_START ); //再次啟動傳輸
}
}
return( 0x20 );
}
/*********************************************************************************************************
** 函數名稱: HostCtrlTransfer374
** 功能描述: 執行控制傳輸
** 需預先輸入mSaveUsbPid,PID令牌+目的端點地址,同步標志
** NAK重試,超時出錯重試
** 輸 入: ReqBuf指向8字節請求碼,DatBuf為收發緩沖區
** 如果需要接收和發送數據,那么DatBuf需要指向有效緩沖區用于存放后續數據,
** 實際成功收發的總長度保存在ReqLen指向的字節變量中
** 輸 出: 返回同CH375
**
** 全局變量: 無
** 調用模塊: 無
** 調試碼: 無
**
**
** 作 者: 徐亦朱
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -