Exemple #1
0
void sampleMemory_loadSamples()
{
	uint8_t numSamples = sd_getNumSamples();


	if(numSamples==0) return;

	//erase user memory flash
	FLASH_If_Erase(SAMPLE_ROM_START_ADDRESS);

	sampleMemory_setNumSamples(numSamples);

	//reserve space for sample info header
	SampleInfo info[50];
	uint32_t addr = 0;

	uint8_t i;
	for(i=0;i<numSamples;i++)
	{
		sd_setActiveSample(i);
		uint32_t len 	= sd_getActiveSampleLength();
		char* name = sd_getActiveSampleName();
		memcpy(info[i].name, name,3);
		info[i].offset 	= SAMPLE_ROM_START_ADDRESS + 4 + addr*4; //+1 because of num_samples
		info[i].size 	= len/2;

		uint32_t j;
		for(j=0;j<len;)
		{
			int16_t data[BLOCKSIZE];
//			uint16_t bytesRead;
//			bytesRead = sd_readSampleData(data, BLOCKSIZE);
			sd_readSampleData(data, BLOCKSIZE);
			volatile uint32_t add = 4+SAMPLE_ROM_START_ADDRESS + 4*addr; //*4 because we write uint32

			FLASH_If_Write(&add, (uint32_t*)data, BLOCKSIZE/2);

			j += BLOCKSIZE*2;
			addr += BLOCKSIZE/2;

		}
	}
	//write info header
	volatile uint32_t add = SAMPLE_INFO_START_ADDRESS ;
	FLASH_If_Write(&add, (uint32_t*)(info), numSamples*sizeof(SampleInfo)/4 + 1);

	spi_deInit();

}
Exemple #2
0
//---------------------------------------------------------------
void sampleMemory_setNumSamples(uint8_t num)
{
//	sampleMemory_data[0] = num;
	uint32_t data = num;
	volatile uint32_t add = SAMPLE_ROM_START_ADDRESS; //*4 because we write uint32
	FLASH_If_Write(&add, (uint32_t*)&data, 1);
}
Exemple #3
0
/****************************************************************************************
** 函数名称: FlashParaUpdate
** 功能描述: 更新Flash 中保存的参数
** 参           数: 无
** 返   回  值: none
** 作      者: Sevent
** 日      期: 2013年08月27日
**---------------------------------------------------------------------------------------
** 修 改 人: 
** 日   期: 
**--------------------------------------------------------------------------------------
****************************************************************************************/
void FlashParaUpdate(EAbox_st *configData)
{
	uint32_t paraStartAddress, paraEndAddress;
	
	paraStartAddress = PARA_START_ADDRESS;
	paraEndAddress = PARA_END_ADDRESS;
	
	FLASH_If_Init();
	FLASH_If_Erase(paraStartAddress, paraEndAddress);		// 擦除16K 数据保存区;	
	FLASH_If_Write(&paraStartAddress, (u32 *)configData, sizeof(eabox_config_t));
	FLASH_Lock();
}
Exemple #4
0
void updateConfiguration(mxchipWNet_HA_st *configData)
{
  uint32_t paraStartAddress, paraEndAddress;
  
  paraStartAddress = PARA_START_ADDRESS;
  paraEndAddress = PARA_END_ADDRESS;
  
  FLASH_If_Init();
  FLASH_If_Erase(paraStartAddress, paraEndAddress);   
  FLASH_If_Write(&paraStartAddress, (u32 *)&configData->conf, sizeof(mxchipWNet_HA_config_st));
  FLASH_Lock();
}
Exemple #5
0
void updateConfig(config_t *pConfig)
{
	uint32_t paraStartAddress, paraEndAddress;
	
	paraStartAddress = PARA_START_ADDRESS;
	paraEndAddress = PARA_END_ADDRESS;
	
	FLASH_If_Init();
	FLASH_If_Erase(paraStartAddress, paraEndAddress);		// 擦除16K 数据保存区;	
	FLASH_If_Write(&paraStartAddress, (u32 *)pConfig, sizeof(config_t));
	FLASH_Lock();
}
Exemple #6
0
void restoreConfiguration(void)
{	
	EAbox_st	EAboxInit;
	uint32_t paraStartAddress, paraEndAddress;
	
	paraStartAddress = PARA_START_ADDRESS;
	paraEndAddress = PARA_END_ADDRESS;
	memset(&EAboxInit, 0x0, sizeof(EAbox_st));
	EAboxInit.conf.magicNumber = MAGIC_FLAG;
	
	FLASH_If_Init();
	FLASH_If_Erase(paraStartAddress, paraEndAddress);		// 擦除16K 数据保存区;	
	FLASH_If_Write(&paraStartAddress, (void *)&EAboxInit, sizeof(eabox_config_t));
	FLASH_Lock();
}
Exemple #7
0
uint8 program_move(uint16 crc)
{ uint16 app_crc;
	uint16 cmp = 2;
	int t = 0;
	uint32_t addr_src = APP_ERCODE_ADDRESS;
	uint32_t addr_dst = APPLICATION_ADDRESS;
	
  FLASH_If_Init();
	FLASH_If_Erase(APP_ERCODE_ADDRESS);
	FLASH_If_Write((__IO uint32_t* )&addr_dst, (uint32_t*)addr_src ,(0x400/4*29));
	FLASH_Lock();
	app_crc = cal_crc16((uint8*)APPLICATION_ADDRESS, 0x400*29);
	if(crc == app_crc) return 0;
	return 1;
}
Exemple #8
0
/**
  * @brief  Programs the internal Flash memory. 
  * @param  None
  * @retval None
  */
