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

📄 565cmf_dbug.c

📁 motorola自己开发的针对coldfire 5272的Dbug bootloader程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		    }
			sm_block_b0_enabled = TRUE;
			sm_block_b1_enabled = FALSE;
			break;
			
		case 3: /*both small blocks enabled*/
			for (i = 0; i < 8; i++)
		    {
		    	uc3f_b[i].size = cmf_block_b_sben[i].size;
		    	uc3f_b[i].offset = cmf_block_b_sben[i].offset;
		    }
			sm_block_b0_enabled = TRUE;
			sm_block_b1_enabled = TRUE;
			break;
	}
	#endif
return;
}
/********************************************************************/

ADDRESS 
C3F_sector_start(ADDRESS addr)
{   
	/* 
	 * Returns beginning of sector containing ADDRESS 
	 */
	int i;
	
	for (i = 0; i < CMF_FLASH_BLOCKS_A; i++)
	{
		if (addr >= (ADDRESS)((ADDRESS)pUC3F + uc3f_a[i].offset) &&
			addr <= (ADDRESS)((ADDRESS)pUC3F + uc3f_a[i].offset + (uc3f_a[i].size - 1)) )
		{
			return (ADDRESS)((ADDRESS)pUC3F + uc3f_a[i].offset);
		}
	}
	for (i=0; i < 2; i++) /*checking in Module A small blocks*/
	{
		if ((sm_block_a0_enabled || sm_block_a1_enabled) &&
			 addr >= (ADDRESS)((ADDRESS)pUC3F + cmf_sm_blocks_a[i].offset)	&&
			 addr <= (ADDRESS)((ADDRESS)pUC3F + cmf_sm_blocks_a[i].offset + (cmf_sm_blocks_a[i].size - 1)) )
		{
			return (ADDRESS)((ADDRESS)pUC3F + cmf_sm_blocks_a[i].offset);
		}
	}
	#if (defined (CPU_MPC565) || defined (CPU_MPC566))
	for (i = 0; i < CMF_FLASH_BLOCKS_B; i++)
	{
		if (addr >= (ADDRESS)((ADDRESS)pUC3F + uc3f_b[i].offset) &&
			addr <= (ADDRESS)((ADDRESS)pUC3F + uc3f_b[i].offset + (uc3f_b[i].size - 1)))
		{
			return (ADDRESS)((ADDRESS)pUC3F + uc3f_b[i].offset);
		}
	}
	for (i=0; i < 2; i++) /*checking in Module B small blocks*/
	{
		if ((sm_block_b0_enabled || sm_block_b1_enabled) &&
			 addr >= (ADDRESS)((ADDRESS)pUC3F + cmf_sm_blocks_b[i].offset) &&
			 addr <= (ADDRESS)((ADDRESS)pUC3F + cmf_sm_blocks_b[i].offset + (cmf_sm_blocks_b[i].size - 1)))
		{
			return (ADDRESS)((ADDRESS)pUC3F + cmf_sm_blocks_b[i].offset);
		}
	}
	#endif
	return NULL;
}

