/******************************************************************************* * 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) { if (TransferState == TXFR_IDLE ) { Block_offset = Memory_Offset * Mass_Block_Size[lun]; Counter = Transfer_Length * Mass_Block_Size[lun]; while (Transfer_Length--) MAL_Clear(lun, Block_offset + Mass_Block_Size[lun] * Transfer_Length); TransferState = TXFR_ONGOING; } if (TransferState == TXFR_ONGOING ) { MAL_Write(lun, Block_offset, (uint32_t *)Bulk_Data_Buff, BULK_MAX_PACKET_SIZE); Block_offset += BULK_MAX_PACKET_SIZE; Counter -= BULK_MAX_PACKET_SIZE; CSW.dDataResidue -= Data_Len; SetEPRxStatus(ENDP2, EP_RX_VALID); /* enable the next transaction*/ } if (Counter == 0 || (Bot_State == BOT_CSW_Send)) { Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE); TransferState = TXFR_IDLE; } }
/******************************************************************************* * Function Name : DFU_Status_Out. * Description : DFU status OUT routine. * Input : None. * Output : None. * Return : None. *******************************************************************************/ void DFU_Status_Out (void) { DEVICE_INFO *pInfo = &Device_Info; uint32_t Addr; if (pInfo->USBbRequest == DFU_GETSTATUS) { if (DeviceState == STATE_dfuDNBUSY) { if (wBlockNum == 0) /* Decode the Special Command*/ { if ((MAL_Buffer[0] == CMD_GETCOMMANDS) && (wlength == 1)) {} else if (( MAL_Buffer[0] == CMD_SETADDRESSPOINTER ) && (wlength == 5)) { Pointer = MAL_Buffer[1]; Pointer += MAL_Buffer[2] << 8; Pointer += MAL_Buffer[3] << 16; Pointer += MAL_Buffer[4] << 24; } else if (( MAL_Buffer[0] == CMD_ERASE ) && (wlength == 5)) { Pointer = MAL_Buffer[1]; Pointer += MAL_Buffer[2] << 8; Pointer += MAL_Buffer[3] << 16; Pointer += MAL_Buffer[4] << 24; MAL_Erase(Pointer); } } else if (wBlockNum > 1) // Download Command { Addr = ((wBlockNum - 2) * wTransferSize) + Pointer; MAL_Write(Addr, wlength); } wlength = 0; wBlockNum = 0; DeviceState = STATE_dfuDNLOAD_SYNC; DeviceStatus[4] = DeviceState; DeviceStatus[1] = 0; DeviceStatus[2] = 0; DeviceStatus[3] = 0; return; } else if (DeviceState == STATE_dfuMANIFEST)/* Manifestation in progress*/ { DFU_write_crc(); return; } } return; }
/******************************************************************************* * Function Name : Write_Memory * Description : Handle the Write operation to the microSD card. * Input : None. * Output : None. * Return : None. *******************************************************************************/ NODEBUG 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; #ifndef STM32F10X_CL SetEPRxStatus( ENDP2, EP_RX_VALID ); /* enable the next transaction*/ #endif /* STM32F10X_CL */ // Led_RW_ON(); } if (( W_Length == 0 ) || ( Bot_State == BOT_CSW_Send ) ) { Counter = 0; Set_CSW( CSW_CMD_PASSED, SEND_CSW_ENABLE ); TransferState = TXFR_IDLE; // Led_RW_OFF(); } }
/******************************************************************************* * Function Name : Write_Memory * Description : Handle the Write operation to the microSD card. * Input : None. * Output : None. * Return : None. *******************************************************************************/ void Write_Memory (u8 lun, u32 Memory_Offset, u32 Transfer_Length) { static u32 W_Offset, W_Length; u32 temp = Counter + BULK_MAX_PACKET_SIZE; 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++) { *((u8 *)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*/ //Led_RW_ON(); } if ((W_Length == 0) || (Bot_State == BOT_CSW_Send)) { Counter = 0; Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE); TransferState = TXFR_IDLE; //Led_RW_OFF(); } }
/******************************************************************************* * 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 uint64_t W_Offset, W_Length;//要支持大于4G的SD卡,必须使用long long(64位)数据类型 u8 STA;//新增一个定义 uint32_t temp = Counter + 64; if (TransferState == TXFR_IDLE ) { W_Offset = (long long)Memory_Offset * Mass_Block_Size[lun]; W_Length = (long long)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; STA=MAL_Write(lun,W_Offset - Mass_Block_Size[lun],Data_Buffer,Mass_Block_Size[lun]); if(STA)USB_STATUS_REG|=0X04;//SD卡写错误! } CSW.dDataResidue -= Data_Len; SetEPRxStatus(ENDP2, EP_RX_VALID); /* enable the next transaction*/ Led_RW_ON(); } if ((W_Length == 0) || (Bot_State == BOT_CSW_Send)) { Counter = 0; Set_CSW (CSW_CMD_PASSED, SEND_CSW_ENABLE); TransferState = TXFR_IDLE; Led_RW_OFF(); } }
/******************************************************************************* * 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 = Block_Write_count + BULK_MAX_PACKET_SIZE; uint32_t idx; 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 ; Block_Write_count < temp; Block_Write_count++) { *((uint8_t *)Data_Buffer + Block_Write_count) = Bulk_Data_Buff[idx++]; } W_Offset += Bulk_Data_Len; W_Length -= Bulk_Data_Len; // 缓冲区满时写入数据到存储设备 if (0 == (W_Length % Mass_Block_Size[lun])) { Block_Write_count = 0; MAL_Write(lun, W_Offset - Mass_Block_Size[lun], Data_Buffer, Mass_Block_Size[lun]); } CSW.dDataResidue -= Bulk_Data_Len; SetEPRxStatus(ENDP2, EP_RX_VALID); /* enable the next transaction*/ USB_Led_RW_ON(); } if ((W_Length == 0) || (Bot_State == BOT_CSW_Send)) { Block_Write_count = 0; Set_CSW(CSW_CMD_PASSED, SEND_CSW_ENABLE); TransferState = TXFR_IDLE; USB_Led_RW_OFF(); } }
/** * @brief EP0_TxSent * Handles the DFU control endpoint data IN stage. * @param pdev: device instance * @retval status */ static uint8_t EP0_TxSent (void *pdev) { uint32_t Addr; USB_SETUP_REQ req; if (DeviceState == STATE_dfuDNBUSY) { /* Decode the Special Command*/ if (wBlockNum == 0) { if ((MAL_Buffer[0] == CMD_GETCOMMANDS) && (wlength == 1)) {} else if (( MAL_Buffer[0] == CMD_SETADDRESSPOINTER ) && (wlength == 5)) { Pointer = MAL_Buffer[1]; Pointer += MAL_Buffer[2] << 8; Pointer += MAL_Buffer[3] << 16; Pointer += MAL_Buffer[4] << 24; } else if (( MAL_Buffer[0] == CMD_ERASE ) && (wlength == 5)) { Pointer = MAL_Buffer[1]; Pointer += MAL_Buffer[2] << 8; Pointer += MAL_Buffer[3] << 16; Pointer += MAL_Buffer[4] << 24; MAL_Erase(Pointer); } else { /* Reset the global length and block number */ wlength = 0; wBlockNum = 0; /* Call the error management function (command will be nacked) */ req.bmRequest = 0; req.wLength = 1; USBD_CtlError (pdev, &req); } } /* Regular Download Command */ else if (wBlockNum > 1) { /* Decode the required address */ Addr = ((wBlockNum - 2) * XFERSIZE) + Pointer; /* Preform the write operation */ MAL_Write(Addr, wlength); } /* Reset the global lenght and block number */ wlength = 0; wBlockNum = 0; /* Update the state machine */ DeviceState = STATE_dfuDNLOAD_SYNC; DeviceStatus[4] = DeviceState; DeviceStatus[1] = 0; DeviceStatus[2] = 0; DeviceStatus[3] = 0; return USBD_OK; } else if (DeviceState == STATE_dfuMANIFEST)/* Manifestation in progress*/ { /* Start leaving DFU mode */ DFU_LeaveDFUMode(pdev); } return USBD_OK; }