static void COMMAND_ProgramFlashMemory(void)
{
  uint32_t programcounter = 0x00;
  uint8_t readflag = TRUE;
  uint16_t bytesread;
  
  /* RAM Address Initialization */
  RamAddress = (uint32_t) &RAM_Buf;
  
  /* Erase address init */
  LastPGAddress = APPLICATION_ADDRESS;
  
  /* While file still contain data */
  while ((readflag == TRUE))
  {
    /* Read maximum 512 Kbyte from the selected file */
    f_read (&MyFileR, RAM_Buf, BUFFER_SIZE, (void *)&bytesread);
    
    /* Temp variable */
    TmpReadSize = bytesread;
    
    /* The read data < "BUFFER_SIZE" Kbyte */
    if(TmpReadSize < BUFFER_SIZE)
    {
      readflag = FALSE;
    }
    
    /* Program flash memory */
    for(programcounter = TmpReadSize; programcounter != 0; programcounter -= 4)
    {
      TmpProgramCounter = programcounter;
      /* Write word into flash memory */
      if( FLASH_If_Write((LastPGAddress- TmpProgramCounter + TmpReadSize), \
        *(uint32_t *)(RamAddress - programcounter + TmpReadSize )) != 0x00)
      {
        /* Flash programming error: Turn LED3 On and Toggle LED3 in infinite loop */
        BSP_LED_On(LED3);
        Fail_Handler();
      }
    }
    /* Update last programmed address value */
    LastPGAddress = LastPGAddress + TmpReadSize;
  }  
} 
Exemple #9
0
void restoreConfig(void)
{	
	config_t	config;
	net_para_st netPara;
	uint32_t paraStartAddress, paraEndAddress;
	paraStartAddress = PARA_START_ADDRESS;
	paraEndAddress = PARA_END_ADDRESS;
	
	getNetPara(&netPara,Station);
	memset(&config, 0x0, sizeof(config_t));
	config.magicNumber = MAGIC_FLAG;
	sprintf((char*)config.wifi_ssid , "MXCHIP_%s", netPara.mac+6);	
	sprintf((char*)config.wifi_key , "");	
	
	FLASH_If_Init();
	FLASH_If_Erase(paraStartAddress, paraEndAddress);		// 擦除16K 数据保存区;	
	FLASH_If_Write(&paraStartAddress, (void *)&config, sizeof(config_t));
	FLASH_Lock();
}
Exemple #10
0
void FlashConfig(void)
{
	if(FLASH_If_Erase(CONFIG_BASE_ADDRESS,NUMBER_OF_CONFIG_PAGES) == FLASHIF_ERASEKO)
	{
		UserPrintf("Error:flash config error\n");
	}
	else
	{
		uint16_t config_size = sizeof(SystemConfig)/sizeof(uint32_t) + 1; // 防止不能被4整除
		if(FLASH_If_Write(CONFIG_BASE_ADDRESS,(uint32_t *)&SystemConfig, config_size) == 0)
		{
			UserPrintf("Info:Flash success\n");
		}
		else
		{
			UserPrintf("Error:Flash error!Please retry\n");
		}
	}
}
Exemple #11
0
void restoreConfiguration(void)
{ 
  mxchipWNet_HA_st  mxchipWNet_HA_Init;
  uint32_t paraStartAddress, paraEndAddress;
  
  paraStartAddress = PARA_START_ADDRESS;
  paraEndAddress = PARA_END_ADDRESS;
  memset(&mxchipWNet_HA_Init, 0x0, sizeof(mxchipWNet_HA_st));
  mxchipWNet_HA_Init.conf.magicNumber = MAGIC_FLAG;
  mxchipWNet_HA_Init.conf.versionNumber = CONFIGURATION_VERSION;
  mxchipWNet_HA_Init.conf.dhcp_enable = 1;
  strcpy((char*)mxchipWNet_HA_Init.conf.sta_ssid, DEFAULT_STA_SSID);
  strcpy((char*)mxchipWNet_HA_Init.conf.sta_key, DEFAULT_STA_KEY);
  strcpy((char*)mxchipWNet_HA_Init.conf.uap_ssid, DEFAULT_UAP_SSID);
  strcpy((char*)mxchipWNet_HA_Init.conf.uap_key, DEFAULT_UAP_KEY);
  strcpy((char*)mxchipWNet_HA_Init.conf.server_domain, DEFAULT_REMOTE_ADDR);
  mxchipWNet_HA_Init.conf.server_port = DEFAULT_REMOTE_PORT;

  FLASH_If_Init();
  FLASH_If_Erase(paraStartAddress, paraEndAddress);  
  FLASH_If_Write(&paraStartAddress, (void *)&mxchipWNet_HA_Init, sizeof(mxchipWNet_HA_config_st));
  FLASH_Lock();
}
Exemple #12
0
void updateProgram(void)
{
   int clear = 0;
   int cmdByte, i, temp;
   FLASH_EraseResult result;
   uint32_t addr, maxAddr = 0;
   uint16_t endSector = 0xFFFF;
   _ee_getReserved(_AI_EE_RES_ADDR_MAX_SECTOR, &endSector);
   if (endSector > APPLICATION_END_SECTOR || !IS_FLASH_SECTOR(endSector))
      endSector = APPLICATION_END_SECTOR;

   lcd_clear();
   lcd_printf("Aithon Board\nProgramming...");

   // Unlock the Flash Program Erase controller
   FLASH_If_Init();

   while (TRUE)
   {
      led_toggle(0);
      cmdByte = getByte();
      debugPrintCmd(cmdByte);
      switch (cmdByte)
      {
      case SYNC:
         // sync
         flushInterface();
         sendResponse(SYNC, ACK);
         break;
      case ERASE_FLASH_START:
         if (FLASH_If_Erase_Start() == FLASH_ERASE_IN_PROGRESS)
            sendResponse(ERASE_FLASH_START, ACK);
         else
            sendResponse(ERASE_FLASH_START, NACK);
         break;
      case ERASE_FLASH_STATUS:
         result = FLASH_If_Erase_Status(endSector);
         if (result == FLASH_ERASE_COMPLETE)
            sendResponse(ERASE_FLASH_STATUS, ACK);
         else if (result == FLASH_ERASE_IN_PROGRESS)
            sendResponse(ERASE_FLASH_STATUS, BUSY);
         else
            sendResponse(ERASE_FLASH_STATUS, NACK);
         break;
      case SET_ADDR:
         // Read in the address, MSB first.
         addr = 0;
         for (i = 0; i < 4; i++)
         {
            if ((temp = getByte()) == Q_TIMEOUT)
               break;
            addr |= (((uint8_t) temp) & 0xFF) << (i * 8);
         }

         // Check for errors.
         if (temp == Q_TIMEOUT)
            sendResponse(SET_ADDR, NACK);
         else
         {
            sendResponse(SET_ADDR, ACK);
            // We'll get relative addresses, so add the start address.
            addr += APPLICATION_START_ADDRESS;
         }
         break;
      case CHECK_ADDR:
         // Get the checksum
         temp = getByte();
         if (temp == Q_TIMEOUT)
            sendResponse(CHECK_ADDR, NACK);
         else
         {
            // Subtract the start address before calculating the checksum
            addr -= APPLICATION_START_ADDRESS;
            if (temp == calcChecksum((uint8_t *)&addr, 4))
               sendResponse(CHECK_ADDR, ACK);
            else
               sendResponse(CHECK_ADDR, NACK);
            addr += APPLICATION_START_ADDRESS;
         }
         break;
      case FILL_BUFFER:
         for (i = 0; i < PACKET_LEN; i++)
         {
            if ((temp = getByte()) == Q_TIMEOUT)
               break;
            _buffer[i] = (uint8_t) (temp & 0xFF);
         }
         if (temp == Q_TIMEOUT)
            sendResponse(FILL_BUFFER, NACK);
         else
            sendResponse(FILL_BUFFER, ACK);
         break;
      case CHECK_BUFFER:
         // Get the checksum
         temp = getByte();
         if (temp != Q_TIMEOUT && temp == calcChecksum(_buffer, PACKET_LEN))
            sendResponse(CHECK_BUFFER, ACK);
         else
            sendResponse(CHECK_BUFFER, NACK);
         break;
      case COMMIT_BUFFER:
         maxAddr = addr + PACKET_LEN - 1;
         if (FLASH_If_Write((__IO uint32_t *)&addr, (uint32_t *)_buffer, PACKET_LEN/4))
            sendResponse(COMMIT_BUFFER, NACK);
         else
            sendResponse(COMMIT_BUFFER, ACK);
         break;
      case START_PROGRAM:
         sendResponse(START_PROGRAM, ACK);
         flushInterface();
         _ee_putReserved(_AI_EE_RES_ADDR_MAX_SECTOR, FLASH_Addr_To_Sector(maxAddr));
         delayS(1);
         startProgram();
         // ...should never get here
         return;
      case Q_TIMEOUT:
      default:
         if (clear == 0) {
           lcd_clear();
           clear = 1;
         }
         lcd_printf ("0%x ", cmdByte); 
         break;
      }
   }
}
/**
  * @brief  Receive a file using the ymodem protocol with CRC16.
  * @param  p_size The size of the file.
  * @retval COM_StatusTypeDef result of reception/programming
  */
