2416 遥控器

来源:互联网 发布:mmd怎么删除镜头数据 编辑:程序博客网 时间:2024/04/27 15:41

驱动源码

#include <windows.h>
#include <ceddk.h>
#include <nkintr.h>
#include <pm.h>
#include <s3c2416.h>
#include "BSP.h"


#include "infrared.h"
int iDebuge=0;//应用层控制,传参数,打印驱动的信息


#ifdef DEBUG
#define ZONE_GPIOCONTROL DEBUGZONE(0)
#define ZONE_FUNCTION DEBUGZONE(1)
#define ZONE_ERROR DEBUGZONE(15)
#else
#define ZONE_GPIOCONTROL 1
#define ZONE_FUNCTION 1
#define ZONE_ERROR 1
#endif
volatile S3C2416_WATCHDOG_REG *v_pWDGregs ;
#if 0
#define DEBUG_GPIO 1
#else
#define DEBUG_GPIO 0
#endif
volatile static S3C2416_IOPORT_REG *v_pGPIORegs=NULL;
#define ADC_FREQ 2500000
// adc virtual address
volatile S3C2416_ADC_REG  *v_pADCPregs;


//#define IOCTL_ADC_SET_BIT 0x1
//#define IOCTL_ADC_SET_CHANNEL 0x2


unsigned int g_channel=0; //通道选择
BOOL adc_bit = 0; //采样位宽
unsigned int g_saveAdccon=0;//
unsigned int temp_adccon, temp_adcmux;
int dat=0;
BOOL mInitialized;
BOOL InitializeAddresses(VOID); // Virtual allocation


static void Delay(USHORT count)
{
volatile int i, j = 0;
volatile static int loop = S3C2416_FCLK/100000;

for(;count > 0;count--)
for(i=0;i < loop; i++) { j++; }
}
void Delay_us(int n)


{


    LARGE_INTEGER litmp;


       LONGLONG QPart1,QPart2;


       double dfMinus,dfFreq,dfTim;


       QueryPerformanceFrequency(&litmp);


       dfFreq = (double)litmp.QuadPart;


       QueryPerformanceCounter(&litmp);


       QPart1 = litmp.QuadPart;


       do


       {


       QueryPerformanceCounter(&litmp);


          QPart2 = litmp.QuadPart;


          dfMinus = (double)(QPart2-QPart1);


          dfTim = dfMinus/dfFreq;


       }while(dfTim<0.000001*n);


}


