|
本帖最后由 lupronoun 于 2012-8-30 00:09 编辑
在做TQ2440 wince 手册 第七章的GPIO口控制程序开发时,出现如附件的问题,好像是C++的问题,本人正在补习中,可能还要一段时间,短时间内无法解决现在的问题,还请高手帮忙看一下,感激,初学者的学习过程真的好痛苦!努力中......赏金不多!
// gpiodriverDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "gpiodriver.h"
#include "gpiodriverDlg.h"
#include "winioctl.h"
#include "stdio.h"
#include "s3c2440a_ioport.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
bool InitializeAddresses(VOID);
BOOL mInitialized;
volatile S3S2440A_IOPORT_REG *v_pIOPregs;
bool InitializeAddresses(VOID)
{
bool RetValue = TRUE;
/* IO Register Allocation */
v_pIOPregs = (volatile S3C2440A_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2440A_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
if (v_pIOPregs == NULL)
{
ERRORMSG(1,(TEXT("For IOPregs : VirtualAlloc faiGPIO!/r/n")));
RetValue = FALSE;
}
else
{
if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(S3C2440A_BASE_REG_PA_IOPORT >> 8),
sizeof (S3C2440A_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
{
ERRORMSG(1,(TEXT("For IOPregs: VirtualCopy faiGPIO!/r/n")));
RetValue = FALSE;
}
}
if (!RetValue)
{
if (v_pIOPregs)
{
VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);
}
v_pIOPregs = NULL;
}
return(RetValue);
}
// CgpiodriverDlg 对话框
CgpiodriverDlg::CgpiodriverDlg(CWnd* pParent /*=NULL*/)
: CDialog(CgpiodriverDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CgpiodriverDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CgpiodriverDlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
ON_WM_SIZE()
#endif
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_LED1_ON, &CgpiodriverDlg::OnBnClickedLed1On)
ON_BN_CLICKED(IDC_LED2_ON, &CgpiodriverDlg::OnBnClickedLed2On)
ON_BN_CLICKED(IDC_LED3_ON, &CgpiodriverDlg::OnBnClickedLed3On)
ON_BN_CLICKED(IDC_LED4_ON, &CgpiodriverDlg::OnBnClickedLed4On)
ON_BN_CLICKED(IDC_LED_ALL_ON, &CgpiodriverDlg::OnBnClickedLedAllOn)
ON_BN_CLICKED(IDC_LED1_OFF, &CgpiodriverDlg::OnBnClickedLed1Off)
ON_BN_CLICKED(IDC_LED2_OFF, &CgpiodriverDlg::OnBnClickedLed2Off)
ON_BN_CLICKED(IDC_LED3_OFF, &CgpiodriverDlg::OnBnClickedLed3Off)
ON_BN_CLICKED(IDC_LED4_OFF, &CgpiodriverDlg::OnBnClickedLed4Off)
ON_BN_CLICKED(IDC_LED_ALL_OFF, &CgpiodriverDlg::OnBnClickedLedAllOff)
END_MESSAGE_MAP()
// CgpiodriverDlg 消息处理程序
BOOL CgpiodriverDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
gpiodriver=CreateFile(L"GIO1:",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
void CgpiodriverDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
if (AfxIsDRAEnabled())
{
DRA::RelayoutDialog(
AfxGetResourceHandle(),
this->m_hWnd,
DRA::GetDisplayMode() != DRA::Portrait ?
MAKEINTRESOURCE(IDD_GPIODRIVER_DIALOG_WIDE) :
MAKEINTRESOURCE(IDD_GPIODRIVER_DIALOG));
}
}
#endif
void CgpiodriverDlg::OnBnClickedLed1On()
{
// TODO: 在此添加控件通知处理程序代码
CDC *pDC=new CClientDC(this);
CBrush brush;
DeviceIoControl(gpiodriver,IO_CTL_GPIO_1_ON,NULL,0,NULL,0,NULL,NULL);
//下面绘制一个图来表示灯的亮和灭
brush.CreateSolidBrush(RGB(255,0,0));
CBrush *pOldBrush=pDC->SelectObject(&brush);
pDC->Ellipse(105,10,117,22);
pDC->SelectObject(pOldBrush);
delete pDC;
// TODO: 在此添加控件通知处理程序代码
}
void CgpiodriverDlg::OnBnClickedLed2On()
{
// TODO: 在此添加控件通知处理程序代码
CDC *pDC=new CClientDC(this);
CBrush brush;
DeviceIoControl(gpiodriver,IO_CTL_GPIO_2_ON,NULL,0,NULL,0,NULL,NULL);
//下面绘制一个图来表示灯的亮和灭
brush.CreateSolidBrush(RGB(255,0,0));
CBrush *pOldBrush=pDC->SelectObject(&brush);
pDC->Ellipse(105,10,117,22);
pDC->SelectObject(pOldBrush);
delete pDC;
// TODO: 在此添加控件通知处理程序代码
}
void CgpiodriverDlg::OnBnClickedLed3On()
{
//TODO: 在此添加控件通知处理程序代码
CDC *pDC=new CClientDC(this);
CBrush brush;
DeviceIoControl(gpiodriver,IO_CTL_GPIO_3_ON,NULL,0,NULL,0,NULL,NULL);
//下面绘制一个图来表示灯的亮和灭
brush.CreateSolidBrush(RGB(255,0,0));
CBrush *pOldBrush=pDC->SelectObject(&brush);
pDC->Ellipse(105,10,117,22);
pDC->SelectObject(pOldBrush);
// TODO: 在此添加控件通知处理程序代码
}
void CgpiodriverDlg::OnBnClickedLed4On()
{
// TODO: 在此添加控件通知处理程序代码
CDC *pDC=new CClientDC(this);
CBrush brush;
DeviceIoControl(gpiodriver,IO_CTL_GPIO_4_ON,NULL,0,NULL,0,NULL,NULL);
//下面绘制一个图来表示灯的亮和灭
brush.CreateSolidBrush(RGB(255,0,0));
CBrush *pOldBrush=pDC->SelectObject(&brush);
pDC->Ellipse(105,10,117,22);
pDC->SelectObject(pOldBrush);
delete pDC;
}
void CgpiodriverDlg::OnBnClickedLedAllOn()
{
// TODO: 在此添加控件通知处理程序代码
CDC *pDC=new CClientDC(this);
CBrush brush;
DeviceIoControl(gpiodriver,IO_CTL_GPIO_ALL_ON,NULL,0,NULL,0,NULL,NULL);
//下面绘制一个图来表示灯的亮和灭
brush.CreateSolidBrush(RGB(255,0,0));
CBrush *pOldBrush=pDC->SelectObject(&brush);
pDC->Ellipse(105,10,117,22);
pDC->SelectObject(pOldBrush);
delete pDC;
// TODO: 在此添加控件通知处理程序代码
}
void CgpiodriverDlg::OnBnClickedLed1Off()
{
CDC *pDC=new CClientDC(this);
CBrush brush;
DeviceIoControl(gpiodriver,IO_CTL_GPIO_1_OFF,NULL,0,NULL,0,NULL,NULL);
//下面绘制一个图来表示灯的亮和灭
brush.CreateSolidBrush(RGB(255,0,0));
CBrush *pOldBrush=pDC->SelectObject(&brush);
pDC->Ellipse(105,10,117,22);
pDC->SelectObject(pOldBrush);
delete pDC;
// TODO: 在此添加控件通知处理程序代码
}
void CgpiodriverDlg::OnBnClickedLed2Off()
{
CDC *pDC=new CClientDC(this);
CBrush brush;
DeviceIoControl(gpiodriver,IO_CTL_GPIO_2_OFF,NULL,0,NULL,0,NULL,NULL);
//下面绘制一个图来表示灯的亮和灭
brush.CreateSolidBrush(RGB(255,0,0));
CBrush *pOldBrush=pDC->SelectObject(&brush);
pDC->Ellipse(105,10,117,22);
pDC->SelectObject(pOldBrush);
delete pDC;
// TODO: 在此添加控件通知处理程序代码
}
void CgpiodriverDlg::OnBnClickedLed3Off()
{
CDC *pDC=new CClientDC(this);
CBrush brush;
DeviceIoControl(gpiodriver,IO_CTL_GPIO_3_OFF,NULL,0,NULL,0,NULL,NULL);
//下面绘制一个图来表示灯的亮和灭
brush.CreateSolidBrush(RGB(255,0,0));
CBrush *pOldBrush=pDC->SelectObject(&brush);
pDC->Ellipse(105,10,117,22);
pDC->SelectObject(pOldBrush);
delete pDC;
// TODO: 在此添加控件通知处理程序代码
}
void CgpiodriverDlg::OnBnClickedLed4Off()
{
CDC *pDC=new CClientDC(this);
CBrush brush;
DeviceIoControl(gpiodriver,IO_CTL_GPIO_4_OFF,NULL,0,NULL,0,NULL,NULL);
//下面绘制一个图来表示灯的亮和灭
brush.CreateSolidBrush(RGB(255,0,0));
CBrush *pOldBrush=pDC->SelectObject(&brush);
pDC->Ellipse(105,10,117,22);
pDC->SelectObject(pOldBrush);
delete pDC;
// TODO: 在此添加控件通知处理程序代码
}
void CgpiodriverDlg::OnBnClickedLedAllOff()
{
CDC *pDC=new CClientDC(this);
CBrush brush;
DeviceIoControl(gpiodriver,IO_CTL_GPIO_ALL_OFF,NULL,0,NULL,0,NULL,NULL);
//下面绘制一个图来表示灯的亮和灭
brush.CreateSolidBrush(RGB(255,0,0));
CBrush *pOldBrush=pDC->SelectObject(&brush);
pDC->Ellipse(105,10,117,22);
pDC->SelectObject(pOldBrush);
delete pDC;
// TODO: 在此添加控件通知处理程序代码
}
DWORD GIO_Init(DWORD dwContext)
{
RETAILMSG(1,(TEXT("GPIO Initialize ...")));
if (!InitializeAddresses())
return (FALSE);
v_pIOPregs->GPBCON =(v_pIOPregs->GPBCON &~(3 << 10)) | (1<< 10); // GPB5 == OUTPUT.
v_pIOPregs->GPBCON =(v_pIOPregs->GPBCON &~(3 << 12)) | (1<< 12); // GPB6 == OUTPUT.
v_pIOPregs->GPBCON =(v_pIOPregs->GPBCON &~(3 << 14)) | (1<< 14); // GPB7 == OUTPUT.
v_pIOPregs->GPBCON =(v_pIOPregs->GPBCON &~(3 << 16)) | (1<< 16); // GPB8 == OUTPUT.
mInitialized = TRUE;
RETAILMSG(1,(TEXT("OK !!!\n")));
return TRUE;
}
BOOL GIO_IOControl(DWORD hOpenContext,
DWORD dwCode,
PBYTE pBufIn,
DWORD dwLenIn,
PBYTE pBufOut,
DWORD dwLenOut,
PDWORD pdwActualOut)
{
switch(dwCode)
{
case IO_CTL_GPIO_1_ON:
v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT&~(0x1<<5);
break;
case IO_CTL_GPIO_2_ON:
v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT&~(0x1<<6);
break;
case IO_CTL_GPIO_3_ON:
v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT&~(0x1<<7);
break;
case IO_CTL_GPIO_4_ON:
v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT&~(0x1<<8);
break;
case IO_CTL_GPIO_ALL_ON:
v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT&~(0xF<<5);
break;
case IO_CTL_GPIO_1_OFF:
v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT|(0x1<<5);
break;
case IO_CTL_GPIO_2_OFF:
v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT|(0x1<<6);
break;
case IO_CTL_GPIO_3_OFF:
v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT|(0x1<<7);
break;
case IO_CTL_GPIO_4_OFF:
v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT|(0x1<<8);
break;
case IO_CTL_GPIO_ALL_OFF:
v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT|(0xF<<5);
break;
default:
break;
}
RETAILMSG(1,(TEXT("GPIO_Control:Ioctl code = 0x%x\r\n"), dwCode));
return TRUE;
}
DWORD GIO_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT|(0xF<<5);
RETAILMSG(1,(TEXT("GPIO_Control: GPIO_Open\r\n")));
return TRUE;
}
BOOL GIO_Close(DWORD hOpenContext)
{
v_pIOPregs->GPBDAT=v_pIOPregs->GPBDAT&(0xF<<5);
RETAILMSG(1,(TEXT("GPIO_Control: GPIO_Close\r\n")));
return TRUE;
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|