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

📄 fc.cpp

📁 这是一个指纹模块的驱动程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// FingerDrv.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include <ceddk.h>
#include <xllp_gpio.h>
#include <i2cpdd.h>

#pragma comment(lib,"ceddk.lib")
#pragma comment(lib,"pxa27x_xllp.lib")

//pxa270
#define adrFCDATA 0x04000000

volatile unsigned char *g_pReg;



//BULVERDE_GPIO_REG   *g_pGPIORegs   = NULL;

//XLLP_UINT32_T g_aGpioPin[4] = {3,82,84,85};
//XLLP_UINT32_T g_aTPEGpioPin[2] = {1, 82};
//XLLP_UINT32_T g_aRSTGpioPin[2] = {1, 85};
//XLLP_UINT32_T g_aCLKGpioPin[2] = {1, 84};

//声明的函数
#define __CHECK_OVERFLOW
#define slicewidth 280
#define sliceheigh 8
#define slicesize (slicewidth*sliceheigh)
static float defaultminvalue = 300000.0;

static int ciSliceThreshold = 2000;
static int maxslicenum = 1000;
static int minslicenum = 100;
static int topslice = maxslicenum - 1;//999
static int endcount = 10;
static int clWidth = 280;
static int clHeight = 350;
static long clImageSize = clWidth * clHeight;
int iRebuildHeight = 0;
int  bottomslice = 999 ;
unsigned char ucBackGround = 0;
unsigned char *pImage;
unsigned char *mapEMS1;

class PCF8574 
{
public:
	PCF8574()
		: m_Addr(0x20)
		, m_dwSpeed(100 * 1000)
		, m_pI2cBus(NULL)
	{

	}

	~PCF8574() 
	{
		if(m_pI2cBus)
			m_pI2cBus->Delete();
	}

	BOOL Init(LPCTSTR pContext)
	{
		DWORD dwAddr;
		BYTE data = 0xAD;
		BYTE dataOut;
		CRegistryEdit key(pContext);
		if(!key.IsKeyOpened())
			return FALSE;

		if(key.GetRegValue(_T("SlaveAddr"), (LPBYTE)&dwAddr, sizeof(dwAddr)))
			m_Addr = (BYTE)dwAddr;

		key.GetRegValue(_T("Speed"), (LPBYTE)&m_dwSpeed, sizeof(m_dwSpeed));
		m_pI2cBus = CI2CBusInterface::CreateObject(pContext);

		if(m_pI2cBus) 
		{
		m_pI2cBus->Lock();
		m_pI2cBus->SetSpeed(m_dwSpeed);
		m_pI2cBus->Write(m_Addr, &data, sizeof(data), FALSE);
		m_pI2cBus->Read(m_Addr, &dataOut, sizeof(dataOut), TRUE);
		RETAILMSG(1, (TEXT("dataOut  %x \r\n"),dataOut));
		m_pI2cBus->Unlock();
		}

		return (m_pI2cBus ? TRUE : FALSE);
	}
	BOOL SetData1(BYTE data)   //置1
	{
		BYTE dataOut;
		if(m_pI2cBus == NULL)
		{RETAILMSG(1, (TEXT("set1 cuowu\r\n"))); 
		return FALSE;}
		if(m_pI2cBus)
		{
		m_pI2cBus->Lock();
		m_pI2cBus->SetSpeed(m_dwSpeed); // 100kbps
		m_pI2cBus->Read(m_Addr, &dataOut, sizeof(dataOut), TRUE);
		data|=dataOut;
		m_pI2cBus->Write(m_Addr,&data,sizeof(data),FALSE);
		m_pI2cBus->Unlock();
		}
		return TRUE;
	}
	BOOL SetData0(BYTE data)   //置0
	{
		BYTE dataOut;
		if(m_pI2cBus == NULL)
		{RETAILMSG(1, (TEXT("set0 cuowu\r\n"))); 
		return FALSE;}
		if(m_pI2cBus)
		{
		m_pI2cBus->Lock();
		m_pI2cBus->SetSpeed(m_dwSpeed); // 400kbps
		m_pI2cBus->Read(m_Addr, &dataOut, sizeof(dataOut), TRUE);
		data&=dataOut;
		//RETAILMSG(1, (TEXT("data  %x\r\n"),data));
		m_pI2cBus->Write(m_Addr,&data,sizeof(data),FALSE);
		//RETAILMSG(1, (TEXT("write0\r\n")));
		m_pI2cBus->Unlock();
		}
		return TRUE;
	}

private:
	BYTE              m_Addr;
	DWORD             m_dwSpeed;
	CI2CBusInterface *m_pI2cBus;
};



