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

📄 pagedebug.cpp

📁 PCI的一个测试程序,可以测试PCI driver和BOARD的功能.
💻 CPP
字号:
// PageDebug.cpp : 实现文件
//

#include "stdafx.h"
#include "PCIEBoardTest.h"
#include "testfunc.h"
#include "PageDevice.h"

#include "Pagedebug.h"
#include "Pagetest.h"
#include "PageChart.h"
#include "PCIEBoardTestDlg.h"
#include "DlgInput2.h"


// CPageDebug 对话框

IMPLEMENT_DYNAMIC(CPageDebug, CDialog)
CPageDebug::CPageDebug(CWnd* pParent /*=NULL*/)
	: CDialog(CPageDebug::IDD, pParent)
    , m_strDMABuffer1(_T(""))
    , m_strDMABuffer2(_T(""))
    , m_strDMABufferInfor1(_T(""))
    , m_strDMABufferInfor2(_T(""))
    , m_strDMABufferAddress1(_T(""))
    , m_strDMABufferAddress2(_T(""))
    , m_strDMABufferData1(_T(""))
    , m_strDMABufferData2(_T(""))
    , m_strREGBufferInfor(_T(""))
    , m_strREGAddress(_T(""))
    , m_strREGData(_T(""))
{
}

CPageDebug::~CPageDebug()
{
}

void CPageDebug::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_EDIT_DMA_BUFFER1, m_strDMABuffer1);
    DDX_Text(pDX, IDC_EDIT_DMA_BUFFER2, m_strDMABuffer2);
    DDX_Control(pDX, IDC_LIST_REGS, m_lbREGs);
    DDX_Text(pDX, IDC_STATIC_BUFFER1_INFOR, m_strDMABufferInfor1);
    DDX_Text(pDX, IDC_STATIC_BUFFER2_INFOR, m_strDMABufferInfor2);
    DDX_Text(pDX, IDC_EDIT_ADDRESS1, m_strDMABufferAddress1);
    DDX_Text(pDX, IDC_EDIT_ADDRESS2, m_strDMABufferAddress2);
    DDX_Text(pDX, IDC_EDIT_DATA1, m_strDMABufferData1);
    DDX_Text(pDX, IDC_EDIT_DATA2, m_strDMABufferData2);
    DDX_Text(pDX, IDC_STATIC_REGBUFFER_INFOR, m_strREGBufferInfor);
    DDX_Text(pDX, IDC_EDIT_REGADDRESS, m_strREGAddress);
    DDX_Text(pDX, IDC_EDIT_REGDATA, m_strREGData);
}


BEGIN_MESSAGE_MAP(CPageDebug, CDialog)
    ON_WM_CREATE()
    ON_BN_CLICKED(IDC_BTN_REFRESH_DMA_BUFFER1, OnBnClickedBtnRefreshDmaBuffer1)
    ON_BN_CLICKED(IDC_BTN_REFRESH_DMA_BUFFER2, OnBnClickedBtnRefreshDmaBuffer2)
    ON_BN_CLICKED(IDC_BTN_WRITE_DMABUFFER_1, OnBnClickedBtnWriteDmabuffer1)
    ON_BN_CLICKED(IDC_BTN_WRITE_DMABUFFER_2, OnBnClickedBtnWriteDmabuffer2)
    ON_BN_CLICKED(IDC_BTN_WRITE_REGBUFFER, OnBnClickedBtnWriteRegbuffer)
    ON_BN_CLICKED(IDC_BTN_REFRESH_REG, OnBnClickedBtnRefreshReg)
    ON_WM_SIZE()
END_MESSAGE_MAP()


// CPageDebug 消息处理程序

void CPageDebug::OnBnClickedCancel()
{
    // TODO: 在此添加控件通知处理程序代码
//    OnCancel();
}


int CPageDebug::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CDialog::OnCreate(lpCreateStruct) == -1)
        return -1;

    // TODO:  /r(0, 100, NULL);
    return 0;
}


