天嵌 ARM开发社区

 找回密码
 注册
查看: 4356|回复: 1

TQ2440 第七章手册GPIO 口控制开发的编译问题求解

[复制链接]
lupronoun 发表于 2012-8-30 00:09:48 | 显示全部楼层 |阅读模式
本帖最后由 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;
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
Jangel 发表于 2012-8-30 09:53:26 | 显示全部楼层
LZ可以尝试使用Set_PinData替代
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-26 19:59 , Processed in 1.046875 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表