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

📄 usbcam.c

📁 三星2440 cpu WINCE 5.00板级支持包
💻 C
📖 第 1 页 / 共 3 页
字号:
#define U8	unsigned char
#define U16	unsigned short
#define U32	unsigned int
#include "usbcam.h"
#include "zc3xx.h"
HANDLE CameraThread;
#define DOTNET_DRIVER 1
unsigned int DisplayTime = INFINITE;
//unsigned char DisplayEnable=0;
unsigned char buffer_num=0xff;		// ping pong buffer

unsigned char image_size = 2;				// 1: QCIF, 2:CIF (default)

//#define DRIVER_PREVIEW_ENABLE		2	// 0: onTimeTek, 1: Preview, 2:Samsung Camcorder
unsigned char DRIVER_PREVIEW_ENABLE = 2;	// 0: onTimeTek, 1: Preview, 2:Samsung Camcorder	

unsigned int frame_count=0;			// for MPEG4
DWORD Tick_GET_FRAME_CUR;
DWORD Tick_GET_FRAME_PREV;
DWORD Tick_COPY_FRAME;
PUSBCAM_CONTEXT
GetContextFromReg(
   LPTSTR  ActivePath
   );
BOOL 
DllEntry(
   HANDLE hDllHandle,
   DWORD  dwReason,
   LPVOID lpreserved
   ) 
{
    UNREFERENCED_PARAMETER(hDllHandle);
    UNREFERENCED_PARAMETER(lpreserved);
    switch (dwReason) {

      case DLL_PROCESS_ATTACH:
           DEBUGREGISTER((HINSTANCE)hDllHandle);
	   DisableThreadLibraryCalls((HMODULE) hDllHandle);
           break;

      case DLL_PROCESS_DETACH:
           break;

      default:
        break;
    }
    return TRUE;
}
void Display_Cam_Image(U32 pos_x, U32 pos_y, U32 size_x, U32 size_y, U8* buffer_rgb)
{
	U32 y;
	int temp;
	
	//unsigned short *ptr = (unsigned short *)(FRAMEBUF_BASE+0x5dc0);
	
	//RETAILMSG(1,(_T("Display_Cam_Image()\r\n")));

#if (DOTNET_DRIVER)
	SetKMode(TRUE);
#endif
	
//	buffer_rgb += VIRTUAL_OFFSET;

//	time = GetTickCount();
//	RETAILMSG(1,(TEXT("+:%d\r\n"),(time - old_time)));


#if 1
	for (y=0;y<(size_y-2);y++) // YCbCr 4:2:0 format
	{
		//memcpy((void *)(FRAMEBUF_BASE+0x5e00+y*240*2),(void *)buffer_rgb,(QCIF_XSIZE)*2);
		memcpy((void *)(FRAMEBUF_BASE+ (240*pos_y + pos_x) + y*240*2),(void *)buffer_rgb,(QCIF_XSIZE)*2);
		buffer_rgb += (QCIF_XSIZE*2);
	}
#endif

#if (DOTNET_DRIVER)
	SetKMode(FALSE);
#endif

//	old_time = GetTickCount();
//	RETAILMSG(1,(TEXT("-:%d\r\n"),(old_time - time)));

}

DWORD CameraCaptureThread(LPVOID Context)
{
	unsigned char tmp=0;
	static unsigned int time,old_time;
	static unsigned int cam_intr;
	PUSBCAM_CONTEXT pUsbCam=(PUSBCAM_CONTEXT)Context;
	static unsigned short transfer_data[PQVGA_XSIZE*PQVGA_YSIZE];
	while(1)
	{
		CAM_Read(pUsbCam,(LPVOID)transfer_data,sizeof(transfer_data));
		WaitForSingleObject(pUsbCam->BulkIn.hEvent, DisplayTime);
		ResetEvent(pUsbCam->BulkIn.hEvent);	
		RETAILMSG(MSG_EN_1,(_T("CameraCaptureThread(%d)++\r\n"), frame_count));

		
		//if( DisplayEnable )
		{

			frame_count++;	
			

			// display the image	
//			if ((DRIVER_PREVIEW_ENABLE == 1) & (cam_intr == BIT_SUB_CAM_P))
				Display_Cam_Image(64, 64, QCIF_XSIZE, QCIF_YSIZE, (U8*)transfer_data);
		
		}
	}
}

