diff options
Diffstat (limited to 'thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Composite_Example/src/memory.c')
-rw-r--r-- | thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Composite_Example/src/memory.c | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Composite_Example/src/memory.c b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Composite_Example/src/memory.c new file mode 100644 index 0000000..e574c55 --- /dev/null +++ b/thirdparty/STM32_USB-FS-Device_Lib_V4.0.0/Projects/Composite_Example/src/memory.c @@ -0,0 +1,175 @@ +/** + ****************************************************************************** + * @file memory.c + * @author MCD Application Team + * @version V4.0.0 + * @date 21-January-2013 + * @brief Memory management layer + ****************************************************************************** + * @attention + * + * <h2><center>© 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 "memory.h" +#include "usb_scsi.h" +#include "usb_bot.h" +#include "usb_regs.h" +#include "usb_mem.h" +#include "usb_conf.h" +#include "hw_config.h" +#include "mass_mal.h" +#include "usb_lib.h" + +#define BULK_MAX_PACKET_SIZE 64 +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +__IO uint32_t Block_Read_count = 0; +__IO uint32_t Block_offset; +__IO uint32_t Counter = 0; +uint32_t Idx; +uint32_t Data_Buffer[64 *2]; /* 512 bytes*/ +uint8_t TransferState = TXFR_IDLE; +/* Extern variables ----------------------------------------------------------*/ +extern uint8_t Bulk_Data_Buff[64]; /* data buffer*/ +extern uint16_t Data_Len; +extern uint8_t Bot_State; +extern Bulk_Only_CBW CBW; +extern Bulk_Only_CSW CSW; +extern uint32_t Mass_Memory_Size[2]; +extern uint32_t Mass_Block_Size[2]; + +/* Private function prototypes -----------------------------------------------*/ +/* Extern function prototypes ------------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/******************************************************************************* +* Function Name : Read_Memory +* Description : Handle the Read operation from the microSD card. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Read_Memory(uint8_t lun, uint32_t Memory_Offset, uint32_t Transfer_Length) +{ + static uint32_t Offset, Length; + + if (TransferState == TXFR_IDLE ) + { + Offset = Memory_Offset * Mass_Block_Size[lun]; + Length = Transfer_Length * Mass_Block_Size[lun]; + TransferState = TXFR_ONGOING; + } + + if (TransferState == TXFR_ONGOING ) + { + if (!Block_Read_count) + { + MAL_Read(lun , + Offset , + Data_Buffer, + Mass_Block_Size[lun]); + + USB_SIL_Write(EP2_IN, (uint8_t *)Data_Buffer, BULK_MAX_PACKET_SIZE); + + Block_Read_count = Mass_Block_Size[lun] - BULK_MAX_PACKET_SIZE; + Block_offset = BULK_MAX_PACKET_SIZE; + } + else + { + USB_SIL_Write(EP2_IN, (uint8_t *)Data_Buffer + Block_offset, BULK_MAX_PACKET_SIZE); + + Block_Read_count -= BULK_MAX_PACKET_SIZE; + Block_offset += BULK_MAX_PACKET_SIZE; + } + + SetEPTxCount(ENDP2, BULK_MAX_PACKET_SIZE); + SetEPTxStatus(ENDP2, EP_TX_VALID); + Offset += BULK_MAX_PACKET_SIZE; + Length -= BULK_MAX_PACKET_SIZE; + + CSW.dDataResidue -= BULK_MAX_PACKET_SIZE; + } + if (Length == 0) + { + Block_Read_count = 0; + Block_offset = 0; + Offset = 0; + Bot_State = BOT_DATA_IN_LAST; + TransferState = TXFR_IDLE; + } +} + +/******************************************************************************* +* Function Name : Write_Memory +* Description : Handle the Write operation to the microSD card. +* Input : None. +* Output : None. +* Return : None. +*******************************************************************************/ +void Write_Memory (uint8_t lun, uint32_t Memory_Offset, uint32_t Transfer_Length) +{ + + static uint32_t W_Offset, W_Length; + + uint32_t temp = Counter + 64; + + if (TransferState == TXFR_IDLE ) + { + W_Offset = Memory_Offset * Mass_Block_Size[lun]; + W_Length = Transfer_Length * Mass_Block_Size[lun]; + TransferState = TXFR_ONGOING; + } + + if (TransferState == TXFR_ONGOING ) + { + + for (Idx = 0 ; Counter < temp; Counter++) + { + *((uint8_t *)Data_Buffer + Counter) = Bulk_Data_Buff[Idx++]; + } + + W_Offset += Data_Len; + W_Length -= Data_Len; + + if (!(W_Length % Mass_Block_Size[lun])) + { + Counter = 0; + MAL_Write(lun , + W_Offset - Mass_Block_Size[lun], + Data_Buffer, + Mass_Block_Size[lun]); + } + + CSW.dDataResidue -= Data_Len; + SetEPRxStatus(ENDP2, EP_RX_VALID); /* enable the next transaction*/ + } + + if ((W_Length == 0) || (Bot_State == BOT_CSW_Send)) + { + Counter = 0; + Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE); + TransferState = TXFR_IDLE; + } +} +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + |