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

📄 camera.cpp

📁 camera 驱动
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	CamClockOn(FALSE);

	// GPIO control
	// for power down mode, gpio goes to input mode
	s2450IOP->GPJCON = (s2450IOP->GPJCON & ~(0xffffff)) | 0x555555; // CAM IO setup except CAMRESET
	s2450IOP->GPJDAT = s2450IOP->GPJDAT & ~(0xfff); 	// CAM IO DATA pin setup except CAMRESET

	s2450IOP->GPJUDP = s2450IOP->GPJUDP & ~(0xffffff); 		// CAM IO PullUpDown Disable setup except CAMRESET
	
}

void CamInterface_PowerUp(void)
{
	RETAILMSG(PM_MSG, (_T("CamInterface_PowerUp()\r\n")));

	// GPIO control
	s2450IOP->GPJCON = (s2450IOP->GPJCON & ~(0xffffff)) | 0xaaaaaa; // CAM IO setup except CAMRESET
	s2450IOP->GPJDAT = s2450IOP->GPJDAT & ~(0xfff); 	// CAM IO DATA pin setup except CAMRESET

	s2450IOP->GPJUDP = s2450IOP->GPJUDP & ~(0xffffff); 		// CAM IO PullUpDown Disable setup except CAMRESET

	Delay(10);

	// Camera clock on
	CamClockOn(TRUE);
	
	Delay(100);
}

DWORD WINAPI CameraCaptureThread(void)
{
	DWORD	dwCause;

	SetProcPermissions((DWORD)-1);

	while(TRUE)
	{
		RETAILMSG(0, (_T("    WaitForSingleObject : Capture\r\n")));
		dwCause = WaitForSingleObject(CaptureEvent, INFINITE);
		RETAILMSG(0, (_T("    Capture Interrupt!!!\r\n")));

		if (dwCause == WAIT_OBJECT_0) 
		{
			Lock();

			__try
			{
	
				frame_count++;
		
				InterruptDone(g_CamSysIntr_C);

				//RETAILMSG(1,(TEXT("CODEC INTERRUPT\n")));
				Buffer_codec_info_update();
				if (DRIVER_MSDMA_ENABLE == 1)		// MSDMA Mode
				{
					Display_Cam_Image_CODEC(sCAMINFO.nDestWidth,sCAMINFO.nDestHeight);					
					SetMSDMAView(sCAMINFO.nDestWidth, sCAMINFO.nDestHeight,  g_PreviewSize_Width, g_PreviewSize_Height);						
					DRIVER_MSDMA_ENABLE = 2;						
				}
			}
			__except(EXCEPTION_EXECUTE_HANDLER)
			{
				RETAILMSG(PM_MSG, (TEXT("Camera.DLL:InterruptThread() - EXCEPTION: %d"), GetExceptionCode()));
			}
				
			Unlock();
		}
		else
		{
			RETAILMSG(TRUE, (TEXT("[CAM_HW] InterruptThread : Exit %d, Cause %d\r\n"), GetLastError(), dwCause));
		}
	}

	return 0;
}

DWORD WINAPI CameraPreviewThread(void)
{
	DWORD	dwCause;

	SetProcPermissions((DWORD)-1);
	
	while(TRUE)
	{
		RETAILMSG(0, (_T("    WaitForSingleObject : Preview\r\n")));
		dwCause = WaitForSingleObject(PreviewEvent, INFINITE);
		RETAILMSG(0, (_T("    Preview Interrupt!!!\r\n")));
		
		if (dwCause == WAIT_OBJECT_0) 
		{
			Lock();

			__try
			{
				InterruptDone(g_CamSysIntr_P);

				//RETAILMSG(1,(TEXT("PREVIEW INTERRUPT\n")));
				// display the image	
				if (DRIVER_PREVIEW_ENABLE == 1)
				{
					Display_Cam_Image(g_PreviewPos_X,g_PreviewPos_Y,g_PreviewSize_Width, g_PreviewSize_Height, PORT_A);
				}
				if( DRIVER_MSDMA_ENABLE == 2)
				{
					DRIVER_MSDMA_ENABLE = 0;		
					Camif_Capture(CAPTURE_ON, CAPTURE_ON);						
				}
				Buffer_preview_info_update();
			}
			__except(EXCEPTION_EXECUTE_HANDLER)
			{
				RETAILMSG(PM_MSG, (TEXT("Camera.DLL:InterruptThread() - EXCEPTION: %d"), GetExceptionCode()));
			}
				
			Unlock();
		}
		else
		{
			RETAILMSG(TRUE, (TEXT("[CAM_HW] InterruptThread : Exit %d, Cause %d\r\n"), GetLastError(), dwCause));
		}
	}

	return 0;
}

