⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eval5500.c

📁 boot loader示范程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	
		if (ReturnStatus ==-1){
			*ptr_to_b = OriginalByte;     
		}			
	}
	
/***************************************************************************************************/	
/*************************SST Flash  ID check*****************************************************/
	if(ReturnStatus == -1){

		ReturnStatus = 0;

		ptr_to_b = (unsigned short int *)(0x7FF00000 | 0x00000000);
    	OriginalByte = *ptr_to_b;                   /* save the original memory contents    */		

		*ptr_to_b = 0xFFFF;					/* Setup command */
		*ptr_to_b = 0x9090;               /* write read_ident command             */


		ptr_to_b = (unsigned short int *)(0x7FF00000 | 0x00000000);

		mfr_id = *ptr_to_b;                   /* read mfr_id                          */

		ptr_to_b = (unsigned short int *)(0x7FF00000 | 0x00000002);                /* address A0=1  */

		dev_id = *ptr_to_b;

		printf("\n 4 Manufacture ID[%d], Device ID [%d] ",mfr_id,dev_id);
		if ((mfr_id == SST_ID) && (dev_id == SST_28SF040)){
			meminfo = &used_flash[3];	
			meminfo->start_address = 0x7ff00000;			
			ReturnStatus = 0;
			return 0;			
		}
		else
			ReturnStatus = -1;

		if (ReturnStatus ==-1){
			*ptr_to_b = OriginalByte;     
		}			
	}
/***************************************************************************************************/	
/*************************MXIC Flash  ID check*****************************************************/
	if(ReturnStatus == -1)
	{
		ReturnStatus = 0;

		ptr_to_b = (unsigned short int *)(START_ADDR_2M | 0x00000000);
		OriginalByte = *ptr_to_b;                   /* save the original memory contents    */		
		
		ptr_to_b[0x0555] = 0xAA;
		ptr_to_b[0x02AA] = 0x55;
		ptr_to_b[0x0555] = 0x90;		
		
		ram_task_delay(1);		
	       ptr_to_b  = (unsigned short int *)(START_ADDR_2M | 0x00000000); /* set up address to be C000:0000h  */
	       mfr_id  =  *ptr_to_b;              /* get first ID byte                */
		ptr_to_b = (unsigned short int *)(START_ADDR_2M | 0x00000002);
	       dev_id  =  *ptr_to_b;              /* get first ID byte                */


		printf("\n 6 Manufacture ID[0x%x], Device ID [0x%x] ",mfr_id,dev_id);
		if ((mfr_id == MXIC_ID) && (dev_id == MX29LV160AT))
		{
			printf("\n MXIC... MX29LV160AT flash....OK!\n");
			meminfo = &used_flash[9];	
			meminfo->start_address = START_ADDR_2M;
			ReturnStatus = 0;

			ptr_to_b[0x5555] = 0xAA; //return reset mode
			ptr_to_b[0x2AAA] = 0x55;
			ptr_to_b[0x5555] = 0xF0;		
			return 0;			
		}
		else 
			ReturnStatus = -1;		

		if (ReturnStatus ==-1){
			*ptr_to_b = OriginalByte;     
		}			
	}
  return 1;

}



// for intel 
static int EraseBlock (int block)             /* erase flashrom block                 */
{
  volatile unsigned short *ptr_to_b;               /* block_pointer def'n                  */

  ptr_to_b = (unsigned short *)block;             /* point to block_start_add for erase   */


  *ptr_to_b = 0x60;
  *ptr_to_b = 0xd0;

  *ptr_to_b = CLEAR_SREG;               /* clear status_register command        */
  *ptr_to_b = ERASE_SETUP;              /* write erase_setup command for block  */
  *ptr_to_b = ERASE_CONFIRM;            /* write erase_confm command for block  */
  *ptr_to_b = READ_SREG;                /* read status_register setup command   */

  while((*ptr_to_b & 0x80) != 0x80);

  if((*ptr_to_b & 0x08) != 0x00){  /* test s_reg vpp_error_flag    */
   FULL_REP_MSG((printBuf, "Vpp failure\n"));
   return 0;
  }

  if((*ptr_to_b & 0x10) != 0x00){  /* test s_reg comseq_error_flag */
    FULL_REP_MSG((printBuf, "Sreg com-seq error\n")) ;
    return 0;
  }

  if((*ptr_to_b & 0x20) != 0x00){  /* test s_reg erase_error_flag  */
    FULL_REP_MSG((printBuf, "Sreg erase error\n")) ;
    return 0;
  }

  if((*ptr_to_b & 0x40) != 0x00){  /* test s_reg ers_suspend_flag  */
    FULL_REP_MSG((printBuf, "Sreg suspend error\n")) ;
    return 0;
  }

  	*ptr_to_b = 0x60;
  	*ptr_to_b = 0x01;

  return 1;

}