COM_StatusTypeDef Ymodem_Receive ( uint32_t *p_size )
{
  uint32_t i, packet_length, session_done = 0, file_done, errors = 0, session_begin = 0;
  uint32_t flashdestination, ramsource, filesize;
  uint8_t *file_ptr;
  uint8_t file_size[FILE_SIZE_LENGTH], tmp, packets_received;
  COM_StatusTypeDef result = COM_OK;

  /* Initialize flashdestination variable */
  flashdestination = APPLICATION_ADDRESS;

  while ((session_done == 0) && (result == COM_OK))
  {
    packets_received = 0;
    file_done = 0;
    while ((file_done == 0) && (result == COM_OK))
    {
      switch (ReceivePacket(aPacketData, &packet_length, DOWNLOAD_TIMEOUT))
      {
        case HAL_OK:
          errors = 0;
          switch (packet_length)
          {
            case 2:
              /* Abort by sender */
              Serial_PutByte(ACK);
              result = COM_ABORT;
              break;
            case 0:
              /* End of transmission */
              Serial_PutByte(ACK);
              file_done = 1;
              break;
            default:
              /* Normal packet */
              if (aPacketData[PACKET_NUMBER_INDEX] != packets_received)
              {
                Serial_PutByte(NAK);
              }
              else
              {
                if (packets_received == 0)
                {
                  /* File name packet */
                  if (aPacketData[PACKET_DATA_INDEX] != 0)
                  {
                    /* File name extraction */
                    i = 0;
                    file_ptr = aPacketData + PACKET_DATA_INDEX;
                    while ( (*file_ptr != 0) && (i < FILE_NAME_LENGTH))
                    {
                      aFileName[i++] = *file_ptr++;
                    }

                    /* File size extraction */
                    aFileName[i++] = '\0';
                    i = 0;
                    file_ptr ++;
                    while ( (*file_ptr != ' ') && (i < FILE_SIZE_LENGTH))
                    {
                      file_size[i++] = *file_ptr++;
                    }
                    file_size[i++] = '\0';
                    Str2Int(file_size, &filesize);

                    /* Test the size of the image to be sent */
                    /* Image size is greater than Flash size */
                    if (*p_size > (USER_FLASH_SIZE + 1))
                    {
                      /* End session */
                      tmp = CA;
                      HAL_UART_Transmit(&UartHandle, &tmp, 1, NAK_TIMEOUT);
                      HAL_UART_Transmit(&UartHandle, &tmp, 1, NAK_TIMEOUT);
                      result = COM_LIMIT;
                    }
                    /* erase user application area */
                    FLASH_If_Erase(APPLICATION_ADDRESS);
                    *p_size = filesize;

                    Serial_PutByte(ACK);
                    Serial_PutByte(CRC16);
                  }
                  /* File header packet is empty, end session */
                  else
                  {
                    Serial_PutByte(ACK);
                    file_done = 1;
                    session_done = 1;
                    break;
                  }
                }
                else /* Data packet */
                {
                  ramsource = (uint32_t) & aPacketData[PACKET_DATA_INDEX];

                  /* Write received data in Flash */
                  if (FLASH_If_Write(flashdestination, (uint32_t*) ramsource, packet_length/4) == FLASHIF_OK)                   
                  {
                    flashdestination += packet_length;
                    Serial_PutByte(ACK);
                  }
                  else /* An error occurred while writing to Flash memory */
                  {
                    /* End session */
                    Serial_PutByte(CA);
                    Serial_PutByte(CA);
                    result = COM_DATA;
                  }
                }
                packets_received ++;
                session_begin = 1;
              }
              break;
          }
          break;
        case HAL_BUSY: /* Abort actually */
          Serial_PutByte(CA);
          Serial_PutByte(CA);
          result = COM_ABORT;
          break;
        default:
          if (session_begin > 0)
          {
            errors ++;
          }
          if (errors > MAX_ERRORS)
          {
            /* Abort communication */
            Serial_PutByte(CA);
            Serial_PutByte(CA);
          }
          else
          {
            Serial_PutByte(CRC16); /* Ask for a packet */
          }
          break;
      }
    }
  }
  return result;
}
Exemple #14
0
static void get_update_post(int index, char *postdata, int len)
{
	static const char endline[] = {'\r', '\n', '\r', '\n'};
	static const char lengthstr[] = "Content-Length: ";
	static const char boundarystr[] = "boundary=";
	char *boundcp, *boundary, *p;
	char *read_buffer = postdata, *end_pos = NULL, *lengthpos;
	int read_buffer_size = len, time=5000;
	int bytes_received, read_len, content_len = 0, total_read;
	const char *resp;
	u32 addr = UPDATE_START_ADDRESS;
	
	/* Firmware update: OTA from webserver*/
    setsockopt(index,0, SO_RCVTIMEO, &time, 4);

    /* Get the content length & boundary & begin of content data */
    do {
        end_pos = (char*) memmem(read_buffer, read_buffer_size, endline, sizeof(endline));

        if ( ( lengthpos = (char*) memmem( read_buffer,  read_buffer_size, lengthstr, strlen( lengthstr )) ) != NULL )
        {
            content_len = atoi(lengthpos + sizeof( lengthstr)-1);
        }
        if (( boundary = (char*) memmem( read_buffer,  read_buffer_size, boundarystr, strlen(boundarystr) )) != NULL )
        {
            boundary += strlen(boundarystr);
            p = boundary;
            while(*p != 0x0d)
                p++;
            *p++ = 0; 
            // now, we have found out the boundary, copy out.
            boundcp = (char*)malloc(strlen(boundary)+1);
            if (boundcp != NULL) {
                strcpy(boundcp, boundary);
            }
        }
        
        if (end_pos == NULL)
        {
            read_buffer = httpRequest;
            bytes_received = recv(index, httpRequest, HTTP_DATA_MAX_LEN, 0 );
            if ( bytes_received <= 0 )
            {
                break;
            }
            else
            {
                total_read += bytes_received;
                read_buffer_size = bytes_received;
            }
        }

    } while ( end_pos == NULL );
    if (boundcp == NULL || content_len == 0) {
        resp = systemResponseError;
        goto EXIT;
    }

    end_pos += sizeof(endline);
    read_buffer_size = read_buffer_size - (end_pos-read_buffer);
    content_len -= read_buffer_size;
    read_buffer = end_pos;
    /* Get the begin of file data and write to flash */
    do {
        end_pos = (char*)memmem(read_buffer, read_buffer_size, endline, sizeof(endline));
        
        if (end_pos == NULL)
        {
            read_buffer = httpRequest;
            bytes_received = recv(index, httpRequest, HTTP_DATA_MAX_LEN, 0 );
            if ( bytes_received <= 0 )
            {
                break;
            }
            else
            {
                content_len -= bytes_received;
                read_buffer_size = bytes_received;
                if (content_len <= 0)
                    break;
            }
        }

    } while ( end_pos == NULL );
    if (end_pos == NULL) {
        resp = systemResponseError;
        goto EXIT;
    }
    
    SetTimer(6000, delay_reload); // whether success or not, need reload system to use bootload erase NEW Image flash.
    FLASH_If_Init();
    end_pos += sizeof(endline);
    read_buffer_size = read_buffer_size - (end_pos-read_buffer);
    if (read_buffer_size > 0) {
			  FLASH_If_Write(&addr, (void *)end_pos, read_buffer_size);
    }

    content_len -= strlen(boundcp) - 4; // last string is '--'+boudnary+'--'
    /* Recv file and write to flash, if it's last package, find the end of file to write */
    while(content_len > 0) {
        if (content_len > HTTP_DATA_MAX_LEN)
            read_len = HTTP_DATA_MAX_LEN;
        else
            read_len = content_len;
        
        bytes_received = recv(index, httpRequest, read_len, 0 );
        if ( bytes_received <= 0 )
        {
            break;
        }
        
				FLASH_If_Write(&addr, (void *)httpRequest, bytes_received);    
        content_len -= bytes_received;
    }
    
    if (content_len == 0) {        
      memset(&configParas, 0, sizeof(boot_table_t));
    	configParas.bootTable.length = addr - UPDATE_START_ADDRESS;
    	configParas.bootTable.start_address = UPDATE_START_ADDRESS;
    	configParas.bootTable.type = 'A';
    	configParas.bootTable.upgrade_type = 'U';
			updateConfig(&configParas);
      resp = systemResponseSucc;
    } else
      resp = systemResponseError;
EXIT:
    FLASH_Lock();
    sprintf(httpRequest, HTTPSaveResponse, 
			strlen(resp), resp);
    send_http_data(index, httpRequest, strlen(httpRequest));
}
/**
  * @brief  Receive a file using the ymodem protocol.
  * @param  buf: Address of the first byte.
  * @retval The size of the file.
  */