void Virtual_Alloc()
{

	PBYTE pVirtPreviewAddr = NULL;
	PBYTE pVirtCodecAddr = NULL;
	PBYTE pVirtMSDMAAddr = NULL;	
    DMA_ADAPTER_OBJECT Adapter1, Adapter2;

    memset(&Adapter1, 0, sizeof(DMA_ADAPTER_OBJECT));
    Adapter1.InterfaceType = Internal;
    Adapter1.ObjectSize = sizeof(DMA_ADAPTER_OBJECT);

    memset(&Adapter2, 0, sizeof(DMA_ADAPTER_OBJECT));
    Adapter2.InterfaceType = Internal;
    Adapter2.ObjectSize = sizeof(DMA_ADAPTER_OBJECT);

    // Allocate a block of virtual memory (physically contiguous) for the DMA buffers.
    //
    pVirtPreviewAddr = (PBYTE)HalAllocateCommonBuffer(&Adapter1, Preview_Mem_Size, &g_PhysPreviewAddr, FALSE);
    if (pVirtPreviewAddr == NULL)
    {
        RETAILMSG(TRUE, (TEXT("Camera:Virtual_Alloc() - Failed to allocate DMA buffer for Preview.\r\n")));
    }

    pVirtCodecAddr = (PBYTE)HalAllocateCommonBuffer(&Adapter2, Codec_Mem_Size, &g_PhysCodecAddr, FALSE);
    if (pVirtCodecAddr == NULL)
    {
        RETAILMSG(TRUE, (TEXT("Camera:Virtual_Alloc() - Failed to allocate DMA buffer for Codec.\r\n")));
    }

    pVirtMSDMAAddr = (PBYTE)HalAllocateCommonBuffer(&Adapter2, 
					(CAM_SRC_VSIZE*CAM_SRC_HSIZE)+(CAM_SRC_VSIZE*CAM_SRC_HSIZE*2/4), &g_PhysMSDMAAddr, FALSE);

    if (pVirtMSDMAAddr == NULL)
    {
        RETAILMSG(TRUE, (TEXT("Camera:Virtual_Alloc() - Failed to allocate DMA buffer for Codec.\r\n")));
    }


    // GPIO Virtual alloc
	s2450IOP = (volatile S3C2450_IOPORT_REG *) VirtualAlloc(0,sizeof(S3C2450_IOPORT_REG),MEM_RESERVE, PAGE_NOACCESS);
	if(s2450IOP == NULL) {
		RETAILMSG(1,(TEXT("For s2450IOP: VirtualAlloc failed!\r\n")));
	}
	else {
		if(!VirtualCopy((PVOID)s2450IOP,(PVOID)(S3C2450_BASE_REG_PA_IOPORT >> 8),sizeof(S3C2450_IOPORT_REG),PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE )) {
			RETAILMSG(1,(TEXT("For s2450IOP: VirtualCopy failed!\r\n")));
		}
	}
	
    // Camera Virtual alloc
	s2450CAM = (volatile S3C2450_CAM_REG *) VirtualAlloc(0,sizeof(S3C2450_CAM_REG),MEM_RESERVE, PAGE_NOACCESS);
	if(s2450CAM == NULL) {
		RETAILMSG(1,(TEXT("For s2450CAM: VirtualAlloc failed!\r\n")));
	}
	else {
		if(!VirtualCopy((PVOID)s2450CAM,(PVOID)(S3C2450_BASE_REG_PA_CAM >> 8),sizeof(S3C2450_CAM_REG),PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE )) {
			RETAILMSG(1,(TEXT("For s2450CAM: VirtualCopy failed!\r\n")));
		}
	}

	// Interrupt Virtual alloc
	s2450INT = (volatile S3C2450_INTR_REG *) VirtualAlloc(0,sizeof(S3C2450_INTR_REG),MEM_RESERVE, PAGE_NOACCESS);
	if(s2450INT == NULL) {
		RETAILMSG(1,(TEXT("For s2450INT: VirtualAlloc failed!\r\n")));
	}
	else {
		if(!VirtualCopy((PVOID)s2450INT,(PVOID)(S3C2450_BASE_REG_PA_INTR >> 8),sizeof(S3C2450_INTR_REG),PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE )) {
			RETAILMSG(1,(TEXT("For s2450INT: VirtualCopy failed!\r\n")));
		}
	}
	// PWM clock Virtual alloc
	s2450PWR = (volatile S3C2450_CLKPWR_REG *) VirtualAlloc(0,sizeof(S3C2450_CLKPWR_REG),MEM_RESERVE, PAGE_NOACCESS);
	if(s2450PWR == NULL) {
		RETAILMSG(1,(TEXT("For s2450PWR: VirtualAlloc failed!\r\n")));
	}
	else {
		if(!VirtualCopy((PVOID)s2450PWR,(PVOID)(S3C2450_BASE_REG_PA_CLOCK_POWER >>8),sizeof(S3C2450_CLKPWR_REG),PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE )) {
			RETAILMSG(1,(TEXT("For s2450PWR: VirtualCopy failed!\r\n")));
		}
	}
	
    //InitializeCriticalSection(&m_Lock);
    
    
    pCIS->pIORegs = s2450IOP;
	pCIS->pCAMRegs = s2450CAM;
	pCIS->pINTRegs = s2450INT;
	pCIS->pPWRRegs = s2450PWR;

	
}

void Display_Cam_Image(U32 pos_x, U32 pos_y, U32 size_x, U32 size_y, U8 port)
{
	U8 *buffer_rgb;
	U32 y;
	int temp;
	
	//unsigned short *ptr = (unsigned short *)(FRAMEBUF_BASE+0x5dc0);
	
	//static unsigned short transfer_data[QCIF_XSIZE*QCIF_YSIZE];
	static unsigned int time,old_time;
	
	//RETAILMSG(1,(_T("Display_Cam_Image(%d,%d,%d,%d)\r\n"),pos_x,pos_y,size_x,size_y));
	
//	if (port)
	{
		temp = (s2450CAM->CIPRSTATUS>>26)&3;

		if(DRIVER_MSDMA_ENABLE == 0)
			temp = (temp + 2) % 4;				
		else
			temp = (temp + 3) % 4;				
			

		
		switch (temp)
		{
		case 0:
			buffer_rgb = (U8 *)s2450CAM->CIPRCLRSA1;
			break;
		case 1:
			buffer_rgb = (U8 *)s2450CAM->CIPRCLRSA2;
			break;
		case 2:
			buffer_rgb = (U8 *)s2450CAM->CIPRCLRSA3;
			break;
		case 3:
			buffer_rgb = (U8 *)s2450CAM->CIPRCLRSA4;
			break;
		default :
			buffer_rgb = (U8 *)s2450CAM->CIPRCLRSA1;
			break;
		}
	}
	RETAILMSG(MSG_EN_1,(_T("preview buf index = %d\r\n"), temp));

	
	buffer_rgb += VIRTUAL_OFFSET;

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


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

#endif


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

}

