Exemple #1
0
/*******************************************************************************
* 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;
}
Exemple #2
0
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*/