📄 fpga.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 + -