int32_t Ymodem_Receive (uint8_t *buf)
{
    uint8_t packet_data[PACKET_1K_SIZE + PACKET_OVERHEAD], file_size[FILE_SIZE_LENGTH], *file_ptr, *buf_ptr;
    int32_t i, packet_length, session_done, file_done, packets_received, errors, session_begin, size = 0;
    uint32_t flashdestination, ramsource;

    /* Initialize flashdestination variable */
    flashdestination = APPLICATION_ADDRESS;

    for (session_done = 0, errors = 0, session_begin = 0; ;)
    {
        for (packets_received = 0, file_done = 0, buf_ptr = buf; ;)
        {
            switch (Receive_Packet(packet_data, &packet_length, NAK_TIMEOUT))
            {
            case 0:
                errors = 0;
                switch (packet_length)
                {
                /* Abort by sender */
                case - 1:
                    Send_Byte(ACK);
                    return 0;
                /* End of transmission */
                case 0:
                    Send_Byte(ACK);
                    file_done = 1;
                    break;
                /* Normal packet */
                default:
                    if ((packet_data[PACKET_SEQNO_INDEX] & 0xff) != (packets_received & 0xff))
                    {
                        Send_Byte(NAK);
                    }
                    else
                    {
                        if (packets_received == 0)
                        {
                            /* Filename packet */
                            if (packet_data[PACKET_HEADER] != 0)
                            {
                                /* Filename packet has valid data */
                                for (i = 0, file_ptr = packet_data + PACKET_HEADER; (*file_ptr != 0) && (i < FILE_NAME_LENGTH);)
                                {
                                    FileName[i++] = *file_ptr++;
                                }
                                FileName[i++] = '\0';
                                for (i = 0, file_ptr ++; (*file_ptr != ' ') && (i < FILE_SIZE_LENGTH);)
                                {
                                    file_size[i++] = *file_ptr++;
                                }
                                file_size[i++] = '\0';
                                Str2Int(file_size, &size);

                                /* Test the size of the image to be sent */
                                /* Image size is greater than Flash size */
                                if (size > (USER_FLASH_SIZE + 1))
                                {
                                    /* End session */
                                    Send_Byte(CA);
                                    Send_Byte(CA);
                                    return -1;
                                }
                                /* erase user application area */
                                FLASH_If_Erase(APPLICATION_ADDRESS);
                                Send_Byte(ACK);
                                Send_Byte(CRC16);
                            }
                            /* Filename packet is empty, end session */
                            else
                            {
                                Send_Byte(ACK);
                                file_done = 1;
                                session_done = 1;
                                break;
                            }
                        }
                        /* Data packet */
                        else
                        {
                            memcpy(buf_ptr, packet_data + PACKET_HEADER, packet_length);
                            ramsource = (uint32_t)buf;

                            /* Write received data in Flash */
                            if (FLASH_If_Write(&flashdestination, (uint32_t*) ramsource, (uint16_t) packet_length/4)  == 0)
                            {
                                Send_Byte(ACK);
                            }
                            else /* An error occurred while writing to Flash memory */
                            {
                                /* End session */
                                Send_Byte(CA);
                                Send_Byte(CA);
                                return -2;
                            }
                        }
                        packets_received ++;
                        session_begin = 1;
                    }
                }
                break;
            case 1:
                Send_Byte(CA);
                Send_Byte(CA);
                return -3;
            default:
                if (session_begin > 0)
                {
                    errors ++;
                }
                if (errors > MAX_ERRORS)
                {
                    Send_Byte(CA);
                    Send_Byte(CA);
                    return 0;
                }
                Send_Byte(CRC16);
                break;
            }
            if (file_done != 0)
            {
                break;
            }
        }
        if (session_done != 0)
        {
            break;
        }
    }
    return (int32_t)size;
}
Exemple #16
0
/*
 *
 * move the new_fimware to the firmware sector
 *
 */