BOOL InitializeAddresses(VOID)
{
BOOL RetValue = TRUE;
PHYSICAL_ADDRESS    ioPhysicalBase = {0,0};


ioPhysicalBase.LowPart = S3C2416_BASE_REG_PA_IOPORT;
v_pGPIORegs = (volatile S3C2416_IOPORT_REG *)MmMapIoSpace(ioPhysicalBase, sizeof(S3C2416_IOPORT_REG), FALSE);
if (v_pGPIORegs == NULL)
{
RETAILMSG(ZONE_ERROR, (TEXT("[GIO] v_pGPIORegs MmMapIoSpace() Failed \r\n")));
RetValue = FALSE;
}




v_pADCPregs = (volatile S3C2416_ADC_REG *)VirtualAlloc(0, sizeof(S3C2416_ADC_REG), MEM_RESERVE, PAGE_NOACCESS);
if (v_pADCPregs == NULL)
{
ERRORMSG(1,(TEXT("For PWMregs : VirtualAlloc failed!\r\n")));
}
else
{
if (!VirtualCopy((PVOID)v_pADCPregs, (PVOID)(S3C2416_BASE_REG_PA_ADC >> 8), sizeof(S3C2416_ADC_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE))
{
ERRORMSG(1,(TEXT("For PWMregs: VirtualCopy failed!\r\n")));
}
}

if (v_pADCPregs == NULL)
{
RETAILMSG(ZONE_ERROR, (TEXT("[BAT] v_pADCRegs MmMapIoSpace() Failed \r\n")));
}
v_pWDGregs = (volatile S3C2416_WATCHDOG_REG *)VirtualAlloc(0, sizeof(S3C2416_WATCHDOG_REG), MEM_RESERVE, PAGE_NOACCESS);
if (v_pWDGregs == NULL) 
{
ERRORMSG(1,(TEXT("For IOPregs : VirtualAlloc faiGPIO!\r\n")));
RetValue = FALSE;
}
else 
{
if (!VirtualCopy((PVOID)v_pWDGregs, (PVOID)(S3C2416_BASE_REG_PA_WATCHDOG >> 8), sizeof(S3C2416_WATCHDOG_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)) 
{
ERRORMSG(1,(TEXT("For IOPregs: VirtualCopy faiGPIO!\r\n")));
RetValue = FALSE;
}
}
return(RetValue);


}




int cont=200;
static unsigned long  LedThread(void)
{
int ret = 0; 
long count1=0;
long count2=0;
int i=0,m=0,n=0,j=0;
int buff[34][2];
while(1)
{

Sleep(0);//dat=0;
svs:v_pWDGregs->WTCON  = 0;
if(((v_pGPIORegs->GPCDAT>>8&0x1)!=1))
{cont=0;
v_pWDGregs->WTCON = 0x8021; // Init Value
v_pWDGregs->WTDAT = 0xFEA9;
v_pWDGregs->WTCNT = 0xFEA9;
v_pWDGregs->WTCON = ( 1 << 0) | (0x03 << 3 ) | (1 << 5) | (0x5A << 8);


while(((v_pGPIORegs->GPCDAT>>8&0x1)==0));
buff[0][0]=v_pWDGregs->WTDAT-v_pWDGregs->WTCNT;


v_pWDGregs->WTCNT = 0xFEA9;
if(buff[0][0]<50) 
goto svs;
while(((v_pGPIORegs->GPCDAT>>8&0x1)==1));
buff[0][1]=v_pWDGregs->WTDAT-v_pWDGregs->WTCNT;


v_pWDGregs->WTCNT = 0xFEA9;
m=0;n=0;j=0;

if(buff[0][1]<0x16) goto svs;
for(i=2;i<34;i++)
{
v_pWDGregs->WTCNT = 0xFEA9;
while(((v_pGPIORegs->GPCDAT>>8&0x1)==0))
{
if(v_pWDGregs->WTCNT<0xFAC1) 
{v_pWDGregs->WTCNT = 0xFEA9;
RETAILMSG(1, (TEXT("wait 1 error\r\n")));
goto svs;
}
}

buff[i][0]=v_pWDGregs->WTDAT-v_pWDGregs->WTCNT;
v_pWDGregs->WTCNT = 0xFEA9;

while(((v_pGPIORegs->GPCDAT>>8&0x1)==1))
{
if(v_pWDGregs->WTCNT<0xFAC1) 
{
v_pWDGregs->WTCNT = 0xFEA9;
RETAILMSG(1, (TEXT("wait 0 error\r\n")));
goto svs;
}
}

buff[i][1]=v_pWDGregs->WTDAT-v_pWDGregs->WTCNT;

v_pWDGregs->WTCNT = 0xFEA9;

}
dat=0;
for(i=2;i<34;i++)
{
if(buff[i][1]<0x6)
{
dat|=0<<33-i;
}
else
{
dat|=1<<33-i;
}
RETAILMSG(0, (TEXT("%d 0x%x 0x%x 0x%x 0x%x \r\n"),i,buff[0][0],buff[0][1],buff[i][0],buff[i][1]));
}
RETAILMSG(1, (TEXT("[Lead ]:0x%x [data ]:0x%x 0x%x \r\n"),(dat>>16)&0xFFFF,(dat>>8)&0xFF,(dat>>0)&0xFF));
}

}


return count2;
}




BOOL WINAPI  
DllEntry(HANDLE hinstDLL, DWORD dwReason, LPVOID /* lpvReserved */)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
DEBUGREGISTER((HINSTANCE)hinstDLL);
return TRUE;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
#ifdef UNDER_CE
case DLL_PROCESS_EXITING:
break;
case DLL_SYSTEM_STARTED:
break;
#endif
}


return TRUE;
}




BOOL INF_Deinit(DWORD hDeviceContext)
{
BOOL bRet = TRUE;


if(v_pGPIORegs != NULL)
{
MmUnmapIoSpace((PVOID)v_pGPIORegs, sizeof(S3C2416_IOPORT_REG));
v_pGPIORegs = NULL;
}
RETAILMSG(DEBUG_GPIO,(TEXT("GPIO_Control: GIO_Deinit\r\n")));
VirtualFree((PVOID)v_pADCPregs, 0, MEM_RELEASE);
v_pADCPregs = NULL;


return TRUE;





DWORD INF_Init(DWORD dwContext)
{
HANDLE KeyThread;
DWORD threadID;
RETAILMSG(1, (TEXT("INF Initialize ...")));


if (!InitializeAddresses())
return (FALSE);


//spi use to gpio
v_pGPIORegs->GPCCON =  (v_pGPIORegs->GPCCON & ~(0x3<<16) ) ; // led1  gpe13
v_pGPIORegs->GPCUDP =  (v_pGPIORegs->GPCUDP & ~(0x3<<16) ) ;

v_pGPIORegs->GPCUDP =  (v_pGPIORegs->GPCUDP |(0x1<<17) ) ;
KeyThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)LedThread,  0,  0, &threadID);
  
mInitialized = TRUE;
RETAILMSG(1, (TEXT("OK !!!\r\n")));
return TRUE;
}


BOOL INF_IOControl(DWORD hOpenContext, DWORD dwCode, PDWORD pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut)
{



return TRUE;
}


