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

📄 nvrambuild.cpp

📁 The PCI Local bus concept was developed to break the PC data I/O bottleneck and clearly opens the d
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// NVRAMBuild.cpp : implementation file
//

#include "stdafx.h"
#include "AMCCPCI3Win.h"

#include "..\samplib\samplib.h"

#include "AMCCPCI3WinDlg.h"
#include "NVRAMBuild.h"

#include "StdPCIParams.h"
#include "SaveRestore.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

static char sztemp[4096];
static char sztemp1[4096];
static char sztemp2[256];
static char sztemp3[256];

static char gheading[128];

static int NVRAM_Size[7] = {
	256, 512, 128, 256, 512, 1024, 2048
};

/////////////////////////////////////////////////////////////////////////////
// CNVRAMBuild dialog


CNVRAMBuild::CNVRAMBuild(CWnd* pParent /*=NULL*/)
	: CDialog(CNVRAMBuild::IDD, pParent)
{
	//{{AFX_DATA_INIT(CNVRAMBuild)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT

	pMain = NULL;

}


void CNVRAMBuild::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CNVRAMBuild)
		// NOTE: the ClassWizard will add DDX and DDV calls here

	DDX_Control(pDX, IDC_GRID1, m_GridControl);

	DDX_Control(pDX, IDC_EDIT_CURRENT_FILE_NAME, m_Edit_CURRENT_FILE_NAME );
	DDX_Control(pDX, IDC_EDIT_CURRENT_FILE_NAME_WRITE, m_Edit_CURRENT_FILE_NAME_WRITE );

	DDX_Control(pDX, IDC_COMBO_FILE_NAMES, m_Combo_FILE_NAMES );
	
	DDX_Control(pDX, IDC_HEX, m_Radio_HEX );
	DDX_Control(pDX, IDC_DECIMAL, m_Radio_DECIMAL );
	DDX_Control(pDX, IDC_BINARY, m_Radio_BINARY );

	DDX_Control(pDX, IDC_COMBO_NVRAM_TYPE, m_Combo_NVRAM_TYPE );
	
	DDX_Control(pDX, IDC_CHECK_READ_INTEL_HEX, m_Check_READ_INTEL_HEX );
	DDX_Control(pDX, IDC_CHECK_READ_MERGE, m_Check_READ_MERGE );
	DDX_Control(pDX, IDC_CHECK_WRITE_INTEL_HEX, m_Check_WRITE_INTEL_HEX );

	DDX_Control(pDX, IDC_EDIT_ADDRESS, m_Edit_ADDRESS );
	DDX_Control(pDX, IDC_EDIT_DATA, m_Edit_DATA );

	DDX_Control(pDX, IDC_STATIC_ADDR_BASE, m_Static_ADDR_BASE );
	DDX_Control(pDX, IDC_STATIC_DATA_BASE, m_Static_DATA_BASE );
	
	DDX_Control(pDX, IDC_BUTTON_PCI_PARAMETERS, m_Button_PCI_PARAMETERS );
	DDX_Control(pDX, IDC_BUTTON_UPDATE_DATA, m_Button_UPDATE_DATA );
	DDX_Control(pDX, IDC_BUTTON_ZERO_DATA, m_Button_ZERO_DATA );
	DDX_Control(pDX, IDC_BUTTON_WRITE_TO_NVRAM, m_Button_WRITE_TO_NVRAM );
	DDX_Control(pDX, IDC_BUTTON_READ_FROM_NVRAM, m_Button_READ_FROM_NVRAM );
	DDX_Control(pDX, IDC_BUTTON_CHECKSUM_GRID_DATA, m_Button_CHECKSUM_GRID_DATA );
	DDX_Control(pDX, IDC_BUTTON_WRITE_NVRAM, m_Button_WRITE_NVRAM );
	DDX_Control(pDX, IDC_BUTTON_REREAD, m_Button_REREAD );

	DDX_Control(pDX, IDC_CHECK_ADDR_AS_BASE, m_Check_ADDR_AS_BASE );

	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CNVRAMBuild, CDialog)
	//{{AFX_MSG_MAP(CNVRAMBuild)
	ON_BN_CLICKED(IDC_BUTTON_BROWSE, OnButtonBrowse)
	ON_BN_CLICKED(IDC_HEX, OnHex)
	ON_BN_CLICKED(IDC_DECIMAL, OnDecimal)
	ON_BN_CLICKED(IDC_BINARY, OnBinary)
	ON_WM_HSCROLL()
	ON_WM_VSCROLL()
	ON_BN_CLICKED(IDC_BUTTON_REREAD, OnButtonReread)
	ON_BN_CLICKED(IDC_BUTTON_ZERO_DATA, OnButtonZeroData)
	ON_BN_CLICKED(IDC_BUTTON_UPDATE_DATA, OnButtonUpdateData)
	ON_BN_CLICKED(IDC_BUTTON_WRITE_NVRAM, OnButtonWriteNvram)
	ON_BN_CLICKED(IDC_BUTTON_LOAD_FILE, OnButtonLoadFile)
	ON_BN_CLICKED(IDC_BUTTON_WRITE_FILE, OnButtonWriteFile)
	ON_BN_CLICKED(IDC_BUTTON_BROWSE_WRITE, OnButtonBrowseWrite)
	ON_BN_CLICKED(IDC_BUTTON_WRITE_TO_NVRAM, OnButtonWriteToNvram)
	ON_BN_CLICKED(IDC_BUTTON_READ_FROM_NVRAM, OnButtonReadFromNvram)
	ON_BN_CLICKED(IDC_BUTTON_CHECKSUM_GRID_DATA, OnButtonChecksumGridData)
	ON_BN_CLICKED(IDC_BUTTON_PCI_PARAMETERS, OnButtonPciParameters)
	ON_BN_CLICKED(IDC_BUTTON_PLUS_ONE, OnButtonPlusOne)
	ON_BN_CLICKED(IDC_BUTTON_MINUS_ONE, OnButtonMinusOne)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CNVRAMBuild::Initialize(CAMCCPCI3WinDlg *caller, int board )
{

	int i;

	pMain = caller;
	cur_board = board;

	strcpy( (char *)&sztemp, APP_NAME );
	strcat( (char *)&sztemp, " - NVRAM Tool, " );
	sprintf( (char *)&sztemp2,"Board %d", cur_board );
	strcat( (char *)&sztemp, (char *)&sztemp2 );
	SetWindowText( (char *)&sztemp );
	strcpy( gheading, sztemp );

	for( i=0 ; i < MAX_DATA_BUFFER ; i++ )
		data_bytes[i] = i;

	m_Combo_FILE_NAMES.ResetContent();

	grid_overhead_flag = FALSE;

	pGridMethods = NULL;
	pStdPCIParams = NULL;

	data_dirty = FALSE;

	num_data_bytes = 0;
	offset_data_bytes = 0;
	file_byte_size = 0;

	m_Combo_NVRAM_TYPE.ResetContent();
	m_Combo_NVRAM_TYPE.AddString( "Parallel AT29C256 (256 Bytes)" );
	m_Combo_NVRAM_TYPE.AddString( "Parallel AT29C512 (512 Bytes)" );
	m_Combo_NVRAM_TYPE.AddString( "Serial 24C01 (128 Bytes)" );
	m_Combo_NVRAM_TYPE.AddString( "Serial 24C02 (256 Bytes)" );
	m_Combo_NVRAM_TYPE.AddString( "Serial 24C04 (512 Bytes)" );
	m_Combo_NVRAM_TYPE.AddString( "Serial 24C08 (1024 Bytes)" );
	m_Combo_NVRAM_TYPE.AddString( "Serial 24C16 (2048 Bytes)" );
	m_Combo_NVRAM_TYPE.SetCurSel( 6 );

	m_Check_READ_INTEL_HEX.SetCheck( TRUE );
	m_Check_READ_MERGE.SetCheck( FALSE );
	m_Check_WRITE_INTEL_HEX.SetCheck( TRUE );

	ReadData();

	num_base = 16;
	old_num_base = 16;
	OnHex();

//	SetupDataGrid();
//	DrawDataValues();

}

