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

📄 camera.cpp

📁 支持三星原产的S3C2413开发板
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				
			Unlock();
			
		}
		else if (dwCause == WAIT_TIMEOUT)
		{
			Lock();
			
			RETAILMSG(PM_MSG,(_T("[CAM_HW] InterruptThread Timeout : %d msec\r\n"), dwDisplayTimeout));
			
			dwDisplayTimeout = INFINITE;				// reset timeout until Camera Interrupt occurs
			bIdlePwrDown = TRUE;					// Codec is off

//			CamInterface_PowerDown();  // commented by PHJ 1105
			RETAILMSG(PM_MSG, (TEXT("[CAM_HW] InterruptThread : bIdlePwrDown = TRUE\r\n")));

			Unlock();
		}
		else
		{
			RETAILMSG(PM_MSG, (TEXT("[CAM_HW] InterruptThread : Exit %d, Cause %d\r\n"), GetLastError(), dwCause));
		}
	}

	return 0;
}



void Virtual_Alloc()
{

	PBYTE pVirtPreviewAddr = NULL;
	PBYTE pVirtCodecAddr = 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.
    //
    // for 2440
/*    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")));
    }

    // GPIO Virtual alloc
	s2413IOP = (volatile S3C2413_IOPORT_REG *) VirtualAlloc(0,sizeof(S3C2413_IOPORT_REG),MEM_RESERVE, PAGE_NOACCESS);
	if(s2413IOP == NULL) {
		RETAILMSG(1,(TEXT("For s2413IOP: VirtualAlloc failed!\r\n")));
	}
	else {
		if(!VirtualCopy((PVOID)s2413IOP,(PVOID)(S3C2413_BASE_REG_PA_IOPORT >> 8),sizeof(S3C2413_IOPORT_REG),PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE )) {
			RETAILMSG(1,(TEXT("For s2413IOP: VirtualCopy failed!\r\n")));
		}
	}
	
    // Camera Virtual alloc
	s2413CAM = (volatile S3C2413_CAM_REG *) VirtualAlloc(0,sizeof(S3C2413_CAM_REG),MEM_RESERVE, PAGE_NOACCESS);
	if(s2413CAM == NULL) {
		RETAILMSG(1,(TEXT("For s2413CAM: VirtualAlloc failed!\r\n")));
	}
	else {
		if(!VirtualCopy((PVOID)s2413CAM,(PVOID)(S3C2413_BASE_REG_PA_CAM >> 8),sizeof(S3C2413_CAM_REG),PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE )) {
			RETAILMSG(1,(TEXT("For s2413CAM: VirtualCopy failed!\r\n")));
		}
	}

	// Interrupt Virtual alloc
	s2413INT = (volatile S3C2413_INTR_REG *) VirtualAlloc(0,sizeof(S3C2413_INTR_REG),MEM_RESERVE, PAGE_NOACCESS);
	if(s2413INT == NULL) {
		RETAILMSG(1,(TEXT("For s2413INT: VirtualAlloc failed!\r\n")));
	}
	else {
		if(!VirtualCopy((PVOID)s2413INT,(PVOID)(S3C2413_BASE_REG_PA_INTR >> 8),sizeof(S3C2413_INTR_REG),PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE )) {
			RETAILMSG(1,(TEXT("For s2413INT: VirtualCopy failed!\r\n")));
		}
	}
	// PWM clock Virtual alloc
	s2413PWR = (volatile S3C2413_CLKPWR_REG *) VirtualAlloc(0,sizeof(S3C2413_CLKPWR_REG),MEM_RESERVE, PAGE_NOACCESS);
	if(s2413PWR == NULL) {
		RETAILMSG(1,(TEXT("For s2413PWR: VirtualAlloc failed!\r\n")));
	}
	else {
		if(!VirtualCopy((PVOID)s2413PWR,(PVOID)(S3C2413_BASE_REG_PA_CLOCK_POWER >>8),sizeof(S3C2413_CLKPWR_REG),PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE )) {
			RETAILMSG(1,(TEXT("For s2413PWR: VirtualCopy failed!\r\n")));
		}
	}
	
    //InitializeCriticalSection(&m_Lock);
    
    
    pCIS->pIORegs = s2413IOP;
	pCIS->pCAMRegs = s2413CAM;
	pCIS->pINTRegs = s2413INT;
	pCIS->pPWRRegs = s2413PWR;

	
}

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(MSG_EN_1,(_T("Display_Cam_Image()\r\n")));
	
//	if (port)
	{
		temp = (pCIS->pCAMRegs->CICOSTATUS>>26)&3;
		temp = (temp + 2) % 4;
		
		switch (temp)
		{
		case 0:
			buffer_rgb = (U8 *)pCIS->pCAMRegs->CICOYSA1;
			break;
		case 1:
			buffer_rgb = (U8 *)pCIS->pCAMRegs->CICOYSA2;
			break;
		case 2:
			buffer_rgb = (U8 *)pCIS->pCAMRegs->CICOYSA3;
			break;
		case 3:
			buffer_rgb = (U8 *)pCIS->pCAMRegs->CICOYSA4;
			break;
		default :
			buffer_rgb = (U8 *)pCIS->pCAMRegs->CICOYSA1;
			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+ (240*pos_y + pos_x) + y*240*2),(void *)buffer_rgb,(PREVIEW_X)*2);
		memcpy((void *)(IMAGE_FRAMEBUFFER_UA_BASE+ (240*pos_y + pos_x) + y*240*2),(void *)buffer_rgb,(PREVIEW_X)*2);
		buffer_rgb += (PREVIEW_X*2);
	}
SetKMode(FALSE);

#endif


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

}

#if 0
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 = (s2413CAM->CIPRSTATUS>>26)&3;
		temp = (temp + 2) % 4;
		
		switch (temp)
		{
		case 0:
			buffer_rgb = (U8 *)s2413CAM->CIPRCLRSA1;
			break;
		case 1:
			buffer_rgb = (U8 *)s2413CAM->CIPRCLRSA2;
			break;
		case 2:
			buffer_rgb = (U8 *)s2413CAM->CIPRCLRSA3;
			break;
		case 3:
			buffer_rgb = (U8 *)s2413CAM->CIPRCLRSA4;
			break;
		default :
			buffer_rgb = (U8 *)s2413CAM->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

}

#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;
	
	pCIS->pINTRegs->INTMSK |= ( 1 << IRQ_CAMIF );
	Camif_Capture(CAPTURE_OFF );
	//DisplayEnable = 0;
	DRIVER_PREVIEW_ENABLE = 2;
	
	CloseHandle(CameraThread);
	
	VirtualFree((void*)s2413IOP, 0, MEM_RELEASE);
	VirtualFree((void*)s2413CAM, 0, MEM_RELEASE);
	VirtualFree((void*)s2413INT, 0, MEM_RELEASE);
	VirtualFree((void*)s2413PWR, 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)
	{
		pCIS->pPWRRegs->CLKCON &= ~(1<<15); // Camera clock disable
	}
	else 
	{
		Camera_Clock(CAM_CLK_DIV);
		pCIS->pPWRRegs->CLKCON |= (1<<15); // Camera clock enable
	}
	//RETAILMSG(1,(_T("CamClockOn = %d\r\n"), bOnOff));
	
	Delay(1000);

	return TRUE;
}

BOOL CamGpioInit()
{
	pCIS->pIORegs->GPEDN |= (0x3<<14);
	pCIS->pIORegs->GPECON = (pCIS->pIORegs->GPECON & ~(0xf<<28))|(0xa<<28);
	
	pCIS->pIORegs->GPJDN = 0x1fff;
	pCIS->pIORegs->GPJCON = 0x2aaaaaa;	
	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
	//
	pCIS->pCAMRegs->CIGCTRL|= (1<<31) | (1<<29); //camera I/F soft reset
	Delay(10);
//	RETAILMSG(1, (TEXT("CAM_IF_Reset CIGCTRL1 : %x\n"), pCIS->pCAMRegs->CIGCTRL));
	
	pCIS->pCAMRegs->CIGCTRL&=~(1<<31);	//external camera reset assertion (S5X433,AU70H=low active)	
//	Delay(10);
//	RETAILMSG(1, (TEXT("CAM_IF_Reset CIGCTRL2 : %x\n"), pCIS->pCAMRegs->CIGCTRL));
}	

void Camera_Module_Reset()
{
// 2440
/*	s2413CAM->CIGCTRL |= (1<<30);
	// Don't modify this delay time
	RETAILMSG(1,(TEXT("Camera Module Reset\r\n")));
	//Delay(10);
	Sleep(1);

	s2413CAM->CIGCTRL &= ~(1<<30);
	// Wait for Camera module initialization
	//Delay(100);
	Sleep(10);

	// 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);
*/
// 2413
	pCIS->pCAMRegs->CIGCTRL |= (1<<30); //camera I/F soft reset
	Delay(1);
//	RETAILMSG(1, (TEXT("CAM_Module_Reset CIGCTRL1 : %x\n"), pCIS->pCAMRegs->CIGCTRL));
	pCIS->pCAMRegs->CIGCTRL &=~(1<<30);	//external camera reset assertion (S5X433,AU70H=low active)	
	Delay(10);
//	RETAILMSG(1, (TEXT("CAM_Module_Reset CIGCTRL2 : %x\n"), pCIS->pCAMRegs->CIGCTRL));
	pCIS->pCAMRegs->CIGCTRL |=(1<<30);		//external camera reset deassertion	
//	RETAILMSG(1, (TEXT("CAM_Module_Reset CIGCTRL3 : %x\n"), pCIS->pCAMRegs->CIGCTRL));

}

