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

📄 dvb_flash.c

📁 DVB软件,基于CT216软件的开发源程序.
💻 C
📖 第 1 页 / 共 2 页
字号:
	if(!flash_init())	return FALSE;
	
	if(CT_SYS_Hostbus_Open(EN_CT_HOSTBUS_ACCESS_FLASH))
	{
/*#ifdef CI_ENABLE
		DVB_CI_Pause();
#endif*/
#ifdef ATA_ENABLE
		DVB_ATA_Pause();
#endif

		enResult = CT_Flash_Read(u32Address, u32BufferSize, pu8Buffer);
		CT_SYS_Hostbus_Close();
		
		if(enResult == DRV_OK)
		{
			return TRUE;
		}
		else
		{
			FLASH_DBG(( "{DVB_FlashReadData} CT_Flash_Read failed! (Addr=0x%06lX)\n", u32Address));
			return FALSE;
		}
	}
	else
	{
		FLASH_DBG(( "{DVB_FlashReadData} CT_SYS_Hostbus_Open failed! (Addr=0x%06lX)\n", u32Address));
		return FALSE;
	}
}

	
/*! \fn u32	DVB_FlashGetBankAddress(u8 u8Bank)
\brief Get address of bank in flash.
\param u8Bank (Input) Indicate which bank.
\return address of bank
*/
u32	DVB_FlashGetBankAddress (u8 u8Bank)
{
	/* caculate the flash address */
	return ((u32)FLASHSRV_BASE_ADDRESS + ((u32)u8Bank)*((u32)FLASHSRV_BYTE_MODE_BANK_SIZE));
}	
	
// for DVB2.0 start
bool8 DVB_FlashReadBank (u8 u8Bank, u32 u32DramAddress)
{
	return DVB_FlashRead(u8Bank, 0, (u8*)u32DramAddress, FLASHSRV_BYTE_MODE_BANK_SIZE);
}

bool8 DVB_FlashWriteBank (u8 u8Bank, u32 u32DramAddress)
{
	if(DVB_FlashErase(u8Bank) == FALSE)
		return FALSE;
	
	return DVB_FlashWrite(u8Bank, 0, (u8*)u32DramAddress, FLASHSRV_BYTE_MODE_BANK_SIZE);
}

bool8 DVB_FlashDump (u8 u8Bank, u16 u16Start, u16 u16Length)
{
	u32	u32FlashAddr;
	
	FLASH_DBG(( "\n\r{DVB_FlashDump} start u8Bank[%d] u16Start[0x%x] u16Length[%d]\n\r",
		u8Bank, u16Start, u16Length));
	
	u32FlashAddr = DVB_FlashGetBankAddress(u8Bank) + (u32)u16Start;
	
	DVB_DramDump (u32FlashAddr,(u32)u16Length);
	
	return (TRUE);
}

// for DVB2.0 end

#if FLASH_TEST

#define FLASH_SELTTEST 		0

u32 u32TestLength = FLASHSRV_BYTE_MODE_BANK_SIZE;
u8	au8TestArry[FLASHSRV_BYTE_MODE_BANK_SIZE]; // 64K Bytes 

#if FLASH_SELTTEST
u8	au8TestArry2[FLASHSRV_BYTE_MODE_BANK_SIZE * 25]; // 64K Bytes
#endif /* end #if FLASH_SELTTEST */

bool8 DVB_FlashWriteImage (u8 u8StartBank, u32 u32DramAddress, u32 u32Size)
{
	u8 u8BankNum = 0; /* cover how many bank number */
	u8 u8Bank = u8StartBank, i = 0;
	u32 u32DramAdr = u32DramAddress; 
	
	u8BankNum = u32Size / (FLASHSRV_WORD_MODE_BANK_SIZE * 2);
	 
	if (u32Size % (FLASHSRV_WORD_MODE_BANK_SIZE * 2))
		u8BankNum ++ ;
	
	for (i = 0; i < u8BankNum; i ++)
	{
		u8Bank = u8StartBank + i; 
		u32DramAdr = u32DramAddress + ( i * (FLASHSRV_WORD_MODE_BANK_SIZE * 2)); 
		
		/* erase/write bank will be done in FlashWriteBank ( )*/
		if (DVB_FlashWriteBank (u8Bank, u32DramAdr) == FALSE)
		{
			FLASH_DBG(( "\n\r{DVB_FlashWriteImage} Fail \n"));
			return (FALSE);
		}	
	}	 
	FLASH_DBG(( "\n\r{DVB_FlashWriteImage} Success\n"));
	return (TRUE);
}
	