void CPageDebug::OnBnClickedBtnRefreshDmaBuffer1()
{
    // TODO: 在此添加控件通知处理程序代码
    CombineHex2Str((BYTE *)(GetDlg()->GetUserVirtualBuffer_h2d()), MIN(GetDlg()->GetUserVirtualBufferLen_h2d(), MAX_DMA_BUFFER_VIEWLEN), m_strDMABuffer1);
    
    m_strDMABufferInfor1.Format("Phy Addr: 0x%08X   Virtual: 0x%08X", GetDlg()->GetPhysicalBuffer_h2d(), GetDlg()->GetUserVirtualBuffer_h2d());
    UpdateData(FALSE);
}

void CPageDebug::OnBnClickedBtnRefreshDmaBuffer2()
{
    // TODO: 在此添加控件通知处理程序代码
    CombineHex2Str((BYTE *)(GetDlg()->GetUserVirtualBuffer_d2h()), MIN(GetDlg()->GetUserVirtualBufferLen_d2h(), MAX_DMA_BUFFER_VIEWLEN), m_strDMABuffer2);
    
    m_strDMABufferInfor2.Format("Phy Addr: 0x%08X   Virtual: 0x%08X", GetDlg()->GetPhysicalBuffer_d2h(), GetDlg()->GetUserVirtualBuffer_d2h());
    UpdateData(FALSE);
}

void CPageDebug::CombineHex2Str(BYTE * p_pHexData, int p_iDataLen, CString& p_strInfor)
{
    char *pBuffer;
    char *p;
    int   size = (9 + 48 + 2 + 2) * (p_iDataLen/16 + 1);

    if (p_iDataLen <= 0 || !p_pHexData)
    {
        p_strInfor = "00000000:";
        return;
    }

    pBuffer = new char[size + 1];

    if (pBuffer)
    {
        p = pBuffer;

        for(int i=0; i<p_iDataLen; ++i)
        {
            if ((i & 0x0F) == 0)
            {
                if(i)
                {
                    *p++ = 0x0d;
                    *p++ = 0x0a;
                }

                p += sprintf(p, "%08X:", i);
            }

            if ((i & 0x0F) == 8)
            {
                *p++ = ' ';
                *p++ = '-';
            }

            p += sprintf(p, " %02X", p_pHexData[i]);
        }

        *p = 0;
        p_strInfor = pBuffer;

        delete[] pBuffer;
    }
    else
    {
        p_strInfor = "00000000:";
    }    
}



void CPageDebug::OnBnClickedBtnWriteDmabuffer1()
{
    // TODO: 在此添加控件通知处理程序代码
    // 需要输入:地址、数据
    UpdateData();

    int     i;

    ULONG   uAddr = 0;
    ULONG   uData = 0;

	if (m_strDMABufferAddress1.GetLength() == 0)
	{
		MessageBox("Must Input Address!");
		GetDlgItem(IDC_EDIT_ADDRESS1)->SetFocus();
		return;
	}

	if (m_strDMABufferData1.GetLength() == 0)
	{
		MessageBox("Must Input Data!");
		GetDlgItem(IDC_EDIT_DATA1)->SetFocus();
		return;
	}

    for(i=0; i<m_strDMABufferAddress1.GetLength(); ++i)
    {
        char ch = m_strDMABufferAddress1.GetAt(i);

        if (ch >= '0' && ch <= '9')
        {
            uAddr <<= 0x04;
            uAddr += ch - '0';
        }
        else if (ch >= 'a' && ch <= 'f')
        {
            uAddr <<= 0x04;
            uAddr += ch - 'a' + 10;
        }
        else if(ch >= 'A' && ch <= 'F')
        {
            uAddr <<= 0x04;
            uAddr += ch - 'A' + 10;
        }
        else
        {
            MessageBox("Must Input HEX data!");
            GetDlgItem(IDC_EDIT_ADDRESS1)->SetFocus();
            return;
        }
    }


    uData = 0;
    for(i=0; i<m_strDMABufferData1.GetLength(); ++i)
    {
        char ch = m_strDMABufferData1.GetAt(i);

        if (ch >= '0' && ch <= '9')
        {
            uData <<= 0x04;
            uData += ch - '0';
        }
        else if (ch >= 'a' && ch <= 'f')
        {
            uData <<= 0x04;
            uData += ch - 'a' + 10;
        }
        else if(ch >= 'A' && ch <= 'F')
        {
            uData <<= 0x04;
            uData += ch - 'A' + 10;
        }
        else
        {
            MessageBox("Must Input HEX data!");
            GetDlgItem(IDC_EDIT_DATA1)->SetFocus();
            return;
        }
    }

    if (uAddr >= GetDlg()->GetUserVirtualBufferLen_h2d())
    {
        CString strInfor;
        strInfor.Format("Address Overflow! MAX 0x%08X!", GetDlg()->GetUserVirtualBufferLen_h2d());
        MessageBox(strInfor);
        GetDlgItem(IDC_EDIT_ADDRESS1)->SetFocus();
        return;
    }

    if (uAddr & 0x03)
    {
        MessageBox("Addr must align32!");
        GetDlgItem(IDC_EDIT_ADDRESS1)->SetFocus();
        return;
    }



    //write
    *(PULONG)((PUCHAR)GetDlg()->GetUserVirtualBuffer_h2d() + uAddr) = uData;

    if (MessageBox("Write DMA Buffer for Host2Dev?", "", MB_YESNO | MB_DEFBUTTON2) == IDYES)
    {
        OnBnClickedBtnRefreshDmaBuffer1();
    }

    return;
}