BOOL Cam_Init()
{

//	sCAMINFO.nDestWidth=VGA_XSIZE;     // VGA_XSIZE by PHJ 1025
//	sCAMINFO.nDestHeight=VGA_YSIZE;    // VGA_YSIZE by PHJ 1025
//	sCAMINFO.nDestWidth=320;     // VGA_XSIZE by PHJ 1025
//	sCAMINFO.nDestHeight=240;    // VGA_YSIZE by PHJ 1025
	sCAMINFO.nDestWidth=PREVIEW_X;     // VGA_XSIZE by PHJ 1025
	sCAMINFO.nDestHeight=PREVIEW_Y;    // VGA_YSIZE by PHJ 1025
//	sCAMINFO.nDestWidth=QCIF_XSIZE;     // VGA_XSIZE by PHJ 1025
//	sCAMINFO.nDestHeight=QCIF_YSIZE;    // VGA_YSIZE by PHJ 1025
	sCAMINFO.nZoomIndex=1;

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

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

	// 4. Camera Module Reset
	Camera_Module_Reset();
	Delay(500);
	
	// 5. set register of camera module through IIC 
	//Camera_Initialize();
	// Use IIC for initialization
	CAM_WriteBlock();

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

//CamInit(sCAMINFO.nDestWidth, sCAMINFO.nDestHeight, 112, 40, (U32)(g_PhysCodecAddr.LowPart));
// 	CamInit(240, 320,112, 40, 0x33800000);
// 	CamInit(QCIF_XSIZE, QCIF_YSIZE, 112, 40, (U32)(g_PhysCodecAddr.LowPart)); //0x33800000);
 	CamInit(PREVIEW_X, PREVIEW_Y, 112, 40, (U32)(g_PhysCodecAddr.LowPart)); //0x33800000);

    RETAILMSG(1,(TEXT("PhysCodecAddress= %x \r\n"), (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")));	

    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);
    }
    RETAILMSG(1, (TEXT("Camera IRQ(DMA1) mapping: [IRQ:%d->sysIRQ:%d].\r\n"), g_CamIrq, g_CamSysIntr));

    InitializeCriticalSection(&pCIS->RegCS);

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

⌨️ 快捷键说明

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