void Display_Cam_Image2(U32 size_x, U32 size_y, U8 port)
{
	U8 *buffer_rgb;
	U32 x, y;
	int temp;
	
	//unsigned short *ptr = (unsigned short *)(FRAMEBUF_BASE+0x5dc0);
	
	//static unsigned short transfer_data[QCIF_XSIZE*QCIF_YSIZE];
	static unsigned int time,old_time;

	RETAILMSG(MSG_EN_1,(_T("Display_Cam_Image()\r\n")));
	
//	if (port)
	{
		temp = (s2450CAM->CIPRSTATUS>>26)&3;
		temp = (temp + 2) % 4;
		
		switch (temp)
		{
		case 0:
			buffer_rgb = (U8 *)s2450CAM->CIPRCLRSA1;
			break;
		case 1:
			buffer_rgb = (U8 *)s2450CAM->CIPRCLRSA2;
			break;
		case 2:
			buffer_rgb = (U8 *)s2450CAM->CIPRCLRSA3;
			break;
		case 3:
			buffer_rgb = (U8 *)s2450CAM->CIPRCLRSA4;
			break;
		default :
			buffer_rgb = (U8 *)s2450CAM->CIPRCLRSA1;
			break;
		}
	}
	RETAILMSG(MSG_EN_1,(_T("preview buf index = %d\r\n"), temp));

	RETAILMSG(MSG_EN_1,(_T("buffer_rgb = 0x%x\r\n"), buffer_rgb));

	
	buffer_rgb += VIRTUAL_OFFSET;

	RETAILMSG(MSG_EN_1,(_T("buffer_rgb = 0x%x\r\n"), buffer_rgb));

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


#if 1
SetKMode(TRUE);
      for(y=0;y<240;y++)
      	{
		for (x=0; x<320; x++) // YCbCr 4:2:0 format
	{
		*(U16*)((U8*)(IMAGE_FRAMEBUFFER_UA_BASE+y*2+240*(319-x)*2))=*(U16*)((U8*)(buffer_rgb+y*320*2+x*2));
		//memcpy((U8 *)(FRAMEBUF_BASE + (y*2)+240*(319-x)*2),(U8 *)(buffer_rgb+y*320*2+x*2),2);
	}
      	}
SetKMode(FALSE);

#endif

}

void Display_Cam_Image_CODEC(U32 size_x, U32 size_y)
{
	//RETAILMSG(1,(TEXT("codec %x  %d\r\n"),(BYTE*)(g_PhysMSDMAAddr.LowPart), g_CodecFrameSize));
	SetKMode(TRUE);
	memcpy((BYTE*)(g_PhysMSDMAAddr.LowPart + VIRTUAL_ADDR_OFFSET), (BYTE*)y_address, g_CodecFrameSize);
	SetKMode(FALSE);

#if 0
		UINT x,y;
		UINT addr = g_PhysMSDMAAddr.LowPart + VIRTUAL_ADDR_OFFSET;
	       //g_PreviewPos_X,g_PreviewPos_Y,g_PreviewSize_Width, g_PreviewSize_Height
	       DRIVER_PREVIEW_ENABLE = 0;
		SetKMode(TRUE);
	      for(y=0;y<180;y++)
	      	{
			for (x=0; x<240; x++) // YCbCr 4:2:0 format
			{
			*(U16*)((U8*)(IMAGE_FRAMEBUFFER_UA_BASE+y*2*320+x*2))=*((U8*)(y_address+y*352+x));
			}
	      	}
		SetKMode(FALSE);

#endif	
}

BOOL WINAPI  
DllEntry(HANDLE	hinstDLL, 
			DWORD dwReason, 
			LPVOID /* lpvReserved */)
{
	switch(dwReason)
	{
	case DLL_PROCESS_ATTACH:
		DEBUGREGISTER((HINSTANCE)hinstDLL);
		DEBUGMSG(ZONE_INIT,(TEXT("CAMERA: DLL_PROCESS_ATTACH\r\n")));
		return TRUE;
	case DLL_THREAD_ATTACH:
		DEBUGMSG(ZONE_THREAD,(TEXT("CAMERA: DLL_THREAD_ATTACH\r\n")));
		break;
	case DLL_THREAD_DETACH:
		DEBUGMSG(ZONE_THREAD,(TEXT("CAMERA: DLL_THREAD_DETACH\r\n")));
		break;
	case DLL_PROCESS_DETACH:
		DEBUGMSG(ZONE_INIT,(TEXT("CAMERA: DLL_PROCESS_DETACH\r\n")));
		break;
#ifdef UNDER_CE
	case DLL_PROCESS_EXITING:
		DEBUGMSG(ZONE_INIT,(TEXT("CAMERA: DLL_PROCESS_EXITING\r\n")));
		break;
	case DLL_SYSTEM_STARTED:
		DEBUGMSG(ZONE_INIT,(TEXT("CAMERA: DLL_SYSTEM_STARTED\r\n")));
		break;
#endif
	}

	return TRUE;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL CIS_Deinit(DWORD hDeviceContext)
{
	BOOL bRet = TRUE;
	
	RETAILMSG(1,(TEXT("CAMERA: CIS_Deinit\r\n")));

⌨️ 快捷键说明

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