diff --git a/Inc/stm32g0xx_hal_hcd.h b/Inc/stm32g0xx_hal_hcd.h
index d849cde..b0f29b9 100644
--- a/Inc/stm32g0xx_hal_hcd.h
+++ b/Inc/stm32g0xx_hal_hcd.h
@@ -90,6 +90,7 @@
   HCD_TypeDef               *Instance;  /*!< Register base address    */
   HCD_InitTypeDef           Init;       /*!< HCD required parameters  */
   HCD_HCTypeDef             hc[16];     /*!< Host channels parameters */
+  uint32_t                  ep0_PmaAllocState;  /*!< EP0 PMA allocation State (allocated, virtual Ch, EP0 direction) */
   uint16_t                  phy_chin_state[8];  /*!< Physical Channel in State (Used/Free) */
   uint16_t                  phy_chout_state[8]; /*!< Physical Channel out State (Used/Free)*/
   uint32_t                  PMALookupTable[PMA_BLOCKS]; /*PMA LookUp Table */
@@ -362,7 +363,7 @@
   * @param   bChNum, bDir
   * @retval None
   */
-#define HCD_FreeUserBuffer                     USB_DRD_FreeUserBuffer
+#define HCD_FREE_USER_BUFFER                   USB_DRD_FREE_USER_BUFFER
 
 /**
   * @brief Set the Setup bit in the corresponding channel, when a Setup
@@ -400,12 +401,15 @@
 #define HCD_GET_CH_TX_STATUS                   USB_DRD_GET_CHEP_TX_STATUS
 #define HCD_GET_CH_RX_STATUS                   USB_DRD_GET_CHEP_RX_STATUS
 /**
-  * @brief  Sets/clears directly EP_KIND bit in the endpoint register.
+  * @brief  Sets/clears CH_KIND bit in the Channel register.
   * @param  USBx USB peripheral instance register address.
   * @param  bChNum Endpoint Number.
   * @retval None
   */
-#define HCD_SET_CH_DBUF                        USB_DRD_SET_CH_KIND
+#define HCD_SET_CH_KIND                        USB_DRD_SET_CH_KIND
+#define HCD_CLEAR_CH_KIND                      USB_DRD_CLEAR_CH_KIND
+#define HCD_SET_BULK_CH_DBUF                   HCD_SET_CH_KIND
+#define HCD_CLEAR_BULK_CH_DBUF                 HCD_CLEAR_CH_KIND
 
 /**
   * @brief  Clears bit ERR_RX in the Channel register
diff --git a/Inc/stm32g0xx_hal_pcd.h b/Inc/stm32g0xx_hal_pcd.h
index 5f3e294..4f48c94 100644
--- a/Inc/stm32g0xx_hal_pcd.h
+++ b/Inc/stm32g0xx_hal_pcd.h
@@ -188,16 +188,16 @@
   */
 
 
-#define __HAL_PCD_ENABLE(__HANDLE__)                                  (void)USB_EnableGlobalInt ((__HANDLE__)->Instance)
-#define __HAL_PCD_DISABLE(__HANDLE__)                                 (void)USB_DisableGlobalInt ((__HANDLE__)->Instance)
-#define __HAL_PCD_GET_FLAG(__HANDLE__, __INTERRUPT__)                 ((USB_ReadInterrupts((__HANDLE__)->Instance)\
-                                                                        & (__INTERRUPT__)) == (__INTERRUPT__))
+#define __HAL_PCD_ENABLE(__HANDLE__)                              (void)USB_EnableGlobalInt ((__HANDLE__)->Instance)
+#define __HAL_PCD_DISABLE(__HANDLE__)                             (void)USB_DisableGlobalInt ((__HANDLE__)->Instance)
+#define __HAL_PCD_GET_FLAG(__HANDLE__, __INTERRUPT__)             ((USB_ReadInterrupts((__HANDLE__)->Instance)\
+                                                                    & (__INTERRUPT__)) == (__INTERRUPT__))
 
-#define __HAL_PCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__)               (((__HANDLE__)->Instance->ISTR)\
-                                                                       &= (uint16_t)(~(__INTERRUPT__)))
+#define __HAL_PCD_CLEAR_FLAG(__HANDLE__, __INTERRUPT__)           (((__HANDLE__)->Instance->ISTR)\
+                                                                   &= (uint16_t)(~(__INTERRUPT__)))
 
-#define __HAL_USB_WAKEUP_EXTI_ENABLE_IT()                             EXTI->IMR2 |= USB_WAKEUP_EXTI_LINE
-#define __HAL_USB_WAKEUP_EXTI_DISABLE_IT()                            EXTI->IMR2 &= ~(USB_WAKEUP_EXTI_LINE)
+#define __HAL_USB_WAKEUP_EXTI_ENABLE_IT()                         EXTI->IMR2 |= USB_WAKEUP_EXTI_LINE
+#define __HAL_USB_WAKEUP_EXTI_DISABLE_IT()                        EXTI->IMR2 &= ~(USB_WAKEUP_EXTI_LINE)
 
 
 /**
@@ -341,13 +341,12 @@
 HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr,
                                       uint8_t *pBuf, uint32_t len);
 
-
 HAL_StatusTypeDef HAL_PCD_EP_SetStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr);
 HAL_StatusTypeDef HAL_PCD_EP_ClrStall(PCD_HandleTypeDef *hpcd, uint8_t ep_addr);
 HAL_StatusTypeDef HAL_PCD_EP_Flush(PCD_HandleTypeDef *hpcd, uint8_t ep_addr);
+HAL_StatusTypeDef HAL_PCD_EP_Abort(PCD_HandleTypeDef *hpcd, uint8_t ep_addr);
 HAL_StatusTypeDef HAL_PCD_ActivateRemoteWakeup(PCD_HandleTypeDef *hpcd);
 HAL_StatusTypeDef HAL_PCD_DeActivateRemoteWakeup(PCD_HandleTypeDef *hpcd);
-
 uint32_t          HAL_PCD_EP_GetRxCount(PCD_HandleTypeDef *hpcd, uint8_t ep_addr);
 /**
   * @}
@@ -441,7 +440,7 @@
   * @param   bEpNum, bDir
   * @retval None
   */
-#define PCD_FreeUserBuffer                     USB_DRD_FreeUserBuffer
+#define PCD_FREE_USER_BUFFER                   USB_DRD_FREE_USER_BUFFER
 
 /**
   * @brief  sets the status for tx transfer (bits STAT_TX[1:0]).
@@ -467,8 +466,11 @@
   * @param  bEpNum Endpoint Number.
   * @retval None
   */
-#define PCD_SET_EP_DBUF                        USB_DRD_SET_CHEP_KIND
-#define PCD_CLEAR_EP_DBUF                      USB_DRD_CLEAR_CHEP_KIND
+#define PCD_SET_EP_KIND                        USB_DRD_SET_CHEP_KIND
+#define PCD_CLEAR_EP_KIND                      USB_DRD_CLEAR_CHEP_KIND
+#define PCD_SET_BULK_EP_DBUF                   PCD_SET_EP_KIND
+#define PCD_CLEAR_BULK_EP_DBUF                 PCD_CLEAR_EP_KIND
+
 
 /**
   * @brief  Clears bit CTR_RX / CTR_TX in the endpoint register.
diff --git a/Inc/stm32g0xx_hal_pcd_ex.h b/Inc/stm32g0xx_hal_pcd_ex.h
index 952abbc..6b3a439 100644
--- a/Inc/stm32g0xx_hal_pcd_ex.h
+++ b/Inc/stm32g0xx_hal_pcd_ex.h
@@ -23,7 +23,7 @@
 
 #ifdef __cplusplus
 extern "C" {
-#endif
+#endif /* __cplusplus */
 
 /* Includes ------------------------------------------------------------------*/
 #include "stm32g0xx_hal_def.h"
@@ -83,7 +83,7 @@
 
 #ifdef __cplusplus
 }
-#endif
+#endif /* __cplusplus */
 
 
 #endif /* STM32G0xx_HAL_PCD_EX_H */
diff --git a/Inc/stm32g0xx_ll_usb.h b/Inc/stm32g0xx_ll_usb.h
index 058bcf5..e0e1641 100644
--- a/Inc/stm32g0xx_ll_usb.h
+++ b/Inc/stm32g0xx_ll_usb.h
@@ -23,7 +23,7 @@
 
 #ifdef __cplusplus
 extern "C" {
-#endif
+#endif /* __cplusplus */
 
 /* Includes ------------------------------------------------------------------*/
 #include "stm32g0xx_hal_def.h"
@@ -80,14 +80,6 @@
   HC_ACK
 } USB_DRD_HCStateTypeDef;
 
-/**
-  * USB HOST Double buffer Isochronous State
-  */
-typedef enum
-{
-  USB_PMABUF_EMPTY = 0U,
-  USB_PMABUF_NOT_EMPTY = 1U
-} USB_BuffStateTypedDef;
 
 /**
   * @brief  USB Instance Initialization Structure definition
@@ -106,6 +98,8 @@
                                          This parameter can be any value of @ref PCD_Speed/HCD_Speed
                                                                                  (HCD_SPEED_xxx, HCD_SPEED_xxx) */
 
+  uint32_t dma_enable;              /*!< dma_enable state unused, DMA not supported by FS instance              */
+
   uint32_t ep0_mps;                 /*!< Set the Endpoint 0 Max Packet size.                                    */
 
   uint32_t phy_itface;              /*!< Select the used PHY interface.
@@ -141,16 +135,16 @@
                                        This parameter can be any value of @ref USB_LL_EP_Type                   */
 
   uint16_t  pmaadress;            /*!< PMA Address
-                                       This parameter can be any value between Min_addr = 0 and Max_addr = 1K    */
+                                       This parameter can be any value between Min_addr = 0 and Max_addr = 1K   */
 
   uint16_t  pmaaddr0;             /*!< PMA Address0
-                                       This parameter can be any value between Min_addr = 0 and Max_addr = 1K    */
+                                       This parameter can be any value between Min_addr = 0 and Max_addr = 1K   */
 
   uint16_t  pmaaddr1;             /*!< PMA Address1
-                                       This parameter can be any value between Min_addr = 0 and Max_addr = 1K    */
+                                       This parameter can be any value between Min_addr = 0 and Max_addr = 1K   */
 
   uint8_t   doublebuffer;         /*!< Double buffer enable
-                                       This parameter can be 0 or 1                                              */
+                                       This parameter can be 0 or 1                                             */
 
   uint8_t   data_pid_start;       /*!< Initial data PID
                                        This parameter must be a number between Min_Data = 0 and Max_Data = 1    */
@@ -213,23 +207,19 @@
   uint8_t   toggle_out;         /*!< OUT transfer current toggle flag
                                      This parameter must be a number between Min_Data = 0 and Max_Data = 1      */
 
-  uint32_t  ErrCnt;             /*!< Host channel error count.                                                 */
+  uint32_t  ErrCnt;             /*!< Host channel error count.                                                  */
 
   uint16_t  pmaadress;          /*!< PMA Address
-                                     This parameter can be any value between Min_addr = 0 and Max_addr = 1K    */
+                                     This parameter can be any value between Min_addr = 0 and Max_addr = 1K     */
 
   uint16_t  pmaaddr0;           /*!< PMA Address0
-                                     This parameter can be any value between Min_addr = 0 and Max_addr = 1K    */
+                                     This parameter can be any value between Min_addr = 0 and Max_addr = 1K     */
 
   uint16_t  pmaaddr1;           /*!< PMA Address1
-                                     This parameter can be any value between Min_addr = 0 and Max_addr = 1K    */
+                                     This parameter can be any value between Min_addr = 0 and Max_addr = 1K     */
 
   uint8_t   doublebuffer;       /*!< Double buffer enable
-                                     This parameter can be 0 or 1                                              */
-
-  USB_BuffStateTypedDef  pmabuff0_state;   /*!< PMA Buffer0 State empty / notEmpty : used in double buffer OUT isochronous */
-
-  USB_BuffStateTypedDef  pmabuff1_state;   /*!< PMA Buffer1 State empty / notEmpty : used in double buffer OUT isochronous */
+                                     This parameter can be 0 or 1                                               */
 
   USB_DRD_URBStateTypeDef urb_state;  /*!< URB state.
                                             This parameter can be any value of @ref USB_OTG_URBStateTypeDef */
@@ -283,6 +273,10 @@
 
 #define EP_ADDR_MSK                            0x7U
 
+#ifndef USE_USB_DOUBLE_BUFFER
+#define USE_USB_DOUBLE_BUFFER                  1U
+#endif /* USE_USB_DOUBLE_BUFFER */
+
 /*!< USB Speed */
 #define USB_DRD_SPEED_FS                       1U
 #define USB_DRD_SPEED_LS                       2U
@@ -303,17 +297,17 @@
 #define USB_DRD_USED_CHANNELS                  8U
 #endif /* USB_DRD_USED_CHANNELS */
 
-/* First available address in PMA */
-#define PMA_START_ADDR          (0x10U + (8U *(USB_DRD_USED_CHANNELS - 2U)))
-#define PMA_END_ADDR             USB_DRD_PMA_SIZE
-
-
 /**
   * used for USB_HC_DoubleBuffer API
   */
-#define USB_DRD_DBUFF_ENBALE                   1U
-#define USB_DRD_DBUFF_DISABLE                  2U
+#define USB_DRD_BULK_DBUFF_ENBALE                   1U
+#define USB_DRD_BULK_DBUFF_DISABLE                  2U
+#define USB_DRD_ISOC_DBUFF_ENBALE                   3U
+#define USB_DRD_ISOC_DBUFF_DISABLE                  4U
 
+/* First available address in PMA */
+#define PMA_START_ADDR          (0x10U + (8U *(USB_DRD_USED_CHANNELS - 2U)))
+#define PMA_END_ADDR             USB_DRD_PMA_SIZE
 
 /* Exported macro ------------------------------------------------------------*/
 /**
@@ -339,7 +333,7 @@
   * @param   bEpChNum, bDir
   * @retval None
   */
-#define USB_DRD_FreeUserBuffer(USBx, bEpChNum, bDir) \
+#define USB_DRD_FREE_USER_BUFFER(USBx, bEpChNum, bDir) \
   do { \
     if ((bDir) == 0U) \
     { \
@@ -668,18 +662,22 @@
     uint32_t wNBlocks; \
     \
     (pdwReg) &= USB_PMA_RXBD_COUNTMSK; \
-    if ((wCount) == 0U) \
+    \
+    if ((wCount) > 62U) \
     { \
-      (pdwReg) &= (uint32_t)~USB_CNTRX_NBLK_MSK; \
-      (pdwReg) |= USB_CNTRX_BLSIZE; \
-    } \
-    else if((wCount) <= 62U) \
-    { \
-      USB_DRD_CALC_BLK2((pdwReg), (wCount), wNBlocks); \
+      USB_DRD_CALC_BLK32((pdwReg), (wCount), wNBlocks); \
     } \
     else \
     { \
-      USB_DRD_CALC_BLK32((pdwReg), (wCount), wNBlocks); \
+      if ((wCount) == 0U) \
+      { \
+        (pdwReg) &= (uint32_t)~USB_CNTRX_NBLK_MSK; \
+        (pdwReg) |= USB_CNTRX_BLSIZE; \
+      } \
+      else \
+      { \
+        USB_DRD_CALC_BLK2((pdwReg), (wCount), wNBlocks); \
+      } \
     } \
   } while(0) /* USB_DRD_SET_CHEP_CNT_RX_REG */
 
@@ -700,13 +698,11 @@
     (USB_DRD_PMA_BUFF + (bEpChNum))->TXBD |= (uint32_t)((uint32_t)(wCount) << 16U); \
   } while(0)
 
+#define USB_DRD_SET_CHEP_RX_DBUF0_CNT(USBx, bEpChNum, wCount) \
+  USB_DRD_SET_CHEP_CNT_RX_REG(((USB_DRD_PMA_BUFF + (bEpChNum))->TXBD), (wCount))
 
-#define USB_DRD_SET_CHEP_RX_DBUF0_CNT(USBx, bEpChNum, wCount)      USB_DRD_SET_CHEP_CNT_RX_REG(((USB_DRD_PMA_BUFF\
-                                                                   + (bEpChNum))->TXBD), (wCount))
-
-#define USB_DRD_SET_CHEP_RX_CNT(USBx, bEpChNum, wCount)            USB_DRD_SET_CHEP_CNT_RX_REG(((USB_DRD_PMA_BUFF\
-                                                                   + (bEpChNum))->RXBD), (wCount))
-
+#define USB_DRD_SET_CHEP_RX_CNT(USBx, bEpChNum, wCount) \
+  USB_DRD_SET_CHEP_CNT_RX_REG(((USB_DRD_PMA_BUFF + (bEpChNum))->RXBD), (wCount))
 
 /**
   * @brief  gets counter of the tx buffer.
@@ -833,7 +829,8 @@
 HAL_StatusTypeDef USB_EPStartXfer(USB_DRD_TypeDef *USBx, USB_DRD_EPTypeDef *ep);
 HAL_StatusTypeDef USB_EPSetStall(USB_DRD_TypeDef *USBx, USB_DRD_EPTypeDef *ep);
 HAL_StatusTypeDef USB_EPClearStall(USB_DRD_TypeDef *USBx, USB_DRD_EPTypeDef *ep);
-#endif /* HAL_PCD_MODULE_ENABLED */
+HAL_StatusTypeDef USB_EPStopXfer(USB_DRD_TypeDef *USBx, USB_DRD_EPTypeDef *ep);
+#endif /* defined (HAL_PCD_MODULE_ENABLED) */
 
 HAL_StatusTypeDef USB_SetDevAddress(USB_DRD_TypeDef *USBx, uint8_t address);
 HAL_StatusTypeDef USB_DevConnect(USB_DRD_TypeDef *USBx);
@@ -882,7 +879,7 @@
 
 #ifdef __cplusplus
 }
-#endif
+#endif /* __cplusplus */
 
 
 #endif /* STM32G0xx_LL_USB_H */
diff --git a/README.md b/README.md
index e8de06c..1ca31cb 100644
--- a/README.md
+++ b/README.md
@@ -40,11 +40,12 @@
 
 HAL Driver G0 | CMSIS Device G0 | CMSIS Core     | Was delivered in the full MCU package
 ------------- | --------------- | -------------- | -----------------------------------------------------
-Tag v1.2.0    | Tag v1.2.0      | Tag v4.5_cm0   | Tag v1.2.0 (and following, if any, till next new tag)
-Tag v1.3.0    | Tag v1.3.0      | Tag v5.4.0_cm0 | Tag v1.3.0 (and following, if any, till next new tag)
-Tag v1.4.0    | Tag v1.4.0      | Tag v5.6.0_cm0 | Tag v1.4.0 (and following, if any, till next new tag)
-Tag v1.4.1    | Tag v1.4.0      | Tag v5.6.0_cm0 | Tag v1.4.1 (and following, if any, till next new tag)
-Tag v1.4.2    | Tag v1.4.1      | Tag v5.6.0_cm0 | Tag v1.5.0 (and following, if any, till next new tag)
+Tag v1.2.0    | Tag v1.2.0      | Tag v4.5_cm0   | Tag v1.2.0 (and following, if any, till next HAL tag)
+Tag v1.3.0    | Tag v1.3.0      | Tag v5.4.0_cm0 | Tag v1.3.0 (and following, if any, till next HAL tag)
+Tag v1.4.0    | Tag v1.4.0      | Tag v5.6.0_cm0 | Tag v1.4.0 (and following, if any, till next HAL tag)
+Tag v1.4.1    | Tag v1.4.0      | Tag v5.6.0_cm0 | Tag v1.4.1 (and following, if any, till next HAL tag)
+Tag v1.4.2    | Tag v1.4.1      | Tag v5.6.0_cm0 | Tag v1.5.0 (and following, if any, till next HAL tag)
+Tag v1.4.3    | Tag v1.4.1      | Tag v5.6.0_cm0 | None (will be integrated into next HAL tag v1.4.4)
 
 The full **STM32CubeG0** MCU package is available [here](https://github.com/STMicroelectronics/STM32CubeG0).
 
diff --git a/Release_Notes.html b/Release_Notes.html
index 1150f2b..2f55b1f 100644
--- a/Release_Notes.html
+++ b/Release_Notes.html
@@ -45,11 +45,52 @@
 <section id="update-history" class="col-sm-12 col-lg-8">
 <h1>Update History</h1>
 <div class="collapse">
-<input type="checkbox" id="collapse-section5" checked aria-hidden="true"> <label for="collapse-section5" aria-hidden="true">V1.4.2 / 17-Juin-2021</label>
+<input type="checkbox" id="collapse-section6" checked aria-hidden="true"> <label for="collapse-section6" aria-hidden="true">V1.4.3 / 15-December-2021</label>
 <div>
 <h2 id="main-changes">Main Changes</h2>
 <h3 id="maintenance-release">Maintenance release</h3>
 <ul>
+<li><strong>HAL/LL Drivers</strong> updates
+<ul>
+<li><strong>HAL USB</strong> update
+<ul>
+<li>Footprint optimization in case USB double buffer mode not used, code protected with new define USE_USB_DOUBLE_BUFFER</li>
+<li>Update to avoid multiple reads of USB ISR register</li>
+<li>Add new API HAL_PCD_EP_Abort() to abort current USB endpoint transfer.</li>
+<li>Adding support of Azure USBx middleware stack</li>
+</ul></li>
+</ul></li>
+</ul>
+<h2 id="known-limitations">Known limitations</h2>
+<ul>
+<li>USB HAL limitation: Double buffer mode is not functional with isochronous data transfers in host mode.</li>
+</ul>
+<h2 id="development-toolchains-and-compilers">Development Toolchains and Compilers</h2>
+<ul>
+<li>IAR Embedded Workbench for ARM (EWARM) toolchain V8.50.9</li>
+<li>RealView Microcontroller Development Kit (MDK-ARM) toolchain V5.31</li>
+<li>STM32CubeIDE toolchain v1.7.0</li>
+</ul>
+<h2 id="supported-devices-and-boards">Supported Devices and boards</h2>
+<p>Supported Devices:</p>
+<ul>
+<li>STM32G0C1xx, STM32G0B1xx, STM32G0B0xx</li>
+<li>STM32G061xx, STM32G051xx, STM32G050xx</li>
+<li>STM32G081xx, STM32G071xx, STM32G070xx</li>
+<li>STM32G041xx, STM32G031xx, STM32G030xx ## Backward Compatibility</li>
+</ul>
+<p>This release is compatible with the previous versions.</p>
+<h2 id="dependencies">Dependencies</h2>
+<p><br />
+</p>
+</div>
+</div>
+<div class="collapse">
+<input type="checkbox" id="collapse-section5" aria-hidden="true"> <label for="collapse-section5" aria-hidden="true">V1.4.2 / 17-Juin-2021</label>
+<div>
+<h2 id="main-changes-1">Main Changes</h2>
+<h3 id="maintenance-release-1">Maintenance release</h3>
+<ul>
 <li><p>General updates to fix known defects and enhancements implementation.</p></li>
 <li><p><strong>HAL/LL Drivers</strong> updates</p></li>
 <li><p><strong>HAL CEC</strong> update</p>
@@ -178,17 +219,17 @@
 <li>Add fix transfer complete for IN Interrupt transaction in single buffer mode.</li>
 </ul></li>
 </ul>
-<h2 id="known-limitations">Known limitations</h2>
+<h2 id="known-limitations-1">Known limitations</h2>
 <ul>
 <li>USB HAL limitation: Double buffer mode is not functional with isochronous data transfers in host mode.</li>
 </ul>
-<h2 id="development-toolchains-and-compilers">Development Toolchains and Compilers</h2>
+<h2 id="development-toolchains-and-compilers-1">Development Toolchains and Compilers</h2>
 <ul>
 <li>IAR Embedded Workbench for ARM (EWARM) toolchain V8.50.9</li>
 <li>RealView Microcontroller Development Kit (MDK-ARM) toolchain V5.31</li>
 <li>STM32CubeIDE toolchain v1.7.0</li>
 </ul>
-<h2 id="supported-devices-and-boards">Supported Devices and boards</h2>
+<h2 id="supported-devices-and-boards-1">Supported Devices and boards</h2>
 <p>Supported Devices:</p>
 <ul>
 <li>STM32G0C1xx, STM32G0B1xx, STM32G0B0xx</li>
@@ -197,7 +238,7 @@
 <li>STM32G041xx, STM32G031xx, STM32G030xx ## Backward Compatibility</li>
 </ul>
 <p>This release is compatible with the previous versions.</p>
-<h2 id="dependencies">Dependencies</h2>
+<h2 id="dependencies-1">Dependencies</h2>
 <p><br />
 </p>
 </div>
@@ -205,7 +246,7 @@
 <div class="collapse">
 <input type="checkbox" id="collapse-section6" aria-hidden="true"> <label for="collapse-section6" aria-hidden="true">V1.4.1 / 25-February-2021</label>
 <div>
-<h2 id="main-changes-1">Main Changes</h2>
+<h2 id="main-changes-2">Main Changes</h2>
 <h3 id="patch-release">Patch release</h3>
 <p>Patch release of <strong>HAL and Low Layer</strong> drivers</p>
 <p><strong>Additional features</strong></p>
@@ -221,17 +262,17 @@
 </tr>
 </tbody>
 </table>
-<h2 id="known-limitations-1">Known limitations</h2>
+<h2 id="known-limitations-2">Known limitations</h2>
 <ul>
 <li>USB HAL limitation: Double buffer mode is not functional with isochronous data transfers in host mode.</li>
 </ul>
-<h2 id="development-toolchains-and-compilers-1">Development Toolchains and Compilers</h2>
+<h2 id="development-toolchains-and-compilers-2">Development Toolchains and Compilers</h2>
 <ul>
 <li>IAR Embedded Workbench for ARM (EWARM) toolchain V8.30.1</li>
 <li>RealView Microcontroller Development Kit (MDK-ARM) toolchain V5.29</li>
 <li>STM32CubeIDE toolchain v1.5.0</li>
 </ul>
-<h2 id="supported-devices-and-boards-1">Supported Devices and boards</h2>
+<h2 id="supported-devices-and-boards-2">Supported Devices and boards</h2>
 <p>Supported Devices:</p>
 <ul>
 <li>STM32G0C1xx, STM32G0B1xx, STM32G0B0xx</li>
@@ -241,7 +282,7 @@
 </ul>
 <h2 id="backward-compatibility">Backward Compatibility</h2>
 <p>This release is compatible with the previous versions.</p>
-<h2 id="dependencies-1">Dependencies</h2>
+<h2 id="dependencies-2">Dependencies</h2>
 <p><br />
 </p>
 </div>
@@ -249,7 +290,7 @@
 <div class="collapse">
 <input type="checkbox" id="collapse-section5" aria-hidden="true"> <label for="collapse-section5" aria-hidden="true">V1.4.0 / 29-October-2020</label>
 <div>
-<h2 id="main-changes-2">Main Changes</h2>
+<h2 id="main-changes-3">Main Changes</h2>
 <h3 id="maintenance-release-and-product-update">Maintenance release and Product Update</h3>
 <p><strong>Official release</strong> of HAL and Low layers drivers introducing <strong>STM32G0C1xx/STM32G0B1xx/STM32G0B0xx</strong> devices and <strong>STM32G061xx/STM32G051xx/STM32G050xx</strong> devices.</p>
 <p>Maintenance release of HAL and Low layers drivers supporting STM32G041xx/STM32G031xx/STM32G030xx and STM32G081xx/STM32G071xx/STM32G070xx devices.</p>
@@ -716,17 +757,17 @@
 </tr>
 </tbody>
 </table>
-<h2 id="known-limitations-2">Known limitations</h2>
+<h2 id="known-limitations-3">Known limitations</h2>
 <ul>
 <li>USB HAL limitation: Double buffer mode is not functional with isochronous data transfers in host mode.</li>
 </ul>
-<h2 id="development-toolchains-and-compilers-2">Development Toolchains and Compilers</h2>
+<h2 id="development-toolchains-and-compilers-3">Development Toolchains and Compilers</h2>
 <ul>
 <li>IAR Embedded Workbench for ARM (EWARM) toolchain V8.30.1</li>
 <li>RealView Microcontroller Development Kit (MDK-ARM) toolchain V5.29</li>
 <li>STM32CubeIDE toolchain v1.5.0</li>
 </ul>
-<h2 id="supported-devices-and-boards-2">Supported Devices and boards</h2>
+<h2 id="supported-devices-and-boards-3">Supported Devices and boards</h2>
 <p>Supported Devices:</p>
 <ul>
 <li><strong>STM32G0C1xx, STM32G0B1xx, STM32G0B0xx</strong></li>
@@ -736,7 +777,7 @@
 </ul>
 <h2 id="backward-compatibility-1">Backward Compatibility</h2>
 <p>This release is compatible with the previous versions.</p>
-<h2 id="dependencies-2">Dependencies</h2>
+<h2 id="dependencies-3">Dependencies</h2>
 <p><br />
 </p>
 </div>
@@ -744,8 +785,8 @@
 <div class="collapse">
 <input type="checkbox" id="collapse-section4" aria-hidden="true"> <label for="collapse-section4" aria-hidden="true">V1.3.0 / 25-June-2019</label>
 <div>
-<h2 id="main-changes-3">Main Changes</h2>
-<h3 id="maintenance-release-1">Maintenance release</h3>
+<h2 id="main-changes-4">Main Changes</h2>
+<h3 id="maintenance-release-2">Maintenance release</h3>
 <p>Maintenance release of HAL and Low layers drivers supporting STM32G041xx/STM32G031xx/STM32G030xx and STM32G081xx/STM32G071xx/STM32G070xx devices.</p>
 <p><strong>Fixed bugs list</strong></p>
 <table>
@@ -814,13 +855,13 @@
 </tr>
 </tbody>
 </table>
-<h2 id="development-toolchains-and-compilers-3">Development Toolchains and Compilers</h2>
+<h2 id="development-toolchains-and-compilers-4">Development Toolchains and Compilers</h2>
 <ul>
 <li>IAR Embedded Workbench for ARM (EWARM) toolchain V8.20.2</li>
 <li>RealView Microcontroller Development Kit (MDK-ARM) toolchain V5.25</li>
 <li>System Workbench STM32 (SW4STM32) toolchain V2.7.2</li>
 </ul>
-<h2 id="supported-devices-and-boards-3">Supported Devices and boards</h2>
+<h2 id="supported-devices-and-boards-4">Supported Devices and boards</h2>
 <p>Supported Devices:</p>
 <ul>
 <li>STM32G081xx, STM32G071xx, STM32G070xx</li>
@@ -828,13 +869,13 @@
 </ul>
 <h2 id="backward-compatibility-2">Backward Compatibility</h2>
 <p>This release is compatible with the previous versions.</p>
-<h2 id="dependencies-3">Dependencies</h2>
+<h2 id="dependencies-4">Dependencies</h2>
 </div>
 </div>
 <div class="collapse">
 <input type="checkbox" id="collapse-section3" aria-hidden="true"> <label for="collapse-section3" aria-hidden="true">V1.2.0 / 05-April-2019</label>
 <div>
-<h2 id="main-changes-4">Main Changes</h2>
+<h2 id="main-changes-5">Main Changes</h2>
 <h3 id="maintenance-release-and-product-update-1">Maintenance release and product update</h3>
 <p>First release of HAL and Low layers drivers to introduce support of <strong>STM32G041xx/STM32G031xx/STM32G030xx devices</strong>.</p>
 <p>Maintenance release of HAL and Low layers drivers supporting STM32G081xx/STM32G071xx/STM32G070xx devices.</p>
@@ -921,13 +962,13 @@
 </tr>
 </tbody>
 </table>
-<h2 id="development-toolchains-and-compilers-4">Development Toolchains and Compilers</h2>
+<h2 id="development-toolchains-and-compilers-5">Development Toolchains and Compilers</h2>
 <ul>
 <li>IAR Embedded Workbench for ARM (EWARM) toolchain V8.20.2</li>
 <li>RealView Microcontroller Development Kit (MDK-ARM) toolchain V5.25</li>
 <li>System Workbench STM32 (SW4STM32) toolchain V2.7.2</li>
 </ul>
-<h2 id="supported-devices-and-boards-4">Supported Devices and boards</h2>
+<h2 id="supported-devices-and-boards-5">Supported Devices and boards</h2>
 <p>Supported Devices:</p>
 <ul>
 <li>STM32G081xx, STM32G071xx, STM32G070xx</li>
@@ -935,13 +976,13 @@
 </ul>
 <h2 id="backward-compatibility-3">Backward Compatibility</h2>
 <p>This release is compatible with the previous versions.</p>
-<h2 id="dependencies-4">Dependencies</h2>
+<h2 id="dependencies-5">Dependencies</h2>
 </div>
 </div>
 <div class="collapse">
 <input type="checkbox" id="collapse-section2" aria-hidden="true"> <label for="collapse-section2" aria-hidden="true">V1.1.0 / 06-February-2019</label>
 <div>
-<h2 id="main-changes-5">Main Changes</h2>
+<h2 id="main-changes-6">Main Changes</h2>
 <h3 id="maintenance-release-and-product-update-2">Maintenance release and product update</h3>
 <p>Maintenance release of HAL and Low layers drivers to support STM32G071xx/STM32G081xx/STM32G070xx devices.</p>
 <p><strong>Additional features</strong></p>
@@ -1030,7 +1071,7 @@
 </tr>
 </tbody>
 </table>
-<h2 id="supported-devices-and-boards-5">Supported Devices and boards</h2>
+<h2 id="supported-devices-and-boards-6">Supported Devices and boards</h2>
 <p>Supported Devices:</p>
 <ul>
 <li>STM32G0<strong>81</strong>xx</li>
@@ -1039,23 +1080,23 @@
 </ul>
 <h2 id="backward-compatibility-4">Backward Compatibility</h2>
 <p>This release is compatible with the previous versions.</p>
-<h2 id="dependencies-5">Dependencies</h2>
+<h2 id="dependencies-6">Dependencies</h2>
 </div>
 </div>
 <div class="collapse">
 <input type="checkbox" id="collapse-section1" aria-hidden="true"> <label for="collapse-section1" aria-hidden="true">V1.0.0 / 26-October-2018</label>
 <div>
-<h2 id="main-changes-6">Main Changes</h2>
+<h2 id="main-changes-7">Main Changes</h2>
 <h3 id="first-release">First release</h3>
 <p>First official release of HAL and Low layers drivers to support STM32G071xx/STM32G081xx/STM32G070xx</p>
-<h2 id="supported-devices-and-boards-6">Supported Devices and boards</h2>
+<h2 id="supported-devices-and-boards-7">Supported Devices and boards</h2>
 <p>Supported Devices:</p>
 <ul>
 <li>STM32G0<strong>81</strong>xx</li>
 <li>STM32G0<strong>71</strong>xx</li>
 <li>STM32G0<strong>70</strong>xx</li>
 </ul>
-<h2 id="dependencies-6">Dependencies</h2>
+<h2 id="dependencies-7">Dependencies</h2>
 </div>
 </div>
 </section>
diff --git a/Src/stm32g0xx_hal.c b/Src/stm32g0xx_hal.c
index e2208fa..efa598b 100644
--- a/Src/stm32g0xx_hal.c
+++ b/Src/stm32g0xx_hal.c
@@ -57,7 +57,7 @@
   */
 #define __STM32G0xx_HAL_VERSION_MAIN   (0x01U) /*!< [31:24] main version */
 #define __STM32G0xx_HAL_VERSION_SUB1   (0x04U) /*!< [23:16] sub1 version */
-#define __STM32G0xx_HAL_VERSION_SUB2   (0x02U) /*!< [15:8]  sub2 version */
+#define __STM32G0xx_HAL_VERSION_SUB2   (0x03U) /*!< [15:8]  sub2 version */
 #define __STM32G0xx_HAL_VERSION_RC     (0x00U) /*!< [7:0]  release candidate */
 #define __STM32G0xx_HAL_VERSION         ((__STM32G0xx_HAL_VERSION_MAIN << 24U)\
                                         |(__STM32G0xx_HAL_VERSION_SUB1 << 16U)\
diff --git a/Src/stm32g0xx_hal_hcd.c b/Src/stm32g0xx_hal_hcd.c
index 55aee18..f62c075 100644
--- a/Src/stm32g0xx_hal_hcd.c
+++ b/Src/stm32g0xx_hal_hcd.c
@@ -81,8 +81,11 @@
 static uint8_t HAL_HCD_Check_usedChannel(HCD_HandleTypeDef *hhcd, uint8_t ch_num);
 static uint8_t HAL_HCD_Get_FreePhyChannel(HCD_HandleTypeDef *hhcd, uint8_t ch_num, uint8_t epnum, uint8_t ep_type);
 
+#if (USE_USB_DOUBLE_BUFFER == 1U)
 static void HCD_HC_IN_BulkDb(HCD_HandleTypeDef *hhcd, uint8_t ch_num, uint8_t phy_chnum, uint32_t regvalue);
 static void HCD_HC_OUT_BulkDb(HCD_HandleTypeDef *hhcd, uint8_t ch_num, uint8_t phy_chnum, uint32_t regvalue);
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
+
 static uint16_t HAL_HCD_GetFreePMA(HCD_HandleTypeDef *hhcd, uint16_t mps);
 static HAL_StatusTypeDef  HAL_HCD_PMAFree(HCD_HandleTypeDef *hhcd, uint32_t pma_base, uint16_t mps);
 static void inline HCD_HC_IN_ISO(HCD_HandleTypeDef *hhcd, uint8_t ch_num, uint8_t phy_chnum, uint32_t regvalue);
@@ -154,24 +157,27 @@
   /* Disable the Interrupts */
   (void)__HAL_HCD_DISABLE(hhcd);
 
-  /*Init the Core (common init.) */
+  /* Dma not supported, force to zero */
+  hhcd->Init.dma_enable = 0U;
+
+  /* Init the Core (common init.) */
   (void)USB_CoreInit(hhcd->Instance, hhcd->Init);
 
-  /* Force Host Mode*/
+  /* Force Host Mode */
   (void)USB_SetCurrentMode(hhcd->Instance, USB_HOST_MODE);
 
   /* Init Host */
   (void)USB_HostInit(hhcd->Instance, hhcd->Init);
 
-  /* Deactivate the power down*/
+  /* Deactivate the power down */
   hhcd->Instance->CNTR  &= ~USB_CNTR_PDWN;
 
   hhcd->State = HAL_HCD_STATE_READY;
 
-  /*Host Port State*/
+  /* Host Port State */
   hhcd->HostState = HCD_HCD_STATE_DISCONNECTED;
 
-  /*Init PMA Address */
+  /* Init PMA Address */
   (void)HAL_HCD_PMAReset(hhcd);
 
   hhcd->State = HAL_HCD_STATE_READY;
@@ -209,19 +215,20 @@
 {
   HAL_StatusTypeDef status;
   uint8_t used_channel;
+  uint8_t ep0_virtual_channel;
 
   __HAL_LOCK(hhcd);
 
   /* Check if the logical channel are already allocated */
   used_channel = HAL_HCD_Check_usedChannel(hhcd, ch_num);
 
-  /*Check if the channel is not already opened */
+  /* Check if the channel is not already opened */
   if (used_channel == 0U)
   {
-    /*Allocate New Physical channel */
+    /* Allocate New Physical channel */
     hhcd->hc[ch_num & 0xFU].phy_ch_num = HAL_HCD_Get_FreePhyChannel(hhcd, ch_num, epnum, ep_type);
 
-    /*if it is not able to allocate channel  */
+    /* No free Channel available, return error */
     if (hhcd->hc[ch_num & 0xFU].phy_ch_num == HCD_FREE_CH_NOT_FOUND)
     {
       return HAL_ERROR;
@@ -230,7 +237,7 @@
   /* Channel already opened */
   else
   {
-    /*Get Physical Channel number */
+    /* Get Physical Channel number */
     hhcd->hc[ch_num & 0xFU].phy_ch_num = (used_channel & 0xF0U) >> 4U;
   }
 
@@ -249,7 +256,7 @@
   hhcd->hc[ch_num & 0xFU].ep_num     = epnum & 0x7FU;
   hhcd->hc[ch_num & 0xFU].speed      = speed;
 
-  /*Check if the channel is not already opened */
+  /* Check if the channel is not already opened */
   if (used_channel == 0U)
   {
     if (((ep_type == EP_TYPE_ISOC) && (hhcd->Init.iso_singlebuffer_enable == 0U)) ||
@@ -257,19 +264,118 @@
     {
       /* PMA Dynamic Allocation */
       status = HAL_HCD_PMAlloc(hhcd, ch_num, HCD_DBL_BUF, mps);
+
       if (status == HAL_ERROR)
       {
         return HAL_ERROR;
       }
+
+      /* Clear Channel DTOG_TX */
+      HCD_CLEAR_TX_DTOG(hhcd->Instance, hhcd->hc[ch_num & 0xFU].phy_ch_num);
+
+      /* Clear Channel DTOG RX */
+      HCD_CLEAR_RX_DTOG(hhcd->Instance, hhcd->hc[ch_num & 0xFU].phy_ch_num);
+
     }
     else
     {
-      /* PMA Dynamic Allocation */
-      status = HAL_HCD_PMAlloc(hhcd, ch_num, HCD_SNG_BUF, mps);
-      if (status == HAL_ERROR)
+      if (hhcd->hc[ch_num & 0xFU].ep_num != 0U)
       {
-        return HAL_ERROR;
+        status = HAL_HCD_PMAlloc(hhcd, ch_num, HCD_SNG_BUF, mps);
+
+        if (status == HAL_ERROR)
+        {
+          return HAL_ERROR;
+        }
       }
+      else
+      {
+        if (ch_num == 0U)
+        {
+          ep0_virtual_channel = (uint8_t)(hhcd->ep0_PmaAllocState & 0xFU);
+
+          if ((ep0_virtual_channel != 0U) && (((hhcd->ep0_PmaAllocState & 0xF0U) >> 4) == CH_IN_DIR))
+          {
+            if (hhcd->hc[ch_num & 0xFU].ch_dir == CH_OUT_DIR)
+            {
+              status = HAL_HCD_PMAlloc(hhcd, ch_num, HCD_SNG_BUF, 64U);
+
+              if (status == HAL_ERROR)
+              {
+                return HAL_ERROR;
+              }
+            }
+            else
+            {
+              return HAL_ERROR;
+            }
+          }
+          else
+          {
+            /* PMA Dynamic Allocation for EP0 OUT direction */
+            hhcd->hc[ch_num & 0xFU].ch_dir = CH_OUT_DIR;
+            status = HAL_HCD_PMAlloc(hhcd, ch_num, HCD_SNG_BUF, 64U);
+
+            if (status == HAL_ERROR)
+            {
+              return HAL_ERROR;
+            }
+
+            /* PMA Dynamic Allocation for EP0 IN direction */
+            hhcd->hc[ch_num & 0xFU].ch_dir = CH_IN_DIR;
+            status = HAL_HCD_PMAlloc(hhcd, ch_num, HCD_SNG_BUF, 64U);
+
+            if (status == HAL_ERROR)
+            {
+              return HAL_ERROR;
+            }
+          }
+        }
+        else
+        {
+          if (((hhcd->ep0_PmaAllocState & 0xF00U) >> 8) == 1U)
+          {
+            ep0_virtual_channel = (uint8_t)(hhcd->ep0_PmaAllocState & 0xFU);
+
+            if (((hhcd->ep0_PmaAllocState & 0xF0U) >> 4) == CH_IN_DIR)
+            {
+              hhcd->hc[ch_num & 0xFU].pmaaddr1 = hhcd->hc[ep0_virtual_channel & 0xFU].pmaaddr1;
+            }
+            else
+            {
+              hhcd->hc[ch_num & 0xFU].pmaaddr0 = hhcd->hc[ep0_virtual_channel & 0xFU].pmaaddr0;
+            }
+          }
+          else
+          {
+            status = HAL_HCD_PMAlloc(hhcd, ch_num, HCD_SNG_BUF, 64U);
+
+            if (status == HAL_ERROR)
+            {
+              return HAL_ERROR;
+            }
+          }
+        }
+      }
+    }
+  }
+
+  if ((epnum & 0x80U) != 0U)
+  {
+    hhcd->hc[ch_num & 0xFU].ch_dir = CH_IN_DIR;
+
+    if (hhcd->hc[ch_num & 0xFU].ep_num == 0U)
+    {
+      hhcd->hc[ch_num & 0xFU].pmaadress = hhcd->hc[ch_num & 0xFU].pmaaddr1;
+    }
+  }
+  else
+  {
+    hhcd->hc[ch_num & 0xFU].ch_dir = CH_OUT_DIR;
+
+    if (hhcd->hc[ch_num & 0xFU].ep_num == 0U)
+    {
+      hhcd->hc[ch_num & 0xFU].pmaadress = hhcd->hc[ch_num & 0xFU].pmaaddr0;
     }
   }
 
@@ -282,11 +388,9 @@
   {
     if (hhcd->Init.iso_singlebuffer_enable == 1U)
     {
-      (void)USB_HC_DoubleBuffer(hhcd->Instance, hhcd->hc[ch_num & 0xFU].phy_ch_num, USB_DRD_DBUFF_ENBALE);
+      (void)USB_HC_DoubleBuffer(hhcd->Instance, hhcd->hc[ch_num & 0xFU].phy_ch_num,
+                                USB_DRD_ISOC_DBUFF_DISABLE);
     }
-    /*Init Buffer State */
-    hhcd->hc[ch_num & 0xFU].pmabuff0_state = USB_PMABUF_EMPTY;
-    hhcd->hc[ch_num & 0xFU].pmabuff1_state = USB_PMABUF_EMPTY;
   }
 
   /* Bulk double buffer check */
@@ -294,9 +398,11 @@
   {
     if (hhcd->Init.bulk_doublebuffer_enable == 1U)
     {
-      (void)USB_HC_DoubleBuffer(hhcd->Instance, hhcd->hc[ch_num & 0xFU].phy_ch_num, USB_DRD_DBUFF_ENBALE);
+      (void)USB_HC_DoubleBuffer(hhcd->Instance, hhcd->hc[ch_num & 0xFU].phy_ch_num,
+                                USB_DRD_BULK_DBUFF_ENBALE);
     }
   }
+
   __HAL_UNLOCK(hhcd);
 
   return status;
@@ -379,6 +485,9 @@
     hhcd->phy_chout_state[idx] = 0U;
   }
 
+  /* reset Ep0 Pma allocation state */
+  hhcd->ep0_PmaAllocState = 0U;
+
   return HAL_OK;
 }
 
@@ -600,6 +709,7 @@
   uint8_t phy_chnum;
   uint8_t chnum;
   uint32_t epch_reg;
+  uint32_t wIstr = USB_ReadInterrupts(hhcd->Instance);
 
   /* check if this is an USB pending IT */
   if ((SYSCFG->IT_LINE_SR[8] & (0x1U << 2)) == 0U)
@@ -608,22 +718,24 @@
   }
 
   /* Port Change Detected (Connection/Disconnection) */
-  if (__HAL_HCD_GET_FLAG(hhcd, USB_ISTR_DCON))
+  if ((wIstr & USB_ISTR_DCON) == USB_ISTR_DCON)
   {
     /* Clear Flag */
     __HAL_HCD_CLEAR_FLAG(hhcd, USB_ISTR_DCON);
 
     /* Call Port IRQHandler */
     HCD_Port_IRQHandler(hhcd);
+
+    return;
   }
 
   /* Correct Transaction Detected -------*/
-  if (__HAL_HCD_GET_FLAG(hhcd, USB_ISTR_CTR))
+  if ((wIstr & USB_ISTR_CTR) == USB_ISTR_CTR)
   {
     /* Handle Host channel Interrupt */
     for (phy_chnum = 0U; phy_chnum < hhcd->Init.Host_channels; phy_chnum++)
     {
-      if ((HCD_GET_CHANNEL(hhcd->Instance, phy_chnum)  &USB_CH_VTRX) != 0U)
+      if ((HCD_GET_CHANNEL(hhcd->Instance, phy_chnum) & USB_CH_VTRX) != 0U)
       {
         /* Get Logical channel to check if the channel is already opened */
         chnum = HAL_HCD_GetLogical_Channel(hhcd, phy_chnum, 1U);
@@ -644,9 +756,9 @@
         }
       }
 
-      if ((HCD_GET_CHANNEL(hhcd->Instance, phy_chnum)  &USB_CH_VTTX) != 0U)
+      if ((HCD_GET_CHANNEL(hhcd->Instance, phy_chnum) & USB_CH_VTTX) != 0U)
       {
-        /*Get Logical channel to check if the channel is already opened*/
+        /* Get Logical channel to check if the channel is already opened */
         chnum = HAL_HCD_GetLogical_Channel(hhcd, phy_chnum, 0U);
 
         if (chnum != HCD_LOGICAL_CH_NOT_OPENED)
@@ -656,7 +768,7 @@
         }
         else
         {
-          /*Clear Error & unwanted VTTX or Channel was not closed correctly */
+          /* Clear Error & unwanted VTTX or Channel was not closed correctly */
           epch_reg = HCD_GET_CHANNEL(hhcd->Instance, phy_chnum);
           epch_reg = (epch_reg & (USB_CHEP_REG_MASK & (~USB_CH_ERRTX) & (~USB_CH_VTTX))) |
                      (USB_CH_VTRX | USB_CH_ERRRX);
@@ -666,13 +778,11 @@
       }
     }
 
-    /* Clear Correct Transfer */
-    __HAL_HCD_CLEAR_FLAG(hhcd, USB_ISTR_CTR);
-
+    return;
   }
 
   /* Wakeup Flag Detected */
-  if (__HAL_HCD_GET_FLAG(hhcd, USB_ISTR_WKUP))
+  if ((wIstr & USB_ISTR_WKUP) == USB_ISTR_WKUP)
   {
     if (hhcd->HostState == HCD_HCD_STATE_SUSPEND)
     {
@@ -688,27 +798,33 @@
     }
     else
     {
-      /*Clear the wake-up flag*/
+      /* Clear the wake-up flag */
       __HAL_HCD_CLEAR_FLAG(hhcd, USB_ISTR_WKUP);
     }
+
+    return;
   }
 
-  /*Global Error Flag Detected */
-  if (__HAL_HCD_GET_FLAG(hhcd, USB_ISTR_ERR))
+  /* Global Error Flag Detected */
+  if ((wIstr & USB_ISTR_ERR) == USB_ISTR_ERR)
   {
     __HAL_HCD_CLEAR_FLAG(hhcd, USB_ISTR_ERR);
+
+    return;
   }
 
   /* PMA Overrun detected */
-  if (__HAL_HCD_GET_FLAG(hhcd, USB_ISTR_PMAOVR))
+  if ((wIstr & USB_ISTR_PMAOVR) == USB_ISTR_PMAOVR)
   {
     __HAL_HCD_CLEAR_FLAG(hhcd, USB_ISTR_PMAOVR);
+
+    return;
   }
 
   /* Suspend Detected */
-  if (__HAL_HCD_GET_FLAG(hhcd, USB_ISTR_SUSP))
+  if ((wIstr & USB_ISTR_SUSP) == USB_ISTR_SUSP)
   {
-    /*Set HAL State to Suspend */
+    /* Set HAL State to Suspend */
     hhcd->HostState = HCD_HCD_STATE_SUSPEND;
 
     /* Force low-power mode in the macrocell */
@@ -717,12 +833,14 @@
     /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */
     __HAL_HCD_CLEAR_FLAG(hhcd, USB_ISTR_SUSP);
 
-    /*Call suspend Callback*/
+    /* Call suspend Callback */
     HAL_HCD_SuspendCallback(hhcd);
+
+    return;
   }
 
-  /*Start Of Frame Detected */
-  if (__HAL_HCD_GET_FLAG(hhcd, USB_ISTR_SOF))
+  /* Start Of Frame Detected */
+  if ((wIstr & USB_ISTR_SOF) == USB_ISTR_SOF)
   {
 #if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
     hhcd->SOFCallback(hhcd);
@@ -737,8 +855,15 @@
     {
       /* HAL State */
       hhcd->HostState = HCD_HCD_STATE_RUN;
+
+#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
+      hhcd->PortEnabledCallback(hhcd);
+#else
       HAL_HCD_PortEnabled_Callback(hhcd);
+#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
     }
+
+    return;
   }
 }
 
@@ -970,7 +1095,7 @@
   /* Process locked */
   __HAL_LOCK(hhcd);
 
-  /* Setup Legacy weak Callbacks  */
+  /* Setup Legacy weak Callbacks */
   if (hhcd->State == HAL_HCD_STATE_READY)
   {
     switch (CallbackID)
@@ -1183,6 +1308,9 @@
   /* Reset the PMA current pointer */
   (void)HAL_HCD_PMAReset(hhcd);
 
+  /* reset Ep0 Pma allocation state */
+  hhcd->ep0_PmaAllocState = 0U;
+
   __HAL_UNLOCK(hhcd);
   return HAL_OK;
 }
@@ -1194,7 +1322,7 @@
   */
 HAL_StatusTypeDef HAL_HCD_Suspend(HCD_HandleTypeDef *hhcd)
 {
-  uint32_t count = 0U;
+  __IO uint32_t count = 0U;
 
   /* Set Suspend Mode */
   hhcd->Instance->CNTR |= USB_CNTR_SUSPEN;
@@ -1369,6 +1497,7 @@
   return (USB_GetHostSpeed(hhcd->Instance));
 }
 
+#if (USE_USB_DOUBLE_BUFFER == 1U)
 /**
   * @brief  Handle Host Channel OUT Double Buffer Bulk requests.
   * @param  hhcd HCD handle
@@ -1407,7 +1536,9 @@
       if ((regvalue & USB_CH_DTOG_RX) != 0U)
       {
         /* Toggle SwBuff */
