Beispiel #1
0
int CheckUpgrade(void)
{
  struct _header h;
  // check if the firmware is there
  SPI_FLASH_BufferRead((void*)&h, FIRMWARE_BASE, sizeof(h));

  if (h.signature != SIGNATURE)
    return 0;

  printf("Found firmware, length = %lu\n", h.length);

  SPI_FLASH_BufferRead((void*)&h, FIRMWARE_BASE + h.length + sizeof(h), sizeof(h));

  if (h.signature != SIGNATURE)
    return 1;

  SPI_FLASH_BufferRead((void*)&h, FIRMWARE_BASE + h.length + 2 * sizeof(h), sizeof(h));
  if (h.signature == SIGNATURE)
    return 2; // ignore flag

  if (battery_state() == BATTERY_STATE_DISCHARGING
    && battery_level(BATTERY_STATE_DISCHARGING) < 4)
    return 3; // not enough power

  // check CRC

  return 0xff;
}
/*
 * 初始化液晶,串口,触摸屏,flash及sd卡 * 
 */
void ISO_Init(void)
{
	uint8_t k;
	
  /* 液晶初始化先于串口,不然会有bug,至于是什么原因我也不知道:( */
  LCD_Init();
	
	LCD_Clear(0,0,240,320,WHITE);
	
	LCD_DispStr(20,150,"board init,please wait... ",RED);
  
  USART1_Config();	
	
	

	/* 初始化sd卡文件系统,因为汉字的字库放在了sd卡里面 */
	Sd_fs_init();	

	#ifdef WORD_MODE
  /* 显示界面图片 */
	Lcd_show_bmp(0, 0,"/boardtest/boardtest.bmp");
	#else
	 /* 显示界面图片 */
	Lcd_show_bmp(0, 0,"/boardtest/ISO/ui_boardtest.bmp");

	#endif
	Lcd_List(1);
	
	/* 初始化外部FLASH */
	SPI_FLASH_Init();
	//SPI_FLASH_SectorErase(0);
  
	/* 触摸屏IO和中断初始化 */
	Touch_Init();		
		
		
		/*-------------------------------------------------------------------------------------------------------*/  
		#if 1
		SPI_FLASH_BufferRead(&cal_flag, 0, 1);
		if( cal_flag == 0x55 )
		{
			SPI_FLASH_BufferRead((void*)cal_p, 1, sizeof(cal_p));
			SPI_FLASH_CS_HIGH();
			for( k=0; k<6; k++ )
						printf("\r\n rx = %LF \r\n",cal_p[k]);
		}
		else
		{
			/* 等待触摸屏校正完毕 */
			while(Touch_Calibrate() !=0);
		}
		#elif 0
		/* 等待触摸屏校正完毕 */
		while(Touch_Calibrate() !=0);
		#endif
	


}
Beispiel #3
0
//------------------------------------------------------------------------------
// Copy flash function to RAM.
//------------------------------------------------------------------------------
void Upgrade(void)
{
  unsigned char *flash_start_ptr;           // Initialize pointers
  unsigned char *flash_end_ptr;
  unsigned char *RAM_start_ptr;

  if (CheckUpgrade() != 0xff)
    return;

  //Initialize flash and ram start and end address
  flash_start_ptr = (unsigned char *)__segment_begin("FLASHCODE");
  flash_end_ptr = (unsigned char *)__segment_end("FLASHCODE");
  RAM_start_ptr = (unsigned char *)__segment_begin("RAMCODE");

  //calculate function size
  unsigned long function_size = (unsigned long)(flash_end_ptr) - (unsigned long)(flash_start_ptr);

  // Copy flash function to RAM
  printf("Copy From %p to %p size=%ld\n", flash_start_ptr, RAM_start_ptr, function_size);
  memcpy(RAM_start_ptr,flash_start_ptr,function_size);

  motor_on(0, 0);
  printf("Jump to %p\n", FlashFirmware);

  // remove the flag of firmware
  struct _header h;
  SPI_FLASH_BufferRead((void*)&h, FIRMWARE_BASE, sizeof(h));
  SPI_FLASH_BufferWrite((void*)&h, FIRMWARE_BASE + h.length + 2 * sizeof(h), sizeof(h));

  FlashFirmware();
}
Beispiel #4
0
/*
 * 函数名:main
 * 描述  :主函数
 * 输入  :无
 * 输出  :无
 */
