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

📄 camera.cpp

📁 2443 wince5.0 bsp, source code
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		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")));

	s2443INT->INTMSK |= ( 1 << IRQ_CAM );
	s2443INT->INTSUBMSK |= (( 1 << IRQ_SUB_CAM_P )|( 1 << IRQ_SUB_CAM_C ));
	Camif_Capture(CAPTURE_OFF, CAPTURE_OFF);
	//DisplayEnable = 0;
	DRIVER_PREVIEW_ENABLE = 2;
	
	CloseHandle(CameraThread);
	
	//VirtualFree((void*)s2443IOP, sizeof(S3C2443_IOPORT_REG), MEM_RELEASE);
	//VirtualFree((void*)s2443CAM, sizeof(S3C2443_CAM_REG), MEM_RELEASE);
	//VirtualFree((void*)s2443INT, sizeof(S3C2443_INTR_REG), MEM_RELEASE);
	//VirtualFree((void*)s2443PWR, sizeof(S3C2443_CLKPWR_REG), MEM_RELEASE);
	VirtualFree((void*)s2443IOP, 0, MEM_RELEASE);
	VirtualFree((void*)s2443CAM, 0, MEM_RELEASE);
	VirtualFree((void*)s2443INT, 0, MEM_RELEASE);
	VirtualFree((void*)s2443PWR, 0, MEM_RELEASE);

	return TRUE;
} 



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

    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")));
    }
	
	RETAILMSG(1,(_T("CAMERA.DLL::InterruptThread Initialized.\r\n")));
	return TRUE;
}


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

	return TRUE;
}

BOOL CamGpioInit()
{
	s2443IOP->GPJCON = (s2443IOP->GPJCON & ~(0x3ffffff)) | 0x2aaaaaa; 
	s2443IOP->GPJDAT = s2443IOP->GPJDAT & ~(0x1fff); 	
#ifdef EVT1
	s2443IOP->GPJUDP = (s2443IOP->GPJUDP & ~(0x3ffffff)) | 0x1555555; 		// CAM IO PullUpDown Disable setup except CAMRESET
#else
	s2443IOP->GPJUDP = (s2443IOP->GPJUDP & ~(0x3ffffff)) | 0x2AAAAAA; 		// 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
	//
	s2443CAM->CISRCFMT |= (1<<31);		// 2443 board manual recommend   added by jjg 06.07.19
	s2443CAM->CIGCTRL |= (1<<31|1<<29);
	// Don't modify this delay time
	//RETAILMSG(1,(TEXT("Camera I/F Reset\r\n")));
	Delay(1000);
	s2443CAM->CIGCTRL &=	~((1<<31)|(0x3<<27)|(1<<26)|(1<<25)|(1<<24));
	// Wait for Camera module initialization
	Delay(1000);
}	

void Camera_Module_Reset()
{

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

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

	s2443CAM->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
	//s2443IOP->GPGCON &= ~(0x3<<24);
	//s2443IOP->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 (!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);
    }
	
    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;    
	static unsigned int time=0,old_time=0;

	switch (dwCode)
	{

//-----------------------------------------------------------------------------------------
		case IOCTL_POWER_CAPABILITIES: 
        {
            PPOWER_CAPABILITIES ppc;
			RETAILMSG(1, (TEXT("CIS: IOCTL_POWER_CAPABILITIES\r\n")));   
            
			if ( !pdwActualOut || !pBufOut || (dwLenOut < sizeof(POWER_CAPABILITIES)) ) {
                RetVal = FALSE;
                dwErr = ERROR_INVALID_PARAMETER;
                break;
            }
			
            ppc = (PPOWER_CAPABILITIES)pBufOut;
            
            memset(ppc, 0, sizeof(POWER_CAPABILITIES));

            // support D0, D4 
            ppc->DeviceDx = 0x11;

            // Report our power consumption in uAmps rather than mWatts. 
            ppc->Flags = POWER_CAP_PREFIX_MICRO | POWER_CAP_UNIT_AMPS;
            
			// 25 m = 25000 uA
            // TODO: find out a more accurate value
			ppc->Power[D0] = 25000;
            
            *pdwActualOut = sizeof(POWER_CAPABILITIES);
        } break;

		case IOCTL_POWER_SET: 
        {
            CEDEVICE_POWER_STATE NewDx;

            if ( !pdwActualOut || !pBufOut || (dwLenOut < sizeof(CEDEVICE_POWER_STATE)) ) {
                RetVal = FALSE;
                dwErr = ERROR_INVALID_PARAMETER;
                break;
            }
            
            NewDx = *(PCEDEVICE_POWER_STATE)pBufOut;

            if ( VALID_DX(NewDx) ) {
                switch ( NewDx ) {
                case D0:
                    if (m_Dx != D0) {
                        CIS_PowerUp(hOpenContext);
                        m_Dx = D0;
                    }
                    break;

                default:
                    if (m_Dx != (_CEDEVICE_POWER_STATE)D4) {
                        CIS_PowerDown(hOpenContext);
                        m_Dx = (_CEDEVICE_POWER_STATE)D4;
                    }
                    break;
                }

                // return our state
                *(PCEDEVICE_POWER_STATE)pBufOut = m_Dx;

                RETAILMSG(1, (TEXT("CIS: IOCTL_POWER_SET: D%u \r\n"), NewDx));

                *pdwActualOut = sizeof(CEDEVICE_POWER_STATE);
            } else {
                RetVal = FALSE;
                dwErr = ERROR_INVALID_PARAMETER;
            }
            
        } break;

        case IOCTL_POWER_GET: 

            if ( !pdwActualOut || !pBufOut || (dwLenOut < sizeof(CEDEVICE_POWER_STATE)) ) {
                RetVal = FALSE;
                dwErr = ERROR_INVALID_PARAMETER;
                break;
            }

			*(PCEDEVICE_POWER_STATE)pBufOut = m_Dx;

            RETAILMSG(1, (TEXT("CIS: IOCTL_POWER_GET: D%u \r\n"), m_Dx));

            *pdwActualOut = sizeof(CEDEVICE_POWER_STATE);
	        break;

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

		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(MOVIE_START)\r\n")));
			// Charlie. Play
			//DisplayEnable = 1;

			if (bIdlePwrDown == TRUE)
			{
				RETAILMSG(PM_MSG, (_T("[CAM_HW] IOControl CAM_START : Turning Codec On\r\n")));

				CamInterface_PowerUp();
	
				bIdlePwrDown = FALSE;
			}

			// Enable camera interrupt
			s2443INT->INTMSK &= ~( 1 << IRQ_CAM );
			s2443INT->INTSUBMSK &= ~(( 1 << IRQ_SUB_CAM_P )|( 1 << IRQ_SUB_CAM_C ));

			Camif_Capture(CAPTURE_ON, CAPTURE_ON);

			dwDisplayTimeout = DISPLAY_THREAD_TIMEOUT;
			//DisplayTime = DISPLAY_THREAD_TIMEOUT;				// polling mode
			//SetEvent(CameraEvent);

			//s2443IOP->GPGCON &= ~(0x3<<24);
			//s2443IOP->GPGCON |= (0x1<<24);		// EINT20
			frame_count = 0;		// for MPEG4
			break;
		

⌨️ 快捷键说明

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