void flashinfo_print (void)
{
	ST_FLASH_INFO_T	stFlashInfo;
	
	DVB_FlashCheckID (&stFlashInfo);

	FLASH_DBG(( "Manufacturer ID: 0x%x\n", pstFlashInfo.u16Manufacture)) ;
	FLASH_DBG(( "Device ID : 0x%x\n", pstFlashInfo.u16Device));
	FLASH_DBG(( "Size : 0x%x bytes\n", stFlashInfo.u32FlashSize));
	FLASH_DBG(( "Bank Number < 64K per Bnk> : %d\n", stFlashInfo.u8Num_Bank));
	FLASH_DBG(( "Bank boot Type <0 : btm, 1 : top> : %d\n", _bFlashBootType));
}

void flash_test (u8 u8Mode, u16 u16Para1, u16 u16Para2)
{
	u32	u32Count;
	
	u8*	pu8TestPtr;
	u8	u8CheckCount = 0;
	u8	u8CheckValue = 0;
	u8	u8FlahBank = 0;

	if(flash_init() == FALSE)	return;

	switch (u8Mode)
	{
		default:
		case 0: /* Show Flash Information */

			flashinfo_print ();
			break;
			
		case 1: /* ERASE test */
			u8FlahBank = (u8)(u16Para1 & 0xFF);
			
			if ((u8FlahBank == 0) || (u8FlahBank >= _bFlashBankNum))
			{
				FLASH_DBG(( "Wrong Bank Number\n"));
				break;
			}
			
			FLASH_DBG(( "Erase Flash Bank[%d]\n", u8FlahBank));
					
			DVB_FlashErase (u8FlahBank);
			DVB_FlashDump (u8FlahBank, 0, 64);

			//DVB_FlashErase (u8FlahBank - 1);
			//DVB_FlashDump (u8FlahBank, 0, 64);
			break;
			
		case 2: /* Flash Write Test, not include bank0  */
		
			u8FlahBank = (u8)(u16Para1 & 0xFF);
			
			/* check parameter */
			if ((u8FlahBank == 0) || (u8FlahBank >= _bFlashBankNum))
			{
				FLASH_DBG(( "Wrong Bank Number\n"));		
				break;
			}
			
			for (u32Count = 0; u32Count< 20; u32Count++)
			{
				au8TestArry[u32Count] = (u8)(u32Count & 0x000000FF);
			}
			pu8TestPtr = (u8*) au8TestArry;

			DVB_FlashWrite (u8FlahBank, 0x06, pu8TestPtr, 8);
			DVB_FlashWrite (u8FlahBank, 0x14, pu8TestPtr, 10);
			DVB_FlashWrite (u8FlahBank, 0x22, pu8TestPtr, 12);
			DVB_FlashWrite (u8FlahBank, 0x30, pu8TestPtr, 14);
			DVB_FlashWrite (u8FlahBank, 0x40, pu8TestPtr, 16);
			DVB_FlashWrite (u8FlahBank, 0x58, pu8TestPtr, 6);
			DVB_FlashWrite (u8FlahBank, 0x66, pu8TestPtr, 4);
			DVB_FlashWrite (u8FlahBank, 0x74, pu8TestPtr, 2);
			
			FLASH_DBG(( "\n----1-8\n"));			
			memset (pu8TestPtr, 0, 20);
			DVB_FlashRead (u8FlahBank, 0x06, pu8TestPtr, 8);
			for (u32Count = 0; u32Count < 20; u32Count++)
			{
				FLASH_DBG(( "[%d]", pu8TestPtr[u32Count]));
				if ((u32Count % 10 == 0) && (u32Count != 0))
				{
					FLASH_DBG(( "\n"));
				}
			}	

			FLASH_DBG(( "\n----2-10\n"));			
			memset (pu8TestPtr, 0, 20);
			DVB_FlashRead (u8FlahBank, 0x14, pu8TestPtr, 10);
			for (u32Count = 0; u32Count < 20;u32Count++)
			{
				FLASH_DBG(( "[%d]", pu8TestPtr[u32Count]));
				if ((u32Count % 10 == 0) && (u32Count != 0))
				{
					FLASH_DBG(( "\n"));
				}
					 
			}
				
			FLASH_DBG(( "\n----3-12\n"));			
			memset (pu8TestPtr, 0, 20);
			DVB_FlashRead (u8FlahBank, 0x22, pu8TestPtr, 12);
			for (u32Count = 0; u32Count< 20; u32Count++)
			{
				FLASH_DBG(( "[%d]", pu8TestPtr[u32Count]));
				if ((u32Count % 10 == 0) && (u32Count != 0))
				{
					FLASH_DBG(( "\n"));
				}
					 
			}
				
			FLASH_DBG(( "\n----4-14\n"));			
			memset (pu8TestPtr, 0, 20);
			DVB_FlashRead (u8FlahBank, 0x30, pu8TestPtr, 14);
			for (u32Count = 0; u32Count< 20;u32Count++)
			{
				FLASH_DBG(( "[%d]", pu8TestPtr[u32Count]));
				if ((u32Count % 10 == 0) && (u32Count != 0))
				{
					FLASH_DBG(( "\n"));
				}
					 
			}
				
			FLASH_DBG(( "\n----5-16\n"));			
			memset (pu8TestPtr, 0, 20);
			DVB_FlashRead (u8FlahBank, 0x40, pu8TestPtr, 16);
			for (u32Count = 0; u32Count < 20; u32Count++)
			{
				FLASH_DBG(( "[%d]", pu8TestPtr[u32Count]));
				if ((u32Count % 10 == 0) && (u32Count != 0))
				{
					FLASH_DBG(( "\n\r"));
				}
					 
			}
				
			FLASH_DBG(( "\n----6-6\n"));			
			memset (pu8TestPtr, 0, 20);
			DVB_FlashRead (u8FlahBank, 0x58, pu8TestPtr, 6);
			for (u32Count = 0; u32Count< 20; u32Count++)
			{
				FLASH_DBG(( "[%d]", pu8TestPtr[u32Count]));
				if ((u32Count % 10 == 0) && (u32Count != 0))
				{
					FLASH_DBG(( "\n"));
				}
					 
			}
			
			FLASH_DBG(( "\n----7-4\n"));			
			memset (pu8TestPtr, 0, 20);
			DVB_FlashRead (u8FlahBank, 0x66, pu8TestPtr, 4);
			for (u32Count = 0; u32Count < 20; u32Count++)
			{
				FLASH_DBG(( "[%d]", pu8TestPtr[u32Count]));
				if ((u32Count % 10 == 0) && (u32Count != 0))
				{
					FLASH_DBG(( "\n"));
				}
					 
			}
			
			FLASH_DBG(( "\n----8-2\n"));			
			memset (pu8TestPtr, 0, 20);
			DVB_FlashRead (u8FlahBank, 0x74, pu8TestPtr, 2);
			for (u32Count = 0; u32Count < 20; u32Count++)
			{
				FLASH_DBG(( "[%d]", pu8TestPtr[u32Count]));
				if ((u32Count % 10 == 0) && (u32Count != 0))
				{
					FLASH_DBG(( "\n"));
				}
					 
			}																						
			break;
			
		case 3: /* Flash Erase, Read & Write Test, not include bank0 */
			memset (au8TestArry, 0xff, u32TestLength);

			u8FlahBank = (u8)(u16Para1 & 0xFF);
			
			if ((u8FlahBank == 0) || (u8FlahBank >= _bFlashBankNum))
			{
				FLASH_DBG(( "Wrong Bank Number\n"));
				break;
			}
			
			for (u8CheckCount=0; u8CheckCount<4; u8CheckCount++)
			{
				switch(u8CheckCount)
				{
					case 0:
						u8CheckValue = 0x33;
						break;
					case 1:
						u8CheckValue = 0x11;
						break;
					case 2:
						u8CheckValue = 0xAA;
						break;
					case 3:
						u8CheckValue = 0x55;
						break;
				}
				
				DVB_FlashErase (u8FlahBank);
				
				pu8TestPtr = (u8*) au8TestArry;
				memset (pu8TestPtr, u8CheckValue, u32TestLength);
				DVB_FlashWrite (u8FlahBank, 0, pu8TestPtr, u32TestLength);
				
				memset (pu8TestPtr, 0xff, u32TestLength);
				DVB_FlashRead (u8FlahBank, 0, pu8TestPtr, u32TestLength);
				
				FLASH_DBG(( "\n case3 0x%x 0[0x%x] 1[0x%x] last[0x%x]\n", 
					u8CheckValue, pu8TestPtr[0], pu8TestPtr[1], pu8TestPtr[u32TestLength-1]));				
			}
			break;
			
		case 5: /* Flash WriteBank & ReadBank Test include bank0 */
			memset (au8TestArry, 0xff, u32TestLength);
			u8FlahBank = (u8)(u16Para1&0xFF);
			
			if (u8FlahBank >= _bFlashBankNum)
			{
				FLASH_DBG(( "Wrong Bank Number\n"));
				break;
			}
			
//			if (u8FlahBank==0)
//			{
//				break;
//			}

			for (u8CheckCount=0; u8CheckCount<4; u8CheckCount++)
			{
				switch (u8CheckCount)
				{
					case 0:
						u8CheckValue = 0x33;
						break;
					case 1:
						u8CheckValue = 0x11	;
						break;
					case 2:
						u8CheckValue = 0xAA	;
						break;
					case 3:
						u8CheckValue = 0x55	;
						break;
				}
				pu8TestPtr = (u8*) au8TestArry;
				memset (pu8TestPtr, u8CheckValue, u32TestLength);
				
				DVB_FlashWriteBank (u8FlahBank, (u32) pu8TestPtr);
				memset (pu8TestPtr,0xff,u32TestLength);
				DVB_FlashReadBank (u8FlahBank, (u32) pu8TestPtr);
				
				FLASH_DBG(( "\n case5 0x%x 0[0x%x] 1[0x%x] last[0x%x]\n", 
					u8CheckValue, au8TestArry[0], au8TestArry[1], au8TestArry[u32TestLength-1]));				
			}
			break;

#if FLASH_SELTTEST		
		case 6:	/* DVB_FlashWriteImage test */	
			memset (au8TestArry2, 0x77, sizeof (au8TestArry2));
			u8FlahBank = 1; 
			u32Count = 25 << 16;
			if (DVB_FlashWriteImage (u8FlahBank, au8TestArry2, u32Count) == TRUE)
			{
				memset (au8TestArry, 0x00, u32TestLength);
				u8FlahBank = 25; 
				DVB_FlashReadBank (u8FlahBank, (u32) au8TestArry);
				FLASH_DBG(( "\n case6 0[0x%x] 1[0x%x] last[0x%x]\n", 
					au8TestArry[0], au8TestArry[1], au8TestArry[u32TestLength-1]));
			}	
			
			break;
#endif /* end #if FLASH_SELTTEST */			
			
#if 0			
		case 9: /* Dump Flash Data */
			DVB_FlashDump (28, 0, 0x40);
			DVB_FlashDump (29, 0, 0x80);
			break;
#endif			
	}
}
#endif /* end #if FLASH_TEST */

⌨️ 快捷键说明

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