—
usbd_audio.h
typedef enum { AUDIO_CMD_START = 1, AUDIO_CMD_PLAY, AUDIO_CMD_STOP, }AUDIO_CMD_TypeDef; typedef enum { AUDIO_OFFSET_NONE = 0, AUDIO_OFFSET_HALF, AUDIO_OFFSET_FULL, AUDIO_OFFSET_UNKNOWN, } AUDIO_OffsetTypeDef; /** * @} */ /** @defgroup USBD_CORE_Exported_TypesDefinitions * @{ */ typedef struct { uint8_t cmd; uint8_t data[USB_MAX_EP0_SIZE]; uint8_t len; uint8_t unit; } USBD_AUDIO_ControlTypeDef; typedef struct { __IO uint32_t alt_setting; uint8_t buffer[AUDIO_TOTAL_BUF_SIZE]; AUDIO_OffsetTypeDef offset; uint8_t rd_enable; uint16_t rd_ptr; uint16_t wr_ptr; USBD_AUDIO_ControlTypeDef control; } USBD_AUDIO_HandleTypeDef; typedef struct { int8_t (*Init) (uint32_t AudioFreq, uint32_t Volume, uint32_t options); int8_t (*DeInit) (uint32_t options); int8_t (*AudioCmd) (uint8_t* pbuf, uint32_t size, uint8_t cmd); int8_t (*VolumeCtl) (uint8_t vol); int8_t (*MuteCtl) (uint8_t cmd); int8_t (*PeriodicTC) (uint8_t cmd); int8_t (*GetState) (void); }USBD_AUDIO_ItfTypeDef;
USBD_AUDIO_ItfTypeDef USBD_AUDIO_fops_FS;
结构体定义
// usbd_audio.h typedef struct { int8_t (*Init) (uint32_t AudioFreq, uint32_t Volume, uint32_t options); int8_t (*DeInit) (uint32_t options); int8_t (*AudioCmd) (uint8_t* pbuf, uint32_t size, uint8_t cmd); int8_t (*VolumeCtl) (uint8_t vol); int8_t (*MuteCtl) (uint8_t cmd); int8_t (*PeriodicTC) (uint8_t cmd); int8_t (*GetState) (void); }USBD_AUDIO_ItfTypeDef;
变量定义
//usbd_audio_if.c USBD_AUDIO_ItfTypeDef USBD_AUDIO_fops_FS = { AUDIO_Init_FS, AUDIO_DeInit_FS, AUDIO_AudioCmd_FS, AUDIO_VolumeCtl_FS, AUDIO_MuteCtl_FS, AUDIO_PeriodicTC_FS, AUDIO_GetState_FS };
注册
由文件usb_device.c 中 MX_USB_DEVICE_Init() 调用 USBD_AUDIO_RegisterInterface() 注册。
// usb_device.c void MX_USB_DEVICE_Init(void) { /* USER CODE BEGIN USB_DEVICE_Init_PreTreatment */ /* USER CODE END USB_DEVICE_Init_PreTreatment */ /* Init Device Library, add supported class and start the library. */ if (USBD_Init(&hUsbDeviceFS, &FS_Desc, DEVICE_FS) != USBD_OK) { Error_Handler(); } if (USBD_RegisterClass(&hUsbDeviceFS, &USBD_AUDIO) != USBD_OK) { Error_Handler(); } if (USBD_AUDIO_RegisterInterface(&hUsbDeviceFS, &USBD_AUDIO_fops_FS) != USBD_OK) { Error_Handler(); } if (USBD_Start(&hUsbDeviceFS) != USBD_OK) { Error_Handler(); } /* USER CODE BEGIN USB_DEVICE_Init_PostTreatment */ /* USER CODE END USB_DEVICE_Init_PostTreatment */ }
// usbd_audio.c uint8_t USBD_AUDIO_RegisterInterface (USBD_HandleTypeDef *pdev, USBD_AUDIO_ItfTypeDef *fops) { if(fops != NULL) { pdev->pUserData= fops; } return 0; }
结构体定义
// usb_audio.h typedef struct { __IO uint32_t alt_setting; uint8_t buffer[AUDIO_TOTAL_BUF_SIZE]; AUDIO_OffsetTypeDef offset; uint8_t rd_enable; uint16_t rd_ptr; uint16_t wr_ptr; USBD_AUDIO_ControlTypeDef control; } USBD_AUDIO_HandleTypeDef;
注册并初始化
//usb_audio.c static uint8_t USBD_AUDIO_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx) { USBD_AUDIO_HandleTypeDef *haudio; DBG_FN_MARK(); /* Open EP OUT */ USBD_LL_OpenEP(pdev, AUDIO_OUT_EP, USBD_EP_TYPE_ISOC, AUDIO_OUT_PACKET); /* Allocate Audio structure */ pdev->pClassData = USBD_malloc(sizeof (USBD_AUDIO_HandleTypeDef)); if(pdev->pClassData == NULL) { return USBD_FAIL; } else { haudio = (USBD_AUDIO_HandleTypeDef*) pdev->pClassData; haudio->alt_setting = 0; haudio->offset = AUDIO_OFFSET_UNKNOWN; haudio->wr_ptr = 0; haudio->rd_ptr = 0; haudio->rd_enable = 0; /* Initialize the Audio output Hardware layer */ if (((USBD_AUDIO_ItfTypeDef *)pdev->pUserData)->Init(USBD_AUDIO_FREQ, AUDIO_DEFAULT_VOLUME, 0) != USBD_OK) { return USBD_FAIL; } /* Prepare Out endpoint to receive 1st packet */ USBD_LL_PrepareReceive(pdev, AUDIO_OUT_EP, haudio->buffer, AUDIO_OUT_PACKET); } return USBD_OK; }
驱动中的各个模块接口,通过各自模块提供的注册函数注册到设备handle (变量: hUsbDeviceFS,类型: USBD_HandleTypeDef),注册函数在设备初始化过程 MX_USB_DEVICE_Init() 被调用。