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

📄 captlib.c

📁 可采集MBF指纹传感器图像
💻 C
字号:
/*************************************************************/
/* test_spiread.c: MBF200 SPI driver for Arm9                */
/*************************************************************/

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include "spi.h"
#include "captlib.h"
//#define TIMEOUT 100

#define TH    0xe0
#define TIMEDELAY 800

///interal functions
int _sensorinit(void);
int _readimage(TCaptImage tempdata);
unsigned char read_register(unsigned char add);

//////////////////////
int opensensor()
{
	return(SPI_Init());
}
//////////////////////

void closesensor()
{
	SPI_Close();
}
//////////////////////
int readimagedata(TCaptImage tempdata,int TIMEOUT)
{
	int j;
	
	if(_sensorinit()<0)
		return(-1);

	for(j=0;j<TIMEOUT;j++){
		_readimage(tempdata);
		if(checkimage(tempdata)>=0)
			break;
	}

	if(j == TIMEOUT)
		return(-2);
	return(0);

}
/////////////////////////////
int checkimage(TCaptImage tempdata)
{
	int i;
	int sum,p;

	sum = 0;
		for(i=0;i<256;i++)
		{
			sum += tempdata[75][i];
		}
		p = sum/256;
		if(p<TH)
		{
			sum = 0;
			for(i=0;i<256;i++)
			{
				sum += tempdata[150][i];
			}
			p = sum/256;
			if(p<TH)
			{
				sum = 0;
				for(i=0;i<256;i++)
				{
					sum += tempdata[225][i];
				}
				p = sum/256;
				if(p<TH)
				{
					return(0);
				}
			}
		}
	return(-1);
}
/////////////////////////////

int testsensor()
{
	unsigned char tempdata;
	if(_sensorinit()<0)
		return(-1);

	//Read registers
	tempdata = read_register(0x48);//Read CTRLB
	if(tempdata!=0x65)
		return(-1);

	tempdata = read_register(0x30);//Read DTR
	if(tempdata!=0x30)
		return(-1);

	tempdata = read_register(0x38);//Read DCR
	if(tempdata!=0x02)
		return(-1);
	tempdata = read_register(0x60);//Read PGC
	if(tempdata!=0x0b)
		return(-1);
	return(0);
}

//////////////////////////////
unsigned char read_register(unsigned char add)
{
	unsigned char curr;

	SPI_CSLow(); //cs enable
	SPI_Write(0x03);
	SPI_Write(add);
	SPI_Read(&curr);
	SPI_CSHigh(); //cs disable

	return curr;
}

////////////////////////////
int _sensorinit(void)
{
	//Sensor initialization
	int i;
	
	//Write CTRLB with bits 2 and 0 set
	SPI_CSLow(); //cs enable
	if(SPI_Write(0x02)<0)
		return(-1);
	SPI_Write(0x48);
	SPI_Write(0x05);
	SPI_CSHigh(); //cs disable

	//Write DTR
	SPI_CSLow(); //cs enable
	SPI_Write(0x02);
	SPI_Write(0x30);
	SPI_Write(0x30);
	SPI_CSHigh(); //cs disable

	//Write DCR
	SPI_CSLow(); //cs enable
	SPI_Write(0x02);
	SPI_Write(0x38);
	SPI_Write(0x02);
	SPI_CSHigh(); //cs disable

	//Write PGC
	SPI_CSLow(); //cs enable
	SPI_Write(0x02);
	SPI_Write(0x60);
	SPI_Write(0x0b);
	SPI_CSHigh(); //cs disable

	for(i = 0; i < 2000; i++) ;

	return 0;
}

int _readimage(TCaptImage tempdata)
{
	int i,j,k;
 
	/* Write CTRLA */
	SPI_CSLow(); //cs enable
	if(SPI_Write(0x02)<0)
		return(-1);
	SPI_Write(0x40);
	SPI_Write(0x02);
	SPI_CSHigh(); //cs disable
	
	for(i=0;i<300;i++){
		for(k=0;k<TIMEDELAY;k++);

		SPI_CSLow(); //cs enable
		SPI_Write(0x03);
		SPI_Write(0x40);

		for(j=0;j<255;j++)
		{
			SPI_Read(&tempdata[i][j]);
		}
		tempdata[i][255] = 0xff;
		//adjust for the speed of chip
   		SPI_CSHigh(); //cs disable
	}

	return 0;
}


int writeimagetofile(char *filename,TCaptImage tempdata)
{
	int i,j;
	unsigned short bfType;
	struct BMPH{
		/* unsigned short bfType;*/
		unsigned long  bfSize;
		unsigned short bfReserved1;
		unsigned short bfReserved2;
		unsigned long  bfOffBits;
	}bitMFH;

	struct BMPI{
		unsigned long  biSize;
		unsigned long  biWidth;
		unsigned long  biHeight;
		unsigned short biPlanes;
		unsigned short biBitCount;
		unsigned long  biCompression;
		unsigned long  biSizeImage;
		unsigned long  biXPelsPerMeter;
		unsigned long  biYPelsPerMeter;
		unsigned long  biClrUsed;
		unsigned long  biClrImportant;
	}bitMIH;

	struct PALETTE{
		unsigned char rgbRed;
		unsigned char rgbGreen;
		unsigned char rgbBlue;
		unsigned char rgbReserved;
	}RgbQuad;

	FILE *fp;	

	if((fp=fopen(filename,"wb"))==NULL)
	{
		printf("Cannot open file!\n");
		exit(0);
	}

	bfType = 0x4d42;
	fwrite(&bfType,2,1,fp);
   
	bitMFH.bfSize = 0x13036;
	bitMFH.bfReserved1 = 0;
	bitMFH.bfReserved2 = 0;
	bitMFH.bfOffBits = 1078; 
	fwrite(&bitMFH,12,1,fp);

	bitMIH.biSize = 40;
	bitMIH.biWidth = 256;
	bitMIH.biHeight = 300;
	bitMIH.biPlanes = 1;
	bitMIH.biBitCount = 8;
	bitMIH.biCompression = 0;
	bitMIH.biSizeImage = 0x12c00;
	bitMIH.biXPelsPerMeter = 0;
	bitMIH.biYPelsPerMeter = 0;
	bitMIH.biClrUsed = 0;
	bitMIH.biClrImportant = 0;
	fwrite(&bitMIH,40,1,fp);

	for(i = 0;i<256;i++)
	{
		RgbQuad.rgbRed = i;
		RgbQuad.rgbGreen = i;
		RgbQuad.rgbBlue = i;
		RgbQuad.rgbReserved = i;
		fwrite(&RgbQuad,4,1,fp);
	}

	for(i=299;i>=0;i--)
	{
		for(j=0;j<256;j++)
		{
			fwrite(&tempdata[i][j],1,1,fp);
		}
	}
   
	fclose(fp);
	printf("OK!\n");

	return 0;
}

⌨️ 快捷键说明

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