int main(void)
{ 	
	uint8_t k;
  
  /* 配置串口1为:115200 8-N-1 */
	USART1_Config();
	printf("\r\n 这是一个2M串行flash(W25Q16)实验 \r\n");
	
	/* 2M串行flash W25X16初始化 */
	SPI_FLASH_Init();
	
	/* Get SPI Flash Device ID */
	DeviceID = SPI_FLASH_ReadDeviceID();
	
	Delay( 200 );
	
	/* Get SPI Flash ID */
	FlashID = SPI_FLASH_ReadID();
	
	printf("\r\n FlashID is 0x%X,  Manufacturer Device ID is 0x%X\r\n", FlashID, DeviceID);
	
	/* Check the SPI Flash ID */
	if (FlashID == sFLASH_ID)  /* #define  sFLASH_ID  0xEF3015 */
	{	
		printf("\r\n 检测到华邦串行flash W25Q16 !\r\n");
		
		/* Erase SPI FLASH Sector to write on */
		SPI_FLASH_SectorErase(FLASH_SectorToErase);	 	 
		
		/* 将发送缓冲区的数据写到flash中 */
		SPI_FLASH_BufferWrite(Tx_Buffer, FLASH_WriteAddress, BufferSize);
    for( k=0; k<6; k++ )
      printf("\r\n 写入的数据为:%d \r\n", Tx_Buffer[k]);
		
		/* 将刚刚写入的数据读出来放到接收缓冲区中 */
		SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize);
    for( k=0; k<6; k++ )
      printf("\r\n 读出的数据为:%d \r\n", Tx_Buffer[k]);
		
		/* 检查写入的数据与读出的数据是否相等 */
		TransferStatus1 = Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize);
		
		if( PASSED == TransferStatus1 )
		{    
			printf("\r\n 2M串行flash(W25Q16)测试成功!\n\r");
		}
		else
		{        
			printf("\r\n 2M串行flash(W25Q16)测试失败!\n\r");
		}
	}// if (FlashID == sFLASH_ID)
	else
	{    
		printf("\r\n 获取不到 W25Q16 ID!\n\r");
	}
	
	SPI_Flash_PowerDown();  
	while(1);  
}
Beispiel #5
0
char BSL430_readMemory(unsigned long addr, unsigned int length, char* data)
{
    char exceptions = SUCCESSFUL_OPERATION;

    SPI_FLASH_BufferRead(data, addr, length);

    return exceptions;
}
Beispiel #6
0
/**    
  * @brief  Main program.    
  * @param  None    
  * @retval None    
  */