-        HCD_FreeUserBuffer(hhcd->Instance, phy_chnum, 1U);
+        HCD_CLEAR_TX_DTOG(hhcd->Instance, phy_chnum);
+        HCD_CLEAR_RX_DTOG(hhcd->Instance, phy_chnum);
+        HCD_TX_DTOG(hhcd->Instance, phy_chnum);
       }
 
       /* hhcd->hc[ch_num&0xFU].xfer_len_db==0 ==> when all data are written in the PMA to yet transferred */
@@ -1428,7 +1559,7 @@
         }
 
         /* Write remaining data to Buffer0 */
-        HCD_SET_CH_TX_CNT(hhcd->Instance, phy_chnum, (uint16_t)len);
+        HCD_SET_CH_DBUF0_CNT(hhcd->Instance, phy_chnum, 1U, (uint16_t)len);
         USB_WritePMA(hhcd->Instance, hhcd->hc[ch_num & 0xFU].xfer_buff,
                      hhcd->hc[ch_num & 0xFU].pmaaddr0, (uint16_t)len);
       }
@@ -1466,7 +1597,9 @@
       if ((regvalue & USB_CH_DTOG_RX) == 0U)
       {
         /* Toggle SwBuff */
-        HCD_FreeUserBuffer(hhcd->Instance, phy_chnum, 1U);
+        HCD_CLEAR_TX_DTOG(hhcd->Instance, phy_chnum);
+        HCD_CLEAR_RX_DTOG(hhcd->Instance, phy_chnum);
+        HCD_RX_DTOG(hhcd->Instance, phy_chnum);
       }
 
       /* hhcd->hc[ch_num&0xFU].xfer_len_db==0 ==> when all data are written in the PMA to yet transferred */
@@ -1487,11 +1620,12 @@
         }
 
         /* Write remaining data to Buffer0 */
-        HCD_SET_CH_DBUF1_CNT(hhcd->Instance, phy_chnum, 0U, (uint16_t)len);
+        HCD_SET_CH_DBUF1_CNT(hhcd->Instance, phy_chnum, 1U, (uint16_t)len);
 
         USB_WritePMA(hhcd->Instance, hhcd->hc[ch_num & 0xFU].xfer_buff,
                      hhcd->hc[ch_num & 0xFU].pmaaddr1, (uint16_t)len);
       }
+
       /* start a new transfer */
       HCD_SET_CH_TX_STATUS(hhcd->Instance, phy_chnum, USB_CH_TX_VALID);
     }
@@ -1502,6 +1636,7 @@
       hhcd->hc[ch_num & 0xFU].state = HC_XFRC;
       hhcd->hc[ch_num & 0xFU].urb_state  = URB_DONE;
       hhcd->hc[ch_num & 0xFU].toggle_out ^= 1U;
+
       /* Close the channel */
       HCD_SET_CH_TX_STATUS(hhcd->Instance, phy_chnum, USB_CH_TX_DIS);
     }
@@ -1510,6 +1645,96 @@
 
 
 /**
+  * @brief  Handle Host Channel IN Double Buffer Bulk requests.
+  * @param  hhcd HCD handle
+  * @param  ch_num Channel number: This parameter can be a value from 1 to 15
+  * @param  phy_chnum Physical Channel number [0..7]
+  * @param  regvalue contain Snapshot of the EPCHn register when ISR is detected
+  * @retval none
+  */
+static void HCD_HC_IN_BulkDb(HCD_HandleTypeDef *hhcd,
+                             uint8_t ch_num, uint8_t phy_chnum, uint32_t regvalue)
+{
+  uint16_t received_bytes;
+
+  /* Read from Buffer 0 */
+  if ((regvalue & USB_CH_DTOG_RX) != 0U)
+  {
+    received_bytes = (uint16_t)HCD_GET_CH_DBUF0_CNT(hhcd->Instance, phy_chnum);
+
+    if (hhcd->hc[ch_num & 0xFU].xfer_len <= received_bytes)
+    {
+      hhcd->hc[ch_num & 0xFU].xfer_len = 0U;
+    }
+    else
+    {
+      hhcd->hc[ch_num & 0xFU].xfer_len -= received_bytes;
+    }
+
+    /* Check if we Need to free the other buffer for the IP */
+    if ((hhcd->hc[ch_num & 0xFU].xfer_len != 0U) && ((regvalue & USB_CH_DTOG_TX) != 0U))
+    {
+      /* Toggle SwBuff to Allow the IP to submit a new IN */
+      HCD_FREE_USER_BUFFER(hhcd->Instance, phy_chnum, 0U);
+    }
+
+    /* Read the byte from PMA to user Buffer(System Memory) */
+    USB_ReadPMA(hhcd->Instance, hhcd->hc[ch_num & 0xFU].xfer_buff,
+                hhcd->hc[ch_num & 0xFU].pmaaddr0, (uint16_t)received_bytes);
+  }
+  else
+  {
+    /* Read from Buffer 1 */
+    received_bytes = (uint16_t) HCD_GET_CH_DBUF1_CNT(hhcd->Instance, phy_chnum);
+
+    if (hhcd->hc[ch_num & 0xFU].xfer_len <= received_bytes)
+    {
+      hhcd->hc[ch_num & 0xFU].xfer_len = 0U;
+    }
+    else
+    {
+      hhcd->hc[ch_num & 0xFU].xfer_len -= received_bytes;
+    }
+
+    /* Check if we Need to free the other buffer for the IP */
+    if ((hhcd->hc[ch_num & 0xFU].xfer_len != 0U) && ((regvalue & USB_CH_DTOG_TX) == 0U))
+    {
+      /* Toggle SwBuff */
+      HCD_FREE_USER_BUFFER(hhcd->Instance, phy_chnum, 0U);
+    }
+
+    /* Read the byte from PMA to user Buffer(System Memory) */
+    USB_ReadPMA(hhcd->Instance, hhcd->hc[ch_num & 0xFU].xfer_buff,
+                hhcd->hc[ch_num & 0xFU].pmaaddr1, (uint16_t)received_bytes);
+  }
+
+  /* update the global number of all received bytes */
+  hhcd->hc[ch_num & 0xFU].xfer_count += received_bytes;
+
+  /* Transfer complete state */
+  hhcd->hc[ch_num & 0xFU].state = HC_ACK;
+  hhcd->hc[ch_num & 0xFU].ErrCnt = 0U;
+
+  if ((hhcd->hc[ch_num & 0xFU].xfer_len == 0U) ||
+      ((received_bytes < hhcd->hc[ch_num & 0xFU].max_packet)))
+  {
+    hhcd->hc[ch_num & 0xFU].urb_state  = URB_DONE;
+    hhcd->hc[ch_num & 0xFU].state  = HC_XFRC;
+
+    /* disable channel */
+    HCD_SET_CH_RX_STATUS(hhcd->Instance, phy_chnum, USB_CH_RX_DIS);
+  }
+  else
+  {
+    hhcd->hc[ch_num & 0xFU].xfer_buff += received_bytes;
+
+    /* Reactivate the Channel Submit an other URB since the Transfer is not yet completed */
+    HCD_SET_CH_RX_STATUS(hhcd->Instance, phy_chnum, USB_CH_RX_STRX);
+  }
+}
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
+
+/**
   * @brief  Handle Host Channel IN Isochronous Transaction
   * @param  hhcd HCD handle
   * @param  ch_num Channel number: This parameter can be a value from 1 to 15
@@ -1521,7 +1746,21 @@
                                  uint8_t phy_chnum, uint32_t regvalue)
 {
   /* Check if Double buffer isochronous */
-  if ((regvalue & USB_CH_KIND) == 0U)
+  if ((regvalue & USB_CH_KIND) != 0U)
+  {
+    /* Get Data IN Packet */
+    hhcd->hc[ch_num & 0xFU].xfer_count = HCD_GET_CH_RX_CNT(hhcd->Instance, phy_chnum);
+    if (hhcd->hc[ch_num & 0xFU].xfer_count != 0U)
+    {
+      USB_ReadPMA(hhcd->Instance, hhcd->hc[ch_num & 0xFU].xfer_buff,
+                  hhcd->hc[ch_num & 0xFU].pmaadress,
+                  (uint16_t)hhcd->hc[ch_num & 0xFU].xfer_count);
+
+      hhcd->hc[ch_num & 0xFU].urb_state = URB_DONE;
+    }
+  }
+#if (USE_USB_DOUBLE_BUFFER == 1U)
+  else  /* double buffer isochronous */
   {
     /* Read from Buffer0 */
     if ((regvalue & USB_CH_DTOG_RX) != 0U)
@@ -1555,112 +1794,13 @@
       }
     }
   }
-  else  /* single buffer isochronous */
-  {
-    /* Get Control Data OUT Packet*/
-    hhcd->hc[ch_num & 0xFU].xfer_count = HCD_GET_CH_RX_CNT(hhcd->Instance, phy_chnum);
-    if (hhcd->hc[ch_num & 0xFU].xfer_count != 0U)
-    {
-      USB_ReadPMA(hhcd->Instance, hhcd->hc[ch_num & 0xFU].xfer_buff,
-                  hhcd->hc[ch_num & 0xFU].pmaadress,
-                  (uint16_t)hhcd->hc[ch_num & 0xFU].xfer_count);
-
-      hhcd->hc[ch_num & 0xFU].urb_state = URB_DONE;
-    }
-  }
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
 
   /* Transfer complete state */
   hhcd->hc[ch_num & 0xFU].state = HC_XFRC;
 
   /* Clear VTRX */
   HCD_CLEAR_RX_CH_CTR(hhcd->Instance, phy_chnum);
-
-}
-/**
-  * @brief  Handle Host Channel IN Double Buffer Bulk requests.
-  * @param  hhcd HCD handle
-  * @param  ch_num Channel number: This parameter can be a value from 1 to 15
-  * @param  phy_chnum Physical Channel number [0..7]
-  * @param  regvalue contain Snapshot of the EPCHn register when ISR is detected
-  * @retval none
-  */
-static void HCD_HC_IN_BulkDb(HCD_HandleTypeDef *hhcd,
-                             uint8_t ch_num, uint8_t phy_chnum, uint32_t regvalue)
-{
-  uint16_t received_bytes;
-
-  /* Read from Buffer 0 */
-  if ((regvalue & USB_CH_DTOG_RX) != 0U)
-  {
-    received_bytes = (uint16_t)HCD_GET_CH_DBUF0_CNT(hhcd->Instance, phy_chnum);
-
-    if (hhcd->hc[ch_num & 0xFU].xfer_len <= received_bytes)
-    {
-      hhcd->hc[ch_num & 0xFU].xfer_len = 0U;
-    }
-    else
-    {
-      hhcd->hc[ch_num & 0xFU].xfer_len -= received_bytes;
-    }
-    /* Check if we Need to free the other buffer for the IP */
-    if ((hhcd->hc[ch_num & 0xFU].xfer_len != 0U) && ((regvalue & USB_CH_DTOG_TX) != 0U))
-    {
-      /* Toggle SwBuff */
-      HCD_FreeUserBuffer(hhcd->Instance, phy_chnum, 0U);/* Allow the IP to submit a new IN */
-    }
-    /* Read the byte from PMA to user Buffer(System Memory) */
-    USB_ReadPMA(hhcd->Instance, hhcd->hc[ch_num & 0xFU].xfer_buff,
-                hhcd->hc[ch_num & 0xFU].pmaaddr0, (uint16_t)received_bytes);
-  }
-  else
-  {
-    /* Read from Buffer 1 */
-    received_bytes = (uint16_t) HCD_GET_CH_DBUF1_CNT(hhcd->Instance, phy_chnum);
-
-    if (hhcd->hc[ch_num & 0xFU].xfer_len <= received_bytes)
-    {
-      hhcd->hc[ch_num & 0xFU].xfer_len = 0U;
-    }
-    else
-    {
-      hhcd->hc[ch_num & 0xFU].xfer_len -= received_bytes;
-    }
-
-    /* Check if we Need to free the other buffer for the IP */
-    if ((hhcd->hc[ch_num & 0xFU].xfer_len != 0U) && ((regvalue & USB_CH_DTOG_TX) == 0U))
-    {
-      /* Toggle SwBuff */
-      HCD_FreeUserBuffer(hhcd->Instance, phy_chnum, 0U);
-    }
-
-    /* Read the byte from PMA to user Buffer(System Memory) */
-    USB_ReadPMA(hhcd->Instance, hhcd->hc[ch_num & 0xFU].xfer_buff,
-                hhcd->hc[ch_num & 0xFU].pmaaddr1, (uint16_t)received_bytes);
-  }
-
-  /* update the global number of all received bytes */
-  hhcd->hc[ch_num & 0xFU].xfer_count += received_bytes;
-
-  /* Transfer complete state */
-  hhcd->hc[ch_num & 0xFU].state = HC_ACK;
-  hhcd->hc[ch_num & 0xFU].ErrCnt = 0U;
-
-  if ((hhcd->hc[ch_num & 0xFU].xfer_len == 0U) ||
-      ((received_bytes < hhcd->hc[ch_num & 0xFU].max_packet)))
-  {
-    hhcd->hc[ch_num & 0xFU].urb_state  = URB_DONE;
-    hhcd->hc[ch_num & 0xFU].state  = HC_XFRC;
-
-    /* disable channel */
-    HCD_SET_CH_RX_STATUS(hhcd->Instance, phy_chnum, USB_CH_RX_DIS);
-  }
-  else
-  {
-    hhcd->hc[ch_num & 0xFU].xfer_buff += received_bytes;
-
-    /* Reactivate the Channel Submit an other URB since the Transfer is not yet completed */
-    HCD_SET_CH_RX_STATUS(hhcd->Instance, phy_chnum, USB_CH_RX_STRX);
-  }
 }
 
 /**
@@ -1704,6 +1844,7 @@
         /* Transfer complete state */
         hhcd->hc[ch_num & 0xFU].state = HC_ACK;
         hhcd->hc[ch_num & 0xFU].ErrCnt = 0U;
