Modified version of the mbed library for use with the Nucleo boards.

Dependents:   EEPROMWrite Full-Project

Fork of mbed-src by mbed official

Revision:
613:bc40b8d2aec4
Parent:
532:fe11edbda85c
--- a/targets/cmsis/TARGET_STM/TARGET_STM32F4/stm32f4xx_hal_hash_ex.c	Tue Aug 18 15:00:09 2015 +0100
+++ b/targets/cmsis/TARGET_STM/TARGET_STM32F4/stm32f4xx_hal_hash_ex.c	Thu Aug 20 10:45:13 2015 +0100
@@ -2,8 +2,8 @@
   ******************************************************************************
   * @file    stm32f4xx_hal_hash_ex.c
   * @author  MCD Application Team
-  * @version V1.3.0
-  * @date    09-March-2015
+  * @version V1.3.2
+  * @date    26-June-2015
   * @brief   HASH HAL Extension module driver.
   *          This file provides firmware functions to manage the following 
   *          functionalities of HASH peripheral:
@@ -265,7 +265,7 @@
         buffersize = hhash->Init.KeySize;
       }
       /* Configure the number of valid bits in last word of the message */
-      HASH->STR |= 8 * (buffersize % 4);
+      MODIFY_REG(HASH->STR, HASH_STR_NBLW, 8 * (buffersize % 4));
       
       /* Set the HASH DMA transfer complete */
       hhash->hdmain->XferCpltCallback = HASHEx_DMAXferCplt;
@@ -926,14 +926,6 @@
   /* Process Locked */
   __HAL_LOCK(hhash);
   
-  if(hhash->HashITCounter == 0)
-  {
-    hhash->HashITCounter = 1;
-  }
-  else
-  {
-    hhash->HashITCounter = 0;
-  }
   if(hhash->State == HAL_HASH_STATE_READY)
   {
     /* Change the HASH state */
@@ -953,6 +945,9 @@
       HASH->CR |= HASH_CR_INIT;
     }
     
+    /* Reset interrupt counter */
+    hhash->HashITCounter = 0;
+    
     /* Set the phase */
     hhash->Phase = HAL_HASH_PHASE_PROCESS;
     
@@ -977,11 +972,17 @@
       hhash->State = HAL_HASH_STATE_READY;
       /* Call digest computation complete callback */
       HAL_HASH_DgstCpltCallback(hhash);
+      
+      /* Process Unlocked */
+      __HAL_UNLOCK(hhash);
+      
+      /* Return function status */
+      return HAL_OK;
     }
   }
   if(__HAL_HASH_GET_FLAG(HASH_FLAG_DINIS))
   {
-    if(hhash->HashInCount > 64)
+    if(hhash->HashInCount >= 68)
     {
       inputaddr = (uint32_t)hhash->pHashInBuffPtr;
       /* Write the Input block in the Data IN register */
@@ -993,6 +994,7 @@
       if(hhash->HashITCounter == 0)
       {
         HASH->DIN = *(uint32_t*)inputaddr;
+
         if(hhash->HashInCount >= 68)
         {
           /* Decrement buffer counter */
@@ -1001,8 +1003,11 @@
         }
         else
         {
-          hhash->HashInCount -= 64;
+          hhash->HashInCount = 0;
+          hhash->pHashInBuffPtr+= hhash->HashInCount;
         }
+        /* Set Interrupt counter */
+        hhash->HashITCounter = 1;
       }
       else
       {
@@ -1026,7 +1031,10 @@
       {
         inputcounter = (inputcounter+4-inputcounter%4);
       }
-      
+      else if ((inputcounter < 4) && (inputcounter != 0))
+      {
+        inputcounter = 4;
+      }
       /* Write the Input block in the Data IN register */
       for(buffercounter = 0; buffercounter < inputcounter/4; buffercounter++)
       {
@@ -1037,9 +1045,10 @@
       __HAL_HASH_START_DIGEST();
       /* Reset buffer counter */
       hhash->HashInCount = 0;
+
+     /* Call Input data transfer complete callback */
+     HAL_HASH_InCpltCallback(hhash);
     }
-    /* Call Input data transfer complete callback */
-    HAL_HASH_InCpltCallback(hhash);
   }
   
   /* Process Unlocked */
@@ -1070,14 +1079,6 @@
   /* Process Locked */
   __HAL_LOCK(hhash);
   
-  if(hhash->HashITCounter == 0)
-  {
-    hhash->HashITCounter = 1;
-  }
-  else
-  {
-    hhash->HashITCounter = 0;
-  }
   if(hhash->State == HAL_HASH_STATE_READY)
   {
     /* Change the HASH state */
@@ -1097,6 +1098,9 @@
       HASH->CR |= HASH_CR_INIT;
     }
     
+    /* Reset interrupt counter */
+    hhash->HashITCounter = 0;
+    
     /* Set the phase */
     hhash->Phase = HAL_HASH_PHASE_PROCESS;
     
@@ -1121,11 +1125,17 @@
       hhash->State = HAL_HASH_STATE_READY;
       /* Call digest computation complete callback */
       HAL_HASH_DgstCpltCallback(hhash);
+      
+      /* Process Unlocked */
+      __HAL_UNLOCK(hhash);
+      
+      /* Return function status */
+      return HAL_OK;
     }
   }
   if(__HAL_HASH_GET_FLAG(HASH_FLAG_DINIS))
   {
-    if(hhash->HashInCount > 64)
+    if(hhash->HashInCount >= 68)
     {
       inputaddr = (uint32_t)hhash->pHashInBuffPtr;
       /* Write the Input block in the Data IN register */
@@ -1137,7 +1147,7 @@
       if(hhash->HashITCounter == 0)
       {
         HASH->DIN = *(uint32_t*)inputaddr;
-        
+
         if(hhash->HashInCount >= 68)
         {
           /* Decrement buffer counter */
@@ -1146,8 +1156,11 @@
         }
         else
         {
-          hhash->HashInCount -= 64;
+          hhash->HashInCount = 0;
+          hhash->pHashInBuffPtr+= hhash->HashInCount;
         }
+        /* Set Interrupt counter */
+        hhash->HashITCounter = 1;
       }
       else
       {
@@ -1171,7 +1184,10 @@
       {
         inputcounter = (inputcounter+4-inputcounter%4);
       }
-      
+      else if ((inputcounter < 4) && (inputcounter != 0))
+      {
+        inputcounter = 4;
+      }
       /* Write the Input block in the Data IN register */
       for(buffercounter = 0; buffercounter < inputcounter/4; buffercounter++)
       {
@@ -1182,9 +1198,10 @@
       __HAL_HASH_START_DIGEST();
       /* Reset buffer counter */
       hhash->HashInCount = 0;
+
+     /* Call Input data transfer complete callback */
+     HAL_HASH_InCpltCallback(hhash);
     }
-    /* Call Input data transfer complete callback */
-    HAL_HASH_InCpltCallback(hhash);
   }
   
   /* Process Unlocked */
@@ -1206,11 +1223,11 @@
   {
     
     case HASH_ALGOSELECTION_SHA224:
-       HAL_HASHEx_SHA224_Start_IT(hhash, HAL_NULL, 0, HAL_NULL);
+       HAL_HASHEx_SHA224_Start_IT(hhash, NULL, 0, NULL);
     break;
     
     case HASH_ALGOSELECTION_SHA256:
-      HAL_HASHEx_SHA256_Start_IT(hhash, HAL_NULL, 0, HAL_NULL);
+      HAL_HASHEx_SHA256_Start_IT(hhash, NULL, 0, NULL);
     break;
     
     default: