/******************************************************************************* * 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; }
void DFU_Status_Out (void) { DEVICE_INFO *pInfo = &Device_Info; u32 i,Addr,DATA; if(pInfo->USBbRequest == DFU_GETSTATUS) { if(DeviceState ==STATE_dfuDNBUSY) { if (wBlockNum == 0 ) /* Decode the Special Command*/ { if ( (Load_Buffer[0] == CMD_GETCOMMANDS) &&(wlength == 1) ) { } else if (( Load_Buffer[0] == CMD_SETADDRESSPOINTER )&&(wlength == 5)) { Pointer = Load_Buffer[1]; Pointer += Load_Buffer[2] << 8; Pointer += Load_Buffer[3] << 16; Pointer += Load_Buffer[4] << 24; } else if (( Load_Buffer[0] == CMD_ERASE )&&(wlength == 5)) { Pointer = Load_Buffer[1]; Pointer += Load_Buffer[2] << 8; Pointer += Load_Buffer[3] << 16; Pointer += Load_Buffer[4] << 24; if ( Pointer < 0x60000000 ) /* Internal Flash */ { Internal_FLASH_WritePrConfig(Internal_FLASH_SectorMask(Pointer),DISABLE); Internal_FLASH_SectorErase(Internal_FLASH_SectorMask(Pointer)); } else External_FLASH_SectorErase (Pointer); } } else if ( wBlockNum > 1) // Download Command { Addr=((wBlockNum-2) * wTransferSize)+ Pointer; if ( wlength & 0x3) /* Not an aligned data */ { for (i=wlength; i<((wlength & 0xFFFC) + 4) ; i++) Load_Buffer[i] = 0xFF; } /* Data received are Word multiple */ for (i=0; i<wlength; i=i+4) { DATA = *((u32*)&Load_Buffer[i]); if ( Addr < 0x60000000 ) /* Internal flash programming */ Internal_FLASH_WordWrite(Addr,DATA); else External_FLASH_WordWrite(Addr,DATA); Addr+=4; } } 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; }/* End of DFU_Status_Out*/