+
         if (hhcd->hc[ch_num & 0xFU].xfer_len <= received_bytes)
         {
           hhcd->hc[ch_num & 0xFU].xfer_len = 0U;
@@ -1712,6 +1853,7 @@
         {
           hhcd->hc[ch_num & 0xFU].xfer_len -= received_bytes;
         }
+
         if ((hhcd->hc[ch_num & 0xFU].xfer_len == 0U) ||
             ((received_bytes < hhcd->hc[ch_num & 0xFU].max_packet)))
         {
@@ -1725,13 +1867,13 @@
           /* Reactivate the Channel to Submit another URB since the Transfer is not yet completed */
           HCD_SET_CH_RX_STATUS(hhcd->Instance, phy_chnum, USB_CH_RX_STRX);
         }
+
         if ((hhcd->hc[ch_num & 0xFU].ep_type == EP_TYPE_BULK) ||
             (hhcd->hc[ch_num & 0xFU].ep_type == EP_TYPE_INTR))
         {
           hhcd->hc[ch_num & 0xFU].toggle_out ^= 1U;
         }
       }
-
       /* manage NACK Response */
       else if (((ch_reg & USB_CH_RX_STRX) == USB_CH_RX_NAK)
                && (hhcd->hc[ch_num & 0xFU].urb_state != URB_DONE))
@@ -1740,7 +1882,6 @@
         hhcd->hc[ch_num & 0xFU].ErrCnt = 0U;
         hhcd->hc[ch_num & 0xFU].state = HC_NAK;
       }
-
       /* manage STALL Response */
       else if ((ch_reg & USB_CH_RX_STRX) == USB_CH_RX_STALL)
       {
@@ -1751,7 +1892,7 @@
         /* Close the channel */
         HCD_SET_CH_RX_STATUS(hhcd->Instance, phy_chnum, USB_CH_RX_DIS);
       }
-
+#if (USE_USB_DOUBLE_BUFFER == 1U)
       /* Double Buffer Management in case of Bulk Transaction */
       else  if (((ch_reg & USB_CH_RX_STRX) == USB_CH_RX_ACK_DBUF)
                 && ((ch_reg & USB_CH_KIND) != 0U))
@@ -1759,13 +1900,18 @@
         /* Bulk IN Double Buffer ISR */
         HCD_HC_IN_BulkDb(hhcd, ch_num, phy_chnum, ch_reg);
       }
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
       else
       {
         /*....*/
         /* not defined state: STRX=11 in single buffer no iso is not defined */
       }
-      HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num,
-                                          hhcd->hc[ch_num & 0xFU].urb_state);
+
+#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
+      hhcd->HC_NotifyURBChangeCallback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num & 0xFU].urb_state);
+#else
+      HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num & 0xFU].urb_state);
+#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
 
       /*Clear VTRX */
       HCD_CLEAR_RX_CH_CTR(hhcd->Instance, phy_chnum);
@@ -1790,8 +1936,12 @@
       /* Clear pending err_tx */
       HCD_CLEAR_RX_CH_ERR(hhcd->Instance, phy_chnum);
     }
-    HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num,
-                                        hhcd->hc[ch_num & 0xFU].urb_state);
+
+#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
+    hhcd->HC_NotifyURBChangeCallback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num & 0xFU].urb_state);
+#else
+    HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)ch_num, hhcd->hc[ch_num & 0xFU].urb_state);
+#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
   }
 }
 
@@ -1806,12 +1956,13 @@
 static void HCD_HC_OUT_IRQHandler(HCD_HandleTypeDef *hhcd, uint8_t chnum)
 {
   uint16_t data_xfr;
+  __IO uint32_t WregCh;
 
   /* Get Physical Channel number */
   uint32_t phy_chnum = (uint8_t)__HAL_HCD_GET_CHNUM(hhcd);
 
   /* Take a Flag snapshot from the CHEP register, due to STRX bits are used for both control &status */
-  __IO uint32_t ch_reg =  *(__IO uint32_t *)(&(hhcd->Instance->CHEP0R) + phy_chnum);
+  uint32_t ch_reg =  *(__IO uint32_t *)(&(hhcd->Instance->CHEP0R) + phy_chnum);
 
   /*------ Manage Correct Transaction ------*/
   if ((ch_reg & USB_CH_ERRTX) == 0U)
@@ -1822,24 +1973,28 @@
       /* correct transaction */
       if ((hhcd->Instance->ISTR & USB_ISTR_ERR) == 0U)
       {
-        /* Double buffer isochronous out*/
-        if ((ch_reg & USB_CH_KIND) == 0U)
+        /* Double buffer isochronous out */
+        if ((ch_reg & USB_CH_KIND) != 0U)
+        {
+          HCD_SET_CH_TX_CNT(hhcd->Instance, phy_chnum, 0U);
+        }
+#if (USE_USB_DOUBLE_BUFFER == 1U)
+        else /* double buffer isochronous out */
         {
           /* Odd Transaction */
           if ((ch_reg & USB_CH_DTOG_TX) != 0U)
           {
-            hhcd->hc[chnum & 0xFU].pmabuff0_state = USB_PMABUF_EMPTY;
+            HCD_SET_CH_TX_CNT(hhcd->Instance, phy_chnum, 0U);
           }
           /* Even Transaction */
           else
           {
-            hhcd->hc[chnum & 0xFU].pmabuff1_state = USB_PMABUF_EMPTY;
+            HCD_SET_CH_RX_CNT(hhcd->Instance, phy_chnum, 0U);
           }
+
+          USB_DRD_SET_CHEP_TX_STATUS(hhcd->Instance, phy_chnum, USB_CH_TX_DIS);
         }
-        else /* single buffer isochronous out */
-        {
-          HCD_SET_CH_TX_CNT(hhcd->Instance, phy_chnum, (uint16_t)0U);
-        }
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
 
         /* Transfer complete state */
         hhcd->hc[chnum & 0xFU].state = HC_XFRC;
@@ -1848,6 +2003,14 @@
 
       /*Clear Correct Transfer */
       HCD_CLEAR_TX_CH_CTR(hhcd->Instance, phy_chnum);
+
+      /*TX COMPLETE*/
+#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
+      hhcd->HC_NotifyURBChangeCallback(hhcd, (uint8_t)chnum, hhcd->hc[chnum & 0xFU].urb_state);
+#else
+      HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)chnum, hhcd->hc[chnum & 0xFU].urb_state);
+#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
+
     }
     else /* Manage all Non Isochronous Transaction */
     {
@@ -1881,6 +2044,7 @@
           hhcd->hc[chnum & 0xFU].xfer_count += data_xfr;
           hhcd->hc[chnum & 0xFU].state = HC_XFRC;
           hhcd->hc[chnum & 0xFU].urb_state = URB_DONE;
+
           if ((hhcd->hc[chnum & 0xFU].ep_type == EP_TYPE_BULK) ||
               (hhcd->hc[chnum & 0xFU].ep_type == EP_TYPE_INTR))
           {
@@ -1888,40 +2052,65 @@
           }
         }
       }
-
       /* Check NACK Response */
-      else if ((ch_reg & USB_CH_TX_STTX) == USB_CH_TX_NAK)
+      else if (((ch_reg & USB_CHEP_NAK) == USB_CHEP_NAK) ||
+               ((ch_reg & USB_CH_TX_STTX) == USB_CH_TX_NAK))
       {
+        /* Update Channel status */
+        hhcd->hc[chnum & 0xFU].state = HC_NAK;
         hhcd->hc[chnum & 0xFU].urb_state = URB_NOTREADY;
         hhcd->hc[chnum & 0xFU].ErrCnt = 0U;
-        hhcd->hc[chnum & 0xFU].state = HC_NAK;
-      }
 
-      /*Check STALL Response*/
+        /* Get Channel register value */
+        WregCh = *(__IO uint32_t *)(&(hhcd->Instance->CHEP0R) + phy_chnum);
+
+        /*clear NAK status*/
+        WregCh &= ~USB_CHEP_NAK & USB_CHEP_REG_MASK;
+
+        /* Update channel register Value */
+        HCD_SET_CHANNEL(hhcd->Instance, phy_chnum, WregCh);
+
+        if (hhcd->hc[chnum & 0xFU].doublebuffer == 0U)
+        {
+#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
+          hhcd->HC_NotifyURBChangeCallback(hhcd, (uint8_t)chnum, hhcd->hc[chnum & 0xFU].urb_state);
+#else
+          HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)chnum, hhcd->hc[chnum & 0xFU].urb_state);
+#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
+        }
+      }
+      /* Check STALL Response */
       else if ((ch_reg & USB_CH_TX_STTX) == USB_CH_TX_STALL)
       {
         (void) HAL_HCD_HC_Halt(hhcd, (uint8_t)chnum);
         hhcd->hc[chnum & 0xFU].state = HC_STALL;
         hhcd->hc[chnum & 0xFU].urb_state = URB_STALL;
       }
-
-      /*Check double buffer ACK in case of bulk transaction */
+#if (USE_USB_DOUBLE_BUFFER == 1U)
+      /* Check double buffer ACK in case of bulk transaction */
       else if ((ch_reg & USB_CH_TX_STTX) == USB_CH_TX_ACK_DBUF)
       {
-        /*Double buffer management Bulk Out*/
+        /* Double buffer management Bulk Out */
         (void) HCD_HC_OUT_BulkDb(hhcd, chnum, (uint8_t)phy_chnum, ch_reg);
       }
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
       else
       {
         /*...*/
       }
 
-      HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)chnum,
-                                          hhcd->hc[chnum & 0xFU].urb_state);
+      if ((ch_reg & USB_CH_TX_STTX) != USB_CH_TX_NAK)
+      {
+#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
+        hhcd->HC_NotifyURBChangeCallback(hhcd, (uint8_t)chnum, hhcd->hc[chnum & 0xFU].urb_state);
+#else
+        HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)chnum, hhcd->hc[chnum & 0xFU].urb_state);
+#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
+      }
+
       HCD_CLEAR_TX_CH_CTR(hhcd->Instance, phy_chnum);
     }  /* end no isochronous */
   }
-
   /*------ Manage Transaction Error------*/
   else
   {
@@ -1940,8 +2129,12 @@
 
     /*Clear ERR_TX*/
     HCD_CLEAR_TX_CH_ERR(hhcd->Instance, phy_chnum);
-    HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)chnum,
-                                        hhcd->hc[chnum & 0xFU].urb_state);
+
+#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
+    hhcd->HC_NotifyURBChangeCallback(hhcd, (uint8_t)chnum, hhcd->hc[chnum & 0xFU].urb_state);
+#else
+    HAL_HCD_HC_NotifyURBChange_Callback(hhcd, (uint8_t)chnum, hhcd->hc[chnum & 0xFU].urb_state);
+#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
   }
 }
 
@@ -1953,52 +2146,76 @@
   */
 static void HCD_Port_IRQHandler(HCD_HandleTypeDef *hhcd)
 {
-  /* J-state detected & LastState=Disconnected   */
-  if (((hhcd->Instance->FNR & USB_FNR_RXDP) != 0U) &&
-      ((hhcd->HostState == HCD_HCD_STATE_DISCONNECTED) != 0U))
-  {
-    HAL_HCD_Connect_Callback(hhcd);
-    hhcd->HostState = HCD_HCD_STATE_CONNECTED;
-  }
-  /* K-state detected & LastState=Disconnected  */
-  else  if (((hhcd->Instance->ISTR & USB_ISTR_LS_DCONN) != 0U)
-            && ((hhcd->HostState == HCD_HCD_STATE_DISCONNECTED) != 0U))
-  {
-    HAL_HCD_Connect_Callback(hhcd);
-    hhcd->HostState = HCD_HCD_STATE_CONNECTED;
-  }
+  uint32_t FnrReg = hhcd->Instance->FNR;
+  uint32_t IstrReg = hhcd->Instance->ISTR;
+
   /* SE0 detected USB Disconnected state */
-  else if ((hhcd->Instance->FNR & (USB_FNR_RXDP | USB_FNR_RXDM)) == 0U)
+  if ((FnrReg & (USB_FNR_RXDP | USB_FNR_RXDM)) == 0U)
   {
-    /*Host Port State*/
+    /* Host Port State */
     hhcd->HostState = HCD_HCD_STATE_DISCONNECTED;
-    /*Disconnection Callback */
+
+    /* clear all allocated virtual channel */
+    HAL_HCD_ClearPhyChannel(hhcd);
+
+    /* Reset the PMA current pointer */
+    (void)HAL_HCD_PMAReset(hhcd);
+
+    /* reset Ep0 Pma allocation state */
+    hhcd->ep0_PmaAllocState = 0U;
+
+    /* Disconnection Callback */
+#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
+    hhcd->DisconnectCallback(hhcd);
+#else
     HAL_HCD_Disconnect_Callback(hhcd);
+#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
+
+    return;
   }
-  /* J-state detected & lastState=Connected: a Missing disconnection is detected */
-  else if (((hhcd->Instance->FNR & USB_FNR_RXDP) != 0U) &&
-           ((hhcd->HostState == HCD_HCD_STATE_CONNECTED) != 0U))
+
+  if ((hhcd->HostState == HCD_HCD_STATE_DISCONNECTED) != 0U)
   {
-    /*Disconnection Callback */
-    HAL_HCD_Disconnect_Callback(hhcd);
-    /*Host Port State*/
-    hhcd->HostState = HCD_HCD_STATE_DISCONNECTED;
-  }
-  /* K-state detected & LastState=Disconnected: a Missing disconnection is detected */
-  else if (((hhcd->Instance->ISTR & USB_ISTR_LS_DCONN) != 0U)
-           && ((hhcd->HostState == HCD_HCD_STATE_CONNECTED) != 0U))
-  {
-    /*Disconnection Callback */
-    HAL_HCD_Disconnect_Callback(hhcd);
-    /*Host Port State*/
-    hhcd->HostState = HCD_HCD_STATE_DISCONNECTED;
+    /* J-state or K-state detected & LastState=Disconnected */
+    if (((FnrReg & USB_FNR_RXDP) != 0U) || ((IstrReg & USB_ISTR_LS_DCONN) != 0U))
+    {
+      hhcd->HostState = HCD_HCD_STATE_CONNECTED;
+
+#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
+      hhcd->ConnectCallback(hhcd);
+#else
+      HAL_HCD_Connect_Callback(hhcd);
+#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
+    }
   }
   else
   {
-    /* should not be here */
+    /* J-state or K-state detected & lastState=Connected: a Missed disconnection is detected */
+    if (((FnrReg & USB_FNR_RXDP) != 0U) || ((IstrReg & USB_ISTR_LS_DCONN) != 0U))
+    {
+      /* Host Port State */
+      hhcd->HostState = HCD_HCD_STATE_DISCONNECTED;
+
+      /* clear all allocated virtual channel */
+      HAL_HCD_ClearPhyChannel(hhcd);
+
+      /* Reset the PMA current pointer */
+      (void)HAL_HCD_PMAReset(hhcd);
+
+      /* reset Ep0 PMA allocation state */
+      hhcd->ep0_PmaAllocState = 0U;
+
+      /* Disconnection Callback */
+#if (USE_HAL_HCD_REGISTER_CALLBACKS == 1U)
+      hhcd->DisconnectCallback(hhcd);
+#else
+      HAL_HCD_Disconnect_Callback(hhcd);
+#endif /* USE_HAL_HCD_REGISTER_CALLBACKS */
+    }
   }
 }
 
+
 /**
   * @brief  Check if the ch_num are already reserved to a physical channel
   * @param  hhcd  HCD handle
@@ -2013,11 +2230,14 @@
   /* Check if the logical channel are already opened  */
   for (idx = 0U; idx < hhcd->Init.Host_channels; idx++)
   {
-    if ((((hhcd->phy_chin_state[idx] & 0x00F0U) >> 4U) == ((uint16_t)ch_num + 1U)) && (hhcd->phy_chin_state[idx] != 0U))
+    if ((((hhcd->phy_chin_state[idx] & 0xF0U) >> 4U) == ((uint16_t)ch_num + 1U)) &&
+        (hhcd->phy_chin_state[idx] != 0U))
     {
       return (1U | (idx << 4U));
     }
-    if ((((hhcd->phy_chout_state[idx] & 0x00F0U) >> 4U) == ((uint16_t)ch_num + 1U)) && (hhcd->phy_chout_state[idx] != 0U))
+
+    if ((((hhcd->phy_chout_state[idx] & 0xF0U) >> 4U) == ((uint16_t)ch_num + 1U)) &&
+        (hhcd->phy_chout_state[idx] != 0U))
     {
       return (1U | (idx << 4U));
     }
@@ -2026,6 +2246,7 @@
   return 0U;
 }
 
