📄 camera.cpp
字号:
Buffer_preview_info_update();
cam_intr &= ~( 1 << IRQ_SUB_CAM_P );
}
if (cam_intr & ( 1 << IRQ_SUB_CAM_C ))
{
Buffer_codec_info_update();
cam_intr &= ~( 1 << IRQ_SUB_CAM_C );
}
// Enable camera interrupt
//s2440INT->INTSUBMSK &= ~(( 1 << IRQ_SUB_CAM_P )|( 1 << IRQ_SUB_CAM_C ));
//s2440INT->INTMSK &= ~( 1 << IRQ_CAM );
//old_time = GetTickCount();
//RETAILMSG(1,(TEXT("-time:%d\r\n"),(old_time-time)));
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
RETAILMSG(PM_MSG, (TEXT("Camera.DLL:InterruptThread() - EXCEPTION: %d"), GetExceptionCode()));
}
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();
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.
//
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
s2440IOP = (volatile S3C2440A_IOPORT_REG *) VirtualAlloc(0,sizeof(S3C2440A_IOPORT_REG),MEM_RESERVE, PAGE_NOACCESS);
if(s2440IOP == NULL) {
RETAILMSG(1,(TEXT("For s2440IOP: VirtualAlloc failed!\r\n")));
}
else {
if(!VirtualCopy((PVOID)s2440IOP,(PVOID)(S3C2440A_BASE_REG_PA_IOPORT >> 8),sizeof(S3C2440A_IOPORT_REG),PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE )) {
RETAILMSG(1,(TEXT("For s2440IOP: VirtualCopy failed!\r\n")));
}
}
// Camera Virtual alloc
s2440CAM = (volatile S3C2440A_CAM_REG *) VirtualAlloc(0,sizeof(S3C2440A_CAM_REG),MEM_RESERVE, PAGE_NOACCESS);
if(s2440CAM == NULL) {
RETAILMSG(1,(TEXT("For s2440CAM: VirtualAlloc failed!\r\n")));
}
else {
if(!VirtualCopy((PVOID)s2440CAM,(PVOID)(S3C2440A_BASE_REG_PA_CAM >> 8),sizeof(S3C2440A_CAM_REG),PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE )) {
RETAILMSG(1,(TEXT("For s2440CAM: VirtualCopy failed!\r\n")));
}
}
// Interrupt Virtual alloc
s2440INT = (volatile S3C2440A_INTR_REG *) VirtualAlloc(0,sizeof(S3C2440A_INTR_REG),MEM_RESERVE, PAGE_NOACCESS);
if(s2440INT == NULL) {
RETAILMSG(1,(TEXT("For s2440INT: VirtualAlloc failed!\r\n")));
}
else {
if(!VirtualCopy((PVOID)s2440INT,(PVOID)(S3C2440A_BASE_REG_PA_INTR >> 8),sizeof(S3C2440A_INTR_REG),PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE )) {
RETAILMSG(1,(TEXT("For s2440INT: VirtualCopy failed!\r\n")));
}
}
// PWM clock Virtual alloc
s2440PWR = (volatile S3C2440A_CLKPWR_REG *) VirtualAlloc(0,sizeof(S3C2440A_CLKPWR_REG),MEM_RESERVE, PAGE_NOACCESS);
if(s2440PWR == NULL) {
RETAILMSG(1,(TEXT("For s2440PWR: VirtualAlloc failed!\r\n")));
}
else {
if(!VirtualCopy((PVOID)s2440PWR,(PVOID)(S3C2440A_BASE_REG_PA_CLOCK_POWER >>8),sizeof(S3C2440A_CLKPWR_REG),PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE )) {
RETAILMSG(1,(TEXT("For s2440PWR: VirtualCopy failed!\r\n")));
}
}
//InitializeCriticalSection(&m_Lock);
pCIS->pIORegs = s2440IOP;
pCIS->pCAMRegs = s2440CAM;
pCIS->pINTRegs = s2440INT;
pCIS->pPWRRegs = s2440PWR;
}
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 = (s2440CAM->CIPRSTATUS>>26)&3;
temp = (temp + 2) % 4;
switch (temp)
{
case 0:
buffer_rgb = (U8 *)s2440CAM->CIPRCLRSA1;
break;
case 1:
buffer_rgb = (U8 *)s2440CAM->CIPRCLRSA2;
break;
case 2:
buffer_rgb = (U8 *)s2440CAM->CIPRCLRSA3;
break;
case 3:
buffer_rgb = (U8 *)s2440CAM->CIPRCLRSA4;
break;
default :
buffer_rgb = (U8 *)s2440CAM->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+ (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)));
}
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 = (s2440CAM->CIPRSTATUS>>26)&3;
temp = (temp + 2) % 4;
switch (temp)
{
case 0:
buffer_rgb = (U8 *)s2440CAM->CIPRCLRSA1;
break;
case 1:
buffer_rgb = (U8 *)s2440CAM->CIPRCLRSA2;
break;
case 2:
buffer_rgb = (U8 *)s2440CAM->CIPRCLRSA3;
break;
case 3:
buffer_rgb = (U8 *)s2440CAM->CIPRCLRSA4;
break;
default :
buffer_rgb = (U8 *)s2440CAM->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
}
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")));
s2440INT->INTMSK |= ( 1 << IRQ_CAM );
s2440INT->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*)s2440IOP, sizeof(S3C2440A_IOPORT_REG), MEM_RELEASE);
//VirtualFree((void*)s2440CAM, sizeof(S3C2440A_CAM_REG), MEM_RELEASE);
//VirtualFree((void*)s2440INT, sizeof(S3C2440A_INTR_REG), MEM_RELEASE);
//VirtualFree((void*)s2440PWR, sizeof(S3C2440A_CLKPWR_REG), MEM_RELEASE);
VirtualFree((void*)s2440IOP, 0, MEM_RELEASE);
VirtualFree((void*)s2440CAM, 0, MEM_RELEASE);
VirtualFree((void*)s2440INT, 0, MEM_RELEASE);
VirtualFree((void*)s2440PWR, 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)
{
s2440PWR->CLKCON &= ~(1<<19); // Camera clock disable
}
else
{
//Camera_Clock(CAM_CLK_DIV);
Camera_Clock(1);
s2440PWR->CLKCON |= (1<<19); // Camera clock enable
}
RETAILMSG(1,(_T("CamClockOn = %d\r\n"), bOnOff));
Delay(1000);
return TRUE;
}
BOOL CamGpioInit()
{
s2440IOP->GPJCON = 0x2aaaaaa;
s2440IOP->GPJDAT = 0;
s2440IOP->GPJUP = 0;//0x1fff;
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
//
//s2440CAM->CTRL_C = (1<<19); // 2440A
s2440CAM->CIGCTRL |= (1<<31);
// Don't modify this delay time
//RETAILMSG(1,(TEXT("Camera I/F Reset\r\n")));
Delay(1000);
//s2440CAM->CTRL_C = (0<<19);
s2440CAM->CIGCTRL &= ~(1<<31);
// Wait for Camera module initialization
Delay(1000);
}
void Camera_Module_Reset()
{
//s2440CAM->CTRL_C = (1<<19); // 2440A
s2440CAM->CIGCTRL |= (1<<30);
// Don't modify this delay time
//RETAILMSG(1,(TEXT("Camera Module Reset\r\n")));
Delay(100);
//s2440CAM->CTRL_C = (0<<19);
s2440CAM->CIGCTRL &= ~(1<<30);
// Wait for Camera module initialization
Delay(1000);
// 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;
// 2. Camera i/f reset
CAM_IF_Reset();
//
// 1. Camera IO setup
//
CamGpioInit();
//
// 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
CAM_WriteBlock();
// to check time
//s2440IOP->GPGCON &= ~(0x3<<24);
//s2440IOP->GPGCON |= (0x1<<24); // EINT20
CamInit(sCAMINFO.nDestWidth, sCAMINFO.nDestHeight, PREVIEW_X, PREVIEW_Y, 120, 100, (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")));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -