aboutsummaryrefslogtreecommitdiff
path: root/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Composite_Example/src/mass_mal.c
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Composite_Example/src/mass_mal.c')
-rw-r--r--thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Composite_Example/src/mass_mal.c233
1 files changed, 233 insertions, 0 deletions
diff --git a/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Composite_Example/src/mass_mal.c b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Composite_Example/src/mass_mal.c
new file mode 100644
index 0000000..3b5183c
--- /dev/null
+++ b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Composite_Example/src/mass_mal.c
@@ -0,0 +1,233 @@
+/**
+ ******************************************************************************
+ * @file mass_mal.c
+ * @author MCD Application Team
+ * @version V4.0.0
+ * @date 21-January-2013
+ * @brief Medium Access Layer interface
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>
+ *
+ * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
+ * You may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.st.com/software_license_agreement_liberty_v2
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************
+ */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "platform_config.h"
+#include "mass_mal.h"
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+uint32_t Mass_Memory_Size[2];
+uint32_t Mass_Block_Size[2];
+uint32_t Mass_Block_Count[2];
+__IO uint32_t Status = 0;
+
+#if defined(USE_STM3210E_EVAL) || defined(USE_STM32L152D_EVAL)
+SD_CardInfo mSDCardInfo;
+#endif
+
+/* Private function prototypes -----------------------------------------------*/
+/* Private functions ---------------------------------------------------------*/
+/*******************************************************************************
+* Function Name : MAL_Init
+* Description : Initializes the Media on the STM32
+* Input : None
+* Output : None
+* Return : None
+*******************************************************************************/
+uint16_t MAL_Init(uint8_t lun)
+{
+ uint16_t status = MAL_OK;
+
+ switch (lun)
+ {
+ case 0:
+ Status = SD_Init();
+ break;
+#ifdef USE_STM3210E_EVAL
+ case 1:
+ NAND_Init();
+ break;
+#endif
+ default:
+ return MAL_FAIL;
+ }
+ return status;
+}
+/*******************************************************************************
+* Function Name : MAL_Write
+* Description : Write sectors
+* Input : None
+* Output : None
+* Return : None
+*******************************************************************************/
+uint16_t MAL_Write(uint8_t lun, uint32_t Memory_Offset, uint32_t *Writebuff, uint16_t Transfer_Length)
+{
+
+ switch (lun)
+ {
+ case 0:
+ Status = SD_WriteMultiBlocks((uint8_t*)Writebuff, Memory_Offset, Transfer_Length,1);
+#if defined(USE_STM3210E_EVAL) || defined(USE_STM32L152D_EVAL)
+ Status = SD_WaitWriteOperation();
+ while(SD_GetStatus() != SD_TRANSFER_OK);
+ if ( Status != SD_OK )
+ {
+ return MAL_FAIL;
+ }
+#endif /* USE_STM3210E_EVAL ||USE_STM32L152D_EVAL*/
+ break;
+#ifdef USE_STM3210E_EVAL
+ case 1:
+ NAND_Write(Memory_Offset, Writebuff, Transfer_Length);
+ break;
+#endif /* USE_STM3210E_EVAL */
+ default:
+ return MAL_FAIL;
+ }
+ return MAL_OK;
+}
+
+/*******************************************************************************
+* Function Name : MAL_Read
+* Description : Read sectors
+* Input : None
+* Output : None
+* Return : Buffer pointer
+*******************************************************************************/
+uint16_t MAL_Read(uint8_t lun, uint32_t Memory_Offset, uint32_t *Readbuff, uint16_t Transfer_Length)
+{
+
+ switch (lun)
+ {
+ case 0:
+
+ SD_ReadMultiBlocks((uint8_t*)Readbuff, Memory_Offset, Transfer_Length, 1);
+#if defined(USE_STM3210E_EVAL) || defined(USE_STM32L152D_EVAL)
+ Status = SD_WaitReadOperation();
+ while(SD_GetStatus() != SD_TRANSFER_OK)
+ {
+ }
+
+ if ( Status != SD_OK )
+ {
+ return MAL_FAIL;
+ }
+#endif /* USE_STM3210E_EVAL */
+ break;
+#ifdef USE_STM3210E_EVAL
+ case 1:
+ NAND_Read(Memory_Offset, Readbuff, Transfer_Length);
+ ;
+ break;
+#endif
+ default:
+ return MAL_FAIL;
+ }
+ return MAL_OK;
+}
+
+/*******************************************************************************
+* Function Name : MAL_GetStatus
+* Description : Get status
+* Input : None
+* Output : None
+* Return : None
+*******************************************************************************/
+uint16_t MAL_GetStatus (uint8_t lun)
+{
+#ifdef USE_STM3210E_EVAL
+ NAND_IDTypeDef NAND_ID;
+ uint32_t DeviceSizeMul = 0, NumberOfBlocks = 0;
+#else
+ SD_CSD SD_csd;
+ uint32_t DeviceSizeMul = 0;
+#endif /* USE_STM3210E_EVAL */
+
+#ifdef USE_STM32L152D_EVAL
+
+ uint32_t NumberOfBlocks = 0;
+#endif
+
+ if (lun == 0)
+ {
+#if defined (USE_STM3210E_EVAL) || defined(USE_STM32L152D_EVAL)
+ if (SD_Init() == SD_OK)
+ {
+ SD_GetCardInfo(&mSDCardInfo);
+ SD_SelectDeselect((uint32_t) (mSDCardInfo.RCA << 16));
+ DeviceSizeMul = (mSDCardInfo.SD_csd.DeviceSizeMul + 2);
+
+ if(mSDCardInfo.CardType == SDIO_HIGH_CAPACITY_SD_CARD)
+ {
+ Mass_Block_Count[0] = (mSDCardInfo.SD_csd.DeviceSize + 1) * 1024;
+ }
+ else
+ {
+ NumberOfBlocks = ((1 << (mSDCardInfo.SD_csd.RdBlockLen)) / 512);
+ Mass_Block_Count[0] = ((mSDCardInfo.SD_csd.DeviceSize + 1) * (1 << DeviceSizeMul) << (NumberOfBlocks/2));
+ }
+ Mass_Block_Size[0] = 512;
+
+ Status = SD_SelectDeselect((uint32_t) (mSDCardInfo.RCA << 16));
+ Status = SD_EnableWideBusOperation(SDIO_BusWide_4b);
+ if ( Status != SD_OK )
+ {
+ return MAL_FAIL;
+ }
+
+#else
+
+ uint32_t temp_block_mul = 0;
+ SD_GetCSDRegister(&SD_csd);
+ DeviceSizeMul = SD_csd.DeviceSizeMul + 2;
+ temp_block_mul = (1 << SD_csd.RdBlockLen)/ 512;
+ Mass_Block_Count[0] = ((SD_csd.DeviceSize + 1) * (1 << (DeviceSizeMul))) * temp_block_mul;
+ Mass_Block_Size[0] = 512;
+ Mass_Memory_Size[0] = (Mass_Block_Count[0] * Mass_Block_Size[0]);
+#endif /* USE_STM3210E_EVAL */
+ Mass_Memory_Size[0] = Mass_Block_Count[0] * Mass_Block_Size[0];
+ STM_EVAL_LEDOn(LED4);
+ return MAL_OK;
+
+#if defined (USE_STM3210E_EVAL) || defined(USE_STM32L152D_EVAL)
+ }
+#endif /* USE_STM3210E_EVAL */
+ }
+#ifdef USE_STM3210E_EVAL
+ else
+ {
+ FSMC_NAND_ReadID(&NAND_ID);
+ if (NAND_ID.Device_ID != 0 )
+ {
+ /* only one zone is used */
+ Mass_Block_Count[1] = NAND_ZONE_SIZE * NAND_BLOCK_SIZE * NAND_MAX_ZONE ;
+ Mass_Block_Size[1] = NAND_PAGE_SIZE;
+ Mass_Memory_Size[1] = (Mass_Block_Count[1] * Mass_Block_Size[1]);
+ return MAL_OK;
+ }
+ }
+#endif /* USE_STM3210E_EVAL */
+ STM_EVAL_LEDOn(LED4);
+ return MAL_FAIL;
+}
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+