int EraseFlash5500(void) {
  	volatile unsigned short int *ptr_to_m, SourceWord;

	int i, Count;
	char Continue,status;
	unsigned short int	*flashptr;
	
    ESSENTIAL_REP_MSG("Erase Start\n") ;  		
	
	if(mfr_id == AMD_ID){

		ptr_to_m = (unsigned short int *)MEMBLOCK(BOOTBLK)	/*BTBLK_TL*/;         /* point to -TL flash base address      */

		printf("\n ---> %x ", ptr_to_m);
		ptr_to_m[0x555] = 0xAA;
		ptr_to_m[0x2AA] = 0x55;		
		ptr_to_m[0x555] = 0x80;
		ptr_to_m[0x555] = 0xAA;
		ptr_to_m[0x2AA] = 0x55;
		ptr_to_m[0x555] = 0x10;

		while ((status=flash_status(flashptr)) == STATUS_BUSY) {
		};

		if (status == STATUS_ERROR){                   /* on errors..                          */
			printf("\nerase Error ");
			exit(1);   /* jump to end of process               */
		}
		printf("ROMTOOL: Erasing ALL\n");		
	}
	else if(mfr_id == MXIC_ID) { //RpG

		if(dev_id == MX29LV160AT)
		{
			ptr_to_m = (volatile unsigned short int *)START_ADDR_2M; 
			printf("\n erase MX29LV160AT");
		}
		else
			ptr_to_m = (volatile unsigned short int *)START_ADDR_1M; 

		ptr_to_m[0x555] = 0xAA;
		ptr_to_m[0x2AA] = 0x55;
		ptr_to_m[0x555] = 0x80;
		ptr_to_m[0x555] = 0xAA;
		ptr_to_m[0x2AA] = 0x55;
		ptr_to_m[0x555] = 0x10;

		Check_Toggle_Ready ((unsigned short int *)ptr_to_m);		

		printf("\n.");
		//delay loop for completion of erasing  operation
		for(i=1; i<=15; i++)
		{
			ram_task_delay(1000*1000); //01 second
			printf(".");
		}

		mxFlashReset();
		for ( i=0; i<=0xFFFFF; i+= 1 )
		{
			if ( * ( ptr_to_m + i ) != 0xFFFF )
			printf("\n ** Data Mismatch: addr [0x%x] value [0x%x] ", ( ptr_to_m + i ), *( ptr_to_m + i ));
		}

		printf("\nROMTOOL: Chip Erase .....OK!\n");
  	}
	else if(mfr_id == SST_ID) { 

		printf("ROMTOOL: Erasing Blocks ...\n");

		ptr_to_m = (unsigned short int *)0x7ff00000; 

		Continue = TRUE;

		for (i = 0; i < 2048; i++) {   					/* 2048 * 256 = 1M */


			*ptr_to_m = 0x2020;               	/* clear status_register command        */
			*ptr_to_m = 0xD0D0;                	/* read status_register setup command   */

			Check_Toggle_Ready(ptr_to_m);               /* wait for Toggle bit ready */

			Count = 0;

			while ((Count < ROW_SIZE) && (Continue)) {

				SourceWord = *ptr_to_m;
				if (SourceWord == 0xFFFF)
					Count++;
				else{
					printf("-=-=-09---==");
					Continue =  FALSE;
				}
				ptr_to_m ++;
			}
			if(!Continue) break;  
		}

		if (!Continue) {
			printf("ROMTOOL: ERRORS in FlashROM ERASE.\n");
			exit(1);    /* jump to end of process            */
		}

		printf("ROMTOOL: ROM erased with no errors..\n");

		/* =====================check array is erased================== */

		printf("ROMTOOL: Checking array is fully erased..\n");

		ptr_to_m = (unsigned short int *)meminfo->start_address;          /* point to lowest _add in FlashROM      */

		for (ptr_to_m = (unsigned short int *)meminfo->start_address;   /* point to flash_start and change type    */
			ptr_to_m < (unsigned short int *)0x80000000;   /* point to flash_end and change type      */
			ptr_to_m++){                     /* inc pointer                             */

			if (*ptr_to_m != ALLBITS1) {            /* check all bits are set to 1          */
				printf("ROMTOOL: ERRORS in FlashROM ERASE.\n");

			}
		}
  	}

	else if(mfr_id == INTEL_ID) { 

		ptr_to_m = (unsigned short int *)0x7ff00000;         /* point to -TL flash base address      */
		
		*ptr_to_m = CLEAR_SREG;               /* clear status_register command        */
		*ptr_to_m = READ_SREG;                /* read status_register setup command   */
		
		*ptr_to_m = CLEAR_SREG;               /* clear status_register command      */
		*ptr_to_m = READ_SREG;                /* read status_register setup command */
		

		printf("\nerase main block 1");
		if(!EraseBlock(MEMBLOCK(MAINBLK1)))      /* erase main_block1             */
		  return 0;
		printf("\nerase main block 2");		  
		if(!EraseBlock(MEMBLOCK(MAINBLK2)))      /* erase main_block2             */
		  return 0;
		printf("\nerase main block 3");		  		  
		if(!EraseBlock(MEMBLOCK(MAINBLK3)))      /* erase main_block3             */
		  return 0;
		printf("\nerase main block 4");		  		  
		if(!EraseBlock(MEMBLOCK(MAINBLK4)))      /* erase main_block4             */
		  return 0;
		printf("\nerase main block 5");		  		  
		if(!EraseBlock(MEMBLOCK(MAINBLK5)))      /* erase main_block4             */
		  return 0;
		printf("\nerase main block 6");		  		  
		if(!EraseBlock(MEMBLOCK(MAINBLK6)))      /* erase main_block4             */
		  return 0;
		printf("\nerase main block 7");		  		  
		if(!EraseBlock(MEMBLOCK(MAINBLK7)))      /* erase main_block4             */
		  return 0;
		printf("\nerase main block 8");		  		  
		if(!EraseBlock(MEMBLOCK(MAINBLK8)))      /* erase main_block4             */
		  return 0;
		printf("\nerase param block 1");		  		  
		if(!EraseBlock(MEMBLOCK(PARAMBLK1)))      /* erase para_block1             */
		  return 0;
		printf("\nerase param block 2");		  		  
		if(!EraseBlock(MEMBLOCK(PARAMBLK2)))      /* erase para_block2             */
		  return 0;
		printf("\nerase boot block 1");		  		  		  
		if(!EraseBlock(MEMBLOCK(BOOTBLK)))      /* erase boot_block              */
		  return 0;

		if(dev_id == INTEL_28F160C3_T){
			printf("\nerase param block 3");		  		  
			if(!EraseBlock(MEMBLOCK(PARAMBLK3)))      /* erase para_block1             */
			  return 0;
			printf("\nerase param block 4");		  		  
			if(!EraseBlock(MEMBLOCK(PARAMBLK4)))      /* erase para_block2             */
				return 0;
			printf("\nerase param block 5");		  		  
			if(!EraseBlock(MEMBLOCK(PARAMBLK5)))      /* erase para_block1             */
			  return 0;
			printf("\nerase param block 6");		  		  
			if(!EraseBlock(MEMBLOCK(PARAMBLK6)))      /* erase para_block2             */
				return 0;		
			printf("\nerase param block 7");		  		  
			if(!EraseBlock(MEMBLOCK(PARAMBLK7)))      /* erase para_block1             */
			  return 0;
	
			printf("\nerase main block 9");		  		  
			if(!EraseBlock(MEMBLOCK(MAINBLK9)))      /* erase main_block4             */
			  return 0;
			printf("\nerase main block 10");		  		  
			if(!EraseBlock(MEMBLOCK(MAINBLK10)))      /* erase main_block4             */
			  return 0;
			printf("\nerase main block 11");
			if(!EraseBlock(MEMBLOCK(MAINBLK11)))      /* erase main_block1             */
			  return 0;
			printf("\nerase main block 12");		  
			if(!EraseBlock(MEMBLOCK(MAINBLK12)))      /* erase main_block2             */
			  return 0;
			printf("\nerase main block 13");		  		  
			if(!EraseBlock(MEMBLOCK(MAINBLK13)))      /* erase main_block3             */
			  return 0;
			printf("\nerase main block 14");		  		  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -