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

📄 camera.cpp

📁 S3C2450BSP开发包,里面有很多资料。可以提供大家参考下。有什么需要解决问题。可以联系我QQ:314661
💻 CPP
📖 第 1 页 / 共 5 页
字号:

	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")));

#if (BSP_TYPE == BSP_SMDK2443)
	s2450INT->INTMSK |= ( 1 << IRQ_CAM );
#elif (BSP_TYPE == BSP_SMDK2450)
	s2450INT->INTMSK1 |= ( 1 << IRQ_CAM );
#endif
	s2450INT->INTSUBMSK |= (( 1 << IRQ_SUB_CAM_P )|( 1 << IRQ_SUB_CAM_C ));
	Camif_Capture(CAPTURE_OFF, CAPTURE_OFF);
	//DisplayEnable = 0;
	DRIVER_PREVIEW_ENABLE = 2;

#if (BSP_TYPE == BSP_SMDK2443)	
	CloseHandle(CameraThread);
#elif (BSP_TYPE == BSP_SMDK2450)
	CloseHandle(CaptureThread);
	CloseHandle(CaptureEvent);
	CloseHandle(PreviewThread);
	CloseHandle(PreviewEvent);
#endif
	
	//VirtualFree((void*)s2450IOP, sizeof(S3C2450_IOPORT_REG), MEM_RELEASE);
	//VirtualFree((void*)s2450CAM, sizeof(S3C2450_CAM_REG), MEM_RELEASE);
	//VirtualFree((void*)s2450INT, sizeof(S3C2450_INTR_REG), MEM_RELEASE);
	//VirtualFree((void*)s2450PWR, sizeof(S3C2450_CLKPWR_REG), MEM_RELEASE);
	VirtualFree((void*)s2450IOP, 0, MEM_RELEASE);
	VirtualFree((void*)s2450CAM, 0, MEM_RELEASE);
	VirtualFree((void*)s2450INT, 0, MEM_RELEASE);
	VirtualFree((void*)s2450PWR, 0, MEM_RELEASE);

	return TRUE;
} 



BOOL InitInterruptThread()
{
	DWORD         threadID;                         // thread ID
	BOOL bSuccess;

#if (BSP_TYPE == BSP_SMDK2443)
    CameraEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    
    if (!CameraEvent)
    {
    	return FALSE;
    }

	bSuccess = InterruptInitialize(g_CamSysIntr, CameraEvent, NULL, 0);
    if (!bSuccess) 
    {
        RETAILMSG(1,(TEXT("Fail to initialize camera interrupt event\r\n")));
        return FALSE;
    }    
	
    CameraThread = CreateThread(NULL,
                                 0,
                                 (LPTHREAD_START_ROUTINE)CameraCaptureThread,
                                 0,
                                 0,
                                 &threadID);
    
    if (NULL == CameraThread ) {
    	RETAILMSG(1,(TEXT("Create Camera Thread Fail\r\n")));
    }
#elif (BSP_TYPE == BSP_SMDK2450)
    CaptureEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

    if (!CaptureEvent)
    {
		RETAILMSG(TRUE,(TEXT("Fail to create camera interrupt event\r\n")));
    	return FALSE;
    }

	bSuccess = InterruptInitialize(g_CamSysIntr_C, CaptureEvent, NULL, 0);
    if (!bSuccess) 
    {
        RETAILMSG(TRUE,(TEXT("Fail to initialize camera interrupt event\r\n")));
        return FALSE;
    }    

    CaptureThread = CreateThread(NULL,
                                 0,
                                 (LPTHREAD_START_ROUTINE)CameraCaptureThread,
                                 0,
                                 0,
                                 &threadID);
    
    if (NULL == CaptureThread ) {
    	RETAILMSG(TRUE,(TEXT("Create Camera Thread Fail\r\n")));
		return FALSE;
    }

    PreviewEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

    if (!PreviewEvent)
    {
		RETAILMSG(TRUE,(TEXT("Fail to create camera interrupt event\r\n")));
    	return FALSE;
    }

	bSuccess = InterruptInitialize(g_CamSysIntr_P, PreviewEvent, NULL, 0);
    if (!bSuccess) 
    {
        RETAILMSG(TRUE,(TEXT("Fail to initialize camera interrupt event\r\n")));
        return FALSE;
    }    

    PreviewThread = CreateThread(NULL,
                                 0,
                                 (LPTHREAD_START_ROUTINE)CameraPreviewThread,
                                 0,
                                 0,
                                 &threadID);
    
    if (NULL == PreviewThread ) {
    	RETAILMSG(TRUE,(TEXT("Create Camera Thread Fail\r\n")));
		return FALSE;
    }
#endif
	
	RETAILMSG(1,(_T("CAMERA.DLL::InterruptThread Initialized.\r\n")));
	return TRUE;
}


