mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Revision:
189:f392fc9709a3
Parent:
188:bcfe06ba3d64
--- a/targets/TARGET_STM/qspi_api.c	Thu Nov 08 11:46:34 2018 +0000
+++ b/targets/TARGET_STM/qspi_api.c	Wed Feb 20 22:31:08 2019 +0000
@@ -38,7 +38,7 @@
 /* hence 2^(31+1), then FLASH_SIZE_DEFAULT = 1<<31 */
 #define QSPI_FLASH_SIZE_DEFAULT 0x80000000
 
-void qspi_prepare_command(const qspi_command_t *command, QSPI_CommandTypeDef *st_command) 
+void qspi_prepare_command(const qspi_command_t *command, QSPI_CommandTypeDef *st_command)
 {
     // TODO: shift these around to get more dynamic mapping
     switch (command->instruction.bus_width) {
@@ -57,7 +57,7 @@
     }
 
     st_command->Instruction = command->instruction.value;
-    st_command->DummyCycles = command->dummy_count,
+    st_command->DummyCycles = command->dummy_count;
     // these are target specific settings, use default values
     st_command->SIOOMode = QSPI_SIOO_INST_EVERY_CMD;
     st_command->DdrMode = QSPI_DDR_MODE_DISABLE;
@@ -134,7 +134,7 @@
 qspi_status_t qspi_init(qspi_t *obj, PinName io0, PinName io1, PinName io2, PinName io3, PinName sclk, PinName ssel, uint32_t hz, uint8_t mode)
 {
     // Enable interface clock for QSPI
-     __HAL_RCC_QSPI_CLK_ENABLE();
+    __HAL_RCC_QSPI_CLK_ENABLE();
 
     // Reset QSPI
     __HAL_RCC_QSPI_FORCE_RESET();
@@ -170,7 +170,7 @@
     QSPIName qspi_data_third = (QSPIName)pinmap_merge(qspiclkname, qspisselname);
 
     if (qspi_data_first != qspi_data_second || qspi_data_second != qspi_data_third ||
-        qspi_data_first != qspi_data_third) {
+            qspi_data_first != qspi_data_third) {
         return QSPI_STATUS_INVALID_PARAMETER;
     }
 
@@ -192,16 +192,12 @@
     obj->ssel = ssel;
     pinmap_pinout(ssel, PinMap_QSPI_SSEL);
 
-    if (HAL_QSPI_Init(&obj->handle) != HAL_OK) {
-        return QSPI_STATUS_ERROR;
-    }
-    qspi_frequency(obj, hz);
-    return QSPI_STATUS_OK;
+    return qspi_frequency(obj, hz);
 }
 
 qspi_status_t qspi_free(qspi_t *obj)
 {
-    if(HAL_QSPI_DeInit(&obj->handle) != HAL_OK) {
+    if (HAL_QSPI_DeInit(&obj->handle) != HAL_OK) {
         return QSPI_STATUS_ERROR;
     }
 
@@ -228,18 +224,28 @@
 {
     qspi_status_t status = QSPI_STATUS_OK;
 
-    // HCLK drives QSPI 
+    /* HCLK drives QSPI. QSPI clock depends on prescaler value:
+    *  0: Freq = HCLK
+    *  1: Freq = HCLK/2
+    *  ...
+    *  255: Freq = HCLK/256 (minimum value)
+    */
+
     int div = HAL_RCC_GetHCLKFreq() / hz;
-    if (div > 256 || div < 1) {
-        status = QSPI_STATUS_INVALID_PARAMETER;
-        return status;
+    if (div > 255) {
+        div = 255;
+    } else {
+        if ((HAL_RCC_GetHCLKFreq() % hz) == 0) {
+            div = div - 1;
+        }
     }
 
-    obj->handle.Init.ClockPrescaler = div - 1;
+    obj->handle.Init.ClockPrescaler = div;
 
     if (HAL_QSPI_Init(&obj->handle) != HAL_OK) {
         status = QSPI_STATUS_ERROR;
     }
+
     return status;
 }
 
@@ -253,11 +259,10 @@
 
     if (HAL_QSPI_Command(&obj->handle, &st_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
         status = QSPI_STATUS_ERROR;
-        return status;
-    }
-
-    if (HAL_QSPI_Transmit(&obj->handle, (uint8_t *)data, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
-        status = QSPI_STATUS_ERROR;
+    } else {
+        if (HAL_QSPI_Transmit(&obj->handle, (uint8_t *)data, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
+            status = QSPI_STATUS_ERROR;
+        }
     }
 
     return status;
@@ -273,11 +278,10 @@
 
     if (HAL_QSPI_Command(&obj->handle, &st_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
         status = QSPI_STATUS_ERROR;
-        return status;
-    }
-
-    if (HAL_QSPI_Receive(&obj->handle, data, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
-        status = QSPI_STATUS_ERROR;
+    } else {
+        if (HAL_QSPI_Receive(&obj->handle, data, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
+            status = QSPI_STATUS_ERROR;
+        }
     }
 
     return status;
@@ -293,7 +297,7 @@
         qspi_prepare_command(command, &st_command);
 
         st_command.NbData = 1;
-        st_command.DataMode = QSPI_DATA_NONE; /* Instruction only */ 
+        st_command.DataMode = QSPI_DATA_NONE; /* Instruction only */
         if (HAL_QSPI_Command(&obj->handle, &st_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) {
             status = QSPI_STATUS_ERROR;
             return status;