📄 dev_ep.c
字号:
device_list[ 0 ] = (device_instance *)1;
device_list[ 1 ] = (device_instance *)1;
for ( i = 2; i < MAX_DEVICE_NUM; i++ )
device_list[ i ] = NULL;
}
//**************************************************************************
// 函数名称: device_new_address
// 输入参数: 无
// 输出参数: 返回地址编号
// 功能描述: 获取可用的设备地址
//**************************************************************************
unsigned char device_new_address( void )
{
int i;
for ( i = 2; i < MAX_DEVICE_NUM; i++ )
if ( !device_list[ i ] )
return ( i );
return ( 0 );
}
//*******************************************************************
//函数名称:find_device
//输入参数:address,设备地址
//输出参数:device_instance,设备信息指针
//功能说明:查找设备
//*******************************************************************
device_instance *find_device( unsigned char address )
{
return ( device_list[ address ] );
}
//******************************************************************
// 函数名称:get_interface_class_ID
// 输出参数:dviPtr,设备描述信息结构指针
// 输出参数:bInterfaceClass或0xff
// 功能描述:返回设备接口类地址,如果设备类ID不为0,则返回0xFF.
//******************************************************************
unsigned char get_interface_class_ID( device_instance *dviPtr )
{
if ( 0x00 == get_device_class_ID( dviPtr ) )
return ( (dviPtr->interfacef_descriptor).bInterfaceClass );
else
return ( 0xFF );
}
//******************************************************************
// 函数名称:get_device_class_ID
// 输出参数:dviPtr,设备描述信息结构指针
// 输出参数:bDeviceClass
// 功能描述:获取设备类ID
//******************************************************************
unsigned char get_device_class_ID( device_instance *dviPtr )
{
return ( (dviPtr->dev_descriptor).bDeviceClass );
}
//*******************************************************************
//函数名称:find_class_interface
//输入参数:InterfaceClassID,查找接口类ID
// DeviceIndex,同类设备索引号
//输出参数:device_instance,设备信息指针
//功能说明:查找设备接口类
//*******************************************************************
device_instance *find_class_interface( unsigned char InterfaceClassID, unsigned char DeviceIndex )
{
device_instance *dviPtr;
int i;
for ( i = 2; i <( MAX_DEVICE_NUM); i++ )
{
if ( NULL == (dviPtr = find_device( i )) )
continue;
if ( check_interface_class_ID( dviPtr, InterfaceClassID ) )
{
if(DeviceIndex== 0x00)
return ( dviPtr );
else
DeviceIndex --;
}
}
return ( NULL );
}
//*******************************************************************
//函数名称:check_interface_class_ID
//输入参数:dviPtr,设备信息指针
// InterfaceClassID,查找的接口类ID
//输出参数:返回1,查找到合适的ID
//功能说明:查找设备类ID
//*******************************************************************
unsigned char check_interface_class_ID( device_instance *dviPtr, unsigned char InterfaceClassID )
{
if ( (dviPtr->dev_descriptor).bDeviceClass == 0x00 )
if ( (dviPtr->interfacef_descriptor).bInterfaceClass == InterfaceClassID )
return ( 1 );
return ( 0 );
}
//*******************************************************************
//函数名称:check_pid_vid
//输入参数:dviPtr,设备信息指针
// InterfaceClassID,查找的接口类ID
//输出参数:返回1,查找到合适的ID
//功能说明:查找设备VID和PID。
//*******************************************************************
unsigned char check_pid_vid( device_instance *dviPtr, unsigned short VID,unsigned short PID)
{
if ( (dviPtr->dev_descriptor).idVendor== VID )
if ( (dviPtr->dev_descriptor).idProduct== PID )
return ( 1 );
return ( 0 );
}
//*******************************************************************
//函数名称:find_pid_vid
//输入参数:InterfaceClassID,查找接口类ID
//输出参数:device_instance,设备信息指针
//功能说明:查找指定VID和PID的设备
//*******************************************************************
device_instance *find_pid_vid( unsigned short VID,unsigned short PID )
{
device_instance *dviPtr;
int i;
for ( i = 2; i <( MAX_DEVICE_NUM); i++ )
{
if ( NULL == (dviPtr = find_device( i )) )
continue;
if ( check_pid_vid( dviPtr, VID , PID) )
return ( dviPtr );
}
return ( NULL );
}
//*******************************************************************
//函数名称:find_endport_type
//输入参数:dviPtr,设备信息指针
// endport_type,端点类型
// endport_direction,端点的方向,输入(1)或输出(0)
// index,端点序号,如果设备有多个同类型的端点,可以通过序号选择。
//输出参数:返回端点指针,空指针查找失败
//功能说明:查找设备VID和PID。
//*******************************************************************
endpoint_info * find_endport_type(device_instance *dviPtr, unsigned char endport_type,unsigned char endport_direction,unsigned char index)
{
unsigned char i;
endpoint_info *epi_ptr;
for( i=0; i<MAX_ENDPOINT_NUM; i++)
{
epi_ptr=dviPtr->epi_ptr[i];
if ( NULL!=epi_ptr )
{
if((epi_ptr->transfer_type&0x03) == (endport_type&0x03))
if( epi_ptr->direction == endport_direction)
{
index--;
if(index==0)
return epi_ptr; // 返回端点指针
}
}
}
return NULL;
}
//*******************************************************************
//函数名称:find_endport_number
//输入参数:dviPtr,设备信息指针
// endport_number,端点号
// endport_direction,端点的方向,输入(1)或输出(0)
//输出参数:返回端点指针,空指针查找失败
//功能说明:以端点号和方向查找设备端点
//*******************************************************************
endpoint_info * find_endport_number( device_instance *dviPtr,
unsigned char endport_number,
unsigned char endport_direction)
{
endpoint_info *epi_ptr;
epi_ptr = dviPtr->epi_ptr[endport_number*2 + endport_direction];
return epi_ptr;
}
/**********************************************************************
** Modification by hara from here.
** Inreface Protocol ID handling in Interface descriptor for HID class
***********************************************************************/
device_instance *find_protocol_interface( unsigned char InterfaceProtocolID, unsigned char search_start_address )
{
device_instance *dviPtr;
int i;
if ( search_start_address < 2 )
search_start_address = 2;
for ( i = search_start_address; i < 128; i++ )
{
if ( NULL == (dviPtr = find_device( i )) )
continue;
if ( check_interface_protocol_ID( dviPtr, InterfaceProtocolID ) )
return ( dviPtr );
}
return ( NULL );
}
unsigned char check_interface_protocol_ID( device_instance *dviPtr, unsigned char InterfaceProtocolID )
{
if (InterfaceProtocolID == get_interface_protocol_ID( dviPtr ) )
return ( 1 );
else
return ( 0 );
}
unsigned char get_interface_protocol_ID( device_instance *dviPtr )
{
if ( 0x03 == get_interface_class_ID( dviPtr ) )
return ( (dviPtr->interfacef_descriptor).bInterfaceProtocol );
else
return ( 0xFF );
}
/**********************************************************************
** Modification by hara from here.
** Inreface Protocol ID handling in Interface descriptor for HID class
***********************************************************************/
device_instance *find_subclass_interface( unsigned char InterfaceSubclassID, unsigned char search_start_address )
{
device_instance *dviPtr;
int i;
if ( search_start_address < 2 )
search_start_address = 2;
for ( i = search_start_address; i < 128; i++ )
{
if ( NULL == (dviPtr = find_device( i )) )
continue;
if ( check_interface_subclass_ID( dviPtr, InterfaceSubclassID ) )
return ( dviPtr );
}
return ( NULL );
}
unsigned char check_interface_subclass_ID( device_instance *dviPtr, unsigned char InterfaceSubclassID )
{
if (InterfaceSubclassID == get_interface_subclass_ID( dviPtr ) )
return ( 1 );
else
return ( 0 );
}
unsigned char get_interface_subclass_ID( device_instance *dviPtr )
{
if ( 0x08 == get_interface_class_ID( dviPtr ) )
return ( (dviPtr->interfacef_descriptor).bInterfaceSubClass );
else
return ( 0xFF );
}
//******************************************************************************************
// 函数名称:ClearEndpointSTALL
// 输入参数:dvi_ptr,USB设备描述信息数据结构
// epi_ptr,端点描述信息数据结构
// 输出参数:TRUE,正常返回;
// FALSE,出错返回。
// 功能描述:清除端点停止状态
//******************************************************************************************
unsigned char ClearEndpointSTALL(device_instance *dvi_ptr, endpoint_info *epi_ptr)
{
unsigned short wIndex;
unsigned short wLength = 0;
unsigned char buff_ptr;
unsigned short CompletionCode;
wIndex = epi_ptr->endpoint_descriptor.bEndpointAddress; // 端点号
CompletionCode = std_request(&buff_ptr, dvi_ptr,
std_Dv_request_CLEAR_FEATURE_Ep,
0x0000, wIndex, &wLength );
epi_ptr->toggle = 0;
return ( CompletionCode? FALSE: TRUE );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -