--- a/baseport/syborg/webcamera/webcamera_pdd.cpp Wed Mar 24 13:46:59 2010 +0900
+++ b/baseport/syborg/webcamera/webcamera_pdd.cpp Mon Oct 18 19:39:25 2010 +0900
@@ -15,72 +15,69 @@
*
*/
+#ifndef __devicePDD_H__
#include "webcamera_pdd.h"
-#include <webcamera_driver.h>
+#endif
+//#include <webcamera_driver.h>
#define DP(format...) Kern::Printf(format)
//Name for PDD
_LIT(KWebcameraPddName,"WebcameraDevice.pdd");
-// ---------------------------------------------------------------
-// ---------------------------------------------------------------
DWebcameraPddFactory::DWebcameraPddFactory()
-{
- DP("DWebcameraPddFactory::DWebcameraPddFactory()");
- iVersion=TVersion(KCommsMajorVersionNumber,KCommsMinorVersionNumber,KCommsBuildVersionNumber);
-}
+ {
+ DP("DWebcameraPddFactory::DWebcameraPddFactory()");
+ iVersion = TVersion(KCommsMajorVersionNumber, KCommsMinorVersionNumber, KCommsBuildVersionNumber);
+ }
TInt DWebcameraPddFactory::Install()
-{
- DP("DWebcameraPddFactory::Install");
- return SetName(&KWebcameraPddName);
-}
+ {
+ DP("DWebcameraPddFactory::Install");
+ return SetName(&KWebcameraPddName);
+ }
void DWebcameraPddFactory::GetCaps(TDes8 &aDes) const
-{
- DP("DWebcameraPddFactory::GetCaps start");
- RWebcameraDevice::TCaps capsBuf;
- capsBuf.iVersion = iVersion;
- aDes.FillZ(aDes.MaxLength());
- TInt size=sizeof(capsBuf);
- if(size>aDes.MaxLength())
- {
- size=aDes.MaxLength();
- }
- aDes.Copy((TUint8*)&capsBuf,size);
- DP("DWebcameraPddFactory::GetCaps end");
-}
+ {
+ DP("DWebcameraPddFactory::GetCaps start");
+ RWebcameraDevice::TCaps capsBuf;
+ capsBuf.iVersion = iVersion;
+ aDes.FillZ(aDes.MaxLength());
+ TInt size = sizeof(capsBuf);
+ if (size>aDes.MaxLength())
+ {
+ size=aDes.MaxLength();
+ }
+ aDes.Copy((TUint8*)&capsBuf, size);
+ DP("DWebcameraPddFactory::GetCaps end");
+ }
TInt DWebcameraPddFactory::Create(DBase*& aChannel, TInt aUnit, const TDesC8* anInfo, const TVersion& aVer)
-{
- DP("DWebcameraPddFactory::Create start");
- DWebcameraDriver* pD=new DWebcameraDriver;
- aChannel=pD;
- TInt r=KErrNoMemory;
- if (pD)
- {
- r=pD->DoCreate(aUnit,anInfo);
- }
- DP("DWebcameraPddFactory::Create end");
- return r;
-}
+ {
+ DP("DWebcameraPddFactory::Create start");
+ DWebcameraDriver* pD = new DWebcameraDriver;
+ aChannel = pD;
+ TInt r = KErrNoMemory;
+ if (pD)
+ {
+ r = pD->DoCreate(aUnit,anInfo);
+ }
+ DP("DWebcameraPddFactory::Create end");
+ return r;
+ }
TInt DWebcameraPddFactory::Validate(TInt aUnit, const TDesC8* /*anInfo*/, const TVersion& aVer)
-{
- DP("DWebcameraPddFactory::Validate start");
- if ((!Kern::QueryVersionSupported(iVersion,aVer)) ||
- (!Kern::QueryVersionSupported(aVer,TVersion(KMinimumLddMajorVersion,KMinimumLddMinorVersion,KMinimumLddBuild))))
- {
+ {
+ DP("DWebcameraPddFactory::Validate start");
+ if ((!Kern::QueryVersionSupported(iVersion,aVer)) ||
+ (!Kern::QueryVersionSupported(aVer, TVersion(KMinimumLddMajorVersion, KMinimumLddMinorVersion, KMinimumLddBuild))))
+ {
return KErrNotSupported;
- }
- DP("DWebcameraPddFactory::Validate end");
- return KErrNone;
-}
-
-// ---------------------------------------------------------------
-// ---------------------------------------------------------------
+ }
+ DP("DWebcameraPddFactory::Validate end");
+ return KErrNone;
+ }
DWebcameraDriver::DWebcameraDriver()
{
@@ -89,98 +86,171 @@
}
DWebcameraDriver::~DWebcameraDriver()
-{
- DP("DWebcameraDriver::~DWebcameraDriver start");
- Interrupt::Unbind(iIrq);
- DP("DWebcameraDriver::~DWebcameraDriver end");
-}
+ {
+ DP("DWebcameraDriver::~DWebcameraDriver start");
+ CloseChunk(EWEBCAMERAINDEXADATABUF);
+ Interrupt::Unbind(iIrq);
+ DP("DWebcameraDriver::~DWebcameraDriver end");
+ }
TInt DWebcameraDriver::DoCreate(TInt aUnit, const TDesC8* anInfo)
-{
- DP("DWebcameraDriver::DoCreate start");
- iPortAddr=KHwSVPWebcameraDevice;
- iIrq = EIrqWebamera;
- Interrupt::Bind(iIrq,Isr,this);
- DP("DWebcameraDriver::DoCreate end");
- return KErrNone;
-}
+ {
+ DP("DWebcameraDriver::DoCreate start");
+ iPortAddr = KHwSVPWebcameraDevice;
+ iIrq = EIrqWebamera;
+
+ Interrupt::Bind(iIrq, Isr, this);
+ DP("DWebcameraDriver::DoCreate end");
+ return KErrNone;
+ }
+
+TInt DWebcameraDriver::PowerOn(TAny* aHeaderPtr)
+ {
+
+ iClient = &Kern::CurrentThread();
+ ((DObject*)iClient)->Open();
+
+ TInt ret = CreateChunk(sizeof(iDataInfo), EWEBCAMERAINDEXHAHEADERBUF);
+ WriteReg(iPortAddr, WEBCAMERA_REG_DMA_INFO, iPhysAddr[EWEBCAMERAINDEXHAHEADERBUF]);
+ WriteReg(iPortAddr, WEBCAMERA_REG_DMA_INFOSIZE, sizeof(iDataInfo));
+ WriteReg(iPortAddr, WEBCAMERA_REG_DMA_CONNECT,0x0);
+
+ kumemget(&iDataInfo, iChunk[EWEBCAMERAINDEXHAHEADERBUF]->Base(), sizeof(TWebcameraDataInfo));
+
+ //Process(Transaction) that parse iDataInfo.
+ DWebCameraDescribe* bDescribe;
+ bDescribe = new DWebCameraDescribe;
+ iUvcData = bDescribe->ParseDataInfo(iDataInfo);
+ delete bDescribe;
-TInt DWebcameraDriver::StartViewerFinder(TUint aBuffer,TInt aSize)
-{
- DP("DWebcameraDriver::StartViewerFinder start");
- iType=0;
- TUint32 temp=(TUint32)aBuffer;
- DP("temp=%x",temp);
- DP("iPortAddr=%x",iPortAddr);
- WriteReg(iPortAddr,WEBCAMERA_REG_DATA_TYPE, 0x0);
- WriteReg(iPortAddr,WEBCAMERA_REG_DMA_ADDR,temp);
- WriteReg(iPortAddr,WEBCAMERA_REG_DMA_SIZE, aSize);
- WriteReg(iPortAddr,WEBCAMERA_REG_INT_ENABLE, 0x1);
- Interrupt::Enable(iIrq);
-
- DP("DWebcameraDriver::StartViewerFinder END");
- return KErrNone;
-}
+ //Store bUVC in TAny* aHeaderPtr.
+ kumemget(aHeaderPtr, &iUvcData, sizeof(TWebcameraUVC));
+
+ CloseChunk(EWEBCAMERAINDEXHAHEADERBUF);
+
+ return ret;
+ }
+
+TInt DWebcameraDriver::InitViewFinder()
+ {
+ TInt ret = KErrNone;
+
+ iClient = &Kern::CurrentThread();
+ ((DObject*)iClient)->Open();
+ ret = CreateChunk(BUFSIZE, EWEBCAMERAINDEXADATABUF);
-TInt DWebcameraDriver::StartCapture(TUint aBuffer,TInt aSize)
-{
- DP("DWebcameraDriver::StartCapture start");
- // Save a pointer to the buffer we need to put the 'recevied' data in
- iType=1;
- TUint32 temp=(TUint32)aBuffer;
- DP("temp=%x",temp);
- WriteReg(iPortAddr,WEBCAMERA_REG_DATA_TYPE, 0x1);
- WriteReg(iPortAddr,WEBCAMERA_REG_DMA_ADDR,temp);
- WriteReg(iPortAddr,WEBCAMERA_REG_DMA_SIZE, aSize);
- WriteReg(iPortAddr,WEBCAMERA_REG_INT_ENABLE, 0x1);
- Interrupt::Enable(iIrq);
-
- DP("DWebcameraDriver::StartCapture END");
- return KErrNone;
-}
+ return ret;
+ }
+
+TInt DWebcameraDriver::StartViewerFinder(TAny* aDataPtr, TInt aSize)
+ {
+ iType = 0;
+
+ WriteReg(iPortAddr, WEBCAMERA_REG_DATA_TYPE, 0x0);
+ WriteReg(iPortAddr, WEBCAMERA_REG_DMA_ADDR, iPhysAddr[EWEBCAMERAINDEXADATABUF]);
+ WriteReg(iPortAddr, WEBCAMERA_REG_DMA_SIZE, aSize);
+ WriteReg(iPortAddr, WEBCAMERA_REG_INT_ENABLE, 0x1);
+
+ kumemget(aDataPtr, iChunk[EWEBCAMERAINDEXADATABUF]->Base(), aSize);
+
+ Interrupt::Enable(iIrq);
+ return KErrNone;
+ }
void DWebcameraDriver::Stop(TUSBStopMode aMode)
-{
- DP("DWebcameraDriver::Stop start");
- WriteReg(iPortAddr, WEBCAMERA_REG_INT_ENABLE, 0x0);
- Interrupt::Disable(iIrq);
- DP("DWebcameraDriver::Stop end");
-}
+ {
+ WriteReg(iPortAddr, WEBCAMERA_REG_INT_ENABLE, 0x0);
+ Interrupt::Disable(iIrq);
+ }
+
+void DWebcameraDriver::Disconnect()
+ {
+ WriteReg(iPortAddr, WEBCAMERA_REG_DMA_DISCONNECT, 0x0);
+ Interrupt::Disable(iIrq);
+ }
void DWebcameraDriver::Isr(TAny* aPtr)
-{
- DP("DWebcameraDriver::Isr start");
- ((DWebcameraDriver*)aPtr)->receivedatacallback();
- DP("DWebcameraDriver::Isr end");
-}
+ {
+ ((DWebcameraDriver*)aPtr)->receivedatacallback();
+ }
void DWebcameraDriver::receivedatacallback()
-{
- DP("DWebcameraDriver::receivedatacallback start");
- TInt datasize=ReadReg(iPortAddr,WEBCAMERA_REG_DMA_SIZE);
- switch (iType)
- {
- case 0:
- iLdd->GetOneFlameComplete(datasize);
- break;
- case 1:
- iLdd->CaptureComplete(datasize);
- break;
- default:
- //
- }
- WriteReg(iPortAddr,WEBCAMERA_REG_DMA_ADDR, 0);
- WriteReg(iPortAddr,WEBCAMERA_REG_DMA_SIZE, 0);
- WriteReg(iPortAddr,WEBCAMERA_REG_INT_ENABLE, 0x0);
- DP("DWebcameraDriver::receivedatacallback end");
-}
+ {
+ TInt datasize = ReadReg(iPortAddr, WEBCAMERA_REG_DMA_SIZE);
+ switch (iType)
+ {
+ case 0:
+ iLdd->GetOneFlameComplete(datasize);
+ break;
+ default:
+ DP("receivedatacallback error");
+ break;
+ }
+ WriteReg(iPortAddr, WEBCAMERA_REG_DMA_ADDR, 0);
+ WriteReg(iPortAddr, WEBCAMERA_REG_DMA_SIZE, 0);
+ WriteReg(iPortAddr, WEBCAMERA_REG_INT_ENABLE, 0x0);
+ }
+
+/**
+Chunk that used between PDD and USB.
+*/
+TInt DWebcameraDriver::CreateChunk(TInt aSize, TWebcameraIndex aIndex)
+ {
+ TLinAddr wChunkLinAddr;
+ TUint32 wChunkMappingAttr;
+ RWebcameraDevice::TChunkInfo chunkInfo;
+
+ TChunkCreateInfo info;
+ info.iType = TChunkCreateInfo::ESharedKernelMultiple;
+ info.iMaxSize = aSize;
+ info.iMapAttr = EMapAttrFullyBlocking;
+ info.iOwnsMemory = ETrue;
+ info.iDestroyedDfc = NULL;
-// ---------------------------------------------------------------
-// ---------------------------------------------------------------
+//Chunk Create
+ iChunk[aIndex] = NULL;
+ iPhysAddr[aIndex] = 0x0;
+ TInt ret = Kern::ChunkCreate(info, iChunk[aIndex], wChunkLinAddr, wChunkMappingAttr);
+ if (ret != KErrNone)
+ {
+ DP("Kern::ChunkCreate Err = %d",ret);
+ }
+ ret = Kern::ChunkCommitContiguous(iChunk[aIndex], 0, aSize, iPhysAddr[aIndex]);
+ if (ret != KErrNone)
+ {
+ DP("Kern::ChunkCommitContiguous Err = %d",ret);
+ }
+
+//Chunk Open
+ // Make handle to chunifo for current thread
+ ret = Kern::MakeHandleAndOpen(iClient, iChunk[aIndex]);
+ if (ret >= 0)
+ {
+ chunkInfo.iChunkHandle = ret;
+ ret = KErrNone;
+ }
+
+ if (ret != KErrNone)
+ {
+ memclr(&chunkInfo, sizeof(chunkInfo));
+ }
+
+ TInt result = Kern::ThreadRawWrite(iClient, &info, &chunkInfo, sizeof(chunkInfo), 0);
+ if (result != KErrNone)
+ {
+ DP("Kern::ChunkCommitContiguous Err = %d",result);
+ }
+ return KErrNone;
+ }
+
+void DWebcameraDriver::CloseChunk(TWebcameraIndex aIndex)
+ {
+ Kern::ChunkClose(iChunk[aIndex]);
+ Kern::SafeClose((DObject*&)iClient, NULL);
+ }
DECLARE_STANDARD_PDD()
-{
- DP("DECLARE_STANDARD_PDD()");
- return new DWebcameraPddFactory;
-}
-
+ {
+ DP("DECLARE_STANDARD_PDD()");
+ return new DWebcameraPddFactory;
+ }