PCF8574 *pcf;
//PS82   GPSR2--18
void FC_TPEON(PCF8574 *pPcf8574)
{
	//int i;
	BYTE data = 0x10;
	//for( i =1;i <5000;i++)
	//{
	pPcf8574->SetData1(data);
	//RETAILMSG(1, (TEXT("***FingerDrv: FC_TPN\r\n")));}
	//RETAILMSG(1, (TEXT("***FingerDrv: FC_TPEON\r\n")));
	//*g_pI2CRegs = 0x08|;
	//XllpGpioSetOutputState1(g_pGPIORegs, g_aTPEGpioPin);
}
void FC_TPEOFF(PCF8574 *pPcf8574)
{
	BYTE data = 0xEF;
	pPcf8574->SetData0(data);
	//RETAILMSG(1, (TEXT("***FingerDrv: FC_TPEOFF\r\n")));
	//*g_pI2CRegs = 0;
	//XllpGpioSetOutput0(g_pGPIORegs, g_aTPEGpioPin);
}
//PS85  GPSR2--21
void FC_RESETON(PCF8574 *pPcf8574)
{
	BYTE data = 0x40;
	pPcf8574->SetData1(data);
	//RETAILMSG(1, (TEXT("***FingerDrv: FC_RESETON\r\n")));
	//*g_pI2CRegs = 0x02;
	//XllpGpioSetOutputState1(g_pGPIORegs,g_aRSTGpioPin);
}
void FC_RESETOFF(PCF8574 *pPcf8574)
{
	BYTE data = 0xBF;
	pPcf8574->SetData0(data);
	//RETAILMSG(1, (TEXT("***FingerDrv: FC_RESETOFF\r\n")));
	//*g_pI2CRegs = 0;
	//XllpGpioSetOutput0(g_pGPIORegs, g_aRSTGpioPin);
}
//PS84  GPSR2--20
void FC_PCLKON(PCF8574 *pPcf8574)
{
	BYTE data = 0x02;
	pPcf8574->SetData1(data);
	//RETAILMSG(1, (TEXT("***FingerDrv: FC_PCLKON\r\n")));
	//*g_pI2CRegs = 0x40;
	//XllpGpioSetOutputState1(g_pGPIORegs,g_aCLKGpioPin);
}
void FC_PCLKOFF(PCF8574 *pPcf8574)
{
	BYTE data = 0xFD;
	pPcf8574->SetData0(data);
	//RETAILMSG(1, (TEXT("***FingerDrv: FC_PCLKOFF\r\n")));
	//*g_pI2CRegs = 0;
	//XllpGpioSetOutput0(g_pGPIORegs, g_aCLKGpioPin);
}

int EvaluateSlice(unsigned char *slice, int threshold);
void ImgSet3(unsigned char   *pImage, unsigned char ucValue, int lLenth);
void ImgCpy3(unsigned char   *pDst, unsigned char   *pSrc, int lLenth);
void ImgSet4(unsigned char   *pImage, unsigned char ucValue, long lWidth, long lHeight);
void ImgCpy4(unsigned char   *pDst, unsigned char   *pSrc, long lWidth, long lHeight);
float Average2(unsigned char   *pData, long lLenth);
float Variance2(unsigned char   *pData, long lLenth);
float CoVariance3(unsigned char   *pData1, unsigned char   *pData2, long lLenth);
float Average7(unsigned char   *pImage, long lWidth, long lHeight,
    int iLeft, int iTop, int iRight, int iBottom);
float Variance7(unsigned char   *pImage, long lWidth, long lHeight,
    int iLeft, int iTop, int iRight, int iBottom);
float CoVariance8(unsigned char   *pImage1, unsigned char   *pImage2, long lWidth, long lHeight,
    int iLeft, int iTop, int iRight, int iBottom);
unsigned char Swing(unsigned char   *pImage, long iWidth, long iHeight,
    int iLeft, int iTop, int iRight, int iBottom);
float ucAverage(unsigned char *data, unsigned int lenth);
float ucVariance(unsigned char  *data, unsigned int lenth);
float ucCoVariance(unsigned char *data1, unsigned char *data2, unsigned int lenth);