void firmware_write_firmware_temp_with_firmware() {
    firmware_erase_firmware_temp();
    FLASH_If_Write((uint32_t*)FIRMWARE_TEMP_FIRST_PAGE_ADDRESS, (uint32_t*)FIRMWARE_FIRST_PAGE_ADDRESS, FIRMWARE_SIZE);
}
/**
  * @brief  Processes data transfers after a TFTP write request
  * @param  _args: used as pointer on TFTP connection args
  * @param  upcb: pointer on udp_pcb structure
  * @param pkt_buf: pointer on a pbuf stucture
  * @param ip_addr: pointer on the receive IP_address structure
  * @param port: receive port address
  * @retval none
  */
static void IAP_wrq_recv_callback(void *_args, struct udp_pcb *upcb, struct pbuf *pkt_buf, struct ip_addr *addr, u16_t port)
{
  tftp_connection_args *args = (tftp_connection_args *)_args;
  uint32_t data_buffer[128];
  char message[20];
  u16 count=0;
 

  if (pkt_buf->len != pkt_buf->tot_len)
  {
    return;
  }

  /* Does this packet have any valid data to write? */
  if ((pkt_buf->len > TFTP_DATA_PKT_HDR_LEN) &&
      (IAP_tftp_extract_block(pkt_buf->payload) == (args->block + 1)))
  {
    /* copy packet payload to data_buffer */
    pbuf_copy_partial(pkt_buf, data_buffer, pkt_buf->len - TFTP_DATA_PKT_HDR_LEN,
                      TFTP_DATA_PKT_HDR_LEN);
    
    total_count += pkt_buf->len - TFTP_DATA_PKT_HDR_LEN; 
    
    count = (pkt_buf->len - TFTP_DATA_PKT_HDR_LEN)/4;
    if (((pkt_buf->len - TFTP_DATA_PKT_HDR_LEN)%4)!=0) 
    count++;
     
    /* Write received data in Flash */
    FLASH_If_Write(&Flash_Write_Address, data_buffer ,count);
       
    /* update our block number to match the block number just received */
    args->block++;
    /* update total bytes  */
    (args->tot_bytes) += (pkt_buf->len - TFTP_DATA_PKT_HDR_LEN);

    /* This is a valid pkt but it has no data.  This would occur if the file being
       written is an exact multiple of 512 bytes.  In this case, the args->block
       value must still be updated, but we can skip everything else.    */
  }
  else if (IAP_tftp_extract_block(pkt_buf->payload) == (args->block + 1))
  {
    /* update our block number to match the block number just received  */
    args->block++;
  }
  
  /* Send the appropriate ACK pkt*/
  IAP_tftp_send_ack_packet(upcb, addr, port, args->block);   

  /* If the last write returned less than the maximum TFTP data pkt length,
   * then we've received the whole file and so we can quit (this is how TFTP
   * signals the EndTransferof a transfer!)
   */
  if (pkt_buf->len < TFTP_DATA_PKT_LEN_MAX)
  {
    IAP_tftp_cleanup_wr(upcb, args);
    pbuf_free(pkt_buf);
    
#ifdef USE_LCD
    LCD_SetTextColor(White);
    LCD_DisplayStringLine(Line5, (char*)"Tot bytes Received:"); 
    sprintf(message, "%u bytes ",total_count);
    LCD_DisplayStringLine(Line6, (uint8_t*)message);
    LCD_SetTextColor(Red);
    LCD_DisplayStringLine(Line9, (char*)"State: Prog Finished "); 
#endif

		BKP_WriteBackupRegister(BKP_DR11,0);
		/* generate a watchdog reset */
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
		//SerialPutString("\r\nENABLE WTD! \n");
		WWDG_Enable(0x40);
		while(1);
  }
  else
  {
    pbuf_free(pkt_buf);
    return;
  }
}
/**
  * @brief  Processes data transfers after a TFTP write request
  * @param  _args: used as pointer on TFTP connection args
  * @param  upcb: pointer on udp_pcb structure
  * @param pkt_buf: pointer on a pbuf stucture
  * @param ip_addr: pointer on the receive IP_address structure
  * @param port: receive port address
  * @retval none
  */