DWORD INF_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{


RETAILMSG(DEBUG_GPIO, (TEXT("INF: GPIO_Open\r\n")));
return TRUE;
}


BOOL INF_Close(DWORD hOpenContext)
{




RETAILMSG(DEBUG_GPIO,(TEXT("INF: GPIO_Close\r\n")));
return TRUE;
}


void INF_PowerDown(DWORD hDeviceContext)
{
RETAILMSG(DEBUG_GPIO, (TEXT("INF: GPIO_PowerDown\r\n")));
}


void INF_PowerUp(DWORD hDeviceContext)
{
RETAILMSG(DEBUG_GPIO, (TEXT("INF: GPIO_PowerUp\r\n")));
}


DWORD INF_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
*(DWORD *)pBuffer = (DWORD)dat;
dat=0;
RETAILMSG(0,(TEXT("infdat= 0x%x \r\n"),*(DWORD *)pBuffer));


return TRUE;
}


DWORD INF_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
RETAILMSG(DEBUG_GPIO, (TEXT("INF: GPIO_Seek\r\n")));
return 0;
}


DWORD INF_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes)
{
RETAILMSG(DEBUG_GPIO, (TEXT("INF: GPIO_Write\r\n")));
return 0;
}


应用程序源码

// blkDlg.cpp : 实现文件
//


#include "stdafx.h"
#include "blk.h"
#include "blkDlg.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CblkDlg 对话框


CblkDlg::CblkDlg(CWnd* pParent /*=NULL*/)
: CDialog(CblkDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}


void CblkDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//DDX_Control(pDX, IDC_SLIDER1, m_ctrlSlider);

DDX_Control(pDX, IDC_EDIT1, m_value);
}


BEGIN_MESSAGE_MAP(CblkDlg, CDialog)
#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
ON_WM_SIZE()
#endif
//}}AFX_MSG_MAP
ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER1, &CblkDlg::OnNMCustomdrawSlider1)
ON_BN_CLICKED(IDC_BUTTON1, &CblkDlg::OnBnClickedButton1)
END_MESSAGE_MAP()




// CblkDlg 消息处理程序


static DWORD UserAdcProcessThread(LPVOID pParam);
BOOL CblkDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// PDWORD a;a[1]=1;BYTE channel = 1;
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE);// 设置大图标
SetIcon(m_hIcon, FALSE);// 设置小图标
// TODO: 在此添加额外的初始化代码
// m_ctrlSlider.SetPos(100); 
hDeviceInf=CreateFile(L"INF1:",GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);

InfThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)UserAdcProcessThread,  this,  0, &threadID);
return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}


#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
void CblkDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
if (AfxIsDRAEnabled())
{
DRA::RelayoutDialog(
AfxGetResourceHandle(), 
this->m_hWnd, 
DRA::GetDisplayMode() != DRA::Portrait ? 
MAKEINTRESOURCE(IDD_BLK_DIALOG_WIDE) : 
MAKEINTRESOURCE(IDD_BLK_DIALOG));
}
}
#endif




void CblkDlg::OnNMCustomdrawSlider1(NMHDR *pNMHDR, LRESULT *pResult)
{
// CString cs; 
// int nPos = m_ctrlSlider.GetPos();
//blk=CreateFile(_T("BLK1:"),GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); 
//DeviceIoControl(blk,(nPos)*20,NULL,0,NULL,0,NULL,NULL);//调整背光亮度
}


void CblkDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
HANDLE ledblk;
ledblk=CreateFile(_T("GIO1:"),GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); //关闭背光
DeviceIoControl(ledblk,1,NULL,0,NULL,0,NULL,NULL);
Sleep(500);
ledblk=CreateFile(_T("GIO1:"),GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); //打开背光
DeviceIoControl(ledblk,6,NULL,0,NULL,0,NULL,NULL);
Sleep(500);
CloseHandle(ledblk);
}
void CblkDlg::GetValue()
{
BYTE byReceiveBuf[1024]; ///缓冲区的大小
LPVOID lpbuff;CString str1;
int nBytes= 0;
int sock;//


memset(byReceiveBuf, 0, 1024);
while(1)
{//MessageBox(_T("1"));
//读字符1
if(ReadFile(hDeviceInf, lpbuff, 1, &dwBytes, 0))
{
Sleep(100);
str1.Format(_T("0x%x"),*(DWORD *)lpbuff);
m_value.SetWindowTextW(str1);

}
}
}


static DWORD UserAdcProcessThread(LPVOID pParam)
{
CblkDlg *dlg=(CblkDlg*) pParam;//new CuserkeyDlg;// 
//dlg->OnBnClickedButton1();
//MessageBox(_T("1"));
while(1)
{//dlg->OnBnClickedButton1();
Sleep(500);
dlg->GetValue();
}



}





0 0
原创粉丝点击