void CNVRAMBuild::TestError( UINT32 code )
{
	if( code != e_Err_NoError ) {
		pMain->TestErrorString( code, sztemp, sztemp2 );
		MessageBox( sztemp, sztemp2, MB_OK | MB_ICONSTOP );
	}
}

void CNVRAMBuild::DisableAll(void)
{

	if( pStdPCIParams == NULL )
		m_Button_PCI_PARAMETERS.EnableWindow( FALSE );
	m_Button_UPDATE_DATA.EnableWindow( FALSE );
	m_Button_ZERO_DATA.EnableWindow( FALSE );
	m_Button_WRITE_TO_NVRAM.EnableWindow( FALSE );
	m_Button_READ_FROM_NVRAM.EnableWindow( FALSE );
	m_Button_CHECKSUM_GRID_DATA.EnableWindow( FALSE );
	m_Button_WRITE_NVRAM.EnableWindow( FALSE );
	m_Button_REREAD.EnableWindow( FALSE );

}

void CNVRAMBuild::EnableAll(void)
{

	if( pStdPCIParams == NULL )
		m_Button_PCI_PARAMETERS.EnableWindow( TRUE );
	m_Button_UPDATE_DATA.EnableWindow( TRUE );
	m_Button_ZERO_DATA.EnableWindow( TRUE );
	m_Button_WRITE_TO_NVRAM.EnableWindow( TRUE );
	m_Button_READ_FROM_NVRAM.EnableWindow( TRUE );
	m_Button_CHECKSUM_GRID_DATA.EnableWindow( TRUE );
	m_Button_WRITE_NVRAM.EnableWindow( TRUE );
	m_Button_REREAD.EnableWindow( TRUE );

}