BOOL CamClockOn(BOOL bOnOff)
{
	// Camera clock
	if (!bOnOff)
	{
		s2450PWR->HCLKCON &= ~(1<<8); // Camera clock disable
		s2450PWR->SCLKCON &= ~(1<<11); // Camera clock disable		
	}
	else 
	{
		//Camera_Clock(CAM_CLK_DIV);
		Camera_Clock(CAM_CLK_DIV);
		s2450PWR->HCLKCON |= (1<<8); // Camera clock enable
		s2450PWR->SCLKCON |= (1<<11); // Camera clock enable		
	}
	RETAILMSG(1,(_T("CamClockOn = %d\r\n"), bOnOff));
	
	Delay(1000);

	return TRUE;
}

BOOL CamGpioInit()
{
	s2450IOP->GPJCON = (s2450IOP->GPJCON & ~(0x3ffffff)) | 0x2aaaaaa; 
	s2450IOP->GPJDAT = s2450IOP->GPJDAT & ~(0x1fff); 	
#if (BSP_TYPE == BSP_SMDK2443)
#ifdef EVT1
	s2450IOP->GPJUDP = (s2450IOP->GPJUDP & ~(0x3ffffff)) | 0x1555555; 		// CAM IO PullUpDown Disable setup except CAMRESET
#else
	s2450IOP->GPJUDP = (s2450IOP->GPJUDP & ~(0x3ffffff)) | 0x2AAAAAA; 		// CAM IO PullUpDown Disable setup except CAMRESET
#endif	
#elif (BSP_TYPE == BSP_SMDK2450)
	s2450IOP->GPJUDP = s2450IOP->GPJUDP & ~(0x3ffffff); 		// CAM IO PullUpDown Disable setup except CAMRESET
#endif

	Delay(1000);
	
	return TRUE;
}

void CAM_IF_Reset()
{
	// This functin is used on power handler operation.
	// So, you should not use Kernel API functions as like as "Sleep()".

	//
	// Camera (FIMC2.0) I/F Reset
	//
	s2450CAM->CISRCFMT |= (1<<31);		// 2450 board manual recommend   added by jjg 06.07.19
	s2450CAM->CIGCTRL |= (1<<31|1<<29);
	// Don't modify this delay time
	//RETAILMSG(1,(TEXT("Camera I/F Reset\r\n")));
	Delay(1000);
	s2450CAM->CIGCTRL &=	~((1<<31)|(0x3<<27)|(1<<26)|(1<<25)|(1<<24));
	// Wait for Camera module initialization
	Delay(1000);
}	

void Camera_Module_Reset()
{

	s2450CAM->CIGCTRL |= (1<<30);
	// Don't modify this delay time
	//RETAILMSG(1,(TEXT("Camera Module Reset\r\n")));
	Delay(100);

	s2450CAM->CIGCTRL &= ~(1<<30);
	// Wait for Camera module initialization
	Delay(1000);

	s2450CAM->CIGCTRL |= (1<<30);

	// Samsung Camera need delay time between camera clock enable and camera reset.
	//RETAILMSG(1,(TEXT("You need delay time\r\n")));
	//Delay(1000);
	//Sleep(10);
}

BOOL Cam_Init()
{

	sCAMINFO.nDestWidth=352;
	sCAMINFO.nDestHeight=288;
	sCAMINFO.nZoomIndex=1;

   


    // 1. Camera IO setup
    //
	CamGpioInit();

    //
	// 2. Camera i/f reset
       CAM_IF_Reset();
 //    
    // 3. Camera Clock setup
    //
	CamClockOn(TRUE);

	// 4. camera module reset
	Camera_Module_Reset();
	

	// 5. set register of camera module through iic 
	//camera_initialize();
	// use iic for initialization
	Delay(50);			// before using I2C, need some delay added by JJG 06.07.21
	CAM_WriteBlock();

	// to check time
	//s2450IOP->GPGCON &= ~(0x3<<24);
	//s2450IOP->GPGCON |= (0x1<<24);		// EINT20

 	CamInit(sCAMINFO.nDestWidth, sCAMINFO.nDestHeight, g_PreviewSize_Width, g_PreviewSize_Height, 0, 0, (U32)(g_PhysCodecAddr.LowPart), (U32)(g_PhysPreviewAddr.LowPart));

    //RETAILMSG(1,(TEXT("PhysPreviewAddress = %x, PhysCodecAddress= %x \r\n"),(U32)(g_PhysPreviewAddr.LowPart),(U32)(g_PhysCodecAddr.LowPart)));
	return TRUE;
}


