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

📄 fpga.cpp

📁 coldfire5206芯片的boot程序
💻 CPP
字号:
/****************************************************************************************************
* 文 件 名:					fpga.cpp
* 说    明:	
*			(1) FPGA将被存放在FLASH,具体位置由FLASH_SYSTEM_FLAG决定,在Loader程序中被烧入,
*				同时可通过下载程序升级
*			(2) FPGA数据经过了压缩,采用的是Huffman方法,注意初始化FPGA的过程中,FLASH操作可能有问题】
*				所以需要先从FLASH中读入一个缓存,然后解压缩,这里都是借用了升级时的文件缓存
*
* 作    者:	史梁材
* 创建时间:	2003.07.07          
* 历史记录:
*			(1) 2003.07.07		create this new fpga file
***************************************************************************************************/


#include "bastype.h"
#include "main.h"
#include "flash.h"
#include "fpga.h"

static unsigned char s_acFpgaFileBuffer[0x20000];
long HuffmanDecompress(unsigned char * pNewOutData, unsigned char *pInData, long InLen);

/*********************************************************************
* 函数名称:		InitFpga
* 说	明:		提供两种模式
*				一种是通过BDM烧入FPGA时,FPGA数据是放在数组中的,fpga_data_len是数组的大小
*				一种从FLASH中取FPGA数据,fpga_data_len为0,通过FPGA在FLASH的头信息SOFTCOMINFO来确定
*				使用该函数初始化的FPGA数据都必须经过压缩,而且如果从FLASH中取FPGA数据
*				该函数必须在CheckSystemValid后进行。
* 入口参数:		
*				fpga_data_addr  -- FPGA数据的存放的位置
*				fpga_data_len   -- FPGA数据的长度
* 返 回 值:
*				void
*********************************************************************/
void InitFpga(UINT32 fpga_data_addr, UINT32 fpga_data_len)
{
	UCHAR  *Vport,*Iop2;
	UINT32 blth;
	UINT32 len; 

	UCHAR* buf_after_decompress = s_acFpgaFileBuffer;
	UCHAR*	buf_before_decompress;
	SOFTCOMINFO sofComInfo;
	if (fpga_data_len == 0)
	{
		memcpy(&sofComInfo, (UINT8*)(fpga_data_addr), sizeof(SOFTCOMINFO));

		len = sofComInfo.lComLen;
		buf_before_decompress = (UCHAR*)(fpga_data_addr + sizeof(SOFTCOMINFO));
	}
	else
	{
		len = fpga_data_len;
		buf_before_decompress = (UCHAR*)fpga_data_addr;
	}

	len = HuffmanDecompress(buf_after_decompress, buf_before_decompress, len);
	// 去除开始的辅助信息字段,8000主控板和6000主控板的头信息长度不一样
	// 根据FLASH的走线类型g_nFlashCircuitType来判断是8000主控板,还是6000
	if (g_nFlashCircuitType != FLASH_CIRCUIT_VER_6000)	//8000,9000
	{
		buf_after_decompress += 0x44;
		len -= 0x44;
	}
	else		//6000
	{
		buf_after_decompress += 0x46;
		len -= 0x46;
	}

	Iop2  = (UCHAR*)UOP1;
	*Iop2 = 0x1;   // send a low level to pin PROG


	// LLH.2002.7.18. widen PROG pulse, too narrow PROG pulse may fail
	for (blth=0xFF;blth;blth--);

	Iop2  = (UCHAR*)UOP0;
	*Iop2 = 0x1;   // send a high level to pin PROG

	Iop2  = (UCHAR*)UOP3;
	*Iop2 = 0x1;   // send a low level to pin /AC

	Vport = (UCHAR*)VPORT;
	for ( blth = 0xFFFF; blth; blth-- )
		;

	while (len --)
//	for( blth = len - 0x46; blth; blth-- )
	{
		*Vport	=	*buf_after_decompress++;
	}

	Iop2  = (UCHAR*)UOP2;
	*Iop2 = 0x1;   // send a high level to pin /AC

	for (blth = 0x100; blth; blth--)
		;
}

void ConverseInt(UINT32 *pSourceInt, UINT16 nByteCount)
{
	char acTempStr[4];
	char* pTempStr;

	pTempStr = (char*)pSourceInt;
	if (nByteCount == 2)
	{
		memcpy(acTempStr, pTempStr, 2);
		pTempStr[0] = acTempStr[1];
		pTempStr[1] = acTempStr[0];
	}
	else
	{
		memcpy(acTempStr, pTempStr, 4);
		pTempStr[0] = acTempStr[3];
		pTempStr[1] = acTempStr[2];
		pTempStr[2] = acTempStr[1];
		pTempStr[3] = acTempStr[0];
	}
	return;
}

long HuffmanDecompress(unsigned char * pOutData, unsigned char *pInData, long InLen)
{	
	short           decomp_tree[512];
	unsigned short  code[256];
	unsigned long   file_size;
	unsigned char   code_length[256];

	unsigned long		ulOutLen = 0;

	memcpy( &ulOutLen, pInData, sizeof(long) );
	ConverseInt(&ulOutLen, 4);
	memcpy(code, (pInData + 4), 512 );
	for (int i = 0; i < 256; i ++)
	{
		ConverseInt((unsigned long*)(&(code[i])), 2);
	}
	memcpy( code_length, (pInData + 516), 256 );

	memset( pOutData, 0, ulOutLen );
	unsigned char * pNewOutData = pOutData;

	register unsigned short  loop1;
	register unsigned short  current_index;

	unsigned short  loop;
	unsigned short  current_node = 1;


	//
	memset( decomp_tree, 0 ,1024);
	decomp_tree[1] = 1;

	for (loop = 0; loop < 256; loop++)
	{
		if (code_length[loop])
		{
			current_index = 1;
			for (loop1 = code_length[loop] - 1; loop1 > 0; loop1--)
			{
				current_index = (decomp_tree[current_index] << 1) +
					((code[loop] >> loop1) & 1);
				if (!(decomp_tree[current_index]))
					decomp_tree[current_index] = ++current_node;
			}
			decomp_tree[(decomp_tree[current_index] << 1) +
				(code[loop] & 1)] = -loop;
		}
	}

	//
	register unsigned short  cindex = 1;

	register short           bitshift;

	unsigned long  charcount = 0L;

	unsigned char curchar;
	file_size = ulOutLen;
	unsigned char * ucTemp = (unsigned char * )(pInData + 772);
	while (charcount < file_size)
	{
		//curchar = (char) getc (ifile);
		curchar = *(ucTemp++);

		for (bitshift = 7; bitshift >= 0; --bitshift)
		{
			cindex = (cindex << 1) + ((curchar >> bitshift) & 1);

			if (decomp_tree[cindex] <= 0)
			{
				//putc ((int) (-decomp_tree[cindex]), ofile);
				*(pNewOutData++) = (int) (-decomp_tree[cindex]);

				if ((++charcount) == file_size)
					bitshift = 0;
				else
					cindex = 1;
			}
			else
				cindex = decomp_tree[cindex];
		}
	}

	return file_size;
}

⌨️ 快捷键说明

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