void CPageDebug::OnBnClickedBtnWriteDmabuffer2()
{
    // TODO: 在此添加控件通知处理程序代码
    // 需要输入:地址、数据
    UpdateData();

    int     i;

    ULONG   uAddr = 0;
    ULONG   uData = 0;

	if (m_strDMABufferAddress2.GetLength() == 0)
	{
		MessageBox("Must Input Address!");
		GetDlgItem(IDC_EDIT_ADDRESS2)->SetFocus();
		return;
	}

	if (m_strDMABufferData2.GetLength() == 0)
	{
		MessageBox("Must Input Data!");
		GetDlgItem(IDC_EDIT_DATA2)->SetFocus();
		return;
	}

    for(i=0; i<m_strDMABufferAddress2.GetLength(); ++i)
    {
        char ch = m_strDMABufferAddress2.GetAt(i);

        if (ch >= '0' && ch <= '9')
        {
            uAddr <<= 0x04;
            uAddr += ch - '0';
        }
        else if (ch >= 'a' && ch <= 'f')
        {
            uAddr <<= 0x04;
            uAddr += ch - 'a' + 10;
        }
        else if(ch >= 'A' && ch <= 'F')
        {
            uAddr <<= 0x04;
            uAddr += ch - 'A' + 10;
        }
        else
        {
            MessageBox("Must Input HEX data!");
            GetDlgItem(IDC_EDIT_ADDRESS2)->SetFocus();
            return;
        }
    }


    uData = 0;
    for(i=0; i<m_strDMABufferData2.GetLength(); ++i)
    {
        char ch = m_strDMABufferData2.GetAt(i);

        if (ch >= '0' && ch <= '9')
        {
            uData <<= 0x04;
            uData += ch - '0';
        }
        else if (ch >= 'a' && ch <= 'f')
        {
            uData <<= 0x04;
            uData += ch - 'a' + 10;
        }
        else if(ch >= 'A' && ch <= 'F')
        {
            uData <<= 0x04;
            uData += ch - 'A' + 10;
        }
        else
        {
            MessageBox("Must Input HEX data!");
            GetDlgItem(IDC_EDIT_DATA2)->SetFocus();
            return;
        }
    }

    if (uAddr >= GetDlg()->GetUserVirtualBufferLen_d2h())
    {
        CString strInfor;
        strInfor.Format("Address Overflow! MAX 0x%08X!", GetDlg()->GetUserVirtualBufferLen_d2h());
        MessageBox(strInfor);
        GetDlgItem(IDC_EDIT_ADDRESS2)->SetFocus();
        return;
    }

    if (uAddr & 0x03)
    {
        MessageBox("Addr must align32!");
        GetDlgItem(IDC_EDIT_ADDRESS2)->SetFocus();
        return;
    }


    //write
    *(PULONG)((PUCHAR)GetDlg()->GetUserVirtualBuffer_d2h() + uAddr) = uData;

    if (MessageBox("Refresh DMA Buffer for Dev2Host?", "", MB_YESNO | MB_DEFBUTTON2) == IDYES)
    {
        OnBnClickedBtnRefreshDmaBuffer2();
    }

    return;
}

