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

📄 camera.cpp

📁 camera 驱动
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	s2450INT->INTMSK1 |= ( 1 << IRQ_CAM );
	s2450INT->INTSUBMSK |= (( 1 << IRQ_SUB_CAM_P )|( 1 << IRQ_SUB_CAM_C ));
	Camif_Capture(CAPTURE_OFF, CAPTURE_OFF);
	//DisplayEnable = 0;
	DRIVER_PREVIEW_ENABLE = 2;

	CloseHandle(CaptureThread);
	CloseHandle(CaptureEvent);
	CloseHandle(PreviewThread);
	CloseHandle(PreviewEvent);
	
	//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;

    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;
    }
	
	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); 	
	s2450IOP->GPJUDP = s2450IOP->GPJUDP & ~(0x3ffffff); 		// CAM IO PullUpDown Disable setup except CAMRESET

	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 (!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;
    }
	
    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) {
                        Cam_Init();
                        CamInterface_PowerUp();
                        if(m_bOnOff==TRUE)
                        {
                            Camif_Capture(CAPTURE_ON, CAPTURE_ON);
                        }
                        m_Dx = D0;
                    }
                    break;

                default:
                    if (m_Dx != (_CEDEVICE_POWER_STATE)D4) {
                        if(m_bOnOff==TRUE)
                        {
                             Camif_Capture(CAPTURE_OFF, CAPTURE_OFF);
                             m_bOnOff=TRUE;
                        }
                        CamInterface_PowerDown();
                        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;

⌨️ 快捷键说明

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