⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb_prop.c

📁 ARM_CORTEX-M3应用实例开发详解光盘
💻 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 + -