/********************************************************************/
ADDRESS 
C3F_sector_end(ADDRESS addr)
{
	/* Returns end of sector containing ADDRESS */
	int i;
	
	for (i = 0; i < CMF_FLASH_BLOCKS_A; i++)
	{
		if (addr >= (ADDRESS)((ADDRESS)pUC3F + uc3f_a[i].offset) &&
			addr <= (ADDRESS)((ADDRESS)pUC3F + uc3f_a[i].offset + (uc3f_a[i].size - 1)) )
		{
			return (ADDRESS)((ADDRESS)pUC3F + uc3f_a[i].offset + uc3f_a[i].size -1);
		}
	}
	for (i=0; i < 2; i++) /*checking in Module A small blocks*/
	{
		if ((sm_block_a0_enabled || sm_block_a1_enabled) &&
			 addr >= (ADDRESS)((ADDRESS)pUC3F + cmf_sm_blocks_a[i].offset)	&&
			 addr <= (ADDRESS)((ADDRESS)pUC3F + cmf_sm_blocks_a[i].offset + (cmf_sm_blocks_a[i].size - 1)) )
		{
			return (ADDRESS)((ADDRESS)pUC3F + cmf_sm_blocks_a[i].offset + cmf_sm_blocks_a[i].size -1);
		}
	}
	#if (defined (CPU_MPC565) || defined (CPU_MPC566))
	for (i = 0; i < CMF_FLASH_BLOCKS_B; i++)
	{
		if (addr >= (ADDRESS)((ADDRESS)pUC3F + uc3f_b[i].offset) &&
			addr <= (ADDRESS)((ADDRESS)pUC3F + uc3f_b[i].offset + (uc3f_b[i].size - 1)))
		{
			return (ADDRESS)((ADDRESS)pUC3F + uc3f_b[i].offset + cmf_sm_blocks_b[i].size -1);
		}
	}
	for (i=0; i < 2; i++) /*checking in Module B small blocks*/
	{
		if ((sm_block_b0_enabled || sm_block_b1_enabled) &&
			 addr >= (ADDRESS)((ADDRESS)pUC3F + cmf_sm_blocks_b[i].offset) &&
			 addr <= (ADDRESS)((ADDRESS)pUC3F + cmf_sm_blocks_b[i].offset + (cmf_sm_blocks_b[i].size - 1)))
		{
			return (ADDRESS)((ADDRESS)pUC3F + cmf_sm_blocks_b[i].offset + cmf_sm_blocks_b[i].size -1);
		}
	}
	#endif					 
	return NULL;
}

/********************************************************************/

/********************************************************************/

UINT32 C3F_EraseAll()
{
    pFLASHERASE FlashErase = (pFLASHERASE) FlashErase_C;   // Assign function pointer

    // Erase all blocks including shadow
	printf("\nErasing Flash...");
//    returnCode = EraseAndBlankCheck(&testAddress, &testData, CallBack);// Erase the part and check for blanked */

    // erase all C3F main arrays and shadow rows

    enabledBDM = 0;                         // Not enter into BDM after each operation
    // Erase all blocks and shadows
    for (m = 0; m < numModules; m++)
    {
        enabledBlocks[m] = 0xFF;            // Select all blocks in module m to erase
        enabledSBlocks[m] = 0x00;           // De-select all small blocks in module m
    }
    // Call FlashErase
    returnCode = (*FlashErase)( enabledBDM, CallBack, enabledBlocks, enabledSBlocks, arrayBase);

    if(returnCode != C3F_OK){
        return (failmessage("Erase",returnCode));
	}
    return C3F_OK;
}

