mbed library sources

Fork of mbed-src by mbed official

Revision:
369:2e96f1b71984
Parent:
226:b062af740e40
--- a/targets/cmsis/TARGET_STM/TARGET_NUCLEO_F401RE/stm32f4xx_hal_dma2d.c	Mon Oct 27 08:00:06 2014 +0000
+++ b/targets/cmsis/TARGET_STM/TARGET_NUCLEO_F401RE/stm32f4xx_hal_dma2d.c	Mon Oct 27 09:45:07 2014 +0000
@@ -2,8 +2,8 @@
   ******************************************************************************
   * @file    stm32f4xx_hal_dma2d.c
   * @author  MCD Application Team
-  * @version V1.1.0RC2
-  * @date    14-May-2014
+  * @version V1.1.0
+  * @date    19-June-2014
   * @brief   DMA2D HAL module driver.
   *          This file provides firmware functions to manage the following 
   *          functionalities of the DMA2D peripheral:
@@ -46,8 +46,7 @@
 
          -@-   In Register-to-Memory transfer mode, the pdata parameter is the register
                color, in Memory-to-memory or memory-to-memory with pixel format
-               conversion the pdata is the source address and it is the color value 
-               for the A4 or A8 mode.
+               conversion the pdata is the source address.
 
          -@-   Configure the foreground source address, the background source address, 
                the Destination and data length and Enable the transfer using 
@@ -334,8 +333,7 @@
   * @param  pdata:      Configure the source memory Buffer address if 
   *                     the memory to memory or memory to memory with pixel format 
   *                     conversion DMA2D mode is selected, and configure 
-  *                     the color value if register to memory DMA2D mode is selected
-  *                     or the color value for the A4 or A8 mode.
+  *                     the color value if register to memory DMA2D mode is selected.
   * @param  DstAddress: The destination memory Buffer address.
   * @param  Width:      The width of data to be transferred from source to destination.
   * @param  Heigh:      The heigh of data to be transferred from source to destination.
@@ -372,8 +370,7 @@
   * @param  pdata:      Configure the source memory Buffer address if 
   *                     the memory to memory or memory to memory with pixel format 
   *                     conversion DMA2D mode is selected, and configure 
-  *                     the color value if register to memory DMA2D mode is selected
-  *                     or the color value for the A4 or A8 mode.
+  *                     the color value if register to memory DMA2D mode is selected.
   * @param  DstAddress: The destination memory Buffer address.
   * @param  Width:      The width of data to be transferred from source to destination.
   * @param  Heigh:      The heigh of data to be transferred from source to destination.
@@ -417,8 +414,7 @@
   * @param  hdma2d:      pointer to a DMA2D_HandleTypeDef structure that contains
   *                      the configuration information for the DMA2D.  
   * @param  SrcAddress1: The source memory Buffer address of the foreground layer.
-  * @param  SrcAddress2: The source memory Buffer address of the background layer
-  *                      or the color value for the A4 or A8 mode.
+  * @param  SrcAddress2: The source memory Buffer address of the background layer.
   * @param  DstAddress:  The destination memory Buffer address
   * @param  Width:       The width of data to be transferred from source to destination.
   * @param  Heigh:       The heigh of data to be transferred from source to destination.
@@ -439,15 +435,8 @@
   /* Disable the Peripheral */
   __HAL_DMA2D_DISABLE(hdma2d);
 
-  if((hdma2d->LayerCfg[0].InputColorMode == CM_A4) || (hdma2d->LayerCfg[0].InputColorMode == CM_A8))
-  {
-    hdma2d->Instance->BGCOLR = SrcAddress2;
-  }
-  else
-  {
   /* Configure DMA2D Stream source2 address */
   hdma2d->Instance->BGMAR = SrcAddress2;
-  }
 
   /* Configure the source, destination address and the data size */
   DMA2D_SetConfig(hdma2d, SrcAddress1, DstAddress, Width, Heigh);
@@ -463,8 +452,7 @@
   * @param  hdma2d:     pointer to a DMA2D_HandleTypeDef structure that contains
   *                     the configuration information for the DMA2D.  
   * @param  SrcAddress1: The source memory Buffer address of the foreground layer.
-  * @param  SrcAddress2: The source memory Buffer address of the background layer
-  *                      or the color value for the A4 or A8 mode.
+  * @param  SrcAddress2: The source memory Buffer address of the background layer.
   * @param  DstAddress:  The destination memory Buffer address.
   * @param  Width:       The width of data to be transferred from source to destination.
   * @param  Heigh:       The heigh of data to be transferred from source to destination.
@@ -484,16 +472,9 @@
 
   /* Disable the Peripheral */
   __HAL_DMA2D_DISABLE(hdma2d);
-
-  if ((hdma2d->LayerCfg[0].InputColorMode == CM_A4) || (hdma2d->LayerCfg[0].InputColorMode == CM_A8))
-  {
-    hdma2d->Instance->BGCOLR = SrcAddress2;
-  }
-  else
-  {  
-    /* Configure DMA2D Stream source2 address */
-    hdma2d->Instance->BGMAR = SrcAddress2;
-  }
+ 
+  /* Configure DMA2D Stream source2 address */
+  hdma2d->Instance->BGMAR = SrcAddress2;
 
   /* Configure the source, destination address and the data size */
   DMA2D_SetConfig(hdma2d, SrcAddress1, DstAddress, Width, Heigh);
@@ -521,18 +502,18 @@
   */
 HAL_StatusTypeDef HAL_DMA2D_Abort(DMA2D_HandleTypeDef *hdma2d)
 {
-  uint32_t timeout = 0x00;
+  uint32_t tickstart = 0;
 
   /* Disable the DMA2D */
   __HAL_DMA2D_DISABLE(hdma2d);
 
-  /* Get timeout */
-  timeout = HAL_GetTick() + HAL_TIMEOUT_DMA2D_ABORT;
+  /* Get tick */
+  tickstart = HAL_GetTick();
 
   /* Check if the DMA2D is effectively disabled */
   while((hdma2d->Instance->CR & DMA2D_CR_START) != 0)
   {
-    if(HAL_GetTick() >= timeout)
+    if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA2D_ABORT)
     {
       /* Update error code */
       hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TIMEOUT;
@@ -563,18 +544,18 @@
   */
 HAL_StatusTypeDef HAL_DMA2D_Suspend(DMA2D_HandleTypeDef *hdma2d)
 {
-  uint32_t timeout = 0x00;
+  uint32_t tickstart = 0;
 
   /* Suspend the DMA2D transfer */
   hdma2d->Instance->CR |= DMA2D_CR_SUSP;
 
-  /* Get timeout */
-  timeout = HAL_GetTick() + HAL_TIMEOUT_DMA2D_SUSPEND;
+  /* Get tick */
+  tickstart = HAL_GetTick();
 
   /* Check if the DMA2D is effectively suspended */
   while((hdma2d->Instance->CR & DMA2D_CR_SUSP) != DMA2D_CR_SUSP)
   {
-    if(HAL_GetTick() >= timeout)
+    if((HAL_GetTick() - tickstart ) > HAL_TIMEOUT_DMA2D_SUSPEND)
     {
       /* Update error code */
       hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TIMEOUT;
@@ -618,13 +599,13 @@
 HAL_StatusTypeDef HAL_DMA2D_PollForTransfer(DMA2D_HandleTypeDef *hdma2d, uint32_t Timeout)
 {
   uint32_t tmp, tmp1;
-  uint32_t timeout = 0x00;
+  uint32_t tickstart = 0;
 
   /* Polling for DMA2D transfer */
   if((hdma2d->Instance->CR & DMA2D_CR_START) != 0)
   {
-    /* Get timeout */
-    timeout = HAL_GetTick() + Timeout;
+   /* Get tick */
+   tickstart = HAL_GetTick();
 
     while(__HAL_DMA2D_GET_FLAG(hdma2d, DMA2D_FLAG_TC) == RESET)
     {
@@ -648,7 +629,7 @@
       /* Check for the Timeout */
       if(Timeout != HAL_MAX_DELAY)
       {
-        if(HAL_GetTick() >= timeout)
+        if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
         {
           /* Process unlocked */
           __HAL_UNLOCK(hdma2d);
@@ -667,8 +648,8 @@
   /* Polling for CLUT loading */
   if((hdma2d->Instance->FGPFCCR & DMA2D_FGPFCCR_START) != 0)
   {
-    /* Get timeout */
-    timeout = HAL_GetTick() + Timeout;
+    /* Get tick */
+    tickstart = HAL_GetTick();
    
     while(__HAL_DMA2D_GET_FLAG(hdma2d, DMA2D_FLAG_CTC) == RESET)
     {
@@ -685,7 +666,7 @@
       /* Check for the Timeout */
       if(Timeout != HAL_MAX_DELAY)
       {
-        if(HAL_GetTick() >= timeout)
+        if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
         {
           /* Update error code */
           hdma2d->ErrorCode |= HAL_DMA2D_ERROR_TIMEOUT;
@@ -855,7 +836,6 @@
     if(hdma2d->Init.Mode != DMA2D_M2M)
     {
       assert_param(IS_DMA2D_ALPHA_MODE(pLayerCfg->AlphaMode));
-      assert_param(IS_DMA2D_ALPHA_VALUE(pLayerCfg->InputAlpha));
     }
   }
   
@@ -869,8 +849,16 @@
     /* Clear Input color mode, alpha value and alpha mode bits */
     tmp &= (uint32_t)~(DMA2D_BGPFCCR_CM | DMA2D_BGPFCCR_AM | DMA2D_BGPFCCR_ALPHA); 
     
-    /* Prepare the value to be wrote to the BGPFCCR register */
-    tmp |= (pLayerCfg->InputColorMode | (pLayerCfg->AlphaMode << 16) | (pLayerCfg->InputAlpha << 24));
+    if ((pLayerCfg->InputColorMode == CM_A4) || (pLayerCfg->InputColorMode == CM_A8))
+    {
+      /* Prepare the value to be wrote to the BGPFCCR register */
+      tmp |= (pLayerCfg->InputColorMode | (pLayerCfg->AlphaMode << 16) | ((pLayerCfg->InputAlpha) & 0xFF000000));
+    }
+    else
+    {
+      /* Prepare the value to be wrote to the BGPFCCR register */
+      tmp |= (pLayerCfg->InputColorMode | (pLayerCfg->AlphaMode << 16) | (pLayerCfg->InputAlpha << 24));
+    }
     
     /* Write to DMA2D BGPFCCR register */
     hdma2d->Instance->BGPFCCR = tmp; 
@@ -887,6 +875,15 @@
     
     /* Write to DMA2D BGOR register */
     hdma2d->Instance->BGOR = tmp;
+    
+    if ((pLayerCfg->InputColorMode == CM_A4) || (pLayerCfg->InputColorMode == CM_A8))
+    {
+      /* Prepare the value to be wrote to the BGCOLR register */
+      tmp |= ((pLayerCfg->InputAlpha) & 0x00FFFFFF);
+    
+      /* Write to DMA2D BGCOLR register */
+      hdma2d->Instance->BGCOLR = tmp;
+    }    
   }
   /* Configure the foreground DMA2D layer */
   else
@@ -898,8 +895,16 @@
     /* Clear Input color mode, alpha value and alpha mode bits */
     tmp &= (uint32_t)~(DMA2D_FGPFCCR_CM | DMA2D_FGPFCCR_AM | DMA2D_FGPFCCR_ALPHA); 
     
-    /* Prepare the value to be wrote to the FGPFCCR register */
-    tmp |= (pLayerCfg->InputColorMode | (pLayerCfg->AlphaMode << 16) | (pLayerCfg->InputAlpha << 24));
+    if ((pLayerCfg->InputColorMode == CM_A4) || (pLayerCfg->InputColorMode == CM_A8))
+    {
+      /* Prepare the value to be wrote to the FGPFCCR register */
+      tmp |= (pLayerCfg->InputColorMode | (pLayerCfg->AlphaMode << 16) | ((pLayerCfg->InputAlpha) & 0xFF000000));
+    }
+    else
+    {
+      /* Prepare the value to be wrote to the FGPFCCR register */
+      tmp |= (pLayerCfg->InputColorMode | (pLayerCfg->AlphaMode << 16) | (pLayerCfg->InputAlpha << 24));
+    }
     
     /* Write to DMA2D FGPFCCR register */
     hdma2d->Instance->FGPFCCR = tmp; 
@@ -916,6 +921,15 @@
     
     /* Write to DMA2D FGOR register */
     hdma2d->Instance->FGOR = tmp;
+   
+    if ((pLayerCfg->InputColorMode == CM_A4) || (pLayerCfg->InputColorMode == CM_A8))
+    {
+      /* Prepare the value to be wrote to the FGCOLR register */
+      tmp |= ((pLayerCfg->InputAlpha) & 0x00FFFFFF);
+    
+      /* Write to DMA2D FGCOLR register */
+      hdma2d->Instance->FGCOLR = tmp;
+    }   
   }    
   /* Initialize the DMA2D state*/
   hdma2d->State  = HAL_DMA2D_STATE_READY;
@@ -1212,11 +1226,7 @@
     }    
     /* Write to DMA2D OCOLR register */
     hdma2d->Instance->OCOLR = tmp;
-  }
-  else if ((hdma2d->LayerCfg[1].InputColorMode == CM_A4) || (hdma2d->LayerCfg[1].InputColorMode == CM_A8))
-  {
-    hdma2d->Instance->FGCOLR = pdata;
-  }  
+  } 
   else /* M2M, M2M_PFC or M2M_Blending DMA2D Mode */
   {
     /* Configure DMA2D source address */