12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520 |
- /**************************************************************************//**
- * @file cap.c
- * @version V1.00
- * @brief N9H30 CAP driver source file
- *
- * SPDX-License-Identifier: Apache-2.0
- * @copyright (C) 2018 Nuvoton Technology Corp. All rights reserved.
- *****************************************************************************/
- #include <stdio.h>
- #include <string.h>
- #include "N9H30.h"
- #include "nu_sys.h"
- #include "nu_cap.h"
- /** @addtogroup N9H30_Device_Driver N9H30 Device Driver
- @{
- */
- /** @addtogroup N9H30_CAP_Driver CAP Driver
- @{
- */
- /** @addtogroup N9H30_CAP_EXPORTED_FUNCTIONS CAP Exported Functions
- @{
- */
- /// @cond HIDDEN_SYMBOLS
- PFN_CAP_CALLBACK(pfnCAP_IntHandlerTable)[4] = {0};
- /// @endcond HIDDEN_SYMBOLS
- /**
- * @brief CAP interrupt Handler
- *
- * @param None
- *
- * @return None
- *
- * @details Driver internal use API to process the interrupt of CAP
- * As interrupt occurrence, the register call back function will be executed
- */
- static UINT32 u32EscapeFrame = 0;
- //static UINT32 g_u32DeviceType = 0;
- static void CAP_IntHandler(void)
- {
- UINT32 u32CapInt;
- UINT32 uBuf = 0;
- if ((inp32(REG_CLK_HCLKEN) & (0x1 << 26)) == (0x1 << 26)) /* CMOS sensor interface controller clock enabled */
- {
- u32CapInt = inp32(REG_CAP_INT);
- if ((u32CapInt & (VIEN | VINTF)) == (VIEN | VINTF))
- {
- if (pfnCAP_IntHandlerTable[0] != 0)
- pfnCAP_IntHandlerTable[0](uBuf, uBuf, u32EscapeFrame);
- outp32(REG_CAP_INT, (u32CapInt & ~(MDINTF | ADDRMINTF | MEINTF))); /* Clear Frame end interrupt */
- u32EscapeFrame = u32EscapeFrame + 1;
- }
- else if ((u32CapInt & (ADDRMIEN | ADDRMINTF)) == (ADDRMIEN | ADDRMINTF))
- {
- if (pfnCAP_IntHandlerTable[1] != 0)
- pfnCAP_IntHandlerTable[1](uBuf, uBuf, u32EscapeFrame);
- outp32(REG_CAP_INT, (u32CapInt & ~(MDINTF | VINTF | MEINTF))); /* Clear Address match interrupt */
- }
- else if ((u32CapInt & (MEIEN | MEINTF)) == (MEIEN | MEINTF))
- {
- if (pfnCAP_IntHandlerTable[2] != 0)
- pfnCAP_IntHandlerTable[2](uBuf, uBuf, u32EscapeFrame);
- outp32(REG_CAP_INT, (u32CapInt & ~(MDINTF | VINTF | ADDRMINTF))); /* Clear Memory error interrupt */
- }
- else if ((u32CapInt & (MDIEN | MDINTF)) == (MDIEN | MDINTF))
- {
- if (pfnCAP_IntHandlerTable[3] != 0)
- pfnCAP_IntHandlerTable[3](uBuf, uBuf, u32EscapeFrame);
- outp32(REG_CAP_INT, (u32CapInt & ~(VINTF | MEINTF | ADDRMINTF))); /* Clear Memory error interrupt */
- }
- }
- }
- /**
- * @brief Set Inital Frame
- *
- * @return None
- *
- * @details If enable interrupt, there is internal counter that records how many frames have pass.
- * Set the internal counters to zero. The internal counter may be not a constant
- */
- void CAP_SetInitFrame(void)
- {
- u32EscapeFrame = 0;
- }
- /**
- * @brief Get Inital Frame
- *
- * @retval >0 Internal counters
- *
- * @details If enable interrupt, there is internal counter that records how many frames have pass.
- * Get the internal counters. The internal counter may be not a constant
- */
- UINT32 CAP_GetSkipFrame(void)
- {
- return u32EscapeFrame;
- }
- /**
- * @brief CAP Initial
- *
- * @param[in] bIsEnableSnrClock Enable/Disable sensor clock
- * 1 : Enable
- * 0 : Disable
- * @param[in] eSnrSrc Set CAP clock source. Including :
- * - \ref eCAP_SNR_APLL
- * - \ref eCAP_SNR_UPLL
- * @param[in] u32SensorFreqKHz Specify the sensor clock
- *
- * @return None
- *
- * @details To Initial sensor source clock and frequency for CAP interface
- */
- void CAP_Init(BOOL bIsEnableSnrClock, E_CAP_SNR_SRC eSnrSrc, UINT32 u32SensorFreqKHz/*KHz unit*/)
- {
- UINT32 u32PllClock, u32SenDiv;// u32ExtFreq;
- UINT32 u32Div0, u32Div1;
- UINT32 u32SenSrc;
- volatile UINT32 u32Divider;
- /* MFP_GPI_L : I3=SEN_CLK0, I4=SEN_PCLK, I5=SEN_HSYNC, I6=SEN_VSYNC, I7=SEN_FIFLD*/
- outpw(REG_SYS_GPI_MFPL, (inpw(REG_SYS_GPI_MFPL) & (0x00000FFF)) | 0x33333000);
- /* MFP_GPI_H : SEN_PDATA[0~7]*/
- outpw(REG_SYS_GPI_MFPH, (inpw(REG_SYS_GPI_MFPH) & (0xFFFFFFFF)) | 0x33333333);
- u32SensorFreqKHz = u32SensorFreqKHz * 1000;
- switch (eSnrSrc)
- {
- case eCAP_SNR_APLL:
- u32PllClock = sysGetClock(SYS_APLL) * 1000000;
- u32SenSrc = 0x2 << 19; //APLL for sensor clock
- break;
- case eCAP_SNR_UPLL:
- u32PllClock = sysGetClock(SYS_UPLL) * 1000000;
- u32SenSrc = 0x3 << 19; //UPLL for sensor clock
- break;
- }
- u32SenDiv = u32PllClock / (u32SensorFreqKHz);
- if (u32PllClock % u32SensorFreqKHz != 0) u32SenDiv = u32SenDiv + 1;
- for (u32Div1 = 1; u32Div1 <= 16; u32Div1 = u32Div1 + 1)
- {
- for (u32Div0 = 1; u32Div0 <= 8; u32Div0 = u32Div0 + 1)
- if (u32SenDiv == u32Div0 * u32Div1) break;
- if (u32Div0 >= 9) continue;
- if (u32SenDiv == u32Div0 * u32Div1) break;
- }
- //sysprintf("Div0 and Div1 = %d, %d ", u32Div0, u32Div1);
- u32Div0 = u32Div0 - 1;
- u32Div1 = u32Div1 - 1;
- if (bIsEnableSnrClock)
- {
- outp32(REG_CLK_HCLKEN, inp32(REG_CLK_HCLKEN) | (1 << 27)); /* CMOS Sensor Reference Clock Output Enable */
- outp32(REG_CLK_HCLKEN, inp32(REG_CLK_HCLKEN) | (1 << 26)); /* CMOS Sensor Interface Controller Clock Enable */
- }
- else
- {
- outp32(REG_CLK_HCLKEN, inp32(REG_CLK_HCLKEN) & ~(1 << 27)); /* CMOS Sensor Reference Clock Output Disabled */
- outp32(REG_CLK_HCLKEN, inp32(REG_CLK_HCLKEN) & ~(1 << 26)); /* CMOS Sensor Interface Controller Clock Disabled */
- }
- u32Divider = u32SenSrc | ((u32Div0 << 16) | (u32Div1 << 24)) ;
- //sysprintf("Sensor Divider = 0x%08x\n", u32Divider);
- outp32(REG_CLK_DIVCTL3, (inp32(REG_CLK_DIVCTL3) & ~((0x3 << 19) | (0x7 << 16) | (0xF << 24))) | u32Divider);
- }
- /**
- * @brief CAP Open
- *
- * @param[in] u32SensorFreqKHz Specify the sensor clock
- *
- * @retval 0 Success
- * @retval <0 Error code
- *
- * @details Initialize the CAP engine. Register a call back for driver internal using
- */
- INT32 CAP_Open(UINT32 u32SensorFreqKHz)
- {
- UINT32 u32PllClock;// u32ExtFreq;
- UINT32 u32SenDiv;
- UINT32 u32Div0, u32Div1;
- UINT32 u32SenSrc;
- volatile UINT32 u32Divider;
- u32SensorFreqKHz = u32SensorFreqKHz * 1000;
- outp32(REG_CLK_PMCON, inpw(REG_CLK_PMCON) | (0x1 << 4)) ; /* Sensor clock keep on high level */
- outp32(REG_CLK_HCLKEN, inpw(REG_CLK_HCLKEN) | (0x1 << 26)); /* CMOS sensor interface controller clock enable */
- outp32(REG_SYS_AHBIPRST, inp32(REG_SYS_AHBIPRST) | (1 << 10)); /* Video capture (CMOS sensor interface) reset enable. */
- outp32(REG_SYS_AHBIPRST, inp32(REG_SYS_AHBIPRST) & ~(1 << 10)); /* Video capture (CMOS sensor interface) reset disable */
- switch ((inpw(REG_CLK_DIVCTL3) >> 19) & 0x3)
- {
- case eCAP_SNR_APLL:
- u32PllClock = sysGetClock(SYS_APLL) * 1000000;
- u32SenSrc = 0x2 << 19; //APLL for sensor clock
- break;
- case eCAP_SNR_UPLL:
- u32PllClock = sysGetClock(SYS_UPLL) * 1000000;
- u32SenSrc = 0x3 << 19; //APLL for sensor clock
- break;
- }
- u32SenDiv = u32PllClock / (u32SensorFreqKHz);
- if (u32PllClock % u32SensorFreqKHz != 0)
- u32SenDiv = u32SenDiv + 1;
- for (u32Div1 = 1; u32Div1 <= 16; u32Div1 = u32Div1 + 1)
- {
- for (u32Div0 = 1; u32Div0 <= 8; u32Div0 = u32Div0 + 1)
- {
- if (u32SenDiv == u32Div0 * u32Div1)
- break;
- }
- if (u32Div0 >= 9) continue;
- if (u32SenDiv == u32Div0 * u32Div1)
- break;
- }
- //sysprintf("Div0 and Div1 = %d, %d ", u32Div0, u32Div1);
- u32Div0 = u32Div0 - 1;
- u32Div1 = u32Div1 - 1;
- u32Divider = u32SenSrc | ((u32Div0 << 16) | (u32Div1 << 24)) ;
- //sysprintf("Sensor Divider = 0x%08x\n", u32Divider);
- outp32(REG_CLK_DIVCTL3, (inp32(REG_CLK_DIVCTL3) & ~((0x3 << 19) | (0x7 << 16) | (0xF << 24))) | u32Divider);
- sysInstallISR(IRQ_LEVEL_1, CAP_IRQn, (PVOID)CAP_IntHandler);
- sysEnableInterrupt(CAP_IRQn);
- return Successful;
- }
- /**
- * @brief videoIn Reset
- *
- * @return None
- *
- * @details Capture interface reset.
- */
- void CAP_Reset(void)
- {
- outp32(REG_CAP_CTL, inp32(REG_CAP_CTL) | (VPRST));
- outp32(REG_CAP_CTL, inp32(REG_CAP_CTL) & (~VPRST));
- }
- /**
- * @brief videoIn Close
- *
- * @return None
- *
- * @details Disable pin function,engine clock and interrupt
- */
- void CAP_Close(void)
- {
- // 1. Disable IP's interrupt
- sysDisableInterrupt(CAP_IRQn);
- // 2. Disable IP's clock
- outp32(REG_CLK_HCLKEN, inp32(REG_CLK_HCLKEN) & ~(0x1 << 25));
- CAP_Reset();
- outp32(REG_CLK_HCLKEN, inp32(REG_CLK_HCLKEN) & ~(0x1 << 26));
- // 3. Disable Capture pin function
- }
- /**
- * @brief Configure packet frame buffer.
- *
- * @param[in] bFrameSwitch Software mode buffer select
- * 0: Packet buffer 0
- * 1: Packet buffer 1
- * @return None
- *
- * @details This function set packet frame buffer control
- */
- void CAP_SetPacketFrameBufferControl(BOOL bFrameSwitch)
- {
- UINT32 u32Ctl;
- u32Ctl = inp32(REG_CAP_CTL) & ~(ADDRSW);
- outp32(REG_CAP_CTL, u32Ctl | (bFrameSwitch ? ADDRSW : 0));
- }
- /**
- * @brief Get packet frame buffer.
- *
- * @param pbFrameSwitch Software mode buffer select
- * 0: Packet buffer 0
- * 1: Packet buffer 1
- * @return None
- *
- * @details This function get packet frame buffer control
- */
- void CAP_GetPacketFrameBufferControl(PBOOL pbFrameSwitch)
- {
- UINT32 u32Ctl = inp32(REG_CAP_CTL);
- *pbFrameSwitch = (u32Ctl & ADDRSW) >> 3;
- }
- /**
- * @brief Configure callback function
- *
- * @param[in] eIntType Set interrupt type. Including :
- * - \ref eCAP_MDINTF
- * - \ref eCAP_ADDRMINTF
- * - \ref eCAP_MEINTF
- * - \ref eCAP_VINTF
- * @param[in] pfnCallback Set Callback function.
- * The callbakc function :
- * void (*PFN_CAP_CALLBACK)(UINT8 u8PacketBufID,UINT8 u8PlanarBufID, UINT8 u8FrameRate);
- * @param[in] pfnOldCallback Set Old callback function
- * The callbakc function :
- * void *(*PFN_CAP_CALLBACK)(UINT8 u8PacketBufID,UINT8 u8PlanarBufID, UINT8 u8FrameRate);
- * @retval 0 Success
- * @retval <0 Error code
- *
- * @details This function configure callback function and set trigger level
- */
- INT32 CAP_InstallCallback(E_CAP_INT_TYPE eIntType, PFN_CAP_CALLBACK pfnCallback, PFN_CAP_CALLBACK *pfnOldCallback)
- {
- if (eIntType == eCAP_VINTF)
- {
- *pfnOldCallback = pfnCAP_IntHandlerTable[0];
- pfnCAP_IntHandlerTable[0] = (PFN_CAP_CALLBACK)(pfnCallback);
- }
- else if (eIntType == eCAP_ADDRMINTF)
- {
- *pfnOldCallback = pfnCAP_IntHandlerTable[1];
- pfnCAP_IntHandlerTable[1] = (PFN_CAP_CALLBACK)(pfnCallback);
- }
- else if (eIntType == eCAP_MEINTF)
- {
- *pfnOldCallback = pfnCAP_IntHandlerTable[2];
- pfnCAP_IntHandlerTable[2] = (PFN_CAP_CALLBACK)(pfnCallback);
- }
- else if (eIntType == eCAP_MDINTF)
- {
- *pfnOldCallback = pfnCAP_IntHandlerTable[3];
- pfnCAP_IntHandlerTable[3] = (PFN_CAP_CALLBACK)(pfnCallback);
- }
- else
- return E_CAP_INVALID_INT;
- return Successful;
- }
- /**
- * @brief Enable videoIn interrupt.
- *
- * @param[in] eIntType Interrupt type. Incuding:
- * - \ref eCAP_MDINTF
- * - \ref eCAP_ADDRMINTF
- * - \ref eCAP_MEINTF
- * - \ref eCAP_VINTF
- * @retval 0 Success
- * @retval <0 Error code
- *
- * @details This function is used to enable videoIn interrupt.
- */
- INT32 CAP_EnableInt(E_CAP_INT_TYPE eIntType)
- {
- switch (eIntType)
- {
- case eCAP_MDINTF:
- case eCAP_ADDRMINTF:
- case eCAP_MEINTF:
- case eCAP_VINTF:
- outp32(REG_CAP_INT, inp32(REG_CAP_INT) | eIntType);
- break;
- default:
- return E_CAP_INVALID_INT;
- }
- return Successful;
- }
- /**
- * @brief Disable videoIn interrupt
- *
- * @param[in] eIntType Interrupt type. Incuding:
- * - \ref eCAP_MDINTF
- * - \ref eCAP_ADDRMINTF
- * - \ref eCAP_MEINTF
- * - \ref eCAP_VINTF
- * @retval 0 Success
- * @retval <0 Error code
- *
- * @details This function is used to disable videoIn interrupt.
- */
- INT32 CAP_DisableInt(E_CAP_INT_TYPE eIntType)
- {
- switch (eIntType)
- {
- case eCAP_MDINTF:
- case eCAP_ADDRMINTF:
- case eCAP_MEINTF:
- case eCAP_VINTF:
- outp32(REG_CAP_INT, inp32(REG_CAP_INT) & ~eIntType);
- break;
- default:
- return E_CAP_INVALID_INT;
- }
- return Successful;
- }
- /**
- * @brief Check videoIn interrupt
- *
- * @param[in] eIntType Interrupt type. Incuding:
- * - \ref eCAP_MDINTF
- * - \ref eCAP_ADDRMINTF
- * - \ref eCAP_MEINTF
- * - \ref eCAP_VINTF
- * @retval 1 Enable
- * @retval 0 Disable
- *
- * @details This function is used to check videoIn interrupt.
- */
- BOOL CAP_IsIntEnabled(E_CAP_INT_TYPE eIntType)
- {
- UINT32 u32IntEnable = inp32(REG_CAP_INT);
- switch (eIntType)
- {
- case eCAP_MDINTF:
- u32IntEnable = u32IntEnable & eCAP_MDINTF;
- break;
- case eCAP_ADDRMINTF:
- u32IntEnable = u32IntEnable & eCAP_ADDRMINTF;
- break;
- case eCAP_MEINTF:
- u32IntEnable = u32IntEnable & eCAP_MEINTF;
- break;
- case eCAP_VINTF:
- u32IntEnable = u32IntEnable & eCAP_VINTF;
- break;
- }
- return (u32IntEnable ? TRUE : FALSE);
- }
- /**
- * @brief Clear videoIn interrupt flag.
- *
- * @param[in] eIntType Interrupt type. Incuding:
- * - \ref eCAP_MDINTF
- * - \ref eCAP_ADDRMINTF
- * - \ref eCAP_MEINTF
- * - \ref eCAP_VINTF
- * @retval 0 Success
- * @retval <0 Error code
- *
- * @details This function is used to clear videoIn interrupt flag.
- */
- INT32 CAP_ClearInt(E_CAP_INT_TYPE eIntType)
- {
- UINT32 u32IntChannel = eIntType >> 16;
- switch (eIntType)
- {
- case eCAP_MDINTF:
- outp32(REG_CAP_INT, (inp32(REG_CAP_INT) & ~((eCAP_ADDRMINTF | eCAP_MEINTF | eCAP_VINTF) >> 16)) |
- u32IntChannel);
- break;
- case eCAP_ADDRMINTF:
- outp32(REG_CAP_INT, (inp32(REG_CAP_INT) & ~((eCAP_MDINTF | eCAP_MEINTF | eCAP_VINTF) >> 16)) |
- u32IntChannel);
- break;
- case eCAP_MEINTF:
- outp32(REG_CAP_INT, (inp32(REG_CAP_INT) & ~((eCAP_MDINTF | eCAP_ADDRMINTF | eCAP_VINTF) >> 16)) |
- u32IntChannel);
- break;
- case eCAP_VINTF:
- outp32(REG_CAP_INT, (inp32(REG_CAP_INT) & ~((eCAP_MDINTF | eCAP_MEINTF | eCAP_ADDRMINTF) >> 16)) |
- u32IntChannel);
- break;
- default:
- return E_CAP_INVALID_INT;
- }
- return Successful;
- }
- /**
- * @brief Polling videoIn interrupt flag.
- *
- * @param[in] eIntType Interrupt type. Incuding:
- * - \ref eCAP_MDINTF
- * - \ref eCAP_ADDRMINTF
- * - \ref eCAP_MEINTF
- * - \ref eCAP_VINTF
- * @retval 0 Success
- * @retval <0 Error code
- *
- * @details This function is used to poll videoIn interrupt flag.
- */
- BOOL CAP_PollInt(E_CAP_INT_TYPE eIntType)
- {
- UINT32 u32IntStatus = inp32(REG_CAP_INT);
- switch (eIntType)
- {
- case eCAP_MDINTF:
- u32IntStatus = u32IntStatus & (eCAP_MDINTF >> 16);
- break;
- case eCAP_ADDRMINTF:
- u32IntStatus = u32IntStatus & (eCAP_ADDRMINTF >> 16);
- break;
- case eCAP_MEINTF:
- u32IntStatus = u32IntStatus & (eCAP_MEINTF >> 16);
- break;
- case eCAP_VINTF:
- u32IntStatus = u32IntStatus & (eCAP_VINTF >> 16);
- break;
- }
- return (u32IntStatus ? TRUE : FALSE);
- }
- /**
- * @brief Enable engine clock and turn on the pipe.
- *
- * @param[in] bEngEnable Enable engine clock.
- * 1 : Enable engine clock.
- * 0 : Disable engine clock.
- * @param[in] ePipeEnable Enable pipe type. Incuding:
- * - \ref eCAP_BOTH_PIPE_DISABLE
- * - \ref eCAP_PLANAR
- * - \ref eCAP_PACKET
- * - \ref eCAP_BOTH_PIPE_ENABLE
- * @retval 0 Success
- * @retval <0 Error code
- *
- * @details This function is used to enable engine clock and pipe type.
- */
- void CAP_SetPipeEnable(
- BOOL bEngEnable,
- E_CAP_PIPE ePipeEnable
- )
- {
- outp32(REG_CAP_CTL, (inp32(REG_CAP_CTL) & ~(CAPEN | PKTEN | PLNEN))
- | (((bEngEnable ? CAPEN : 0x0))
- // | ((ePipeEnable & ~(PKTEN | PLNEN))<<5)) );
- | ((ePipeEnable & 0x03) << 5)));
- } // DrvVideoIn_SetPipeEnable
- /**
- * @brief Get engine clock and pipe type.
- *
- * @param[out] pbEngEnable Enable engine clock.
- * 1 : Enable engine clock.
- * 0 : Disable engine clock.
- * @param[out] pePipeEnable Pipe type. Incuding:
- * - \ref eCAP_BOTH_PIPE_DISABLE
- * - \ref eCAP_PLANAR
- * - \ref eCAP_PACKET
- * - \ref eCAP_BOTH_PIPE_ENABLE
- * @return None
- *
- * @details This function is used to get engin clock and pipe type.
- */
- void CAP_GetPipeEnable(PBOOL pbEngEnable, E_CAP_PIPE *pePipeEnable)
- {
- UINT32 u32Temp = inp32(REG_CAP_CTL);
- *pbEngEnable = (u32Temp & CAPEN) ? TRUE : FALSE;
- *pePipeEnable = (E_CAP_PIPE)((u32Temp & (PKTEN | PLNEN)) >> 5);
- } // DrvVideoIn_GetPipeEnable
- /**
- * @brief Set Shadow(Update) Register
- *
- * @details This function is used to reload frame buffer address after
- * setting shoaw(update) register.
- */
- void CAP_SetShadowRegister(void)
- {
- outp32(REG_CAP_CTL, inp32(REG_CAP_CTL) | UPDATE);
- } // DrvVideoIn_SetShadowRegister
- /**
- * @brief Set sensor polarity.
- *
- * @param[in] bVsync Sensor Vsync Polarity.
- * 1 : High Active
- * 0 : Low Active
- * @param[in] bHsync Sensor Hsync Polarity.
- * 1 : High Active
- * 0 : Low Active
- * @param[in] bPixelClk Sensor Vsync Polarity.
- * 1 : Falling Edge
- * 0 : Rising Edig
- * @return None
- *
- * @details This function is used to set sensor polarity.
- */
- void CAP_SetSensorPolarity(BOOL bVsync, BOOL bHsync, BOOL bPixelClk)
- {
- UINT32 u32Polarity, u32RegVal;
- u32RegVal = inp32(REG_CAP_PAR);
- //sysprintf("Enter Register addr = 0x%x\n", (REG_CAP_PAR));
- //sysprintf("Enter Register value = 0x%x\n", u32RegVal);
- u32Polarity = (((bVsync ? VSP : 0x0) | (bHsync ? HSP : 0x0)) | (bPixelClk ? PCLKP : 0x0));
- u32RegVal = (inp32(REG_CAP_PAR) & ~(VSP | HSP | PCLKP)) ;
- //sysprintf("REG_VPEPAR = 0x%x", (u32RegVal | u32Polarity));
- outp32((REG_CAP_PAR), (u32RegVal | u32Polarity));
- }
- /**
- * @brief Get sensor polarity.
- *
- * @param[out] pbVsync Sensor Vsync Polarity.
- * 1 : High Active
- * 0 : Low Active
- * @param[out] pbHsync Sensor Hsync Polarity.
- * 1 : High Active
- * 0 : Low Active
- * @param[out] pbPixelClk Sensor Vsync Polarity.
- * 1 : Falling Edge
- * 0 : Rising Edig
- * @return None
- *
- * @details This function is used to get sensor polarity.
- */
- void CAP_GetSensorPolarity(PBOOL pbVsync, PBOOL pbHsync, PBOOL pbPixelClk)
- {
- UINT32 u32Temp = inp32(REG_CAP_PAR);
- *pbVsync = (u32Temp & VSP) ? TRUE : FALSE;
- *pbHsync = (u32Temp & HSP) ? TRUE : FALSE;
- *pbPixelClk = (u32Temp & PCLKP) ? TRUE : FALSE;
- }
- /**
- * @brief Set data format and order.
- *
- * @param[in] eInputOrder Data order for input format.Including :
- * - \ref eCAP_IN_UYVY = Y0 U0 Y1 V0
- * - \ref eCAP_IN_YUYV = Y0 V0 Y1 U0
- * - \ref eCAP_IN_VYUY = U0 Y0 V0 Y1
- * - \ref eCAP_IN_YVYU = V0 Y0 U0 Y1
- * @param[in] eInputFormat Input data format.Including :
- * - \ref eCAP_IN_YUV422
- * - \ref eCAP_IN_RGB565
- * @param[in] eOutputFormat Sensor Vsync Polarity.Including :
- * - \ref eCAP_OUT_YUV422 = YCbCr422
- * - \ref eCAP_OUT_ONLY_Y = only output Y
- * - \ref eCAP_OUT_RGB555 = rgb555
- * - \ref eCAP_OUT_RGB565 = rgb565
- * @return None
- *
- * @details This function is used to set data format and order.
- */
- void CAP_SetDataFormatAndOrder(E_CAP_ORDER eInputOrder, E_CAP_IN_FORMAT eInputFormat, E_CAP_OUT_FORMAT eOutputFormat)
- {
- outp32((REG_CAP_PAR), (inp32(REG_CAP_PAR) & ~(OUTFMT | INDATORD | INFMT))
- | ((((eInputOrder << 2) & INDATORD)
- | (eInputFormat & INFMT))
- | ((eOutputFormat << 4) & OUTFMT)));
- } // DrvVideoIn_SetDataFormatAndOrder
- /**
- * @brief Get data format and order.
- *
- * @param[out] peInputOrder Data order for input format.Including :
- * - \ref eCAP_IN_UYVY
- * - \ref eCAP_IN_YUYV
- * - \ref eCAP_IN_VYUY
- * - \ref eCAP_IN_YVYU
- * @param[out] peInputFormat Input data format.Including :
- * - \ref eCAP_IN_YUV422
- * - \ref eCAP_IN_RGB565
- * @param[out] peOutputFormat Sensor Vsync Polarity.Including :
- * - \ref eCAP_OUT_YUV422 = YCbCr422
- * - \ref eCAP_OUT_ONLY_Y = only output Y
- * - \ref eCAP_OUT_RGB555 = rgb555
- * - \ref eCAP_OUT_RGB565 = rgb565
- * @return None
- *
- * @details This function is used to get data format and order.
- */
- void CAP_GetDataFormatAndOrder(E_CAP_ORDER *peInputOrder, E_CAP_IN_FORMAT *peInputFormat, E_CAP_OUT_FORMAT *peOutputFormat)
- {
- UINT32 u32Temp = inp32(REG_CAP_PAR);
- *peInputOrder = (E_CAP_ORDER)((u32Temp & INDATORD) >> 2);
- *peInputFormat = (E_CAP_IN_FORMAT)(u32Temp & INFMT);
- *peOutputFormat = (E_CAP_OUT_FORMAT)((u32Temp & OUTFMT) >> 4);
- }
- /**
- * @brief Set planar format.
- *
- * @param[in] ePlanarFmt Data order for input format.Including :
- * - \ref eCAP_PLANAR_YUV422
- * - \ref eCAP_PLANAR_YUV420
- * @return None
- *
- * @details This function is used to set planar format.
- */
- void CAP_SetPlanarFormat(E_CAP_PLANAR_FORMAT ePlanarFmt)
- {
- switch (ePlanarFmt)
- {
- case eCAP_PLANAR_YUV422:
- outp32((REG_CAP_PAR), (inp32(REG_CAP_PAR) & ~(PLNFMT)));
- break;
- case eCAP_PLANAR_YUV420:
- outp32((REG_CAP_PAR), ((inp32(REG_CAP_PAR) | (PLNFMT))));
- break;
- }
- }
- /**
- * @brief Get planar format.
- *
- * @retval - \ref eCAP_PLANAR_YUV422 : Planar format is YUV420.
- * @retval - \ref eCAP_PLANAR_YUV420 : Planar format is YUV422.
- *
- * @details This function is used to get planar format.
- */
- BOOL CAP_GetPlanarFormat(void)
- {
- return ((inp32(REG_CAP_PAR) & PLNFMT) >> 7);
- }
- /**
- * @brief Set motion detection parameter.
- *
- * @param[in] bEnable Enable Motion Detection.Including :
- * 0 : Disable motion detection.
- * 1 : Enable motion detection.
- * @param[in] bBlockSize Motion Detection Block Size.Including :
- * 0 : Block size is set to 16x16.
- * 1 : Block size is set to 8x8.
- * @param[in] bSaveMode Motion Detection Save Mode.Including :
- * 0 : 1 bit DIFF + 7 Y Differential.
- * 1 : 1 bit DIFF only.
- * @return None
- *
- * @details This function is used to set motion detection parameter.
- */
- void CAP_SetMotionDet(BOOL bEnable, BOOL bBlockSize, BOOL bSaveMode)
- {
- outp32(REG_CAP_MD, (inp32(REG_CAP_MD) & ~(MDSM | MDBS | MDEN)) |
- (((bEnable ? MDEN : 0) | (bBlockSize ? MDBS : 0)) |
- (bSaveMode ? MDSM : 0)));
- }
- /**
- * @brief Get motion detection parameter.
- *
- * @param[out] pbEnable Enable Motion Detection.Including :
- * 0 : Disable motion detection.
- * 1 : Enable motion detection.
- * @param[out] pbBlockSize Motion Detection Block Size.Including :
- * 0 : Block size is set to 16x16.
- * 1 : Block size is set to 8x8.
- * @param[out] pbSaveMode Motion Detection Save Mode.Including :
- * 0 : 1 bit DIFF + 7 Y Differential.
- * 1 : 1 bit DIFF only.
- * @return None
- *
- * @details This function is used to get motion detection parameter.
- */
- void CAP_GetMotionDet(PBOOL pbEnable, PBOOL pbBlockSize, PBOOL pbSaveMode)
- {
- UINT32 u32RegData = inp32(REG_CAP_MD);
- *pbEnable = (u32RegData & MDEN);
- *pbBlockSize = (u32RegData & MDBS) >> 8;
- *pbSaveMode = (u32RegData & MDSM) >> 9;
- }
- /**
- * @brief Set motion detection parameter externtion.
- *
- * @param[in] u32DetFreq Motion Detection frequency.Including :
- * 0 : Each frame
- * 1 : Every 2 frame
- * 2 : Every 3 frame
- * 3 : Every 4 frame
- * @param[in] u32Threshold Motion detection threshold.It should be 0~31.
- *
- * @param[in] u32OutBuffer Motion Detection Output Address Register.(Word Alignment)
- *
- * @param[in] u32LumBuffer Motion Detection Temp Y Output Address Register.(Word Alignment)
- *
- * @return None
- *
- * @details This function is used to set motion detection parameter externtion.
- */
- void CAP_SetMotionDetEx(UINT32 u32DetFreq, UINT32 u32Threshold, UINT32 u32OutBuffer, UINT32 u32LumBuffer)
- {
- outp32(REG_CAP_MD, (inp32(REG_CAP_MD) & ~MDDF) | ((u32DetFreq << 10) & MDDF));
- outp32(REG_CAP_MD, (inp32(REG_CAP_MD) & ~MDTHR) | ((u32Threshold << 16) & MDTHR));
- outp32(REG_CAP_MDADDR, u32OutBuffer);
- outp32(REG_CAP_MDYADDR, u32LumBuffer);
- }
- /**
- * @brief Get motion detection parameter externtion.
- *
- * @param[out] pu32DetFreq Motion Detection frequency.Including :
- * 0 : Each frame
- * 1 : Every 2 frame
- * 2 : Every 3 frame
- * 3 : Every 4 frame
- * @param[out] pu32Threshold Motion detection threshold.It should be 0~31.
- *
- * @param[out] pu32OutBuffer Motion Detection Output Address Register.(Word Alignment)
- *
- * @param[out] pu32LumBuffer Motion Detection Temp Y Output Address Register.(Word Alignment)
- *
- * @return None
- *
- * @details This function is used to get motion detection parameter externtion.
- */
- void CAP_GetMotionDetEx(PUINT32 pu32DetFreq, PUINT32 pu32Threshold, PUINT32 pu32OutBuffer, PUINT32 pu32LumBuffer)
- {
- UINT32 u32RegData;
- u32RegData = inp32(REG_CAP_MD);
- *pu32DetFreq = u32RegData & MDDF;
- *pu32Threshold = u32RegData & MDTHR;
- *pu32OutBuffer = inp32(REG_CAP_MDADDR);
- *pu32LumBuffer = inp32(REG_CAP_MDYADDR);
- }
- /**
- * @brief Set motion detection frequency.
- *
- * @param[in] u32DetFreq Motion Detection frequency.Including :
- * 0 : Each frame
- * 1 : Every 2 frame
- * 2 : Every 3 frame
- * 3 : Every 4 frame
- * @return None
- *
- * @details This function is used to set motion detection frequency.
- */
- void CAP_SetMotionDetFreq(UINT32 u32DetFreq)
- {
- outp32(REG_CAP_MD, (inp32(REG_CAP_MD) & ~MDDF) |
- ((u32DetFreq << 10) & MDDF));
- }
- /**
- * @brief Get motion detection frequency.
- *
- * @param[out] pu32DetFreq Motion Detection frequency.Including :
- * 0 : Each frame
- * 1 : Every 2 frame
- * 2 : Every 3 frame
- * 3 : Every 4 frame
- * @return None
- *
- * @details This function is used to get motion detection frequency.
- */
- void CAP_GetMotionDetFreq(PUINT32 pu32DetFreq)
- {
- UINT32 u32RegData;
- u32RegData = inp32(REG_CAP_MD);
- *pu32DetFreq = u32RegData & MDDF;
- }
- /**
- * @brief Set One shutte or continuous mode.
- *
- * @param[in] bIsOneSutterMode Enable One shutte.Including :
- * 1 : Enable One shutte mode.
- * 0 : Disable One shutte mode.
- * @return None
- *
- * @details This function is used to set one shutte or continuous mode.
- * Image capture interface automatically disable the capture
- * inteface after a frame bad been captured.
- */
- void CAP_SetOperationMode(BOOL bIsOneSutterMode)
- {
- outp32(REG_CAP_CTL, (inp32(REG_CAP_CTL) & ~SHUTTER) |
- ((bIsOneSutterMode << 16) & SHUTTER));
- } // DrvVideoIn_SetOperationMode
- /**
- * @brief Get One shutte or continuous mode.
- *
- * @retval 1 : Disable one shutte mode
- * @retval 0 : Enable one shutte mode
- *
- * @details This function is used to get one shutte or continuous mode.
- * Image capture interface automatically disable the capture
- * inteface after a frame bad been captured.
- */
- BOOL CAP_GetOperationMode(void)
- {
- return ((inp32(REG_CAP_CTL) & SHUTTER) ? TRUE : FALSE);
- } // DrvVideoIn_GetOperationMode
- /**
- * @brief Get packet/planar processed data count.
- *
- * @param[in] ePipe Pipe type. Including :
- * - \ref eCAP_PACKET
- * - \ref eCAP_PLANAR
- *
- * @return Get current packet/planar processed data count.
- *
- * @details This function is used to get packet/planar processed data count.
- */
- UINT32 CAP_GetProcessedDataCount(E_CAP_PIPE ePipe)
- {
- if (ePipe == eCAP_PACKET)
- return inp32(REG_CAP_CURADDRP); /* Packet pipe */
- else if (ePipe == eCAP_PLANAR)
- return inp32(REG_CAP_CURADDRY); /* Planar pipe */
- else
- return 0;
- }
- /**
- * @brief Set cropping window vertical/horizontal starting address.
- *
- * @param[in] u32VerticalStart Cropping window vertical starting address.
- * @param[in] u32HorizontalStart Cropping window horizontal starting address.
- *
- * @return None.
- *
- * @details This function is used to set cropping window vertical/horizontal starting address.
- */
- void CAP_SetCropWinStartAddr(UINT32 u32VerticalStart, UINT32 u32HorizontalStart)
- {
- outp32(REG_CAP_CWSP, (inp32(REG_CAP_CWSP) & ~(CWSADDRV | CWSADDRH)) //(Y|X)
- | ((u32VerticalStart << 16)
- | u32HorizontalStart));
- }
- /**
- * @brief Get cropping window vertical/horizontal starting address.
- *
- * @param[out] pu32VerticalStart Cropping window vertical starting address.
- * @param[out] pu32HorizontalStart Cropping window horizontal starting address.
- *
- * @return None.
- *
- * @details This function is used to get cropping window vertical/horizontal starting address.
- */
- void CAP_GetCropWinStartAddr(PUINT32 pu32VerticalStart, PUINT32 pu32HorizontalStart)
- {
- UINT32 u32Temp = inp32(REG_CAP_CWSP);
- *pu32VerticalStart = (u32Temp & CWSADDRV) >> 16;
- *pu32HorizontalStart = u32Temp & CWSADDRH;
- }
- /**
- * @brief Set cropping window size.
- *
- * @param[in] u32Width Cropping window width.
- * @param[in] u32Height Cropping window heigh.
- *
- * @return None.
- *
- * @details This function is used to set cropping window size.
- */
- void CAP_SetCropWinSize(UINT32 u32Height, UINT32 u32Width)
- {
- outp32(REG_CAP_CWS, (inp32(REG_CAP_CWS) & ~(CWH | CWW))
- | ((u32Height << 16)
- | u32Width));
- }
- /**
- * @brief Get cropping window size.
- *
- * @param[out] pu32Width Cropping window width.
- * @param[out] pu32Height Cropping window heigh.
- *
- * @return None.
- *
- * @details This function is used to get cropping window size.
- */
- void CAP_GetCropWinSize(PUINT32 pu32Height, PUINT32 pu32Width)
- {
- UINT32 u32Temp = inp32(REG_CAP_CWS);
- *pu32Height = (u32Temp & CWH) >> 16;
- *pu32Width = u32Temp & CWW;
- }
- /**
- * @brief Set packet/planar scaling vertical factor.
- *
- * @param[in] ePipe Pipe type.Including.
- * - \ref eCAP_PACKET.
- * - \ref eCAP_PLANAR.
- * @param[in] u16Numerator Scaling Vertical Factor N.
- * @param[in] u16Denominator Scaling Vertical Factor M.
- *
- * @retval 0 Success
- * @retval <0 Error code
- *
- * @details This function is used to set packet/planar scaling vertical factor.
- * The output image width will be equal to the image width * N/M.
- * Note: The value of N must be equal to or less than M
- */
- INT32 CAP_SetVerticalScaleFactor(E_CAP_PIPE ePipe, UINT16 u16Numerator, UINT16 u16Denominator)
- {
- UINT8 u8NumeratorL = u16Numerator & 0xFF, u8NumeratorH = u16Numerator >> 8;
- UINT8 u8DenominatorL = u16Denominator & 0xFF, u8DenominatorH = u16Denominator >> 8;
- if (ePipe == eCAP_PACKET)
- {
- outp32(REG_CAP_PKTSL, (inp32(REG_CAP_PKTSL) & ~(PKTSVNL | PKTSVML))
- | ((u8NumeratorL << 24)
- | (u8DenominatorL << 16)));
- outp32(REG_CAP_PKTSM, (inp32(REG_CAP_PKTSM) & ~(PKTSHMH | PKTSVMH))
- | ((u8NumeratorH << 24)
- | (u8DenominatorH << 16)));
- }
- else if (ePipe == eCAP_PLANAR)
- {
- outp32(REG_CAP_PLNSL, (inp32(REG_CAP_PLNSL) & ~(PKTSVNL | PKTSVML))
- | ((u8NumeratorL << 24)
- | (u8DenominatorL << 16)));
- outp32(REG_CAP_PLNSM, (inp32(REG_CAP_PLNSM) & ~(PKTSHMH | PKTSVMH))
- | ((u8NumeratorH << 24)
- | (u8DenominatorH << 16)));
- }
- else
- return E_CAP_INVALID_PIPE;
- return Successful;
- }
- /**
- * @brief Get packet/planar scaling vertical factor.
- *
- * @param[in] ePipe Pipe type.Including.
- * - \ref eCAP_PACKET.
- * - \ref eCAP_PLANAR.
- * @param[out] pu16Numerator Scaling Vertical Factor N.
- * @param[out] pu16Denominator Scaling Vertical Factor M.
- *
- * @retval 0 Success
- * @retval <0 Error code
- *
- * @details This function is used to get packet/planar scaling vertical factor.
- * The output image width will be equal to the image width * N/M.
- * Note: The value of N must be equal to or less than M
- */
- INT32 DrvCAP_GetVerticalScaleFactor(E_CAP_PIPE ePipe, PUINT16 pu16Numerator, PUINT16 pu16Denominator)
- {
- UINT32 u32Temp1, u32Temp2;
- if (ePipe == eCAP_PACKET)
- {
- u32Temp1 = inp32(REG_CAP_PKTSL);
- u32Temp2 = inp32(REG_CAP_PKTSM);
- }
- else if (ePipe == eCAP_PLANAR)
- {
- u32Temp1 = inp32(REG_CAP_PLNSL);
- u32Temp2 = inp32(REG_CAP_PLNSM);
- }
- else
- return E_CAP_INVALID_PIPE;
- *pu16Numerator = ((u32Temp1 & PKTSVNL) >> 24) | (((u32Temp2 & PKTSHMH) >> 24) << 8);
- *pu16Denominator = (u32Temp1 & PKTSVML) >> 16 | (((u32Temp2 & PKTSVMH) >> 16) << 8);
- return Successful;
- }
- /**
- * @brief Set packet/planar scaling horizontal factor.
- *
- * @param[in] bPipe Pipe type.Including.
- * - \ref eCAP_PACKET.
- * - \ref eCAP_PLANAR.
- * @param[in] u16Numerator Scaling Horizontal Factor N.
- * @param[in] u16Denominator Scaling Horizontal Factor M.
- *
- * @retval 0 Success
- * @retval <0 Error code
- *
- * @details This function is used to set packet/planar scaling horizontal factor.
- * The output image width will be equal to the image width * N/M.
- * Note: The value of N must be equal to or less than M
- */
- INT32 CAP_SetHorizontalScaleFactor(E_CAP_PIPE bPipe, UINT16 u16Numerator, UINT16 u16Denominator)
- {
- UINT8 u8NumeratorL = u16Numerator & 0xFF, u8NumeratorH = u16Numerator >> 8;
- UINT8 u8DenominatorL = u16Denominator & 0xFF, u8DenominatorH = u16Denominator >> 8;
- if (bPipe == eCAP_PACKET)
- {
- outp32(REG_CAP_PKTSL, (inp32(REG_CAP_PKTSL) & ~(PKTSHNL | PKTSHML))
- | ((u8NumeratorL << 8)
- | u8DenominatorL));
- outp32(REG_CAP_PKTSM, (inp32(REG_CAP_PKTSM) & ~(PKTSHNH | PKTSHMH))
- | ((u8NumeratorH << 8)
- | u8DenominatorH));
- }
- else if (bPipe == eCAP_PLANAR)
- {
- outp32(REG_CAP_PLNSL, (inp32(REG_CAP_PLNSL) & ~(PKTSHNL | PKTSHML))
- | ((u8NumeratorL << 8)
- | u8DenominatorL));
- outp32(REG_CAP_PLNSM, (inp32(REG_CAP_PLNSM) & ~(PKTSHNH | PKTSHMH))
- | ((u8NumeratorH << 8)
- | u8DenominatorH));
- }
- else
- return E_CAP_INVALID_PIPE;
- return Successful;
- }
- /**
- * @brief Get packet/planar scaling horizontal factor.
- *
- * @param[in] bPipe Pipe type.Including.
- * - \ref eCAP_PACKET.
- * - \ref eCAP_PLANAR.
- * @param[out] pu16Numerator Scaling Horizontal Factor N.
- * @param[out] pu16Denominator Scaling Horizontal Factor M.
- *
- * @retval 0 Success
- * @retval <0 Error code
- *
- * @details This function is used to get packet/planar scaling horizontal factor.
- * The output image width will be equal to the image width * N/M.
- * Note: The value of N must be equal to or less than M.
- */
- INT32 CAP_GetHorizontalScaleFactor(E_CAP_PIPE bPipe, PUINT16 pu16Numerator, PUINT16 pu16Denominator)
- {
- UINT32 u32Temp1, u32Temp2;
- if (bPipe == eCAP_PACKET)
- {
- u32Temp1 = inp32(REG_CAP_PKTSL);
- u32Temp2 = inp32(REG_CAP_PKTSM);
- }
- else if (bPipe == eCAP_PLANAR)
- {
- u32Temp1 = inp32(REG_CAP_PLNSL);
- u32Temp2 = inp32(REG_CAP_PLNSM);
- }
- else
- return E_CAP_INVALID_PIPE;
- *pu16Numerator = ((u32Temp1 & PKTSHNL) >> 8) | (u32Temp2 & PKTSHNH);
- *pu16Denominator = (u32Temp1 & PKTSHML) | ((u32Temp2 & PKTSHMH) << 8);
- return Successful;
- }
- /**
- * @brief Set scaling frame rate factor.
- *
- * @param[in] u8Numerator Scaling Frame Rate Factor N.
- * @param[in] u8Denominator Scaling Frame Rate Factor M.
- *
- * @return None.
- *
- * @details This function is used to set scaling frame rate factor..
- * The output image frame rate will be equal to input image frame rate * (N/M).
- * Note: The value of N must be equal to or less than M.
- */
- void DrvCAP_SetFrameRateScaleFactor(UINT8 u8Numerator, UINT8 u8Denominator)
- {
- outp32(REG_CAP_FRCTL, (inp32(REG_CAP_FRCTL) & ~(FRN | FRM))
- | (((u8Numerator << 8) & FRN)
- | (u8Denominator & FRM)));
- } // DrvVideoIn_SetFrameRateScaleFactor
- /**
- * @brief Get scaling frame rate factor.
- *
- * @param[out] pu8Numerator Scaling Frame Rate Factor N.
- * @param[out] pu8Denominator Scaling Frame Rate Factor M.
- *
- * @return None.
- *
- * @details This function is used to get scaling frame rate factor..
- * The output image frame rate will be equal to input image frame rate * (N/M).
- * Note: The value of N must be equal to or less than M.
- */
- void DrvCAP_GetFrameRateScaleFactor(PUINT8 pu8Numerator, PUINT8 pu8Denominator)
- {
- UINT32 u32Temp = inp32(REG_CAP_FRCTL);
- *pu8Numerator = (u32Temp & FRN) >> 8;
- *pu8Denominator = u32Temp & FRM;
- }
- /**
- * @brief Set address match
- *
- * @param[in] u32AddressMatch Compare Memory Base Address.It should be 0~0xFFFFFFFF.
- *
- * @return None.
- *
- * @details This function is used to set compare memory base address.
- */
- void DrvCAP_SetAddressMatch(UINT32 u32AddressMatch)
- {
- outp32(REG_CAP_CMPADDR, u32AddressMatch);
- }
- /**
- * @brief Get address match
- *
- * @param[out] pu32AddressMatch Compare Memory Base Address.It should be 0~0xFFFFFFFF.
- *
- * @return None.
- *
- * @details This function is used to get compare memory base address.
- */
- void CAP_GetAddressMatch(PUINT32 pu32AddressMatch)
- {
- *pu32AddressMatch = inp32(REG_CAP_CMPADDR);
- }
- /**
- * @brief Set frame output pixel stride width.
- *
- * @param[in] u32PacketStride Packet frame output pixel stride width.It should be 0~0x3FFF.
- * @param[in] u32PlanarStride Planar frame output pixel stride width.It should be 0~0x3FFF.
- *
- * @return None.
- *
- * @details This function is used to set frame output pixel stride width.
- */
- void CAP_SetStride(UINT32 u32PacketStride, UINT32 u32PlanarStride)
- {
- outp32(REG_CAP_STRIDE, ((u32PlanarStride << 16) & PLNSTRIDE) |
- (u32PacketStride & PKTSTRIDE));
- }
- /**
- * @brief Get frame output pixel stride width.
- *
- * @param[out] pu32PacketStride Packet frame output pixel stride width.It should be 0~0x3FFF.
- * @param[out] pu32PlanarStride Planar frame output pixel stride width.It should be 0~0x3FFF.
- *
- * @return None.
- *
- * @details This function is used to get frame output pixel stride width.
- */
- void CAP_GetStride(PUINT32 pu32PacketStride, PUINT32 pu32PlanarStride)
- {
- UINT32 u32Tmp = inp32(REG_CAP_STRIDE);
- *pu32PlanarStride = (u32Tmp & PLNSTRIDE) >> 16;
- *pu32PacketStride = u32Tmp & PKTSTRIDE;
- }
- /**
- * @brief Set system memory packet/planar base address.
- *
- * @param[in] ePipe Pipe type.Including:
- * - \ref eCAP_PACKET
- * - \ref eCAP_PLANAR
- *
- * @param[in] eBuf Packet/Planar buffer address.
- * - \ref eCAP_BUF0 :
- * Packet : Packet base address 0
- * Planar : Planar Y base address
- * - \ref eCAP_BUF1
- * Packet : Packet base address 1
- * Planar : Planar U base address
- * - \ref eCAP_BUF2
- * Packet : None.
- * Planar : Planar V base address
- *
- * @param[in] u32BaseStartAddr System Memory Base Address.It should be 0~0xFFFFFFFF.
- *
- * @retval 0 Success
- * @retval <0 Error code
- *
- * @details This function is used to set system memory packet/planar base address.
- */
- INT32 CAP_SetBaseStartAddress(E_CAP_PIPE ePipe, E_CAP_BUFFER eBuf, UINT32 u32BaseStartAddr)
- {
- if (ePipe == eCAP_PACKET)
- {
- if (eBuf > eCAP_BUF1)
- return E_CAP_INVALID_BUF;
- outp32(REG_CAP_PKTBA0 + eBuf * 4, u32BaseStartAddr);
- }
- else if (ePipe == eCAP_PLANAR)
- {
- if (eBuf > eCAP_BUF2)
- return E_CAP_INVALID_BUF;
- outp32(REG_CAP_YBA + eBuf * 4, u32BaseStartAddr);
- }
- else
- return E_CAP_INVALID_PIPE;
- return Successful;
- }
- /**
- * @brief Get system memory packet/planar base address.
- *
- * @param[in] ePipe Pipe type.Including:
- * - \ref eCAP_PACKET
- * - \ref eCAP_PLANAR
- *
- * @param[in] eBuf Packet/Planar buffer address.
- * - \ref eCAP_BUF0 :
- * Packet : Packet base address 0
- * Planar : Planar Y base address
- * - \ref eCAP_BUF1
- * Packet : Packet base address 1
- * Planar : Planar U base address
- * - \ref eCAP_BUF2
- * Packet : None.
- * Planar : Planar V base address
- *
- * @param[out] pu32BaseStartAddr System Memory Base Address.It should be 0~0xFFFFFFFF.
- *
- * @retval 0 Success
- * @retval <0 Error code
- *
- * @details This function is used to get system memory packet/planar base address.
- */
- INT32 CAP_GetBaseStartAddress(E_CAP_PIPE ePipe, E_CAP_BUFFER eBuf, PUINT32 pu32BaseStartAddr)
- {
- if (ePipe == eCAP_PACKET)
- {
- if (eBuf > eCAP_BUF1)
- return E_CAP_INVALID_BUF;
- *pu32BaseStartAddr = inp32(REG_CAP_PKTBA0 + eBuf * 4);
- }
- else if (ePipe == eCAP_PLANAR)
- {
- if (eBuf > eCAP_BUF2)
- return E_CAP_INVALID_BUF;
- *pu32BaseStartAddr = inp32(REG_CAP_YBA + eBuf * 4);
- }
- else
- return E_CAP_INVALID_PIPE;
- return Successful;
- }
- /**
- * @brief Set standard CCIR656.
- *
- * @param[in] bIsStandard Standard CCIR656.
- * - 1 : Standard CCIR656 mode.
- * - 0 : Non-Standard CCIR656 mode. (OV7725 or Hynix 702)
- * @return None.
- *
- * @details This function is used to set standard CCIR65/non-standard CCIR65.
- */
- void CAP_SetStandardCCIR656(BOOL bIsStandard)
- {
- if (bIsStandard == TRUE)
- outp32(REG_CAP_PAR, inp32(REG_CAP_PAR) & ~FBB); // Standard
- else
- outp32(REG_CAP_PAR, inp32(REG_CAP_PAR) | FBB); // Non-Standard
- }
- /**
- * @brief Set color effect
- *
- * @param[in] eColorMode Available as following.
- * - \ref eCAP_CEF_NORMAL : Normal Color.
- * - \ref eCAP_CEF_SEPIA : Sepia effect,
- * corresponding U,V component value is set at register - \ref REG_CAP_SEPIA.
- * - \ref eCAP_CEF_NEGATIVE : Negative picture.
- * - \ref eCAP_CEF_POSTERIZE : Posterize image,
- * the Y, U, V components posterizing factor are set at register - \ref REG_CAP_POSTERIZE.
- *
- * @retval 0 Success
- * @retval <0 Error code
- *
- * @details This function is used to set color effect.
- */
- INT32 CAP_SetColorEffect(E_CAP_CEF eColorMode)
- {
- if (eColorMode > eCAP_CEF_POSTERIZE)
- return E_CAP_INVALID_COLOR_MODE;
- outp32(REG_CAP_PAR, (inp32(REG_CAP_PAR) & ~COLORCTL) |
- (eColorMode << 11));
- return Successful;
- }
- /**
- * @brief Get color effect
- *
- * @param[out] peColorMode Available as following.
- * - \ref eCAP_CEF_NORMAL : Normal Color.
- * - \ref eCAP_CEF_SEPIA : Sepia effect,
- * corresponding U,V component value is set at register - \ref REG_CAP_SEPIA.
- * - \ref eCAP_CEF_NEGATIVE : Negative picture.
- * - \ref eCAP_CEF_POSTERIZE : Posterize image,
- * the Y, U, V components posterizing factor are set at register - \ref REG_CAP_POSTERIZE.
- *
- * @return None.
- *
- * @details This function is used to get color effect.
- */
- void DrvCAP_GetColorEffect(E_CAP_CEF *peColorMode)
- {
- UINT32 u32Tmp = inp32(REG_CAP_PAR);
- *peColorMode = (E_CAP_CEF)((u32Tmp & COLORCTL) >> 11);
- }
- /**
- * @brief Set color effect parameter
- *
- * @param[in] u8YComp The constant Y component.If eColorMode is set to
- * eCAP_CEF_SEPIA : the constant Y component in - \ref REG_CAP_SEPIA.
- * eCAP_CEF_POSTERIZE : the constant Y component in - \ref REG_CAP_POSTERIZE.
- * @param[in] u8UComp The constant U component.
- * eCAP_CEF_SEPIA : the constant U component in - \ref REG_CAP_SEPIA.
- * eCAP_CEF_POSTERIZE : the constant U component in - \ref REG_CAP_POSTERIZE.
- * @param[in] u8VComp The constant V component.
- * eCAP_CEF_SEPIA : the constant V component in - \ref REG_CAP_SEPIA.
- * eCAP_CEF_POSTERIZE : the constant V component in - \ref REG_CAP_POSTERIZE.
- * @retval 0 Success
- * @retval <0 Error code
- *
- * @details This function is used to set color effect parameter.
- */
- INT32 CAP_SetColorEffectParameter(UINT8 u8YComp, UINT8 u8UComp, UINT8 u8VComp)
- {
- UINT32 u32Tmp = inp32(REG_CAP_PAR);
- UINT32 u32ColorMode = (u32Tmp & COLORCTL) >> 11;
- if (u32ColorMode == eCAP_CEF_SEPIA)
- {
- outp32(REG_CAP_SEPIA, (((UINT32)u8UComp << 8) | u8VComp));
- }
- else if (u32ColorMode == eCAP_CEF_POSTERIZE)
- {
- outp32(REG_CAP_POSTERIZE, (((UINT32)u8YComp << 16) | ((UINT32)u8UComp << 8) | u8VComp));
- }
- else
- {
- return E_CAP_WRONG_COLOR_PARAMETER;
- }
- return Successful;
- }
- /**
- * @brief Get color effect parameter
- *
- * @param[out] pu8YComp The constant Y component.If eColorMode is set to
- * eCAP_CEF_SEPIA : the constant Y component in - \ref REG_CAP_SEPIA.
- * eCAP_CEF_POSTERIZE : the constant Y component in - \ref REG_CAP_POSTERIZE.
- * @param[out] pu8UComp The constant U component.
- * eCAP_CEF_SEPIA : the constant U component in - \ref REG_CAP_SEPIA.
- * eCAP_CEF_POSTERIZE : the constant U component in - \ref REG_CAP_POSTERIZE.
- * @param[out] pu8VComp The constant V component.
- * eCAP_CEF_SEPIA : the constant V component in - \ref REG_CAP_SEPIA.
- * eCAP_CEF_POSTERIZE : the constant V component in - \ref REG_CAP_POSTERIZE.
- * @retval 0 Success
- * @retval <0 Error code
- *
- * @details This function is used to get color effect parameter.
- */
- INT32 CAP_GetColorEffectParameter(PUINT8 pu8YComp, PUINT8 pu8UComp, PUINT8 pu8VComp)
- {
- UINT32 u32Tmp = inp32(REG_CAP_PAR);
- UINT32 u32ColorMode = (u32Tmp & COLORCTL) >> 11;
- if (u32ColorMode == eCAP_CEF_SEPIA)
- {
- u32Tmp = inp32(REG_CAP_SEPIA);
- *pu8UComp = (u32Tmp & 0xFF00) >> 8;
- *pu8VComp = u32Tmp & 0xFF;
- }
- else if (u32ColorMode == eCAP_CEF_POSTERIZE)
- {
- u32Tmp = inp32(REG_CAP_POSTERIZE);
- *pu8YComp = (u32Tmp & 0xFF0000) >> 16;
- *pu8UComp = (u32Tmp & 0xFF00) >> 8;
- *pu8VComp = u32Tmp & 0xFF;
- }
- else
- {
- return E_CAP_WRONG_COLOR_PARAMETER;
- }
- return Successful;
- }
- /// @cond HIDDEN_SYMBOLS
- CAPDEV_T CAP =
- {
- CAP_Init, // void (*Init)(BOOL bIsEnableSnrClock, E_CAP_SNR_SRC eSnrSrc, UINT32 u32SensorFreqKHz, E_CAP_DEV_TYPE eDevType):
- CAP_Open, // INT32 (*Open)(UINT32 u32SensorFreqKHz);
- CAP_Close, // void (*Close)(void);
- CAP_SetPipeEnable, // void (*SetPipeEnable)(BOOL bEngEnable, E_CAP_PIPE ePipeEnable);
- CAP_SetPlanarFormat, // void (*SetPlanarFormat)(E_CAP_PLANAR_FORMAT ePlanarFmt);
- CAP_SetCropWinSize, // void (*SetCropWinSize)(UINT32 u32height, UINT32 u32width);
- CAP_SetCropWinStartAddr, // void (*SetCropWinStartAddr)(UINT32 u32VerticalStart, UINT32 u32HorizontalStart);
- CAP_SetStride, // void (*SetStride)(UINT32 u16packetstride, UINT32 u32planarstride);
- CAP_GetStride, // void (*GetStride)(PUINT32 pu32PacketStride, PUINT32 pu32PlanarStride);
- CAP_EnableInt, // INT32 (*EnableInt)(E_CAP_INT_TYPE eIntType);
- CAP_DisableInt, // INT32 (*DisableInt)(E_CAP_INT_TYPE eIntType);
- CAP_InstallCallback, // INT32 (*InstallCallback)(E_CAP_INT_TYPE eIntType, PFN_CAP_CALLBACK pfnCallback, PFN_CAP_CALLBACK *pfnOldCallback);
- CAP_SetBaseStartAddress, // INT32 (*SetBaseStartAddress(E_CAP_PIPE ePipe, E_CAP_BUFFER eBuf, UINT32 u32BaseStartAddr);
- CAP_SetOperationMode, // void (*SetOperationMode(BOOL bIsOneSutterMode);
- CAP_GetOperationMode, // BOOL (*GetOperationMode)(void);
- CAP_SetPacketFrameBufferControl, // void (*videoIn1_SetPacketFrameBufferControl)(BOOL bFrameSwitch, BOOL bFrameBufferSel);
- CAP_SetSensorPolarity, // void (*videoIn1_SetSensorPolarity)(BOOL bVsync, BOOL bHsync, BOOL bPixelClk);
- CAP_SetColorEffectParameter, // INT32 (*SetColorEffectParameter)(UINT8 u8YComp, UINT8 u8UComp, UINT8 u8VComp);
- CAP_SetDataFormatAndOrder, // void (*SetDataFormatAndOrder)(E_CAP_ORDER eInputOrder, E_CAP_IN_FORMAT eInputFormat, E_CAP_OUT_FORMAT eOutputFormat)
- CAP_SetMotionDet, // void (*SetMotionDet)(BOOL bEnable, BOOL bBlockSize,BOOL bSaveMode);
- CAP_SetMotionDetEx, // void (*SetMotionDetEx)(UINT32 u32Threshold, UINT32 u32OutBuffer, UINT32 u32LumBuffer);
- CAP_SetStandardCCIR656, // void (*SetStandardCcir656)(BOOL);
- CAP_SetShadowRegister // void (*SetShadowRegister)(void);
- };
- /// @endcond HIDDEN_SYMBOLS
- /*@}*/ /* end of group N9H30_CAP_EXPORTED_FUNCTIONS */
- /*@}*/ /* end of group N9H30_CAP_Driver */
- /*@}*/ /* end of group N9H30_Device_Driver */
|