📄 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 + -