static void IAP_wrq_recv_callback(void *_args, struct udp_pcb *upcb, struct pbuf *pkt_buf, struct ip_addr *addr, u16_t port)
{
  tftp_connection_args *args = (tftp_connection_args *)_args;
  uint32_t data_buffer[128];
  u16 count=0;
  static uint32_t process = 0;
  static uint16_t process_x = UPDATE_WORD_START_X;
  char buff[10];
  static uint16_t process_buff = 0;

#ifdef USE_LCD
  char message[40];
#endif

  if (pkt_buf->len != pkt_buf->tot_len)
  {
	udp_lcd_y += UPDATE_WORD_SIZE + UPDATE_ROW_DISTANCE;
	lcd_font24(udp_lcd_x,udp_lcd_y,COLOR_POINT,COLOR_BACK,"> ÒÔÌ«ÍøÉý¼¶³ö´íÁË¡£´íÎó´úÂ룺2",UPDATE_FONT); 
	UDP_AddUpdateError();
// #ifdef USE_LCD
//     LCD_SetTextColor(Red);
//     LCD_DisplayStringLine(Line9, (uint8_t*)"Invalid data length");
// #endif
    return;
  }

  /* Does this packet have any valid data to write? */
  if ((pkt_buf->len > TFTP_DATA_PKT_HDR_LEN) &&
      (IAP_tftp_extract_block(pkt_buf->payload) == (args->block + 1)))
  {
    /* copy packet payload to data_buffer */
    pbuf_copy_partial(pkt_buf, data_buffer, pkt_buf->len - TFTP_DATA_PKT_HDR_LEN,
                      TFTP_DATA_PKT_HDR_LEN);
    
    total_count += pkt_buf->len - TFTP_DATA_PKT_HDR_LEN; 
    
    count = (pkt_buf->len - TFTP_DATA_PKT_HDR_LEN)/4;
    if (((pkt_buf->len - TFTP_DATA_PKT_HDR_LEN)%4)!=0) 
    count++;
     
    /* Write received data in Flash */
    switch ( FLASH_If_Write(&Flash_Write_Address, data_buffer ,count) )
	{
		case 0:
			process++;
			if ((process % 30) == 0)
			{
				process_buff += 5;
				lcd_font24(process_x,udp_lcd_y,COLOR_POINT,COLOR_BACK,"-",UPDATE_FONT);
				process_x += 12;
				usprintf(buff,"%3d%%",process_buff);
				lcd_font24(process_x,udp_lcd_y,COLOR_POINT,COLOR_BACK,buff,UPDATE_FONT);
			}
			break;
		case 1:
			udp_lcd_y += UPDATE_WORD_SIZE + UPDATE_ROW_DISTANCE;
			lcd_font24(udp_lcd_x,udp_lcd_y,COLOR_POINT,COLOR_BACK,"> ÒÔÌ«ÍøÉý¼¶³ö´íÁË¡£´íÎó´úÂ룺3",UPDATE_FONT); 
			UDP_AddUpdateError();
		case 2:
			udp_lcd_y += UPDATE_WORD_SIZE + UPDATE_ROW_DISTANCE;
			lcd_font24(udp_lcd_x,udp_lcd_y,COLOR_POINT,COLOR_BACK,"> ÒÔÌ«ÍøÉý¼¶³ö´íÁË¡£´íÎó´úÂ룺4",UPDATE_FONT); 
			UDP_AddUpdateError();
	}
       
    /* update our block number to match the block number just received */
    args->block++;
    /* update total bytes  */
    (args->tot_bytes) += (pkt_buf->len - TFTP_DATA_PKT_HDR_LEN);

    /* This is a valid pkt but it has no data.  This would occur if the file being
       written is an exact multiple of 512 bytes.  In this case, the args->block
       value must still be updated, but we can skip everything else.    */
  }
  else if (IAP_tftp_extract_block(pkt_buf->payload) == (args->block + 1))
  {
    /* update our block number to match the block number just received  */
    args->block++;
  }
  
  /* Send the appropriate ACK pkt*/
  IAP_tftp_send_ack_packet(upcb, addr, port, args->block);   

  /* If the last write returned less than the maximum TFTP data pkt length,
   * then we've received the whole file and so we can quit (this is how TFTP
   * signals the EndTransferof a transfer!)
   */
  if (pkt_buf->len < TFTP_DATA_PKT_LEN_MAX)
  {
    IAP_tftp_cleanup_wr(upcb, args);
    pbuf_free(pkt_buf);
    
	lcd_font24(process_x,udp_lcd_y,COLOR_POINT,COLOR_BACK,"100%",UPDATE_FONT);
	udp_lcd_y += UPDATE_WORD_SIZE + UPDATE_ROW_DISTANCE;
	  
	uPdateFinish = YES;
// #ifdef USE_LCD
//     LCD_SetTextColor(White);
//     LCD_DisplayStringLine(Line5, (uint8_t*)"Tot bytes Received:");
//     sprintf(message, "%d bytes ",total_count);
//     LCD_DisplayStringLine(Line6, (uint8_t*)message);
//     LCD_DisplayStringLine(Line8, (uint8_t*)"State: Prog Finished ");
// #endif
  }
  else
  {
// 	  udp_lcd_y += UPDATE_WORD_SIZE + UPDATE_ROW_DISTANCE;
// 	  lcd_font24(udp_lcd_x,udp_lcd_y,COLOR_POINT,COLOR_BACK,"Reset the board",UPDATE_FONT);
// #ifdef USE_LCD
//     LCD_SetTextColor(Red);
//     LCD_DisplayStringLine(Line9, (uint8_t*)"   Reset the board  ");
// #endif
    pbuf_free(pkt_buf);
    return;
  }
}
Exemple #19
0
/**
  * @brief  Processes data transfers after a TFTP write request
  * @param  _args: used as pointer on TFTP connection args
  * @param  upcb: pointer on udp_pcb structure
  * @param pkt_buf: pointer on a pbuf stucture
  * @param ip_addr: pointer on the receive IP_address structure
  * @param port: receive port address
  * @retval None
  */