/********************************************************************/
UINT32 C3F_erase(ADDRESS start, int bytes, void (*putchar)(char))
{
	int i, erased_bytes = 0;
	ADDRESS addr = start;
   	pFLASHERASE FlashErase = (pFLASHERASE) FlashErase_C;   /* Assign function pointer */
	enabledBDM = 0;                         /* Do not enter into BDM after each operation*/
   	
   	C3F_module_setup();			/* Checks for small blocks, etc. */
   	
	if (bytes == 0)
		return 0;

	enabledBlocks[0] = 0x00;   	/* De-select all blocks in module A*/
    enabledSBlocks[0] = 0x00;  	/* De-select all small blocks in module A*/
	enabledBlocks[1] = 0x00;   	/* De-select all blocks in module B*/
    enabledSBlocks[1] = 0x00;  	/* De-select all small blocks in module B*/
    

	while (erased_bytes < bytes)
	{
		for (i = 0; i < CMF_FLASH_BLOCKS_A; i++)
		{
			if (addr >= (ADDRESS)((ADDRESS)pUC3F + uc3f_a[i].offset) &&
				addr <= (ADDRESS)((ADDRESS)pUC3F + uc3f_a[i].offset + (uc3f_a[i].size - 1)) )
			{
				enabledBlocks[0] = enabledBlocks[0] | block_mask[i];
				addr = addr + uc3f_a[i].size; 
				erased_bytes = erased_bytes + uc3f_a[i].size;
				printf(".",i);
				break;
			}
		}
		for (i=0; i < 2; i++) /*checking in Module A small blocks*/
		{
			if ((sm_block_a0_enabled || sm_block_a1_enabled) &&
				 addr >= (ADDRESS)((ADDRESS)pUC3F + cmf_sm_blocks_a[i].offset)	&&
				 addr <= (ADDRESS)((ADDRESS)pUC3F + cmf_sm_blocks_a[i].offset + (cmf_sm_blocks_a[i].size - 1)) )
			{
				enabledSBlocks[0] = enabledSBlocks[0] | sm_block_mask[i];
				addr = addr + cmf_sm_blocks_a[i].size;
				erased_bytes = erased_bytes + cmf_sm_blocks_a[i].size;
				printf(".",i);
				break;
			}
		}
		#if (defined (CPU_MPC565) || defined (CPU_MPC566))
		for (i = 0; i < CMF_FLASH_BLOCKS_B; i++)
		{
			if (addr >= (ADDRESS)((ADDRESS)pUC3F + uc3f_b[i].offset) &&
				addr <= (ADDRESS)((ADDRESS)pUC3F + uc3f_b[i].offset + (uc3f_b[i].size - 1)))
			{
				enabledBlocks[1] = enabledBlocks[1] | block_mask[i];
				addr = addr + uc3f_b[i].size;
				erased_bytes = erased_bytes + uc3f_b[i].size;
				printf(".",i);
				break;
			}
		}
		for (i=0; i < 2; i++) /*checking in Module B small blocks*/
		{
			if ((sm_block_b0_enabled || sm_block_b1_enabled) &&
				 addr >= (ADDRESS)((ADDRESS)pUC3F + cmf_sm_blocks_b[i].offset) &&
				 addr <= (ADDRESS)((ADDRESS)pUC3F + cmf_sm_blocks_b[i].offset + (cmf_sm_blocks_b[i].size - 1)))
			{
				enabledSBlocks[1] = enabledSBlocks[1] | sm_block_mask[i];
				addr = addr + cmf_sm_blocks_b[i].size;
				erased_bytes = erased_bytes + cmf_sm_blocks_b[i].size;
				printf(".",i);
				break;
			}
		}
		#endif
	}
	returnCode = (*FlashErase)( enabledBDM, CallBack, enabledBlocks, enabledSBlocks, arrayBase);

    if(returnCode != C3F_OK)
    {
       (failmessage("Erase",returnCode));
       erased_bytes = 0;
    }
	
	return erased_bytes;
}
/********************************************************************/

void C3F_SetShadow()   // Set shadow configuration
{
   UC3F_A.UC3FMCR.R = 0x48FF0000;   /* UC3FMCR  Module A */
   #if (defined (CPU_MPC565) || defined (CPU_MPC566)) 
        UC3F_B.UC3FMCR.R = 0x48FF0000;   /* UC3FMCR Module B */
   #endif 
}

/********************************************************************/

void C3F_ClearShadow(){ // Clear shadow configuration

   UC3F_A.UC3FMCR.R = 0x40FF0000;   /* UC3FMCR  Module A */
   #if (defined (CPU_MPC565) || defined (CPU_MPC566)) 
        UC3F_B.UC3FMCR.R = 0x40FF0000;   /* UC3FMCR Module B */
   #endif
}

/********************************************************************/

int C3F_program(ADDRESS dest, ADDRESS source, int bytes, int erase, 
				void (*func)(void), void (*putchar)(char))
{
    pFLASHPROGRAM       FlashProgram       = (pFLASHPROGRAM)        FlashProgram_C;
    pFLASHVERIFY        FlashVerify        = (pFLASHVERIFY)         FlashVerify_C;

	//printf("Programming Internal Flash...\n");
	returnCode = (*FlashProgram)(enabledBDM, CallBack, dest, bytes, source, arrayBase);
	if(returnCode != C3F_OK)
	{
		printf("Error Programming Code: 0x%08X\n", returnCode);
	    return(NULL);
	}
	returnCode = (*FlashVerify)(enabledBDM,CallBack,dest,bytes,source,&compareAddress,&compareData,&compareSourceData,arrayBase);
    if(returnCode != C3F_OK)
    {
    	printf("Flash did not program correctly S-Record line beginning with %08X\n",source);
    }
    return(bytes);

}