float uc2dAverage(unsigned char *data, unsigned int width, unsigned int heigh,
		unsigned int x, unsigned int y, unsigned int w, unsigned int h);
float uc2dVariance(unsigned char *data, unsigned int width, unsigned int heigh,
		unsigned int x, unsigned int y, unsigned int w, unsigned int h);
float uc2dCoVariance(unsigned char *data1, unsigned char *data2, unsigned int width, unsigned int heigh,
		unsigned int x, unsigned int y, unsigned int w, unsigned int h);
void FIG_Gpio_Init(void);
void HeatChip(int flag);
void EnableChip(int flag);
int ResetChip(void);
int SearchSynch(void);
int SkipOneSlice(void);
int ReadOneSlice(unsigned char  *slice);
static int framesize = 1124;
unsigned char *framebuffer;
int GetSlice(void);
void Capture(void);
int Rebuild(void);

BOOL APIENTRY DllMain( HANDLE hinstDLL, 
                       DWORD  dwReason, 
                       LPVOID lpReserved
					 )
{
    
    return TRUE;
}


DWORD FIG_Init( LPCTSTR pContext, LPCVOID lpvBusContext)
{

    RETAILMSG(1, (TEXT("***FingerDrv: FIG_Init\r\n")));
	PHYSICAL_ADDRESS PA;
	//IO 
	//PA.QuadPart = BULVERDE_BASE_REG_PA_GPIO;
    //g_pGPIORegs = (BULVERDE_GPIO_REG *) MmMapIoSpace(PA, 0x400, FALSE);
	PCF8574 *pPcf8574;
	pPcf8574 = new PCF8574;
	if(pPcf8574 && !pPcf8574->Init(pContext)) 
	{
		delete pPcf8574;
		pPcf8574 = NULL;
	}
	pcf = pPcf8574;
	RETAILMSG(1, (L"PCF8574: Init() 0x%x\r\n", pPcf8574) );

	//FC DATA
	PA.QuadPart = adrFCDATA;
	g_pReg = (unsigned char *)MmMapIoSpace(PA,sizeof(unsigned char),FALSE);
	//判断是否申请内存成功
	//if(g_pGPIORegs && g_pReg)
	if(g_pReg)
    {
		RETAILMSG(1, (TEXT("***FingerDrv: FIG_Init Sucess\r\n")));
		framebuffer = new unsigned char[framesize] ;
        pImage = new unsigned char [280*350];
        mapEMS1 = new unsigned char [1024*32*128];
		
		return (DWORD)pContext;
	}
	RETAILMSG(1, (TEXT("***FingerDrv: FIG_Init fail\r\n")));
	return FALSE;
}

BOOL FIG_Deinit(DWORD hDeviceContext)
{
	RETAILMSG(1, (TEXT("***FingerDrv: FIG_Deinit\r\n")));
	//MmUnmapIoSpace(g_pGPIORegs, 0x400);
	PCF8574 *pPcf8574;
	pPcf8574 = (PCF8574 *)hDeviceContext;
	if(pPcf8574 != NULL) delete pPcf8574;
//	MmUnmapIoSpace((PVOID)g_pMEMCtrlregs,sizeof(S3C2410X_MEMCTRL_REG));
	MmUnmapIoSpace((PVOID)g_pReg,sizeof(unsigned char));
	delete [] framebuffer;
	delete [] pImage;
    delete [] mapEMS1;
	delete pcf;
	return TRUE;
}

DWORD FIG_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
	RETAILMSG(1, (TEXT("***FingerDrv: FIG_Open\r\n")));
	//保存以下IO口的原来设置
	//初始化IO口
	//FIG_Gpio_Init();
	HeatChip(1);
	RETAILMSG(1, (TEXT("***FingerDrv: FIG_Open HeatChip\r\n")));
	return hDeviceContext;
}

BOOL FIG_Close(DWORD hOpenContext)
{
	RETAILMSG(1, (TEXT("***FingerDrv: FIG_Close\r\n")));
	//还原IO口的设置
	//还原BWSCON等
	
	return TRUE;
}

BOOL FIG_IOControl(DWORD hOpenContext,
				   DWORD dwCode,
				   PBYTE pBufIn,
				   DWORD dwLenIn,
				   PBYTE pBufOut,
				   DWORD dwLenOut,
				   PDWORD pdwActualOut)
{
	return TRUE;
}

void FIG_PowerDown(DWORD hDeviceContext)
{
}

void FIG_PowerUp(DWORD hDeviceContext)
{
}

DWORD FIG_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
	unsigned char *POut= (unsigned char*)(pBuffer);
    for(int i = 0;i<280*350;i++)
	{
		POut[i] = pImage[i];
	}
	return sizeof(unsigned char);
}

DWORD FIG_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
	return 0;
}


DWORD FIG_Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD NumberOfBytes)
{
	RETAILMSG(1, (TEXT("***FingerDrv: FIG_Write!\r\n")));
	RETAILMSG(1, (TEXT("clWidth 111 %d !\r\n"),clWidth));

	RETAILMSG(1, (TEXT("clHeight 111  %d !\r\n"),clHeight));
	Capture();
	//for( i = 0;i<100;i++)
	//{RETAILMSG(1, (TEXT("data   %d !\r\n"),pImage[i]));}
	RETAILMSG(1, (TEXT("***FingerDrv: FIG_Write finished!\r\n")));
	return hOpenContext;
}

//void FIG_Gpio_Init(void)
//{
//	//set as output
//	XllpGpioSetDirectionOut(g_pGPIORegs, g_aGpioPin);
//	XllpGpioClearAlternateFn(g_pGPIORegs, g_aGpioPin);
//}

void HeatChip(int flag)
{
	if(flag)
	{
		RETAILMSG(1, (TEXT("***FingerDrv: HeatChip1\r\n")));
		//g_pIOPregs->GPBDAT=g_pIOPregs->GPBDAT|(0x01<<9);
		FC_TPEON(pcf);
	}
	else
	{
		RETAILMSG(1, (TEXT("***FingerDrv: HeatChip0\r\n")));
		//g_pIOPregs->GPBDAT=g_pIOPregs->GPBDAT&~(0x01<<9);
		FC_TPEOFF(pcf);
	}
}

void EnableChip(int flag)
{
	if(flag)
	{
		RETAILMSG(1, (TEXT("***FingerDrv: EnableChip1\r\n")));
		//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT&~(0x01<<6);
		FC_RESETOFF(pcf);
	}
	else
	{
		RETAILMSG(1, (TEXT("***FingerDrv: EnableChip0\r\n")));
		//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<6);
		FC_RESETON(pcf);
	}
}

int ResetChip()
{
	register unsigned int i;
	HeatChip(1);
	EnableChip(1);
	Sleep(1);
	EnableChip(0);
	Sleep(1);
	EnableChip(1);
	Sleep(1);
	//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<0);
	FC_PCLKON(pcf);
	SkipOneSlice();
	if(!SearchSynch()) 
	{
		return 0;
	}
	for(i = 0; i < 5; i++)
	{
		if(!SkipOneSlice()) 
		{
			return 0;
		}
	}
	return 1;
}

int SearchSynch()
{
	const int num = 2000;
	unsigned char  v, oldv;
	register int i;
	v = 0;
	oldv = 0;
	for(i = 0; i < num; i++)
	{
		//RETAILMSG(1, (TEXT("***FingerDrv: SearchSynch\r\n")));
		oldv = v;
		//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT&~(0x01<<0);
		//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<0);
		FC_PCLKOFF(pcf);
		FC_PCLKON(pcf);
        v = *g_pReg;
        if(v == 0x0f && oldv == 0x0f)
		{
			//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT&~(0x01<<0);
			//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<0);
			//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT&~(0x01<<0);
			//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<0);
			FC_PCLKOFF(pcf);
			FC_PCLKON(pcf);
			FC_PCLKOFF(pcf);
			FC_PCLKON(pcf);
			return 1;
		}
	}
	return 0;
}