+
 /**
   * @brief  Get a Logical Channel number from  physical Channel
   * @param  hhcd  HCD handle
@@ -2048,7 +2269,7 @@
     }
     else
     {
-      /*Channel not registered Error*/
+      /* Channel not registered Error */
       return HCD_LOGICAL_CH_NOT_OPENED;
     }
   }
@@ -2061,11 +2282,13 @@
     }
     else
     {
-      /*Channel not registered Error*/
+      /* Channel not registered Error */
       return HCD_LOGICAL_CH_NOT_OPENED;
     }
   }
 }
+
+
 /**
   * @brief  Get a free physical Channel number according to the direction
   * @param  hhcd HCD handle
@@ -2087,17 +2310,66 @@
 {
   uint8_t idx;
 
+  if ((epnum & 0x7FU) == 0U)
+  {
+    idx = 0U;
+
+    if (ch_num == 0U)
+    {
+      if (hhcd->phy_chin_state[idx] == 0U)
+      {
+        /* chin_state will store the ep_type to be used for the same channel in OUT direction */
+        hhcd->phy_chin_state[idx] = (((uint16_t)ch_num + 1U) << 4U) |
+                                    ((uint16_t)ep_type + 1U) | /* ep_type(0/1/2/3) so adding + 1 to avoid having a 0 value */
+                                    (((uint16_t)epnum & 0x0FU) << 8U);
+      }
+
+      if (hhcd->phy_chout_state[idx] == 0U)
+      {
+        /* chout_state will store the ep_type to be used for the same channel in IN direction */
+        hhcd->phy_chout_state[idx] = (((uint16_t)ch_num + 1U) << 4U) |
+                                     ((uint16_t)ep_type + 1U) | /* ep_type(0/1/2/3) so adding + 1 to avoid having a 0 value */
+                                     (((uint16_t)epnum & 0x0FU) << 8U);
+      }
+    }
+    else
+    {
+      if ((epnum & 0x80U) != 0U)
+      {
+        if (((hhcd->phy_chin_state[idx] & 0xF0U) >> 4U) != ((uint16_t)ch_num + 1U))
+        {
+          /* chin_state will store the ep_type to be used for the same channel in OUT direction */
+          hhcd->phy_chin_state[idx] = (((uint16_t)ch_num + 1U) << 4U) |
+                                      ((uint16_t)ep_type + 1U) | /* ep_type(0/1/2/3) so adding + 1 to avoid having a 0 value */
+                                      (((uint16_t)epnum & 0x0FU) << 8U);
+        }
+      }
+      else
+      {
+        if (((hhcd->phy_chout_state[idx] & 0xF0U) >> 4U) != ((uint16_t)ch_num + 1U))
+        {
+          /* chout_state will store the ep_type to be used for the same channel in IN direction */
+          hhcd->phy_chout_state[idx] = (((uint16_t)ch_num + 1U) << 4U) |
+                                       ((uint16_t)ep_type + 1U) | /* ep_type(0/1/2/3) so adding + 1 to avoid having a 0 value */
+                                       (((uint16_t)epnum & 0x0FU) << 8U);
+        }
+      }
+    }
+
+    return idx;
+  }
+
   if ((epnum & 0x80U) != 0U)
   {
     /* Find a new available physical in channel */
-    for (idx = 0U; idx < hhcd->Init.Host_channels; idx++)
+    for (idx = 1U; idx < hhcd->Init.Host_channels; idx++)
     {
       if ((hhcd->phy_chin_state[idx] == 0U) &&   /* if PhysicalChannelx(EPCHidx) IN is Free */
           ((((hhcd->phy_chout_state[idx] & 0x000FU) == ((uint16_t)ep_type + 1U)) && /* if  the same (EPCHidx) Channelx OUT is already opened check if the same type is allocated */
             (((hhcd->phy_chout_state[idx] & 0x0F00U) == ((uint16_t)epnum & 0x0FU)))) || /* Check if the same Epnum is allocated then allocate the same physical channelOUT for IN Logical Channel */
            (hhcd->phy_chout_state[idx] == 0U))) /* OR if  physical Channel OUT (EPCHidx)is free */
       {
-        /* chin_state will store the ep_type to be used for the same channel in out direction */
+        /* chin_state will store the ep_type to be used for the same channel in OUT direction */
         hhcd->phy_chin_state[idx] = (((uint16_t)ch_num + 1U) << 4U) |
                                     ((uint16_t)ep_type + 1U) | /* ep_type(0/1/2/3) so adding + 1 to avoid having a 0 value */
                                     (((uint16_t)epnum & 0x0FU) << 8U);
@@ -2109,7 +2381,7 @@
   else
   {
     /* Find a new available physical out channel */
-    for (idx = 0U; idx < hhcd->Init.Host_channels; idx++)
+    for (idx = 1U; idx < hhcd->Init.Host_channels; idx++)
     {
       /* if there is a free out channel and the same channel is used for the in direction then check if same ep_type used */
       if ((hhcd->phy_chout_state[idx] == 0U) &&
@@ -2117,7 +2389,7 @@
             ((hhcd->phy_chin_state[idx] & 0x0F00U) == ((uint16_t)epnum & 0x0FU))) ||
            (hhcd->phy_chin_state[idx] == 0U)))
       {
-        /* chin_state will store the ep_type to be used for the same channel in out direction */
+        /* chout_state will store the ep_type to be used for the same channel in IN direction */
         hhcd->phy_chout_state[idx] = (((uint16_t)ch_num + 1U) << 4U) |
                                      ((uint16_t)ep_type + 1U) |  /* ep_type(0/1/2/3) so adding +1 to avoid having a 0 value */
                                      (((uint16_t)epnum & 0x0FU) << 8U);
@@ -2127,7 +2399,7 @@
     }
   }
 
-  /*in case of Error */
+  /* in case of Error */
   return HCD_FREE_CH_NOT_FOUND;
 }
 
@@ -2171,8 +2443,10 @@
   */
 static uint16_t HAL_HCD_GetFreePMA(HCD_HandleTypeDef *hhcd, uint16_t mps)
 {
-  uint32_t Entry, FreeBlocks = 0U;
-  uint8_t FirstFreeBlock_col = 0U, FirstFreeBlock_line = 0U;
+  uint32_t Entry;
+  uint32_t FreeBlocks = 0U;
+  uint8_t FirstFreeBlock_col = 0U;
+  uint8_t FirstFreeBlock_line = 0U;
   uint8_t ColIndex;
   uint16_t NbrReqBlocks;
   uint16_t mps_t = mps;
@@ -2278,7 +2552,9 @@
                                    uint16_t ch_kind, uint16_t mps)
 {
   uint16_t pma_addr0;
+#if (USE_USB_DOUBLE_BUFFER == 1U)
   uint16_t pma_addr1; /* used for double buffer mode if enabled */
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
 
   /* Host Channel */
   HCD_HCTypeDef *hc = &(hhcd->hc[ch_num]);
@@ -2299,19 +2575,33 @@
       /* Single Buffer */
       hc->doublebuffer = 0U;
 
+      if (hc->ep_num == 0U)
+      {
+        hhcd->ep0_PmaAllocState = ch_num;
+        hhcd->ep0_PmaAllocState |= (1U << 8);
+      }
+
       /* Configure the PMA */
       if (hc->ch_dir == CH_IN_DIR)
       {
-        (USB_DRD_PMA_BUFF + hc->phy_ch_num)->RXBD = pma_addr0;
+        hc->pmaaddr1 = pma_addr0;
+        (USB_DRD_PMA_BUFF + hc->phy_ch_num)->RXBD = hc->pmaaddr1;
+
+        if (hc->ep_num == 0U)
+        {
+          hhcd->ep0_PmaAllocState |= (CH_IN_DIR << 4);
+        }
       }
       else
       {
-        (USB_DRD_PMA_BUFF + hc->phy_ch_num)->TXBD = pma_addr0;
+        hc->pmaaddr0 = pma_addr0;
+        (USB_DRD_PMA_BUFF + hc->phy_ch_num)->TXBD = hc->pmaaddr0;
       }
 
-      /* Set the Pmaaddress */
+      /* Set the PmaAddress */
       hc->pmaadress = pma_addr0;
     }
+#if (USE_USB_DOUBLE_BUFFER == 1U)
     else /* USB_DBL_BUF */
     {
       /* Double Buffer Endpoint */
@@ -2349,6 +2639,7 @@
         }
       }
     }
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
   }
 
   return HAL_OK;
@@ -2362,8 +2653,10 @@
   */
 HAL_StatusTypeDef  HAL_HCD_PMADeAlloc(HCD_HandleTypeDef *hhcd, uint8_t  ch_num)
 {
-  HAL_StatusTypeDef status;
+  HAL_StatusTypeDef status = HAL_OK;
+#if (USE_USB_DOUBLE_BUFFER == 1U)
   uint8_t Err = 0U;
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
 
   /* Host Channel */
   HCD_HCTypeDef *hc = &(hhcd->hc[ch_num]);
@@ -2373,6 +2666,7 @@
   {
     status = HAL_HCD_PMAFree(hhcd, hc->pmaadress, hc->max_packet);
   }
+#if (USE_USB_DOUBLE_BUFFER == 1U)
   else   /* Double buffer */
   {
     status = HAL_HCD_PMAFree(hhcd, hc->pmaaddr0, hc->max_packet);
@@ -2392,6 +2686,7 @@
       return HAL_ERROR;
     }
   }
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
 
   return status;
 }
@@ -2420,7 +2715,7 @@
 }
 
 /**
-  * @brief  PMA FRee
+  * @brief  PMA Free
   * @param  hhcd   Host instance
   * @param  pma_base PMA base offset stored in hhcd->hc.pmaaddr
   * @param  mps  Max Packet Size
diff --git a/Src/stm32g0xx_hal_pcd.c b/Src/stm32g0xx_hal_pcd.c
index 7e21083..48cceb9 100644
--- a/Src/stm32g0xx_hal_pcd.c
+++ b/Src/stm32g0xx_hal_pcd.c
@@ -88,8 +88,10 @@
   */
 
 static HAL_StatusTypeDef PCD_EP_ISR_Handler(PCD_HandleTypeDef *hpcd);
+#if (USE_USB_DOUBLE_BUFFER == 1U)
 static HAL_StatusTypeDef HAL_PCD_EP_DB_Transmit(PCD_HandleTypeDef *hpcd, PCD_EPTypeDef *ep, uint16_t wEPVal);
 static uint16_t HAL_PCD_EP_DB_Receive(PCD_HandleTypeDef *hpcd, PCD_EPTypeDef *ep, uint16_t wEPVal);
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
 
 /**
   * @}
@@ -167,6 +169,9 @@
 
   hpcd->State = HAL_PCD_STATE_BUSY;
 
+  /* DMA Not supported for FS instance, Force to Zero */
+  hpcd->Init.dma_enable = 0U;
+
   /* Disable the Interrupts */
   __HAL_PCD_DISABLE(hpcd);
 
@@ -396,7 +401,7 @@
 
 /**
   * @brief  Unregister an USB PCD Callback
-  *         USB PCD callabck is redirected to the weak predefined callback
+  *         USB PCD callback is redirected to the weak predefined callback
   * @param  hpcd USB PCD handle
   * @param  CallbackID ID of the callback to be unregistered
   *         This parameter can be one of the following values:
@@ -1005,20 +1010,24 @@
   */
 void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd)
 {
+  uint32_t wIstr = USB_ReadInterrupts(hpcd->Instance);
+
   /* check if this is an USB pending IT */
   if ((SYSCFG->IT_LINE_SR[8] & (0x1U << 2)) == 0U)
   {
     return;
   }
 
-  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_CTR))
+  if ((wIstr & USB_ISTR_CTR) == USB_ISTR_CTR)
   {
     /* servicing of the endpoint correct transfer interrupt */
     /* clear of the CTR flag into the sub */
     (void)PCD_EP_ISR_Handler(hpcd);
+
+    return;
   }
 
-  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_RESET))
+  if ((wIstr & USB_ISTR_RESET) == USB_ISTR_RESET)
   {
     __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_RESET);
 
@@ -1029,19 +1038,25 @@
 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
 
     (void)HAL_PCD_SetAddress(hpcd, 0U);
+
+    return;
   }
 
-  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_PMAOVR))
+  if ((wIstr & USB_ISTR_PMAOVR) == USB_ISTR_PMAOVR)
   {
     __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_PMAOVR);
+
+    return;
   }
 
-  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_ERR))
+  if ((wIstr & USB_ISTR_ERR) == USB_ISTR_ERR)
   {
     __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_ERR);
+
+    return;
   }
 
-  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_WKUP))
+  if ((wIstr & USB_ISTR_WKUP) == USB_ISTR_WKUP)
   {
     hpcd->Instance->CNTR &= ~(USB_CNTR_SUSPRDY);
     hpcd->Instance->CNTR &= ~(USB_CNTR_SUSPEN);
@@ -1063,9 +1078,11 @@
 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
 
     __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_WKUP);
+
+    return;
   }
 
-  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_SUSP))
+  if ((wIstr & USB_ISTR_SUSP) == USB_ISTR_SUSP)
   {
     /* Force low-power mode in the macrocell */
     hpcd->Instance->CNTR |= USB_CNTR_SUSPEN;
@@ -1080,10 +1097,12 @@
 #else
     HAL_PCD_SuspendCallback(hpcd);
 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
+
+    return;
   }
 
   /* Handle LPM Interrupt */
-  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_L1REQ))
+  if ((wIstr & USB_ISTR_L1REQ) == USB_ISTR_L1REQ)
   {
     __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_L1REQ);
     if (hpcd->LPM_State == LPM_L0)
@@ -1108,9 +1127,11 @@
       HAL_PCD_SuspendCallback(hpcd);
 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
     }
+
+    return;
   }
 
-  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_SOF))
+  if ((wIstr & USB_ISTR_SOF) == USB_ISTR_SOF)
   {
     __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_SOF);
 
@@ -1119,12 +1140,16 @@
 #else
     HAL_PCD_SOFCallback(hpcd);
 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
+
+    return;
   }
 
-  if (__HAL_PCD_GET_FLAG(hpcd, USB_ISTR_ESOF))
+  if ((wIstr & USB_ISTR_ESOF) == USB_ISTR_ESOF)
   {
     /* clear ESOF flag in ISTR */
     __HAL_PCD_CLEAR_FLAG(hpcd, USB_ISTR_ESOF);
+
+    return;
   }
 }
 
@@ -1592,6 +1617,32 @@
 }
 
 /**
+   * @brief  Abort an USB EP transaction.
+   * @param  hpcd PCD handle
+   * @param  ep_addr endpoint address
+   * @retval HAL status
+   */
+HAL_StatusTypeDef HAL_PCD_EP_Abort(PCD_HandleTypeDef *hpcd, uint8_t ep_addr)
+{
+  HAL_StatusTypeDef ret;
+  PCD_EPTypeDef *ep;
+
+  if ((0x80U & ep_addr) == 0x80U)
+  {
+    ep = &hpcd->IN_ep[ep_addr & EP_ADDR_MSK];
+  }
+  else
+  {
+    ep = &hpcd->OUT_ep[ep_addr & EP_ADDR_MSK];
+  }
+
+  /* Stop Xfer */
+  ret = USB_EPStopXfer(hpcd->Instance, ep);
+
+  return ret;
+}
+
+/**
   * @brief  Flush an endpoint
   * @param  hpcd PCD handle
   * @param  ep_addr endpoint address
@@ -1677,7 +1728,10 @@
 static HAL_StatusTypeDef PCD_EP_ISR_Handler(PCD_HandleTypeDef *hpcd)
 {
   PCD_EPTypeDef *ep;
-  uint16_t count, wIstr, wEPVal, TxByteNbre;
+  uint16_t count;
+  uint16_t wIstr;
+  uint16_t wEPVal;
+  uint16_t TxPctSize;
   uint8_t epindex;
 
   /* stay in loop while pending interrupts */
@@ -1797,6 +1851,7 @@
             USB_ReadPMA(hpcd->Instance, ep->xfer_buff, ep->pmaadress, count);
           }
         }
+#if (USE_USB_DOUBLE_BUFFER == 1U)
         else
         {
           /* manage double buffer bulk out */
@@ -1807,7 +1862,7 @@
           else /* manage double buffer iso out */
           {
             /* free EP OUT Buffer */
-            PCD_FreeUserBuffer(hpcd->Instance, ep->num, 0U);
+            PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 0U);
 
             if ((PCD_GET_ENDPOINT(hpcd->Instance, ep->num) & USB_EP_DTOG_RX) != 0U)
             {
@@ -1831,6 +1886,8 @@
             }
           }
         }
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
+
         /* multi-packet on the NON control OUT endpoint */
         ep->xfer_count += count;
         ep->xfer_buff += count;
@@ -1848,7 +1905,6 @@
         {
           (void) USB_EPStartXfer(hpcd->Instance, ep);
         }
-
       }
 
       if ((wEPVal & USB_EP_VTTX) != 0U)
@@ -1858,44 +1914,73 @@
         /* clear int flag */
         PCD_CLEAR_TX_EP_CTR(hpcd->Instance, epindex);
 
-        /* Manage all non bulk/isoc transaction Bulk Single Buffer Transaction */
-        if ((ep->type == EP_TYPE_INTR) || (ep->type == EP_TYPE_CTRL) ||
-           ((ep->type == EP_TYPE_BULK) && ((wEPVal & USB_EP_KIND) == 0U)))
+        if (ep->type != EP_TYPE_BULK)
         {
-          /* multi-packet on the NON control IN endpoint */
-          TxByteNbre = (uint16_t)PCD_GET_EP_TX_CNT(hpcd->Instance, ep->num);
+          ep->xfer_len = 0U;
 
-          if (ep->xfer_len > TxByteNbre)
+#if (USE_USB_DOUBLE_BUFFER == 1U)
+          if (ep->doublebuffer != 0U)
           {
-            ep->xfer_len -= TxByteNbre;
+            if ((wEPVal & USB_EP_DTOG_TX) != 0U)
+            {
+              PCD_SET_EP_DBUF0_CNT(hpcd->Instance, ep->num, ep->is_in, 0U);
+            }
+            else
+            {
+              PCD_SET_EP_DBUF1_CNT(hpcd->Instance, ep->num, ep->is_in, 0U);
+            }
           }
-          else
-          {
-            ep->xfer_len = 0U;
-          }
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
 
-          /* Zero Length Packet? */
-          if (ep->xfer_len == 0U)
-          {
-            /* TX COMPLETE */
+          /* TX COMPLETE */
 #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
-            hpcd->DataInStageCallback(hpcd, ep->num);
+          hpcd->DataInStageCallback(hpcd, ep->num);
 #else
-            HAL_PCD_DataInStageCallback(hpcd, ep->num);
+          HAL_PCD_DataInStageCallback(hpcd, ep->num);
 #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
-          }
-          else
-          {
-            /* Transfer is not yet Done */
-            ep->xfer_buff += TxByteNbre;
-            ep->xfer_count += TxByteNbre;
-            (void)USB_EPStartXfer(hpcd->Instance, ep);
-          }
         }
-        /* Double Buffer Iso/bulk IN (bulk transfer Len > Ep_Mps) */
         else
         {
-          (void)HAL_PCD_EP_DB_Transmit(hpcd, ep, wEPVal);
+          /* Manage Bulk Single Buffer Transaction */
+          if ((wEPVal & USB_EP_KIND) == 0U)
+          {
+            /* multi-packet on the NON control IN endpoint */
+            TxPctSize = (uint16_t)PCD_GET_EP_TX_CNT(hpcd->Instance, ep->num);
+
+            if (ep->xfer_len > TxPctSize)
+            {
+              ep->xfer_len -= TxPctSize;
+            }
+            else
+            {
+              ep->xfer_len = 0U;
+            }
+
+            /* Zero Length Packet? */
+            if (ep->xfer_len == 0U)
+            {
+              /* TX COMPLETE */
+#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
+              hpcd->DataInStageCallback(hpcd, ep->num);
+#else
+              HAL_PCD_DataInStageCallback(hpcd, ep->num);
+#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
+            }
+            else
+            {
+              /* Transfer is not yet Done */
+              ep->xfer_buff += TxPctSize;
+              ep->xfer_count += TxPctSize;
+              (void)USB_EPStartXfer(hpcd->Instance, ep);
+            }
+          }
+#if (USE_USB_DOUBLE_BUFFER == 1U)
+          /* Double Buffer bulk IN (bulk transfer Len > Ep_Mps) */
+          else
+          {
+            (void)HAL_PCD_EP_DB_Transmit(hpcd, ep, wEPVal);
+          }
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
         }
       }
     }
@@ -1905,6 +1990,7 @@
 }
 
 
+#if (USE_USB_DOUBLE_BUFFER == 1U)
 /**
   * @brief  Manage double buffer bulk out transaction from ISR
   * @param  hpcd PCD handle
@@ -1938,10 +2024,10 @@
       PCD_SET_EP_RX_STATUS(hpcd->Instance, ep->num, USB_EP_RX_NAK);
     }
 
-    /* Check if Buffer1 is in blocked sate which requires to toggle */
+    /* Check if Buffer1 is in blocked state which requires to toggle */
     if ((wEPVal & USB_EP_DTOG_TX) != 0U)
     {
-      PCD_FreeUserBuffer(hpcd->Instance, ep->num, 0U);
+      PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 0U);
     }
 
     if (count != 0U)
@@ -1973,7 +2059,7 @@
     /*Need to FreeUser Buffer*/
     if ((wEPVal & USB_EP_DTOG_TX) == 0U)
     {
-      PCD_FreeUserBuffer(hpcd->Instance, ep->num, 0U);
+      PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 0U);
     }
 
     if (count != 0U)
@@ -1997,22 +2083,23 @@
                                                 PCD_EPTypeDef *ep, uint16_t wEPVal)
 {
   uint32_t len;
-  uint16_t TxByteNbre;
+  uint16_t TxPctSize;
 
   /* Data Buffer0 ACK received */
   if ((wEPVal & USB_EP_DTOG_TX) != 0U)
   {
     /* multi-packet on the NON control IN endpoint */
-    TxByteNbre = (uint16_t)PCD_GET_EP_DBUF0_CNT(hpcd->Instance, ep->num);
+    TxPctSize = (uint16_t)PCD_GET_EP_DBUF0_CNT(hpcd->Instance, ep->num);
 
-    if (ep->xfer_len > TxByteNbre)
+    if (ep->xfer_len > TxPctSize)
     {
-      ep->xfer_len -= TxByteNbre;
+      ep->xfer_len -= TxPctSize;
     }
     else
     {
       ep->xfer_len = 0U;
     }
+
     /* Transfer is completed */
     if (ep->xfer_len == 0U)
     {
@@ -2028,7 +2115,7 @@
 
       if ((wEPVal & USB_EP_DTOG_RX) != 0U)
       {
-        PCD_FreeUserBuffer(hpcd->Instance, ep->num, 1U);
+        PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 1U);
       }
     }
     else /* Transfer is not yet Done */
@@ -2036,14 +2123,14 @@
       /* need to Free USB Buff */
       if ((wEPVal & USB_EP_DTOG_RX) != 0U)
       {
-        PCD_FreeUserBuffer(hpcd->Instance, ep->num, 1U);
+        PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 1U);
       }
 
       /* Still there is data to Fill in the next Buffer */
       if (ep->xfer_fill_db == 1U)
       {
-        ep->xfer_buff += TxByteNbre;
-        ep->xfer_count += TxByteNbre;
+        ep->xfer_buff += TxPctSize;
+        ep->xfer_count += TxPctSize;
 
         /* Calculate the len of the new buffer to fill */
         if (ep->xfer_len_db >= ep->maxpacket)
@@ -2053,7 +2140,7 @@
         }
         else if (ep->xfer_len_db == 0U)
         {
-          len = TxByteNbre;
+          len = TxPctSize;
           ep->xfer_fill_db = 0U;
         }
         else
@@ -2075,11 +2162,11 @@
   else /* Data Buffer1 ACK received */
   {
     /* multi-packet on the NON control IN endpoint */
-    TxByteNbre = (uint16_t)PCD_GET_EP_DBUF1_CNT(hpcd->Instance, ep->num);
+    TxPctSize = (uint16_t)PCD_GET_EP_DBUF1_CNT(hpcd->Instance, ep->num);
 
-    if (ep->xfer_len >= TxByteNbre)
+    if (ep->xfer_len >= TxPctSize)
     {
-      ep->xfer_len -= TxByteNbre;
+      ep->xfer_len -= TxPctSize;
     }
     else
     {
@@ -2102,7 +2189,7 @@
       /* need to Free USB Buff */
       if ((wEPVal & USB_EP_DTOG_RX) == 0U)
       {
-        PCD_FreeUserBuffer(hpcd->Instance, ep->num, 1U);
+        PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 1U);
       }
     }
     else /* Transfer is not yet Done */
@@ -2110,14 +2197,14 @@
       /* need to Free USB Buff */
       if ((wEPVal & USB_EP_DTOG_RX) == 0U)
       {
-        PCD_FreeUserBuffer(hpcd->Instance, ep->num, 1U);
+        PCD_FREE_USER_BUFFER(hpcd->Instance, ep->num, 1U);
       }
 
       /* Still there is data to Fill in the next Buffer */
       if (ep->xfer_fill_db == 1U)
       {
-        ep->xfer_buff += TxByteNbre;
-        ep->xfer_count += TxByteNbre;
+        ep->xfer_buff += TxPctSize;
+        ep->xfer_count += TxPctSize;
 
         /* Calculate the len of the new buffer to fill */
         if (ep->xfer_len_db >= ep->maxpacket)
@@ -2127,7 +2214,7 @@
         }
         else if (ep->xfer_len_db == 0U)
         {
-          len = TxByteNbre;
+          len = TxPctSize;
           ep->xfer_fill_db = 0U;
         }
         else
@@ -2151,6 +2238,7 @@
 
   return HAL_OK;
 }
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
 
 
 
diff --git a/Src/stm32g0xx_hal_pcd_ex.c b/Src/stm32g0xx_hal_pcd_ex.c
index c88c44e..3448b2a 100644
--- a/Src/stm32g0xx_hal_pcd_ex.c
+++ b/Src/stm32g0xx_hal_pcd_ex.c
@@ -101,6 +101,7 @@
     /* Configure the PMA */
     ep->pmaadress = (uint16_t)pmaadress;
   }
+#if (USE_USB_DOUBLE_BUFFER == 1U)
   else /* USB_DBL_BUF */
   {
     /* Double Buffer Endpoint */
@@ -109,6 +110,7 @@
     ep->pmaaddr0 = (uint16_t)(pmaadress & 0xFFFFU);
     ep->pmaaddr1 = (uint16_t)((pmaadress & 0xFFFF0000U) >> 16);
   }
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
 
   return HAL_OK;
 }
@@ -160,7 +162,7 @@
   USB_DRD_TypeDef *USBx = hpcd->Instance;
   uint32_t tickstart = HAL_GetTick();
 
-  /* Wait Detect flag or a timeout is happen*/
+  /* Wait Detect flag or a timeout is happen */
   while ((USBx->BCDR & USB_BCDR_DCDET) == 0U)
   {
     /* Check for the Timeout */
diff --git a/Src/stm32g0xx_ll_usb.c b/Src/stm32g0xx_ll_usb.c
index a83ddc8..be46615 100644
--- a/Src/stm32g0xx_ll_usb.c
+++ b/Src/stm32g0xx_ll_usb.c
@@ -53,8 +53,8 @@
 /* Private function prototypes -----------------------------------------------*/
 /* Private functions ---------------------------------------------------------*/
 
-
 static HAL_StatusTypeDef USB_CoreReset(USB_DRD_TypeDef *USBx);
+#if (USE_USB_DOUBLE_BUFFER == 1U)
 static HAL_StatusTypeDef USB_HC_BULK_DB_StartXfer(USB_DRD_TypeDef *USBx,
                                                   USB_DRD_HCTypeDef *hc,
                                                   uint32_t ch_reg,
@@ -63,6 +63,7 @@
 static HAL_StatusTypeDef USB_HC_ISO_DB_StartXfer(USB_DRD_TypeDef *USBx,
                                                  USB_DRD_HCTypeDef *hc,
                                                  uint32_t len);
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
 
 /**
   * @brief  Reset the USB Core (needed after USB clock settings change)
@@ -260,22 +261,31 @@
     }
     else
     {
-      /*Set the endpoint Receive buffer address */
+      /* Set the endpoint Receive buffer address */
       PCD_SET_EP_RX_ADDRESS(USBx, ep->num, ep->pmaadress);
 
-      /*Set the endpoint Receive buffer counter*/
+      /* Set the endpoint Receive buffer counter */
       PCD_SET_EP_RX_CNT(USBx, ep->num, ep->maxpacket);
       PCD_CLEAR_RX_DTOG(USBx, ep->num);
 
-      /* Configure VALID status for the Endpoint*/
+      /* Configure VALID status for the Endpoint */
       PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_VALID);
     }
   }
-  /*Double Buffer*/
+#if (USE_USB_DOUBLE_BUFFER == 1U)
+  /* Double Buffer */
   else
   {
-    /* Set the endpoint as double buffered */
-    PCD_SET_EP_DBUF(USBx, ep->num);
+    if (ep->type == EP_TYPE_BULK)
+    {
+      /* Set bulk endpoint as double buffered */
+      PCD_SET_BULK_EP_DBUF(USBx, ep->num);
+    }
+    else
+    {
+      /* Set the ISOC endpoint in double buffer mode */
+      PCD_CLEAR_EP_KIND(USBx, ep->num);
+    }
 
     /* Set buffer address for double buffered mode */
     PCD_SET_EP_DBUF_ADDR(USBx, ep->num, ep->pmaaddr0, ep->pmaaddr1);
@@ -309,6 +319,7 @@
       PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS);
     }
   }
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
 
   return ret;
 }
@@ -327,18 +338,20 @@
     {
       PCD_CLEAR_TX_DTOG(USBx, ep->num);
 
-      /* Configure DISABLE status for the Endpoint*/
+      /* Configure DISABLE status for the Endpoint */
       PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS);
     }
+
     else
     {
       PCD_CLEAR_RX_DTOG(USBx, ep->num);
 
-      /* Configure DISABLE status for the Endpoint*/
+      /* Configure DISABLE status for the Endpoint */
       PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS);
     }
   }
-  /*Double Buffer*/
+#if (USE_USB_DOUBLE_BUFFER == 1U)
+  /* Double Buffer */
   else
   {
     if (ep->is_in == 0U)
@@ -365,6 +378,7 @@
       PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS);
     }
   }
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
 
   return HAL_OK;
 }
@@ -378,8 +392,10 @@
 HAL_StatusTypeDef USB_EPStartXfer(USB_DRD_TypeDef *USBx, USB_DRD_EPTypeDef *ep)
 {
   uint32_t len;
+#if (USE_USB_DOUBLE_BUFFER == 1U)
   uint16_t pmabuffer;
   uint16_t wEPVal;
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
 
   /* IN endpoint */
   if (ep->is_in == 1U)
@@ -400,6 +416,7 @@
       USB_WritePMA(USBx, ep->xfer_buff, ep->pmaadress, (uint16_t)len);
       PCD_SET_EP_TX_CNT(USBx, ep->num, len);
     }
+#if (USE_USB_DOUBLE_BUFFER == 1U)
     else
     {
       /* double buffer bulk management */
@@ -408,7 +425,7 @@
         if (ep->xfer_len_db > ep->maxpacket)
         {
           /* enable double buffer */
-          PCD_SET_EP_DBUF(USBx, ep->num);
+          PCD_SET_BULK_EP_DBUF(USBx, ep->num);
 
           /* each Time to write in PMA xfer_len_db will */
           ep->xfer_len_db -= len;
@@ -474,8 +491,8 @@
         {
           len = ep->xfer_len_db;
 
-          /* disable double buffer mode */
-          PCD_CLEAR_EP_DBUF(USBx, ep->num);
+          /* disable double buffer mode for Bulk endpoint */
+          PCD_CLEAR_BULK_EP_DBUF(USBx, ep->num);
 
           /* Set Tx count with nbre of byte to be transmitted */
           PCD_SET_EP_TX_CNT(USBx, ep->num, len);
@@ -484,14 +501,9 @@
           /* Write the user buffer to USB PMA */
           USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, (uint16_t)len);
         }
-      }/* end if bulk double buffer */
-
-      /* manage isochronous double buffer IN mode */
-      else
+      }
+      else /* manage isochronous double buffer IN mode */
       {
-        /* enable double buffer */
-        PCD_SET_EP_DBUF(USBx, ep->num);
-
         /* each Time to write in PMA xfer_len_db will */
         ep->xfer_len_db -= len;
 
@@ -504,27 +516,6 @@
 
           /* Write the user buffer to USB PMA */
           USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, (uint16_t)len);
-          ep->xfer_buff += len;
-
-          if (ep->xfer_len_db > ep->maxpacket)
-          {
-            ep->xfer_len_db -= len;
-          }
-          else
-          {
-            len = ep->xfer_len_db;
-            ep->xfer_len_db = 0U;
-          }
-
-          if (len > 0U)
-          {
-            /* Set the Double buffer counter for pmabuffer0 */
-            PCD_SET_EP_DBUF0_CNT(USBx, ep->num, ep->is_in, len);
-            pmabuffer = ep->pmaaddr0;
-
-            /* Write the user buffer to USB PMA */
-            USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, (uint16_t)len);
-          }
         }
         else
         {
@@ -534,30 +525,10 @@
 
           /* Write the user buffer to USB PMA */
           USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, (uint16_t)len);
