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

📄 rtmdemodlg.cpp

📁 http down source code for driver development programmer
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// RtmDemoDlg.cpp : implementation file
//

#include "stdafx.h"
#include "RtmDemo.h"
#include "RtmDemoDlg.h"

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


/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRtmDemoDlg dialog

CRtmDemoDlg::CRtmDemoDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CRtmDemoDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CRtmDemoDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_dport=_T("0x37a");
	m_aport=_T("0x2f8");
	m_dmask = _T("0x4");
	m_arange = _T("0xffff");
	m_bdbyte = 0;
	m_babyte = 0;
	m_bdoutput = TRUE;
	m_baoutput = TRUE;
	m_dquantum = 500;
	m_aquantum = 500;
	bStartStop = 0;
	m_pciiItem = -1;
	m_resiItem = -1;
	m_tmresolution = 200;
}


void CRtmDemoDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST1, m_listpci);
	DDX_Control(pDX, IDC_LIST2, m_listres);
	DDX_Text(pDX,IDC_DEDIT_PORT,m_dport);
	DDX_Text(pDX,IDC_AEDIT_PORT,m_aport);
	DDX_Text(pDX,IDC_DEDIT_MASK,m_dmask);
	DDX_Text(pDX,IDC_AEDIT_RANGE,m_arange);
	DDX_Text(pDX,IDC_DEDIT_QUANTUM,m_dquantum);
	DDX_Text(pDX,IDC_AEDIT_QUANTUM,m_aquantum);
	DDX_Text(pDX,IDC_RTM_DEBUG,m_bdebug);

	//{{AFX_DATA_MAP(CRtmDemoDlg)
		// NOTE: the ClassWizard will add DDX and DDV calls here
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CRtmDemoDlg, CDialog)
	//{{AFX_MSG_MAP(CRtmDemoDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_EN_CHANGE(IDC_DEDIT_MASK, OnChangeDeditMask)
	ON_BN_CLICKED(IDSTARTTIMER, OnStarttimer)
	ON_BN_CLICKED(IDSTOPTIMER, OnStoptimer)
	ON_BN_CLICKED(IDC_ARADIO_OUTPUT, OnAradioOutput)
	ON_BN_CLICKED(IDC_DRADIO_INPUT, OnDradioInput)
	ON_BN_CLICKED(IDC_DRADIO_OUTPUT, OnDradioOutput)
	ON_BN_CLICKED(IDC_ARADIO_INPUT, OnAradioInput)
	ON_WM_TIMER()
	ON_WM_CLOSE()
	ON_CBN_SELCHANGE(IDC_COMBO_D_SIZE,OnSelDChangeCombo)
	ON_CBN_SELCHANGE(IDC_COMBO_A_SIZE,OnSelAChangeCombo)
	ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1,OnSelChangePCIList)
	ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST2,OnSelChangePCIResList)
	ON_BN_CLICKED(IDC_ABOUT, OnAbout)
	ON_BN_CLICKED(IDC_BUTTON_PCIREAD, OnButtonPciread)
	ON_BN_CLICKED(IDC_BUTTON_PCIWRITE, OnButtonPciwrite)
	ON_BN_CLICKED(IDC_BUTTON_ASSIGN_RES, OnButtonAssignRes)
	ON_BN_CLICKED(IDC_BUTTON_RELEASE, OnButtonReleaseRes)
	ON_BN_CLICKED(IDC_RTM_DEBUG, OnRtmDebug)
	ON_BN_CLICKED(IDC_BUTTON_UPDATEPCI, OnButtonUpdatepci)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


void CRtmDemoDlg::SetCombobox(CComboBox* pBox)
{
	ASSERT(pBox != NULL);
	if (pBox != NULL)
	{
        pBox->AddString(_T("byte"));
        pBox->AddString(_T("word"));
        pBox->AddString(_T("dword"));
        pBox->SetCurSel(0); 
	}

}
/////////////////////////////////////////////////////////////////////////////
// CRtmDemoDlg message handlers
char pcibuff[0x4000] = {0};

BOOL CRtmDemoDlg::OnInitDialog()
{
   int count;
   char buff[10];
   CDialog::OnInitDialog();


        ((CButton *)GetDlgItem(IDC_DRADIO_OUTPUT))->SetCheck(1);
        ((CButton *)GetDlgItem(IDC_ARADIO_OUTPUT))->SetCheck(1);

        ((CButton *)GetDlgItem(IDC_RTM_DEBUG))->SetCheck(0);

         CComboBox* pBox;
          pBox = (CComboBox*) GetDlgItem(IDC_COMBO_D_SIZE);
          SetCombobox(pBox);
          pBox = (CComboBox*) GetDlgItem(IDC_COMBO_A_SIZE);
          SetCombobox(pBox);

         pBox = (CComboBox*) GetDlgItem(IDC_COMBO_RW_SIZE);
         SetCombobox(pBox);


         FillListCtrl();

	
	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}


	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	
          if(RTXEntry(0))
          {
            sprintf(buff,"%d us",GetQuantum());//pfGetQuantum());
            SetDlgItemText(IDC_RTM_TIMER,buff);
            count = ScanPci(pcibuff);
            if(count)
            {
              FillPCI(pcibuff,count);
            }

          }
	  else
         ::MessageBox(NULL,_T("RTM drive is not installed"),_T("RTM"),MB_OK);


         ((CButton *)GetDlgItem(IDSTARTTIMER))->SetFocus();
	
        return FALSE;//TRUE;  // return TRUE  unless you set the focus to a control
}


void CRtmDemoDlg::FillPCI(char *pcib,int count)
{
  int             iItem;
  LV_ITEM         lvItem;
  char buffstr[32];
  PCIINFO  *pci;

        pci = (PCIINFO *)pcib;  
        m_listpci.DeleteAllItems();
        for (iItem = 0; iItem < count; iItem++)
        {

          lvItem.mask = LVIF_TEXT  | LVIF_STATE | LVIF_PARAM;
          lvItem.state = 0;      
          lvItem.stateMask = 0;  
          lvItem.iImage = 0;
          lvItem.lParam = (long)pci;

          lvItem.iItem = iItem;
          lvItem.iSubItem = 0;
          sprintf(buffstr,"%d",pci->bus);
          lvItem.pszText =(LPTSTR)buffstr;
          m_listpci.InsertItem(&lvItem);

          sprintf(buffstr,"%d",pci->slot.u.bits.DeviceNumber);
          m_listpci.SetItemText(iItem, 1,buffstr);

          sprintf(buffstr,"%d",pci->slot.u.bits.FunctionNumber);
          m_listpci.SetItemText(iItem, 2,buffstr);

          sprintf(buffstr,"%x",pci->pcidata.VendorID);
	      m_listpci.SetItemText(iItem, 3,buffstr);
          sprintf(buffstr,"%x",pci->pcidata.DeviceID);
          m_listpci.SetItemText(iItem, 4,buffstr);



            if(!iItem)
            {
                FillPciResource(pci);
                if(pci->pcidata.VendorID ==0x8086)
                PCIButtonEnable(FALSE);
                else
                PCIButtonEnable(TRUE);

             }
		

            pci++;
         }


}