int SkipOneSlice()
{
	RETAILMSG(1, (TEXT("***FingerDrv: SkipOneSlice\r\n")));
	unsigned char s1, s2;
	register int i;
	for(i = 0; i < 1124; i++) 
	{
		//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT&~(0x01<<0);
	    //g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<0);
		FC_PCLKOFF(pcf);
		FC_PCLKON(pcf);
	}
	//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT&~(0x01<<0);
	//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<0);
	FC_PCLKOFF(pcf);
	FC_PCLKON(pcf);
	s1 = *g_pReg;
	RETAILMSG(1, (TEXT("***FingerDrv: gpeg 0x %x\r\n"),*g_pReg));
	//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT&~(0x01<<0);
	//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<0);
	FC_PCLKOFF(pcf);
	FC_PCLKON(pcf);
	s2 = *g_pReg;
	RETAILMSG(1, (TEXT("***FingerDrv: gpeg 0x %x\r\n"),*g_pReg));
	//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT&~(0x01<<0);
	//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<0);
	//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT&~(0x01<<0);
	//g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<0);
	FC_PCLKOFF(pcf);
	FC_PCLKON(pcf);
	FC_PCLKOFF(pcf);
	FC_PCLKON(pcf);
	if(s1 != 0x0f || s2 != 0x0f) return 0;
	return 1;
}

int ReadOneSlice(unsigned char  *slice)
{
	unsigned char  *p;
	unsigned char  *q;
	unsigned char v0;
	register int i,j;
	register unsigned char v;
    p = framebuffer;
	RETAILMSG(1, (TEXT("***FingerDrv: ReadOneSlice\r\n")));
	for(i = 0; i < framesize; i++) 
	{	
	  //g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT&~(0x01<<0);
      //g_pIOPregs->GPCDAT=g_pIOPregs->GPCDAT|(0x01<<0);
		FC_PCLKOFF(pcf);
		FC_PCLKON(pcf);
      *p++ = *g_pReg;
	  //RETAILMSG(1, (TEXT("***FingerDrv: gpeg 0x %x\r\n"),*g_pReg));
	}
	p = framebuffer;
	if(p[1120] != 0x0f || p[1121] != 0x0f) 
	{
		return 0;
	}
	p = framebuffer;
	for(i = 0; i < slicewidth; i++)
	{
	  q = slice + i;
	  for(j = 0; j < sliceheigh; j += 2)
	  {
        v0 = *p++;
		v = (v0 & 0x0f)<<4;
		*q = v;
		q += 280;
		v = v0 & 0xf0;
		*q = v;
		q += 280;
	  }
	}
	return 1;
}
/////////////////////////////////
// 计算序列固定长度的平均值ave= sum /num
float ucAverage(unsigned char  *data, unsigned int lenth)
{
	register unsigned int i;
	unsigned char  *p = data;
	unsigned long sum = 0;
	if(lenth <= 0)
        return 0;
	for(i = 0; i < lenth; i++)
		sum += *p++;
	return (float)sum/lenth;
}
//计算序列固定长度的方差
float ucVariance(unsigned char *data, unsigned int lenth)
{
	register unsigned int i,v;
	unsigned char *p = data;
	unsigned long sum1 = 0;
	unsigned long sum2 = 0;
	if(lenth <= 0)
		return 0;
	for(i = 0; i < lenth; i++)
	{
		v = *p++;
		sum1 += v;
		sum2 += v*v;
	}
	sum1 /= lenth;
	sum2 /= lenth;
	sum2 -= sum1*sum1;
	return (float)sum2;
}

//计算俩个序列固定长度的协方差
float ucCoVariance(unsigned char *data1, unsigned char *data2, unsigned int lenth)
{
	register int v1,v2;
	register unsigned int  i,v;
	unsigned char *p1 = data1;
	unsigned char *p2 = data2;
	unsigned long sum1 = 0;
    unsigned long sum2 = 0;
	if(lenth <= 0)
		return 0;
	for(i = 0; i < lenth; i++)
    {
		v1 = *p1++;
		v2 = *p2++;
		v = v1 > v2 ? v1 - v2 : v2 - v1;
		sum1 += v;
		sum2 += v*v;
	}
    sum1 /= lenth;
    sum2 /= lenth;
	sum2 -= sum1*sum1;
	return (float)sum2;
}
//计算二维序列平均值
float uc2dAverage(unsigned char *data, unsigned int width, unsigned int heigh,
		unsigned int x, unsigned int y, unsigned int w, unsigned int h)
{
	register unsigned int i,j;
	unsigned char *p;
	unsigned long sum = 0;

    if(width < x + w || heigh < y + h)
        return 0;
	for(i = 0; i < h; i++)
	{
		p = data + (y+i)*width + x;
		for(j = 0; j < w; j++)
		{
			sum += *p++;
		}
	}
	return (float)sum/w/h;
}
//计算2维方差
float uc2dVariance(unsigned char *data, unsigned int width, unsigned int heigh,

⌨️ 快捷键说明

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