Murad Jabir 2 éve
szülő
commit
ec065c245c

+ 13 - 0
Core/Src/main.c

@@ -19,6 +19,13 @@
 /* Includes ------------------------------------------------------------------*/
 #include "main.h"
 #include "usb_device.h"
+#include "usbd_audio_if.h"
+
+#define OSA_BUF_SIZE 16
+
+int16_t adc_buffer[OSA_BUF_SIZE * AUDIO_IN_PACKET / 2] = {0};
+
+extern USBD_HandleTypeDef hUsbDeviceFS;
 
 /* Private includes ----------------------------------------------------------*/
 /* USER CODE BEGIN Includes */
@@ -62,6 +69,12 @@ static void MX_GPIO_Init(void);
   * @brief  The application entry point.
   * @retval int
   */
+
+void ADC_to_MIC(void)
+{
+   //HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, OSA_BUF_SIZE * (AUDIO_IN_PACKET / 2)); // Start ADC transfer into oversampling buffer
+}
+
 int main(void)
 {
   /* USER CODE BEGIN 1 */

+ 3 - 1
Middlewares/ST/STM32_USB_Device_Library/Class/AUDIO/Inc/usbd_audio.h

@@ -107,7 +107,7 @@ extern "C" {
 #define AUDIO_OUT_TC                                  0x01U
 #define AUDIO_IN_TC                                   0x02U
 
-
+#define AUDIO_IN_PACKET 							  (uint16_t)(((USBD_AUDIO_FREQ * 2U) / 1000U))
 #define AUDIO_OUT_PACKET                              (uint16_t)(((USBD_AUDIO_FREQ * 2U * 2U) / 1000U))
 #define AUDIO_DEFAULT_VOLUME                          70U
 
@@ -158,6 +158,8 @@ typedef struct
 	uint8_t rd_enable;
 	uint16_t rd_ptr;
 	uint16_t wr_ptr;
+	int16_t in_buffer[AUDIO_IN_PACKET]; // add this
+	 uint8_t in_buffer_half;             // and this
 	USBD_AUDIO_ControlTypeDef control;
 } USBD_AUDIO_HandleTypeDef;
 

+ 27 - 25
Middlewares/ST/STM32_USB_Device_Library/Class/AUDIO/Src/usbd_audio.c

@@ -62,6 +62,9 @@
 /* Includes ------------------------------------------------------------------*/
 #include "usbd_audio.h"
 #include "usbd_ctlreq.h"
+#include "main.h"
+
+void ADC_to_MIC(void);
 
 /** @addtogroup STM32_USB_DEVICE_LIBRARY
  * @{
@@ -336,29 +339,17 @@ static uint8_t USBD_AUDIO_Init(USBD_HandleTypeDef *pdev, uint8_t cfgidx) {
 		pdev->ep_out[AUDIOOutEpAdd & 0xFU].bInterval = AUDIO_FS_BINTERVAL;
 	}
 
-	/* Open EP OUT */
-	(void) USBD_LL_OpenEP(pdev, AUDIOOutEpAdd, USBD_EP_TYPE_ISOC,
-			AUDIO_OUT_PACKET);
-	pdev->ep_out[AUDIOOutEpAdd & 0xFU].is_used = 1U;
-
-	haudio->alt_setting = 0U;
-	haudio->offset = AUDIO_OFFSET_UNKNOWN;
-	haudio->wr_ptr = 0U;
-	haudio->rd_ptr = 0U;
-	haudio->rd_enable = 0U;
-
-	/* Initialize the Audio output Hardware layer */
-	if (((USBD_AUDIO_ItfTypeDef*) pdev->pUserData[pdev->classId])->Init(
-			USBD_AUDIO_FREQ,
-			AUDIO_DEFAULT_VOLUME, 0U) != 0U) {
-		return (uint8_t) USBD_FAIL;
-	}
+	/* Open IN endpoint (mic) */
+	  USBD_LL_OpenEP (pdev, AUDIO_IN_EP, USBD_EP_TYPE_ISOC, AUDIO_IN_PACKET);
+	  pdev->ep_in[AUDIO_IN_EP & 0xFU].is_used = 1U;
 
-	/* Prepare Out endpoint to receive 1st packet */
-	(void) USBD_LL_PrepareReceive(pdev, AUDIOOutEpAdd, haudio->buffer,
-			AUDIO_OUT_PACKET);
 
-	return (uint8_t) USBD_OK;
+	/* Make a dummy transfer */
+	  USBD_LL_FlushEP  (pdev, AUDIO_IN_EP);
+	  USBD_LL_Transmit (pdev, AUDIO_IN_EP,
+	                   (uint8_t*)&haudio->in_buffer[AUDIO_IN_PACKET * !!haudio->in_buffer_half], AUDIO_IN_PACKET);
+
+	  return (uint8_t)USBD_OK;
 }
 
 /**
@@ -520,11 +511,22 @@ static uint8_t* USBD_AUDIO_GetCfgDesc(uint16_t *length) {
  * @retval status
  */
 static uint8_t USBD_AUDIO_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum) {
-	UNUSED(pdev);
-	UNUSED(epnum);
+	USBD_AUDIO_HandleTypeDef *haudio;
+	  uint8_t retval = USBD_OK;
 
-	/* Only OUT data are processed */
-	return (uint8_t) USBD_OK;
+	  haudio = (USBD_AUDIO_HandleTypeDef*) pdev->pClassData;
+
+	  if (epnum == (AUDIO_IN_EP & 0x7F))
+	  {
+	     haudio->in_buffer_half = !haudio->in_buffer_half;    // also serves as init to 1 or 0
+	     uint16_t prev = (AUDIO_IN_PACKET / 2) * !haudio->in_buffer_half;
+	     ADC_to_MIC();
+
+	     USBD_LL_FlushEP  (pdev, AUDIO_IN_EP);
+	     USBD_LL_Transmit (pdev, AUDIO_IN_EP, (uint8_t*)(haudio->in_buffer + prev), AUDIO_IN_PACKET);
+	  }
+
+	  return (uint8_t)USBD_OK;
 }
 
 /**