Release v1.4.3
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