BOOL CAM_Close(PUSBCAM_CONTEXT Context)
{
   PUSBCAM_CONTEXT pUsbCam = Context;

   RETAILMSG(1,(TEXT("CAM_Close(0x%x)\n"),pUsbCam));

   if ( VALID_CONTEXT( pUsbCam ) ) {

      EnterCriticalSection(&pUsbCam->Lock);

      pUsbCam->Flags.Open = FALSE;
	fzc3xx.stop0(pUsbCam);
      LeaveCriticalSection(&pUsbCam->Lock);

      //
      // Note: any waiters are run as soon as we signal this event
      //
      return SetEvent( pUsbCam->hCloseEvent );

   } else {
      DEBUGMSG( ZONE_ERR,(TEXT("LPT_Close: ERROR_INVALID_HANDLE\n")));
        SetLastError(ERROR_INVALID_HANDLE);
      return FALSE;
   }

	return TRUE;
}
BOOL CAM_Deinit(PUSBCAM_CONTEXT pUsbCam)
{
   BOOL  bRc = FALSE;

   RETAILMSG(1, (TEXT(">CAM_Deinit\n")));

   if ( VALID_CONTEXT( pUsbCam ) ) {

      EnterCriticalSection( &pUsbCam->Lock );

     bRc = TRUE;

      LeaveCriticalSection(&pUsbCam->Lock);

   }

   return bRc;
}
BOOL CAM_IOControl(PUSBCAM_CONTEXT pUsbCam,DWORD dwCode,PBYTE pBufIn,DWORD dwLenIn,PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut)
{
    BOOL RetVal = TRUE;
    DWORD dwErr = ERROR_SUCCESS;    
	static unsigned int time=0,old_time=0;

	switch (dwCode)
	{

//-----------------------------------------------------------------------------------------

		case IOCTL_CAM_SHOW :
			// Charlie. Show Menu
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SHOW(%x)\r\n"),dwLenIn));
			break;

		case IOCTL_CAM_HIDE :
			// Charlie. Close display window
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_HIDE\r\n")));
			break;

		case IOCTL_CAM_SETPOS : 
			time = GetTickCount();
//			RETAILMSG(MSG_EN_1,(TEXT("Capture time:%d msec\r\n"), (time-old_time)));
			RETAILMSG(MSG_EN_1,(TEXT("Capture time:%d msec\r\n"), (time)));
			old_time = time;
			break;
		
		case CAM_IOCTL_MOVIE_START:			// for MPEG4
		case IOCTL_CAM_CONT : 
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_CONT\r\n")));
			// Charlie. Play
			//DisplayEnable = 1;
			fzc3xx.start(pUsbCam);
			// Enable camera interrupt

			frame_count = 0;		// for MPEG4
			break;
		
		case CAM_IOCTL_MOVIE_STOP:		// for MPEG4
		case IOCTL_CAM_STOP : 
			// Charlie. Stop
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_STOP\r\n")));
			// Disable camera interrupt
			fzc3xx.stop0(pUsbCam);
			//DisplayEnable = 0;
			DRIVER_PREVIEW_ENABLE = 2;
			DisplayTime = INFINITE;
			break;

		// for MPEG4
		case CAM_IOCTL_GET_LATEST_FRAME:
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:CAM_IOCTL_GET_LATEST_FRAME\r\n")));
			//RETAILMSG(MSG_EN_1,(TEXT("pBufIn = 0x%x\r\n"), pBufIn));
			//RETAILMSG(MSG_EN_1,(TEXT("no function available, TBD\r\n")));
			if (frame_count < 2) {
				RETAILMSG(1,(TEXT("CAMERA:CAM_IOCTL_GET_LATEST_FRAME - frame not available!!!\r\n")));
				return FALSE;
			}
			Tick_GET_FRAME_PREV = Tick_GET_FRAME_CUR;
			Tick_GET_FRAME_CUR = GetTickCount();
//			Copy_Cam_Image(pBufOut, QCIF_XSIZE, QCIF_YSIZE, PORT_A);
			break;

		case CAM_IOCTL_SAMSUNG_CAM:		// ID=0x520
			RETAILMSG(MSG_EN_1,(_T("CAM_IOCTL_SAMSUNG_CAM\r\n")));
			//Samsung_camcoder(pBufOut);
			break;

		case CAM_IOCTL_SAMSUNG_CAM_PR:	// ID=0x522
			RETAILMSG(MSG_EN_1,(_T("CAM_IOCTL_SAMSUNG_CAM_PR\r\n")));
			//Samsung_camcoder_pr(pBufOut);
			break;

		case CAM_IOCTL_SAMSUNG_PREVIEW_START : // ID=0x523
			DRIVER_PREVIEW_ENABLE = 1;
			RETAILMSG(MSG_EN_1,(_T("CAM_IOCTL_SAMSUNG_PREVIEW_START(%x)\r\n"),*pBufOut, DRIVER_PREVIEW_ENABLE));
			break;

		case CAM_IOCTL_SAMSUNG_PREVIEW_STOP : // ID=0x524
			DRIVER_PREVIEW_ENABLE = 2;
			RETAILMSG(MSG_EN_1,(_T("CAM_IOCTL_SAMSUNG_PREVIEW_STOP(%x)\r\n"),*pBufOut, DRIVER_PREVIEW_ENABLE));
			break;
			
		case IOCTL_CAM_SETGAMMA :
			if( *pBufOut == 1 ){
				DRIVER_PREVIEW_ENABLE = 1;
			}
			else if( *pBufOut == 2 ){
				DRIVER_PREVIEW_ENABLE = 2;
			}
			RETAILMSG(MSG_EN_1,(_T("IOCTL_CAM_SETGAMMA:*pBufOut(%x):DRIVER_PREVIEW_ENABLE(%x)\r\n"),*pBufOut, DRIVER_PREVIEW_ENABLE));
			break;
					
		case CAM_IOCTL_IMAGE_SIZE:		// ID=0x521
			if( *pBufOut == 1 ){
				image_size = 1;
			}
			else if( *pBufOut == 2 ){
				image_size = 2;
			}
			RETAILMSG(MSG_EN_1,(TEXT("image_size:%d,0x%x,0x%x\r\n"),image_size,pBufOut,*pBufOut));			
			
			break;
			
		case IOCTL_CAM_COPY :
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_COPY(dwLenIn:%x)\r\n"), dwLenIn));
			break;

		case IOCTL_CAM_SETCOLKEY :
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETCOLKEY\r\n")));
			break;
			
		case IOCTL_CAM_SETALPHA :
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETALPHA\r\n")));
			break;

		case IOCTL_CAM_GETINFO :
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_GETINFO\r\n")));
			break;

		case IOCTL_CAM_SETSCALE :
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETSCALE\r\n")));
			break;

		case IOCTL_CAM_SETHUE :
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETHUE\r\n")));
			break;
#if 0
		case IOCTL_CAM_SETGAMMA :
		// Get which ping -pong buffer have data
			//DisplayEnable = 0;
			Sleep(200);
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_BUFFER:%d\r\n"),buffer_num));
			break;
#endif
		case IOCTL_CAM_SETWBCOORD : 
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETWBCOORD\r\n")));
			break;

		case IOCTL_CAM_SETAELIMIT :
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETAELIMIT\r\n")));
			break;

		case IOCTL_CAM_SETADCOFS :	
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETADCOFS\r\n")));
			break;

		case IOCTL_CAM_SETWBGAIN :	
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETWBGAIN\r\n")));
			break;

		case IOCTL_CAM_SETCBCRGAIN :
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETCBCRGAIN\r\n")));
			break;

		case IOCTL_CAM_SETLEGAIN :	
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETLEGAIN\r\n")));
			break;

		case IOCTL_CAM_SETBRIGHTNESS :
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETBRIGHTNESS\r\n")));
			pUsbCam->brightness = *pBufOut;
			fzc3xx.set_bright(pUsbCam);
			break;

		case IOCTL_CAM_SETCLIP :
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETCLIP\r\n")));
			break;

		case IOCTL_CAM_SETSLICELMT :
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETSLICELMT\r\n")));
			break;

		case IOCTL_CAM_WBACCLMT :
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_WBACCLMT\r\n")));
			break;

		case IOCTL_CAM_CSEDGELMT :
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_CSEDGELMT\r\n")));
			break;

		case IOCTL_CAM_ENVINT :
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_ENVINT\r\n")));
			break;

		case IOCTL_CAM_DISVINT :
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_DISVINT\r\n")));
			break;

		case IOCTL_CAM_SETCAMERA :
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:IOCTL_CAM_SETCAMERA\r\n")));
			
			break;

		default : 
			RETAILMSG(MSG_EN_1,(TEXT("CAMERA:Ioctl code = 0x%x\r\n"), dwCode));
			return FALSE;

	}
	return TRUE;
}
BOOL InitInterruptThread(PUSBCAM_CONTEXT pUsbCam)
{
	DWORD         threadID;                         // thread ID
	BOOL bSuccess;

     CameraThread = CreateThread(NULL,
                                 0,
                                 (LPTHREAD_START_ROUTINE)CameraCaptureThread,
                                 (LPVOID)pUsbCam,
                                 0,
                                 &threadID);
    
    if (NULL == CameraThread ) {
    	RETAILMSG(1,(TEXT("Create Camera Thread Fail\r\n")));
    }
	
	RETAILMSG(1,(_T("CAMERA.DLL::InterruptThread Initialized.\r\n")));
	return TRUE;
}

PUSBCAM_CONTEXT CAM_Init(PVOID Context)
{
   LPTSTR ActivePath = (LPTSTR)Context; // HKLM\Drivers\Active\xx
   PUSBCAM_CONTEXT pUsbCam = NULL;
   BOOL bRc = FALSE;

   DEBUGMSG(ZONE_LPT_INIT, (TEXT(">CAM_Init(%p)\n"), Context));

   //
   // get our Context
   //

⌨️ 快捷键说明

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