void CPageDebug::OnBnClickedBtnWriteRegbuffer()
{
    // TODO: 在此添加控件通知处理程序代码
    // 需要输入:地址、数据
    ULONG   uBuffer[3];
    Test_GetRegAddress(GetDlg()->GetDeviceHandle(), uBuffer);

    ULONG   uREGLen = uBuffer[2];
    
    UpdateData();

    int     i;

    ULONG   uAddr = 0;
    ULONG   uData = 0;

    for(i=0; i<m_strREGAddress.GetLength(); ++i)
    {
        char ch = m_strREGAddress.GetAt(i);

        if (ch >= '0' && ch <= '9')
        {
            uAddr <<= 0x04;
            uAddr += ch - '0';
        }
        else if (ch >= 'a' && ch <= 'f')
        {
            uAddr <<= 0x04;
            uAddr += ch - 'a' + 10;
        }
        else if(ch >= 'A' && ch <= 'F')
        {
            uAddr <<= 0x04;
            uAddr += ch - 'A' + 10;
        }
        else
        {
            MessageBox("Must Input HEX data!");
            GetDlgItem(IDC_EDIT_REGADDRESS)->SetFocus();
            return;
        }
    }


    uData = 0;
    for(i=0; i<m_strREGData.GetLength(); ++i)
    {
        char ch = m_strREGData.GetAt(i);

        if (ch >= '0' && ch <= '9')
        {
            uData <<= 0x04;
            uData += ch - '0';
        }
        else if (ch >= 'a' && ch <= 'f')
        {
            uData <<= 0x04;
            uData += ch - 'a' + 10;
        }
        else if(ch >= 'A' && ch <= 'F')
        {
            uData <<= 0x04;
            uData += ch - 'A' + 10;
        }
        else
        {
            MessageBox("Must Input HEX data!");
            GetDlgItem(IDC_EDIT_REGDATA)->SetFocus();
            return;
        }
    }

    if (uAddr >= uREGLen)
    {
        CString strInfor;
        strInfor.Format("Address Overflow! MAX 0x%08X!", uREGLen);
        MessageBox(strInfor);
        GetDlgItem(IDC_EDIT_REGADDRESS)->SetFocus();
        return;
    }

    if (uAddr & 0x03)
    {
        MessageBox("Addr must align32!");
        GetDlgItem(IDC_EDIT_REGADDRESS)->SetFocus();
        return;
    }


    //write
    if (Test_WriteREG(GetDlg()->GetDeviceHandle(), uAddr, uData))
    {
        MessageBox("Write REG OK!");
    }
    else
    {
        MessageBox("Write REG Failed!");
    }


    return;
}

void CPageDebug::OnBnClickedBtnRefreshReg()
{
    // TODO: 在此添加控件通知处理程序代码
    ULONG   uBuffer[3];

    Test_GetRegAddress(GetDlg()->GetDeviceHandle(), uBuffer);
    m_strREGBufferInfor.Format("Physical Addr: 0x%08X\nLogical  Addr: 0x%08X\n          Len: 0x%08X bytes", uBuffer[0], uBuffer[1], uBuffer[2]);

    UpdateData(FALSE);

    ULONG   uData;

    CString strTemp;
    m_lbREGs.ResetContent();

    // 最多显示16K
    for(int i=0; i<16 * 1024 / sizeof(ULONG); ++i)
    {
        if (Test_ReadREG(GetDlg()->GetDeviceHandle(), i * sizeof(ULONG), uData))
        {
            strTemp.Format("%08X: %08X", i * sizeof(ULONG), uData);

            m_lbREGs.AddString(strTemp);
        }
        else
        {
            break;
        }
    }

}

void CPageDebug::OnSize(UINT nType, int cx, int cy)
{
    CDialog::OnSize(nType, cx, cy);

    // TODO: 在此处添加消息处理程序代码
}



⌨️ 快捷键说明

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