?? post.cpp
字號:
// Ported for 2443 Win CE 5.0
//
#include <windows.h>
#include <nkintr.h>
//#include <oalintr.h>
#include <pm.h>
#include "pmplatform.h"
#include <ceddk.h>
#include <S3c2443.h>
#include <bsp.h>
#include "post.h"
#define PM_MSG 0
#define POST_MSG 0
#define POST_DEBUG 0
#define RETAIL_ON 0
#define DOTNET_DRIVER 1 // 0:PPC, 1:CE.NET
#define POST_CLOCK_OFF_ON_IDLE 0
#if (POST_CLOCK_OFF_ON_IDLE == 1)
#define POST_THREAD_TIMEOUT 3000
#else
#define POST_THREAD_TIMEOUT INFINITE
#endif
volatile S3C2443_IOPORT_REG *s2443IOP = (S3C2443_IOPORT_REG *)S3C2443_BASE_REG_PA_IOPORT;
volatile S3C2443_CAM_REG *s2443CAM = (S3C2443_CAM_REG *)S3C2443_BASE_REG_PA_CAM;
volatile S3C2443_INTR_REG *s2443INT = (S3C2443_INTR_REG *)S3C2443_BASE_REG_PA_INTR;
volatile S3C2443_CLKPWR_REG *s2443PWR = (S3C2443_CLKPWR_REG *)S3C2443_BASE_REG_PA_CLOCK_POWER;
volatile U8 *PostInputBuffer = NULL;
volatile U8 *PostOutputBuffer = NULL;
unsigned char *Post_input_yuv;
unsigned char *Post_output_rgb;
PHYSICAL_ADDRESS g_PhysSrcAddr;
PHYSICAL_ADDRESS g_PhysDstAddr;
PBYTE pVirtSrcAddr = NULL;
PBYTE pVirtDstAddr = NULL;
unsigned int dwPostProcessTimeout = POST_THREAD_TIMEOUT;
BOOL bIdlePwrDown = FALSE;
BOOL bAppOpenFlag = FALSE;
HANDLE PostThread;
HANDLE PostEvent;
HANDLE PostDoneEvent;
// Added yash
//
DWORD gIntrPost = SYSINTR_NOP;
static U32 ADDRStartRGB, ADDREndRGB ,ADDRStartY, ADDREndY;
static U32 ADDRStartCb, ADDREndCb, ADDRStartCr, ADDREndCr;
void Virtual_Alloc(); // Virtual allocation
void Display_POST_Image(U32 pos_x, U32 pos_y, U32 size_x, U32 size_y);
BOOL POSTClockOn(BOOL bOnOff);
void PostInit(POSTINFO *pBufIn);
void PostProcessOn(U8 *pBufIn, U8 *pBufOut);
void PostProcessOnNoMemcpy();
void PostProcessDone(U8 *pBufIn, U8 *pBufOut);
void Post_CalculatePrescaler(U32 SrcSize, U32 DstSize, U32 *ratio,U32 *shift);
DWORD PostProcessThread(void);
BOOL InitInterruptThread();
CEDEVICE_POWER_STATE m_Dx;
#ifdef DEBUG
#define DBG_INIT 0x0001
#define DBG_OPEN 0x0002
#define DBG_READ 0x0004
#define DBG_WRITE 0x0008
#define DBG_CLOSE 0x0010
#define DBG_IOCTL 0x0020
#define DBG_THREAD 0x0040
#define DBG_EVENTS 0x0080
#define DBG_CRITSEC 0x0100
#define DBG_FLOW 0x0200
#define DBG_IR 0x0400
#define DBG_NOTHING 0x0800
#define DBG_ALLOC 0x1000
#define DBG_FUNCTION 0x2000
#define DBG_WARNING 0x4000
#define DBG_ERROR 0x8000
DBGPARAM dpCurSettings = {
TEXT("postdriver"), {
TEXT("Init"),TEXT("Open"),TEXT("Read"),TEXT("Write"),
TEXT("Close"),TEXT("Ioctl"),TEXT("Thread"),TEXT("Events"),
TEXT("CritSec"),TEXT("FlowCtrl"),TEXT("Infrared"),TEXT("User Read"),
TEXT("Alloc"),TEXT("Function"),TEXT("Warning"),TEXT("Error")},
0
};
#define ZONE_INIT DEBUGZONE(0)
#define ZONE_OPEN DEBUGZONE(1)
#define ZONE_READ DEBUGZONE(2)
#define ZONE_WRITE DEBUGZONE(3)
#define ZONE_CLOSE DEBUGZONE(4)
#define ZONE_IOCTL DEBUGZONE(5)
#define ZONE_THREAD DEBUGZONE(6)
#define ZONE_EVENTS DEBUGZONE(7)
#define ZONE_CRITSEC DEBUGZONE(8)
#define ZONE_FLOW DEBUGZONE(9)
#define ZONE_IR DEBUGZONE(10)
#define ZONE_USR_READ DEBUGZONE(11)
#define ZONE_ALLOC DEBUGZONE(12)
#define ZONE_FUNCTION DEBUGZONE(13)
#define ZONE_WARN DEBUGZONE(14)
#define ZONE_ERROR DEBUGZONE(15)
#endif //DEBUG
POSTINFO sPOSTINFO;
CRITICAL_SECTION m_Lock;
void Lock() {EnterCriticalSection(&m_Lock);}
void Unlock() {LeaveCriticalSection(&m_Lock);}
static void Delay(USHORT count)
{
volatile int i, j = 0;
volatile static int loop = S3C2443_FCLK/100000;
for(;count > 0;count--)
for(i=0;i < loop; i++) { j++; }
}
void PostProcessor_PowerDown(void)
{
RETAILMSG(PM_MSG, (_T("PostProcessor_PowerDown()\r\n")));
// Post Processor clock off
PostClockOn(FALSE);
RETAILMSG(POST_MSG, (_T("POST CLK_DOWN\r\n")));
}
void PostProcessor_PowerUp(void)
{
RETAILMSG(PM_MSG, (_T("PostProcessor_PowerUp()\r\n")));
// Post Processor clock on
PostClockOn(TRUE);
RETAILMSG(POST_MSG,(_T("POST CLK_UP\r\n")));
}
DWORD PostProcessThread(void)
{
DWORD dwCause;
SetProcPermissions((DWORD)-1);
while(TRUE)
{
RETAILMSG(PM_MSG, (TEXT("Before WaitForSingleObject(PostEvent,\r\n")));
dwCause = WaitForSingleObject(PostEvent, dwPostProcessTimeout);
RETAILMSG(PM_MSG, (TEXT("After WaitForSingleObject(PostEvent,\r\n")));
if (dwCause == WAIT_OBJECT_0)
{
Lock();
__try
{
RETAILMSG(PM_MSG, (TEXT("Before SetEvent(PostDoneEvent)\r\n")));
SetEvent(PostDoneEvent);
RETAILMSG(PM_MSG, (TEXT("After SetEvent(PostDoneEvent)\r\n")));
InterruptDone(gIntrPost);
RETAILMSG(PM_MSG, (TEXT("After InterruptDone(gIntrPost)\r\n")));
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
RETAILMSG(PM_MSG, (TEXT("[POST] InterruptThread() - EXCEPTION: %d"), GetExceptionCode()));
}
Unlock();
}
else if (dwCause == WAIT_TIMEOUT)
{
RETAILMSG(PM_MSG, (TEXT("WAIT_TIMEOUT\n")));
//RETAILMSG(1, (TEXT("IOCTL_POST_RUN: %d"), IOCTL_POST_RUN));
//RETAILMSG(1, (TEXT("IOCTL_POST_STOP: %d"), IOCTL_POST_STOP));
Lock();
//RETAILMSG(PM_MSG,(_T("[POST] InterruptThread Timeout : %d msec\r\n"), dwPostProcessTimeout));
dwPostProcessTimeout = INFINITE; // reset timeout until Post Interrupt occurs
bIdlePwrDown = TRUE; // Post is off
PostProcessor_PowerDown();
RETAILMSG(PM_MSG, (TEXT("[POST]Post Processor PowerDown Mode\r\n")));
Unlock();
}
else
{
RETAILMSG(PM_MSG, (TEXT("[POST] InterruptThread : Exit %d, Cause %d\r\n"), GetLastError(), dwCause));
}
}
return 0;
}
void Virtual_Alloc()
{
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.
//
pVirtSrcAddr = (PBYTE)HalAllocateCommonBuffer(&Adapter1, 0x71000, &g_PhysSrcAddr, FALSE);
if (pVirtSrcAddr == NULL)
{
RETAILMSG(TRUE, (TEXT("Camera:Virtual_Alloc() - Failed to allocate DMA buffer for Source.\r\n")));
}
pVirtDstAddr = (PBYTE)HalAllocateCommonBuffer(&Adapter2, 0x96000, &g_PhysDstAddr, FALSE);
if (pVirtDstAddr == NULL)
{
RETAILMSG(TRUE, (TEXT("Camera:Virtual_Alloc() - Failed to allocate DMA buffer for Destination.\r\n")));
}
// GPIO Virtual alloc
s2443IOP = (volatile S3C2443_IOPORT_REG*) VirtualAlloc(0,sizeof(S3C2443_IOPORT_REG),MEM_RESERVE, PAGE_NOACCESS);
if(s2443IOP == NULL) {
RETAILMSG(1,(TEXT("For s2443IOP: VirtualAlloc failed!\r\n")));
}
else {
if(!VirtualCopy((PVOID)s2443IOP,(PVOID)(S3C2443_BASE_REG_PA_IOPORT>>8),sizeof(S3C2443_IOPORT_REG),PAGE_READWRITE | PAGE_NOCACHE | PAGE_PHYSICAL)) {
RETAILMSG(1,(TEXT("For s2443IOP: VirtualCopy failed!\r\n")));
}
}
// Interrupt Virtual alloc
s2443CAM = (volatile S3C2443_CAM_REG *) VirtualAlloc(0,sizeof(S3C2443_CAM_REG),MEM_RESERVE, PAGE_NOACCESS);
if(s2443INT == NULL) {
RETAILMSG(1,(TEXT("For s2443CAM: VirtualAlloc failed!\r\n")));
}
else {
if(!VirtualCopy((PVOID)s2443CAM,(PVOID)(S3C2443_BASE_REG_PA_CAM>>8),sizeof(S3C2443_CAM_REG),PAGE_READWRITE | PAGE_NOCACHE | PAGE_PHYSICAL)) {
RETAILMSG(1,(TEXT("For s2443CAM: VirtualCopy failed!\r\n")));
}
}
// Interrupt Virtual alloc
s2443INT = (volatile S3C2443_INTR_REG *) VirtualAlloc(0,sizeof(S3C2443_INTR_REG),MEM_RESERVE, PAGE_NOACCESS);
if(s2443INT == NULL) {
RETAILMSG(1,(TEXT("For s2443INT: VirtualAlloc failed!\r\n")));
}
else {
if(!VirtualCopy((PVOID)s2443INT,(PVOID)(S3C2443_BASE_REG_PA_INTR>>8),sizeof(S3C2443_INTR_REG),PAGE_READWRITE | PAGE_NOCACHE | PAGE_PHYSICAL)) {
RETAILMSG(1,(TEXT("For s2443INT: VirtualCopy failed!\r\n")));
}
}
// PWM clock Virtual alloc
s2443PWR = (volatile S3C2443_CLKPWR_REG*) VirtualAlloc(0,sizeof(S3C2443_CLKPWR_REG),MEM_RESERVE, PAGE_NOACCESS);
if(s2443PWR == NULL) {
RETAILMSG(1,(TEXT("For s2443PWR: VirtualAlloc failed!\r\n")));
}
else {
if(!VirtualCopy((PVOID)s2443PWR,(PVOID)(S3C2443_BASE_REG_PA_CLOCK_POWER>>8),sizeof(S3C2443_CLKPWR_REG),PAGE_READWRITE | PAGE_NOCACHE | PAGE_PHYSICAL)) {
RETAILMSG(1,(TEXT("For s2443PWR: VirtualCopy failed!\r\n")));
}
}
}
void Display_POST_Image(U32 pos_x, U32 pos_y, U32 size_x, U32 size_y)
{
U8 *buffer_rgb;
U32 y;
RETAILMSG(POST_MSG,(_T("Display_POST_Image()\r\n")));
buffer_rgb = (U8 *)PostOutputBuffer;
#if (DOTNET_DRIVER)
SetKMode(TRUE);
#endif
RETAILMSG(POST_MSG,(_T("buffer_rgb = 0x%x\r\n"), buffer_rgb));
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,size_x*2);
buffer_rgb += (size_x*2);
}
#if (DOTNET_DRIVER)
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("POST: DLL_PROCESS_ATTACH\r\n")));
return TRUE;
case DLL_THREAD_ATTACH:
DEBUGMSG(ZONE_THREAD,(TEXT("POST: DLL_THREAD_ATTACH\r\n")));
break;
case DLL_THREAD_DETACH:
DEBUGMSG(ZONE_THREAD,(TEXT("POST: DLL_THREAD_DETACH\r\n")));
break;
case DLL_PROCESS_DETACH:
DEBUGMSG(ZONE_INIT,(TEXT("POST: DLL_PROCESS_DETACH\r\n")));
break;
#ifdef UNDER_CE
case DLL_PROCESS_EXITING:
DEBUGMSG(ZONE_INIT,(TEXT("POST: DLL_PROCESS_EXITING\r\n")));
break;
case DLL_SYSTEM_STARTED:
DEBUGMSG(ZONE_INIT,(TEXT("POST: DLL_SYSTEM_STARTED\r\n")));
break;
#endif
}
return TRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL PST_Deinit(DWORD hDeviceContext)
{
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);
BOOL bRet = TRUE;
RETAILMSG(PM_MSG,(TEXT("POST: PST_Deinit\r\n")));
CloseHandle(PostThread);
VirtualFree((void*)s2443IOP, 0, MEM_RELEASE);
VirtualFree((void*)s2443CAM, 0, MEM_RELEASE);
VirtualFree((void*)s2443INT, 0, MEM_RELEASE);
VirtualFree((void*)s2443PWR, 0, MEM_RELEASE);
VirtualFree((void*)PostInputBuffer, 0,MEM_RELEASE);
VirtualFree((void*)PostOutputBuffer,0,MEM_RELEASE);
HalFreeCommonBuffer(&Adapter1, 0x71000, g_PhysSrcAddr, (PVOID)pVirtSrcAddr, FALSE);
HalFreeCommonBuffer(&Adapter2, 0x96000, g_PhysDstAddr, (PVOID)pVirtDstAddr, FALSE);
return TRUE;
}
BOOL InitInterruptThread()
{
DWORD threadID; // thread ID
BOOL bSuccess;
UINT32 Irq;
PostEvent = CreateEvent(NULL, FALSE, FALSE, NULL); //
PostDoneEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
if (!PostEvent||!PostDoneEvent)
{
return FALSE;
}
// Obtain sysintr values from the OAL for the CAMIF interrupt.
//
Irq = IRQ_CAM;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq, sizeof(UINT32), &gIntrPost, sizeof(UINT32), NULL))
{
RETAILMSG(RETAIL_ON, (TEXT("ERROR: Failed to request the post sysintr.\r\n")));
gIntrPost = SYSINTR_UNDEFINED;
return(FALSE);
}
RETAILMSG(RETAIL_ON, (TEXT("POST Interrupt is ....... %d \r\n"), gIntrPost));
bSuccess = InterruptInitialize(gIntrPost, PostEvent, NULL, 0);
RETAILMSG(RETAIL_ON, (TEXT("After InterruptInitialize\r\n")));
if (!bSuccess)
{
RETAILMSG(1,(TEXT("Fail to initialize Post interrupt event\r\n")));
return FALSE;
}
RETAILMSG(RETAIL_ON, (TEXT("PostThread = CreateThread\r\n")));
PostThread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)PostProcessThread,
0,
0,
&threadID);
if (NULL == PostThread ) {
RETAILMSG(1,(TEXT("Create Post Thread Fail\r\n")));
}
RETAILMSG(PM_MSG,(_T("POST.DLL::InterruptThread Initialized.\r\n")));
return TRUE;
}
BOOL PostClockOn(BOOL bOnOff)
{
// Post Processor clock
if (!bOnOff)
s2443PWR->HCLKCON &= ~(1<<8); // Post clock disable
else
s2443PWR->HCLKCON |= (1<<8); // Post clock enable
RETAILMSG(POST_MSG,(_T("PostClockOn = %d\r\n"), bOnOff));
Delay(500);
return TRUE;
}
DWORD PST_Init(DWORD dwContext)
{
// 1. Virtual Alloc
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -