📄 usb_prop.c
字号:
/******************************************************************************
* 函数 : usb_prop.c
* 功能描述 : 音频设备初始化,读取设备,接口,配置等描述符等,所有USB设备都需
*要响应这些要求,大部的要求是成对的,如果有Set要求就会有相对的Get要求.
*音频设备静音控制功能等.
*******************************************************************************/
/* 头文件 ------------------------------------------------------------------*/
#include "usb_lib.h"
#include "usb_conf.h"
#include "usb_prop.h"
#include "usb_desc.h"
#include "usb_pwr.h"
#include "hw_config.h"
u32 MUTE_DATA = 0; /*用于静音控制*/
DEVICE Device_Table =
{
EP_NUM,
1
};
DEVICE_PROP Device_Property =
{
Speaker_init,
Speaker_Reset,
Speaker_Status_In,
Speaker_Status_Out,
Speaker_Data_Setup,
Speaker_NoData_Setup,
Speaker_Get_Interface_Setting,
Speaker_GetDeviceDescriptor,
Speaker_GetConfigDescriptor,
Speaker_GetStringDescriptor,
0,
0x40 /*包最大值*/
};
USER_STANDARD_REQUESTS User_Standard_Requests =
{
Speaker_GetConfiguration,
Speaker_SetConfiguration,
Speaker_GetInterface,
Speaker_SetInterface,
Speaker_GetStatus,
Speaker_ClearFeature,
Speaker_SetEndPointFeature,
Speaker_SetDeviceFeature,
Speaker_SetDeviceAddress
};
ONE_DESCRIPTOR Device_Descriptor =
{
(u8*)Speaker_DeviceDescriptor,
SPEAKER_SIZ_DEVICE_DESC
};
ONE_DESCRIPTOR Config_Descriptor =
{
(u8*)Speaker_ConfigDescriptor,
SPEAKER_SIZ_CONFIG_DESC
};
ONE_DESCRIPTOR String_Descriptor[4] =
{
{(u8*)Speaker_StringLangID, SPEAKER_SIZ_STRING_LANGID},
{(u8*)Speaker_StringVendor, SPEAKER_SIZ_STRING_VENDOR},
{(u8*)Speaker_StringProduct, SPEAKER_SIZ_STRING_PRODUCT},
{(u8*)Speaker_StringSerial, SPEAKER_SIZ_STRING_SERIAL},
};
/* 外部全局变量,用于数据交换-------------------------------------------------*/
extern u16 In_Data_Offset;
extern u16 Out_Data_Offset;
/*******************************************************************************
* 函数 : Speaker_init.
* 功能描述 : 音频设备--扬声器初始化.
* 输入 : 无.
* 输出 : 无.
* 返回 : 无.
*******************************************************************************/
void Speaker_init()
{
pInformation->Current_Configuration = 0;
/* 连接设备 */
PowerOn();
/* USB 中断初始化 */
_SetISTR(0); /* 清除中断 */
wInterrupt_Mask = IMR_MSK;
_SetCNTR(wInterrupt_Mask); /* 设置中断屏蔽位 */
pInformation->Current_Feature = Speaker_ConfigDescriptor[7];
/* 等待配置完成 */
while (pInformation->Current_Configuration == 0)
{
NOP_Process();
}
bDeviceState = CONFIGURED;
}
/*******************************************************************************
* 函数 : Speaker_Reset.
* 功能描述 : 音频设备--扬声器复位程序.
* 输入 : 无.
* 输出 : 无.
* 返回 : 无.
*******************************************************************************/
void Speaker_Reset()
{
/* 设置音频设备无配置状态 */
pInformation->Current_Configuration = 0;
SetBTABLE(BTABLE_ADDRESS);
/* 端点 0初始化 */
SetEPType(ENDP0, EP_CONTROL);
SetEPTxStatus(ENDP0, EP_TX_NAK);
SetEPRxAddr(ENDP0, ENDP0_RXADDR);
SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
SetEPTxAddr(ENDP0, ENDP0_TXADDR);
Clear_Status_Out(ENDP0);
SetEPRxValid(ENDP0);
/* 端点 1初始化 */
SetEPType(ENDP1, EP_ISOCHRONOUS);
SetEPDblBuffAddr(ENDP1, ENDP1_BUF0Addr, ENDP1_BUF1Addr);
SetEPDblBuffCount(ENDP1, EP_DBUF_OUT, 0x40);
ClearDTOG_RX(ENDP1);
ClearDTOG_TX(ENDP1);
ToggleDTOG_TX(ENDP1);
SetEPRxStatus(ENDP1, EP_RX_VALID);
SetEPTxStatus(ENDP1, EP_TX_DIS);
SetEPRxValid(ENDP0);
/* 设置设备响应默认地址 */
SetDeviceAddress(0);
Speaker_Timer_Config();
In_Data_Offset = 0;
Out_Data_Offset = 0;
}
/*******************************************************************************
* 函数 : Speaker_Status_In.
* 功能描述 : 音频设备--扬声器状态输入处理程序.
* 输入 : 无.
* 输出 : 无.
* 返回 : 无.
*******************************************************************************/
void Speaker_Status_In(void)
{
}
/*******************************************************************************
* 函数 : Speaker_Status_In.
* 功能描述 : 音频设备--扬声器状态输出处理程序.
* 输入 : 无.
* 输出 : 无.
* 返回 : 无.
*******************************************************************************/
void Speaker_Status_Out (void)
{
}
/*******************************************************************************
* 函数 : Speaker_Data_Setup.
* 功能描述 : 音频设备--扬声器特定类请求处理.
* 输入 : 无.
* 输出 : 无.
* 返回 : 不支持或成功.
*******************************************************************************/
RESULT Speaker_Data_Setup(u8 RequestNo)
{
u8 *(*CopyRoutine)(u16);
CopyRoutine = NULL;
if ((RequestNo == GET_CUR) || (RequestNo == SET_CUR))
{
CopyRoutine = Mute_Command;
}
else
{
return USB_UNSUPPORT;
}
pInformation->Ctrl_Info.CopyData = CopyRoutine;
pInformation->Ctrl_Info.Usb_wOffset = 0;
(*CopyRoutine)(0);
return USB_SUCCESS;
}
/*******************************************************************************
* 函数 : Speaker_NoData_Setup.
* 功能描述 : 音频设备--扬声器无特定类数据处理.
* 输入 : 无.
* 输出 : 无.
* 返回 : 不成功或成功USB_UNSUPPORT / USB_SUCCESS.
*******************************************************************************/
RESULT Speaker_NoData_Setup(u8 RequestNo)
{
return USB_UNSUPPORT;
}
/*******************************************************************************
* 函数 : Speaker_GetDeviceDescriptor.
* 功能描述 : Get the device descriptor.
* 输入 : 设备描述符长度.
* 输出 : 无.
* 返回 : 设备描述符地址.
*******************************************************************************/
u8 *Speaker_GetDeviceDescriptor(u16 Length)
{
return Standard_GetDescriptorData(Length, &Device_Descriptor);
}
/*******************************************************************************
* 函数 : Speaker_GetConfigDescriptor.
* 功能描述 : Get the configuration descriptor.
* 输入 : 配置描述符长度.
* 输出 : 无.
* 返回 : 配置描述符地址.
*******************************************************************************/
u8 *Speaker_GetConfigDescriptor(u16 Length)
{
return Standard_GetDescriptorData(Length, &Config_Descriptor);
}
/*******************************************************************************
* 函数 : Speaker_GetStringDescriptor.
* 功能描述 : 根据索引值得到字符串描述符.
* 输入 : 描述符长度.
* 输出 : 无.
* 返回 : 字符串描述符地址.
*******************************************************************************/
u8 *Speaker_GetStringDescriptor(u16 Length)
{
u8 wValue0 = pInformation->USBwValue0;
return Standard_GetDescriptorData(Length, &String_Descriptor[wValue0]);
}
/*******************************************************************************
* 函数 : Speaker_Get_Interface_Setting.
* 功能描述 : 测试接口设定.
* 输入1 : 接口描述值.
* 输入2 :替代值
* 输出 : 无.
* 返回 : 描述符地址.
*******************************************************************************/
RESULT Speaker_Get_Interface_Setting(u8 Interface, u8 AlternateSetting)
{
if (AlternateSetting > 1)
{
return USB_UNSUPPORT;
}
else if (Interface > 1)
{
return USB_UNSUPPORT;
}
return USB_SUCCESS;
}
/*******************************************************************************
* 函数 : Mute_Command.
* 功能描述 : 处理静音控制的命令.
* 输入 : 命令字节.
* 输出 : 无.
* 返回 : MUTE_DATA或空.
*******************************************************************************/
u8 *Mute_Command(u16 Length)
{
if (Length == 0)
{
pInformation->Ctrl_Info.Usb_wLength = pInformation->USBwLengths.w;
return NULL;
}
else
{
return((u8*)(&MUTE_DATA));
}
}
/******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -