📄 camera.cpp
字号:
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 + -