static void IAP_wrq_recv_callback(void *_args, struct udp_pcb *upcb, struct pbuf *pkt_buf, struct ip_addr *addr, u16_t port)
{
    tftp_connection_args *args = (tftp_connection_args *)_args;
    uint32_t data_buffer[128];
    uint16_t count=0;

#ifdef USE_LCD
    char message[40];
#endif

    if (pkt_buf->len != pkt_buf->tot_len)
    {
#ifdef USE_LCD
        LCD_ErrLog("Invalid data length\n");
#endif
        return;
    }

    /* Does this packet have any valid data to write? */
    if ((pkt_buf->len > TFTP_DATA_PKT_HDR_LEN) &&
            (IAP_tftp_extract_block(pkt_buf->payload) == (args->block + 1)))
    {
        /* copy packet payload to data_buffer */
        pbuf_copy_partial(pkt_buf, data_buffer, pkt_buf->len - TFTP_DATA_PKT_HDR_LEN,
                          TFTP_DATA_PKT_HDR_LEN);

        total_count += pkt_buf->len - TFTP_DATA_PKT_HDR_LEN;

        count = (pkt_buf->len - TFTP_DATA_PKT_HDR_LEN)/4;
        if (((pkt_buf->len - TFTP_DATA_PKT_HDR_LEN)%4)!=0)
            count++;

        /* Write received data in Flash */
        FLASH_If_Write(&Flash_Write_Address, data_buffer ,count);

        /* update our block number to match the block number just received */
        args->block++;
        /* update total bytes  */
        (args->tot_bytes) += (pkt_buf->len - TFTP_DATA_PKT_HDR_LEN);

        /* This is a valid pkt but it has no data.  This would occur if the file being
           written is an exact multiple of 512 bytes.  In this case, the args->block
           value must still be updated, but we can skip everything else.    */
    }
    else if (IAP_tftp_extract_block(pkt_buf->payload) == (args->block + 1))
    {
        /* update our block number to match the block number just received  */
        args->block++;
    }

    /* Send the appropriate ACK pkt*/
    IAP_tftp_send_ack_packet(upcb, addr, port, args->block);

    /* If the last write returned less than the maximum TFTP data pkt length,
     * then we've received the whole file and so we can quit (this is how TFTP
     * signals the EndTransferof a transfer!)
     */
    if (pkt_buf->len < TFTP_DATA_PKT_LEN_MAX)
    {
        IAP_tftp_cleanup_wr(upcb, args);
        pbuf_free(pkt_buf);

#ifdef USE_LCD
        sprintf(message, "%d bytes ",(int)total_count);
        LCD_UsrLog("Tot bytes Received:, %s\n", message);
        LCD_UsrLog("  State: Prog Finished \n");
        LCD_UsrLog("Reset the board \n");
#endif
    }
    else
    {
        pbuf_free(pkt_buf);
        return;
    }
}
Exemple #20
0
/*
 *
 * move the new_fimware to the firmware sector
 *
 */
void firmware_write_firmware_with_new_firmware() {
    firmware_erase_firmware();
    FLASH_If_Write((uint32_t*)FIRMWARE_FIRST_PAGE_ADDRESS, (uint32_t*)NEW_FIRMWARE_FIRST_PAGE_ADDRESS, FIRMWARE_SIZE);
}