void CNVRAMBuild::ReadData(void)
{

	int i;
	UINT32 ret,rdata;

	i = m_Combo_NVRAM_TYPE.GetCurSel();
	num_data_bytes = NVRAM_Size[i];

	if( cur_board < 0 ) {
		for( i=0 ; i < num_data_bytes ; i++ )
			data_bytes[i] = 0;
		return;
	}

	for( i=0 ; i < num_data_bytes ; i++ ) {
		ret = Sample_ReadNVRAM( cur_board, (UINT32) i, (UINT32 *)&rdata );
		TestError( ret );
		if( ret == e_Err_NoError ) {
			data_bytes[i] = rdata;
		}
	}

}

void CNVRAMBuild::WriteData(void)
{

	int i;
	UINT32 ret,wdata;

	i = m_Combo_NVRAM_TYPE.GetCurSel();
	num_data_bytes = NVRAM_Size[i];

	if( cur_board < 0 )
		return;

	for( i=0 ; i < num_data_bytes ; i++ ) {
		wdata = wdata_bytes[i];
		ret = Sample_WriteNVRAM( cur_board, (UINT32) i, (UINT32 *)&wdata );
		TestError( ret );
	}

}

bool CNVRAMBuild::CompareData(void)
{

	int i;
	bool eflag;

	i = m_Combo_NVRAM_TYPE.GetCurSel();
	num_data_bytes = NVRAM_Size[i];

	if( cur_board < 0 )
		return FALSE;

	eflag = FALSE;
	for( i=0 ; i < num_data_bytes ; i++ ) {
		if( data_bytes[i] != wdata_bytes[i] ) {
			sprintf( sztemp2,"Compare of Write/Read Data Failed!\n\nAddr: %04x Was: %02x S/B %02x",
				i, data_bytes[i], wdata_bytes[i] );
			MessageBox( sztemp2,gheading,MB_OK | MB_ICONSTOP );
			eflag = TRUE;
			break;
		}
	}

	if( !eflag )
		MessageBox( "NVRAM Data Write OK!",gheading,MB_OK | MB_ICONEXCLAMATION );
	else
		MessageBox( "NVRAM Data Write Failed!",gheading,MB_OK | MB_ICONSTOP );

	return eflag;

}