int main(void)    
{   
    RCC_Configuration();
    SPI1_Flash_GPIO_Configuration();
    SPI1_Flash_Configuration();
    /* Get Flash ID */
    FlashID =SPI_FLASH_ReadID();
    if(sFLASH_ID== FlashID  )
    {
        /* Erase SPI FLASH Sector */
        SPI_FLASH_SectorErase(FLASH_WriteAddress);
        /* Write Buffer_Tx to SPI FLASH */
        SPI_FLASH_BufferWrite(Buffer_Tx,FLASH_WriteAddress,BufferSize);
        /* Read data from SPI FLASH */
        SPI_FLASH_BufferRead (Buffer_Rx,FLASH_ReadAddress,BufferSize); 
        /* if TransferStatus1 =PASSED, the Flash write and read operation are correct£¬
           if TransferStatus1 =FAILED, the Flash write and read operation are failed */
        TransferStatus1 = Buffercmp(Buffer_Tx, Buffer_Rx, BufferSize);   
   
        /* Erase SPI FLASH Sector */
        SPI_FLASH_SectorErase(FLASH_WriteAddress); 
        /* Read data from SPI FLASH */
        SPI_FLASH_BufferRead(Buffer_Rx, FLASH_ReadAddress, BufferSize);  
        for (Index = 0; Index < BufferSize; Index++)
       {
          if (Buffer_Rx[Index] != 0xFF)
          {
            /* if TransferStatus2 =PASSED, the Flash erase and read operation are correct£¬
               if TransferStatus2 =FAILED, the Flash erase and read operation are failed */  
            TransferStatus2 = FAILED;
          }
       }
        
    }
    
    while (1)    
    {    
    }        
}    
Beispiel #7
0
void drv_FlashChipRead(uint8_t * pdata)
{
    uint32_t dwOffset;

    dwOffset = *pdata++;
    dwOffset <<= 8;
    dwOffset += *pdata++;
    dwOffset <<= 8;
    dwOffset += *pdata++;
    dwOffset <<= 8;
    dwOffset += *pdata++;

    SPI_FLASH_BufferRead(pdata, dwOffset, 32);
}
Beispiel #8
0
void SPI_FLASH_BufferWrite(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)   
{ 
	u32 secpos;
	u16 secoff;
	u16 secremain;	   
 	u16 i;    

	secpos=WriteAddr/4096;//扇区地址 0~511 for w25x16
	secoff=WriteAddr%4096;//在扇区内的偏移
	secremain=4096-secoff;//扇区剩余空间大小   

	if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096个字节
	while(1) 
	{	
		SPI_FLASH_BufferRead(SPI_FLASH_BUF,secpos*4096,4096);//读出整个扇区的内容
		for(i=0;i<secremain;i++)//校验数据
		{
			if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//需要擦除  	  
		}
		if(i<secremain)//需要擦除
		{
			SPI_FLASH_SectorErase(secpos * 4096);//擦除这个扇区
			for(i=0;i<secremain;i++)	   //复制
			{
				SPI_FLASH_BUF[i+secoff]=pBuffer[i];	  
			}
			SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//写入整个扇区  

		}else SPI_Flash_Write_NoCheck(pBuffer,WriteAddr,secremain);//写已经擦除了的,直接写入扇区剩余区间. 				   
		if(NumByteToWrite==secremain)break;//写入结束了
		else//写入未结束
		{
			secpos++;//扇区地址增1
			secoff=0;//偏移位置为0 	 

		   	pBuffer+=secremain;  //指针偏移
			WriteAddr+=secremain;//写地址偏移	   
		   	NumByteToWrite-=secremain;				//字节数递减
			if(NumByteToWrite>4096)secremain=4096;	//下一个扇区还是写不完
			else secremain=NumByteToWrite;			//下一个扇区可以写完了
		}	 
	};	 	 
}
Beispiel #9
0
void Geek_CheckUpdate(USART_TypeDef* USARTx)
{
	uint8 Length;
	Geek_DatStruct *GDS;
	uint8 Buf[100];
	uint8 UsartCH=USART_GetIndex(USARTx);
	Length=USART_ReadDatas(USARTx,USART_TX_Buffer[UsartCH],USART_RX_BUFFER_SIZE,SPASETIME);
	Geek_Send(USARTx,0x01,0xaa,Null,Null,Null,0);
	if(Export_Message(USART_TX_Buffer[UsartCH],Length))
	{
		GDS=(Geek_DatStruct *)USART_TX_Buffer[UsartCH];
		switch(GDS->Cmd)
		{
			case GC_Erase:break;
			case GC_Stop:break;
			case GC_Run:break;	
			case GC_Write:SPI_FLASH_BufferWrite(GDS->Buf,GDS->Tags1,GDS->Length);
										Geek_Send(USARTx,HOSTADDRESS,GC_Success,Null,Null,Null,0);break;
			case GC_Read:SPI_FLASH_BufferRead(&Buf[0],GDS->Tags2,GDS->Tags2);
									 Geek_Send(USARTx,HOSTADDRESS,GC_Data,GDS->Tags2,GDS->Tags2,&Buf[0],GDS->Tags2);break;
		}
	}
}
Beispiel #10
0
static rt_size_t rt_SpiFlash_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
{
    SPI_FLASH_BufferRead((uint8_t *)buffer, pos, size);
    return size;
}
Beispiel #11
0
uint32_t drv_FlashChipReadDword(uint32_t dwOffset)
{
    uint8_t abyTmp[4];
    SPI_FLASH_BufferRead(abyTmp, dwOffset, 4);
    return (((uint32_t)abyTmp[3] << 24) | ((uint32_t)abyTmp[2] << 16) | ((uint32_t)abyTmp[1] << 8) | (uint32_t)abyTmp[0]);
}