/********************************************************************/

UINT32
C3F_ChangeCensor (void)
{
	pCHANGECENSOR       ChangeCensor       = (pCHANGECENSOR)        ChangeCensor_C;
	
    enabledBDM = 0;
    module = C3F_MODULE_A;
    censorValue = C3F_NO_CENSORSHIP1;
    deviceMode = DEVICE_CENSORED + 2;   
    
printf("Modifying Censor Bit");
returnCode = (*ChangeCensor)( enabledBDM,
                              CallBack,
                              module,
                              censorValue,
                              deviceMode,
                              arrayBase);
/* printf("returnCode = %08X",returnCode); */
return returnCode;
}

/********************************************************************/

UINT32 failmessage(char *msg, UINT32 code)
{
	printf("\n");
	printf(msg);
	printf(" Failed.  Status Code ");
	
	switch( code )
	{    
		case 0x00000001:
			printf("C3F_INFO_LOCK_B");
			break;
		case 0x00000002:
			printf("C3F_INFO_LOCK_A");
			break;
		case 0x00000004:
			printf("C3F_INFO_EPEE_B");
			break;
		case 0x00000008:
			printf("C3F_INFO_EPEE_A");
			break;
		case 0x00000010:
			printf("C3F_INFO_BOEPEE_B");
			break;
		case 0x00000020:
			printf("C3F_INFO_BOEPEE_A");
			break;
		case 0x00000040:
			printf("C3F_INFO_HVS_B");
			break;
		case 0x00000080:
			printf("C3F_INFO_HVS_A");
			break;
		case 0x00000100:
			printf("C3F_INFO_CENSOR_B");
			break;
		case 0x00000200:
			printf("C3F_INFO_CENSOR_A");
			break;
		case 0x00000400:
			printf("C3F_INFO_STOP_B");
			break;
		case 0x00000800:
			printf("C3F_INFO_STOP_A");
			break;
		case 0x00001000:
			printf("C3F_INFO_FLEN");
			break;
		case 0x00002000:
			printf("C3F_INFO_FLASHID");
			break;
		case 0x00004000:
			printf("C3F_ERROR_INVALID_ENABLED_BLOCK");
			break;
		case 0x00008000:
			printf("C3F_UNUSED_FLAG3");
			break;
		case 0x00010000:
			printf("C3F_UNUSED_FLAG4");
			break;
		case 0x00020000:
			printf("C3F_ERROR_PARTID");
			break;
		case 0x00040000:
			printf("C3F_ERROR_ALIGNMENT");
			break;
		case 0x00080000:
			printf("C3F_ERROR_SHADOW_RANGE");
			break;
		case 0x00100000:
			printf("C3F_ERROR_ARRAY_RANGE");
			break;
		case 0x00200000:
			printf("C3F_ERROR_ENABLED_SMALL_BLOCK");
			break;
		case 0x00400000:
			printf("C3F_ERROR_ERASE_PEGOOD");
			break;
		case 0x00800000:
			printf("C3F_ERROR_PROGRAM_VERIFICATION");
			break;
		case 0x01000000:
			printf("C3F_ERROR_PROGRAM_PEGOOD");
			break;
		case 0x02000000:
			printf("C3F_ERROR_NOT_BLANK");
			break;
		case 0x04000000:
			printf("C3F_ERROR_SRC_DEST_VERIFY");
			break;
		case 0x08000000:
			printf("C3F_ERROR_CENSOR_MODULE");
			break;
		case 0x10000000:
			printf("C3F_ERROR_CENSOR_VALUE");
			break;
		case 0x20000000:
			printf("C3F_ERROR_CENSOR_DEVICE_MODE");
			break;
		case 0x40000000:
			printf("C3F_ERROR_CENSOR_INVALID_REQUEST");
			break;
		case 0x80000000:
			printf("C3F_ERROR_CENSOR_PEGOOD");
			break;
		default:
			printf("Unknown Error");
			break;
	}
    
    printf("\n");
    return code;
}

⌨️ 快捷键说明

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