void CNVRAMBuild::ZeroData(void) 
{
	// TODO: Add your control notification handler code here
	int i;

	i = m_Combo_NVRAM_TYPE.GetCurSel();
	num_data_bytes = NVRAM_Size[i];

	for( i=0 ; i < num_data_bytes ; i++ ) {
		data_bytes[i] = 0;
	}
	
}

void CNVRAMBuild::DisplayData(void)
{

	DrawDataValues();
}

void CNVRAMBuild::AddDisplayString( char *stri, char *stro, int size_stro )
{

	int cnt;

	cnt = strlen( stri ) + strlen( stro );

	if( cnt <= (size_stro-2) )
		strcat( stro, stri );

}

void CNVRAMBuild::SetupDataGrid( void ) 
{

	int i,addr;								// Counter variable
	char szTemp[256];

	grid_overhead_flag = TRUE;

	if( pGridMethods == NULL )
		pGridMethods = new CGridMethods();

	// Calculate the rows and columns
	switch( num_base ) {
	case 2:
		num_cols = 8;
		col_width = 1100;
		break;
	case 10:
		num_cols = 10;
		col_width = 525;
		break;
	default:
	case 16:
		num_cols = 16;
		col_width = 400;
		break;
	}

	num_data_rows = num_data_bytes / num_cols;
	if( (num_data_rows * num_cols) != num_data_bytes )
		num_data_rows++;
	num_rows = num_data_rows;

	if( num_rows < MIN_DATA_ROWS )
		num_rows = MIN_DATA_ROWS;

	//////////////////////////////////////
	// Define the columns and rows
	//////////////////////////////////////
	pGridMethods->bInitializeGrid(&m_GridControl, num_rows+1, num_cols+2, 1, 1 );

	//////////////////////////////////////
	// Display upper,left box
	//////////////////////////////////////
	switch( num_base ) {
	case 2:
		//pGridMethods->bSetColumnHeadingString(&m_GridControl, 0, "Addr (Bin)");
		pGridMethods->bSetColumnHeadingString(&m_GridControl, 0, "Addr (Hex)");
		break;
	case 10:
		pGridMethods->bSetColumnHeadingString(&m_GridControl, 0, "Addr");
		break;
	default:
	case 16:
		pGridMethods->bSetColumnHeadingString(&m_GridControl, 0, "Addr");
		break;
	}

	//////////////////////////////////////
	// Display column headings
	//////////////////////////////////////
	for( i=1 ; i <= num_cols ; i++ ) {
		switch( num_base ) {
		//case 2:
		//	pMain->ConvertNumberToString( i-1, 4, num_base, (char *)szTemp );
		//	//sprintf( szTemp, "%x", i-1 );
		//	break;
		case 10:
			sprintf( szTemp, "%d", i-1 );
			break;
		default:
		case 16:
			sprintf( szTemp, "%x",i-1 );
			break;
		}

		pGridMethods->bSetColumnHeadingString(&m_GridControl, i, szTemp );
	}
	pGridMethods->bSetColumnHeadingString(&m_GridControl, i, "Text" );

	//////////////////////////////////////
	// Display row headings
	//////////////////////////////////////
	addr = offset_data_bytes;
	for( i=1 ; i <= num_data_rows ; i++ ) {
		switch( num_base ) {
		//case 2:
		//	pMain->ConvertNumberToString( addr, 8, num_base, (char *)szTemp );
		//	//sprintf( szTemp, "%x", i-1 );
		//	break;
		case 10:
			sprintf( szTemp, "%d", addr );
			break;
		default:
		case 16:
			if( (addr & 0xffff0000) == 0 )
				sprintf( szTemp, "%04x",addr );
			else {
				if( (addr & 0xfff00000) == 0 )
					sprintf( szTemp, "%05x",addr );
				else {
					if( (addr & 0xff000000) == 0 )
						sprintf( szTemp, "%06x",addr );
					else {
						if( (addr & 0xf0000000) == 0 )
							sprintf( szTemp, "%07x",addr );
						else
							sprintf( szTemp, "%08x",addr );
					}
				}
			}
			break;
		}

		pGridMethods->bSetRowHeadingString(&m_GridControl, i, szTemp );
		addr += num_cols;
	}

	// If there are more rows on display than we are actually using, 
	// blank out the remaining ones.
	if( num_data_rows != num_rows ) {
		for( i=num_data_rows+1 ; i <= num_rows ; i++ )
			pGridMethods->bSetRowHeadingString(&m_GridControl, i, "" );
	}

	//////////////////////////////////////
	// Define widths of each column
	//////////////////////////////////////
	// Left most column (addr)
	m_GridControl.SetColWidth(0, 800);

	// All data columns
	for( i=1 ; i <= num_cols ; i++ ) {
		m_GridControl.SetColWidth(i, col_width );
	}

	// Text mapping column width
	switch( num_base ) {
	case 2:
		m_GridControl.SetColWidth(i, 1100 );
		break;
	case 10:
		m_GridControl.SetColWidth(i, 4570 );
		break;
	default:
	case 16:
		m_GridControl.SetColWidth(i, 3250 );
		break;
	}

	grid_overhead_flag = TRUE;

}