-          ep->xfer_buff += len;
-
-          if (ep->xfer_len_db > ep->maxpacket)
-          {
-            ep->xfer_len_db -= len;
-          }
-          else
-          {
-            len = ep->xfer_len_db;
-            ep->xfer_len_db = 0U;
-          }
-
-          if (len > 0U)
-          {
-            /* Set the Double buffer counter for pmabuffer1 */
-            PCD_SET_EP_DBUF1_CNT(USBx, ep->num, ep->is_in, len);
-            pmabuffer = ep->pmaaddr1;
-
-            /* Write the user buffer to USB PMA */
-            USB_WritePMA(USBx, ep->xfer_buff, pmabuffer, (uint16_t)len);
-          }
         }
       }
     }
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
 
     PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_VALID);
   }
@@ -579,6 +550,7 @@
       /* configure and validate Rx endpoint */
       PCD_SET_EP_RX_CNT(USBx, ep->num, len);
     }
+#if (USE_USB_DOUBLE_BUFFER == 1U)
     else
     {
       /* First Transfer Coming From HAL_PCD_EP_Receive & From ISR */
@@ -597,7 +569,7 @@
           if ((((wEPVal & USB_EP_DTOG_RX) != 0U) && ((wEPVal & USB_EP_DTOG_TX) != 0U)) ||
               (((wEPVal & USB_EP_DTOG_RX) == 0U) && ((wEPVal & USB_EP_DTOG_TX) == 0U)))
           {
-            PCD_FreeUserBuffer(USBx, ep->num, 0U);
+            PCD_FREE_USER_BUFFER(USBx, ep->num, 0U);
           }
         }
       }
@@ -622,6 +594,7 @@
         return HAL_ERROR;
       }
     }
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
 
     PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_VALID);
   }
@@ -681,7 +654,52 @@
 
   return HAL_OK;
 }
-#endif /* HAL_PCD_MODULE_ENABLED */
+
+/**
+   * @brief  USB_EPStoptXfer  Stop transfer on an EP
+   * @param  USBx  usb device instance
+   * @param  ep pointer to endpoint structure
+   * @retval HAL status
+   */
+HAL_StatusTypeDef USB_EPStopXfer(USB_DRD_TypeDef *USBx, USB_DRD_EPTypeDef *ep)
+{
+  /* IN endpoint */
+  if (ep->is_in == 1U)
+  {
+    if (ep->doublebuffer == 0U)
+    {
+      if (ep->type != EP_TYPE_ISOC)
+      {
+        /* Configure NAK status for the Endpoint */
+        PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_NAK);
+      }
+      else
+      {
+        /* Configure TX Endpoint to disabled state */
+        PCD_SET_EP_TX_STATUS(USBx, ep->num, USB_EP_TX_DIS);
+      }
+    }
+  }
+  else /* OUT endpoint */
+  {
+    if (ep->doublebuffer == 0U)
+    {
+      if (ep->type != EP_TYPE_ISOC)
+      {
+        /* Configure NAK status for the Endpoint */
+        PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_NAK);
+      }
+      else
+      {
+        /* Configure RX Endpoint to disabled state */
+        PCD_SET_EP_RX_STATUS(USBx, ep->num, USB_EP_RX_DIS);
+      }
+    }
+  }
+
+  return HAL_OK;
+}
+#endif /* defined (HAL_PCD_MODULE_ENABLED) */
 
 /**
   * @brief  USB_StopDevice Stop the usb device mode
@@ -794,7 +812,8 @@
 void USB_WritePMA(USB_DRD_TypeDef *USBx, uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes)
 {
   UNUSED(USBx);
-  uint32_t count, tmp;
+  uint32_t tmp;
+  uint32_t count;
   __IO uint32_t *pdwVal;
   uint32_t NbWords = ((uint32_t)wNBytes + 3U) >> 2U;
   /* Due to the PMA access 32bit only so the last non word data should be processed alone */
@@ -850,7 +869,8 @@
 void USB_ReadPMA(USB_DRD_TypeDef *USBx, uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes)
 {
   UNUSED(USBx);
-  uint32_t count, tmp;
+  uint32_t count;
+  uint32_t tmp;
   __IO uint32_t *pdwVal;
   uint32_t NbWords = ((uint32_t)wNBytes + 3U) >> 2U;
   /*Due to the PMA access 32bit only so the last non word data should be processed alone */
@@ -985,7 +1005,7 @@
   * @brief  Set the channel Kind (Single/double buffer mode)
   * @param  USBx Selected device
   * @param  phy_ch_num Selected device
-  * @param  db_state double state can be USB_DRD_DBUFF_ENBALE/USB_DRD_DBUFF_DISABLE
+  * @param  db_state double state can be USB_DRD_XXX_DBUFF_ENBALE/USB_DRD_XXX_DBUFF_DISABLE
   * @retval HAL status
   */
 HAL_StatusTypeDef USB_HC_DoubleBuffer(USB_DRD_TypeDef *USBx,
@@ -993,7 +1013,7 @@
 {
   uint32_t tmp;
 
-  if (db_state == USB_DRD_DBUFF_ENBALE)
+  if ((db_state == USB_DRD_BULK_DBUFF_ENBALE) || (db_state == USB_DRD_ISOC_DBUFF_DISABLE))
   {
     tmp = (USB_DRD_GET_CHEP(USBx, phy_ch_num) | USB_CH_KIND) & USB_CHEP_DB_MSK;
   }
@@ -1039,6 +1059,8 @@
   uint32_t wChRegVal;
   uint32_t HostCoreSpeed;
 
+  UNUSED(mps);
+
   wChRegVal = USB_DRD_GET_CHEP(USBx, phy_ch_num) & USB_CH_T_MASK;
 
   /* initialize host Channel */
@@ -1081,9 +1103,6 @@
   /* Set the dev_address & ep type */
   USB_DRD_SET_CHEP(USBx, phy_ch_num, (wChRegVal | USB_CH_VTRX | USB_CH_VTTX));
 
-  /* Set the Rx Count */
-  USB_DRD_SET_CHEP_RX_CNT(USBx, phy_ch_num, mps);
-
   return ret;
 }
 
@@ -1093,12 +1112,13 @@
   * @param  hc pointer to host channel structure
   * @retval HAL state
   */
-HAL_StatusTypeDef USB_HC_StartXfer(USB_DRD_TypeDef *USBx,
-                                   USB_DRD_HCTypeDef *hc)
+HAL_StatusTypeDef USB_HC_StartXfer(USB_DRD_TypeDef *USBx, USB_DRD_HCTypeDef *hc)
 {
   uint32_t len;
   uint32_t phy_ch_num = (uint32_t)hc->phy_ch_num;
+#if (USE_USB_DOUBLE_BUFFER == 1U)
   uint32_t ch_reg = USB_DRD_GET_CHEP(USBx, phy_ch_num);
+#endif /* USE_USB_DOUBLE_BUFFER */
 
   if (hc->ch_dir == CH_IN_DIR)  /* In Channel */
   {
@@ -1117,19 +1137,21 @@
       /* Set RX buffer count */
       USB_DRD_SET_CHEP_RX_CNT(USBx, phy_ch_num, len);
     }
+#if (USE_USB_DOUBLE_BUFFER == 1U)
     else if (hc->ep_type == EP_TYPE_BULK)
     {
       /* Double buffer activated */
       if ((hc->xfer_len > hc->max_packet))
       {
-        (void)USB_HC_DoubleBuffer(USBx, (uint8_t)phy_ch_num, USB_DRD_DBUFF_ENBALE);
+        (void)USB_HC_DoubleBuffer(USBx, (uint8_t)phy_ch_num, USB_DRD_BULK_DBUFF_ENBALE);
 
         /*Set the Double buffer counter*/
-        USB_DRD_SET_CHEP_DBUF_CNT(USBx, phy_ch_num, hc->ch_dir, len);
+        USB_DRD_SET_CHEP_DBUF0_CNT(USBx, phy_ch_num, 0U, len);
+        USB_DRD_SET_CHEP_DBUF1_CNT(USBx, phy_ch_num, 0U, len);
       }
       else  /* switch to single buffer mode */
       {
-        (void)USB_HC_DoubleBuffer(USBx, (uint8_t)phy_ch_num, USB_DRD_DBUFF_DISABLE);
+        (void)USB_HC_DoubleBuffer(USBx, (uint8_t)phy_ch_num, USB_DRD_BULK_DBUFF_DISABLE);
 
         /* Set RX buffer count */
         USB_DRD_SET_CHEP_RX_CNT(USBx, phy_ch_num, len);
@@ -1137,9 +1159,11 @@
     }
     else  /* isochronous */
     {
-      /*Set the Double buffer counter*/
-      USB_DRD_SET_CHEP_DBUF_CNT(USBx, phy_ch_num, hc->ch_dir, len);
+      /* Set the Double buffer counter */
+      USB_DRD_SET_CHEP_DBUF0_CNT(USBx, phy_ch_num, 0U, len);
+      USB_DRD_SET_CHEP_DBUF1_CNT(USBx, phy_ch_num, 0U, len);
     }
+#endif /* USE_USB_DOUBLE_BUFFER */
 
     /*Enable host channel */
     USB_DRD_SET_CHEP_RX_STATUS(USBx, phy_ch_num, USB_CHEP_RX_STRX);
@@ -1161,12 +1185,14 @@
     {
       USB_WritePMA(USBx, hc->xfer_buff, hc->pmaadress, (uint16_t)len);
       USB_DRD_SET_CHEP_TX_CNT(USBx, phy_ch_num, (uint16_t)len);
+
       /*SET PID SETUP  */
       if ((hc->data_pid) == HC_PID_SETUP)
       {
         USB_DRD_CHEP_TX_SETUP(USBx,  phy_ch_num);
       }
     }
+#if (USE_USB_DOUBLE_BUFFER == 1U)
     else if (hc->ep_type == EP_TYPE_BULK)
     {
       (void)USB_HC_BULK_DB_StartXfer(USBx, hc, ch_reg, &len);
@@ -1175,6 +1201,7 @@
     {
       (void)USB_HC_ISO_DB_StartXfer(USBx, hc, len);
     }
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
 
     /* Enable host channel */
     USB_DRD_SET_CHEP_TX_STATUS(USBx, hc->phy_ch_num, USB_CH_TX_VALID);
@@ -1182,6 +1209,8 @@
 
   return HAL_OK;
 }
+
+#if (USE_USB_DOUBLE_BUFFER == 1U)
 /**
   * @brief  Start Transfer of Channel isochronous out double buffer
   * @param  USBx Selected device
@@ -1199,57 +1228,16 @@
   /* check the DTOG_TX to determine in which buffer we should write */
   if ((USB_DRD_GET_CHEP(USBx, phy_ch_num) & USB_CH_DTOG_TX) != 0U)
   {
-    if (hc->pmabuff1_state == USB_PMABUF_EMPTY)
-    {
-      /* Set the Double buffer counter for pmabuffer1 */
-      USB_DRD_SET_CHEP_DBUF1_CNT(USBx, phy_ch_num, hc->ch_dir, len);
-      hc->pmabuff1_state = USB_PMABUF_NOT_EMPTY;
-      USB_WritePMA(USBx, hc->xfer_buff, hc->pmaaddr1, (uint16_t)len);
-
-      if (hc->pmabuff0_state == USB_PMABUF_EMPTY)
-      {
-        hc->urb_state = URB_DONE;
-      }
-    }
-    else if (hc->pmabuff0_state == USB_PMABUF_EMPTY)
-    {
-      /* Set the Double buffer counter for pmabuffer0 */
-      USB_DRD_SET_CHEP_DBUF0_CNT(USBx, phy_ch_num, hc->ch_dir, len);
-      USB_WritePMA(USBx, hc->xfer_buff, hc->pmaaddr0, (uint16_t)len);
-      hc->pmabuff0_state = USB_PMABUF_NOT_EMPTY;
-    }
-    else
-    {
-      /* both buffer are not empty, should not be in this condition */
-      /*...*/
-    }
+    USB_DRD_SET_CHEP_DBUF0_CNT(USBx, phy_ch_num, 1U, len);
+    USB_WritePMA(USBx, hc->xfer_buff, hc->pmaaddr0, (uint16_t)len);
   }
   else
   {
     /* DTOGTX=0 */
-    if (hc->pmabuff0_state == USB_PMABUF_EMPTY)
-    {
-      /* Set the Double buffer counter for pmabuffer0 */
-      USB_DRD_SET_CHEP_DBUF0_CNT(USBx, phy_ch_num, hc->ch_dir, len);
-      USB_WritePMA(USBx, hc->xfer_buff, hc->pmaaddr0, (uint16_t)len);
-      hc->pmabuff0_state = USB_PMABUF_NOT_EMPTY;
-      if (hc->pmabuff1_state == USB_PMABUF_EMPTY)
-      {
-        hc->urb_state = URB_DONE;
-      }
+    /* Set the Double buffer counter for pmabuffer0 */
+    USB_DRD_SET_CHEP_DBUF1_CNT(USBx, phy_ch_num,1U, len);
+    USB_WritePMA(USBx, hc->xfer_buff, hc->pmaaddr1, (uint16_t)len);
     }
-    else if (hc->pmabuff1_state == USB_PMABUF_EMPTY)
-    {
-      /* Set the Double buffer counter for pmabuffer1 */
-      USB_DRD_SET_CHEP_DBUF1_CNT(USBx, phy_ch_num, hc->ch_dir, len);
-      hc->pmabuff1_state = USB_PMABUF_NOT_EMPTY;
-      USB_WritePMA(USBx, hc->xfer_buff, hc->pmaaddr1, (uint16_t)len);
-    }
-    else
-    {
-      /*...*/
-    }
-  }
 
   return HAL_OK;
 }
@@ -1274,7 +1262,7 @@
   if (hc->xfer_len_db > hc->max_packet)
   {
     /* enable double buffer mode */
-    (void)USB_HC_DoubleBuffer(USBx, (uint8_t)phy_ch_num, USB_DRD_DBUFF_ENBALE);
+    (void)USB_HC_DoubleBuffer(USBx, (uint8_t)phy_ch_num, USB_DRD_BULK_DBUFF_ENBALE);
     *len = hc->max_packet;
     hc->xfer_len_db -= *len;
 
@@ -1282,13 +1270,13 @@
     if ((ch_reg & USB_CH_DTOG_TX) == 0U)
     {
       /* Write Buffer0 */
-      USB_DRD_SET_CHEP_TX_CNT(USBx, phy_ch_num, (uint16_t)*len);
+      USB_DRD_SET_CHEP_DBUF0_CNT(USBx, phy_ch_num, 1U, (uint16_t)*len);
       USB_WritePMA(USBx, hc->xfer_buff, hc->pmaaddr0, (uint16_t)*len);
     }
     else
     {
       /* Write Buffer1 */
-      USB_DRD_SET_CHEP_DBUF1_CNT(USBx, (uint8_t) phy_ch_num, 0U, (uint16_t)*len);
+      USB_DRD_SET_CHEP_DBUF1_CNT(USBx, phy_ch_num, 1U, (uint16_t)*len);
       USB_WritePMA(USBx, hc->xfer_buff, hc->pmaaddr1, (uint16_t)*len);
     }
 
@@ -1308,27 +1296,28 @@
     if ((ch_reg & USB_CH_DTOG_TX) == 0U)
     {
       /* Write Buffer1 */
-      USB_DRD_SET_CHEP_DBUF1_CNT(USBx, phy_ch_num, 0U, (uint16_t)*len);
+      USB_DRD_SET_CHEP_DBUF1_CNT(USBx, phy_ch_num, 1U, (uint16_t)*len);
       USB_WritePMA(USBx, hc->xfer_buff, hc->pmaaddr1, (uint16_t)*len);
     }
     else
     {
       /* Write Buffer0 */
-      USB_DRD_SET_CHEP_TX_CNT(USBx, phy_ch_num, (uint16_t)*len);
+      USB_DRD_SET_CHEP_DBUF0_CNT(USBx, phy_ch_num, 1U, (uint16_t)*len);
       USB_WritePMA(USBx, hc->xfer_buff, hc->pmaaddr0, (uint16_t)*len);
     }
   }
   else
   {
-    /* Disable double buffer mode */
-    (void)USB_HC_DoubleBuffer(USBx, (uint8_t)phy_ch_num, USB_DRD_DBUFF_DISABLE);
-
+    /* Disable bulk double buffer mode */
+    (void)USB_HC_DoubleBuffer(USBx, (uint8_t)phy_ch_num, USB_DRD_BULK_DBUFF_DISABLE);
     USB_WritePMA(USBx, hc->xfer_buff, hc->pmaaddr0, (uint16_t)*len);
     USB_DRD_SET_CHEP_TX_CNT(USBx, phy_ch_num, (uint16_t)*len);
   }
 
   return HAL_OK;
 }
+#endif /* (USE_USB_DOUBLE_BUFFER == 1U) */
+
 
 /**
   * @brief  Halt a host channel in
@@ -1344,6 +1333,8 @@
 
   return HAL_OK;
 }
+
+
 /**
   * @brief  Halt a host channel out
   * @param  USBx Selected device