void CRtmDemoDlg::FillPciResource(PCIINFO  *pci)
{
  PPCI_COMMON_CONFIG pciData = &pci->pcidata;
  char buffstr[32];
  unsigned  addr;
  int i = 0;
  int nmax = 0;
  int  nirq =0;
  int       iItem = 0;
  LV_ITEM   lvItem;

           m_listres.DeleteAllItems();
	       
           if(pciData->HeaderType == PCI_DEVICE_TYPE || pciData->HeaderType == PCI_MULTIFUNCTION){
            nmax =  PCI_MAX_BAR;
            nirq = pciData->u.type0.InterruptLine;
          }
          else 
           if(pciData->HeaderType == PCI_BRIDGE_TYPE){
            nirq = pciData->u.type1.InterruptLine;
            nmax = 2;
          } 

          
             for(iItem = 0;iItem<nmax;iItem++)
             {
                 addr = pciData->u.type0.BaseAddresses[iItem];
                 if(!addr) continue;


                 lvItem.mask = LVIF_TEXT | LVIF_STATE | LVIF_PARAM;
                 lvItem.state = 0;      
                 lvItem.stateMask = 0;  
                 lvItem.iImage = 0;
	         lvItem.iItem = i;
                 lvItem.iSubItem = 0;
                 lvItem.pszText =(LPTSTR)"";
                 lvItem.lParam = (long)pciData;
                 m_listres.InsertItem(&lvItem);

                 if((addr & 0x1))
                 {
                    m_listres.SetItemText(i,0,"Port");
                    addr &= 0xfffffffc;
                 }
                 else
                 {
                    m_listres.SetItemText(i,0,"Memory");
                    addr &= 0xfffffff0;
                 }

                   addr &= 0xfffffffe;
                   sprintf(buffstr,"%x",addr);
                   lvItem.pszText =(LPTSTR)buffstr;
                   m_listres.SetItemText(i,1,buffstr);
                   sprintf(buffstr,"%x",pci->BaseAddressesSize[iItem]);
                   lvItem.pszText =(LPTSTR)buffstr;
                   m_listres.SetItemText(i,2,buffstr);
                   i++;
               }

               if(nirq)
               {
                 lvItem.mask = LVIF_TEXT | LVIF_STATE | LVIF_PARAM;
                 lvItem.state = 0;      
                 lvItem.stateMask = 0;  
                 lvItem.iImage = 0;
                 lvItem.iItem = i;
                 lvItem.iSubItem = 0;
                 lvItem.pszText =(LPTSTR)"";
                 lvItem.lParam = (long)pciData;
                  m_listres.InsertItem(&lvItem);
                  m_listres.SetItemText(i,0,"IRQ");

                  m_listres.SetItemText(i,3,buffstr);
                  sprintf(buffstr,"%d",nirq);
                 lvItem.pszText =(LPTSTR)buffstr;
                  m_listres.SetItemText(i,3,buffstr);
                 }

		   	m_listres.UpdateData(TRUE);

}


void CRtmDemoDlg::FillListCtrl()
{
  CRect           rect;
      
	  // insert two columns (REPORT mode) and modify the new header items

       m_listpci.GetWindowRect(&rect);
       m_listpci.InsertColumn(0, _T("Bus"), LVCFMT_LEFT,rect.Width() * 1/7, 0);
       m_listpci.InsertColumn(1, _T("DevNo"), LVCFMT_LEFT,rect.Width() * 1/7, 1);

       m_listpci.InsertColumn(2, _T("Function"), LVCFMT_LEFT,rect.Width() * 1/7, 1);

       m_listpci.InsertColumn(3, _T("VendorID"), LVCFMT_LEFT,rect.Width() * 1/4, 1);

       m_listpci.InsertColumn(4, _T("DeviceID"), LVCFMT_LEFT,rect.Width() * 1/4, 1);

       m_listpci.SetExtendedStyle(LVS_EX_FULLROWSELECT );//| LVS_EX_FLATSB);


       m_listres.GetWindowRect(&rect);

       m_listres.InsertColumn(0, _T("Type"), LVCFMT_LEFT,rect.Width() * 4/18, 0);
       m_listres.InsertColumn(1, _T("Address"), LVCFMT_LEFT,rect.Width() * 4/15, 0);
       m_listres.InsertColumn(2, _T("Size"), LVCFMT_LEFT,rect.Width() * 4/15, 1);
       m_listres.InsertColumn(3, _T("Number"), LVCFMT_LEFT,rect.Width() * 4/23, 0);


       m_listres.SetExtendedStyle(LVS_EX_FULLROWSELECT );//| LVS_EX_FLATSB);

}


void CRtmDemoDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}

⌨️ 快捷键说明

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