void CNVRAMBuild::SetupEditData(void) 
{
	// TODO: Add your control notification handler code here
	int addr,data;
	int tbase;

	m_Edit_ADDRESS.GetWindowText( (LPSTR) &sztemp2, sizeof( sztemp2 ) - 1 ); 

	m_Edit_DATA.GetWindowText( (LPSTR) &sztemp3, sizeof( sztemp3 ) - 1 ); 
	
	tbase = old_num_base;

	if( strlen( sztemp2 ) ) {

		switch( old_num_base ) {
		case 2:
			tbase = 16;
		case 16:
		case 10:
			addr = pMain->ConvertStringToNumber( tbase, (char *) &sztemp2 );
			break;
		default:
			return;
		}

		tbase = num_base;

		switch( num_base ) {
		case 2:
			tbase = 16;
		case 16:
		case 10:
			pMain->ConvertNumberToString( addr, 0, tbase, (char *)sztemp2 );
			break;
		default:
			return;
		}

		m_Edit_ADDRESS.SetWindowText( (LPSTR) &sztemp2 ); 
	}


	if( strlen( sztemp3 ) ) {
		switch( old_num_base ) {
		case 2:
		case 16:
		case 10:
			data = pMain->ConvertStringToNumber( old_num_base, (char *) &sztemp3 );
			break;
		default:
			return;
		}

		switch( num_base ) {
		case 2:
		case 16:
		case 10:
			pMain->ConvertNumberToString( data, 0, num_base, (char *)sztemp3 );
			break;
		default:
			return;
		}

		m_Edit_DATA.SetWindowText( (LPSTR) &sztemp3 ); 

	}

}

void CNVRAMBuild::DrawDataValues( void ) 
{

	short i,j,in;								// Counter variable
	char szTemp[256];
	char szTemp2[32];
	int chindex;

	grid_overhead_flag = TRUE;

	if( pGridMethods == NULL )
		return;

	if( num_data_bytes == 0 )
		return;

⌨️ 快捷键说明

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