DWORD CIS_Init(DWORD dwContext)
{
    DWORD dwErr = ERROR_SUCCESS, bytes;

    RETAILMSG(MSG_EN_1, (TEXT("CIS::CIS_Init() \r\n")));

// Allocate for our main data structure and one of it's fields.
    pCIS = (PCIS_CONTEXT)LocalAlloc( LPTR, sizeof(CIS_CONTEXT) );
    if ( !pCIS )
        return( NULL );
    
    pCIS->Sig = CIS_SIG;	

	// 1. Virtual Alloc
	Virtual_Alloc();

    RETAILMSG(MSG_EN_1, (TEXT("CIS::Virtual_Alloc \r\n")));	

	//RETAILMSG(1, (TEXT("CIS_Init : IOCTL_HAL_REQUEST_SYSINTR \r\n")));
#if (BSP_TYPE == BSP_SMDK2443)
    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_CamIrq, sizeof(UINT32), &g_CamSysIntr, sizeof(UINT32), NULL))
    {
        RETAILMSG(1, (TEXT("ERROR: CIS_INIT: Failed to request sysintr value for Camera interrupt.\r\n")));
        return(0);
    }
#elif (BSP_TYPE == BSP_SMDK2450)
    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_CamIrq_C, sizeof(UINT32), &g_CamSysIntr_C, sizeof(UINT32), NULL))
    {
        RETAILMSG(TRUE, (TEXT("ERROR: Failed to request sysintr value for Camera interrupt.\r\n")));
        return FALSE;
    }

	if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_CamIrq_P, sizeof(UINT32), &g_CamSysIntr_P, sizeof(UINT32), NULL))
    {
        RETAILMSG(TRUE, (TEXT("ERROR: Failed to request sysintr value for Camera interrupt.\r\n")));
        return FALSE;
    }
#endif
	
    InitializeCriticalSection(&pCIS->RegCS);

    RETAILMSG(MSG_EN_1, (TEXT("CIS::InitializeCriticalSection \r\n")));

    //
    // Init I2C
    //
    pCIS->hI2C = CreateFile( L"I2C0:",
                             GENERIC_READ|GENERIC_WRITE,
                             FILE_SHARE_READ|FILE_SHARE_WRITE,
                             NULL, OPEN_EXISTING, 0, 0);
                   
    if ( INVALID_HANDLE_VALUE == pCIS->hI2C ) {
        dwErr = GetLastError();
        //DEBUGMSG(ZONE_ERR, (TEXT("Error %d opening device '%s' \r\n"), dwErr, L"I2C0:" ));
        RETAILMSG(I2C_MSG, (TEXT("Error %d opening device '%s' \r\n"), dwErr, L"I2C0:" ));
        goto _error_exit;
    }

    RETAILMSG(MSG_EN_1, (TEXT("CIS::CreateFile(\"I2C0\") \r\n")));

    //memset((void*)pCIS->eg, 0, sizeof(pCIS->eg));

    //
    // Gat Fastcall driver-to-driver entrypoints
    //
    if ( !DeviceIoControl(pCIS->hI2C,
                          IOCTL_I2C_GET_FASTCALL, 
                          NULL, 0, 
                          &pCIS->fc, sizeof(pCIS->fc),
                          &bytes, NULL) ) 
    {
        dwErr = GetLastError();
        DEBUGMSG(ZONE_ERR,(TEXT("IOCTL_I2C_GET_FASTCALL ERROR: %u \r\n"), dwErr));
        goto _error_exit;
    }            

    RETAILMSG(MSG_EN_1, (TEXT("CIS::DeviceIoControl \r\n")));

    // Init H/W
    pCIS->State = INITIALIZE;

	Cam_Init();

	if (!InitInterruptThread())
	{
        RETAILMSG(1,(TEXT("Fail to initialize camera interrupt event\r\n")));
        return FALSE;
    }    

    pCIS->Dx = D0;

	m_Dx = (_CEDEVICE_POWER_STATE)D0;
	DevicePowerNotify(_T("CIS1:"),(_CEDEVICE_POWER_STATE)D0, POWER_NAME);

	mInitialized = TRUE;
	return TRUE;

_error_exit:
    return dwErr;	
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL CIS_IOControl(DWORD hOpenContext, 
				   DWORD dwCode, 
				   PBYTE pBufIn, 
				   DWORD dwLenIn, 
				   PBYTE pBufOut, 
				   DWORD dwLenOut, 
				   PDWORD pdwActualOut)
{
    BOOL RetVal = TRUE;
    DWORD dwErr = ERROR_SUCCESS;    

⌨️ 快捷键说明

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