pq_hw.c 707 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254
  1. #include "osdef.h" //joshua check
  2. #include <linux/delay.h>
  3. #include <linux/types.h>
  4. #include "pq_hw.h"
  5. #include "../../vip/6710/reg_vip_def.h"
  6. #include "pq.h"
  7. #include <drv_cvd2_internal.h>
  8. #include <drv_gpio.h>
  9. #include "drv_vip_internal.h"
  10. #include <drv_pq_internal.h>
  11. #include "drv_slr.h"
  12. #include <linux/vmalloc.h>
  13. #include <project.h>
  14. #include "tv_base.h"
  15. #include "drv_adi.h"
  16. #include "drv_vdi.h"
  17. #include "drv_gfx.h"
  18. #include "drv_picx.h"
  19. #define VIP_DBL_INVALID_WHITE_LEVEL 0xffffffff
  20. UINT32 ucVDI_MotionFlag = 0;
  21. UINT32 ucTempM=0;
  22. UINT32 ucVDI_Static_Cnt = 0;
  23. UINT32 ucVDI_Static_Cnt_2 = 0;
  24. UINT32 ucVDI_Static_Cnt_3 = 0;
  25. PQHW_CONTEXT PQHwContext;
  26. struct work_struct WQ_NRAdjust, WQ_SWDC, WQ_ColorBarDetect;
  27. struct workqueue_struct *WQ_Struct_NRAdjust=NULL, *WQ_Struct_SWDC=NULL, *WQ_Struct_ColorBarDetect=NULL;
  28. extern VIP_Mute_Flag_st gfTVFEMuteFlg;
  29. #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,8)
  30. DEFINE_SEMAPHORE(LutTableLock);
  31. #else
  32. DECLARE_MUTEX (LutTableLock);
  33. #endif
  34. UINT8 utempSharpnesscValue;
  35. UINT8 utempCheckColorbarDTFunctionEN;
  36. UINT8 ucTempds_disable_func_en;
  37. UINT8 ucTempDCCSceneID;
  38. #define DYNAMICBL_ADJUST 1
  39. #ifdef DYNAMICBL_ADJUST
  40. UINT8 DynamicBL_OSD_MAX = 90;
  41. UINT8 DynamicBL_OSD_Min = 70;
  42. UINT8 DynamicBL_normal = 86;
  43. INT8 DynamicBL_OSD_MAX_FineTune = 0;
  44. INT8 DynamicBL_OSD_Min_FineTune = 0;
  45. INT8 DynamicBL_OSD_Normal_FineTune = 0;
  46. #endif
  47. //#ifdef VIP_SW_DC
  48. #if 1
  49. UINT8 DLC_Source=0;
  50. //==================DLC TABLE START==========================
  51. //extern ST_SWDC_Slope PQ_SWDC_HistSlop[];
  52. //extern ST_SWDC_Chroma PQ_SWDC_HistChroma[];
  53. //extern ST_SWDC_Param PQ_SWDC_Param[];
  54. //extern ST_SWDC_Param SWDC_Param[];
  55. //extern ST_SWDC_Slope SWDC_HistSlop[];
  56. //extern ST_SWDC_Chroma SWDC_HistChroma[];
  57. extern ST_SWDC_Slope SWDC_HistSlop[];
  58. extern ST_SWDC_Chroma SWDC_HistChroma[];
  59. extern ST_SWDC_Param SWDC_Param[];
  60. extern RGB_GAIN RGBGain_Param[];
  61. //===================DLC TABLE END===========================
  62. #endif
  63. #ifdef DYNAMIC_BACKLIGHT
  64. #define VIP_DBL_LEVEL_DEGREE 256
  65. #define VIP_DBL_FRAME_INTERVAL 16
  66. #define VIP_DBL_FRAME_INTERVAL_MASK 0xf
  67. #define VIP_DBL_STATUS_NONE 0
  68. #define VIP_DBL_STATUS_DETECTING 1
  69. #define VIP_DBL_STATUS_ENTERING 2
  70. #define VIP_DBL_STATUS_KEEPING 3
  71. #define VIP_DBL_STATUS_LEAVING 4
  72. #define VIP_DBL_STATUS_DETECTING_WHITE_ENTERING 5
  73. #define VIP_DBL_INVALID_WHITE_LEVEL 0xffffffff
  74. #define VIP_DBL_WHITE_PATTERN_BRIGHTING
  75. DYNAMIC_BACKLIGHT_PARAM g_DynamicBackLight;//= {0, 0, 0, 0, 0, 0, 0, 25, 51, 192, 217, 144, FALSE, {0}};
  76. extern UINT32 LCDBackLightMap[15];
  77. extern const UINT16 LUT17x17DefAngle[17][17];
  78. extern const UINT16 LUT17x17DefSat[17][17];
  79. #endif //#ifdef DYNAMIC_BACKLIGHT
  80. extern BOOL VIP_IsJPEGSource(void);
  81. extern INT32 GetCustomerData(INT8 *pcTableName, INT8 **tablestart, UINT32 *tablesize);
  82. #ifdef CONFIG_COLORLUT_14_COLOR
  83. #define COLORLUT_RGN_NUM 14
  84. #elif defined(CONFIG_COLORLUT_10_COLOR)
  85. #define COLORLUT_RGN_NUM 10
  86. #else
  87. #define COLORLUT_RGN_NUM 7
  88. #endif
  89. #define LUT_HEAD_ID 0x54554c //T=0x54 U=0x55 L=0x4c
  90. #define m_Global_S_offset 8
  91. static UINT8 lut_rgn_hue_min[COLORLUT_RGN_NUM] = {0};
  92. static UINT8 lut_rgn_hue_max[COLORLUT_RGN_NUM] = {0};
  93. static UINT8 lut_rgn_sat_min[COLORLUT_RGN_NUM] = {0};
  94. static UINT8 lut_rgn_sat_max[COLORLUT_RGN_NUM] = {0};
  95. static UINT8 lut_rgn_y_min[COLORLUT_RGN_NUM] = {0};
  96. static UINT8 lut_rgn_y_max[COLORLUT_RGN_NUM] = {0};
  97. static UINT8 lut_rgn_en[COLORLUT_RGN_NUM] = {0};
  98. static INT8 lut_rgn_hue_gain[COLORLUT_RGN_NUM] = {0};
  99. static INT8 lut_rgn_sat_gain[COLORLUT_RGN_NUM] = {0};
  100. static INT8 lut_rgn_y_gain[COLORLUT_RGN_NUM] = {0};
  101. static UINT8 lut_smooth_level = 0;//0~100
  102. static UINT8 lut_make[COLORLUT_RGN_NUM] = {0};
  103. UINT8 check_usr_curve_setup_ok(void)
  104. {
  105. PQHW_CONTEXT* pHwContext= &PQHwContext;
  106. if((pHwContext->UserCurveSetup==0)&&(pHwContext->UserCurveInit==0))
  107. return (1);
  108. else return (0);
  109. }
  110. void PQ_HWDestroyWorkqueue(void)
  111. {
  112. cancel_work_sync(&WQ_NRAdjust);
  113. cancel_work_sync(&WQ_SWDC);
  114. cancel_work_sync(&WQ_ColorBarDetect);
  115. }
  116. UINT8 PQ_CheckSpecialRegister(UINT32 ulReg)
  117. {
  118. UINT8 Check;
  119. if((ulReg>>28) == 0 )//vip register
  120. {
  121. if( (ulReg&0xffff) == 0xc084 || //gamma
  122. (ulReg&0xffff) == 0xc184 || //lut
  123. (ulReg&0xffff) == 0xd062 || //vip coefficient table
  124. (ulReg&0xffff) == 0xd064 ||
  125. (ulReg&0xffff) == 0xd068 ||
  126. (ulReg&0xffff) == 0xd06c ||
  127. (ulReg&0xf000ffff) == 0xd060 || //vip coefficient table
  128. (ulReg&0xf000ffff) == 0xd064 ||
  129. (ulReg&0xf000ffff) == 0xd068 ||
  130. (ulReg&0xf000ffff) == 0xd06c
  131. )
  132. Check = TRUE;
  133. else
  134. Check = FALSE;
  135. }
  136. else
  137. Check = FALSE;
  138. return Check;
  139. }
  140. UINT32 PQ_GetRegisterType(UINT32 ulRegisterType)
  141. {
  142. switch(ulRegisterType)
  143. {
  144. case 0:
  145. return 0xBE1C0000;
  146. case 0x10000000:
  147. return 0xBE000000;
  148. case 0x20000000:
  149. return 0xBE2c0000;
  150. case 0x30000000:
  151. return 0xBE2d0000;
  152. default:
  153. return 0xBE1C0000;
  154. }
  155. }
  156. void PQ_DelayMS(UINT32 ulDelayMS )
  157. {
  158. if( irq_count() || in_atomic() )
  159. { //for TY request
  160. mdelay(ulDelayMS);
  161. }
  162. else
  163. {
  164. msleep(ulDelayMS);
  165. }
  166. }
  167. void PQ_DelayUS(UINT32 ulDelayUS )
  168. {
  169. udelay(ulDelayUS);
  170. }
  171. //****************************************************************************
  172. //
  173. // Function : PQ_RegisterWrite
  174. // Params : ulRegisterName -address of the index register
  175. // ulValue - value to program to the given bits of the register
  176. // Description: Sets the given bits of the given index register to the given value
  177. // ulRegisterName data format: TTTT WWWW WWSS SSSS AAAA AAAA AAAA AAAA
  178. // 0:reserved
  179. // T:register type 0000=VIP_register (offset 0xBE1C)
  180. // W:register used width
  181. // S:register start bit
  182. // A:register address
  183. // Returns : void
  184. //****************************************************************************
  185. void PQ_RegisterWrite(UINT32 ulRegisterName, UINT32 ulValue)
  186. {
  187. UINT32 ulData, ulBitMask, ulRegisterType;
  188. //if((ulRegisterName&0xffff)==0x0044 || (ulRegisterName&0xffff)==0x0045 || (ulRegisterName&0xffff)==0x0048)
  189. // PQDebugPrint("*****reg = 0x%lx, value = 0x%lx", ulRegisterName, ulValue);
  190. if(PQ_CheckSpecialRegister(ulRegisterName))
  191. {
  192. //sepcial register (ex lut, gamma table, coefficient table )
  193. ulRegisterType = PQ_GetRegisterType(ulRegisterName & REGISTER_TYPE_MASK);
  194. ulRegisterName &= REGISTER_ADDRESS_MASK;
  195. ulRegisterName |= ulRegisterType; //offset address
  196. *((volatile UINT32 *)(ulRegisterName)) = ulValue;
  197. //PQ_ADVANCE_HWPrint("reg(0x%lx) = 0x%lx", ulRegisterName, ulValue);
  198. }
  199. else if ( PQ_GetStartAndEndBits(ulRegisterName) <= WIDTH_BIT_8 )
  200. {
  201. ulBitMask = GET_VALUE_BITS(ulRegisterName, 0xFFFFFFFF);
  202. ulBitMask <<= PQ_GetRegisterStartBit(ulRegisterName);
  203. ulValue <<= PQ_GetRegisterStartBit(ulRegisterName);
  204. ulRegisterType = PQ_GetRegisterType(ulRegisterName & REGISTER_TYPE_MASK);
  205. ulRegisterName &= REGISTER_ADDRESS_MASK;
  206. ulRegisterName |= ulRegisterType; //offset address
  207. if(ulRegisterName%4)
  208. ulData = *((volatile UINT8*)(ulRegisterName));
  209. else
  210. ulData = *((volatile UINT32*)(ulRegisterName));
  211. ulData &= ~ulBitMask;
  212. ulData |= (ulValue & ulBitMask);
  213. if(ulRegisterName%4)
  214. *((volatile UINT8*)(ulRegisterName)) = ulData;
  215. else
  216. *((volatile UINT32*)(ulRegisterName)) = ulData;
  217. }
  218. else
  219. {
  220. ulBitMask = GET_VALUE_BITS(ulRegisterName, 0xFFFFFFFF);
  221. ulBitMask <<= PQ_GetRegisterStartBit(ulRegisterName);
  222. ulValue <<= PQ_GetRegisterStartBit(ulRegisterName);
  223. ulRegisterType = PQ_GetRegisterType(ulRegisterName & REGISTER_TYPE_MASK);
  224. ulRegisterName &= REGISTER_ADDRESS_MASK;
  225. ulRegisterName |= ulRegisterType; //offset address
  226. ulData = *((volatile UINT32*)(ulRegisterName));
  227. ulData &= ~ulBitMask;
  228. ulData |= (ulValue & ulBitMask);
  229. *((volatile UINT32 *)(ulRegisterName)) = ulData;
  230. }
  231. return;
  232. }
  233. //****************************************************************************
  234. //
  235. // Function : PQ_RegisterRead
  236. // Params : ulRegisterName -address of the index register
  237. // Description: read the given bits of the given index register to the value
  238. // ulRegisterName data format: TTTT WWWW WWSS SSSS AAAA AAAA AAAA AAAA
  239. // 0:reserved
  240. // T:register type 0000=VIP_register (offset 0xBE1C)
  241. // W:register used width
  242. // S:register start bit
  243. // A:register address
  244. // Returns : register data
  245. //****************************************************************************
  246. UINT32 PQ_RegisterRead(UINT32 ulRegisterName )
  247. {
  248. UINT32 ulData, ulBitMask, ulRegisterType, ulRegisterNameTmp;
  249. ulRegisterNameTmp=ulRegisterName;
  250. ulRegisterType = PQ_GetRegisterType(ulRegisterName & REGISTER_TYPE_MASK);
  251. ulRegisterNameTmp &= REGISTER_ADDRESS_MASK;
  252. ulRegisterNameTmp |= ulRegisterType; //offset address
  253. ulData = *((UINT32 *)(ulRegisterNameTmp));
  254. if ( PQ_GetStartAndEndBits(ulRegisterName) != ALL_BITS ){
  255. ulBitMask = GET_VALUE_BITS(ulRegisterName, 0xFFFFFFFF);
  256. ulBitMask <<= PQ_GetRegisterStartBit(ulRegisterName);
  257. ulData &= ulBitMask;
  258. ulData >>= (PQ_GetRegisterStartBit(ulRegisterName));
  259. }
  260. return ulData;
  261. }
  262. void PQ_GammaCorrect(UINT8 ucGrayLevel)
  263. {
  264. PQDebugPrint( "%s: ucGrayLevel= %d", __FUNCTION__, ucGrayLevel);
  265. PQ_RegisterWrite(VIP_reg_dpy_matrix_fix_in_en, ENABLE);
  266. PQ_RegisterWrite(VIP_reg_dpy_matrix_bypass, ENABLE);
  267. PQ_RegisterWrite(VIP_reg_dpy_dpy_dtype, 0);
  268. // PQ_RegisterWrite(VIP_reg_dpy_444, 0);
  269. PQ_RegisterWrite(VIP_reg_pnl_ovsc_yc, ucGrayLevel);
  270. PQ_RegisterWrite(VIP_reg_pnl_ovsc_cb, ucGrayLevel);
  271. PQ_RegisterWrite(VIP_reg_pnl_ovsc_cr, ucGrayLevel);
  272. PQ_RegisterWrite(VIP_reg_pnl_ovsc_yc_lsb2, 0);
  273. PQ_RegisterWrite(VIP_reg_pnl_ovsc_cb_lsb2, 0);
  274. PQ_RegisterWrite(VIP_reg_pnl_ovsc_cr_lsb2, 0);
  275. }
  276. //****************************************************************************
  277. //
  278. // Function : PQ_ColorMatrixComp
  279. // Params :
  280. // Description: Calc ColorMatrix compensetion for brightness, bias, dpy_yppn and matrix_self_offset.
  281. // Note : C1, C2, C3 register range adjust to 16bit in 531 (330 is 12bit)
  282. // Returns : void
  283. //****************************************************************************
  284. void PQ_ColorMatrixComp(UINT8 bReset)
  285. {
  286. PQHW_CONTEXT* pHwContext= &PQHwContext;
  287. COLOR_MATRIX_COMP_INT *pColorMatrixC = (COLOR_MATRIX_COMP_INT *)&pHwContext->iColorMatrixC1;
  288. INT32 iBias[3];
  289. INT32 iYPPComp[3];
  290. INT32 *piCTBias = &pHwContext->iRBias;
  291. INT32 i, iIsYPPEn;
  292. UINT8 ucUserSource, ucSubSource;
  293. LONG LONG INT32 litemp; // due to the calc may be overfloe 32bits
  294. static UINT8 bStart = FALSE;
  295. if(!PQ_IsFadeEn())
  296. {
  297. if(bReset)
  298. {
  299. bStart = TRUE;
  300. return;
  301. }
  302. }
  303. if(bStart || PQ_IsFadeEn())
  304. {
  305. bStart = FALSE;
  306. VIP_GetSource(&ucUserSource, &ucSubSource);
  307. iIsYPPEn = PQ_RegisterRead(VIP_reg_dpy_ypp) && (ucUserSource != SOURCE_JPEG);
  308. for (i = 0; i < 3; i++)
  309. {
  310. litemp = (LONG LONG INT32)pHwContext->CurColorMatrix->CSC_Value[i*3]*(pColorMatrixC[i].iValue-iIsYPPEn*COLOR_MATRIX_YPP_COMP_OFFSET);
  311. litemp = litemp>>(COLOR_MATRIX_GAIN_BIT_SYSTEM);
  312. iYPPComp[i] = litemp;
  313. iBias[i] = piCTBias[i]+(pHwContext->iBrightness)+iYPPComp[i];
  314. iBias[i] = max(-2048, min(2047, iBias[i]));
  315. if(VIP_Jpeg_GetDisplayMode() && VIP_IsJPEGSource())
  316. {
  317. iBias[i] = 0x10; //reset RGB offset in thumbnail mode
  318. }
  319. }
  320. PQ_RegisterWrite(VIP_reg_dpy_matrix_c1, pHwContext->bEnableColorProcess?iBias[0]:pColorMatrixC[0].iValue);
  321. PQ_RegisterWrite(VIP_reg_dpy_matrix_c2, pHwContext->bEnableColorProcess?iBias[1]:pColorMatrixC[1].iValue);
  322. PQ_RegisterWrite(VIP_reg_dpy_matrix_c3, pHwContext->bEnableColorProcess?iBias[2]:pColorMatrixC[2].iValue);
  323. }
  324. }
  325. void PQ_SetColorMatrix(UINT8 ucEnable)
  326. {
  327. PQHW_CONTEXT* pHwContext= &PQHwContext;
  328. pHwContext->ucMatrixbypassCtl = ucEnable;
  329. PQ_RegisterWrite(VIP_reg_dpy_matrix_bypass,ucEnable);
  330. }
  331. //****************************************************************************
  332. //
  333. // Function : PQ_ColorTempBias
  334. // Params :
  335. // Description: Powers up/down the panel as per the given power sequence timings
  336. // Returns : void
  337. //****************************************************************************
  338. void PQ_ColorTempBias(PQ_COLOR_TEMP_BIAS ucType, INT32 iValue)
  339. {
  340. PQHW_CONTEXT* pHwContext= &PQHwContext;
  341. UINT8 ucIndex = 0; // detect the index => R = 0, G = 1, B = 2;
  342. if( pHwContext->bEnableColorProcess==FALSE )
  343. iValue= 0;
  344. //PQDebugPrint("%s: ucType=%d, iValue=%d", __FUNCTION__, ucType, iValue);
  345. switch(ucType){
  346. case PQ_CT_BIAS_R:
  347. ucIndex = 0;
  348. break;
  349. case PQ_CT_BIAS_G:
  350. ucIndex = 1;
  351. break;
  352. case PQ_CT_BIAS_B:
  353. ucIndex = 2;
  354. break;
  355. }
  356. *((&pHwContext->iRBias)+ucIndex) = iValue;
  357. PQ_ColorMatrixComp(TRUE);
  358. }
  359. //================================================================================
  360. // function name : PQ_SetupColorSpaceConversionTable
  361. // input parameter : cPath,cType
  362. // output parameter : none
  363. // purpose : setup color space conversion matrix
  364. // return : none
  365. void PQ_SetupColorSpaceConversionTable(void)
  366. {
  367. PQHW_CONTEXT* pHwContext= &PQHwContext;
  368. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  369. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  370. UINT32 * pColorSpaceTable = 0, * p601ColorSpaceTable = 0, * p709ColorSpaceTable = 0, * pRGB2YCbCrTable = 0, * p601RGB2YCbCrTable = 0, * p709RGB2YCbCrTable = 0;
  371. BOOL bEnableEnhancedColor;
  372. UINT32 tmp = 0;
  373. INT32 i;
  374. UINT8 ucTableIndex;
  375. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  376. COLOR_MATRIX_DATA *pCOLOR_MATRIX_DATA;
  377. i = 0;
  378. ucTableIndex = pVtab->mColorMatrix.mGroupedIndex[ucCurrSrcIndex];
  379. pCOLOR_MATRIX_DATA = &pVtab->mColorMatrix.mSrcColorMatrix[ucTableIndex];
  380. p601RGB2YCbCrTable = ColorSpaceTableRGB2YCC_Full601;
  381. p709RGB2YCbCrTable = ColorSpaceTableRGB2YCC_Full709;
  382. p601ColorSpaceTable = ColorSpaceTableYCC_Full601;
  383. p709ColorSpaceTable = ColorSpaceTableYCC_Full709;
  384. PQ_ADVANCE_HWPrint("%s: nColorSpaceMode=%d bColorProcess=%d cInputColorStandard=%d", __FUNCTION__, pHwContext->nColorSpaceMode, pHwContext->bEnableColorProcess, VIP_GetInputColorStandard());
  385. PQDebugPrint("%s: pHwContext->cInputDataFormat = %d",__FUNCTION__, VIP_GetInputDataFormat());
  386. if(VIP_GetInputDataFormat() == RGB)
  387. {
  388. if( VIP_GetRGB2YCbCrRange() == eGFX_YCBCR_235 )
  389. {
  390. p601RGB2YCbCrTable = ColorSpaceTableRGB2YCC_Limit601;
  391. p709RGB2YCbCrTable = ColorSpaceTableRGB2YCC_Limit709;
  392. }
  393. else if( VIP_GetRGB2YCbCrRange() == eGFX_YCBCR_255 )
  394. {
  395. p601RGB2YCbCrTable = ColorSpaceTableRGB2YCC_Full601;
  396. p709RGB2YCbCrTable = ColorSpaceTableRGB2YCC_Full709;
  397. }
  398. else //eGFX_YCBCR_NONE
  399. {
  400. p601RGB2YCbCrTable = ColorSpaceTableRGB2YCC_Limit601;
  401. p709RGB2YCbCrTable = ColorSpaceTableRGB2YCC_Limit709;
  402. }
  403. }
  404. else if(pCOLOR_MATRIX_DATA->mSrcColorMatrix[1].CSC_Value[0]==(INT32)0xffffffff)
  405. {
  406. //vip table not set color matrix by source(for vtab 20)
  407. p601ColorSpaceTable = (UINT32*) &pVtab->mColorSpaceConversionTable[CSC_601];
  408. p709ColorSpaceTable = (UINT32*) &pVtab->mColorSpaceConversionTable[CSC_709];
  409. }
  410. else
  411. {
  412. p601ColorSpaceTable = (UINT32*) &pCOLOR_MATRIX_DATA->mSrcColorMatrix[CSC_601-1];
  413. p709ColorSpaceTable = (UINT32*) &pCOLOR_MATRIX_DATA->mSrcColorMatrix[CSC_709-1];
  414. if(pCOLOR_MATRIX_DATA->mSrcColorMatrix[0].CSC_Value[0] == 1024)
  415. {
  416. p601RGB2YCbCrTable = ColorSpaceTableRGB2YCC_Limit601;
  417. }
  418. else
  419. {
  420. p601RGB2YCbCrTable = ColorSpaceTableRGB2YCC_Full601;
  421. }
  422. if(pCOLOR_MATRIX_DATA->mSrcColorMatrix[1].CSC_Value[0] == 1024)
  423. {
  424. p709RGB2YCbCrTable = ColorSpaceTableRGB2YCC_Limit709;
  425. }
  426. else
  427. {
  428. p709RGB2YCbCrTable = ColorSpaceTableRGB2YCC_Full709;
  429. }
  430. }
  431. // initial the pRGB2YCbCrTable to 601 matrix, for sync previous chip design
  432. pRGB2YCbCrTable = p601RGB2YCbCrTable;
  433. if( pHwContext->nColorSpaceMode==PQ_COLOR_SPACE_NORMAL )
  434. {
  435. if(VIP_IsPCSource()==TRUE) //yukuo VGA input range 10~245
  436. {
  437. pColorSpaceTable=(UINT32*) &pVtab->mColorSpaceConversionTable[CSC_RGB];
  438. }
  439. else
  440. {
  441. pColorSpaceTable=p601ColorSpaceTable;
  442. }
  443. }
  444. else if( pHwContext->nColorSpaceMode==PQ_COLOR_SPACE_WIDE )
  445. {
  446. pColorSpaceTable= (UINT32*) &pVtab->mColorSpaceConversionTable[CSC_709];
  447. pRGB2YCbCrTable = p709RGB2YCbCrTable;
  448. }
  449. else //PQ_COLOR_SPACE_AUTO
  450. {
  451. if(VIP_GetInputDataFormat() == RGB)//when input is rgb, vip set posterior matrix depend on prior transform matrix
  452. {
  453. if(VIP_IsPCSource()==TRUE) //yukuo VGA input range 10~245
  454. {
  455. pColorSpaceTable=(UINT32*)&pVtab->mColorSpaceConversionTable[CSC_RGB];
  456. }
  457. else
  458. {
  459. if(PQ_GetDefinitionIndex() == PQ_HIGH_DEFINITION)
  460. {
  461. pColorSpaceTable = p709ColorSpaceTable;
  462. pRGB2YCbCrTable = p709RGB2YCbCrTable;
  463. }
  464. else
  465. {
  466. pColorSpaceTable = p601ColorSpaceTable;
  467. pRGB2YCbCrTable = p601RGB2YCbCrTable;
  468. }
  469. }
  470. }
  471. else //ypp format
  472. {
  473. switch(VIP_GetInputColorStandard())
  474. {
  475. case YCC_709:
  476. pColorSpaceTable=p709ColorSpaceTable;
  477. pRGB2YCbCrTable = p709RGB2YCbCrTable;
  478. break;
  479. case YUV_FCC:
  480. pColorSpaceTable=ColorSpaceTableFCC;
  481. break;
  482. case YUV_624:
  483. case YUV_170M: //ex: ntsc
  484. pColorSpaceTable=ColorSpaceTable624;
  485. break;
  486. case YUV_240M: //ex
  487. pColorSpaceTable=ColorSpaceTable240M;
  488. break;
  489. case RGB: //rgb format is forcely transformed to ycc before dpy
  490. case YCC_601:
  491. pColorSpaceTable=p601ColorSpaceTable;
  492. break;
  493. default:
  494. if(VIP_GetInputVSize() > 700) //HD
  495. {
  496. pColorSpaceTable=p709ColorSpaceTable;
  497. pRGB2YCbCrTable = p709RGB2YCbCrTable;
  498. }
  499. else
  500. {
  501. pColorSpaceTable=p601ColorSpaceTable;
  502. }
  503. break;
  504. }
  505. }
  506. }
  507. if(VIP_IsJPEGSource())
  508. {
  509. if(VIP_GetInputDataFormat() == RGB)
  510. {
  511. pColorSpaceTable =ColorSpaceTableYCC_Full601;
  512. pRGB2YCbCrTable = ColorSpaceTableRGB2YCC_Full601;
  513. PQ_RegisterWrite(VIP_reg_dpy_ypp, 0);
  514. }
  515. else
  516. {
  517. pColorSpaceTable =ColorSpaceJPEG;
  518. pRGB2YCbCrTable = ColorSpaceTableRGB2YCC_Full601;
  519. PQ_RegisterWrite(VIP_reg_dpy_ypp, 1);
  520. }
  521. }
  522. else if(VIP_GetInputDataFormat() != RGB)
  523. {
  524. PQ_RegisterWrite(VIP_reg_dpy_ypp, 1);
  525. }
  526. else
  527. {
  528. #ifdef CONFIG_HDMI_RGB_RANGE_FORCE_AUTOMODE_TO_FULLRANGE
  529. if(VIP_GetUserSource() == SOURCE_HDMI && VIP_GetRGBRange() == RGBRange_LimitedRange)
  530. {
  531. PQ_RegisterWrite(VIP_reg_dpy_ypp, 1);
  532. }
  533. else
  534. #endif
  535. {
  536. PQ_RegisterWrite(VIP_reg_dpy_ypp, 0);
  537. }
  538. }
  539. pHwContext->CurColorMatrix = (CSC_SETTING*)pColorSpaceTable;
  540. pHwContext->RGB2YUVMatrix = (CSC_SETTING*)pRGB2YCbCrTable;
  541. //set rgb to ycbcr in JPEG RGB color space(to fix color error in RBG Space)
  542. PQ_RegisterWrite(VIP_reg_picx_clip_high, 0x3ac);
  543. PQ_RegisterWrite(VIP_reg_picx_clip_low, 0x40);
  544. if( VIP_IsJPEGSource() && VIP_GetInputDataFormat() == RGB )
  545. {
  546. PQ_RegisterWrite(VIP_reg_picx_yuv_bypass, 0);
  547. DRV_PICX_SetMatrix(pHwContext->RGB2YUVMatrix);
  548. if(VIP_IsInputDataFormatBGR())
  549. {
  550. PQ_RegisterWrite(VIP_reg_picx_rgbin_order,0);
  551. }
  552. else
  553. {
  554. PQ_RegisterWrite(VIP_reg_picx_rgbin_order,1);
  555. }
  556. //add picx rbg2ycc clip setting
  557. PQ_RegisterWrite(VIP_reg_picx_clip_high, 0x3ff); //M#1912
  558. PQ_RegisterWrite(VIP_reg_picx_clip_low, 0);//M#1912
  559. }
  560. else
  561. {
  562. PQ_RegisterWrite(VIP_reg_picx_yuv_bypass, 1);
  563. PQ_RegisterWrite(VIP_reg_picx_rgbin_order,0);
  564. PQ_RegisterWrite(VIP_reg_picx_clip_high, 0x940);
  565. PQ_RegisterWrite(VIP_reg_picx_clip_low, 64);
  566. }
  567. PQ_RegisterWrite(VIP_reg_dpy_444, ENABLE);
  568. PQ_RegisterWrite(VIP_REG_DPY_MTX_PRE_BOUND, 0);
  569. PQ_RegisterWrite(VIP_REG_DPY_MTX_MIN_Y, 0);
  570. PQ_RegisterWrite(VIP_REG_DPY_MTX_MIN_U, 0);
  571. PQ_RegisterWrite(VIP_REG_DPY_MTX_MIN_V, 0);
  572. PQ_RegisterWrite(VIP_REG_DPY_MTX_MAX_Y, 0x3f7);
  573. PQ_RegisterWrite(VIP_REG_DPY_MTX_MAX_U, 0x3f7);
  574. PQ_RegisterWrite(VIP_REG_DPY_MTX_MAX_V, 0x3f7);
  575. if(VIP_GetScreenOnSt() )
  576. PQ_SetColorMatrix(DISABLE);
  577. for(i=0;i<9;i++)
  578. PQ_ColorMatrixSetup(TRUE, i);
  579. DRV_GFX_SetMatrix(pHwContext->RGB2YUVMatrix);
  580. //unsigned convert to signed number
  581. tmp = pColorSpaceTable[9] & 0x3fff;
  582. if(tmp > 0x2000)
  583. pHwContext->iColorMatrixC1 = -(0x4000 - tmp);
  584. else if(tmp < 0x2000)
  585. pHwContext->iColorMatrixC1 = tmp;
  586. else
  587. pHwContext->iColorMatrixC1 = 0;
  588. tmp = pColorSpaceTable[10] & 0x3fff;
  589. if(tmp > 0x2000)
  590. pHwContext->iColorMatrixC2 = -(0x4000 - tmp);
  591. else if(tmp < 0x2000)
  592. pHwContext->iColorMatrixC2 = tmp;
  593. else
  594. pHwContext->iColorMatrixC2 = 0;
  595. tmp = pColorSpaceTable[11] & 0x3fff;
  596. if(tmp > 0x2000)
  597. pHwContext->iColorMatrixC3 = -(0x4000 - tmp);
  598. else if(tmp < 0x2000)
  599. pHwContext->iColorMatrixC3 = tmp;
  600. else
  601. pHwContext->iColorMatrixC3 = 0;
  602. PQ_ColorTempBias(PQ_CT_BIAS_R, pMenuValue->iColorBias[0]);
  603. PQ_ColorTempBias(PQ_CT_BIAS_G, pMenuValue->iColorBias[1]);
  604. PQ_ColorTempBias(PQ_CT_BIAS_B, pMenuValue->iColorBias[2]);
  605. PQ_RegisterWrite(VIP_reg_dpy_u_reset,DISABLE);
  606. bEnableEnhancedColor= pHwContext->bEnableColorProcess;
  607. if( bEnableEnhancedColor )
  608. {
  609. //for color region
  610. PQ_RegisterWrite(VIP_reg_dpy_hsy_bypass, DISABLE);
  611. }
  612. else
  613. {
  614. PQ_RegisterWrite(VIP_reg_dpy_hsy_bypass, ENABLE);
  615. }
  616. }
  617. BOOL BluePatternFlag=0;
  618. void PQ_PureColorControl(INT16 ucPure, INT8 ucPicture)
  619. {
  620. INT8 ucYUVOffset;
  621. PQ_RegisterWrite(VIP_reg_dpy_mtx_out_range, 1);
  622. if(BluePatternFlag)
  623. {
  624. if(ucPure < 0)
  625. {
  626. if(ucPure==-1 && ucPicture==1) ucYUVOffset=6;
  627. else if(ucPure==-2 && ucPicture==1) ucYUVOffset=8;
  628. else if(ucPicture==2) ucYUVOffset=8;
  629. else if(ucPicture==3) ucYUVOffset=12;
  630. else ucYUVOffset=0;
  631. if(VIP_IsATVSource() && (VIP_GetStdColorSystem() <= CVD2_STD_NTSC_443) && ucPicture<=2) ucYUVOffset=10;
  632. PQ_RegisterWrite(VIP_REG_DPY_MTX_MAX_Y, 1023-ucYUVOffset);
  633. PQ_RegisterWrite(VIP_REG_DPY_MTX_MAX_U, 1023-ucYUVOffset);
  634. PQ_RegisterWrite(VIP_REG_DPY_MTX_MAX_V, 1023-ucYUVOffset);
  635. }
  636. else
  637. {
  638. if(ucPure<=6 && ucPicture==1) ucYUVOffset=6;
  639. else if(ucPure<=8 && ucPicture==2) ucYUVOffset=8;
  640. else if(ucPicture==3) ucYUVOffset=ucPure;
  641. else ucYUVOffset=ucPure;
  642. if(VIP_IsATVSource() && (VIP_GetStdColorSystem() <= CVD2_STD_NTSC_443) && ucPicture<=2) ucYUVOffset=10+ucPure;
  643. PQ_RegisterWrite(VIP_REG_DPY_MTX_MAX_Y, 1023-ucYUVOffset+ucPure);
  644. PQ_RegisterWrite(VIP_REG_DPY_MTX_MAX_U, 1023-ucYUVOffset+ucPure);
  645. PQ_RegisterWrite(VIP_REG_DPY_MTX_MAX_V, 1023-ucYUVOffset+ucPure);
  646. }
  647. PQDebugPrint("%s: ucYUVOffset=%d\n", __FUNCTION__, ucYUVOffset);
  648. PQDebugPrint("%s: ucPure=%d ucPicture=%d\n", __FUNCTION__, ucPure,ucPicture);
  649. }
  650. else if( VIP_GetUserSource() == SOURCE_PATTERN )
  651. {
  652. PQ_RegisterWrite(VIP_REG_DPY_MTX_MAX_Y,1023);
  653. PQ_RegisterWrite(VIP_REG_DPY_MTX_MAX_U,1023);
  654. PQ_RegisterWrite(VIP_REG_DPY_MTX_MAX_V,1023);
  655. }
  656. else
  657. {
  658. ucYUVOffset=8;
  659. PQ_RegisterWrite(VIP_REG_DPY_MTX_MAX_Y, 1023-ucYUVOffset);
  660. PQ_RegisterWrite(VIP_REG_DPY_MTX_MAX_U, 1023-ucYUVOffset);
  661. PQ_RegisterWrite(VIP_REG_DPY_MTX_MAX_V, 1023-ucYUVOffset);
  662. }
  663. }
  664. void PQ_ColorSpaceMode(UINT8 ucMode, UINT8 ucInputSource)
  665. {
  666. PQHW_CONTEXT* pHwContext= &PQHwContext;
  667. PQDebugPrint("%s: ucMode=%d ucOld=%d", __FUNCTION__, ucMode, pHwContext->nColorSpaceMode);
  668. if( ucMode!=pHwContext->nColorSpaceMode || ucMode==PQ_COLOR_SPACE_AUTO )
  669. {
  670. pHwContext->nColorSpaceMode= ucMode;
  671. PQ_SetupColorSpaceConversionTable();
  672. }
  673. }
  674. void PQ_GetVtabHwRange(UINT8 ucFunID, INT32* pMin, INT32* pMax, INT32* pMiddle)
  675. {
  676. PQHW_CONTEXT* pHwContext= &PQHwContext;
  677. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  678. UINT8 ucTableIndex;
  679. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  680. RANGE_DATA *pRANGE_DATA;
  681. ucTableIndex = pVtab->mRange.mGroupedIndex[ucCurrSrcIndex];
  682. pRANGE_DATA = &pVtab->mRange.mRange_Data[ucTableIndex];
  683. if( ucFunID==PQ_BRIGHTNESS )
  684. {
  685. *pMin= pRANGE_DATA->BrightnessRange.min;
  686. *pMax= pRANGE_DATA->BrightnessRange.max;
  687. *pMiddle= pRANGE_DATA->BrightnessRange.middle;
  688. }
  689. else if( ucFunID==PQ_CONTRAST )
  690. {
  691. *pMin= pRANGE_DATA->ContrastRange.min;
  692. *pMax= pRANGE_DATA->ContrastRange.max;
  693. *pMiddle= pRANGE_DATA->ContrastRange.middle;
  694. }
  695. else if( ucFunID==PQ_SATURATION )
  696. {
  697. *pMin= pRANGE_DATA->SaturationRange.min;
  698. *pMax= pRANGE_DATA->SaturationRange.max;
  699. *pMiddle= pRANGE_DATA->SaturationRange.middle;
  700. }
  701. #if 0
  702. else if( ucFunID==VIP_HUE )
  703. {
  704. if( pVtab->HueRange.min>=0 && pVtab->HueRange.min<=32 )
  705. *pMin= pVtab->HueRange.min;
  706. if( pVtab->HueRange.max>=0 && pVtab->HueRange.max<=32 )
  707. *pMax= pVtab->HueRange.max;
  708. if( pVtab->HueRange.middle>=0 && pVtab->HueRange.middle<=32 )
  709. *pMiddle= pVtab->HueRange.middle;
  710. }
  711. #else
  712. else if( ucFunID==PQ_HUE )
  713. {
  714. if( pRANGE_DATA->HueRange.min>=0 && pRANGE_DATA->HueRange.min<=100 )
  715. *pMin= pRANGE_DATA->HueRange.min;
  716. if( pRANGE_DATA->HueRange.max>=0 && pRANGE_DATA->HueRange.max<=100 )
  717. *pMax= pRANGE_DATA->HueRange.max;
  718. if( pRANGE_DATA->HueRange.middle>=0 && pRANGE_DATA->HueRange.middle<=100 )
  719. *pMiddle= pRANGE_DATA->HueRange.middle;
  720. }
  721. #endif
  722. else if( ucFunID>=PQ_CT_R_GAIN && ucFunID<=PQ_CT_B_GAIN )
  723. {
  724. if(((pRANGE_DATA->ColorTempGainRange.min & 0xff000000) >>24) == 1)
  725. {
  726. switch(ucFunID)
  727. {
  728. case PQ_CT_R_GAIN:
  729. *pMin= pRANGE_DATA->ColorTempGainRange.min & 0xff;
  730. *pMax= pRANGE_DATA->ColorTempGainRange.max & 0xff;
  731. *pMiddle= pRANGE_DATA->ColorTempGainRange.middle & 0xff;
  732. break;
  733. case PQ_CT_G_GAIN:
  734. *pMin= (pRANGE_DATA->ColorTempGainRange.min & 0xff00) >> 8;
  735. *pMax= (pRANGE_DATA->ColorTempGainRange.max & 0xff00) >> 8;
  736. *pMiddle= (pRANGE_DATA->ColorTempGainRange.middle & 0xff00) >> 8;
  737. break;
  738. case PQ_CT_B_GAIN:
  739. *pMin= (pRANGE_DATA->ColorTempGainRange.min & 0xff0000) >> 16;
  740. *pMax= (pRANGE_DATA->ColorTempGainRange.max & 0xff0000) >> 16;
  741. *pMiddle= (pRANGE_DATA->ColorTempGainRange.middle & 0xff0000) >> 16;
  742. break;
  743. }
  744. }
  745. else
  746. {
  747. *pMin= pRANGE_DATA->ColorTempGainRange.min;
  748. *pMax= pRANGE_DATA->ColorTempGainRange.max;
  749. *pMiddle= pRANGE_DATA->ColorTempGainRange.middle;
  750. }
  751. }
  752. else if( ucFunID>=PQ_CT_R_BIAS && ucFunID<=PQ_CT_B_BIAS )
  753. {
  754. if(((pRANGE_DATA->ColorTempOffsetRange.min & 0xff000000) >> 24) == 1)
  755. {
  756. switch(ucFunID)
  757. {
  758. case PQ_CT_R_BIAS:
  759. *pMin= (INT8)(pRANGE_DATA->ColorTempOffsetRange.min & 0xff);
  760. *pMax= (INT8)(pRANGE_DATA->ColorTempOffsetRange.max & 0xff);
  761. *pMiddle= (INT8)(pRANGE_DATA->ColorTempOffsetRange.middle & 0xff);
  762. break;
  763. case PQ_CT_G_BIAS:
  764. *pMin= (INT8)((pRANGE_DATA->ColorTempOffsetRange.min & 0xff00) >> 8);
  765. *pMax= (INT8)((pRANGE_DATA->ColorTempOffsetRange.max & 0xff00) >> 8);
  766. *pMiddle= (INT8)((pRANGE_DATA->ColorTempOffsetRange.middle & 0xff00) >> 8);
  767. break;
  768. case PQ_CT_B_BIAS:
  769. *pMin= (INT8)((pRANGE_DATA->ColorTempOffsetRange.min & 0xff0000) >> 16);
  770. *pMax= (INT8)((pRANGE_DATA->ColorTempOffsetRange.max & 0xff0000) >> 16);
  771. *pMiddle= (INT8)((pRANGE_DATA->ColorTempOffsetRange.middle & 0xff0000) >> 16);
  772. break;
  773. }
  774. }
  775. else
  776. {
  777. *pMin= pRANGE_DATA->ColorTempOffsetRange.min;
  778. *pMax= pRANGE_DATA->ColorTempOffsetRange.max;
  779. *pMiddle= pRANGE_DATA->ColorTempOffsetRange.middle;
  780. }
  781. }
  782. }
  783. void PQ_GetVtabHwRangeExt(UINT8 ucFunID, INT32* pMidLeft, INT32* pMidRight)
  784. {
  785. PQHW_CONTEXT* pHwContext= &PQHwContext;
  786. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  787. UINT8 ucTableIndex;
  788. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  789. RANGE_DATA *pRANGE_DATA;
  790. ucTableIndex = pVtab->mRange.mGroupedIndex[ucCurrSrcIndex];
  791. pRANGE_DATA = &pVtab->mRange.mRange_Data[ucTableIndex];
  792. if( ucFunID==PQ_BRIGHTNESS )
  793. {
  794. *pMidLeft= pRANGE_DATA->BrightnessRangeExt.midleft;
  795. *pMidRight= pRANGE_DATA->BrightnessRangeExt.midright;
  796. }
  797. else if( ucFunID==PQ_CONTRAST )
  798. {
  799. *pMidLeft= pRANGE_DATA->ContrastRangeExt.midleft;
  800. *pMidRight= pRANGE_DATA->ContrastRangeExt.midright;
  801. }
  802. else if( ucFunID==PQ_SATURATION )
  803. {
  804. *pMidLeft= pRANGE_DATA->SaturationRangeExt.midleft;
  805. *pMidRight= pRANGE_DATA->SaturationRangeExt.midright;
  806. }
  807. }
  808. void PQ_YUV_Datat_Formal(UINT8 ucType)
  809. {
  810. PQHW_CONTEXT* pHwContext= &PQHwContext;
  811. pHwContext->ucYuvDataFormat = ucType;
  812. }
  813. UINT8 PQ_GET_YUV_Datat_Formal(void)
  814. {
  815. PQHW_CONTEXT* pHwContext= &PQHwContext;
  816. return pHwContext->ucYuvDataFormat;
  817. }
  818. void PQ_FleshTone_Init(void)
  819. {
  820. PQ_RegisterWrite(VIP_reg_dpy_flcom0_magmax, 0x37);
  821. PQ_RegisterWrite(VIP_reg_dpy_fil0_rgn_en, 0);
  822. PQ_RegisterWrite(VIP_reg_dpy_fil1_rgn_en, 0);
  823. PQ_RegisterWrite(VIP_reg_dpy_flcom0_rgn_en, 1);
  824. PQ_RegisterWrite(VIP_reg_dpy_flcom1_rgn_en, 0);
  825. PQ_RegisterWrite(VIP_reg_dpy_flcom2_rgn_en, 0);
  826. PQ_RegisterWrite(VIP_reg_dpy_fl_detail_minus, 0);
  827. PQ_RegisterWrite(VIP_reg_dpy_fl_detail_factor, 0);
  828. PQ_RegisterWrite(VIP_reg_dpy_fl_det_minus, 0);
  829. }
  830. //****************************************************************************
  831. // Function : PQ_NR_Init
  832. // Params : void
  833. // Description: (1)Disable 331 NR function related register(6994 ~ 6998) in 531
  834. // (2) Initial NR related register setting
  835. // Returns : void
  836. //****************************************************************************
  837. void PQ_NR_TnrzEnable(BOOL bEnable)
  838. {
  839. //add this function because color bar display abnormal when change source from pc to atv like mantis 42375.
  840. if(VIP_IsPCSource() || VIP_RunDVIMode())
  841. {
  842. PQ_RegisterWrite(VIP_reg_vdi_tnrz_en, 0);//For 305 bandwidth issue.//307/506 should be ok.
  843. }
  844. else
  845. {
  846. PQ_RegisterWrite(VIP_reg_vdi_tnrz_en, bEnable);
  847. }
  848. }
  849. void PQ_NR_Init(void)
  850. {
  851. //685e 0xbb
  852. PQ_NR_TnrzEnable(ENABLE);
  853. PQ_RegisterWrite(VIP_reg_vdi_tnrz_th_dyn_adj, 1);
  854. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_dyn_adj, 0);
  855. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_dith_en, 1);
  856. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_mbw_en, 1);
  857. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_en, 1);
  858. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_sel, 0);
  859. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_bmax_sel, 1);
  860. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_alpha_inc, 0x8);
  861. //6860 0x42 , Grid Mobile Noise//6860 0xf8 640X480 YCBCR444 ColorBar shake
  862. PQ_RegisterWrite(VIP_reg_vdi_tnrz_chroma_tap_sel0, 0); //0x00406860
  863. PQ_RegisterWrite(VIP_reg_vdi_tnrz_chroma_tap_sel1, 0); //0x00416860
  864. PQ_RegisterWrite(VIP_reg_vdi_tnrz_debug_en, 0); //0x00426860
  865. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_blk_diff_sel, 1); //0x00436860
  866. PQ_RegisterWrite(VIP_reg_vdi_tnr_blk_diff_sel, 1); //0x00446860
  867. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_blk_diff_sel, 0); //0x00456860
  868. PQ_RegisterWrite(VIP_reg_vdi_tnrz_blk_diff_sel, 1); //0x00466860
  869. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_blk_diff_sel, 1); //0x00476860
  870. PQ_RegisterWrite(VIP_reg_vdi_mnr_gain_inc, 0);
  871. PQ_RegisterWrite(VIP_reg_vdi_snr_gain_th, 0);
  872. //sigmaNR request by kent
  873. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_BLK_MODE_W, 1);
  874. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_BLK_MODE_N, 1);
  875. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_BLK_MODE_S, 1);
  876. }
  877. void PQ_SetupStrength(PQ_ITEM ucItemID, UINT8 ucDegree)
  878. {
  879. PQHW_CONTEXT* pHwContext= &PQHwContext;
  880. const LUMA_TNR_STRENGTH* pLTNRStrength;
  881. const CHROMA_TNR_STRENGTH* pCTNRStrength;
  882. const LUMA_SNR1_STRENGTH* pLSNR1Strength;
  883. const BLOCK_NR_CORING* pBlockNrCoring;
  884. const BLOCK_NR_STRENGTH* pBlockNrStrength;
  885. const MOSQUITO_NR_CORING* pMosquitoNrCoring;
  886. const MOSQUITO_NR_STRENGTH* pMosquitoNrStrength;
  887. pHwContext->CVD2_store_nr_setting=0;
  888. pHwContext->Degree=ucDegree;
  889. ucDegree = min(15, max(0, (INT32)ucDegree));
  890. if( ucItemID<PQ_ITEM_BLOCK_NR_CORING || (ucItemID >= PQ_ITEM_TNR_ULTRA_LOW && ucItemID <= PQ_ITEM_SNR2_ULTRA_LOW))
  891. {
  892. if( ucItemID==PQ_ITEM_LUMA_SNR1_CORING || ucItemID==PQ_ITEM_LUMA_SNR2_CORING )
  893. ucDegree = min(ucDegree,(UINT8)PQ_MAX_LSNR_DEGREE);
  894. else if(ucItemID == PQ_ITEM_SNR1_ULTRA_LOW || ucItemID == PQ_ITEM_SNR2_ULTRA_LOW)
  895. ucDegree = min(ucDegree,(UINT8)PQ_MAX_SNR_ULOW_DEGREE);
  896. else
  897. ucDegree = min(ucDegree,(UINT8)PQ_MAX_ITEM_DEGREE);
  898. }
  899. else
  900. {
  901. //digital NR
  902. ucDegree=min(ucDegree ,(UINT8)PQ_MAX_MPEGNR_DEGREE );
  903. }
  904. switch(ucItemID)
  905. {
  906. case PQ_ITEM_LUMA_TNR_CORING:
  907. PQ_RegisterWrite(VIP_reg_vdi_tnr_th1_adj_min,0);
  908. PQ_RegisterWrite(VIP_reg_vdi_tnr_th1,0);
  909. PQ_RegisterWrite(VIP_reg_vdi_tnr_th1_adj_max, 34);
  910. PQ_RegisterWrite(VIP_reg_vdi_tnr_th1_adj_fact, 40);
  911. PQ_RegisterWrite(VIP_reg_vdi_tnr_mbw1_alpha_adj, (VIP_GetInputVSize()<720)?8:0);
  912. PQ_RegisterWrite(VIP_reg_vdi_tnr_mbw2_alpha_adj, (VIP_GetInputVSize()<720)?12:8);
  913. PQ_RegisterWrite(VIP_reg_vdi_tnr_mbw3_alpha_adj, 16);
  914. PQ_RegisterWrite(VIP_reg_vdi_tnr_mbwm_alpha_adj, 24);
  915. break;
  916. case PQ_ITEM_LUMA_TNR_STRENGTH:
  917. if(VIP_IsATVSource())
  918. pLTNRStrength= &ATVLTNRStrength[ucDegree];
  919. else if(VIP_IsAVSource())
  920. pLTNRStrength= &AVLTNRStrength[ucDegree];
  921. else if(VIP_IsPCSource())
  922. {
  923. if(VIP_GetInputVSize()<720)
  924. pLTNRStrength= &PCSDLTNRStrength[ucDegree];
  925. else
  926. pLTNRStrength = &PCHDLTNRStrength[ucDegree];
  927. }
  928. else
  929. {
  930. if(VIP_GetInputVSize()<720)
  931. pLTNRStrength= &SDLTNRStrength[ucDegree];
  932. else
  933. pLTNRStrength = &HDLTNRStrength[ucDegree];
  934. }
  935. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_adj_min, pLTNRStrength->vdi_tnr_alpha_adj_min);
  936. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_init, pLTNRStrength->vdi_tnr_alpha_init);
  937. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_adj_min_dith, pLTNRStrength->vdi_tnr_alpha_adj_min_dith);
  938. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_alpha, pLTNRStrength->vdi_tnr_alpha);
  939. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_inc_fact,4);
  940. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_dec_fact,2);
  941. break;
  942. case PQ_ITEM_CHROMA_TNR_CORING:
  943. if(VIP_GetUserSource() == SOURCE_MPEG && (VIP_GetInputVSize() == 1080))
  944. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_chroma, 0x38); //#47690
  945. else
  946. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_chroma, 16);
  947. break;
  948. case PQ_ITEM_CHROMA_TNR_STRENGTH:
  949. pCTNRStrength = &CTNRStrength[ucDegree];
  950. if(VIP_GetUserSource() == SOURCE_CVD2)
  951. pCTNRStrength = &CVD2CTNRStrength[ucDegree];
  952. PQ_RegisterWrite(VIP_reg_vdi_tnr_th1_chroma, pCTNRStrength->vdi_tnr_alpha_chroma);
  953. break;
  954. case PQ_ITEM_TNR_ULTRA_LOW:
  955. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_th3, 0x800);
  956. break;
  957. case PQ_ITEM_LUMA_SNR1_CORING:
  958. if(VIP_IsATVSource() )
  959. {
  960. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring, 0x10);
  961. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_limit, 0xff);
  962. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_th1, 0x10);
  963. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_th2, 8);
  964. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_th3, 0);
  965. }
  966. else if(VIP_IsAVSource() )
  967. {
  968. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring, 0);
  969. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_limit, 0x20);
  970. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_th1, 4);
  971. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_th2, 4);
  972. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_th3, 0x16);
  973. }
  974. else
  975. {
  976. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring, 0xc);
  977. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_limit, 0x2c);
  978. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_th1, 4);
  979. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_th2, 4);
  980. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_th3, 0x11);
  981. }
  982. break;
  983. case PQ_ITEM_LUMA_SNR1_STRENGTH:
  984. if(VIP_IsATVSource())
  985. pLSNR1Strength = &ATVLSNR1Strength[ucDegree];
  986. else if(VIP_IsAVSource())
  987. pLSNR1Strength = &AVLSNR1Strength[ucDegree];
  988. else if(VIP_IsPCSource())
  989. {
  990. if(VIP_GetlInputCaptureVSize()<720)
  991. pLSNR1Strength = &PCSDSNR1Strength[ucDegree];
  992. else
  993. pLSNR1Strength = &PCHDSNR1Strength[ucDegree];
  994. }
  995. else
  996. {
  997. if(VIP_GetlInputCaptureVSize()<720)
  998. pLSNR1Strength = &SDSNR1Strength[ucDegree];
  999. else
  1000. pLSNR1Strength = &HDSNR1Strength[ucDegree];
  1001. }
  1002. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_gain_inc, pLSNR1Strength->vdi_snr_ulow_gain_inc);
  1003. if(VIP_IsATVSource())
  1004. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_smooth, 0x10);
  1005. else if(VIP_IsAVSource())
  1006. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_smooth, 0x28);
  1007. else
  1008. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_smooth, 0x22);
  1009. break;
  1010. case PQ_ITEM_LUMA_SNR2_CORING:
  1011. if(VIP_IsATVSource() )
  1012. {
  1013. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring, 0x10);
  1014. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_limit, 0xff);
  1015. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_th1, 16);
  1016. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_th2,8);
  1017. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_th3, 0);
  1018. }
  1019. else if(VIP_IsAVSource() )
  1020. {
  1021. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring, 4);
  1022. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_limit, 0x24);
  1023. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_th1, 4);
  1024. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_th2, 4);
  1025. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_th3, 0x15);
  1026. }
  1027. else
  1028. {
  1029. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring, 0x14);
  1030. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_limit, 0x34);
  1031. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_th1, 4);
  1032. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_th2, 4);
  1033. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_th3, 0xf);
  1034. }
  1035. break;
  1036. case PQ_ITEM_LUMA_SNR2_STRENGTH:
  1037. break;
  1038. case PQ_ITEM_CHROMA_SNR_CORING:
  1039. if(VIP_IsATVSource() )
  1040. {
  1041. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_coring_limit, 0x30);
  1042. }
  1043. else if(VIP_IsAVSource() )
  1044. {
  1045. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_coring_limit, 0x28);
  1046. }
  1047. else if(VIP_GetInputVSize() <720)
  1048. {
  1049. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_coring_limit, 0x2C);
  1050. }
  1051. else
  1052. {
  1053. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_coring_limit, 0x60);
  1054. }
  1055. break;
  1056. case PQ_ITEM_CHROMA_SNR_STRENGTH:
  1057. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_smooth, CSNRStrength[ucDegree].vdi_snr_hc_smooth);
  1058. break;
  1059. case PQ_ITEM_SNR1_ULTRA_LOW:
  1060. break;
  1061. case PQ_ITEM_SNR2_ULTRA_LOW:
  1062. break;
  1063. case PQ_ITEM_BLOCK_NR_CORING:
  1064. pBlockNrCoring= &BlockNrCoring[ucDegree];
  1065. PQ_RegisterWrite(VIP_reg_vdi_dbk_vdiff_th2, pBlockNrCoring->vdi_dbk_hdiff_th2);
  1066. PQ_RegisterWrite(VIP_reg_vdi_dbk_vdiff_hmot_th2, pBlockNrCoring->vdi_dbk_hdiff_th2 +2);
  1067. PQ_RegisterWrite(VIP_reg_vdi_dbk_vdiff_lmot_th2, pBlockNrCoring->vdi_dbk_hdiff_th2 -2);
  1068. PQ_RegisterWrite(VIP_reg_gfx_dbk_hdiff_hmot_th2, min(pBlockNrCoring->vdi_dbk_hdiff_th2 + 2, 42));
  1069. PQ_RegisterWrite(VIP_reg_gfx_dbk_hdiff_lmot_th2, max(pBlockNrCoring->vdi_dbk_hdiff_th2 - 2, 0));
  1070. PQ_RegisterWrite(VIP_reg_gfx_dbk_hdiff_th2, pBlockNrCoring->vdi_dbk_hdiff_th2);
  1071. break;
  1072. case PQ_ITEM_BLOCK_NR_STRENGTH:
  1073. pBlockNrStrength= &BlockNrStrength[ucDegree];
  1074. //yuling:must less than 42
  1075. PQ_RegisterWrite(VIP_reg_gfx_dbk_hdiff_hmot_th1, min(pBlockNrStrength->vdi_dbk_hdiff_th1 + 2, 42));
  1076. PQ_RegisterWrite(VIP_reg_gfx_dbk_hdiff_lmot_th1, max(pBlockNrStrength->vdi_dbk_hdiff_th1 - 2, 0));
  1077. PQ_RegisterWrite(VIP_reg_gfx_dbk_hdiff_th1, pBlockNrStrength->vdi_dbk_hdiff_th1);
  1078. PQ_RegisterWrite(VIP_reg_gfx_dbk_hdiff_slope1, pBlockNrStrength->vdi_dbk_hdiff_slope1);
  1079. PQ_RegisterWrite(VIP_reg_vdi_dbk_vdiff_th1,pBlockNrStrength->vdi_dbk_hdiff_th1);
  1080. PQ_RegisterWrite(VIP_reg_vdi_dbk_vfil_slope, pBlockNrStrength->vdi_dbk_hdiff_slope1);
  1081. PQ_RegisterWrite(VIP_reg_vdi_dbk_vdiff_hmot_th1,pBlockNrStrength->vdi_dbk_hdiff_th1+2);
  1082. PQ_RegisterWrite(VIP_reg_vdi_dbk_vdiff_lmot_th1,pBlockNrStrength->vdi_dbk_hdiff_th1-2);
  1083. break;
  1084. case PQ_ITEM_MOSQUITO_NR_CORING:
  1085. pMosquitoNrCoring= &MosquitoNrCoring[ucDegree];
  1086. PQ_RegisterWrite(VIP_reg_vdi_mnr_h_coring_inc, pMosquitoNrCoring->vdi_mnr_h_coring_inc);
  1087. PQ_RegisterWrite(VIP_reg_vdi_mnr_v_coring_inc, pMosquitoNrCoring->vdi_mnr_v_coring_inc);
  1088. break;
  1089. case PQ_ITEM_MOSQUITO_NR_STRENGTH:
  1090. pMosquitoNrStrength= &MosquitoNrStrength[ucDegree];
  1091. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_gain_inc, pMosquitoNrStrength->vdi_mnr_gain_inc);
  1092. break;
  1093. }
  1094. }
  1095. void PQ_Set_NR_BlockAlpha(UINT8 NRBlockAlphaType)
  1096. {
  1097. PQHW_CONTEXT* pHwContext= &PQHwContext;
  1098. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  1099. UINT8 ucLevel;
  1100. UINT8 ucTableIndex;
  1101. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  1102. NR_Setting_BY_Group_Idx *pNR_Setting_BY_Group_Idx;
  1103. //UINT8 j;
  1104. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  1105. if(pVtab == NULL)
  1106. {
  1107. return ;
  1108. }
  1109. if (pVtab->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex] >= 8)
  1110. {
  1111. return;
  1112. }
  1113. if((*((UINT8*)(0xbe1cd688))) == 0x6)
  1114. printk("<0>%s %d, ucCurrSrcIndex = %d\n",__FUNCTION__, __LINE__, ucCurrSrcIndex);
  1115. ucTableIndex = pVtab->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex];
  1116. if((*((UINT8*)(0xbe1cd688))) == 0x6)
  1117. printk("<0>%s %d, ucTableIndex = %d\n",__FUNCTION__, __LINE__, ucTableIndex);
  1118. pNR_Setting_BY_Group_Idx = &pVtab->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex];
  1119. if(pNR_Setting_BY_Group_Idx == NULL)
  1120. {
  1121. return ;
  1122. }
  1123. ucLevel = pHwContext->nNRLevel-1;
  1124. if((*((UINT8*)(0xbe1cd688))) == 0x6)
  1125. printk("<0>%s, NRBlockAlphaType = %d, nNRLevel = %d\n",__FUNCTION__,NRBlockAlphaType, pHwContext->nNRLevel);
  1126. if(pHwContext->nNRLevel == OFF &&
  1127. (VIP_GetUserSource() == SOURCE_CVD2 ||
  1128. (VIP_GetUserSource() == SOURCE_EXTS && !VIP_IsPCSource()))
  1129. )
  1130. {
  1131. ucLevel = 0;
  1132. }
  1133. if(pHwContext->nNRLevel == OFF &&
  1134. (VIP_GetUserSource() == SOURCE_JPEG ||
  1135. VIP_GetUserSource() == SOURCE_HDMI ||
  1136. VIP_GetUserSource() == SOURCE_MPEG ||
  1137. VIP_IsPCSource())
  1138. )
  1139. {
  1140. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr0, 0);
  1141. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr1, 0);
  1142. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr2, 0);
  1143. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr3, 0);
  1144. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr4, 0);
  1145. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac0, 255);
  1146. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac1, 255);
  1147. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac2, 255);
  1148. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac3, 255);
  1149. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac4, 255);
  1150. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac5, 255);
  1151. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp0, 0);
  1152. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp1, 0);
  1153. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp2, 0);
  1154. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp3, 0);
  1155. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp4, 0);
  1156. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp5, 0);
  1157. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_thr0, 0);
  1158. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_thr1, 0);
  1159. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_thr2, 0);
  1160. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_thr3, 0);
  1161. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_thr4, 0);
  1162. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac0, 255);
  1163. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac1, 255);
  1164. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac2, 255);
  1165. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac3, 255);
  1166. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac4, 255);
  1167. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac5, 255);
  1168. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp0, 0);
  1169. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp1, 0);
  1170. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp2, 0);
  1171. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp3, 0);
  1172. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp4, 0);
  1173. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp5, 0);
  1174. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr0, 0);
  1175. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr1, 0);
  1176. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr2, 0);
  1177. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr3, 0);
  1178. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr4, 0);
  1179. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac0, 255);
  1180. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac1, 255);
  1181. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac2, 255);
  1182. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac3, 255);
  1183. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac4, 255);
  1184. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac5, 255);
  1185. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp0, 0);
  1186. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp1, 0);
  1187. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp2, 0);
  1188. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp3, 0);
  1189. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp4, 0);
  1190. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp5, 0);
  1191. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_thr0, 0);
  1192. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_thr1, 0);
  1193. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_thr2, 0);
  1194. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_thr3, 0);
  1195. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_thr4, 0);
  1196. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac0, 255);
  1197. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac1, 255);
  1198. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac2, 255);
  1199. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac3, 255);
  1200. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac4, 255);
  1201. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac5, 255);
  1202. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp0, 0);
  1203. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp1, 0);
  1204. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp2, 0);
  1205. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp3, 0);
  1206. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp4, 0);
  1207. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp5, 0);
  1208. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr0, 0);
  1209. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr1, 0);
  1210. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr2, 0);
  1211. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr3, 0);
  1212. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr4, 0);
  1213. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac0, 255);
  1214. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac1, 255);
  1215. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac2, 255);
  1216. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac3, 255);
  1217. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac4, 255);
  1218. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac5, 255);
  1219. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp0, 0);
  1220. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp1, 0);
  1221. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp2, 0);
  1222. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp3, 0);
  1223. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp4, 0);
  1224. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp5, 0);
  1225. }
  1226. else
  1227. {
  1228. switch(NRBlockAlphaType){
  1229. case NR_BLOCK_ALPHA_TNR:
  1230. // TNR enable
  1231. if(pVtab->MagicNumber9 == NewTNRVer)
  1232. {
  1233. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mmap_en >> (ucTableIndex*4));
  1234. }
  1235. else
  1236. {
  1237. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mmap_en);
  1238. }
  1239. // thr 0 ~ 4
  1240. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mthr[0].Degree[ucLevel]);
  1241. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mthr[1].Degree[ucLevel]);
  1242. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mthr[2].Degree[ucLevel]);
  1243. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mthr[3].Degree[ucLevel]);
  1244. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mthr[4].Degree[ucLevel]);
  1245. // slp 0 ~ 5
  1246. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mslp[0].Degree[ucLevel]);
  1247. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mslp[1].Degree[ucLevel]);
  1248. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mslp[2].Degree[ucLevel]);
  1249. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mslp[3].Degree[ucLevel]);
  1250. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mslp[4].Degree[ucLevel]);
  1251. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp5, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mslp[5].Degree[ucLevel]);
  1252. // fac 0 ~ 5
  1253. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mfac[0].Degree[ucLevel]);
  1254. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mfac[1].Degree[ucLevel]);
  1255. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mfac[2].Degree[ucLevel]);
  1256. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mfac[3].Degree[ucLevel]);
  1257. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mfac[4].Degree[ucLevel]);
  1258. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac5, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mfac[5].Degree[ucLevel]);
  1259. //for VIP_reg_vdi_tnr_map_en disable
  1260. PQ_RegisterWrite(VIP_reg_vdi_tnr_blk_diff_lp_en, 1);
  1261. PQ_RegisterWrite(VIP_reg_vdi_tnr_7tap, 0);
  1262. //
  1263. /*for(j = 0; j < 5; j++)
  1264. VIPDebugPrint("%s, mthr[%d].Degree[%d] = %d",__FUNCTION__, j, ucLevel, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mthr[j].Degree[ucLevel]);
  1265. for(j = 0; j < 6; j++)
  1266. {
  1267. VIPDebugPrint("%s, mslp[%d].Degree[%d] = %d",__FUNCTION__, j, ucLevel, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mslp[j].Degree[ucLevel]);
  1268. VIPDebugPrint("%s, mfac[%d].Degree[%d] = %d",__FUNCTION__, j,ucLevel, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mfac[j].Degree[ucLevel]);
  1269. }*/
  1270. break;
  1271. case NR_BLOCK_ALPHA_TNR_SNR:
  1272. // TNR_SNR enable
  1273. if(pVtab->MagicNumber9 == NewTNRVer)
  1274. {
  1275. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_en, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mmap_en >> (ucTableIndex*4));
  1276. }
  1277. else
  1278. {
  1279. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_en, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mmap_en);
  1280. }
  1281. // thr 0 ~ 4
  1282. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_thr0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mthr[0].Degree[ucLevel]);
  1283. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_thr1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mthr[1].Degree[ucLevel]);
  1284. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_thr2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mthr[2].Degree[ucLevel]);
  1285. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_thr3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mthr[3].Degree[ucLevel]);
  1286. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_thr4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mthr[4].Degree[ucLevel]);
  1287. // slp 0 ~ 5
  1288. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mslp[0].Degree[ucLevel]);
  1289. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mslp[1].Degree[ucLevel]);
  1290. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mslp[2].Degree[ucLevel]);
  1291. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mslp[3].Degree[ucLevel]);
  1292. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mslp[4].Degree[ucLevel]);
  1293. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp5, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mslp[5].Degree[ucLevel]);
  1294. // fac 0 ~ 5
  1295. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mfac[0].Degree[ucLevel]);
  1296. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mfac[1].Degree[ucLevel]);
  1297. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mfac[2].Degree[ucLevel]);
  1298. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mfac[3].Degree[ucLevel]);
  1299. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mfac[4].Degree[ucLevel]);
  1300. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac5, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mfac[5].Degree[ucLevel]);
  1301. //for VIP_reg_vdi_tnr_snr_map_en disable
  1302. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_slope, 0x1f);//need default
  1303. //
  1304. /*for(j = 0; j < 5; j++)
  1305. VIPDebugPrint("%s, mthr[%d].Degree[%d] = %d",__FUNCTION__, j, ucLevel, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mthr[j].Degree[ucLevel]);
  1306. for(j = 0; j < 6; j++)
  1307. {
  1308. VIPDebugPrint("%s, mslp[%d].Degree[%d] = %d",__FUNCTION__, j, ucLevel, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mslp[j].Degree[ucLevel]);
  1309. VIPDebugPrint("%s, mfac[%d].Degree[%d] = %d",__FUNCTION__, j,ucLevel, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mfac[j].Degree[ucLevel]);
  1310. }*/
  1311. break;
  1312. case NR_BLOCK_ALPHA_TNR_C:
  1313. // TNR_C enable
  1314. if(pVtab->MagicNumber9 == NewTNRVer)
  1315. {
  1316. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_en, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mmap_en >> (ucTableIndex*4));
  1317. }
  1318. else
  1319. {
  1320. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_en, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mmap_en);
  1321. }
  1322. // thr 0 ~ 4
  1323. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mthr[0].Degree[ucLevel]);
  1324. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mthr[1].Degree[ucLevel]);
  1325. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mthr[2].Degree[ucLevel]);
  1326. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mthr[3].Degree[ucLevel]);
  1327. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mthr[4].Degree[ucLevel]);
  1328. // slp 0 ~ 5
  1329. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mslp[0].Degree[ucLevel]);
  1330. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mslp[1].Degree[ucLevel]);
  1331. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mslp[2].Degree[ucLevel]);
  1332. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mslp[3].Degree[ucLevel]);
  1333. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mslp[4].Degree[ucLevel]);
  1334. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp5, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mslp[5].Degree[ucLevel]);
  1335. // fac 0 ~ 5
  1336. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mfac[0].Degree[ucLevel]);
  1337. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mfac[1].Degree[ucLevel]);
  1338. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mfac[2].Degree[ucLevel]);
  1339. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mfac[3].Degree[ucLevel]);
  1340. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mfac[4].Degree[ucLevel]);
  1341. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac5, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mfac[5].Degree[ucLevel]);
  1342. //
  1343. /*for(j = 0; j < 5; j++)
  1344. VIPDebugPrint("%s, mthr[%d].Degree[%d] = %d",__FUNCTION__, j, ucLevel, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mthr[j].Degree[ucLevel]);
  1345. for(j = 0; j < 6; j++)
  1346. {
  1347. VIPDebugPrint("%s, mslp[%d].Degree[%d] = %d",__FUNCTION__, j, ucLevel, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mslp[j].Degree[ucLevel]);
  1348. VIPDebugPrint("%s, mfac[%d].Degree[%d] = %d",__FUNCTION__, j,ucLevel, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mfac[j].Degree[ucLevel]);
  1349. }*/
  1350. break;
  1351. case NR_BLOCK_ALPHA_TNRZ:
  1352. // TNRZ enable
  1353. if(pVtab->MagicNumber9 == NewTNRVer)
  1354. {
  1355. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_en, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mmap_en >> (ucTableIndex*4));
  1356. }
  1357. else
  1358. {
  1359. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_en, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mmap_en);
  1360. }
  1361. // thr 0 ~ 4
  1362. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_thr0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mthr[0].Degree[ucLevel]);
  1363. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_thr1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mthr[1].Degree[ucLevel]);
  1364. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_thr2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mthr[2].Degree[ucLevel]);
  1365. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_thr3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mthr[3].Degree[ucLevel]);
  1366. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_thr4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mthr[4].Degree[ucLevel]);
  1367. // slp 0 ~ 5
  1368. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mslp[0].Degree[ucLevel]);
  1369. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mslp[1].Degree[ucLevel]);
  1370. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mslp[2].Degree[ucLevel]);
  1371. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mslp[3].Degree[ucLevel]);
  1372. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mslp[4].Degree[ucLevel]);
  1373. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp5, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mslp[5].Degree[ucLevel]);
  1374. // fac 0 ~ 5
  1375. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mfac[0].Degree[ucLevel]);
  1376. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mfac[1].Degree[ucLevel]);
  1377. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mfac[2].Degree[ucLevel]);
  1378. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mfac[3].Degree[ucLevel]);
  1379. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mfac[4].Degree[ucLevel]);
  1380. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac5, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mfac[5].Degree[ucLevel]);
  1381. //for VIP_reg_vdi_tnrz_map_en disable
  1382. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope, 31);
  1383. //
  1384. /*for(j = 0; j < 5; j++)
  1385. VIPDebugPrint("%s, mthr[%d].Degree[%d] = %d",__FUNCTION__, j, ucLevel, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mthr[j].Degree[ucLevel]);
  1386. for(j = 0; j < 6; j++)
  1387. {
  1388. VIPDebugPrint("%s, mslp[%d].Degree[%d] = %d",__FUNCTION__, j, ucLevel, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mslp[j].Degree[ucLevel]);
  1389. VIPDebugPrint("%s, mfac[%d].Degree[%d] = %d",__FUNCTION__, j,ucLevel, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mfac[j].Degree[ucLevel]);
  1390. }*/
  1391. break;
  1392. case NR_BLOCK_ALPHA_TNRZ_C:
  1393. // TNRZ_C enable
  1394. if(pVtab->MagicNumber9 == NewTNRVer)
  1395. {
  1396. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_en, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mmap_en >> (ucTableIndex*4));
  1397. }
  1398. else
  1399. {
  1400. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_en, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mmap_en);
  1401. }
  1402. // thr 0 ~ 4
  1403. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mthr[0].Degree[ucLevel]);
  1404. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mthr[1].Degree[ucLevel]);
  1405. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mthr[2].Degree[ucLevel]);
  1406. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mthr[3].Degree[ucLevel]);
  1407. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mthr[4].Degree[ucLevel]);
  1408. // slp 0 ~ 5
  1409. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mslp[0].Degree[ucLevel]);
  1410. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mslp[1].Degree[ucLevel]);
  1411. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mslp[2].Degree[ucLevel]);
  1412. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mslp[3].Degree[ucLevel]);
  1413. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mslp[4].Degree[ucLevel]);
  1414. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp5, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mslp[5].Degree[ucLevel]);
  1415. // fac 0 ~ 5
  1416. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mfac[0].Degree[ucLevel]);
  1417. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mfac[1].Degree[ucLevel]);
  1418. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mfac[2].Degree[ucLevel]);
  1419. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mfac[3].Degree[ucLevel]);
  1420. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mfac[4].Degree[ucLevel]);
  1421. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac5, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mfac[5].Degree[ucLevel]);
  1422. // for VIP_reg_vdi_tnrz_c_map_en disable
  1423. PQ_RegisterWrite(VIP_reg_vdi_tnrz_th1_chroma, 20);
  1424. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_chroma, 25);
  1425. //
  1426. /*for(j = 0; j < 5; j++)
  1427. VIPDebugPrint("%s, mthr[%d].Degree[%d] = %d",__FUNCTION__, j, ucLevel, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mthr[j].Degree[ucLevel]);
  1428. for(j = 0; j < 6; j++)
  1429. {
  1430. VIPDebugPrint("%s, mslp[%d].Degree[%d] = %d",__FUNCTION__, j, ucLevel, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mslp[j].Degree[ucLevel]);
  1431. VIPDebugPrint("%s, mfac[%d].Degree[%d] = %d",__FUNCTION__, j,ucLevel, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mfac[j].Degree[ucLevel]);
  1432. }*/
  1433. break;
  1434. case NR_BLOCK_ALPHA_AV_SECAM_PATCH:
  1435. //TNR C
  1436. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_en ,1);
  1437. // thr 0 ~ 4
  1438. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr0, 0);
  1439. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr1, 0);
  1440. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr2, 0);
  1441. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr3, 0);
  1442. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr4, 0);
  1443. // slp 0 ~ 5
  1444. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp0, 0);
  1445. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp1, 0);
  1446. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp2, 0);
  1447. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp3, 0);
  1448. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp4, 0);
  1449. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp5, 0);
  1450. // fac 0 ~ 5
  1451. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac0, 0);
  1452. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac1, 0);
  1453. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac2, 0);
  1454. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac3, 0);
  1455. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac4, 0);
  1456. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac5, 0);
  1457. //TNRZ C
  1458. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_en ,1);
  1459. // thr 0 ~ 4
  1460. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr0, 0);
  1461. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr1, 0);
  1462. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr2, 0);
  1463. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr3, 0);
  1464. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr4, 0);
  1465. // slp 0 ~ 5
  1466. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp0, 0);
  1467. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp1, 0);
  1468. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp2, 0);
  1469. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp3, 0);
  1470. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp4, 0);
  1471. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp5, 0);
  1472. // fac 0 ~ 5
  1473. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac0, 0);
  1474. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac1, 0);
  1475. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac2, 0);
  1476. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac3, 0);
  1477. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac4, 0);
  1478. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac5, 0);
  1479. break;
  1480. }
  1481. }
  1482. }
  1483. void PQ_Set_NR_SLR_SNR(UINT8 ucSLR_SNR_TYPE)
  1484. {
  1485. PQHW_CONTEXT* pHwContext= &PQHwContext;
  1486. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  1487. UINT8 ucLevel;
  1488. UINT8 ucTableIndex;
  1489. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  1490. SNR_Setting *pNR_SLR_SNR1;
  1491. SNR_Setting *pNR_SLR_SNR2;
  1492. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  1493. if (pVtab->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex] >= 8) return;
  1494. ucTableIndex = pVtab->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex];
  1495. pNR_SLR_SNR1 = &pVtab->mSNR1Setting[ucTableIndex];
  1496. pNR_SLR_SNR2 = &pVtab->mSNR2Setting[ucTableIndex];
  1497. ucLevel = (pHwContext->nNRLevel==OFF) ? 0 : (pHwContext->nNRLevel-1) ;
  1498. switch(ucSLR_SNR_TYPE){
  1499. case NR_SNR_BEFORE_SCALER:
  1500. //SNR1
  1501. PQ_RegisterWrite(VIP_reg_slr_snr_bypass, (pHwContext->nNRLevel==OFF) ? 1 : pNR_SLR_SNR1->SNR_MapByPass);
  1502. //LUMA
  1503. PQ_RegisterWrite(VIP_reg_slr_snr_sel, pNR_SLR_SNR1->SNR_Luma.SNR_Sel.Degree[ucLevel]);
  1504. PQ_RegisterWrite(VIP_reg_slr_snr_chk_middle_pxl, pNR_SLR_SNR1->SNR_Luma.SNR_Chk_Middle_Pxl.Degree[ucLevel]);
  1505. PQ_RegisterWrite(VIP_reg_slr_snr_th1, pNR_SLR_SNR1->SNR_Luma.SNR_th.Degree[ucLevel]);
  1506. PQ_RegisterWrite(VIP_reg_slr_snr_gain1, pNR_SLR_SNR1->SNR_Luma.SNR_Gain[0].Degree[ucLevel]);
  1507. PQ_RegisterWrite(VIP_reg_slr_snr_gain2, pNR_SLR_SNR1->SNR_Luma.SNR_Gain[1].Degree[ucLevel]);
  1508. PQ_RegisterWrite(VIP_reg_slr_snr_slope, pNR_SLR_SNR1->SNR_Luma.SNR_Slope.Degree[ucLevel]);
  1509. //CHROMA
  1510. PQ_RegisterWrite(VIP_reg_slr_snr_sel_c, pNR_SLR_SNR1->SNR_Chroma.SNR_Sel.Degree[ucLevel]);
  1511. PQ_RegisterWrite(VIP_reg_slr_snr_chk_middle_pxl_c, pNR_SLR_SNR1->SNR_Chroma.SNR_Chk_Middle_Pxl.Degree[ucLevel]);
  1512. PQ_RegisterWrite(VIP_reg_slr_snr_th1_c, pNR_SLR_SNR1->SNR_Chroma.SNR_th.Degree[ucLevel]);
  1513. PQ_RegisterWrite(VIP_reg_slr_snr_gain1_c, pNR_SLR_SNR1->SNR_Chroma.SNR_Gain[0].Degree[ucLevel]);
  1514. PQ_RegisterWrite(VIP_reg_slr_snr_gain2_c, pNR_SLR_SNR1->SNR_Chroma.SNR_Gain[1].Degree[ucLevel]);
  1515. PQ_RegisterWrite(VIP_reg_slr_snr_slope_c, pNR_SLR_SNR1->SNR_Chroma.SNR_Slope.Degree[ucLevel]);
  1516. break;
  1517. case NR_SNR_AFTER_SCALER:
  1518. //SNR2
  1519. PQ_RegisterWrite(VIP_reg_slr_s_snr_bypass, (pHwContext->nNRLevel==OFF) ? 1 : pNR_SLR_SNR2->SNR_MapByPass);
  1520. //LUMA
  1521. PQ_RegisterWrite(VIP_reg_slr_s_snr_sel, pNR_SLR_SNR2->SNR_Luma.SNR_Sel.Degree[ucLevel]);
  1522. PQ_RegisterWrite(VIP_reg_slr_s_snr_chk_middle_pxl, pNR_SLR_SNR2->SNR_Luma.SNR_Chk_Middle_Pxl.Degree[ucLevel]);
  1523. PQ_RegisterWrite(VIP_reg_slr_s_snr_th1, pNR_SLR_SNR2->SNR_Luma.SNR_th.Degree[ucLevel]);
  1524. PQ_RegisterWrite(VIP_reg_slr_s_snr_gain1, pNR_SLR_SNR2->SNR_Luma.SNR_Gain[0].Degree[ucLevel]);
  1525. PQ_RegisterWrite(VIP_reg_slr_s_snr_gain2, pNR_SLR_SNR2->SNR_Luma.SNR_Gain[1].Degree[ucLevel]);
  1526. PQ_RegisterWrite(VIP_reg_slr_s_snr_slope, pNR_SLR_SNR2->SNR_Luma.SNR_Slope.Degree[ucLevel]);
  1527. //CHROMA
  1528. PQ_RegisterWrite(VIP_reg_slr_s_snr_sel_c, pNR_SLR_SNR2->SNR_Chroma.SNR_Sel.Degree[ucLevel]);
  1529. PQ_RegisterWrite(VIP_reg_slr_s_snr_chk_middle_pxl_c, pNR_SLR_SNR2->SNR_Chroma.SNR_Chk_Middle_Pxl.Degree[ucLevel]);
  1530. PQ_RegisterWrite(VIP_reg_slr_s_snr_th1_c, pNR_SLR_SNR2->SNR_Chroma.SNR_th.Degree[ucLevel]);
  1531. PQ_RegisterWrite(VIP_reg_slr_s_snr_gain1_c, pNR_SLR_SNR2->SNR_Chroma.SNR_Gain[0].Degree[ucLevel]);
  1532. PQ_RegisterWrite(VIP_reg_slr_s_snr_gain2_c, pNR_SLR_SNR2->SNR_Chroma.SNR_Gain[1].Degree[ucLevel]);
  1533. PQ_RegisterWrite(VIP_reg_slr_s_snr_slope_c, pNR_SLR_SNR2->SNR_Chroma.SNR_Slope.Degree[ucLevel]);
  1534. break;
  1535. case NR_SNR_CASE1:
  1536. PQ_RegisterWrite(VIP_reg_slr_snr_sel_c, 3); //db3c
  1537. PQ_RegisterWrite(VIP_reg_slr_snr_chk_middle_pxl_c, 1);//db3d
  1538. PQ_RegisterWrite(VIP_reg_slr_snr_th1_c, 154); //db40
  1539. PQ_RegisterWrite(VIP_reg_slr_snr_gain1_c, 255); //db41
  1540. PQ_RegisterWrite(VIP_reg_slr_snr_gain2_c, 1); //db42
  1541. PQ_RegisterWrite(VIP_reg_slr_snr_slope_c, 451); // db44
  1542. break;
  1543. }
  1544. }
  1545. UINT32 PQ_ChromaBinPercentage(UINT8 ucBin)
  1546. {
  1547. UINT32 dwChromaHistTotal=1;
  1548. INT32 ulChromaHistBin[14];
  1549. UINT8 i=0;
  1550. UINT32 cbin=0;
  1551. for ( i=0 ; i<14 ; i++ )
  1552. {
  1553. dwChromaHistTotal += PQ_RegisterRead(VIP_reg_dpy_chroma_bin0+4*i);
  1554. ulChromaHistBin[i]= PQ_RegisterRead(VIP_reg_dpy_chroma_bin0+4*i);
  1555. }
  1556. if(dwChromaHistTotal == 0)
  1557. {
  1558. dwChromaHistTotal = 1;
  1559. }
  1560. if (VIP_IsATVSource() || VIP_IsAVSource())
  1561. cbin = ((ulChromaHistBin[ucBin]+1) * 999) / dwChromaHistTotal;
  1562. else
  1563. cbin = (ulChromaHistBin[ucBin] * 1000) / dwChromaHistTotal;
  1564. return (cbin);
  1565. }
  1566. UINT8 PQ_IsColorBar(void)
  1567. {
  1568. PQHW_CONTEXT* pHwContext= &PQHwContext;
  1569. return pHwContext->bIsColorBar;
  1570. }
  1571. UINT8 PQ_IsDigitalScanADC2(void)
  1572. {
  1573. PQHW_CONTEXT* pHwContext= &PQHwContext;
  1574. return pHwContext->bIsPattern_DIG_ADC2;
  1575. }
  1576. /**
  1577. * @brief For detect specific pattern : FLUKE 54200, PAT#DIGITAL SCAN(DIG_ADC2)
  1578. *
  1579. * This function detec tthe Chroma bin distribution for check specific pattern
  1580. *
  1581. * @param n/a
  1582. * @return 1 : is DIGITAL SCAN(DIG_ADC2), 0 : not DIGITAL SCAN(DIG_ADC2)
  1583. * note : the Hue distribution only in ChromaHist[0, 4, 9, 13] and the reset chroma hist should be 0
  1584. */
  1585. void PQ_DigitalScanADC2Detect(void)
  1586. {
  1587. PQHW_CONTEXT* pHwContext= &PQHwContext;
  1588. UINT8 SpecificHueTotal = 0, SpecificHueAverage = 0, ChromaHistDiffTH = 1;
  1589. BOOL bPAL_DIG_ADC2 = FALSE, ucStaticFlag = PQ_GetMotionStatusByMethod3();
  1590. pHwContext->bIsPattern_DIG_ADC2 = FALSE;
  1591. if((VIP_GetUserSource() == SOURCE_CVD2) && ((VIP_GetStdColorSystem() >= CVD2_STD_PAL_IBGDK) && (VIP_GetStdColorSystem() <= CVD2_STD_PAL_60))&& ucStaticFlag == STATIC_FRAME)
  1592. {
  1593. SpecificHueTotal = pHwContext->ChromaHist.ulChromaHistAvg[0] + pHwContext->ChromaHist.ulChromaHistAvg[4]+ pHwContext->ChromaHist.ulChromaHistAvg[9] + pHwContext->ChromaHist.ulChromaHistAvg[13];
  1594. SpecificHueAverage = SpecificHueTotal/4;
  1595. if(pHwContext->ChromaHist.ulChromaHistAvg[0] != 0 && pHwContext->ChromaHist.ulChromaHistAvg[4] != 0 && pHwContext->ChromaHist.ulChromaHistAvg[9] != 0 && pHwContext->ChromaHist.ulChromaHistAvg[13] != 0)
  1596. {
  1597. if((*((UINT8*)(0xbe1cd688))) == 0x12) myprintk("SpecificHueTotal = %d, totoal = %d, percent = %d", SpecificHueTotal, pHwContext->ChromaHist.dwTotalChromaHistAvg, (SpecificHueTotal * 100 / pHwContext->ChromaHist.dwTotalChromaHistAvg));
  1598. if(pHwContext->ChromaHist.dwTotalChromaHistAvg != 0)
  1599. {
  1600. if((SpecificHueTotal * 100 / pHwContext->ChromaHist.dwTotalChromaHistAvg) >= 99) //only ChromaHist[0, 4, 9, 13] with value
  1601. {
  1602. bPAL_DIG_ADC2 = TRUE;
  1603. }
  1604. }
  1605. }
  1606. //avoid ChromaHist[0, 4, 9, 13] do not average distribute
  1607. if(abs(pHwContext->ChromaHist.ulChromaHistAvg[0] -SpecificHueAverage) > ChromaHistDiffTH || abs(pHwContext->ChromaHist.ulChromaHistAvg[4] -SpecificHueAverage) > ChromaHistDiffTH
  1608. || abs(pHwContext->ChromaHist.ulChromaHistAvg[9] -SpecificHueAverage) > ChromaHistDiffTH || abs(pHwContext->ChromaHist.ulChromaHistAvg[13] -SpecificHueAverage) > ChromaHistDiffTH)
  1609. {
  1610. bPAL_DIG_ADC2 = FALSE;
  1611. }
  1612. if(bPAL_DIG_ADC2)
  1613. {
  1614. pHwContext->bIsPattern_DIG_ADC2 = TRUE;
  1615. if((*((UINT8*)(0xbe1cd688))) == 0x12) myrprintk("DigitalScanADC2 = %d", pHwContext->bIsPattern_DIG_ADC2);
  1616. }
  1617. else
  1618. {
  1619. pHwContext->bIsPattern_DIG_ADC2 = FALSE;
  1620. if((*((UINT8*)(0xbe1cd688))) == 0x12) myrprintk("DigitalScanADC2 = %d", pHwContext->bIsPattern_DIG_ADC2);
  1621. }
  1622. }
  1623. }
  1624. void _ChromaHistDetect(void)
  1625. {
  1626. PQHW_CONTEXT* pHwContext = &PQHwContext;
  1627. UINT8 i = 0;
  1628. UINT32 CaptureWindowSize = 0;
  1629. memset(&pHwContext->ChromaHist, 0, sizeof(CHROMA_HISTOGRAM));
  1630. CaptureWindowSize = (PQ_RegisterRead(VIP_reg_adix_che) - PQ_RegisterRead(VIP_reg_adix_chs))*(PQ_RegisterRead(VIP_reg_adix_cve) - PQ_RegisterRead(VIP_reg_adix_cvs));
  1631. for(i = 0; i <18; i++)
  1632. {
  1633. pHwContext->ChromaHist.ulChromaHist[i] = PQ_RegisterRead(VIP_c_bin00_pre+i*4);
  1634. pHwContext->ChromaHist.dwTotalChromaHistPixel += pHwContext->ChromaHist.ulChromaHist[i];
  1635. if(CaptureWindowSize > 0)
  1636. {
  1637. pHwContext->ChromaHist.ulChromaHistAvg[i] = pHwContext->ChromaHist.ulChromaHist[i] * 100 / CaptureWindowSize;
  1638. }
  1639. pHwContext->ChromaHist.dwTotalChromaHistAvg += pHwContext->ChromaHist.ulChromaHistAvg[i];
  1640. if((*((UINT8*)(0xbe1cd688))) == 0x11) myprintk("HistAvg[%d] = %d, Hist[%d] = %d, totalAVG = %d, totalPixel = %d", i, pHwContext->ChromaHist.ulChromaHistAvg[i], i, pHwContext->ChromaHist.ulChromaHist[i], pHwContext->ChromaHist.dwTotalChromaHistAvg, pHwContext->ChromaHist.dwTotalChromaHistPixel);
  1641. }
  1642. }
  1643. /**
  1644. * @brief color bar SW detect function
  1645. *
  1646. * This function collect the hue bin distribution to check if current pattern color bar or not
  1647. *
  1648. * @param n/a
  1649. * @return 1 : color bar, 0 : not color bar
  1650. * note : secam case 1, for TG-39, Pattern Round 1 with Cross and circle mixed signal, the Hue distribution as follow
  1651. * huebin[2, 5, 8, 11, 14, 17] is almost equal and with value, the reset huebin should be 0
  1652. */
  1653. BOOL PQ_SWDTColorBar(void)
  1654. {
  1655. PQHW_CONTEXT* pHwContext= &PQHwContext;
  1656. UINT8 i=0,dis_th=0, act_th=2;
  1657. UINT8 c_bin_cnt=0, c_bin_cnt_th, SecamHueBinDiffTH = 1;
  1658. UINT8 StableCntTH, StableCntMax;
  1659. static UINT8 StableCnt = 0;
  1660. UINT8 ucNoiseStatus = 0;
  1661. BOOL ucStaticFlag = PQ_GetMotionStatusByMethod3();
  1662. UINT8 SpecificHueTotal = 0, SecamColorBarFlag = 0, SpecificHueAverage = 0;
  1663. if((*((UINT8*)(0xbe1cd688))) == 0x4)
  1664. {
  1665. pHwContext->bIsColorBar = 0;
  1666. return 0;
  1667. }
  1668. _ChromaHistDetect();
  1669. #ifdef DRV_ENABLE_CVD2
  1670. if(VIP_GetUserSource() == SOURCE_CVD2)
  1671. {
  1672. if(VIP_IsATVSource())
  1673. {
  1674. if(DRV_CVD2_GetColbarCnt() >= 0x60)
  1675. {
  1676. pHwContext->bIsColorBar = 1;
  1677. return 1;
  1678. }
  1679. }
  1680. else if(VIP_IsAVSource())
  1681. {
  1682. if(DRV_CVD2_GetColbarCnt() >= 0x90)
  1683. {
  1684. pHwContext->bIsColorBar = 1;
  1685. return 1;
  1686. }
  1687. }
  1688. }
  1689. #endif
  1690. //non-standard pattern
  1691. if(((pHwContext->ChromaHist.ulChromaHistAvg[8] > act_th) && (pHwContext->ChromaHist.ulChromaHistAvg[9] > act_th) && (pHwContext->ChromaHist.ulChromaHistAvg[10] > act_th)) || (pHwContext->ChromaHist.ulChromaHistAvg[1] > act_th))
  1692. {
  1693. pHwContext->bIsColorBar = 0;
  1694. if((*((UINT8*)(0xbe1cd688))) == 0x11) myrprintk("bIsColorBar = %d, non standard pattern", pHwContext->bIsColorBar);
  1695. return 0;
  1696. }
  1697. //secam case 1
  1698. if((VIP_GetUserSource() == SOURCE_CVD2) && (VIP_GetStdColorSystem() == CVD2_STD_SECAM) && ucStaticFlag == STATIC_FRAME)
  1699. {
  1700. SpecificHueTotal = pHwContext->ChromaHist.ulChromaHistAvg[2] + pHwContext->ChromaHist.ulChromaHistAvg[5]+ pHwContext->ChromaHist.ulChromaHistAvg[8] + pHwContext->ChromaHist.ulChromaHistAvg[11]
  1701. + pHwContext->ChromaHist.ulChromaHistAvg[14] + pHwContext->ChromaHist.ulChromaHistAvg[17];
  1702. SpecificHueAverage = SpecificHueTotal/6;
  1703. if(pHwContext->ChromaHist.ulChromaHistAvg[2] != 0 && pHwContext->ChromaHist.ulChromaHistAvg[5] != 0 && pHwContext->ChromaHist.ulChromaHistAvg[8] != 0
  1704. && pHwContext->ChromaHist.ulChromaHistAvg[11] != 0 && pHwContext->ChromaHist.ulChromaHistAvg[14] != 0 && pHwContext->ChromaHist.ulChromaHistAvg[17] != 0)
  1705. {
  1706. if(pHwContext->ChromaHist.dwTotalChromaHistPixel > 0)
  1707. {
  1708. if((SpecificHueTotal * 100 / pHwContext->ChromaHist.dwTotalChromaHistAvg) >= 99) //only huebin[2, 5, 8, 11, 14, 17] with value
  1709. {
  1710. SecamColorBarFlag = 1;
  1711. }
  1712. }
  1713. }
  1714. //avoid huebin[2, 5, 8, 11, 14, 17] do not average distribute
  1715. if(abs(pHwContext->ChromaHist.ulChromaHistAvg[2] -SpecificHueAverage) > SecamHueBinDiffTH || abs(pHwContext->ChromaHist.ulChromaHistAvg[5] -SpecificHueAverage) > SecamHueBinDiffTH || abs(pHwContext->ChromaHist.ulChromaHistAvg[8] -SpecificHueAverage) > SecamHueBinDiffTH
  1716. || abs(pHwContext->ChromaHist.ulChromaHistAvg[11] -SpecificHueAverage) > SecamHueBinDiffTH || abs(pHwContext->ChromaHist.ulChromaHistAvg[14] -SpecificHueAverage) > SecamHueBinDiffTH || abs(pHwContext->ChromaHist.ulChromaHistAvg[17] -SpecificHueAverage) > SecamHueBinDiffTH)
  1717. {
  1718. SecamColorBarFlag = 0;
  1719. }
  1720. if(SecamColorBarFlag)
  1721. {
  1722. pHwContext->bIsColorBar = 1;
  1723. if((*((UINT8*)(0xbe1cd688))) == 0x11) myrprintk("bIsColorBar = %d", pHwContext->bIsColorBar);
  1724. return 1;
  1725. }
  1726. }
  1727. c_bin_cnt=0;
  1728. if (VIP_IsAVSource() || (VIP_IsATVSource() && (VIP_GetStdColorSystem() > CVD2_STD_NTSC_443) && (VIP_GetStdColorSystem() < CVD2_STD_SECAM))) act_th=3; // #48695
  1729. for(i=0;i<18;i++)
  1730. {
  1731. if ((i==0)&&((pHwContext->ChromaHist.ulChromaHistAvg[0]>act_th)&&
  1732. (((pHwContext->ChromaHist.ulChromaHistAvg[17]<=dis_th)&&((pHwContext->ChromaHist.ulChromaHistAvg[1]<=dis_th)||(pHwContext->ChromaHist.ulChromaHistAvg[2]<=dis_th)))||
  1733. ((pHwContext->ChromaHist.ulChromaHistAvg[1]<=dis_th)&&((pHwContext->ChromaHist.ulChromaHistAvg[17]<=dis_th)||(pHwContext->ChromaHist.ulChromaHistAvg[16]<=dis_th))))))
  1734. c_bin_cnt = c_bin_cnt + 1;
  1735. else if ((i==1)&&((pHwContext->ChromaHist.ulChromaHistAvg[1]>act_th)&&
  1736. (((pHwContext->ChromaHist.ulChromaHistAvg[0]<=dis_th)&&((pHwContext->ChromaHist.ulChromaHistAvg[2]<=dis_th)||(pHwContext->ChromaHist.ulChromaHistAvg[3]<=dis_th)))||
  1737. ((pHwContext->ChromaHist.ulChromaHistAvg[2]<=dis_th)&&((pHwContext->ChromaHist.ulChromaHistAvg[0]<=dis_th)||(pHwContext->ChromaHist.ulChromaHistAvg[17]<=dis_th))))))
  1738. c_bin_cnt = c_bin_cnt + 1;
  1739. else if ((i==2)&&((pHwContext->ChromaHist.ulChromaHistAvg[2]>act_th)&&
  1740. (((pHwContext->ChromaHist.ulChromaHistAvg[1]<=dis_th)&&((pHwContext->ChromaHist.ulChromaHistAvg[3]<=dis_th)||(pHwContext->ChromaHist.ulChromaHistAvg[4]<=dis_th)))||
  1741. ((pHwContext->ChromaHist.ulChromaHistAvg[3]<=dis_th)&&((pHwContext->ChromaHist.ulChromaHistAvg[1]<=dis_th)||(pHwContext->ChromaHist.ulChromaHistAvg[0]<=dis_th))))))
  1742. c_bin_cnt = c_bin_cnt + 1;
  1743. else if ((i>2)&&(pHwContext->ChromaHist.ulChromaHistAvg[i]>act_th)&&
  1744. (((pHwContext->ChromaHist.ulChromaHistAvg[(i-1)%18]<=dis_th)&&((pHwContext->ChromaHist.ulChromaHistAvg[(i+1)%18]<=dis_th)||(pHwContext->ChromaHist.ulChromaHistAvg[(i+2)%18]<=dis_th)))||
  1745. ((pHwContext->ChromaHist.ulChromaHistAvg[(i+1)%18]<=dis_th)&&((pHwContext->ChromaHist.ulChromaHistAvg[(i-1)%18]<=dis_th)||(pHwContext->ChromaHist.ulChromaHistAvg[(i-2)%18]<=dis_th)))))
  1746. c_bin_cnt = c_bin_cnt + 1;
  1747. }
  1748. if((VIP_GetInputDataFormat() == 0 && VIP_GetRGB2YCbCrRange() == 0) || (VIP_GetUserSource() == SOURCE_HDMI))
  1749. {
  1750. c_bin_cnt_th = 5;
  1751. }
  1752. else if(VIP_IsATVSource())
  1753. {
  1754. if(VIP_GetStdColorSystem() == CVD2_STD_SECAM)
  1755. {
  1756. c_bin_cnt_th = 4;
  1757. }
  1758. else if((VIP_GetStdColorSystem() >= CVD2_STD_PAL_IBGDK) && (VIP_GetStdColorSystem() <= CVD2_STD_PAL_60))
  1759. {
  1760. c_bin_cnt_th = 6;
  1761. }
  1762. else
  1763. {
  1764. c_bin_cnt_th = 5;
  1765. }
  1766. }
  1767. else if(VIP_IsAVSource())
  1768. {
  1769. if(VIP_GetStdColorSystem() == CVD2_STD_SECAM)
  1770. {
  1771. c_bin_cnt_th = 4;
  1772. }
  1773. else if(VIP_GetStdColorSystem() == CVD2_STD_PAL_M)
  1774. {
  1775. c_bin_cnt_th = 5;
  1776. }
  1777. else
  1778. {
  1779. c_bin_cnt_th = 6;
  1780. }
  1781. }
  1782. else
  1783. {
  1784. c_bin_cnt_th = 6;
  1785. }
  1786. #ifdef DRV_ENABLE_CVD2
  1787. CVD2_GetNoiseStatus(&ucNoiseStatus);
  1788. #endif
  1789. if(ucTempM <= 2)
  1790. {
  1791. StableCntMax = 5;
  1792. StableCntTH = 2;
  1793. }
  1794. else if(ucTempM > 2 && ucTempM <= 8)
  1795. {
  1796. StableCntMax = 30;
  1797. StableCntTH = 10;
  1798. }
  1799. else if(ucTempM > 8 && ucTempM <= 18)
  1800. {
  1801. StableCntMax = 40;
  1802. StableCntTH = 10;
  1803. }
  1804. else if(ucTempM > 18 && ucTempM <= 22)
  1805. {
  1806. StableCntMax = 60;
  1807. StableCntTH = 20;
  1808. }
  1809. else if(ucTempM > 22 && ucTempM <= 25)
  1810. {
  1811. StableCntMax = 60;
  1812. StableCntTH = 25;
  1813. }
  1814. else
  1815. {
  1816. StableCntMax = 1;
  1817. StableCntTH = 10;
  1818. }
  1819. if ((c_bin_cnt >= c_bin_cnt_th))
  1820. {
  1821. if(StableCnt < StableCntMax)
  1822. {
  1823. StableCnt++;
  1824. }
  1825. }
  1826. else
  1827. {
  1828. if(StableCnt > 0)
  1829. {
  1830. StableCnt--;
  1831. }
  1832. }
  1833. if(StableCnt > StableCntTH)
  1834. {
  1835. pHwContext->bIsColorBar = 1;
  1836. if((*((UINT8*)(0xbe1cd688))) == 0x11) myprintk("bIsColorBar : %d, 23e = %d, ucTempM = %d, chromacount = %d, cnt > TH : %d > %d, sat_all = %d", pHwContext->bIsColorBar, ucNoiseStatus, ucTempM, c_bin_cnt, StableCnt, StableCntTH, PQ_RegisterRead(VIP_deg_dpy_sat_all));
  1837. return 1;
  1838. }
  1839. else
  1840. {
  1841. pHwContext->bIsColorBar = 0;
  1842. if((*((UINT8*)(0xbe1cd688))) == 0x11) myprintk("bIsColorBar : %d, 23e = %d, ucTempM = %d, chromacount = %d, cnt < TH : %d < %d, sat_all = %d", pHwContext->bIsColorBar, ucNoiseStatus, ucTempM, c_bin_cnt, StableCnt, StableCntTH, PQ_RegisterRead(VIP_deg_dpy_sat_all));
  1843. return 0;
  1844. }
  1845. }
  1846. void PQ_EnColorBarDetectWorkQue_ISR(void)
  1847. {
  1848. queue_work(WQ_Struct_ColorBarDetect,&WQ_ColorBarDetect);
  1849. }
  1850. void PQ_SetColorBarFnFlag(UINT8 ucenable)
  1851. {
  1852. utempCheckColorbarDTFunctionEN = ucenable;
  1853. }
  1854. void PQ_PCColorBar_SharpnessPatch(void)
  1855. {
  1856. UINT8 pccolor;
  1857. pccolor = PQ_IsColorBar();
  1858. if (pccolor != 0 && utempCheckColorbarDTFunctionEN == 0)
  1859. {
  1860. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_pre, 0x03);
  1861. PQ_RegisterWrite(VIP_reg_slr_dcti_c1_pre, 0xd0);
  1862. PQ_RegisterWrite(VIP_reg_slr_dcti_c2_pre, 0xe6f);
  1863. PQ_RegisterWrite(VIP_reg_slr_dcti_c3_pre, 0xf84);
  1864. PQ_RegisterWrite(VIP_reg_slr_pre_icp_en_post, 0x0);
  1865. PQ_RegisterWrite(VIP_reg_slr_dcti_c1_post, 0x173); //49315,48665
  1866. PQ_RegisterWrite(VIP_reg_slr_dcti_c2_post, 0x53);
  1867. PQ_RegisterWrite(VIP_reg_slr_dcti_c3_post, 0xf5b);
  1868. PQ_RegisterWrite(VIP_reg_slr_dcti_c4_post, 0xf0a);
  1869. PQ_RegisterWrite(VIP_reg_slr_dcti_c5_post, 0xf43);
  1870. PQ_RegisterWrite(VIP_reg_slr_dcti_c6_post, 0xf98);
  1871. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_0_post, 0x10);
  1872. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_post, 0x3);
  1873. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_post, 0x5);
  1874. if (VIP_GetInputVSize() <= 450) //#49219
  1875. {
  1876. PQ_RegisterWrite(VIP_reg_slr_2d_l_sel, 0x2);
  1877. }
  1878. else
  1879. {
  1880. PQ_Sharpness_POST_2D(TRUE, utempSharpnesscValue);
  1881. }
  1882. PQ_SetColorBarFnFlag(ENABLE);
  1883. }
  1884. else if (pccolor == 0 && utempCheckColorbarDTFunctionEN == 1)
  1885. {
  1886. PQ_SetColorBarFnFlag(DISABLE);
  1887. PQ_Sharpness_PREDCTI(TRUE, utempSharpnesscValue);
  1888. PQ_Sharpness_POSTDCTI(TRUE,utempSharpnesscValue);
  1889. PQ_Sharpness_POST_2D(TRUE, utempSharpnesscValue);
  1890. }
  1891. }
  1892. UINT32 PQ_PureColorPatternDetect(INT8 ucHBin) //eric
  1893. {
  1894. PQHW_CONTEXT* pHwContext= &PQHwContext;
  1895. int scond1 = 0;
  1896. static int scounter = 0;
  1897. UINT32 ulTotalHueBin=0;
  1898. UINT32 ulGrayBin;
  1899. UINT8 i=0, j=0;
  1900. UINT8 bCVD2_NTSC_to_PAL_Patch = FALSE;
  1901. UINT32 ulHsize=0, ulVsize=0;
  1902. UINT32 dwTotalPixel =0, dwChromaHistTotal = 0;
  1903. BOOL ulChromaBin0 = 0, ulChromaBin1 = 0;
  1904. ulGrayBin=PQ_RegisterRead(VIP_c_gray_bin_pre);
  1905. ulTotalHueBin = pHwContext->ChromaHist.dwTotalChromaHistPixel;
  1906. if(ulTotalHueBin==0) ulTotalHueBin=1;
  1907. //==Total Pixel=========
  1908. ulHsize = PQ_RegisterRead(VIP_reg_slr_out_width);
  1909. ulVsize = PQ_Get_VDI_VSize();
  1910. dwTotalPixel = ulHsize*ulVsize ;
  1911. if(dwTotalPixel==0) return 0;
  1912. //==Chroma================== #52938
  1913. for ( i=0 ; i<14 ; i++ )
  1914. {
  1915. dwChromaHistTotal += PQ_RegisterRead(VIP_reg_dpy_chroma_bin0+4*i);
  1916. }
  1917. ulChromaBin0 = ( (((PQ_RegisterRead(VIP_reg_dpy_chroma_bin0)) *100) / (dwChromaHistTotal+1))> 91 )? 1:0;
  1918. ulChromaBin1 = ( (((PQ_RegisterRead(VIP_reg_dpy_chroma_bin1)) *100) / (dwChromaHistTotal+1))< 8 )? 1:0;
  1919. j = ucHBin;
  1920. //==Gray Pattern========
  1921. if((*((UINT8*)(0xbe1cd688))) == 0x25) myrprintk("ulGrayBin = %d, ulTotalHueBin = %d, j = %d", ulGrayBin, dwTotalPixel, j);
  1922. if((j == 21) && ( ((ulGrayBin*100)/dwTotalPixel) >= 99 ) && ulChromaBin0 && ulChromaBin1)
  1923. {
  1924. return 2;
  1925. }
  1926. else if ( j == 21 ) return 0;
  1927. if(ulGrayBin > ulTotalHueBin)
  1928. {
  1929. pHwContext->bIsPureColorPattern = FALSE;
  1930. return 0;
  1931. }
  1932. j = ucHBin;
  1933. if ( j == 20 )
  1934. {
  1935. for(i=0;i<18;i++)
  1936. {
  1937. if ( (pHwContext->ChromaHist.ulChromaHist[i] * 100 / ulTotalHueBin) > 98 ) //eric
  1938. {
  1939. scond1=1;
  1940. break;
  1941. }
  1942. }
  1943. }
  1944. if(scond1 == 1)
  1945. {
  1946. if(scounter < 3)
  1947. {
  1948. scounter++;
  1949. }
  1950. }
  1951. else
  1952. {
  1953. if(scounter > 0)
  1954. {
  1955. scounter--;
  1956. }
  1957. }
  1958. if(scounter > 0 && scond1 != 1) // 3 buffer for 99% pure color pattern
  1959. {
  1960. scond1=1;
  1961. }
  1962. if(VIP_GetUserSource() == SOURCE_CVD2 && VIP_GetStdColorSystem() == CVD2_STD_PAL_IBGDK)
  1963. {
  1964. if ((pHwContext->ulHistCaseCur == 23 || pHwContext->ulHistCaseCur == 31) && (( (pHwContext->ChromaHist.ulChromaHist[17] * 100 / ulTotalHueBin) >= 98) || ((pHwContext->ChromaHist.ulChromaHist[17]+ pHwContext->ChromaHist.ulChromaHist[6])* 100 / ulTotalHueBin >= 98)))
  1965. {
  1966. bCVD2_NTSC_to_PAL_Patch = 1;
  1967. }
  1968. if((pHwContext->ulHistCaseCur == 5 || pHwContext->ulHistCaseCur == 4) && ((pHwContext->ChromaHist.ulChromaHist[16]+ pHwContext->ChromaHist.ulChromaHist[17])* 100 / ulTotalHueBin) >= 99) //#51954
  1969. {
  1970. bCVD2_NTSC_to_PAL_Patch = 1;
  1971. }
  1972. }
  1973. pHwContext->bCVD2_NTSC_to_PAL_Patch = bCVD2_NTSC_to_PAL_Patch;
  1974. if ( scond1==1 )
  1975. {
  1976. pHwContext->bIsPureColorPattern = TRUE;
  1977. return 1;
  1978. }
  1979. else
  1980. {
  1981. pHwContext->bIsPureColorPattern = FALSE;
  1982. return 0;
  1983. }
  1984. }
  1985. BOOL PQ_GetPureColorPattern(void)
  1986. {
  1987. PQHW_CONTEXT* pHwContext= &PQHwContext;
  1988. return pHwContext->bIsPureColorPattern;
  1989. }
  1990. void PQ_ColorBarDetect(void) //sharlene
  1991. {
  1992. UINT8 ucSD, cnt_th=5, colorbar;
  1993. UINT32 vdi_vsize;
  1994. UINT8 ucUserSource;
  1995. UINT8 ucSubSource;
  1996. static UINT8 stable_cnt = 0;
  1997. UINT8 TNRZ_C_patch_flag = FALSE;
  1998. #ifdef CONFIG_SUPPORT_SATURATION_PROTECT
  1999. UINT8 satprot=0;
  2000. UINT32 sat_under;
  2001. static UINT8 sat_flag = 0;
  2002. #endif
  2003. BOOL ucCVD2_NSTD_Flag=PQ_CheckCvd2NonSTDStatus();
  2004. // if(VIP_IsSourceDTV()|| VIP_RunDVIMode() || VIP_IsPCSource()|| VIP_GetVDIPause())
  2005. if(VIP_IsSourceDTV()|| VIP_RunDVIMode() || VIP_GetVDIPause())
  2006. {
  2007. return ;
  2008. }
  2009. else if (VIP_IsPCSource())
  2010. {
  2011. PQ_PCColorBar_SharpnessPatch();
  2012. return;
  2013. }
  2014. if((*((UINT8*)(0xbe1cd688))) == 0x5) return;
  2015. if(PQ_GetColorProcessor() == FALSE)
  2016. {
  2017. PQ_SetColorBarFnFlag(DISABLE);
  2018. PQ_Sharpness_PREDCTI(TRUE, utempSharpnesscValue);
  2019. PQ_Sharpness_POSTDCTI(TRUE,utempSharpnesscValue);
  2020. PQ_Sharpness_POST_2D(TRUE, utempSharpnesscValue);
  2021. PQ_Sharpness_Peaking_DLTI(TRUE, utempSharpnesscValue);
  2022. PQ_RegisterWrite(VIP_reg_slr_icp_alpha, 0x200);
  2023. return;
  2024. }
  2025. vdi_vsize= PQ_Get_VDI_VSize();
  2026. // #47928
  2027. if(VIP_GetInterlaceMode())
  2028. ucSD = (vdi_vsize<=288)?1:0;
  2029. else if(VIP_GetInputHSize()<=800)
  2030. ucSD = (vdi_vsize<=576)?1:0;
  2031. else ucSD = 0;
  2032. VIP_GetSource(&ucUserSource, &ucSubSource);
  2033. colorbar = PQ_IsColorBar();
  2034. if(colorbar==0 && stable_cnt != 0)
  2035. {
  2036. stable_cnt = stable_cnt - 1;
  2037. }
  2038. else if(colorbar!=0 && stable_cnt != cnt_th)
  2039. {
  2040. stable_cnt = stable_cnt + 1;
  2041. }
  2042. #ifdef CONFIG_SUPPORT_SATURATION_PROTECT
  2043. if( VIP_IsATVSource() || (VIP_IsAVSource() && VIP_GetStdColorSystem() == CVD2_STD_PAL_IBGDK) )
  2044. {
  2045. satprot = PQ_GetPureColorPattern(); // check pure color noise issue #51828 & #51962 & #51940
  2046. if (satprot==1 && sat_flag==0)
  2047. {
  2048. PQ_RegisterWrite(VIP_reg_dpy_mtx_sat_limit_fac0,(((PQ_RegisterRead(VIP_reg_dpy_mtx_sat_limit_fac0))&0xffff00ff)|(0xfc<<8)));
  2049. sat_flag = 1;
  2050. }
  2051. else if (satprot==0 && sat_flag==1)
  2052. {
  2053. PQ_RegisterWrite(VIP_reg_dpy_mtx_sat_limit_fac0,(((PQ_RegisterRead(VIP_reg_dpy_mtx_sat_limit_fac0))&0xffff00ff)|(0xd8<<8)));
  2054. sat_flag = 0;
  2055. }
  2056. else if (satprot==1 && sat_flag==1)
  2057. {
  2058. sat_under = PQ_RegisterRead(VIP_reg_dpy_mtx_sat_limit_fac0);
  2059. sat_under = sat_under & 0x0000ff00;
  2060. if (sat_under == 0xd8) sat_flag = 0;
  2061. }
  2062. }
  2063. #endif
  2064. if (colorbar==0 && utempCheckColorbarDTFunctionEN == 0)
  2065. {
  2066. if((*((UINT8*)(0xbe1cd688))) == 0x1) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: Colorbar Return \n\033[0m\n ",__LINE__,__FUNCTION__);
  2067. return;
  2068. }
  2069. else if ((colorbar!=0 && utempCheckColorbarDTFunctionEN == 0 && stable_cnt == cnt_th) || ucCVD2_NSTD_Flag)
  2070. {
  2071. if((*((UINT8*)(0xbe1cd688))) == 0x1) printk(KERN_EMERG"\033[1m\033[40;35m [%s][%d]Colorbor Enable\033[0m\n ",__FUNCTION__,__LINE__);
  2072. if(ucSD) //SD
  2073. {
  2074. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_pre, 2);
  2075. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_pre, 2);
  2076. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_pre,0);
  2077. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_post, 0x2);
  2078. if(ucUserSource == SOURCE_CVD2){
  2079. if(VIP_IsATVSource())
  2080. {
  2081. if(VIP_GetStdColorSystem() > CVD2_STD_NTSC_443 && VIP_GetStdColorSystem() < CVD2_STD_SECAM)
  2082. {
  2083. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_post, 0x5);
  2084. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_post,0x3);
  2085. }
  2086. else if(VIP_GetStdColorSystem() == CVD2_STD_SECAM) //for ATV SECAM yellow_cyan noise : #51678
  2087. {
  2088. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_post, 0x5);
  2089. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_post,0x0);
  2090. PQ_RegisterWrite(VIP_reg_slr_dcti_c1_post, 0x13f);
  2091. PQ_RegisterWrite(VIP_reg_slr_dcti_c2_post, 0xf75);
  2092. PQ_RegisterWrite(VIP_reg_slr_dcti_c3_post, 0xeb4);
  2093. PQ_RegisterWrite(VIP_reg_slr_dcti_c4_post, 0xf44);
  2094. PQ_RegisterWrite(VIP_reg_slr_dcti_c5_post, 0x4);
  2095. PQ_RegisterWrite(VIP_reg_slr_dcti_c6_post, 0xf33);
  2096. }
  2097. else
  2098. {
  2099. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_post, 0x2);
  2100. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_post,0x0);
  2101. }
  2102. }
  2103. else
  2104. {
  2105. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_post, 0x5);
  2106. if(VIP_GetStdColorSystem() == CVD2_STD_PAL_M || VIP_GetStdColorSystem() == CVD2_STD_PAL_CN)
  2107. {
  2108. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_post,0x3);
  2109. }
  2110. else
  2111. {
  2112. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_post,0x5);
  2113. }
  2114. }
  2115. if(ucCVD2_NSTD_Flag)
  2116. {
  2117. if(VIP_GetStdColorSystem() < CVD2_STD_SECAM)
  2118. {
  2119. PQ_RegisterWrite(VIP_reg_slr_icp_alpha, 0);
  2120. stable_cnt = 0;
  2121. }
  2122. }
  2123. else
  2124. {
  2125. if(VIP_GetStdColorSystem() != CVD2_STD_NTSC_443)
  2126. {
  2127. if (VIP_GetStdColorSystem() == CVD2_STD_SECAM)
  2128. {
  2129. PQ_RegisterWrite(VIP_reg_slr_icp_alpha, 0); //#33736
  2130. }
  2131. else
  2132. {
  2133. PQ_RegisterWrite(VIP_reg_slr_icp_alpha, 0x80);
  2134. }
  2135. }
  2136. else
  2137. {
  2138. PQ_RegisterWrite(VIP_reg_slr_icp_alpha, 0x200);
  2139. }
  2140. }
  2141. if( ucSubSource==S1_INPUT_CHANNEL || ucSubSource==S2_INPUT_CHANNEL || ucSubSource==S3_INPUT_CHANNEL ){ //#40329
  2142. PQ_RegisterWrite(VIP_reg_slr_dcti_c1_post, 0x173);
  2143. PQ_RegisterWrite(VIP_reg_slr_dcti_c2_post, 0x53);
  2144. PQ_RegisterWrite(VIP_reg_slr_dcti_c3_post, 0xf5b);
  2145. PQ_RegisterWrite(VIP_reg_slr_dcti_c4_post, 0xf0a);
  2146. PQ_RegisterWrite(VIP_reg_slr_dcti_c5_post, 0xf43);
  2147. PQ_RegisterWrite(VIP_reg_slr_dcti_c6_post, 0xf98);
  2148. PQ_RegisterWrite(VIP_reg_slr_dlti_scale_post, 0x0);
  2149. PQ_RegisterWrite(VIP_reg_slr_2d_l_scale, 0x2); }
  2150. if( VIP_GetStdColorSystem() == CVD2_STD_NTSC_M )
  2151. {
  2152. TNRZ_C_patch_flag = TRUE;
  2153. }
  2154. //for AV & ATV colorbar noise
  2155. PQ_RegisterWrite(VIP_reg_dpy_mtx_sat_limit_fac0,(((PQ_RegisterRead(VIP_reg_dpy_mtx_sat_limit_fac0))&0xffff00ff)|(0xfc<<8)));
  2156. //for ATV NTSC noise : #48347
  2157. if( VIP_IsATVSource() && VIP_GetStdColorSystem() == CVD2_STD_NTSC_M )
  2158. {
  2159. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VAR_SEL_S, 0x8);
  2160. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_FIL_GAIN_S, 0x6);
  2161. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_TNR_GAIN_S, 0x6);
  2162. }
  2163. //for ATV PAL/SECAM yellow_cyan noise : #51823 & #51678
  2164. if( VIP_IsATVSource() && ((VIP_GetStdColorSystem() == CVD2_STD_PAL_IBGDK) || (VIP_GetStdColorSystem() == CVD2_STD_SECAM)) )
  2165. {
  2166. if( VIP_GetStdColorSystem() == CVD2_STD_PAL_IBGDK)
  2167. {
  2168. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_alpha_div0, 0x1);
  2169. }
  2170. else
  2171. {
  2172. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_alpha_div1, 0x1);
  2173. }
  2174. }
  2175. }
  2176. else if (ucUserSource == SOURCE_HDMI)
  2177. {
  2178. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_post, 0x3);
  2179. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_post, 0x5);
  2180. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_post, 0x3);
  2181. PQ_RegisterWrite(VIP_REG_SLR_2D_SEL_SP, 0x0); //49268
  2182. // #49399
  2183. PQ_RegisterWrite(VIP_reg_slr_dcti_c1_post, 0x173);
  2184. PQ_RegisterWrite(VIP_reg_slr_dcti_c2_post, 0x53);
  2185. PQ_RegisterWrite(VIP_reg_slr_dcti_c3_post, 0xf5b);
  2186. PQ_RegisterWrite(VIP_reg_slr_dcti_c4_post, 0xf0a);
  2187. PQ_RegisterWrite(VIP_reg_slr_dcti_c5_post, 0xf43);
  2188. PQ_RegisterWrite(VIP_reg_slr_dcti_c6_post, 0xf98);
  2189. } //#42800
  2190. else
  2191. {
  2192. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_pre, 1); //#40391
  2193. if (!VIP_IsPCSource() && VIP_GetUserSource() == SOURCE_EXTS)
  2194. {
  2195. PQ_RegisterWrite(VIP_reg_slr_dcti_c1_pre, 0x043); //#42567
  2196. PQ_RegisterWrite(VIP_reg_slr_dcti_c2_pre, 0xe86);
  2197. PQ_RegisterWrite(VIP_reg_slr_dcti_c3_pre, 0xfa8);
  2198. }
  2199. else
  2200. {
  2201. PQ_RegisterWrite(VIP_reg_slr_dcti_c1_pre, 0x1c0);
  2202. PQ_RegisterWrite(VIP_reg_slr_dcti_c2_pre, 0xfdc);
  2203. PQ_RegisterWrite(VIP_reg_slr_dcti_c3_pre, 0xf19);
  2204. }
  2205. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_post, 0x3);
  2206. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_post, 0x5);
  2207. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_post, 0x5);
  2208. }
  2209. if (VIP_IsATVSource() && (VIP_GetStdColorSystem() > CVD2_STD_NTSC_443 && VIP_GetStdColorSystem() <= CVD2_STD_SECAM))
  2210. {
  2211. PQ_RegisterWrite(VIP_reg_slr_2d_c_scale, 1);
  2212. if(VIP_GetStdColorSystem() == CVD2_STD_SECAM)
  2213. PQ_RegisterWrite(VIP_reg_slr_2d_c_scale, 0);
  2214. }
  2215. else
  2216. {
  2217. PQ_RegisterWrite(VIP_reg_slr_2d_c_scale, 0x3);
  2218. }
  2219. }
  2220. else //HD
  2221. {
  2222. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_pre, 0x3);
  2223. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_pre, 0x3);
  2224. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_pre,0x0);
  2225. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_post, 0x3);
  2226. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_post,0x5);
  2227. if (ucUserSource == SOURCE_HDMI || ucUserSource == SOURCE_EXTS)
  2228. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_post,0x2);
  2229. else
  2230. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_post,0x0);
  2231. if (ucUserSource == SOURCE_HDMI)
  2232. PQ_RegisterWrite(VIP_REG_SLR_2D_SEL_SP, 0x0); //49268
  2233. // #47928
  2234. PQ_RegisterWrite(VIP_reg_slr_dcti_c1_post, 0x173);
  2235. PQ_RegisterWrite(VIP_reg_slr_dcti_c2_post, 0x53);
  2236. PQ_RegisterWrite(VIP_reg_slr_dcti_c3_post, 0xf5b);
  2237. PQ_RegisterWrite(VIP_reg_slr_dcti_c4_post, 0xf0a);
  2238. PQ_RegisterWrite(VIP_reg_slr_dcti_c5_post, 0xf43);
  2239. PQ_RegisterWrite(VIP_reg_slr_dcti_c6_post, 0xf98);
  2240. }
  2241. PQ_RegisterWrite(VIP_reg_slr_pre_icp_en_pre, 0x1);
  2242. PQ_RegisterWrite(VIP_reg_slr_pre_icp_alpha_pre, 0x3);
  2243. //PQ_RegisterWrite(VIP_reg_slr_post_icp_en_pre, 0x1); //#34032
  2244. PQ_RegisterWrite(VIP_reg_slr_pre_icp_en_post, 0x1);
  2245. PQ_RegisterWrite(VIP_reg_slr_pre_icp_alpha_post,0x3);
  2246. PQ_RegisterWrite(VIP_reg_slr_post_icp_en_post, 0x1);
  2247. if(ucUserSource == SOURCE_CVD2)
  2248. {
  2249. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_0_post, 0x7f);
  2250. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_1_post, 0x7f);
  2251. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_2_post, 0x7f);
  2252. }
  2253. else
  2254. {
  2255. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_0_post, 0xff);
  2256. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_1_post, 0xff);
  2257. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_2_post, 0xff);
  2258. }
  2259. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_th0_post,0x0);
  2260. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_th1_post,0x0);
  2261. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_slope0_post,0x0);
  2262. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_slope1_post,0x0);
  2263. PQ_RegisterWrite(VIP_reg_slr_2d_c_sel, 0x1);
  2264. PQ_SetColorBarFnFlag(ENABLE);
  2265. //pre-DLTI
  2266. if(VIP_IsATVSource() && (VIP_GetStdColorSystem() >= CVD2_STD_NTSC_M && VIP_GetStdColorSystem() < CVD2_STD_SECAM))
  2267. {
  2268. PQ_RegisterWrite(VIP_reg_slr_dlti_en_pre, 1);
  2269. PQ_RegisterWrite(VIP_reg_slr_dlti_scale_pre, 2);
  2270. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_tap_pre, 2);
  2271. PQ_RegisterWrite(VIP_reg_slr_dlti_shoot_tap_pre, 0);
  2272. PQ_RegisterWrite(VIP_reg_slr_dlti_c1_pre, 0xfa3);
  2273. PQ_RegisterWrite(VIP_reg_slr_dlti_c2_pre, 0xed1);
  2274. PQ_RegisterWrite(VIP_reg_slr_dlti_c3_pre, 0xfa3);
  2275. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_0_pre, 0x9b);
  2276. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_1_pre, 0x9b);
  2277. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_2_pre, 0);
  2278. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_th0_pre, 0);
  2279. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_th1_pre, 0x2c);
  2280. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_slope0_pre, 0);
  2281. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_slope1_pre, 0x140);
  2282. }
  2283. if(TNRZ_C_patch_flag)
  2284. {
  2285. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_8bit1, 1);
  2286. }
  2287. else
  2288. {
  2289. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_8bit1, 0);
  2290. }
  2291. }
  2292. else if(colorbar==0 && utempCheckColorbarDTFunctionEN ==1)
  2293. {
  2294. PQ_SetColorBarFnFlag(DISABLE);
  2295. PQ_Sharpness_PREDCTI(TRUE, utempSharpnesscValue);
  2296. PQ_Sharpness_POSTDCTI(TRUE,utempSharpnesscValue);
  2297. PQ_Sharpness_POST_2D(TRUE, utempSharpnesscValue);
  2298. PQ_Sharpness_PREDLTI(TRUE, utempSharpnesscValue);
  2299. PQ_Sharpness_Peaking_DLTI(TRUE, utempSharpnesscValue);
  2300. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_8bit1, 0);
  2301. PQ_RegisterWrite(VIP_reg_slr_icp_alpha, 0x200);
  2302. if(VIP_IsAVSource()||VIP_IsATVSource())
  2303. {
  2304. PQ_RegisterWrite(VIP_reg_dpy_mtx_sat_limit_fac0,(((PQ_RegisterRead(VIP_reg_dpy_mtx_sat_limit_fac0))&0xffff00ff)|(0xd8<<8)));
  2305. //for ATV PAL/SECAM yellow_cyan noise : #51823 & #51678
  2306. if( VIP_IsATVSource() && ((VIP_GetStdColorSystem() == CVD2_STD_PAL_IBGDK) || (VIP_GetStdColorSystem() == CVD2_STD_SECAM)) )
  2307. {
  2308. if( VIP_GetStdColorSystem() == CVD2_STD_PAL_IBGDK)
  2309. {
  2310. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_alpha_div0, 0x0);
  2311. }
  2312. else
  2313. {
  2314. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_alpha_div1, 0x0);
  2315. }
  2316. }
  2317. }
  2318. if((*((UINT8*)(0xbe1cd688))) == 0x1) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: ColorBarDisable \n\033[0m\n ",__LINE__,__FUNCTION__);
  2319. PQDebugPrint("\033[1m\033[40;35m [%s][%d]ColorBarDisable \033[0m\n ",__FUNCTION__,__LINE__);
  2320. }
  2321. else
  2322. {
  2323. return;
  2324. }
  2325. }
  2326. void PQ_SetFuzzyEliminate(UINT8 ucEnable)
  2327. {
  2328. if(ucEnable)
  2329. {
  2330. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_lb_1, 0xa5);
  2331. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_rb_1, 0x104);
  2332. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_min_1, 0x10);
  2333. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_max_1, 0x3ff);
  2334. PQ_RegisterWrite(VIP_reg_vdi_tnr_y_lb_1, 0x30);
  2335. PQ_RegisterWrite(VIP_reg_vdi_tnr_y_rb_1, 0xff);
  2336. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_sel, 0x0f);
  2337. PQ_RegisterWrite(VIP_reg_vdi_alpha1_tnulow_en, 1);
  2338. PQ_RegisterWrite(VIP_reg_vdi_debug_fix_val0, 0xff);
  2339. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha1_inc, 0x39);
  2340. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_min_2, 0x19);
  2341. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_max_2, 0x79);
  2342. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_inc, 0x39);
  2343. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha1_tnulow_en, 1);
  2344. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_tulow_en, 1);
  2345. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_tnulow_en, 1);
  2346. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_lb_2, 0x64);
  2347. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_rb_2, 0x96);
  2348. PQ_RegisterWrite(VIP_reg_vdi_alpha_sel, 0x03);
  2349. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha1_inc, 0x39);
  2350. }
  2351. else
  2352. {
  2353. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_lb_1, 0x12c);
  2354. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_rb_1, 0x15e);
  2355. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_min_1, 0x1900);
  2356. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_max_1, 0x19000);
  2357. PQ_RegisterWrite(VIP_reg_vdi_tnr_y_lb_1, 0);
  2358. PQ_RegisterWrite(VIP_reg_vdi_tnr_y_rb_1, 0x40);
  2359. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_sel, 0x01);
  2360. PQ_RegisterWrite(VIP_reg_vdi_alpha1_tnulow_en, 0);
  2361. PQ_RegisterWrite(VIP_reg_vdi_debug_fix_val0, 0);
  2362. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha1_inc, 0x23);
  2363. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_lb_2, 175);
  2364. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_rb_2, 270);
  2365. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_min_2, 400);
  2366. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_max_2, 0xfffff);
  2367. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_inc, 0x0A);
  2368. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha1_tnulow_en, 0);
  2369. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_tulow_en, 0);
  2370. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_tnulow_en, 0);
  2371. PQ_RegisterWrite(VIP_reg_vdi_alpha_sel, 0x01);
  2372. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha1_inc, 0x23);
  2373. }
  2374. }
  2375. void _TnrClampPatch(void)
  2376. {
  2377. PQHW_CONTEXT* pHwContext = &PQHwContext;
  2378. UINT8 ucSigmaNgGain = 0;
  2379. if(pHwContext->PqPatch.TnrClampPatch == TNR_CLAMP_DEFAULT_ATV_GRAYSCALE_PATCH)
  2380. {
  2381. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_typ3, 0x1);
  2382. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_fac1, 0x20);
  2383. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_add1, 0x01);
  2384. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_add2, 0x80);
  2385. PQ_RegisterWrite(VIP_reg_slr_y_data_type, 3);
  2386. }
  2387. else
  2388. {
  2389. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_typ3, 0x0);
  2390. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_fac1, 0x02);
  2391. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_add1, 0x00);
  2392. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_add2, 0x00);
  2393. PQ_RegisterWrite(VIP_reg_slr_y_data_type, 0);
  2394. }
  2395. if(pHwContext->PqPatch.TnrClampPatch == TNR_CLAMP_DEFAULT_AV_GRAYSCALE_PATCH)
  2396. {
  2397. ucSigmaNgGain = 1;
  2398. }
  2399. PQ_RegisterWrite(VIP_reg_slr_dither, 0);
  2400. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_NG_GAIN, ucSigmaNgGain);
  2401. }
  2402. void PQ_AdjustNr(void)
  2403. {
  2404. #ifdef ADJUST_NR_By_Yavg
  2405. PQHW_CONTEXT* pHwContext = &PQHwContext;
  2406. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  2407. UINT8 ucTableIndex;
  2408. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  2409. static UINT32 ucLastSwapNRLevel =0;
  2410. static UINT8 ucLastNRLevel = 0;
  2411. UINT32 ucSwapTNRLevel =0;
  2412. UINT32 ulHsize=0, ulVsize=0;
  2413. UINT32 dwTotalPixel =0;
  2414. UINT8 ucNRLevel = 0;
  2415. BOOL DPYGrayFlag=0;
  2416. UINT32 dwTotalWPixel;
  2417. UINT32 ulHistBin[16];
  2418. UINT32 NRGain[5] = {SDNR_Gain_normal,SDNR_Gain_Low,SDNR_Gain_Mid,SDNR_Gain_High,600};
  2419. UINT32 dwChromaHistTotal = 0;
  2420. BOOL ulChromaBin98 = 0;
  2421. UINT8 i=0;
  2422. UINT32 ucfield_diff_cnt = PQ_RegisterRead(VIP_field_diff_cnt);
  2423. UINT32 ucvdi_mot_cnt = PQ_RegisterRead(VIP_vdi_mot_cnt);
  2424. UINT32 ucvdi_vdbk_sts = PQ_RegisterRead(VIP_vdi_vdbk_sts);
  2425. #ifdef DRV_ENABLE_CVD2
  2426. UINT8 CVD2NoiseLevel, ucNoiseStatus = 0;
  2427. BOOL ucCVD2_NSTD_Flag=PQ_CheckCvd2NonSTDStatus();
  2428. BOOL ucStaticFlag = PQ_GetMotionStatusByMethod3();
  2429. BOOL AdjustTNRZCEnFlag = FALSE;
  2430. BOOL AdjustTNRZCAVSecamFlag = FALSE;
  2431. BOOL AdjustTNRZAlphaChromaFlag = FALSE;
  2432. UINT8 AdjustTNRZEn = REFERENCE_VIPTABLE;
  2433. UINT8 AdjustChromaTnrCoring = FALSE;
  2434. #endif
  2435. BOOL ucVDI_static_flag = PQ_GetMotionStatusByMethod2(), SpecialFlag=0;
  2436. UINT32 ucCTNRLevel = NRGain[4];
  2437. UINT8 ucUserSource;
  2438. UINT8 ucSubSource;
  2439. #ifdef CONFIG_SUPPORT_NR_SETTIGN_BY_TOOL
  2440. UINT8 ucLowValue_tnrLstr = 0,ucMidValue_tnrLstr = 0,ucHighValue_tnrLstr = 0;
  2441. UINT8 ucLowValue_tnrCstr = 0,ucMidValue_tnrCstr = 0,ucHighValue_tnrCstr = 0;
  2442. #endif
  2443. #ifndef CONFIG_FORCE_NR_EFFECT_ENHANCED_IN_OFF_OPTION
  2444. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  2445. #endif
  2446. UINT8 ucSNR1Case = NR_SNR_BEFORE_SCALER;
  2447. #ifdef DRV_ENABLE_CVD2
  2448. static UINT8 ucNoiseStatusStaticCount = 0;
  2449. static UINT8 ucPreNoiseStatus = 0, TNR_REST_COUNT = 0;
  2450. #endif
  2451. BOOL bTNR_C_EN_FLAG = ENABLE, bTNRZ_C_EN_FLAG = ENABLE;
  2452. UINT8 SatGainPatch = SAT_GAIN_NORMAL;
  2453. BOOL bTNRZ_EN_FLAG = ENABLE;
  2454. NR_Setting_BY_Group_Idx *pNR_Setting_BY_Group_Idx;
  2455. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  2456. if((*((UINT8*)(0xbe1cd688))) == 0x2) return;
  2457. if(PQ_GetColorProcessor() == FALSE|| VIP_GetVDIPause())
  2458. return;
  2459. VIP_GetSource(&ucUserSource, &ucSubSource);
  2460. if (pVtab->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex] >= 8) return;
  2461. ucTableIndex = pVtab->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex];
  2462. pNR_Setting_BY_Group_Idx = &pVtab->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex];
  2463. pHwContext->PqPatch.TnrClampPatch = TNR_CLAMP_DEFAULT;
  2464. //==Total Pixel=========
  2465. ulHsize = PQ_RegisterRead(VIP_reg_slr_out_width);
  2466. ulVsize = PQ_Get_VDI_VSize();
  2467. dwTotalPixel = ulHsize*ulVsize ;
  2468. if(dwTotalPixel==0)
  2469. {
  2470. ucLastNRLevel = 0;
  2471. return;
  2472. }
  2473. //==MotionCut============
  2474. ucVDI_MotionFlag = PQ_GetMotionStatus(); //#40034
  2475. //==Chroma==================
  2476. for ( i=0 ; i<14 ; i++ )
  2477. {
  2478. dwChromaHistTotal += PQ_RegisterRead(VIP_reg_dpy_chroma_bin0+4*i);
  2479. }
  2480. ulChromaBin98 = ( (((PQ_RegisterRead(VIP_reg_dpy_chroma_bin0)) *100) / (dwChromaHistTotal+1))> 98 )? 1:0;
  2481. //==Gray Pattern========
  2482. if(( ((PQ_RegisterRead(VIP_c_gray_bin_pre)*100)/dwTotalPixel) >= 98 ) && ulChromaBin98)
  2483. {
  2484. DPYGrayFlag = 1;
  2485. }
  2486. else
  2487. {
  2488. DPYGrayFlag = 0;
  2489. }
  2490. dwTotalWPixel = 0;
  2491. for(i = 0; i <16; i++)
  2492. {
  2493. ulHistBin[i] = PQ_RegisterRead(VIP_reg_dpy_hist_bin0+i*4);
  2494. dwTotalWPixel += ulHistBin[i];
  2495. }
  2496. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s:DPYGrayFlag = %d, 63a4=%d,624c=%d,6238=%d \n\033[0m\n ",__LINE__,__FUNCTION__,DPYGrayFlag, ucfield_diff_cnt,ucvdi_mot_cnt,ucvdi_vdbk_sts);
  2497. #ifdef DRV_ENABLE_CVD2
  2498. //==CVD2NoiseLV==================
  2499. CVD2_GetNoiseStatus(&ucNoiseStatus);
  2500. if( (ucNoiseStatus > (ucTempM+2)) || (ucNoiseStatus < (ucTempM-2)))
  2501. {
  2502. ucTempM = ucNoiseStatus;
  2503. // == Low noise detailless issue ==============
  2504. if( VIP_IsATVSource() && ucTempM >= 12 ) PQ_RegisterWrite(VIP_reg_vdi_mad_hlp_en, 1);
  2505. else if( VIP_IsATVSource() && ucTempM < 12 ) PQ_RegisterWrite(VIP_reg_vdi_mad_hlp_en, 0);
  2506. }
  2507. // == Low noise detailless issue ==============
  2508. else if( VIP_IsATVSource() && (((ucNoiseStatus > (ucTempM+1)) && ucNoiseStatus > 12 ) || ucNoiseStatus == 12 ))
  2509. {
  2510. ucTempM = ucNoiseStatus;
  2511. PQ_RegisterWrite(VIP_reg_vdi_mad_hlp_en, 1);
  2512. }
  2513. if(ucPreNoiseStatus == ucNoiseStatus)
  2514. {
  2515. ucNoiseStatusStaticCount++;
  2516. }
  2517. else
  2518. {
  2519. if(ucNoiseStatusStaticCount)
  2520. {
  2521. ucNoiseStatusStaticCount--;
  2522. }
  2523. }
  2524. if(ucNoiseStatusStaticCount == 50)
  2525. {
  2526. if(ucTempM != ucNoiseStatus)
  2527. {
  2528. ucTempM = ucNoiseStatus;
  2529. }
  2530. ucNoiseStatusStaticCount = 0;
  2531. }
  2532. ucPreNoiseStatus = ucNoiseStatus;
  2533. if ( ucTempM <= 5 )
  2534. CVD2NoiseLevel = 0;
  2535. else if ( ucTempM <= 8 )
  2536. CVD2NoiseLevel = 1;
  2537. else if ( ucTempM <= 20 )
  2538. CVD2NoiseLevel = 2;
  2539. else CVD2NoiseLevel = 3;
  2540. if((*((UINT8*)(0xbe1cd688))) == 0x8) myrprintk("23e = %d, ucTempM = %d, CVD2NoiseLevel = %d, menu NR = %d", ucNoiseStatus, ucTempM, CVD2NoiseLevel, pHwContext->nNRLevel);
  2541. if( VIP_IsATVSource() && (VIP_GetStdColorSystem() < CVD2_STD_SECAM))
  2542. {
  2543. if((VIP_GetStdColorSystem() < CVD2_STD_SECAM) && (VIP_GetStdColorSystem() > CVD2_STD_NONE) && PQ_GetColorBarStatus())
  2544. {
  2545. if(ucCVD2_NSTD_Flag)
  2546. {
  2547. ucSNR1Case = NR_SNR_CASE1;
  2548. bTNR_C_EN_FLAG = DISABLE;
  2549. }
  2550. }
  2551. PQ_Set_NR_SLR_SNR(ucSNR1Case);
  2552. if(ucvdi_mot_cnt > 300) //if need change setting please sync with PQ_Set_NR_SLR_SNR()
  2553. {
  2554. PQ_RegisterWrite(VIP_reg_slr_snr_sel, 3);
  2555. }
  2556. else
  2557. {
  2558. PQ_RegisterWrite(VIP_reg_slr_snr_sel, 0);
  2559. }
  2560. }
  2561. else
  2562. #endif
  2563. {
  2564. PQ_Set_NR_SLR_SNR(ucSNR1Case);
  2565. }
  2566. //Chroma TNR always Enable (DTV 1080i Disable), sync this with tool, noisereuction sub1, SetValue()
  2567. if( (VIP_GetUserSource()==MPEG) && (VIP_GetInputVSize()>720) && VIP_GetInterlaceMode())
  2568. {
  2569. bTNR_C_EN_FLAG = DISABLE;
  2570. bTNRZ_C_EN_FLAG = DISABLE;
  2571. }
  2572. else if((VIP_GetUserSource()==SOURCE_EXTS) && (PQ_GET_YUV_Datat_Formal()== eGFX_YUV_444_10bit || PQ_GET_YUV_Datat_Formal()==eGFX_YUV_444_8bit))
  2573. {
  2574. bTNR_C_EN_FLAG=DISABLE;
  2575. bTNRZ_C_EN_FLAG = DISABLE;
  2576. }
  2577. //==Color Bar================================================================
  2578. #ifdef DRV_ENABLE_CVD2
  2579. if((*((UINT8*)(0xbe1cd688))) == 0x8) myprintk("ColorBarStatus() = %d, StaticFlag = %d, CVD2_NSTD_Flag = %d, ucVDI_static_flag = %d", PQ_GetColorBarStatus(), ucStaticFlag, ucCVD2_NSTD_Flag, ucVDI_static_flag);
  2580. if ( (PQ_GetColorBarStatus() && ucStaticFlag == STATIC_FRAME) || ucCVD2_NSTD_Flag == 1 )
  2581. {
  2582. ucSwapTNRLevel = NRGain[4];
  2583. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s ,0);
  2584. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s ,0);
  2585. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope ,2);
  2586. PQ_RegisterWrite(VIP_reg_slr_mbw_en ,1);
  2587. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,0);
  2588. if(ucUserSource == SOURCE_CVD2)
  2589. {
  2590. AdjustTNRZCEnFlag = TRUE;
  2591. AdjustChromaTnrCoring= TRUE;
  2592. AdjustTNRZAlphaChromaFlag = TRUE;
  2593. AdjustTNRZEn = DISABLE;
  2594. if((ucTempM <= 10) && ucVDI_static_flag)
  2595. {
  2596. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_slope_s, 0xff);
  2597. bTNR_C_EN_FLAG = DISABLE;
  2598. bTNRZ_EN_FLAG = DISABLE;
  2599. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_EN, 3);
  2600. TNR_REST_COUNT = 2;
  2601. }
  2602. if(VIP_IsAVSource() && VIP_GetStdColorSystem() == CVD2_STD_NTSC_M)
  2603. {
  2604. bTNRZ_C_EN_FLAG = DISABLE; //#51586
  2605. }
  2606. if(VIP_IsATVSource())
  2607. {
  2608. if((VIP_GetStdColorSystem() == CVD2_STD_PAL_IBGDK) && (VIP_GetPanelWidth()==1280))
  2609. {
  2610. SatGainPatch = SAT_GAIN_ATV_PAL_I_1280_PANEL_COLORBAR_PATCH;
  2611. }
  2612. if(VIP_GetStdColorSystem() == CVD2_STD_PAL_IBGDK)
  2613. {
  2614. //#52035
  2615. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH, 15);
  2616. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH, 15);
  2617. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr0, 0xa);
  2618. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr1, 0x17);
  2619. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr2, 0x27);
  2620. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr3, 0x43);
  2621. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr4, 0x60);
  2622. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp0, 0x23);
  2623. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp1, 0x18);
  2624. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp2, 0x0c);
  2625. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp3, 0x6);
  2626. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp4, 0x6);
  2627. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp5, 0x5);
  2628. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac0, 0x1);
  2629. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac1, 0xc);
  2630. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac2, 0x16);
  2631. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac3, 0x1c);
  2632. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac4, 0x22);
  2633. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac5, 0x28);
  2634. }
  2635. }
  2636. }
  2637. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: ColorBar \n\033[0m\n ",__LINE__,__FUNCTION__);
  2638. }//~Color Bar
  2639. else if(VIP_GetUserSource() == SOURCE_CVD2 && (VIP_IsATVSource() || VIP_GetStdColorSystem() == CVD2_STD_SECAM)) // ATV, and AV SECAM
  2640. {
  2641. #ifndef CONFIG_FORCE_NR_EFFECT_ENHANCED_IN_OFF_OPTION
  2642. if(pHwContext->nNRLevel > WEAK) //20170310 for increase NR effect in OFF mode
  2643. #endif
  2644. {
  2645. if (CVD2NoiseLevel == 0)
  2646. {
  2647. ucSwapTNRLevel = NRGain[1];
  2648. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s ,2);
  2649. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s ,2);
  2650. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope ,2);
  2651. PQ_RegisterWrite(VIP_reg_slr_mbw_en ,1);
  2652. if (DPYGrayFlag == 1 && VIP_IsATVSource())
  2653. {
  2654. if (VIP_GetStdColorSystem() == CVD2_STD_PAL_IBGDK)
  2655. {
  2656. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,0);
  2657. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_gain_inc, 0x48);
  2658. }
  2659. else if (VIP_GetStdColorSystem() == CVD2_STD_NTSC_M)
  2660. {
  2661. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,0);
  2662. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_gain_inc, 0x48);
  2663. }
  2664. else if (VIP_GetStdColorSystem() == CVD2_STD_PAL_M)
  2665. {
  2666. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,0);
  2667. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_gain_inc, 0x48);
  2668. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_smooth, 0x14);
  2669. }
  2670. else if (VIP_GetStdColorSystem() == CVD2_STD_PAL_CN)
  2671. {
  2672. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_en ,0);
  2673. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_gain_inc, 0x48);
  2674. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_smooth, 0x14);
  2675. }
  2676. else if (VIP_GetStdColorSystem() == CVD2_STD_SECAM)
  2677. {
  2678. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,0);
  2679. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_gain_inc, 0x30);
  2680. if( PQ_RegisterRead(VIP_c_gray_bin_pre) == dwTotalPixel && (ulHistBin[2] == dwTotalWPixel || ulHistBin[3] == dwTotalWPixel)) PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,1);
  2681. }
  2682. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: nNRLevel = %d, ATV_NR-0GY \n\033[0m\n ",__LINE__,__FUNCTION__, pHwContext->nNRLevel);
  2683. }
  2684. else
  2685. {
  2686. if (VIP_GetStdColorSystem() == CVD2_STD_PAL_CN) PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNRZ);
  2687. else PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNR);
  2688. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr1Strength.Degree[ucNRLevel] * 100 / 100);
  2689. }
  2690. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: nNRLevel = %d, ATV_NR-0 \n\033[0m\n ",__LINE__,__FUNCTION__, pHwContext->nNRLevel);
  2691. } // ~CVD2NoiseLevel = 0, in ATV, and AV SECAM
  2692. else if (CVD2NoiseLevel == 1)
  2693. {
  2694. ucSwapTNRLevel = NRGain[2];
  2695. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope ,2);
  2696. PQ_RegisterWrite(VIP_reg_slr_mbw_en ,1);
  2697. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s ,0);
  2698. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s ,0);
  2699. if (DPYGrayFlag == 1 && VIP_IsATVSource())
  2700. {
  2701. if (VIP_GetStdColorSystem() == CVD2_STD_PAL_IBGDK)
  2702. {
  2703. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,0);
  2704. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_gain_inc, 0x48);
  2705. }
  2706. else if (VIP_GetStdColorSystem() == CVD2_STD_NTSC_M)
  2707. {
  2708. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,0);
  2709. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_gain_inc, 0x48);
  2710. }
  2711. else if (VIP_GetStdColorSystem() == CVD2_STD_PAL_M)
  2712. {
  2713. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,0);
  2714. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_gain_inc, 0x48);
  2715. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_smooth, 0x14);
  2716. }
  2717. else if (VIP_GetStdColorSystem() == CVD2_STD_PAL_CN)
  2718. {
  2719. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_en ,0);
  2720. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_gain_inc, 0x48);
  2721. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_smooth, 0x14);
  2722. }
  2723. else if (VIP_GetStdColorSystem() == CVD2_STD_SECAM)
  2724. {
  2725. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,0);
  2726. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_gain_inc, 0x30);
  2727. if( PQ_RegisterRead(VIP_c_gray_bin_pre) == dwTotalPixel && (ulHistBin[2] == dwTotalWPixel || ulHistBin[3] == dwTotalWPixel)) PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,1);
  2728. }
  2729. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: nNRLevel = %d, ATV_NR-1GY \n\033[0m\n ",__LINE__,__FUNCTION__, pHwContext->nNRLevel);
  2730. }
  2731. else
  2732. {
  2733. if (VIP_GetStdColorSystem() == CVD2_STD_PAL_CN) PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNRZ);
  2734. else PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNR);
  2735. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr1Strength.Degree[ucNRLevel] * 100 / 100);
  2736. }
  2737. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNRZ);
  2738. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp3 ,6);
  2739. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp4 ,6);
  2740. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp5 ,6);
  2741. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: nNRLevel = %d, ATV_NR-1 \n\033[0m\n ",__LINE__,__FUNCTION__, pHwContext->nNRLevel);
  2742. }// ~CVD2NoiseLevel = 1, in ATV, and AV SECAM
  2743. else if (CVD2NoiseLevel == 2)
  2744. {
  2745. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s ,0);
  2746. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s ,0);
  2747. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope ,2);
  2748. PQ_RegisterWrite(VIP_reg_slr_mbw_en ,1);
  2749. #ifndef CONFIG_SUPPORT_NR_SETTIGN_BY_TOOL
  2750. ucSwapTNRLevel = NRGain[3];
  2751. if (DPYGrayFlag == 1 && VIP_IsATVSource() && (VIP_GetStdColorSystem() == CVD2_STD_NTSC_M))
  2752. {
  2753. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,0);
  2754. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_gain_inc, 0x48);
  2755. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: nNRLevel = %d, ATV_NR-N2GY \n\033[0m\n ",__LINE__,__FUNCTION__, pHwContext->nNRLevel);
  2756. }
  2757. else
  2758. {
  2759. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNR);
  2760. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr1Strength.Degree[ucNRLevel] * 100 / 100);
  2761. }
  2762. #ifdef CONFIG_CONTROL_TNRZ_BY_PQ_DRIVER
  2763. AdjustTNRZEn = DISABLE;
  2764. #endif
  2765. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac3, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+6);
  2766. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac4, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+12);
  2767. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac5, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+18);
  2768. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp3 ,6);
  2769. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp4 ,6);
  2770. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp5 ,6);
  2771. #else
  2772. ucSwapTNRLevel = NRGain[2];
  2773. if (DPYGrayFlag == 1 )
  2774. {
  2775. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,0);
  2776. AdjustTNRZEn = DISABLE;
  2777. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: nNRLevel = %d, ATV_NR-2GY \n\033[0m\n ",__LINE__,__FUNCTION__, pHwContext->nNRLevel);
  2778. }
  2779. else
  2780. {
  2781. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNR);
  2782. AdjustTNRZEn = ENABLE;
  2783. }
  2784. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac3, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+10);
  2785. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac4, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+20);
  2786. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac5, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+30);
  2787. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp3 ,10);
  2788. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp4 ,10);
  2789. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp5 ,10);
  2790. #endif //~ifndef CONFIG_SUPPORT_NR_SETTIGN_BY_TOOL
  2791. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: nNRLevel = %d, ATV_NR-2 \n\033[0m\n ",__LINE__,__FUNCTION__, pHwContext->nNRLevel);
  2792. }// ~CVD2NoiseLevel = 2, in ATV, and AV SECAM
  2793. else //CVD2NoiseLevel == 3
  2794. {
  2795. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: nNRLevel = %d, ATV_NR-3 \n\033[0m\n ",__LINE__,__FUNCTION__, pHwContext->nNRLevel);
  2796. #ifndef CONFIG_SUPPORT_NR_SETTIGN_BY_TOOL
  2797. ucSwapTNRLevel = NRGain[4];
  2798. #else
  2799. ucSwapTNRLevel = NRGain[2];
  2800. #endif
  2801. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s ,0);
  2802. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s ,0);
  2803. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope ,0x1f);
  2804. PQ_RegisterWrite(VIP_reg_slr_mbw_en ,0);
  2805. PQ_RegisterWrite(VIP_reg_ds_disable_func_en ,1);
  2806. if (DPYGrayFlag == 1 )//&& ulChromaBin98 == 1) //&& ucVDI_MotionFlag == 0)
  2807. {
  2808. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,0);
  2809. AdjustTNRZEn = DISABLE;
  2810. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: nNRLevel = %d, ATV_NR-3GY \n\033[0m\n ",__LINE__,__FUNCTION__, pHwContext->nNRLevel);
  2811. }
  2812. else
  2813. {
  2814. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: nNRLevel = %d, ATV_NR-3NGY \n\033[0m\n ",__LINE__,__FUNCTION__, pHwContext->nNRLevel);
  2815. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNR);
  2816. #ifndef CONFIG_SUPPORT_NR_SETTIGN_BY_TOOL
  2817. #ifdef CONFIG_CONTROL_TNRZ_BY_PQ_DRIVER
  2818. AdjustTNRZEn = DISABLE;
  2819. #endif
  2820. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac3, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+6);
  2821. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac4, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+12);
  2822. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac5, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+18);
  2823. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp3 ,6);
  2824. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp4 ,6);
  2825. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp5 ,6);
  2826. #else
  2827. AdjustTNRZEn = ENABLE;
  2828. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac3, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+10);
  2829. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac4, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+20);
  2830. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac5, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+30);
  2831. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp3 ,10);
  2832. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp4 ,10);
  2833. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp5 ,10);
  2834. #endif
  2835. }
  2836. }// ~CVD2NoiseLevel = 3, in ATV, and AV SECAM
  2837. if((*((UINT8*)(0xbe1cd688))) == 0x8) myprintk("ucTempDCCSceneID = %d, ulChromaBin98 = %d, PQ_ChromaBinPercentage(13) = %d, ucVDI_MotionFlag = %d", ucTempDCCSceneID, ulChromaBin98, PQ_ChromaBinPercentage(13), ucVDI_MotionFlag);
  2838. if( ( ((ucTempDCCSceneID == 31 || ucTempDCCSceneID == 32) && ulChromaBin98) || PQ_ChromaBinPercentage(13)>980 ) && !ucVDI_MotionFlag )
  2839. {
  2840. ucSwapTNRLevel = NRGain[4];
  2841. if((DPYGrayFlag) && (CVD2NoiseLevel < 2))
  2842. {
  2843. AdjustTNRZEn = ENABLE;
  2844. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s ,0);
  2845. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s ,0);
  2846. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope ,0x2);
  2847. PQ_RegisterWrite(VIP_reg_slr_mbw_en ,1);
  2848. if(VIP_IsATVSource()) //#51245
  2849. {
  2850. if(VIP_GetStdColorSystem() == CVD2_STD_PAL_M)
  2851. {
  2852. SatGainPatch = SAT_GAIN_ATV_PAL_M_GREY_SCALE_NR_PATCH;
  2853. }
  2854. else if(VIP_GetStdColorSystem() == CVD2_STD_SECAM)
  2855. {
  2856. SatGainPatch = SAT_GAIN_ATV_SECAM_GREY_SCALE_NR_PATCH;
  2857. }
  2858. else
  2859. {
  2860. SatGainPatch = SAT_GAIN_ATV_GREY_SCALE_PATCH;
  2861. }
  2862. }
  2863. }
  2864. PQ_SigmaNR(TRUE, 0, 0, 0);
  2865. SpecialFlag = 1;
  2866. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: 31/32 , SpecialFlag = TRUE, DPYGrayFlag = %d, CVD2NoiseLevel = %d \n\033[0m\n ",__LINE__,__FUNCTION__, DPYGrayFlag, CVD2NoiseLevel);
  2867. }
  2868. else
  2869. {
  2870. if(VIP_IsATVSource())
  2871. {
  2872. #ifdef CONFIG_FORCE_NR_EFFECT_ENHANCED_IN_OFF_OPTION
  2873. PQ_SigmaNR(TRUE, 0xff, 0xff, 0xff);
  2874. #else
  2875. PQ_SigmaNR(TRUE, pMenuValue->ucNRLevel, 0xff, 0xff);
  2876. #endif
  2877. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: regular pattern , in ATV source \n\033[0m\n ",__LINE__,__FUNCTION__);
  2878. }
  2879. }
  2880. }// pHwContext->nNRLevel > WEAK in ATV, and AV SECAM
  2881. #ifndef CONFIG_FORCE_NR_EFFECT_ENHANCED_IN_OFF_OPTION
  2882. else // NR = OFF in ATV, and AV SECAM
  2883. {
  2884. ucSwapTNRLevel = NRGain[0];
  2885. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s ,2);
  2886. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s ,2);
  2887. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope ,2);
  2888. PQ_RegisterWrite(VIP_reg_slr_mbw_en ,1);
  2889. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNR);
  2890. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNRZ);
  2891. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: nNRLevel == OFFATV_NR-0 \n\033[0m\n ",__LINE__,__FUNCTION__);
  2892. }
  2893. #endif
  2894. // ==AV SECAM graycolorbar noise== #46926
  2895. if (VIP_IsAVSource() && (VIP_GetStdColorSystem() == CVD2_STD_SECAM))
  2896. {
  2897. if (ucfield_diff_cnt == 0 && ucVDI_Static_Cnt_3 < 10) ucVDI_Static_Cnt_3++;
  2898. else if (ucfield_diff_cnt == 0 && ucVDI_Static_Cnt_3 == 99) ucVDI_Static_Cnt_3 = 1;
  2899. else if (ucfield_diff_cnt > 0 && ucVDI_Static_Cnt_3 > 0) ucVDI_Static_Cnt_3 = 99;
  2900. else if (ucVDI_Static_Cnt_3 >= 10 && ucVDI_Static_Cnt_3 < 15) ucVDI_Static_Cnt_3 = 10;
  2901. if (ucVDI_Static_Cnt_3 >= 5 && ucVDI_Static_Cnt_3 <= 10)
  2902. {
  2903. AdjustTNRZCAVSecamFlag = TRUE;
  2904. }
  2905. else if (ucVDI_Static_Cnt_3 == 99)
  2906. {
  2907. ucVDI_Static_Cnt_3 = 0;
  2908. }
  2909. } //~AV SECAM only
  2910. if(VIP_IsATVSource() && VIP_GetStdColorSystem() == CVD2_STD_PAL_IBGDK) //#52035
  2911. {
  2912. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[ucNRLevel] * ucSwapTNRLevel / 100);
  2913. }
  2914. }// ~ATV or AV SECAM only else if(VIP_GetUserSource() == SOURCE_CVD2 && (VIP_IsATVSource() || VIP_GetStdColorSystem() == CVD2_STD_SECAM)) // ATV, and AV SECAM
  2915. else if( VIP_GetUserSource() == SOURCE_CVD2 && (!VIP_IsATVSource() && VIP_GetStdColorSystem() != CVD2_STD_SECAM)) // AV source, except AV Secam
  2916. {
  2917. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNR);
  2918. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNRZ);
  2919. if( ucNoiseStatus <= 1 )
  2920. {
  2921. ucSwapTNRLevel = NRGain[0];
  2922. if (DPYGrayFlag == 1 && VIP_GetStdColorSystem() == CVD2_STD_PAL_IBGDK) //#49773
  2923. {
  2924. PQ_RegisterWrite(VIP_reg_vdi_tnrz_clamp_typ0, 0x0);
  2925. PQ_RegisterWrite(VIP_reg_vdi_tnrz_clamp_typ1, 0x1);
  2926. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_fac, 0x1f);
  2927. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac3, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2));
  2928. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac4, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+10);
  2929. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac5, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+20);
  2930. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp3 ,16);
  2931. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp4 ,16);
  2932. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp5 ,16);
  2933. }
  2934. else
  2935. {
  2936. PQ_RegisterWrite(VIP_reg_vdi_tnrz_clamp_typ0, 0x1);
  2937. PQ_RegisterWrite(VIP_reg_vdi_tnrz_clamp_typ1, 0x0);
  2938. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_fac, 0x10);
  2939. }
  2940. }
  2941. else if(ucNoiseStatus <=0x5)
  2942. {
  2943. if(ucVDI_MotionFlag == 0)
  2944. ucSwapTNRLevel = NRGain[2];
  2945. else
  2946. ucSwapTNRLevel = NRGain[0];
  2947. }
  2948. else
  2949. {
  2950. ucSwapTNRLevel = NRGain[4];
  2951. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s ,0);
  2952. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s ,0);
  2953. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope ,0x1f);
  2954. PQ_RegisterWrite(VIP_reg_slr_mbw_en ,0);
  2955. if (DPYGrayFlag == 1 && ucVDI_MotionFlag == 0)
  2956. {
  2957. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,0);
  2958. #ifdef CONFIG_CONTROL_TNRZ_BY_PQ_DRIVER
  2959. AdjustTNRZEn = DISABLE;
  2960. #endif
  2961. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: AV_NR-3_GY \n\033[0m\n ",__LINE__,__FUNCTION__);
  2962. }
  2963. else
  2964. {
  2965. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: AV_NR-3_NGY \n\033[0m\n ",__LINE__,__FUNCTION__);
  2966. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac3, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+6);
  2967. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac4, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+12);
  2968. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac5, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+18);
  2969. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp3 ,6);
  2970. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp4 ,6);
  2971. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp5 ,6);
  2972. }
  2973. }
  2974. }// ~AV, NTSC & PAL only
  2975. else
  2976. #endif
  2977. {
  2978. if ( VIP_IsSourceDTV() && (VIP_GetInputVSize()<=600))
  2979. {
  2980. ucSwapTNRLevel = NRGain[0];
  2981. PQ_RegisterWrite(VIP_reg_slr_mbw_en ,0); //#40037
  2982. }
  2983. else if( VIP_GetUserSource() == SOURCE_MPEG && ucVDI_MotionFlag == 0 )
  2984. {
  2985. ucSwapTNRLevel = NRGain[0];
  2986. PQ_RegisterWrite(VIP_reg_vdi_mad_hlp_en, 1);
  2987. }
  2988. else
  2989. {
  2990. ucSwapTNRLevel = NRGain[0];
  2991. }
  2992. }
  2993. //NR setting patch, and recover while exit specific condition
  2994. #ifdef DRV_ENABLE_CVD2
  2995. if(AdjustTNRZCEnFlag)
  2996. {
  2997. if (VIP_IsAVSource())// AV #50100
  2998. {
  2999. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_en ,0);
  3000. }
  3001. if (VIP_IsATVSource())// ATV #50100
  3002. {
  3003. if ((VIP_GetStdColorSystem() == CVD2_STD_PAL_IBGDK) && VIP_GetPanelWidth()==1280)
  3004. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_en ,1);
  3005. else
  3006. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_en ,0);
  3007. }
  3008. }
  3009. else if(AdjustTNRZCAVSecamFlag)
  3010. {
  3011. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_AV_SECAM_PATCH);
  3012. }
  3013. else
  3014. #endif
  3015. {
  3016. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNR_C);
  3017. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNRZ_C);
  3018. }
  3019. #ifdef DRV_ENABLE_CVD2
  3020. if(AdjustTNRZAlphaChromaFlag)
  3021. {
  3022. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_chroma, 0x1);
  3023. }
  3024. else
  3025. #endif
  3026. {
  3027. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_chroma, 0x10);
  3028. }
  3029. #ifdef DRV_ENABLE_CVD2
  3030. if(AdjustChromaTnrCoring)
  3031. {
  3032. if (VIP_IsAVSource())// AV #50100
  3033. {
  3034. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_chroma, 0x0);
  3035. }
  3036. if (VIP_IsATVSource())// ATV #50100
  3037. {
  3038. if ((VIP_GetStdColorSystem() == CVD2_STD_PAL_IBGDK) && VIP_GetPanelWidth()==1280 && VIP_GetPanelHeight()==800)
  3039. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_chroma, 0x1);
  3040. else
  3041. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_chroma, 0x9);
  3042. }
  3043. AdjustChromaTnrCoring= FALSE;
  3044. }
  3045. else
  3046. #endif
  3047. {
  3048. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_CORING, 0);
  3049. }
  3050. #ifdef DRV_ENABLE_CVD2
  3051. if(AdjustTNRZEn == DISABLE)
  3052. {
  3053. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_en, 0);
  3054. }
  3055. else if(AdjustTNRZEn == ENABLE)
  3056. {
  3057. if (CVD2NoiseLevel <= 1 && DPYGrayFlag == 1 && VIP_IsATVSource() && VIP_GetStdColorSystem() == CVD2_STD_PAL_CN)
  3058. {
  3059. // #51261
  3060. }
  3061. else
  3062. {
  3063. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_en, 1);
  3064. }
  3065. }
  3066. else
  3067. #endif
  3068. {
  3069. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNRZ);
  3070. }
  3071. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_en, bTNRZ_C_EN_FLAG);
  3072. #ifdef DRV_ENABLE_CVD2
  3073. if(TNR_REST_COUNT > 0)
  3074. {
  3075. TNR_REST_COUNT--;
  3076. if(TNR_REST_COUNT == 0)
  3077. {
  3078. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_slope_s, 0);
  3079. bTNR_C_EN_FLAG = ENABLE;
  3080. bTNRZ_EN_FLAG = ENABLE;
  3081. }
  3082. }
  3083. #endif
  3084. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_en, bTNR_C_EN_FLAG); //disable this can save memory bandwidth
  3085. PQ_NR_TnrzEnable(bTNRZ_EN_FLAG);
  3086. #ifdef DRV_ENABLE_CVD2
  3087. if((VIP_GetUserSource() == SOURCE_CVD2) && DPYGrayFlag && ((ucTempDCCSceneID == 31 || ucTempDCCSceneID == 32)) && !ucVDI_MotionFlag)
  3088. {
  3089. if(VIP_IsATVSource())
  3090. {
  3091. pHwContext->PqPatch.TnrClampPatch = TNR_CLAMP_DEFAULT_ATV_GRAYSCALE_PATCH;
  3092. }
  3093. else
  3094. {
  3095. pHwContext->PqPatch.TnrClampPatch = TNR_CLAMP_DEFAULT_AV_GRAYSCALE_PATCH;
  3096. }
  3097. }
  3098. _TnrClampPatch();
  3099. #endif
  3100. if(VIP_GetUserSource() == SOURCE_HDMI && DPYGrayFlag==1)
  3101. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_EN, 0x00);
  3102. else
  3103. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_EN, 0x01);
  3104. //~recover NR setting while exit specific condition
  3105. PQ_SetupSaturationGainCurve(SatGainPatch);
  3106. if((ucSwapTNRLevel == ucLastSwapNRLevel && ucLastNRLevel == pHwContext->nNRLevel) && !pHwContext->bNR_Reset_by_changeSrc)
  3107. {
  3108. return;
  3109. }
  3110. if(VIP_GetUserSource() != SOURCE_CVD2)
  3111. {
  3112. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s ,3);
  3113. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s ,3);
  3114. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope ,2);
  3115. PQ_RegisterWrite(VIP_reg_ds_disable_func_en, ucTempds_disable_func_en);
  3116. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNR);
  3117. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNRZ);
  3118. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: NO_DNR \n\033[0m\n ",__LINE__,__FUNCTION__);
  3119. }
  3120. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: ucSwapTNRLevel=%d \n\033[0m\n ",__LINE__,__FUNCTION__,ucSwapTNRLevel);
  3121. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: ucNRLevel=%d \n\033[0m\n ",__LINE__,__FUNCTION__,ucNRLevel);
  3122. if(pHwContext->nNRLevel>=WEAK && pHwContext->nNRLevel<=STRONG )
  3123. {
  3124. ucNRLevel = pHwContext->nNRLevel - 1;
  3125. }
  3126. else
  3127. {
  3128. ucNRLevel = OFF;
  3129. }
  3130. #ifdef CONFIG_SUPPORT_NR_SETTIGN_BY_TOOL
  3131. ucLowValue_tnrLstr= (UINT32) pNR_Setting_BY_Group_Idx->LumaTnrStrength.Degree[0] * ucSwapTNRLevel / 100;
  3132. ucMidValue_tnrLstr= (UINT32) pNR_Setting_BY_Group_Idx->LumaTnrStrength.Degree[1] * ucSwapTNRLevel / 100;
  3133. ucHighValue_tnrLstr = (UINT32) pNR_Setting_BY_Group_Idx->LumaTnrStrength.Degree[2] * ucSwapTNRLevel / 100;
  3134. ucLowValue_tnrCstr = (UINT32) pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[0] * ucSwapTNRLevel / 100;
  3135. ucMidValue_tnrCstr = (UINT32) pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[1] * ucSwapTNRLevel / 100;
  3136. ucHighValue_tnrCstr = (UINT32) pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[2] * ucSwapTNRLevel / 100;
  3137. if(((UINT32) pNR_Setting_BY_Group_Idx->LumaTnrStrength.Degree[0] < 13) && ((UINT32) pNR_Setting_BY_Group_Idx->LumaTnrStrength.Degree[1] < 15 )\
  3138. && ((UINT32) pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[0] < 13) && (UINT32) pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[1] < 15)//tiaodebudui
  3139. {
  3140. if(ucHighValue_tnrLstr>=15)
  3141. {
  3142. if(ucLowValue_tnrLstr>= 14)
  3143. {
  3144. ucLowValue_tnrLstr= (UINT32) pNR_Setting_BY_Group_Idx->LumaTnrStrength.Degree[0];
  3145. if(( (PQ_GetColorBarStatus() && ucVDI_MotionFlag == 0) || ucCVD2_NSTD_Flag == 1 ) || (SpecialFlag == 1) )
  3146. ucMidValue_tnrLstr= (UINT32) pNR_Setting_BY_Group_Idx->LumaTnrStrength.Degree[1] + (16 - (UINT32) pNR_Setting_BY_Group_Idx->LumaTnrStrength.Degree[1]) * 3 / 4;
  3147. else
  3148. ucMidValue_tnrLstr= (UINT32) pNR_Setting_BY_Group_Idx->LumaTnrStrength.Degree[1] + (16 - (UINT32) pNR_Setting_BY_Group_Idx->LumaTnrStrength.Degree[1]) / 2;
  3149. if(ucMidValue_tnrLstr>=15)
  3150. ucMidValue_tnrLstr = 14;
  3151. }
  3152. else if(ucMidValue_tnrLstr >= 15)
  3153. {
  3154. if(( (PQ_GetColorBarStatus() && ucVDI_MotionFlag == 0) || ucCVD2_NSTD_Flag == 1 ) || (SpecialFlag == 1) )
  3155. ucMidValue_tnrLstr= (UINT32) pNR_Setting_BY_Group_Idx->LumaTnrStrength.Degree[1] + (16 - (UINT32) pNR_Setting_BY_Group_Idx->LumaTnrStrength.Degree[1]) * 2 / 3;
  3156. else
  3157. ucMidValue_tnrLstr= (UINT32) pNR_Setting_BY_Group_Idx->LumaTnrStrength.Degree[1] + (16 - (UINT32) pNR_Setting_BY_Group_Idx->LumaTnrStrength.Degree[1]) / 2;
  3158. if(ucMidValue_tnrLstr >= 15)
  3159. {
  3160. ucMidValue_tnrLstr = 14;
  3161. }
  3162. }
  3163. }
  3164. if(ucHighValue_tnrCstr>=15)
  3165. {
  3166. if(ucLowValue_tnrCstr>= 14)
  3167. {
  3168. ucLowValue_tnrCstr= (UINT32) pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[0];
  3169. if(( (PQ_GetColorBarStatus() && ucVDI_MotionFlag == 0) || ucCVD2_NSTD_Flag == 1 ) || (SpecialFlag == 1) )
  3170. ucMidValue_tnrCstr= (UINT32) pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[1] + (16 - (UINT32) pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[1]) * 3 / 4;
  3171. else
  3172. ucMidValue_tnrCstr= (UINT32) pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[1] + (16 - (UINT32) pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[1]) / 2;
  3173. if(ucMidValue_tnrCstr>=15)
  3174. ucMidValue_tnrCstr = 14;
  3175. }
  3176. else if(ucMidValue_tnrCstr >= 15)
  3177. {
  3178. if(( (PQ_GetColorBarStatus() && ucVDI_MotionFlag == 0) || ucCVD2_NSTD_Flag == 1 ) || (SpecialFlag == 1) )
  3179. ucMidValue_tnrCstr= (UINT32) pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[1] + (16 - (UINT32) pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[1]) * 2 / 3;
  3180. else
  3181. ucMidValue_tnrCstr= (UINT32) pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[1] + (16 - (UINT32) pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[1]) / 2;
  3182. if(ucMidValue_tnrCstr >= 15)
  3183. {
  3184. ucMidValue_tnrCstr = 14;
  3185. }
  3186. }
  3187. }
  3188. }
  3189. #endif
  3190. if((pHwContext->nNRLevel == OFF) && // JPEG HDMI, MPEG, PC , OSD NR = OFF only
  3191. (VIP_GetUserSource() == SOURCE_JPEG ||
  3192. VIP_GetUserSource() == SOURCE_HDMI ||
  3193. VIP_GetUserSource() == SOURCE_MPEG ||
  3194. VIP_IsPCSource()
  3195. ))
  3196. {
  3197. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_CORING, 0);
  3198. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH, 0);
  3199. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH, 0);
  3200. PQ_SetupStrength(PQ_ITEM_TNR_ULTRA_LOW, 0);
  3201. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_CORING, 0);
  3202. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_STRENGTH, 0);
  3203. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_CORING, 0);
  3204. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_STRENGTH, 0);
  3205. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_CORING, 0);
  3206. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_STRENGTH, 0);
  3207. } // ~ JPEG HDMI, MPEG, PC , OSD NR = OFF only
  3208. else if((pHwContext->nNRLevel == OFF) && ((VIP_GetUserSource() == SOURCE_CVD2) ||(VIP_GetUserSource() == SOURCE_EXTS && !VIP_IsPCSource()))) //only CVD2 or YPP in OSD NR = OFF
  3209. {
  3210. // #ifndef CONFIG_FORCE_NR_EFFECT_ENHANCED_IN_OFF_OPTION
  3211. if(VIP_IsATVSource())
  3212. {
  3213. #ifndef CONFIG_FORCE_NR_EFFECT_ENHANCED_IN_OFF_OPTION
  3214. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH,0);//ucLowValue_tnrLstr/2);
  3215. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH,0);//ucLowValue_tnrCstr/2);
  3216. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_CORING, 0);
  3217. PQ_SetupStrength(PQ_ITEM_TNR_ULTRA_LOW, 0);
  3218. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_CORING, 0);
  3219. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_STRENGTH, 0);
  3220. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_CORING, 0);
  3221. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_STRENGTH, 0);
  3222. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_CORING, 0);
  3223. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_STRENGTH, 0);
  3224. #else
  3225. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_CORING, 9);
  3226. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH, 9);
  3227. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH, 9);
  3228. PQ_SetupStrength(PQ_ITEM_TNR_ULTRA_LOW, 0);
  3229. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_CORING, 4);
  3230. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_STRENGTH, 0);
  3231. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_CORING, 4);
  3232. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_STRENGTH, 2);
  3233. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_CORING, 4);
  3234. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_STRENGTH, 1);
  3235. #endif
  3236. }
  3237. #ifdef CONFIG_SUPPORT_NR_SETTIGN_BY_TOOL
  3238. else if( (SpecialFlag ) ||( (PQ_GetColorBarStatus() && ucVDI_MotionFlag == 0) || ucCVD2_NSTD_Flag == 1 ))
  3239. #else
  3240. else if( SpecialFlag )
  3241. #endif
  3242. {
  3243. #ifndef CONFIG_FORCE_NR_EFFECT_ENHANCED_IN_OFF_OPTION
  3244. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH,0);//ucLowValue_tnrLstr/2);
  3245. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH,0);//ucLowValue_tnrCstr/2);
  3246. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_CORING, 0);
  3247. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_CORING, 0);
  3248. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_STRENGTH, 0);
  3249. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_CORING, 0);
  3250. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_STRENGTH, 0);
  3251. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_CORING, 0);
  3252. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_STRENGTH, 0);
  3253. #else
  3254. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH,(UINT32) pNR_Setting_BY_Group_Idx->LumaTnrStrength.Degree[ucNRLevel] * ucSwapTNRLevel / 100);
  3255. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[ucNRLevel] * ucSwapTNRLevel / 100);
  3256. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_CORING, (UINT32)pNR_Setting_BY_Group_Idx->LumaTnrCoring.Degree[ucNRLevel] * ucSwapTNRLevel / 100);
  3257. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_CORING, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr1Coring.Degree[ucNRLevel] * 100 / 100);
  3258. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr1Strength.Degree[ucNRLevel] * 100 / 100);
  3259. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_CORING, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr2Coring.Degree[ucNRLevel] * 100 / 100);
  3260. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr2Strength.Degree[ucNRLevel] * 100 / 100);
  3261. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_CORING, (UINT32)pNR_Setting_BY_Group_Idx->ChromaSnrCoring.Degree[ucNRLevel] * 100 / 100);
  3262. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->ChromaSnrStrength.Degree[ucNRLevel] * 100 / 100);
  3263. #endif
  3264. }
  3265. else
  3266. {
  3267. #ifndef CONFIG_FORCE_NR_EFFECT_ENHANCED_IN_OFF_OPTION
  3268. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH,0);//ucLowValue_tnrLstr/2);
  3269. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH,0);//ucLowValue_tnrCstr/2);
  3270. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_CORING, 0);
  3271. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_CORING, 0);
  3272. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_STRENGTH, 0);
  3273. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_CORING, 0);
  3274. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_STRENGTH, 0);
  3275. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_CORING, 0);
  3276. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_STRENGTH, 0);
  3277. #else
  3278. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_CORING, (UINT32)pNR_Setting_BY_Group_Idx->LumaTnrCoring.Degree[0] * 100 / 100);
  3279. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_CORING, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr1Coring.Degree[0] * 100 / 100);
  3280. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr1Strength.Degree[0] * 100 / 100);
  3281. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_CORING, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr2Coring.Degree[0] * 100 / 100);
  3282. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr2Strength.Degree[0] * 100 / 100);
  3283. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_CORING, (UINT32)pNR_Setting_BY_Group_Idx->ChromaSnrCoring.Degree[0] * 100 / 100);
  3284. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->ChromaSnrStrength.Degree[0] * 100 / 100);
  3285. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH,(UINT32) pNR_Setting_BY_Group_Idx->LumaTnrStrength.Degree[0] * 100 / 100);
  3286. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[0] * 100 / 100);
  3287. #endif
  3288. }
  3289. }// ~only CVD2 or YPP in OSD NR = OFF
  3290. else
  3291. {
  3292. #ifdef CONFIG_SUPPORT_NR_SETTIGN_BY_TOOL
  3293. {
  3294. if(ucNRLevel == 0)
  3295. {
  3296. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH,ucLowValue_tnrLstr);
  3297. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH,ucLowValue_tnrCstr );
  3298. }
  3299. else if(ucNRLevel == 1)
  3300. {
  3301. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH,ucMidValue_tnrLstr);
  3302. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH,ucMidValue_tnrCstr );
  3303. }
  3304. else if(ucNRLevel == 2)
  3305. {
  3306. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH,ucHighValue_tnrLstr);
  3307. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH,ucHighValue_tnrCstr );
  3308. }
  3309. if (VIP_GetUserSource() == SOURCE_MPEG && ucVDI_static_flag)
  3310. {
  3311. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[ucNRLevel] * ucCTNRLevel);
  3312. }
  3313. }
  3314. #else
  3315. {
  3316. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH,(UINT32) pNR_Setting_BY_Group_Idx->LumaTnrStrength.Degree[ucNRLevel] * ucSwapTNRLevel / 100);
  3317. if (VIP_GetUserSource() == SOURCE_MPEG && ucVDI_static_flag)
  3318. {
  3319. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[ucNRLevel] * ucCTNRLevel);
  3320. }
  3321. else
  3322. {
  3323. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[ucNRLevel] * ucSwapTNRLevel / 100);
  3324. }
  3325. }
  3326. #endif
  3327. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_CORING, (UINT32)pNR_Setting_BY_Group_Idx->LumaTnrCoring.Degree[ucNRLevel] * ucSwapTNRLevel / 100);
  3328. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_CORING, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr1Coring.Degree[ucNRLevel] * 100 / 100);
  3329. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr1Strength.Degree[ucNRLevel] * 100 / 100);
  3330. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_CORING, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr2Coring.Degree[ucNRLevel] * 100 / 100);
  3331. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr2Strength.Degree[ucNRLevel] * 100 / 100);
  3332. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_CORING, (UINT32)pNR_Setting_BY_Group_Idx->ChromaSnrCoring.Degree[ucNRLevel] * 100 / 100);
  3333. #ifdef DRV_ENABLE_CVD2
  3334. if (CVD2NoiseLevel <= 1 && DPYGrayFlag == 1 && VIP_IsATVSource() && (VIP_GetStdColorSystem() == CVD2_STD_PAL_CN || VIP_GetStdColorSystem() == CVD2_STD_PAL_M))
  3335. {
  3336. // #51261
  3337. }
  3338. else
  3339. #endif
  3340. {
  3341. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->ChromaSnrStrength.Degree[ucNRLevel] * 100 / 100);
  3342. }
  3343. }
  3344. ucLastSwapNRLevel = ucSwapTNRLevel;
  3345. ucLastNRLevel = pHwContext->nNRLevel;
  3346. pHwContext->bNR_Reset_by_changeSrc = FALSE;
  3347. #endif
  3348. }
  3349. void PQ_LoadSettingValue(UINT8* pVipTable, UINT8 ucTableIndex)
  3350. {
  3351. PQ_TABLE_BOOK* pTableBook= (PQ_TABLE_BOOK*) pVipTable;
  3352. UINT32 ulTableOffset,ulTableCount,ulRegister,ulValue,ulTotal,i;
  3353. volatile UINT32* pAddr;
  3354. PQHW_CONTEXT* pHwContext= &PQHwContext;
  3355. // int j, k, m;
  3356. //int m;
  3357. INT32* pValArray= (INT32*) (&pHwContext->VtabCmnValue);
  3358. if( ucTableIndex>=pTableBook->nTotalTable )
  3359. return;
  3360. ulTotal= sizeof(VTAB_CMN_VALUE_DEFINE)/sizeof(INT32);
  3361. ulTableOffset= pTableBook->TableIndex[ucTableIndex].nOffset + (UINT32)pVipTable;
  3362. ulTableCount= pTableBook->TableIndex[ucTableIndex].nSize >> 3;
  3363. pAddr= (volatile UINT32*) ulTableOffset;
  3364. #if SEPERATE_YPBPR1_YPBPR2
  3365. if( ucTableIndex>=VTAB_EXTS_YPP_VALUE && ucTableIndex<=VTAB_EXTS_YPP2_HD_VALUE)
  3366. #else
  3367. if( ucTableIndex>=VTAB_EXTS_YPP_VALUE && ucTableIndex<=VTAB_HDMI_HD_VALUE)
  3368. #endif
  3369. {
  3370. ulTotal= sizeof(VTAB_SRC_VALUE_DEFINE)/sizeof(INT32);
  3371. pValArray= (INT32*) (&pHwContext->VtabSrcValue[ucTableIndex-VTAB_EXTS_YPP_VALUE]);
  3372. }
  3373. for (i=0; i<ulTableCount; i++)
  3374. {
  3375. ulRegister= *pAddr;
  3376. if( ulRegister & PQ_REG_VALUE_DEFINE )
  3377. {
  3378. ulRegister&= ~PQ_REG_VALUE_DEFINE;
  3379. ulValue= *(pAddr+1);
  3380. if(ucTableIndex ==1)
  3381. {
  3382. // if(ulRegister >= 0x29c0)
  3383. //myprintk("ulRegister=0x%x ulValue=0x%x \n", ulRegister, ulValue);
  3384. }
  3385. //PQDebugPrint("%s: i=0x%lx ulRegister=0x%8.8lx ulValue=0x%8.8lx", __FUNCTION__, i, ulRegister, ulValue);
  3386. if( ulRegister<ulTotal )
  3387. {
  3388. *(&pValArray[ulRegister])= ulValue;
  3389. }
  3390. }
  3391. pAddr+= 2;
  3392. }
  3393. /*
  3394. myprintk("sizeof(SHARPNESS) = %d, SHARPNESS_DATA = %d, SHARP_INFO = %d", sizeof(SHARPNESS)/sizeof(int), sizeof(SHARPNESS_DATA)/sizeof(int), sizeof(SHARP_INFO)/sizeof(int));
  3395. if(ucTableIndex ==1)
  3396. for( j = 0; j< 8; j++)
  3397. {
  3398. pSharpness_setting = &pHwContext->VtabCmnValue.mSharpenss.mSharpness_Data[j];
  3399. }
  3400. */
  3401. }
  3402. void PQ_InitVtabSRCValue_DF(void)
  3403. {
  3404. PQHW_CONTEXT* pHwContext= &PQHwContext;
  3405. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  3406. //VTAB_SRC_VALUE_DEFINE* pVtabSrcValue;
  3407. #if 0
  3408. int i;
  3409. DIN_FILTER df[VTAB_MAX_SOURCE]={
  3410. {0,0,0,0,0,0,0,0,0}, // YPP
  3411. {0,0,0,0,0,0,0,0,0}, // RGB
  3412. {1,0,0,1,0,0,1,0,0}, // ATV
  3413. {0,0,0,0,0,0,0,0,0}, // AV
  3414. {0,0,0,0,0,0,0,0,0}, // SV
  3415. {1,0,0,1,0,0,1,0,0}, // MPEG
  3416. {0,0,0,0,0,0,0,0,0}, // HDMI
  3417. {0,0,0,0,0,0,0,0,0}, // SCART_RGB
  3418. {0,0,0,0,0,0,0,0,0}, // YPP_HD
  3419. {1,0,0,1,0,0,1,0,0}, // MPEG_HD
  3420. {0,0,0,0,0,0,0,0,0}, // HDMI_HD
  3421. #if SEPERATE_YPBPR1_YPBPR2
  3422. {0,0,0,0,0,0,0,0,0}, // YPP2_SD
  3423. {0,0,0,0,0,0,0,0,0}, // YPP2_HD
  3424. #endif
  3425. };
  3426. i = 0;
  3427. for(i=0; i<VTAB_MAX_SOURCE; i++)
  3428. {
  3429. pVtabSrcValue= &pHwContext->VtabSrcValue[i];
  3430. memcpy(&pVtabSrcValue->DeinterlaceFilter, &df[i], sizeof(DIN_FILTER));
  3431. }
  3432. #endif
  3433. memset(&pVtab->mDeinterlaceFilter.mDeIN_Fil_Data, 0, sizeof(DEIN_FILTER_DATA));
  3434. }
  3435. void PQ_InitVtabValue(void)
  3436. {
  3437. PQHW_CONTEXT* pHwContext= &PQHwContext;
  3438. VTAB_CMN_VALUE_DEFINE* pVtabCmnValue= &pHwContext->VtabCmnValue;
  3439. // VTAB_SRC_VALUE_DEFINE* pVtabSrcValue;
  3440. /*SHARP_INFO sharp_strong[4]= { //hl,hc,vl,vc
  3441. { 6, -2, 100, 127, {63}, 0, 0}, { 6, -2, 100, 127, {63}, 0, 0},
  3442. { 2, -2, 16, 32, {20}, 0, 0}, { 2, -2, 4, 32, {8}, 0, 0} };
  3443. SHARP_INFO sharp_normal[4]= {
  3444. { 6, -2, 20, 64, {8}, 0, 0}, { 6, -2, 20, 64, {8}, 0, 0},
  3445. { 2, -2, 8, 24, {16}, 0, 0}, { 2, -2, 8, 24, {4}, 0, 0} };
  3446. SHARP_INFO sharp_weak[4]= {
  3447. { 6, -2, 0, 0, {4}, 0, 0}, { 6, -2, 0, 0, {4}, 0, 0},
  3448. { 2, -2, 2, 6, {12}, 0, 0}, { 2, -2, 2, 6, {2}, 0, 0} };
  3449. */
  3450. PEAKING_SETTING pk[3]= {
  3451. {-11, 2, 7, 4}, //SD
  3452. {-6, 12, 2, -2},
  3453. {1, 7, 2, 1}, //HD
  3454. };
  3455. STRENGTH_DEFINE StrengthDefine;
  3456. //DC_STRENGTH_DEFINE DCStrengthDefine;
  3457. UINT8 i, PCSrcIdx;
  3458. CSC_SETTING ColorMatirx[2] = {{{0xffffffff}},{{0xffffffff}}};
  3459. INT32 SharpRatio[6] = {6,8,8,10,8,8};
  3460. DS_SHARP_INFO DSWeak[2] = {{0,0,0,16,1023,118,0,{0},{0}},{0,0,0,16,1023,118,0,{0},{0}}};
  3461. DS_SHARP_INFO DSNormal[2] = {{24,48,48,16,1023,118,0,{64},{128}},{24,48,48,16,1023,118,0,{0},{0}}};
  3462. DS_SHARP_INFO DSStrong[2] = {{36,72,72,16,1023,118,0,{64},{128}},{36,72,72,16,1023,118,0,{0},{0}}};
  3463. UINT8 ucSatGainDefault[16] = {0x4a,0x4c,0x4c,0x53,0x50,0x4b,0x48,0x44,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40};
  3464. UINT32 dwDarkSharpDefault[6] = {0x19000c8, 0x3200258, 0xfa0032, 0x3cf0307, 0x102a1004, 0x4};
  3465. #if 0 //( defined(CONFIG_SUPPORT_ATV_PAL) && defined(CONFIG_LOCATION_IS_CN) )
  3466. //ATV
  3467. df[2].sd_slr_mix_ach= df[2].md_slr_mix_ach= df[2].hd_slr_mix_ach= 2; //2009-06-19 JY,
  3468. df[2].sd_vdi_mad_hlp_en= df[2].md_vdi_mad_hlp_en= df[2].hd_vdi_mad_hlp_en= 0;
  3469. #endif
  3470. //init 601/709 FleshTone and ColorRegion
  3471. pVtabCmnValue->mGmaOpt.pc_no_gamma = 0;
  3472. pVtabCmnValue->ucLoadScartRGBTab = 0;
  3473. memcpy(&pVtabCmnValue->mSharpRatio[0], &SharpRatio,sizeof(DS_SHARP_RATIO) );
  3474. memcpy(&pVtabCmnValue->mSharpRatio[1], &SharpRatio,sizeof(DS_SHARP_RATIO) );
  3475. pVtabCmnValue->iSharpRatio6 = 0;
  3476. pVtabCmnValue->iSharpRatio6_c = 0;
  3477. //init CSC Table
  3478. memcpy(&pVtabCmnValue->mColorSpaceConversionTable[CSC_RGB], ColorSpaceTableRGB, sizeof(CSC_SETTING));
  3479. memcpy(&pVtabCmnValue->mColorSpaceConversionTable[CSC_601], ColorSpaceTableYCC_Full601, sizeof(CSC_SETTING));
  3480. memcpy(&pVtabCmnValue->mColorSpaceConversionTable[CSC_709], ColorSpaceTableYCC_Full709, sizeof(CSC_SETTING));
  3481. memset(pVtabCmnValue->mSatGainCurve.mSatGainCurveSource, 0x0, 20);
  3482. memset(pVtabCmnValue->mSatGainCurve.sat_gb, 0x40, 8*16); // set linier
  3483. memcpy(pVtabCmnValue->mSatGainCurve.sat_gb, ucSatGainDefault, 16); // for compatibility setting before VIPTable v32
  3484. //calc sharpness pivotx,y
  3485. for(i=0; i<4; i++)
  3486. {
  3487. //PQ_CalcPivotxy(&sharp_strong[i]);
  3488. //PQ_CalcPivotxy(&sharp_normal[i]);
  3489. //PQ_CalcPivotxy(&sharp_weak[i]);
  3490. }
  3491. //init nr,mpeg nr strength define
  3492. StrengthDefine.Degree[WEAK-1]= 4;
  3493. StrengthDefine.Degree[MEDIUM-1]= 8;
  3494. StrengthDefine.Degree[STRONG-1]= 12;
  3495. for(i=0; i<VIP_TABLE_GROUPED_NUMBER; i++)
  3496. {
  3497. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].LumaTnrCoring, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  3498. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].LumaTnrStrength, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  3499. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].ChromaTnrCoring, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  3500. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].ChromaTnrStrength, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  3501. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].LumaSnr1Coring, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  3502. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].LumaSnr1Strength, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  3503. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].LumaSnr2Coring, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  3504. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].LumaSnr2Strength, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  3505. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].ChromaSnrCoring, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  3506. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].ChromaSnrStrength, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  3507. //weifeng, need check if still used after 531
  3508. //memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].TnrUltraLowAlpha, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  3509. //memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].Snr1UltraLowCoring, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  3510. //memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].Snr2UltraLowCoring, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  3511. }
  3512. //init nr,mpeg nr strength define
  3513. StrengthDefine.Degree[WEAK-1]= 2;
  3514. StrengthDefine.Degree[MEDIUM-1]= 5;
  3515. StrengthDefine.Degree[STRONG-1]= 8;
  3516. for(i=0; i<VIP_TABLE_GROUPED_NUMBER; i++)
  3517. {
  3518. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].BlockNrCoring, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  3519. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].BlockNrStrength, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  3520. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].MosquitoNrCoring, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  3521. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].MosquitoNrStrength, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  3522. }
  3523. //ultra low en
  3524. for(i=0; i<VIP_TABLE_GROUPED_NUMBER; i++)
  3525. {
  3526. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].TnrUltraLowCtl= 0;
  3527. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].SnrUltraLowCtl= 0;
  3528. }
  3529. //init peaking setting
  3530. for(i=0; i<VIP_TABLE_GROUPED_NUMBER; i++)
  3531. {
  3532. memcpy(&pVtabCmnValue->mPeaking.mPeaking_Data[i], pk, 3*sizeof(PEAKING_SETTING));
  3533. }
  3534. PCSrcIdx = pVtabCmnValue->mDS_Sharpenss.mGroupedIndex[SRC_INDEX_PC];
  3535. StrengthDefine.Degree[WEAK-1]= 0x88a886;
  3536. StrengthDefine.Degree[MEDIUM-1]= 0x88a886;
  3537. StrengthDefine.Degree[STRONG-1]= 0x88a886;
  3538. for(i=0; i<VIP_TABLE_GROUPED_NUMBER; i++)
  3539. {
  3540. //ds sharpness
  3541. memcpy(pVtabCmnValue->mDS_Sharpenss.mDS_Sharpness_Data[i].DSSharpWeak, DSWeak, 2*sizeof(DS_SHARP_INFO));
  3542. memcpy(pVtabCmnValue->mDS_Sharpenss.mDS_Sharpness_Data[i].DSSharpNormal, DSNormal, 2*sizeof(DS_SHARP_INFO));
  3543. memcpy(pVtabCmnValue->mDS_Sharpenss.mDS_Sharpness_Data[i].DSSharpStrong, DSStrong, 2*sizeof(DS_SHARP_INFO));
  3544. //horizontal sharpness 20120724
  3545. memcpy(pVtabCmnValue->mHOR_Sharpenss.mHOR_Sharpness_Data[i].HorSharpWeak, DSWeak, 2*sizeof(DS_SHARP_INFO));
  3546. memcpy(pVtabCmnValue->mHOR_Sharpenss.mHOR_Sharpness_Data[i].HorSharpNormal, DSNormal, 2*sizeof(DS_SHARP_INFO));
  3547. memcpy(pVtabCmnValue->mHOR_Sharpenss.mHOR_Sharpness_Data[i].HorSharpStrong, DSStrong, 2*sizeof(DS_SHARP_INFO));
  3548. memset(&pVtabCmnValue->mHOR_Sharpenss.mHOR_Sharpness_Data[i].HorSharpWeak[0], 0, 3*sizeof(INT32));
  3549. memset(&pVtabCmnValue->mHOR_Sharpenss.mHOR_Sharpness_Data[i].HorSharpWeak[1], 0, 3*sizeof(INT32));
  3550. memset(&pVtabCmnValue->mHOR_Sharpenss.mHOR_Sharpness_Data[i].HorSharpNormal[0], 0, 3*sizeof(INT32));
  3551. memset(&pVtabCmnValue->mHOR_Sharpenss.mHOR_Sharpness_Data[i].HorSharpNormal[1], 0, 3*sizeof(INT32));
  3552. memset(&pVtabCmnValue->mHOR_Sharpenss.mHOR_Sharpness_Data[i].HorSharpStrong[0], 0, 3*sizeof(INT32));
  3553. memset(&pVtabCmnValue->mHOR_Sharpenss.mHOR_Sharpness_Data[i].HorSharpStrong[1], 0, 3*sizeof(INT32));
  3554. //sharpness filter
  3555. if(i == PCSrcIdx) // pc source
  3556. {
  3557. pVtabCmnValue->mDS_Sharpenss.mDS_Sharpness_Data[i].DS_Sharp_Angle = 0x00020202;
  3558. }
  3559. else
  3560. {
  3561. pVtabCmnValue->mDS_Sharpenss.mDS_Sharpness_Data[i].DS_Sharp_Angle = 0x00040404;
  3562. }
  3563. memcpy(&pVtabCmnValue->mDS_Sharpenss.mDS_Sharpness_Data[i].SlrSharpRatio, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  3564. memcpy(&pVtabCmnValue->mDS_Sharpenss.mDS_Sharpness_Data[i].DSSharpDark,dwDarkSharpDefault, sizeof(DARK_SHARP_INFO));
  3565. memcpy(&pVtabCmnValue->mHOR_Sharpenss.mHOR_Sharpness_Data[i].HorSharpDark,dwDarkSharpDefault, sizeof(DARK_SHARP_INFO));
  3566. }
  3567. //memcpy(pVtabCmnValue->, MiddleRegion, 4*sizeof(CR_MSETTING) );
  3568. for(i=0; i<VIP_TABLE_GROUPED_NUMBER; i++)
  3569. {
  3570. //init reg range
  3571. pVtabCmnValue->mRange.mRange_Data[i].BrightnessRange.min= -64;
  3572. pVtabCmnValue->mRange.mRange_Data[i].BrightnessRange.max= 64;
  3573. pVtabCmnValue->mRange.mRange_Data[i].BrightnessRange.middle= 0;
  3574. pVtabCmnValue->mRange.mRange_Data[i].ContrastRange.min= 0x20;
  3575. pVtabCmnValue->mRange.mRange_Data[i].ContrastRange.max= 0x60;
  3576. pVtabCmnValue->mRange.mRange_Data[i].ContrastRange.middle= 0x40;
  3577. pVtabCmnValue->mRange.mRange_Data[i].SaturationRange.min= 0;
  3578. pVtabCmnValue->mRange.mRange_Data[i].SaturationRange.max= 127;
  3579. pVtabCmnValue->mRange.mRange_Data[i].SaturationRange.middle= 64;
  3580. pVtabCmnValue->mRange.mRange_Data[i].HueRange.min= 0;
  3581. pVtabCmnValue->mRange.mRange_Data[i].HueRange.max= 32;
  3582. pVtabCmnValue->mRange.mRange_Data[i].HueRange.middle= 16;
  3583. pVtabCmnValue->mRange.mRange_Data[i].ColorTempGainRange.min= 0;
  3584. pVtabCmnValue->mRange.mRange_Data[i].ColorTempGainRange.max= 127;
  3585. pVtabCmnValue->mRange.mRange_Data[i].ColorTempGainRange.middle= 64;
  3586. pVtabCmnValue->mRange.mRange_Data[i].ColorTempOffsetRange.min= -128;
  3587. pVtabCmnValue->mRange.mRange_Data[i].ColorTempOffsetRange.max= 127;
  3588. pVtabCmnValue->mRange.mRange_Data[i].ColorTempOffsetRange.middle= 0;
  3589. //init color region contrl by source
  3590. //for(j = 0; j <4; j++)
  3591. //pVtabSrcValue->ColorRegionSrcCtl[j] = 0x80; //ctl disable
  3592. memcpy(pVtabCmnValue->mColorMatrix.mSrcColorMatrix[i].mSrcColorMatrix, ColorMatirx, 2*sizeof(CSC_SETTING));
  3593. //init dynamic contrast
  3594. /*
  3595. DCStrengthDefine.Degree[WEAK-1]=0x00000119;
  3596. DCStrengthDefine.Degree[MEDIUM-1]=0x00000134;
  3597. DCStrengthDefine.Degree[STRONG-1]=0x0000014c;
  3598. DCStrengthDefine.Degree[WEAK-1]=0x011900e8;
  3599. DCStrengthDefine.Degree[MEDIUM-1]=0x013400d5;
  3600. DCStrengthDefine.Degree[STRONG-1]=0x014c00c4;
  3601. DCStrengthDefine.Degree[WEAK-1]=0x00108080;
  3602. DCStrengthDefine.Degree[MEDIUM-1]=0x00108080;
  3603. DCStrengthDefine.Degree[STRONG-1]=0x00108080;
  3604. */
  3605. memset(&pVtabCmnValue->mRange.mRange_Data[i].BrightnessRangeExt, 0, sizeof(REG_RANGE_EXT)); // 0 -> disable default
  3606. memset(&pVtabCmnValue->mRange.mRange_Data[i].ContrastRangeExt, 0, sizeof(REG_RANGE_EXT)); // 0 -> disable default
  3607. memset(&pVtabCmnValue->mRange.mRange_Data[i].SaturationRangeExt, 0, sizeof(REG_RANGE_EXT)); // 0 -> disable default
  3608. }
  3609. pVtabCmnValue->SlrLowAngleOrMBWDisable = 0x7;
  3610. //initialize to avoid kernal panic before assign the pointer
  3611. pHwContext->CurColorMatrix=&pVtabCmnValue->mColorSpaceConversionTable[CSC_601];
  3612. }
  3613. //================================================================================
  3614. // function name : PQ_InitialTable()
  3615. // input parameter : none
  3616. // output parameter : none
  3617. // purpose : setup PQ initial value or fix setting
  3618. // return :
  3619. void PQ_InitialTable(void)
  3620. {
  3621. PQHW_CONTEXT* pHwContext= &PQHwContext;
  3622. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  3623. pHwContext->LoadPQTable=0;
  3624. #ifdef DYNAMIC_BACKLIGHT
  3625. pHwContext->ucLocationMode = STOREMODE;
  3626. pHwContext->ucDynamicBacklightMode=0;
  3627. PQ_InitDynamicBackLight();
  3628. #endif //#ifdef DYNAMIC_BACKLIGHT
  3629. pHwContext->CurColorMatrix = NULL;
  3630. pHwContext->pCurVtabSrcValue= &pHwContext->VtabSrcValue[0];
  3631. pMenuValue->bNoGamma = FALSE; // VIP_SetupGammaTable(ENABLE, 0);
  3632. pHwContext->nColorSpaceMode= PQ_COLOR_SPACE_NONE;
  3633. pHwContext->bDynamicSaturation= DISABLE;
  3634. pHwContext->bEnableColorProcess= TRUE;
  3635. pHwContext->bFadeEn = FALSE;
  3636. pHwContext->bPWMOff = FALSE;
  3637. pHwContext->bIsMenuOpen = FALSE;
  3638. pHwContext->bIsPureColorPattern = FALSE;
  3639. pHwContext->PqPatch.PeakLtiPatch = PEAKLTI_NON_PATCH;
  3640. pHwContext->PqPatch.DpyPeakingPatch = DPY_PEAKING_NON_PATCH;
  3641. pHwContext->PqPatch.DsSharpnessPatch = DS_SHARPNESS_NON_PATCH;
  3642. pHwContext->PqPatch.TnrClampPatch = TNR_CLAMP_DEFAULT;
  3643. pHwContext->PqPatch.Post2DPatch = POST_2D_SHARPNESS_DEFAULT;
  3644. pHwContext->PqPatch.PostDLTIPatch = POST_DLTI_DEFAULT;
  3645. pHwContext->PqPatch.DPYSharpnessPatch = DPY_SHARPNESS_DEFAULT;
  3646. pHwContext->bIsPattern_DIG_ADC2 = FALSE;
  3647. pHwContext->bGammaChange=FALSE;
  3648. memset(&pHwContext->mSharp_PREDCTI_Reserve, 0, sizeof(SHARP_PREDCTI_RESERVE));
  3649. memset(&pHwContext->mSharp_POSTDCTI_Reserve, 0, sizeof(SHARP_POSTDCTI_RESERVE));
  3650. memset(&pHwContext->mSharp_PREDLTI_Reserve, 0, sizeof(SHARP_PREDLTI_RESERVE));
  3651. memset(&pHwContext->mSharp_POSTDLTI_Reserve, 0, sizeof(SHARP_POSTDLTI_RESERVE));
  3652. memset(&pHwContext->mSharp_POST2D_Reserve, 0, sizeof(SHARP_POST2D_RESERVE));
  3653. spin_lock_init(&pHwContext->Spin_PresetContrast);
  3654. PQ_InitVtabValue();
  3655. //default menu value����
  3656. pMenuValue->iContrast = pHwContext->iCurrContrastValue = 1024;
  3657. //default menu value����
  3658. PQ_RegisterWrite(VIP_reg_dpy_dither_sel, 0);
  3659. PQ_DS_Init();
  3660. PQ_NR_Init();
  3661. PQ_FleshTone_Init();
  3662. PQ_HW_Initial();
  3663. PQ_DefaultSetting();
  3664. #ifdef CONFIG_PANEL_LM201WE3_TLF5_1680X1050__S2TEK_IS_DEFAULT
  3665. //OSD & GAMMA swap enable in 531
  3666. PQ_RegisterWrite(VIP_reg_osd_after_gamma, 0);
  3667. #else
  3668. PQ_RegisterWrite(VIP_reg_osd_after_gamma, 1);
  3669. #endif
  3670. pHwContext->CVD2_store_nr_setting=0;
  3671. //PQ_RegisterWrite(VIP_reg_dpy_round, 0x0);
  3672. //20140624 HD VideoBook Blue pettern
  3673. //HiVi Case15 Blue+Gray pattern, junction with black edges
  3674. PQ_RegisterWrite(VIP_reg_dpy_ye0_idx_sat, 0x9);
  3675. if(WQ_Struct_NRAdjust==NULL)
  3676. {
  3677. WQ_Struct_NRAdjust = create_singlethread_workqueue("NR_Adjust_Workqueue");
  3678. INIT_WORK(&WQ_NRAdjust,(work_func_t)PQ_AdjustNr);
  3679. }
  3680. if(WQ_Struct_SWDC==NULL)
  3681. {
  3682. WQ_Struct_SWDC = create_singlethread_workqueue("SWDC_Workqueue");
  3683. INIT_WORK(&WQ_SWDC,(work_func_t)PQ_SW_DynamicContrast_SceneChangeDetect_ISR);
  3684. }
  3685. if(WQ_Struct_ColorBarDetect==NULL)
  3686. {
  3687. WQ_Struct_ColorBarDetect = create_singlethread_workqueue("ColorBarDetect_Workqueue");
  3688. INIT_WORK(&WQ_ColorBarDetect,(work_func_t)PQ_ColorBarDetect);
  3689. }
  3690. }
  3691. //****************************************************************************
  3692. //
  3693. // Function : PQ_Brightness
  3694. // Params : iValue (-128~+127)
  3695. // Description:
  3696. // Returns : void
  3697. //****************************************************************************
  3698. void PQ_Brightness(UINT8 bReset, INT32 iValue) //-128~+127 => -64~64
  3699. {
  3700. PQHW_CONTEXT* pHwContext= &PQHwContext;
  3701. static UINT8 bStart = FALSE;
  3702. if(bReset)
  3703. {
  3704. bStart = TRUE;
  3705. return;
  3706. }
  3707. if(bStart)
  3708. {
  3709. bStart = FALSE;
  3710. if( pHwContext->bEnableColorProcess==FALSE )
  3711. iValue= 0;
  3712. //iValue -=512;
  3713. iValue -=BRIGHTNESS_OFFSET;
  3714. PQDebugPrint("%s: iValue=%d\n", __FUNCTION__, iValue);
  3715. pHwContext->iBrightness=iValue;
  3716. PQ_ColorMatrixComp(TRUE);
  3717. PQ_PureColorControl((iValue-1)/21, 1);
  3718. }
  3719. }
  3720. void PQ_ColorMatrixSetup(UINT8 bReset, UINT8 ucNum)
  3721. {
  3722. PQHW_CONTEXT* pHwContext= &PQHwContext;
  3723. INT32 iCSC_AfterHueSat = 50;
  3724. INT32 iCSC_Value;
  3725. LONG LONG INT32 lliTmpValue;
  3726. COLOR_MATRIX_INT *pCurMatrix = (COLOR_MATRIX_INT *)pHwContext->CurColorMatrix->CSC_Value;
  3727. static UINT16 usNum = 0;
  3728. static UINT8 bStart = FALSE;
  3729. #ifdef CONFIG_WHITE_BALANCE_ADJUST_IN_DPY_MATRIX
  3730. INT32 *piGain = &pHwContext->iRGain;
  3731. #endif
  3732. if(!pHwContext->CurColorMatrix)
  3733. return;
  3734. if(bReset)
  3735. {
  3736. usNum |= 1<<ucNum;
  3737. bStart = TRUE;
  3738. return;
  3739. }
  3740. if(bStart)
  3741. {
  3742. INT32 i;
  3743. bStart = FALSE;
  3744. for(i=0;i<9;i++)
  3745. {
  3746. if(((usNum>>i)&1) == 1)
  3747. {
  3748. ucNum = i;
  3749. if (ucNum%3)
  3750. {
  3751. switch(ucNum%3)
  3752. {
  3753. case 1:
  3754. iCSC_AfterHueSat = pCurMatrix[ucNum].iValue*NewHueSetting[pHwContext->iHue].cosine-
  3755. pCurMatrix[ucNum+1].iValue*NewHueSetting[pHwContext->iHue].sine;
  3756. break;
  3757. case 2:
  3758. iCSC_AfterHueSat = pCurMatrix[ucNum].iValue*NewHueSetting[pHwContext->iHue].cosine+
  3759. pCurMatrix[ucNum-1].iValue*NewHueSetting[pHwContext->iHue].sine;
  3760. break;
  3761. }
  3762. iCSC_AfterHueSat *= pHwContext->iSaturation;
  3763. }
  3764. else
  3765. iCSC_AfterHueSat = pCurMatrix[ucNum].iValue<<(8+COLOR_MATRIX_GAIN_BIT_SYSTEM);
  3766. #ifdef CONFIG_WHITE_BALANCE_ADJUST_IN_DPY_MATRIX
  3767. lliTmpValue = pHwContext->iContrast * (LONG LONG INT32)piGain[ucNum/3];
  3768. #else
  3769. lliTmpValue = pHwContext->iContrast * 1024;
  3770. #endif
  3771. lliTmpValue = lliTmpValue * iCSC_AfterHueSat;
  3772. lliTmpValue = lliTmpValue >> (COLOR_MATRIX_GAIN_BIT_SYSTEM+COLOR_MATRIX_GAIN_BIT_SYSTEM+COLOR_MATRIX_GAIN_BIT_SYSTEM+8);
  3773. iCSC_Value = lliTmpValue;
  3774. //PQ_ADVANCE_HWPrint("%s: contrast = %d , gain = %d, matrix = %d ",__FUNCTION__,pHwContext->iContrast , iGain , pHwContext->CurColorMatrix->CSC_Value[ucNum]);
  3775. //PQ_ADVANCE_HWPrint("%s: matrix[%d] = %d",__FUNCTION__, ucNum, iTmpValue);
  3776. iCSC_Value = min(8191, max(iCSC_Value, -8192));
  3777. PQ_RegisterWrite(VIP_reg_dpy_matrix_a11 + ucNum*4 , pHwContext->bEnableColorProcess?iCSC_Value:pCurMatrix[ucNum].iValue);
  3778. usNum &= ~(1<<i);
  3779. }
  3780. }
  3781. }
  3782. }
  3783. //****************************************************************************
  3784. //
  3785. // Function : PQ_Contrast
  3786. // Params :
  3787. // Description:
  3788. // Returns : void
  3789. //****************************************************************************
  3790. void PQ_Contrast(UINT8 bReset, INT32 iValue) // 0 ~ 127 => 0x20~0x60
  3791. {
  3792. PQHW_CONTEXT* pHwContext= &PQHwContext;
  3793. INT32 i;
  3794. static UINT8 bStart = FALSE;
  3795. if(!PQ_IsFadeEn())//if fade effect, do contrast
  3796. {
  3797. if(bReset)
  3798. {
  3799. bStart = TRUE;
  3800. return;
  3801. }
  3802. }
  3803. if(bStart || PQ_IsFadeEn())
  3804. {
  3805. bStart = FALSE;
  3806. if( pHwContext->bEnableColorProcess==FALSE)
  3807. iValue=64;
  3808. if(PQ_IsFadeEn()==FALSE) //backup for fade in/out
  3809. pHwContext->iCurrContrastValue= iValue;
  3810. pHwContext->iContrast=iValue<<(COLOR_MATRIX_GAIN_BIT_SYSTEM-COLOR_MATRIX_GAIN_OSD_BIT_SYSTEM);
  3811. for(i=0; i<9 ;i++)
  3812. PQ_ColorMatrixSetup(TRUE, i);
  3813. PQ_ColorMatrixComp(TRUE);
  3814. PQ_PureColorControl((iValue-1024+1)/10, 2);
  3815. }
  3816. }
  3817. //****************************************************************************
  3818. // Function : PQ_Sharpness_Control_In_3D
  3819. // Params : bStatus : 0 = stop sharpness and NR function, 1 = resume sharpness and NR fnction
  3820. // Description: (1)in 3D mode, disable sharpness_2D and bypass NR
  3821. // Returns : void
  3822. //****************************************************************************
  3823. void PQ_Sharpness_Control_In_3D(UINT8 bStatus)
  3824. {
  3825. if(bStatus == DISABLE)
  3826. {
  3827. PQ_RegisterWrite(VIP_reg_slr_2d_sharp_en, DISABLE);
  3828. PQ_RegisterWrite(VIP_reg_slr_snr_bypass, ENABLE);
  3829. PQ_RegisterWrite(VIP_reg_slr_s_snr_bypass, ENABLE);
  3830. }
  3831. else
  3832. {
  3833. PQHW_CONTEXT* pHwContext= &PQHwContext;
  3834. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  3835. SHARP_POST2DSHARPNESS* pPost2DSharpness = &pVtab->mSharpness_Post2DSharpness;
  3836. SHARP_POST2DSHARPNESS_DATA* pPost2DSharpData;
  3837. UINT8 ucCurrSrcIndex, ucTableIndex;
  3838. ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  3839. ucTableIndex = pPost2DSharpness->mGroupedIndex[ucCurrSrcIndex];
  3840. pPost2DSharpData = &pPost2DSharpness->mPost2DSharpData[ucTableIndex];
  3841. if(_VIP_GetPreviewWndowStatus())
  3842. PQ_RegisterWrite(VIP_reg_slr_2d_sharp_en,0);
  3843. else
  3844. PQ_RegisterWrite(VIP_reg_slr_2d_sharp_en, pPost2DSharpData->iPost2DSharpEnable);
  3845. PQ_RegisterWrite(VIP_reg_slr_snr_bypass, DISABLE);
  3846. PQ_RegisterWrite(VIP_reg_slr_s_snr_bypass, DISABLE);
  3847. }
  3848. }
  3849. void PQ_Sharpness_PREDCTI(BOOL bReset, UINT8 ucValue)
  3850. {
  3851. PQHW_CONTEXT* pHwContext= &PQHwContext;
  3852. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  3853. SHARP_PREDCTI* pSHARP_PREDCTI = &pVtab->mSharpness_PreDCTI;
  3854. SHARP_PREDCTI_DATA* pSHARP_PREDCTI_DATA;
  3855. SHARP_PREDCTI_RESERVE* pSharp_PRECTI_Reserve;
  3856. UINT8 ucCurrSrcIndex, ucTableIndex;
  3857. SHARP_PREDCTI_EXT *pSharp_PreDCTI_Ext;
  3858. static UINT32 dwPreDCTIFacReg[3] = {VIP_reg_slr_dcti_gain_0_pre,VIP_reg_slr_dcti_gain_1_pre,VIP_reg_slr_dcti_gain_2_pre};
  3859. static UINT32 dwPreDCTITHReg[2] = {VIP_reg_slr_dcti_gain_th0_pre,VIP_reg_slr_dcti_gain_th1_pre};
  3860. static UINT32 dwPreDCTISlopeReg[2] = {VIP_reg_slr_dcti_gain_slope0_pre,VIP_reg_slr_dcti_gain_slope1_pre};
  3861. static UINT8 bStart = FALSE;
  3862. ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  3863. if ((ucCurrSrcIndex >= SRC_INDEX_UNKNOWN))
  3864. {
  3865. PQDebugPrint("%s: SrcIndex (%d) unknown/invalid, pLUTTable->SrcCount (%d)!", __FUNCTION__, ucCurrSrcIndex,pLUTTable->SrcCount);
  3866. return;
  3867. }
  3868. ucTableIndex = pSHARP_PREDCTI->mGroupedIndex[ucCurrSrcIndex];
  3869. pSHARP_PREDCTI_DATA = &pSHARP_PREDCTI->mPreDCTIData[ucTableIndex];
  3870. pSharp_PRECTI_Reserve = &pHwContext->mSharp_PREDCTI_Reserve;
  3871. pSharp_PreDCTI_Ext = &pVtab->mSharp_PreDCTI_Ext[ucTableIndex];
  3872. if(bReset)
  3873. {
  3874. bStart = TRUE;
  3875. if( ucValue>127 )
  3876. ucValue= 127;
  3877. PQDebugPrint("%s:ucValue=%d", __FUNCTION__, ucValue);
  3878. if( ucValue<64 )
  3879. {
  3880. pSharp_PRECTI_Reserve->iTagetFac0 = pSHARP_PREDCTI_DATA->iGain0[PQ_SHARPNESS_0PERCENT]+ (pSHARP_PREDCTI_DATA->iGain0[PQ_SHARPNESS_50PERCENT] - pSHARP_PREDCTI_DATA->iGain0[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3881. pSharp_PRECTI_Reserve->iTagetFac1 = pSHARP_PREDCTI_DATA->iGain1[PQ_SHARPNESS_0PERCENT]+ (pSHARP_PREDCTI_DATA->iGain1[PQ_SHARPNESS_50PERCENT] - pSHARP_PREDCTI_DATA->iGain1[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3882. pSharp_PRECTI_Reserve->iTagetFac2 = pSHARP_PREDCTI_DATA->iGain2[PQ_SHARPNESS_0PERCENT]+ (pSHARP_PREDCTI_DATA->iGain2[PQ_SHARPNESS_50PERCENT] - pSHARP_PREDCTI_DATA->iGain2[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3883. pSharp_PRECTI_Reserve->iTagetTh0 = pSHARP_PREDCTI_DATA->iTh0[PQ_SHARPNESS_0PERCENT]+ (pSHARP_PREDCTI_DATA->iTh0[PQ_SHARPNESS_50PERCENT] - pSHARP_PREDCTI_DATA->iTh0[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3884. pSharp_PRECTI_Reserve->iTagetTh1 = pSHARP_PREDCTI_DATA->iTh1[PQ_SHARPNESS_0PERCENT]+ (pSHARP_PREDCTI_DATA->iTh1[PQ_SHARPNESS_50PERCENT] - pSHARP_PREDCTI_DATA->iTh1[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3885. pSharp_PRECTI_Reserve->iTagetSlp0 = pSHARP_PREDCTI_DATA->iSlope0[PQ_SHARPNESS_0PERCENT]+ (pSHARP_PREDCTI_DATA->iSlope0[PQ_SHARPNESS_50PERCENT] - pSHARP_PREDCTI_DATA->iSlope0[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3886. pSharp_PRECTI_Reserve->iTagetSlp1 = pSHARP_PREDCTI_DATA->iSlope1[PQ_SHARPNESS_0PERCENT]+ (pSHARP_PREDCTI_DATA->iSlope1[PQ_SHARPNESS_50PERCENT] - pSHARP_PREDCTI_DATA->iSlope1[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3887. pSharp_PRECTI_Reserve->iTargetGainLpTap = pSharp_PreDCTI_Ext->iGain_Lp[PQ_SHARPNESS_0PERCENT]+ ( pSharp_PreDCTI_Ext->iGain_Lp[PQ_SHARPNESS_50PERCENT] - pSharp_PreDCTI_Ext->iGain_Lp[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3888. pSharp_PRECTI_Reserve->iTagetSlpLp = pSharp_PreDCTI_Ext->iSlp_Lp[PQ_SHARPNESS_0PERCENT]+ ( pSharp_PreDCTI_Ext->iSlp_Lp[PQ_SHARPNESS_50PERCENT] - pSharp_PreDCTI_Ext->iSlp_Lp[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3889. }
  3890. else
  3891. {
  3892. //from normal to strong
  3893. ucValue-= 64;
  3894. pSharp_PRECTI_Reserve->iTagetFac0 = pSHARP_PREDCTI_DATA->iGain0[PQ_SHARPNESS_50PERCENT]+ (pSHARP_PREDCTI_DATA->iGain0[PQ_SHARPNESS_100PERCENT] - pSHARP_PREDCTI_DATA->iGain0[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3895. pSharp_PRECTI_Reserve->iTagetFac1 = pSHARP_PREDCTI_DATA->iGain1[PQ_SHARPNESS_50PERCENT]+ (pSHARP_PREDCTI_DATA->iGain1[PQ_SHARPNESS_100PERCENT] - pSHARP_PREDCTI_DATA->iGain1[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3896. pSharp_PRECTI_Reserve->iTagetFac2 = pSHARP_PREDCTI_DATA->iGain2[PQ_SHARPNESS_50PERCENT]+ (pSHARP_PREDCTI_DATA->iGain2[PQ_SHARPNESS_100PERCENT] - pSHARP_PREDCTI_DATA->iGain2[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3897. pSharp_PRECTI_Reserve->iTagetTh0 = pSHARP_PREDCTI_DATA->iTh0[PQ_SHARPNESS_50PERCENT]+ (pSHARP_PREDCTI_DATA->iTh0[PQ_SHARPNESS_100PERCENT] - pSHARP_PREDCTI_DATA->iTh0[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3898. pSharp_PRECTI_Reserve->iTagetTh1 = pSHARP_PREDCTI_DATA->iTh1[PQ_SHARPNESS_50PERCENT]+ (pSHARP_PREDCTI_DATA->iTh1[PQ_SHARPNESS_100PERCENT] - pSHARP_PREDCTI_DATA->iTh1[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3899. pSharp_PRECTI_Reserve->iTagetSlp0 = pSHARP_PREDCTI_DATA->iSlope0[PQ_SHARPNESS_50PERCENT]+ (pSHARP_PREDCTI_DATA->iSlope0[PQ_SHARPNESS_100PERCENT] - pSHARP_PREDCTI_DATA->iSlope0[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3900. pSharp_PRECTI_Reserve->iTagetSlp1 = pSHARP_PREDCTI_DATA->iSlope1[PQ_SHARPNESS_50PERCENT]+ (pSHARP_PREDCTI_DATA->iSlope1[PQ_SHARPNESS_100PERCENT] - pSHARP_PREDCTI_DATA->iSlope1[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3901. pSharp_PRECTI_Reserve->iTargetGainLpTap = pSharp_PreDCTI_Ext->iGain_Lp[PQ_SHARPNESS_50PERCENT]+ (pSharp_PreDCTI_Ext->iGain_Lp[PQ_SHARPNESS_100PERCENT] - pSharp_PreDCTI_Ext->iGain_Lp[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3902. pSharp_PRECTI_Reserve->iTagetSlpLp = pSharp_PreDCTI_Ext->iSlp_Lp[PQ_SHARPNESS_50PERCENT]+ (pSharp_PreDCTI_Ext->iSlp_Lp[PQ_SHARPNESS_100PERCENT] - pSharp_PreDCTI_Ext->iSlp_Lp[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3903. }
  3904. pSharp_PRECTI_Reserve->iTargetScale = pSHARP_PREDCTI_DATA->iScale[PQ_SHARPNESS_50PERCENT];
  3905. pSharp_PRECTI_Reserve->iTargetGainTap = pSHARP_PREDCTI_DATA->iGainTap[PQ_SHARPNESS_50PERCENT];
  3906. pSharp_PRECTI_Reserve->iTargetShootTap = pSHARP_PREDCTI_DATA->iShootTap[PQ_SHARPNESS_50PERCENT];
  3907. return;
  3908. }
  3909. if(bStart)
  3910. {
  3911. bStart = FALSE;
  3912. if( pHwContext->bEnableColorProcess==FALSE )
  3913. {
  3914. PQ_RegisterWrite(dwPreDCTIFacReg[0], 0);
  3915. PQ_RegisterWrite(dwPreDCTIFacReg[1], 0);
  3916. PQ_RegisterWrite(dwPreDCTIFacReg[2], 0);
  3917. return;
  3918. }
  3919. #ifdef CONFIG_APPLY_DIFFERENT_SHARPNESS_SETTING_IN_PANEL_INVERT
  3920. if(VIP_GetFlipMode()==HV_FLIP || VIP_GetFlipMode() == H_FLIP || VIP_GetFlipMode() == V_FLIP || VIP_GetPanelInvert())
  3921. {
  3922. /* Modify sharpness setting in invert panel here */
  3923. }
  3924. else
  3925. {
  3926. /* Modify another sharpness setting in regular panel here */
  3927. }
  3928. #else
  3929. /* Check different setting status and remove same setting item to here */
  3930. #endif
  3931. if(VIP_IsSourceDTV() || !PQ_IsColorBar() || VIP_RunDVIMode() || VIP_IsPCSource())
  3932. {
  3933. PQ_RegisterWrite(VIP_reg_slr_dcti_en_pre, pSHARP_PREDCTI_DATA->iPreDCTIEnable);
  3934. PQ_RegisterWrite(VIP_reg_slr_pre_icp_en_pre, pSHARP_PREDCTI_DATA->iPreChromaFilterEnable);
  3935. PQ_RegisterWrite(VIP_reg_slr_pre_icp_alpha_pre, pSHARP_PREDCTI_DATA->iPreChromaFilterLevel);
  3936. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_pre, pSharp_PRECTI_Reserve->iTargetScale);
  3937. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_pre, pSharp_PRECTI_Reserve->iTargetGainTap);
  3938. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_pre, pSharp_PRECTI_Reserve->iTargetShootTap);
  3939. }
  3940. PQ_RegisterWrite(VIP_reg_slr_dcti_c1_pre, pSHARP_PREDCTI_DATA->icoef[0]);
  3941. PQ_RegisterWrite(VIP_reg_slr_dcti_c2_pre, pSHARP_PREDCTI_DATA->icoef[1]);
  3942. PQ_RegisterWrite(VIP_reg_slr_dcti_c3_pre, pSHARP_PREDCTI_DATA->icoef[2]);
  3943. if (VIP_IsPCSource() && VIP_GetInputVSize() <= 550) //#42350 & #42784 & #51240
  3944. {
  3945. PQ_RegisterWrite(VIP_reg_slr_pre_icp_en_pre, 0x00);
  3946. PQ_RegisterWrite(VIP_reg_slr_post_icp_en_pre, 0x01);
  3947. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_pre, 0x01);
  3948. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_pre, 0x02);
  3949. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_pre, 0x02);
  3950. PQ_RegisterWrite(VIP_reg_slr_dcti_c1_pre, 0xfa3);
  3951. PQ_RegisterWrite(VIP_reg_slr_dcti_c2_pre, 0xed1);
  3952. PQ_RegisterWrite(VIP_reg_slr_dcti_c3_pre, 0xfa3);
  3953. }
  3954. else if(VIP_IsPCSource() && VIP_GetInputVSize()>700 && VIP_GetInputVSize()<800) //#51253
  3955. {
  3956. PQ_RegisterWrite(VIP_reg_slr_pre_icp_en_pre, 0x01);
  3957. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_pre, 0x01);
  3958. PQ_RegisterWrite(VIP_reg_slr_dcti_c1_pre, 0xfa3);
  3959. PQ_RegisterWrite(VIP_reg_slr_dcti_c2_pre, 0xed1);
  3960. PQ_RegisterWrite(VIP_reg_slr_dcti_c3_pre, 0xfa3);
  3961. }
  3962. else if (VIP_IsPCSource() && VIP_GetInputHSize()==1440 && VIP_GetInputVSize()==900 && VIP_GetPanelWidth()==1366 && VIP_GetPanelHeight()==768)
  3963. {
  3964. PQ_RegisterWrite(VIP_reg_slr_pre_icp_en_pre, 0x01); //#51258
  3965. PQ_RegisterWrite(VIP_reg_slr_pre_icp_alpha_pre, 0x00);
  3966. }
  3967. else if (VIP_IsPCSource() && VIP_GetInputHSize()==1920 && VIP_GetInputVSize()==1080)
  3968. {
  3969. PQ_RegisterWrite(VIP_reg_slr_pre_icp_en_pre, 0x01); //#52129
  3970. }
  3971. if(VIP_GetUserSource()==SOURCE_HDMI || VIP_IsPCSource())
  3972. {
  3973. // w422 set to 0 represent do low pass, or it will has issue 50186
  3974. if(PQ_RegisterRead(VIP_reg_slr_dcti_en_pre)==0 && PQ_RegisterRead(VIP_reg_slr_pre_icp_en_pre)==0)
  3975. PQ_RegisterWrite(VIP_reg_gfx_w422,0);
  3976. }
  3977. PQ_RegisterWrite(VIP_reg_slr_post_icp_en_pre, pSHARP_PREDCTI_DATA->iPostChromaFilterEnable);
  3978. PQ_RegisterWrite(dwPreDCTIFacReg[0], pSharp_PRECTI_Reserve->iTagetFac0);
  3979. PQ_RegisterWrite(dwPreDCTIFacReg[1], pSharp_PRECTI_Reserve->iTagetFac1);
  3980. PQ_RegisterWrite(dwPreDCTIFacReg[2], pSharp_PRECTI_Reserve->iTagetFac2);
  3981. PQ_RegisterWrite(dwPreDCTITHReg[0], pSharp_PRECTI_Reserve->iTagetTh0);
  3982. PQ_RegisterWrite(dwPreDCTITHReg[1], pSharp_PRECTI_Reserve->iTagetTh1);
  3983. PQ_RegisterWrite(dwPreDCTISlopeReg[0], pSharp_PRECTI_Reserve->iTagetSlp0);
  3984. PQ_RegisterWrite(dwPreDCTISlopeReg[1], pSharp_PRECTI_Reserve->iTagetSlp1);
  3985. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_lp_pre, pSharp_PRECTI_Reserve->iTargetGainLpTap);
  3986. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_slope_lp_pre, pSharp_PRECTI_Reserve->iTagetSlpLp);
  3987. }
  3988. }
  3989. void PQ_Sharpness_POSTDCTI(BOOL bReset,UINT8 ucValue)
  3990. {
  3991. PQHW_CONTEXT* pHwContext= &PQHwContext;
  3992. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  3993. SHARP_POSTDCTI* pSHARP_POSTDCTI = &pVtab->mSharpness_PostDCTI;
  3994. SHARP_POSTDCTI_DATA* pPostDCTIData;
  3995. SHARP_POSTDCTI_RESERVE *pSharp_POSTDCTI_Reserve;
  3996. UINT8 ucCurrSrcIndex, ucTableIndex;
  3997. static UINT8 bStart = FALSE;
  3998. ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  3999. if ((ucCurrSrcIndex >= SRC_INDEX_UNKNOWN))
  4000. {
  4001. PQDebugPrint("%s: SrcIndex (%d) unknown/invalid, pLUTTable->SrcCount (%d)!", __FUNCTION__, ucCurrSrcIndex,pLUTTable->SrcCount);
  4002. return;
  4003. }
  4004. ucTableIndex = pSHARP_POSTDCTI->mGroupedIndex[ucCurrSrcIndex];
  4005. pPostDCTIData = &pSHARP_POSTDCTI->mPostDCTIData[ucTableIndex];
  4006. pSharp_POSTDCTI_Reserve = &pHwContext->mSharp_POSTDCTI_Reserve;
  4007. if(bReset)
  4008. {
  4009. bStart = TRUE;
  4010. if( ucValue>127 )
  4011. ucValue= 127;
  4012. PQDebugPrint("%s:ucValue=%d", __FUNCTION__, ucValue);
  4013. if( ucValue<64 )
  4014. {
  4015. pSharp_POSTDCTI_Reserve->iTagetFac0 = pPostDCTIData->iGain0[PQ_SHARPNESS_0PERCENT]+ (pPostDCTIData->iGain0[PQ_SHARPNESS_50PERCENT] - pPostDCTIData->iGain0[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4016. pSharp_POSTDCTI_Reserve->iTagetFac1 = pPostDCTIData->iGain1[PQ_SHARPNESS_0PERCENT]+ (pPostDCTIData->iGain1[PQ_SHARPNESS_50PERCENT] - pPostDCTIData->iGain1[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4017. pSharp_POSTDCTI_Reserve->iTagetFac2 = pPostDCTIData->iGain2[PQ_SHARPNESS_0PERCENT]+ (pPostDCTIData->iGain2[PQ_SHARPNESS_50PERCENT] - pPostDCTIData->iGain2[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4018. pSharp_POSTDCTI_Reserve->iTagetTh0 = pPostDCTIData->iTh0[PQ_SHARPNESS_0PERCENT]+ (pPostDCTIData->iTh0[PQ_SHARPNESS_50PERCENT] - pPostDCTIData->iTh0[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4019. pSharp_POSTDCTI_Reserve->iTagetTh1 = pPostDCTIData->iTh1[PQ_SHARPNESS_0PERCENT]+ (pPostDCTIData->iTh1[PQ_SHARPNESS_50PERCENT] - pPostDCTIData->iTh1[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4020. pSharp_POSTDCTI_Reserve->iTagetSlp0 = pPostDCTIData->iSlope0[PQ_SHARPNESS_0PERCENT]+ (pPostDCTIData->iSlope0[PQ_SHARPNESS_50PERCENT] - pPostDCTIData->iSlope0[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4021. pSharp_POSTDCTI_Reserve->iTagetSlp1 = pPostDCTIData->iSlope1[PQ_SHARPNESS_0PERCENT]+ (pPostDCTIData->iSlope1[PQ_SHARPNESS_50PERCENT] - pPostDCTIData->iSlope1[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4022. }
  4023. else
  4024. {
  4025. //from normal to strong
  4026. ucValue-= 64;
  4027. pSharp_POSTDCTI_Reserve->iTagetFac0 = pPostDCTIData->iGain0[PQ_SHARPNESS_50PERCENT]+ (pPostDCTIData->iGain0[PQ_SHARPNESS_100PERCENT] - pPostDCTIData->iGain0[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4028. pSharp_POSTDCTI_Reserve->iTagetFac1 = pPostDCTIData->iGain1[PQ_SHARPNESS_50PERCENT]+ (pPostDCTIData->iGain1[PQ_SHARPNESS_100PERCENT] - pPostDCTIData->iGain1[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4029. pSharp_POSTDCTI_Reserve->iTagetFac2 = pPostDCTIData->iGain2[PQ_SHARPNESS_50PERCENT]+ (pPostDCTIData->iGain2[PQ_SHARPNESS_100PERCENT] - pPostDCTIData->iGain2[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4030. pSharp_POSTDCTI_Reserve->iTagetTh0 = pPostDCTIData->iTh0[PQ_SHARPNESS_50PERCENT]+ (pPostDCTIData->iTh0[PQ_SHARPNESS_100PERCENT] - pPostDCTIData->iTh0[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4031. pSharp_POSTDCTI_Reserve->iTagetTh1 = pPostDCTIData->iTh1[PQ_SHARPNESS_50PERCENT]+ (pPostDCTIData->iTh1[PQ_SHARPNESS_100PERCENT] - pPostDCTIData->iTh1[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4032. pSharp_POSTDCTI_Reserve->iTagetSlp0 = pPostDCTIData->iSlope0[PQ_SHARPNESS_50PERCENT]+ (pPostDCTIData->iSlope0[PQ_SHARPNESS_100PERCENT] - pPostDCTIData->iSlope0[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4033. pSharp_POSTDCTI_Reserve->iTagetSlp1 = pPostDCTIData->iSlope1[PQ_SHARPNESS_50PERCENT]+ (pPostDCTIData->iSlope1[PQ_SHARPNESS_100PERCENT] - pPostDCTIData->iSlope1[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4034. }
  4035. pSharp_POSTDCTI_Reserve->iTargetScale = pPostDCTIData->iScale[PQ_SHARPNESS_50PERCENT];
  4036. pSharp_POSTDCTI_Reserve->iTargetGainTap = pPostDCTIData->iGainTap[PQ_SHARPNESS_50PERCENT];
  4037. pSharp_POSTDCTI_Reserve->iTargetShootTap = pPostDCTIData->iShootTap[PQ_SHARPNESS_50PERCENT];
  4038. return;
  4039. }
  4040. if(bStart)
  4041. {
  4042. bStart = FALSE;
  4043. if( pHwContext->bEnableColorProcess==FALSE )
  4044. {
  4045. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_0_post, 0);
  4046. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_1_post, 0);
  4047. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_2_post, 0);
  4048. return;
  4049. }
  4050. if(_VIP_GetPreviewWndowStatus())
  4051. PQ_RegisterWrite(VIP_reg_slr_dcti_en_post,0);
  4052. else
  4053. PQ_RegisterWrite(VIP_reg_slr_dcti_en_post, pPostDCTIData->iPostDCTIEnable);
  4054. if(VIP_IsSourceDTV() || !utempCheckColorbarDTFunctionEN || VIP_RunDVIMode() || VIP_IsPCSource())
  4055. {
  4056. PQ_RegisterWrite(VIP_reg_slr_dcti_c1_post, pPostDCTIData->icoef[0]);
  4057. PQ_RegisterWrite(VIP_reg_slr_dcti_c2_post, pPostDCTIData->icoef[1]);
  4058. PQ_RegisterWrite(VIP_reg_slr_dcti_c3_post, pPostDCTIData->icoef[2]);
  4059. PQ_RegisterWrite(VIP_reg_slr_dcti_c4_post, pPostDCTIData->icoef[3]);
  4060. PQ_RegisterWrite(VIP_reg_slr_dcti_c5_post, pPostDCTIData->icoef[4]);
  4061. PQ_RegisterWrite(VIP_reg_slr_dcti_c6_post, pPostDCTIData->icoef[5]);
  4062. PQ_RegisterWrite(VIP_reg_slr_post_icp_en_post, pPostDCTIData->iPostChromaFilterEnable);
  4063. PQ_RegisterWrite(VIP_reg_slr_pre_icp_en_post, pPostDCTIData->iPreChromaFilterEnable);
  4064. PQ_RegisterWrite(VIP_reg_slr_pre_icp_alpha_post, pPostDCTIData->iPostChromaFilterLevel);
  4065. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_0_post, pSharp_POSTDCTI_Reserve->iTagetFac0);
  4066. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_1_post, pSharp_POSTDCTI_Reserve->iTagetFac1);
  4067. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_2_post, pSharp_POSTDCTI_Reserve->iTagetFac2);
  4068. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_th0_post, pSharp_POSTDCTI_Reserve->iTagetTh0);
  4069. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_th1_post, pSharp_POSTDCTI_Reserve->iTagetTh1);
  4070. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_slope0_post, pSharp_POSTDCTI_Reserve->iTagetSlp0);
  4071. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_slope1_post, pSharp_POSTDCTI_Reserve->iTagetSlp1);
  4072. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_post, pSharp_POSTDCTI_Reserve->iTargetScale);
  4073. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_post, pSharp_POSTDCTI_Reserve->iTargetGainTap);
  4074. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_post, pSharp_POSTDCTI_Reserve->iTargetShootTap);
  4075. }
  4076. if ( !utempCheckColorbarDTFunctionEN && VIP_IsAVSource() && (VIP_GetStdColorSystem() >= CVD2_STD_NTSC_443) && (VIP_GetStdColorSystem() <= CVD2_STD_PAL_CN) )
  4077. {
  4078. if ( VIP_GetStdColorSystem() == CVD2_STD_NTSC_443 )
  4079. {
  4080. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_post, 0x2); //#40362
  4081. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_post, 0x5);
  4082. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_post,0x3); //#51589
  4083. }
  4084. PQ_RegisterWrite(VIP_reg_slr_dcti_c1_post, 0x173);
  4085. PQ_RegisterWrite(VIP_reg_slr_dcti_c2_post, 0x53);
  4086. PQ_RegisterWrite(VIP_reg_slr_dcti_c3_post, 0xf5b);
  4087. PQ_RegisterWrite(VIP_reg_slr_dcti_c4_post, 0xf0a);
  4088. PQ_RegisterWrite(VIP_reg_slr_dcti_c5_post, 0xf43);
  4089. PQ_RegisterWrite(VIP_reg_slr_dcti_c6_post, 0xf98);
  4090. }
  4091. if (VIP_GetUserSource() == SOURCE_EXTS && !VIP_IsPCSource() && VIP_GetInputVSize() > 700) //#51277
  4092. {
  4093. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_post, 0x0);
  4094. }
  4095. else if (VIP_IsPCSource() && VIP_GetInputHSize()==1920 && VIP_GetInputVSize()==1080)
  4096. {
  4097. PQ_RegisterWrite(VIP_reg_slr_pre_icp_en_post, 0x0); //#52129
  4098. }
  4099. #ifdef CONFIG_APPLY_DIFFERENT_SHARPNESS_SETTING_IN_PANEL_INVERT
  4100. if(VIP_GetFlipMode()==HV_FLIP || VIP_GetFlipMode() == H_FLIP || VIP_GetFlipMode() == V_FLIP || VIP_GetPanelInvert())
  4101. {/* Add sharpness setting in invert panel here */
  4102. if ((VIP_GetUserSource() == SOURCE_HDMI) && (VIP_GetInputVSize() < 600))
  4103. {
  4104. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_post, 0x3); //#42800
  4105. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_post, 0x0); //#48451
  4106. }
  4107. }
  4108. else
  4109. {/* Add sharpness setting in regular panel here */}
  4110. #else
  4111. /* Check different setting status and remove same setting item to here */
  4112. #endif
  4113. }
  4114. }
  4115. void PQ_Sharpness_PREDLTI(BOOL bReset, UINT8 ucValue)
  4116. {
  4117. PQHW_CONTEXT* pHwContext= &PQHwContext;
  4118. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  4119. SHARP_PREDLTI* pSHARP_PREDLTI = &pVtab->mSharpness_PreDLTI;
  4120. SHARP_PREDLTI_DATA* pSHARP_PREDLTI_DATA;
  4121. SHARP_PREDLTI_RESERVE* pSharp_PREDLTI_Reserve;
  4122. UINT8 ucCurrSrcIndex, ucTableIndex;
  4123. static UINT32 dwPreDLTIFacReg[3] = {VIP_reg_slr_dlti_gain_0_pre,VIP_reg_slr_dlti_gain_1_pre,VIP_reg_slr_dlti_gain_2_pre};
  4124. static UINT32 dwPreDLTITHReg[2] = {VIP_reg_slr_dlti_gain_th0_pre,VIP_reg_slr_dlti_gain_th1_pre};
  4125. static UINT32 dwPreDLTISlopeReg[2] = {VIP_reg_slr_dlti_gain_slope0_pre,VIP_reg_slr_dlti_gain_slope1_pre};
  4126. static UINT8 bStart = FALSE;
  4127. ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  4128. if ((ucCurrSrcIndex >= SRC_INDEX_UNKNOWN))
  4129. {
  4130. PQDebugPrint("%s: SrcIndex (%d) unknown/invalid!", __FUNCTION__, ucCurrSrcIndex);
  4131. return;
  4132. }
  4133. ucTableIndex = pSHARP_PREDLTI->mGroupedIndex[ucCurrSrcIndex];
  4134. pSHARP_PREDLTI_DATA = &pSHARP_PREDLTI->mPreDLTIData[ucTableIndex];
  4135. pSharp_PREDLTI_Reserve = &pHwContext->mSharp_PREDLTI_Reserve;
  4136. if(bReset)
  4137. {
  4138. bStart = TRUE;
  4139. if( ucValue>127 )
  4140. ucValue= 127;
  4141. PQDebugPrint("%s:ucValue=%d", __FUNCTION__, ucValue);
  4142. if( ucValue<64 )
  4143. {
  4144. pSharp_PREDLTI_Reserve->iTagetFac0 = pSHARP_PREDLTI_DATA->iGain0[PQ_SHARPNESS_0PERCENT]+ (pSHARP_PREDLTI_DATA->iGain0[PQ_SHARPNESS_50PERCENT] - pSHARP_PREDLTI_DATA->iGain0[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4145. pSharp_PREDLTI_Reserve->iTagetFac1 = pSHARP_PREDLTI_DATA->iGain1[PQ_SHARPNESS_0PERCENT]+ (pSHARP_PREDLTI_DATA->iGain1[PQ_SHARPNESS_50PERCENT] - pSHARP_PREDLTI_DATA->iGain1[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4146. pSharp_PREDLTI_Reserve->iTagetFac2 = pSHARP_PREDLTI_DATA->iGain2[PQ_SHARPNESS_0PERCENT]+ (pSHARP_PREDLTI_DATA->iGain2[PQ_SHARPNESS_50PERCENT] - pSHARP_PREDLTI_DATA->iGain2[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4147. pSharp_PREDLTI_Reserve->iTagetTh0 = pSHARP_PREDLTI_DATA->iTh0[PQ_SHARPNESS_0PERCENT]+ (pSHARP_PREDLTI_DATA->iTh0[PQ_SHARPNESS_50PERCENT] - pSHARP_PREDLTI_DATA->iTh0[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4148. pSharp_PREDLTI_Reserve->iTagetTh1 = pSHARP_PREDLTI_DATA->iTh1[PQ_SHARPNESS_0PERCENT]+ (pSHARP_PREDLTI_DATA->iTh1[PQ_SHARPNESS_50PERCENT] - pSHARP_PREDLTI_DATA->iTh1[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4149. pSharp_PREDLTI_Reserve->iTagetSlp0 = pSHARP_PREDLTI_DATA->iSlope0[PQ_SHARPNESS_0PERCENT]+ (pSHARP_PREDLTI_DATA->iSlope0[PQ_SHARPNESS_50PERCENT] - pSHARP_PREDLTI_DATA->iSlope0[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4150. pSharp_PREDLTI_Reserve->iTagetSlp1 = pSHARP_PREDLTI_DATA->iSlope1[PQ_SHARPNESS_0PERCENT]+ (pSHARP_PREDLTI_DATA->iSlope1[PQ_SHARPNESS_50PERCENT] - pSHARP_PREDLTI_DATA->iSlope1[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4151. }
  4152. else
  4153. {
  4154. //from normal to strong
  4155. ucValue-= 64;
  4156. pSharp_PREDLTI_Reserve->iTagetFac0 = pSHARP_PREDLTI_DATA->iGain0[PQ_SHARPNESS_50PERCENT]+ (pSHARP_PREDLTI_DATA->iGain0[PQ_SHARPNESS_100PERCENT] - pSHARP_PREDLTI_DATA->iGain0[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4157. pSharp_PREDLTI_Reserve->iTagetFac1 = pSHARP_PREDLTI_DATA->iGain1[PQ_SHARPNESS_50PERCENT]+ (pSHARP_PREDLTI_DATA->iGain1[PQ_SHARPNESS_100PERCENT] - pSHARP_PREDLTI_DATA->iGain1[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4158. pSharp_PREDLTI_Reserve->iTagetFac2 = pSHARP_PREDLTI_DATA->iGain2[PQ_SHARPNESS_50PERCENT]+ (pSHARP_PREDLTI_DATA->iGain2[PQ_SHARPNESS_100PERCENT] - pSHARP_PREDLTI_DATA->iGain2[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4159. pSharp_PREDLTI_Reserve->iTagetTh0 = pSHARP_PREDLTI_DATA->iTh0[PQ_SHARPNESS_50PERCENT]+ (pSHARP_PREDLTI_DATA->iTh0[PQ_SHARPNESS_100PERCENT] - pSHARP_PREDLTI_DATA->iTh0[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4160. pSharp_PREDLTI_Reserve->iTagetTh1 = pSHARP_PREDLTI_DATA->iTh1[PQ_SHARPNESS_50PERCENT]+ (pSHARP_PREDLTI_DATA->iTh1[PQ_SHARPNESS_100PERCENT] - pSHARP_PREDLTI_DATA->iTh1[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4161. pSharp_PREDLTI_Reserve->iTagetSlp0 = pSHARP_PREDLTI_DATA->iSlope0[PQ_SHARPNESS_50PERCENT]+ (pSHARP_PREDLTI_DATA->iSlope0[PQ_SHARPNESS_100PERCENT] - pSHARP_PREDLTI_DATA->iSlope0[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4162. pSharp_PREDLTI_Reserve->iTagetSlp1 = pSHARP_PREDLTI_DATA->iSlope1[PQ_SHARPNESS_50PERCENT]+ (pSHARP_PREDLTI_DATA->iSlope1[PQ_SHARPNESS_100PERCENT] - pSHARP_PREDLTI_DATA->iSlope1[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4163. }
  4164. pSharp_PREDLTI_Reserve->iTargetScale = pSHARP_PREDLTI_DATA->iScale[PQ_SHARPNESS_50PERCENT];
  4165. pSharp_PREDLTI_Reserve->iTargetGainTap = pSHARP_PREDLTI_DATA->iGainTap[PQ_SHARPNESS_50PERCENT];
  4166. pSharp_PREDLTI_Reserve->iTargetShootTap = pSHARP_PREDLTI_DATA->iShootTap[PQ_SHARPNESS_50PERCENT];
  4167. return;
  4168. }
  4169. if(bStart)
  4170. {
  4171. bStart = FALSE;
  4172. if( pHwContext->bEnableColorProcess==FALSE )
  4173. {
  4174. PQ_RegisterWrite(dwPreDLTIFacReg[0], 0);
  4175. PQ_RegisterWrite(dwPreDLTIFacReg[1], 0);
  4176. PQ_RegisterWrite(dwPreDLTIFacReg[2], 0);
  4177. return;
  4178. }
  4179. #ifdef CONFIG_APPLY_DIFFERENT_SHARPNESS_SETTING_IN_PANEL_INVERT
  4180. if(VIP_GetFlipMode()==HV_FLIP || VIP_GetFlipMode() == H_FLIP || VIP_GetFlipMode() == V_FLIP || VIP_GetPanelInvert())
  4181. {
  4182. /* Add sharpness setting in invert panel here */
  4183. PQ_RegisterWrite(dwPreDLTIFacReg[0], pSharp_PREDLTI_Reserve->iTagetFac0);
  4184. PQ_RegisterWrite(dwPreDLTIFacReg[1], pSharp_PREDLTI_Reserve->iTagetFac1);
  4185. PQ_RegisterWrite(dwPreDLTIFacReg[2], pSharp_PREDLTI_Reserve->iTagetFac2);
  4186. PQ_RegisterWrite(dwPreDLTITHReg[0], pSharp_PREDLTI_Reserve->iTagetTh0);
  4187. PQ_RegisterWrite(dwPreDLTITHReg[1], pSharp_PREDLTI_Reserve->iTagetTh1);
  4188. PQ_RegisterWrite(dwPreDLTISlopeReg[0], pSharp_PREDLTI_Reserve->iTagetSlp0);
  4189. PQ_RegisterWrite(dwPreDLTISlopeReg[1], pSharp_PREDLTI_Reserve->iTagetSlp1);
  4190. }
  4191. else
  4192. {/* Add another sharpness setting in regular panel here */}
  4193. #else
  4194. /* Check different setting status and remove same setting item to here */
  4195. #endif
  4196. if(!(PQ_IsColorBar() && VIP_IsATVSource()))
  4197. {
  4198. PQ_RegisterWrite(VIP_reg_slr_dlti_en_pre, pSHARP_PREDLTI_DATA->iPreDLTIEnable);
  4199. PQ_RegisterWrite(VIP_reg_slr_dlti_scale_pre, pSharp_PREDLTI_Reserve->iTargetScale);
  4200. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_tap_pre, pSharp_PREDLTI_Reserve->iTargetGainTap);
  4201. PQ_RegisterWrite(VIP_reg_slr_dlti_shoot_tap_pre, pSharp_PREDLTI_Reserve->iTargetShootTap);
  4202. PQ_RegisterWrite(VIP_reg_slr_dlti_c1_pre, pSHARP_PREDLTI_DATA->icoef[0]);
  4203. PQ_RegisterWrite(VIP_reg_slr_dlti_c2_pre, pSHARP_PREDLTI_DATA->icoef[1]);
  4204. PQ_RegisterWrite(VIP_reg_slr_dlti_c3_pre, pSHARP_PREDLTI_DATA->icoef[2]);
  4205. PQ_RegisterWrite(dwPreDLTIFacReg[0], pSharp_PREDLTI_Reserve->iTagetFac0);
  4206. PQ_RegisterWrite(dwPreDLTIFacReg[1], pSharp_PREDLTI_Reserve->iTagetFac1);
  4207. PQ_RegisterWrite(dwPreDLTIFacReg[2], pSharp_PREDLTI_Reserve->iTagetFac2);
  4208. PQ_RegisterWrite(dwPreDLTITHReg[0], pSharp_PREDLTI_Reserve->iTagetTh0);
  4209. PQ_RegisterWrite(dwPreDLTITHReg[1], pSharp_PREDLTI_Reserve->iTagetTh1);
  4210. PQ_RegisterWrite(dwPreDLTISlopeReg[0], pSharp_PREDLTI_Reserve->iTagetSlp0);
  4211. PQ_RegisterWrite(dwPreDLTISlopeReg[1], pSharp_PREDLTI_Reserve->iTagetSlp1);
  4212. }
  4213. }
  4214. }
  4215. void PQ_Sharpness_POSTDLTI(BOOL bReset,UINT8 ucValue)
  4216. {
  4217. PQHW_CONTEXT* pHwContext= &PQHwContext;
  4218. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  4219. SHARP_POSTDLTI* pSHARP_POSTDCTI = &pVtab->mSharpness_PostDLTI;
  4220. SHARP_POSTDLTI_DATA* pPostDLTIData;
  4221. SHARP_POSTDLTI_RESERVE *pSharp_POSTDLTI_Reserve;
  4222. UINT8 ucCurrSrcIndex, ucTableIndex;
  4223. static UINT8 bStart = FALSE;
  4224. ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  4225. if ((ucCurrSrcIndex >= SRC_INDEX_UNKNOWN))
  4226. {
  4227. PQDebugPrint("%s: SrcIndex (%d) unknown/invalid, pLUTTable->SrcCount (%d)!", __FUNCTION__, ucCurrSrcIndex,pLUTTable->SrcCount);
  4228. return;
  4229. }
  4230. ucTableIndex = pSHARP_POSTDCTI->mGroupedIndex[ucCurrSrcIndex];
  4231. pPostDLTIData = &pSHARP_POSTDCTI->mPostDLTIData[ucTableIndex];
  4232. pSharp_POSTDLTI_Reserve = &pHwContext->mSharp_POSTDLTI_Reserve;
  4233. if(bReset)
  4234. {
  4235. bStart = TRUE;
  4236. if( ucValue>127 )
  4237. ucValue= 127;
  4238. PQDebugPrint("%s:ucValue=%d", __FUNCTION__, ucValue);
  4239. if( ucValue<64 )
  4240. {
  4241. pSharp_POSTDLTI_Reserve->iTagetFac0 = pPostDLTIData->iGain0[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iGain0[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iGain0[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4242. pSharp_POSTDLTI_Reserve->iTagetFac1 = pPostDLTIData->iGain1[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iGain1[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iGain1[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4243. pSharp_POSTDLTI_Reserve->iTagetFac2 = pPostDLTIData->iGain2[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iGain2[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iGain2[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4244. pSharp_POSTDLTI_Reserve->iTagetTh0 = pPostDLTIData->iTh0[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iTh0[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iTh0[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4245. pSharp_POSTDLTI_Reserve->iTagetTh1 = pPostDLTIData->iTh1[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iTh1[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iTh1[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4246. pSharp_POSTDLTI_Reserve->iTagetSlp0 = pPostDLTIData->iSlope0[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iSlope0[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iSlope0[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4247. pSharp_POSTDLTI_Reserve->iTagetSlp1 = pPostDLTIData->iSlope1[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iSlope1[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iSlope1[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4248. pSharp_POSTDLTI_Reserve->iTargetDCMode = pPostDLTIData->iDnamicClipMode[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iDnamicClipMode[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iDnamicClipMode[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4249. pSharp_POSTDLTI_Reserve->iTargetDCOverShoot = pPostDLTIData->iDnamicClipOverShoot[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iDnamicClipOverShoot[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iDnamicClipOverShoot[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4250. pSharp_POSTDLTI_Reserve->iTargetDCUnderShoot = pPostDLTIData->iDnamicClipUnderShoot[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iDnamicClipUnderShoot[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iDnamicClipUnderShoot[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4251. pSharp_POSTDLTI_Reserve->iTargetDCOverShootfac = pPostDLTIData->iDnamicClipOverShootfac[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iDnamicClipOverShootfac[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iDnamicClipOverShootfac[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4252. pSharp_POSTDLTI_Reserve->iTargetDCUnderShootfac = pPostDLTIData->iDnamicClipUnderShootfac[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iDnamicClipUnderShootfac[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iDnamicClipUnderShootfac[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4253. pSharp_POSTDLTI_Reserve->iTargetNorOverShoot = pPostDLTIData->iNormalOverShoot[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iNormalOverShoot[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iNormalOverShoot[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4254. pSharp_POSTDLTI_Reserve->iTargetNorlUnderShoot = pPostDLTIData->iNormalUnderShoot[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iNormalUnderShoot[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iNormalUnderShoot[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4255. }
  4256. else
  4257. {
  4258. //from normal to strong
  4259. ucValue-= 64;
  4260. pSharp_POSTDLTI_Reserve->iTagetFac0 = pPostDLTIData->iGain0[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iGain0[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iGain0[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4261. pSharp_POSTDLTI_Reserve->iTagetFac1 = pPostDLTIData->iGain1[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iGain1[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iGain1[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4262. pSharp_POSTDLTI_Reserve->iTagetFac2 = pPostDLTIData->iGain2[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iGain2[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iGain2[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4263. pSharp_POSTDLTI_Reserve->iTagetTh0 = pPostDLTIData->iTh0[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iTh0[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iTh0[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4264. pSharp_POSTDLTI_Reserve->iTagetTh1 = pPostDLTIData->iTh1[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iTh1[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iTh1[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4265. pSharp_POSTDLTI_Reserve->iTagetSlp0 = pPostDLTIData->iSlope0[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iSlope0[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iSlope0[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4266. pSharp_POSTDLTI_Reserve->iTagetSlp1 = pPostDLTIData->iSlope1[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iSlope1[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iSlope1[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4267. pSharp_POSTDLTI_Reserve->iTargetDCMode = pPostDLTIData->iDnamicClipMode[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iDnamicClipMode[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iDnamicClipMode[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4268. pSharp_POSTDLTI_Reserve->iTargetDCOverShoot = pPostDLTIData->iDnamicClipOverShoot[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iDnamicClipOverShoot[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iDnamicClipOverShoot[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4269. pSharp_POSTDLTI_Reserve->iTargetDCUnderShoot = pPostDLTIData->iDnamicClipUnderShoot[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iDnamicClipUnderShoot[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iDnamicClipUnderShoot[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4270. pSharp_POSTDLTI_Reserve->iTargetDCOverShootfac = pPostDLTIData->iDnamicClipOverShootfac[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iDnamicClipOverShootfac[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iDnamicClipOverShootfac[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4271. pSharp_POSTDLTI_Reserve->iTargetDCUnderShootfac = pPostDLTIData->iDnamicClipUnderShootfac[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iDnamicClipUnderShootfac[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iDnamicClipUnderShootfac[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4272. pSharp_POSTDLTI_Reserve->iTargetNorOverShoot = pPostDLTIData->iNormalOverShoot[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iNormalOverShoot[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iNormalOverShoot[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4273. pSharp_POSTDLTI_Reserve->iTargetNorlUnderShoot = pPostDLTIData->iNormalUnderShoot[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iNormalUnderShoot[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iNormalUnderShoot[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4274. }
  4275. pSharp_POSTDLTI_Reserve->iTargetScale = pPostDLTIData->iScale[PQ_SHARPNESS_50PERCENT];
  4276. pSharp_POSTDLTI_Reserve->iTargetGainTap = pPostDLTIData->iGainTap[PQ_SHARPNESS_50PERCENT];
  4277. pSharp_POSTDLTI_Reserve->iTargetShootTap = pPostDLTIData->iShootTap[PQ_SHARPNESS_50PERCENT];
  4278. return;
  4279. }
  4280. if(bStart)
  4281. {
  4282. bStart = FALSE;
  4283. if( pHwContext->bEnableColorProcess==FALSE )
  4284. {
  4285. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_0_post, 0);
  4286. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_1_post, 0);
  4287. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_2_post, 0);
  4288. return;
  4289. }
  4290. if(pHwContext->PqPatch.PostDLTIPatch == POST_DLTI_JPEG_THUMBNAIL_PATCH)
  4291. {
  4292. PQ_RegisterWrite(VIP_reg_slr_dlti_dclip_en_post, 1);
  4293. PQ_RegisterWrite(VIP_reg_slr_dlti_c1_post, 0x167);
  4294. PQ_RegisterWrite(VIP_reg_slr_dlti_c2_post, 0xe8d);
  4295. PQ_RegisterWrite(VIP_reg_slr_dlti_c3_post, 0xefc);
  4296. PQ_RegisterWrite(VIP_reg_slr_dlti_c4_post, 0xfd7);
  4297. PQ_RegisterWrite(VIP_reg_slr_dlti_c5_post, 0xfa7);
  4298. PQ_RegisterWrite(VIP_reg_slr_dlti_c6_post, 0xfad);
  4299. PQ_RegisterWrite(VIP_reg_slr_dlti_scale_post, 0);
  4300. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_tap_post, 5);
  4301. PQ_RegisterWrite(VIP_reg_slr_dlti_shoot_tap_post, 5);
  4302. PQ_RegisterWrite(VIP_reg_slr_dlti_dclip_sel_post, 2);
  4303. PQ_RegisterWrite(VIP_reg_slr_dlti_unsht_dclip_post, 4);
  4304. PQ_RegisterWrite(VIP_reg_slr_dlti_ovsht_fac_post, 3);
  4305. PQ_RegisterWrite(VIP_reg_slr_dlti_unsht_fac_post, 3);
  4306. PQ_RegisterWrite(VIP_reg_slr_dlti_ovsht_clip_post, 0x20);
  4307. PQ_RegisterWrite(VIP_reg_slr_dlti_unsht_clip_post, 0x20);
  4308. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_0_post, 0x78);
  4309. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_1_post, 0x78);
  4310. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_th1_post, 0x64);
  4311. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_slope1_post, 0x3a);
  4312. }
  4313. else
  4314. {
  4315. PQ_RegisterWrite(VIP_reg_slr_dlti_dclip_en_post, pPostDLTIData->iDynamicClipEnable);
  4316. PQ_RegisterWrite(VIP_reg_slr_dlti_c1_post, pPostDLTIData->icoef[0]);
  4317. PQ_RegisterWrite(VIP_reg_slr_dlti_c2_post, pPostDLTIData->icoef[1]);
  4318. PQ_RegisterWrite(VIP_reg_slr_dlti_c3_post, pPostDLTIData->icoef[2]);
  4319. PQ_RegisterWrite(VIP_reg_slr_dlti_c4_post, pPostDLTIData->icoef[3]);
  4320. PQ_RegisterWrite(VIP_reg_slr_dlti_c5_post, pPostDLTIData->icoef[4]);
  4321. PQ_RegisterWrite(VIP_reg_slr_dlti_c6_post, pPostDLTIData->icoef[5]);
  4322. PQ_RegisterWrite(VIP_reg_slr_dlti_scale_post, pSharp_POSTDLTI_Reserve->iTargetScale);
  4323. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_tap_post, pSharp_POSTDLTI_Reserve->iTargetGainTap);
  4324. PQ_RegisterWrite(VIP_reg_slr_dlti_shoot_tap_post, pSharp_POSTDLTI_Reserve->iTargetShootTap);
  4325. PQ_RegisterWrite(VIP_reg_slr_dlti_dclip_sel_post, pSharp_POSTDLTI_Reserve->iTargetDCMode);
  4326. PQ_RegisterWrite(VIP_reg_slr_dlti_unsht_dclip_post, pSharp_POSTDLTI_Reserve->iTargetDCUnderShoot);
  4327. PQ_RegisterWrite(VIP_reg_slr_dlti_ovsht_fac_post, pSharp_POSTDLTI_Reserve->iTargetDCOverShootfac);
  4328. PQ_RegisterWrite(VIP_reg_slr_dlti_unsht_fac_post, pSharp_POSTDLTI_Reserve->iTargetDCUnderShootfac);
  4329. PQ_RegisterWrite(VIP_reg_slr_dlti_ovsht_clip_post, pSharp_POSTDLTI_Reserve->iTargetNorOverShoot);
  4330. PQ_RegisterWrite(VIP_reg_slr_dlti_unsht_clip_post, pSharp_POSTDLTI_Reserve->iTargetNorlUnderShoot);
  4331. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_0_post, pSharp_POSTDLTI_Reserve->iTagetFac0);
  4332. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_1_post, pSharp_POSTDLTI_Reserve->iTagetFac1);
  4333. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_th1_post, pSharp_POSTDLTI_Reserve->iTagetTh1);
  4334. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_slope1_post, pSharp_POSTDLTI_Reserve->iTagetSlp1);
  4335. }
  4336. PQ_RegisterWrite(VIP_reg_slr_dlti_ovsht_dclip_post, pSharp_POSTDLTI_Reserve->iTargetDCOverShoot);
  4337. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_2_post, pSharp_POSTDLTI_Reserve->iTagetFac2);
  4338. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_th0_post, pSharp_POSTDLTI_Reserve->iTagetTh0);
  4339. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_slope0_post, pSharp_POSTDLTI_Reserve->iTagetSlp0);
  4340. if (VIP_GetUserSource() == SOURCE_EXTS && !VIP_IsPCSource() && VIP_GetInputVSize() > 700) //#51277
  4341. {
  4342. PQ_RegisterWrite(VIP_reg_slr_dlti_scale_post, 0x0);
  4343. PQ_RegisterWrite(VIP_reg_slr_dlti_shoot_tap_post, 0x0);
  4344. }
  4345. }
  4346. }
  4347. void PQ_Sharpness_POST_2D(BOOL bReset,UINT8 ucValue)
  4348. {
  4349. PQHW_CONTEXT* pHwContext= &PQHwContext;
  4350. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  4351. SHARP_POST2DSHARPNESS* pPost2DSharpness = &pVtab->mSharpness_Post2DSharpness;
  4352. SHARP_POST2DSHARPNESS_DATA* pPost2DSharpData;
  4353. SHARP_POST2D_RESERVE *pSharp_POST2D_Reserve;
  4354. UINT8 ucCurrSrcIndex, ucTableIndex, ucUserSource, ucSubSource;
  4355. static UINT8 bStart = FALSE;
  4356. VIP_GetSource(&ucUserSource, &ucSubSource);
  4357. ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  4358. if ((ucCurrSrcIndex >= SRC_INDEX_UNKNOWN))
  4359. {
  4360. PQDebugPrint("%s: SrcIndex (%d) unknown/invalid, pLUTTable->SrcCount (%d)!", __FUNCTION__, ucCurrSrcIndex,pLUTTable->SrcCount);
  4361. return;
  4362. }
  4363. ucTableIndex = pPost2DSharpness->mGroupedIndex[ucCurrSrcIndex];
  4364. pPost2DSharpData = &pPost2DSharpness->mPost2DSharpData[ucTableIndex];
  4365. pSharp_POST2D_Reserve = &pHwContext->mSharp_POST2D_Reserve;
  4366. if(bReset)
  4367. {
  4368. bStart = TRUE;
  4369. if( ucValue>127 )
  4370. ucValue= 127;
  4371. PQDebugPrint("%s:ucValue=%d", __FUNCTION__, ucValue);
  4372. if( ucValue<64 )
  4373. {
  4374. pSharp_POST2D_Reserve->iTagetFac0_L = pPost2DSharpData->iGain0_Luma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iGain0_Luma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iGain0_Luma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4375. pSharp_POST2D_Reserve->iTagetFac1_L = pPost2DSharpData->iGain1_Luma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iGain1_Luma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iGain1_Luma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4376. pSharp_POST2D_Reserve->iTagetFac2_L = pPost2DSharpData->iGain2_Luma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iGain2_Luma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iGain2_Luma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4377. pSharp_POST2D_Reserve->iTagetTh0_L = pPost2DSharpData->iTh0_Luma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iTh0_Luma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iTh0_Luma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4378. pSharp_POST2D_Reserve->iTagetTh1_L = pPost2DSharpData->iTh1_Luma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iTh1_Luma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iTh1_Luma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4379. pSharp_POST2D_Reserve->iTagetSlp0_L = pPost2DSharpData->iSlope0_Luma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iSlope0_Luma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iSlope0_Luma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4380. pSharp_POST2D_Reserve->iTagetSlp1_L = pPost2DSharpData->iSlope1_Luma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iSlope1_Luma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iSlope1_Luma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4381. pSharp_POST2D_Reserve->iTargetFM_L = pPost2DSharpData->iFilterMode_Luma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iFilterMode_Luma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iFilterMode_Luma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4382. pSharp_POST2D_Reserve->iTargetScale_L = pPost2DSharpData->iScale_Luma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iScale_Luma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iScale_Luma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4383. pSharp_POST2D_Reserve->iTargetGainTap_L = pPost2DSharpData->iGainTap_Luma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iGainTap_Luma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iGainTap_Luma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4384. pSharp_POST2D_Reserve->iTargetShootTap_L = pPost2DSharpData->iShootTap_Luma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iShootTap_Luma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iShootTap_Luma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4385. pSharp_POST2D_Reserve->iTargetNorOverShoot = pPost2DSharpData->iNormalOverShoot[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iNormalOverShoot[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iNormalOverShoot[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4386. pSharp_POST2D_Reserve->iTargetNorlUnderShoot = pPost2DSharpData->iNormalUnderShoot[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iNormalUnderShoot[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iNormalUnderShoot[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4387. pSharp_POST2D_Reserve->iTargetOverShootfac = pPost2DSharpData->iOverShootFactor[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iOverShootFactor[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iOverShootFactor[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4388. pSharp_POST2D_Reserve->iTargetUnderShootfac = pPost2DSharpData->iUnderShootFactor[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iUnderShootFactor[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iUnderShootFactor[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4389. pSharp_POST2D_Reserve->iTagetFac0_C = pPost2DSharpData->iGain0_Chroma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iGain0_Chroma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iGain0_Chroma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4390. pSharp_POST2D_Reserve->iTagetFac1_C = pPost2DSharpData->iGain1_Chroma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iGain1_Chroma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iGain1_Chroma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4391. pSharp_POST2D_Reserve->iTagetFac2_C = pPost2DSharpData->iGain2_Chroma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iGain2_Chroma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iGain2_Chroma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4392. pSharp_POST2D_Reserve->iTagetTh0_C = pPost2DSharpData->iTh0_Chroma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iTh0_Chroma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iTh0_Chroma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4393. pSharp_POST2D_Reserve->iTagetTh1_C = pPost2DSharpData->iTh1_Chroma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iTh1_Chroma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iTh1_Chroma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4394. pSharp_POST2D_Reserve->iTagetSlp0_C = pPost2DSharpData->iSlope0_Chroma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iSlope0_Chroma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iSlope0_Chroma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4395. pSharp_POST2D_Reserve->iTagetSlp1_C = pPost2DSharpData->iSlope1_Chroma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iSlope1_Chroma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iSlope1_Chroma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4396. pSharp_POST2D_Reserve->iTargetFM_C = pPost2DSharpData->iFilterMode_Chroma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iFilterMode_Chroma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iFilterMode_Chroma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4397. pSharp_POST2D_Reserve->iTargetScale_C = pPost2DSharpData->iScale_Chroma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iScale_Chroma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iScale_Chroma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4398. pSharp_POST2D_Reserve->iTargetGainTap_C = pPost2DSharpData->iGainTap_Chroma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iGainTap_Chroma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iGainTap_Chroma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4399. pSharp_POST2D_Reserve->iTargetShootTap_C = pPost2DSharpData->iShootTap_Chroma[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iShootTap_Chroma[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iShootTap_Chroma[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4400. }
  4401. else
  4402. {
  4403. //from normal to strong
  4404. ucValue-= 64;
  4405. pSharp_POST2D_Reserve->iTagetFac0_L = pPost2DSharpData->iGain0_Luma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iGain0_Luma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iGain0_Luma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4406. pSharp_POST2D_Reserve->iTagetFac1_L = pPost2DSharpData->iGain1_Luma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iGain1_Luma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iGain1_Luma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4407. pSharp_POST2D_Reserve->iTagetFac2_L = pPost2DSharpData->iGain2_Luma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iGain2_Luma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iGain2_Luma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4408. pSharp_POST2D_Reserve->iTagetTh0_L = pPost2DSharpData->iTh0_Luma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iTh0_Luma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iTh0_Luma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4409. pSharp_POST2D_Reserve->iTagetTh1_L = pPost2DSharpData->iTh1_Luma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iTh1_Luma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iTh1_Luma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4410. pSharp_POST2D_Reserve->iTagetSlp0_L = pPost2DSharpData->iSlope0_Luma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iSlope0_Luma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iSlope0_Luma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4411. pSharp_POST2D_Reserve->iTagetSlp1_L = pPost2DSharpData->iSlope1_Luma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iSlope1_Luma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iSlope1_Luma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4412. pSharp_POST2D_Reserve->iTargetFM_L = pPost2DSharpData->iFilterMode_Luma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iFilterMode_Luma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iFilterMode_Luma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4413. pSharp_POST2D_Reserve->iTargetScale_L = pPost2DSharpData->iScale_Luma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iScale_Luma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iScale_Luma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4414. pSharp_POST2D_Reserve->iTargetGainTap_L = pPost2DSharpData->iGainTap_Luma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iGainTap_Luma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iGainTap_Luma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4415. pSharp_POST2D_Reserve->iTargetShootTap_L = pPost2DSharpData->iShootTap_Luma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iShootTap_Luma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iShootTap_Luma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4416. pSharp_POST2D_Reserve->iTargetNorOverShoot = pPost2DSharpData->iNormalOverShoot[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iNormalOverShoot[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iNormalOverShoot[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4417. pSharp_POST2D_Reserve->iTargetNorlUnderShoot = pPost2DSharpData->iNormalUnderShoot[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iNormalUnderShoot[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iNormalUnderShoot[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4418. pSharp_POST2D_Reserve->iTargetOverShootfac = pPost2DSharpData->iOverShootFactor[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iOverShootFactor[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iOverShootFactor[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4419. pSharp_POST2D_Reserve->iTargetUnderShootfac = pPost2DSharpData->iUnderShootFactor[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iUnderShootFactor[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iUnderShootFactor[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4420. pSharp_POST2D_Reserve->iTagetFac0_C = pPost2DSharpData->iGain0_Chroma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iGain0_Chroma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iGain0_Chroma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4421. pSharp_POST2D_Reserve->iTagetFac1_C = pPost2DSharpData->iGain1_Chroma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iGain1_Chroma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iGain1_Chroma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4422. pSharp_POST2D_Reserve->iTagetFac2_C = pPost2DSharpData->iGain2_Chroma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iGain2_Chroma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iGain2_Chroma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4423. pSharp_POST2D_Reserve->iTagetTh0_C = pPost2DSharpData->iTh0_Chroma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iTh0_Chroma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iTh0_Chroma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4424. pSharp_POST2D_Reserve->iTagetTh1_C = pPost2DSharpData->iTh1_Chroma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iTh1_Chroma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iTh1_Chroma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4425. pSharp_POST2D_Reserve->iTagetSlp0_C = pPost2DSharpData->iSlope0_Chroma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iSlope0_Chroma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iSlope0_Chroma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4426. pSharp_POST2D_Reserve->iTagetSlp1_C = pPost2DSharpData->iSlope1_Chroma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iSlope1_Chroma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iSlope1_Chroma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4427. pSharp_POST2D_Reserve->iTargetFM_C = pPost2DSharpData->iFilterMode_Chroma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iFilterMode_Chroma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iFilterMode_Chroma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4428. pSharp_POST2D_Reserve->iTargetScale_C = pPost2DSharpData->iScale_Chroma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iScale_Chroma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iScale_Chroma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4429. pSharp_POST2D_Reserve->iTargetGainTap_C = pPost2DSharpData->iGainTap_Chroma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iGainTap_Chroma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iGainTap_Chroma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4430. pSharp_POST2D_Reserve->iTargetShootTap_C = pPost2DSharpData->iShootTap_Chroma[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iShootTap_Chroma[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iShootTap_Chroma[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4431. }
  4432. return;
  4433. }
  4434. if(bStart)
  4435. {
  4436. bStart = FALSE;
  4437. if( pHwContext->bEnableColorProcess==FALSE )
  4438. {
  4439. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_0, 0);
  4440. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_1, 0);
  4441. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_2, 0);
  4442. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_0, 0);
  4443. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_1, 0);
  4444. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_2, 0);
  4445. return;
  4446. }
  4447. if(_VIP_GetPreviewWndowStatus() || pHwContext->PqPatch.Post2DPatch == POST_2D_SHARPNESS_JPEG_THUMBNAIL_PATCH)
  4448. {
  4449. PQ_RegisterWrite(VIP_reg_slr_2d_sharp_en,0);
  4450. }
  4451. else
  4452. {
  4453. PQ_RegisterWrite(VIP_reg_slr_2d_sharp_en, pPost2DSharpData->iPost2DSharpEnable);
  4454. }
  4455. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_0, pSharp_POST2D_Reserve->iTagetFac0_L);
  4456. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_1, pSharp_POST2D_Reserve->iTagetFac1_L);
  4457. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_2, pSharp_POST2D_Reserve->iTagetFac2_L);
  4458. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_th0, pSharp_POST2D_Reserve->iTagetTh0_L);
  4459. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_th1, pSharp_POST2D_Reserve->iTagetTh1_L);
  4460. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_slope0, pSharp_POST2D_Reserve->iTagetSlp0_L);
  4461. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_slope1, pSharp_POST2D_Reserve->iTagetSlp1_L);
  4462. PQ_RegisterWrite(VIP_reg_slr_2d_l_sel, pSharp_POST2D_Reserve->iTargetFM_L);
  4463. PQ_RegisterWrite(VIP_reg_slr_2d_l_scale, pSharp_POST2D_Reserve->iTargetScale_L); //replace set in PQ_DSSetting()
  4464. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_tap, pSharp_POST2D_Reserve->iTargetGainTap_L);
  4465. PQ_RegisterWrite(VIP_reg_slr_2d_l_shoot_tap, pSharp_POST2D_Reserve->iTargetShootTap_L);
  4466. PQ_RegisterWrite(VIP_reg_slr_2d_l_ovsht_clip, pSharp_POST2D_Reserve->iTargetNorOverShoot);
  4467. PQ_RegisterWrite(VIP_reg_slr_2d_l_unsht_clip, pSharp_POST2D_Reserve->iTargetNorlUnderShoot);
  4468. PQ_RegisterWrite(VIP_reg_slr_2d_l_ovsht_fac, pSharp_POST2D_Reserve->iTargetOverShootfac);
  4469. PQ_RegisterWrite(VIP_reg_slr_2d_l_unsht_fac, pSharp_POST2D_Reserve->iTargetUnderShootfac);
  4470. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_0, pSharp_POST2D_Reserve->iTagetFac0_C);
  4471. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_1, pSharp_POST2D_Reserve->iTagetFac1_C);
  4472. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_2, pSharp_POST2D_Reserve->iTagetFac2_C);
  4473. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_th0, pSharp_POST2D_Reserve->iTagetTh0_C);
  4474. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_th1, pSharp_POST2D_Reserve->iTagetTh1_C);
  4475. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_slope0, pSharp_POST2D_Reserve->iTagetSlp0_C);
  4476. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_slope1, pSharp_POST2D_Reserve->iTagetSlp1_C);
  4477. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_tap, pSharp_POST2D_Reserve->iTargetGainTap_C);
  4478. PQ_RegisterWrite(VIP_reg_slr_2d_c_shoot_tap, pSharp_POST2D_Reserve->iTargetShootTap_C);
  4479. PQ_RegisterWrite(VIP_reg_slr_ds_cond1_sel3, 1);
  4480. PQ_RegisterWrite(VIP_reg_slr_ds_sad_lr_max, 0);
  4481. if(VIP_IsSourceDTV() || !PQ_IsColorBar() || VIP_RunDVIMode() || VIP_IsPCSource())
  4482. {
  4483. PQ_RegisterWrite(VIP_reg_slr_2d_c_sel, pSharp_POST2D_Reserve->iTargetFM_C);
  4484. PQ_RegisterWrite(VIP_reg_slr_2d_c_scale, pSharp_POST2D_Reserve->iTargetScale_C);
  4485. }
  4486. if (VIP_GetUserSource() == SOURCE_EXTS && VIP_GetInputVSize() < 600)
  4487. {
  4488. PQ_RegisterWrite(VIP_reg_slr_2d_l_ovsht_fac, 0x1); // #42296 & #42516
  4489. }
  4490. if (VIP_IsSCARTSource() && VIP_IsAVSource())
  4491. {
  4492. PQ_RegisterWrite(VIP_reg_slr_2d_l_scale, 0x00); //#40517 & #40758
  4493. }
  4494. else if (VIP_IsSVSource())
  4495. {
  4496. PQ_RegisterWrite(VIP_reg_slr_2d_l_scale, 0x00); //#40955
  4497. }
  4498. else if (VIP_IsAVSource() && (VIP_GetStdColorSystem() >= CVD2_STD_PAL_IBGDK && VIP_GetStdColorSystem() <= CVD2_STD_SECAM))
  4499. {
  4500. PQ_RegisterWrite(VIP_reg_slr_2d_l_scale, 0x0); //#40758
  4501. }
  4502. else if (VIP_RunDVIMode() && VIP_GetInputHSize()==1280 && VIP_GetInputVSize()==1024 && VIP_GetPanelWidth()==1366 && VIP_GetPanelHeight()==768)
  4503. {
  4504. PQ_RegisterWrite(VIP_reg_slr_2d_l_shoot_tap, 0x0); //#51264
  4505. }
  4506. }
  4507. }
  4508. /*******************************************************************
  4509. // function name : PQ_Sharpness_Peaking_DLTI
  4510. // input parameter : bReset : for trigger in the vsync
  4511. // output parameter : none
  4512. // purpose : HW SLR new function since chip 8506
  4513. // return : none
  4514. *******************************************************************/
  4515. void PQ_Sharpness_Peaking_DLTI(BOOL bReset,UINT8 ucValue)
  4516. {
  4517. PQHW_CONTEXT* pHwContext= &PQHwContext;
  4518. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  4519. Peaking_DLTI_Setting* pPeakingDLTI = &pVtab->mPeakingDLTI;
  4520. Peaking_DLTI_Data* pPeakingDLTIData;
  4521. SHARP_PEAKING_DLTI_RESERVE *pPeaking_DLTI_Reserve;
  4522. static UINT8 bStart = FALSE;
  4523. UINT8 ucCurrSrcIndex, ucTableIndex, ucUserSource, ucSubSource, DLTI_Tap_Num = 1, V_Peaking_Tap_Num, Peaking_2D_Tap_Num, H_Peaking_Tap_Num;
  4524. VIP_GetSource(&ucUserSource, &ucSubSource);
  4525. ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  4526. if ((ucCurrSrcIndex >= SRC_INDEX_UNKNOWN))
  4527. {
  4528. PQDebugPrint("%s: SrcIndex (%d) unknown/invalid, pLUTTable->SrcCount (%d)!", __FUNCTION__, ucCurrSrcIndex,pLUTTable->SrcCount);
  4529. return;
  4530. }
  4531. ucTableIndex = pPeakingDLTI->mGroupedIndex[ucCurrSrcIndex];
  4532. pPeakingDLTIData = &pPeakingDLTI->Peaking_DLTI[ucTableIndex];
  4533. pPeaking_DLTI_Reserve = &pHwContext->mSharp_Peaking_DLTI_Reserve;
  4534. if(bReset)
  4535. {
  4536. bStart = TRUE;
  4537. if( ucValue>127 )
  4538. {
  4539. ucValue= 127;
  4540. }
  4541. PQDebugPrint("%s:ucValue=%d", __FUNCTION__, ucValue);
  4542. if( ucValue<64 )
  4543. {
  4544. pPeaking_DLTI_Reserve->SharpnessXp0Peak = pPeakingDLTIData->SharpnessXp0Peak[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessXp0Peak[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessXp0Peak[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4545. pPeaking_DLTI_Reserve->SharpnessXp1Peak = pPeakingDLTIData->SharpnessXp1Peak[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessXp1Peak[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessXp1Peak[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4546. pPeaking_DLTI_Reserve->SharpnessXp2Peak = pPeakingDLTIData->SharpnessXp2Peak[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessXp2Peak[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessXp2Peak[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4547. pPeaking_DLTI_Reserve->SharpnessXp3Peak = pPeakingDLTIData->SharpnessXp3Peak[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessXp3Peak[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessXp3Peak[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4548. pPeaking_DLTI_Reserve->SharpnessYp0Peak = pPeakingDLTIData->SharpnessYp0Peak[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessYp0Peak[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessYp0Peak[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4549. pPeaking_DLTI_Reserve->SharpnessYp1Peak = pPeakingDLTIData->SharpnessYp1Peak[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessYp1Peak[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessYp1Peak[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4550. pPeaking_DLTI_Reserve->SharpnessYp2Peak = pPeakingDLTIData->SharpnessYp2Peak[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessYp2Peak[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessYp2Peak[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4551. pPeaking_DLTI_Reserve->SharpnessMp1Peak = pPeakingDLTIData->SharpnessMp1Peak[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessMp1Peak[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessMp1Peak[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4552. pPeaking_DLTI_Reserve->SharpnessMp2Peak = pPeakingDLTIData->SharpnessMp2Peak[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessMp2Peak[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessMp2Peak[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4553. pPeaking_DLTI_Reserve->SharpnessXp0Lti = pPeakingDLTIData->SharpnessXp0Lti[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessXp0Lti[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessXp0Lti[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4554. pPeaking_DLTI_Reserve->SharpnessXp1Lti = pPeakingDLTIData->SharpnessXp1Lti[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessXp1Lti[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessXp1Lti[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4555. pPeaking_DLTI_Reserve->SharpnessXp2Lti = pPeakingDLTIData->SharpnessXp2Lti[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessXp2Lti[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessXp2Lti[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4556. pPeaking_DLTI_Reserve->SharpnessXp3Lti = pPeakingDLTIData->SharpnessXp3Lti[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessXp3Lti[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessXp3Lti[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4557. pPeaking_DLTI_Reserve->SharpnessYp0Lti = pPeakingDLTIData->SharpnessYp0Lti[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessYp0Lti[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessYp0Lti[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4558. pPeaking_DLTI_Reserve->SharpnessYp1Lti = pPeakingDLTIData->SharpnessYp1Lti[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessYp1Lti[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessYp1Lti[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4559. pPeaking_DLTI_Reserve->SharpnessYp2Lti = pPeakingDLTIData->SharpnessYp2Lti[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessYp2Lti[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessYp2Lti[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4560. pPeaking_DLTI_Reserve->SharpnessMp1Lti = pPeakingDLTIData->SharpnessMp1Lti[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessMp1Lti[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessMp1Lti[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4561. pPeaking_DLTI_Reserve->SharpnessMp2Lti = pPeakingDLTIData->SharpnessMp2Lti[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessMp2Lti[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessMp2Lti[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4562. pPeaking_DLTI_Reserve->SharpnessGainBPPeak1D = pPeakingDLTIData->SharpnessGainBPPeak1D[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessGainBPPeak1D[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessGainBPPeak1D[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4563. pPeaking_DLTI_Reserve->SharpnessGainEPPeak1D = pPeakingDLTIData->SharpnessGainEPPeak1D[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessGainEPPeak1D[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessGainEPPeak1D[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4564. pPeaking_DLTI_Reserve->SharpnessGainHPPeak1D = pPeakingDLTIData->SharpnessGainHPPeak1D[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessGainHPPeak1D[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessGainHPPeak1D[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4565. pPeaking_DLTI_Reserve->SharpnessGainNegPeak = pPeakingDLTIData->SharpnessGainNegPeak[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessGainNegPeak[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessGainNegPeak[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4566. pPeaking_DLTI_Reserve->SharpnessGainHPV31 = pPeakingDLTIData->SharpnessGainHPV31[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessGainHPV31[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessGainHPV31[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4567. pPeaking_DLTI_Reserve->SharpnessGainHPV51 = pPeakingDLTIData->SharpnessGainHPV51[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessGainHPV51[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessGainHPV51[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4568. pPeaking_DLTI_Reserve->SharpnessCoringPeak1D = pPeakingDLTIData->SharpnessCoringPeak1D[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessCoringPeak1D[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessCoringPeak1D[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4569. pPeaking_DLTI_Reserve->SharpnessCoringPeak = pPeakingDLTIData->SharpnessCoringPeak[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessCoringPeak[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessCoringPeak[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4570. pPeaking_DLTI_Reserve->SharpnessCoringPeakV = pPeakingDLTIData->SharpnessCoringPeakV[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessCoringPeakV[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessCoringPeakV[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4571. pPeaking_DLTI_Reserve->SharpnessHiCoringPeak = pPeakingDLTIData->SharpnessHiCoringPeak[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessHiCoringPeak[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessHiCoringPeak[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4572. pPeaking_DLTI_Reserve->SharpnessGainHP0Peak2D = pPeakingDLTIData->SharpnessGainHP0Peak2D[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessGainHP0Peak2D[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessGainHP0Peak2D[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4573. pPeaking_DLTI_Reserve->SharpnessGainHP1Peak2D = pPeakingDLTIData->SharpnessGainHP1Peak2D[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessGainHP1Peak2D[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessGainHP1Peak2D[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4574. pPeaking_DLTI_Reserve->SharpnessGainBP0Peak2D = pPeakingDLTIData->SharpnessGainBP0Peak2D[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessGainBP0Peak2D[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessGainBP0Peak2D[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4575. pPeaking_DLTI_Reserve->SharpnessGainBP1Peak2D = pPeakingDLTIData->SharpnessGainBP1Peak2D[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessGainBP1Peak2D[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessGainBP1Peak2D[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4576. pPeaking_DLTI_Reserve->SharpnessCoringPeak2D = pPeakingDLTIData->SharpnessCoringPeak2D[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessCoringPeak2D[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessCoringPeak2D[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4577. pPeaking_DLTI_Reserve->SharpnessMaxMinHSLrTap = pPeakingDLTIData->SharpnessMaxMinHSLrTap[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessMaxMinHSLrTap[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessMaxMinHSLrTap[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4578. pPeaking_DLTI_Reserve->SharpnessMaxMinVSLrTap = pPeakingDLTIData->SharpnessMaxMinVSLrTap[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessMaxMinVSLrTap[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessMaxMinVSLrTap[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4579. pPeaking_DLTI_Reserve->SharpnessAdjcentDiffTh = pPeakingDLTIData->SharpnessAdjcentDiffTh[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessAdjcentDiffTh[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessAdjcentDiffTh[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4580. pPeaking_DLTI_Reserve->SharpnessDLTIBpGain = pPeakingDLTIData->SharpnessDLTIBpGain[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessDLTIBpGain[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessDLTIBpGain[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4581. pPeaking_DLTI_Reserve->SharpnessDLTIEpGain = pPeakingDLTIData->SharpnessDLTIEpGain[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessDLTIEpGain[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessDLTIEpGain[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4582. pPeaking_DLTI_Reserve->SharpnessDLTIHpGain = pPeakingDLTIData->SharpnessDLTIHpGain[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessDLTIHpGain[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessDLTIHpGain[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4583. pPeaking_DLTI_Reserve->SharpnessCoringLti = pPeakingDLTIData->SharpnessCoringLti[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessCoringLti[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessCoringLti[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4584. pPeaking_DLTI_Reserve->SharpnessHiCoringLti = pPeakingDLTIData->SharpnessHiCoringLti[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessHiCoringLti[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessHiCoringLti[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4585. pPeaking_DLTI_Reserve->SharpnessDeOvstNewMethodPeak = pPeakingDLTIData->SharpnessDeOvstNewMethodPeak[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessDeOvstNewMethodPeak[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessDeOvstNewMethodPeak[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4586. pPeaking_DLTI_Reserve->SharpnessDeOvseNewMethodLti = pPeakingDLTIData->SharpnessDeOvseNewMethodLti[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessDeOvseNewMethodLti[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessDeOvseNewMethodLti[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4587. pPeaking_DLTI_Reserve->SharpnessOverMaxPeak = pPeakingDLTIData->SharpnessOverMaxPeak[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessOverMaxPeak[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessOverMaxPeak[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4588. pPeaking_DLTI_Reserve->SharpnessOverMinPeak = pPeakingDLTIData->SharpnessOverMinPeak[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessOverMinPeak[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessOverMinPeak[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4589. pPeaking_DLTI_Reserve->SharpnessOvstGainMaxPeak = pPeakingDLTIData->SharpnessOvstGainMaxPeak[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessOvstGainMaxPeak[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessOvstGainMaxPeak[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4590. pPeaking_DLTI_Reserve->SharpnessOvstGainMinPeak = pPeakingDLTIData->SharpnessOvstGainMinPeak[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessOvstGainMinPeak[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessOvstGainMinPeak[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4591. pPeaking_DLTI_Reserve->SharpnessOverMaxLti = pPeakingDLTIData->SharpnessOverMaxLti[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessOverMaxLti[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessOverMaxLti[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4592. pPeaking_DLTI_Reserve->SharpnessOverMinLti = pPeakingDLTIData->SharpnessOverMinLti[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessOverMinLti[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessOverMinLti[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4593. pPeaking_DLTI_Reserve->SharpnessOvstGainMaxLti = pPeakingDLTIData->SharpnessOvstGainMaxLti[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessOvstGainMaxLti[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessOvstGainMaxLti[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4594. pPeaking_DLTI_Reserve->SharpnessOvstGainMinLti = pPeakingDLTIData->SharpnessOvstGainMinLti[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessOvstGainMinLti[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessOvstGainMinLti[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4595. pPeaking_DLTI_Reserve->SharpnessMaxMinHSLrTapLti = pPeakingDLTIData->SharpnessMaxMinHSLrTapLti[PQ_SHARPNESS_0PERCENT]+ (pPeakingDLTIData->SharpnessMaxMinHSLrTapLti[PQ_SHARPNESS_50PERCENT] - pPeakingDLTIData->SharpnessMaxMinHSLrTapLti[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  4596. }
  4597. else
  4598. {
  4599. ucValue-= 64;
  4600. pPeaking_DLTI_Reserve->SharpnessXp0Peak = pPeakingDLTIData->SharpnessXp0Peak[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessXp0Peak[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessXp0Peak[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4601. pPeaking_DLTI_Reserve->SharpnessXp1Peak = pPeakingDLTIData->SharpnessXp1Peak[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessXp1Peak[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessXp1Peak[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4602. pPeaking_DLTI_Reserve->SharpnessXp2Peak = pPeakingDLTIData->SharpnessXp2Peak[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessXp2Peak[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessXp2Peak[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4603. pPeaking_DLTI_Reserve->SharpnessXp3Peak = pPeakingDLTIData->SharpnessXp3Peak[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessXp3Peak[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessXp3Peak[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4604. pPeaking_DLTI_Reserve->SharpnessYp0Peak = pPeakingDLTIData->SharpnessYp0Peak[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessYp0Peak[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessYp0Peak[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4605. pPeaking_DLTI_Reserve->SharpnessYp1Peak = pPeakingDLTIData->SharpnessYp1Peak[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessYp1Peak[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessYp1Peak[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4606. pPeaking_DLTI_Reserve->SharpnessYp2Peak = pPeakingDLTIData->SharpnessYp2Peak[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessYp2Peak[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessYp2Peak[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4607. pPeaking_DLTI_Reserve->SharpnessMp1Peak = pPeakingDLTIData->SharpnessMp1Peak[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessMp1Peak[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessMp1Peak[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4608. pPeaking_DLTI_Reserve->SharpnessMp2Peak = pPeakingDLTIData->SharpnessMp2Peak[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessMp2Peak[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessMp2Peak[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4609. pPeaking_DLTI_Reserve->SharpnessXp0Lti = pPeakingDLTIData->SharpnessXp0Lti[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessXp0Lti[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessXp0Lti[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4610. pPeaking_DLTI_Reserve->SharpnessXp1Lti = pPeakingDLTIData->SharpnessXp1Lti[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessXp1Lti[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessXp1Lti[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4611. pPeaking_DLTI_Reserve->SharpnessXp2Lti = pPeakingDLTIData->SharpnessXp2Lti[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessXp2Lti[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessXp2Lti[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4612. pPeaking_DLTI_Reserve->SharpnessXp3Lti = pPeakingDLTIData->SharpnessXp3Lti[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessXp3Lti[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessXp3Lti[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4613. pPeaking_DLTI_Reserve->SharpnessYp0Lti = pPeakingDLTIData->SharpnessYp0Lti[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessYp0Lti[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessYp0Lti[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4614. pPeaking_DLTI_Reserve->SharpnessYp1Lti = pPeakingDLTIData->SharpnessYp1Lti[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessYp1Lti[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessYp1Lti[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4615. pPeaking_DLTI_Reserve->SharpnessYp2Lti = pPeakingDLTIData->SharpnessYp2Lti[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessYp2Lti[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessYp2Lti[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4616. pPeaking_DLTI_Reserve->SharpnessMp1Lti = pPeakingDLTIData->SharpnessMp1Lti[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessMp1Lti[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessMp1Lti[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4617. pPeaking_DLTI_Reserve->SharpnessMp2Lti = pPeakingDLTIData->SharpnessMp2Lti[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessMp2Lti[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessMp2Lti[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4618. pPeaking_DLTI_Reserve->SharpnessGainBPPeak1D = pPeakingDLTIData->SharpnessGainBPPeak1D[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessGainBPPeak1D[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessGainBPPeak1D[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4619. pPeaking_DLTI_Reserve->SharpnessGainEPPeak1D = pPeakingDLTIData->SharpnessGainEPPeak1D[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessGainEPPeak1D[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessGainEPPeak1D[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4620. pPeaking_DLTI_Reserve->SharpnessGainHPPeak1D = pPeakingDLTIData->SharpnessGainHPPeak1D[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessGainHPPeak1D[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessGainHPPeak1D[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4621. pPeaking_DLTI_Reserve->SharpnessGainNegPeak = pPeakingDLTIData->SharpnessGainNegPeak[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessGainNegPeak[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessGainNegPeak[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4622. pPeaking_DLTI_Reserve->SharpnessGainHPV31 = pPeakingDLTIData->SharpnessGainHPV31[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessGainHPV31[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessGainHPV31[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4623. pPeaking_DLTI_Reserve->SharpnessGainHPV51 = pPeakingDLTIData->SharpnessGainHPV51[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessGainHPV51[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessGainHPV51[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4624. pPeaking_DLTI_Reserve->SharpnessCoringPeak1D = pPeakingDLTIData->SharpnessCoringPeak1D[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessCoringPeak1D[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessCoringPeak1D[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4625. pPeaking_DLTI_Reserve->SharpnessCoringPeak = pPeakingDLTIData->SharpnessCoringPeak[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessCoringPeak[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessCoringPeak[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4626. pPeaking_DLTI_Reserve->SharpnessCoringPeakV = pPeakingDLTIData->SharpnessCoringPeakV[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessCoringPeakV[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessCoringPeakV[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4627. pPeaking_DLTI_Reserve->SharpnessHiCoringPeak = pPeakingDLTIData->SharpnessHiCoringPeak[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessHiCoringPeak[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessHiCoringPeak[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4628. pPeaking_DLTI_Reserve->SharpnessGainHP0Peak2D = pPeakingDLTIData->SharpnessGainHP0Peak2D[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessGainHP0Peak2D[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessGainHP0Peak2D[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4629. pPeaking_DLTI_Reserve->SharpnessGainHP1Peak2D = pPeakingDLTIData->SharpnessGainHP1Peak2D[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessGainHP1Peak2D[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessGainHP1Peak2D[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4630. pPeaking_DLTI_Reserve->SharpnessGainBP0Peak2D = pPeakingDLTIData->SharpnessGainBP0Peak2D[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessGainBP0Peak2D[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessGainBP0Peak2D[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4631. pPeaking_DLTI_Reserve->SharpnessGainBP1Peak2D = pPeakingDLTIData->SharpnessGainBP1Peak2D[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessGainBP1Peak2D[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessGainBP1Peak2D[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4632. pPeaking_DLTI_Reserve->SharpnessCoringPeak2D = pPeakingDLTIData->SharpnessCoringPeak2D[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessCoringPeak2D[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessCoringPeak2D[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4633. pPeaking_DLTI_Reserve->SharpnessMaxMinHSLrTap = pPeakingDLTIData->SharpnessMaxMinHSLrTap[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessMaxMinHSLrTap[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessMaxMinHSLrTap[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4634. pPeaking_DLTI_Reserve->SharpnessMaxMinVSLrTap = pPeakingDLTIData->SharpnessMaxMinVSLrTap[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessMaxMinVSLrTap[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessMaxMinVSLrTap[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4635. pPeaking_DLTI_Reserve->SharpnessAdjcentDiffTh = pPeakingDLTIData->SharpnessAdjcentDiffTh[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessAdjcentDiffTh[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessAdjcentDiffTh[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4636. pPeaking_DLTI_Reserve->SharpnessDLTIBpGain = pPeakingDLTIData->SharpnessDLTIBpGain[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessDLTIBpGain[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessDLTIBpGain[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4637. pPeaking_DLTI_Reserve->SharpnessDLTIEpGain = pPeakingDLTIData->SharpnessDLTIEpGain[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessDLTIEpGain[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessDLTIEpGain[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4638. pPeaking_DLTI_Reserve->SharpnessDLTIHpGain = pPeakingDLTIData->SharpnessDLTIHpGain[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessDLTIHpGain[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessDLTIHpGain[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4639. pPeaking_DLTI_Reserve->SharpnessCoringLti = pPeakingDLTIData->SharpnessCoringLti[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessCoringLti[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessCoringLti[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4640. pPeaking_DLTI_Reserve->SharpnessHiCoringLti = pPeakingDLTIData->SharpnessHiCoringLti[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessHiCoringLti[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessHiCoringLti[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4641. pPeaking_DLTI_Reserve->SharpnessDeOvstNewMethodPeak = pPeakingDLTIData->SharpnessDeOvstNewMethodPeak[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessDeOvstNewMethodPeak[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessDeOvstNewMethodPeak[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4642. pPeaking_DLTI_Reserve->SharpnessDeOvseNewMethodLti = pPeakingDLTIData->SharpnessDeOvseNewMethodLti[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessDeOvseNewMethodLti[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessDeOvseNewMethodLti[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4643. pPeaking_DLTI_Reserve->SharpnessOverMaxPeak = pPeakingDLTIData->SharpnessOverMaxPeak[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessOverMaxPeak[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessOverMaxPeak[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4644. pPeaking_DLTI_Reserve->SharpnessOverMinPeak = pPeakingDLTIData->SharpnessOverMinPeak[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessOverMinPeak[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessOverMinPeak[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4645. pPeaking_DLTI_Reserve->SharpnessOvstGainMaxPeak = pPeakingDLTIData->SharpnessOvstGainMaxPeak[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessOvstGainMaxPeak[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessOvstGainMaxPeak[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4646. pPeaking_DLTI_Reserve->SharpnessOvstGainMinPeak = pPeakingDLTIData->SharpnessOvstGainMinPeak[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessOvstGainMinPeak[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessOvstGainMinPeak[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4647. pPeaking_DLTI_Reserve->SharpnessOverMaxLti = pPeakingDLTIData->SharpnessOverMaxLti[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessOverMaxLti[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessOverMaxLti[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4648. pPeaking_DLTI_Reserve->SharpnessOverMinLti = pPeakingDLTIData->SharpnessOverMinLti[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessOverMinLti[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessOverMinLti[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4649. pPeaking_DLTI_Reserve->SharpnessOvstGainMaxLti = pPeakingDLTIData->SharpnessOvstGainMaxLti[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessOvstGainMaxLti[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessOvstGainMaxLti[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4650. pPeaking_DLTI_Reserve->SharpnessOvstGainMinLti = pPeakingDLTIData->SharpnessOvstGainMinLti[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessOvstGainMinLti[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessOvstGainMinLti[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4651. pPeaking_DLTI_Reserve->SharpnessMaxMinHSLrTapLti = pPeakingDLTIData->SharpnessMaxMinHSLrTapLti[PQ_SHARPNESS_50PERCENT]+ (pPeakingDLTIData->SharpnessMaxMinHSLrTapLti[PQ_SHARPNESS_100PERCENT] - pPeakingDLTIData->SharpnessMaxMinHSLrTapLti[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  4652. }
  4653. return;
  4654. }
  4655. if(bStart)
  4656. {
  4657. bStart = FALSE;
  4658. switch(pHwContext->PqPatch.PeakLtiPatch){
  4659. case PEAKLTI_AV_IRE_PATCH:
  4660. case PEAKLTI_AV_GRAYSCALE_PATCH:
  4661. PQ_RegisterWrite(VIP_REG_SLR_2D_SEL_SP, 1);
  4662. PQ_RegisterWrite(VIP_REG_SLR_SHARPNESS_PEAK_EN, 1);
  4663. PQ_RegisterWrite(VIP_REG_SLR_SHARPNESS_LTI_EN, 1);
  4664. PQ_RegisterWrite(VIP_REG_SHARPNESS_MAX_MIN_LR_TAP, 4);
  4665. PQ_RegisterWrite(VIP_REG_SHARPNESS_MAX_MIN_H_LR_TAP, 4);
  4666. PQ_RegisterWrite(VIP_REG_SHARPNESS_MAX_MIN_HS_LR_TAP, 0);
  4667. PQ_RegisterWrite(VIP_REG_SHARPNESS_MAX_MIN_V_LR_TAP, 2);
  4668. PQ_RegisterWrite(VIP_REG_SHARPNESS_MAX_MIN_VS_LR_TAP, 0);
  4669. PQ_RegisterWrite(VIP_REG_SHARPNESS_ADJCENT_DIFF_TH, 0x20);
  4670. PQ_RegisterWrite(VIP_REG_SHARPNESS_FILTER_MODE_PEAK1D, 0);
  4671. PQ_RegisterWrite(VIP_REG_SHARPNESS_LOW_PASS_PEAK1D, 1);
  4672. PQ_RegisterWrite(VIP_REG_SHARPNESS_BP_SEL_PEAK1D, 1);
  4673. PQ_RegisterWrite(VIP_REG_SHARPNESS_EP_SEL_PEAK1D, 0);
  4674. PQ_RegisterWrite(VIP_REG_SHARPNESS_HP_SEL_PEAK1D, 0);
  4675. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_BP_PEAK1D, 0xc);
  4676. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_EP_PEAK1D, 0);
  4677. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_HP_PEAK1D, 0);
  4678. PQ_RegisterWrite(VIP_REG_SHARPNESS_CORING_PEAK1D, 0x8);
  4679. PQ_RegisterWrite(VIP_REG_SHARPNESS_LOW_PASS_LTI, 0);
  4680. PQ_RegisterWrite(VIP_REG_SHARPNESS_BP_SEL_LTI, 1);
  4681. PQ_RegisterWrite(VIP_REG_SHARPNESS_EP_SEL_LTI, 0);
  4682. PQ_RegisterWrite(VIP_REG_SHARPNESS_HP_SEL_LTI, 0);
  4683. PQ_RegisterWrite(VIP_REG_SHARPNESS_ST_SEL, 2);
  4684. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_BP_LTI, 0);
  4685. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_EP_LTI, 0xa);
  4686. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_HP_LTI, 0);
  4687. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_BP0_PEAK2D, 0x7);
  4688. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_BP1_PEAK2D, 0);
  4689. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_HP0_PEAK2D, 0);
  4690. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_HP1_PEAK2D, 0);
  4691. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_HP_V31, 0);
  4692. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_HP_V51, 7);
  4693. PQ_RegisterWrite(VIP_REG_SHARPNESS_CORING_PEAKV, 0x8);
  4694. PQ_RegisterWrite(VIP_REG_SHARPNESS_CORING_PEAK2D, 0x10);
  4695. PQ_RegisterWrite(VIP_REG_SHARPNESS_ABS_LP_EN_PEAK, 1);
  4696. PQ_RegisterWrite(VIP_REG_SHARPNESS_XP0_PEAK, 0);
  4697. PQ_RegisterWrite(VIP_REG_SHARPNESS_XP1_PEAK, 0x27);
  4698. PQ_RegisterWrite(VIP_REG_SHARPNESS_XP2_PEAK, 0xbe);
  4699. PQ_RegisterWrite(VIP_REG_SHARPNESS_XP3_PEAK, 0xff);
  4700. PQ_RegisterWrite(VIP_REG_SHARPNESS_YP0_PEAK, 0x23);
  4701. PQ_RegisterWrite(VIP_REG_SHARPNESS_YP1_PEAK, 0x53);
  4702. PQ_RegisterWrite(VIP_REG_SHARPNESS_YP2_PEAK, 0);
  4703. PQ_RegisterWrite(VIP_REG_SHARPNESS_MP1_PEAK, 0x13);
  4704. PQ_RegisterWrite(VIP_REG_SHARPNESS_MP2_PEAK, 0x14);
  4705. PQ_RegisterWrite(VIP_REG_SHARPNESS_CORING_PEAK, 20);
  4706. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_NEG_PEAK, 0x7);
  4707. PQ_RegisterWrite(VIP_REG_SHARPNESS_DEOVST_NEW_METHOD_PEAK, 1);
  4708. PQ_RegisterWrite(VIP_REG_SHARPNESS_OVST_GAIN_MAX_PEAK, 3);
  4709. PQ_RegisterWrite(VIP_REG_SHARPNESS_OVST_GAIN_MIN_PEAK, 3);
  4710. PQ_RegisterWrite(VIP_REG_SHARPNESS_OVER_MAX_PEAK, 0x60);
  4711. PQ_RegisterWrite(VIP_REG_SHARPNESS_OVER_MIN_PEAK, 0x40);
  4712. PQ_RegisterWrite(VIP_REG_SHARPNESS_HI_CORING_PEAK, 0x12);
  4713. PQ_RegisterWrite(VIP_REG_SHARPNESS_ABS_LP_EN_LTI, 0);
  4714. PQ_RegisterWrite(VIP_REG_SHARPNESS_XP0_LTI, 0);
  4715. PQ_RegisterWrite(VIP_REG_SHARPNESS_XP1_LTI, 0x2a);
  4716. PQ_RegisterWrite(VIP_REG_SHARPNESS_XP2_LTI, 0xd6);
  4717. PQ_RegisterWrite(VIP_REG_SHARPNESS_XP3_LTI, 0xff);
  4718. PQ_RegisterWrite(VIP_REG_SHARPNESS_YP0_LTI, 0x33);
  4719. PQ_RegisterWrite(VIP_REG_SHARPNESS_YP1_LTI, 0x71);
  4720. PQ_RegisterWrite(VIP_REG_SHARPNESS_YP2_LTI, 0);
  4721. PQ_RegisterWrite(VIP_REG_SHARPNESS_MP1_LTI, 0x17);
  4722. PQ_RegisterWrite(VIP_REG_SHARPNESS_MP2_LTI, 0x2c);
  4723. PQ_RegisterWrite(VIP_REG_SHARPNESS_CORING_LTI, 0);
  4724. PQ_RegisterWrite(VIP_REG_SHARPNESS_DEOVST_NEW_METHOD_LTI, 1);
  4725. PQ_RegisterWrite(VIP_REG_SHARPNESS_OVST_GAIN_MAX_LTI, 3);
  4726. PQ_RegisterWrite(VIP_REG_SHARPNESS_OVST_GAIN_MIN_LTI, 3);
  4727. PQ_RegisterWrite(VIP_REG_SHARPNESS_OVER_MAX_LTI, 0xc8);
  4728. PQ_RegisterWrite(VIP_REG_SHARPNESS_OVER_MIN_LTI, 0xc8);
  4729. PQ_RegisterWrite(VIP_REG_SHARPNESS_HI_CORING_LTI, 0x64);
  4730. PQ_RegisterWrite(VIP_REG_SHARPNESS_MAX_MIN_H_LR_TAP_LTI, 0x5);
  4731. PQ_RegisterWrite(VIP_REG_SHARPNESS_MAX_MIN_HS_LR_TAP_LTI, 0);
  4732. break;
  4733. default:
  4734. if(pPeaking_DLTI_Reserve->SharpnessGainEPPeak1D != 0)
  4735. {
  4736. if(pPeakingDLTIData->SharpnessPeakingEpTap[PQ_SHARPNESS_0PERCENT] == EP_11_TAP)
  4737. {
  4738. H_Peaking_Tap_Num = 5;
  4739. }
  4740. else
  4741. {
  4742. H_Peaking_Tap_Num = 6;
  4743. }
  4744. }
  4745. else if(pPeaking_DLTI_Reserve->SharpnessGainEPPeak1D == 0 && pPeaking_DLTI_Reserve->SharpnessGainBPPeak1D != 0)
  4746. {
  4747. if(pPeakingDLTIData->SharpnessPeakingBpTap[PQ_SHARPNESS_0PERCENT] == BP_7_TAP)
  4748. {
  4749. H_Peaking_Tap_Num = 3;
  4750. }
  4751. else
  4752. {
  4753. H_Peaking_Tap_Num = 4;
  4754. }
  4755. }
  4756. else if(pPeaking_DLTI_Reserve->SharpnessGainEPPeak1D == 0 && pPeaking_DLTI_Reserve->SharpnessGainBPPeak1D == 0 && pPeaking_DLTI_Reserve->SharpnessGainHPPeak1D != 0)
  4757. {
  4758. if(pPeakingDLTIData->SharpnessPeakingHpTap[PQ_SHARPNESS_0PERCENT] == HP_3_TAP)
  4759. {
  4760. H_Peaking_Tap_Num = 1;
  4761. }
  4762. else
  4763. {
  4764. H_Peaking_Tap_Num = 2;
  4765. }
  4766. }
  4767. else
  4768. {
  4769. if(pPeaking_DLTI_Reserve->SharpnessGainHP1Peak2D != 0)
  4770. {
  4771. H_Peaking_Tap_Num = 2;
  4772. }
  4773. else
  4774. {
  4775. H_Peaking_Tap_Num = 1;
  4776. }
  4777. }
  4778. // 2D
  4779. if(pPeaking_DLTI_Reserve->SharpnessGainBP1Peak2D != 0)
  4780. {
  4781. Peaking_2D_Tap_Num = 4;
  4782. }
  4783. else if(pPeaking_DLTI_Reserve->SharpnessGainBP1Peak2D == 0 && pPeaking_DLTI_Reserve->SharpnessGainBP0Peak2D != 0)
  4784. {
  4785. Peaking_2D_Tap_Num = 3;
  4786. }
  4787. else if(pPeaking_DLTI_Reserve->SharpnessGainBP1Peak2D == 0 && pPeaking_DLTI_Reserve->SharpnessGainBP0Peak2D == 0 && pPeaking_DLTI_Reserve->SharpnessGainHP1Peak2D != 0)
  4788. {
  4789. Peaking_2D_Tap_Num = 2;
  4790. }
  4791. else
  4792. {
  4793. Peaking_2D_Tap_Num = 1;
  4794. }
  4795. if(pPeaking_DLTI_Reserve->SharpnessDLTIEpGain != 0)
  4796. {
  4797. if(pPeakingDLTIData->SharpnessDLTIEpTap[PQ_SHARPNESS_0PERCENT] == EP_11_TAP)
  4798. {
  4799. DLTI_Tap_Num = 5;
  4800. }
  4801. else
  4802. {
  4803. DLTI_Tap_Num = 6;
  4804. }
  4805. }
  4806. else if(pPeaking_DLTI_Reserve->SharpnessDLTIEpGain == 0 && pPeaking_DLTI_Reserve->SharpnessDLTIBpGain != 0)
  4807. {
  4808. if(pPeakingDLTIData->SharpnessDLTIBpTap[PQ_SHARPNESS_0PERCENT] == BP_7_TAP)
  4809. {
  4810. DLTI_Tap_Num = 3;
  4811. }
  4812. else
  4813. {
  4814. DLTI_Tap_Num = 4;
  4815. }
  4816. }
  4817. else if(pPeaking_DLTI_Reserve->SharpnessDLTIEpGain == 0 && pPeaking_DLTI_Reserve->SharpnessDLTIBpGain == 0 && pPeaking_DLTI_Reserve->SharpnessDLTIHpGain != 0)
  4818. {
  4819. if(pPeakingDLTIData->SharpnessDLTIHpTap[PQ_SHARPNESS_0PERCENT] == HP_3_TAP)
  4820. {
  4821. DLTI_Tap_Num = 1;
  4822. }
  4823. else
  4824. {
  4825. DLTI_Tap_Num = 2;
  4826. }
  4827. }
  4828. //V Peaing
  4829. if(pPeaking_DLTI_Reserve->SharpnessGainHPV51 != 0)
  4830. {
  4831. V_Peaking_Tap_Num = 2;
  4832. }
  4833. else
  4834. {
  4835. V_Peaking_Tap_Num = 1;
  4836. }
  4837. //hw request, if 2D tap > V peaking, use 2d tap number
  4838. if(Peaking_2D_Tap_Num > V_Peaking_Tap_Num)
  4839. {
  4840. V_Peaking_Tap_Num = 2;
  4841. }
  4842. PQ_RegisterWrite(VIP_REG_SLR_2D_SEL_SP, pPeakingDLTIData->SLR2DSelSp[PQ_SHARPNESS_0PERCENT]);
  4843. PQ_RegisterWrite(VIP_REG_SLR_SHARPNESS_PEAK_EN, pPeakingDLTIData->SharpnessPeakingEn[PQ_SHARPNESS_0PERCENT]);
  4844. PQ_RegisterWrite(VIP_REG_SLR_SHARPNESS_LTI_EN, pPeakingDLTIData->SharpnessLTIEn[PQ_SHARPNESS_0PERCENT]);
  4845. PQ_RegisterWrite(VIP_REG_SHARPNESS_MAX_MIN_LR_TAP, (H_Peaking_Tap_Num > Peaking_2D_Tap_Num)? H_Peaking_Tap_Num : Peaking_2D_Tap_Num);
  4846. PQ_RegisterWrite(VIP_REG_SHARPNESS_MAX_MIN_H_LR_TAP, (H_Peaking_Tap_Num > Peaking_2D_Tap_Num)? H_Peaking_Tap_Num : Peaking_2D_Tap_Num);
  4847. PQ_RegisterWrite(VIP_REG_SHARPNESS_MAX_MIN_HS_LR_TAP, pPeaking_DLTI_Reserve->SharpnessMaxMinHSLrTap);
  4848. PQ_RegisterWrite(VIP_REG_SHARPNESS_MAX_MIN_V_LR_TAP, V_Peaking_Tap_Num);
  4849. PQ_RegisterWrite(VIP_REG_SHARPNESS_MAX_MIN_VS_LR_TAP, pPeaking_DLTI_Reserve->SharpnessMaxMinVSLrTap);
  4850. PQ_RegisterWrite(VIP_REG_SHARPNESS_ADJCENT_DIFF_TH, pPeaking_DLTI_Reserve->SharpnessAdjcentDiffTh);
  4851. PQ_RegisterWrite(VIP_REG_SHARPNESS_FILTER_MODE_PEAK1D, pPeakingDLTIData->SharpnessFilterModePeak1D[PQ_SHARPNESS_0PERCENT]);
  4852. PQ_RegisterWrite(VIP_REG_SHARPNESS_LOW_PASS_PEAK1D, pPeakingDLTIData->SharpnessLowPassPeak1D[PQ_SHARPNESS_0PERCENT]);
  4853. PQ_RegisterWrite(VIP_REG_SHARPNESS_BP_SEL_PEAK1D, pPeakingDLTIData->SharpnessPeakingBpTap[PQ_SHARPNESS_0PERCENT]);
  4854. PQ_RegisterWrite(VIP_REG_SHARPNESS_EP_SEL_PEAK1D, pPeakingDLTIData->SharpnessPeakingEpTap[PQ_SHARPNESS_0PERCENT]);
  4855. PQ_RegisterWrite(VIP_REG_SHARPNESS_HP_SEL_PEAK1D, pPeakingDLTIData->SharpnessPeakingHpTap[PQ_SHARPNESS_0PERCENT]);
  4856. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_BP_PEAK1D, pPeaking_DLTI_Reserve->SharpnessGainBPPeak1D);
  4857. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_EP_PEAK1D, pPeaking_DLTI_Reserve->SharpnessGainEPPeak1D);
  4858. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_HP_PEAK1D, pPeaking_DLTI_Reserve->SharpnessGainHPPeak1D);
  4859. PQ_RegisterWrite(VIP_REG_SHARPNESS_CORING_PEAK1D, pPeaking_DLTI_Reserve->SharpnessCoringPeak1D);
  4860. PQ_RegisterWrite(VIP_REG_SHARPNESS_LOW_PASS_LTI, pPeakingDLTIData->SharpnessLowPassLti[PQ_SHARPNESS_0PERCENT]);
  4861. PQ_RegisterWrite(VIP_REG_SHARPNESS_BP_SEL_LTI, pPeakingDLTIData->SharpnessDLTIBpTap[PQ_SHARPNESS_0PERCENT]);
  4862. PQ_RegisterWrite(VIP_REG_SHARPNESS_EP_SEL_LTI, pPeakingDLTIData->SharpnessDLTIEpTap[PQ_SHARPNESS_0PERCENT]);
  4863. PQ_RegisterWrite(VIP_REG_SHARPNESS_HP_SEL_LTI, pPeakingDLTIData->SharpnessDLTIHpTap[PQ_SHARPNESS_0PERCENT]);
  4864. PQ_RegisterWrite(VIP_REG_SHARPNESS_ST_SEL, pPeakingDLTIData->SharpnessStSel[PQ_SHARPNESS_0PERCENT]);
  4865. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_BP_LTI, pPeaking_DLTI_Reserve->SharpnessDLTIBpGain);
  4866. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_EP_LTI, pPeaking_DLTI_Reserve->SharpnessDLTIEpGain);
  4867. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_HP_LTI, pPeaking_DLTI_Reserve->SharpnessDLTIHpGain);
  4868. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_BP0_PEAK2D, pPeaking_DLTI_Reserve->SharpnessGainBP0Peak2D);
  4869. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_BP1_PEAK2D, pPeaking_DLTI_Reserve->SharpnessGainBP1Peak2D);
  4870. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_HP0_PEAK2D, pPeaking_DLTI_Reserve->SharpnessGainHP0Peak2D);
  4871. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_HP1_PEAK2D, pPeaking_DLTI_Reserve->SharpnessGainHP1Peak2D);
  4872. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_HP_V31, pPeaking_DLTI_Reserve->SharpnessGainHPV31);
  4873. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_HP_V51, pPeaking_DLTI_Reserve->SharpnessGainHPV51);
  4874. PQ_RegisterWrite(VIP_REG_SHARPNESS_CORING_PEAKV, pPeaking_DLTI_Reserve->SharpnessCoringPeakV);
  4875. PQ_RegisterWrite(VIP_REG_SHARPNESS_CORING_PEAK2D, pPeaking_DLTI_Reserve->SharpnessCoringPeak2D);
  4876. PQ_RegisterWrite(VIP_REG_SHARPNESS_ABS_LP_EN_PEAK, pPeakingDLTIData->SharpnessAbsLpEnPeak[PQ_SHARPNESS_0PERCENT]);
  4877. PQ_RegisterWrite(VIP_REG_SHARPNESS_XP0_PEAK, pPeaking_DLTI_Reserve->SharpnessXp0Peak);
  4878. PQ_RegisterWrite(VIP_REG_SHARPNESS_XP1_PEAK, pPeaking_DLTI_Reserve->SharpnessXp1Peak);
  4879. PQ_RegisterWrite(VIP_REG_SHARPNESS_XP2_PEAK, pPeaking_DLTI_Reserve->SharpnessXp2Peak);
  4880. PQ_RegisterWrite(VIP_REG_SHARPNESS_XP3_PEAK, pPeaking_DLTI_Reserve->SharpnessXp3Peak);
  4881. PQ_RegisterWrite(VIP_REG_SHARPNESS_YP0_PEAK, pPeaking_DLTI_Reserve->SharpnessYp0Peak);
  4882. PQ_RegisterWrite(VIP_REG_SHARPNESS_YP1_PEAK, pPeaking_DLTI_Reserve->SharpnessYp1Peak);
  4883. PQ_RegisterWrite(VIP_REG_SHARPNESS_YP2_PEAK, pPeaking_DLTI_Reserve->SharpnessYp2Peak);
  4884. PQ_RegisterWrite(VIP_REG_SHARPNESS_MP1_PEAK, pPeaking_DLTI_Reserve->SharpnessMp1Peak);
  4885. PQ_RegisterWrite(VIP_REG_SHARPNESS_MP2_PEAK, pPeaking_DLTI_Reserve->SharpnessMp2Peak);
  4886. PQ_RegisterWrite(VIP_REG_SHARPNESS_CORING_PEAK, pPeaking_DLTI_Reserve->SharpnessCoringPeak);
  4887. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_NEG_PEAK, pPeaking_DLTI_Reserve->SharpnessGainNegPeak);
  4888. PQ_RegisterWrite(VIP_REG_SHARPNESS_DEOVST_NEW_METHOD_PEAK, pPeaking_DLTI_Reserve->SharpnessDeOvstNewMethodPeak);
  4889. PQ_RegisterWrite(VIP_REG_SHARPNESS_OVST_GAIN_MAX_PEAK, pPeaking_DLTI_Reserve->SharpnessOvstGainMaxPeak);
  4890. PQ_RegisterWrite(VIP_REG_SHARPNESS_OVST_GAIN_MIN_PEAK, pPeaking_DLTI_Reserve->SharpnessOvstGainMinPeak);
  4891. PQ_RegisterWrite(VIP_REG_SHARPNESS_OVER_MAX_PEAK, pPeaking_DLTI_Reserve->SharpnessOverMaxPeak);
  4892. PQ_RegisterWrite(VIP_REG_SHARPNESS_OVER_MIN_PEAK, pPeaking_DLTI_Reserve->SharpnessOverMinPeak);
  4893. PQ_RegisterWrite(VIP_REG_SHARPNESS_HI_CORING_PEAK, pPeaking_DLTI_Reserve->SharpnessHiCoringPeak);
  4894. PQ_RegisterWrite(VIP_REG_SHARPNESS_ABS_LP_EN_LTI, pPeakingDLTIData->SharpnessAbsLpEnLti[PQ_SHARPNESS_0PERCENT]);
  4895. PQ_RegisterWrite(VIP_REG_SHARPNESS_XP0_LTI, pPeaking_DLTI_Reserve->SharpnessXp0Lti);
  4896. PQ_RegisterWrite(VIP_REG_SHARPNESS_XP1_LTI, pPeaking_DLTI_Reserve->SharpnessXp1Lti);
  4897. PQ_RegisterWrite(VIP_REG_SHARPNESS_XP2_LTI, pPeaking_DLTI_Reserve->SharpnessXp2Lti);
  4898. PQ_RegisterWrite(VIP_REG_SHARPNESS_XP3_LTI, pPeaking_DLTI_Reserve->SharpnessXp3Lti);
  4899. PQ_RegisterWrite(VIP_REG_SHARPNESS_YP0_LTI, pPeaking_DLTI_Reserve->SharpnessYp0Lti);
  4900. PQ_RegisterWrite(VIP_REG_SHARPNESS_YP1_LTI, pPeaking_DLTI_Reserve->SharpnessYp1Lti);
  4901. PQ_RegisterWrite(VIP_REG_SHARPNESS_YP2_LTI, pPeaking_DLTI_Reserve->SharpnessYp2Lti);
  4902. PQ_RegisterWrite(VIP_REG_SHARPNESS_MP1_LTI, pPeaking_DLTI_Reserve->SharpnessMp1Lti);
  4903. PQ_RegisterWrite(VIP_REG_SHARPNESS_MP2_LTI, pPeaking_DLTI_Reserve->SharpnessMp2Lti);
  4904. PQ_RegisterWrite(VIP_REG_SHARPNESS_CORING_LTI, pPeaking_DLTI_Reserve->SharpnessCoringLti);
  4905. PQ_RegisterWrite(VIP_REG_SHARPNESS_DEOVST_NEW_METHOD_LTI, pPeaking_DLTI_Reserve->SharpnessDeOvseNewMethodLti);
  4906. PQ_RegisterWrite(VIP_REG_SHARPNESS_OVST_GAIN_MAX_LTI, pPeaking_DLTI_Reserve->SharpnessOvstGainMaxLti);
  4907. PQ_RegisterWrite(VIP_REG_SHARPNESS_OVST_GAIN_MIN_LTI, pPeaking_DLTI_Reserve->SharpnessOvstGainMinLti);
  4908. PQ_RegisterWrite(VIP_REG_SHARPNESS_OVER_MAX_LTI, pPeaking_DLTI_Reserve->SharpnessOverMaxLti);
  4909. PQ_RegisterWrite(VIP_REG_SHARPNESS_OVER_MIN_LTI, pPeaking_DLTI_Reserve->SharpnessOverMinLti);
  4910. PQ_RegisterWrite(VIP_REG_SHARPNESS_HI_CORING_LTI, pPeaking_DLTI_Reserve->SharpnessHiCoringLti);
  4911. PQ_RegisterWrite(VIP_REG_SHARPNESS_MAX_MIN_H_LR_TAP_LTI, DLTI_Tap_Num);
  4912. PQ_RegisterWrite(VIP_REG_SHARPNESS_MAX_MIN_HS_LR_TAP_LTI, pPeaking_DLTI_Reserve->SharpnessMaxMinHSLrTapLti);
  4913. break;
  4914. };
  4915. PQ_RegisterWrite(VIP_REG_SHARPNESS_PEAKING_2D_OFF, 0);//tool don't control
  4916. PQ_RegisterWrite(VIP_REG_SLR_SHARPNESS_EN, 1);//tool don't control
  4917. PQ_RegisterWrite(VIP_REG_SHARPNESS_MODE_SHARP_SEL, 0);//tool don't control
  4918. PQ_RegisterWrite(VIP_REG_SLR_SHARPNESS_MAX_MIN_METHOD, 1);//tool don't control
  4919. PQ_RegisterWrite(VIP_REG_SLR_SHARPNESS_MAX_MIN_2D_EN, 1);//tool don't control
  4920. PQ_RegisterWrite(VIP_REG_SHARPNESS_FLAT_TH, 0x1e);//tool don't control
  4921. PQ_RegisterWrite(VIP_REG_SHARPNESS_PROG_FIL_C0, 0xff);//tool don't control
  4922. PQ_RegisterWrite(VIP_REG_SHARPNESS_PROG_FIL_C1, 0xff);//tool don't control
  4923. PQ_RegisterWrite(VIP_REG_SHARPNESS_PROG_FIL_C2, 0xfe);//tool don't control
  4924. PQ_RegisterWrite(VIP_REG_SHARPNESS_PROG_FIL_C3, 0xff);//tool don't control
  4925. PQ_RegisterWrite(VIP_REG_SHARPNESS_PROG_FIL_C4, 0x1);//tool don't control
  4926. PQ_RegisterWrite(VIP_REG_SHARPNESS_PROG_FIL_C5, 0x2);//tool don't control
  4927. PQ_RegisterWrite(VIP_REG_SHARPNESS_PROG_FIL_C6, 0x4);//tool don't control
  4928. PQ_RegisterWrite(VIP_REG_SHARPNESS_PROG_FIL_GAIN, 3);//tool don't control
  4929. PQ_RegisterWrite(VIP_REG_SHARPNESS_CORING_PEAKS, 0); //tool don't control
  4930. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_HP_SN31, 0);//tool don't control
  4931. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_HP_SP31, 0);//tool don't control
  4932. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_HP_SN51, 0);//tool don't control
  4933. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_HP_SP51, 0);//tool don't control
  4934. if (VIP_GetUserSource() == SOURCE_EXTS && !VIP_IsPCSource() && VIP_GetInputVSize() > 700) //#51277
  4935. {
  4936. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_post, 0x0);
  4937. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_BP_PEAK1D, 0x3);
  4938. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_HP_PEAK1D, 0x2);
  4939. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_BP_LTI, 0x3);
  4940. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_HP_LTI, 0x2);
  4941. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_BP0_PEAK2D, 0x0);
  4942. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_HP0_PEAK2D, 0x7);
  4943. }
  4944. if(VIP_IsNetworkSource())
  4945. {
  4946. if(VIP_GetFlipMode()==HV_FLIP || VIP_GetFlipMode() == H_FLIP || VIP_GetFlipMode() == V_FLIP || VIP_GetPanelInvert())
  4947. {
  4948. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_NEG_PEAK, 0);
  4949. PQ_RegisterWrite(VIP_REG_SHARPNESS_GAIN_BP_PEAK1D, 5);
  4950. PQ_RegisterWrite(VIP_REG_SHARPNESS_BP_SEL_PEAK1D, 0);
  4951. }
  4952. }
  4953. }
  4954. }
  4955. void PQ_HorSharpness(BOOL bReset,UINT8 ucValue)//horizontal sharpness
  4956. {
  4957. PQHW_CONTEXT* pHwContext= &PQHwContext;
  4958. //VTAB_SRC_VALUE_DEFINE* pSrcVtab= pHwContext->pCurVtabSrcValue;
  4959. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  4960. INT32 i, Res;
  4961. UINT8 ucTableIndex;
  4962. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  4963. HOR_SHARPNESS_DATA *pHOR_SHARPNESS_DATA;
  4964. static UINT32 dwHorFacReg[6] = {
  4965. VIP_reg_slr_hor_sharp_fac0,VIP_reg_slr_hor_sharp_fac1,VIP_reg_slr_hor_sharp_fac2,
  4966. VIP_reg_slr_hor_sharp_fac0_c,VIP_reg_slr_hor_sharp_fac1_c,VIP_reg_slr_hor_sharp_fac2_c};
  4967. static UINT32 dwHorTHReg[4] = {
  4968. VIP_reg_slr_hor_sharp_th_0,VIP_reg_slr_hor_sharp_th_1,
  4969. VIP_reg_slr_hor_sharp_th_0_c,VIP_reg_slr_hor_sharp_th_1_c};
  4970. static UINT32 dwHorSlopeReg[4] = {
  4971. VIP_reg_slr_hor_sharp_slope_0,VIP_reg_slr_hor_sharp_slope_1,
  4972. VIP_reg_slr_hor_sharp_slope_0_c,VIP_reg_slr_hor_sharp_slope_1_c};
  4973. static UINT32 dwHorOvershtReg[2] = {
  4974. VIP_reg_slr_hor_sharp_oversht_ylmt,VIP_reg_slr_hor_sharp_oversht_clmt};
  4975. static UINT32 dwHorUndershtReg[2] = {
  4976. VIP_reg_slr_hor_sharp_undersht_ylmt,VIP_reg_slr_hor_sharp_undersht_clmt};
  4977. DS_SHARP_INFO TargetInfo;
  4978. static UINT8 bStart = FALSE;
  4979. memset(&TargetInfo, 0, sizeof(DS_SHARP_INFO));//Ren request 20120724
  4980. if(bReset)
  4981. {
  4982. bStart = TRUE;
  4983. return;
  4984. }
  4985. if(bStart)
  4986. {
  4987. bStart = FALSE;
  4988. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  4989. if (pVtab->mHOR_Sharpenss.mGroupedIndex[ucCurrSrcIndex] >= 8) return;
  4990. ucTableIndex = pVtab->mHOR_Sharpenss.mGroupedIndex[ucCurrSrcIndex];
  4991. pHOR_SHARPNESS_DATA = &pVtab->mHOR_Sharpenss.mHOR_Sharpness_Data[ucTableIndex];
  4992. if( pHwContext->bEnableColorProcess==FALSE )
  4993. {
  4994. for(i = 0; i <2; i++)
  4995. {
  4996. PQ_RegisterWrite(dwHorFacReg[i*3], TargetInfo.fac0);
  4997. PQ_RegisterWrite(dwHorFacReg[i*3+1], TargetInfo.fac1);
  4998. PQ_RegisterWrite(dwHorFacReg[i*3+2], TargetInfo.fac2);
  4999. }
  5000. return;
  5001. }
  5002. if( ucValue>127 )
  5003. ucValue= 127;
  5004. PQDebugPrint("%s:ucValue=%d", __FUNCTION__, ucValue);
  5005. if(900 < VIP_GetInputVSize()) // > (1080+720)/2
  5006. Res = 2;
  5007. else if((VIP_GetInputVSize() <= 900 && 648 < VIP_GetInputVSize())) // (720+576)/2 < X <= (1080+720)/2
  5008. Res = 1;
  5009. else //if((VIP_GetInputVSize() <= ((720+576) /2)))
  5010. Res = 0;
  5011. if (1!=pHOR_SHARPNESS_DATA->HorSharpNormal[0].undersht[3]) Res = 0;
  5012. if( ucValue<64 )
  5013. {
  5014. //from weak to normal
  5015. for(i = 0; i <2; i++)
  5016. {
  5017. TargetInfo.fac0 = pHOR_SHARPNESS_DATA->HorSharpWeak[i].fac0+ (pHOR_SHARPNESS_DATA->HorSharpNormal[i].fac0-pHOR_SHARPNESS_DATA->HorSharpWeak[i].fac0) * ucValue / 63;
  5018. TargetInfo.fac1 = pHOR_SHARPNESS_DATA->HorSharpWeak[i].fac1+ (pHOR_SHARPNESS_DATA->HorSharpNormal[i].fac1-pHOR_SHARPNESS_DATA->HorSharpWeak[i].fac1) * ucValue / 63;
  5019. TargetInfo.fac2 = pHOR_SHARPNESS_DATA->HorSharpWeak[i].fac2+ (pHOR_SHARPNESS_DATA->HorSharpNormal[i].fac2-pHOR_SHARPNESS_DATA->HorSharpWeak[i].fac2) * ucValue / 63;
  5020. TargetInfo.th0 = pHOR_SHARPNESS_DATA->HorSharpWeak[i].th0 + (pHOR_SHARPNESS_DATA->HorSharpNormal[i].th0-pHOR_SHARPNESS_DATA->HorSharpWeak[i].th0) * ucValue / 63;
  5021. TargetInfo.th1 = pHOR_SHARPNESS_DATA->HorSharpWeak[i].th1 + (pHOR_SHARPNESS_DATA->HorSharpNormal[i].th1-pHOR_SHARPNESS_DATA->HorSharpWeak[i].th1) * ucValue / 63;
  5022. TargetInfo.slope0 = pHOR_SHARPNESS_DATA->HorSharpWeak[i].slope0 + (pHOR_SHARPNESS_DATA->HorSharpNormal[i].slope0-pHOR_SHARPNESS_DATA->HorSharpWeak[i].slope0) * ucValue / 63;
  5023. TargetInfo.slope1 = pHOR_SHARPNESS_DATA->HorSharpWeak[i].slope1 + (pHOR_SHARPNESS_DATA->HorSharpNormal[i].slope1-pHOR_SHARPNESS_DATA->HorSharpWeak[i].slope1) * ucValue / 63;
  5024. TargetInfo.oversht[Res]= pHOR_SHARPNESS_DATA->HorSharpWeak[i].oversht[Res] + (pHOR_SHARPNESS_DATA->HorSharpNormal[i].oversht[Res]-pHOR_SHARPNESS_DATA->HorSharpWeak[i].oversht[Res]) * ucValue / 63;
  5025. TargetInfo.undersht[Res]= pHOR_SHARPNESS_DATA->HorSharpWeak[i].undersht[Res] + (pHOR_SHARPNESS_DATA->HorSharpNormal[i].undersht[Res]-pHOR_SHARPNESS_DATA->HorSharpWeak[i].undersht[Res]) * ucValue / 63;
  5026. PQ_RegisterWrite(dwHorFacReg[i*3], TargetInfo.fac0);
  5027. PQ_RegisterWrite(dwHorFacReg[i*3+1], TargetInfo.fac1);
  5028. PQ_RegisterWrite(dwHorFacReg[i*3+2], TargetInfo.fac2);
  5029. PQ_RegisterWrite(dwHorTHReg[i*2], TargetInfo.th0);
  5030. PQ_RegisterWrite(dwHorTHReg[i*2+1], TargetInfo.th1);
  5031. PQ_RegisterWrite(dwHorSlopeReg[i*2], TargetInfo.slope0);
  5032. PQ_RegisterWrite(dwHorSlopeReg[i*2+1], TargetInfo.slope1);
  5033. PQ_RegisterWrite(dwHorOvershtReg[i], TargetInfo.oversht[Res]);
  5034. PQ_RegisterWrite(dwHorUndershtReg[i], TargetInfo.undersht[Res]);
  5035. }
  5036. }
  5037. else
  5038. {
  5039. //from normal to strong
  5040. ucValue-= 64;
  5041. for(i = 0; i <2; i++)
  5042. {
  5043. TargetInfo.fac0 = pHOR_SHARPNESS_DATA->HorSharpNormal[i].fac0+ (pHOR_SHARPNESS_DATA->HorSharpStrong[i].fac0-pHOR_SHARPNESS_DATA->HorSharpNormal[i].fac0) * ucValue / 63;
  5044. TargetInfo.fac1 = pHOR_SHARPNESS_DATA->HorSharpNormal[i].fac1+ (pHOR_SHARPNESS_DATA->HorSharpStrong[i].fac1-pHOR_SHARPNESS_DATA->HorSharpNormal[i].fac1) * ucValue / 63;
  5045. TargetInfo.fac2 = pHOR_SHARPNESS_DATA->HorSharpNormal[i].fac2+ (pHOR_SHARPNESS_DATA->HorSharpStrong[i].fac2-pHOR_SHARPNESS_DATA->HorSharpNormal[i].fac2) * ucValue / 63;
  5046. TargetInfo.th0 = pHOR_SHARPNESS_DATA->HorSharpNormal[i].th0 + (pHOR_SHARPNESS_DATA->HorSharpStrong[i].th0-pHOR_SHARPNESS_DATA->HorSharpNormal[i].th0) * ucValue / 63;
  5047. TargetInfo.th1 = pHOR_SHARPNESS_DATA->HorSharpNormal[i].th1 + (pHOR_SHARPNESS_DATA->HorSharpStrong[i].th1-pHOR_SHARPNESS_DATA->HorSharpNormal[i].th1) * ucValue / 63;
  5048. TargetInfo.slope0 = pHOR_SHARPNESS_DATA->HorSharpNormal[i].slope0 + (pHOR_SHARPNESS_DATA->HorSharpStrong[i].slope0-pHOR_SHARPNESS_DATA->HorSharpNormal[i].slope0) * ucValue / 63;
  5049. TargetInfo.slope1 = pHOR_SHARPNESS_DATA->HorSharpNormal[i].slope1 + (pHOR_SHARPNESS_DATA->HorSharpStrong[i].slope1-pHOR_SHARPNESS_DATA->HorSharpNormal[i].slope1) * ucValue / 63;
  5050. TargetInfo.oversht[Res]= pHOR_SHARPNESS_DATA->HorSharpNormal[i].oversht[Res] + (pHOR_SHARPNESS_DATA->HorSharpStrong[i].oversht[Res]-pHOR_SHARPNESS_DATA->HorSharpNormal[i].oversht[Res]) * ucValue / 63;
  5051. TargetInfo.undersht[Res]= pHOR_SHARPNESS_DATA->HorSharpNormal[i].undersht[Res] + (pHOR_SHARPNESS_DATA->HorSharpStrong[i].undersht[Res]-pHOR_SHARPNESS_DATA->HorSharpNormal[i].undersht[Res]) * ucValue / 63;
  5052. PQ_RegisterWrite(dwHorFacReg[i*3], TargetInfo.fac0);
  5053. PQ_RegisterWrite(dwHorFacReg[i*3+1], TargetInfo.fac1);
  5054. PQ_RegisterWrite(dwHorFacReg[i*3+2], TargetInfo.fac2);
  5055. PQ_RegisterWrite(dwHorTHReg[i*2], TargetInfo.th0);
  5056. PQ_RegisterWrite(dwHorTHReg[i*2+1], TargetInfo.th1);
  5057. PQ_RegisterWrite(dwHorSlopeReg[i*2], TargetInfo.slope0);
  5058. PQ_RegisterWrite(dwHorSlopeReg[i*2+1], TargetInfo.slope1);
  5059. PQ_RegisterWrite(dwHorOvershtReg[i], TargetInfo.oversht[Res]);
  5060. PQ_RegisterWrite(dwHorUndershtReg[i], TargetInfo.undersht[Res]);
  5061. }
  5062. }
  5063. #ifdef CONFIG_APPLY_DIFFERENT_SHARPNESS_SETTING_IN_PANEL_INVERT
  5064. if(VIP_GetFlipMode()==HV_FLIP || VIP_GetFlipMode() == H_FLIP || VIP_GetFlipMode() == V_FLIP || VIP_GetPanelInvert())
  5065. {/* Add sharpness setting in invert panel here */ }
  5066. else
  5067. {/* Add sharpness setting in regular panel here */}
  5068. #else
  5069. /* Check different setting status and remove same setting item to here */
  5070. #endif
  5071. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_en, pHOR_SHARPNESS_DATA->HorSharpDark.enable);
  5072. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_th0, pHOR_SHARPNESS_DATA->HorSharpDark.th[0]);
  5073. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_th1, pHOR_SHARPNESS_DATA->HorSharpDark.th[1]);
  5074. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_th2, pHOR_SHARPNESS_DATA->HorSharpDark.th[2]);
  5075. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_th3, pHOR_SHARPNESS_DATA->HorSharpDark.th[3]);
  5076. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_fac0, pHOR_SHARPNESS_DATA->HorSharpDark.fac[0]);
  5077. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_fac1, pHOR_SHARPNESS_DATA->HorSharpDark.fac[1]);
  5078. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_fac2, pHOR_SHARPNESS_DATA->HorSharpDark.fac[2]);
  5079. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_fac3, pHOR_SHARPNESS_DATA->HorSharpDark.fac[3]);
  5080. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_slope0, pHOR_SHARPNESS_DATA->HorSharpDark.slope[0]);
  5081. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_slope1, pHOR_SHARPNESS_DATA->HorSharpDark.slope[1]);
  5082. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_slope2, pHOR_SHARPNESS_DATA->HorSharpDark.slope[2]);
  5083. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_slope3, pHOR_SHARPNESS_DATA->HorSharpDark.slope[3]);
  5084. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_slope4, pHOR_SHARPNESS_DATA->HorSharpDark.slope[4]);
  5085. }
  5086. }
  5087. void PQ_DSSharpness(BOOL bReset,UINT8 ucValue)
  5088. {
  5089. PQHW_CONTEXT* pHwContext= &PQHwContext;
  5090. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  5091. INT32 i, j, Res;
  5092. static UINT8 bStart = FALSE;
  5093. UINT32 SharpRatioTemp;
  5094. static UINT32 dwDS_FacReg[6] = {
  5095. VIP_reg_slr_sharp_fac0,VIP_reg_slr_sharp_fac1,VIP_reg_slr_sharp_fac2,
  5096. VIP_reg_slr_sharp_fac0_c,VIP_reg_slr_sharp_fac1_c,VIP_reg_slr_sharp_fac2_c};
  5097. static UINT32 dwDS_THReg[4] = {
  5098. VIP_reg_slr_ds_sharp_th_0,VIP_reg_slr_ds_sharp_th_1,
  5099. VIP_reg_slr_ds_sharp_th_0_c,VIP_reg_slr_ds_sharp_th_1_c};
  5100. static UINT32 dwDS_SlopeReg[4] = {
  5101. VIP_reg_slr_ds_sharp_slope_0,VIP_reg_slr_ds_sharp_slope_1,
  5102. VIP_reg_slr_ds_sharp_slope_0_c,VIP_reg_slr_ds_sharp_slope_1_c};
  5103. static UINT32 dwDS_OvershtReg[2] = {
  5104. VIP_reg_slr_dscale_sharp_oversht_ylmt,VIP_reg_slr_dscale_sharp_oversht_clmt};
  5105. static UINT32 dwDS_UndershtReg[2] = {
  5106. VIP_reg_slr_dscale_sharp_undersht_ylmt,VIP_reg_slr_dscale_sharp_undersht_clmt};
  5107. static UINT32 dwDS_Y_RatioReg[7] = {
  5108. VIP_reg_slr_ds_sharp_ratio_0,VIP_reg_slr_ds_sharp_ratio_1,VIP_reg_slr_ds_sharp_ratio_2,
  5109. VIP_reg_slr_ds_sharp_ratio_3,VIP_reg_slr_ds_sharp_ratio_4,VIP_reg_slr_ds_sharp_ratio_5,
  5110. VIP_reg_slr_ds_sharp_ratio_6};
  5111. static UINT32 dwDS_C_RatioReg[6] = {
  5112. VIP_reg_slr_ds_sharp_ratio_0_c,VIP_reg_slr_ds_sharp_ratio_1_c,VIP_reg_slr_ds_sharp_ratio_2_c,
  5113. VIP_reg_slr_ds_sharp_ratio_3_c,VIP_reg_slr_ds_sharp_ratio_4_c,VIP_reg_slr_ds_sharp_ratio_5_c};
  5114. DS_SHARP_INFO TargetInfo;
  5115. UINT8 ucTableIndex;
  5116. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  5117. DS_SHARPNESS_DATA *pDS_SHARPNESS_DATA;
  5118. if(bReset)
  5119. {
  5120. bStart = TRUE;
  5121. PQ_HorSharpness(TRUE, ucValue);
  5122. return;
  5123. }
  5124. if(bStart)
  5125. {
  5126. bStart = FALSE;
  5127. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  5128. if (pVtab->mDS_Sharpenss.mGroupedIndex[ucCurrSrcIndex] >= 8) return;
  5129. ucTableIndex = pVtab->mDS_Sharpenss.mGroupedIndex[ucCurrSrcIndex];
  5130. pDS_SHARPNESS_DATA = &pVtab->mDS_Sharpenss.mDS_Sharpness_Data[ucTableIndex];
  5131. memset(&TargetInfo, 0, sizeof(DS_SHARP_INFO));//Ren request 20120724
  5132. //===================start ds sharpness==========================================
  5133. if( pHwContext->bEnableColorProcess==FALSE )
  5134. {
  5135. for(j = 0; j <2; j++)
  5136. {
  5137. PQ_RegisterWrite(dwDS_FacReg[j*3], TargetInfo.fac0);
  5138. PQ_RegisterWrite(dwDS_FacReg[j*3+1], TargetInfo.fac1);
  5139. PQ_RegisterWrite(dwDS_FacReg[j*3+2], TargetInfo.fac2);
  5140. }
  5141. return;
  5142. }
  5143. if( ucValue>127 )
  5144. ucValue= 127;
  5145. PQDebugPrint("%s:ucValue=%d", __FUNCTION__, ucValue);
  5146. if(900 < VIP_GetInputVSize()) // > (1080+720)/2
  5147. Res = 2;
  5148. else if((VIP_GetInputVSize() <= 900 && 648 < VIP_GetInputVSize())) // (720+576)/2 < X <= (1080+720)/2
  5149. Res = 1;
  5150. else //if((VIP_GetInputVSize() <= ((720+576) /2)))
  5151. Res = 0;
  5152. if (1!=pDS_SHARPNESS_DATA->DSSharpNormal[0].undersht[3]) Res = 0;
  5153. if( ucValue<64 )
  5154. {
  5155. //from weak to normal
  5156. for(j = 0; j <2; j++)
  5157. {
  5158. TargetInfo.fac0 = pDS_SHARPNESS_DATA->DSSharpWeak[j].fac0+ (pDS_SHARPNESS_DATA->DSSharpNormal[j].fac0-pDS_SHARPNESS_DATA->DSSharpWeak[j].fac0) * ucValue / 63;
  5159. TargetInfo.fac1 = pDS_SHARPNESS_DATA->DSSharpWeak[j].fac1+ (pDS_SHARPNESS_DATA->DSSharpNormal[j].fac1-pDS_SHARPNESS_DATA->DSSharpWeak[j].fac1) * ucValue / 63;
  5160. TargetInfo.fac2 = pDS_SHARPNESS_DATA->DSSharpWeak[j].fac2+ (pDS_SHARPNESS_DATA->DSSharpNormal[j].fac2-pDS_SHARPNESS_DATA->DSSharpWeak[j].fac2) * ucValue / 63;
  5161. TargetInfo.th0 = pDS_SHARPNESS_DATA->DSSharpWeak[j].th0 + (pDS_SHARPNESS_DATA->DSSharpNormal[j].th0-pDS_SHARPNESS_DATA->DSSharpWeak[j].th0) * ucValue / 63;
  5162. TargetInfo.th1 = pDS_SHARPNESS_DATA->DSSharpWeak[j].th1 + (pDS_SHARPNESS_DATA->DSSharpNormal[j].th1-pDS_SHARPNESS_DATA->DSSharpWeak[j].th1) * ucValue / 63;
  5163. TargetInfo.slope0 = pDS_SHARPNESS_DATA->DSSharpWeak[j].slope0 + (pDS_SHARPNESS_DATA->DSSharpNormal[j].slope0-pDS_SHARPNESS_DATA->DSSharpWeak[j].slope0) * ucValue / 63;
  5164. TargetInfo.slope1 = pDS_SHARPNESS_DATA->DSSharpWeak[j].slope1 + (pDS_SHARPNESS_DATA->DSSharpNormal[j].slope1-pDS_SHARPNESS_DATA->DSSharpWeak[j].slope1) * ucValue / 63;
  5165. TargetInfo.oversht[Res]= pDS_SHARPNESS_DATA->DSSharpWeak[j].oversht[Res] + (pDS_SHARPNESS_DATA->DSSharpNormal[j].oversht[Res]-pDS_SHARPNESS_DATA->DSSharpWeak[j].oversht[Res]) * ucValue / 63;
  5166. TargetInfo.undersht[Res]= pDS_SHARPNESS_DATA->DSSharpWeak[j].undersht[Res] + (pDS_SHARPNESS_DATA->DSSharpNormal[j].undersht[Res]-pDS_SHARPNESS_DATA->DSSharpWeak[j].undersht[Res]) * ucValue / 63;
  5167. PQ_RegisterWrite(dwDS_FacReg[j*3], TargetInfo.fac0);
  5168. PQ_RegisterWrite(dwDS_FacReg[j*3+1], TargetInfo.fac1);
  5169. PQ_RegisterWrite(dwDS_FacReg[j*3+2], TargetInfo.fac2);
  5170. PQ_RegisterWrite(dwDS_THReg[j*2], TargetInfo.th0);
  5171. PQ_RegisterWrite(dwDS_THReg[j*2+1], TargetInfo.th1);
  5172. PQ_RegisterWrite(dwDS_SlopeReg[j*2], TargetInfo.slope0);
  5173. PQ_RegisterWrite(dwDS_SlopeReg[j*2+1], TargetInfo.slope1);
  5174. PQ_RegisterWrite(dwDS_OvershtReg[j], TargetInfo.oversht[Res]);
  5175. PQ_RegisterWrite(dwDS_UndershtReg[j], TargetInfo.undersht[Res]);
  5176. }
  5177. }
  5178. else
  5179. {
  5180. //from normal to strong
  5181. ucValue-= 64;
  5182. for(j = 0; j <2; j++)
  5183. {
  5184. TargetInfo.fac0 = pDS_SHARPNESS_DATA->DSSharpNormal[j].fac0+ (pDS_SHARPNESS_DATA->DSSharpStrong[j].fac0-pDS_SHARPNESS_DATA->DSSharpNormal[j].fac0) * ucValue / 63;
  5185. TargetInfo.fac1 = pDS_SHARPNESS_DATA->DSSharpNormal[j].fac1+ (pDS_SHARPNESS_DATA->DSSharpStrong[j].fac1-pDS_SHARPNESS_DATA->DSSharpNormal[j].fac1) * ucValue / 63;
  5186. TargetInfo.fac2 = pDS_SHARPNESS_DATA->DSSharpNormal[j].fac2+ (pDS_SHARPNESS_DATA->DSSharpStrong[j].fac2-pDS_SHARPNESS_DATA->DSSharpNormal[j].fac2) * ucValue / 63;
  5187. TargetInfo.th0 = pDS_SHARPNESS_DATA->DSSharpNormal[j].th0 + (pDS_SHARPNESS_DATA->DSSharpStrong[j].th0-pDS_SHARPNESS_DATA->DSSharpNormal[j].th0) * ucValue / 63;
  5188. TargetInfo.th1 = pDS_SHARPNESS_DATA->DSSharpNormal[j].th1 + (pDS_SHARPNESS_DATA->DSSharpStrong[j].th1-pDS_SHARPNESS_DATA->DSSharpNormal[j].th1) * ucValue / 63;
  5189. TargetInfo.slope0 = pDS_SHARPNESS_DATA->DSSharpNormal[j].slope0 + (pDS_SHARPNESS_DATA->DSSharpStrong[j].slope0-pDS_SHARPNESS_DATA->DSSharpNormal[j].slope0) * ucValue / 63;
  5190. TargetInfo.slope1 = pDS_SHARPNESS_DATA->DSSharpNormal[j].slope1 + (pDS_SHARPNESS_DATA->DSSharpStrong[j].slope1-pDS_SHARPNESS_DATA->DSSharpNormal[j].slope1) * ucValue / 63;
  5191. TargetInfo.oversht[Res]= pDS_SHARPNESS_DATA->DSSharpNormal[j].oversht[Res] + (pDS_SHARPNESS_DATA->DSSharpStrong[j].oversht[Res]-pDS_SHARPNESS_DATA->DSSharpNormal[j].oversht[Res]) * ucValue / 63;
  5192. TargetInfo.undersht[Res]= pDS_SHARPNESS_DATA->DSSharpNormal[j].undersht[Res] + (pDS_SHARPNESS_DATA->DSSharpStrong[j].undersht[Res]-pDS_SHARPNESS_DATA->DSSharpNormal[j].undersht[Res]) * ucValue / 63;
  5193. PQ_RegisterWrite(dwDS_FacReg[j*3], TargetInfo.fac0);
  5194. PQ_RegisterWrite(dwDS_FacReg[j*3+1], TargetInfo.fac1);
  5195. PQ_RegisterWrite(dwDS_FacReg[j*3+2], TargetInfo.fac2);
  5196. PQ_RegisterWrite(dwDS_THReg[j*2], TargetInfo.th0);
  5197. PQ_RegisterWrite(dwDS_THReg[j*2+1], TargetInfo.th1);
  5198. PQ_RegisterWrite(dwDS_SlopeReg[j*2], TargetInfo.slope0);
  5199. PQ_RegisterWrite(dwDS_SlopeReg[j*2+1], TargetInfo.slope1);
  5200. PQ_RegisterWrite(dwDS_OvershtReg[j], TargetInfo.oversht[Res]);
  5201. PQ_RegisterWrite(dwDS_UndershtReg[j], TargetInfo.undersht[Res]);
  5202. }
  5203. }
  5204. //ratio
  5205. SharpRatioTemp = pDS_SHARPNESS_DATA->SlrSharpRatio.Degree[Res];
  5206. #ifdef CONFIG_APPLY_DIFFERENT_SHARPNESS_SETTING_IN_PANEL_INVERT
  5207. if(VIP_GetFlipMode()==HV_FLIP || VIP_GetFlipMode() == H_FLIP || VIP_GetFlipMode() == V_FLIP || VIP_GetPanelInvert())
  5208. {/* Add sharpness setting in invert panel here */ }
  5209. else
  5210. {/* Add sharpness setting in regular panel here */}
  5211. #else
  5212. /* Check different setting status and remove same setting item to here */
  5213. #endif
  5214. for(i=0; i<7; i++)
  5215. {
  5216. PQ_RegisterWrite(dwDS_Y_RatioReg[i], SharpRatioTemp & 0xf);
  5217. SharpRatioTemp = SharpRatioTemp >> 4;
  5218. }
  5219. for(i = 0; i <6; i++)
  5220. {
  5221. PQ_RegisterWrite(dwDS_C_RatioReg[i], pVtab->mSharpRatio[1].ratio[i]);
  5222. }
  5223. PQ_RegisterWrite(VIP_reg_slr_ds_sharp_ratio_6_c, pVtab->iSharpRatio6_c);
  5224. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_en, pDS_SHARPNESS_DATA->DSSharpDark.enable);
  5225. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_th0, pDS_SHARPNESS_DATA->DSSharpDark.th[0]);
  5226. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_th1, pDS_SHARPNESS_DATA->DSSharpDark.th[1]);
  5227. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_th2, pDS_SHARPNESS_DATA->DSSharpDark.th[2]);
  5228. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_th3, pDS_SHARPNESS_DATA->DSSharpDark.th[3]);
  5229. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_fac0, pDS_SHARPNESS_DATA->DSSharpDark.fac[0]);
  5230. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_fac1, pDS_SHARPNESS_DATA->DSSharpDark.fac[1]);
  5231. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_fac2, pDS_SHARPNESS_DATA->DSSharpDark.fac[2]);
  5232. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_fac3, pDS_SHARPNESS_DATA->DSSharpDark.fac[3]);
  5233. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_slope0, pDS_SHARPNESS_DATA->DSSharpDark.slope[0]);
  5234. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_slope1, pDS_SHARPNESS_DATA->DSSharpDark.slope[1]);
  5235. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_slope2, pDS_SHARPNESS_DATA->DSSharpDark.slope[2]);
  5236. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_slope3, pDS_SHARPNESS_DATA->DSSharpDark.slope[3]);
  5237. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_slope4, pDS_SHARPNESS_DATA->DSSharpDark.slope[4]);
  5238. if((pHwContext->PqPatch.DsSharpnessPatch == DS_SHARPNESS_AV_IRE_PATCH) || (pHwContext->PqPatch.DsSharpnessPatch == DS_SHARPNESS_AV_GRAYSCALE_PATCH))
  5239. {
  5240. PQ_RegisterWrite(VIP_reg_slr_dscale_sharp_oversht_ylmt, 0);
  5241. PQ_RegisterWrite(VIP_reg_slr_dscale_sharp_undersht_ylmt, 0);
  5242. }
  5243. }
  5244. }
  5245. void PQ_DPYSharpness(BOOL bReset,UINT8 ucValue)
  5246. {
  5247. PQHW_CONTEXT* pHwContext= &PQHwContext;
  5248. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  5249. SHARP_INFO target,*strong,*normal,*weak;
  5250. INT32 i, Res;
  5251. UINT8 ucTableIndex;
  5252. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  5253. static UINT32 dwTransReg[8]= {
  5254. VIP_reg_dpy_filter_hl_trans1, VIP_reg_dpy_filter_hl_trans2, VIP_reg_dpy_filter_hc_trans1, VIP_reg_dpy_filter_hc_trans2,
  5255. VIP_reg_dpy_filter_vl_trans1, VIP_reg_dpy_filter_vl_trans2, VIP_reg_dpy_filter_vc_trans1, VIP_reg_dpy_filter_vc_trans2};
  5256. static UINT32 dwSmoothReg[4]= {
  5257. VIP_reg_dpy_filter_hl_smooth1, VIP_reg_dpy_filter_hc_smooth1, VIP_reg_dpy_filter_vl_smooth, VIP_reg_dpy_filter_vc_smooth};
  5258. static UINT32 dwSharpReg[4]= {
  5259. VIP_reg_dpy_filter_hl_sharp, VIP_reg_dpy_filter_hc_sharp, VIP_reg_dpy_filter_vl_sharp, VIP_reg_dpy_filter_vc_sharp};
  5260. static UINT32 dwLimitLReg[4]= {
  5261. VIP_reg_dpy_filter_hl_limit_undershoot, VIP_reg_dpy_filter_hc_limit_undershoot, VIP_reg_dpy_filter_vl_limit, VIP_reg_dpy_filter_vc_limit};
  5262. static UINT32 dwLimitHReg[4]= {
  5263. VIP_reg_dpy_filter_hl_limit_overshoot, VIP_reg_dpy_filter_hc_limit_overshoot, VIP_reg_dpy_filter_vl_limit, VIP_reg_dpy_filter_vc_limit};
  5264. static UINT32 dwPivotReg[8]= {
  5265. VIP_reg_dpy_filter_hl_pivotx, VIP_reg_dpy_filter_hl_pivoty, VIP_reg_dpy_filter_hc_pivotx, VIP_reg_dpy_filter_hc_pivoty,
  5266. VIP_reg_dpy_filter_vl_pivotx, VIP_reg_dpy_filter_vl_pivoty, VIP_reg_dpy_filter_vc_pivotx, VIP_reg_dpy_filter_vc_pivoty};
  5267. SHARPNESS_DATA *pSharpness_setting;
  5268. static UINT8 bStart = FALSE;
  5269. static UINT8 bFisrtBoot = TRUE;
  5270. if(bReset)
  5271. {
  5272. bStart = TRUE;
  5273. return;
  5274. }
  5275. if(bStart)
  5276. {
  5277. bStart = FALSE;
  5278. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  5279. if (pVtab->mSharpenss.mGroupedIndex[ucCurrSrcIndex] >= 8) return;
  5280. ucTableIndex = pVtab->mSharpenss.mGroupedIndex[ucCurrSrcIndex];
  5281. pSharpness_setting = &pVtab->mSharpenss.mSharpness_Data[ucTableIndex];
  5282. if(bFisrtBoot) //init for the alternative overshoot and undershoot setting
  5283. {
  5284. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_limit_undershoot, 0x0);
  5285. PQ_RegisterWrite(VIP_reg_dpy_filter_hc_limit_undershoot, 0x0);
  5286. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_limit_overshoot, 0x0);
  5287. PQ_RegisterWrite(VIP_reg_dpy_filter_hc_limit_overshoot, 0x0);
  5288. bFisrtBoot = FALSE;
  5289. }
  5290. if( pHwContext->bEnableColorProcess==FALSE )
  5291. {
  5292. for(i=0; i<4; i++)
  5293. {
  5294. PQ_RegisterWrite(dwSmoothReg[i], 0);
  5295. PQ_RegisterWrite(dwSharpReg[i], 0);
  5296. }
  5297. return;
  5298. }
  5299. pHwContext->menu_sharpness=1;
  5300. if( ucValue>127 )
  5301. ucValue= 127;
  5302. PQDebugPrint("%s:ucValue=%d", __FUNCTION__, ucValue);
  5303. if((((DRV_SLR_GetFactor_HFactor())*(DRV_SLR_GetFactor_HFactor_6HV())*100)/(2048*2048))>90)
  5304. Res = 2;
  5305. else if(VIP_GetInputVSize() >= 1000) //1080
  5306. Res = 2;
  5307. else if(VIP_GetInputVSize() >= 700) //720
  5308. Res = 1;
  5309. else
  5310. Res = 0;
  5311. if (1!=pSharpness_setting->sharp_normal[0].limit[3]) Res = 0;
  5312. if( ucValue<64 )
  5313. {
  5314. //from weak to normal
  5315. for(i=0; i<4; i++)
  5316. {
  5317. weak = &pSharpness_setting->sharp_weak[i];
  5318. normal = &pSharpness_setting->sharp_normal[i];
  5319. //target.x1= weak->x1 + (normal->x1-weak->x1) * ucValue / 63;
  5320. target.m1= weak->m1 + (normal->m1-weak->m1) * ucValue / 63;
  5321. //target.x2= weak->x2 + (normal->x2-weak->x2) * ucValue / 63;
  5322. target.m2= weak->m2 + (normal->m2-weak->m2) * ucValue / 63;
  5323. target.smooth= weak->smooth + (normal->smooth-weak->smooth) * ucValue / 63;
  5324. target.sharp= weak->sharp + (normal->sharp-weak->sharp) * ucValue / 63;
  5325. target.limit[Res]= weak->limit[Res] + (normal->limit[Res]-weak->limit[Res]) * ucValue / 63;
  5326. target.pivotx= weak->pivotx + (normal->pivotx-weak->pivotx) * ucValue / 63;
  5327. target.pivoty= weak->pivoty + (normal->pivoty-weak->pivoty) * ucValue / 63;
  5328. PQ_RegisterWrite(dwTransReg[i*2], target.m1);
  5329. PQ_RegisterWrite(dwTransReg[i*2+1], target.m2);
  5330. PQ_RegisterWrite(dwSmoothReg[i], target.smooth);
  5331. PQ_RegisterWrite(dwSharpReg[i], target.sharp);
  5332. PQ_RegisterWrite(dwLimitLReg[i], target.limit[Res]);
  5333. PQ_RegisterWrite(dwLimitHReg[i], target.limit[Res]);
  5334. PQ_RegisterWrite(dwPivotReg[i*2], target.pivotx);
  5335. PQ_RegisterWrite(dwPivotReg[i*2+1], target.pivoty);
  5336. }
  5337. }
  5338. else
  5339. {
  5340. //from normal to strong
  5341. ucValue-= 64;
  5342. for(i=0; i<4; i++)
  5343. {
  5344. strong = &pSharpness_setting->sharp_strong[i];
  5345. normal = &pSharpness_setting->sharp_normal[i];
  5346. //target.x1= normal->x1 + ( strong->x1-normal->x1) * ucValue / 63;
  5347. target.m1= normal->m1 + ( strong->m1-normal->m1) * ucValue / 63;
  5348. //target.x2= normal->x2 + ( strong->x2-normal->x2) * ucValue / 63;
  5349. target.m2= normal->m2 + ( strong->m2-normal->m2) * ucValue / 63;
  5350. target.smooth= normal->smooth + ( strong->smooth-normal->smooth) * ucValue / 63;
  5351. target.sharp= normal->sharp + ( strong->sharp-normal->sharp) * ucValue / 63;
  5352. target.limit[Res]= normal->limit[Res] + ( strong->limit[Res]-normal->limit[Res]) * ucValue / 63;
  5353. target.pivotx= normal->pivotx + ( strong->pivotx-normal->pivotx) * ucValue / 63;
  5354. target.pivoty= normal->pivoty + ( strong->pivoty-normal->pivoty) * ucValue / 63;
  5355. PQ_RegisterWrite(dwTransReg[i*2], target.m1);
  5356. PQ_RegisterWrite(dwTransReg[i*2+1], target.m2);
  5357. PQ_RegisterWrite(dwSmoothReg[i], target.smooth);
  5358. PQ_RegisterWrite(dwSharpReg[i], target.sharp);
  5359. PQ_RegisterWrite(dwLimitLReg[i], target.limit[Res]);
  5360. PQ_RegisterWrite(dwLimitHReg[i], target.limit[Res]);
  5361. PQ_RegisterWrite(dwPivotReg[i*2], target.pivotx);
  5362. PQ_RegisterWrite(dwPivotReg[i*2+1], target.pivoty);
  5363. }
  5364. }
  5365. #ifdef CONFIG_APPLY_DIFFERENT_SHARPNESS_SETTING_IN_PANEL_INVERT
  5366. if(VIP_GetFlipMode()==HV_FLIP || VIP_GetFlipMode() == H_FLIP || VIP_GetFlipMode() == V_FLIP || VIP_GetPanelInvert())
  5367. {/* Add sharpness setting in invert panel here */ }
  5368. else
  5369. {/* Add sharpness setting in regular panel here */}
  5370. #else
  5371. PQ_RegisterWrite(VIP_reg_dpy_filter_y_v1, 16);
  5372. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_v1, 16);
  5373. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_v1, 16);
  5374. PQ_RegisterWrite(VIP_reg_dpy_filter_vl_hp_limit, 0xff);
  5375. #endif
  5376. if(pHwContext->PqPatch.DPYSharpnessPatch == DPY_SHARPNESS_JPEG_THUMBNAIL_PATCH)
  5377. {
  5378. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_trans1, 5);
  5379. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_trans2, 0x3ffc);
  5380. PQ_RegisterWrite(VIP_reg_dpy_filter_hc_trans1, 0x3);
  5381. PQ_RegisterWrite(VIP_reg_dpy_filter_hc_trans2, 0);
  5382. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_smooth1, 0x14);
  5383. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_sharp, 0x14);
  5384. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_pivotx, 0xa7);
  5385. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_pivoty, 0xcc);
  5386. PQ_RegisterWrite(VIP_reg_dpy_filter_hc_pivotx, 0x58);
  5387. PQ_RegisterWrite(VIP_reg_dpy_filter_hc_pivoty, 0x3f);
  5388. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_limit_overshoot, 0x3e);
  5389. }
  5390. pHwContext->menu_sharpness=0;
  5391. pHwContext->hc_sharp=(INT8)PQ_RegisterRead(VIP_reg_dpy_filter_hc_sharp);
  5392. pHwContext->hl_sharp=(INT8)PQ_RegisterRead(VIP_reg_dpy_filter_hl_sharp);
  5393. pHwContext->hc_menu_sharp=PQ_RegisterRead(VIP_reg_dpy_filter_hc_sharp);
  5394. pHwContext->hl_menu_sharp=PQ_RegisterRead(VIP_reg_dpy_filter_hl_sharp);
  5395. pHwContext->hc_smooth=(INT8)PQ_RegisterRead(VIP_reg_dpy_filter_hc_smooth1);
  5396. pHwContext->hl_smooth=(INT8)PQ_RegisterRead(VIP_reg_dpy_filter_hl_smooth1);
  5397. }
  5398. }
  5399. void PQ_CalcPivotxy(SHARP_INFO* sharp_info)
  5400. {
  5401. #if 0
  5402. INT32 x1,m1,x2,m2,sharp;
  5403. INT32* pivotx= &sharp_info->pivotx;
  5404. INT32* pivoty= &sharp_info->pivoty;
  5405. x1= sharp_info->x1;
  5406. m1= sharp_info->m1;
  5407. x2= sharp_info->x2;
  5408. m2= sharp_info->m2;
  5409. sharp= sharp_info->sharp;
  5410. if(m1==m2) {printk(KERN_EMERG"ERROR!! /0\n");m1=m2+1;}
  5411. *pivotx= (m1*x1 - m2*x2) / (m1-m2);
  5412. *pivoty= ((*pivotx- x1)*m1 + sharp * 8) / 8;
  5413. *pivotx= *pivotx/2;
  5414. #endif
  5415. }
  5416. //****************************************************************************
  5417. //
  5418. // Function : PQ_Sharpness
  5419. // Params :
  5420. // Description:
  5421. // Returns : void
  5422. // P.S only for YUV in no effect in RGB
  5423. //****************************************************************************
  5424. void PQ_Sharpness(BOOL bReset,UINT8 ucValue)//-128~+127 =>0~127
  5425. {
  5426. //ds sharpness(365 new function)
  5427. PQHW_CONTEXT* pHwContext= &PQHwContext;
  5428. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  5429. UINT32 DS_Sharp_Control;
  5430. INT32 HD_Ds, HD_Angle, MD_Ds, MD_Angle, SD_Ds, SD_Angle;
  5431. UINT8 ucTableIndex;
  5432. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  5433. DS_SHARPNESS_DATA *pDS_SHARPNESS_DATA;
  5434. static UINT8 bStart = FALSE;
  5435. if(bReset)
  5436. {
  5437. bStart = TRUE;
  5438. PQ_DSSharpness(TRUE, ucValue);
  5439. PQ_DPYSharpness(TRUE, ucValue);
  5440. PQ_Sharpness_POSTDLTI(TRUE, ucValue);
  5441. PQ_Sharpness_PREDLTI(TRUE, ucValue);
  5442. if(!utempCheckColorbarDTFunctionEN || VIP_IsSourceDTV())
  5443. {
  5444. PQ_Sharpness_PREDCTI(TRUE, ucValue);
  5445. PQ_Sharpness_POSTDCTI(TRUE,ucValue);
  5446. PQ_Sharpness_POST_2D(TRUE, ucValue);
  5447. PQ_Sharpness_Peaking_DLTI(TRUE, ucValue);
  5448. }
  5449. return;
  5450. }
  5451. if(bStart)
  5452. {
  5453. bStart = FALSE;
  5454. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  5455. if (pVtab->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex] >= 8) return;
  5456. ucTableIndex = pVtab->mDS_Sharpenss.mGroupedIndex[ucCurrSrcIndex];
  5457. pDS_SHARPNESS_DATA = &pVtab->mDS_Sharpenss.mDS_Sharpness_Data[ucTableIndex];
  5458. DS_Sharp_Control = pDS_SHARPNESS_DATA->DS_Sharp_Angle;
  5459. //PQDebugPrint("%s: DS_Sharp_Control=%d", __FUNCTION__, (INT32)DS_Sharp_Control);
  5460. SD_Ds = (DS_Sharp_Control & 0x3);
  5461. SD_Angle = ((DS_Sharp_Control >> 2) & 0x3);
  5462. MD_Ds = ((DS_Sharp_Control >> 8) & 0x3);
  5463. MD_Angle = ((DS_Sharp_Control >> 10) & 0x3);
  5464. HD_Ds = ((DS_Sharp_Control >> 16) & 0x3);
  5465. HD_Angle = ((DS_Sharp_Control >> 18) & 0x3);
  5466. //PQDebugPrint("%s: SD_Ds=%d SD_Angle=%d MD_Ds=%d MD_Angle=%d HD_Ds=%d HD_Angle=%d ", __FUNCTION__, SD_Ds ,SD_Angle ,MD_Ds ,MD_Angle ,HD_Ds ,HD_Angle);
  5467. #ifdef CONFIG_APPLY_DIFFERENT_SHARPNESS_SETTING_IN_PANEL_INVERT
  5468. if(VIP_GetFlipMode()==HV_FLIP || VIP_GetFlipMode() == H_FLIP || VIP_GetFlipMode() == V_FLIP || VIP_GetPanelInvert())
  5469. {/* Add another sharpness setting in invert panel here */ }
  5470. else
  5471. {
  5472. /* Add sharpness setting in regular panel here */
  5473. }
  5474. #else
  5475. /* Check different setting status and remove same setting item to here */
  5476. #endif
  5477. if(900 < VIP_GetInputVSize()) // > (1080+720)/2
  5478. {
  5479. PQ_RegisterWrite(VIP_reg_ds_disable_func_en, HD_Ds);
  5480. PQ_RegisterWrite(VIP_reg_ds_disable_angle_sel, HD_Angle);
  5481. }
  5482. else if((VIP_GetInputVSize() <= 900 && 648 < VIP_GetInputVSize())) // (720+576)/2 < X <= (1080+720)/2
  5483. {
  5484. PQ_RegisterWrite(VIP_reg_ds_disable_func_en, MD_Ds);
  5485. PQ_RegisterWrite(VIP_reg_ds_disable_angle_sel, MD_Angle);
  5486. }
  5487. else //if((VIP_GetInputVSize() <= ((720+576) /2)))
  5488. {
  5489. PQ_RegisterWrite(VIP_reg_ds_disable_func_en, SD_Ds);
  5490. PQ_RegisterWrite(VIP_reg_ds_disable_angle_sel, SD_Angle);
  5491. }
  5492. //lower ds sharpness to avoid detail lose in high frequency (chroma pattern 1)
  5493. //weifeng, modify by sharlen request, for DTV image interlace
  5494. //Mantis 25083,25909 Lack of sharpness
  5495. if(VIP_GetUserSource()== SOURCE_MPEG && VIP_GetInputVSize() > 600)
  5496. {
  5497. PQ_RegisterWrite(VIP_reg_slr_comb_slope_2_nom ,0x3);//0x0 Jagged edge
  5498. PQ_RegisterWrite(VIP_reg_slr_comb_th_nom ,0x8);
  5499. // PQ_RegisterWrite(VIP_reg_slr_mesh_filter_en ,1);
  5500. }
  5501. if(VIP_GetInputHSize()<=400)
  5502. {
  5503. PQ_RegisterWrite(VIP_reg_ds_disable_func_en ,0x1);
  5504. PQ_RegisterWrite(VIP_reg_ds_disable_angle_sel ,0x1);
  5505. }
  5506. }
  5507. ucTempds_disable_func_en = PQ_RegisterRead(VIP_reg_ds_disable_func_en);
  5508. }
  5509. //****************************************************************************
  5510. //
  5511. // Function : PQ_Saturation
  5512. // Params :
  5513. // Description:
  5514. // Returns : void
  5515. //****************************************************************************
  5516. void PQ_Saturation(INT32 iValue) // 0 ~ 127
  5517. {
  5518. PQHW_CONTEXT* pHwContext= &PQHwContext;
  5519. pHwContext->iSaturation = iValue<<(COLOR_MATRIX_GAIN_BIT_SYSTEM-COLOR_MATRIX_GAIN_OSD_BIT_SYSTEM);
  5520. PQ_ColorMatrixSetup(TRUE, 1);
  5521. PQ_ColorMatrixSetup(TRUE, 2);
  5522. PQ_ColorMatrixSetup(TRUE, 4);
  5523. PQ_ColorMatrixSetup(TRUE, 5);
  5524. PQ_ColorMatrixSetup(TRUE, 7);
  5525. PQ_ColorMatrixSetup(TRUE, 8);
  5526. if (VIP_GetUserSource() == SOURCE_EXTS && !VIP_IsPCSource() && VIP_GetInputVSize() > 700) //#51277
  5527. {
  5528. PQ_RegisterWrite(VIP_reg_dpy_mtx_sat_limit_fac0,(((PQ_RegisterRead(VIP_reg_dpy_mtx_sat_limit_fac0))&0xffffff00)|(0xd6<<0)));
  5529. }
  5530. else
  5531. {
  5532. PQ_RegisterWrite(VIP_reg_dpy_mtx_sat_limit_fac0,(((PQ_RegisterRead(VIP_reg_dpy_mtx_sat_limit_fac0))&0xffffff00)|(0x0d<<0)));
  5533. }
  5534. }
  5535. void PQ_ColorStyleSaturation(UINT8 ucType)
  5536. {
  5537. PQHW_CONTEXT* pHwContext= &PQHwContext;
  5538. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  5539. pMenuValue->ucColorStyle = ucType;
  5540. PQ_Saturation(pMenuValue->iSaturation);
  5541. }
  5542. //****************************************************************************
  5543. //
  5544. // Function : PQ_Hue
  5545. // Params :
  5546. // Description: Powers up/down the panel as per the given power sequence timings
  5547. // Returns : void
  5548. //****************************************************************************
  5549. void PQ_Hue(UINT8 ucIndex) // 0 ~ 31 ->0 ~ 100
  5550. {
  5551. PQHW_CONTEXT* pHwContext= &PQHwContext;
  5552. if( pHwContext->bEnableColorProcess==FALSE )
  5553. ucIndex= 50;//16;
  5554. PQDebugPrint("%s: ucIndex=%d", __FUNCTION__, ucIndex);
  5555. if( ucIndex<101 ) //sizeof(HueSetting)/sizeof(HUE)=33
  5556. {
  5557. pHwContext->iHue = ucIndex;
  5558. PQ_ColorMatrixSetup(TRUE, 1);
  5559. PQ_ColorMatrixSetup(TRUE, 2);
  5560. PQ_ColorMatrixSetup(TRUE, 4);
  5561. PQ_ColorMatrixSetup(TRUE, 5);
  5562. PQ_ColorMatrixSetup(TRUE, 7);
  5563. PQ_ColorMatrixSetup(TRUE, 8);
  5564. PQ_PureColorControl(ucIndex-100, 3);
  5565. }
  5566. }
  5567. int ValueChange=FALSE;
  5568. void PQ_ColorTempGainALL(INT16 bRgain, INT16 bGgain,INT16 bBgain,UINT8 bGammaSwitch,UINT8 bGammaIndex)
  5569. {
  5570. PQHW_CONTEXT* pHwContext= &PQHwContext;
  5571. //int ValueChange=FALSE;
  5572. int RGBValueChange=FALSE;
  5573. if( pHwContext->bEnableColorProcess==FALSE )
  5574. {
  5575. bRgain= 1<<COLOR_MATRIX_GAIN_OSD_BIT_SYSTEM;
  5576. bGgain= 1<<COLOR_MATRIX_GAIN_OSD_BIT_SYSTEM;
  5577. bBgain= 1<<COLOR_MATRIX_GAIN_OSD_BIT_SYSTEM;
  5578. }
  5579. if(pHwContext->iRGain!=bRgain)
  5580. {
  5581. pHwContext->iRGain=bRgain<<(COLOR_MATRIX_GAIN_BIT_SYSTEM-COLOR_MATRIX_GAIN_OSD_BIT_SYSTEM);
  5582. RGBValueChange=TRUE;
  5583. }
  5584. if(pHwContext->iGGain!=bGgain)
  5585. {
  5586. pHwContext->iGGain=bGgain<<(COLOR_MATRIX_GAIN_BIT_SYSTEM-COLOR_MATRIX_GAIN_OSD_BIT_SYSTEM);
  5587. RGBValueChange=TRUE;
  5588. }
  5589. if(pHwContext->iBGain!=bBgain)
  5590. {
  5591. pHwContext->iBGain=bBgain<<(COLOR_MATRIX_GAIN_BIT_SYSTEM-COLOR_MATRIX_GAIN_OSD_BIT_SYSTEM);
  5592. RGBValueChange=TRUE;
  5593. }
  5594. #ifdef CONFIG_WHITE_BALANCE_ADJUST_IN_DPY_MATRIX
  5595. PQ_ColorMatrixSetup(TRUE, 0);
  5596. PQ_ColorMatrixSetup(TRUE, 1);
  5597. PQ_ColorMatrixSetup(TRUE, 2);
  5598. PQ_ColorMatrixSetup(TRUE, 3);
  5599. PQ_ColorMatrixSetup(TRUE, 4);
  5600. PQ_ColorMatrixSetup(TRUE, 5);
  5601. PQ_ColorMatrixSetup(TRUE, 6);
  5602. PQ_ColorMatrixSetup(TRUE, 7);
  5603. PQ_ColorMatrixSetup(TRUE, 8);
  5604. #endif
  5605. if(pHwContext->GammaIndex != bGammaIndex)
  5606. ValueChange=TRUE;
  5607. //printk("\n\n\n bRgain = 0x%0x g = = 0x%0x b = = 0x%0x \n\n\n",bRgain,bGgain,bBgain);
  5608. //printk("\n\n\n HW CONTEXT bRgain = 0x%0x g = = 0x%0x b = = 0x%0x \n\n\n",pHwContext->iRGain,pHwContext->iGGain,pHwContext->iBGain);
  5609. //printk("\n\n\n ValueChange = %d bGammaSwitch = %d bGammaIndex= %d \n\n",ValueChange,bGammaSwitch,bGammaIndex);
  5610. if(ValueChange==TRUE || RGBValueChange == TRUE)
  5611. {
  5612. if(ValueChange)
  5613. {
  5614. #ifdef CONFIG_WHITE_BALANCE_ADJUST_IN_DPY_MATRIX
  5615. PQ_ColorMatrixComp(TRUE);
  5616. #else
  5617. PQ_SetupGammaTable(bGammaSwitch, bGammaIndex, FALSE);
  5618. #endif
  5619. }
  5620. else
  5621. {
  5622. PQ_SetupGammaTable(bGammaSwitch, bGammaIndex, TRUE);
  5623. }
  5624. }
  5625. }
  5626. //****************************************************************************
  5627. //
  5628. // Function : PQ_ColorTempGain
  5629. // Params :
  5630. // Description: Powers up/down the panel as per the given power sequence timings
  5631. // Returns : void
  5632. //****************************************************************************
  5633. void PQ_ColorTempGain(PQ_COLOR_TEMP_GAIN ucType, INT32 iValue)
  5634. {
  5635. PQHW_CONTEXT* pHwContext= &PQHwContext;
  5636. if( pHwContext->bEnableColorProcess==FALSE )
  5637. iValue= 1<<COLOR_MATRIX_GAIN_OSD_BIT_SYSTEM;
  5638. switch(ucType){
  5639. case PQ_CT_GAIN_R:
  5640. pHwContext->iRGain=iValue<<(COLOR_MATRIX_GAIN_BIT_SYSTEM-COLOR_MATRIX_GAIN_OSD_BIT_SYSTEM);
  5641. #ifdef CONFIG_WHITE_BALANCE_ADJUST_IN_DPY_MATRIX
  5642. PQ_ColorMatrixSetup(TRUE, 0);
  5643. PQ_ColorMatrixSetup(TRUE, 1);
  5644. PQ_ColorMatrixSetup(TRUE, 2);
  5645. #endif
  5646. break;
  5647. case PQ_CT_GAIN_G:
  5648. pHwContext->iGGain=iValue<<(COLOR_MATRIX_GAIN_BIT_SYSTEM-COLOR_MATRIX_GAIN_OSD_BIT_SYSTEM);
  5649. #ifdef CONFIG_WHITE_BALANCE_ADJUST_IN_DPY_MATRIX
  5650. PQ_ColorMatrixSetup(TRUE, 3);
  5651. PQ_ColorMatrixSetup(TRUE, 4);
  5652. PQ_ColorMatrixSetup(TRUE, 5);
  5653. #endif
  5654. break;
  5655. case PQ_CT_GAIN_B:
  5656. pHwContext->iBGain=iValue<<(COLOR_MATRIX_GAIN_BIT_SYSTEM-COLOR_MATRIX_GAIN_OSD_BIT_SYSTEM);
  5657. #ifdef CONFIG_WHITE_BALANCE_ADJUST_IN_DPY_MATRIX
  5658. PQ_ColorMatrixSetup(TRUE, 6);
  5659. PQ_ColorMatrixSetup(TRUE, 7);
  5660. PQ_ColorMatrixSetup(TRUE, 8);
  5661. #endif
  5662. break;
  5663. }
  5664. #ifdef CONFIG_WHITE_BALANCE_ADJUST_IN_DPY_MATRIX
  5665. PQ_ColorMatrixComp(TRUE);
  5666. #else
  5667. PQ_SetupGammaTable(ENABLE, 0xff, TRUE);
  5668. #endif
  5669. }
  5670. static UINT8 bShift = 0;
  5671. static UINT16 bHsize,bVsize;
  5672. UINT16 bHStart_t = 0,bVStart_t = 0;
  5673. void PQ_regionLumaAverage(UINT8 bRegionIndex,UINT8 bTotalHnum,UINT8 bTotalVnum)
  5674. {
  5675. UINT16 bOUTH = 0, bOUTV = 0;
  5676. UINT16 bHStart,bVStart;
  5677. UINT16 bHStartTemp = 0;
  5678. UINT8 bnumber = 0;
  5679. if((bRegionIndex + 1) > (bTotalHnum * bTotalVnum))
  5680. {
  5681. return;
  5682. }
  5683. bOUTH = VIP_GetOutputHSize();
  5684. bOUTV = VIP_GetOutputVSize();
  5685. if((bOUTH== 0) || (bOUTV == 0))
  5686. {
  5687. return;
  5688. }
  5689. if(bTotalHnum > 0)
  5690. {
  5691. bnumber = bRegionIndex / bTotalHnum;
  5692. bHsize = bOUTH / bTotalHnum;
  5693. bVsize = bOUTV / bTotalVnum;
  5694. }
  5695. bHStart = bHsize * (bRegionIndex - bnumber * bTotalHnum);
  5696. bVStart = bVsize * bnumber;
  5697. if(bHStart > 1)
  5698. bHStart = bHStart - 1;
  5699. if (bVStart > 1)
  5700. bVStart = bVStart - 1;
  5701. if(PQ_RegisterRead( VIP_reg_dpy_rgbstat_en) == 0)
  5702. {
  5703. PQ_RegisterWrite( VIP_reg_dpy_rgbstat_en, 1);
  5704. }
  5705. if((bHStart >= bHsize) && (bHStart <= bOUTH/2))
  5706. {
  5707. bHStartTemp = bOUTH - (bHStart + bHsize);
  5708. PQ_RegisterWrite( VIP_reg_dpy_rgbstat_rhs, bHStartTemp);
  5709. PQ_RegisterWrite( VIP_reg_dpy_rgbstat_rvs, bVStart);
  5710. if((bHStartTemp + bHsize) > (bOUTH- 1))
  5711. {
  5712. bHsize = bOUTH - bHStartTemp;
  5713. }
  5714. }
  5715. else
  5716. {
  5717. PQ_RegisterWrite( VIP_reg_dpy_rgbstat_lhs, bHStart);
  5718. PQ_RegisterWrite( VIP_reg_dpy_rgbstat_lvs, bVStart);
  5719. if((bHStart + bHsize) > (bOUTH- 1))
  5720. {
  5721. bHsize = bOUTH - bHStart;
  5722. }
  5723. }
  5724. if((bVStart + bVsize) > (bOUTV - 1))
  5725. {
  5726. bVsize = bOUTV - bVStart;
  5727. }
  5728. PQ_RegisterWrite( VIP_reg_dpy_rgbstat_hsize, bHsize-1);
  5729. PQ_RegisterWrite( VIP_reg_dpy_rgbstat_vsize, bVsize-1);
  5730. if((bHsize * bVsize) < (1024 * 8))// 2 13
  5731. {
  5732. bShift = 11;
  5733. PQ_RegisterWrite(VIP_reg_dpy_rgbstat_sft, 0);
  5734. }
  5735. else if((bHsize * bVsize) < (1024 * 32))
  5736. {
  5737. bShift = 13;
  5738. PQ_RegisterWrite(VIP_reg_dpy_rgbstat_sft, 1);
  5739. }
  5740. else if((bHsize * bVsize) < (1024 * 128))
  5741. {
  5742. bShift = 15;
  5743. PQ_RegisterWrite(VIP_reg_dpy_rgbstat_sft, 2);
  5744. }
  5745. else
  5746. {
  5747. bShift = 17;
  5748. PQ_RegisterWrite(VIP_reg_dpy_rgbstat_sft, 3);
  5749. }
  5750. if((bRegionIndex>=1)&&(bHStart > 1))
  5751. {
  5752. bHStart_t = bHStart + 1;
  5753. }
  5754. else
  5755. {
  5756. bHStart_t = bHStart;
  5757. }
  5758. if(bHStart_t >= bOUTH)
  5759. {
  5760. bHStart_t = bOUTH - 1;
  5761. }
  5762. if((bRegionIndex>=1)&&(bVStart > 1))
  5763. {
  5764. bVStart_t = bVStart + 1;
  5765. }
  5766. else
  5767. {
  5768. bVStart_t = bVStart;
  5769. }
  5770. if(bVStart_t >= bOUTV)
  5771. {
  5772. bVStart_t = bOUTV - 1;
  5773. }
  5774. mdelay(15);
  5775. }
  5776. void PQ_GetRegionLumaAverage(UINT16* bRegionYaverage)
  5777. {
  5778. UINT32 ulValue = 0;
  5779. UINT32 bRed = 0,bGreen = 0,bBlue = 0;
  5780. UINT16 temp = 0;
  5781. mdelay(10);
  5782. ulValue = PQ_RegisterRead(VIP_reg_dpy_blkl0_dout);
  5783. if((bHsize * bVsize) > 0)
  5784. {
  5785. bRed = ((ulValue&0x3ff)<<bShift )/(bHsize * bVsize);
  5786. bGreen = (((ulValue>>20)&0x3ff)<<bShift)/(bHsize * bVsize) ;
  5787. bBlue = (((ulValue>>10)&0x3ff)<<bShift)/(bHsize * bVsize);
  5788. }
  5789. temp = (299 * bRed)/1000 + (587 * bGreen)/1000 + (114 * bBlue)/1000;
  5790. if(temp > 255)
  5791. temp = 255;
  5792. *bRegionYaverage = temp;
  5793. }
  5794. void PQ_GetRegionvalue(RegionHVStartSize* bRegionvalue)
  5795. {
  5796. bRegionvalue->bHsize = bHsize;
  5797. bRegionvalue->bVsize = bVsize;
  5798. bRegionvalue->bHstart = bHStart_t;
  5799. bRegionvalue->bVstart = bVStart_t;
  5800. }
  5801. void PQ_UltraLowSetting(UINT8 ucEnable)
  5802. {
  5803. if(ucEnable)
  5804. {
  5805. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_color_hl_coring, 0x50);
  5806. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_lb_1, 0x12c);
  5807. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_rb_1, 0x15e);
  5808. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_min_1, 0x1900);
  5809. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_max_1, 0x19000);
  5810. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_lb_2, 175);
  5811. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_rb_2, 270);
  5812. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_min_2, 400);
  5813. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_max_2, 0xfffff);
  5814. PQ_RegisterWrite(VIP_reg_vdi_color_cnt_th, 0);
  5815. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_color_hl_coring2, (VIP_GetInputVSize()<720)?32:0);
  5816. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_color_vl_coring2, (VIP_GetInputVSize()<720)?32:0);
  5817. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_color_en, 1);
  5818. /*
  5819. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_debug, 0);
  5820. PQ_RegisterWrite(VIP_reg_vdi_colorHsulowL1, 0);
  5821. PQ_RegisterWrite(VIP_reg_vdi_colorHsulowL2, 1);
  5822. PQ_RegisterWrite(VIP_reg_vdi_colorHtulowL1, 0);
  5823. PQ_RegisterWrite(VIP_reg_vdi_colorHtulowL2, 0);
  5824. */
  5825. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_color_th1, 0x24);
  5826. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_color_th2, 0x3);
  5827. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_color_th3, 0x850);
  5828. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_color_th4, 0);
  5829. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_color_th1, 0x22);
  5830. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_color_th2, 0x02);
  5831. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_color_th3, 0x850);
  5832. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_color_th4, 0x00);
  5833. #if 0
  5834. if(VIP_IsPCSource())
  5835. {
  5836. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_th1, 64);
  5837. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_th2, 8);
  5838. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_th4, 0);
  5839. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_th3, 3600);
  5840. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_th1, 64);
  5841. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_th2, 8);
  5842. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_th4, 0);
  5843. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_bmax_sel, 1);
  5844. }
  5845. else
  5846. #endif
  5847. {
  5848. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_th1, 0x24);
  5849. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_th2, 0x2);
  5850. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_bmax_sel, 1);
  5851. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_th3, 0x800);
  5852. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_th4, 0x0);
  5853. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_th1, 0x24);
  5854. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_th2, 0x02);
  5855. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_th4, 0x00);
  5856. }
  5857. //PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_alpha, 0x10);
  5858. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_lp_en, 1);
  5859. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_bmax_sel, 1);
  5860. //PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_alpha, 0x10);
  5861. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_dyn_adj, 1);
  5862. PQ_RegisterWrite(VIP_reg_vdi_tnr_th_dyn_adj, 1);
  5863. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_dith_en, 1);
  5864. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_en, 1);
  5865. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_mbw_en, 0);
  5866. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_sel, 1);
  5867. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_sel, 0);
  5868. }
  5869. else
  5870. {
  5871. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_dyn_adj, 1);
  5872. PQ_RegisterWrite(VIP_reg_vdi_tnr_th_dyn_adj, 1);
  5873. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_dith_en, 1);
  5874. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_en, 0);
  5875. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_mbw_en, 0);
  5876. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_sel, 1);
  5877. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_sel, 0);
  5878. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_color_en, 0);
  5879. }
  5880. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_dyn_adj, (VIP_GetInputVSize()<720)?0:1);
  5881. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_en, (VIP_GetInputVSize()<720)?1:0);
  5882. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_mbw_en, 1);
  5883. }
  5884. void PQ_NRLevel(UINT32 nr_level, UINT32 vdi_total)
  5885. {
  5886. PQHW_CONTEXT* pHwContext= &PQHwContext;
  5887. #ifndef ADJUST_NR_By_Yavg
  5888. VTAB_CMN_VALUE_DEFINE* pVtabCmnValue= &pHwContext->VtabCmnValue;
  5889. UINT8 ucCurrSrcIndex,ucTableIndex;
  5890. UINT8 ucLevel= nr_level;
  5891. ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  5892. if ((ucCurrSrcIndex >= SRC_INDEX_UNKNOWN))
  5893. {
  5894. PQDebugPrint("%s: SrcIndex (%d) unknown/invalid, pLUTTable->SrcCount (%d)!", __FUNCTION__, ucCurrSrcIndex,pLUTTable->SrcCount);
  5895. return;
  5896. }
  5897. ucTableIndex = pVtabCmnValue->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex];
  5898. #endif
  5899. pHwContext->iAdjustNRCounter = 0;
  5900. ///if(vdi_total>=4095) vdi_total=4095;
  5901. PQ_RegisterWrite(VIP_reg_vdi_tnr_v_ref, 8);
  5902. PQ_RegisterWrite(VIP_reg_vdi_tnr_u_ref, 8);
  5903. PQ_RegisterWrite(VIP_reg_vdi_tnr_u_ref, (VIP_GetInputVSize()<720)?40:24);;
  5904. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_en, 1);
  5905. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_en, (VIP_GetInputVSize()<720)?1:0);
  5906. if( nr_level == OFF &&
  5907. (VIP_GetUserSource() == SOURCE_JPEG ||
  5908. VIP_GetUserSource() == SOURCE_HDMI ||
  5909. VIP_GetUserSource() == SOURCE_MPEG ||
  5910. VIP_IsPCSource())
  5911. )
  5912. {
  5913. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_CORING, 0);
  5914. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH, 0);
  5915. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_CORING, 0);
  5916. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH, 0);
  5917. PQ_SetupStrength(PQ_ITEM_TNR_ULTRA_LOW, 0);
  5918. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_CORING, 0);
  5919. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_STRENGTH, 0);
  5920. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_CORING, 0);
  5921. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_STRENGTH, 0);
  5922. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_CORING, 0);
  5923. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_STRENGTH, 0);
  5924. }
  5925. #ifndef ADJUST_NR_By_Yavg
  5926. else if(ucLevel>=WEAK && ucLevel<=STRONG )
  5927. {
  5928. ucLevel-= 1;
  5929. PQDebugPrint("%s: nr degrees= %d %d %d %d %d %d %d %d %d %d %d %d %d\n", __FUNCTION__,
  5930. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaTnrCoring.Degree[ucLevel],
  5931. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaTnrStrength.Degree[ucLevel],
  5932. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].ChromaTnrCoring.Degree[ucLevel],
  5933. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].ChromaTnrStrength.Degree[ucLevel],
  5934. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaSnr1Coring.Degree[ucLevel],
  5935. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaSnr1Strength.Degree[ucLevel],
  5936. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaSnr2Coring.Degree[ucLevel],
  5937. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaSnr2Strength.Degree[ucLevel],
  5938. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].ChromaSnrCoring.Degree[ucLevel],
  5939. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].ChromaSnrStrength.Degree[ucLevel],
  5940. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].TnrUltraLowAlpha.Degree[ucLevel],
  5941. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].Snr1UltraLowCoring.Degree[ucLevel],
  5942. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].Snr2UltraLowCoring.Degree[ucLevel]
  5943. );
  5944. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_CORING, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaTnrCoring.Degree[ucLevel]);
  5945. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaTnrStrength.Degree[ucLevel]);
  5946. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_CORING, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].ChromaTnrCoring.Degree[ucLevel]);
  5947. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].ChromaTnrStrength.Degree[ucLevel]);
  5948. PQ_SetupStrength(PQ_ITEM_TNR_ULTRA_LOW, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].TnrUltraLowAlpha.Degree[ucLevel]);
  5949. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_CORING, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaSnr1Coring.Degree[ucLevel]);
  5950. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_STRENGTH, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaSnr1Strength.Degree[ucLevel]);
  5951. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_CORING, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaSnr2Coring.Degree[ucLevel]);
  5952. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_STRENGTH, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaSnr2Strength.Degree[ucLevel]);
  5953. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_CORING, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].ChromaSnrCoring.Degree[ucLevel]);
  5954. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_STRENGTH, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].ChromaSnrStrength.Degree[ucLevel]);
  5955. PQ_SetupStrength(PQ_ITEM_SNR1_ULTRA_LOW, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].Snr1UltraLowCoring.Degree[ucLevel]);
  5956. PQ_SetupStrength(PQ_ITEM_SNR2_ULTRA_LOW, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].Snr2UltraLowCoring.Degree[ucLevel]);
  5957. }
  5958. #endif
  5959. PQ_UltraLowSetting(ENABLE);
  5960. }
  5961. //****************************************************************************
  5962. //
  5963. // Function : PQ_3DNoiseReductoin
  5964. // Params :
  5965. // Description:
  5966. // Returns : void
  5967. //****************************************************************************
  5968. void PQ_3DNoiseReductoin(UINT8 ucMode,UINT8 iUserMin, UINT8 iUserMax )
  5969. {
  5970. PQHW_CONTEXT* pHwContext= &PQHwContext;
  5971. UINT32 vdi_hsize_i,vdi_vsize,vdi_total;
  5972. BOOL bNrEnable;
  5973. if( pHwContext->bEnableColorProcess==FALSE )
  5974. ucMode= OFF;
  5975. PQDebugPrint("%s:nNRLevel=%d\n", __FUNCTION__, ucMode);
  5976. pHwContext->nNRLevel= ucMode;
  5977. pHwContext->ucNRUserMin = iUserMin;
  5978. pHwContext->ucNRUserMax = iUserMax;
  5979. bNrEnable= (pHwContext->nNRLevel>OFF) ? ENABLE : DISABLE;
  5980. #ifdef ADJUST_NR_By_Yavg
  5981. if (VIP_GetUserSource()!= SOURCE_HDMI && VIP_GetUserSource()!= SOURCE_MPEG)
  5982. {
  5983. bNrEnable = ENABLE;
  5984. }
  5985. #endif
  5986. if(VIP_IsPCSource()|| VIP_RunDVIMode())
  5987. {
  5988. bNrEnable=DISABLE;
  5989. }
  5990. PQ_RegisterWrite(VIP_reg_vdi_tnr_en, bNrEnable); //always open to let VIP_field_diff_cnt can work
  5991. PQ_RegisterWrite(VIP_reg_vdi_snr_hfil_en, bNrEnable);
  5992. PQ_RegisterWrite(VIP_reg_vdi_snr_vfil_en, bNrEnable);
  5993. if (VIP_GetUserSource()==SOURCE_CVD2)
  5994. PQ_RegisterWrite(VIP_reg_vdi_sigmanr_en, 0);
  5995. else
  5996. PQ_RegisterWrite(VIP_reg_vdi_sigmanr_en, bNrEnable);
  5997. vdi_hsize_i= VIP_GetScalerPreScaleH();
  5998. vdi_vsize= PQ_Get_VDI_VSize();
  5999. vdi_total= vdi_hsize_i*vdi_vsize;
  6000. #if 0
  6001. if (VIP_GetUserSource()==1 && VIP_IsATVSource())
  6002. PQ_NRLevel(ucMode + 1, vdi_total);
  6003. else
  6004. #endif
  6005. PQ_NRLevel(ucMode, vdi_total);
  6006. }
  6007. void PQ_MPEGNRLevel(UINT32 nr_level, UINT32 vdi_total)
  6008. {
  6009. PQHW_CONTEXT* pHwContext= &PQHwContext;
  6010. VTAB_CMN_VALUE_DEFINE* pVtabCmnValue= &pHwContext->VtabCmnValue;
  6011. UINT8 ucLevel= nr_level;
  6012. //if(vdi_total>=4095) vdi_total=4095;
  6013. UINT32 maxedgev_th;
  6014. UINT8 ucCurrSrcIndex,ucTableIndex;
  6015. ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  6016. if ((ucCurrSrcIndex >= SRC_INDEX_UNKNOWN))
  6017. {
  6018. PQDebugPrint("%s: SrcIndex (%d) unknown/invalid, pLUTTable->SrcCount (%d)!", __FUNCTION__, ucCurrSrcIndex,pLUTTable->SrcCount);
  6019. return;
  6020. }
  6021. ucTableIndex = pVtabCmnValue->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex];
  6022. maxedgev_th=vdi_total/337;
  6023. if(maxedgev_th>=4095) maxedgev_th=4095;
  6024. if( nr_level==WEAK )
  6025. {
  6026. //DeBlock
  6027. PQ_RegisterWrite(VIP_reg_vdi_maxedgev_th, maxedgev_th);
  6028. //MNR
  6029. PQ_RegisterWrite(VIP_reg_vdi_mad_mnr_thd, 6);
  6030. }
  6031. else if( nr_level==STRONG )
  6032. {
  6033. //DeBlock
  6034. PQ_RegisterWrite(VIP_reg_vdi_maxedgev_th, maxedgev_th);
  6035. //MNR
  6036. PQ_RegisterWrite(VIP_reg_vdi_mad_mnr_thd, 4);
  6037. }
  6038. else
  6039. {
  6040. //DeBlock
  6041. PQ_RegisterWrite(VIP_reg_vdi_maxedgev_th, maxedgev_th);
  6042. //MNR
  6043. PQ_RegisterWrite(VIP_reg_vdi_mad_mnr_thd, 4);
  6044. }
  6045. if( ucLevel>=WEAK && ucLevel<=STRONG )
  6046. {
  6047. ucLevel-= 1;
  6048. PQDebugPrint("%s: mpeg nr degrees= %d %d %d %d", __FUNCTION__,
  6049. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].BlockNrCoring.Degree[ucLevel],
  6050. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].BlockNrStrength.Degree[ucLevel],
  6051. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].MosquitoNrCoring.Degree[ucLevel],
  6052. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].MosquitoNrStrength.Degree[ucLevel]
  6053. );
  6054. PQ_SetupStrength(PQ_ITEM_BLOCK_NR_CORING, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].BlockNrCoring.Degree[ucLevel]);
  6055. PQ_SetupStrength(PQ_ITEM_BLOCK_NR_STRENGTH, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].BlockNrStrength.Degree[ucLevel]);
  6056. PQ_SetupStrength(PQ_ITEM_MOSQUITO_NR_CORING, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].MosquitoNrCoring.Degree[ucLevel]);
  6057. PQ_SetupStrength(PQ_ITEM_MOSQUITO_NR_STRENGTH, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].MosquitoNrStrength.Degree[ucLevel]);
  6058. }
  6059. }
  6060. void PQ_MPEGNoiseReductoin(UINT8 ucLevel,UINT8 iUserMin, UINT8 iUserMax )
  6061. {
  6062. PQHW_CONTEXT* pHwContext= &PQHwContext;
  6063. UINT32 vdi_hsize_i,vdi_vsize,vdi_total;
  6064. BOOL bNrEnable;
  6065. BOOL bDeblockEnable;
  6066. if( pHwContext->bEnableColorProcess==FALSE )
  6067. ucLevel= OFF;
  6068. PQDebugPrint("%s:nMpegNRLevel=%d", __FUNCTION__, ucLevel);
  6069. pHwContext->nMPEGNRLevel= ucLevel;
  6070. pHwContext->ucMPEGNRUserMax = iUserMax;
  6071. pHwContext->ucMPEGNRUserMin = iUserMin;
  6072. bNrEnable= (pHwContext->nMPEGNRLevel>OFF) ? ENABLE : DISABLE;
  6073. bNrEnable= (bNrEnable) && (!VIP_IsPCSource() || !VIP_RunDVIMode());
  6074. bDeblockEnable=(!VIP_IsPCSource()) && (!VIP_RunDVIMode());
  6075. PQ_RegisterWrite(VIP_reg_gfx_dbk_en, bNrEnable && bDeblockEnable);
  6076. #if 0
  6077. if(pHwContext->cInputDataFormat == RGB && !VIP_IsPCSource())
  6078. PQ_RegisterWrite(VIP_reg_vdi_mnr_fil_en, 0);
  6079. else
  6080. PQ_RegisterWrite(VIP_reg_vdi_mnr_fil_en, bNrEnable);
  6081. #else
  6082. PQ_RegisterWrite(VIP_reg_vdi_mnr_fil_en, bNrEnable && (VIP_GetInputDataFormat()!=RGB));
  6083. #endif
  6084. if( bNrEnable )
  6085. {
  6086. vdi_hsize_i= VIP_GetScalerPreScaleH();
  6087. vdi_vsize= PQ_Get_VDI_VSize();
  6088. vdi_total= vdi_hsize_i*vdi_vsize;
  6089. PQ_MPEGNRLevel(ucLevel, vdi_total);
  6090. }
  6091. }
  6092. //****************************************************************************
  6093. //
  6094. // Function : PQ_sigmaNR
  6095. // Params
  6096. // Description:
  6097. // Returns :
  6098. //****************************************************************************
  6099. void PQ_SigmaNR(BOOL bReset, UINT8 ucLevel,UINT8 iUserMin, UINT8 iUserMax )
  6100. {
  6101. PQHW_CONTEXT* pHwContext= &PQHwContext;
  6102. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  6103. UINT8 ucTableIndex;
  6104. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  6105. Sigama_NR_Data *pSigama_NR;
  6106. int uiSigamaNRMiscCtl, i;
  6107. static UINT8 bStart = FALSE;
  6108. if(bReset)
  6109. {
  6110. bStart = TRUE;
  6111. return;
  6112. }
  6113. if(bStart)
  6114. {
  6115. bStart = FALSE;
  6116. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  6117. if (pVtab->mSigama_NR.mGroupedIndex[ucCurrSrcIndex] >= 8) return;
  6118. ucTableIndex = pVtab->mSigama_NR.mGroupedIndex[ucCurrSrcIndex];
  6119. pSigama_NR = &pVtab->mSigama_NR.Sigama_NR[ucTableIndex];
  6120. uiSigamaNRMiscCtl = pVtab->Sigma_NR_Misc_Ctl[ucTableIndex];
  6121. if(ucLevel == 0)
  6122. {
  6123. //PQ_RegisterWrite(VIP_reg_vdi_sigma_en, OFF);
  6124. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_EN, pSigama_NR->sigama_NR_opt);
  6125. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_TNR_EN_W, 0);//pSigama_NR->SigamaNR_Region[WEAK_LEVEL].bTemporal);
  6126. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VAR_SEL_W, 0);//pSigama_NR->SigamaNR_Region[WEAK_LEVEL].bVarScale);
  6127. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_FIL_GAIN_W, 0);//pSigama_NR->SigamaNR_Region[WEAK_LEVEL].bGain);
  6128. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VMOT_SEL_W,0);// pSigama_NR->SigamaNR_Region[WEAK_LEVEL].bVMotScale);
  6129. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VREF_SEL_W, 0);//pSigama_NR->SigamaNR_Region[WEAK_LEVEL].bVRefScale);
  6130. //normal region
  6131. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_TNR_EN_N, 0);//pSigama_NR->SigamaNR_Region[NORMAL_LEVEL].bTemporal);
  6132. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VAR_SEL_N, 0);//pSigama_NR->SigamaNR_Region[NORMAL_LEVEL].bVarScale);
  6133. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_FIL_GAIN_N, 0);//pSigama_NR->SigamaNR_Region[NORMAL_LEVEL].bGain);
  6134. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VMOT_SEL_N, 0);//pSigama_NR->SigamaNR_Region[NORMAL_LEVEL].bVMotScale);
  6135. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VREF_SEL_N, 0);//pSigama_NR->SigamaNR_Region[NORMAL_LEVEL].bVRefScale);
  6136. //normal region
  6137. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_TNR_EN_S, 0);//pSigama_NR->SigamaNR_Region[STRONG_LEVEL].bTemporal);
  6138. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VAR_SEL_S, 0);//pSigama_NR->SigamaNR_Region[STRONG_LEVEL].bVarScale);
  6139. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_FIL_GAIN_S, 0);//pSigama_NR->SigamaNR_Region[STRONG_LEVEL].bGain);
  6140. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VMOT_SEL_S, 0);//pSigama_NR->SigamaNR_Region[STRONG_LEVEL].bVMotScale);
  6141. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VREF_SEL_S,0);// pSigama_NR->SigamaNR_Region[STRONG_LEVEL].bVRefScale);
  6142. }
  6143. else
  6144. {
  6145. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_EN, pSigama_NR->sigama_NR_opt);
  6146. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_IN_SEL, pSigama_NR->sigama_NR_mode);
  6147. //weak region
  6148. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_TNR_EN_W, pSigama_NR->SigamaNR_Region[WEAK_LEVEL].bTemporal);
  6149. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VAR_SEL_W, pSigama_NR->SigamaNR_Region[WEAK_LEVEL].bVarScale);
  6150. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_FIL_GAIN_W, pSigama_NR->SigamaNR_Region[WEAK_LEVEL].bGain);
  6151. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VMOT_SEL_W, pSigama_NR->SigamaNR_Region[WEAK_LEVEL].bVMotScale);
  6152. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VREF_SEL_W, pSigama_NR->SigamaNR_Region[WEAK_LEVEL].bVRefScale);
  6153. //normal region
  6154. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_TNR_EN_N, pSigama_NR->SigamaNR_Region[NORMAL_LEVEL].bTemporal);
  6155. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VAR_SEL_N, pSigama_NR->SigamaNR_Region[NORMAL_LEVEL].bVarScale);
  6156. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_FIL_GAIN_N, pSigama_NR->SigamaNR_Region[NORMAL_LEVEL].bGain);
  6157. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VMOT_SEL_N, pSigama_NR->SigamaNR_Region[NORMAL_LEVEL].bVMotScale);
  6158. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VREF_SEL_N, pSigama_NR->SigamaNR_Region[NORMAL_LEVEL].bVRefScale);
  6159. //strong region
  6160. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_TNR_EN_S, pSigama_NR->SigamaNR_Region[STRONG_LEVEL].bTemporal);
  6161. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VAR_SEL_S, pSigama_NR->SigamaNR_Region[STRONG_LEVEL].bVarScale);
  6162. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_FIL_GAIN_S, pSigama_NR->SigamaNR_Region[STRONG_LEVEL].bGain);
  6163. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VMOT_SEL_S, pSigama_NR->SigamaNR_Region[STRONG_LEVEL].bVMotScale);
  6164. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VREF_SEL_S, pSigama_NR->SigamaNR_Region[STRONG_LEVEL].bVRefScale);
  6165. //complexity level
  6166. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VMAX_TH_LO, pSigama_NR->SigamaNR_Complexity_level.bLowTH);
  6167. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VMAX_TH_MD, pSigama_NR->SigamaNR_Complexity_level.bMiddleTH);
  6168. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VMAX_TH_HI, pSigama_NR->SigamaNR_Complexity_level.bHighTH);
  6169. //adaptive static th
  6170. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_STATIC_TH_W, pSigama_NR->SigamaNR_Adaptive_Static_TH.bWeak);
  6171. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_STATIC_TH_N, pSigama_NR->SigamaNR_Adaptive_Static_TH.bNormal);
  6172. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_STATIC_TH_S, pSigama_NR->SigamaNR_Adaptive_Static_TH.bStrong);
  6173. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VMIN_TH, pSigama_NR->SigamaNR_Adaptive_Static_TH.bLowNoiseTH);
  6174. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_STATIC_TH, pSigama_NR->SigamaNR_Adaptive_Static_TH.bStaticTH);
  6175. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_DTL_TH_LO, pSigama_NR->SigamaNR_Adaptive_Static_TH.bDetailTH);
  6176. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VMAX_SH, pSigama_NR->SigamaNR_Adaptive_Static_TH.bComplexScale);
  6177. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VMIN_SH, pSigama_NR->SigamaNR_Adaptive_Static_TH.bVarScale);
  6178. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VDTL_SH, pSigama_NR->SigamaNR_Adaptive_Static_TH.bDetailScale);
  6179. //post-tnr gain
  6180. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_TNR_GAIN_W, pSigama_NR->SigamaNR_Post_TNR_Gain.bWeak);
  6181. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_TNR_GAIN_N, pSigama_NR->SigamaNR_Post_TNR_Gain.bNormal);
  6182. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_TNR_GAIN_S, pSigama_NR->SigamaNR_Post_TNR_Gain.bStrong);
  6183. //variance upper bound
  6184. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VAR_MANUAL_W, pSigama_NR->SigamaNR_Variance_Upper_Bound.bWeak[0] + (pSigama_NR->SigamaNR_Variance_Upper_Bound.bWeak[1]<<16));
  6185. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VAR_MANUAL_N, pSigama_NR->SigamaNR_Variance_Upper_Bound.bNormal[0] + (pSigama_NR->SigamaNR_Variance_Upper_Bound.bNormal[1]<<16));
  6186. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VAR_MANUAL_S, pSigama_NR->SigamaNR_Variance_Upper_Bound.bStrong[0] + (pSigama_NR->SigamaNR_Variance_Upper_Bound.bStrong[1]<<16));
  6187. //base & bound
  6188. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_MOTION_TH_BASE, pSigama_NR->SigamaNRBase);
  6189. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_MOTION_TH_BND, pSigama_NR->SigamaNRBound);
  6190. //variance th
  6191. for(i = 0; i< 7; i++)
  6192. {
  6193. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_VAR_TH1 + i, pSigama_NR->Variance_TH[i]);
  6194. }
  6195. //variance th
  6196. for(i = 0; i< 7; i++)
  6197. {
  6198. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_MOTION_TH1 + i, pSigama_NR->Motion_TH[i]);
  6199. }
  6200. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_MISC_CTRL, uiSigamaNRMiscCtl);
  6201. }
  6202. }
  6203. }
  6204. //****************************************************************************
  6205. //
  6206. // Function : PQ_SetGammaTable
  6207. // Params : *pulAddr
  6208. // Description: For pqtool set gamma table to VIP (related to WriteGammaToSiSCmd())
  6209. // Returns : 0=fail ,1=success
  6210. //****************************************************************************
  6211. BOOL PQ_SetGammaTable(UINT32 *pulAddr)
  6212. {
  6213. INT32 iTableCnt;
  6214. PQ_RegisterWrite(VIP_reg_dpy_gmlut_addr,0); //initial index for gamma table write
  6215. for (iTableCnt=0;iTableCnt<GAMMA_RGB_MAXINDEX;iTableCnt++){
  6216. PQ_RegisterWrite(VIP_reg_dpy_gmlut_data, *pulAddr );
  6217. pulAddr++;
  6218. }
  6219. return TRUE;
  6220. }
  6221. //****************************************************************************
  6222. //
  6223. // Function : PQ_LoadGammaTable
  6224. // Params : *pulAddr
  6225. // Description: read out gamma table form VIP
  6226. // Returns : table data size
  6227. //****************************************************************************
  6228. UINT32 PQ_LoadGammaTable(UINT32 *pulAddr)
  6229. {
  6230. INT32 iTableCnt;
  6231. PQ_RegisterWrite(VIP_reg_dpy_gmlut_addr,0); //initial index for gamma table write
  6232. for (iTableCnt=0;iTableCnt<GAMMA_RGB_MAXINDEX_512;iTableCnt++){
  6233. *pulAddr=PQ_RegisterRead(VIP_reg_dpy_gmlut_data);
  6234. pulAddr++;
  6235. }
  6236. *pulAddr=0x35536953; //identify gamma table string
  6237. pulAddr++;
  6238. *pulAddr=0x475f3631;
  6239. pulAddr++;
  6240. *pulAddr=0x616d6d61;
  6241. return 4108; //gamma talbe total size
  6242. }
  6243. void PQ_DisableGammaTable(BOOL b12BitGammaTable)
  6244. {
  6245. UINT32 ulCounter,ulDataValue;
  6246. PQ_RegisterWrite(VIP_reg_dpy_gmlut_addr,0); //initial index for gamma table write
  6247. for (ulCounter=0;ulCounter<GAMMA_RGB_MAXINDEX;ulCounter++) //input data 10/12 bits
  6248. {
  6249. //short setting time to avoid setting error
  6250. if(!b12BitGammaTable)
  6251. {
  6252. ulDataValue = (ulCounter<<20) | (ulCounter<<10) |(ulCounter);
  6253. PQ_RegisterWrite(VIP_reg_dpy_gmlut_data,ulDataValue);
  6254. }
  6255. else
  6256. {
  6257. ulDataValue = (ulCounter<<20) | (ulCounter<<10) |(ulCounter);
  6258. PQ_RegisterWrite(VIP_reg_dpy_gmlut_data,ulDataValue);
  6259. ulDataValue = ((ulCounter+1)<<20) | ((ulCounter+1)<<10) |(ulCounter+1);
  6260. PQ_RegisterWrite(VIP_reg_dpy_gmlut_data,ulDataValue);
  6261. }
  6262. }
  6263. }
  6264. BOOL PQ_GetGammaChange(void)
  6265. {
  6266. PQHW_CONTEXT* pHwContext= &PQHwContext;
  6267. return pHwContext->bGammaChange;
  6268. }
  6269. void PQ_WriteGammaTable(void)
  6270. {
  6271. PQHW_CONTEXT* pHwContext= &PQHwContext;
  6272. UINT32 i;
  6273. if((*((UINT8*)(0xbe1cd688))) == 0x5)
  6274. {
  6275. return;
  6276. }
  6277. PQ_RegisterWrite(VIP_reg_dpy_gmlut_addr, 0);
  6278. for (i=0; i<GAMMA_RGB_MAXINDEX; i++)
  6279. {
  6280. #ifdef CONFIG_SWITCH_GAMMA_TABLE_WITHOUT_RESET
  6281. PQ_RegisterWrite(VIP_reg_dpy_gmlut_addr, i);
  6282. #endif
  6283. PQ_RegisterWrite(VIP_reg_dpy_gmlut_data, pHwContext->Gammatable[i]);
  6284. }
  6285. PQ_RegisterWrite(VIP_reg_dpy_gmlut_addr,0);
  6286. PQ_RegisterWrite(VIP_reg_dpy_no_gamma, DISABLE);
  6287. pHwContext->bGammaChange=FALSE;
  6288. }
  6289. UINT8 PQ_GetGammaIndex(void)
  6290. {
  6291. PQHW_CONTEXT* pHwContext= &PQHwContext;
  6292. return pHwContext->GammaIndex;
  6293. }
  6294. /**
  6295. * @brief Setup gamma setting
  6296. *
  6297. * This function sets Gamma setting form bin file, the number of setting had increase to 1024,
  6298. * different from previous 512 set
  6299. *
  6300. * @param : ucEnable to control enable/disable gamma function
  6301. * @param : ucTableIndex to select which set of gamma table setting (all 3 set)
  6302. * @return : n/a
  6303. * @note 1 : chagne tne number of set from 512 to 1024 from 8506
  6304. * @To Do : 1. remove 12 bit flow since no longer use
  6305. */
  6306. void PQ_SetupGammaTable(UINT8 ucEnable, UINT8 ucTableIndex, UINT8 ucRGBGainAdjust)
  6307. {
  6308. volatile UINT32 *pGammaTable = NULL;
  6309. UINT8 pGammaTableID[15];
  6310. UINT32 ulCounter;
  6311. BOOL b12BitGammaTable= FALSE;
  6312. PQHW_CONTEXT* pHwContext= &PQHwContext;
  6313. #ifndef CONFIG_WHITE_BALANCE_ADJUST_IN_DPY_MATRIX
  6314. UINT16 TempR,TempB,TempG;
  6315. INT32 bTempRGain,bTempGGain,bTempBGain;
  6316. bTempRGain = pHwContext->iRGain;
  6317. bTempGGain = pHwContext->iGGain;
  6318. bTempBGain = pHwContext->iBGain;
  6319. if((pHwContext->iRGain == 0) && (pHwContext->iGGain == 0) && (pHwContext->iBGain == 0))
  6320. {
  6321. bTempRGain = 1024;
  6322. bTempGGain = 1024;
  6323. bTempBGain = 1024;
  6324. }
  6325. #endif
  6326. #ifdef CONFIG_WHITE_BALANCE_ADJUST_IN_DPY_MATRIX
  6327. if(pHwContext->GammaIndex != ucTableIndex || pHwContext->GammaEnable != ucEnable || ucRGBGainAdjust == TRUE)//prevent blanking from duplicate setting
  6328. #else
  6329. if(pHwContext->GammaIndex != ucTableIndex || pHwContext->GammaEnable != ucEnable || ucRGBGainAdjust == TRUE || ValueChange ==TRUE)//prevent blanking from duplicate setting
  6330. #endif
  6331. {
  6332. if(ucEnable == ENABLE)
  6333. {
  6334. pHwContext->bGammaChange=FALSE;
  6335. if(ucRGBGainAdjust == FALSE && ucTableIndex>2) // gamma table index is out of range
  6336. {
  6337. PQDebugPrint("%s: [ERROR!!] ucTableIndex is illegal(out of range: 0~2)", __FUNCTION__);
  6338. return;
  6339. }
  6340. if(ucRGBGainAdjust)
  6341. {
  6342. pGammaTable = (volatile UINT32*) (SPI_GAMMATABLE_SHADOWADDR+(SPI_GAMMATABLE_SIZE*pHwContext->GammaIndex));
  6343. }
  6344. else
  6345. {
  6346. pGammaTable = (volatile UINT32*) (SPI_GAMMATABLE_SHADOWADDR+(SPI_GAMMATABLE_SIZE*ucTableIndex));
  6347. }
  6348. memcpy(pGammaTableID, ((UINT8 *)pGammaTable)+0x1000, 14);
  6349. memset(&pGammaTableID[14], 0, 1);
  6350. PQDebugPrint("%s: tag of table %d is %s", __FUNCTION__, ucTableIndex, pGammaTableID);
  6351. if( memcmp(pGammaTableID, ID_GammaString12, 14)==0 )
  6352. {
  6353. b12BitGammaTable= TRUE;
  6354. }
  6355. else if( memcmp(pGammaTableID, ID_GammaString10, 12)==0 ) //recognize prefix 12 characters
  6356. {
  6357. b12BitGammaTable= FALSE;
  6358. }
  6359. else
  6360. {
  6361. PQDebugPrint("%s: Gamma Table ID is illegal, diable gamma table!!", __FUNCTION__);
  6362. pHwContext->GammaEnable = DISABLE;
  6363. PQ_DisableGammaTable(FALSE);
  6364. return;
  6365. }
  6366. // start to setup gamma table as following if ucTableIndex and GammaTableID are correct
  6367. if(!ucRGBGainAdjust)
  6368. {
  6369. pHwContext->GammaIndex=ucTableIndex;
  6370. pHwContext->GammaEnable = ENABLE;
  6371. }
  6372. #ifndef CONFIG_SWITCH_GAMMA_TABLE_WITHOUT_RESET
  6373. PQ_RegisterWrite(VIP_reg_dpy_no_gamma, ENABLE); //disable gamma function
  6374. mdelay(20); //the timing can check with HW, the dpy_gmlut_data will work at next Vsync after disable gamma, so wait a fream then sart set data
  6375. PQ_RegisterWrite(VIP_reg_dpy_gmlut_addr,0); //initial index for gamma table write
  6376. #endif
  6377. for (ulCounter=0; ulCounter<GAMMA_RGB_MAXINDEX; ulCounter++) //input data 10/12 bits
  6378. {
  6379. #ifdef CONFIG_PANEL_LM201WE3_TLF5_1680X1050__S2TEK_IS_DEFAULT
  6380. TempR = 1023 - ((pGammaTable[ulCounter] & 0x3ff00000) >> 20);
  6381. TempG = 1023 - ((pGammaTable[ulCounter] & 0xFFC00) >> 10);
  6382. TempB = 1023 - (pGammaTable[ulCounter] & 0x3FF);
  6383. pHwContext->Gammatable[ulCounter] = (TempR << 20) + (TempG << 10) + TempB;
  6384. #else
  6385. //short setting time to avoid setting error
  6386. #ifdef CONFIG_WHITE_BALANCE_ADJUST_IN_DPY_MATRIX
  6387. pHwContext->Gammatable[ulCounter] = pGammaTable[ulCounter];
  6388. #else
  6389. TempG= (pGammaTable[ulCounter] & 0x3ff00000) >> 20;
  6390. TempB = (pGammaTable[ulCounter] & 0xFFC00) >> 10;
  6391. TempR = pGammaTable[ulCounter] & 0x3FF;
  6392. TempR = max(0, min(1023, TempR*((bTempRGain*1000+512)/1024)/1000));
  6393. TempG = max(0, min(1023, TempG*((bTempGGain*1000+512)/1024)/1000));
  6394. TempB = max(0, min(1023, TempB*((bTempBGain*1000+512)/1024)/1000));
  6395. pHwContext->Gammatable[ulCounter]=((TempG << 20) + (TempB << 10) + TempR);
  6396. #endif
  6397. #endif
  6398. }
  6399. pHwContext->bGammaChange=TRUE;
  6400. }
  6401. else
  6402. {
  6403. pHwContext->GammaEnable = DISABLE;
  6404. PQ_DisableGammaTable(b12BitGammaTable);
  6405. PQDebugPrint("Without Gamma Table.......Turn off Gamma correction.");
  6406. }
  6407. }
  6408. }
  6409. #define VIP_COLOR_SPACE_RGB 0
  6410. #define VIP_COLOR_SPACE_YUV444 1
  6411. #define VIP_COLOR_SPACE_YUV422 2
  6412. void ADI_ReadPixelfortest(UINT32 bHstart,UINT32 bHend,UINT32 bVstart,UINT32 bVend,COLORYUV **bYUV)
  6413. {
  6414. UINT32 nWidth,nHeight,nColorSpace=VIP_COLOR_SPACE_RGB;
  6415. UINT32 nValue,i = 0;
  6416. UINT8 nValue1;
  6417. UINT32 nHStart = 0, nVStart = 0;
  6418. UINT32 fY,fU,fV;
  6419. //UINT32 x1, y1, x2, y2;
  6420. UINT32 x,y;
  6421. BOOL bInterlace;
  6422. COLORYUV bYUVTemp={0};
  6423. bInterlace= FALSE;
  6424. //bY = malloc(((bHend - bHstart) * (bVend - bVstart)) * sizeof(UINT32));
  6425. nValue1 = VIP_GetUserSource();
  6426. if( nValue1==SOURCE_EXTS )
  6427. {
  6428. nValue1 = PQ_RegisterRead(VIP_reg_adi_exts_vid_in);
  6429. if( (nValue1&0x1)==0 )
  6430. {
  6431. nColorSpace= VIP_COLOR_SPACE_RGB;
  6432. }
  6433. else
  6434. {
  6435. nValue1 = PQ_RegisterRead(VIP_reg_adi_exts_vid601);
  6436. nColorSpace= (nValue1&0x2) ? VIP_COLOR_SPACE_YUV422 : VIP_COLOR_SPACE_YUV444;
  6437. }
  6438. }
  6439. else if( nValue1==SOURCE_MPEG )
  6440. {
  6441. nColorSpace= VIP_COLOR_SPACE_YUV422;
  6442. }
  6443. else if( nValue1==SOURCE_CVD2 )
  6444. {
  6445. nValue1 = PQ_RegisterRead(VIP_reg_adi_exts_vid601);
  6446. nColorSpace= (nValue1&0x1) ? VIP_COLOR_SPACE_YUV422 : VIP_COLOR_SPACE_YUV444;
  6447. }
  6448. else if( nValue1==SOURCE_HDMI )
  6449. {
  6450. nValue1 = PQ_RegisterRead(VIP_reg_adi_hdmi_vid_in );
  6451. if( (nValue1&0x1)==0 )
  6452. {
  6453. nColorSpace= VIP_COLOR_SPACE_RGB;
  6454. }
  6455. else
  6456. {
  6457. nValue1 = PQ_RegisterRead(VIP_reg_adi_hdmi_vid601);
  6458. nColorSpace= (nValue1&0x1) ? VIP_COLOR_SPACE_YUV422 : VIP_COLOR_SPACE_YUV444;
  6459. }
  6460. }
  6461. else if( nValue1==SOURCE_PATTERN )
  6462. {
  6463. nColorSpace= VIP_COLOR_SPACE_RGB;
  6464. }
  6465. else
  6466. {
  6467. return;
  6468. }
  6469. nWidth = PQ_RegisterRead(VIP_reg_adix_che);
  6470. nValue = PQ_RegisterRead(VIP_reg_adix_chs);
  6471. if( nWidth && nValue )
  6472. {
  6473. nWidth&= 0x2fff;
  6474. nWidth-= nValue&0x2fff;
  6475. nHStart = nValue;
  6476. }
  6477. nHeight = PQ_RegisterRead(VIP_reg_adix_cve);
  6478. nValue = PQ_RegisterRead(VIP_reg_adix_cvs);
  6479. if( nHeight && nValue )
  6480. {
  6481. nHeight&= 0x7ff;
  6482. nHeight-= nValue&0x7ff;
  6483. nVStart = nValue;
  6484. }
  6485. printk("\n\n nHeight =%d nVStart =%d nHStart = %d nWidth = %d \n\n",nHeight,nVStart,nHStart,nWidth);
  6486. nValue1 = PQ_RegisterRead(VIP_reg_vdi_interlace);
  6487. if( nValue1 )
  6488. {
  6489. bInterlace= (nValue1 & 0x1)?TRUE:FALSE;
  6490. nValue1 = PQ_RegisterRead(VIP_reg_adi_sch_top);
  6491. if(nValue1)
  6492. {
  6493. if( bInterlace==false )
  6494. {
  6495. nValue1|= 0x1;
  6496. }
  6497. else
  6498. {
  6499. nValue1&= ~0x1;
  6500. }
  6501. PQ_RegisterWrite(VIP_reg_adi_sch_top, nValue1);
  6502. }
  6503. }
  6504. if(bVstart < nVStart)
  6505. bVstart = nVStart;
  6506. if(bHstart < nHStart)
  6507. bHstart = nHStart;
  6508. for(y=bVstart; y<=bVend && y<nHeight+nVStart; y++)
  6509. {
  6510. //printk("\n=======bVstart = %d====\n",bVstart);
  6511. PQ_RegisterWrite(VIP_reg_adix_pix_y, y);
  6512. for(x=bHstart; x<=bHend && x<nWidth+nHStart; x++)
  6513. {
  6514. PQ_RegisterWrite(VIP_reg_adix_pix_x, x);
  6515. PQ_RegisterWrite(VIP_reg_adix_pix_color_show_en, 1);
  6516. mdelay(50);
  6517. if( nColorSpace==VIP_COLOR_SPACE_YUV444 || nColorSpace==VIP_COLOR_SPACE_YUV422 )
  6518. {
  6519. nValue = PQ_RegisterRead(VIP_sta_xp_adi_pix_gcolor);
  6520. //printk("\n nValue y =%d\n",nValue);
  6521. fY= nValue & 0x3ff;
  6522. nValue = PQ_RegisterRead(VIP_sta_xp_adi_pix_bcolor);
  6523. fU= nValue & 0x3ff;
  6524. nValue = PQ_RegisterRead(VIP_sta_xp_adi_pix_rcolor);
  6525. fV= nValue & 0x3ff;
  6526. }
  6527. else
  6528. {
  6529. nValue = PQ_RegisterRead(VIP_sta_xp_adi_pix_rcolor);
  6530. fY= nValue & 0x3ff;
  6531. nValue = PQ_RegisterRead(VIP_sta_xp_adi_pix_gcolor);
  6532. fU= nValue & 0x3ff;
  6533. nValue = PQ_RegisterRead(VIP_sta_xp_adi_pix_bcolor);
  6534. fV= nValue & 0x3ff;
  6535. }
  6536. //printk("\n 5 fY=%d fU =%d fV = %d \n",fY,fU,fV);
  6537. memset(&bYUVTemp,0,sizeof(COLORYUV));
  6538. bYUVTemp.dU = fU/4;
  6539. bYUVTemp.dY = fY/4;
  6540. bYUVTemp.dV = fV/4;
  6541. *(bYUV[i]) = bYUVTemp;
  6542. i++;
  6543. PQ_RegisterWrite(VIP_reg_adix_pix_color_show_en, 0);
  6544. }
  6545. }
  6546. }
  6547. /**
  6548. * @brief Enable/Disable PQ function or adjust the PQ setting to medium/orignal value
  6549. *
  6550. * This function Enable/Disable PQ function or adjust the PQ setting to medium/orignal value, list he function as below
  6551. * brightness, contrast, sharpness, saturation, hue, color tempurature, NR
  6552. * color LUT, cross Luma & Chroma
  6553. *
  6554. * @param : ucEnable to control enable/disable function
  6555. * @return : n/a
  6556. */
  6557. void PQ_ColorProcesser(UINT8 ucEnable)
  6558. {
  6559. PQHW_CONTEXT* pHwContext= &PQHwContext;
  6560. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  6561. PQ_ADVANCE_HWPrint( "%s: ucEnable=%d", __FUNCTION__, ucEnable);
  6562. pHwContext->bEnableColorProcess= ucEnable;
  6563. if( ucEnable==DISABLE )
  6564. {
  6565. //Set Normal values
  6566. PQ_Brightness(TRUE, 1024);
  6567. PQ_Contrast(TRUE, 1024);
  6568. PQ_Sharpness(TRUE, 0); //64 //should set 0 to disable sharpness by ren's request
  6569. PQ_Saturation(1024);
  6570. PQ_Hue(50);
  6571. //Disable ypp mode
  6572. //PQ_RegisterWrite(VIP_reg_dpy_ypp, DISABLE); //should before brightness setting
  6573. //Disable color temp
  6574. PQ_ColorTempGain(PQ_CT_GAIN_R, 1024);
  6575. PQ_ColorTempGain(PQ_CT_GAIN_G, 1024);
  6576. PQ_ColorTempGain(PQ_CT_GAIN_B, 1024);
  6577. PQ_ColorTempBias(PQ_CT_BIAS_R, 0);
  6578. PQ_ColorTempBias(PQ_CT_BIAS_G, 0);
  6579. PQ_ColorTempBias(PQ_CT_BIAS_B, 0);
  6580. //bypass color processer
  6581. PQ_RegisterWrite(VIP_reg_dpy_hsy_bypass,1);
  6582. //Disable dynamic saturationm, in fact it disable the hw saturation
  6583. PQ_RegisterWrite(VIP_reg_dpy_hsv,0);
  6584. //Clear sharpness value
  6585. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_smooth1, 0);
  6586. PQ_RegisterWrite(VIP_reg_dpy_filter_hc_smooth1, 0);
  6587. PQ_RegisterWrite(VIP_reg_dpy_filter_vl_smooth, 0);
  6588. PQ_RegisterWrite(VIP_reg_dpy_filter_vc_smooth, 0);
  6589. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_sharp, 0);
  6590. PQ_RegisterWrite(VIP_reg_dpy_filter_hc_sharp, 0);
  6591. PQ_RegisterWrite(VIP_reg_dpy_filter_vl_sharp, 0);
  6592. PQ_RegisterWrite(VIP_reg_dpy_filter_vc_sharp, 0);
  6593. //Disable NR
  6594. PQ_3DNoiseReductoin(OFF, 0, 0);
  6595. PQ_MPEGNoiseReductoin(OFF, 0, 0);
  6596. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_EN, FALSE);
  6597. //Disable LUT
  6598. PQ_SetupLUTTable(DISABLE);
  6599. //cross luma
  6600. PQ_SetColorCross(DISABLE);
  6601. //post-dcti
  6602. PQ_RegisterWrite(VIP_reg_slr_dcti_en_post, FALSE);
  6603. PQ_RegisterWrite(VIP_reg_slr_2d_sharp_en,0);
  6604. }
  6605. else
  6606. {
  6607. //Restore menu values
  6608. PQ_Brightness(TRUE, pMenuValue->iBrightness);
  6609. PQ_Contrast(TRUE, pMenuValue->iContrast);
  6610. PQ_Sharpness(TRUE, pMenuValue->iSharpness);
  6611. PQ_Saturation(pMenuValue->iSaturation);
  6612. PQ_Hue(pMenuValue->iHue);
  6613. PQ_Sharpness_POSTDCTI(TRUE, pMenuValue->iSharpness);
  6614. PQ_Sharpness_POST_2D(TRUE, pMenuValue->iSharpness);
  6615. //Restore ypp mode
  6616. //#if prevent_DPY_from_clamping_input_YCC_16_235
  6617. //PQ_RegisterWrite(VIP_reg_dpy_ypp, ENABLE); //should before brightness setting
  6618. //#endif
  6619. //Enable color temp
  6620. PQ_ColorTempGain(PQ_CT_GAIN_R, pMenuValue->iColorTemp[0]);
  6621. PQ_ColorTempGain(PQ_CT_GAIN_G, pMenuValue->iColorTemp[1]);
  6622. PQ_ColorTempGain(PQ_CT_GAIN_B, pMenuValue->iColorTemp[2]);
  6623. PQ_ColorTempBias(PQ_CT_BIAS_R, pMenuValue->iColorBias[0]);
  6624. PQ_ColorTempBias(PQ_CT_BIAS_G, pMenuValue->iColorBias[1]);
  6625. PQ_ColorTempBias(PQ_CT_BIAS_B, pMenuValue->iColorBias[2]);
  6626. //Restore dynamic contrast
  6627. //Enable color processer
  6628. PQ_RegisterWrite(VIP_reg_dpy_hsy_bypass,0);
  6629. //Enable dynamic saturation, in fact it enable the hw saturation
  6630. PQ_RegisterWrite(VIP_reg_dpy_hsv,1);
  6631. //Enable NR
  6632. PQ_3DNoiseReductoin(pMenuValue->ucNRLevel, pHwContext->ucNRUserMin, pHwContext->ucNRUserMax);
  6633. PQ_MPEGNoiseReductoin(pMenuValue->ucMPEGNRLevel, pHwContext->ucMPEGNRUserMin, pHwContext->ucMPEGNRUserMax);
  6634. #ifdef CONFIG_FORCE_NR_EFFECT_ENHANCED_IN_OFF_OPTION
  6635. PQ_SigmaNR(TRUE, 0xff, 0xff, 0xff);
  6636. #else
  6637. PQ_SigmaNR(TRUE, pHwContext->nNRLevel, 0xff, 0xff);
  6638. #endif
  6639. //Enable LUT
  6640. PQ_SetupLUTTable(ENABLE);
  6641. }
  6642. }
  6643. void PQ_ColorProcesserDisable(void)
  6644. {
  6645. PQ_ColorProcesser(DISABLE);
  6646. }
  6647. void PQ_DemoModeWidth(void)
  6648. {
  6649. UINT32 split_width,vdi_hsize_i,vdi_hds;
  6650. UINT32 dpy_hds;
  6651. dpy_hds= PQ_RegisterRead(VIP_reg_dpy_hds)*2;
  6652. vdi_hsize_i= VIP_GetScalerPreScaleH();
  6653. vdi_hds= 0;
  6654. split_width= 0;
  6655. if( PQ_RegisterRead(VIP_reg_vdi_tnr_debug_en)!=0 )
  6656. {
  6657. split_width= (dpy_hds+(VIP_GetOutputHSize()/2))/2;
  6658. PQDebugPrint("split width=%d ", split_width);
  6659. PQ_RegisterWrite(VIP_reg_dpy_split_width, split_width);//Dynamic Contrast
  6660. if( VIP_GetOutputHSize()>=1920 && split_width==1023 )
  6661. {
  6662. if(VIP_GetOutputHSize()> 0)
  6663. {
  6664. vdi_hds= (1023-(dpy_hds)) * vdi_hsize_i / VIP_GetOutputHSize();
  6665. }
  6666. }
  6667. else
  6668. vdi_hds= vdi_hsize_i /2;
  6669. PQ_RegisterWrite(VIP_reg_vdi_tnr_dbg_offset, vdi_hds);
  6670. }
  6671. else
  6672. {
  6673. PQ_RegisterWrite(VIP_reg_dpy_split_width, 0);//Dynamic Contrast
  6674. PQ_RegisterWrite(VIP_reg_vdi_tnr_dbg_offset, 0);
  6675. }
  6676. }
  6677. void PQ_NERegion(BOOL bDemoMode, UINT32 vdi_hsize_i, UINT32 vdi_vsize)
  6678. {
  6679. UINT32 vdi_hds,vdi_ne_total;
  6680. UINT32 vdi_hsize;
  6681. PQ_RegisterWrite(VIP_reg_vdi_ne_field_diff_th, 10);
  6682. PQ_RegisterWrite(VIP_reg_vdi_ne_static_u0, 0x20);
  6683. PQ_RegisterWrite(VIP_reg_vdi_ne_static_v0, 0x40);
  6684. PQ_RegisterWrite(VIP_reg_vdi_ne_static_u1, 0x10);
  6685. PQ_RegisterWrite(VIP_reg_vdi_ne_static_v1, 0x20);
  6686. PQ_RegisterWrite(VIP_reg_vdi_ne_alpha,4);
  6687. //set ne estimate
  6688. vdi_hds= bDemoMode ? PQ_RegisterRead(VIP_reg_vdi_tnr_dbg_offset): 0;
  6689. vdi_hsize= vdi_hsize_i - vdi_hds;
  6690. vdi_ne_total= vdi_hsize * vdi_vsize;
  6691. if(bDemoMode)
  6692. PQ_RegisterWrite(VIP_reg_vdi_ne_hds, vdi_hds + 2);
  6693. else
  6694. PQ_RegisterWrite(VIP_reg_vdi_ne_hds, 2);
  6695. PQ_RegisterWrite(VIP_reg_vdi_ne_hde, vdi_hsize_i - 3);
  6696. PQ_RegisterWrite(VIP_reg_vdi_ne_vds, 1);
  6697. PQ_RegisterWrite(VIP_reg_vdi_ne_vde, vdi_vsize - 2);
  6698. PQ_RegisterWrite(VIP_reg_vdi_ne_fd_chg_thd, vdi_ne_total *2 / 17);
  6699. PQ_RegisterWrite(VIP_reg_vdi_ne_invald_thd, vdi_ne_total *2 / 17);
  6700. PQ_RegisterWrite(VIP_reg_vdi_ne_fd_chg_thd_cur, vdi_ne_total *2 / 17);
  6701. //981113 hw design
  6702. PQ_RegisterWrite(VIP_reg_vdi_ne_mot_th1, 0xc0);
  6703. PQ_RegisterWrite(VIP_reg_vdi_ne_mot_th2, 0xffffffff);
  6704. PQ_RegisterWrite(VIP_reg_vdi_ne_fd_chg_mbw_thd, (VIP_GetInputVSize()<720 )?0x546:0x1feb);
  6705. PQ_RegisterWrite(VIP_reg_vdi_ne_total_th, vdi_ne_total/87);
  6706. //UINT32 ne_reliable_th = (vdi_ne_total * 3)/100;
  6707. PQ_RegisterWrite(VIP_reg_vdi_ne_reliable_th, 3456);//ne_reliable_th);
  6708. //PC Modified 2008-12-05 update
  6709. //1.set ne_dth_min 4 (UINT8 0xbe1c6324 4)
  6710. //2.set ne_dth_max 32 (UINT8 0xbe1c6325 32)
  6711. PQ_RegisterWrite(VIP_reg_vdi_ne_block_dth_min, 4);
  6712. PQ_RegisterWrite(VIP_reg_vdi_ne_block_dth_max, 40);//2008-12-08 PC
  6713. PQ_RegisterWrite(VIP_reg_vdi_ne_block_cth_max, 0x0);
  6714. //# block_std_th = 4^2 * 15 ^2
  6715. PQ_RegisterWrite(VIP_reg_vdi_ne_blk_std_thd, 3600);
  6716. }
  6717. void PQ_DPYDemoModeEnable(UINT8 demo_enable)
  6718. {
  6719. UINT32 split_width;
  6720. UINT32 dpy_hds;
  6721. PQDebugPrint("demo_enable=%d ", demo_enable);
  6722. if( demo_enable)
  6723. {
  6724. dpy_hds= PQ_RegisterRead(VIP_reg_dpy_hds)*2;
  6725. split_width= (dpy_hds+(VIP_GetOutputHSize()/2))/2;
  6726. PQDebugPrint("split width=%d ", split_width);
  6727. PQ_RegisterWrite(VIP_reg_dpy_split_width, split_width);
  6728. }
  6729. else
  6730. PQ_RegisterWrite(VIP_reg_dpy_split_width, 0);
  6731. }
  6732. void PQ_DemoModeEnable(UINT8 demo_enable)
  6733. {
  6734. UINT32 vdi_hsize_i,vdi_vsize;
  6735. PQDebugPrint("demo_enable=%d ", demo_enable);
  6736. vdi_hsize_i= VIP_GetScalerPreScaleH();
  6737. vdi_vsize= PQ_Get_VDI_VSize();
  6738. if(demo_enable)
  6739. {
  6740. PQ_RegisterWrite(VIP_reg_slr_dbg_view, 1); // Lowangle
  6741. PQ_RegisterWrite(VIP_reg_vdi_tnr_debug_en, 0x1); // Tnr
  6742. PQ_RegisterWrite(VIP_reg_vdi_snr_debug_en, 0x1); // Snr
  6743. }
  6744. else
  6745. {
  6746. PQ_RegisterWrite(VIP_reg_slr_dbg_view, 0); // Lowangle
  6747. PQ_RegisterWrite(VIP_reg_vdi_tnr_debug_en, 0); // Tnr
  6748. PQ_RegisterWrite(VIP_reg_vdi_snr_debug_en, 0); // Snr
  6749. PQ_RegisterWrite(VIP_reg_dpy_split_width, 0);//Dynamic Contrast
  6750. }
  6751. PQ_DemoModeWidth();
  6752. if(DRV_SLR_GetConfig() == eSLR_CONFIG_PRE_6HV_POST_H)
  6753. {
  6754. if(DRV_SLR_GetFactor_VFactor() > 0)
  6755. {
  6756. vdi_vsize*=2048/DRV_SLR_GetFactor_VFactor();
  6757. }
  6758. }
  6759. PQ_NERegion(demo_enable, vdi_hsize_i, vdi_vsize);
  6760. }
  6761. void PQ_StaticGammaSetup(INT8 cOffset)
  6762. {
  6763. }
  6764. void PQ_DynamicGammaSetting_ISR(void)
  6765. {
  6766. PQHW_CONTEXT* pHwContext= &PQHwContext;
  6767. pHwContext->GammaCount = (pHwContext->GammaCount+1)%16;
  6768. }
  6769. UINT8 PQ_GetGammaEnableSt(void)
  6770. {
  6771. PQHW_CONTEXT* pHwContext= &PQHwContext;
  6772. return pHwContext->GammaEnable;
  6773. }
  6774. /**
  6775. * @brief Set Dither OFF, method 1 or method 2
  6776. *
  6777. * This function select the Dither method or disable. There are 2 different dither method : method 1 & method 2,
  6778. * or user can disable the dither function by select dither OFF
  6779. *
  6780. * @param ucStatus means select dither method 1, dither method 2 or Disable dither function
  6781. * @note : method 1 set c346 to 0, method set C346 = 1 & C342 = 1, Disable set C346 = 1 & C342 = 2
  6782. * @return n/a
  6783. */
  6784. void PQ_SetDithering(UINT8 ucStatus)
  6785. {
  6786. if(ucStatus == PQ_DITHER_METHOD_1)
  6787. {
  6788. PQ_RegisterWrite(VIP_reg_dpy_dither_sel, 0);
  6789. }
  6790. else
  6791. {
  6792. PQ_RegisterWrite(VIP_reg_dpy_dither_sel, 1);
  6793. if(ucStatus == PQ_DITHER_DISABLE)
  6794. {
  6795. PQ_RegisterWrite(VIP_reg_dpy_dither_v2, DISABLE);
  6796. }
  6797. else
  6798. {
  6799. PQ_RegisterWrite(VIP_reg_dpy_dither_v2, ENABLE);
  6800. }
  6801. }
  6802. }
  6803. /**
  6804. * @brief Set Dither level
  6805. *
  6806. * This function set the Dither level
  6807. * dither method 1
  6808. * 0: 12bit => 12bit panel dither
  6809. * 1: 12bit => 10bit panel dither
  6810. * 2: 12bit => 9bit panel dither
  6811. * 3: 12bit => 8bit panel dither
  6812. * 4: 12bit => 7bit panel dither
  6813. * 5: 12bit => 6bit panel dither
  6814. * 0xbe1cc000[4] - 1: 3D 0: 2D
  6815. *
  6816. * dither method 2
  6817. * 0: (12 -> 10)- level1
  6818. * 1: (12 -> 9) �Vlevel2
  6819. * 2: (12 -> 8) �Vlevel3
  6820. * 3: (12 -> 6) �Vlevel4
  6821. * level = auto : depend on panel bits define
  6822. *
  6823. * 3D : involve time difference (the dither effect of each pixel in each frame will be different)
  6824. *
  6825. * @param ucLevel means dither setting in different panel bit
  6826. * @return n/a
  6827. */
  6828. void PQ_DitheringLevel(UINT8 ucLevel)
  6829. {
  6830. UINT32 autoulPanelBits;
  6831. UINT8 ucDitherSel;
  6832. ucDitherSel = PQ_RegisterRead(VIP_reg_dpy_dither_sel);
  6833. if(ucDitherSel) //method 2
  6834. {
  6835. if(ucLevel == PQ_Panel_10_BITS)
  6836. {
  6837. PQ_RegisterWrite(VIP_reg_dpy_data_type_v2, 0);
  6838. }
  6839. else if(ucLevel == PQ_Panel_9_BITS)
  6840. {
  6841. PQ_RegisterWrite(VIP_reg_dpy_data_type_v2, 1);
  6842. }
  6843. else if(ucLevel == PQ_Panel_8_BITS)
  6844. {
  6845. PQ_RegisterWrite(VIP_reg_dpy_data_type_v2, 2);
  6846. }
  6847. else if(ucLevel == PQ_Panel_6_BITS)
  6848. {
  6849. PQ_RegisterWrite(VIP_reg_dpy_data_type_v2, 3);
  6850. }
  6851. else // dither level = auto
  6852. {
  6853. //vip's output is 12bit, the transform is dependent on lvds's resolution.
  6854. autoulPanelBits = PQ_RegisterRead(REGISTER_ADDRESS_LVDS_MAPPING); // 0xC1B4[13:12] : lvds bit-per-pixel type
  6855. autoulPanelBits = ((autoulPanelBits >> 12) & 0x3);
  6856. if( autoulPanelBits == 0 ) // 18bpp -> 6bit
  6857. {
  6858. PQ_RegisterWrite(VIP_reg_dpy_data_type_v2, 3);
  6859. }
  6860. else if( autoulPanelBits == 1 ) // 24bpp -> 8bit
  6861. {
  6862. PQ_RegisterWrite(VIP_reg_dpy_data_type_v2, 2);
  6863. }
  6864. else if( autoulPanelBits == 2 ) // 30bpp -> 10bit
  6865. {
  6866. PQ_RegisterWrite(VIP_reg_dpy_data_type_v2, 0);
  6867. }
  6868. }
  6869. }
  6870. else //method 1
  6871. {
  6872. if(ucLevel != PQ_AUTO_DETECT_Panel_BITS)
  6873. {
  6874. PQ_RegisterWrite(VIP_reg_dpy_dither, ucLevel);
  6875. }
  6876. else // dither level = auto
  6877. {
  6878. //vip's output is 12bit, the transform is dependent on lvds's resolution.
  6879. autoulPanelBits = PQ_RegisterRead(REGISTER_ADDRESS_LVDS_MAPPING); // 0xC1B4[13:12] : lvds bit-per-pixel type
  6880. autoulPanelBits = ((autoulPanelBits >> 12) & 0x3);
  6881. if( autoulPanelBits == 0 ) // 18bpp -> 6bit
  6882. {
  6883. PQ_RegisterWrite(VIP_reg_dpy_dither, PQ_Panel_6_BITS);
  6884. }
  6885. else if( autoulPanelBits == 1 ) // 24bpp -> 8bit
  6886. {
  6887. PQ_RegisterWrite(VIP_reg_dpy_dither, PQ_Panel_8_BITS);
  6888. }
  6889. else if( autoulPanelBits == 2 ) // 30bpp -> 10bit
  6890. {
  6891. PQ_RegisterWrite(VIP_reg_dpy_dither, PQ_Panel_10_BITS);
  6892. }
  6893. else if( autoulPanelBits == 3 ) // 36bpp -> 12bit
  6894. {
  6895. PQ_RegisterWrite(VIP_reg_dpy_dither, PQ_Panel_12_BITS);
  6896. }
  6897. }
  6898. }
  6899. }
  6900. /**
  6901. * @brief Set Dither algorithm
  6902. *
  6903. * This function set the Dither algoritm
  6904. * 2D : regular algoritm (the dither effect of each pixel in each frame will be the same)
  6905. * 3D : involve time difference (the dither effect of each pixel in each frame will be different)
  6906. *
  6907. * @param ucAlgo means type of dither algorithm, can be 0 for 2D, 1 for 3D
  6908. * @note : method 1 control c000[4], method 2 control C344
  6909. * @return n/a
  6910. */
  6911. void PQ_DitheringAlgo(UINT8 ucAlgo)
  6912. {
  6913. UINT8 ucDitherSel;
  6914. ucDitherSel = PQ_RegisterRead(VIP_reg_dpy_dither_sel);
  6915. if(ucDitherSel) // dither ethod 2
  6916. {
  6917. PQ_RegisterWrite(VIP_reg_dpy_tmp_dither_v2, ucAlgo);
  6918. }
  6919. else //method 1
  6920. {
  6921. PQ_RegisterWrite(VIP_reg_dpy_tmp_dither, ucAlgo);
  6922. }
  6923. }
  6924. //****************************************************************************
  6925. //
  6926. // Function : PQ_AccessColorMatrix
  6927. // Params : pulData = point of data, AcessMode=Read 0 Write 1, dwDataSize=size of pData
  6928. // Description: Access ColorMatrix for PQ Tool I/O (include brightness, contrast, ColorTemp, Saturation, Hue)
  6929. // Returns : 0=fail ,1=success
  6930. //****************************************************************************
  6931. BOOL PQ_AccessColorMatrix(UINT32 *pulData, INT32 AccessMode, UINT32 dwDataSize)
  6932. {
  6933. INT32 i;
  6934. PQHW_CONTEXT* pHwContext= &PQHwContext;
  6935. ST_PQ_CMDSET_CLR_MATRIX_EX* pclrMatrix = (ST_PQ_CMDSET_CLR_MATRIX_EX*)pulData;
  6936. BOOL isEx = sizeof(ST_PQ_CMDSET_CLR_MATRIX_EX) == dwDataSize;
  6937. if (AccessMode) //write to TV
  6938. {
  6939. memcpy(pHwContext->CurColorMatrix, &pclrMatrix->curMatrix, sizeof(CSC_SETTING));
  6940. pHwContext->iColorMatrixC1 = pclrMatrix->iMatrixC[0];
  6941. pHwContext->iColorMatrixC2 = pclrMatrix->iMatrixC[1];
  6942. pHwContext->iColorMatrixC3 = pclrMatrix->iMatrixC[2];
  6943. pHwContext->iBrightness = pclrMatrix->iBrightness;
  6944. pHwContext->iContrast = pclrMatrix->iContrast;
  6945. pHwContext->iRGain = pclrMatrix->iCTRGBGain[0];
  6946. pHwContext->iGGain = pclrMatrix->iCTRGBGain[1];
  6947. pHwContext->iBGain = pclrMatrix->iCTRGBGain[2];
  6948. pHwContext->iRBias = pclrMatrix->iCTRGBBias[0];
  6949. pHwContext->iGBias = pclrMatrix->iCTRGBBias[1];
  6950. pHwContext->iBBias = pclrMatrix->iCTRGBBias[2];
  6951. pHwContext->iHue = pclrMatrix->iHue;
  6952. pHwContext->iSaturation = pclrMatrix->iSaturation;
  6953. for (i = 0; i < 9; i++)
  6954. PQ_ColorMatrixSetup(TRUE, i);
  6955. PQ_ColorMatrixComp(TRUE);
  6956. }
  6957. else //read from TV
  6958. {
  6959. memcpy(&pclrMatrix->curMatrix, pHwContext->CurColorMatrix, sizeof(CSC_SETTING));
  6960. pclrMatrix->iMatrixC[0] = pHwContext->iColorMatrixC1;
  6961. pclrMatrix->iMatrixC[1] = pHwContext->iColorMatrixC2;
  6962. pclrMatrix->iMatrixC[2] = pHwContext->iColorMatrixC3;
  6963. pclrMatrix->iBrightness = pHwContext->iBrightness;
  6964. pclrMatrix->iContrast= pHwContext->iContrast;
  6965. pclrMatrix->iCTRGBGain[0] = pHwContext->iRGain;
  6966. pclrMatrix->iCTRGBGain[1] = pHwContext->iGGain;
  6967. pclrMatrix->iCTRGBGain[2] = pHwContext->iBGain;
  6968. pclrMatrix->iCTRGBBias[0] = pHwContext->iRBias;
  6969. pclrMatrix->iCTRGBBias[1] = pHwContext->iGBias;
  6970. pclrMatrix->iCTRGBBias[2] = pHwContext->iBBias;
  6971. pclrMatrix->iHue = pHwContext->iHue;
  6972. pclrMatrix->iSaturation= pHwContext->iSaturation;
  6973. if (isEx)
  6974. {
  6975. pclrMatrix->iOSDGainBit=COLOR_MATRIX_GAIN_OSD_BIT_SYSTEM;
  6976. pclrMatrix->iOSDBiasBit=COLOR_MATRIX_BIAS_OSD_BIT_SYSTEM;
  6977. }
  6978. }
  6979. return TRUE;
  6980. }
  6981. //****************************************************************************
  6982. //
  6983. // Function : VIP_AcessColorLUT
  6984. // Params : *pulAddr, AcessMode=Read0Write1, bNew=if 330C's LUT, LUTBlockIndex=330C's LUT EvenOdd Block index
  6985. // Description: set color LUT to VIP or get color LUT from VIP
  6986. // Returns : 0=fail ,1=success
  6987. //****************************************************************************
  6988. BOOL PQ_AccessColorLUT(UINT32 *pulAddr, INT32 AccessMode, BOOL bNew, INT32 LUTBlockIndex)
  6989. {
  6990. INT32 ColorLUT330C_Block_PointNum[8] = {729, 648, 648, 576, 648, 576, 576, 512}; // 8 block
  6991. INT32 iTableCnt;
  6992. INT32 DataNum = 512; // for 330A
  6993. INT32 DataStartAddr = 0; // for 330A
  6994. if (bNew)
  6995. {
  6996. DataNum = ColorLUT330C_Block_PointNum[LUTBlockIndex]; // for 330C
  6997. DataStartAddr = LUTBlockIndex<<10; // for 330C
  6998. }
  6999. PQ_RegisterWrite(VIP_reg_dpy_rgn_addr,DataStartAddr);
  7000. if (1 == AccessMode)
  7001. {
  7002. for (iTableCnt=0;iTableCnt<DataNum;iTableCnt++){
  7003. PQ_RegisterWrite(VIP_reg_dpy_rgn_data, *pulAddr);
  7004. pulAddr++;
  7005. }
  7006. }
  7007. else
  7008. {
  7009. for (iTableCnt=0;iTableCnt<DataNum;iTableCnt++){
  7010. *pulAddr=PQ_RegisterRead(VIP_reg_dpy_rgn_data);
  7011. pulAddr++;
  7012. }
  7013. }
  7014. return TRUE;
  7015. }
  7016. BOOL PQ_AccessColorLUT64Bit(UINT32 *pulAddr, INT32 AccessMode, BOOL bNew, INT32 LUTBlockIndex)
  7017. {
  7018. UINT32 ColorLUT64Bit_Block_PointNum[16] = {640, 640,640, 640, 768, 768,768, 768, 640, 640,640, 640, 768, 768, 768, 768}; // 16 block
  7019. INT32 iTableCnt;
  7020. INT32 DataNum ;
  7021. INT32 DataStartAddr = 0;
  7022. DataNum = ColorLUT64Bit_Block_PointNum[LUTBlockIndex];
  7023. if(LUTBlockIndex%2 !=0)
  7024. DataStartAddr = 1024*(LUTBlockIndex-1)+ColorLUT64Bit_Block_PointNum[LUTBlockIndex-1];
  7025. else
  7026. DataStartAddr = LUTBlockIndex<<10;
  7027. PQ_RegisterWrite(VIP_reg_dpy_rgn_addr,DataStartAddr);
  7028. if (1 == AccessMode)
  7029. {
  7030. for (iTableCnt=0;iTableCnt<DataNum;iTableCnt++){
  7031. *(volatile unsigned long*)(0xbe1cc184)=(*pulAddr);//+0x80);
  7032. pulAddr++;
  7033. }
  7034. if(LUTBlockIndex%2 !=0)
  7035. {
  7036. DataNum= 2048 - (DataNum*2);
  7037. for (iTableCnt=0;iTableCnt<DataNum;iTableCnt++)
  7038. {
  7039. *(volatile unsigned long*)(0xbe1cc184)=0;
  7040. }
  7041. }
  7042. }
  7043. else
  7044. {
  7045. for (iTableCnt=0;iTableCnt<DataNum;iTableCnt++){
  7046. *pulAddr=PQ_RegisterRead(VIP_reg_dpy_rgn_data);
  7047. pulAddr++;
  7048. }
  7049. }
  7050. return TRUE;
  7051. }
  7052. BOOL PQ_AccessColorLUTV3(UINT32 *pulAddr, INT32 AccessMode, BOOL bNew, INT32 LUTBlockIndex)
  7053. {
  7054. UINT32 ColorLUT531_Block_PointNum[8] = {640, 640, 768, 768, 640, 640, 768, 768}; // 8 block
  7055. INT32 iTableCnt;
  7056. INT32 DataNum ;
  7057. INT32 DataStartAddr = 0; // for 330A
  7058. //if (bNew)
  7059. //{
  7060. DataNum = ColorLUT531_Block_PointNum[LUTBlockIndex]; // for 330C
  7061. DataStartAddr = LUTBlockIndex<<10; // for 330C
  7062. // *(unsigned long*)(0xbe1c0000)=LUTBlockIndex;
  7063. // *(unsigned long*)(0xbe1c0004)=DataStartAddr;
  7064. //}
  7065. PQ_RegisterWrite(VIP_reg_dpy_rgn_addr,DataStartAddr);
  7066. if (1 == AccessMode)
  7067. {
  7068. // unsigned long tt;
  7069. // tt=DataNum;
  7070. // *(volatile unsigned char*)(0xbe1cc6a9)=0;
  7071. // msleep(1000);
  7072. //DataNum=10;
  7073. for (iTableCnt=0;iTableCnt<DataNum;iTableCnt++){
  7074. //PQ_RegisterWrite(VIP_reg_dpy_rgn_addr,iTableCnt);
  7075. *(volatile unsigned long*)(0xbe1cc184)=((*pulAddr));//+0x80);
  7076. pulAddr++;
  7077. }
  7078. //*(unsigned char*)(0xbe1cc6a9)=1;
  7079. //return TRUE;
  7080. // for (iTableCnt=0;iTableCnt<DataNum;iTableCnt++){
  7081. // PQ_RegisterWrite(VIP_reg_dpy_rgn_addr,DataStartAddr+iTableCnt);
  7082. // mytemp=PQ_RegisterRead(VIP_reg_dpy_rgn_data);
  7083. // if(mytemp!=0x80) tt=0xfff;
  7084. // }
  7085. // *(unsigned long*)(0xbe1c0000)=(LUTBlockIndex<<12)+tt;
  7086. // *(unsigned char*)(0xbe1cc6a9)=1;
  7087. }
  7088. else
  7089. {
  7090. for (iTableCnt=0;iTableCnt<DataNum;iTableCnt++){
  7091. *pulAddr=PQ_RegisterRead(VIP_reg_dpy_rgn_data);
  7092. pulAddr++;
  7093. }
  7094. }
  7095. return TRUE;
  7096. }
  7097. //****************************************************************************
  7098. //
  7099. // Function : PQ_SetColorLUTStr
  7100. // Params : *pulAddr
  7101. // Description: set color LUT strength to VIP
  7102. // Returns : 0=fail ,1=success
  7103. //****************************************************************************
  7104. BOOL PQ_SetColorLUTStr(UINT16 *pwAddr)
  7105. {
  7106. INT32 iTableCnt;
  7107. PQ_RegisterWrite(VIP_reg_dpy_rgn_addr,512);
  7108. for (iTableCnt=0;iTableCnt<512;iTableCnt++){
  7109. PQ_RegisterWrite(VIP_reg_dpy_rgn_data, *pwAddr );
  7110. pwAddr++;
  7111. }
  7112. return TRUE;
  7113. }
  7114. //****************************************************************************
  7115. //
  7116. // Function : PQ_GetColorLUTStr
  7117. // Params : *pulAddr
  7118. // Description: get color LUT strength from VIP
  7119. // Returns : 0=fail ,1=success
  7120. //****************************************************************************
  7121. BOOL PQ_GetColorLUTStr(UINT16 *pwAddr)
  7122. {
  7123. INT32 iTableCnt;
  7124. PQ_RegisterWrite(VIP_reg_dpy_rgn_addr,512);
  7125. for (iTableCnt=0;iTableCnt<512;iTableCnt++){
  7126. *pwAddr=PQ_RegisterRead(VIP_reg_dpy_rgn_data);
  7127. pwAddr++;
  7128. }
  7129. return TRUE;
  7130. }
  7131. UINT8 indexi = 0;
  7132. void PQ_GetHistBin(UINT32 *Y_Hist)
  7133. {
  7134. UINT32 ulHistBin ;
  7135. ulHistBin = PQ_RegisterRead(VIP_reg_dpy_hist_bin0+indexi*4) << 1;
  7136. *Y_Hist = ulHistBin;
  7137. }
  7138. void PQ_SetHistBinindex(UINT8 index)
  7139. {
  7140. indexi = index;
  7141. }
  7142. void PQ_GetYavg(UINT32 *Y_AVG)
  7143. {
  7144. UINT32 dwTotalPixel = 0;
  7145. UINT32 ulHistBin[16];
  7146. int i;
  7147. for(i = 0; i <16; i++)
  7148. {
  7149. ulHistBin[i] = PQ_RegisterRead(VIP_reg_dpy_hist_bin0+i*4);
  7150. dwTotalPixel += ulHistBin[i];
  7151. }
  7152. if(dwTotalPixel ==0)
  7153. {
  7154. *Y_AVG = 0;
  7155. }
  7156. else
  7157. {
  7158. *Y_AVG = PQ_RegisterRead(VIP_reg_dpy_y_sum)*256 / dwTotalPixel;
  7159. }
  7160. }
  7161. int PQ_GetYHistOverValueCount(int YValue)
  7162. {
  7163. int HistStart=YValue/16;
  7164. int dwTotalPixel = 0;
  7165. int i;
  7166. for(i=HistStart;i<16;i++)
  7167. {
  7168. dwTotalPixel += PQ_RegisterRead(VIP_reg_dpy_hist_bin0+i*4);
  7169. }
  7170. return dwTotalPixel;
  7171. }
  7172. UINT8 PQ_GetAvgY_Value(void)
  7173. {
  7174. UINT32 dwTotalPixel = 0;
  7175. UINT32 ulHistBin[16];
  7176. int i;
  7177. UINT8 ucavgY = 0;
  7178. for(i = 0; i <16; i++)
  7179. {
  7180. ulHistBin[i] = PQ_RegisterRead(VIP_reg_dpy_hist_bin0+i*4);
  7181. dwTotalPixel += ulHistBin[i];
  7182. }
  7183. if(dwTotalPixel ==0)
  7184. {
  7185. ucavgY = 0;
  7186. }
  7187. else
  7188. {
  7189. ucavgY = PQ_RegisterRead(VIP_reg_dpy_y_sum)*256 / dwTotalPixel;
  7190. }
  7191. return ucavgY;
  7192. }
  7193. //****************************************************************************
  7194. //
  7195. // Function : PQ_ParsePQCmdSet
  7196. // Params : *pulAddr, data format [size][cmd][data(size UINT8)] = [4bytes][4bytes][nbytes]
  7197. // Description: Parse PQ Command Set. This function will be called by PQ tool, please don't remove it // by ren
  7198. // Returns : 0=fail ,1=success
  7199. //****************************************************************************
  7200. BOOL PQ_ParsePQCmdSet(UINT32 *pulAddr)
  7201. {
  7202. // MultiPanelHeader_t *MultiPanelHeader = (void *)(SPI_PANELSET_FLASHADDR);
  7203. UINT32 ColorLUT330C_Block_PointNum[8] = {729, 648, 648, 576, 648, 576, 576, 512}; // 8 block
  7204. UINT32 ColorLUT531_Block_PointNum[8] = {640, 640, 768, 768, 640, 640, 768, 768}; // 8 block
  7205. UINT32 ColorLut64Bit_Block_PointNum[16] = {640, 640,640, 640, 768, 768,768, 768, 640, 640,640, 640, 768, 768, 768, 768};
  7206. UINT32 dwTotalSize = pulAddr[0];
  7207. UINT32 dwDataSize = dwTotalSize-8; // 8 = sizeof(Size_DWORD)+sizeof(Cmd_DWORD);
  7208. INT32 Cmd = pulAddr[1]&0xffff;
  7209. INT32 SubCmd = pulAddr[1]>>16;
  7210. UINT32 *pDataSatrt = pulAddr+2;
  7211. switch(Cmd)
  7212. {
  7213. case PQ_CMDSET_GET_RGN_LUT:
  7214. if (0x800 != dwDataSize) return FALSE; // 800 = LUT size(UINT32*8*8*8)
  7215. else
  7216. {
  7217. pulAddr[0] = 0x800; // must fill data size on size colum when get function
  7218. return PQ_AccessColorLUT(pDataSatrt, 0/*Read*/, FALSE, 0);
  7219. }
  7220. break;
  7221. case PQ_CMDSET_SET_RGN_LUT:
  7222. if (0x800 != dwDataSize) return FALSE;
  7223. else
  7224. {
  7225. pulAddr[0] = 0; // must fill 0 when set funtion
  7226. return PQ_AccessColorLUT(pDataSatrt, 1/*Write*/, FALSE, 0);
  7227. }
  7228. break;
  7229. case PQ_CMDSET_GET_RGN_LUT_STR:
  7230. if (0x400 != dwDataSize) return FALSE; // 400 = LUT Str size(UINT16*8*8*8)
  7231. else
  7232. {
  7233. pulAddr[0] = 0x400; // must fill data size on size colum when get function
  7234. return PQ_GetColorLUTStr((UINT16*)pDataSatrt);
  7235. }
  7236. break;
  7237. case PQ_CMDSET_SET_RGN_LUT_STR:
  7238. if (0x400 != dwDataSize) return FALSE;
  7239. else
  7240. {
  7241. pulAddr[0] = 0; // must fill 0 when set funtion
  7242. return PQ_SetColorLUTStr((UINT16*)pDataSatrt);
  7243. }
  7244. break;
  7245. case PQ_CMDSET_GET_RGN_LUT_330C:
  7246. if (SubCmd >= 8) return FALSE; // only 0~7 block
  7247. if ((ColorLUT330C_Block_PointNum[SubCmd]*4) != dwDataSize) return FALSE;
  7248. else
  7249. {
  7250. pulAddr[0] = ColorLUT330C_Block_PointNum[SubCmd]*4; // must fill data size on size colum when get function
  7251. return PQ_AccessColorLUT(pDataSatrt, 0/*Read*/, TRUE, SubCmd);
  7252. }
  7253. break;
  7254. case PQ_CMDSET_SET_RGN_LUT_330C:
  7255. if (SubCmd >= 8) return FALSE; // only 0~7 block
  7256. if ((ColorLUT330C_Block_PointNum[SubCmd]*4) != dwDataSize) return FALSE;
  7257. else
  7258. {
  7259. pulAddr[0] = 0; // must fill 0 when set funtion
  7260. return PQ_AccessColorLUT(pDataSatrt, 1/*Write*/, TRUE, SubCmd);
  7261. }
  7262. break;
  7263. case PQ_CMDSET_GET_RGN_LUT_V3:
  7264. //*(unsigned long*)(0xbe1c0000)=0x135;
  7265. if (SubCmd >= 8) return FALSE; // only 0~7 block
  7266. if ((ColorLUT531_Block_PointNum[SubCmd]*4) != dwDataSize) return FALSE;
  7267. else
  7268. {
  7269. pulAddr[0] = ColorLUT531_Block_PointNum[SubCmd]*4; // must fill data size on size colum when get function
  7270. return PQ_AccessColorLUTV3(pDataSatrt, 0/*Read*/, TRUE, SubCmd);
  7271. }
  7272. break;
  7273. case PQ_CMDSET_SET_RGN_LUT_V3:
  7274. //--------- Set V3 LUT ------------
  7275. if (SubCmd >= 8)
  7276. {
  7277. *(unsigned long*)(0xbe1c0000)=0x136;
  7278. return FALSE; // only 0~7 block
  7279. }
  7280. if ((ColorLUT531_Block_PointNum[SubCmd]*4) != dwDataSize)
  7281. {
  7282. *(unsigned long*)(0xbe1c0000)=dwDataSize;
  7283. *(unsigned long*)(0xbe1c0004)=ColorLUT531_Block_PointNum[SubCmd]*4;
  7284. return FALSE;
  7285. }
  7286. else
  7287. {
  7288. *(unsigned long*)(0xbe1c0000)=0x138;
  7289. pulAddr[0] = 0; // must fill 0 when set funtion
  7290. return PQ_AccessColorLUTV3(pDataSatrt, 1/*Write*/, TRUE, SubCmd);
  7291. }
  7292. break;
  7293. case PQ_CMDSET_GET_RGN_LUT_64Bit:
  7294. if (SubCmd >= 16) return FALSE; // only 0~7 block
  7295. if ((ColorLut64Bit_Block_PointNum[SubCmd]*4) != dwDataSize) return FALSE;
  7296. else
  7297. {
  7298. *(unsigned long*)(0xbe1c0000) = SubCmd;
  7299. pulAddr[0] = ColorLut64Bit_Block_PointNum[SubCmd]*4; // must fill data size on size colum when get function
  7300. return PQ_AccessColorLUT64Bit(pDataSatrt, 0/*Read*/, TRUE, SubCmd);
  7301. }
  7302. break;
  7303. case PQ_CMDSET_SET_RGN_LUT_64Bit:
  7304. if (SubCmd >= 16)
  7305. {
  7306. *(unsigned long*)(0xbe1c0000)=0x136;
  7307. return FALSE;
  7308. }
  7309. if ((ColorLut64Bit_Block_PointNum[SubCmd]*4) != dwDataSize)
  7310. {
  7311. *(unsigned long*)(0xbe1c0000)=dwDataSize;
  7312. *(unsigned long*)(0xbe1c0004)=ColorLut64Bit_Block_PointNum[SubCmd]*4;
  7313. return FALSE;
  7314. }
  7315. else
  7316. {
  7317. *(unsigned long*)(0xbe1c0000)=0x140;
  7318. pulAddr[0] = 0; // must fill 0 when set funtion
  7319. return PQ_AccessColorLUT64Bit(pDataSatrt, 1/*Write*/, TRUE, SubCmd);
  7320. }
  7321. break;
  7322. case PQ_CMDSET_GET_COLOR_MATRIX:
  7323. if (sizeof(ST_PQ_CMDSET_CLR_MATRIX) != dwDataSize && sizeof(ST_PQ_CMDSET_CLR_MATRIX_EX) != dwDataSize) return FALSE;
  7324. else
  7325. {
  7326. pulAddr[0] = dwDataSize; // must fill data size on size colum when get function
  7327. return PQ_AccessColorMatrix(pDataSatrt, 0/*Read*/, dwDataSize);
  7328. }
  7329. break;
  7330. case PQ_CMDSET_SET_COLOR_MATRIX:
  7331. if (sizeof(ST_PQ_CMDSET_CLR_MATRIX) != dwDataSize && sizeof(ST_PQ_CMDSET_CLR_MATRIX_EX) != dwDataSize) return FALSE;
  7332. else
  7333. {
  7334. pulAddr[0] = 0; // must fill 0 when set funtion
  7335. return PQ_AccessColorMatrix(pDataSatrt, 1/*Write*/, dwDataSize);
  7336. }
  7337. break;
  7338. //#ifdef VIP_SW_DC
  7339. #if 1
  7340. case PQ_CMDSET_GET_SW_DC_SCENE_DET_SLOPE:
  7341. if (sizeof(ST_SWDC_Slope) != dwDataSize) return FALSE;
  7342. else
  7343. {
  7344. pulAddr[0] = dwDataSize; // must fill data size on size colum when get function
  7345. PQ_GetSWDCSlopeCmd((ST_SWDC_Slope*)pDataSatrt);
  7346. return TRUE;
  7347. }
  7348. break;
  7349. case PQ_CMDSET_SET_SW_DC_SCENE_DET_SLOPE:
  7350. if (sizeof(ST_SWDC_Slope) != dwDataSize) return FALSE;
  7351. else
  7352. {
  7353. pulAddr[0] = 0; // must fill 0 when set funtion
  7354. PQ_SetSWDCSlopeCmd((ST_SWDC_Slope*)pDataSatrt);
  7355. return TRUE;
  7356. }
  7357. break;
  7358. case PQ_CMDSET_GET_SW_DC_SCENE_DET_CHROMA:
  7359. if (sizeof(ST_SWDC_Chroma) != dwDataSize) return FALSE;
  7360. else
  7361. {
  7362. pulAddr[0] = dwDataSize; // must fill data size on size colum when get function
  7363. PQ_GetSWDCChromaCmd((ST_SWDC_Chroma*)pDataSatrt);
  7364. return TRUE;
  7365. }
  7366. break;
  7367. case PQ_CMDSET_SET_SW_DC_SCENE_DET_CHROMA:
  7368. if (sizeof(ST_SWDC_Chroma) != dwDataSize) return FALSE;
  7369. else
  7370. {
  7371. pulAddr[0] = 0; // must fill 0 when set funtion
  7372. PQ_SetSWDCChromaCmd((ST_SWDC_Chroma*)pDataSatrt);
  7373. return TRUE;
  7374. }
  7375. break;
  7376. case PQ_CMDSET_GET_SW_DC_SCENE_DET_PARAM:
  7377. if (sizeof(ST_SWDC_Param) != dwDataSize) return FALSE;
  7378. else
  7379. {
  7380. pulAddr[0] = dwDataSize; // must fill data size on size colum when get function
  7381. PQ_GetSWDCParamCmd((ST_SWDC_Param*)pDataSatrt);
  7382. return TRUE;
  7383. }
  7384. break;
  7385. case PQ_CMDSET_SET_SW_DC_SCENE_DET_PARAM:
  7386. if (sizeof(ST_SWDC_Param) != dwDataSize) return FALSE;
  7387. else
  7388. {
  7389. pulAddr[0] = 0; // must fill data size on size colum when get function
  7390. PQ_SetSWDCParamCmd((ST_SWDC_Param*)pDataSatrt);
  7391. return TRUE;
  7392. }
  7393. break;
  7394. case PQ_CMDSET_GET_SW_DC_SCENE_DET_INFO:
  7395. if (sizeof(ST_SWDC_Info) != dwDataSize) return FALSE;
  7396. else
  7397. {
  7398. pulAddr[0] = dwDataSize; // must fill data size on size colum when get function
  7399. PQ_GetSWDCInfoCmd((ST_SWDC_Info*)pDataSatrt);
  7400. return TRUE;
  7401. }
  7402. break;
  7403. case PQ_CMDSET_SET_SW_DC_SCENE_DET_SOURCE:
  7404. if (sizeof(UINT8) != dwDataSize) return FALSE;
  7405. else
  7406. {
  7407. pulAddr[0] = 0; // must fill data size on size colum when get function
  7408. PQ_SetSWDCSourceCmd((UINT8*)pDataSatrt);
  7409. return TRUE;
  7410. }
  7411. break;
  7412. case PQ_CMDSET_GET_SW_DC_SCENE_DET_SOURCE:
  7413. if (sizeof(UINT8) != dwDataSize) return FALSE;
  7414. else
  7415. {
  7416. pulAddr[0] = dwDataSize; // must fill data size on size colum when get function
  7417. PQ_GetSWDCSourceCmd((UINT8*)pDataSatrt);
  7418. return TRUE;
  7419. }
  7420. break;
  7421. #endif
  7422. case PQ_CMDSET_GET_VIP_FLASH_INFO:
  7423. if (sizeof(VIP_FLASH_INFO) < dwDataSize) return FALSE;
  7424. else
  7425. {
  7426. VIP_FLASH_INFO FlashInfo;
  7427. memset(&FlashInfo, 0, sizeof(VIP_FLASH_INFO));
  7428. if (SubCmd) { //get size
  7429. FlashInfo.PANELSET_SHADOWADDR = SPI_PANELSET_FLASHSIZE;
  7430. FlashInfo.VIPTABLE_SHADOWADDR = SPI_VIPTABLE_FLASHSIZE;
  7431. FlashInfo.GAMMATABLE_SHADOWADDR = SPI_GAMMATABLE_FLASHSIZE;
  7432. #ifdef SPI_LOGO_FLASHSIZE
  7433. FlashInfo.LOGO_SHADOWADDR = SPI_LOGO_FLASHSIZE;
  7434. #endif
  7435. #ifdef SPI_COLORLUTTABLE_SHADOWADDR
  7436. FlashInfo.LUTTABLE_SHADOWADDR = SPI_COLORLUTTABLE_FLASHSIZE;
  7437. #endif
  7438. } else { //get addr
  7439. FlashInfo.PANELSET_SHADOWADDR = SPI_PANELSET_SHADOWADDR;
  7440. FlashInfo.VIPTABLE_SHADOWADDR = SPI_VIPTABLE_SHADOWADDR;
  7441. FlashInfo.GAMMATABLE_SHADOWADDR = SPI_GAMMATABLE_SHADOWADDR;
  7442. #ifdef SPI_LOGO_FLASHADDR
  7443. FlashInfo.LOGO_SHADOWADDR = SPI_LOGO_FLASHADDR;
  7444. #endif
  7445. #ifdef SPI_COLORLUTTABLE_SHADOWADDR
  7446. FlashInfo.LUTTABLE_SHADOWADDR = SPI_COLORLUTTABLE_SHADOWADDR;
  7447. #endif
  7448. }
  7449. memcpy(pDataSatrt, &FlashInfo, dwDataSize);
  7450. pulAddr[0] = dwDataSize;
  7451. return TRUE;
  7452. }
  7453. case PQ_CMDSET_GET_DRV_CURRENT_SOURCE:
  7454. if (sizeof(UINT8) != dwDataSize) return FALSE;
  7455. else
  7456. {
  7457. pulAddr[0] = dwDataSize; // must fill data size on size colum when get function
  7458. PQ_GetDrvCurrentSourceCmd((UINT8*)pDataSatrt);
  7459. return TRUE;
  7460. }
  7461. break;
  7462. case PQ_CMDSET_SET_NR_ADJUST_STATUS:
  7463. if (sizeof(UINT8) != dwDataSize)
  7464. {
  7465. return FALSE;
  7466. }
  7467. else
  7468. {
  7469. VIP_SetStopNRAdjustFlag((BOOL*)pDataSatrt);
  7470. return TRUE;
  7471. }
  7472. break;
  7473. case PQ_CMDSET_GET_RGB_GAIN_ADJUST_MODULE:
  7474. if (sizeof(UINT8) != dwDataSize) return FALSE;
  7475. else
  7476. {
  7477. pulAddr[0] = dwDataSize; // must fill data size on size colum when get function
  7478. PQ_GetRGBGainAdjustModuleCmd((UINT8*)pDataSatrt);
  7479. return TRUE;
  7480. }
  7481. break;
  7482. case PQ_CMDSET_GET_RGB_GAIN_PARAM:
  7483. if (sizeof(RGB_GAIN) != dwDataSize) return FALSE;
  7484. else
  7485. {
  7486. pulAddr[0] = dwDataSize; // must fill data size on size colum when get function
  7487. PQ_GetRGBGainParamCmd((RGB_GAIN*)pDataSatrt);
  7488. return TRUE;
  7489. }
  7490. break;
  7491. default:
  7492. return FALSE;
  7493. }
  7494. return FALSE;
  7495. }
  7496. //dpy peaking filter is required to reference to scalling factor
  7497. void PQ_PeakingFilterSetup(void)
  7498. {
  7499. PQHW_CONTEXT* pHwContext= &PQHwContext;
  7500. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  7501. PEAKING_SETTING *pPeaking;
  7502. PEAKING_SETTING_EXT *pPeakingExt;
  7503. UINT8 ucTableIndex;
  7504. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  7505. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  7506. if (pVtab->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex] >= 8) return;
  7507. ucTableIndex = pVtab->mPeaking.mGroupedIndex[ucCurrSrcIndex];
  7508. #ifdef CONFIG_SUPPORT_TCON //#51239
  7509. if((((DRV_SLR_GetFactor_HFactor())*(DRV_SLR_GetFactor_HFactor_6HV())*100)/(2048*2048))>90 &&( !VIP_RunDVIMode()))
  7510. #else
  7511. if((((DRV_SLR_GetFactor_HFactor())*(DRV_SLR_GetFactor_HFactor_6HV())*100)/(2048*2048))>90)
  7512. #endif
  7513. {
  7514. pPeaking= &pVtab->mPeaking.mPeaking_Data[ucTableIndex].Peaking[2];
  7515. pPeakingExt = &pVtab->mPeakingExt[ucTableIndex].Peaking[2];
  7516. }
  7517. else if(VIP_GetInputVSize() >= 1000) //1080
  7518. {
  7519. pPeaking= &pVtab->mPeaking.mPeaking_Data[ucTableIndex].Peaking[2];
  7520. pPeakingExt = &pVtab->mPeakingExt[ucTableIndex].Peaking[2];
  7521. }
  7522. else if(VIP_GetInputVSize() >= 700) //720
  7523. {
  7524. pPeaking= &pVtab->mPeaking.mPeaking_Data[ucTableIndex].Peaking[1];
  7525. pPeakingExt = &pVtab->mPeakingExt[ucTableIndex].Peaking[1];
  7526. }
  7527. else
  7528. {
  7529. pPeaking= &pVtab->mPeaking.mPeaking_Data[ucTableIndex].Peaking[0];
  7530. pPeakingExt = &pVtab->mPeakingExt[ucTableIndex].Peaking[0];
  7531. }
  7532. PQDebugPrint("%s: filter=%d %d %d %d",__FUNCTION__, pPeaking->filter_y_h1, pPeaking->filter_y_h2, pPeaking->filter_y_h3, pPeaking->filter_y_h4);
  7533. if(PQ_GetNotFullScreenPatchStatus() == TRUE)//patch for 131, reove while HW fix it
  7534. {
  7535. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h1, pPeaking->filter_y_h1);
  7536. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h2, pPeaking->filter_y_h2);
  7537. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h3, pPeaking->filter_y_h3);
  7538. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h4, pPeaking->filter_y_h4);
  7539. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h5, pPeakingExt->filter_y_h5);
  7540. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h6, pPeakingExt->filter_y_h6);
  7541. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h1, 0);
  7542. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h2, 0);
  7543. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h3, 0);
  7544. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h4, 0);
  7545. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h1, 0);
  7546. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h2, 0);
  7547. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h3, 0);
  7548. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h4, 0);
  7549. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h5, 0);
  7550. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h6, 0);
  7551. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h5, 0);
  7552. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h6, 0);
  7553. }
  7554. else if (VIP_RunDVIMode() && VIP_GetInputHSize()==1360 && VIP_GetInputVSize()==768)
  7555. {
  7556. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h1, 0x80);
  7557. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h2, 0x20);
  7558. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h3, 0x0);
  7559. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h4, 0x0);
  7560. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h1, 0x80);
  7561. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h2, 0x20);
  7562. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h3, 0x0);
  7563. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h4, 0x0);
  7564. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h1, 0x80);
  7565. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h2, 0x20);
  7566. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h3, 0x0);
  7567. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h4, 0x0);
  7568. }
  7569. else if(VIP_Jpeg_GetDisplayMode() == VIP_THUMBNAIL&& VIP_GetInputVSize() >= 768)
  7570. {
  7571. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h1, 0x80);
  7572. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h2, 0x20);
  7573. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h3, 0);
  7574. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h4, 0);
  7575. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h5, 0);
  7576. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h6, 0);
  7577. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h1, 0x80);
  7578. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h2, 0x20);
  7579. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h3, 0);
  7580. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h4, 0);
  7581. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h1, 0x80);
  7582. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h2, 0x20);
  7583. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h3, 0);
  7584. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h4, 0);
  7585. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h5, 0);
  7586. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h6, 0);
  7587. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h5, 0);
  7588. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h6, 0);
  7589. }
  7590. #ifdef CONFIG_CSOT_ST3151A05_C
  7591. else if(VIP_GetUserSource() == SOURCE_EXTS && ((DRV_SLR_GetFactor_HFactor() == 0xacd && DRV_SLR_GetFactor_HFactor_6HV() == 0x800)
  7592. ||(DRV_SLR_GetFactor_HFactor() == 0x800 && DRV_SLR_GetFactor_HFactor_6HV() == 0x5ff)))
  7593. {
  7594. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h1, 0x778);
  7595. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h2, 0x3a);
  7596. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h3, 0x7f5);
  7597. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h4, 0x5);
  7598. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h5, 0);
  7599. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h6, 0);
  7600. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h1, 0x778);
  7601. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h2, 0x3a);
  7602. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h3, 0x7f5);
  7603. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h4, 0x5);
  7604. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h1, 0x778);
  7605. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h2, 0x3a);
  7606. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h3, 0x7f5);
  7607. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h4, 0x5);
  7608. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h5, 0);
  7609. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h6, 0);
  7610. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h5, 0);
  7611. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h6, 0);
  7612. }
  7613. #endif
  7614. else
  7615. {
  7616. if(pHwContext->PqPatch.DpyPeakingPatch == DPY_PEAKING_AV_IRE_PATCH || pHwContext->PqPatch.DpyPeakingPatch == DPY_PEAKING_AV_GRAYSCALE_PATCH)
  7617. {
  7618. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h1, 0);
  7619. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h2, 0);
  7620. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h3, 0);
  7621. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h4, 0);
  7622. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h5, 0);
  7623. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h6, 0);
  7624. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h1, 0);
  7625. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h2, 0);
  7626. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h3, 0);
  7627. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h4, 0);
  7628. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h5, 0);
  7629. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h6, 0);
  7630. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h1, 0);
  7631. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h2, 0);
  7632. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h3, 0);
  7633. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h4, 0);
  7634. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h5, 0);
  7635. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h6, 0);
  7636. }
  7637. else
  7638. {
  7639. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h1, pPeaking->filter_y_h1);
  7640. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h2, pPeaking->filter_y_h2);
  7641. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h3, pPeaking->filter_y_h3);
  7642. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h4, pPeaking->filter_y_h4);
  7643. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h5, pPeakingExt->filter_y_h5);
  7644. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h6, pPeakingExt->filter_y_h6);
  7645. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h1, pPeaking->filter_y_h1);
  7646. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h2, pPeaking->filter_y_h2);
  7647. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h3, pPeaking->filter_y_h3);
  7648. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h4, pPeaking->filter_y_h4);
  7649. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h5, pPeakingExt->filter_y_h5);
  7650. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h6, pPeakingExt->filter_y_h6);
  7651. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h1, pPeaking->filter_y_h1);
  7652. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h2, pPeaking->filter_y_h2);
  7653. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h3, pPeaking->filter_y_h3);
  7654. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h4, pPeaking->filter_y_h4);
  7655. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h5, pPeakingExt->filter_y_h5);
  7656. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h6, pPeakingExt->filter_y_h6);
  7657. }
  7658. }
  7659. }
  7660. void PQ_SetMotionThreshold(void)
  7661. {
  7662. //for # 50126 : fix sawtooth issue
  7663. if(VIP_GetUserSource()==SOURCE_HDMI && VIP_GetInputVSize()==576 && VIP_GetInterlaceMode())
  7664. {
  7665. PQ_RegisterWrite(VIP_reg_vdi_mad_lmot_thd,0x13);
  7666. PQ_RegisterWrite(VIP_reg_vdi_mad_mot_pthd,0x3c);
  7667. PQ_RegisterWrite(VIP_reg_vdi_mad_hmot_lthd,0x88);
  7668. PQ_RegisterWrite(VIP_reg_vdi_mad_mmot_lthd,0x68);
  7669. }
  7670. else if(VIP_IsAVSource() && (VIP_GetStdColorSystem() >= CVD2_STD_PAL_IBGDK && VIP_GetStdColorSystem() <= CVD2_STD_PAL_60))
  7671. {
  7672. PQ_RegisterWrite(VIP_reg_vdi_mad_lmot_thd,0x13);
  7673. PQ_RegisterWrite(VIP_reg_vdi_mad_mot_pthd,0x3c);
  7674. PQ_RegisterWrite(VIP_reg_vdi_mad_hmot_lthd,0x88);
  7675. PQ_RegisterWrite(VIP_reg_vdi_mad_mmot_lthd,0x68);
  7676. }
  7677. else
  7678. {
  7679. PQ_RegisterWrite(VIP_reg_vdi_mad_lmot_thd,0xC);
  7680. PQ_RegisterWrite(VIP_reg_vdi_mad_mot_pthd,0x20);
  7681. PQ_RegisterWrite(VIP_reg_vdi_mad_hmot_lthd,0x60);
  7682. PQ_RegisterWrite(VIP_reg_vdi_mad_mmot_lthd,0x40);
  7683. }
  7684. }
  7685. //================================================================================
  7686. // function name : PQ_FilterSetup
  7687. // input parameter : ucSource,ucSubSource,cInterlaceMode
  7688. // output parameter : none
  7689. // purpose : setup mesh filter and icp filter
  7690. // return : none
  7691. void PQ_FilterSetup(UINT8 ucSource, UINT8 ucSubSource)
  7692. {
  7693. typedef struct _REG
  7694. {
  7695. UINT32 hds, hde, vds, vde;
  7696. }REG;
  7697. PQHW_CONTEXT* pHwContext= &PQHwContext;
  7698. UINT8 ucDisableICP,i;
  7699. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  7700. REG LowMbwReg[3];
  7701. UINT32 tmp;
  7702. //ucDisableICP= (pHwContext->cInterlaceMode==FALSE && ucSource!=SOURCE_MPEG) ||
  7703. // (ucSource==SOURCE_PATTERN) ||
  7704. // (ucSource==SOURCE_JPEG) ||
  7705. // (ucSource==SOURCE_EXTS && ucSubSource==RGB);
  7706. //CJ changed rule at 2009/06/24
  7707. //ICP function For p338, p358 :
  7708. //1. ATV :
  7709. //UINT8 0xbe1cd0b0 0x1 ------------- enable
  7710. //UINT16 0xbe1cd0b4 0x100 ------------- alpha
  7711. //2. PC, ADI Pattern :
  7712. //UINT8 0xbe1cd0b0 0x0
  7713. //3. Others: (interlace and progressive)
  7714. //UINT8 0xbe1cd0b0 0x1
  7715. //UINT16 0xbe1cd0b4 0x200
  7716. //
  7717. ucDisableICP= (ucSource==SOURCE_PATTERN) ||
  7718. (ucSource==SOURCE_JPEG) ||
  7719. (ucSource==SOURCE_EXTS && ucSubSource==RGB); //990924 hdhi-rgb needs mesh filter to remove for PQ request
  7720. //|| (pHwContext->cInputDataFormat==RGB); //pc, dvi or hdmi-rgb
  7721. //dpy peaking filter is required to reference to scalling factor
  7722. PQ_PeakingFilterSetup();
  7723. PQ_DeinterlaceFilter();
  7724. if( ucDisableICP )
  7725. {
  7726. PQ_RegisterWrite(VIP_reg_slr_mesh_filter_en, 0);
  7727. PQ_RegisterWrite(VIP_reg_slr_icp_fix_en, 0);
  7728. }
  7729. else
  7730. {
  7731. if(ucSource==SOURCE_HDMI||ucSource==SOURCE_MPEG)
  7732. {
  7733. PQ_RegisterWrite(VIP_reg_slr_mesh_filter_en, 3);
  7734. }
  7735. else if(ucSource==SOURCE_CVD2 || (VIP_GetUserSource() == EXTS && (VIP_GetInputVSize() < 500)))
  7736. {
  7737. //fix roof scene not clear in av & atv
  7738. PQ_RegisterWrite(VIP_reg_slr_mesh_filter_en, 2);
  7739. }
  7740. else
  7741. {
  7742. PQ_RegisterWrite(VIP_reg_slr_mesh_filter_en, 1);
  7743. }
  7744. PQ_RegisterWrite(VIP_reg_slr_icp_fix_en, 1);
  7745. PQ_RegisterWrite(VIP_reg_slr_mesh_filter_expand, 4);
  7746. PQ_RegisterWrite(VIP_reg_slr_mesh_filter_ver_expand, 1);
  7747. PQ_RegisterWrite(VIP_reg_slr_comb_th_1_nom, 0);
  7748. PQ_RegisterWrite(VIP_reg_slr_comb_slope_1_nom, 1023);
  7749. PQ_RegisterWrite(VIP_reg_slr_comb_min_nom, 4);
  7750. PQ_RegisterWrite(VIP_reg_slr_comb_th_2_nom, 48);
  7751. PQ_RegisterWrite(VIP_reg_slr_comb_slope_2_nom, 28);
  7752. if(ucSource == CVD2)
  7753. PQ_RegisterWrite(VIP_reg_slr_comb_th_nom, 0x2);//0xa);//20111228 request from Bonnie
  7754. else if( ucSource == EXTS && !VIP_IsPCSource())
  7755. PQ_RegisterWrite(VIP_reg_slr_comb_th_nom,0x3); //4);//20111228 request from Bonnie
  7756. else
  7757. PQ_RegisterWrite(VIP_reg_slr_comb_th_nom, 3);
  7758. PQ_RegisterWrite(VIP_reg_slr_comb_th_1_mesh, 0);
  7759. PQ_RegisterWrite(VIP_reg_slr_comb_slope_1_mesh, 1023);
  7760. PQ_RegisterWrite(VIP_reg_slr_comb_min_mesh, 0);
  7761. PQ_RegisterWrite(VIP_reg_slr_comb_th_2_mesh, 48);
  7762. PQ_RegisterWrite(VIP_reg_slr_comb_slope_2_mesh, 28);
  7763. PQ_RegisterWrite(VIP_reg_slr_comb_th_mesh, 3);
  7764. PQ_RegisterWrite(VIP_reg_slr_icp_fix_expand, 4);
  7765. if(VIP_GetUserSource() == CVD2 || (VIP_GetUserSource() == EXTS && (!VIP_IsPCSource())))
  7766. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th, 9); //111114:show modify
  7767. else
  7768. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th, 0);
  7769. if(VIP_GetUserSource()==SOURCE_HDMI)
  7770. {
  7771. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_h, 256);
  7772. }
  7773. else if(VIP_IsATVSource()==1)
  7774. {
  7775. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_h, 10);
  7776. }
  7777. else
  7778. {
  7779. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_h, ((VIP_GetUserSource() == CVD2) && !VIP_IsATVSource())?10:310);
  7780. }
  7781. if ( ( ucSource == HDMI && !VIP_RunDVIMode()) || ucSource == MPEG )//|| ( ucSource == EXTS && !pHwContext->bPCSource) )
  7782. {
  7783. if (abs(VIP_GetInputVSize() - 480) < 15 || abs(VIP_GetInputVSize() - 576) < 15 )
  7784. {
  7785. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_h, 0xa);
  7786. }
  7787. }
  7788. else if( ucSource == EXTS && !VIP_IsPCSource())
  7789. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_h, 0xa);
  7790. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_v, 48);
  7791. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_hv, 48);
  7792. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_factor, 8);
  7793. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_factor_h, 48);
  7794. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_factor_v, 8);
  7795. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_factor_hv, 8);
  7796. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_factor_h_inc, 8);
  7797. if ( VIP_GetUserSource() == SOURCE_EXTS && !VIP_IsPCSource() && VIP_GetInputVSize() > 700 )
  7798. {
  7799. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_option, 0x0); //40861
  7800. }
  7801. }
  7802. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th, 9);
  7803. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_h, 0xf);
  7804. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_v, 0x5a);
  7805. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_hv, 0x5a);
  7806. PQ_RegisterWrite(VIP_reg_slr_icp_th, 2);
  7807. PQ_SLR_ColorBarDetailSet();
  7808. PQ_DSSetting();
  7809. PQ_Sharpness(TRUE, pMenuValue->iSharpness); // 20110929 shanlene
  7810. //low angle disable and BMBW disable for 9561
  7811. PQ_RegisterWrite(VIP_reg_slr_low_dis_rgn1_en,0);
  7812. PQ_RegisterWrite(VIP_reg_slr_low_dis_rgn2_en,0);
  7813. PQ_RegisterWrite(VIP_reg_slr_low_dis_rgn3_en,0);
  7814. PQ_RegisterWrite(VIP_reg_slr_mbw_dis_rgn1_en, 0);
  7815. PQ_RegisterWrite(VIP_reg_slr_mbw_dis_rgn2_en, 0);
  7816. PQ_RegisterWrite(VIP_reg_slr_mbw_dis_rgn3_en, 0);
  7817. PQ_RegisterWrite(VIP_reg_slr_mbw_en,1);
  7818. LowMbwReg[0].hds = 0xf;
  7819. LowMbwReg[0].hde = 0x55;
  7820. LowMbwReg[0].vds = 0xa;
  7821. LowMbwReg[0].vde = 0x1a4;
  7822. LowMbwReg[1].hds = 0x5;
  7823. LowMbwReg[1].hde = VIP_GetScalerPreScaleH();
  7824. LowMbwReg[1].vds = 0x19a;
  7825. LowMbwReg[1].vde = 0x1bd;
  7826. LowMbwReg[2].hds = 0x5;
  7827. LowMbwReg[2].hde = VIP_GetScalerPreScaleH();
  7828. LowMbwReg[2].vds = 0x2;
  7829. LowMbwReg[2].vde = 0x3c;
  7830. if(ucSource == CVD2 && VIP_IsATVSource() )
  7831. {
  7832. VTAB_CMN_VALUE_DEFINE* pVtabCmnValue= &pHwContext->VtabCmnValue;
  7833. UINT32 selectRigester = pVtabCmnValue->SlrLowAngleOrMBWDisable;
  7834. PQ_RegisterWrite(VIP_reg_slr_low_dis_rgn1_en,1);
  7835. PQ_RegisterWrite(VIP_reg_slr_low_dis_rgn2_en,1);
  7836. PQ_RegisterWrite(VIP_reg_slr_low_dis_rgn3_en,1);
  7837. PQ_RegisterWrite(VIP_reg_slr_mbw_dis_rgn1_en, 0);
  7838. PQ_RegisterWrite(VIP_reg_slr_mbw_dis_rgn2_en, 0);
  7839. PQ_RegisterWrite(VIP_reg_slr_mbw_dis_rgn3_en, 0);
  7840. if(!PQ_NtscPalDetect()){
  7841. //PAL
  7842. LowMbwReg[0].vde = 0x230;
  7843. LowMbwReg[1].hds = 0x2;
  7844. LowMbwReg[1].vde = 0x2bc;
  7845. LowMbwReg[1].vds = 0x1f4;
  7846. LowMbwReg[1].vde = 0x230;
  7847. LowMbwReg[2].hds = 0x2;
  7848. /*
  7849. PQ_RegisterWrite(VIP_reg_slr_low_dis1_vde, 0x230);
  7850. PQ_RegisterWrite(VIP_reg_slr_low_dis2_hds, 0x02);
  7851. PQ_RegisterWrite(VIP_reg_slr_low_dis2_hde, 0x2BC);
  7852. PQ_RegisterWrite(VIP_reg_slr_low_dis2_vds, 0x1F4);
  7853. PQ_RegisterWrite(VIP_reg_slr_low_dis2_vde, 0x230);
  7854. PQ_RegisterWrite(VIP_reg_slr_low_dis3_hds, 0x02);
  7855. PQ_RegisterWrite(VIP_reg_slr_mbw_dis1_vde, 0x230);
  7856. PQ_RegisterWrite(VIP_reg_slr_mbw_dis2_hds, 0x02);
  7857. PQ_RegisterWrite(VIP_reg_slr_mbw_dis2_hde, 0x2BC);
  7858. PQ_RegisterWrite(VIP_reg_slr_mbw_dis2_vds, 0x1F4);
  7859. PQ_RegisterWrite(VIP_reg_slr_mbw_dis2_vde, 0x230);
  7860. PQ_RegisterWrite(VIP_reg_slr_mbw_dis3_hds, 0x02);
  7861. */
  7862. }
  7863. PQ_RegisterWrite(VIP_reg_slr_low_dis_rgn1_en, (0x1 == (selectRigester&0x1)) ? 1 : 0);
  7864. PQ_RegisterWrite(VIP_reg_slr_low_dis_rgn2_en, (0x2 == (selectRigester&0x2)) ? 1 : 0);
  7865. PQ_RegisterWrite(VIP_reg_slr_low_dis_rgn3_en, (0x4 == (selectRigester&0x4)) ? 1 : 0);
  7866. PQ_RegisterWrite(VIP_reg_slr_mbw_dis_rgn1_en, (0x8 == (selectRigester&0x8))? 1 : 0);
  7867. PQ_RegisterWrite(VIP_reg_slr_mbw_dis_rgn2_en, (0x10 == (selectRigester&0x10)) ? 1 : 0);
  7868. PQ_RegisterWrite(VIP_reg_slr_mbw_dis_rgn3_en, (0x20 == (selectRigester&0x20)) ? 1 : 0);
  7869. #if VIP_FLIP_FUN
  7870. if(VIP_GetPanelInvert())
  7871. {
  7872. for(i=0;i<3;i++)
  7873. {
  7874. tmp = LowMbwReg[i].hds;
  7875. LowMbwReg[i].hds = VIP_GetScalerPreScaleH()- LowMbwReg[i].hde;
  7876. LowMbwReg[i].hde = VIP_GetScalerPreScaleH()- tmp;
  7877. tmp = LowMbwReg[i].vds;
  7878. LowMbwReg[i].vds = VIP_GetScalerPreScaleV()- LowMbwReg[i].vde;
  7879. LowMbwReg[i].vde = VIP_GetScalerPreScaleV()- tmp;
  7880. }
  7881. }
  7882. #endif
  7883. for(i = 0;i <3 ; i++)
  7884. {
  7885. PQ_RegisterWrite(VIP_reg_slr_low_dis1_hds + i*16, LowMbwReg[i].hds);
  7886. PQ_RegisterWrite(VIP_reg_slr_low_dis1_hde + i*16, LowMbwReg[i].hde);
  7887. PQ_RegisterWrite(VIP_reg_slr_low_dis1_vds + i*16, LowMbwReg[i].vds);
  7888. PQ_RegisterWrite(VIP_reg_slr_low_dis1_vde + i*16, LowMbwReg[i].vde);
  7889. PQ_RegisterWrite(VIP_reg_slr_mbw_dis1_hds + i*16, LowMbwReg[i].hds);
  7890. PQ_RegisterWrite(VIP_reg_slr_mbw_dis1_hde + i*16, LowMbwReg[i].hde);
  7891. PQ_RegisterWrite(VIP_reg_slr_mbw_dis1_vds + i*16, LowMbwReg[i].vds);
  7892. PQ_RegisterWrite(VIP_reg_slr_mbw_dis1_vde + i*16, LowMbwReg[i].vde);
  7893. }
  7894. PQ_RegisterWrite(VIP_reg_vdi_mad_fc_mbw_lth, 0x100);//fix roof scene not clarity in av
  7895. }
  7896. else
  7897. {
  7898. PQ_RegisterWrite(VIP_reg_vdi_mad_fc_mbw_lth, 0x10);//fix roof scene not clarity
  7899. }
  7900. if(abs(VIP_GetInputVSize())<10 && VIP_GetInterlaceMode()) //sharlene //PQ2009 ��r���ʴ��u
  7901. {
  7902. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_limit, 0x8);
  7903. }
  7904. else if(ucSource==SOURCE_HDMI && VIP_GetInputVSize()==576 && VIP_GetInterlaceMode())
  7905. {
  7906. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_limit, 0x1);
  7907. }
  7908. else
  7909. {
  7910. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_limit, 0x4);
  7911. }
  7912. #if 1 //130903 sony_PQ_PAL P#73 move mesh for atv
  7913. PQ_RegisterWrite(VIP_reg_slr_mix_edge_ach, 2);
  7914. PQ_RegisterWrite(VIP_reg_slr_mix_acv, 4);
  7915. PQ_RegisterWrite(VIP_reg_slr_mix_edge_bch, 2);
  7916. PQ_RegisterWrite(VIP_reg_slr_mbw_expand_sel, 1);
  7917. #else
  7918. PQ_RegisterWrite(VIP_reg_slr_mix_edge_ach, VIP_IsATVSource()?3:2);
  7919. PQ_RegisterWrite(VIP_reg_slr_mix_acv, VIP_IsATVSource()?1:4);
  7920. PQ_RegisterWrite(VIP_reg_slr_mix_edge_bch, VIP_IsATVSource()?3:2);
  7921. PQ_RegisterWrite(VIP_reg_slr_mbw_expand_sel, VIP_IsATVSource()?3:1);
  7922. #endif
  7923. PQ_SetMotionThreshold();
  7924. PQ_LowAngleSetting();
  7925. }
  7926. void PQ_LowAngleSetting(void)
  7927. {
  7928. PQ_RegisterWrite(VIP_reg_slr_mix_sad0_factor ,32);
  7929. PQ_RegisterWrite(VIP_reg_slr_mix_sad1_factor ,64);
  7930. PQ_RegisterWrite(VIP_reg_slr_mix_ext_angle_en ,1);
  7931. PQ_RegisterWrite(VIP_reg_slr_mix_max_diff_value ,0);
  7932. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_en ,0);
  7933. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_th ,2);
  7934. PQ_RegisterWrite(VIP_reg_slr_mix_angle90_aug_th ,1);
  7935. PQ_RegisterWrite(VIP_reg_slr_mix_angle90_aug_limit ,36);
  7936. PQ_RegisterWrite(VIP_reg_slr_mix_hedge_th ,40);
  7937. PQ_RegisterWrite(VIP_reg_slr_mix_no_favor_angle90_en ,1);
  7938. PQ_RegisterWrite(VIP_reg_slr_mix_sad_diff_th1 ,0);
  7939. PQ_RegisterWrite(VIP_reg_slr_mix_sad_diff_th2 ,16);
  7940. PQ_RegisterWrite(VIP_reg_slr_mix_dir90_diff_th ,10);
  7941. PQ_RegisterWrite(VIP_reg_slr_mix_vedge_th ,20);
  7942. PQ_RegisterWrite(VIP_reg_slr_mix_vedge_num_th ,8);
  7943. PQ_RegisterWrite(VIP_reg_slr_mix_vedge_angle_th ,21);
  7944. PQ_RegisterWrite(VIP_reg_slr_mix_detail_hedge_en ,1);
  7945. PQ_RegisterWrite(VIP_reg_slr_mix_detail_hedge_clipth ,64);
  7946. PQ_RegisterWrite(VIP_reg_slr_mix_high_angle_th ,5);
  7947. PQ_RegisterWrite(VIP_reg_slr_mix_low_angle_th ,21);
  7948. PQ_RegisterWrite(VIP_reg_slr_mix_dir_conflict_en ,1);
  7949. PQ_RegisterWrite(VIP_reg_slr_mix_conflict_mth ,1);
  7950. PQ_RegisterWrite(VIP_reg_slr_mix_good_dir_th1 ,80);
  7951. PQ_RegisterWrite(VIP_reg_slr_mix_good_dir_th2 ,50);
  7952. PQ_RegisterWrite(VIP_reg_slr_mix_check_angle_th ,8);
  7953. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_check_en ,0);
  7954. PQ_RegisterWrite(VIP_reg_slr_mix_forward_com_en ,1);
  7955. PQ_RegisterWrite(VIP_reg_slr_mix_forward_com_stage ,2);
  7956. PQ_RegisterWrite(VIP_reg_slr_mix_fc_lost_angle_th1 ,100);
  7957. PQ_RegisterWrite(VIP_reg_slr_mix_fc_lost_angle_th2 ,20);
  7958. PQ_RegisterWrite(VIP_reg_slr_mix_fc_lost_angle_th3 ,48);
  7959. PQ_RegisterWrite(VIP_reg_slr_mix_fc_hedge_th ,48);
  7960. PQ_RegisterWrite(VIP_reg_slr_mix_backward_com_en ,1);
  7961. PQ_RegisterWrite(VIP_reg_slr_mix_backward_com_stage ,2);
  7962. PQ_RegisterWrite(VIP_reg_slr_mix_bc_lost_angle_th1 ,120);
  7963. PQ_RegisterWrite(VIP_reg_slr_mix_bc_lost_angle_th2 ,50);
  7964. PQ_RegisterWrite(VIP_reg_slr_mix_bc_lost_angle_th3 ,36);
  7965. PQ_RegisterWrite(VIP_reg_slr_mix_bc_hedge_th ,48);
  7966. PQ_RegisterWrite(VIP_reg_slr_mix_median_filter_mth ,1);
  7967. PQ_RegisterWrite(VIP_reg_slr_mix_col_size ,720);
  7968. PQ_RegisterWrite(VIP_reg_slr_mix_dir_diff_th ,36);
  7969. PQ_RegisterWrite(VIP_reg_slr_mix_big_dir_diff_th ,80);
  7970. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_01 ,7);
  7971. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_02 ,8);
  7972. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_03 ,9);
  7973. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_04 ,10);
  7974. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_05 ,11);
  7975. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_06 ,12);
  7976. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_07 ,13);
  7977. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_08 ,14);
  7978. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_09 ,15);
  7979. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_10 ,16);
  7980. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_11 ,16);
  7981. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_12 ,16);
  7982. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_13 ,16);
  7983. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_14 ,16);
  7984. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_15 ,16);
  7985. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_16 ,16);
  7986. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_17 ,16);
  7987. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_18 ,16);
  7988. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_19 ,16);
  7989. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_20 ,16);
  7990. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_21 ,16);
  7991. PQ_RegisterWrite(VIP_reg_slr_mix_store_post_en ,0);
  7992. PQ_RegisterWrite(VIP_reg_slr_mix_nan_en ,1);
  7993. PQ_RegisterWrite(VIP_reg_slr_mix_ana_en ,1);
  7994. PQ_RegisterWrite(VIP_reg_slr_mix_hlh_en ,1);
  7995. PQ_RegisterWrite(VIP_reg_slr_mix_eup ,16);
  7996. PQ_RegisterWrite(VIP_reg_slr_mix_edn ,16);
  7997. PQ_RegisterWrite(VIP_reg_slr_mix_center_com_en ,1);
  7998. PQ_RegisterWrite(VIP_reg_slr_mix_center_com_stage ,2);
  7999. PQ_RegisterWrite(VIP_reg_slr_mix_cnf_win5 ,1);
  8000. PQ_RegisterWrite(VIP_reg_slr_mix_detail_hedge_win ,6);
  8001. PQ_RegisterWrite(VIP_reg_slr_mix_fix_ccom_a90_en ,1);
  8002. PQ_RegisterWrite(VIP_reg_slr_mix_fix_ccom_a90_th ,32);
  8003. PQ_RegisterWrite(VIP_reg_slr_mix_angle_sel_sub ,1048575);
  8004. //for atv ���\����issue low angle adjust to 0xff from hw suggest
  8005. if(VIP_IsATVSource())
  8006. PQ_RegisterWrite(VIP_reg_slr_mix_angle_sel_main ,0xff);
  8007. else
  8008. PQ_RegisterWrite(VIP_reg_slr_mix_angle_sel_main ,1048575);
  8009. PQ_RegisterWrite(VIP_reg_slr_mix_lr_dec_en ,1);
  8010. PQ_RegisterWrite(VIP_reg_slr_mix_chk_confidence_en ,1);
  8011. PQ_RegisterWrite(VIP_reg_slr_mix_last_2n1a_en ,1);
  8012. PQ_RegisterWrite(VIP_reg_slr_mix_last_5n3a_en ,1);
  8013. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_00 ,0);
  8014. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_01 ,0);
  8015. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_02 ,0);
  8016. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_03 ,0);
  8017. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_04 ,0);
  8018. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_05 ,0);
  8019. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_06 ,0);
  8020. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_07 ,0);
  8021. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_08 ,0);
  8022. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_09 ,0);
  8023. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_10 ,0);
  8024. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_11 ,0);
  8025. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_12 ,0);
  8026. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_13 ,0);
  8027. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_14 ,0);
  8028. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_15 ,0);
  8029. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_16 ,0);
  8030. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_17 ,0);
  8031. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_18 ,0);
  8032. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_19 ,0);
  8033. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_20 ,0);
  8034. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_en ,0);
  8035. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_th2 ,10);
  8036. PQ_RegisterWrite(VIP_reg_slr_mix_invalid_la_th1 ,1);
  8037. PQ_RegisterWrite(VIP_reg_slr_mix_invalid_la_th2 ,5);
  8038. PQ_RegisterWrite(VIP_reg_slr_mix_chroma_diff_th1 ,24);
  8039. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_01_th1 ,2);
  8040. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_02_th1 ,2);
  8041. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_03_th1 ,2);
  8042. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_04_th1 ,2);
  8043. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_05_th1 ,2);
  8044. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_06_th1 ,2);
  8045. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_07_th1 ,2);
  8046. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_08_th1 ,2);
  8047. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_09_th1 ,3);
  8048. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_10_th1 ,3);
  8049. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_11_th1 ,3);
  8050. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_12_th1 ,3);
  8051. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_13_th1 ,3);
  8052. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_14_th1 ,4);
  8053. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_15_th1 ,4);
  8054. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_16_th1 ,4);
  8055. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_17_th1 ,5);
  8056. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_18_th1 ,5);
  8057. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_19_th1 ,5);
  8058. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_20_th1 ,5);
  8059. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_dis_en ,0);
  8060. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_dis_th1 ,3);
  8061. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_dis_th2 ,96);
  8062. PQ_RegisterWrite(VIP_reg_slr_mix_dir_diff_th2 ,50);
  8063. PQ_RegisterWrite(VIP_reg_slr_mix_big_dir_diff_th2 ,100);
  8064. PQ_RegisterWrite(VIP_reg_slr_mix_dir_diff_bound ,6); //*((BYTE*)(0xbe1cd388)) = 6;
  8065. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_en_hw ,1); //*((BYTE*)(0xbe1cd389)) = 1;
  8066. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_en_th ,50); //*((BYTE*)(0xbe1cd38a)) = 50;
  8067. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_en_th2 ,1); //*((BYTE*)(0xbe1cd38b)) = 1;
  8068. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_en_win ,5); //*((BYTE*)(0xbe1cd38c)) = 5;
  8069. PQ_RegisterWrite(VIP_reg_slr_mix_sad2_factor ,32); //*((BYTE*)(0xbe1cd38d)) = 32;
  8070. PQ_RegisterWrite(VIP_reg_slr_mix_sad3_factor ,16); //*((BYTE*)(0xbe1cd38e)) = 16;
  8071. PQ_RegisterWrite(VIP_reg_slr_mix_sad4_factor ,16); //*((BYTE*)(0xbe1cd38f)) = 16;
  8072. PQ_RegisterWrite(VIP_reg_slr_mix_sad5_factor ,16); //*((BYTE*)(0xbe1cd390)) = 16;
  8073. PQ_RegisterWrite(VIP_reg_slr_mix_sad6_factor ,16); //*((BYTE*)(0xbe1cd391)) = 16;
  8074. PQ_RegisterWrite(VIP_reg_slr_mix_sad7_factor ,16); //*((BYTE*)(0xbe1cd392)) = 16;
  8075. PQ_RegisterWrite(VIP_reg_slr_mix_sad8_factor ,16); //*((BYTE*)(0xbe1cd393)) = 16;
  8076. PQ_RegisterWrite(VIP_reg_slr_mix_sadx01_factor ,0); //*((BYTE*)(0xbe1cd394)) = 0;
  8077. PQ_RegisterWrite(VIP_reg_slr_mix_sadx02_factor ,0); //*((BYTE*)(0xbe1cd395)) = 0;
  8078. PQ_RegisterWrite(VIP_reg_slr_mix_sadx03_factor ,16); //*((BYTE*)(0xbe1cd396)) = 16;
  8079. PQ_RegisterWrite(VIP_reg_slr_mix_sadx04_factor ,16); //*((BYTE*)(0xbe1cd397)) = 16;
  8080. PQ_RegisterWrite(VIP_reg_slr_mix_sadx05_factor ,12); //*((BYTE*)(0xbe1cd398)) = 12;
  8081. PQ_RegisterWrite(VIP_reg_slr_mix_sadx06_factor ,12); //*((BYTE*)(0xbe1cd399)) = 12;
  8082. PQ_RegisterWrite(VIP_reg_slr_mix_sadx07_factor ,8); //*((BYTE*)(0xbe1cd39a)) = 8;
  8083. PQ_RegisterWrite(VIP_reg_slr_mix_sadx08_factor ,8); //*((BYTE*)(0xbe1cd39b)) = 8;
  8084. PQ_RegisterWrite(VIP_reg_slr_mix_sadx09_factor ,4); //*((BYTE*)(0xbe1cd39c)) = 4;
  8085. PQ_RegisterWrite(VIP_reg_slr_mix_sadx10_factor ,4); //*((BYTE*)(0xbe1cd39d)) = 4;
  8086. PQ_RegisterWrite(VIP_reg_slr_low_angle_dis ,255); //*((BYTE*)(0xbe1cd39e)) = 255;
  8087. PQ_RegisterWrite(VIP_reg_slr_mix_sada01_factor ,16); //*((BYTE*)(0xbe1cd39f)) = 16;
  8088. PQ_RegisterWrite(VIP_reg_slr_mix_sada02_factor ,16); //*((BYTE*)(0xbe1cd3a0)) = 16;
  8089. PQ_RegisterWrite(VIP_reg_slr_mix_sada03_factor ,32); //*((BYTE*)(0xbe1cd3a1)) = 32;
  8090. PQ_RegisterWrite(VIP_reg_slr_mix_sada04_factor ,32); //*((BYTE*)(0xbe1cd3a2)) = 32;
  8091. PQ_RegisterWrite(VIP_reg_slr_mix_sada05_factor ,16); //*((BYTE*)(0xbe1cd3a3)) = 16;
  8092. PQ_RegisterWrite(VIP_reg_slr_mix_sada06_factor ,16); //*((BYTE*)(0xbe1cd3a4)) = 16;
  8093. PQ_RegisterWrite(VIP_reg_slr_mix_sada07_factor ,16); //*((BYTE*)(0xbe1cd3a5)) = 16;
  8094. PQ_RegisterWrite(VIP_reg_slr_mix_sada08_factor ,16); //*((BYTE*)(0xbe1cd3a6)) = 16;
  8095. PQ_RegisterWrite(VIP_reg_slr_mix_sada09_factor ,16); //*((BYTE*)(0xbe1cd3a7)) = 16;
  8096. PQ_RegisterWrite(VIP_reg_slr_mix_sada10_factor ,16); //*((BYTE*)(0xbe1cd3a8)) = 16;
  8097. PQ_RegisterWrite(VIP_reg_slr_mix_sada11_factor ,16); //*((BYTE*)(0xbe1cd3a9)) = 16;
  8098. PQ_RegisterWrite(VIP_reg_slr_mix_sada12_factor ,16); //*((BYTE*)(0xbe1cd3aa)) = 16;
  8099. PQ_RegisterWrite(VIP_reg_slr_mix_sada13_factor ,16); //*((BYTE*)(0xbe1cd3ab)) = 16;
  8100. PQ_RegisterWrite(VIP_reg_slr_mix_sada14_factor ,16); //*((BYTE*)(0xbe1cd3ac)) = 16;
  8101. PQ_RegisterWrite(VIP_reg_slr_mix_sada15_factor ,16); //*((BYTE*)(0xbe1cd3ad)) = 16;
  8102. PQ_RegisterWrite(VIP_reg_slr_mix_sada16_factor ,16); //*((BYTE*)(0xbe1cd3ae)) = 16;
  8103. PQ_RegisterWrite(VIP_reg_slr_mix_sada17_factor ,32); //*((BYTE*)(0xbe1cd3af)) = 32;
  8104. PQ_RegisterWrite(VIP_reg_slr_mix_sada18_factor ,32); //*((BYTE*)(0xbe1cd3b0)) = 32;
  8105. PQ_RegisterWrite(VIP_reg_slr_mix_sada19_factor ,32); //*((BYTE*)(0xbe1cd3b1)) = 32;
  8106. PQ_RegisterWrite(VIP_reg_slr_mix_sada20_factor ,32); //*((BYTE*)(0xbe1cd3b2)) = 32;
  8107. PQ_RegisterWrite(VIP_reg_slr_min_sad_sft ,0); //*((BYTE*)(0xbe1cd3b3)) = 0;
  8108. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_01 ,0); //*((DWORD*)(0xbe1cd3b4)) = 0;
  8109. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_02 ,0); //*((DWORD*)(0xbe1cd3b8)) = 0;
  8110. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_03 ,0); //*((DWORD*)(0xbe1cd3bc)) = 0;
  8111. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_04 ,0); //*((DWORD*)(0xbe1cd3e0)) = 0;
  8112. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_05 ,0); //*((DWORD*)(0xbe1cd3e4)) = 0;
  8113. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_06 ,0); //*((DWORD*)(0xbe1cd3e8)) = 0;
  8114. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_07 ,0); //*((DWORD*)(0xbe1cd3ec)) = 0;
  8115. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_08 ,0); //*((DWORD*)(0xbe1cd3f0)) = 0;
  8116. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_09 ,0); //*((DWORD*)(0xbe1cd3f4)) = 0;
  8117. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_10 ,0xa); //*((DWORD*)(0xbe1cd3f8)) = 0xa;
  8118. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_11 ,0x14); //*((DWORD*)(0xbe1cd3fc)) = 0x14;
  8119. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_12 ,0x28); //*((DWORD*)(0xbe1cd430)) = 0x28;
  8120. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_13 ,0x50); //*((DWORD*)(0xbe1cd434)) = 0x50;
  8121. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_14 ,0xa0); //*((DWORD*)(0xbe1cd438)) = 0xa0;
  8122. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_15 ,0x140); //*((DWORD*)(0xbe1cd43c)) = 0x140;
  8123. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_16 ,0x258); //*((DWORD*)(0xbe1cd450)) = 0x258;
  8124. PQ_RegisterWrite(VIP_reg_la_flat_length_max ,0x10); //*((DWORD*)(0xbe1cd929)) = 0x10;
  8125. PQ_RegisterWrite(VIP_reg_slr_la_sad_maxh ,0x60); //*((DWORD*)(0xbe1cd92d)) = 0x60;
  8126. }
  8127. void PQ_ConditionSetting(UINT8 ucMode)
  8128. {
  8129. ///////////////////////////////////////////////////////////
  8130. // From MAD Setup on 7 Places
  8131. ///////////////////////////////////////////////////////////
  8132. PQ_RegisterWrite(VIP_reg_vdi_mad_hlp_en, 0x1);
  8133. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_slope1, 0x10);
  8134. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_max_th, 0x0);
  8135. PQ_RegisterWrite(VIP_reg_vdi_mad_tpcw_xoff, 0xa);
  8136. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_xoff1, 0x5);
  8137. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_xoff1s,0x8);
  8138. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_xoff2, 13);
  8139. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_xoff2s,0x18);
  8140. if(VIP_GetUserSource()==SOURCE_MPEG && VIP_GetInputHSize()<800 && VIP_GetInterlaceMode())
  8141. {
  8142. // for eric request to improve the sd quality like mantis 43324
  8143. PQ_RegisterWrite(VIP_reg_vdi_mad_hlp_en, 0);
  8144. // # 48358 : fix flicker issue fro AV source
  8145. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_slope1, 0x2);
  8146. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_max_th, 0x2);
  8147. // NTSC building horizontal line flicker issue #45589
  8148. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_xoff1, 0);
  8149. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_xoff2, 8);
  8150. }
  8151. else if(VIP_IsAVSource() || VIP_IsATVSource())
  8152. {
  8153. // for eric request to improve the sd quality like mantis 43324
  8154. PQ_RegisterWrite(VIP_reg_vdi_mad_hlp_en, 0);
  8155. // # 48358 : fix flicker issue fro AV source
  8156. if(PQ_GetMotionStatusByMethod2())
  8157. {
  8158. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_slope1, 0x2);
  8159. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_max_th, 0x2);
  8160. }
  8161. if(VIP_GetStdColorSystem() <= CVD2_STD_NTSC_443)
  8162. {
  8163. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_xoff1, 5);
  8164. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_xoff2, 9);
  8165. }
  8166. else if(VIP_GetStdColorSystem() <= CVD2_STD_PAL_60)
  8167. {
  8168. //for # 50126 : fix sawtooth issue
  8169. PQ_RegisterWrite(VIP_reg_vdi_mad_tpcw_xoff,0x6);
  8170. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_xoff1, 0);
  8171. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_xoff1s, 4);
  8172. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_xoff2, 4);
  8173. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_xoff2s,0x10);
  8174. // for #51046 : fix white noise point
  8175. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_yoff2, 4);
  8176. }
  8177. else
  8178. {
  8179. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_xoff1, 0);
  8180. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_xoff2, 8);
  8181. }
  8182. }
  8183. else if(VIP_GetUserSource()==SOURCE_HDMI && (VIP_GetInputVSize() <= (480+24)))
  8184. {
  8185. // for Toshiba3 chapter 7 issue
  8186. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_max_th, 0x2);
  8187. }
  8188. ///////////////////////////////////////////////////////////
  8189. // From FilterSetup ach on 6 places, bch on 2 places
  8190. ///////////////////////////////////////////////////////////
  8191. }
  8192. void PQ_VDeblockFilterEnable(void)
  8193. {
  8194. if(VIP_IsATVSource() || ((VIP_GetUserSource()==SOURCE_HDMI || VIP_GetUserSource() == SOURCE_EXTS) && VIP_GetInterlaceMode() && (VIP_GetInputVSize() < 600)))
  8195. PQ_RegisterWrite(VIP_reg_vdi_block_vfil_en, 0);
  8196. else
  8197. PQ_RegisterWrite(VIP_reg_vdi_block_vfil_en, 1);
  8198. }
  8199. BOOL PQ_NtscPalDetect(void)
  8200. {
  8201. BOOL bNtscMode= FALSE;
  8202. UINT8 ucSource,ucNtscPalStatus= 0;
  8203. UINT32 Hin_total,Vin_total;
  8204. UINT32 InputFrameRate= 0;
  8205. ucSource=VIP_GetUserSource();
  8206. switch (ucSource){
  8207. case SOURCE_HDMI:
  8208. ucNtscPalStatus=PQ_RegisterRead(VIP_sta_hdmi_frmrate);
  8209. break;
  8210. case SOURCE_MPEG:
  8211. ucNtscPalStatus=PQ_RegisterRead(VIP_sta_mpga_frmrate);
  8212. break;
  8213. case SOURCE_CVD2:
  8214. ucNtscPalStatus=PQ_RegisterRead(VIP_sta_cvd2_frmrate);
  8215. break;
  8216. case SOURCE_EXTS:
  8217. ucNtscPalStatus=PQ_RegisterRead(VIP_sta_exts_frmrate);
  8218. break;
  8219. }
  8220. //PQDebugPrint("ucNtscPalStatus=%d", ucNtscPalStatus);
  8221. if( ucNtscPalStatus==1 || ucNtscPalStatus==2 ) //50Hz
  8222. {
  8223. bNtscMode= FALSE;
  8224. }
  8225. else if( ucNtscPalStatus==4 || ucNtscPalStatus==5 ) //60Hz
  8226. {
  8227. bNtscMode= TRUE;
  8228. }
  8229. else
  8230. {
  8231. VIP_GetSyncLatchCount(DRV_ADI_GetSourceSelect(), &Hin_total, &Vin_total);
  8232. if( (Hin_total>0) && (Vin_total>0) )
  8233. InputFrameRate=((SYSTEM_CLK)/(Hin_total*Vin_total));
  8234. if((abs(60-InputFrameRate)<5)/*||(InputFrameRate<44)*/)
  8235. bNtscMode=TRUE;
  8236. else
  8237. bNtscMode=FALSE;
  8238. }
  8239. PQDebugPrint("%s bNtscMode=%d", __FUNCTION__,bNtscMode);
  8240. return bNtscMode;
  8241. }
  8242. void PQ_DS_Init(void)
  8243. {
  8244. PQ_RegisterWrite(VIP_reg_slr_ds_full_angle, 0);
  8245. PQ_RegisterWrite(VIP_reg_slr_dscale_cross_shoot_ctrl_taps, 1);
  8246. PQ_RegisterWrite(VIP_reg_slr_dscale_other_shoot_ctrl_taps, 1);
  8247. PQ_RegisterWrite(VIP_reg_slr_dscale_cross_shoot_ctrl_taps_c, 2);
  8248. PQ_RegisterWrite(VIP_reg_slr_dscale_other_shoot_ctrl_taps_c, 2);
  8249. PQ_RegisterWrite(VIP_reg_slr_ds_sharp_gain_ctrl_en, 1);
  8250. PQ_RegisterWrite(VIP_reg_slr_ds_sharp_gain_ctrl_tap, 0);
  8251. PQ_RegisterWrite(VIP_reg_slr_ds_sharp_gain_ctrl_en_c, 1);
  8252. PQ_RegisterWrite(VIP_reg_slr_ds_sharp_gain_ctrl_tap_c, 0);
  8253. PQ_RegisterWrite(VIP_reg_slr_motion_cond, 4);
  8254. PQ_RegisterWrite(VIP_reg_slr_h_salt_fil_en ,0x0);
  8255. }
  8256. void PQ_DSSetting(void)
  8257. {
  8258. //531 Test#################################################################################
  8259. if (VIP_IsPCSource() && VIP_GetInputVSize() <= 500) //#51243
  8260. {
  8261. PQ_RegisterWrite(VIP_reg_slr_ds_angle_0_weight,0x2);// 0x0140D250 // 16 , "N"
  8262. }
  8263. else if (VIP_GetUserSource() == SOURCE_HDMI && VIP_GetInputHSize()<1900) //#51302 & #51333
  8264. {
  8265. PQ_RegisterWrite(VIP_reg_slr_ds_angle_0_weight,0x3);
  8266. }
  8267. else if (VIP_GetUserSource() == SOURCE_EXTS && VIP_GetInputVSize() == 576) //#51680
  8268. {
  8269. PQ_RegisterWrite(VIP_reg_slr_ds_angle_0_weight,0x2);
  8270. }
  8271. else
  8272. {
  8273. PQ_RegisterWrite(VIP_reg_slr_ds_angle_0_weight,0x10);// 0x0140D250 // 16 , "N"
  8274. }
  8275. PQ_RegisterWrite(VIP_reg_slr_ds_angle_90_weight,0x10);// 0x0140D251 // 16 , "N"
  8276. PQ_RegisterWrite(VIP_reg_slr_ds_angle_67_weight,0x10);// 0x0140D252 // 16 , "N"
  8277. PQ_RegisterWrite(VIP_reg_slr_ds_angle_113_weight,0x10);// 0x0140D253 // 16 , "N"
  8278. PQ_RegisterWrite(VIP_reg_slr_ds_angle_45_weight,0x10);// 0x0140D254 // 16 , "N"
  8279. PQ_RegisterWrite(VIP_reg_slr_ds_angle_135_weight,0x10);// 0x0140D255 // 16 , "N"
  8280. PQ_RegisterWrite(VIP_reg_slr_ds_angle_23_weight,0x10);// 0x0140D256 // 16 , "N"
  8281. PQ_RegisterWrite(VIP_reg_slr_ds_angle_157_weight,0x10);// 0x0140D257 // 16 , "N"
  8282. PQ_RegisterWrite(VIP_reg_slr_ds_angle_16_weight,0x10);// 0x0140D258 // 16 , "N"
  8283. PQ_RegisterWrite(VIP_reg_slr_ds_angle_164_weight,0x10);// 0x0140D259 // 16 , "N"
  8284. PQ_RegisterWrite(VIP_reg_slr_ds_angle_56_weight,0x10);// 0x0140D25A // 16 , "N"
  8285. PQ_RegisterWrite(VIP_reg_slr_ds_angle_124_weight,0x10);// 0x0140D25B // 16 , "N"
  8286. PQ_RegisterWrite(VIP_reg_slr_ds_angle_34_weight,0x10);// 0x0140D25C // 16 , "N"
  8287. PQ_RegisterWrite(VIP_reg_slr_ds_angle_146_weight,0x10);// 0x0140D25D // 16 , "N"
  8288. PQ_RegisterWrite(VIP_reg_slr_ds_angle_74_weight,0x10);// 0x0140D25E // 16 , "N"
  8289. PQ_RegisterWrite(VIP_reg_slr_ds_angle_106_weight,0x10);// 0x0140D25F // 16 , "N"
  8290. PQ_RegisterWrite(VIP_reg_slr_ds_dbg_en,0x0);// 0x0040D260 // 0 , "N"
  8291. PQ_RegisterWrite(VIP_reg_slr_ds_sharp_dbg_en,0x0);// 0x0040D261 // 0 , "N"
  8292. //D262 for Chroma Pattern#1, Sharpness smooth
  8293. PQ_RegisterWrite(VIP_reg_slr_ds_angle_limit_en,0x72);// 0x01C0D262 // 0 , "N"
  8294. PQ_RegisterWrite(VIP_reg_slr_ds_hp_fix_mth,0x3);// 0x0080D264 // 3 , "N"
  8295. //add this condition because of mantis 51218
  8296. if(VIP_GetInputHSize()==1280 && VIP_GetInputVSize()==960 && VIP_GetPanelWidth()==1366 && VIP_GetPanelHeight()==768)
  8297. PQ_RegisterWrite(VIP_reg_slr_ds_hp_clip_sel,0x0);
  8298. else if (VIP_GetUserSource() == SOURCE_HDMI)
  8299. PQ_RegisterWrite(VIP_reg_slr_ds_hp_clip_sel,0x0); // #51302
  8300. else
  8301. PQ_RegisterWrite(VIP_reg_slr_ds_hp_clip_sel,0x1);// 0x0040D265 // 0 , "N"
  8302. PQ_RegisterWrite(VIP_reg_slr_ds_ver_sht, 2);
  8303. PQ_RegisterWrite(VIP_reg_slr_ds_hp_clip_th,0x18);// 0x0240D268 // 24 , "N"
  8304. PQ_RegisterWrite(VIP_reg_slr_ds_hp_hsum_max_th,0x480);// 0x0380D26C // 1152 , "N"
  8305. PQ_RegisterWrite(VIP_reg_slr_ds_hp_hsum_min_th,0x180);// 0x0380D270 // 384 , "N"
  8306. PQ_RegisterWrite(VIP_reg_slr_ds_hp_vsum_max_th,0x480);// 0x0380D274 // 1152 , "N"
  8307. PQ_RegisterWrite(VIP_reg_slr_ds_hp_vsum_min_th,0x180);// 0x0380D278 // 384 , "N"
  8308. PQ_RegisterWrite(VIP_reg_slr_ds_hp_mixsum_max_th,0x600);// 0x03C0D27C // 1536 , "N"
  8309. PQ_RegisterWrite(VIP_reg_slr_ds_hp_vsum_hsum_ratio,0x06);// 0x0140D280 // 6 , "N"
  8310. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th,0x9);// 0x0240D2B0 // 60 , "N"
  8311. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_h,0xf);// 0x0240D2B4 // 15 , "N"
  8312. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_v,0x5a);// 0x0240D2B8 // 90 , "N"
  8313. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_hv,0x5a);// 0x0240D2BC // 90 , "N"
  8314. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_factor,0x08);// 0x01C0D2C0 // 24 , "N"
  8315. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_factor_h,0x30);// 0x01C0D2C1 // 48 , "N"
  8316. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_factor_v,0x08);// 0x01C0D2C2 // 8 , "N"
  8317. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_factor_hv,0x08);// 0x01C0D2C3 // 8 , "N"
  8318. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_factor_h_inc,0x08);// 0x01C0D2C4 // 8 , "N"
  8319. PQ_RegisterWrite(VIP_reg_slr_ds_sad_lr_lp,0x01);// 0x0040D2D0 // 1 , "N"
  8320. PQ_RegisterWrite(VIP_reg_slr_ds_cross_alpha_th,0x03);// 0x0100D2D1 // 3 , "N"
  8321. PQ_RegisterWrite(VIP_reg_slr_ds_sad_lr_restrict,0x01);// 0x0040D2D2 // 1 , "N"
  8322. PQ_RegisterWrite(VIP_reg_slr_ds_strong_lr_th1,0x30);// 0x0200D2D3 // 48 , "N"
  8323. PQ_RegisterWrite(VIP_reg_slr_ds_strong_lr_th2,0x30);// 0x0200D2D4 // 48 , "N"
  8324. PQ_RegisterWrite(VIP_reg_slr_ds_strong_lr_ratio1,0x8);// 0x0100D2D5 // 8 , "N"
  8325. PQ_RegisterWrite(VIP_reg_slr_ds_strong_lr_ratio2,0x8);// 0x0100D2D6 // 8 , "N"
  8326. PQ_RegisterWrite(VIP_reg_slr_ds_weak_lr_th1,0x10);// 0x0200D2D7 // 16 , "N"
  8327. PQ_RegisterWrite(VIP_reg_slr_ds_weak_lr_th2,0x10);// 0x0200D2D8 // 16 , "N"
  8328. PQ_RegisterWrite(VIP_reg_slr_ds_weak_lr_ratio1,0x05);// 0x0100D2D9 // 5 , "N"
  8329. PQ_RegisterWrite(VIP_reg_slr_ds_weak_lr_ratio2,0x04);// 0x0100D2DA // 4 , "N"
  8330. PQ_RegisterWrite(VIP_reg_slr_ds_sum_lr_ratio1,0x05);// 0x0100D2DB // 5 , "N"
  8331. PQ_RegisterWrite(VIP_reg_slr_ds_sum_lr_ratio2,0x05);// 0x0100D2DC // 5 , "N"
  8332. PQ_RegisterWrite(VIP_reg_slr_ds_sad_l_r_min,0x10);// 0x0200D2DD // 16 , "N"
  8333. PQ_RegisterWrite(VIP_reg_slr_ds_sad_lr_min,0x60);// 0x0200D2DE // 96 , "N"
  8334. PQ_RegisterWrite(VIP_reg_slr_ds_sad_max,0xc8);// 0x0240D2E0 // 200 , "N"
  8335. PQ_RegisterWrite(VIP_reg_slr_ds_sad_med,0x88);// 0x0240D2E4 // 136 , "N"
  8336. PQ_RegisterWrite(VIP_reg_slr_ds_sad_min1,0xff);// 0x0200D2E8 // 48 , "N"
  8337. PQ_RegisterWrite(VIP_reg_slr_ds_sad_min2,0x0);// 0x0200D2E9 // 0 , "N"
  8338. PQ_RegisterWrite(VIP_reg_slr_ds_sad_margin,0x18);// 0x0200D2EC // 24 , "N"
  8339. PQ_RegisterWrite(VIP_reg_slr_ds_sumsad_ratio,0x06);// 0x0100D2F0 // 6 , "N"
  8340. PQ_RegisterWrite(VIP_reg_slr_ds_sad_factor1,0x30);// 0x01C0D2F2 // 48 , "N"
  8341. PQ_RegisterWrite(VIP_reg_slr_ds_sad_factor2_1,0x5);// 0x01C0D2F3 // 5 , "N"
  8342. PQ_RegisterWrite(VIP_reg_slr_ds_sad_factor2_2,0x20);// 0x01C0D2F4 // 32 , "N"
  8343. PQ_RegisterWrite(VIP_reg_slr_ds_sad_factor3,0x4);// 0x01C0D2F5 // 4 , "N"
  8344. PQ_RegisterWrite(VIP_reg_slr_ds_sad_factor4_1,0x1);// 0x0100D2F6 // 1 , "N"
  8345. PQ_RegisterWrite(VIP_reg_slr_ds_sad_factor4_2,0x2);// 0x0100D2F7 // 2 , "N"
  8346. PQ_RegisterWrite(VIP_reg_slr_ds_sad_factor3_lmt,0x18);// 0x0140D2F8 // 24 , "N"
  8347. PQ_RegisterWrite(VIP_reg_slr_ds_dis_subsad,0x01);// 0x0040D2F9 // 1 , "N"
  8348. PQ_RegisterWrite(VIP_reg_slr_ds_sad_ratio1,0x0a);// 0x0100D2FA // 10 , "N"
  8349. PQ_RegisterWrite(VIP_reg_slr_ds_sad_ratio2,0x06);// 0x0100D2FB // 6 , "N"
  8350. PQ_RegisterWrite(VIP_reg_slr_ds_sad_ratio3,0x02);// 0x0140D2FC // 2 , "N"
  8351. PQ_RegisterWrite(VIP_reg_slr_ds_sad_ratio4,0x08);// 0x0140D2FD // 8 , "N"
  8352. // PQ_RegisterWrite(VIP_reg_ds_disable_angle_sel,0x0);// 0x0040D2FE // 0 , "N"
  8353. // PQ_RegisterWrite(VIP_reg_ds_disable_func_en,0x0);// 0x0080D2FF // 0 , "N"
  8354. PQ_RegisterWrite(VIP_reg_slr_ds_dis_blending,0x0);// 0x0040D300 // 0 , "N"
  8355. // PQ_RegisterWrite(VIP_reg_slr_dscale_strong_edge_lp,0x0);// 0x0040D301 // 0 , "N"
  8356. PQ_RegisterWrite(VIP_reg_slr_dscale_cross_shoot_ctrl_taps,0x1);// 0x0080D302 // 1 , "N
  8357. PQ_RegisterWrite(VIP_reg_slr_dscale_other_shoot_ctrl_taps,0x1);// 0x0080D303 // 1 , "N
  8358. PQ_RegisterWrite(VIP_reg_slr_dbg_angle_en,0xffff);// 0x0400D308 // 65535 , "N"
  8359. PQ_RegisterWrite(VIP_reg_slr_dbg_dis_color,0x01000000);// 0x0040D30C // 0 , "N"
  8360. PQ_RegisterWrite(VIP_reg_slr_ds_sharp_gain_ctrl_tap,0x0);// 0x0040D31C // 0 , "E"
  8361. PQ_RegisterWrite(VIP_reg_slr_ds_salt_filter_en,0x07);// 0x00C0D330 // 7 , "N"
  8362. PQ_RegisterWrite(VIP_reg_slr_ds_salt_diff_th1,0x0a);// 0x0200D331 // 10 , "N"
  8363. PQ_RegisterWrite(VIP_reg_slr_ds_salt_diff_th2,0x05);// 0x0200D332 // 5 , "N"
  8364. PQ_RegisterWrite(VIP_reg_slr_ds_salt_diff_th3,0x05);// 0x0200D333 // 5 , "N"
  8365. PQ_RegisterWrite(VIP_reg_slr_ds_salt_comb_th,0x0);// 0x0240D334 // 0 , "N"
  8366. PQ_RegisterWrite(VIP_reg_slr_ds_salt_comb_slope,0x100);// 0x02C0D338 // 256 , "N"
  8367. PQ_RegisterWrite(VIP_reg_slr_ds_sad_noise_level,0x20);// 0x0200D358 // 35 , "N"
  8368. PQ_RegisterWrite(VIP_reg_slr_ds_border_h_en,0x0);// 0x0040D364 // 0 , "N"
  8369. PQ_RegisterWrite(VIP_reg_slr_ds_border_h_th,0x04);// 0x0100D365 // 4 , "N"
  8370. PQ_RegisterWrite(VIP_reg_slr_ds_border_v_en,0x0);// 0x0040D366 // 0 , "N"
  8371. PQ_RegisterWrite(VIP_reg_slr_ds_border_v_th,0x03);// 0x0100D367 // 3 , "N"
  8372. PQ_RegisterWrite(VIP_reg_slr_ds_dis_min_diff,0x0);// 0x0040D368 // 0 , "N"
  8373. PQ_RegisterWrite(VIP_reg_slr_ds_cond1_sel1,0x01);// 0x0040D36A // 1 , "N"
  8374. PQ_RegisterWrite(VIP_reg_slr_ds_cond1_sel2,0x01);// 0x0040D36B // 1 , "N"
  8375. PQ_RegisterWrite(VIP_reg_slr_ds_neg_factor1,0x01);// 0x0040D36C // 1 , "N"
  8376. PQ_RegisterWrite(VIP_reg_slr_ds_cross_blend,0x1);// 0x0040D36E // 1 , "N"
  8377. PQ_RegisterWrite(VIP_reg_slr_ds_dis_74d,0x0);// 0x0040D36F // 0 , "N"
  8378. PQ_RegisterWrite(VIP_reg_slr_ds_dis_74_sum,0x1);// 0x0041D36F // 0 , "N"
  8379. PQ_RegisterWrite(VIP_reg_slr_ds_sumsad_limit,0x1);// 0x0042D36F // 1 , "N"
  8380. PQ_RegisterWrite(VIP_reg_slr_ds_sharp_gain_ctrl_tap_c,0x0);// 0x0040D41C // 0 , "E"
  8381. PQ_RegisterWrite(VIP_reg_slr_ds_sharp_gain_ctrl_tap_c,0x0);// 0x0040D41C // 0 , "E"
  8382. //531 settings
  8383. if(VIP_IsATVSource())
  8384. {
  8385. PQ_RegisterWrite(VIP_reg_slr_ds_ultra_sharp ,0x0);// 0x0100D36D // 15 , "N"
  8386. PQ_RegisterWrite(VIP_reg_slr_h_salt_fil_th ,0x1);
  8387. }
  8388. else
  8389. {
  8390. PQ_RegisterWrite(VIP_reg_slr_ds_ultra_sharp ,0x0f);// 0x0100D36D // 15 , "N"
  8391. PQ_RegisterWrite(VIP_reg_slr_h_salt_fil_th ,0x10);
  8392. }
  8393. if(VIP_GetInputVSize()<=576)
  8394. PQ_RegisterWrite(VIP_reg_slr_ds_full_angle,0x0);
  8395. else
  8396. PQ_RegisterWrite(VIP_reg_slr_ds_full_angle,0x1);
  8397. //Temp settings for 533
  8398. if(VIP_IsATVSource())
  8399. {
  8400. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_0_post ,0x20); //0x0200DF0C
  8401. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_1_post ,0x40); //0x0200DF10
  8402. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_2_post ,0x40); //0x0200DF14
  8403. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_2 ,0xf0); //0x0200DD14
  8404. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_1 ,0xf0); //0x0200DD10
  8405. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_0 ,0x60); //0x0200DD0C
  8406. //PQ_RegisterWrite(VIP_reg_slr_2d_l_scale ,0x01); //0x0080DD54
  8407. }
  8408. else
  8409. {
  8410. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_0_post ,0x40); //0x0200DF0C
  8411. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_1_post ,0x80); //0x0200DF10
  8412. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_2_post ,0x80); //0x0200DF14
  8413. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_2 ,0x80); //0x0200DD14
  8414. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_1 ,0x80); //0x0200DD10
  8415. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_0 ,0x40); //0x0200DD0C
  8416. /*if(VIP_IsSCARTSource() && VIP_IsAVSource())
  8417. {
  8418. PQ_RegisterWrite(VIP_reg_slr_2d_l_scale, 0x00); //#40517 & #40758
  8419. }
  8420. else if (VIP_IsAVSource())
  8421. {
  8422. if (VIP_GetStdColorSystem() >= CVD2_STD_PAL_IBGDK && VIP_GetStdColorSystem() <= CVD2_STD_SECAM)
  8423. {
  8424. PQ_RegisterWrite(VIP_reg_slr_2d_l_scale, 0x0); //#40758
  8425. }
  8426. else
  8427. {
  8428. PQ_RegisterWrite(VIP_reg_slr_2d_l_scale, 0x01); //#40758
  8429. }
  8430. }
  8431. else if (VIP_GetUserSource() == SOURCE_HDMI || ((VIP_GetUserSource() == SOURCE_EXTS || VIP_IsPCSource()) && VIP_GetInputVSize() > 700))
  8432. {
  8433. PQ_RegisterWrite(VIP_reg_slr_2d_l_scale, 0x01); //#40619 & #40860 & #41344
  8434. }
  8435. else if (VIP_IsSVSource())
  8436. {
  8437. PQ_RegisterWrite(VIP_reg_slr_2d_l_scale, 0x00); //#40955
  8438. }
  8439. else if (VIP_IsSourceDTV() || VIP_IsATVSource())
  8440. {
  8441. //PQ_RegisterWrite(VIP_reg_slr_2d_l_scale, 0x01); //0x0080DD54 ; #42964 controlled by VIP Table
  8442. }
  8443. else
  8444. {
  8445. PQ_RegisterWrite(VIP_reg_slr_2d_l_scale, 0x02); //0x0080DD54
  8446. } */
  8447. }
  8448. }
  8449. void PQ_SLR_ColorBarDetailSet(void)
  8450. {
  8451. UINT32 CaptureWindowSize=0;
  8452. CaptureWindowSize = (PQ_RegisterRead(VIP_reg_adix_che) - PQ_RegisterRead(VIP_reg_adix_chs))*(PQ_RegisterRead(VIP_reg_adix_cve) - PQ_RegisterRead(VIP_reg_adix_cvs));
  8453. PQ_RegisterWrite(VIP_reg_slr_valid_bin_th , ((4*CaptureWindowSize)/100)); //sonyPQ(NTSC) 720P colorbar 5 to 4
  8454. PQ_RegisterWrite(VIP_reg_slr_gray_bin_th , ((5*CaptureWindowSize)/10));
  8455. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_color ,0);
  8456. PQ_RegisterWrite(VIP_reg_slr_null_bin_th ,0x100);
  8457. if (VIP_GetUserSource() == EXTS && !VIP_IsPCSource())
  8458. PQ_RegisterWrite(VIP_reg_slr_detail_bin_th , ((7*CaptureWindowSize)/10));
  8459. else
  8460. PQ_RegisterWrite(VIP_reg_slr_detail_bin_th , ((5*CaptureWindowSize)/10));
  8461. PQDebugPrint("\033[1m\033[40;35m%s:CaptureWindowSize = %d\033[0m\n", __FUNCTION__,CaptureWindowSize);
  8462. PQDebugPrint("\033[1m\033[40;35m%s:VIP_reg_slr_valid_bin_th = %d\033[0m\n", __FUNCTION__,PQ_RegisterRead(VIP_reg_slr_valid_bin_th));
  8463. PQDebugPrint("\033[1m\033[40;35m%s:VIP_reg_slr_detail_bin_th = %d\033[0m\n", __FUNCTION__,PQ_RegisterRead(VIP_reg_slr_detail_bin_th));
  8464. PQDebugPrint("\033[1m\033[40;35m%s:VIP_reg_slr_gray_bin_th = %d\033[0m\n", __FUNCTION__,PQ_RegisterRead(VIP_reg_slr_gray_bin_th));
  8465. }
  8466. void PQ_DeinterlaceFilter(void)
  8467. {
  8468. PQHW_CONTEXT* pHwContext= &PQHwContext;
  8469. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  8470. INT32 Val1,Val2,Val3;
  8471. UINT8 ucTableIndex;
  8472. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  8473. DEIN_FILTER_DATA *pDEIN_FILTER_DATA;
  8474. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  8475. if (pVtab->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex] >= 8) return;
  8476. ucTableIndex = pVtab->mDeinterlaceFilter.mGroupedIndex[ucCurrSrcIndex];
  8477. pDEIN_FILTER_DATA = &pVtab->mDeinterlaceFilter.mDeIN_Fil_Data[ucTableIndex];
  8478. if( VIP_GetInputHSize()>=1900 )
  8479. {
  8480. Val1 = pDEIN_FILTER_DATA->hd_vdi_mad_hlp_en;
  8481. Val2 = pDEIN_FILTER_DATA->hd_slr_mix_ach;
  8482. Val3 = pDEIN_FILTER_DATA->hd_slr_mix_bch;
  8483. }
  8484. else if( VIP_GetInputHSize()<800 )
  8485. {
  8486. Val1 = pDEIN_FILTER_DATA->sd_vdi_mad_hlp_en;
  8487. Val2 = pDEIN_FILTER_DATA->sd_slr_mix_ach;
  8488. Val3 = pDEIN_FILTER_DATA->sd_slr_mix_bch;
  8489. }
  8490. else
  8491. {
  8492. Val1 = pDEIN_FILTER_DATA->md_vdi_mad_hlp_en;
  8493. Val2 = pDEIN_FILTER_DATA->md_slr_mix_ach;
  8494. Val3 = pDEIN_FILTER_DATA->md_slr_mix_bch;
  8495. }
  8496. PQ_RegisterWrite(VIP_reg_vdi_mad_hlp_en, Val1);
  8497. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_ach, Val2);
  8498. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_bch, Val3);
  8499. #if 0
  8500. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_ach, 2);
  8501. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_bch, 2);
  8502. #else
  8503. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_ach, VIP_IsATVSource()?3:2);
  8504. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_bch, VIP_IsATVSource()?3:2);
  8505. #endif
  8506. #if 0
  8507. if(VIP_GetUserSource()==SOURCE_HDMI && pHwContext->cInterlaceMode)
  8508. {
  8509. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_ach, 1);
  8510. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_bch, 1);
  8511. }
  8512. #endif
  8513. PQ_ConditionSetting(MODE_DeinterlaceFilter); //#48358
  8514. PQ_RegisterWrite(VIP_reg_slr_mix_vedge_acw_en ,0);
  8515. PQ_RegisterWrite(VIP_reg_slr_mix_vedge_acw_sel ,0);
  8516. PQ_RegisterWrite(VIP_reg_slr_mix_vedge_bw_en ,0);
  8517. PQ_RegisterWrite(VIP_reg_slr_mix_vedge_bw_sel ,0);
  8518. PQ_RegisterWrite(VIP_reg_slr_mix_vedge_mbw_en ,0);
  8519. PQ_RegisterWrite(VIP_reg_slr_mix_vedge_mbw_sel ,0);
  8520. }
  8521. VTAB_SRC_VALUE_DEFINE* PQ_GetSourceVTab(UINT8 ucSource, UINT8 ucSubSource)
  8522. {
  8523. PQHW_CONTEXT* pHwContext= &PQHwContext;
  8524. VTAB_SRC_VALUE_DEFINE* pVtab= &pHwContext->VtabSrcValue[0];
  8525. VTAB_CMN_VALUE_DEFINE* pVtabCmnValue= &pHwContext->VtabCmnValue;
  8526. switch(ucSource)
  8527. {
  8528. case EXTS:
  8529. if( ucSubSource==YPP1 || ucSubSource==YPP2)
  8530. {
  8531. if(PQ_GetDefinitionIndex())
  8532. {
  8533. pVtab= &pHwContext->VtabSrcValue[VTAB_EXTS_YPP_HD_VALUE-VTAB_EXTS_YPP_VALUE]; //YPP_HD
  8534. }
  8535. else
  8536. {
  8537. pVtab= &pHwContext->VtabSrcValue[0]; //YPP
  8538. }
  8539. #if SEPERATE_YPBPR1_YPBPR2
  8540. if(ucSubSource==YPP2 && VIP_JudgeDVDSource())
  8541. {
  8542. if(PQ_GetDefinitionIndex())
  8543. {
  8544. pVtab= &pHwContext->VtabSrcValue[VTAB_EXTS_YPP2_HD_VALUE-VTAB_EXTS_YPP_VALUE]; //YPP2_HD(DVD)
  8545. }
  8546. else
  8547. {
  8548. pVtab= &pHwContext->VtabSrcValue[VTAB_EXTS_YPP2_SD_VALUE-VTAB_EXTS_YPP_VALUE]; //YPP2_SD(DVD)
  8549. }
  8550. }
  8551. #endif
  8552. }
  8553. else if( ucSubSource==DSUB )
  8554. {
  8555. pVtab= &pHwContext->VtabSrcValue[VTAB_EXTS_RGB_VALUE-VTAB_EXTS_YPP_VALUE]; //RGB
  8556. }
  8557. if(ucSubSource==SCART_RGB1)
  8558. {
  8559. PQDebugPrint("%s: load %s table",__FUNCTION__, pVtabCmnValue->ucLoadScartRGBTab?"Scart RGB":"YPP");
  8560. if(pVtabCmnValue->ucLoadScartRGBTab)
  8561. {
  8562. pVtab= &pHwContext->VtabSrcValue[VTAB_SCART_RGB_VALUE-VTAB_EXTS_YPP_VALUE];//SCART_RGB
  8563. }
  8564. else
  8565. {
  8566. pVtab= &pHwContext->VtabSrcValue[VTAB_EXTS_YPP_VALUE-VTAB_EXTS_YPP_VALUE];//YPP
  8567. }
  8568. }
  8569. break;
  8570. case CVD2:
  8571. if( ucSubSource==TV_INPUT_CHANNEL )
  8572. {
  8573. pVtab= &pHwContext->VtabSrcValue[VTAB_CVD2_TV_VALUE-VTAB_EXTS_YPP_VALUE];
  8574. }
  8575. else if( ucSubSource==AV1_INPUT_CHANNEL || ucSubSource==AV2_INPUT_CHANNEL || ucSubSource==AV3_INPUT_CHANNEL )
  8576. {
  8577. pVtab= &pHwContext->VtabSrcValue[VTAB_CVD2_AV_VALUE-VTAB_EXTS_YPP_VALUE];
  8578. }
  8579. if( ucSubSource==S1_INPUT_CHANNEL || ucSubSource==S2_INPUT_CHANNEL || ucSubSource==S3_INPUT_CHANNEL )
  8580. {
  8581. pVtab= &pHwContext->VtabSrcValue[VTAB_CVD2_SV_VALUE-VTAB_EXTS_YPP_VALUE];
  8582. }
  8583. break;
  8584. case MPEG:
  8585. if(PQ_GetDefinitionIndex())
  8586. {
  8587. pVtab= &pHwContext->VtabSrcValue[VTAB_MPEG_HD_VALUE-VTAB_EXTS_YPP_VALUE]; //MPEG_HD
  8588. }
  8589. else
  8590. {
  8591. pVtab= &pHwContext->VtabSrcValue[VTAB_MPEG_VALUE-VTAB_EXTS_YPP_VALUE]; //MPEG_SD
  8592. }
  8593. if(VIP_IsNetworkSource())
  8594. {
  8595. pVtab= &pHwContext->VtabSrcValue[VTAB_MPEG_VALUE-VTAB_EXTS_YPP_VALUE]; //MPEG_SD
  8596. }
  8597. break;
  8598. case HDMI:
  8599. if(VIP_RunDVIMode())
  8600. {
  8601. pVtab= &pHwContext->VtabSrcValue[VTAB_EXTS_RGB_VALUE-VTAB_EXTS_YPP_VALUE];
  8602. }
  8603. else
  8604. {
  8605. if(PQ_GetDefinitionIndex())
  8606. {
  8607. pVtab= &pHwContext->VtabSrcValue[VTAB_HDMI_HD_VALUE-VTAB_EXTS_YPP_VALUE]; //HDMI_HD
  8608. }
  8609. else
  8610. {
  8611. pVtab= &pHwContext->VtabSrcValue[VTAB_HDMI_VALUE-VTAB_EXTS_YPP_VALUE]; //HDMI_SD
  8612. }
  8613. }
  8614. break;
  8615. case JPEG:
  8616. case PATN:
  8617. pVtab= &pHwContext->VtabSrcValue[VTAB_EXTS_RGB_VALUE-VTAB_EXTS_YPP_VALUE];
  8618. break;
  8619. }
  8620. return pVtab;
  8621. }
  8622. void PQ_DeblockFilterAndDetect(BOOL bDemoMode, UINT32 vdi_hsize_i, UINT32 vdi_vsize)
  8623. {
  8624. UINT32 vdi_hds,vdi_ne_total;
  8625. UINT32 vdi_hsize;
  8626. BOOL bNrEnable;
  8627. BOOL bDeblockEnable;
  8628. UINT8 ucTmp;
  8629. PQHW_CONTEXT* pHwContext = &PQHwContext;
  8630. //set ne estimate
  8631. vdi_hds= bDemoMode ? PQ_RegisterRead(VIP_reg_vdi_tnr_dbg_offset): 0;
  8632. vdi_hsize= vdi_hsize_i - vdi_hds;
  8633. vdi_ne_total= vdi_hsize * vdi_vsize;
  8634. bNrEnable= (pHwContext->nMPEGNRLevel>OFF) ? ENABLE : DISABLE;
  8635. bNrEnable= (bNrEnable) && (!VIP_IsPCSource() && !VIP_RunDVIMode());
  8636. bDeblockEnable=(!VIP_IsPCSource()) && (!VIP_RunDVIMode());
  8637. //## horizontal detection and filter enable
  8638. //0x4128
  8639. PQ_RegisterWrite(VIP_reg_gfx_dbk_en, bNrEnable && bDeblockEnable);
  8640. PQ_RegisterWrite(VIP_reg_gfx_dbk_fil_en, bNrEnable);// && (pHwContext->cInputDataFormat!=RGB));
  8641. PQ_RegisterWrite(VIP_reg_gfx_dbk_filc_en, 1);
  8642. PQ_RegisterWrite(VIP_reg_gfx_dbk_lp_sel, 0);
  8643. PQ_RegisterWrite(VIP_reg_gfx_dbk_fil_dbg_en, 0);
  8644. PQ_RegisterWrite(VIP_reg_gfx_dbk_ratio_dis, 0);
  8645. PQ_RegisterWrite(VIP_reg_gfx_maxedgeh_th, vdi_ne_total/ 225);
  8646. PQ_RegisterWrite(VIP_reg_gfx_maxedgeh_ratio_th, 3);
  8647. PQ_RegisterWrite(VIP_reg_gfx_maxedgeh_scale_th, 0x2fff);
  8648. PQ_RegisterWrite(VIP_reg_gfx_blockedgeh_fil_th_min, VIP_GetUserSource() == SOURCE_MPEG?0:2);
  8649. PQ_RegisterWrite(VIP_reg_gfx_maxedgeh2_minth, 0xc);
  8650. PQ_RegisterWrite(VIP_reg_gfx_dbk_hdiff_th3, 0x8);
  8651. //## vertical deblock detection and filter
  8652. PQ_RegisterWrite(VIP_reg_vdi_maxedgev_ratio_th, 16);
  8653. PQ_RegisterWrite(VIP_reg_vdi_maxedgev_th, vdi_ne_total/348);
  8654. //0x6060
  8655. PQ_VDeblockFilterEnable();
  8656. PQ_RegisterWrite(VIP_reg_vdi_dbk_ratio_dis, 0);
  8657. PQ_RegisterWrite(VIP_reg_vdi_dbk_vqh_dis, 1);
  8658. PQ_RegisterWrite(VIP_reg_vdi_dbk_vdet_4tap, 1);
  8659. PQ_RegisterWrite(VIP_reg_vdi_dbk_vfil_minth, 0);
  8660. PQ_RegisterWrite(VIP_reg_vdi_dbk_vfil_maxth, 0xff);
  8661. PQ_RegisterWrite(VIP_reg_vdi_dbk_hmot_th, (vdi_ne_total* 15)/ 100);
  8662. PQ_RegisterWrite(VIP_reg_vdi_dbk_mot_th, (vdi_ne_total* 5)/ 100);
  8663. //330
  8664. ucTmp = PQ_RegisterRead(VIP_reg_gfx_dbk_mode_force);
  8665. if(abs(VIP_GetInputVSize() -1080)<10)
  8666. PQ_RegisterWrite(VIP_reg_gfx_dbk_mode_force , ucTmp&(~0x4));
  8667. else
  8668. PQ_RegisterWrite(VIP_reg_gfx_dbk_mode_force , ucTmp|0x4);
  8669. //PQ_RegisterWrite(VIP_reg_gfx_blockedgeh_minth, 0x3);//SonyPQ Menu vertical border discontinuity
  8670. PQ_RegisterWrite(VIP_reg_gfx_blockedgeh_minth, 0x9);//HiVi Case#20 H Line resolution blur
  8671. }
  8672. void PQ_HmeSetup(UINT32 vdi_hsize_i, UINT32 vdi_vsize)
  8673. {
  8674. //new mad setting for kw
  8675. if(VIP_GetInterlaceMode())
  8676. {
  8677. UINT32 slr_hds, slr_hde,slr_vds,slr_vde,hme_height, tmp, vdi_hds, vdi_hde, vdi_vds, vdi_vde, gmv_vds, gmv_vde;
  8678. //disable full screen hme to avoid 330C,HDMI-480i,2d>3d,MEMC Disk->MovingPlaneBuildings,�ؿv���|�ö}
  8679. /*
  8680. if( (VIP_GetUserSource() == SOURCE_CVD2&& !VIP_IsATVSource() && abs(pHwContext->ulInputHSize-720)<50 ) || (VIP_GetUserSource() == SOURCE_HDMI&& pHwContext->ulInputHSize<=720 ))
  8681. {
  8682. slr_hds = 2 ;
  8683. slr_hde = 2*(vdi_hsize_i-1)+1;
  8684. slr_vds = 5;
  8685. slr_vde = 2*(vdi_vsize-2)-1;
  8686. #if VIP_FLIP_FUN
  8687. if(VIP_GetPanelInvert())
  8688. {
  8689. tmp = slr_hds;
  8690. slr_hds = vdi_hsize_i - slr_hde;
  8691. slr_hde = vdi_hsize_i - tmp;
  8692. tmp = slr_vds;
  8693. slr_vds = vdi_vsize - slr_vde;
  8694. slr_vde = vdi_vsize - tmp;
  8695. }
  8696. #endif
  8697. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_en, 1);
  8698. PQ_RegisterWrite(VIP_reg_slr_hme_rgn_en, 1);
  8699. PQ_RegisterWrite(VIP_reg_vdi_mad_hme_det_hs, 1);
  8700. PQ_RegisterWrite(VIP_reg_vdi_mad_hme_det_he, vdi_hsize_i-1);
  8701. PQ_RegisterWrite(VIP_reg_vdi_mad_hme_det_vs, 1);
  8702. PQ_RegisterWrite(VIP_reg_vdi_mad_hme_det_ve, vdi_vsize-1);
  8703. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_det_vs, 2);
  8704. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_det_ve, vdi_vsize-2);
  8705. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_r_cnt_h, 100);
  8706. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_r_cnt_m, 100);
  8707. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_r_cnt_l, 100);
  8708. PQ_RegisterWrite(VIP_reg_slr_hme_hds, slr_hds);
  8709. PQ_RegisterWrite(VIP_reg_slr_hme_hde, slr_hde);
  8710. PQ_RegisterWrite(VIP_reg_slr_hme_vds, slr_vds);
  8711. PQ_RegisterWrite(VIP_reg_slr_hme_vde, slr_vde);
  8712. PQ_RegisterWrite(VIP_reg_slr_gmv_comb_en, 1);
  8713. PQ_RegisterWrite(VIP_reg_slr_gmv_comb_th, 0);
  8714. }
  8715. else */
  8716. if(VIP_IsATVSource() || VIP_IsAVSource() || (VIP_GetUserSource()==SOURCE_HDMI && (VIP_GetInputVSize() <= (480+24))) || (VIP_IsSourceDTV() && PQ_GetDefinitionIndex() != PQ_HIGH_DEFINITION))
  8717. {
  8718. slr_hds = 2 ;
  8719. slr_hde = vdi_hsize_i-2;
  8720. hme_height = vdi_vsize/4;
  8721. slr_vds = 2*(vdi_vsize-hme_height)+3;
  8722. slr_vde = 2*(vdi_vsize-2)-1;
  8723. vdi_hds = 180;
  8724. vdi_hde = vdi_hsize_i - 180;
  8725. vdi_vds = vdi_vsize - hme_height + 1;
  8726. vdi_vde = vdi_vsize -1;
  8727. gmv_vds = vdi_vsize - hme_height;
  8728. gmv_vde = vdi_vsize - 2;
  8729. #if VIP_FLIP_FUN
  8730. if(VIP_GetPanelInvert() == HV_FLIP || VIP_GetPanelInvert() == V_FLIP)
  8731. {
  8732. tmp = slr_hds;
  8733. slr_hds = vdi_hsize_i - slr_hde;
  8734. slr_hde = vdi_hsize_i - tmp;
  8735. tmp = slr_vds;
  8736. //slr_vds = 2*vdi_vsize - slr_vde;
  8737. slr_vds = 2*vdi_vsize - slr_vde+1;//20130102 CJ&KW--GME window setup
  8738. //slr_vde = 2*vdi_vsize - tmp;
  8739. slr_vde = 2*vdi_vsize - tmp-3;//20130102 CJ&KW--GME window setup
  8740. if((*((UINT8*)(0xbe0b0080)) & 0x04) == 0x4) //VDI HME window adjusted only when source already invert(ex. invert by VOF)
  8741. {
  8742. vdi_vds = 1;
  8743. vdi_vde = hme_height -1;
  8744. gmv_vds = 0;
  8745. gmv_vde = hme_height - 2;
  8746. }
  8747. }
  8748. #endif
  8749. PQ_RegisterWrite(VIP_reg_vdi_mad_hme_det_hs, vdi_hds);
  8750. PQ_RegisterWrite(VIP_reg_vdi_mad_hme_det_he, vdi_hde);
  8751. PQ_RegisterWrite(VIP_reg_vdi_mad_hme_det_vs, vdi_vds);
  8752. PQ_RegisterWrite(VIP_reg_vdi_mad_hme_det_ve, vdi_vde);
  8753. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_det_vs, gmv_vds);
  8754. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_det_ve, gmv_vde);
  8755. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_r_minus, 0);
  8756. PQ_RegisterWrite(VIP_reg_vdi_mad_hme_ambg_th, 8192);
  8757. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_vldcnt_th,3);
  8758. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_r_cnt_h, 2);
  8759. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_r_cnt_m, 2);
  8760. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_r_cnt_l, 2);
  8761. PQ_RegisterWrite(VIP_reg_slr_hme_hds, slr_hds);
  8762. PQ_RegisterWrite(VIP_reg_slr_hme_hde, slr_hde);
  8763. PQ_RegisterWrite(VIP_reg_slr_hme_vds, slr_vds);
  8764. PQ_RegisterWrite(VIP_reg_slr_hme_vde, slr_vde);
  8765. /*
  8766. PQ_RegisterWrite(VIP_reg_slr_hme_hds, 2);
  8767. PQ_RegisterWrite(VIP_reg_slr_hme_hde, VIP_GetScalerPreScaleH()-2);
  8768. PQ_RegisterWrite(VIP_reg_slr_hme_vds, 2*(vdi_vsize-28)+1);
  8769. PQ_RegisterWrite(VIP_reg_slr_hme_vde, 2*(vdi_vsize-2)-1);
  8770. */
  8771. PQ_RegisterWrite(VIP_reg_slr_gmv_comb_en, 1);
  8772. PQ_RegisterWrite(VIP_reg_slr_gmv_comb_th, 0);
  8773. PQ_RegisterWrite(VIP_reg_slr_gmv_hedge_th,0x8);
  8774. if(VIP_IsSourceDTV() || ((VIP_IsATVSource() || VIP_IsAVSource()) && (VIP_GetStdColorSystem()==CVD2_STD_PAL_IBGDK)))
  8775. {
  8776. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_en, 1);
  8777. PQ_RegisterWrite(VIP_reg_slr_hme_rgn_en, 1);
  8778. PQ_HmeDeMesh(ENABLE);
  8779. }
  8780. else if((VIP_GetUserSource()==SOURCE_HDMI && (VIP_GetInputVSize() <= (480+24))) || ((VIP_IsATVSource() || VIP_IsAVSource()) && (VIP_GetStdColorSystem()==CVD2_STD_NTSC_M)))
  8781. {
  8782. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_en, 0);
  8783. PQ_RegisterWrite(VIP_reg_slr_hme_rgn_en, 0);
  8784. PQ_HmeDeMesh(DISABLE);
  8785. }
  8786. else
  8787. {
  8788. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_en, 0);
  8789. PQ_RegisterWrite(VIP_reg_slr_hme_rgn_en, 0);
  8790. PQ_HmeDeMesh(DISABLE);
  8791. }
  8792. }
  8793. else
  8794. {
  8795. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_en, 0);
  8796. PQ_RegisterWrite(VIP_reg_slr_hme_rgn_en, 0);
  8797. PQ_HmeDeMesh(DISABLE);
  8798. }
  8799. }
  8800. else
  8801. {
  8802. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_en, 0);
  8803. PQ_RegisterWrite(VIP_reg_slr_hme_rgn_en, 0);
  8804. PQ_HmeDeMesh(DISABLE);
  8805. }
  8806. }
  8807. void PQ_HmeControl(void)
  8808. {
  8809. UINT32 motionFlag=0;
  8810. static int flagcount=0;
  8811. if ((VIP_IsATVSource() || VIP_IsAVSource()) && (VIP_GetStdColorSystem()==CVD2_STD_PAL_IBGDK))
  8812. {
  8813. motionFlag = PQ_GetMotionStatus();
  8814. if (motionFlag==0 && flagcount==150)
  8815. {
  8816. if (VIP_IsATVSource())
  8817. {
  8818. mips1_byte_nodelay(0xbe1cd685, 0xf); //r_slr_hme_mesh_slop
  8819. }
  8820. else
  8821. {
  8822. mips1_byte_nodelay(0xbe1cd685, 0x8); //r_slr_hme_mesh_slop
  8823. }
  8824. mips1_byte_nodelay(0xbe1cD684, 0x68); //r_slr_hme_mesh_yoff
  8825. mips1_byte_nodelay(0xbe1cD683, 0xa0); //r_slr_hme_mesh_xoff
  8826. mips1_byte_nodelay(0xbe1cD682, 0x30); //r_slr_hme_mesh_hedg_max
  8827. mips1_byte_nodelay(0xbe1cD681, 0xf); //r_slr_hme_mesh_hedg_gain
  8828. flagcount=0;
  8829. }
  8830. else if (motionFlag==1 && flagcount==75)
  8831. {
  8832. if (VIP_IsATVSource())
  8833. {
  8834. mips1_byte_nodelay(0xbe1cd685, 0x9); //r_slr_hme_mesh_slop
  8835. }
  8836. else
  8837. {
  8838. mips1_byte_nodelay(0xbe1cd685, 0x4); //r_slr_hme_mesh_slop
  8839. }
  8840. mips1_byte_nodelay(0xbe1cD684, 0x40); //r_slr_hme_mesh_yoff
  8841. mips1_byte_nodelay(0xbe1cD683, 0xa0); //r_slr_hme_mesh_xoff
  8842. mips1_byte_nodelay(0xbe1cD682, 0x3c); //r_slr_hme_mesh_hedg_max
  8843. mips1_byte_nodelay(0xbe1cD681, 0xc); //r_slr_hme_mesh_hedg_gain
  8844. flagcount=76;
  8845. }
  8846. else if (motionFlag==1 && flagcount<=74)
  8847. {
  8848. if ( flagcount==74 && VIP_IsAVSource())
  8849. {
  8850. mips1_byte_nodelay(0xbe1cd685, 0x6); //r_slr_hme_mesh_slop
  8851. mips1_byte_nodelay(0xbe1cD684, 0x54); //r_slr_hme_mesh_yoff
  8852. }
  8853. flagcount++;
  8854. }
  8855. else if (motionFlag==0 && flagcount>=76)
  8856. {
  8857. if ( flagcount==76 && VIP_IsAVSource())
  8858. {
  8859. mips1_byte_nodelay(0xbe1cd685, 0x6); //r_slr_hme_mesh_slop
  8860. mips1_byte_nodelay(0xbe1cD684, 0x54); //r_slr_hme_mesh_yoff
  8861. }
  8862. flagcount++;
  8863. }
  8864. }
  8865. }
  8866. /**
  8867. * @brief : mainly for new ticker demesh function
  8868. *
  8869. * This function apply demesh function within the HME window, so only work while HME eable
  8870. *
  8871. * @param bEnable, 1 for enable function, 0 for disable function
  8872. * @return n/a
  8873. * @note : wait HW provide registre define data, and only enable in DTV(#47893) & ATV-PAL(#48698)
  8874. */
  8875. void PQ_HmeDeMesh(UINT8 bEnable)
  8876. {
  8877. if(bEnable)
  8878. {
  8879. mips1_byte_nodelay(0xbe1cD67C, 0x0); //r_slr_hme_mesh_diff_offset
  8880. mips1_byte_nodelay(0xbe1cD67D, 0x4); //r_slr_hme_mesh_diff_gain
  8881. mips1_byte_nodelay(0xbe1cD67E, 0x4); //r_slr_hme_mesh_same_offset
  8882. mips1_byte_nodelay(0xbe1cD67F, 0x8); //r_slr_hme_mesh_same_gain
  8883. mips1_byte_nodelay(0xbe1cD680, 0x8); //r_slr_hme_mesh_hedg_offset
  8884. mips1_byte_nodelay(0xbe1cD681, 0xf); //r_slr_hme_mesh_hedg_gain
  8885. mips1_byte_nodelay(0xbe1cD682, 0x30); //r_slr_hme_mesh_hedg_max
  8886. mips1_byte_nodelay(0xbe1cD683, 0xc0); //r_slr_hme_mesh_xoff
  8887. mips1_byte_nodelay(0xbe1cD684, 0x40); //r_slr_hme_mesh_yoff
  8888. if(VIP_IsATVSource() && (VIP_GetStdColorSystem()<=CVD2_STD_NTSC_M))
  8889. {
  8890. mips1_byte_nodelay(0xbe1cD685, 0x8); //r_slr_hme_mesh_slop
  8891. }
  8892. else if((VIP_IsAVSource() && (VIP_GetStdColorSystem()<=CVD2_STD_NTSC_M)) || (VIP_GetUserSource()==SOURCE_HDMI && (VIP_GetInputVSize() <= (480+24))))
  8893. {
  8894. mips1_byte_nodelay(0xbe1cD685, 0x8); //r_slr_hme_mesh_slop
  8895. mips1_byte_nodelay(0xbe1cD684, 0x30); //r_slr_hme_mesh_yoff
  8896. mips1_byte_nodelay(0xbe1cD681, 0x1f); //r_slr_hme_mesh_hedg_gain
  8897. }
  8898. else
  8899. {
  8900. mips1_byte_nodelay(0xbe1cD685, 0x2); //r_slr_hme_mesh_slop
  8901. }
  8902. mips1_byte_nodelay(0xbe1cd686, 0x1); //reg_slr_hme_mesh_en
  8903. }
  8904. else
  8905. {
  8906. mips1_byte_nodelay(0xbe1cd686, 0x0); //reg_slr_hme_mesh_en
  8907. }
  8908. }
  8909. void PQ_TpwControl(void)
  8910. {
  8911. //for weave & bob issue
  8912. static int flagcount=0;
  8913. UINT32 ucvdi_field_diff_cnt_lp = PQ_RegisterRead(VIP_field_diff_cnt_lp);
  8914. static UINT32 VDIStaticCnt = 0;
  8915. UINT32 GrayFlag=0;
  8916. if( VIP_IsATVSource() && (VIP_GetStdColorSystem() >= CVD2_STD_PAL_IBGDK)) // ATV PAL, SECAM
  8917. {
  8918. if((ucvdi_field_diff_cnt_lp <= 0x5fff) && (ucvdi_field_diff_cnt_lp > 0x2ff) && (VDIStaticCnt < 30))
  8919. {
  8920. VDIStaticCnt ++;
  8921. }
  8922. else if((ucvdi_field_diff_cnt_lp <= 0xcfff) && (ucvdi_field_diff_cnt_lp > 0x5fff) && (VDIStaticCnt < 31))
  8923. {
  8924. flagcount=2;
  8925. VDIStaticCnt --;
  8926. }
  8927. else if((ucvdi_field_diff_cnt_lp <= 0x2ff) && (ucvdi_field_diff_cnt_lp > 0xff) && (VDIStaticCnt < 31))
  8928. {
  8929. flagcount=2;
  8930. VDIStaticCnt --;
  8931. }
  8932. else if(ucvdi_field_diff_cnt_lp > 0xcfff)
  8933. {
  8934. VDIStaticCnt --;
  8935. if (VDIStaticCnt < 20 && VDIStaticCnt > 1)
  8936. {
  8937. VDIStaticCnt=2;
  8938. flagcount=1;
  8939. }
  8940. }
  8941. else if(ucvdi_field_diff_cnt_lp <= 0xff && VDIStaticCnt < 31)
  8942. {
  8943. VDIStaticCnt --;
  8944. if (VDIStaticCnt < 20)
  8945. {
  8946. VDIStaticCnt=1;
  8947. }
  8948. }
  8949. }
  8950. else if( VIP_IsATVSource() && (VIP_GetStdColorSystem() < CVD2_STD_PAL_IBGDK)) // ATV NTSC
  8951. {
  8952. if((ucvdi_field_diff_cnt_lp <= 0x3fff) && (ucvdi_field_diff_cnt_lp > 0x2ff) && (VDIStaticCnt < 30))
  8953. {
  8954. VDIStaticCnt ++;
  8955. }
  8956. else if((ucvdi_field_diff_cnt_lp <= 0x9fff) && (ucvdi_field_diff_cnt_lp > 0x3fff) && (VDIStaticCnt < 31))
  8957. {
  8958. flagcount=2;
  8959. VDIStaticCnt --;
  8960. }
  8961. else if((ucvdi_field_diff_cnt_lp <= 0x2ff) && (ucvdi_field_diff_cnt_lp > 0xff) && (VDIStaticCnt < 31))
  8962. {
  8963. flagcount=2;
  8964. VDIStaticCnt --;
  8965. }
  8966. else if(ucvdi_field_diff_cnt_lp > 0x9fff)
  8967. {
  8968. VDIStaticCnt --;
  8969. if (VDIStaticCnt < 20 && VDIStaticCnt > 1)
  8970. {
  8971. VDIStaticCnt=2;
  8972. flagcount=1;
  8973. }
  8974. }
  8975. else if(ucvdi_field_diff_cnt_lp <= 0xff && VDIStaticCnt < 31)
  8976. {
  8977. VDIStaticCnt --;
  8978. if (VDIStaticCnt < 20)
  8979. {
  8980. VDIStaticCnt=1;
  8981. }
  8982. }
  8983. }
  8984. else // AV
  8985. {
  8986. if((ucvdi_field_diff_cnt_lp <= 0x6fff) && (ucvdi_field_diff_cnt_lp > 0x3ff) && (VDIStaticCnt < 30))
  8987. {
  8988. VDIStaticCnt ++;
  8989. }
  8990. else if((ucvdi_field_diff_cnt_lp <= 0xcfff) && (ucvdi_field_diff_cnt_lp > 0x6fff) && (VDIStaticCnt < 31))
  8991. {
  8992. flagcount=2;
  8993. VDIStaticCnt --;
  8994. }
  8995. else if((ucvdi_field_diff_cnt_lp <= 0x3ff) && (ucvdi_field_diff_cnt_lp > 0xff) && (VDIStaticCnt < 31))
  8996. {
  8997. flagcount=2;
  8998. VDIStaticCnt --;
  8999. }
  9000. else if(ucvdi_field_diff_cnt_lp > 0xcfff)
  9001. {
  9002. VDIStaticCnt --;
  9003. if (VDIStaticCnt < 20 && VDIStaticCnt > 1)
  9004. {
  9005. VDIStaticCnt=2;
  9006. flagcount=1;
  9007. }
  9008. }
  9009. else if(ucvdi_field_diff_cnt_lp <= 0xff && VDIStaticCnt < 31)
  9010. {
  9011. VDIStaticCnt --;
  9012. if (VDIStaticCnt < 20)
  9013. {
  9014. VDIStaticCnt=1;
  9015. }
  9016. }
  9017. }
  9018. if(VDIStaticCnt >= 30) VDIStaticCnt=30;
  9019. GrayFlag = PQ_PureColorPatternDetect(21);
  9020. if( VIP_IsAVSource() && (VIP_GetStdColorSystem() == CVD2_STD_PAL_IBGDK)) //#52938
  9021. {
  9022. if ( GrayFlag == 2 && VDIStaticCnt > 10 && flagcount <= 4)
  9023. {
  9024. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_yoff2, 4);
  9025. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_ach, 3);
  9026. flagcount=7;
  9027. return;
  9028. }
  9029. else if ( GrayFlag != 2 && VDIStaticCnt < 26 && flagcount == 7)
  9030. {
  9031. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_ach, 2);
  9032. flagcount=0;
  9033. }
  9034. else if (flagcount <= 2)
  9035. {
  9036. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_ach, 2);
  9037. }
  9038. }
  9039. if(VDIStaticCnt > 10 && (flagcount < 2 || flagcount >= 4)) // 2ff ~ 3fff
  9040. {
  9041. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_yoff2, 9);
  9042. flagcount=3;
  9043. }
  9044. else if(VDIStaticCnt < 20 && flagcount == 2) // ff ~ 2ff , 3fff ~ 9fff
  9045. {
  9046. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_yoff2, 9);
  9047. flagcount=4;
  9048. }
  9049. else if(VDIStaticCnt == 2 && flagcount == 1) // > 9fff
  9050. {
  9051. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_yoff2, 8);
  9052. flagcount=5;
  9053. }
  9054. else if(VDIStaticCnt == 1 && flagcount > 0 && flagcount < 6) // < ff
  9055. {
  9056. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_yoff2, 4);
  9057. flagcount=6;
  9058. }
  9059. }
  9060. UINT8 PQ_GetMotionStatus(void)
  9061. {
  9062. UINT32 ucvdi_mot_cnt = PQ_RegisterRead(VIP_vdi_mot_cnt);
  9063. UINT32 ucvdi_vdbk_sts = PQ_RegisterRead(VIP_vdi_vdbk_sts);
  9064. if(ucvdi_mot_cnt == 0 && ucvdi_vdbk_sts < 32) // ucvdi_vdbk_sts<32 mean ucvdi_field_diff_cnt_lp < thr
  9065. {
  9066. return STATIC_FRAME;
  9067. }
  9068. else
  9069. {
  9070. return MOTION_FRAME;
  9071. }
  9072. }
  9073. void PQ_CheckMotionStatusMethod2(BOOL reset)
  9074. {
  9075. PQHW_CONTEXT* pHwContext= &PQHwContext;
  9076. static UINT32 DiffCntSum[3] = {0};
  9077. static UINT8 i = 0;
  9078. if(reset)
  9079. {
  9080. pHwContext->VDIMotionStatusByMethod2 = STATIC_FRAME;
  9081. }
  9082. else
  9083. {
  9084. if(i >= 3)
  9085. {
  9086. i = 0;
  9087. }
  9088. DiffCntSum[i] = abs(PQ_RegisterRead(VIP_field_diff_cnt)-PQ_RegisterRead(VIP_field_diff_cnt_lp));
  9089. i++;
  9090. if((DiffCntSum[0]+DiffCntSum[1]+DiffCntSum[2]) > 4000) //the 4000 threshold depend on NR setting
  9091. {
  9092. pHwContext->VDIMotionStatusByMethod2 = MOTION_FRAME;
  9093. }
  9094. else
  9095. {
  9096. pHwContext->VDIMotionStatusByMethod2 = STATIC_FRAME;
  9097. }
  9098. //if((*((UINT8*)(0xbe1cd688))) == 0x19) myprintk("ucTempM = %d, diff_cnt = %d, diff_cnt_lp = %d, diff = %ld, sum = %d, motionflag = %d", ucTempM, PQ_RegisterRead(VIP_field_diff_cnt), PQ_RegisterRead(VIP_field_diff_cnt_lp), abs(PQ_RegisterRead(VIP_field_diff_cnt)-PQ_RegisterRead(VIP_field_diff_cnt_lp)), (DiffCntSum[0]+DiffCntSum[1]+DiffCntSum[2]), pHwContext->VDIMotionStatusByMethod2);
  9099. }
  9100. }
  9101. BOOL PQ_GetMotionStatusByMethod2(void)
  9102. {
  9103. PQHW_CONTEXT* pHwContext= &PQHwContext;
  9104. return pHwContext->VDIMotionStatusByMethod2;
  9105. }
  9106. void PQ_CheckMotionStatusMethod3(BOOL reset)
  9107. {
  9108. PQHW_CONTEXT* pHwContext= &PQHwContext;
  9109. static UINT32 VDIStaticCnt = 0;
  9110. UINT32 ucvdi_field_diff_cnt_lp = PQ_RegisterRead(VIP_field_diff_cnt_lp);
  9111. if(reset)
  9112. {
  9113. VDIStaticCnt = 0;
  9114. pHwContext->VDIMotionStatusByMethod3 = STATIC_FRAME;
  9115. }
  9116. else
  9117. {
  9118. if( VIP_IsATVSource() && (VIP_GetStdColorSystem() >= CVD2_STD_PAL_IBGDK)) // PAL & SECAM
  9119. {
  9120. if(ucvdi_field_diff_cnt_lp >= 0x2fff && VDIStaticCnt <30)
  9121. {
  9122. VDIStaticCnt++;
  9123. }
  9124. else if(ucvdi_field_diff_cnt_lp < 0x2fff && VDIStaticCnt > 0)
  9125. {
  9126. VDIStaticCnt--;
  9127. }
  9128. }
  9129. else if( VIP_IsATVSource() && (VIP_GetStdColorSystem() < CVD2_STD_PAL_IBGDK) ) // NTSC
  9130. {
  9131. if(ucvdi_field_diff_cnt_lp >= 0x2dff && VDIStaticCnt <30)
  9132. {
  9133. VDIStaticCnt++;
  9134. }
  9135. else if(ucvdi_field_diff_cnt_lp < 0x2dff && VDIStaticCnt > 0)
  9136. {
  9137. VDIStaticCnt--;
  9138. }
  9139. }
  9140. else if(VIP_IsSourceDTV() || VIP_IsAVSource())
  9141. {
  9142. if(ucvdi_field_diff_cnt_lp >= 0x1ff && VDIStaticCnt <30)
  9143. {
  9144. VDIStaticCnt++;
  9145. }
  9146. else if(ucvdi_field_diff_cnt_lp < 0x1ff && VDIStaticCnt > 0)
  9147. {
  9148. VDIStaticCnt--;
  9149. }
  9150. }
  9151. else
  9152. {
  9153. if(ucvdi_field_diff_cnt_lp >= 0xff && VDIStaticCnt <30)
  9154. {
  9155. VDIStaticCnt++;
  9156. }
  9157. else if(ucvdi_field_diff_cnt_lp < 0xff && VDIStaticCnt > 0)
  9158. {
  9159. VDIStaticCnt--;
  9160. }
  9161. }
  9162. if(VDIStaticCnt > 10)
  9163. {
  9164. pHwContext->VDIMotionStatusByMethod3 = MOTION_FRAME;
  9165. }
  9166. else
  9167. {
  9168. pHwContext->VDIMotionStatusByMethod3 = STATIC_FRAME;
  9169. }
  9170. }
  9171. }
  9172. BOOL PQ_GetMotionStatusByMethod3(void)
  9173. {
  9174. PQHW_CONTEXT* pHwContext= &PQHwContext;
  9175. return pHwContext->VDIMotionStatusByMethod3;
  9176. }
  9177. void PQ_SetMotioncond(void)
  9178. {
  9179. UINT32 ucvdi_mot_cnt = PQ_RegisterRead(VIP_vdi_mot_cnt);
  9180. if (ucvdi_mot_cnt < STATIC_FRAME_THRESHOLD)
  9181. {
  9182. PQ_RegisterWrite(VIP_reg_slr_motion_cond, 0);
  9183. }
  9184. else
  9185. {
  9186. PQ_RegisterWrite(VIP_reg_slr_motion_cond, 4);
  9187. }
  9188. }
  9189. //****************************************************************************
  9190. //
  9191. // Function : PQ_GmeEnableControl
  9192. // Params : none
  9193. // Description: enable /disable GME function in specific status
  9194. // Returns : void
  9195. // note :VIP_reg_vdi_mad_mcd_en must sync with VIP_reg_slr_gme_en
  9196. // 1. all color syste in CVD2 output within display and scan channel is 720 width in 533, the condiction VIP_GetScalerPreScaleH()<=720 will
  9197. // always true, mean GME will always enable in 533/CVD2, disable GME in CVD2 source to sync the behavior with 331
  9198. // 2. NOTE!!! VIP_reg_vdi_lb_c422in (6002[2] should set 0/1 sync with 6002[0] after 6710)
  9199. //
  9200. //****************************************************************************
  9201. void PQ_GmeEnableControl(void)
  9202. {
  9203. UINT8 ucUserSource;
  9204. UINT8 ucSubSource;
  9205. UINT8 ucSD;
  9206. UINT8 uDisableFlag = FALSE;
  9207. VIP_GetSource(&ucUserSource, &ucSubSource);
  9208. /*MPEG has MHEG5 it will cut edge cause the HD detect to SD, cause some video fuzzy. like mantis 0038744 */
  9209. if(ucUserSource == SOURCE_MPEG)
  9210. ucSD = (VIP_GetInputHSize()<=720 && VIP_GetInterlaceMode())?1:0;
  9211. else
  9212. ucSD = (VIP_GetScalerPreScaleH()<=720 && VIP_GetInterlaceMode())?1:0;
  9213. if(ucUserSource == SOURCE_MPEG|| ucUserSource == SOURCE_CVD2)
  9214. {
  9215. uDisableFlag = TRUE;
  9216. }
  9217. /*[20160328] close gme in dtv beacuse it has too many garbage issue in ff/fb when playing like mantis 35178/34491*/
  9218. if((ucSD) && !VIP_GetBobTopSt()&& (!uDisableFlag))// Set GME ON
  9219. {
  9220. PQ_RegisterWrite(VIP_reg_slr_gme_en, 1);
  9221. PQ_RegisterWrite(VIP_reg_vdi_mad_mcd_en, 1);// must sync with VIP_reg_slr_gme_en
  9222. }
  9223. else
  9224. {
  9225. PQ_RegisterWrite(VIP_reg_slr_gme_en, 0);
  9226. PQ_RegisterWrite(VIP_reg_vdi_mad_mcd_en, 0);// must sync with VIP_reg_slr_gme_en
  9227. }
  9228. if(ucUserSource == SOURCE_CVD2)
  9229. {
  9230. PQ_RegisterWrite(VIP_reg_vdi_lb_double_en, 0);
  9231. }
  9232. else
  9233. {
  9234. PQ_RegisterWrite(VIP_reg_vdi_lb_double_en, ucSD?1:0);
  9235. }
  9236. }
  9237. void PQ_GmeSetupWritePath(void)
  9238. {
  9239. if(((VIP_GetScalerPreScaleH()<=720 && VIP_GetInterlaceMode())) && !VIP_GetBobTopSt())
  9240. {
  9241. UINT8 ucSD;
  9242. UINT32 ulHsize, ulVsize;
  9243. ucSD = (VIP_GetScalerPreScaleH()<=720 && VIP_GetInterlaceMode())?1:0;
  9244. ulHsize = PQ_RegisterRead(VIP_reg_slr_out_width);//VIP_GetScalerPreScaleH();
  9245. ulVsize = PQ_Get_VDI_VSize();
  9246. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_comb_c1th1 ,((28000 *(( ulHsize * ulVsize*10) / (720 *480)))/10));
  9247. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_comb_c2th1 ,((7000* (( ulHsize * ulVsize*10) / (720 *480)))/10));
  9248. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_comb_c2th2 ,((500 * (( ulHsize * ulVsize*10) / (720 *480)))/10));
  9249. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_comb_c3th1 ,((38 * (( ulHsize * ulVsize*10) / (720 *480)))/10));
  9250. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_comb_th ,((1050 * (( ulHsize * ulVsize*10) / (720 *480)))/10));
  9251. PQ_RegisterWrite(VIP_reg_picx_ynx_en, 0); //chienjen
  9252. if((ucSD) && !VIP_GetBobTopSt())
  9253. {
  9254. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hsize , ulHsize/8);
  9255. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_0ve , ulVsize/6-1);
  9256. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_1ve ,(ulVsize/6-1) + ulVsize/6);
  9257. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_2ve ,(ulVsize/6-1) + ulVsize/6 * 2);
  9258. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_3ve ,(ulVsize/6-1) + ulVsize/6 * 3);
  9259. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_4ve ,(ulVsize/6-1) + ulVsize/6 * 4);
  9260. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_5ve , ulVsize-1);
  9261. }
  9262. }
  9263. PQ_GmeEnableControl();
  9264. }
  9265. void PQ_GmeSetupReadPath(void)
  9266. {
  9267. if(((VIP_GetScalerPreScaleH()<=720 && VIP_GetInterlaceMode())) && !VIP_GetBobTopSt())
  9268. {
  9269. UINT32 ulHsize, ulVsize;
  9270. ulHsize = PQ_RegisterRead(VIP_reg_slr_out_width);//VIP_GetScalerPreScaleH();
  9271. ulVsize = PQ_Get_VDI_VSize();
  9272. PQ_RegisterWrite(VIP_reg_slr_gme_block_hnum, ulHsize/8);
  9273. PQ_RegisterWrite(VIP_reg_slr_gme_block_hnum_last, ulHsize - 7*(ulHsize/8));
  9274. PQ_RegisterWrite(VIP_reg_slr_gme_block_vnum, ulVsize/6);
  9275. PQ_RegisterWrite(VIP_reg_slr_gme_block_vnum_last, ulVsize- 5*(ulVsize/6));
  9276. PQ_RegisterWrite(VIP_reg_slr_gme_mvx_limit, 9);
  9277. PQ_RegisterWrite(VIP_reg_slr_gme_ysht_pol, 1);
  9278. PQ_RegisterWrite(VIP_reg_slr_gme_mvx_pol, 0);
  9279. PQ_RegisterWrite(VIP_reg_slr_gme_mvy_pol, 1);
  9280. PQ_RegisterWrite(VIP_reg_slr_gme_sel_pol, 1);
  9281. PQ_RegisterWrite(VIP_reg_slr_gme_blend_sel, 0);
  9282. PQ_RegisterWrite(VIP_reg_slr_gme_mvcnt_yth, 10);
  9283. PQ_RegisterWrite(VIP_reg_slr_3field_diff_th, 0x100);
  9284. PQ_RegisterWrite(VIP_reg_slr_sd_3field_mix_en, 0);
  9285. }
  9286. PQ_RegisterWrite(VIP_reg_slr_sd_3field_en, 0);
  9287. }
  9288. void PQ_MADSetup(UINT32 vdi_hsize_i, UINT32 vdi_vsize, UINT32 vdi_total)
  9289. {
  9290. UINT32 rscomb_hsize,rscomb_vsize,rscomb_total;
  9291. //Enable all MAD function
  9292. //0x6070
  9293. //PQ_RegisterWrite(VIP_reg_vdi_mad_hlp_en, 1);
  9294. //PQ_RegisterWrite(VIP_reg_vdi_mad_tpc_en, 1);
  9295. PQ_RegisterWrite(VIP_reg_vdi_mad_mot_diff_dis, 1);
  9296. if((VIP_GetUserSource()==MPEG) && (VIP_GetInputResMode() == RESMODE_1920X1080) && (VIP_GetInterlaceMode()))
  9297. PQ_RegisterWrite(VIP_reg_vdi_mad_iir_en, 0);
  9298. else
  9299. PQ_RegisterWrite(VIP_reg_vdi_mad_iir_en, 1);
  9300. PQ_RegisterWrite(VIP_reg_vdi_mad_smw_en, 1);
  9301. // PQ_RegisterWrite(VIP_reg_vdi_mad_smw_sel, 1);
  9302. PQ_RegisterWrite(VIP_reg_vdi_mad_sb_iir_en, 1);
  9303. PQ_RegisterWrite(VIP_reg_vdi_mad_comb_en, 1);
  9304. //--------------------------------------------------------------------------------------------------
  9305. //0x6071
  9306. PQ_RegisterWrite(VIP_reg_vdi_mad_stc_en, 1);
  9307. PQ_RegisterWrite(VIP_reg_vdi_mad_dyn_en, 1);
  9308. PQ_RegisterWrite(VIP_reg_vdi_mad_mnr_det_en, 1);
  9309. PQ_RegisterWrite(VIP_reg_vdi_mad_mnr_fil_mth, 1);
  9310. PQ_RegisterWrite(VIP_reg_vdi_mad_32cmp_sel, 1);
  9311. PQ_RegisterWrite(VIP_reg_vdi_mad_comb_rgn_en, 1);
  9312. // PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_hfil_en, 0);
  9313. // PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_hfil_sel, 0);
  9314. //0x6072
  9315. PQ_RegisterWrite(VIP_reg_vdi_mad_loa_pol, 0);
  9316. PQ_RegisterWrite(VIP_reg_vdi_mad_mot_sel, 0);
  9317. PQ_RegisterWrite(VIP_reg_vdi_mad_pix32_dyn_en, 1);
  9318. PQ_RegisterWrite(VIP_reg_vdi_mad_32mot_sel, 0);
  9319. // PQ_RegisterWrite(VIP_reg_vdi_mad_m2s_adj_en, 0);
  9320. PQ_RegisterWrite(VIP_reg_vdi_mad_m2sg_alpha_adj_en, 1);
  9321. PQ_RegisterWrite(VIP_reg_vdi_mad_hlp_c_en, 0);
  9322. //0x6073
  9323. PQ_RegisterWrite(VIP_reg_vdi_mad_tp_vfil_coef, 3);
  9324. //Comb detection
  9325. rscomb_hsize= (vdi_hsize_i+3)/4;
  9326. rscomb_vsize= (vdi_vsize+3)/4;
  9327. rscomb_total= rscomb_hsize * rscomb_vsize;
  9328. PQ_RegisterWrite(VIP_reg_vdi_mad_comb_th2, 32);
  9329. PQ_RegisterWrite(VIP_reg_vdi_mad_comb_th1, 8); //2009-01-05 pc update
  9330. if((VIP_GetInputResMode() == RESMODE_720X480) && (VIP_GetInterlaceMode()))
  9331. PQ_RegisterWrite(VIP_reg_vdi_mad_scomb_th1, 0xa); //2015-01-06 HiviCase Mobile subtitles
  9332. else
  9333. PQ_RegisterWrite(VIP_reg_vdi_mad_scomb_th1, 32); //2009-01-05 pc update
  9334. PQ_RegisterWrite(VIP_reg_vdi_mad_scomb_th2, 64);
  9335. PQ_RegisterWrite(VIP_reg_vdi_mad_rscomb_hsize, rscomb_hsize);
  9336. PQ_RegisterWrite(VIP_reg_vdi_mad_rscomb_vsize, rscomb_vsize);
  9337. PQ_RegisterWrite(VIP_reg_vdi_mad_rscomb_nrthd, rscomb_total/80); //x0.125
  9338. PQ_RegisterWrite(VIP_reg_vdi_mad_rscomb_ucthd, rscomb_total/200);//x0.005
  9339. PQ_RegisterWrite(VIP_reg_vdi_mad_rscomb_bcthd, rscomb_total/200);//x0.005
  9340. //set field_compare
  9341. PQ_RegisterWrite(VIP_reg_vdi_ne_vds, 1);
  9342. PQ_RegisterWrite(VIP_reg_vdi_ne_vde, vdi_vsize-2);
  9343. PQ_RegisterWrite(VIP_reg_vdi_mad_fc_hds, 2);
  9344. if(VIP_IsAVSource() && (VIP_GetStdColorSystem() == CVD2_STD_NTSC_M || VIP_GetStdColorSystem() == CVD2_STD_NTSC_443))
  9345. {
  9346. //PQ_RegisterWrite(VIP_reg_vdi_mad_fc_hde, 0x318); //mantis #35655
  9347. PQ_RegisterWrite(VIP_reg_vdi_mad_fc_hde, 0x39d); //video book deinterlace#1 ch#6 text comb issue, trade off behavior between #35655 and text issue
  9348. }
  9349. else
  9350. {
  9351. PQ_RegisterWrite(VIP_reg_vdi_mad_fc_hde, vdi_hsize_i-3);
  9352. }
  9353. PQ_RegisterWrite(VIP_reg_vdi_mad_himotfd_thd, vdi_total/10);
  9354. PQ_RegisterWrite(VIP_reg_vdi_mad_lomotfd_thd, vdi_total/540);
  9355. {
  9356. UINT8 ucHDMI1080i = (VIP_GetUserSource()==SOURCE_HDMI && VIP_GetInterlaceMode());
  9357. //# gdet setting
  9358. PQ_RegisterWrite(VIP_reg_vdi_mad_gdet_period, ucHDMI1080i?4:1);
  9359. PQ_RegisterWrite(VIP_reg_vdi_mad_gdet_th, ucHDMI1080i?0xca80:vdi_total/16);
  9360. // PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_m2sg_a, 16);
  9361. // PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_m2sg_b, 0);
  9362. // PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_m2sg_a, 16);
  9363. // PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_m2sg_b, 0);
  9364. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_s2mg_alpha, 3);
  9365. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_m2sg_alpha, 8);
  9366. }
  9367. //static degree th
  9368. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_static_th, 9);
  9369. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_iir_stc_th, 7);
  9370. //6501 0x35
  9371. PQ_RegisterWrite(VIP_reg_vdi_mad_sd_denom_max_en, 1);
  9372. PQ_RegisterWrite(VIP_reg_vdi_mad_sd_denom_hhp_en, 0);
  9373. PQ_RegisterWrite(VIP_reg_vdi_mad_tpc_w_adj_en, 1);
  9374. PQ_RegisterWrite(VIP_reg_vdi_field_block_choice, 0);
  9375. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_absdiff_en, VIP_IsATVSource()?0:1);
  9376. PQ_RegisterWrite(VIP_reg_vdi_mad_mot_diff_dis, 1);
  9377. PQ_RegisterWrite(VIP_reg_vdi_mad_pix_stc_sel, 0);
  9378. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_m2sg_alpha, 8);
  9379. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_m2sg_alpha, 8);
  9380. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope, VIP_IsAVSource()?4:2);
  9381. if(VIP_IsAVSource() && VIP_GetStdColorSystem() == CVD2_STD_NTSC_443)
  9382. {
  9383. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope, 2);
  9384. }
  9385. if((VIP_IsAVSource() || VIP_IsATVSource()) && (VIP_GetStdColorSystem() <= CVD2_STD_NTSC_443))
  9386. {
  9387. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_xoff, 1);
  9388. }
  9389. #if 0
  9390. if(VIP_GetUserSource()==SOURCE_HDMI && pHwContext->cInterlaceMode)
  9391. PQ_RegisterWrite(VIP_reg_slr_spw_lp_mth, 1);
  9392. else
  9393. PQ_RegisterWrite(VIP_reg_slr_spw_lp_mth, VIP_IsATVSource()?1:0);
  9394. #elif 0
  9395. PQ_RegisterWrite(VIP_reg_slr_spw_lp_mth, 0);
  9396. #else
  9397. PQ_RegisterWrite(VIP_reg_slr_spw_lp_mth, VIP_IsATVSource()?1:0);
  9398. #endif
  9399. if(VIP_GetUserSource() == SOURCE_MPEG || (VIP_GetInterlaceMode() && abs(VIP_GetInputVSize() -1080)<20))
  9400. {
  9401. PQ_RegisterWrite(VIP_reg_slr_mix_static_feature, 0);
  9402. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_m2ss_alpha, 3);
  9403. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_m2s_alpha, 3);
  9404. }else
  9405. {
  9406. PQ_RegisterWrite(VIP_reg_slr_mix_static_feature, 1);
  9407. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_m2ss_alpha, 8);
  9408. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_m2s_alpha, 4);
  9409. }
  9410. if(VIP_GetInterlaceMode() && abs(VIP_GetInputVSize() -1080)<20)
  9411. PQ_RegisterWrite(VIP_reg_slr_static_en2, 0);
  9412. else
  9413. PQ_RegisterWrite(VIP_reg_slr_static_en2, 1);
  9414. PQ_HmeSetup(vdi_hsize_i, vdi_vsize);
  9415. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_mins_thz, 4);
  9416. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_meds_thz, 3);
  9417. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_maxs_thz, 6);
  9418. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_mins_th1, 4);
  9419. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_meds_th1, 7);
  9420. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_mins_th2, 7);
  9421. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_min_thz, 0);
  9422. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_med_thz, 2);
  9423. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_max_thz, 3);
  9424. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_min_th1, 3);
  9425. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_med_th1, 4);
  9426. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_min_th2, 6);
  9427. }
  9428. void PQ_2232DetSetup(UINT32 vdi_total)
  9429. {
  9430. //Dynamic 32 detection
  9431. PQ_RegisterWrite(VIP_reg_vdi_mad_pixel32_thd, 40);
  9432. PQ_RegisterWrite(VIP_reg_vdi_mad_pixel32_minthd, 20);
  9433. PQ_RegisterWrite(VIP_reg_vdi_mad_pixel32_maxthd, 80);
  9434. PQ_RegisterWrite(VIP_reg_vdi_mad_pixel32_motthd, 32);
  9435. PQ_RegisterWrite(VIP_reg_vdi_mad_mchfield_thd, vdi_total/1200);
  9436. PQ_RegisterWrite(VIP_reg_vdi_mad_mchfield_minthd, vdi_total/2400);
  9437. PQ_RegisterWrite(VIP_reg_vdi_mad_mchfield_maxthd, vdi_total/800);
  9438. if(VIP_GetUserSource() == SOURCE_CVD2 && VIP_IsAVSource())//KW request 2012/11/06
  9439. {
  9440. PQ_RegisterWrite(VIP_reg_vdi_fastmotion_thd, 0x4500); //yj, 20160121
  9441. PQ_RegisterWrite(VIP_reg_vdi_combcnt_fm_same_thd, 0x450);
  9442. PQ_RegisterWrite(VIP_reg_vdi_combcnt_hm_fs_thd, 0x450);
  9443. PQ_RegisterWrite(VIP_reg_vdi_fm_miss_comb_min, 0x90f);
  9444. PQ_RegisterWrite(VIP_reg_vdi_22movie_verfy_thd, 0xa);
  9445. }
  9446. else
  9447. {
  9448. if(VIP_GetUserSource() == SOURCE_HDMI && VIP_GetInterlaceMode() && (VIP_GetInputVSize() <= (480+24)))
  9449. {
  9450. PQ_RegisterWrite(VIP_reg_vdi_fastmotion_thd, 0x3300);
  9451. }
  9452. else
  9453. {
  9454. PQ_RegisterWrite(VIP_reg_vdi_fastmotion_thd, vdi_total/14);
  9455. }
  9456. //Dynamic 22 detection
  9457. PQ_RegisterWrite(VIP_reg_vdi_combcnt_fm_same_thd, vdi_total/115);
  9458. PQ_RegisterWrite(VIP_reg_vdi_combcnt_hm_fs_thd, vdi_total/58);
  9459. //PQ_RegisterWrite(VIP_reg_vdi_fm_miss_comb_min, vdi_total/675);
  9460. PQ_RegisterWrite(VIP_reg_vdi_fm_miss_comb_min, (vdi_total-2800)/132);
  9461. PQ_RegisterWrite(VIP_reg_vdi_22movie_verfy_thd, 0x5);
  9462. }
  9463. //if(VIP_GetUserSource() == SOURCE_CVD2 || pHwContext->bScartRGBMode)
  9464. // PQ_RegisterWrite(VIP_reg_vdi_22fastmotion_thd, 0xfb0); //to fix 45 degree white line is borken in 22 issue
  9465. //else
  9466. // PQ_RegisterWrite(VIP_reg_vdi_22fastmotion_thd, vdi_total/5);
  9467. PQ_RegisterWrite(VIP_reg_vdi_22fastmotion_thd ,0xffff);
  9468. PQ_RegisterWrite(VIP_reg_vdi_combratio_fm_same ,0x10);
  9469. PQ_RegisterWrite(VIP_reg_vdi_combratio_fm_miss ,0x80);
  9470. PQ_RegisterWrite(VIP_reg_vdi_combratio_hm_fm_same ,0x10);
  9471. PQ_RegisterWrite(VIP_reg_vdi_combratio_hm_fm_miss ,0x80);
  9472. PQ_RegisterWrite(VIP_reg_vdi_ad_break_fc_thd, vdi_total/1350);
  9473. PQ_RegisterWrite(VIP_reg_vdi_ad_break_comb_thd, vdi_total/45);
  9474. PQ_RegisterWrite(VIP_reg_vdi_stc_break_fc_thd, vdi_total/1350);
  9475. PQ_RegisterWrite(VIP_reg_vdi_22fastback_off, 0);
  9476. PQ_RegisterWrite(VIP_reg_vdi_22fast_break, 1);
  9477. PQ_RegisterWrite(VIP_reg_vdi_22static_break, 1);
  9478. PQ_RegisterWrite(VIP_reg_vdi_22fastsim_kikin, 0);
  9479. //0x6141
  9480. //PQ_RegisterWrite(VIP_reg_vdi_dyn32_en,1);
  9481. PQ_RegisterWrite(VIP_reg_vdi_last_mov32_en, 1);
  9482. PQ_RegisterWrite(VIP_reg_vdi_fsame32_sel, 1);
  9483. PQ_RegisterWrite(VIP_reg_vdi_dyn32_en, 1);
  9484. PQ_RegisterWrite(VIP_reg_vdi_fast_syncback, 1);
  9485. PQ_RegisterWrite(VIP_reg_vdi_fastsim_kikin, 0);
  9486. PQ_RegisterWrite(VIP_reg_vdi_32qual_22result, 0);
  9487. PQ_RegisterWrite(VIP_reg_vdi_32subt_break_en, 0);
  9488. PQ_RegisterWrite(VIP_reg_slr_mesh_en, 0);
  9489. PQ_RegisterWrite(VIP_reg_vdi_sameframe_thd, 0x24);
  9490. }
  9491. void PQ_VDISize(void)
  9492. {
  9493. PQHW_CONTEXT* pHwContext= &PQHwContext;
  9494. BOOL bDemoMode,bMpegNrEnable;
  9495. UINT32 vdi_hsize_i,vdi_vsize,vdi_total;
  9496. bDemoMode= PQ_RegisterRead(VIP_reg_vdi_tnr_debug_en);
  9497. bMpegNrEnable= (pHwContext->nMPEGNRLevel>OFF) ? ENABLE : DISABLE;
  9498. vdi_hsize_i= VIP_GetScalerPreScaleH(); //= (reg_adix_che-reg_adix_chs) * 2048 / reg_slr_hfactor
  9499. vdi_vsize= PQ_Get_VDI_VSize(); //= reg_adix_cve-reg_adix_cvs
  9500. vdi_total= vdi_hsize_i*vdi_vsize;
  9501. PQ_MADSetup(vdi_hsize_i, vdi_vsize, vdi_total);
  9502. if(VIP_GetFrameBufferNum() == 1 || VIP_IsATVSource() || VIP_IsSourceDTV())
  9503. {
  9504. PQ_SetFilmMode(DISABLE);
  9505. }
  9506. else
  9507. {
  9508. PQ_2232DetSetup(vdi_total);
  9509. }
  9510. PQ_NERegion(bDemoMode, vdi_hsize_i, vdi_vsize); //NR relative setting
  9511. PQ_NRLevel(pHwContext->nNRLevel, vdi_total);
  9512. if( bMpegNrEnable )
  9513. {
  9514. PQ_MPEGNRLevel(pHwContext->nMPEGNRLevel, vdi_total);
  9515. }
  9516. //Deblock filter
  9517. PQ_DeblockFilterAndDetect(bDemoMode, vdi_hsize_i, vdi_vsize);
  9518. }
  9519. BOOL PQ_CheckTableCheckSum(UINT8* pVipTable)
  9520. {
  9521. PQ_TABLE_BOOK* pTableBook= (PQ_TABLE_BOOK*) pVipTable;
  9522. UINT32 ulCheckSum,i;
  9523. ulCheckSum= 0;
  9524. for(i=pTableBook->nChkFrom; i<pTableBook->nChkTo; i++)
  9525. {
  9526. ulCheckSum+= pVipTable[i];
  9527. }
  9528. if(ulCheckSum == pTableBook->nChkSum )
  9529. return TRUE;
  9530. else
  9531. return FALSE;
  9532. }
  9533. void PQ_LoadSettingTable(UINT8* pVipTable, UINT8 ucTableIndex)
  9534. {
  9535. PQ_TABLE_BOOK* pTableBook= (PQ_TABLE_BOOK*) pVipTable;
  9536. UINT32 ulTableOffset,ulTableCount,ulRegister,ulValue,i;
  9537. volatile UINT32* pAddr;
  9538. if( ucTableIndex>=pTableBook->nTotalTable )
  9539. return;
  9540. ulTableOffset= pTableBook->TableIndex[ucTableIndex].nOffset + (UINT32)pVipTable;
  9541. ulTableCount= pTableBook->TableIndex[ucTableIndex].nSize >> 3;
  9542. pAddr= (volatile UINT32*) ulTableOffset;
  9543. for (i=0; i<ulTableCount; i++)
  9544. {
  9545. ulRegister= *pAddr;
  9546. if((ulRegister & PQ_REG_END_OF_SUB_TAB) != PQ_REG_END_OF_SUB_TAB)
  9547. {
  9548. ulValue= *(pAddr+1);
  9549. //PQDebugPrint("%s: i=0x%lx ulRegister=0x%8.8lx ulValue=0x%8.8lx", __FUNCTION__, i, ulRegister, ulValue);
  9550. PQ_RegisterWrite(ulRegister, ulValue);
  9551. //printk("Register:0x%x,Value:0x%x \n",ulRegister,ulValue);
  9552. }
  9553. pAddr+= 2;
  9554. }
  9555. }
  9556. void PQ_DefaultSetting(void)
  9557. {
  9558. UINT8* pVipTable= (UINT8*) SPI_VIPTABLE_SHADOWADDR;
  9559. PQHW_CONTEXT* pHwContext= &PQHwContext;
  9560. UINT8 i;
  9561. //new function since 533
  9562. *(volatile unsigned char*)(0xbe1cddfd)=0x0; // suggest by JengYun 20160713
  9563. /*Some common settings initialize here*/
  9564. //for Constrast
  9565. PQ_RegisterWrite(VIP_reg_dpy_rgb_int, 1);
  9566. //for Saturation
  9567. PQ_RegisterWrite(VIP_reg_dpy_hsv, 0x1);
  9568. //for Hue, Flesh-tone, ColorRegion, Dynamic Constrast
  9569. PQ_RegisterWrite(VIP_reg_dpy_yuv_int, 0x1);
  9570. PQ_RegisterWrite(VIP_reg_dpy_rgn_int, 0x1);
  9571. //PQ_RegisterWrite(VIP_reg_dpy_u_reset, 0x0);
  9572. PQ_RegisterWrite(VIP_reg_dpy_rgb_int, 0);
  9573. if( PQ_CheckTableCheckSum(pVipTable) )
  9574. {
  9575. PQDebugPrint("%s: Load VipTable from flash rom", __FUNCTION__);
  9576. PQ_LoadSettingTable(pVipTable, VTAB_INITIAL_TALBE);
  9577. PQ_LoadSettingValue(pVipTable, VTAB_INITIAL_VALUE);
  9578. for(i=0; i<VTAB_MAX_SOURCE; i++)
  9579. PQ_LoadSettingValue(pVipTable, VTAB_EXTS_YPP_VALUE+i);
  9580. }
  9581. else
  9582. {
  9583. PQDebugPrint("%s: VipTable is not loaded, using default setting.", __FUNCTION__);
  9584. /*Some initial values not adjustable in menu*/
  9585. //Sync Detection range for cnt H-V
  9586. PQ_RegisterWrite(VIP_reg_adi_exts_hs_thd, 0xf);
  9587. PQ_RegisterWrite(VIP_reg_adi_exts_vs_thd, 0x7);
  9588. /*Init Brightness*/
  9589. /*Init Constrast*/
  9590. /*Init Sharpness*/
  9591. //Luma Sharpness filter
  9592. //PQ_RegisterWrite(VIP_reg_dpy_filter_hl_smooth, 0x8); //menu adjust
  9593. //PQ_RegisterWrite(VIP_reg_dpy_filter_hl_sharp, 0x20); //menu adjust
  9594. //PQ_RegisterWrite(VIP_reg_dpy_filter_hl_pivotx, 0x0); //menu adjust
  9595. //PQ_RegisterWrite(VIP_reg_dpy_filter_hl_pivoty, 0x0); //menu adjust
  9596. //PQ_RegisterWrite(VIP_reg_dpy_filter_hl_trans1, 2); //menu adjust
  9597. //PQ_RegisterWrite(VIP_reg_dpy_filter_hl_trans2, -2); //menu adjust
  9598. //PQ_RegisterWrite(VIP_reg_dpy_filter_hl_limit, 0x0); //menu adjust
  9599. //Protect strong vertical edge from jaggy
  9600. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_alpha_th, 0x18);
  9601. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_alpha_trans, 0);
  9602. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_alpha_limit, 0x8);
  9603. //PQ_RegisterWrite(VIP_reg_dpy_filter_hc_smooth, 0x0); //menu adjust
  9604. //PQ_RegisterWrite(VIP_reg_dpy_filter_hc_sharp, 0x10); //menu adjust
  9605. //PQ_RegisterWrite(VIP_reg_dpy_filter_hc_pivotx, 0x0c); //menu adjust
  9606. //PQ_RegisterWrite(VIP_reg_dpy_filter_hc_pivoty, 0x0); //menu adjust
  9607. //PQ_RegisterWrite(VIP_reg_dpy_filter_hc_trans1, 2); //menu adjust
  9608. //PQ_RegisterWrite(VIP_reg_dpy_filter_hc_trans2, -2); //menu adjust
  9609. //PQ_RegisterWrite(VIP_reg_dpy_filter_hc_limit, 0x0);//menu adjust
  9610. //PQ_RegisterWrite(VIP_reg_dpy_filter_vl_pivotx, 0x0); //menu adjust
  9611. //PQ_RegisterWrite(VIP_reg_dpy_filter_vl_pivoty, 0x0); //menu adjust
  9612. //PQ_RegisterWrite(VIP_reg_dpy_filter_vl_smooth, 0x8); //menu adjust
  9613. //PQ_RegisterWrite(VIP_reg_dpy_filter_vl_sharp, 0x8); //menu adjust
  9614. //PQ_RegisterWrite(VIP_reg_dpy_filter_vl_trans1, 2); //menu adjust
  9615. //PQ_RegisterWrite(VIP_reg_dpy_filter_vl_trans2, -2); //menu adjust
  9616. //PQ_RegisterWrite(VIP_reg_dpy_filter_vl_limit, 0x0); //menu adjust
  9617. //PQ_RegisterWrite(VIP_reg_dpy_filter_vl_hp_limit, 0x14); //menu adjust
  9618. //PQ_RegisterWrite(VIP_reg_dpy_filter_vc_smooth, 0x0); //menu adjust
  9619. //PQ_RegisterWrite(VIP_reg_dpy_filter_vc_sharp, 0x10); //menu adjust
  9620. //PQ_RegisterWrite(VIP_reg_dpy_filter_vc_pivotx, 0x0c); //menu adjust
  9621. //PQ_RegisterWrite(VIP_reg_dpy_filter_vc_pivoty, 0x0); //menu adjust
  9622. //PQ_RegisterWrite(VIP_reg_dpy_filter_vc_trans1, 2); //menu adjust
  9623. //PQ_RegisterWrite(VIP_reg_dpy_filter_vc_trans2, -2);//menu adjust
  9624. //PQ_RegisterWrite(VIP_reg_dpy_filter_vc_limit, 0x0); //menu adjust
  9625. PQ_RegisterWrite(VIP_reg_dpy_filter_chroma, 0x1);
  9626. //VIP_ProgramColorProcess() setup this
  9627. //PQ_RegisterWrite(VIP_reg_dpy_filter_y_h1, 0x78);
  9628. //PQ_RegisterWrite(VIP_reg_dpy_filter_y_h2, 0x8);
  9629. //PQ_RegisterWrite(VIP_reg_dpy_filter_y_h3, 0x0);
  9630. //PQ_RegisterWrite(VIP_reg_dpy_filter_y_h4, 0x4);
  9631. //PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h1, 0x78);
  9632. //PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h2, 0x8);
  9633. //PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h3, 0x0);
  9634. //PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h4, 0x4);
  9635. //PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h1, 0x78);
  9636. //PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h2, 0x8);
  9637. //PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h3, 0x0);
  9638. //PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h4, 0x4);
  9639. //VIP_ProgramColorProcess() setup this
  9640. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h1, 0x778);
  9641. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h2, 0x3a);
  9642. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h3, 0xb);
  9643. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h4, 0x7fb);
  9644. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h1, 0x778);
  9645. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h2, 0x3a);
  9646. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h3, 0xb);
  9647. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h4, 0x7fb);
  9648. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h1, 0x778);
  9649. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h2, 0x3a);
  9650. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h3, 0xb);
  9651. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h4, 0x7fb);
  9652. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_smooth1, 64); //menu adjust
  9653. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_sharp, 64); //menu adjust
  9654. PQ_RegisterWrite(VIP_reg_dpy_filter_hc_smooth1, 64); //menu adjust
  9655. PQ_RegisterWrite(VIP_reg_dpy_filter_hc_sharp, 64); //menu adjust
  9656. /*Init Dynamic Contrast */
  9657. //PQ_RegisterWrite(VIP_reg_dpy_hist_en,DISABLE);
  9658. //PQ_RegisterWrite(VIP_reg_dpy_hist_dyn_bp, 0x0);
  9659. PQ_RegisterWrite(VIP_reg_dpy_hist_int, ENABLE);
  9660. PQ_RegisterWrite(VIP_reg_dpy_hist_chroma_en, 0x1);
  9661. }
  9662. PQ_3DNoiseReductoin(OFF, 0, 0);
  9663. PQ_MPEGNoiseReductoin(OFF,0,0);
  9664. PQ_RegisterWrite(VIP_reg_dpy_u_reset, 0x0);
  9665. PQ_RegisterWrite(VIP_reg_slr_hme_22det_en,0x0);
  9666. pHwContext->LoadPQTable=1;
  9667. //330
  9668. PQ_Default_Color_Lut_Setting();
  9669. PQ_RegisterWrite(VIP_reg_dpy_first_layer, 3);
  9670. }
  9671. //================================================================================
  9672. // function name : PQ_VideoDetectionSetup
  9673. // input parameter :
  9674. // output parameter : none
  9675. // purpose : setup vdi control register
  9676. // return : none
  9677. void PQ_VideoDetectionSetup(UINT8 ucSource, UINT8 ucSubSource, BOOL bFunctionEnable)
  9678. {
  9679. PQHW_CONTEXT* pHwContext= &PQHwContext;
  9680. UINT32 vdi_hsize_i,vdi_vsize,vdi_total;
  9681. BOOL bDemoMode,bNrEnable,bMpegNrEnable,bATVSource,bPCSource;
  9682. BOOL bDeblockEnable;
  9683. PQDebugPrint("%s: InterlaceMode=%d", __FUNCTION__, VIP_GetInterlaceMode());
  9684. DRV_VDI_Reset(TRUE);
  9685. //deinterlace setup
  9686. if(VIP_GetInterlaceMode())
  9687. {
  9688. PQ_RegisterWrite(VIP_reg_vdi_interlace, 1);
  9689. }
  9690. else
  9691. {
  9692. PQ_RegisterWrite(VIP_reg_vdi_interlace, 0);
  9693. }
  9694. PQ_RegisterWrite(VIP_reg_gfx_buf_bypass,0);
  9695. if( bFunctionEnable )
  9696. {
  9697. bATVSource= (ucSource==CVD2) && (ucSubSource==TV_INPUT_CHANNEL);
  9698. bPCSource= (ucSource==EXTS) && (ucSubSource==DSUB);
  9699. bDemoMode= PQ_RegisterRead(VIP_reg_vdi_tnr_debug_en);
  9700. bNrEnable= (pHwContext->nNRLevel>OFF) ? ENABLE :DISABLE;
  9701. bMpegNrEnable= (pHwContext->nMPEGNRLevel>OFF) ? ENABLE : DISABLE;
  9702. bDeblockEnable= (!VIP_IsPCSource()) && (!VIP_RunDVIMode()) && (VIP_GetInputResMode()!=RESMODE_NON_STD);
  9703. vdi_hsize_i= VIP_GetScalerPreScaleH(); //= (reg_adix_che-reg_adix_chs) * 2048 / reg_slr_hfactor
  9704. vdi_vsize= PQ_Get_VDI_VSize(); //= reg_adix_cve-reg_adix_cvs
  9705. vdi_total= vdi_hsize_i*vdi_vsize;
  9706. if(ucSource==SOURCE_HDMI && (Panel_H_Start_Offset>10 || Panel_H_End_Offset>10 || Panel_V_Start_Offset>10 || Panel_V_End_Offset>10) && (VIP_GetSourcePixelClock()>165000000))
  9707. {
  9708. DRV_VDI_MemReadEn(DISABLE);
  9709. }
  9710. else
  9711. {
  9712. DRV_VDI_MemReadEn(ENABLE);
  9713. }
  9714. PQ_RegisterWrite(VIP_reg_vdi_nomrd_4prev1, VIP_GetInterlaceMode()?0:1);
  9715. PQ_RegisterWrite(VIP_reg_vdi_take_m32, 0);
  9716. // from Eric to fix ATV NTSC ���u�а{�G�I like mantis 0045141
  9717. if(VIP_IsATVSource() && (VIP_GetStdColorSystem() == CVD2_STD_NTSC_M || VIP_GetStdColorSystem() == CVD2_STD_NTSC_443))
  9718. PQ_RegisterWrite(VIP_reg_vdi_take_m22, 1);
  9719. else
  9720. PQ_RegisterWrite(VIP_reg_vdi_take_m22, 0);
  9721. if (VIP_GetUserSource()!= SOURCE_HDMI && VIP_GetUserSource()!= SOURCE_MPEG)
  9722. bNrEnable = ENABLE;
  9723. if(VIP_IsPCSource() || VIP_RunDVIMode())
  9724. bNrEnable=DISABLE;
  9725. PQ_RegisterWrite(VIP_reg_vdi_tnr_en, bNrEnable); //always enable in ATV, AV
  9726. PQ_RegisterWrite(VIP_reg_vdi_dbk_en, bMpegNrEnable && bDeblockEnable); //PC-2008-12-18
  9727. #ifdef VIP_SCALER_3D
  9728. if(VIP_GetInput3dType() == INPUT_3D_INTERLEAVING)
  9729. PQ_RegisterWrite(VIP_reg_vdi_mad_en,DISABLE);
  9730. else
  9731. #endif
  9732. PQ_RegisterWrite(VIP_reg_vdi_mad_en, VIP_GetInterlaceMode() ? ENABLE: DISABLE);
  9733. PQ_RegisterWrite(VIP_reg_vdi_snr_hfil_en, bNrEnable);
  9734. PQ_RegisterWrite(VIP_reg_vdi_snr_vfil_en, bNrEnable);
  9735. if(ucSource==CVD2)
  9736. PQ_RegisterWrite(VIP_reg_vdi_sigmanr_en,0);//to reduce edge for CVD2 2009-03-09 requested by PC/Henry
  9737. else
  9738. PQ_RegisterWrite(VIP_reg_vdi_sigmanr_en, bNrEnable);
  9739. PQ_RegisterWrite(VIP_reg_vdi_sigmanr_opt1, 1);
  9740. if((VIP_GetInputDataFormat()==RGB) || bPCSource )
  9741. PQ_RegisterWrite(VIP_reg_vdi_mnr_fil_en, 0);
  9742. else
  9743. PQ_RegisterWrite(VIP_reg_vdi_mnr_fil_en, bMpegNrEnable);
  9744. PQ_RegisterWrite(VIP_reg_vdi_mad_loa_en, 1);
  9745. PQ_MADSetup(vdi_hsize_i, vdi_vsize, vdi_total);
  9746. if(VIP_GetFrameBufferNum() == 1 || VIP_IsATVSource() || VIP_IsSourceDTV())
  9747. {
  9748. PQ_SetFilmMode(DISABLE);
  9749. }
  9750. else
  9751. {
  9752. PQ_2232DetSetup(vdi_total);
  9753. }
  9754. PQ_NERegion(bDemoMode, vdi_hsize_i, vdi_vsize); //NR relative setting
  9755. PQ_NRLevel(pHwContext->nNRLevel, vdi_total);
  9756. if( bMpegNrEnable )
  9757. {
  9758. PQ_MPEGNRLevel(pHwContext->nMPEGNRLevel, vdi_total);
  9759. }
  9760. //TNR, SNR adjust by NE
  9761. //0x6020=0x2f
  9762. PQ_RegisterWrite(VIP_reg_vdi_tnr_th_dyn_adj, 1);
  9763. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_dith_en, 1);
  9764. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_sel, 1);
  9765. PQ_RegisterWrite(VIP_reg_vdi_tnr_7tap, 0);
  9766. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_sel, 0);
  9767. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_dyn_adj, VIP_GetInputVSize()<720?0:1);
  9768. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_en, 1);
  9769. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_mbw_en, 1);
  9770. PQ_RegisterWrite(VIP_reg_vdi_snr_adj_en,1);
  9771. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_lp_en, 1);
  9772. PQ_RegisterWrite(VIP_reg_vdi_snr_hor_mix_en, 1);
  9773. //0x6032, 0x6035, 0x6026,
  9774. PQ_RegisterWrite(VIP_reg_vdi_snr_h_fact0, 0x08);
  9775. PQ_RegisterWrite(VIP_reg_vdi_snr_h_fact1, 0x04);
  9776. PQ_RegisterWrite(VIP_reg_vdi_snr_h_fact2, 0x00); //Lee Sir-2009-02-10
  9777. PQ_RegisterWrite(VIP_reg_vdi_snr_filter_sel_slope, bATVSource ? 0x3c : 0x20); //Lee Sir-2009-02-10
  9778. PQ_RegisterWrite(VIP_reg_vdi_sigmanr_strength, bATVSource ? 0x4 : 0x3); //Lee Sir-2009-02-10
  9779. PQ_RegisterWrite(VIP_reg_vdi_tnr_th1_s, 0);
  9780. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_bmax_sel, 1);
  9781. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope, VIP_GetInputVSize()<720?79:0x7f);
  9782. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s, VIP_GetInputVSize()<720?3:2);
  9783. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s, VIP_GetInputVSize()<720?3:2);
  9784. if(VIP_IsATVSource() && (VIP_GetStdColorSystem() == CVD2_STD_NTSC_M))
  9785. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_chroma, 0x10); // for blue sky noise issue #51967
  9786. else
  9787. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_chroma, VIP_GetUserSource()==SOURCE_CVD2?31:48);
  9788. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_th1_s, 0);
  9789. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_slope_s, 2);
  9790. //Deblock filter
  9791. PQ_DeblockFilterAndDetect(bDemoMode, vdi_hsize_i, vdi_vsize);
  9792. //MNR filter
  9793. PQ_RegisterWrite(VIP_reg_vdi_mad_mnr_hedge_th, 80);
  9794. PQ_RegisterWrite(VIP_reg_vdi_mad_mnr_vedge_th, 80);
  9795. PQ_RegisterWrite(VIP_reg_vdi_mad_mnr_3pixdet_en, 1);
  9796. PQ_RegisterWrite(VIP_reg_vdi_mad_mnr_hexpn_en, 1);
  9797. }
  9798. VIP_SetVDIMode();
  9799. PQ_RegisterWrite(VIP_reg_vdi_bypass, bFunctionEnable ? 0 : 1); //always open in 9561
  9800. DRV_VDI_Reset(FALSE);
  9801. PQ_RegisterWrite(VIP_reg_vdi_sigmanr_factor,2);//2009-07-14 yuling adjust the factor to pass some ADC pattern shake issue.
  9802. PQ_RegisterWrite(VIP_reg_gfx_dummy2, 0);
  9803. if(VIP_GetBWModeStatus())
  9804. {
  9805. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_en, DISABLE);
  9806. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_en, DISABLE);
  9807. }
  9808. }
  9809. void PQ_ChromaMotionDetectControl(void)
  9810. {
  9811. UINT32 uc_field_diff_cnt = PQ_RegisterRead(VIP_field_diff_cnt_lp);
  9812. if(VIP_GetBWModeStatus() || (uc_field_diff_cnt< 0x1ff))
  9813. {
  9814. DRV_VDI_EnableChromaForMotionDetection(DISABLE);
  9815. }
  9816. else
  9817. {
  9818. DRV_VDI_EnableChromaForMotionDetection(ENABLE);
  9819. }
  9820. }
  9821. void PQ_SetMenuValueCT(UINT8 ucFunID, INT32 iValue1,INT32 iValue2,INT32 iValue3 )
  9822. {
  9823. PQHW_CONTEXT* pHwContext= &PQHwContext;
  9824. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  9825. if( ucFunID==PQ_COLORTEMPGAIN)
  9826. {
  9827. pMenuValue->iColorTemp[0]= iValue1;//R GAIN
  9828. pMenuValue->iColorTemp[1]= iValue2;//G GAIN
  9829. pMenuValue->iColorTemp[2]= iValue3;//B GAIN
  9830. //printk("\n\n\n\n PQ_SetMenuValueCT R= 0X%0x, G= 0X%0x,B= 0X%0x, \n\n\n\n",iValue1,iValue2,iValue3);
  9831. }
  9832. }
  9833. void PQ_SetUserCurve(UINT8 ucFunID, UINT8 ucPointIdx, INT16 iValue)
  9834. {
  9835. PQHW_CONTEXT* pHwContext= &PQHwContext;
  9836. pHwContext->mCurveSetting[ucFunID].iValue[ucPointIdx] = iValue;
  9837. }
  9838. //remappig drvier value to OSD value by curve setting adjust
  9839. INT32 _MappingDrvValToOSD(UINT8 ucFunID, INT32 iDrvVal)
  9840. {
  9841. PQHW_CONTEXT* pHwContext= &PQHwContext;
  9842. INT16 OsdMax = 100, OsdNor = 50, OsdMin = 0;
  9843. INT16 Curv_point0, Curv_point25, Curv_point50, Curv_point75, Curv_point100;
  9844. if(ucFunID >= PQ_CT_R_GAIN && ucFunID <= PQ_CT_B_GAIN)
  9845. {
  9846. Curv_point0 = 0;
  9847. Curv_point25 = 512;
  9848. Curv_point50 = 1024;
  9849. Curv_point75 = 1536;
  9850. Curv_point100 = 2047;
  9851. }
  9852. else if(ucFunID >= PQ_CT_R_BIAS && ucFunID <= PQ_CT_B_BIAS)
  9853. {
  9854. Curv_point0 = -1024;
  9855. Curv_point25 = -512;
  9856. Curv_point50 = 0;
  9857. Curv_point75 = 512;
  9858. Curv_point100 = 1023;
  9859. }
  9860. else
  9861. {
  9862. Curv_point0 = pHwContext->mCurveSetting[ucFunID].iValue[CURVE_SETTING_POINT_0];
  9863. Curv_point25 = pHwContext->mCurveSetting[ucFunID].iValue[CURVE_SETTING_POINT_25];
  9864. Curv_point50 = pHwContext->mCurveSetting[ucFunID].iValue[CURVE_SETTING_POINT_50];
  9865. Curv_point75 = pHwContext->mCurveSetting[ucFunID].iValue[CURVE_SETTING_POINT_75];
  9866. Curv_point100 = pHwContext->mCurveSetting[ucFunID].iValue[CURVE_SETTING_POINT_100];
  9867. }
  9868. if(iDrvVal == Curv_point100)
  9869. {
  9870. return 100;
  9871. }
  9872. else if(iDrvVal > Curv_point75 && iDrvVal < Curv_point100)
  9873. {
  9874. return (((iDrvVal - Curv_point75) * (OsdMax - 75) +((Curv_point100 - Curv_point75)/2)) / (Curv_point100 - Curv_point75)) + 75;
  9875. }
  9876. else if(iDrvVal == Curv_point75)
  9877. {
  9878. return 75;
  9879. }
  9880. else if(iDrvVal > Curv_point50 && iDrvVal < Curv_point75)
  9881. {
  9882. return (((iDrvVal - Curv_point50) * (75 - OsdNor) +((Curv_point75 - Curv_point50)/2)) / (Curv_point75 - Curv_point50)) + 50;
  9883. }
  9884. else if(iDrvVal == Curv_point50)
  9885. {
  9886. return 50;
  9887. }
  9888. else if(iDrvVal > Curv_point25 && iDrvVal < Curv_point50)
  9889. {
  9890. return (((iDrvVal - Curv_point25) * ( OsdNor - 25) +((Curv_point50 - Curv_point25)/2)) / (Curv_point50 - Curv_point25)) + 25;
  9891. }
  9892. else if(iDrvVal == Curv_point25)
  9893. {
  9894. return 25;
  9895. }
  9896. else if(iDrvVal > Curv_point0 && iDrvVal < Curv_point25)
  9897. {
  9898. return (iDrvVal * ( 25 - OsdMin) +((Curv_point25 - Curv_point0)/2)) / (Curv_point25 - Curv_point0);
  9899. }
  9900. else
  9901. {
  9902. return 0;
  9903. }
  9904. }
  9905. INT32 _MappingOSDValToDrv(UINT8 ucFunID, INT32 iOsdVal)
  9906. {
  9907. PQHW_CONTEXT* pHwContext= &PQHwContext;
  9908. INT16 OsdMax = 100, OsdNor = 50, OsdMin = 0;
  9909. INT16 Curv_point0, Curv_point25, Curv_point50, Curv_point75, Curv_point100;
  9910. INT16 iRealVal = 0;
  9911. Curv_point0 = pHwContext->mCurveSetting[ucFunID].iValue[CURVE_SETTING_POINT_0];
  9912. Curv_point25 = pHwContext->mCurveSetting[ucFunID].iValue[CURVE_SETTING_POINT_25];
  9913. Curv_point50 = pHwContext->mCurveSetting[ucFunID].iValue[CURVE_SETTING_POINT_50];
  9914. Curv_point75 = pHwContext->mCurveSetting[ucFunID].iValue[CURVE_SETTING_POINT_75];
  9915. Curv_point100 = pHwContext->mCurveSetting[ucFunID].iValue[CURVE_SETTING_POINT_100];
  9916. if(ucFunID >= PQ_CT_R_GAIN && ucFunID <= PQ_CT_B_GAIN)
  9917. {
  9918. Curv_point0 = 0;
  9919. Curv_point25 = 512;
  9920. Curv_point50 = 1024;
  9921. Curv_point75 = 1536;
  9922. Curv_point100 = 2047;
  9923. }
  9924. else if(ucFunID >= PQ_CT_R_BIAS && ucFunID <= PQ_CT_B_BIAS)
  9925. {
  9926. Curv_point0 = -1024;
  9927. Curv_point25 = -512;
  9928. Curv_point50 = 0;
  9929. Curv_point75 = 512;
  9930. Curv_point100 = 1023;
  9931. }
  9932. else
  9933. {
  9934. Curv_point0 = pHwContext->mCurveSetting[ucFunID].iValue[CURVE_SETTING_POINT_0];
  9935. Curv_point25 = pHwContext->mCurveSetting[ucFunID].iValue[CURVE_SETTING_POINT_25];
  9936. Curv_point50 = pHwContext->mCurveSetting[ucFunID].iValue[CURVE_SETTING_POINT_50];
  9937. Curv_point75 = pHwContext->mCurveSetting[ucFunID].iValue[CURVE_SETTING_POINT_75];
  9938. Curv_point100 = pHwContext->mCurveSetting[ucFunID].iValue[CURVE_SETTING_POINT_100];
  9939. }
  9940. if(ucFunID == PQ_CONTRAST)
  9941. {
  9942. OsdMax = 75;
  9943. OsdMin = 25;
  9944. }
  9945. if (iOsdVal < 25)
  9946. {
  9947. iRealVal = (iOsdVal - OsdMin ) * (Curv_point25 - Curv_point0) / (25 - OsdMin ) + Curv_point0;
  9948. }
  9949. else if (iOsdVal == 25)
  9950. {
  9951. iRealVal = Curv_point25;
  9952. }
  9953. else if (25 < iOsdVal && iOsdVal < OsdNor)
  9954. {
  9955. iRealVal = (iOsdVal - 25) * (Curv_point50 - Curv_point25) / (OsdNor - 25) + Curv_point25;
  9956. }
  9957. else if (iOsdVal == OsdNor)
  9958. {
  9959. iRealVal = Curv_point50;
  9960. }
  9961. else if (OsdNor < iOsdVal && iOsdVal < 75)
  9962. {
  9963. iRealVal = (iOsdVal - OsdNor) * (Curv_point75 - Curv_point50) / (75 - OsdNor) + Curv_point50;
  9964. }
  9965. else if (iOsdVal == 75)
  9966. {
  9967. iRealVal = Curv_point75;
  9968. }
  9969. else if (75 < iOsdVal && iOsdVal < OsdMax)
  9970. {
  9971. iRealVal = (iOsdVal - 75) * (Curv_point100 - Curv_point75) / (OsdMax - 75) + Curv_point75;
  9972. }
  9973. else
  9974. {
  9975. iRealVal = Curv_point100;
  9976. }
  9977. return iRealVal;
  9978. }
  9979. INT32 PQ_GetMenuValue(UINT8 ucFunID)
  9980. {
  9981. PQHW_CONTEXT* pHwContext= &PQHwContext;
  9982. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  9983. INT32* pMenuValueArray= (INT32*) (&pHwContext->MenuValue);
  9984. if( ucFunID<=PQ_HUE )
  9985. {
  9986. return pMenuValueArray[ucFunID-PQ_BRIGHTNESS];
  9987. }
  9988. else if( ucFunID>=PQ_CT_R_GAIN && ucFunID<=PQ_CT_B_GAIN )
  9989. {
  9990. return pMenuValue->iColorTemp[ucFunID-PQ_CT_R_GAIN];
  9991. }
  9992. else if( ucFunID>=PQ_CT_R_BIAS && ucFunID<=PQ_CT_B_BIAS )
  9993. {
  9994. return pMenuValue->iColorBias[ucFunID-PQ_CT_R_BIAS];
  9995. }
  9996. else if( ucFunID==PQ_DYNAMIC_CONTRAST )
  9997. {
  9998. return pMenuValue->ucDCLevel;
  9999. }
  10000. else if( ucFunID==PQ_STATIC_GAMMA )
  10001. {
  10002. return pMenuValue->cSGOffset;
  10003. }
  10004. else if( ucFunID==PQ_DIGITAL_NR )
  10005. {
  10006. return pMenuValue->ucNRLevel;
  10007. }
  10008. else if( ucFunID==PQ_MPEG_NOISE_FILTER )
  10009. {
  10010. return pMenuValue->ucMPEGNRLevel;
  10011. }
  10012. else if( ucFunID==PQ_GAMMATABLE)
  10013. {
  10014. return pMenuValue->bNoGamma;
  10015. }
  10016. else if( ucFunID==PQ_COLOR_LUT_R_SAT_GAIN)
  10017. {
  10018. return lut_rgn_sat_gain[0];
  10019. }
  10020. return 0;
  10021. }
  10022. void PQ_SetMenuValue(UINT8 ucFunID, INT32 iValue)
  10023. {
  10024. PQHW_CONTEXT* pHwContext= &PQHwContext;
  10025. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  10026. INT32* pMenuValueArray= (INT32*) (&pHwContext->MenuValue);
  10027. if( ucFunID<=PQ_HUE )
  10028. {
  10029. pMenuValueArray[ucFunID-PQ_BRIGHTNESS]= iValue;
  10030. #ifdef DynamicBacklight_EnergyEfficiency
  10031. if(ucFunID - PQ_BRIGHTNESS == PQ_CONTRAST)
  10032. {
  10033. if(PQ_GetDynamicBLType()==DYNAMIC_BL_ENERGY_EFFICIENCY)
  10034. PQ_EEBackLightDetect(TRUE);
  10035. }
  10036. #endif
  10037. }
  10038. else if( ucFunID>=PQ_CT_R_GAIN && ucFunID<=PQ_CT_B_GAIN )
  10039. {
  10040. pMenuValue->iColorTemp[ucFunID-PQ_CT_R_GAIN]= iValue;
  10041. }
  10042. else if( ucFunID>=PQ_CT_R_BIAS && ucFunID<=PQ_CT_B_BIAS )
  10043. {
  10044. pMenuValue->iColorBias[ucFunID-PQ_CT_R_BIAS]= iValue;
  10045. }
  10046. else if( ucFunID==PQ_DYNAMIC_CONTRAST )
  10047. {
  10048. pMenuValue->ucDCLevel= iValue;
  10049. }
  10050. else if( ucFunID==PQ_STATIC_GAMMA )
  10051. {
  10052. pMenuValue->cSGOffset= iValue;
  10053. }
  10054. else if( ucFunID==PQ_DIGITAL_NR )
  10055. {
  10056. pMenuValue->ucNRLevel= iValue;
  10057. }
  10058. else if( ucFunID==PQ_MPEG_NOISE_FILTER )
  10059. {
  10060. pMenuValue->ucMPEGNRLevel= iValue;
  10061. }
  10062. else if( ucFunID==PQ_GAMMATABLE)
  10063. {
  10064. if (iValue == 0xff)
  10065. pMenuValue->bNoGamma=TRUE;
  10066. else
  10067. pMenuValue->bNoGamma=FALSE;
  10068. }
  10069. }
  10070. void PQ_SourceSetting(UINT8 ucSource, UINT8 ucSubSource)
  10071. {
  10072. PQHW_CONTEXT* pHwContext= &PQHwContext;
  10073. VTAB_SRC_VALUE_DEFINE* pVtab= PQ_GetSourceVTab(ucSource, ucSubSource);
  10074. VTAB_CMN_VALUE_DEFINE* pVtabCmnValue= &pHwContext->VtabCmnValue;
  10075. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  10076. #ifndef MENU_SET_ENHANCED_COLOR
  10077. INT8 cSG;
  10078. #endif
  10079. pHwContext->pCurVtabSrcValue= pVtab;
  10080. pHwContext->PqPatch.Post2DPatch = POST_2D_SHARPNESS_DEFAULT;
  10081. pHwContext->PqPatch.PostDLTIPatch = POST_DLTI_DEFAULT;
  10082. pHwContext->PqPatch.DPYSharpnessPatch = DPY_SHARPNESS_DEFAULT;
  10083. #ifndef MENU_SET_ENHANCED_COLOR
  10084. //some enhanced setting not appearing in menu are setup here
  10085. pHwContext->nMPEGNRLevel= MEDIUM;
  10086. pHwContext->bNR_Reset_by_changeSrc = TRUE;
  10087. cSG= 0;
  10088. PQ_ColorSpaceMode(PQ_COLOR_SPACE_AUTO, ucSource);
  10089. PQ_SetMenuValue(PQ_MPEG_NOISE_FILTER, MEDIUM);
  10090. PQ_SetMenuValue(PQ_STATIC_GAMMA, cSG);
  10091. #endif
  10092. if (pVtabCmnValue->mGmaOpt.pc_no_gamma)
  10093. {
  10094. if (VIP_RunDVIMode() || VIP_IsPCSource())
  10095. {
  10096. PQDebugPrint("VTab, PC or DVI Turn off Gamma correction.");
  10097. PQ_DisableGammaTable(FALSE);//disable gamma function
  10098. }
  10099. else
  10100. {
  10101. if(pMenuValue->bNoGamma)
  10102. PQ_DisableGammaTable(FALSE);
  10103. else
  10104. PQ_RegisterWrite(VIP_reg_dpy_no_gamma, FALSE);
  10105. }
  10106. }
  10107. if( VIP_IsAVSource())// request by kent, can mmigrate to pqtool
  10108. {
  10109. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_MISC_CTRL, 0x0);
  10110. }
  10111. else
  10112. {
  10113. PQ_RegisterWrite(VIP_REG_VDI_SIGMA_MISC_CTRL, 0x20);
  10114. }
  10115. PQ_SW_DynamicContrast_Param(0);
  10116. PQ_Set_UV_Coring();
  10117. PQ_Set_UV_Offset();
  10118. PQ_SetFuzzyEliminate(DISABLE);
  10119. ucVDI_Static_Cnt_2 = 0; //reset after change source
  10120. PQ_SetColorBarFnFlag(DISABLE);
  10121. }
  10122. void PQ_SourceSelect(UINT8 ucUserInputSource)
  10123. {
  10124. //Default Value_331
  10125. PQ_RegisterWrite(VIP_reg_slr_yout_lw_limit ,0x0);
  10126. /*switch(ucUserInputSource)
  10127. {
  10128. case SOURCE_MPEG:
  10129. break;
  10130. case SOURCE_CVD2:
  10131. PQ_RegisterWrite(VIP_reg_slr_yout_lw_limit ,0x40);
  10132. break;
  10133. case SOURCE_HDMI:
  10134. break;
  10135. case SOURCE_EXTS:
  10136. break;
  10137. case SOURCE_PATTERN:
  10138. break;
  10139. case SOURCE_JPEG:
  10140. break;
  10141. }*/
  10142. }
  10143. void PQ_DPYSetup(UINT8 ucUserSource,UINT8 ucSubSource)
  10144. {
  10145. PQ_SetupLUTTable(ENABLE);
  10146. PQ_SetupSaturationGainCurve(SAT_GAIN_NORMAL);
  10147. //sharp if dbk
  10148. PQ_RegisterWrite(VIP_reg_dpy_hfil_dbk_ctl,VIP_IsAVSource()?1:0);
  10149. PQ_RegisterWrite(VIP_reg_dpy_half_dbk_opt,VIP_IsAVSource()?1:2);
  10150. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_sharp_dbk, VIP_IsAVSource()?0x20:0);
  10151. PQ_RegisterWrite(VIP_reg_dpy_filter_hc_sharp_dbk, VIP_IsAVSource()?0x20:0);
  10152. #if 0
  10153. //for bonnie request to avoid color noise in atv
  10154. PQ_RegisterWrite(VIP_reg_dpy_uv_coring_th,VIP_IsATVSource()?7:4);
  10155. #endif
  10156. }
  10157. void PQ_EnNRWorkQue_ISR(void)
  10158. {
  10159. PQHW_CONTEXT* pHwContext = &PQHwContext;
  10160. if (pHwContext->bSceneChg)
  10161. queue_work(WQ_Struct_NRAdjust,&WQ_NRAdjust);
  10162. else
  10163. {
  10164. if((++pHwContext->iAdjustNRCounter)>=0) //250
  10165. {
  10166. pHwContext->iAdjustNRCounter = 0;
  10167. queue_work(WQ_Struct_NRAdjust,&WQ_NRAdjust);
  10168. }
  10169. }
  10170. }
  10171. INT32 PQ_GetMenuHueValue(void)
  10172. {
  10173. PQHW_CONTEXT* pHwContext = &PQHwContext;
  10174. return pHwContext->MenuValue.iHue;
  10175. }
  10176. void PQ_SetLocationMode(UINT8 ucMode)
  10177. {
  10178. PQHW_CONTEXT* pHwContext= &PQHwContext;
  10179. pHwContext->ucLocationMode = ucMode;
  10180. }
  10181. void PQ_SetCurrContrastValue(INT32 iValue)
  10182. {
  10183. PQHW_CONTEXT* pHwContext = &PQHwContext;
  10184. pHwContext->iCurrContrastValue = iValue;
  10185. }
  10186. INT32 PQ_GetCurrContrastValue(void)
  10187. {
  10188. PQHW_CONTEXT* pHwContext = &PQHwContext;
  10189. return pHwContext->iCurrContrastValue;
  10190. }
  10191. void PQ_AdjustNRCounter_ISR(INT32 AdjustNRCounter)
  10192. {
  10193. PQHW_CONTEXT* pHwContext= &PQHwContext;
  10194. pHwContext->iAdjustNRCounter = AdjustNRCounter;
  10195. }
  10196. INT32 PQ_GetMenuColorBias(UINT8 index)
  10197. {
  10198. PQHW_CONTEXT* pHwContext= &PQHwContext;
  10199. return pHwContext->MenuValue.iColorBias[index];
  10200. }
  10201. void PQ_SetColorProcessor(BOOL bEnable)
  10202. {
  10203. PQHW_CONTEXT* pHwContext= &PQHwContext;
  10204. pHwContext->bEnableColorProcess= bEnable;
  10205. }
  10206. BOOL PQ_GetColorProcessor(void)
  10207. {
  10208. PQHW_CONTEXT* pHwContext= &PQHwContext;
  10209. return pHwContext->bEnableColorProcess;
  10210. }
  10211. UINT8 PQ_GetColorBarStatus(void)
  10212. {
  10213. PQHW_CONTEXT* pHwContext= &PQHwContext;
  10214. return pHwContext->bIsColorBar;
  10215. }
  10216. BOOL PQ_GetMatrixbypassCtl(void)
  10217. {
  10218. PQHW_CONTEXT* pHwContext= &PQHwContext;
  10219. return pHwContext->ucMatrixbypassCtl;
  10220. }
  10221. UINT8 PQ_Get_Source_Grouped_Index(void)
  10222. {
  10223. UINT8 ucCurrSrcIndex=SRC_INDEX_UNKNOWN;
  10224. UINT8 ucNTSC;
  10225. UINT8 ucUserSource;
  10226. UINT8 ucSubSource;
  10227. UINT8 bDVDSource;
  10228. bDVDSource = VIP_JudgeDVDSource();//Differentiate YPbPr and DVD
  10229. VIP_GetSource(&ucUserSource, &ucSubSource);
  10230. switch(VIP_GetUserSource())
  10231. {
  10232. case SOURCE_CVD2:
  10233. ucNTSC = (VIP_GetStdColorSystem() == CVD2_STD_NTSC_M || VIP_GetStdColorSystem() == CVD2_STD_NTSC_443);
  10234. if (VIP_IsATVSource())
  10235. {
  10236. if (ucNTSC)
  10237. {
  10238. ucCurrSrcIndex = SRC_INDEX_ATV_NTSC;
  10239. }
  10240. else
  10241. {
  10242. ucCurrSrcIndex = SRC_INDEX_ATV_PAL;
  10243. }
  10244. }
  10245. else if (VIP_IsAVSource())
  10246. {
  10247. if (ucNTSC)
  10248. {
  10249. ucCurrSrcIndex = SRC_INDEX_AV_NTSC;
  10250. }
  10251. else
  10252. {
  10253. ucCurrSrcIndex = SRC_INDEX_AV_PAL;
  10254. }
  10255. }
  10256. else if (VIP_IsSVSource())
  10257. {
  10258. if (ucNTSC)
  10259. {
  10260. ucCurrSrcIndex = SRC_INDEX_SVideo_NTSC;
  10261. }
  10262. else
  10263. {
  10264. ucCurrSrcIndex = SRC_INDEX_SVideo_PAL;
  10265. }
  10266. }
  10267. break;
  10268. case SOURCE_EXTS:
  10269. if (VIP_IsPCSource())
  10270. {
  10271. ucCurrSrcIndex = SRC_INDEX_PC;
  10272. }
  10273. else if(ucSubSource==SCART_RGB1)
  10274. {
  10275. ucCurrSrcIndex = SRC_INDEX_SCART_RGB;
  10276. }
  10277. else
  10278. {
  10279. /* tune for ypp source */
  10280. if(bDVDSource)
  10281. {
  10282. ucCurrSrcIndex = SRC_INDEX_DVD;
  10283. }
  10284. else
  10285. {
  10286. if (VIP_GetInputVSize()>576+24) /* safer boundary */
  10287. {
  10288. ucCurrSrcIndex = SRC_INDEX_Component_HD;
  10289. }
  10290. else
  10291. {
  10292. ucCurrSrcIndex = SRC_INDEX_Component_SD;
  10293. }
  10294. }
  10295. }
  10296. break;
  10297. case SOURCE_HDMI:
  10298. if (VIP_RunDVIMode())
  10299. {
  10300. ucCurrSrcIndex = SRC_INDEX_DVI;
  10301. }
  10302. else
  10303. {
  10304. if(VIP_GetInputVSize()>576+24) /* safer boundary */
  10305. {
  10306. ucCurrSrcIndex = SRC_INDEX_HDMI_HD;
  10307. }
  10308. else
  10309. {
  10310. ucCurrSrcIndex = SRC_INDEX_HDMI_SD;
  10311. }
  10312. }
  10313. break;
  10314. case SOURCE_MPEG:
  10315. if(VIP_GetInputVSize()>576+24) /* safer boundary */
  10316. {
  10317. ucCurrSrcIndex = SRC_INDEX_DTV_HD;
  10318. }
  10319. else
  10320. {
  10321. ucCurrSrcIndex = SRC_INDEX_DTV_SD;
  10322. }
  10323. if(VIP_IsNetworkSource())
  10324. {
  10325. ucCurrSrcIndex = SRC_INDEX_NETEORK;
  10326. }
  10327. break;
  10328. case SOURCE_JPEG:
  10329. case SOURCE_PATTERN:
  10330. ucCurrSrcIndex = SRC_INDEX_JPEG;
  10331. break;
  10332. }
  10333. return ucCurrSrcIndex;
  10334. }
  10335. void PQ_Default_Color_Lut_Setting(void)
  10336. {
  10337. volatile UINT8 * pLUT = (volatile UINT8*) SPI_COLORLUTTABLE_SHADOWADDR;
  10338. PLUTTable pLUTTable = (PLUTTable) pLUT;
  10339. INT32 i;
  10340. #ifdef CONFIG_SUPPORT_64BIT_LUT
  10341. printk("<0>---function=%s line=%d use 64bit lut--- \n",__FUNCTION__,t_64bit, 0x1);
  10342. #endif
  10343. PQ_RegisterWrite(VIP_reg_dpy_yuv_lut_en, 1);
  10344. PQ_RegisterWrite(VIP_reg_dpy_first_layer, 0);
  10345. PQ_RegisterWrite(VIP_reg_dpy_outer_index, 0);
  10346. if(pLUTTable->HueScale==1)
  10347. PQ_RegisterWrite(VIP_reg_dpy_diff_level, 0x41);
  10348. else
  10349. PQ_RegisterWrite(VIP_reg_dpy_diff_level, 0x40);
  10350. PQ_RegisterWrite(VIP_reg_dpy_sat_outer_min, 0xa0);
  10351. PQ_RegisterWrite(VIP_reg_dpy_sat_inner_min, 0xa0);
  10352. PQ_RegisterWrite(VIP_reg_dpy_rgn_addr, 0x0);
  10353. //add init lut value, because not all lut reg will use.
  10354. PQ_RegisterWrite(VIP_reg_dpy_rgn_addr, 0);
  10355. #ifdef CONFIG_SUPPORT_64BIT_LUT
  10356. for(i=0; i< 16384; i++)
  10357. {
  10358. PQ_RegisterWrite(VIP_reg_dpy_rgn_data, 0);//COLOR_LUTABLE[i]);
  10359. }
  10360. #else
  10361. for(i=0; i< 7936; i++)
  10362. {
  10363. PQ_RegisterWrite(VIP_reg_dpy_rgn_data, 0);//COLOR_LUTABLE[i]);
  10364. }
  10365. #endif
  10366. /*for(i=0; i< 16384; i++)
  10367. {
  10368. PQ_RegisterWrite(VIP_reg_dpy_rgn_addr, i);
  10369. value = PQ_RegisterRead(VIP_reg_dpy_rgn_data);
  10370. if(value!=0)
  10371. printk("<0>\e[31m---[TingWei]function=%s line=%d i=%d value=%d---\e[0m\n",__FUNCTION__,__LINE__,i,value);
  10372. }*/
  10373. }
  10374. int GetHwAddr(int HValue,int SValue,int YValue,int AddrOffset,int type)
  10375. {
  10376. int Addr=0;
  10377. //TRACE("H=%d S=%d Y=%d",HValue,SValue,YValue);
  10378. if(type==1)
  10379. {
  10380. Addr = HValue + (SValue<<4) + (16*6*YValue);
  10381. if(Addr>767)
  10382. Addr = 767;
  10383. }
  10384. else if(type==2)
  10385. {
  10386. Addr = HValue + (SValue<<4) + (16*5*YValue);
  10387. if(Addr>639)
  10388. Addr = 639;
  10389. }
  10390. Addr = (AddrOffset << 10) | Addr;
  10391. return Addr;
  10392. }
  10393. void GetHueMapValue(int Index,int *index_hue_e,int *index_hue_o,int *hue_e)
  10394. {
  10395. int HueValue;
  10396. int index_hue;
  10397. int BaseHueValue=45;
  10398. if(Index>31)
  10399. Index=Index-32;
  10400. HueValue = Index*BaseHueValue;
  10401. index_hue=(HueValue*91+32)/4096;
  10402. *hue_e = (index_hue%2 ==0) ?1 :0;
  10403. if(index_hue>=31)
  10404. *index_hue_e=0;
  10405. else if(*hue_e==0)
  10406. *index_hue_e = (index_hue+1)/2;
  10407. else
  10408. *index_hue_e = index_hue/2;
  10409. if(index_hue>=32)
  10410. *index_hue_o=15;
  10411. else
  10412. *index_hue_o= index_hue/2;
  10413. }
  10414. void GetLumaMapValue(int Index,int *index_luma_e,int *index_luma_o,int *luma_e)
  10415. {
  10416. int LumaValue;
  10417. int index_luma;
  10418. int BaseLumaValue=64;
  10419. LumaValue = (Index+1)*BaseLumaValue;
  10420. index_luma = LumaValue/64;
  10421. *luma_e = (index_luma%2 ==0) ?1 :0;
  10422. if(*luma_e==0)
  10423. *index_luma_e = (index_luma+1)/2 - 1;
  10424. else
  10425. *index_luma_e = index_luma/2 - 1;
  10426. *index_luma_o = index_luma/2;
  10427. }
  10428. void GetSatMapValue(int Index,int *index_sat_e,int *index_sat_o,int *sat_e)
  10429. {
  10430. int SatValue;
  10431. int index_sat;
  10432. int BaseSatValue=64;
  10433. SatValue = Index*BaseSatValue+64; //64~704
  10434. index_sat = (SatValue-64)/64;
  10435. *sat_e = (index_sat%2==1) ?1 :0;
  10436. *index_sat_e = index_sat/2;
  10437. if(*sat_e==1)
  10438. *index_sat_o=(index_sat+1)/2;
  10439. else
  10440. *index_sat_o= index_sat/2;
  10441. if (*index_sat_e>4)
  10442. *index_sat_e = 4;
  10443. if (*index_sat_o>5)
  10444. *index_sat_o = 5;
  10445. //TRACE("sat %d %d %d",*index_sat_e,*index_sat_o,*sat_e);
  10446. }
  10447. int GetLutHwAddress(int HueIndex,int SatIndex,int LumaIndex)
  10448. {
  10449. int dwAddr=0;
  10450. int hw_hue_e;
  10451. int hw_hue_o;
  10452. int hue_e;
  10453. int hw_luma_e;
  10454. int hw_luma_o;
  10455. int luma_e;
  10456. int hw_sat_e;
  10457. int hw_sat_o;
  10458. int sat_e;
  10459. GetHueMapValue(HueIndex,&hw_hue_e,&hw_hue_o,&hue_e);
  10460. GetLumaMapValue(LumaIndex,&hw_luma_e,&hw_luma_o,&luma_e);
  10461. GetSatMapValue(SatIndex,&hw_sat_e,&hw_sat_o,&sat_e);
  10462. if ((hue_e==1)&& (sat_e==1) &&( luma_e==1))
  10463. dwAddr = GetHwAddr(hw_hue_e,hw_sat_e,hw_luma_e,0,2);
  10464. else if ((hue_e==1)&& (sat_e==1) &&(luma_e==0))
  10465. dwAddr = GetHwAddr(hw_hue_e,hw_sat_e,hw_luma_o,1,2);
  10466. else if ((hue_e==1)&& (sat_e==0) &&(luma_e==1))
  10467. dwAddr = GetHwAddr(hw_hue_e,hw_sat_o,hw_luma_e,2,1);
  10468. else if ((hue_e==1)&& (sat_e==0) &&(luma_e==0))
  10469. dwAddr = GetHwAddr(hw_hue_e,hw_sat_o,hw_luma_o,3,1);
  10470. else if ((hue_e==0)&& (sat_e==1) &&(luma_e==1))
  10471. dwAddr = GetHwAddr(hw_hue_o,hw_sat_e,hw_luma_e,4,2);
  10472. else if ((hue_e==0)&& (sat_e==1) &&(luma_e==0))
  10473. dwAddr = GetHwAddr(hw_hue_o,hw_sat_e,hw_luma_o,5,2);
  10474. else if ((hue_e==0)&& (sat_e==0) &&(luma_e==1))
  10475. dwAddr = GetHwAddr(hw_hue_o,hw_sat_o,hw_luma_e,6,1);
  10476. else if ((hue_e==0)&& (sat_e==0) &&(luma_e==0))
  10477. dwAddr = GetHwAddr(hw_hue_o,hw_sat_o,hw_luma_o,7,1);
  10478. return dwAddr;
  10479. }
  10480. void PQ_ColorLUTSortOffsetToPt(UINT32 *dwOffsetSort, LUT_OFFSET ptLUTout[16][11][32])
  10481. {
  10482. //int i, j, x, y, z, xv=0, yv=0, zv=0;
  10483. int x,y,z;
  10484. int HValue=0,SValue=0,YValue=0;
  10485. UINT32 dwAddr;
  10486. UINT32 dwOffset;
  10487. //int DiffLevel=0;//g_SiSUart.ReadFromSiS(0xbe1ccb54)&0x3;
  10488. for (z = 0; z < 16; z++)
  10489. {
  10490. for (y = 0; y < 11; y++)
  10491. {
  10492. for (x = 0; x < 32; x++)
  10493. {
  10494. dwAddr = GetLutHwAddress(x,y,z);
  10495. if(dwOffsetSort != NULL)
  10496. {
  10497. dwOffset = dwOffsetSort[dwAddr];
  10498. HValue = (dwOffset>>11)&0x1f; //H
  10499. if((HValue>>4)==1)
  10500. HValue=(-1)*(16-(HValue&0xf));
  10501. SValue = ((dwOffset>>6)&0x1f)-m_Global_S_offset; //S
  10502. YValue = (dwOffset)&0x3f; //Y
  10503. if((YValue>>5)==1)//Y<0
  10504. {//2+
  10505. YValue=(-1)*(32-(YValue&0x1f));
  10506. //if(zv==0)
  10507. // zv=-32;
  10508. }//2-
  10509. if(ptLUTout !=NULL)
  10510. {
  10511. ptLUTout[z][y][x].Hoffset = HValue;
  10512. ptLUTout[z][y][x].Soffset = SValue;
  10513. ptLUTout[z][y][x].Yoffset = YValue;
  10514. }
  10515. }
  10516. }
  10517. }
  10518. }
  10519. //DiffLevel=1<<DiffLevel;
  10520. /*for (i = 0; i < 8; i++)
  10521. {//0+
  10522. for (j = 0; j < st_nCubePtCount[i]; j++)
  10523. {//1+
  10524. dwAddr = (i<<10)+j;
  10525. PQ_ColorLUTGetXYZFromAddress(dwAddr, &x, &y, &z);
  10526. dwOffset = dwOffsetSort[st_nCubePtIdxStart[i]+j];
  10527. xv = (dwOffset>>11)&0x1f; //H
  10528. if((xv>>4)==1)
  10529. {//2+
  10530. xv=(-1)*(16-(xv&0xf));
  10531. // if(xv==0)
  10532. // xv=-16;
  10533. }//2-
  10534. //S:0~31
  10535. yv = ((dwOffset>>6)&0x1f)-m_Global_S_offset; //S
  10536. zv = (dwOffset)&0x3f; //Y
  10537. if((zv>>5)==1)//Y<0
  10538. {//2+
  10539. zv=(-1)*(32-(zv&0x1f));
  10540. //if(zv==0)
  10541. // zv=-32;
  10542. }//2-
  10543. ptLUTout[z][y][x].Hoffset = xv;
  10544. ptLUTout[z][y][x].Soffset = yv;
  10545. ptLUTout[z][y][x].Yoffset = zv;
  10546. }//1-
  10547. }//0-*/
  10548. // AfxMessageBox("exit here............2");
  10549. }
  10550. void PQ_ColorLUTSortLUTV3(LUT_OFFSET ptLUTout[16][11][32], UINT32 *dwOffsetSort)
  10551. {
  10552. int x, y, z;
  10553. int iHdiff, iSdiff, iYdiff;
  10554. //INT32 xd, yd, zd;
  10555. UINT32 dwAddr;
  10556. //int nCount[8];
  10557. //int nMax[8];
  10558. UINT32 nMax[8];
  10559. UINT32 dwOffset;
  10560. //memset(nCount, 0, sizeof(nCount));
  10561. memset(nMax, 0, sizeof(nMax));
  10562. for (z = 0; z < 16; z++)
  10563. {
  10564. for (y = 0; y < 11; y++)
  10565. {
  10566. for (x = 0; x < 32; x++)
  10567. {
  10568. iHdiff=ptLUTout[z][y][x].Hoffset;
  10569. iSdiff=ptLUTout[z][y][x].Soffset+m_Global_S_offset;
  10570. iYdiff=ptLUTout[z][y][x].Yoffset;
  10571. //if((iHdiff!=0)||(iSdiff!=0)||(iYdiff!=0))
  10572. //{fprintf(fp,"1.(%d,%d,%d) diff = (%d,%d,%d)=%d\n", x, y, z, iHdiff&0x0000001f, iSdiff, iYdiff,dwOffset[z][y][x]);}
  10573. if (iHdiff > 15)
  10574. {
  10575. //fprintf(fp,"x,y,z(%d,%d,%d) diff = (%d,%d,%d), out of range\n", x, y, z, iHdiff, iSdiff, iYdiff);
  10576. iHdiff = 15;
  10577. }
  10578. if(iHdiff < -16)
  10579. {
  10580. //fprintf(fp,"x,y,z(%d,%d,%d) diff = (%d,%d,%d), out of range\n", x, y, z, iHdiff, iSdiff, iYdiff);
  10581. iHdiff = -16;
  10582. }
  10583. if (iSdiff > 31)
  10584. {
  10585. //TRACE("x,y,z(%d,%d,%d) diff = (%d,%d,%d), out of range\n", x, y, z, iHdiff, iSdiff, iYdiff);
  10586. iSdiff = 31;
  10587. }
  10588. if(iSdiff < 0)
  10589. {
  10590. //TRACE("x,y,z(%d,%d,%d) diff = (%d,%d,%d), out of range\n", x, y, z, iHdiff, iSdiff, iYdiff);
  10591. iSdiff = 0;
  10592. }
  10593. if (iYdiff > 31)
  10594. {
  10595. //TRACE("x,y,z(%d,%d,%d) diff = (%d,%d,%d), out of range\n", x, y, z, iHdiff, iSdiff, iYdiff);
  10596. iYdiff = 31;
  10597. }
  10598. if(iYdiff < -32)
  10599. {
  10600. //TRACE("x,y,z(%d,%d,%d) diff = (%d,%d,%d), out of range\n", x, y, z, iHdiff, iSdiff, iYdiff);
  10601. iYdiff = -32;
  10602. }
  10603. // Y S H
  10604. // 6 5 5
  10605. // -32~+31 0~31 -16~+15
  10606. //if(b_Set180Degree)
  10607. //dwOffset[z][y][(x+16)%32] = ((iHdiff&0x3f)<<10)+((iSdiff&0x1f)<<5)+(iYdiff&0x1f);
  10608. //else
  10609. dwOffset = ((iHdiff&0x1f)<<11) | ((iSdiff&0x1f)<<6) |(iYdiff&0x3f);
  10610. //dwOffset = 0xA1B2C3D4;
  10611. dwAddr = GetLutHwAddress(x, y, z);
  10612. dwOffsetSort[dwAddr] = dwOffset;
  10613. //nCount[dwAddr>>10]++;
  10614. //if ((dwAddr&0x3ff)>nMax[dwAddr>>10]) nMax[dwAddr>>10] = dwAddr&0x3ff;
  10615. }
  10616. }
  10617. }
  10618. }
  10619. BOOL PQ_ColorLUT_CalcRegion(
  10620. UINT8 *hue_max, UINT8 *hue_min, UINT8 *sat_max, UINT8 *sat_min, UINT8 *y_max, UINT8 *y_min,
  10621. INT8 *hue_gain, INT8 *sat_gain, INT8 *y_gain,
  10622. UINT8 *en, INT32 regnum, UINT32* dwDataAddr, UINT32* dwDataAddrOut)
  10623. {
  10624. static COLORLUT_BUF *pbuf = NULL;
  10625. INT32 y, h, s, ridx;
  10626. int st_hLevel[32] = {0, 45, 90, 135, 180, 225, 270, 315, 360, 405,
  10627. 450, 495, 540, 585, 630, 675, 720, 765, 810, 855,
  10628. 900, 945, 990, 1035, 1080, 1125, 1170, 1215, 1260,
  10629. 1305, 1350, 1395};
  10630. int st_sLevel[11] = {0, 64, 128, 192, 256, 320, 384, 448, 512, 576, 640};
  10631. int st_vLevel[16] = {64, 128, 192, 256, 320, 384, 448, 512, 576, 640 ,704, 768, 832, 896, 960, 1024};
  10632. pbuf = (COLORLUT_BUF*)drv_vmalloc(sizeof(COLORLUT_BUF),MODULEID_VIP);
  10633. if (NULL == pbuf || NULL == dwDataAddr) return FALSE;
  10634. memset(pbuf, 0, sizeof(COLORLUT_BUF));
  10635. PQ_ColorLUTSortOffsetToPt(dwDataAddr, pbuf->lutOffset);
  10636. for (ridx = 0; ridx < regnum; ridx++)
  10637. {
  10638. if (en[ridx]) {
  10639. int Yc, Hc, Sc, Ymin, Ymax, Hmin, Hmax, Smin, Smax;
  10640. int Yration = 0, Hration = 0, Sration = 0;
  10641. int fac;
  10642. Ymin = st_vLevel[y_min[ridx]];
  10643. Ymax = st_vLevel[y_max[ridx]];
  10644. Yc = (Ymin + Ymax)/2;
  10645. Hmin = st_hLevel[hue_min[ridx]];
  10646. Hmax = st_hLevel[hue_max[ridx]];
  10647. if (Hmax > Hmin) {
  10648. Hc = (Hmin + Hmax)/2;
  10649. }else {
  10650. int max, tmp;
  10651. tmp = 1440 - Hmin;
  10652. max = Hmax + tmp;
  10653. Hc = (max/2) + Hmin;
  10654. if (Hc >= 1440) {
  10655. Hc = Hc - 1440;
  10656. }
  10657. }
  10658. Smin = st_sLevel[sat_min[ridx]];
  10659. Smax = st_sLevel[sat_max[ridx]];
  10660. Sc = (Smin + Smax)/2;
  10661. for (y = 0; y < 16; y++)
  10662. {
  10663. if (y >= y_min[ridx] && y <= y_max[ridx])
  10664. {
  10665. if (st_vLevel[y] >= Yc)
  10666. {
  10667. if((Ymax-Yc) > 0)
  10668. {
  10669. Yration = ((st_vLevel[y] - Yc)*100)/(Ymax-Yc);
  10670. }
  10671. }
  10672. else
  10673. {
  10674. if((Ymax-Yc) > 0)
  10675. {
  10676. Yration = ((Yc - st_vLevel[y])*100)/(Ymax-Yc);
  10677. }
  10678. }
  10679. for (s = 0; s < 11; s++)
  10680. {
  10681. if (s >= sat_min[ridx] && s <= sat_max[ridx])
  10682. {
  10683. if (st_sLevel[s] >= Sc)
  10684. {
  10685. if((Smax-Sc) > 0)
  10686. {
  10687. Sration = ((st_sLevel[s] - Sc)*100)/(Smax-Sc);
  10688. }
  10689. }
  10690. else
  10691. {
  10692. if((Smax-Sc) > 0)
  10693. {
  10694. Sration = ((Sc - st_sLevel[s])*100)/(Smax-Sc);
  10695. }
  10696. }
  10697. for (h = 0; h < 32; h++)
  10698. {
  10699. int inrange = FALSE;
  10700. if (Hmin <= Hmax)
  10701. {
  10702. if (h >= hue_min[ridx] && h <= hue_max[ridx])
  10703. {
  10704. inrange = TRUE;
  10705. }
  10706. }
  10707. else
  10708. {
  10709. if (h >= hue_min[ridx] && h >= hue_max[ridx])
  10710. {
  10711. inrange = TRUE;
  10712. }
  10713. else if (h <= hue_min[ridx] && h <= hue_max[ridx])
  10714. {
  10715. inrange = TRUE;
  10716. }
  10717. }
  10718. if (inrange)
  10719. {
  10720. int upper, lower;
  10721. if (Hmin < Hmax)
  10722. {
  10723. if (st_hLevel[h] >= Hc ) {
  10724. upper = st_hLevel[h] - Hc;
  10725. }else {
  10726. upper = Hc - st_hLevel[h];
  10727. }
  10728. lower = Hmax - Hc;
  10729. }
  10730. else
  10731. {
  10732. int shift, tmpmax_angle, tmplevel, tmp_Hc;
  10733. shift = 1440 - Hmin;
  10734. tmpmax_angle = Hmax + shift;
  10735. if (Hc > Hmax)
  10736. {
  10737. tmp_Hc = Hc + shift - 1440;
  10738. }
  10739. else
  10740. {
  10741. tmp_Hc = Hc + shift;
  10742. }
  10743. if (st_hLevel[h] > Hmax)
  10744. {
  10745. tmplevel = st_hLevel[h] + shift - 1440;
  10746. }
  10747. else
  10748. {
  10749. tmplevel = st_hLevel[h]+ shift;
  10750. }
  10751. if (tmplevel >= tmp_Hc ) {
  10752. upper = tmplevel - tmp_Hc;
  10753. }else {
  10754. upper = tmp_Hc - tmplevel;
  10755. }
  10756. lower = tmpmax_angle - tmp_Hc;
  10757. }
  10758. if(lower > 0)
  10759. {
  10760. Hration = (upper*100)/(lower);
  10761. }
  10762. fac = Yration > Hration ? Yration : Hration;
  10763. fac = Sration > fac ? Sration : fac;
  10764. fac = 100 - ((fac*lut_smooth_level)/100);
  10765. //printk("y = %d, h = %d, s =%d, Yration = %d, Hration = %d, Sration =%d, fac = %d\n", y, h, s, Yration, Hration, Sration, fac);
  10766. if (lut_make[ridx])
  10767. {
  10768. pbuf->lutOffset[y][s][h].Hoffset = -32;
  10769. pbuf->lutOffset[y][s][h].Soffset = -32;
  10770. pbuf->lutOffset[y][s][h].Yoffset = -32;
  10771. }
  10772. else
  10773. {
  10774. pbuf->lutOffset[y][s][h].Hoffset += (hue_gain[ridx]*fac)/100;
  10775. pbuf->lutOffset[y][s][h].Soffset += (sat_gain[ridx]*fac)/100;
  10776. pbuf->lutOffset[y][s][h].Yoffset += (y_gain[ridx]*fac)/100;
  10777. }
  10778. }
  10779. }
  10780. }
  10781. }
  10782. }
  10783. }
  10784. }
  10785. }
  10786. PQ_ColorLUTSortLUTV3(pbuf->lutOffset,dwDataAddrOut);
  10787. drv_vfree(pbuf, MODULEID_VIP);
  10788. return TRUE;
  10789. }
  10790. unsigned long pqcrcTable[256] = {
  10791. 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
  10792. 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
  10793. 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2,
  10794. 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
  10795. 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,
  10796. 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
  10797. 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C,
  10798. 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
  10799. 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423,
  10800. 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
  10801. 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106,
  10802. 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
  10803. 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D,
  10804. 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
  10805. 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,
  10806. 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
  10807. 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7,
  10808. 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
  10809. 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA,
  10810. 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
  10811. 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
  10812. 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
  10813. 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84,
  10814. 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
  10815. 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
  10816. 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
  10817. 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E,
  10818. 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
  10819. 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55,
  10820. 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
  10821. 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28,
  10822. 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
  10823. 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F,
  10824. 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
  10825. 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,
  10826. 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
  10827. 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,
  10828. 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
  10829. 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC,
  10830. 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
  10831. 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
  10832. 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
  10833. 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
  10834. };
  10835. unsigned long CountCRC32(char *pData, int len)
  10836. {
  10837. unsigned long crc;
  10838. int i;
  10839. unsigned long c;
  10840. crc = 0xFFFFFFFF;
  10841. for(i=0; i<len; i++)
  10842. {
  10843. c = (unsigned long)pData[i];
  10844. crc = ((crc>>8) & 0x00FFFFFF) ^ pqcrcTable[ (crc^c) & 0xFF ];
  10845. }
  10846. return( crc^0xFFFFFFFF );
  10847. }
  10848. BOOL CheckLutCRC(UINT32 FileSize)
  10849. {
  10850. volatile UINT8 * pLUT = (volatile UINT8*) SPI_COLORLUTTABLE_SHADOWADDR;
  10851. char *DataStart = (char *)pLUT;
  10852. int CRCSize;
  10853. unsigned long CRCValue;
  10854. int CRCAddr;
  10855. unsigned long dwCRC;
  10856. int ret=FALSE;
  10857. CRCSize = FileSize - sizeof(LUTHead)-16;
  10858. CRCValue = CountCRC32(DataStart+sizeof(LUTHead),CRCSize);
  10859. CRCAddr= CRCSize+sizeof(LUTHead)+12;
  10860. dwCRC = ((DataStart[CRCAddr+3]&0xff)<<24)|((DataStart[CRCAddr+2]&0xff)<<16)|((DataStart[CRCAddr+1]&0xff)<<8)|(DataStart[CRCAddr]&0xff);
  10861. //printk(KERN_EMERG"\e[31m---[TingWei]function=%s line=%d %x %lx %lx %x %x %x %x---\e[0m\n",__FUNCTION__,__LINE__,CRCSize,CRCValue,dwCRC,DataStart[CRCAddr]&0xff,DataStart[CRCAddr+1]&0xff,DataStart[CRCAddr+2]&0xff,DataStart[CRCAddr+3]&0xff);
  10862. if(CRCValue==dwCRC)
  10863. {
  10864. ret=TRUE;
  10865. }
  10866. return ret;
  10867. }
  10868. /*void PQ_CheckLutCheckSum(UINT32* dwDataAddr,UINT32 DataSize)
  10869. {
  10870. UINT32 DataSum=0;
  10871. UINT32 i;
  10872. for(i=0;i<DataSize;i++)
  10873. DataSum +=dwDataAddr[i];
  10874. printk("<0>\e[31m===>DataSum=%x DataSize=%d\e[0m\n",DataSum,DataSize);
  10875. }*/
  10876. BOOL PQ_SetupLUTTable(UINT8 ucEnable)
  10877. {
  10878. volatile UINT8 * pLUT = (volatile UINT8*) SPI_COLORLUTTABLE_SHADOWADDR;
  10879. UINT32 *pdwLUT = (UINT32 *) pLUT;
  10880. PLUTTable pLUTTable = (PLUTTable) pLUT;
  10881. LUTTableInfo *pTblInfo;
  10882. UINT32 * pLUTPivotTable ;
  10883. UINT16 IndexOffset;
  10884. UINT32 ulXorCRC;
  10885. UINT8 ucCurrSrcIndex, ucTableIndex;
  10886. UINT32 i;
  10887. //UINT8 Is330C=0;
  10888. //INT32 ColorLUT330C_Block_PointNum[8] = {729, 648, 648, 576, 648, 576, 576, 512}; /* 8 block */
  10889. INT32 ColorLUT531_Block_PointNum[8] = {640, 640, 768, 768,640, 640, 768, 768}; /* 8 block */
  10890. INT32 DataNum;
  10891. INT32 iTableCnt;
  10892. *(volatile unsigned char*)(0xbe1c0000)=0x13;
  10893. /* validate table */
  10894. if (memcmp(pLUTTable->LUTID,"LUT",3))
  10895. {
  10896. printk(KERN_EMERG"%s: LUT Table ID incorrect!", __FUNCTION__);
  10897. return FALSE;
  10898. }
  10899. ulXorCRC = 0;
  10900. for (i=0;i<pLUTTable->FileSize/sizeof(UINT32);i++)
  10901. {
  10902. ulXorCRC ^= pdwLUT[i];
  10903. }
  10904. if (ulXorCRC && CheckLutCRC(pLUTTable->FileSize)==FALSE)
  10905. {
  10906. printk(KERN_EMERG"%s: XorCRC invalid!", __FUNCTION__);
  10907. return FALSE;
  10908. }
  10909. if (pLUTTable->IndexOffset!= offsetof(LUTTable,TblInfo))
  10910. {
  10911. printk(KERN_EMERG"%s: Table (version %d) format changed!", __FUNCTION__, pLUTTable->Version);
  10912. }
  10913. if (pLUTTable->IndexOffset > pLUTTable->HeadLength)
  10914. {
  10915. printk(KERN_EMERG"%s: Table Index offset %d > HeadLength %d !", __FUNCTION__, pLUTTable->IndexOffset, pLUTTable->HeadLength);
  10916. }
  10917. ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  10918. if ((ucCurrSrcIndex >= SRC_INDEX_UNKNOWN) || (ucCurrSrcIndex >= pLUTTable->SrcCount))
  10919. {
  10920. printk(KERN_EMERG"%s: SrcIndex (%d) unknown/invalid, pLUTTable->SrcCount (%d)!", __FUNCTION__, ucCurrSrcIndex,pLUTTable->SrcCount);
  10921. return FALSE;
  10922. }
  10923. ucTableIndex = pLUTTable->SrcIndex[ucCurrSrcIndex];
  10924. if (ucTableIndex >= pLUTTable->TableCount)
  10925. {
  10926. printk(KERN_EMERG"%s: SrcIndex value (%d) > TableCount (%d)!", __FUNCTION__, ucCurrSrcIndex, pLUTTable->TableCount);
  10927. return FALSE;
  10928. }
  10929. #ifdef CONFIG_SUPPORT_64BIT_LUT
  10930. printk("<0>---function=%s line=%d 64bit lut can't setup lut--- \n",__FUNCTION__,__LINE__);
  10931. return FALSE;
  10932. #endif
  10933. /*
  10934. if(pHwContext->LUTIndex != ucTableIndex || pHwContext->LUTEnable != ucEnable)//prevent blanking from duplicate setting
  10935. */
  10936. {
  10937. /*
  10938. pHwContext->LUTIndex = ucTableIndex;
  10939. pHwContext->LUTEnable = ucEnable;
  10940. */
  10941. if( ucEnable!=DISABLE )
  10942. {
  10943. IndexOffset = pLUTTable->IndexOffset;
  10944. pTblInfo = (LUTTableInfo *) (pLUT+IndexOffset);
  10945. pLUTPivotTable = (UINT32 *)(pLUT + pTblInfo[ucTableIndex].TableOffset);
  10946. down(&LutTableLock);
  10947. //printk(KERN_EMERG"Loading LUT Table from table index %d start.......", ucTableIndex);
  10948. {
  10949. BOOL bCalcRegionOK = FALSE;
  10950. static UINT32 *dwDataNew = NULL;
  10951. if(dwDataNew==NULL)
  10952. dwDataNew = (UINT32*)drv_vmalloc(7936*4,MODULEID_VIP);
  10953. if (NULL != dwDataNew)
  10954. {
  10955. //PQ_CheckLutCheckSum(pLUTPivotTable,7936);
  10956. memset(dwDataNew, 0, 7936*4);
  10957. bCalcRegionOK = PQ_ColorLUT_CalcRegion(
  10958. lut_rgn_hue_max, lut_rgn_hue_min, lut_rgn_sat_max, lut_rgn_sat_min, lut_rgn_y_max, lut_rgn_y_min,
  10959. lut_rgn_hue_gain, lut_rgn_sat_gain, lut_rgn_y_gain,
  10960. lut_rgn_en, COLORLUT_RGN_NUM, pLUTPivotTable, dwDataNew);
  10961. //PQ_CheckLutCheckSum(dwDataNew,7936);
  10962. DataNum = 0;
  10963. for (i=0;i<8;i++)
  10964. {
  10965. PQ_RegisterWrite(VIP_reg_dpy_rgn_addr,i<<10);
  10966. for (iTableCnt=0;iTableCnt<ColorLUT531_Block_PointNum[i];iTableCnt++)//for (iTableCnt=0;iTableCnt<ColorLUT330C_Block_PointNum[i];iTableCnt++)
  10967. {
  10968. //PQ_RegisterWrite(VIP_reg_dpy_rgn_data, bCalcRegionOK? dwDataNew[DataNum]:pLUTPivotTable[DataNum]);
  10969. *(volatile unsigned long*)(0xbe1cc184) = bCalcRegionOK? dwDataNew[DataNum]:pLUTPivotTable[DataNum];//+0x80);
  10970. //printk(KERN_EMERG"[%d]:%08x",DataNum,dwDataNew[DataNum]);
  10971. DataNum++;
  10972. if(DataNum==640) DataNum=1024;
  10973. if(DataNum==1664) DataNum=2048;
  10974. if(DataNum==2816) DataNum=3072;
  10975. if(DataNum==3840) DataNum=4096;
  10976. if(DataNum==4736) DataNum=5120;
  10977. if(DataNum==5760) DataNum=6144;
  10978. if(DataNum==6912) DataNum=7168;
  10979. }
  10980. }
  10981. //drv_vfree(dwDataNew, MODULEID_VIP);
  10982. //dwDataNew = NULL;
  10983. }
  10984. PQ_RegisterWrite(VIP_reg_dpy_rgn_addr, 0x0);
  10985. PQ_RegisterWrite(VIP_reg_dpy_yuv_lut_en,1);
  10986. }
  10987. up(&LutTableLock);
  10988. }
  10989. else
  10990. {
  10991. PQDebugPrint("Turn off LUT.");
  10992. PQ_RegisterWrite(VIP_reg_dpy_yuv_lut_en,0);
  10993. }
  10994. }
  10995. return TRUE;
  10996. }
  10997. BOOL PQ_CheckLastLutValue(void)
  10998. {
  10999. static unsigned long LastCRC=0xff;
  11000. static int LastSrcIndex=0xff;
  11001. unsigned long dwCRCValue;
  11002. UINT8 num = COLORLUT_RGN_NUM;
  11003. dwCRCValue = CountCRC32((char*)lut_rgn_en,sizeof(UINT8)*num)+CountCRC32((char*)lut_rgn_hue_gain,sizeof(INT8)*num)+CountCRC32((char*)lut_rgn_sat_gain,sizeof(INT8)*num)+CountCRC32((char*)lut_rgn_y_gain,sizeof(INT8)*num)+
  11004. CountCRC32((char*)lut_rgn_hue_min,sizeof(UINT8)*num)+CountCRC32((char*)lut_rgn_hue_max,sizeof(UINT8)*num)+CountCRC32((char*)lut_rgn_sat_min,sizeof(UINT8)*num)+CountCRC32((char*)lut_rgn_sat_max,sizeof(UINT8)*num)+
  11005. CountCRC32((char*)lut_rgn_y_min,sizeof(UINT8)*num)+CountCRC32((char*)lut_rgn_y_max,sizeof(UINT8)*num)+CountCRC32((char*)lut_make,sizeof(UINT8)*num)+lut_smooth_level;
  11006. if(LastSrcIndex==PQ_Get_Source_Grouped_Index() && LastCRC==dwCRCValue)
  11007. {
  11008. return FALSE;
  11009. }
  11010. else
  11011. {
  11012. LastSrcIndex=PQ_Get_Source_Grouped_Index();
  11013. LastCRC = dwCRCValue;
  11014. return TRUE;
  11015. }
  11016. }
  11017. INT8 PQ_ColorLUT_GetRegionGain(UINT8 Type, UINT8 Index)
  11018. {
  11019. if(Type == COLORLUT_HUE_GAIN)
  11020. {
  11021. return lut_rgn_hue_gain[Index];
  11022. }
  11023. else if(Type == COLORLUT_SAT_GAIN)
  11024. {
  11025. return lut_rgn_sat_gain[Index];
  11026. }
  11027. return 0xff;
  11028. }
  11029. void PQ_ColorLUT_SetRegion(INT32 iRegionIdx, INT32 iSatGain, INT32 iYGain, INT32 iRotAngle, INT32 iRotGain, INT32 bEnable, BOOL bSet)
  11030. {
  11031. if (iRegionIdx < 0 || iRegionIdx >= COLORLUT_RGN_NUM)
  11032. {
  11033. return;
  11034. }
  11035. lut_rgn_en[iRegionIdx] = bEnable;
  11036. lut_rgn_hue_gain[iRegionIdx] = iRotGain;
  11037. lut_rgn_sat_gain[iRegionIdx] = iSatGain;
  11038. lut_rgn_y_gain[iRegionIdx] = iYGain;
  11039. if(bSet)
  11040. {
  11041. if(PQ_CheckLastLutValue())
  11042. {
  11043. PQ_SetupLUTTable(ENABLE);
  11044. }
  11045. }
  11046. }
  11047. void PQ_ColorLUT_SetRange(UINT8 RegionIdx, UINT8 bMake, UINT8 HueMin, UINT8 HueMax, UINT8 SatMin, UINT8 SatMax, UINT8 YMin, UINT8 YMax, UINT8 SmoothLevel, BOOL bSet)
  11048. {
  11049. if (RegionIdx >= COLORLUT_RGN_NUM)
  11050. {
  11051. return;
  11052. }
  11053. lut_make[RegionIdx] = bMake;
  11054. lut_rgn_hue_min[RegionIdx] = HueMin;
  11055. lut_rgn_hue_max[RegionIdx] = HueMax;
  11056. lut_rgn_sat_min[RegionIdx] = SatMin;
  11057. lut_rgn_sat_max[RegionIdx] = SatMax;
  11058. lut_rgn_y_min[RegionIdx] = YMin;
  11059. lut_rgn_y_max[RegionIdx] = YMax;
  11060. lut_smooth_level = SmoothLevel;
  11061. if (bSet)
  11062. {
  11063. PQ_SetupLUTTable(ENABLE);
  11064. }
  11065. }
  11066. void PQ_SetupSaturationGainCurve(SatGainMethod opt)
  11067. {
  11068. INT32 i;
  11069. PQHW_CONTEXT* pHwContext= &PQHwContext;
  11070. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  11071. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  11072. UINT32 dwSatGainAddr;
  11073. UINT8 ucTableIndex;
  11074. SAT_GAIN_CURVE_V2I_DATA* pSatData;
  11075. static UINT8 preOpt= 0xff;
  11076. static BOOL SatGainInit = FALSE;
  11077. static UINT8 PreTableIndex;
  11078. dwSatGainAddr = VIP_reg_dpy_sat_g0b;
  11079. ucTableIndex = pVtab->mSatGainCurve_V2.mGroupedIndex[ucCurrSrcIndex];
  11080. pSatData = &pVtab->mSatGainCurve_V2.mSatGainCurve_V2_Data[ucTableIndex];
  11081. if ((ucCurrSrcIndex >= SRC_INDEX_UNKNOWN))
  11082. {
  11083. PQDebugPrint("%s: SrcIndex (%d) unknown/invalid, pLUTTable->SrcCount (%d)!\n", __FUNCTION__, ucCurrSrcIndex,pLUTTable->SrcCount);
  11084. return;
  11085. }
  11086. if(SatGainInit)
  11087. {
  11088. if((PreTableIndex == ucTableIndex) && (preOpt == opt))
  11089. {
  11090. return;
  11091. }
  11092. }
  11093. switch(opt)
  11094. {
  11095. case SAT_GAIN_ATV_PAL_I_1280_PANEL_COLORBAR_PATCH: //#51690
  11096. PQ_RegisterWrite(VIP_reg_dpy_sat_g0b, 0x0);
  11097. PQ_RegisterWrite(VIP_reg_dpy_sat_g1b, 0x0);
  11098. PQ_RegisterWrite(VIP_reg_dpy_sat_g2b, 0x40);
  11099. break;
  11100. case SAT_GAIN_NORMAL:
  11101. case SAT_GAIN_ATV_PAL_M_GREY_SCALE_NR_PATCH:
  11102. case SAT_GAIN_ATV_SECAM_GREY_SCALE_NR_PATCH:
  11103. case SAT_GAIN_ATV_GREY_SCALE_PATCH: //#52143
  11104. default:
  11105. //Set VIP_deg_dpy_sat_en
  11106. PQ_RegisterWrite(DPY_DISX_CB58_DW_CB58,(((PQ_RegisterRead(DPY_DISX_CB58_DW_CB58))&0xfeffffff)|(pSatData->iDpySatEn<<24)));
  11107. //Set VIP_reg_dpy_sat_opt
  11108. PQ_RegisterWrite(DPY_DISX_CB58_DW_CB58,(((PQ_RegisterRead(DPY_DISX_CB58_DW_CB58))&0xfdffffff)|(pSatData->iDpySatOpt<<25)));
  11109. //Set VIP_deg_dpy_sat_all
  11110. if(opt == SAT_GAIN_ATV_PAL_M_GREY_SCALE_NR_PATCH)
  11111. {
  11112. PQ_RegisterWrite(DPY_DISX_CB54_DW_CB54,(((PQ_RegisterRead(DPY_DISX_CB54_DW_CB54))&0x00ffffff)|(0x40<<24)));
  11113. }
  11114. else if(opt == SAT_GAIN_ATV_SECAM_GREY_SCALE_NR_PATCH)
  11115. {
  11116. PQ_RegisterWrite(DPY_DISX_CB54_DW_CB54,(((PQ_RegisterRead(DPY_DISX_CB54_DW_CB54))&0x00ffffff)|(0x44<<24)));
  11117. }
  11118. else
  11119. {
  11120. PQ_RegisterWrite(DPY_DISX_CB54_DW_CB54,(((PQ_RegisterRead(DPY_DISX_CB54_DW_CB54))&0x00ffffff)|(pSatData->iDpySatAll<<24)));
  11121. }
  11122. //Set VIP_deg_dpy_hue
  11123. PQ_RegisterWrite(DPY_DISX_CB58_DW_CB58,(((PQ_RegisterRead(DPY_DISX_CB58_DW_CB58))&0xffff00ff)|(pSatData->iDpySatHue<<8)));
  11124. for (i = 0; i < 17; i++)
  11125. {
  11126. PQ_RegisterWrite(dwSatGainAddr+i, pSatData->iSat_Gain[i]);
  11127. }
  11128. if(opt == SAT_GAIN_ATV_PAL_M_GREY_SCALE_NR_PATCH || opt == SAT_GAIN_ATV_SECAM_GREY_SCALE_NR_PATCH || opt == SAT_GAIN_ATV_GREY_SCALE_PATCH)
  11129. {
  11130. PQ_RegisterWrite(VIP_reg_dpy_sat_g0b, 0x20);
  11131. PQ_RegisterWrite(VIP_reg_dpy_sat_g1b, 0x20);
  11132. PQ_RegisterWrite(VIP_reg_dpy_sat_g2b, 0x20);
  11133. }
  11134. SatGainInit = TRUE;
  11135. break;
  11136. }
  11137. PreTableIndex = ucTableIndex;
  11138. preOpt = opt;
  11139. }
  11140. void PQ_GetRegInfo(PQ_RegInfo* pRegInfo)
  11141. {
  11142. pRegInfo->NRRangeMax = 3; //0=OFF 1=WEAK 2=MEDIUM 3=STRONG
  11143. pRegInfo->NRRangeMid = 2;
  11144. pRegInfo->NRRangeMin = 0;
  11145. pRegInfo->GammaRangeMax = 2; //cType : 0=SD Video, 1=HD Video, 2=RGB
  11146. pRegInfo->GammaRangeMid = 1;
  11147. pRegInfo->GammaRangeMin = 0;
  11148. pRegInfo->BacklightRangeMax = 3; //0=OFF 1=WEAK 2=MEDIUM 3=STRONG
  11149. pRegInfo->BacklightRangeMid = 2;
  11150. pRegInfo->BacklightRangeMin = 0;
  11151. }
  11152. BOOL PQ_IsFadeEn(void)
  11153. {
  11154. PQHW_CONTEXT* pHwContext= &PQHwContext;
  11155. return pHwContext->bFadeEn;
  11156. }
  11157. void PQ_SetFadeValue(BOOL bFadeEn, UINT8 ucStartValue, UINT8 ucEndValue, UINT8 ucIncValue)
  11158. {
  11159. PQHW_CONTEXT* pHwContext= &PQHwContext;
  11160. pHwContext->bFadeEn = bFadeEn;
  11161. pHwContext->ucFadeStartValue = ucStartValue;
  11162. pHwContext->ucFadeEndValue = ucEndValue;
  11163. pHwContext->ucFadeIncValue = ucIncValue;
  11164. }
  11165. void PQ_SetFadeInOut(void)
  11166. {
  11167. UINT32 ulContrastValue;
  11168. PQHW_CONTEXT* pHwContext= &PQHwContext;
  11169. UINT8 ucStartValue = pHwContext->ucFadeStartValue;
  11170. UINT8 ucEndValue = pHwContext->ucFadeEndValue;
  11171. UINT8 ucIncValue = pHwContext->ucFadeIncValue;
  11172. static UINT32 ulcurValue = 0;
  11173. static UINT8 counter = 0;
  11174. if (pHwContext->bFadeEn)
  11175. {
  11176. if (counter == 0)
  11177. ulcurValue = ucStartValue;
  11178. ulContrastValue = ulcurValue * PQ_GetCurrContrastValue() / 256;
  11179. PQ_Contrast(TRUE, ulContrastValue);
  11180. if (ucEndValue > ucStartValue)
  11181. {
  11182. if (ulcurValue < ucEndValue)
  11183. {
  11184. ulcurValue += ucIncValue;
  11185. counter++;
  11186. }
  11187. else
  11188. {
  11189. PQ_Contrast(TRUE, (ucEndValue * PQ_GetCurrContrastValue() + 128) / 256);
  11190. ulcurValue = 0;
  11191. counter = 0;
  11192. pHwContext->bFadeEn = 0;
  11193. }
  11194. }
  11195. else
  11196. {
  11197. if ((signed)ulcurValue > ucEndValue)
  11198. {
  11199. ulcurValue -= ucIncValue;
  11200. counter++;
  11201. }
  11202. else
  11203. {
  11204. PQ_Contrast(TRUE, (ucEndValue * PQ_GetCurrContrastValue() + 128) / 256);
  11205. ulcurValue = 0;
  11206. counter = 0;
  11207. pHwContext->bFadeEn = 0;
  11208. }
  11209. }
  11210. }
  11211. }
  11212. //#ifdef VIP_SW_DC
  11213. #if 1
  11214. void PQ_GetSWDCParamCmd(ST_SWDC_Param *param)
  11215. {
  11216. //if(DLC_Source <7)
  11217. //{
  11218. // *param =PQ_SWDC_Param[DLC_Source];
  11219. //}
  11220. //else
  11221. {
  11222. *param = SWDC_Param[0];
  11223. }
  11224. }
  11225. void PQ_SetSWDCParamCmd(ST_SWDC_Param *param)
  11226. {
  11227. SWDC_Param[0]= *param;
  11228. PQ_RegisterWrite(VIP_reg_dpy_hist_en,SWDC_Param[0].ucSWDC_En);
  11229. }
  11230. void PQ_GetSWDCSlopeCmd(ST_SWDC_Slope *pstSlope)
  11231. {
  11232. //if(DLC_Source <7)
  11233. //{
  11234. // *pstSlope =PQ_SWDC_HistSlop[DLC_Source];// Get Current Value
  11235. //}
  11236. //else
  11237. {
  11238. *pstSlope = SWDC_HistSlop[0];
  11239. }
  11240. }
  11241. void PQ_SetSWDCSlopeCmd(ST_SWDC_Slope *pstSlope)
  11242. {
  11243. SWDC_HistSlop[0]=*pstSlope;
  11244. }
  11245. void PQ_GetSWDCChromaCmd(ST_SWDC_Chroma *pstChroma)
  11246. {
  11247. //if(DLC_Source <7)
  11248. //{
  11249. // *pstChroma = PQ_SWDC_HistChroma[DLC_Source];// Get Current Value
  11250. //}
  11251. //else
  11252. {
  11253. *pstChroma = SWDC_HistChroma[0];
  11254. }
  11255. }
  11256. void PQ_SetSWDCChromaCmd(ST_SWDC_Chroma *pstChroma)
  11257. {
  11258. SWDC_HistChroma[0] = *pstChroma;
  11259. }
  11260. void PQ_GetSWDCInfoCmd(ST_SWDC_Info *info)
  11261. {
  11262. PQHW_CONTEXT* pHwContext= &PQHwContext;
  11263. info->ulHistCaseCur = pHwContext->ulHistCaseCur;
  11264. }
  11265. void PQ_SetSWDCSourceCmd(UINT8 *param)
  11266. {
  11267. DLC_Source =param[0];
  11268. }
  11269. void PQ_GetSWDCSourceCmd(UINT8 *param)
  11270. {
  11271. param[0] = DLC_Source;
  11272. }
  11273. void PQ_GetDrvCurrentSourceCmd(UINT8 *param)
  11274. {
  11275. UINT8 ucUserSource;
  11276. UINT8 ucSubSource;
  11277. VIP_GetSource(&ucUserSource, &ucSubSource);
  11278. switch(ucUserSource)
  11279. {
  11280. case SOURCE_CVD2:
  11281. if (VIP_IsATVSource())
  11282. {
  11283. param[0] = PQTOOL_SOURCE_ATV;
  11284. }
  11285. else if (VIP_IsAVSource())
  11286. {
  11287. param[0] = PQTOOL_SOURCE_AV;
  11288. }
  11289. else if (VIP_IsSVSource())
  11290. {
  11291. param[0] = PQTOOL_SOURCE_SV;
  11292. }
  11293. break;
  11294. case SOURCE_EXTS:
  11295. if (VIP_IsPCSource())
  11296. {
  11297. param[0] = PQTOOL_SOURCE_PC;
  11298. }
  11299. else
  11300. {
  11301. param[0] = PQTOOL_SOURCE_COMPONENT;
  11302. }
  11303. break;
  11304. case SOURCE_HDMI:
  11305. if (VIP_RunDVIMode())
  11306. {
  11307. param[0] = PQTOOL_SOURCE_DVI;
  11308. }
  11309. else
  11310. {
  11311. param[0] = PQTOOL_SOURCE_HDMI;
  11312. }
  11313. break;
  11314. case SOURCE_MPEG:
  11315. param[0] = PQTOOL_SOURCE_DTV;
  11316. break;
  11317. case SOURCE_JPEG:
  11318. case SOURCE_PATTERN:
  11319. param[0] = PQTOOL_SOURCE_JPEG;
  11320. break;
  11321. default:
  11322. param[0] = 0xff;
  11323. break;
  11324. }
  11325. }
  11326. void PQ_SW_DynamicContrast_UserCurveAdjust(void)
  11327. {
  11328. PQHW_CONTEXT* pHwContext= &PQHwContext;
  11329. INT32 i,j, sum = 0;
  11330. INT32 iSlop[4][15];
  11331. for(i = 0; i<4;i++)
  11332. {
  11333. for(j = 0; j<15;j++)
  11334. {
  11335. iSlop[i][j] = (((INT32)(SWDC_HistSlop->SWDC_HistSlop[i+32][j])*2-256)*((INT32)SWDC_Param->wSWDC_Static_Alpha[i]-128)+64)/128;
  11336. }
  11337. }
  11338. for(i = 0; i<15;i++)
  11339. {
  11340. pHwContext->ulCurveSlop[i]= (iSlop[0][i]+iSlop[1][i]+iSlop[2][i]+iSlop[3][i]);
  11341. sum += (INT32)pHwContext->ulCurveSlop[i];
  11342. }
  11343. pHwContext->ulCurveSlop[15] = (-sum);
  11344. }
  11345. void PQ_SW_DynamicContrast_Param(UINT8 ucSource)
  11346. {
  11347. //SWDC_HistSlop[0] = PQ_SWDC_HistSlop[ucSource];
  11348. //SWDC_HistChroma[0] = PQ_SWDC_HistChroma[ucSource];
  11349. //SWDC_Param[0] = PQ_SWDC_Param[ucSource];
  11350. PQHW_CONTEXT* pHwContext= &PQHwContext;
  11351. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  11352. UINT8 ucTableIndex;
  11353. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  11354. DLC_SET_CURVE_PARAM *pDLC_SET_CURVE_PARAM;
  11355. ucTableIndex = pVtab->mDynContrast.mGroupedIndex[ucCurrSrcIndex];
  11356. pDLC_SET_CURVE_PARAM = &pVtab->mDynContrast.mDLC_Table[ucTableIndex];
  11357. SWDC_HistSlop[0] = pDLC_SET_CURVE_PARAM->dlc_luma_slope;
  11358. SWDC_HistChroma[0] = pDLC_SET_CURVE_PARAM->dlc_chroma_slope;
  11359. SWDC_Param[0].ucSWDC_En = (UINT8)pDLC_SET_CURVE_PARAM->dlc_En;
  11360. SWDC_Param[0].ucSWDC_Var_Cond_En = (UINT8)pDLC_SET_CURVE_PARAM->dlc_Var_Cond_En;
  11361. SWDC_Param[0].wSWDC_Ratio[0] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Ratio[0];
  11362. SWDC_Param[0].wSWDC_Ratio[1] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Ratio[1];
  11363. SWDC_Param[0].wSWDC_Ratio[2] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Ratio[2];
  11364. SWDC_Param[0].wSWDC_Ratio[3] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Ratio[3];
  11365. SWDC_Param[0].wSWDC_Ratio[4] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Ratio[4];
  11366. SWDC_Param[0].wSWDC_Ratio[5] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Ratio[5];
  11367. SWDC_Param[0].wSWDC_Factor[0] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Factor[0];
  11368. SWDC_Param[0].wSWDC_Factor[1] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Factor[1];
  11369. SWDC_Param[0].wSWDC_Factor[2] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Factor[2];
  11370. SWDC_Param[0].wSWDC_Factor[3] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Factor[3];
  11371. SWDC_Param[0].wSWDC_Factor[4] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Factor[4];
  11372. SWDC_Param[0].wSWDC_Alpha = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Alpha;
  11373. SWDC_Param[0].wSWDC_Static_Alpha[0] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Static_Alpha[0];
  11374. SWDC_Param[0].wSWDC_Static_Alpha[1] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Static_Alpha[1];
  11375. SWDC_Param[0].wSWDC_Static_Alpha[2] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Static_Alpha[2];
  11376. SWDC_Param[0].wSWDC_Static_Alpha[3] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Static_Alpha[3];
  11377. SWDC_Param[0].wSWDC_YLevel = (UINT16)pDLC_SET_CURVE_PARAM->dlc_YLevel;
  11378. SWDC_Param[0].wSWDC_CLevel = (UINT16)pDLC_SET_CURVE_PARAM->dlc_CLevel;
  11379. PQ_RegisterWrite(VIP_reg_dpy_hist_en, SWDC_Param[0].ucSWDC_En);
  11380. }
  11381. void PQ_EnSWDCWorkQue_ISR(void)
  11382. {
  11383. PQ_SW_DynamicContrast_SceneChangeDetect_ISR();
  11384. //queue_work(WQ_Struct_SWDC,&WQ_SWDC);
  11385. }
  11386. /**
  11387. * @brief patch function for Dynamic Constract function(DCC)
  11388. *
  11389. * This function only for special DCC case. Set the slope value by array type, and auto calcaulate the start value
  11390. *
  11391. * Current patch pattern
  11392. * 1. ATV and AV Colorbar
  11393. * 2. ATV Secam with white xx% pattern
  11394. * 3. ATV PAL M with white xx% pattern
  11395. *
  11396. * @param BarNoiseFlag, for specific pattern detect
  11397. * @return 1 as patch applied, 0 for DCC regular rule
  11398. */
  11399. BOOL _DCCPatch(BOOL BarNoiseFlag)
  11400. {
  11401. BOOL PatchApplyFlag = PATCHNOTAPPLY;
  11402. #ifdef DRV_ENABLE_CVD2
  11403. UINT8 ucNoiseStatus = 0;
  11404. INT32 i, tmp;
  11405. INT32 ATV_NTSC_COLORBAR_SLOPE[16] = {0xb8, 0xce, 0xf4, 0x12e, 0x152, 0x166, 0x158, 0x128, 0x116, 0x10c, 0x102, 0xec, 0xd6, 0x0c2, 0xb0, 0xb0};
  11406. INT32 ATV_PAL_COLORBAR_SLOPE[16] = {0xd6, 0x125, 0x15e, 0x155, 0x143, 0x13f, 0x129, 0x101, 0xf3, 0xbd, 0xd0, 0xd6, 0xef, 0xe5, 0xea, 0x91};
  11407. INT32 ATV_PAL_M_COLORBAR_SLOPE[16] = {0xab, 0xde, 0x11f, 0x153, 0x141, 0x14b, 0x11d, 0xf7, 0xe1, 0xb1, 0xd0, 0xd6, 0xf7, 0xfb, 0x10a, 0x111};
  11408. INT32 ATV_SECAM_COLORBAR_SLOPE[16] = {0xd6, 0x115, 0x154, 0x151, 0x145, 0x13f, 0x129, 0x101, 0xeb, 0xb5, 0xd0, 0xd6, 0xef, 0xe5, 0xea, 0xbd};
  11409. INT32 AV_NTSC_COLORBAR_SLOPE[16] = {0xb8, 0xce, 0xf4, 0x12e, 0x152, 0x166, 0x158, 0x128, 0x116, 0x10c, 0x102, 0xec, 0xd6, 0xc2, 0xb0, 0xb0};
  11410. INT32 AV_PAL_COLORBAR_SLOPE[16] = {0xd6, 0x125, 0x15e, 0x155, 0x143, 0x13f, 0x129, 0x101, 0xf3, 0xbd, 0xd0, 0xd6, 0xef, 0xe5, 0xea, 0x91};
  11411. INT32 AV_PAL_M_COLORBAR_SLOPE[16] = {0xe0, 0xea, 0x116, 0x136, 0x154, 0x168, 0x154, 0x13a, 0x120, 0x100, 0xf6, 0xd4, 0xc6, 0xb0, 0xa4, 0x9b};
  11412. INT32 AV_SECAM_COLORBAR_SLOPE[16] = {0xd6, 0x115, 0x154, 0x151, 0x145, 0x13f, 0x129, 0x101, 0xeb, 0xb5, 0xd0, 0xd6, 0xef, 0xe5, 0xea, 0xbd};
  11413. INT32 DCCSlope[16] = {0};
  11414. CVD2_GetNoiseStatus(&ucNoiseStatus);
  11415. // CVD2 Grey patten patch
  11416. if(VIP_IsATVSource())
  11417. {
  11418. if ((VIP_GetStdColorSystem() == CVD2_STD_SECAM || VIP_GetStdColorSystem() == CVD2_STD_PAL_M) && BarNoiseFlag == 1) //#51594, #51661, #51662, #51659
  11419. {
  11420. PQ_RegisterWrite(VIP_reg_dpy_hist_slope2, 0xec);
  11421. PQ_RegisterWrite(VIP_reg_dpy_hist_slope3, 0xec);
  11422. PQ_RegisterWrite(VIP_reg_dpy_hist_start0 ,0);
  11423. PQ_RegisterWrite(VIP_reg_dpy_hist_start1 ,0x400);
  11424. PQ_RegisterWrite(VIP_reg_dpy_hist_start2 ,0x800);
  11425. PQ_RegisterWrite(VIP_reg_dpy_hist_start3 ,0xbb0);
  11426. PQ_RegisterWrite(VIP_reg_dpy_hist_start4 ,0xf60);
  11427. PQ_RegisterWrite(VIP_reg_dpy_hist_start5 ,0x1360);
  11428. PQ_RegisterWrite(VIP_reg_dpy_hist_start6 ,0x1760);
  11429. PQ_RegisterWrite(VIP_reg_dpy_hist_start7 ,0x1b60);
  11430. PQ_RegisterWrite(VIP_reg_dpy_hist_start8 ,0x1f60);
  11431. PQ_RegisterWrite(VIP_reg_dpy_hist_start9 ,0x2360);
  11432. PQ_RegisterWrite(VIP_reg_dpy_hist_start10 ,0x2760);
  11433. PQ_RegisterWrite(VIP_reg_dpy_hist_start11 ,0x2b60);
  11434. PQ_RegisterWrite(VIP_reg_dpy_hist_start12 ,0x2f60);
  11435. PQ_RegisterWrite(VIP_reg_dpy_hist_start13 ,0x3360);
  11436. PQ_RegisterWrite(VIP_reg_dpy_hist_start14 ,0x3760);
  11437. PQ_RegisterWrite(VIP_reg_dpy_hist_start15 ,0x3b60);
  11438. return PATCHAPPLIED;
  11439. }
  11440. }// ~CVD2 Grey patten patch
  11441. // CVD2 ColorBar patch
  11442. if(VIP_GetUserSource() == SOURCE_CVD2 && PQ_IsColorBar())
  11443. {
  11444. if(VIP_IsATVSource())
  11445. {
  11446. if (VIP_GetStdColorSystem() <= CVD2_STD_NTSC_443)
  11447. {
  11448. memcpy(&DCCSlope[0], &ATV_NTSC_COLORBAR_SLOPE[0], sizeof(INT32)*16);
  11449. PatchApplyFlag = PATCHAPPLIED;
  11450. }
  11451. else if(VIP_GetStdColorSystem() <= CVD2_STD_PAL_60 && VIP_GetStdColorSystem() >= CVD2_STD_PAL_IBGDK && ucNoiseStatus < 25)
  11452. {
  11453. if(VIP_GetStdColorSystem() != CVD2_STD_PAL_M)
  11454. {
  11455. memcpy(&DCCSlope[0], &ATV_PAL_COLORBAR_SLOPE[0], sizeof(INT32)*16);
  11456. }
  11457. else
  11458. {
  11459. memcpy(&DCCSlope[0], &ATV_PAL_M_COLORBAR_SLOPE[0], sizeof(INT32)*16);
  11460. }
  11461. PatchApplyFlag = PATCHAPPLIED;
  11462. }
  11463. else if(VIP_GetStdColorSystem() == CVD2_STD_SECAM && ucNoiseStatus < 25)
  11464. {
  11465. memcpy(&DCCSlope[0], &ATV_SECAM_COLORBAR_SLOPE[0], sizeof(INT32)*16);
  11466. PatchApplyFlag = PATCHAPPLIED;
  11467. }
  11468. }
  11469. else // AV
  11470. {
  11471. if (VIP_GetStdColorSystem() <= CVD2_STD_NTSC_443)
  11472. {
  11473. memcpy(&DCCSlope[0], &AV_NTSC_COLORBAR_SLOPE[0], sizeof(INT32)*16);
  11474. PatchApplyFlag = PATCHAPPLIED;
  11475. }
  11476. else if(VIP_GetStdColorSystem() <= CVD2_STD_PAL_60 && VIP_GetStdColorSystem() >= CVD2_STD_PAL_IBGDK)
  11477. {
  11478. if(VIP_GetStdColorSystem() != CVD2_STD_PAL_M)
  11479. {
  11480. memcpy(&DCCSlope[0], &AV_PAL_COLORBAR_SLOPE[0], sizeof(INT32)*16);
  11481. PatchApplyFlag = PATCHAPPLIED;
  11482. }
  11483. else
  11484. {
  11485. memcpy(&DCCSlope[0], &AV_PAL_M_COLORBAR_SLOPE[0], sizeof(INT32)*16);
  11486. PatchApplyFlag = PATCHAPPLIED;
  11487. }
  11488. }
  11489. else if(VIP_GetStdColorSystem() == CVD2_STD_SECAM)
  11490. {
  11491. memcpy(&DCCSlope[0], &AV_SECAM_COLORBAR_SLOPE[0], sizeof(INT32)*16);
  11492. PatchApplyFlag = PATCHAPPLIED;
  11493. }
  11494. }
  11495. /********* write data *********/
  11496. if (PatchApplyFlag == PATCHAPPLIED) {
  11497. for(i=0; i<16; i++)
  11498. {
  11499. PQ_RegisterWrite(VIP_reg_dpy_hist_slope0+i*4, DCCSlope[i]);
  11500. PQ_RegisterWrite(VIP_reg_dpy_hist_chroma0+i*4, 256);
  11501. }
  11502. PQ_RegisterWrite(VIP_reg_dpy_hist_start0 , 0);
  11503. tmp = 0;
  11504. for(i=1; i<16; i++)
  11505. {
  11506. tmp = tmp +(DCCSlope[i-1]<<2);
  11507. if (tmp < 1024 * (i-1)) tmp = 1024 * (i-1);
  11508. if (tmp>16367)
  11509. {
  11510. tmp = 16367;
  11511. DCCSlope[i] = 0;
  11512. }
  11513. PQ_RegisterWrite(VIP_reg_dpy_hist_start0+i*4 ,tmp);
  11514. }
  11515. }
  11516. /********* ~write data *********/
  11517. }//~if(VIP_GetUserSource() == SOURCE_CVD2 && PQ_IsColorBar())
  11518. #endif
  11519. return PatchApplyFlag;
  11520. }
  11521. void _CheckHistBinDistribution(UINT32* pHistBin, UINT32 dwTotalPixel, UINT8 *pBinNull, UINT8 *pBinNormal)
  11522. {
  11523. UINT32 ulHistBin[16];
  11524. UINT8 i;
  11525. memcpy(&ulHistBin[0], pHistBin, sizeof(UINT32)*16);
  11526. for(i=0; i<16; i++)
  11527. {
  11528. if(ulHistBin[i]<dwTotalPixel*50/1000)
  11529. {
  11530. if (ulHistBin[i]<dwTotalPixel*25/1000) // *10 to *20
  11531. (*pBinNull) ++;
  11532. }
  11533. else
  11534. {
  11535. if ((i==0)&&(ulHistBin[1]<dwTotalPixel*50/1000))
  11536. (*pBinNormal)++;
  11537. else if ((i==15)&&(ulHistBin[14]<dwTotalPixel*50/1000))
  11538. (*pBinNormal)++;
  11539. else if ((i==14)&&(ulHistBin[13]<dwTotalPixel*50/1000)&&(ulHistBin[15]<dwTotalPixel*50/1000))
  11540. (*pBinNormal)++;
  11541. else if ((i==13)&&(ulHistBin[i-1]<dwTotalPixel*50/1000)&&((ulHistBin[i+1]<dwTotalPixel*50/1000)||(ulHistBin[i+2]<dwTotalPixel*50/1000)))
  11542. (*pBinNormal)++;
  11543. else if ((i==12)&&(ulHistBin[i-1]<dwTotalPixel*50/1000)&&((ulHistBin[i+1]<dwTotalPixel*50/1000)||(ulHistBin[i+2]<dwTotalPixel*50/1000)||(ulHistBin[i+3]<dwTotalPixel*50/1000)))
  11544. (*pBinNormal)++;
  11545. else if ((i< 12)&&(i>0)&&(ulHistBin[i-1]<dwTotalPixel*50/1000)&&((ulHistBin[i+1]<dwTotalPixel*50/1000)||
  11546. (ulHistBin[i+2]<dwTotalPixel*50/1000)||(ulHistBin[i+3]<dwTotalPixel*50/1000)||(ulHistBin[i+4]<dwTotalPixel*50/1000)))
  11547. (*pBinNormal)++;
  11548. }
  11549. }
  11550. }
  11551. /**
  11552. * @brief apply different sharpness in specific scene
  11553. *
  11554. * This function will detect specific pattern and apply different sharpness setting
  11555. * purpose : to improve ring effect in AV source (monoscope)
  11556. *
  11557. * @param n/a
  11558. * @return n/a
  11559. * note : the PQ_GetMotionStatus condition is for exclude the scene in video book, video decoder, chapter #9
  11560. */
  11561. void _SharpnessPatch(void)
  11562. {
  11563. PQHW_CONTEXT* pHwContext= &PQHwContext;
  11564. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  11565. static UINT8 PatchApply = FALSE;
  11566. #ifdef CONFIG_AV_SUPPORT
  11567. UINT8 cnt_init = 5 , cnt_th = 8, cnt_max = 16; //(th-init) = enable frm cnt; (max-th) = disable frm cnt
  11568. static UINT8 sharpness_cnt = 0;
  11569. UINT8 CVD2_Hist_Y_Bin[16] = {0}, CVD2_Hist_Cb_Bin[16] = {0}, CVD2_Hist_Cr_Bin[16] = {0};
  11570. UINT32 ucvdi_field_diff_cnt = PQ_RegisterRead(VIP_field_diff_cnt);
  11571. UINT32 ucvdi_field_diff_cnt_lp = PQ_RegisterRead(VIP_field_diff_cnt_lp);
  11572. UINT32 Sony_CH9 = 0 , PatGen_NoColor= 0;
  11573. UINT8 mot_chk = 0, luma_chk = 0, mono_chk = 0, i, ucYBbin_255_Cnt = 0;
  11574. UINT8 time_525 = 0, time_625 = 0;
  11575. UINT32 other_cb_sum_0_6 = 0 , other_cb_sum_10_15 = 0 , other_cr_sum_0_6 = 0 , other_cr_sum_10_15 = 0, luma_sum = 0, mono_luma_sum_0_1 = 0, mono_luma_sum_7_13_14 = 0;
  11576. #endif
  11577. pHwContext->PqPatch.PeakLtiPatch = PEAKLTI_NON_PATCH;
  11578. pHwContext->PqPatch.DpyPeakingPatch = DPY_PEAKING_NON_PATCH;
  11579. pHwContext->PqPatch.DsSharpnessPatch = DS_SHARPNESS_NON_PATCH;
  11580. #ifdef CONFIG_AV_SUPPORT
  11581. if(VIP_IsAVSource())
  11582. {
  11583. DRV_CVD2_GetLumaHist(CVD2_Hist_Y_Bin);
  11584. DRV_CVD2_GetCbHist(CVD2_Hist_Cb_Bin);
  11585. DRV_CVD2_GetCrHist(CVD2_Hist_Cr_Bin);
  11586. time_525 = (VIP_GetStdColorSystem() == CVD2_STD_NTSC_M);
  11587. time_625 = (VIP_GetStdColorSystem() == CVD2_STD_PAL_IBGDK);
  11588. if(sharpness_cnt==0)
  11589. {
  11590. sharpness_cnt = cnt_init;
  11591. }
  11592. for(i = 0; i < 16; i++)
  11593. {
  11594. luma_sum += CVD2_Hist_Y_Bin[i];
  11595. if(CVD2_Hist_Y_Bin[i] == 0xff)
  11596. {
  11597. ucYBbin_255_Cnt++;
  11598. }
  11599. }
  11600. if((ucYBbin_255_Cnt == 1) && (luma_sum <= 0x220))
  11601. {
  11602. luma_chk = 1 ;
  11603. }
  11604. //monoscope
  11605. mono_luma_sum_0_1 = CVD2_Hist_Y_Bin[0] + CVD2_Hist_Y_Bin[1];
  11606. mono_luma_sum_7_13_14 = CVD2_Hist_Y_Bin[7] + CVD2_Hist_Y_Bin[13] + CVD2_Hist_Y_Bin[14];
  11607. if(time_525)
  11608. {
  11609. mono_chk = (((mono_luma_sum_0_1 >= 0x70) && (mono_luma_sum_0_1 <= 0x98)) && ((mono_luma_sum_7_13_14 >= 0x138) && (mono_luma_sum_7_13_14 <= 0x150))) //mono 4:3
  11610. || (((mono_luma_sum_0_1 >= 0x70) && (mono_luma_sum_0_1 <= 0x98)) && ((mono_luma_sum_7_13_14 >= 0x128) && (mono_luma_sum_7_13_14 <= 0x168))) ; //mono 16:9
  11611. }
  11612. else if (time_625)
  11613. {
  11614. mono_chk = (((mono_luma_sum_0_1 >= 0x90) && (mono_luma_sum_0_1 <= 0xb8)) && ((mono_luma_sum_7_13_14 >= 0xf0) && (mono_luma_sum_7_13_14 <= 0x138))) //mono 4:3
  11615. || (((mono_luma_sum_0_1 >= 0x90) && (mono_luma_sum_0_1 <= 0xb8)) && ((mono_luma_sum_7_13_14 >= 0x100) && (mono_luma_sum_7_13_14 <= 0x148))) ; //mono 16:9
  11616. }
  11617. else
  11618. {
  11619. mono_chk = 0;
  11620. }
  11621. for(i = 0; i < 16; i++)
  11622. {
  11623. if(i <= 6 )
  11624. {
  11625. other_cb_sum_0_6 += CVD2_Hist_Cb_Bin[i];
  11626. other_cr_sum_0_6 += CVD2_Hist_Cr_Bin[i];
  11627. }
  11628. else
  11629. {
  11630. //exclude CVD2_Hist_Cb_Bin[7], CVD2_Hist_Cb_Bin[8] and CVD2_Hist_Cb_Bin[9]
  11631. if((i != 7) && (i != 8) && (i != 9))
  11632. {
  11633. other_cb_sum_10_15 += CVD2_Hist_Cb_Bin[i];
  11634. other_cr_sum_10_15 += CVD2_Hist_Cr_Bin[i];
  11635. }
  11636. }
  11637. }
  11638. if (time_525)
  11639. {
  11640. PatGen_NoColor = ( //(CVD2_Hist_Sat_Bin[0] == 0xff) && (other_sat_sum < 0x50) && //sat
  11641. (CVD2_Hist_Cb_Bin[7] < 0xf0) && (CVD2_Hist_Cb_Bin[8] == 0xff) && (other_cb_sum_0_6 < 0x20) && (other_cb_sum_10_15 < 0x08) && //cb
  11642. (CVD2_Hist_Cr_Bin[7] < 0xf0) && (CVD2_Hist_Cr_Bin[8] == 0xff) && (other_cr_sum_0_6 < 0x20) && (other_cr_sum_10_15 < 0x08)); //cr
  11643. }
  11644. else if (time_625)
  11645. {
  11646. PatGen_NoColor = ( //(CVD2_Hist_Sat_Bin[0] == 0xff) && (other_sat_sum < 0x50) && //sat
  11647. (CVD2_Hist_Cb_Bin[7] < 0xf0) && (CVD2_Hist_Cb_Bin[8] == 0xff) && (other_cb_sum_0_6 < 0x30) && (other_cb_sum_10_15 < 0x08) && //cb
  11648. (CVD2_Hist_Cr_Bin[7] < 0xf0) && (CVD2_Hist_Cr_Bin[8] == 0xff) && (other_cr_sum_0_6 < 0x20) && (other_cr_sum_10_15 < 0x14)); //cr
  11649. }
  11650. else
  11651. {
  11652. PatGen_NoColor = 0;
  11653. }
  11654. if((*((UINT8*)(0xbe1cd688))) == 0x22)
  11655. {
  11656. printk(KERN_EMERG"$$$$$ %x/%x/%x/%x/%x/%x/%x/%x/%x/%x/%x/%x/%x/%x/%x/%x \n",
  11657. CVD2_Hist_Y_Bin[0], CVD2_Hist_Y_Bin[1], CVD2_Hist_Y_Bin[2], CVD2_Hist_Y_Bin[3]
  11658. , CVD2_Hist_Y_Bin[4], CVD2_Hist_Y_Bin[5], CVD2_Hist_Y_Bin[6], CVD2_Hist_Y_Bin[7]
  11659. , CVD2_Hist_Y_Bin[8], CVD2_Hist_Y_Bin[9], CVD2_Hist_Y_Bin[10], CVD2_Hist_Y_Bin[11]
  11660. , CVD2_Hist_Y_Bin[12], CVD2_Hist_Y_Bin[13], CVD2_Hist_Y_Bin[14], CVD2_Hist_Y_Bin[15]);
  11661. printk(KERN_EMERG"$$$$$ %x/%x/%x/%x/%x/%x/%x/%x/%x/%x/%x/%x/%x/%x/%x/%x \n",
  11662. CVD2_Hist_Cb_Bin[0], CVD2_Hist_Cb_Bin[1], CVD2_Hist_Cb_Bin[2], CVD2_Hist_Cb_Bin[3]
  11663. , CVD2_Hist_Cb_Bin[4], CVD2_Hist_Cb_Bin[5], CVD2_Hist_Cb_Bin[6], CVD2_Hist_Cb_Bin[7]
  11664. , CVD2_Hist_Cb_Bin[8], CVD2_Hist_Cb_Bin[9], CVD2_Hist_Cb_Bin[10], CVD2_Hist_Cb_Bin[11]
  11665. , CVD2_Hist_Cb_Bin[12], CVD2_Hist_Cb_Bin[13], CVD2_Hist_Cb_Bin[14], CVD2_Hist_Cb_Bin[15]);
  11666. printk(KERN_EMERG"$$$$$ %x/%x/%x/%x/%x/%x/%x/%x/%x/%x/%x/%x/%x/%x/%x/%x \n",
  11667. CVD2_Hist_Cr_Bin[0], CVD2_Hist_Cr_Bin[1], CVD2_Hist_Cr_Bin[2], CVD2_Hist_Cr_Bin[3]
  11668. , CVD2_Hist_Cr_Bin[4], CVD2_Hist_Cr_Bin[5], CVD2_Hist_Cr_Bin[6], CVD2_Hist_Cr_Bin[7]
  11669. , CVD2_Hist_Cr_Bin[8], CVD2_Hist_Cr_Bin[9], CVD2_Hist_Cr_Bin[10], CVD2_Hist_Cr_Bin[11]
  11670. , CVD2_Hist_Cr_Bin[12], CVD2_Hist_Cr_Bin[13], CVD2_Hist_Cr_Bin[14], CVD2_Hist_Cr_Bin[15]);
  11671. printk(KERN_EMERG"$$$$v1 PGNC = [%d]/%x/%x/%x/%x\t luma_chk = [%d]/%x\t mono_chk = [%d]/%x/%x\t color sys = %d\n",
  11672. PatGen_NoColor, other_cb_sum_0_6, other_cb_sum_10_15, other_cr_sum_0_6, other_cr_sum_10_15,
  11673. luma_chk, luma_sum,
  11674. mono_chk, mono_luma_sum_0_1, mono_luma_sum_7_13_14, VIP_GetStdColorSystem());
  11675. }
  11676. if((*((UINT8*)(0xbe1cd688))) != 0x23)
  11677. {
  11678. mot_chk = ((luma_chk == 1) || (mono_chk == 1));
  11679. }
  11680. else
  11681. {
  11682. mot_chk = (ucvdi_field_diff_cnt < 0x10) || (luma_chk == 1) || (mono_chk == 1);
  11683. }
  11684. // Detect monoscope/white,exclude video book #ch17 and Sony #ch9
  11685. if(time_525 || time_625)
  11686. {
  11687. if((mot_chk == 1) && (PatGen_NoColor == 1))
  11688. {
  11689. if(++sharpness_cnt >= cnt_th)
  11690. {
  11691. sharpness_cnt = cnt_max;
  11692. }
  11693. if((*((UINT8*)(0xbe1cd688))) == 0x22)
  11694. {
  11695. printk(KERN_EMERG"$$$$$ cnt = %d\t Sony_CH9 = %d\t field_diff_cnt = %x\t ulHistCaseCur = %d\t \n", sharpness_cnt, Sony_CH9, ucvdi_field_diff_cnt_lp, pHwContext->ulHistCaseCur);
  11696. }
  11697. }
  11698. else
  11699. {
  11700. if((--sharpness_cnt < cnt_th))
  11701. {
  11702. sharpness_cnt = cnt_init;
  11703. }
  11704. if((*((UINT8*)(0xbe1cd688))) == 0x22)
  11705. {
  11706. printk(KERN_EMERG"$$$$$ change pattern cntr = %d\n\n", sharpness_cnt);
  11707. }
  11708. }
  11709. }
  11710. if((sharpness_cnt >= cnt_th) || ((*((UINT8*)(0xbe1cd688))) == 0x21) ||(VIP_GetStdColorSystem() == CVD2_STD_PAL_M) || (VIP_GetStdColorSystem() == CVD2_STD_PAL_CN))
  11711. {
  11712. if((*((UINT8*)(0xbe1cd688))) == 0x22)
  11713. {
  11714. printk(KERN_EMERG"$$$$$ cntrl = sharpness_cnt\n");
  11715. }
  11716. pHwContext->PqPatch.PeakLtiPatch = PEAKLTI_AV_IRE_PATCH;
  11717. pHwContext->PqPatch.DpyPeakingPatch = DPY_PEAKING_AV_IRE_PATCH;
  11718. pHwContext->PqPatch.DsSharpnessPatch = DS_SHARPNESS_AV_IRE_PATCH;
  11719. PatchApply = TRUE;
  11720. if((*((UINT8*)(0xbe1cd688))) == 0x22)
  11721. {
  11722. printk(KERN_EMERG"$$$$$ cnt = %d\t Sony_CH9 = %d\t field_diff_cnt = %x\t ulHistCaseCur = %d OK~~~ \n", sharpness_cnt, Sony_CH9, ucvdi_field_diff_cnt_lp, pHwContext->ulHistCaseCur);
  11723. }
  11724. }
  11725. if(pHwContext->PqPatch.PeakLtiPatch != PEAKLTI_NON_PATCH)
  11726. {
  11727. if((*((UINT8*)(0xbe1cd688))) == 0x22)
  11728. printk(KERN_EMERG"$$$$$ PEAKLTI_PATCH $$$$$\n" );
  11729. PQ_Sharpness_Peaking_DLTI(TRUE, pMenuValue->iSharpness);
  11730. }
  11731. if(pHwContext->PqPatch.DpyPeakingPatch != DPY_PEAKING_NON_PATCH)
  11732. {
  11733. PQ_PeakingFilterSetup();
  11734. }
  11735. if(pHwContext->PqPatch.DsSharpnessPatch != DS_SHARPNESS_NON_PATCH)
  11736. {
  11737. PQ_DSSharpness(TRUE, pMenuValue->iSharpness);
  11738. }
  11739. }
  11740. #endif
  11741. if((pHwContext->PqPatch.PeakLtiPatch == PEAKLTI_NON_PATCH) && (PatchApply == TRUE))
  11742. {
  11743. if((*((UINT8*)(0xbe1cd688))) == 0x22)
  11744. {
  11745. printk(KERN_EMERG"$$$$$ PEAKLTI_NON_PATCH $$$$$\n" );
  11746. }
  11747. PatchApply = FALSE;
  11748. PQ_Sharpness_Peaking_DLTI(TRUE, pMenuValue->iSharpness);
  11749. PQ_PeakingFilterSetup();
  11750. PQ_DSSharpness(TRUE, pMenuValue->iSharpness);
  11751. }
  11752. }
  11753. void PQ_SW_DynamicContrast_SceneChangeDetect_ISR(void)
  11754. {
  11755. typedef struct _HIST_WEIGHT
  11756. {
  11757. UINT8 ucIndex;
  11758. UINT32 ulWeight;
  11759. } HIST_WEIGHT;
  11760. PQHW_CONTEXT* pHwContext= &PQHwContext;
  11761. HIST_WEIGHT CurHistWeight[4];
  11762. static HIST_WEIGHT PreHistWeight[4];
  11763. UINT32 dwTotalPixel;
  11764. UINT16 Var_ratio[6], Var_Factor[5];
  11765. UINT32 ulHistBin[16];
  11766. UINT32 ulCurAvgY;
  11767. static UINT32 ulPreAvgY = 0;
  11768. INT32 ulTargetSlop[16], ulTargetChroma[16];
  11769. static INT32 ulPreTargetSlop[16] = {256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256};
  11770. static INT32 ulPreTargetChroma[16]={256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256};
  11771. UINT8 ucSceneChangeEvent = 0, ChangeCondition[7], Var_cond_en[8], HistogramCase[32] , BinNormal=0,BinNull=0, ulcond1,ulcond2,ulcond3,ulcond4,ulcond5, ulcondS;
  11772. INT32 i, j, tmp, alpha,iYLevel,iCLevel,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6, clr_ulcondS;
  11773. static INT32 PreYLevel = 0, PreCLevel = 0, PreulcondS = 0, ulHistCasePre = 0, hit_flicker = 0, even_frame = 0, pre_nr = 0, flicker_cnt = 0;
  11774. UINT8 HistCaseNum=0;
  11775. UINT8 ucSWDC_En_Temp=0;
  11776. BOOL ulChromaBin98=0, ulChromaBin99=0;
  11777. BOOL GrayPatternFlag=0, BarNoiseFlag=0;
  11778. UINT32 ulCurChromaBinPercentage,ulCurChromaBinPercentage7,ulCurChromaBinPercentage8;
  11779. static UINT8 SsceneCNT = 0;
  11780. if((*((UINT8*)(0xbe1cd688))) == 0x3)
  11781. {
  11782. return;
  11783. }
  11784. if(PQ_GetColorProcessor() == FALSE)
  11785. {
  11786. ucSWDC_En_Temp = FALSE;
  11787. }
  11788. else
  11789. {
  11790. ucSWDC_En_Temp = SWDC_Param[0].ucSWDC_En;
  11791. }
  11792. ulCurChromaBinPercentage = PQ_ChromaBinPercentage(0);
  11793. if (VIP_IsATVSource() || VIP_IsAVSource())
  11794. {
  11795. if ( ulCurChromaBinPercentage > 998 )
  11796. ulChromaBin99 = (ulCurChromaBinPercentage > 998)? 1:0; // 1 : black/w
  11797. else
  11798. ulChromaBin98 = (ulCurChromaBinPercentage > 997)? 1:0; // 1 : gray ; 0 : other
  11799. }
  11800. else
  11801. ulChromaBin98 = (PQ_ChromaBinPercentage(0)>980)? 1:0;
  11802. if (VIP_GetStdColorSystem() == CVD2_STD_SECAM)
  11803. {
  11804. ulChromaBin98 = (PQ_ChromaBinPercentage(0)>950)? 1:0;
  11805. }
  11806. //enable sw dc
  11807. PQ_RegisterWrite(VIP_reg_dpy_bin_sel_hist, 1);
  11808. PQ_RegisterWrite(VIP_reg_dpy_hist_int, 0);
  11809. PQ_RegisterWrite(VIP_reg_dpy_hist_en, ucSWDC_En_Temp);
  11810. Var_ratio[0] = SWDC_Param[0].wSWDC_Ratio[0];
  11811. Var_ratio[1] = SWDC_Param[0].wSWDC_Ratio[1];
  11812. Var_ratio[2] = SWDC_Param[0].wSWDC_Ratio[2];
  11813. Var_ratio[3] = SWDC_Param[0].wSWDC_Ratio[3];
  11814. Var_ratio[4] = SWDC_Param[0].wSWDC_Ratio[4];
  11815. Var_ratio[5] = SWDC_Param[0].wSWDC_Ratio[5];
  11816. for(i=0; i<8; i++)
  11817. Var_cond_en[i] = (SWDC_Param[0].ucSWDC_Var_Cond_En>>i)&0x01;
  11818. Var_cond_en[1] = 0;
  11819. Var_Factor[0] = SWDC_Param[0].wSWDC_Factor[0];
  11820. Var_Factor[1] = SWDC_Param[0].wSWDC_Factor[1];
  11821. Var_Factor[2] = SWDC_Param[0].wSWDC_Factor[2];
  11822. Var_Factor[3] = SWDC_Param[0].wSWDC_Factor[3];
  11823. Var_Factor[4] = SWDC_Param[0].wSWDC_Factor[4];
  11824. alpha = SWDC_Param[0].wSWDC_Alpha;
  11825. iYLevel = SWDC_Param[0].wSWDC_YLevel;
  11826. iCLevel = SWDC_Param[0].wSWDC_CLevel;
  11827. dwTotalPixel = 0;
  11828. for(i = 0; i <16; i++)
  11829. {
  11830. ulHistBin[i] = PQ_RegisterRead(VIP_reg_dpy_hist_bin0+i*4);
  11831. dwTotalPixel += ulHistBin[i];
  11832. pHwContext->LumaHist.ulLumaHistBin[i] = ulHistBin[i];
  11833. }
  11834. pHwContext->LumaHist.dwTotalPixel = dwTotalPixel;
  11835. for(i = 0; i<4; i++)
  11836. CurHistWeight[i].ucIndex= i;
  11837. if(PreHistWeight[0].ucIndex == 0 && PreHistWeight[1].ucIndex == 0 && PreHistWeight[2].ucIndex == 0 && PreHistWeight[3].ucIndex == 0)
  11838. {
  11839. for(i = 0; i<4; i++)
  11840. PreHistWeight[i].ucIndex= i;
  11841. }
  11842. if((PQ_RegisterRead(VIP_reg_dpy_en) == 0 ) || (dwTotalPixel ==0)) //DCR init value
  11843. {
  11844. for(i=0; i<16; i++)
  11845. {
  11846. PQ_RegisterWrite(VIP_reg_dpy_hist_slope0+i*4 ,256);
  11847. PQ_RegisterWrite(VIP_reg_dpy_hist_start0+i*4 ,i*64*16);
  11848. PQ_RegisterWrite(VIP_reg_dpy_hist_chroma0+i*4 ,256);
  11849. }
  11850. return;
  11851. }
  11852. if(dwTotalPixel > 0)
  11853. {
  11854. ulCurAvgY = PQ_RegisterRead(VIP_reg_dpy_y_sum)*256 / dwTotalPixel;
  11855. }
  11856. CurHistWeight[0].ulWeight= (7*ulHistBin[0] + 9*ulHistBin[1] + 9*ulHistBin[2] + 4*ulHistBin[3] + 2*ulHistBin[4] + ulHistBin[5])>>5;
  11857. CurHistWeight[1].ulWeight= ( ulHistBin[2] + 2*ulHistBin[3] + 4*ulHistBin[4] + 9*ulHistBin[5] + 9*ulHistBin[6] + 4*ulHistBin[7] + 2*ulHistBin[8] + ulHistBin[9])>>5;
  11858. CurHistWeight[2].ulWeight= ( ulHistBin[6] + 2*ulHistBin[7] + 4*ulHistBin[8] + 9*ulHistBin[9] + 9*ulHistBin[10] + 4*ulHistBin[11] + 2*ulHistBin[12] + ulHistBin[13])>>5;
  11859. CurHistWeight[3].ulWeight= ( ulHistBin[10] + 2*ulHistBin[11] + 4*ulHistBin[12] + 9*ulHistBin[13] + 9*ulHistBin[14] + 7*ulHistBin[15])>>5;
  11860. //sorting
  11861. for(i = 0 ; i<4 ; i++)
  11862. for(j=0; j<3-i; j++)
  11863. if(CurHistWeight[j].ulWeight<CurHistWeight[j+1].ulWeight)
  11864. {
  11865. tmp = CurHistWeight[j].ulWeight;
  11866. CurHistWeight[j].ulWeight= CurHistWeight[j+1].ulWeight;
  11867. CurHistWeight[j+1].ulWeight= tmp;
  11868. tmp = CurHistWeight[j].ucIndex;
  11869. CurHistWeight[j].ucIndex= CurHistWeight[j+1].ucIndex;
  11870. CurHistWeight[j+1].ucIndex= tmp;
  11871. }
  11872. ChangeCondition[0] = Var_cond_en[0] && ((ulCurAvgY<<8)>=(Var_ratio[0]*ulPreAvgY) || (ulPreAvgY<<8)>=(Var_ratio[0]*ulCurAvgY));
  11873. ChangeCondition[1] = Var_cond_en[1] || (ulCurAvgY<<8)>=(Var_ratio[2]*ulPreAvgY) || (ulPreAvgY<<8)>=(Var_ratio[2]*ulCurAvgY);
  11874. ChangeCondition[2] = ((CurHistWeight[0].ucIndex != PreHistWeight[0].ucIndex) && (CurHistWeight[0].ucIndex != PreHistWeight[1].ucIndex)) &&
  11875. ((CurHistWeight[1].ucIndex != PreHistWeight[0].ucIndex) && (CurHistWeight[1].ucIndex != PreHistWeight[1].ucIndex));
  11876. ChangeCondition[3] = (CurHistWeight[0].ucIndex == PreHistWeight[1].ucIndex) &&
  11877. ((CurHistWeight[0].ulWeight<<8)>=Var_ratio[4]*CurHistWeight[1].ulWeight &&
  11878. (PreHistWeight[0].ulWeight<<8)>=Var_ratio[5]*PreHistWeight[1].ulWeight);
  11879. ucSceneChangeEvent = ChangeCondition[0] ||
  11880. ( ChangeCondition[1] && ((Var_cond_en[2]&&ChangeCondition[2])||(Var_cond_en[3]&&ChangeCondition[3])));
  11881. if(PreYLevel != iYLevel || PreCLevel!=iCLevel)
  11882. ucSceneChangeEvent = 1;
  11883. if(ucSceneChangeEvent)
  11884. {
  11885. PQDebugPrint("%s: ChangeCondition = %d, %d, %d, %d ",__FUNCTION__,ChangeCondition[0],ChangeCondition[1],ChangeCondition[2],ChangeCondition[3]);
  11886. }
  11887. //for spacial case I
  11888. BinNull = 0;
  11889. BinNormal = 0;
  11890. if (Var_cond_en[4]==1)
  11891. {
  11892. _CheckHistBinDistribution(&ulHistBin[0], dwTotalPixel, &BinNull, &BinNormal);
  11893. }
  11894. //ulcondS = (BinNull>14 || BinNormal>=4);
  11895. ulcondS = (BinNull>16 || BinNormal>=4);
  11896. clr_ulcondS = (BinNull<14 || BinNormal<4);
  11897. if (ucSceneChangeEvent)
  11898. {
  11899. PreulcondS = ulcondS;
  11900. }
  11901. else if (clr_ulcondS)
  11902. {
  11903. PreulcondS = 0;
  11904. }
  11905. if (ucSceneChangeEvent==0 && even_frame)
  11906. {
  11907. even_frame = 0;
  11908. return;
  11909. }
  11910. else
  11911. {
  11912. if (even_frame)
  11913. even_frame = 0;
  11914. else
  11915. even_frame = 1;
  11916. }
  11917. tmp = (CurHistWeight[0].ulWeight+CurHistWeight[1].ulWeight+CurHistWeight[2].ulWeight+CurHistWeight[3].ulWeight);
  11918. ulcond1 = (CurHistWeight[0].ulWeight<<8)>=Var_Factor[0]*(UINT32)tmp;
  11919. ulcond2 = (ulcond1==0) && ((CurHistWeight[0].ulWeight<<8)>=Var_Factor[3]*CurHistWeight[1].ulWeight) &&
  11920. ((CurHistWeight[0].ulWeight<<8)+(CurHistWeight[1].ulWeight<<8))>=Var_Factor[1]*(UINT32)tmp;
  11921. ulcond3 = (ulcond1==0) && ((CurHistWeight[0].ulWeight<<8)< Var_Factor[3]*CurHistWeight[1].ulWeight) &&
  11922. ((CurHistWeight[0].ulWeight<<8)+(CurHistWeight[1].ulWeight<<8))>=Var_Factor[1]*(UINT32)tmp;
  11923. ulcond4 = (ulcond1==0) && (ulcond2==0) && (ulcond3==0) && ((CurHistWeight[1].ulWeight<<8)>=Var_Factor[4]*CurHistWeight[2].ulWeight) &&
  11924. ((CurHistWeight[0].ulWeight<<8)+(CurHistWeight[1].ulWeight<<8)+(CurHistWeight[2].ulWeight<<8))>=Var_Factor[2]*(UINT32)tmp;
  11925. ulcond5 = (ulcond1==0) && (ulcond2==0) && (ulcond3==0) && ((CurHistWeight[1].ulWeight<<8)< Var_Factor[4]*CurHistWeight[2].ulWeight) &&
  11926. ((CurHistWeight[0].ulWeight<<8)+(CurHistWeight[1].ulWeight<<8)+(CurHistWeight[2].ulWeight<<8))>=Var_Factor[2]*(UINT32)tmp;
  11927. if(PreulcondS)
  11928. {
  11929. ulcond1 = ulcond2 = ulcond3 = ulcond4 = ulcond5 = 0;
  11930. HistogramCase[31] =1;
  11931. }
  11932. else
  11933. HistogramCase[31] =0;
  11934. HistogramCase[0] = (CurHistWeight[0].ucIndex==0) && ulcond1;
  11935. HistogramCase[1] = (CurHistWeight[0].ucIndex==0 && CurHistWeight[1].ucIndex==1) && ulcond2;
  11936. HistogramCase[2] = ((CurHistWeight[0].ucIndex==0 || CurHistWeight[0].ucIndex==1)) && ((CurHistWeight[1].ucIndex==0 || CurHistWeight[1].ucIndex==1)) && ulcond3;
  11937. HistogramCase[3] = (CurHistWeight[0].ucIndex==1 && CurHistWeight[1].ucIndex==0) && ulcond2;
  11938. HistogramCase[4] = (CurHistWeight[0].ucIndex==1) && ulcond1;
  11939. HistogramCase[5] = (CurHistWeight[0].ucIndex==1 && CurHistWeight[1].ucIndex==2) && ulcond2;
  11940. HistogramCase[6] = ((CurHistWeight[0].ucIndex==1 || CurHistWeight[0].ucIndex==2)) && ((CurHistWeight[1].ucIndex==1 || CurHistWeight[1].ucIndex==2)) && ulcond3;
  11941. HistogramCase[7] = (CurHistWeight[0].ucIndex==2 && CurHistWeight[1].ucIndex==1) && ulcond2;
  11942. HistogramCase[8] = (CurHistWeight[0].ucIndex==2) && ulcond1;
  11943. HistogramCase[9] = (CurHistWeight[0].ucIndex==2 && CurHistWeight[1].ucIndex==3) && ulcond2;
  11944. HistogramCase[10] = ((CurHistWeight[0].ucIndex==2 || CurHistWeight[0].ucIndex==3)) && ((CurHistWeight[1].ucIndex==2 || CurHistWeight[1].ucIndex==3)) && ulcond3;
  11945. HistogramCase[11] = (CurHistWeight[0].ucIndex==3 && CurHistWeight[1].ucIndex==2) && ulcond2;
  11946. HistogramCase[12] = (CurHistWeight[0].ucIndex==3) && ulcond1;
  11947. HistogramCase[13] = (CurHistWeight[0].ucIndex==0 && CurHistWeight[1].ucIndex==3) && ulcond2;
  11948. HistogramCase[14] = ((CurHistWeight[0].ucIndex==0 || CurHistWeight[0].ucIndex==3)) && ((CurHistWeight[1].ucIndex==0 || CurHistWeight[1].ucIndex==3)) && ulcond3;
  11949. HistogramCase[15] = (CurHistWeight[0].ucIndex==3 && CurHistWeight[1].ucIndex==0) && ulcond2;
  11950. HistogramCase[16] = (CurHistWeight[0].ucIndex==0 && CurHistWeight[1].ucIndex==2) && ulcond2;
  11951. HistogramCase[17] = (CurHistWeight[0].ucIndex==2 && CurHistWeight[1].ucIndex==0) && ulcond2;
  11952. HistogramCase[18] = ((CurHistWeight[0].ucIndex==0 || CurHistWeight[0].ucIndex==2)) && ((CurHistWeight[1].ucIndex==0 || CurHistWeight[1].ucIndex==2)) && ulcond3;
  11953. HistogramCase[19] = (CurHistWeight[0].ucIndex==1 && CurHistWeight[1].ucIndex==3) && ulcond2;
  11954. HistogramCase[20] = (CurHistWeight[0].ucIndex==3 && CurHistWeight[1].ucIndex==1) && ulcond2;
  11955. HistogramCase[21] = ((CurHistWeight[0].ucIndex==1 || CurHistWeight[0].ucIndex==3)) && ((CurHistWeight[1].ucIndex==1 || CurHistWeight[1].ucIndex==3)) && ulcond3;
  11956. HistogramCase[22] = (CurHistWeight[3].ucIndex==3) && ulcond5;
  11957. HistogramCase[23] = (CurHistWeight[3].ucIndex==3) && ulcond4;
  11958. HistogramCase[24] = (CurHistWeight[3].ucIndex==0) && ulcond5;
  11959. HistogramCase[25] = (CurHistWeight[3].ucIndex==0) && ulcond4;
  11960. HistogramCase[26] = (CurHistWeight[3].ucIndex==2) && ulcond5;
  11961. HistogramCase[27] = (CurHistWeight[3].ucIndex==2) && ulcond4;
  11962. HistogramCase[28] = (CurHistWeight[3].ucIndex==1) && ulcond5;
  11963. HistogramCase[29] = (CurHistWeight[3].ucIndex==1) && ulcond4;
  11964. pHwContext->ulHistCaseCur = 0;
  11965. for(i=0; i<30; i++)
  11966. {
  11967. if(HistogramCase[i] == 1)
  11968. pHwContext->ulHistCaseCur = i+1;
  11969. }
  11970. if ( HistogramCase[6]==1 || HistogramCase[22]==1 || HistogramCase[23]==1 || HistogramCase[24]==1 || HistogramCase[25]==1)
  11971. GrayPatternFlag = 1;
  11972. else
  11973. GrayPatternFlag = 0;
  11974. if ( PreulcondS==1|| (GrayPatternFlag !=1 && ulChromaBin99==1) )
  11975. {
  11976. if ( (((ulHistBin[0]+ulHistBin[1]+ulHistBin[14]+ulHistBin[15])*100) / dwTotalPixel ) > 65 )
  11977. pHwContext->ulHistCaseCur = 32; // black & white scene
  11978. else
  11979. pHwContext->ulHistCaseCur = 31; // gray scene
  11980. }
  11981. else if ( pHwContext->ulHistCaseCur==0 || (GrayPatternFlag ==1 && ulChromaBin98==1))
  11982. pHwContext->ulHistCaseCur = 31; // gray scene
  11983. else if ( pHwContext->ulHistCaseCur==0 || (GrayPatternFlag ==1 && ulChromaBin99==1))
  11984. pHwContext->ulHistCaseCur = 31; // gray scene
  11985. //avoid static scene unstable only 1-2 frame, then the DCC setting changed, ex. Video book/SONY/Chapter #9
  11986. if(ulHistCasePre == 31 || ulHistCasePre ==32)
  11987. {
  11988. if(((pHwContext->ulHistCaseCur == 31) || (pHwContext->ulHistCaseCur == 32)) && (pHwContext->ulHistCaseCur == ulHistCasePre))
  11989. {
  11990. if(SsceneCNT< 3)
  11991. {
  11992. SsceneCNT++;
  11993. }
  11994. }
  11995. else
  11996. {
  11997. if(SsceneCNT > 0)
  11998. {
  11999. SsceneCNT--;
  12000. }
  12001. }
  12002. }
  12003. if((SsceneCNT > 0) && pHwContext->ulHistCaseCur != ulHistCasePre)
  12004. {
  12005. //myrprintk("Scene unstable : ulHistCaseCur = %d, count = %d, return,", pHwContext->ulHistCaseCur, SsceneCNT);
  12006. return;
  12007. }
  12008. ucTempDCCSceneID = pHwContext->ulHistCaseCur;
  12009. // prevent flicker
  12010. if (Var_cond_en[6]==1)
  12011. {
  12012. tmp1 = 0;
  12013. for(i=0; i<4; i++)
  12014. {
  12015. if ((INT32)CurHistWeight[i].ulWeight>=(INT32)PreHistWeight[i].ulWeight)
  12016. {
  12017. tmp = ((INT32)CurHistWeight[i].ulWeight-(INT32)PreHistWeight[i].ulWeight);
  12018. if ((flicker_cnt>0)&&(flicker_cnt<20))
  12019. flicker_cnt = flicker_cnt + 1;
  12020. else if (flicker_cnt<20)
  12021. flicker_cnt = flicker_cnt + 2;
  12022. }
  12023. else
  12024. {
  12025. tmp = ((INT32)PreHistWeight[i].ulWeight-(INT32)CurHistWeight[i].ulWeight);
  12026. if ((flicker_cnt<0)&&(flicker_cnt>-20))
  12027. flicker_cnt = flicker_cnt - 1;
  12028. else if (flicker_cnt>-20)
  12029. flicker_cnt = flicker_cnt - 2;
  12030. }
  12031. tmp1 += tmp;
  12032. }
  12033. tmp = (PreHistWeight[0].ulWeight+PreHistWeight[1].ulWeight+PreHistWeight[2].ulWeight+PreHistWeight[3].ulWeight)/18;
  12034. if ((tmp1 < tmp)&&(flicker_cnt<10)&&(flicker_cnt>-10)&&
  12035. (pHwContext->ulHistCaseCur!=ulHistCasePre)&&
  12036. (ucSceneChangeEvent==0)&&
  12037. (ulHistCasePre!=32 || pHwContext->ulHistCaseCur!= 32)&&
  12038. (PQ_ChromaBinPercentage(0)<980)&&
  12039. (((CurHistWeight[0].ucIndex == PreHistWeight[0].ucIndex)||(CurHistWeight[0].ucIndex == PreHistWeight[1].ucIndex))&&
  12040. ((CurHistWeight[1].ucIndex == PreHistWeight[0].ucIndex)||(CurHistWeight[1].ucIndex == PreHistWeight[1].ucIndex))))
  12041. {
  12042. pHwContext->ulHistCaseCur = ulHistCasePre;
  12043. hit_flicker = 1;
  12044. }
  12045. else
  12046. {
  12047. flicker_cnt = 0;
  12048. hit_flicker = 0;
  12049. }
  12050. }
  12051. if(pHwContext->ulHistCaseCur != ulHistCasePre)
  12052. {
  12053. PQDebugPrint("ulHistCaseCur = %d, ulHistCasePre = %d", (pHwContext->ulHistCaseCur-1), (ulHistCasePre-1));
  12054. PQDebugPrint("index =%d %d %d %d ", CurHistWeight[0].ucIndex, CurHistWeight[1].ucIndex, CurHistWeight[2].ucIndex, CurHistWeight[3].ucIndex);
  12055. PQDebugPrint("weight=%d %d %d %d ", CurHistWeight[0].ulWeight, CurHistWeight[1].ulWeight, CurHistWeight[2].ulWeight, CurHistWeight[3].ulWeight);
  12056. }
  12057. HistCaseNum = pHwContext->ulHistCaseCur - 1;
  12058. _SharpnessPatch();
  12059. for(i=0; i<16; i++)
  12060. {
  12061. ulTargetSlop[i]= SWDC_HistSlop[0].SWDC_HistSlop[HistCaseNum][i]*2;
  12062. ulTargetChroma[i]= SWDC_HistChroma[0].SWDC_HistChroma[HistCaseNum][i]*2;
  12063. }
  12064. // shrink black level 20140116
  12065. if (Var_cond_en[3]==1 && PQ_GetAvgY_Value()>120 && pHwContext->ulHistCaseCur != 31 && pHwContext->ulHistCaseCur != 32)
  12066. {
  12067. if ((ulHistBin[0]+ulHistBin[1]+ulHistBin[2]+ulHistBin[3])>dwTotalPixel*200/1000)
  12068. {
  12069. tmp1 = 8*ulTargetSlop[0]/10;//8*ulTargetSlop[0]/10; //ulTargetSlop[0]/2;
  12070. tmp2 = 4*ulTargetSlop[1]/10;//3*ulTargetSlop[1]/4; //3*ulTargetSlop[1]/4;
  12071. tmp3 = 7*ulTargetSlop[2]/8;//7*ulTargetSlop[2]/8; //9*ulTargetSlop[2]/10;
  12072. }
  12073. else
  12074. {
  12075. tmp1 = ulTargetSlop[0]/2;
  12076. tmp2 = 3*ulTargetSlop[1]/4;
  12077. tmp3 = 9*ulTargetSlop[2]/10;
  12078. }
  12079. tmp = (ulTargetSlop[0]-tmp1) + (ulTargetSlop[1]-tmp2) + (ulTargetSlop[2]-tmp3);
  12080. ulTargetSlop[0] = tmp1;
  12081. ulTargetSlop[1] = tmp2;
  12082. ulTargetSlop[2] = tmp3;
  12083. tmp4 = tmp/13;
  12084. tmp5 = tmp - 13*tmp4;
  12085. for (i=3; i<15; i++)
  12086. {
  12087. ulTargetSlop[i] = ulTargetSlop[i] + tmp4;
  12088. }
  12089. ulTargetSlop[15] = ulTargetSlop[15] + tmp4 + tmp5;
  12090. }
  12091. //for spacial case II (reduce background noise effect)
  12092. if (Var_cond_en[5]==1 || pHwContext->ulHistCaseCur == 32 )
  12093. {
  12094. tmp = 0;
  12095. tmp1 = 0;
  12096. for(i=2; i<14; i++)
  12097. {
  12098. if ((((ulHistBin[i]>dwTotalPixel*250/1000)&&(ulHistBin[i]>3*ulHistBin[i-1])&&(ulHistBin[i]>3*ulHistBin[i+1])) ||
  12099. ((pre_nr==1)&&(ulHistBin[i]>dwTotalPixel*240/1000)&&(ulHistBin[i]>5*ulHistBin[i-1]/2)&&(ulHistBin[i]>5*ulHistBin[i+1]/2)))&&(ulTargetSlop[i]>64))
  12100. {
  12101. if (i<4)
  12102. tmp2 = 2*ulTargetSlop[i]/3;
  12103. else
  12104. tmp2 = ulTargetSlop[i]/2;
  12105. pre_nr = 1;
  12106. tmp3 = ulTargetSlop[i]-tmp2;
  12107. tmp += tmp3;
  12108. ulTargetSlop[i] = tmp2;
  12109. }
  12110. else if (((((ulHistBin[i]+ulHistBin[i+1])>dwTotalPixel*500/1000)&&(ulHistBin[i]>dwTotalPixel*250/1000)&&
  12111. ((ulHistBin[i]+ulHistBin[i+1])>6*ulHistBin[i-1])&&((ulHistBin[i]+ulHistBin[i+1])>6*ulHistBin[i+2])) ||
  12112. ((pre_nr==1)&&((ulHistBin[i]+ulHistBin[i+1])>dwTotalPixel*450/1000)&&(ulHistBin[i]>dwTotalPixel*240/1000)&&
  12113. ((ulHistBin[i]+ulHistBin[i+1])>5*ulHistBin[i-1])&&((ulHistBin[i]+ulHistBin[i+1])>5*ulHistBin[i+2]))) &&(ulTargetSlop[i]>64))
  12114. {
  12115. if (ulHistBin[i]>5*ulHistBin[i+1]/3)
  12116. {
  12117. if (i<4)
  12118. tmp2 = 2*ulTargetSlop[i]/3;
  12119. else
  12120. tmp2 = ulTargetSlop[i]/2;
  12121. tmp3 = ulTargetSlop[i]-tmp2;
  12122. tmp += tmp3;
  12123. ulTargetSlop[i] = tmp2;
  12124. }
  12125. else if (ulHistBin[i+1]>5*ulHistBin[i]/3)
  12126. {
  12127. if (i<4)
  12128. tmp2 = 2*ulTargetSlop[i+1]/3;
  12129. else
  12130. tmp2 = ulTargetSlop[i+1]/2;
  12131. tmp3 = ulTargetSlop[i+1]-tmp2;
  12132. tmp += tmp3;
  12133. ulTargetSlop[i+1] = tmp2;
  12134. }
  12135. else
  12136. {
  12137. tmp2 = 2*ulTargetSlop[i]/3;
  12138. tmp3 = ulTargetSlop[i]-tmp2;
  12139. tmp += tmp3;
  12140. ulTargetSlop[i] = tmp2;
  12141. tmp2 = 2*ulTargetSlop[i+1]/3;
  12142. tmp3 = ulTargetSlop[i+1]-tmp2;
  12143. tmp += tmp3;
  12144. ulTargetSlop[i+1] = tmp2;
  12145. }
  12146. pre_nr = 1;
  12147. }
  12148. else if ((((ulHistBin[i]>dwTotalPixel*350/1000)&&((ulHistBin[i]+ulHistBin[i-1])<=dwTotalPixel*500/1000)) ||
  12149. ((pre_nr==1)&&(ulHistBin[i]>dwTotalPixel*300/1000)&&((ulHistBin[i]+ulHistBin[i-1])<=dwTotalPixel*450/1000)))&&(ulTargetSlop[i]>64))
  12150. {
  12151. if (i<4)
  12152. tmp2 = 2*ulTargetSlop[i]/3;
  12153. else
  12154. tmp2 = ulTargetSlop[i]/2;
  12155. tmp3 = ulTargetSlop[i]-tmp2;
  12156. tmp += tmp3;
  12157. ulTargetSlop[i] = tmp2;
  12158. pre_nr = 1;
  12159. }
  12160. else
  12161. {
  12162. pre_nr = 0;
  12163. }
  12164. }
  12165. tmp3 = tmp>>4;
  12166. tmp4 = tmp - 16*tmp3;
  12167. for(i=0; i<15; i++)
  12168. {
  12169. tmp5 = (INT32)ulTargetSlop[i] + tmp3;
  12170. if (tmp5>4095)
  12171. {
  12172. tmp4 += (tmp5 - 4095);
  12173. ulTargetSlop[i] = 4095;
  12174. }
  12175. else
  12176. ulTargetSlop[i] = tmp5;
  12177. }
  12178. tmp6 = (INT32)ulTargetSlop[15] + tmp3 + tmp4;
  12179. if (tmp6>4095)
  12180. ulTargetSlop[15] = 4095;
  12181. else
  12182. ulTargetSlop[15] = tmp6;
  12183. }
  12184. // static contrast
  12185. PQ_SW_DynamicContrast_UserCurveAdjust();
  12186. tmp1 = 0;
  12187. tmp2 = 0;
  12188. for(i=0; i<16; i++)
  12189. {
  12190. tmp =(INT32)ulTargetSlop[i] + (INT32)pHwContext->ulCurveSlop[i];
  12191. if (tmp<0)
  12192. tmp = 0;
  12193. else if (tmp>4095)
  12194. tmp = 4095;
  12195. tmp1 += tmp;
  12196. if ((tmp1>4095)&&(tmp2<=4095))
  12197. ulTargetSlop[i] = 4095-tmp2;
  12198. else if (tmp1>4095)
  12199. ulTargetSlop[i] = 0;
  12200. else
  12201. ulTargetSlop[i] = tmp;
  12202. tmp2 = tmp1;
  12203. }
  12204. tmp1 = 0;
  12205. tmp2 = 0;
  12206. for(i=0; i<16; i++)
  12207. {
  12208. tmp = (((INT32)ulTargetSlop[i]-256)*iYLevel+256*256+128)>>8;
  12209. if (tmp<0)
  12210. tmp = 0;
  12211. else
  12212. tmp1 += tmp;
  12213. if ((tmp1>4095)&&(tmp2<=4095))
  12214. ulTargetSlop[i] = 4095-tmp2;
  12215. else if (tmp1>4095)
  12216. ulTargetSlop[i] = 0;
  12217. else
  12218. ulTargetSlop[i] = tmp; //21
  12219. tmp2 = tmp1;
  12220. ulTargetChroma[i] = (((INT32)ulTargetChroma[i]-256)*iCLevel+256*256+128)>>8;
  12221. }
  12222. //for spacial case III ( expand white )
  12223. if ((Var_cond_en[7]==1 || pHwContext->ulHistCaseCur == 31) && pHwContext->ulHistCaseCur != 32)
  12224. {
  12225. tmp1 = 0;
  12226. tmp2 = 96;
  12227. if ((ulHistBin[12]+ulHistBin[13]+ulHistBin[14]+ulHistBin[15])>dwTotalPixel*250/1000)
  12228. {
  12229. for (i=12; i<16; i++)
  12230. {
  12231. if ((INT32)ulTargetSlop[i]<(i-11)*tmp2)
  12232. {
  12233. tmp = (i-11)*tmp2 - (INT32)ulTargetSlop[i];
  12234. tmp1 += tmp;
  12235. ulTargetSlop[i] = (i-11)*tmp2;
  12236. }
  12237. }
  12238. tmp2 = tmp1>>4;
  12239. tmp3 = tmp1-16*tmp2;
  12240. for (i=0; i<16; i++)
  12241. {
  12242. tmp4 = ulTargetSlop[i];
  12243. if (tmp4>tmp2)
  12244. ulTargetSlop[i] = tmp4-tmp2;
  12245. else
  12246. {
  12247. ulTargetSlop[i] = 0;
  12248. tmp3 = tmp3 + (tmp2-tmp4);
  12249. }
  12250. }
  12251. tmp2 = tmp3>>2;
  12252. tmp5 = tmp3-4*tmp2;
  12253. for (i=12; i<16; i++)
  12254. {
  12255. tmp4 = ulTargetSlop[i];
  12256. if (tmp4>tmp2)
  12257. ulTargetSlop[i] = tmp4-tmp2;
  12258. else
  12259. {
  12260. ulTargetSlop[i] = 0;
  12261. tmp5 = tmp5 + (tmp2-tmp4);
  12262. }
  12263. }
  12264. tmp4 = ulTargetSlop[15];
  12265. if (tmp4 > tmp5)
  12266. ulTargetSlop[15] = tmp4 - tmp5;
  12267. else
  12268. ulTargetSlop[15] = 0;
  12269. }
  12270. }
  12271. tmp1 =0;
  12272. tmp2 = 0;
  12273. for(i=0; i<16; i++)
  12274. {
  12275. if(!ucSceneChangeEvent)
  12276. {
  12277. tmp = (INT32)ulTargetSlop[i] + (((INT32)ulPreTargetSlop[i]-(INT32)ulTargetSlop[i])*alpha)/256;
  12278. tmp1 += tmp;
  12279. if ((tmp1>4095)&&(tmp2<=4095))
  12280. ulTargetSlop[i] = 4095-tmp2;
  12281. else if (tmp1>4095)
  12282. ulTargetSlop[i] = 0;
  12283. else
  12284. ulTargetSlop[i] = tmp; //21
  12285. tmp2 = tmp1;
  12286. }
  12287. if(!ucSceneChangeEvent)
  12288. {
  12289. tmp = (INT32)ulTargetChroma[i] + (((INT32)ulPreTargetChroma[i]-(INT32)ulTargetChroma[i])*alpha)/256;
  12290. ulTargetChroma[i] = tmp;
  12291. }
  12292. }
  12293. // For special case IV - pure blue pattern : noise
  12294. ulCurChromaBinPercentage7 = PQ_ChromaBinPercentage(7);
  12295. ulCurChromaBinPercentage8 = PQ_ChromaBinPercentage(8);
  12296. if ( (ulHistBin[1] == dwTotalPixel || ulHistBin[2] == dwTotalPixel) && (ulCurChromaBinPercentage7 > 998 || ulCurChromaBinPercentage8 > 998) ) BluePatternFlag = 1;
  12297. else BluePatternFlag = 0;
  12298. // For special case V - white xx% pattern : bar noise
  12299. if ((ulHistBin[2] == dwTotalPixel || ulHistBin[3] == dwTotalPixel) && pHwContext->ulHistCaseCur == 31) // gray white scene
  12300. BarNoiseFlag = 1;
  12301. else
  12302. BarNoiseFlag = 0;
  12303. //set register
  12304. for(i=0; i<16; i++)
  12305. {
  12306. PQ_RegisterWrite(VIP_reg_dpy_hist_slope0+i*4 ,ulTargetSlop[i]);
  12307. PQ_RegisterWrite(VIP_reg_dpy_hist_chroma0+i*4 ,ulTargetChroma[i]);
  12308. }
  12309. PQ_RegisterWrite(VIP_reg_dpy_hist_start0 , 0);
  12310. tmp = 0;
  12311. if(_DCCPatch(BarNoiseFlag) == PATCHNOTAPPLY)
  12312. {
  12313. for(i=1; i<16; i++)
  12314. {
  12315. tmp = tmp +(ulTargetSlop[i-1]<<2);
  12316. if (tmp>16367)
  12317. {
  12318. tmp = 16367;
  12319. ulTargetSlop[i] = 0;
  12320. PQ_RegisterWrite(VIP_reg_dpy_hist_slope0+i*4 ,ulTargetSlop[i]);
  12321. }
  12322. PQ_RegisterWrite(VIP_reg_dpy_hist_start0+i*4 ,tmp);
  12323. }
  12324. }
  12325. ulPreAvgY = ulCurAvgY;
  12326. if (hit_flicker==0) memcpy(PreHistWeight, CurHistWeight, sizeof(UINT32)*8);
  12327. ulHistCasePre = pHwContext->ulHistCaseCur;
  12328. PreYLevel = iYLevel;
  12329. PreCLevel = iCLevel;
  12330. memcpy(ulPreTargetSlop,ulTargetSlop,sizeof(INT32)*16);
  12331. memcpy(ulPreTargetChroma, ulTargetChroma,sizeof(INT32)*16);
  12332. //patch of #51943
  12333. #ifdef DRV_ENABLE_CVD2
  12334. if(VIP_GetUserSource() == SOURCE_CVD2 && VIP_GetStdColorSystem() == CVD2_STD_PAL_IBGDK && pHwContext->bCVD2_NTSC_to_PAL_Patch)
  12335. {
  12336. DRV_CVD2_Enable_PAL_HighFrameDiff(FALSE);
  12337. DRV_CVD2_AV_PAL_FinetuneHFDiff(TRUE);
  12338. }
  12339. else
  12340. {
  12341. DRV_CVD2_Enable_PAL_HighFrameDiff(TRUE);
  12342. DRV_CVD2_AV_PAL_FinetuneHFDiff(FALSE);
  12343. }
  12344. #endif
  12345. }
  12346. void PQ_SW_DynamicContrast_Enable(UINT8 wValue)
  12347. {
  12348. if(wValue >1)
  12349. {
  12350. return;
  12351. }
  12352. SWDC_Param[0].ucSWDC_En = wValue;
  12353. }
  12354. UINT8 PQ_GetDynamicContrastEnable(void)
  12355. {
  12356. return SWDC_Param[0].ucSWDC_En;
  12357. }
  12358. void PQ_SW_DynamicContrast_Y_Level(UINT16 wValue)
  12359. {
  12360. if(wValue >512)
  12361. {
  12362. return;
  12363. }
  12364. SWDC_Param[0].wSWDC_YLevel= wValue;
  12365. }
  12366. void PQ_SW_DynamicContrast_C_Level(UINT16 wValue)
  12367. {
  12368. if(wValue >512)
  12369. {
  12370. return;
  12371. }
  12372. SWDC_Param[0].wSWDC_CLevel= wValue;
  12373. }
  12374. void PQ_SW_DynamicContrast_Alpha_Mode(UINT8 bMode ,UINT8 bValue)
  12375. {
  12376. if(bMode>3)
  12377. {
  12378. return;
  12379. }
  12380. SWDC_Param[0].wSWDC_Static_Alpha[bMode]= bValue;
  12381. }
  12382. #endif
  12383. UINT8 VIP_Get_PQ_Source(UINT8 ucSource, UINT8 ucSubSource)
  12384. {
  12385. PQ_DLC_SRC bIndex=HDMI_IN;
  12386. switch(ucSource)
  12387. {
  12388. case EXTS:
  12389. if( ucSubSource==YPP1 || ucSubSource==YPP2)
  12390. {
  12391. if(PQ_GetDefinitionIndex())
  12392. {
  12393. bIndex = COMP_HD_IN;
  12394. }
  12395. else
  12396. {
  12397. bIndex = COMP_IN;
  12398. }
  12399. #if SEPERATE_YPBPR1_YPBPR2
  12400. if(VIP_JudgeDVDSource()) //DVD have no HD resolution
  12401. {
  12402. bIndex = DVD_IN;
  12403. }
  12404. #endif
  12405. }
  12406. else if(ucSubSource==SCART_RGB1)
  12407. {
  12408. bIndex = SCART_IN;
  12409. }
  12410. else if( ucSubSource==DSUB )
  12411. {
  12412. bIndex = PC_IN;
  12413. }
  12414. break;
  12415. case CVD2:
  12416. if( ucSubSource==TV_INPUT_CHANNEL )
  12417. {
  12418. bIndex = ATV_IN;
  12419. }
  12420. else if( ucSubSource==AV1_INPUT_CHANNEL || ucSubSource==AV2_INPUT_CHANNEL || ucSubSource==AV3_INPUT_CHANNEL )
  12421. {
  12422. bIndex = AV_IN;
  12423. }
  12424. if( ucSubSource==S1_INPUT_CHANNEL || ucSubSource==S2_INPUT_CHANNEL || ucSubSource==S3_INPUT_CHANNEL )
  12425. {
  12426. bIndex = SV_IN;
  12427. }
  12428. break;
  12429. case MPEG:
  12430. {
  12431. if(PQ_GetDefinitionIndex())
  12432. {
  12433. bIndex = DTV_HD_IN;
  12434. }
  12435. else
  12436. {
  12437. bIndex = DTV_IN;
  12438. }
  12439. }
  12440. break;
  12441. case HDMI:
  12442. default:
  12443. if(VIP_RunDVIMode())
  12444. {
  12445. bIndex = PC_IN;
  12446. }
  12447. else
  12448. {
  12449. if(PQ_GetDefinitionIndex())
  12450. {
  12451. bIndex = HDMI_HD_IN;
  12452. }
  12453. else
  12454. {
  12455. bIndex = HDMI_IN;
  12456. }
  12457. }
  12458. break;
  12459. case JPEG:
  12460. case PATN:
  12461. bIndex = PC_IN;
  12462. break;
  12463. }
  12464. return bIndex;
  12465. }
  12466. #ifdef DYNAMIC_BACKLIGHT
  12467. UINT8 PQ_GETAllBlackStatus(void)
  12468. {
  12469. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  12470. return pDBL->ucAllBlackStatus;
  12471. }
  12472. UINT32 PQ_GetBackLight(void)
  12473. {
  12474. PQHW_CONTEXT* pHwContext= &PQHwContext;
  12475. UINT32 dwCur, dwBackLightAddr= REG_ADR2_PWM0_BACKLIGHT + PQ_GetPanelPWMNum() * 8;
  12476. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  12477. dwCur= *((UINT32 *)(dwBackLightAddr));
  12478. dwCur &= (~0x80000000);
  12479. if(pDBL->ucOrder)
  12480. dwCur = pDBL->dwTableMax - dwCur + pDBL->dwTableMin;
  12481. if(pHwContext->ucLocationMode == HOMEMODE)
  12482. {
  12483. dwCur = pDBL->dwLightMin + ((dwCur - pDBL->dwLightMin)*100+32)/70;
  12484. }
  12485. return dwCur;
  12486. }
  12487. #ifdef CONFIG_EXTRA_PWM_CONTROL_FOR_FAN
  12488. void tv_Disable_ExtraPwm(UINT8 ucPwmNum, UINT32 uiFrequency, UINT32 uiDuty)
  12489. {
  12490. *((UINT32 *)(REG_ADR2_PWM0_BACKLIGHT + (ucPwmNum*8))) = 0;
  12491. }
  12492. #endif
  12493. void PQ_SetDIM_REF_CTRL(UINT32 pwm_number, UINT32 status, UINT32 mmiovalue)
  12494. {
  12495. UINT32 dwBackLightAddr, dwBackLightAddrPeroid;
  12496. PBRVIP_FLASH brvip_flash_p = (PBRVIP_FLASH)SPI_PANELSET_SHADOWADDR;
  12497. u32 BLBase = 0;
  12498. u32 Pclk = 0;
  12499. #ifdef CONFIG_SUPPORT_PWMFrequency_SaveIn_FactoryMode
  12500. BootRomShareData_t *BootromShareData = (void *) KMFBR_ShareData_ShadowAddress;
  12501. #endif
  12502. #ifdef CONFIG_SUPPORT_PWMFrequency_SaveIn_FactoryMode
  12503. if(BootromShareData->PwmFreq == 0)
  12504. BootromShareData->PwmFreq = brvip_flash_p->LCDBackLight_PWMFrq;
  12505. #endif
  12506. if(brvip_flash_p->LCDBackLight_PWMSrc == 0)
  12507. {
  12508. if(brvip_flash_p->PanelParameter.LvdsParam_60.TxDiv > 0)
  12509. {
  12510. Pclk = REFCLK * 1000 * (brvip_flash_p->PanelParameter.LvdsParam_60.NDiv+1)/((brvip_flash_p->PanelParameter.LvdsParam_60.RefDiv+1)*(brvip_flash_p->PanelParameter.LvdsParam_60.TxDiv)*7);
  12511. }
  12512. #ifdef CONFIG_SUPPORT_PWMFrequency_SaveIn_FactoryMode
  12513. if(BootromShareData->PwmFreq > 0)
  12514. {
  12515. BLBase = Pclk /BootromShareData->PwmFreq;
  12516. }
  12517. #else
  12518. if(brvip_flash_p->LCDBackLight_PWMFrq > 0)
  12519. {
  12520. BLBase = Pclk /brvip_flash_p->LCDBackLight_PWMFrq;
  12521. }
  12522. #endif
  12523. }
  12524. else
  12525. {
  12526. #ifdef CONFIG_SUPPORT_PWMFrequency_SaveIn_FactoryMode
  12527. if(BootromShareData->PwmFreq > 0)
  12528. {
  12529. BLBase = REFCLK*1000/BootromShareData->PwmFreq;
  12530. }
  12531. #else
  12532. if(brvip_flash_p->LCDBackLight_PWMFrq > 0)
  12533. {
  12534. BLBase = REFCLK*1000/brvip_flash_p->LCDBackLight_PWMFrq;
  12535. }
  12536. #endif
  12537. }
  12538. if(BLBase == 0)
  12539. {
  12540. BLBase = 1; //avoid overflowed constant
  12541. }
  12542. if ( pwm_number < 4 ) {
  12543. dwBackLightAddrPeroid = REG_ADR1_PWM0_BACKLIGHT + (pwm_number * 8);
  12544. dwBackLightAddr = REG_ADR2_PWM0_BACKLIGHT + (pwm_number * 8);
  12545. *((UINT32 *)(dwBackLightAddr)) = 0; // turn off PWM
  12546. if ( status != 0 ) { // turn on PWM
  12547. #ifdef CONFIG_PANEL_BACKLIGHT_DIM_REF
  12548. if ( (pwm_number==0) || (pwm_number==2) ) { // REF 25KHz, Duty: 80%
  12549. if(CONFIG_PANEL_PWM_REF_PERIOD > 0)
  12550. {
  12551. *((UINT32 *)(dwBackLightAddrPeroid)) = 0x16E3600 / CONFIG_PANEL_PWM_REF_PERIOD;
  12552. *((UINT32 *)(dwBackLightAddr)) = ((0x16E3600 / CONFIG_PANEL_PWM_REF_PERIOD) * CONFIG_PANEL_PWM_DIM_DUTY/100) | 0x80000000;
  12553. }
  12554. }
  12555. else if ( pwm_number == 3) {
  12556. *((UINT32 *)(dwBackLightAddrPeroid)) = BLBase-1;
  12557. *((UINT32 *)(dwBackLightAddr)) = mmiovalue;
  12558. }
  12559. #else
  12560. *((UINT32 *)(dwBackLightAddrPeroid)) = BLBase-1;
  12561. *((UINT32 *)(dwBackLightAddr)) = mmiovalue;
  12562. #endif
  12563. }
  12564. #ifdef CONFIG_PANEL_PWM_REF_INV
  12565. if ( (0==status) && ((0==pwm_number) || (2==pwm_number)) ) {
  12566. if(CONFIG_PANEL_PWM_REF_PERIOD > 0)
  12567. {
  12568. *((UINT32 *)(dwBackLightAddrPeroid)) = (0x16E3600 / CONFIG_PANEL_PWM_REF_PERIOD)-1;
  12569. *((UINT32 *)(dwBackLightAddr)) = (0x16E3600 / CONFIG_PANEL_PWM_REF_PERIOD) | 0x80000000;
  12570. }
  12571. if ( 2==pwm_number ) {
  12572. GPIOFunctionSelect(30, 0);
  12573. }
  12574. }
  12575. #if 0
  12576. #elif defined(CONFIG_PANEL_ADJ_INVERT)
  12577. if ( (0==status) && (2==pwm_number) ) {
  12578. GPIOFunctionSelect(30, 0);
  12579. }
  12580. #endif
  12581. #endif
  12582. }
  12583. }
  12584. void PQ_SetBackLight(UINT32 dwValue)
  12585. {
  12586. PQHW_CONTEXT* pHwContext= &PQHwContext;
  12587. UINT32 dwBackLightAddr= REG_ADR2_PWM0_BACKLIGHT + PQ_GetPanelPWMNum() * 8;
  12588. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  12589. if(pHwContext->ucLocationMode == HOMEMODE)
  12590. {
  12591. dwValue = pDBL->dwLightMin + ((dwValue - pDBL->dwLightMin)*70+50)/100;
  12592. }
  12593. if(pDBL->ucOrder)
  12594. {
  12595. dwValue = pDBL->dwTableMax - dwValue + pDBL->dwTableMin;
  12596. }
  12597. *((UINT32 *)(dwBackLightAddr))= dwValue|0x80000000;
  12598. }
  12599. UINT32 PQ_GetRealBackLight(void)
  12600. {
  12601. UINT32 dwCur, dwBackLightAddr= REG_ADR2_PWM0_BACKLIGHT + PQ_GetPanelPWMNum() * 8;
  12602. dwCur= *((UINT32 *)(dwBackLightAddr));
  12603. dwCur &= (~0x80000000);
  12604. return dwCur;
  12605. }
  12606. void PQ_SetRealBackLight(UINT32 dwValue)
  12607. {
  12608. UINT32 dwBackLightAddr= REG_ADR2_PWM0_BACKLIGHT + PQ_GetPanelPWMNum() * 8;
  12609. *((UINT32 *)(dwBackLightAddr))= dwValue|0x80000000;
  12610. }
  12611. UINT32 PQ_GetHomeModeValue(UINT32 *pValue)
  12612. {
  12613. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  12614. PQHW_CONTEXT* pHwContext= &PQHwContext;
  12615. UINT32 uiValue= *pValue;
  12616. if(pHwContext->ucLocationMode == HOMEMODE)
  12617. {
  12618. uiValue = pDBL->dwLightMin + ((uiValue - pDBL->dwLightMin)*80+50)/100;
  12619. }
  12620. return uiValue;
  12621. }
  12622. void PQ_GetLightSensorInfo(UINT8 ucLSensorEn,UINT8 ucIndex, UINT32 dwLight)
  12623. {
  12624. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  12625. PQHW_CONTEXT* pHwContext= &PQHwContext;
  12626. UINT32 ulCurBackLight, ulCurBLRate = 0;//, ulTargeBackLight
  12627. static UINT8 ucLastLSensorEn = 0;
  12628. UINT8 ucTmpLevel;
  12629. dwLight &= ~(0x80000000);
  12630. if(pDBL->ucOrder)
  12631. dwLight = pDBL->dwTableMax - dwLight + pDBL->dwTableMin;
  12632. PQDebugPrint("%s:ucLSensorEn = %d, udwLight = %ld(0x%lx)",__FUNCTION__, ucLSensorEn, dwLight, dwLight);
  12633. if(pHwContext->ucLocationMode != STOREMODE)
  12634. {
  12635. pHwContext->ucLocationMode = STOREMODE;
  12636. PQDebugPrint("&&&&&&&&&&close store mode&&&&&&&&&&&");
  12637. }
  12638. if( dwLight < pDBL->dwTableMin || dwLight>pDBL->dwTableMax )
  12639. {
  12640. PQDebugPrint("out of range:%ld~%ld(%ld)", pDBL->dwTableMin, pDBL->dwTableMax, dwLight);
  12641. return;
  12642. }
  12643. pDBL->bLightSensor = ucLSensorEn;
  12644. PQDebugPrint("pDBL->dwLightMax = %ld, pDBL->dwLightMin = %ld", pDBL->dwLightMax, pDBL->dwLightMin);
  12645. if(pDBL->bLSChangeBacklight)
  12646. {
  12647. if((pDBL->dwLightMax-pDBL->dwLightMin) > 0)
  12648. {
  12649. ulCurBLRate = (pDBL->dwLSTarge-pDBL->dwLightMin)*100/(pDBL->dwLightMax-pDBL->dwLightMin);
  12650. }
  12651. }
  12652. else
  12653. {
  12654. if((pDBL->dwLightMax-pDBL->dwLightMin) > 0)
  12655. {
  12656. ulCurBLRate = (PQ_GetBackLight()-pDBL->dwLightMin)*100/(pDBL->dwLightMax-pDBL->dwLightMin);
  12657. }
  12658. }
  12659. ulCurBLRate = min((UINT32)100,ulCurBLRate);
  12660. PQDebugPrint("pDBL->dwTableMin = %ld, pDBL->dwTableMax = %ld, ulCurBLRate = %ld", pDBL->dwTableMin, pDBL->dwTableMax, ulCurBLRate);
  12661. if(ucLSensorEn)
  12662. {
  12663. if((pDBL->dwTableMax-pDBL->dwTableMin) > 0)
  12664. {
  12665. pDBL->dwBackLightRate = (dwLight-pDBL->dwTableMin)*100/(pDBL->dwTableMax-pDBL->dwTableMin);
  12666. }
  12667. if(pDBL->dwBackLightRate == 0)
  12668. pDBL->dwBackLightRate = 100;
  12669. pDBL->dwLightMin = pDBL->dwTableMin;
  12670. pDBL->dwLightMid = pDBL->dwTableMin + (pDBL->dwTableMid-pDBL->dwTableMin)*pDBL->dwBackLightRate/100;
  12671. pDBL->dwLightMax = pDBL->dwTableMin + (pDBL->dwTableMax-pDBL->dwTableMin)*pDBL->dwBackLightRate/100;
  12672. pDBL->dwLightNormal = pDBL->dwTableMin + (pDBL->dwTableNormal-pDBL->dwTableMin)*pDBL->dwBackLightRate/100;
  12673. if(pDBL->dwBackLightRate == 100)
  12674. {
  12675. pDBL->dwLightMin = pDBL->dwTableMin;
  12676. pDBL->dwLightMid = pDBL->dwTableMid;
  12677. pDBL->dwLightMax = pDBL->dwTableMax;
  12678. pDBL->dwLightNormal = pDBL->dwTableNormal;
  12679. }
  12680. }
  12681. else
  12682. {
  12683. pDBL->dwBackLightRate = 100;
  12684. pDBL->dwLightMin = pDBL->dwTableMin;
  12685. pDBL->dwLightMid = pDBL->dwTableMid;
  12686. pDBL->dwLightMax = pDBL->dwTableMax;
  12687. pDBL->dwLightNormal = pDBL->dwTableNormal;
  12688. }
  12689. PQDebugPrint("pDBL->dwBackLightRate = %ld, ucLSensorEn = %d, ucLastLSensorEn = %d", pDBL->dwBackLightRate, ucLSensorEn, ucLastLSensorEn);
  12690. if(pDBL->ucLevel==OFF && pDBL->bLSChangeBacklight==0)
  12691. return;
  12692. if(pDBL->ucAllBlackStatus)
  12693. {
  12694. PQDebugPrint("ignore lightsensor change");
  12695. return;
  12696. }
  12697. //slow change back light when light sensor disable<->enable
  12698. ulCurBackLight = PQ_GetBackLight();
  12699. if(pDBL->dwBackLightRate != 100)
  12700. pDBL->dwLSTarge = pDBL->dwLightMin + (pDBL->dwLightMax-pDBL->dwLightMin)*ulCurBLRate/100;
  12701. else
  12702. pDBL->dwLSTarge = ulCurBackLight;
  12703. pDBL->iLSADD = max((INT32)(pDBL->dwLSTarge - ulCurBackLight)/50, 30);
  12704. pDBL->bLSChangeBacklight = 1;
  12705. PQDebugPrint("rate0:%ld(0x%lx) -> %ld(0x%lx), idiff = %d",ulCurBackLight, ulCurBackLight, pDBL->dwLSTarge, pDBL->dwLSTarge, pDBL->iLSADD);
  12706. ucTmpLevel = pDBL->ucLevel;
  12707. pDBL->ucLevel = OFF;
  12708. if(pDBL->iLSADD == 0 || ucLastLSensorEn == ucLSensorEn)
  12709. PQ_SetBackLight(pDBL->dwLSTarge);
  12710. else
  12711. {
  12712. if(pDBL->bLSChangeBacklight)
  12713. {
  12714. while(pDBL->dwLSTarge != ulCurBackLight)
  12715. {
  12716. if( (signed)((signed)ulCurBackLight+pDBL->iLSADD)<0 )
  12717. ulCurBackLight = 0;
  12718. else
  12719. ulCurBackLight += pDBL->iLSADD;
  12720. if(abs((signed)ulCurBackLight - pDBL->dwLSTarge) < abs(pDBL->iLSADD))
  12721. {
  12722. ulCurBackLight = pDBL->dwLSTarge;
  12723. }
  12724. PQ_SetBackLight(ulCurBackLight);
  12725. PQ_DelayMS(10);
  12726. }
  12727. }
  12728. }
  12729. PQDebugPrint("turn on dynamic backlight:pDBL->ucLevel = %d\n\n", pDBL->ucLevel);
  12730. pDBL->bLSChangeBacklight = 0;
  12731. pDBL->ucLevel = ucTmpLevel;
  12732. ucLastLSensorEn = ucLSensorEn;
  12733. }
  12734. void PQ_SetBacklightParameter(UINT8 ucTop,UINT8 ucBot,UINT8 ucTh_low,UINT8 ucTh_High)
  12735. {
  12736. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  12737. pDBL->ucTop = ucTop;
  12738. pDBL->ucBot = ucBot ;
  12739. pDBL->ucTh_low=ucTh_low ;
  12740. pDBL->ucTh_High=ucTh_High;
  12741. PQDebugPrint("ucTop = %d, ucBot = %d, ucTh_High = %d, ucTh_low = %d",
  12742. pDBL->ucTop, pDBL->ucBot, pDBL->ucTh_High, pDBL->ucTh_low);
  12743. }
  12744. void PQ_LightSensorChange(void)
  12745. {
  12746. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  12747. UINT32 ulCurBackLight = PQ_GetBackLight();
  12748. static UINT8 ucTmpLevel=0xff;
  12749. static UINT32 ucLastBL = 0;
  12750. if(pDBL->bLSChangeBacklight)
  12751. {
  12752. if( pDBL->ucLevel!=0)
  12753. {
  12754. ucTmpLevel = pDBL->ucLevel;
  12755. pDBL->ucLevel = OFF;
  12756. PQDebugPrint("turn off dynamic backlight");
  12757. }
  12758. if(pDBL->dwLSTarge != ulCurBackLight)
  12759. {
  12760. if( (signed)((signed)ulCurBackLight+pDBL->iLSADD)<0 )
  12761. ulCurBackLight = 0;
  12762. else
  12763. ulCurBackLight += pDBL->iLSADD;
  12764. if(abs((signed)ulCurBackLight - pDBL->dwLSTarge) < abs(pDBL->iLSADD))
  12765. {
  12766. //PQDebugPrint("abs(%d-%d)<%d",ulCurBackLight, pDBL->dwLSTarge, pDBL->iLSADD );
  12767. ulCurBackLight = pDBL->dwLSTarge;
  12768. }
  12769. PQ_SetBackLight(ulCurBackLight);
  12770. if(ucLastBL == ulCurBackLight)
  12771. {
  12772. PQDebugPrint("ERR:ulCurBackLight = %ld, pDBL->iLSADD = %d, pDBL->dwLSTarge = %ld", ulCurBackLight, pDBL->iLSADD, pDBL->dwLSTarge);
  12773. ulCurBackLight = pDBL->dwLSTarge;
  12774. PQ_SetBackLight(ulCurBackLight);
  12775. return;
  12776. }
  12777. ucLastBL = ulCurBackLight;
  12778. //PQDebugPrint("%s:rate0:backlight = %ld(0x%lx)",__FUNCTION__, ulCurBackLight, ulCurBackLight);
  12779. }
  12780. else
  12781. {
  12782. ucLastBL = 0;
  12783. pDBL->bLSChangeBacklight = 0;
  12784. pDBL->ucLevel = ucTmpLevel;
  12785. PQDebugPrint("turn on dynamic backlight:pDBL->ucLevel = %d", pDBL->ucLevel);
  12786. }
  12787. }
  12788. }
  12789. void PQ_InitDynamicBackLight(void)
  12790. {
  12791. PBRVIP_FLASH brvip_flash_p = (PBRVIP_FLASH)SPI_PANELSET_SHADOWADDR;
  12792. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  12793. #ifdef CONFIG_SUPPORT_PWMFrequency_SaveIn_FactoryMode
  12794. BootRomShareData_t *BootromShareData = (void *) KMFBR_ShareData_ShadowAddress;
  12795. #endif
  12796. INT32 i;
  12797. UINT32 BLBase = 0, Pclk = 0;
  12798. UINT16 uwMaxduty, uwMinduty;
  12799. #ifdef DYNAMICBL_ADJUST
  12800. UINT8 bindex;
  12801. #endif
  12802. sema_init(&pDBL->sem, 1);
  12803. pDBL->ucLevel= OFF;
  12804. pDBL->ucLevelTarget= OFF;
  12805. pDBL->nBound1= 45; //boundary for black ~=10%
  12806. pDBL->nBound2= 65; //boundary for keeping black ~=20%
  12807. pDBL->nBound3= 203; //boundary for keeping white ~=80%
  12808. pDBL->nBound4= 203; //boundary for white ~=90%
  12809. pDBL->wDetectFrameCount= 176; //16x
  12810. //#ifdef CONFIG_PANEL_ADJ_INVERT
  12811. // pDBL->ucOrder = 1;
  12812. //#else
  12813. pDBL->ucOrder = brvip_flash_p->LCDBackLight_Order;
  12814. //#endif
  12815. pDBL->ucDynamicBLType = DYNAMIC_BL_FORMAL;
  12816. #ifdef DYNAMICBL_ADJUST
  12817. DynamicBL_OSD_MAX = brvip_flash_p->DynamicBacklightOSDMax;
  12818. DynamicBL_OSD_Min = brvip_flash_p->DynamicBacklightOSDMin;
  12819. DynamicBL_normal = brvip_flash_p->DynamicBacklightOSDNormal;
  12820. // printk("\n\n init MAX = %d Min = %d normal = %d \n\n\n\n",DynamicBL_OSD_MAX,DynamicBL_OSD_Min,DynamicBL_normal);
  12821. #endif
  12822. GetCustomerData("gElectricity_PWM_table", (void *)&(pDBL->pElectricity_PWM_table), &(pDBL->Electricity_PWM_table_Size));
  12823. pDBL->Electricity_PWM_table_Size = pDBL->Electricity_PWM_table_Size/sizeof(Electity_PWM_Mapping_Table);
  12824. PQ_get_PWM_Duty(&uwMaxduty, &uwMinduty);
  12825. #ifdef CONFIG_SUPPORT_PWMFrequency_SaveIn_FactoryMode
  12826. if(BootromShareData->PwmFreq == 0)
  12827. BootromShareData->PwmFreq = brvip_flash_p->LCDBackLight_PWMFrq;
  12828. #endif
  12829. //LCDBackLightMap[] has possibly not yet initialized here, so vip get value by itself.
  12830. if(brvip_flash_p->LCDBackLight_PWMSrc == 0)
  12831. {
  12832. if((brvip_flash_p->PanelParameter.LvdsParam_60.TxDiv) > 0)
  12833. {
  12834. Pclk = REFCLK * 1000 * (brvip_flash_p->PanelParameter.LvdsParam_60.NDiv+1)/((brvip_flash_p->PanelParameter.LvdsParam_60.RefDiv+1)*(brvip_flash_p->PanelParameter.LvdsParam_60.TxDiv)*7);
  12835. }
  12836. #ifdef CONFIG_SUPPORT_PWMFrequency_SaveIn_FactoryMode
  12837. if(BootromShareData->PwmFreq > 0)
  12838. {
  12839. BLBase = Pclk /BootromShareData->PwmFreq;
  12840. }
  12841. #else
  12842. if(brvip_flash_p->LCDBackLight_PWMFrq > 0)
  12843. {
  12844. BLBase = Pclk /brvip_flash_p->LCDBackLight_PWMFrq;
  12845. }
  12846. #endif
  12847. }
  12848. else
  12849. {
  12850. #ifdef CONFIG_SUPPORT_PWMFrequency_SaveIn_FactoryMode
  12851. if(BootromShareData->PwmFreq > 0)
  12852. {
  12853. BLBase = REFCLK*1000/BootromShareData->PwmFreq;
  12854. }
  12855. #else
  12856. if(brvip_flash_p->LCDBackLight_PWMFrq > 0)
  12857. {
  12858. BLBase = REFCLK*1000/brvip_flash_p->LCDBackLight_PWMFrq;
  12859. }
  12860. #endif
  12861. }
  12862. //LCDBackLightMap[] has possibly not yet initialized here, so vip get value by itself.
  12863. for(i = 0; i <15; i++)
  12864. {
  12865. #ifdef CONFIG_SUPPORT_PWM_DUTY_IN_DECIMAL
  12866. pDBL->BacklightTab[i] = round(BLBase*uwMinduty, 1000) + round((BLBase*(uwMaxduty - uwMinduty) * i), 14*1000);
  12867. #else
  12868. pDBL->BacklightTab[i] = round(BLBase*uwMinduty, 100) + round((BLBase*(uwMaxduty - uwMinduty) * i), 14*100);
  12869. #endif
  12870. }
  12871. pDBL->dwTableMin= pDBL->BacklightTab[0];
  12872. pDBL->dwTableMax= pDBL->BacklightTab[14];
  12873. pDBL->dwTableMid= pDBL->BacklightTab[7];
  12874. #ifdef DYNAMICBL_ADJUST
  12875. bindex = 14 * DynamicBL_normal / 100 ;
  12876. pDBL->dwTableNormal= pDBL->BacklightTab[bindex];
  12877. #else
  12878. pDBL->dwTableNormal= pDBL->BacklightTab[12];
  12879. #endif
  12880. // to avoid the PWM is wrong order(smaller->larger is right) in panelset.ini
  12881. if( pDBL->dwTableMin>pDBL->dwTableMax )
  12882. {
  12883. pDBL->dwTableNormal= pDBL->dwTableMin;
  12884. pDBL->dwTableMin= pDBL->dwTableMax;
  12885. pDBL->dwTableMax= pDBL->dwTableNormal;
  12886. #ifdef DYNAMICBL_ADJUST
  12887. bindex = 14 - 14 * DynamicBL_normal / 100 ;
  12888. pDBL->dwTableNormal= pDBL->BacklightTab[bindex]; //14-12
  12889. #else
  12890. pDBL->dwTableNormal= pDBL->BacklightTab[2]; //14-12
  12891. #endif
  12892. }
  12893. pDBL->dwLightMax = pDBL->dwTableMax;
  12894. pDBL->dwLightMid = pDBL->dwTableMid;
  12895. pDBL->dwLightMin = pDBL->dwTableMin;
  12896. pDBL->dwLightNormal= pDBL->dwTableNormal;
  12897. pDBL->dwLightMid =pDBL->dwTableMid;
  12898. pDBL->dwLightQuot= (pDBL->dwTableMax-pDBL->dwTableMin)/VIP_DBL_LEVEL_DEGREE;
  12899. pDBL->bLSChangeBacklight = 0;
  12900. pDBL->bLightSensor = 0;
  12901. pDBL->dwBackLightRate = 100;
  12902. pDBL->ucHistMinPercentage = 40;
  12903. pDBL->nBound0_more = 60;
  12904. pDBL->nBound0 = 100;
  12905. pDBL->nBound1= 130; //16+219*12%
  12906. pDBL->nBound2= 150; //16+219*20%
  12907. pDBL->nBound3= 180; //16+219*80%
  12908. pDBL->nBound4= 190; //16+219*88%
  12909. pDBL->nBound5 = 200; //16+219*88%
  12910. pDBL->wDetectFrameCount= 288;
  12911. PQDebugPrint("%s: Bound={0x%x 0x%x 0x%x 0x%x} nDetectFrameCount=0x%x", __FUNCTION__, pDBL->nBound1, pDBL->nBound2, pDBL->nBound3, pDBL->nBound4, pDBL->wDetectFrameCount);
  12912. PQDebugPrint("%s: dwLightMin=0x%lx dwLightMax=0x%lx dwLightNormal=0x%lx dwLightQuot=0x%lx", __FUNCTION__, pDBL->dwLightMin, pDBL->dwLightMax, pDBL->dwLightNormal, pDBL->dwLightQuot);
  12913. PQDebugPrint("%s: dwTableMin=0x%lx dwTableMax=0x%lx dwTableNormal=0x%lx dwLightQuot=0x%lx", __FUNCTION__, pDBL->dwTableMin, pDBL->dwTableMax, pDBL->dwTableNormal, pDBL->dwLightQuot);
  12914. }
  12915. void PQ_DynamicBackLightAP(UINT8 ucLevel, UINT32 dwMap)
  12916. {
  12917. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  12918. if(dwMap <=14)
  12919. PQ_EnableDynamicBackLight(ucLevel, pDBL->BacklightTab[dwMap]);
  12920. }
  12921. UINT8 PQ_specialpatterndetect(void)
  12922. {
  12923. UINT8 ucStaticFlag = STATIC_FRAME;
  12924. UINT32 dwTotalPixel;
  12925. UINT8 i;
  12926. UINT32 ulHistBin[16];
  12927. //UINT8 bIsSpecialHist = 0;
  12928. PQHW_CONTEXT* pHwContext= &PQHwContext;
  12929. if(ucVDI_Static_Cnt_2 > 10)
  12930. {
  12931. ucStaticFlag = MOTION_FRAME;
  12932. }
  12933. else
  12934. {
  12935. ucStaticFlag = STATIC_FRAME;
  12936. }
  12937. dwTotalPixel = 0;
  12938. for(i = 0; i <16; i++)
  12939. {
  12940. ulHistBin[i] = PQ_RegisterRead(VIP_reg_dpy_hist_bin0+i*4);
  12941. dwTotalPixel += ulHistBin[i];
  12942. }
  12943. /*if(((((ulHistBin[1] > (dwTotalPixel * 70/100))?1:0) ||((ulHistBin[0] > (dwTotalPixel * 70/100))?1:0)) &&
  12944. ((((ulHistBin[2] > (dwTotalPixel * 9/1000))?1:0)&&
  12945. ((ulHistBin[3] > (dwTotalPixel * 1/1000))?1:0) )||
  12946. (((ulHistBin[1] > (dwTotalPixel * 11/1000))?1:0)&&
  12947. ((ulHistBin[2] > (dwTotalPixel * 11/1000))?1:0)))&&
  12948. ((((ulHistBin[12] > (dwTotalPixel * 8/1000))?1:0)&&
  12949. ((ulHistBin[13] > (dwTotalPixel * 8/1000))?1:0)&&
  12950. ((ulHistBin[14] > (dwTotalPixel * 6/100))?1:0))||
  12951. (((ulHistBin[11] > (dwTotalPixel * 8/1000))?1:0)&&
  12952. ((ulHistBin[12] > (dwTotalPixel * 9/100))?1:0)&&
  12953. ((ulHistBin[13] > (dwTotalPixel * 5/1000))?1:0)) ||
  12954. (((ulHistBin[11] > (dwTotalPixel * 8/1000))?1:0)&&
  12955. ((ulHistBin[12] > (dwTotalPixel * 14/1000))?1:0)&&
  12956. ((ulHistBin[13] > (dwTotalPixel * 12/100))?1:0)) ||
  12957. (((ulHistBin[13] > (dwTotalPixel * 10/1000))?1:0)&&
  12958. ((ulHistBin[14] > (dwTotalPixel * 10/1000))?1:0)&&
  12959. ((ulHistBin[15] > (dwTotalPixel * 8/100))?1:0)))) || //����
  12960. ((ulHistBin[13] >= (dwTotalPixel * 950/1000))?1:0))//white level
  12961. {
  12962. bIsSpecialHist = 1;
  12963. }
  12964. else
  12965. {
  12966. bIsSpecialHist = 0;
  12967. }*/
  12968. //if(( bIsSpecialHist == 1) && (ucStaticFlag ==STATIC_FRAME) && ((pHwContext->ulHistCaseCur == 32) || (pHwContext->ulHistCaseCur == 31)))
  12969. if((ucStaticFlag ==STATIC_FRAME) && ((pHwContext->ulHistCaseCur == 32) || (pHwContext->ulHistCaseCur == 31)))
  12970. {
  12971. //printk("\n\n TRUE ucStaticFlag = %d pHwContext->ulHistCaseCur = %d\n\n\n",ucStaticFlag,pHwContext->ulHistCaseCur);
  12972. return TRUE;
  12973. }
  12974. else
  12975. {
  12976. //printk("\n\n False \n\n\n");
  12977. return FALSE;
  12978. }
  12979. }
  12980. void PQ_EnableDynamicBackLight(UINT8 ucLevel, UINT32 dwLightUser)
  12981. {
  12982. #ifdef DynamicBacklight_EnergyEfficiency
  12983. PQHW_CONTEXT* pHwContext= &PQHwContext;
  12984. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  12985. BOOL bEnable = (ucLevel>=WEAK && ucLevel<=STRONG);
  12986. #endif
  12987. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  12988. //UINT32 dwCur,dwTarget;
  12989. UINT32 dwTarget;
  12990. //INT32 iLoop,iAdd;//,iStep= 8;
  12991. UINT8 ucTmpLS;
  12992. PBRVIP_FLASH brvip_flash_p = (PBRVIP_FLASH)SPI_PANELSET_SHADOWADDR;
  12993. UINT32 maxBLValue = 0, minBLValue = 0;
  12994. #if 0//def DYNAMICBL_ADJUST
  12995. ptv_base_t ptv = getptvdev();
  12996. UINT32 mmiovalue;
  12997. #endif
  12998. if(PQ_GetColorProcessor() == FALSE)
  12999. return;
  13000. dwLightUser &= ~(0x80000000); //clear the setting bit
  13001. if(pDBL->ucOrder)
  13002. {
  13003. PQDebugPrint("%s: dwLightUser=%ld(%#lx)", __FUNCTION__, dwLightUser, dwLightUser);
  13004. dwLightUser = pDBL->dwTableMax- dwLightUser + pDBL->dwTableMin;
  13005. }
  13006. PQ_ADVANCE_HWPrint("%s: ucLevel=%d dwLightUser=0x%x pDBL->ucOrder = %d", __FUNCTION__, ucLevel, dwLightUser, pDBL->ucOrder);
  13007. down(&pDBL->sem);
  13008. pDBL->ucLevel= OFF;
  13009. ucTmpLS = pDBL->bLightSensor;
  13010. pDBL->bLightSensor = OFF; //turn off to prevent action at the same time
  13011. if( dwLightUser<pDBL->dwTableMin || dwLightUser>pDBL->dwTableMax || dwLightUser == 0)
  13012. dwLightUser= pDBL->dwTableNormal;
  13013. //no centering adjustment if enable
  13014. //dwTarget= pDBL->dwTableNormal= dwLightUser;
  13015. dwTarget= pDBL->dwTableNormal;
  13016. #ifdef DynamicBacklight_EnergyEfficiency
  13017. if(PQ_GetDynamicBLType() == DYNAMIC_BL_ENERGY_EFFICIENCY)
  13018. {
  13019. pDBL->dwTableNormal= pDBL->BacklightTab[12];
  13020. if( pDBL->dwTableMin>pDBL->dwTableMax )
  13021. pDBL->dwTableNormal= pDBL->BacklightTab[2]; //14-12
  13022. }
  13023. #endif
  13024. if( dwTarget>=pDBL->dwTableMin && dwTarget<=pDBL->dwTableMax )
  13025. {
  13026. PQDebugPrint("default = %ld(0x%lx)",dwTarget,dwTarget);
  13027. if(ucTmpLS)
  13028. dwTarget = pDBL->dwTableMin + ((dwTarget - pDBL->dwTableMin)*pDBL->dwBackLightRate+50)/100;
  13029. }
  13030. maxBLValue = (LCDBackLightMap[0] > LCDBackLightMap[14]) ? LCDBackLightMap[0] : LCDBackLightMap[14];
  13031. minBLValue = (LCDBackLightMap[0] > LCDBackLightMap[14]) ? LCDBackLightMap[14] : LCDBackLightMap[0];
  13032. if(brvip_flash_p->LCDBackLight_Order)
  13033. {
  13034. dwTarget = maxBLValue - (dwTarget-minBLValue);
  13035. }
  13036. //init for BL variables
  13037. pDBL->bLightSensor = ucTmpLS;
  13038. pDBL->bLSChangeBacklight = 0;
  13039. PQ_BackLightDetect(TRUE);
  13040. pDBL->dwWhiteLevel= VIP_DBL_INVALID_WHITE_LEVEL;
  13041. pDBL->dwLightTarget= pDBL->dwLightNormal;
  13042. pDBL->iAdd= 0;
  13043. pDBL->ucLevelTarget= ucLevel;
  13044. #ifdef DynamicBacklight_EnergyEfficiency
  13045. if(PQ_GetDynamicBLType()==DYNAMIC_BL_ENERGY_EFFICIENCY)
  13046. {
  13047. if(!bEnable)
  13048. {
  13049. PQ_PresetBackLight(TRUE, dwTarget, BL_QUICK);
  13050. PQ_PresetContrast(TRUE, pMenuValue->iContrast, 1);
  13051. }
  13052. else
  13053. {
  13054. PQ_EEBackLightDetect(FALSE);
  13055. PQ_PresetBackLight(TRUE, pDBL->dwLightTarget, BL_QUICK);
  13056. }
  13057. }
  13058. else
  13059. #endif
  13060. {
  13061. printk("\n dwLightTarget = 0x%0x\n",dwTarget);
  13062. #if 0//def DYNAMICBL_ADJUST
  13063. mmiovalue = tv_GetLCDBackLightValue(ptv->pBootRomShareData->LcdBacklightValue);
  13064. PQ_ChangeBackLight(mmiovalue, 1);
  13065. #else
  13066. PQ_PresetBackLight(TRUE, dwTarget, PQ_GetHomeModeValue(&dwTarget) > PQ_GetRealBackLight() ? BL_QUICK : BL_SLOW);
  13067. #endif
  13068. }
  13069. pDBL->ucAllBlackStatus = 0;
  13070. up(&pDBL->sem);
  13071. }
  13072. void PQ_PresetBackLight(BOOL bReset, UINT32 dwLightTarget, INT32 nSpeed)
  13073. {
  13074. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  13075. static UINT8 nPollingIndex= 0;
  13076. static INT32 iAdd = 0;
  13077. static UINT32 dwCur = 0;
  13078. static UINT32 dwTarget = 0;
  13079. static UINT32 dwNext = 0;
  13080. static UINT8 nStep = 1;
  13081. static BOOL bStart = FALSE;
  13082. if(bReset)
  13083. {
  13084. pDBL->ucLevel= OFF;
  13085. dwCur = PQ_GetRealBackLight();
  13086. dwTarget = PQ_GetHomeModeValue(&dwLightTarget);
  13087. if(nSpeed == BL_SLOW)
  13088. nStep = 5;
  13089. else
  13090. nStep = 12;
  13091. iAdd = pDBL->dwLightQuot * nStep;
  13092. if( dwTarget<dwCur )
  13093. iAdd= -(iAdd);
  13094. nPollingIndex = 0;
  13095. bStart = TRUE;
  13096. PQDebugPrint("%s:dwCur = %d(%x), dwTarget = %d(%x), nStep = %d, iAdd = %d",__FUNCTION__,dwCur, dwCur, dwTarget, dwTarget, nStep , iAdd);
  13097. }
  13098. if(bStart == TRUE)
  13099. {
  13100. nPollingIndex++;
  13101. if(nPollingIndex<3)
  13102. return;
  13103. nPollingIndex = 0;
  13104. dwCur = PQ_GetRealBackLight();
  13105. dwNext= dwCur+iAdd;
  13106. if( abs(dwCur - dwTarget) <= abs(dwCur - dwNext))
  13107. {
  13108. dwNext= dwTarget;
  13109. }
  13110. if((iAdd > 0 && dwCur > dwTarget) || (iAdd < 0 && dwCur < dwTarget) || iAdd == 0)//prevent other driver set backlight traversing our target value.
  13111. {
  13112. PQ_SetRealBackLight(dwTarget);
  13113. dwNext = dwCur = dwTarget;
  13114. }
  13115. if( dwNext!=dwCur )
  13116. {
  13117. PQ_SetRealBackLight(dwNext);
  13118. //PQDebugPrint("%s: dwNext=0x%lx dwCur=0x%lx dwTarget=0x%lx pDBL->dwLightMin=0x%lx\n", __FUNCTION__, dwNext, dwCur, dwTarget, pDBL->dwLightMin);
  13119. }
  13120. else
  13121. {
  13122. PQDebugPrint("%s: DONE!!! dwCur=%#lx(%ld)\n", __FUNCTION__, dwCur, dwCur);
  13123. bStart = FALSE;
  13124. pDBL->ucLevel= pDBL->ucLevelTarget;
  13125. }
  13126. }
  13127. }
  13128. void PQ_BackLightDetect(BOOL bReset)
  13129. {
  13130. PQ_PresetBackLight(FALSE, 0, 0);
  13131. #if 0
  13132. #else
  13133. #if 0
  13134. VIP_LEDBackLightDetect(bReset);
  13135. #else
  13136. #ifdef DynamicBacklight_EnergyEfficiency
  13137. if(PQ_GetDynamicBLType() == DYNAMIC_BL_ENERGY_EFFICIENCY)
  13138. {
  13139. PQ_EEBackLightDetect(bReset);
  13140. PQ_PresetContrast(FALSE, 0, 0);
  13141. }
  13142. else
  13143. #endif
  13144. #if 0
  13145. #else
  13146. PQ_FormalBackLightDetect(bReset);
  13147. #endif
  13148. #endif
  13149. #endif
  13150. }
  13151. UINT32 PQ_BackLightTarget(UINT8 nDBLStatus, UINT8 nWhiteCondition, UINT32 dwCur)
  13152. {
  13153. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  13154. UINT32 dwLightTarget;
  13155. #ifdef DYNAMICBL_ADJUST
  13156. UINT32 bMaxBL,bMinBL,bOSDNormal;
  13157. //ptv_base_t ptv = getptvdev();
  13158. // UINT32 maxBLValue,minBLValue;
  13159. #endif
  13160. // PBRVIP_FLASH brvip_flash_p = (PBRVIP_FLASH)SPI_PANELSET_SHADOWADDR;
  13161. #if 0
  13162. INT32 nStep,nSlowStep,nQuickStep;
  13163. nSlowStep= 1;
  13164. nQuickStep= 3;
  13165. if( nDBLStatus==VIP_DBL_STATUS_ENTERING )
  13166. {
  13167. dwLightTarget= (nWhiteCondition==1) ? pDBL->dwLightMin : pDBL->dwLightMax;
  13168. nStep= (nWhiteCondition==1) ? nSlowStep : nQuickStep; //white color want to increase the steps
  13169. }
  13170. else
  13171. {
  13172. dwLightTarget= pDBL->dwLightNormal;
  13173. nStep= nQuickStep;
  13174. }
  13175. pDBL->dwLightTarget= dwLightTarget;
  13176. pDBL->iAdd= pDBL->dwLightQuot*nStep;
  13177. if( dwLightTarget<dwCur )
  13178. pDBL->iAdd= -(pDBL->iAdd);
  13179. #else
  13180. UINT32 dwFrameCount =0,dwDiff;
  13181. #ifdef DYNAMICBL_ADJUST
  13182. if(VIP_IsATVSource())
  13183. {
  13184. bMaxBL = tv_GetLCDBackLightValueexceptinvert(DynamicBL_OSD_MAX + DynamicBL_OSD_MAX_FineTune);
  13185. bMinBL = tv_GetLCDBackLightValueexceptinvert(DynamicBL_OSD_Min + DynamicBL_OSD_Min_FineTune);
  13186. bOSDNormal = tv_GetLCDBackLightValueexceptinvert(DynamicBL_normal + DynamicBL_OSD_Normal_FineTune);
  13187. }
  13188. else
  13189. {
  13190. bMaxBL = tv_GetLCDBackLightValueexceptinvert(DynamicBL_OSD_MAX);
  13191. bMinBL = tv_GetLCDBackLightValueexceptinvert(DynamicBL_OSD_Min);
  13192. bOSDNormal = tv_GetLCDBackLightValueexceptinvert(DynamicBL_normal);
  13193. }
  13194. //bOSDBL = tv_GetLCDBackLightValueexceptinvert(ptv->pBootRomShareData->LcdBacklightValue.OSD_backlight_index);
  13195. #endif
  13196. if( nDBLStatus==VIP_DBL_STATUS_ENTERING )
  13197. {
  13198. if((nWhiteCondition==1 )||( nWhiteCondition==2 )||( nWhiteCondition==3 ))
  13199. {
  13200. #ifdef DYNAMICBL_ADJUST
  13201. dwLightTarget= bMinBL;//pDBL->dwLightMin;
  13202. dwDiff= pDBL->dwLightMax-bMinBL;//pDBL->dwLightMin;
  13203. if( pDBL->ucLevel==WEAK)
  13204. {
  13205. dwLightTarget= bOSDNormal - (dwDiff * 11 / 64);
  13206. //printk("\n\n an weak target = 0x%0x \n\n",dwLightTarget);
  13207. }
  13208. else if( pDBL->ucLevel==MEDIUM )
  13209. {
  13210. dwLightTarget= bOSDNormal - (dwDiff * 22 / 64);
  13211. //printk("\n\n an middle target = 0x%0x \n\n",dwLightTarget);
  13212. }
  13213. else if( pDBL->ucLevel==STRONG)
  13214. {
  13215. dwLightTarget= bOSDNormal - (dwDiff * 32 / 64);;// bMinBL;//bOSDBL - (dwDiff>>1);
  13216. // printk("\n\n an strong target = 0x%0x \n\n",dwLightTarget);
  13217. }
  13218. // printk("\n\n\n whitecondition 111 dwLightTarget = 0x%0x bOSDBL = 0x%0x \n\n\n",dwLightTarget,bOSDBL);
  13219. #else
  13220. dwLightTarget= pDBL->dwLightMin;
  13221. dwDiff= pDBL->dwLightNormal-pDBL->dwLightMin;
  13222. if( pDBL->ucLevel==MEDIUM )
  13223. dwLightTarget= pDBL->dwLightNormal - (dwDiff>>1);
  13224. else if( pDBL->ucLevel==WEAK )
  13225. dwLightTarget= pDBL->dwLightNormal - (dwDiff>>2);
  13226. #endif
  13227. }
  13228. else
  13229. {
  13230. #ifdef DYNAMICBL_ADJUST
  13231. dwLightTarget= pDBL->dwLightMax;
  13232. dwDiff= pDBL->dwLightMax- bMaxBL;
  13233. if( pDBL->ucLevel==WEAK )
  13234. {
  13235. dwLightTarget= bOSDNormal + (dwDiff>>3);
  13236. // printk("\n\n liang weak target = 0x%0x \n\n",dwLightTarget);
  13237. }
  13238. else if( pDBL->ucLevel==MEDIUM )
  13239. {
  13240. // printk("\n\n liang middle target = 0x%0x \n\n",dwLightTarget);
  13241. dwLightTarget= bOSDNormal + (dwDiff>>2);
  13242. }
  13243. else if( pDBL->ucLevel==STRONG)
  13244. {
  13245. // printk("\n\n liang strong target = 0x%0x \n\n",dwLightTarget);
  13246. dwLightTarget= bOSDNormal + (dwDiff>>1);
  13247. }
  13248. // printk("\n\n\n whitecondition 55555 dwLightTarget = 0x%0x bOSDBL = 0x%0x \n\n\n",dwLightTarget,bOSDBL);
  13249. #else
  13250. dwLightTarget= pDBL->dwLightMax;
  13251. dwDiff= pDBL->dwLightMax-pDBL->dwLightNormal;
  13252. if( pDBL->ucLevel==MEDIUM )
  13253. dwLightTarget= pDBL->dwLightNormal + (dwDiff>>1);
  13254. else if( pDBL->ucLevel==WEAK )
  13255. dwLightTarget= pDBL->dwLightNormal + (dwDiff>>2);
  13256. #endif
  13257. }
  13258. }
  13259. else
  13260. {
  13261. #ifdef DYNAMICBL_ADJUST
  13262. // printk("\n\n ******************************************* \n\n");
  13263. dwLightTarget = bOSDNormal;//bMaxBL;//bOSDBL;//bMaxBL;//bOSDBL;//tv_GetLCDBackLightValueexceptinvert(ptv->pBootRomShareData->LcdBacklightValue);
  13264. //printk("\n normal dwLightTarget = 0x%0x\n",dwLightTarget);
  13265. #else
  13266. dwLightTarget = pDBL->dwLightNormal;//bMaxBL;//bOSDBL;//tv_GetLCDBackLightValueexceptinvert(ptv->pBootRomShareData->LcdBacklightValue);
  13267. #endif
  13268. }
  13269. if(dwLightTarget <pDBL->dwLightMin)
  13270. dwLightTarget = pDBL->dwLightMin;
  13271. else if(dwLightTarget > pDBL->dwLightMax)
  13272. dwLightTarget = pDBL->dwLightMax;
  13273. //printk("\n final dwLightTarget = 0x%0x\n",dwLightTarget);
  13274. //dwCur must be pDBL->dwLightNormal here
  13275. if(pDBL->dwLightQuot==0)
  13276. pDBL->dwLightQuot =1;
  13277. if(pDBL->dwLightQuot > 0)
  13278. {
  13279. dwFrameCount= abs(dwLightTarget-dwCur) / pDBL->dwLightQuot;
  13280. }
  13281. if( nDBLStatus==VIP_DBL_STATUS_ENTERING )
  13282. dwFrameCount= 3 * dwFrameCount;
  13283. if( dwFrameCount==0 )
  13284. dwFrameCount= 1;
  13285. pDBL->dwLightTarget= dwLightTarget;
  13286. pDBL->iAdd= 2*((signed)pDBL->dwLightTarget-(signed)dwCur)/(signed)dwFrameCount;
  13287. if(dwFrameCount<3)
  13288. dwFrameCount = 3;
  13289. if(pDBL->iAdd == 0)
  13290. {
  13291. if((dwFrameCount/3) > 0)
  13292. {
  13293. pDBL->iAdd= 2*((signed)pDBL->dwLightTarget-(signed)dwCur)/(signed)(dwFrameCount/3);
  13294. }
  13295. }
  13296. #endif
  13297. //PQDebugPrint("%s: dwLightTarget=0x%lx dwCur=0x%lx iAdd=%x", __FUNCTION__, dwLightTarget, dwCur, pDBL->iAdd);
  13298. return dwLightTarget;
  13299. }
  13300. BOOL PQ_ColorSearchAutoDet(UINT8 ucPath, UINT8 ucColorType ,UINT32 *pulMaxValue, UINT32*pulMinValue)
  13301. {
  13302. BOOL bResault = TRUE;
  13303. static UINT8 ucErrorCnt=ERR_CNT, ucStage = 0;
  13304. static UINT32 MaxValue = 0xffffff, MinValue = 0xffffff;
  13305. if(ucStage == 0)
  13306. {
  13307. PQ_RegisterWrite(VIP_reg_adix_sch_csel, ucColorType); //0-Green/Y, 1-Blue/Pb, 2-Red/Pr
  13308. PQ_RegisterWrite(VIP_reg_adix_sch_en, ENABLE);
  13309. ucErrorCnt=ERR_CNT;
  13310. ucStage =1;
  13311. }else
  13312. {
  13313. ucErrorCnt --;
  13314. if(PQ_RegisterRead(VIP_reg_adix_sch_en)==0)
  13315. {
  13316. MaxValue=PQ_RegisterRead(VIP_sta_xp_color_max);
  13317. MinValue=PQ_RegisterRead(VIP_sta_xp_color_min);
  13318. ucStage =0;
  13319. }
  13320. if(ucErrorCnt == 0)
  13321. {
  13322. ucStage =0;
  13323. bResault = FALSE;
  13324. }
  13325. }
  13326. *pulMaxValue = MaxValue;
  13327. *pulMinValue = MinValue;
  13328. return bResault;
  13329. }
  13330. UINT8 PQ_AllBlackDetect(void)
  13331. {
  13332. UINT32 ulThreshold = (VIP_GetInputDataFormat()==RGB)?10:16;
  13333. UINT32 ulMaxValue, ulMinValue;
  13334. PQ_ColorSearchAutoDet(1, 0 ,&ulMaxValue, &ulMinValue);
  13335. ulMaxValue = ulMaxValue >>2;
  13336. ulMinValue = ulMinValue >>2;
  13337. if(ulMaxValue <= ulThreshold && ulMinValue <= ulThreshold)
  13338. {
  13339. return TRUE;
  13340. }
  13341. else
  13342. {
  13343. return FALSE;
  13344. }
  13345. }
  13346. void PQ_LEDBackLightDetect(BOOL bReset)
  13347. {
  13348. //static UINT8 nPollingIndex= 0;
  13349. static UINT16 wDetectCount= 0, dwLast;
  13350. //static UINT8 nEnteringWhiteCondition= 0;
  13351. static UINT8 nPrevWhiteCondition= 0xff;
  13352. static UINT8 nDBLStatus= VIP_DBL_STATUS_DETECTING, TurnOffBL = 0;
  13353. //BOOL bNeedDown=0;
  13354. UINT8 i,nWhiteCondition;
  13355. UINT32 nGrayLevelCount[16]; // 21 bit at max
  13356. UINT32 dwTotalPixel,dwTotalWhite,dwWhiteLevel;
  13357. UINT32 dwCur,dwTarget=0,dwNext;
  13358. //UINT32 dwGrayLevelAddr= 0xbe1cc6dc;
  13359. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  13360. static UINT8 LastLSChang = 0xff;
  13361. if( bReset )
  13362. {
  13363. //nPollingIndex= 0;
  13364. wDetectCount= 0;
  13365. //nEnteringWhiteCondition= 0;
  13366. nPrevWhiteCondition= 0xff;
  13367. nDBLStatus= VIP_DBL_STATUS_DETECTING;
  13368. LastLSChang = 0xff;
  13369. return;
  13370. }
  13371. if( pDBL->ucLevel==OFF && pDBL->bLSChangeBacklight==0)
  13372. {
  13373. nPrevWhiteCondition = 0xfd;
  13374. LastLSChang = 0xff;
  13375. return;
  13376. }
  13377. for(i=0;i<16;i++)
  13378. nGrayLevelCount[i] = PQ_RegisterRead(VIP_reg_dpy_hist_bin0+i*4);
  13379. dwTotalPixel= 0;
  13380. dwTotalWhite= 0;
  13381. for(i=0; i<16; i++)
  13382. {
  13383. dwTotalWhite+= nGrayLevelCount[i] * (i*16+8);
  13384. dwTotalPixel+= nGrayLevelCount[i];
  13385. }
  13386. if( dwTotalPixel==0 )
  13387. return;
  13388. dwWhiteLevel = dwTotalWhite / dwTotalPixel;
  13389. //White Condition has 5 scopes which is divided by dbl_bound1~4.
  13390. if(PQ_AllBlackDetect())
  13391. nWhiteCondition= 0;
  13392. else if( dwWhiteLevel<=pDBL->nBound1 )
  13393. nWhiteCondition= 1;
  13394. else if( dwWhiteLevel<=pDBL->nBound2 )
  13395. nWhiteCondition= 2;
  13396. else if( dwWhiteLevel<=pDBL->nBound3 )
  13397. nWhiteCondition= 3;
  13398. else
  13399. nWhiteCondition= 5;
  13400. //PQDebugPrint("%s:dwWhiteLevel = %ld, nWhiteCondition = %d",__FUNCTION__, dwWhiteLevel, nWhiteCondition);
  13401. //if(nPrevWhiteCondition!=nWhiteCondition)
  13402. // PQDebugPrint("dwWhiteLevel = %ld, nPrevWhiteCondition = %d, nWhiteCondition = %d", dwWhiteLevel, nPrevWhiteCondition, nWhiteCondition);
  13403. //smooth change in white condition
  13404. if(nPrevWhiteCondition!=nWhiteCondition)
  13405. {
  13406. if( nDBLStatus!=VIP_DBL_STATUS_DETECTING)
  13407. nWhiteCondition = nPrevWhiteCondition;
  13408. else
  13409. {
  13410. if((nPrevWhiteCondition == 0 && pDBL->ucAllBlackStatus)&& nWhiteCondition >=1)
  13411. nWhiteCondition = 1;
  13412. else if(nPrevWhiteCondition == 1&& nWhiteCondition >=3)
  13413. nWhiteCondition = 3;
  13414. if(nPrevWhiteCondition == 5 && nWhiteCondition <=3)
  13415. nWhiteCondition = 3;
  13416. else if(nPrevWhiteCondition == 3 && nWhiteCondition <=1)
  13417. nWhiteCondition = 1;
  13418. }
  13419. }
  13420. //notice kmf if enter/leave all black status
  13421. dwCur=PQ_GetBackLight();
  13422. if(dwCur == pDBL->dwTableMin && dwLast != pDBL->dwTableMin)
  13423. {
  13424. pDBL->ucAllBlackStatus = 1;
  13425. GPIOSetValueByPinFunc(GPIO_PIN_LEDBL_DETECT, GPIO_FUNC_OFFLEVEL);
  13426. PQDebugPrint("noticekmf:enter all black status");
  13427. //noticekmf(NOTICEMSG_BL_ON_OFF, &pDBL->ucAllBlackStatus); weichih mark due to KMF doesn't handle this message
  13428. }
  13429. else
  13430. {
  13431. if(nPrevWhiteCondition == 0 && nWhiteCondition!=0 && TurnOffBL ==1)
  13432. {
  13433. pDBL->ucAllBlackStatus = 0;
  13434. TurnOffBL = 0;
  13435. GPIOSetValueByPinFunc(GPIO_PIN_LEDBL_DETECT, GPIO_FUNC_ONLEVEL);
  13436. PQDebugPrint("noticekmf:leave all black status");
  13437. //noticekmf(NOTICEMSG_BL_ON_OFF, &pDBL->ucAllBlackStatus); weichih mark due to KMF doesn't handle this message
  13438. }
  13439. }
  13440. if(nPrevWhiteCondition != nWhiteCondition)
  13441. {
  13442. PQDebugPrint("%s:change to WhiteCondition = %d\n",__FUNCTION__, nWhiteCondition);
  13443. }
  13444. //cancel dynamic backlight when light sensor change
  13445. if(LastLSChang==0 && pDBL->bLSChangeBacklight==1)
  13446. {
  13447. nDBLStatus=VIP_DBL_STATUS_DETECTING;
  13448. pDBL->iAdd = 0;
  13449. }
  13450. //do dynamic backlight again
  13451. if(LastLSChang==1 && pDBL->bLSChangeBacklight==0)
  13452. nPrevWhiteCondition = nWhiteCondition+1;
  13453. switch(nWhiteCondition)
  13454. {
  13455. case 0:
  13456. if(nPrevWhiteCondition!=nWhiteCondition)
  13457. wDetectCount = 0;
  13458. else
  13459. {
  13460. if(wDetectCount == 6000)
  13461. {
  13462. pDBL->dwLightTarget = pDBL->dwTableMin;
  13463. dwCur=PQ_GetBackLight();
  13464. pDBL->iAdd = (INT32)(pDBL->dwLightTarget - dwCur)/(300);
  13465. PQDebugPrint("&&&&&in 60s(set min backlight), pDBL->dwLightTarget = %ld, pDBL->iAdd = %d, dwCur = %ld", pDBL->dwLightTarget, pDBL->iAdd, dwCur);
  13466. nDBLStatus=VIP_DBL_STATUS_ENTERING;
  13467. TurnOffBL = 1;
  13468. }
  13469. }
  13470. if(pDBL->ucAllBlackStatus && PQ_GetBackLight()!=pDBL->dwTableMin)
  13471. {
  13472. PQDebugPrint("redetect black status");
  13473. pDBL->ucAllBlackStatus = 0;
  13474. wDetectCount = 0;
  13475. }
  13476. if(wDetectCount < 50000)
  13477. wDetectCount++;
  13478. break;
  13479. case 1:
  13480. if(nPrevWhiteCondition!=nWhiteCondition)
  13481. {
  13482. //static UINT8 ucIncreaseStep = 0;
  13483. wDetectCount = 0;
  13484. if(nPrevWhiteCondition==0)
  13485. {
  13486. pDBL->dwLightTarget = pDBL->dwLightMid;
  13487. dwCur=PQ_GetBackLight();
  13488. //if(pDBL->dwLightTarget < dwCur)
  13489. {
  13490. pDBL->iAdd = (INT32)(pDBL->dwLightTarget - dwCur)/(300);
  13491. PQDebugPrint("&&&&&(increase)in 5s(50 percent backlight) pDBL->dwLightTarget = %ld, pDBL->iAdd = %d, dwCur = %ld", pDBL->dwLightTarget, pDBL->iAdd, dwCur);
  13492. nDBLStatus=VIP_DBL_STATUS_ENTERING;
  13493. //ucIncreaseStep = 1;
  13494. }
  13495. }
  13496. }
  13497. else
  13498. {
  13499. if( wDetectCount == 500)
  13500. {
  13501. pDBL->dwLightTarget = pDBL->dwLightMid;
  13502. dwCur=PQ_GetBackLight();
  13503. //if(pDBL->dwLightTarget < dwCur)
  13504. {
  13505. pDBL->iAdd = (INT32)(pDBL->dwLightTarget - dwCur)/(300);
  13506. PQDebugPrint("&&&&&(decrease)in 5s(50 percent backlight) pDBL->dwLightTarget = %ld, pDBL->iAdd = %d, dwCur = %ld", pDBL->dwLightTarget, pDBL->iAdd, dwCur);
  13507. nDBLStatus=VIP_DBL_STATUS_ENTERING;
  13508. }
  13509. }
  13510. /*
  13511. else if(wDetectCount == 6800)
  13512. {
  13513. pDBL->dwLightTarget = pDBL->dwLightMin;
  13514. dwCur=PQ_GetBackLight();
  13515. pDBL->iAdd = (INT32)(pDBL->dwLightTarget - dwCur)/300;
  13516. PQDebugPrint("&&&&&in 60s(set min backlight), pDBL->dwLightTarget = %ld, pDBL->iAdd = %d, dwCur = %ld", pDBL->dwLightTarget, pDBL->iAdd, dwCur);
  13517. nDBLStatus=VIP_DBL_STATUS_ENTERING;
  13518. }
  13519. */
  13520. }
  13521. if(wDetectCount < 50000)
  13522. wDetectCount++;
  13523. break;
  13524. case 2:/*
  13525. if(nPrevWhiteCondition!=nWhiteCondition)
  13526. {
  13527. wDetectCount = 0;
  13528. dwCur=PQ_GetBackLight();
  13529. if(dwCur <= pDBL->dwLightMid)
  13530. {
  13531. pDBL->dwLightTarget = pDBL->dwLightMid;
  13532. dwCur=PQ_GetBackLight();
  13533. pDBL->iAdd = (INT32)(pDBL->dwLightTarget - dwCur)/(200/4);
  13534. PQDebugPrint("&&&&&set to 50 percent backlight");//, pDBL->dwLightTarget = %ld, pDBL->iAdd = %d, dwCur = %ld", pDBL->dwLightTarget, pDBL->iAdd, dwCur);
  13535. nDBLStatus=VIP_DBL_STATUS_ENTERING;
  13536. }
  13537. else
  13538. {
  13539. nDBLStatus=VIP_DBL_STATUS_KEEPING;
  13540. PQDebugPrint("&&&&&keep current backlight");
  13541. }
  13542. }
  13543. break;*/
  13544. case 3:
  13545. if(nPrevWhiteCondition!=nWhiteCondition)
  13546. {
  13547. wDetectCount = 0;
  13548. pDBL->dwLightTarget = pDBL->dwLightNormal;
  13549. dwCur=PQ_GetBackLight();
  13550. pDBL->iAdd = (INT32)(pDBL->dwLightTarget - dwCur)/(200);
  13551. nDBLStatus=VIP_DBL_STATUS_LEAVING ;
  13552. PQDebugPrint("&&&&&return to default backlight: %ld -> %ld", dwCur, pDBL->dwLightTarget);
  13553. }
  13554. break;
  13555. case 5:
  13556. if(nPrevWhiteCondition!=nWhiteCondition)
  13557. wDetectCount = 0;
  13558. else
  13559. {
  13560. if(wDetectCount == (300))
  13561. {
  13562. pDBL->dwLightTarget = pDBL->dwLightMax;
  13563. dwCur=PQ_GetBackLight();
  13564. pDBL->iAdd = (INT32)(pDBL->dwLightTarget - dwCur)/(200);
  13565. nDBLStatus=VIP_DBL_STATUS_ENTERING;
  13566. PQDebugPrint("&&&&&in 3(set max backlight), pDBL->dwLightTarget = %ld, pDBL->iAdd = %d, dwCur = %ld", pDBL->dwLightTarget, pDBL->iAdd, dwCur);
  13567. }
  13568. }
  13569. if(wDetectCount < 50000)
  13570. wDetectCount++;
  13571. break;
  13572. }
  13573. if( (nDBLStatus==VIP_DBL_STATUS_ENTERING || nDBLStatus==VIP_DBL_STATUS_LEAVING))
  13574. {
  13575. if(pDBL->iAdd==0)
  13576. nDBLStatus = VIP_DBL_STATUS_DETECTING;
  13577. dwCur=PQ_GetBackLight();
  13578. dwTarget= pDBL->dwLightTarget;
  13579. dwNext= dwCur+pDBL->iAdd;
  13580. if( (signed)((signed)dwCur+pDBL->iAdd)<0)
  13581. dwNext= 0;
  13582. if( abs(dwCur - dwTarget) <= abs(dwCur - dwNext))
  13583. {
  13584. dwNext= dwTarget;
  13585. }
  13586. //PQDebugPrint("%s: dwCur=0x%lx dwNext=0x%lx, dwTarget=0x%lx", __FUNCTION__, dwCur, dwNext, dwTarget);
  13587. if( dwNext!=dwCur )
  13588. {
  13589. PQ_SetBackLight(dwNext);
  13590. }
  13591. else
  13592. nDBLStatus = VIP_DBL_STATUS_DETECTING;
  13593. }
  13594. nPrevWhiteCondition= nWhiteCondition;
  13595. LastLSChang = pDBL->bLSChangeBacklight;
  13596. dwLast = dwCur;
  13597. }
  13598. BOOL bATVstatus = FALSE;
  13599. void PQ_SetATVStatus(BOOL bstatus)
  13600. {
  13601. bATVstatus = bstatus;
  13602. return;
  13603. }
  13604. //Frame rate is 60Hz(60 frame/sec) if handle on vsync, or 50 frame/sec if handle on 20ms timer.
  13605. //DBL is detected every 16 frames, this period is about 1/4 sec.
  13606. void PQ_FormalBackLightDetect(BOOL bReset)
  13607. {
  13608. static UINT8 nPollingIndex= 0;
  13609. static UINT16 wDetectFrameCount= 0;
  13610. static UINT8 nEnteringWhiteCondition= 0;
  13611. static UINT8 nPrevWhiteCondition= 0;
  13612. static UINT8 nDBLStatus= VIP_DBL_STATUS_DETECTING;
  13613. static UINT8 nCounter = 0,nCounter1 = 0;
  13614. BOOL bNeedDown=0;
  13615. UINT8 i,nWhiteCondition;
  13616. UINT32 nGrayLevelCount[16]; // 21 bit at max
  13617. UINT32 dwTotalPixel,dwTotalWeight,dwWhiteLevel;
  13618. UINT32 dwCur,dwTarget=0,dwNext;
  13619. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  13620. ptv_base_t ptv = getptvdev();
  13621. UINT32 mmiovalue;
  13622. UINT8 bNosignal;
  13623. UINT8 bUserSource,ucSubSource;
  13624. #ifdef DYNAMICBL_ADJUST
  13625. // UINT32 bMaxBL,bMinBL;
  13626. #endif
  13627. UINT32 maxBLValue = 0, minBLValue = 0;
  13628. #ifndef CONFIG_PANEL_ADJ_INVERT
  13629. PBRVIP_FLASH brvip_flash_p = (PBRVIP_FLASH)SPI_PANELSET_SHADOWADDR;
  13630. #endif
  13631. if( bReset )
  13632. {
  13633. nPollingIndex= 0;
  13634. wDetectFrameCount= 0;
  13635. nEnteringWhiteCondition= 0;
  13636. nPrevWhiteCondition= 0;
  13637. nDBLStatus= VIP_DBL_STATUS_DETECTING;
  13638. return;
  13639. }
  13640. if( pDBL->ucLevel==OFF )
  13641. {
  13642. return;
  13643. }
  13644. nPollingIndex++;
  13645. if( (nDBLStatus==VIP_DBL_STATUS_ENTERING) || (nDBLStatus==VIP_DBL_STATUS_LEAVING) )
  13646. {
  13647. if( nPollingIndex<3 ) //=25/8
  13648. return;
  13649. }
  13650. else
  13651. {
  13652. if( nPollingIndex<25 ) //16ms x 16 Frame / 10ms = 25.6
  13653. {
  13654. return;
  13655. }
  13656. }
  13657. nPollingIndex= 0;
  13658. dwTotalPixel= 0;
  13659. dwTotalWeight= 0;
  13660. for(i=0; i<16; i++)
  13661. {
  13662. nGrayLevelCount[i] = PQ_RegisterRead(VIP_reg_dpy_hist_bin0+i*4);
  13663. dwTotalPixel+= nGrayLevelCount[i];
  13664. dwTotalWeight+= nGrayLevelCount[i]*i+(nGrayLevelCount[i]>>1); //count*i.5
  13665. }
  13666. VIP_GetSource(&bUserSource, &ucSubSource);
  13667. if(((bUserSource == SOURCE_CVD2) && (VIP_IsATVSource())&& (!bATVstatus)) || (((bUserSource != SOURCE_CVD2) || ((bUserSource == SOURCE_CVD2) &&(!VIP_IsATVSource())))&& (gfTVFEMuteFlg.fTVFEMuteFlag)))
  13668. {
  13669. bNosignal = 1;
  13670. }
  13671. else
  13672. {
  13673. bNosignal = 0;
  13674. }
  13675. if((PQ_specialpatterndetect() == TRUE)|| (bNosignal == 1))
  13676. {
  13677. //printk("\n\n\n\n\n enter special pattern \n\n\n\n\n\n");
  13678. //if((nCounter <= 251) || (nCounter1 <=251))
  13679. {
  13680. if((PQ_specialpatterndetect() == TRUE) && (bNosignal == 0))
  13681. {
  13682. // printk("\n\n 111111 \n\n");
  13683. maxBLValue = (LCDBackLightMap[0] > LCDBackLightMap[14]) ? LCDBackLightMap[0] : LCDBackLightMap[14];
  13684. minBLValue = (LCDBackLightMap[0] > LCDBackLightMap[14]) ? LCDBackLightMap[14] : LCDBackLightMap[0];
  13685. #ifdef CONFIG_PANEL_ADJ_INVERT
  13686. {
  13687. maxBLValue = minBLValue;
  13688. }
  13689. #else
  13690. if(brvip_flash_p->LCDBackLight_Order)
  13691. {
  13692. maxBLValue = minBLValue;
  13693. }
  13694. #endif
  13695. if( nCounter1 == 5)
  13696. {
  13697. maxBLValue = maxBLValue | 0x80000000;
  13698. PQ_ChangeBackLight(maxBLValue, 0);
  13699. }
  13700. nCounter1 ++;
  13701. if(nCounter != 0)
  13702. nCounter = 0;
  13703. if(nCounter1 > 250)
  13704. nCounter1 = 250;
  13705. }
  13706. else if(bNosignal == 1)
  13707. {
  13708. // printk("\n\n 222222222 \n\n");
  13709. //printk("\n\n\n\n\n enter here 22 \n\n\n\n\n\n");
  13710. if( nCounter== 8)
  13711. {
  13712. mmiovalue = tv_GetLCDBackLightValue(ptv->pBootRomShareData->LcdBacklightValue);
  13713. PQ_ChangeBackLight(mmiovalue, 0);
  13714. }
  13715. nCounter ++;
  13716. if(nCounter1 != 0)
  13717. nCounter1 = 0;
  13718. if(nCounter > 250)
  13719. nCounter = 250;
  13720. }
  13721. }
  13722. return;
  13723. }
  13724. else
  13725. {
  13726. //printk("\n\n\n\n\n enter here test nCounter = %d \n\n\n\n\n\n",nCounter);
  13727. if((nCounter != 0) ||(nCounter1 != 0))
  13728. {
  13729. nCounter = 0;
  13730. nCounter1 = 0;
  13731. nPollingIndex= 0;
  13732. wDetectFrameCount= 0;
  13733. nEnteringWhiteCondition= 0;
  13734. nPrevWhiteCondition= 0;
  13735. nDBLStatus= VIP_DBL_STATUS_DETECTING;
  13736. return;
  13737. }
  13738. }
  13739. dwCur=PQ_GetBackLight();
  13740. //Rule1: Calc rate of white pixel
  13741. //dwWhiteLevel= (dwTotalWhite<<8)/dwTotalPixel; // n x 256 to expand to VIP_DBL_LEVEL_DEGREE
  13742. //Rule2: Calc weighted average
  13743. dwWhiteLevel= (dwTotalWeight<<4)/dwTotalPixel; // n x 16 to expand to VIP_DBL_LEVEL_DEGREE
  13744. #if 1
  13745. if( pDBL->dwWhiteLevel!=VIP_DBL_INVALID_WHITE_LEVEL )
  13746. {
  13747. if( pDBL->dwWhiteLevel<128 )
  13748. {
  13749. if( dwWhiteLevel<pDBL->dwWhiteLevel )
  13750. dwWhiteLevel= (3*pDBL->dwWhiteLevel + dwWhiteLevel)>>2; //0.75*pDBL->dwWhiteLevel + 0.25*dwWhiteLevel;
  13751. else
  13752. dwWhiteLevel= (pDBL->dwWhiteLevel + 3*dwWhiteLevel)>>2; //0.25*pDBL->dwWhiteLevel + 0.75*dwWhiteLevel
  13753. }
  13754. else
  13755. {
  13756. if( dwWhiteLevel<pDBL->dwWhiteLevel )
  13757. dwWhiteLevel= (pDBL->dwWhiteLevel + 3*dwWhiteLevel)>>2;
  13758. else
  13759. dwWhiteLevel= (3*pDBL->dwWhiteLevel + dwWhiteLevel)>>2;
  13760. }
  13761. }
  13762. pDBL->dwWhiteLevel= dwWhiteLevel;
  13763. #endif
  13764. //White Condition has 5 scopes which is divided by dbl_bound1~4.
  13765. if( dwWhiteLevel<=pDBL->nBound1 )
  13766. {
  13767. nWhiteCondition= 1;
  13768. #ifdef DYNAMICBL_ADJUST
  13769. if( dwWhiteLevel > pDBL->nBound0 )
  13770. {
  13771. pDBL->ucLevel=WEAK;
  13772. nWhiteCondition= 3;
  13773. }
  13774. else if( dwWhiteLevel > pDBL->nBound0_more)
  13775. {
  13776. nWhiteCondition= 2;
  13777. pDBL->ucLevel=MEDIUM;
  13778. }
  13779. else
  13780. {
  13781. nWhiteCondition= 1;
  13782. pDBL->ucLevel=STRONG;
  13783. }
  13784. #endif
  13785. // printk("\n\ndwWhiteLevel = %d pDBL->ucLevel = %d\n\n",dwWhiteLevel,pDBL->ucLevel);
  13786. }
  13787. else if( dwWhiteLevel<=pDBL->nBound2 )
  13788. {
  13789. nWhiteCondition= 2;
  13790. #ifdef DYNAMICBL_ADJUST
  13791. nWhiteCondition= 4;
  13792. pDBL->ucLevel=MEDIUM;
  13793. #endif
  13794. }
  13795. #ifdef VIP_DBL_WHITE_PATTERN_BRIGHTING
  13796. else if( dwWhiteLevel<=pDBL->nBound3 )
  13797. {
  13798. nWhiteCondition= 3;
  13799. #ifdef DYNAMICBL_ADJUST
  13800. nWhiteCondition= 5;
  13801. pDBL->ucLevel=MEDIUM;
  13802. #endif
  13803. }
  13804. else if( dwWhiteLevel<=pDBL->nBound4 )
  13805. {
  13806. nWhiteCondition= 4;
  13807. #ifdef DYNAMICBL_ADJUST
  13808. nWhiteCondition= 6;
  13809. pDBL->ucLevel=MEDIUM;
  13810. #endif
  13811. }
  13812. else
  13813. {
  13814. nWhiteCondition= 5;
  13815. #ifdef DYNAMICBL_ADJUST
  13816. if(dwWhiteLevel <= pDBL->nBound5)
  13817. {
  13818. nWhiteCondition= 7;
  13819. pDBL->ucLevel=MEDIUM;
  13820. }
  13821. else
  13822. {
  13823. nWhiteCondition= 8;
  13824. pDBL->ucLevel=STRONG;
  13825. }
  13826. #endif
  13827. }
  13828. #else
  13829. else
  13830. {
  13831. nWhiteCondition= 3;
  13832. #ifdef DYNAMICBL_ADJUST
  13833. pDBL->ucLevel=MEDIUM;
  13834. #endif
  13835. }
  13836. #endif
  13837. //printk("\n\n dwWhiteLevel = %d nWhiteCondition = %d nDBLStatus = %d\n\n",dwWhiteLevel,nWhiteCondition,nDBLStatus);
  13838. switch(nDBLStatus)
  13839. {
  13840. case VIP_DBL_STATUS_DETECTING:
  13841. case VIP_DBL_STATUS_DETECTING_WHITE_ENTERING:
  13842. if( nPrevWhiteCondition!=nWhiteCondition )
  13843. {
  13844. wDetectFrameCount= 0;
  13845. if( nDBLStatus==VIP_DBL_STATUS_DETECTING_WHITE_ENTERING )
  13846. {
  13847. if( (nPrevWhiteCondition<5 && nWhiteCondition>=5) || (nPrevWhiteCondition>5 && nWhiteCondition<=5) )
  13848. {
  13849. nDBLStatus= VIP_DBL_STATUS_LEAVING;
  13850. }
  13851. }
  13852. }
  13853. else if( nWhiteCondition==1 || nWhiteCondition==2 || nWhiteCondition==3|| nWhiteCondition==7 || nWhiteCondition==8)
  13854. {
  13855. wDetectFrameCount+= VIP_DBL_FRAME_INTERVAL;
  13856. if( wDetectFrameCount>=pDBL->wDetectFrameCount ) //50 frams x 3 sec if 144
  13857. {
  13858. dwTarget= PQ_BackLightTarget(VIP_DBL_STATUS_ENTERING, nWhiteCondition, dwCur);//nWhiteCondition==1 ? pDBL->dwLightMin : pDBL->dwLightMax;
  13859. //#ifdef CONFIG_PANEL_ADJ_INVERT
  13860. // if( ((nWhiteCondition==1 || nWhiteCondition==0 ) && dwCur<dwTarget) || (nWhiteCondition==5 && dwCur>dwTarget) )
  13861. //#else
  13862. if(( ((nWhiteCondition==1 || nWhiteCondition==2 || nWhiteCondition==3) && dwCur>dwTarget)) || ((nWhiteCondition==7 || nWhiteCondition==8 )&& dwCur<dwTarget) )
  13863. //#endif
  13864. {
  13865. nDBLStatus= VIP_DBL_STATUS_ENTERING;
  13866. nEnteringWhiteCondition= nWhiteCondition;
  13867. }
  13868. else
  13869. {
  13870. wDetectFrameCount= 0;
  13871. }
  13872. }
  13873. }
  13874. if( nDBLStatus==VIP_DBL_STATUS_LEAVING )
  13875. {
  13876. PQ_BackLightTarget(nDBLStatus, nWhiteCondition, dwCur);
  13877. PQDebugPrint("%s: Leaving while detection and entering , dwTarget=normal", __FUNCTION__);
  13878. }
  13879. if( nDBLStatus==VIP_DBL_STATUS_ENTERING )
  13880. {
  13881. //PQ_BackLightTarget(nDBLStatus, nWhiteCondition, dwCur);
  13882. PQDebugPrint("%s: Entering %s , dwTarget=0x%lx", __FUNCTION__, nWhiteCondition==1?"Black":"White", dwTarget);
  13883. }
  13884. break;
  13885. case VIP_DBL_STATUS_KEEPING: //nPrevWhiteCondition must be 1, 5, 2 or 4
  13886. case VIP_DBL_STATUS_ENTERING: //nPrevWhiteCondition must be 1 or 5
  13887. if( nPrevWhiteCondition!=nWhiteCondition )
  13888. {
  13889. if(( nPrevWhiteCondition==1 ) || ( nPrevWhiteCondition==2 ) || nPrevWhiteCondition==3)
  13890. nDBLStatus= nWhiteCondition>=4 ?VIP_DBL_STATUS_LEAVING:VIP_DBL_STATUS_DETECTING_WHITE_ENTERING;
  13891. else if( nPrevWhiteCondition==7 || nPrevWhiteCondition==8 )
  13892. nDBLStatus= nWhiteCondition<=6?VIP_DBL_STATUS_LEAVING:VIP_DBL_STATUS_DETECTING_WHITE_ENTERING;
  13893. wDetectFrameCount= 0;
  13894. if( nDBLStatus==VIP_DBL_STATUS_LEAVING )
  13895. {
  13896. PQ_BackLightTarget(nDBLStatus, nWhiteCondition, dwCur);
  13897. PQDebugPrint("%s: Leaving while entering , dwTarget=normal", __FUNCTION__);
  13898. }
  13899. }
  13900. break;
  13901. #if 0
  13902. case VIP_DBL_STATUS_KEEPING: //nPrevWhiteCondition must be 1, 5, 2 or 4
  13903. printk("\n\n\n\n KEEPING \n\n\n\n");
  13904. if( nPrevWhiteCondition!=nWhiteCondition )
  13905. {
  13906. if( nPrevWhiteCondition<5 )
  13907. {
  13908. if( nWhiteCondition>=5)
  13909. nDBLStatus= VIP_DBL_STATUS_LEAVING;
  13910. }
  13911. else if( nPrevWhiteCondition>5 )
  13912. {
  13913. if( nWhiteCondition<=5 )
  13914. nDBLStatus= VIP_DBL_STATUS_LEAVING;
  13915. }
  13916. wDetectFrameCount= 0;
  13917. if( nDBLStatus==VIP_DBL_STATUS_LEAVING )
  13918. {
  13919. PQ_BackLightTarget(nDBLStatus, nWhiteCondition, dwCur);
  13920. PQDebugPrint("%s: Leaving while keeping , dwTarget=normal", __FUNCTION__);
  13921. }
  13922. }
  13923. break;
  13924. #endif
  13925. case VIP_DBL_STATUS_LEAVING:
  13926. break;
  13927. }
  13928. if( nDBLStatus==VIP_DBL_STATUS_ENTERING )
  13929. {
  13930. bNeedDown= (nEnteringWhiteCondition==1 || nEnteringWhiteCondition==3 || nEnteringWhiteCondition==2 )? TRUE : FALSE;
  13931. }
  13932. else if( nDBLStatus==VIP_DBL_STATUS_LEAVING )
  13933. {
  13934. bNeedDown= (nEnteringWhiteCondition==1 || nEnteringWhiteCondition==3 || nEnteringWhiteCondition==2 )? FALSE : TRUE;
  13935. }
  13936. if( nDBLStatus==VIP_DBL_STATUS_ENTERING || nDBLStatus==VIP_DBL_STATUS_LEAVING )
  13937. {
  13938. dwTarget= pDBL->dwLightTarget;
  13939. dwNext= dwCur+pDBL->iAdd;
  13940. if( (signed)((signed)dwCur+pDBL->iAdd)<0 )
  13941. dwNext= 0;
  13942. //PQDebugPrint("%s: bNeedDown=%d dwCur=0x%lx dwNext=0x%lx", __FUNCTION__, bNeedDown, dwCur, dwNext);
  13943. if( (bNeedDown && dwNext<=dwTarget) || ( !bNeedDown && dwNext>=dwTarget ) )
  13944. {
  13945. dwNext= dwTarget;
  13946. nDBLStatus= (nDBLStatus==VIP_DBL_STATUS_ENTERING)?VIP_DBL_STATUS_KEEPING:VIP_DBL_STATUS_DETECTING;
  13947. // PQDebugPrint("%s: dwNext=0x%lx Reach end", __FUNCTION__, dwNext);
  13948. }
  13949. if( dwNext!=dwCur )
  13950. {
  13951. PQ_SetBackLight(dwNext);
  13952. }
  13953. }
  13954. nPrevWhiteCondition= nWhiteCondition;
  13955. }
  13956. UINT32 PQ_EEBackLightTarget(UINT8 nDBLStatus, UINT32 dwWhiteLevel, UINT32 dwCur)
  13957. {
  13958. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  13959. //UINT32 dwLightTarget;
  13960. INT32 nStep,nSlowStep,nQuickStep;
  13961. //UINT32 ActiveMinBackLight = pDBL->dwTableMin;
  13962. //UINT32 dwBacklight40Percent;
  13963. nSlowStep= 1;//5;
  13964. nQuickStep= 3;//12;
  13965. if( nDBLStatus==VIP_DBL_STATUS_ENTERING )
  13966. {
  13967. nStep= nQuickStep; //white color want to increase the steps
  13968. }
  13969. else if( nDBLStatus==VIP_DBL_STATUS_KEEPING )
  13970. {
  13971. //dwLightTarget = PQ_GetHomeModeValue(&dwLightTarget);
  13972. nStep= nSlowStep;
  13973. }
  13974. else if( nDBLStatus==VIP_DBL_STATUS_LEAVING )
  13975. {
  13976. //dwLightTarget = PQ_GetHomeModeValue(&dwLightTarget);
  13977. nStep= nQuickStep;
  13978. }
  13979. else
  13980. {
  13981. nStep= nQuickStep;
  13982. }
  13983. //pDBL->dwLightTarget= dwLightTarget;
  13984. //PQDebugPrint("%s:dwLightTarget=%#lx(%ld) OSD max=%#lx(%ld) pDBL->dwTableNormal=%#lx(%ld)",__FUNCTION__, dwLightTarget, dwLightTarget, pDBL->dwTableNormal, pDBL->dwTableNormal, pDBL->dwTableNormal, pDBL->dwTableNormal);
  13985. if((pDBL->dwLightQuot+1)/2 == 0)
  13986. pDBL->iAdd= nStep;
  13987. else
  13988. pDBL->iAdd= ((pDBL->dwLightQuot+1)/2)*nStep;
  13989. if( pDBL->dwLightTarget<dwCur )
  13990. pDBL->iAdd= -(pDBL->iAdd);
  13991. return pDBL->dwLightTarget;
  13992. }
  13993. void PQ_EEBackLightDetect(BOOL bReset)
  13994. {
  13995. PQHW_CONTEXT * pHwContext= &PQHwContext;
  13996. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  13997. //VIP_SOURCE_INFO* pSourceInfo = VIP_GetSourceInfo();
  13998. static UINT8 nPollingIndex= 0;
  13999. //static UINT16 dwLast;
  14000. //static UINT8 nEnteringWhiteCondition= 0;
  14001. static UINT8 nPrevWhiteCondition= 0xff;
  14002. static UINT8 nDBLStatus= VIP_DBL_STATUS_DETECTING;
  14003. static UINT8 nHistGrayLevel= 0;
  14004. //BOOL bNeedDown=0;
  14005. UINT8 nWhiteCondition;
  14006. UINT32 nGrayLevelCount[16]; // 21 bit at max
  14007. UINT32 dwTotalPixel,dwWhiteLevel, dwPixelCount;
  14008. UINT32 dwCur,dwTarget=0,dwNext;//, dwHistPWM, dwHistPWMMin;
  14009. INT32 nContrast;
  14010. UINT32 nPercentage1 = 1000;
  14011. UINT32 nPercentage2;
  14012. INT32 i;
  14013. //UINT32 dwGrayLevelAddr= 0xbe1cc6dc;
  14014. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  14015. if( bReset )
  14016. {
  14017. nPollingIndex= 0;
  14018. //nEnteringWhiteCondition= 0;
  14019. nPrevWhiteCondition= 0;
  14020. nDBLStatus= VIP_DBL_STATUS_DETECTING;
  14021. return;
  14022. }
  14023. if( pDBL->ucLevel==OFF )
  14024. {
  14025. nPrevWhiteCondition = 0xfd;
  14026. return;
  14027. }
  14028. if(pHwContext->bPWMOff) // if Set baclight off, notset PWM anymore
  14029. {
  14030. return;
  14031. }
  14032. nPollingIndex++;
  14033. if( (nDBLStatus==VIP_DBL_STATUS_ENTERING) || (nDBLStatus==VIP_DBL_STATUS_LEAVING) || (nDBLStatus==VIP_DBL_STATUS_KEEPING) )
  14034. {
  14035. if( nPollingIndex<3 ) //=25/8
  14036. return;
  14037. }
  14038. else
  14039. {
  14040. if( nPollingIndex<3 ) //16ms x 16 Frame / 10ms = 25.6
  14041. {
  14042. return;
  14043. }
  14044. }
  14045. nPollingIndex= 0;
  14046. dwTotalPixel= 0;
  14047. for(i=0; i<16; i++)
  14048. {
  14049. nGrayLevelCount[i] = PQ_RegisterRead(VIP_reg_dpy_hist_bin0+i*4);
  14050. dwTotalPixel+= nGrayLevelCount[i];
  14051. }
  14052. if( dwTotalPixel==0 )
  14053. return;
  14054. dwWhiteLevel = PQ_RegisterRead(VIP_reg_dpy_y_sum)*256 / dwTotalPixel; //y_sum = (reg(c8c8))*256 //y_sum = real_y_sum/2, dwTotalPixel = real_total/2
  14055. //if(pSourceInfo->ucUserSource == CVD2)
  14056. //dwWhiteLevel +=16;
  14057. //PQDebugPrint("%s:dwWhiteLevel = %ld\n",__FUNCTION__, dwWhiteLevel);
  14058. dwCur=PQ_GetRealBackLight();
  14059. //White Condition has 3 scopes.
  14060. if( dwWhiteLevel<=60)//pDBL->nBound1 )
  14061. nWhiteCondition= 1;
  14062. else if(dwWhiteLevel<=104)//pDBL->nBound3)
  14063. nWhiteCondition= 2;
  14064. else
  14065. nWhiteCondition= 3;
  14066. if(nPrevWhiteCondition != nWhiteCondition)
  14067. {
  14068. PQDebugPrint("%s:change to WhiteCondition = %d\n",__FUNCTION__, nWhiteCondition);
  14069. }
  14070. switch(nWhiteCondition)
  14071. {
  14072. case 1:
  14073. if(nPrevWhiteCondition!=nWhiteCondition)
  14074. {
  14075. //==============================================histogram 1% counting and algorithm2
  14076. dwPixelCount = 0;
  14077. for(i=15; i>=0; i--)
  14078. {
  14079. //PQDebugPrint("%s:nGrayLevelCount[%d] = %ld",__FUNCTION__, i, nGrayLevelCount[i]);
  14080. dwPixelCount += nGrayLevelCount[i];
  14081. if(dwPixelCount > (dwTotalPixel + 50)/100)//find 1% hist position from nGrayLevelCount[15] to nGrayLevelCount[0]
  14082. break;
  14083. }
  14084. PQDebugPrint("%s:%%1 gray level position[0~15] : i=%d dwPixelCount=%ld dwTotalPixel=%ld",__FUNCTION__, i, dwPixelCount, dwTotalPixel);
  14085. if(abs((INT32)nHistGrayLevel - (INT32)i)>1)
  14086. nHistGrayLevel = i;
  14087. nPercentage1 = 1000;
  14088. nPercentage2 = pDBL->ucHistMinPercentage * 10 + (nHistGrayLevel * (100 - pDBL->ucHistMinPercentage) * 10 + 8)/15;
  14089. if(pHwContext->ucDynamicBacklightMode == 1)
  14090. {
  14091. if(pDBL->ucOrder)
  14092. pDBL->dwLightTarget = pDBL->dwLightMax - (pDBL->dwLightMax - pDBL->dwTableNormal) * nPercentage1 / 1000;
  14093. else
  14094. pDBL->dwLightTarget = pDBL->dwTableMin + (pDBL->dwTableNormal - pDBL->dwTableMin) * nPercentage1 / 1000;
  14095. }
  14096. else if(pHwContext->ucDynamicBacklightMode == 2)
  14097. {
  14098. if(pDBL->ucOrder)
  14099. pDBL->dwLightTarget = pDBL->dwLightMax - (pDBL->dwLightMax - pDBL->dwTableNormal) * nPercentage2 / 1000;
  14100. else
  14101. pDBL->dwLightTarget = pDBL->dwTableMin + (pDBL->dwTableNormal - pDBL->dwTableMin) * nPercentage2 / 1000;
  14102. }
  14103. else
  14104. {
  14105. if(pDBL->ucOrder)
  14106. pDBL->dwLightTarget = pDBL->dwLightMax - (pDBL->dwLightMax - pDBL->dwTableNormal) * (nPercentage1 * nPercentage2/1000) / 1000;
  14107. else
  14108. pDBL->dwLightTarget = pDBL->dwTableMin + (pDBL->dwTableNormal - pDBL->dwTableMin) * (nPercentage1 * nPercentage2/1000) / 1000;
  14109. }
  14110. PQDebugPrint("%s:pDBL->dwLightMax=%ld pDBL->dwTableNormal=%ld",__FUNCTION__, pDBL->dwLightMax, pDBL->dwTableNormal);
  14111. PQDebugPrint("%s:ucDynamicBacklightMode=%d nPercentage1=%ld nPercentage2=%ld final Percentage=%ld",__FUNCTION__, pHwContext->ucDynamicBacklightMode, nPercentage1, nPercentage2, (nPercentage1 * nPercentage2+500) / 1000);
  14112. //==============================================
  14113. nContrast = pMenuValue->iContrast + 30 - (30 * nHistGrayLevel / 15);
  14114. nDBLStatus=VIP_DBL_STATUS_ENTERING;
  14115. PQ_EEBackLightTarget(VIP_DBL_STATUS_ENTERING, dwWhiteLevel, dwCur);
  14116. PQDebugPrint("%s:pDBL->dwLightTarget=%ld(%#lx)", __FUNCTION__, pDBL->dwLightTarget, pDBL->dwLightTarget);
  14117. PQ_PresetContrast(TRUE, nContrast, 1);
  14118. }
  14119. break;
  14120. case 2:
  14121. //==============================================histogram 1% counting and algorithm2
  14122. dwPixelCount = 0;
  14123. for(i=15; i>=0; i--)
  14124. {
  14125. dwPixelCount += nGrayLevelCount[i];
  14126. if(dwPixelCount > (dwTotalPixel + 50)/100)//find 1% hist position from nGrayLevelCount[15] to nGrayLevelCount[0]
  14127. break;
  14128. }
  14129. PQDebugPrint("%s:%%1 gray level position[0~15] : i=%d dwPixelCount=%ld dwTotalPixel=%ld",__FUNCTION__, i, dwPixelCount, dwTotalPixel);
  14130. if(abs((INT32)nHistGrayLevel - (INT32)i)>1)
  14131. nHistGrayLevel = i;
  14132. nPercentage1 = 1000 - (1000-400)*(dwWhiteLevel-60)/(104-60);
  14133. nPercentage2 = pDBL->ucHistMinPercentage * 10 + (nHistGrayLevel * (100 - pDBL->ucHistMinPercentage) * 10 + 8)/15;
  14134. if(pHwContext->ucDynamicBacklightMode == 1)
  14135. {
  14136. if(pDBL->ucOrder)
  14137. pDBL->dwLightTarget = pDBL->dwLightMax - (pDBL->dwLightMax - pDBL->dwTableNormal) * nPercentage1 / 1000;
  14138. else
  14139. pDBL->dwLightTarget = pDBL->dwTableMin + (pDBL->dwTableNormal - pDBL->dwTableMin) * nPercentage1 / 1000;
  14140. }
  14141. else if(pHwContext->ucDynamicBacklightMode == 2)
  14142. {
  14143. if(pDBL->ucOrder)
  14144. pDBL->dwLightTarget = pDBL->dwLightMax - (pDBL->dwLightMax - pDBL->dwTableNormal) * nPercentage2 / 1000;
  14145. else
  14146. pDBL->dwLightTarget = pDBL->dwTableMin + (pDBL->dwTableNormal - pDBL->dwTableMin) * nPercentage2 / 1000;
  14147. }
  14148. else
  14149. {
  14150. if(pDBL->ucOrder)
  14151. pDBL->dwLightTarget = pDBL->dwLightMax - (pDBL->dwLightMax - pDBL->dwTableNormal) * (nPercentage1 * nPercentage2/1000) / 1000;
  14152. else
  14153. pDBL->dwLightTarget = pDBL->dwTableMin + (pDBL->dwTableNormal - pDBL->dwTableMin) * (nPercentage1 * nPercentage2/1000) / 1000;
  14154. }
  14155. PQDebugPrint("%s:pDBL->dwLightMax=%ld pDBL->dwTableNormal=%ld",__FUNCTION__, pDBL->dwLightMax, pDBL->dwTableNormal);
  14156. PQDebugPrint("%s:ucDynamicBacklightMode=%d nPercentage1=%ld nPercentage2=%ld final Percentage=%ld",__FUNCTION__, pHwContext->ucDynamicBacklightMode, nPercentage1, nPercentage2, (nPercentage1 * nPercentage2+500) / 1000);
  14157. //==============================================
  14158. nContrast = pMenuValue->iContrast + 30 - (30 * nHistGrayLevel / 15);
  14159. nDBLStatus=VIP_DBL_STATUS_KEEPING;
  14160. PQ_EEBackLightTarget(VIP_DBL_STATUS_KEEPING, dwWhiteLevel, dwCur);
  14161. PQ_PresetContrast(TRUE, nContrast, 1);
  14162. break;
  14163. case 3:
  14164. if(nPrevWhiteCondition!=nWhiteCondition)
  14165. {
  14166. //==============================================histogram 1% counting and algorithm2
  14167. dwPixelCount = 0;
  14168. for(i=15; i>=0; i--)
  14169. {
  14170. dwPixelCount += nGrayLevelCount[i];
  14171. if(dwPixelCount > (dwTotalPixel + 50)/100)//find 1% hist position from nGrayLevelCount[15] to nGrayLevelCount[0]
  14172. break;
  14173. }
  14174. PQDebugPrint("%s:%%1 gray level position[0~15] : i=%d dwPixelCount=%ld dwTotalPixel=%ld",__FUNCTION__, i, dwPixelCount, dwTotalPixel);
  14175. if(abs((INT32)nHistGrayLevel - (INT32)i)>1)
  14176. nHistGrayLevel = i;
  14177. nPercentage1 = 400;
  14178. nPercentage2 = pDBL->ucHistMinPercentage * 10 + (nHistGrayLevel * (100 - pDBL->ucHistMinPercentage) * 10 + 8)/15;
  14179. if(pHwContext->ucDynamicBacklightMode == 1)
  14180. {
  14181. if(pDBL->ucOrder)
  14182. pDBL->dwLightTarget = pDBL->dwLightMax - (pDBL->dwLightMax - pDBL->dwTableNormal) * nPercentage1 / 1000;
  14183. else
  14184. pDBL->dwLightTarget = pDBL->dwTableMin + (pDBL->dwTableNormal - pDBL->dwTableMin) * nPercentage1 / 1000;
  14185. }
  14186. else if(pHwContext->ucDynamicBacklightMode == 2)
  14187. {
  14188. if(pDBL->ucOrder)
  14189. pDBL->dwLightTarget = pDBL->dwLightMax - (pDBL->dwLightMax - pDBL->dwTableNormal) * nPercentage2 / 1000;
  14190. else
  14191. pDBL->dwLightTarget = pDBL->dwTableMin + (pDBL->dwTableNormal - pDBL->dwTableMin) * nPercentage2 / 1000;
  14192. }
  14193. else
  14194. {
  14195. if(pDBL->ucOrder)
  14196. pDBL->dwLightTarget = pDBL->dwLightMax - (pDBL->dwLightMax - pDBL->dwTableNormal) * (nPercentage1 * nPercentage2/1000) / 1000;
  14197. else
  14198. pDBL->dwLightTarget = pDBL->dwTableMin + (pDBL->dwTableNormal - pDBL->dwTableMin) * (nPercentage1 * nPercentage2/1000) / 1000;
  14199. }
  14200. PQDebugPrint("%s:pDBL->dwLightMax=%ld pDBL->dwTableNormal=%ld",__FUNCTION__, pDBL->dwLightMax, pDBL->dwTableNormal);
  14201. PQDebugPrint("%s:ucDynamicBacklightMode=%d nPercentage1=%ld nPercentage2=%ld final Percentage=%ld",__FUNCTION__, pHwContext->ucDynamicBacklightMode, nPercentage1, nPercentage2, (nPercentage1 * nPercentage2+500) / 1000);
  14202. //==============================================
  14203. nContrast = pMenuValue->iContrast + 30 - (30 * nHistGrayLevel / 15);
  14204. nDBLStatus=VIP_DBL_STATUS_LEAVING;
  14205. PQ_EEBackLightTarget(VIP_DBL_STATUS_LEAVING, dwWhiteLevel, dwCur);
  14206. PQDebugPrint("%s:pDBL->dwLightTarget=%ld(%#lx)", __FUNCTION__, pDBL->dwLightTarget, pDBL->dwLightTarget);
  14207. PQ_PresetContrast(TRUE, nContrast, 1);
  14208. }
  14209. break;
  14210. }
  14211. if( nDBLStatus==VIP_DBL_STATUS_ENTERING || nDBLStatus==VIP_DBL_STATUS_KEEPING || nDBLStatus==VIP_DBL_STATUS_LEAVING )
  14212. {
  14213. dwCur=PQ_GetRealBackLight();
  14214. dwTarget= pDBL->dwLightTarget;//(pDBL->dwTableNormal==0) ? pDBL->dwLightTarget : pDBL->dwLightTarget * dwHistPWM / pDBL->dwTableNormal;
  14215. dwNext= dwCur+pDBL->iAdd;
  14216. if( abs(dwCur - dwTarget) <= abs(dwCur - dwNext))
  14217. {
  14218. dwNext= dwTarget;
  14219. }
  14220. if((pDBL->iAdd > 0 && dwCur > dwTarget) || (pDBL->iAdd < 0 && dwCur < dwTarget))//prevent other driver set backlight traversing our target value.
  14221. {
  14222. PQ_SetRealBackLight(dwTarget);
  14223. dwNext = dwCur = dwTarget;
  14224. }
  14225. if( dwNext!=dwCur )
  14226. {
  14227. PQ_SetRealBackLight(dwNext);
  14228. }
  14229. else
  14230. {
  14231. nDBLStatus = VIP_DBL_STATUS_DETECTING;
  14232. }
  14233. }
  14234. nPrevWhiteCondition= nWhiteCondition;
  14235. }
  14236. void PQ_PresetContrast(BOOL bReset, INT32 iValue, INT32 nSpeed)
  14237. {
  14238. PQHW_CONTEXT * pHwContext= &PQHwContext;
  14239. static UINT32 nPollingIndex= 0;
  14240. static INT32 iAdd = 0;
  14241. static INT32 dwCur = 0;
  14242. static INT32 dwTarget = 0;
  14243. static INT32 dwNext = 0;
  14244. static BOOL bStart = FALSE;
  14245. if(bReset)
  14246. {
  14247. if(iValue == 0)
  14248. {
  14249. if(nSpeed == 0)
  14250. {
  14251. bStart = FALSE;
  14252. PQDebugPrint("%s:stop!!!",__FUNCTION__);
  14253. }
  14254. else
  14255. {
  14256. PQDebugPrint("%s:iValue = %d, menu value error!!!",__FUNCTION__,iValue);
  14257. }
  14258. return;
  14259. }
  14260. if(iValue == dwTarget)
  14261. return;
  14262. spin_lock(&pHwContext->Spin_PresetContrast);
  14263. iAdd = nSpeed;
  14264. dwCur = pHwContext->iContrast>>COLOR_MATRIX_GAIN_OSD_DIFFBIT;
  14265. dwTarget = iValue;
  14266. if( dwTarget<dwCur )
  14267. iAdd= -(iAdd);
  14268. nPollingIndex = 0;
  14269. bStart = TRUE;
  14270. spin_unlock(&pHwContext->Spin_PresetContrast);
  14271. PQDebugPrint("%s:dwCur = %ld(%#lx), dwTarget = %ld(%#lx), iAdd = %d",__FUNCTION__,dwCur, dwCur, dwTarget, dwTarget, iAdd);
  14272. }
  14273. if(bStart == TRUE)
  14274. {
  14275. nPollingIndex++;
  14276. if(nPollingIndex<75)
  14277. return;
  14278. nPollingIndex = 0;
  14279. dwCur = (pHwContext->iContrast>>COLOR_MATRIX_GAIN_OSD_DIFFBIT);
  14280. dwNext= dwCur+iAdd;
  14281. if( abs(dwCur - dwTarget) <= abs(dwCur - dwNext))
  14282. {
  14283. dwNext= dwTarget;
  14284. }
  14285. if((iAdd > 0 && dwCur > dwTarget) || (iAdd < 0 && dwCur < dwTarget))//prevent other driver set backlight traversing our target value.
  14286. {
  14287. PQ_Contrast(TRUE, dwTarget);
  14288. dwNext = dwCur = dwTarget;
  14289. }
  14290. if( dwNext!=dwCur )
  14291. {
  14292. PQ_Contrast(TRUE, dwNext);
  14293. //PQDebugPrint("%s: dwNext=0x%lx dwCur=0x%lx dwTarget=0x%lx pDBL->dwLightMin=0x%lx\n", __FUNCTION__, dwNext, dwCur, dwTarget, pDBL->dwLightMin);
  14294. }
  14295. else
  14296. {
  14297. PQDebugPrint("%s: DONE!!! dwCur=%#lx(%ld)\n", __FUNCTION__, dwCur, dwCur);
  14298. bStart = FALSE;
  14299. }
  14300. }
  14301. }
  14302. void PQ_SISPresetContrast(UINT8 ucValue, INT32 nSpeed)
  14303. {
  14304. PQHW_CONTEXT * pHwContext= &PQHwContext;
  14305. static UINT32 nPollingIndex= 0;
  14306. static INT32 iAdd = 0;
  14307. static UINT32 dwCur = 0;
  14308. static UINT32 dwTarget = 0;
  14309. static UINT32 dwNext = 0;
  14310. if(ucValue == 0)
  14311. {
  14312. PQDebugPrint("%s:ucValue = %d, menu value error!!!",__FUNCTION__,ucValue);
  14313. return;
  14314. }
  14315. dwCur = pHwContext->iContrast>>COLOR_MATRIX_GAIN_OSD_DIFFBIT;
  14316. if(ucValue == dwCur)
  14317. return;
  14318. iAdd = nSpeed;
  14319. dwTarget = ucValue;
  14320. if( dwTarget<dwCur )
  14321. iAdd= -(iAdd);
  14322. //PQDebugPrint("%s:dwCur = %ld(%#lx), dwTarget = %ld(%#lx), iAdd = %d",__FUNCTION__,dwCur, dwCur, dwTarget, dwTarget, iAdd);
  14323. nPollingIndex++;
  14324. if(nPollingIndex<75)
  14325. return;
  14326. nPollingIndex = 0;
  14327. PQDebugPrint("[Robert]%s:in\n\n",__FUNCTION__);
  14328. dwNext= dwCur+iAdd;
  14329. if( abs(dwCur - dwTarget) <= abs(dwCur - dwNext))
  14330. {
  14331. dwNext= dwTarget;
  14332. }
  14333. if((iAdd > 0 && dwCur > dwTarget) || (iAdd < 0 && dwCur < dwTarget))//prevent other driver set backlight traversing our target value.
  14334. {
  14335. PQ_Contrast(TRUE, dwTarget);
  14336. dwNext = dwCur = dwTarget;
  14337. }
  14338. if( dwNext!=dwCur )
  14339. {
  14340. PQ_Contrast(TRUE, dwNext);
  14341. //PQDebugPrint("%s: dwNext=0x%lx dwCur=0x%lx dwTarget=0x%lx pDBL->dwLightMin=0x%lx\n", __FUNCTION__, dwNext, dwCur, dwTarget, pDBL->dwLightMin);
  14342. }
  14343. }
  14344. void PQ_SetDynamicBacklightMode(UINT8 ucMode)
  14345. {
  14346. PQHW_CONTEXT* pHwContext= &PQHwContext;
  14347. pHwContext->ucDynamicBacklightMode = ucMode;
  14348. PQ_BackLightDetect(TRUE);
  14349. }
  14350. void PQ_SetBackLightLevel(UINT8 ucLevel)
  14351. {
  14352. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  14353. UINT32 dwValue;
  14354. dwValue = pDBL->BacklightTab[ucLevel];
  14355. PQ_EnableDynamicBackLight(STRONG, dwValue);
  14356. }
  14357. void PQ_SetBacklightHistMin(UINT8 ucValue)
  14358. {
  14359. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  14360. if(ucValue <=100)
  14361. {
  14362. pDBL->ucHistMinPercentage = ucValue;
  14363. PQDebugPrint("%s: HistMinPercentage=%d\n", __FUNCTION__, pDBL->ucHistMinPercentage);
  14364. }
  14365. else
  14366. {
  14367. PQDebugPrint("%s: unqualified value(%d)!!!\n", __FUNCTION__, ucValue);
  14368. return;
  14369. }
  14370. PQ_BackLightDetect(TRUE);
  14371. }
  14372. void PQ_SetDynamicBLType(UINT8 ucType)
  14373. {
  14374. PQHW_CONTEXT* pHwContext= &PQHwContext;
  14375. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  14376. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  14377. PQDebugPrint("%s: ucType=%d\n", __FUNCTION__, ucType);
  14378. pDBL->ucDynamicBLType = ucType;
  14379. if(ucType!=DYNAMIC_BL_ENERGY_EFFICIENCY || pDBL->ucLevel==OFF)
  14380. {
  14381. PQ_PresetContrast(TRUE, pMenuValue->iContrast, 1);
  14382. }
  14383. #ifdef DynamicBacklight_EnergyEfficiency
  14384. if(ucType == DYNAMIC_BL_ENERGY_EFFICIENCY)
  14385. {
  14386. pDBL->dwTableNormal= pDBL->BacklightTab[12];
  14387. if( pDBL->dwTableMin>pDBL->dwTableMax )
  14388. pDBL->dwTableNormal= pDBL->BacklightTab[2]; //14-12
  14389. }
  14390. #endif
  14391. PQ_BackLightDetect(TRUE);
  14392. }
  14393. UINT8 PQ_GetDynamicBLType(void)
  14394. {
  14395. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  14396. return pDBL->ucDynamicBLType;
  14397. }
  14398. UINT8 PQ_GetOrderedBackLight(UINT32 *pLight)
  14399. {
  14400. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  14401. if(pDBL->ucOrder)
  14402. *pLight = pDBL->dwTableMax - *pLight + pDBL->dwTableMin;
  14403. return TRUE;
  14404. }
  14405. void PQ_SetMaxPWM(UINT32 ucValue)
  14406. {
  14407. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  14408. ucValue = (~0x80000000) & ucValue;
  14409. PQDebugPrint("%s: %ld(%#lx)", __FUNCTION__, ucValue, ucValue);
  14410. if(pDBL->dwTableMin>pDBL->dwTableMax)
  14411. {
  14412. if(ucValue > pDBL->dwTableMin)
  14413. {
  14414. PQDebugPrint("%s: out of range!! >= dwTableMin", __FUNCTION__);
  14415. return;
  14416. }
  14417. }
  14418. else
  14419. {
  14420. if(ucValue < pDBL->dwTableMin)
  14421. {
  14422. PQDebugPrint("%s: out of range!! <= dwTableMin", __FUNCTION__);
  14423. return;
  14424. }
  14425. }
  14426. if(pDBL->ucOrder)
  14427. ucValue = pDBL->dwTableMax- ucValue + pDBL->dwTableMin;
  14428. pDBL->dwLightMax = ucValue;
  14429. PQ_BackLightDetect(TRUE);
  14430. PQ_PresetContrast(TRUE, 0, 0);
  14431. }
  14432. void PQ_FlDetLevel(UINT8 ucLevel)
  14433. {
  14434. UINT32 WindowH = PQ_RegisterRead(VIP_reg_pnl_hde) - PQ_RegisterRead(VIP_reg_pnl_hds);
  14435. UINT32 WindowV = PQ_RegisterRead(VIP_reg_pnl_vde) - PQ_RegisterRead(VIP_reg_pnl_vds);
  14436. PQ_RegisterWrite(VIP_reg_dpy_fl_blk_hnum, ceil(WindowH*2,48));
  14437. PQ_RegisterWrite(VIP_reg_dpy_fl_blk_vnum, ceil(WindowV,36));
  14438. if(VIP_GetPanelHeight()==1200)
  14439. {
  14440. /*1920x1200 panel must cause video twinkle in flashtone part like #35997*/
  14441. ucLevel = 0;
  14442. }
  14443. PQ_RegisterWrite(VIP_reg_dpy_fl_det_en, ucLevel?1:0);
  14444. PQDebugPrint("%s: ucLevel = %d",__FUNCTION__, ucLevel);
  14445. switch(ucLevel)
  14446. {
  14447. case STRONG:
  14448. PQ_RegisterWrite(VIP_reg_dpy_fl_det_factor, 15);
  14449. PQ_RegisterWrite(VIP_reg_dpy_fl_max, 63);
  14450. break;
  14451. case MEDIUM:
  14452. PQ_RegisterWrite(VIP_reg_dpy_fl_det_factor, 9);
  14453. PQ_RegisterWrite(VIP_reg_dpy_fl_max, 40);
  14454. break;
  14455. case WEAK:
  14456. PQ_RegisterWrite(VIP_reg_dpy_fl_det_factor, 3);
  14457. PQ_RegisterWrite(VIP_reg_dpy_fl_max, 16);
  14458. break;
  14459. }
  14460. }
  14461. void PQ_Set_UV_Coring(void)
  14462. {
  14463. PQHW_CONTEXT* pHwContext= &PQHwContext;
  14464. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  14465. UINT8 ucTableIndex;
  14466. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  14467. UV_Coring_BY_Group_Idx *pUV_Coring_Setting;
  14468. UV_Coring_ext *pUV_Coring_ext;
  14469. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  14470. if (pVtab->mUV_Coring.mUV_CoringGroupedIndex[ucCurrSrcIndex] >= 8) return;
  14471. ucTableIndex = pVtab->mUV_Coring.mUV_CoringGroupedIndex[ucCurrSrcIndex];
  14472. pUV_Coring_Setting = &pVtab->mUV_Coring.UV_Coring_BY_Group_Idx[ucTableIndex];
  14473. pUV_Coring_ext = &pVtab->mUV_Coring_ext[ucTableIndex];
  14474. PQ_RegisterWrite(VIP_reg_uv_coring_en, pUV_Coring_Setting->iUVCoring_en);
  14475. PQ_RegisterWrite(VIP_reg_uv_coring_opt, pUV_Coring_ext->UVCoringOpt);
  14476. PQ_RegisterWrite(VIP_reg_uv_coring, pUV_Coring_Setting->iUVCoring);
  14477. PQ_RegisterWrite(VIP_reg_uv_coring_1, pUV_Coring_ext->iUVCoring_2);
  14478. PQ_RegisterWrite(VIP_reg_uv_coring_2, pUV_Coring_ext->iUVCoring_3);
  14479. PQ_RegisterWrite(VIP_reg_uv_coring_lu_th_lo, pUV_Coring_ext->bluma_th_lo[0]);
  14480. PQ_RegisterWrite(VIP_reg_uv_coring_lu_th_hi, pUV_Coring_ext->bluma_th_hi[0]);
  14481. PQ_RegisterWrite(VIP_reg_uv_coring_lu_th_lo1, pUV_Coring_ext->bluma_th_lo[1]);
  14482. PQ_RegisterWrite(VIP_reg_uv_coring_lu_th_hi1, pUV_Coring_ext->bluma_th_hi[1]);
  14483. PQ_RegisterWrite(VIP_reg_uv_coring_blend_slope, pUV_Coring_ext->bBlend_slope[0]);
  14484. PQ_RegisterWrite(VIP_reg_uv_coring_blend_slope1, pUV_Coring_ext->bBlend_slope[1]);
  14485. }
  14486. /*******************************************************************
  14487. // function name : PQ_Set_UV_Offset
  14488. // input parameter : n/a
  14489. // output parameter : n/a
  14490. // purpose : HW DPY new function since chip 8506 compare with uv coring function
  14491. // return : none
  14492. // ToDo : check the pre bound function
  14493. *******************************************************************/
  14494. void PQ_Set_UV_Offset(void)
  14495. {
  14496. PQHW_CONTEXT* pHwContext= &PQHwContext;
  14497. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  14498. UINT8 ucTableIndex;
  14499. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  14500. UV_Offset_Data *pUVOffsetData;
  14501. int UVOffCbTemp, UVOffCrTemp;
  14502. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  14503. if (pVtab->mUV_Coring.mUV_CoringGroupedIndex[ucCurrSrcIndex] >= 8) return;
  14504. ucTableIndex = pVtab->mUV_Coring.mUV_CoringGroupedIndex[ucCurrSrcIndex];
  14505. pUVOffsetData = &pVtab->mUVOffset.UVOffset[ucTableIndex];
  14506. PQ_RegisterWrite(VIP_REG_DPY_UV_OFFSET_EN, pUVOffsetData->UVOffsetEn);
  14507. PQ_RegisterWrite(VIP_REG_DPY_UVOFFSET_METHOD_SELECT, pUVOffsetData->UVOffsetMethodSelect);
  14508. if(pUVOffsetData->UVOffsetMethodSelect == 2) // value 2 = method 3, //patch for HW request in 8506
  14509. {
  14510. PQ_RegisterWrite(VIP_REG_DPY_OFF_LUMI_LOW, 0);
  14511. PQ_RegisterWrite(VIP_REG_DPY_OFF_LUMI_HIGH, 0);
  14512. }
  14513. else //method 1 and method 2
  14514. {
  14515. PQ_RegisterWrite(VIP_REG_DPY_OFF_LUMI_LOW, pUVOffsetData->DPYOffLumiLow);
  14516. PQ_RegisterWrite(VIP_REG_DPY_OFF_LUMI_HIGH, pUVOffsetData->DPYOffLumiHigh);
  14517. if(pUVOffsetData->UVOffsetMethodSelect == 0)
  14518. {
  14519. UVOffCbTemp = pUVOffsetData->DPYUVOffCbMethod1;
  14520. UVOffCrTemp = pUVOffsetData->DPYUVOffCrMethod1;
  14521. }
  14522. else
  14523. {
  14524. UVOffCbTemp = pUVOffsetData->DPYUVOffCbMethod2;
  14525. UVOffCrTemp = pUVOffsetData->DPYUVOffCrMethod2;
  14526. }
  14527. PQ_RegisterWrite(VIP_REG_DPY_UV_OFF_CB, UVOffCbTemp);
  14528. PQ_RegisterWrite(VIP_REG_DPY_UV_OFF_CR, UVOffCrTemp);
  14529. }
  14530. PQ_RegisterWrite(VIP_REG_DPY_SLOPE_MAXRGB_CB, pUVOffsetData->DPYSlopeMaxRGBCb);
  14531. PQ_RegisterWrite(VIP_REG_DPY_SLOPE_MAXRGB_CR, pUVOffsetData->DPYSlopeMaxRGBCr);
  14532. PQ_RegisterWrite(VIP_REG_DPY_OFF_SAT_LOW_LOW2, pUVOffsetData->DPYOffSatLowLow2);
  14533. PQ_RegisterWrite(VIP_REG_DPY_OFF_SAT_LOW_LOW, pUVOffsetData->DPYOffSatLowLow);
  14534. PQ_RegisterWrite(VIP_REG_DPY_OFF_SAT_LOW, pUVOffsetData->DPYOffSatLow);
  14535. PQ_RegisterWrite(VIP_REG_DPY_OFF_SAT_HIGH, pUVOffsetData->DPYOffSatHigh);
  14536. PQ_RegisterWrite(VIP_REG_DPY_UV_SAT_OFFSET_CB, pUVOffsetData->DPYUVSatOffsetCb);
  14537. PQ_RegisterWrite(VIP_REG_DPY_UV_OFFSET_CB, pUVOffsetData->UVOffsetCb);
  14538. PQ_RegisterWrite(VIP_REG_DPY_SLOPE_SAT_CB2, pUVOffsetData->DPYSlopeSatCb2);
  14539. PQ_RegisterWrite(VIP_REG_DPY_SLOPE_SAT_CB, pUVOffsetData->DPYSlopeSatCb);
  14540. PQ_RegisterWrite(VIP_REG_DPY_UV_SAT_OFFSET_CR, pUVOffsetData->DPYUVSatOffsetCr);
  14541. PQ_RegisterWrite(VIP_REG_DPY_UV_OFFSET_CR, pUVOffsetData->UVOffsetCr);
  14542. PQ_RegisterWrite(VIP_REG_DPY_SLOPE_SAT_CR2, pUVOffsetData->DPYSlopeSatCr2);
  14543. PQ_RegisterWrite(VIP_REG_DPY_SLOPE_SAT_CR, pUVOffsetData->DPYSlopeSatCr);
  14544. }
  14545. #endif //#ifdef DYNAMIC_BACKLIGHT
  14546. void PQ_set_PWM_Duty(UINT16 uwMaxDuty, UINT16 uwMinDuty)
  14547. {
  14548. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  14549. pDBL->PWMDutyMax = uwMaxDuty;
  14550. pDBL->PWMDutyMin = uwMinDuty;
  14551. }
  14552. void PQ_get_PWM_Duty(UINT16* uwMaxDuty, UINT16* uwMinDuty)
  14553. {
  14554. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  14555. *uwMaxDuty = pDBL->PWMDutyMax;
  14556. *uwMinDuty = pDBL->PWMDutyMin;
  14557. }
  14558. UINT8 PQ_GetDefinitionIndex(void)
  14559. {
  14560. UINT8 PQ_Definition = PQ_STANDARD_DEFINITION;
  14561. if(VIP_GetInputVSize()>576+24) /* safer boundary */
  14562. {
  14563. PQ_Definition = PQ_HIGH_DEFINITION;
  14564. }
  14565. return PQ_Definition;
  14566. }
  14567. void PQ_HW_Initial(void)
  14568. {
  14569. PQ_RegisterWrite(VIP_reg_slr_mix_hdiff_th, 64);
  14570. PQ_RegisterWrite(VIP_reg_slr_mix_vdiff_th, 64);
  14571. //post 2d sharpness overshoot fac
  14572. PQ_RegisterWrite(VIP_reg_slr_2d_c_ovsht_fac, 0);
  14573. PQ_RegisterWrite(VIP_reg_slr_2d_c_unsht_fac, 0);
  14574. PQ_RegisterWrite(VIP_reg_slr_2d_c_ovsht_clip, 0);
  14575. PQ_RegisterWrite(VIP_reg_slr_2d_c_unsht_clip, 0);
  14576. PQ_RegisterWrite(VIP_reg_slr_dcti_smooth_gain, 64);
  14577. PQ_RegisterWrite(VIP_reg_gfx_dbk_max_1_3_ratio_en, 1);
  14578. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_th_dyn_adj, 0x01);
  14579. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_en, 0);
  14580. PQ_RegisterWrite(VIP_reg_vdi_snr_demo_inv, 0);
  14581. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_lp_en, 0);
  14582. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_s_en, 0);
  14583. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_blk_diff_lp_en, 0);
  14584. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_fact0, 0x08);
  14585. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_fact1, 0x04);
  14586. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_fact2, 0x00);
  14587. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_lp_gain, 0x2B);
  14588. PQ_RegisterWrite(VIP_reg_vdi_tnr_chroma_tap_sel, 0x00);
  14589. if (PQ_GET_YUV_Datat_Formal()== 0 || PQ_GET_YUV_Datat_Formal()==1)
  14590. {
  14591. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha1_tulow_en, 1);
  14592. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha1_tnulow_en, 0);
  14593. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_tulow_en, 0);
  14594. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_tnulow_en, 0);
  14595. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_en, 0);
  14596. PQ_RegisterWrite(VIP_reg_vdi_tnrz_demo_inv, 0);
  14597. PQ_RegisterWrite(VIP_reg_vdi_lb_double_en, 1);
  14598. PQ_RegisterWrite(VIP_reg_vdi_std_5row, 0);
  14599. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_en, 0);
  14600. PQ_RegisterWrite(VIP_reg_vdi_mad_loa_en, 1);
  14601. PQ_RegisterWrite(VIP_reg_vdi_selcurframe2dpy, 0);
  14602. }
  14603. else
  14604. {
  14605. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha1_tulow_en, 1);
  14606. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha1_tnulow_en, 0);
  14607. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_tulow_en, 0);
  14608. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_tnulow_en, 0);
  14609. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_en, 1);
  14610. PQ_RegisterWrite(VIP_reg_vdi_tnrz_demo_inv, 0);
  14611. PQ_RegisterWrite(VIP_reg_vdi_lb_double_en, 1);
  14612. PQ_RegisterWrite(VIP_reg_vdi_std_5row, 1);
  14613. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_en, 1);
  14614. PQ_RegisterWrite(VIP_reg_vdi_mad_loa_en, 1);
  14615. PQ_RegisterWrite(VIP_reg_vdi_selcurframe2dpy, 0);
  14616. }
  14617. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ul_low_stb_th, 0x04);
  14618. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_adj_max, 0x30);
  14619. PQ_RegisterWrite(VIP_reg_vdi_tnrz_v_ref, 0x08);
  14620. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_inc_fact, 0x04);
  14621. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_dec_fact, 0x02);
  14622. PQ_RegisterWrite(VIP_reg_vdi_tnrz_u_ref, 0x08);
  14623. PQ_RegisterWrite(VIP_reg_vdi_tnrz_th1, 0x00);
  14624. PQ_RegisterWrite(VIP_reg_vdi_tnrz_th1_adj_fact, 0x28);
  14625. PQ_RegisterWrite(VIP_reg_vdi_tnrz_th1_adj_min, 0x00);
  14626. PQ_RegisterWrite(VIP_reg_vdi_tnrz_th1_adj_max, 0x22);
  14627. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_u_ref, 0x08);
  14628. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_th1, 0x00);
  14629. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_th1_adj_fact, 0x28);
  14630. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_th1_adj_min, 0x00);
  14631. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_th1_adj_max, 0x22);
  14632. PQ_RegisterWrite(VIP_reg_vdi_tnrz_clamp_fac1, 0x02);
  14633. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_clamp_fac1, 0x02);
  14634. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_init, 0x04);
  14635. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_adj_min_dith, 0x04);
  14636. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_adj_min, 0x04);
  14637. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_alpha, 0x04);
  14638. PQ_RegisterWrite(VIP_reg_vdi_tnrz_th1_s, 0x00);
  14639. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_th1_s, 0x00);
  14640. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_slope_s, 0x03);
  14641. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_th1, 0x24);
  14642. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_th2, 0x02);
  14643. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_th3, 0x800);
  14644. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_th4, 0x00);
  14645. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_color_th1, 0x24);
  14646. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_color_th2, 0x03);
  14647. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_color_th4, 0x00);
  14648. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_color_th3, 0x850);
  14649. PQ_RegisterWrite(VIP_reg_vdi_tnr_mbw1_alpha_adj, 0x08);
  14650. PQ_RegisterWrite(VIP_reg_vdi_tnr_mbw2_alpha_adj, 0x0C);
  14651. PQ_RegisterWrite(VIP_reg_vdi_tnr_mbw3_alpha_adj, 0x10);
  14652. PQ_RegisterWrite(VIP_reg_vdi_tnr_mbwm_alpha_adj, 0x18);
  14653. PQ_RegisterWrite(VIP_reg_vdi_tnrz_mbw1_alpha_adj, 0x08);
  14654. PQ_RegisterWrite(VIP_reg_vdi_tnrz_mbw2_alpha_adj, 0x0C);
  14655. PQ_RegisterWrite(VIP_reg_vdi_tnrz_mbw3_alpha_adj, 0x10);
  14656. PQ_RegisterWrite(VIP_reg_vdi_tnrz_mbwm_alpha_adj, 0x18);
  14657. PQ_RegisterWrite(VIP_reg_vdi_tnr_ulow_mbw1_alpha_adj, 0x10);
  14658. PQ_RegisterWrite(VIP_reg_vdi_tnr_ulow_mbw2_alpha_adj, 0x18);
  14659. PQ_RegisterWrite(VIP_reg_vdi_tnr_ulow_mbw3_alpha_adj, 0x20);
  14660. PQ_RegisterWrite(VIP_reg_vdi_tnr_ulow_mbwm_alpha_adj, 0x28);
  14661. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ulow_mbw1_alpha_adj, 0x10);
  14662. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ulow_mbw2_alpha_adj, 0x18);
  14663. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ulow_mbw3_alpha_adj, 0x20);
  14664. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ulow_mbwm_alpha_adj, 0x28);
  14665. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_chroma, 0x10);
  14666. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_th1_s, 0x00);
  14667. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_slope_s, 0x00);
  14668. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_add1, 0x00);
  14669. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_add2, 0x00);
  14670. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_add3, 0x00);
  14671. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_add4, 0x00);
  14672. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_add5, 0x00);
  14673. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_add6, 0x00);
  14674. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_add7, 0x00);
  14675. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_add1, 0x00);
  14676. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_add2, 0x00);
  14677. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_add3, 0x00);
  14678. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_add4, 0x00);
  14679. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_add5, 0x00);
  14680. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_add6, 0x00);
  14681. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_add7, 0x00);
  14682. PQ_RegisterWrite(VIP_reg_vdi_ne_fd_chg_mbw_thd, 0x680);
  14683. PQ_RegisterWrite(VIP_reg_vdi_tnr_y_lb_1, 0);
  14684. PQ_RegisterWrite(VIP_reg_vdi_tnr_y_rb_1, 0x40);
  14685. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha1_inc, 0x3c);
  14686. PQ_RegisterWrite(VIP_reg_vdi_alpha_sel, 0x01);
  14687. PQ_RegisterWrite(VIP_reg_vdi_alpha1_tulow_en, 0x01);
  14688. PQ_RegisterWrite(VIP_reg_vdi_alpha1_tnulow_en, 0);
  14689. PQ_RegisterWrite(VIP_reg_vdi_alpha2_tulow_en, 0);
  14690. PQ_RegisterWrite(VIP_reg_vdi_alpha2_tnulow_en, 0);
  14691. PQ_RegisterWrite(VIP_reg_vdi_alpha1_sulow_en, 0);
  14692. PQ_RegisterWrite(VIP_reg_vdi_alpha1_snulow_en, 0);
  14693. PQ_RegisterWrite(VIP_reg_vdi_alpha2_sulow_en, 0);
  14694. PQ_RegisterWrite(VIP_reg_vdi_alpha2_snulow_en, 0);
  14695. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha1_inc, 0x23);
  14696. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha2_inc, 0x23);
  14697. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha1_dec, 0x0A);
  14698. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha2_dec, 0x0A);
  14699. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_sel, 0x01);
  14700. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha1_inc, 0x23);
  14701. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha1_dec, 0x23);
  14702. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_inc, 0x0A);
  14703. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_dec, 0x0A);
  14704. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_init, 0x04);
  14705. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_adj_min_dith, 0x04);
  14706. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_adj_min, 0x04);
  14707. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_alpha, 0x04);
  14708. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_en, 0x01);
  14709. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_edgemode0, 0x01);
  14710. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_edgemode1, 0);
  14711. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_filter_sel, 0x01);
  14712. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_clamp_sel, 0x01);
  14713. PQ_RegisterWrite(VIP_reg_vdi_snr_2df_edge_en, 0x01);
  14714. PQ_RegisterWrite(VIP_reg_vdi_snr_2df_edge_sel, 0);
  14715. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_mode1fac, 0x08);
  14716. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_length, 0x03);
  14717. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_cls_max, 0x40);
  14718. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_cls_min, 0x20);
  14719. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_cls_slp, 0x10);
  14720. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_cls_thr, 0x00);
  14721. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_clamp_thr, 0x2f);
  14722. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_clamp_max, 0x10);
  14723. PQ_RegisterWrite(VIP_reg_vdi_snr_2df_edge_fac, 0x08);
  14724. PQ_RegisterWrite(VIP_reg_vdi_snr_2df_edge_cls_thr, 0x00);
  14725. PQ_RegisterWrite(VIP_reg_vdi_snr_2df_edge_cls_slp, 0x20);
  14726. PQ_RegisterWrite(VIP_reg_vdi_snr_2df_edge_cls_min, 0x30);
  14727. PQ_RegisterWrite(VIP_reg_vdi_snr_2df_edge_cls_max, 0x40);
  14728. PQ_RegisterWrite(VIP_reg_vdi_snr_2df_edge_fil_sel, 0x01);
  14729. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_typ0, 0x1);
  14730. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_typ1, 0);
  14731. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_typ2, 0);
  14732. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_typ3, 0x0);
  14733. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_clamp_typ0, 0x1);
  14734. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_clamp_typ1, 0);
  14735. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_clamp_typ2, 0);
  14736. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_clamp_typ3, 0x1);
  14737. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_fac, 0x10);
  14738. PQ_RegisterWrite(VIP_reg_vdi_tnrz_clamp_fac, 0x18);
  14739. PQ_RegisterWrite(VIP_reg_vdi_tnrz_u_ref_s, 0x0);
  14740. PQ_RegisterWrite(VIP_reg_vdi_tnrz_th1_adj_fact_s, 0x0);
  14741. PQ_RegisterWrite(VIP_reg_vdi_tnrz_th1_adj_min_s, 0x0);
  14742. PQ_RegisterWrite(VIP_reg_vdi_tnrz_th1_adj_max_s, 0x0);
  14743. PQ_RegisterWrite(VIP_reg_vdi_snr_fun_debug, 0x0);
  14744. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_fac1, 0x02);
  14745. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_clamp_fac, 0x30);
  14746. PQ_RegisterWrite(VIP_reg_vdi_tnrz_clamp_typ3, 0);
  14747. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_clamp_fac, 0x30);
  14748. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_tap0, 0x00);
  14749. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_tap1, 0x00);
  14750. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_clamp_tap0, 0x00);
  14751. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_clamp_tap1, 0x00);
  14752. PQ_RegisterWrite(VIP_reg_vdi_tnrz_clamp_tap0, 0x00);
  14753. PQ_RegisterWrite(VIP_reg_vdi_tnrz_clamp_tap1, 0x00);
  14754. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_clamp_tap0, 0x00);
  14755. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_clamp_tap1, 0x00);
  14756. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_lp, 0x25);
  14757. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_div0, 0x00);
  14758. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_div1, 0x00);
  14759. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_alpha_div0, 0x00);
  14760. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_alpha_div1, 0x00);
  14761. PQ_RegisterWrite(VIP_reg_vdi_tnr_8bit0, 0x00);
  14762. PQ_RegisterWrite(VIP_reg_vdi_tnr_8bit1, 0x00);
  14763. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_8bit0, 0x00);
  14764. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_8bit1, 0x00);
  14765. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_div0, 0x00);
  14766. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_div1, 0x00);
  14767. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_alpha_div0, 0x00);
  14768. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_alpha_div0, 0x00);
  14769. PQ_RegisterWrite(VIP_reg_vdi_tnrz_8bit0, 0x00);
  14770. PQ_RegisterWrite(VIP_reg_vdi_tnrz_8bit1, 0x00);
  14771. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_8bit0, 0x00);
  14772. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_8bit1, 0x00);
  14773. PQ_RegisterWrite(VIP_reg_vdi_debug_fix_val0, 0);
  14774. PQ_RegisterWrite(VIP_reg_vdi_debug_fix_val1, 128);
  14775. PQ_RegisterWrite(VIP_reg_vdi_debug_fix_val2, 255);
  14776. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_0, 0);
  14777. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_1, 0x08);
  14778. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_2, 0x10);
  14779. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_3, 24);
  14780. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_4, 32);
  14781. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_5, 40);
  14782. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_6, 48);
  14783. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_7, 56);
  14784. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_8, 64);
  14785. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_9, 72);
  14786. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_a, 80);
  14787. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_b, 88);
  14788. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_c, 96);
  14789. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_d, 104);
  14790. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_e, 112);
  14791. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_f, 120);
  14792. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_0, 0);
  14793. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_1, 8 );
  14794. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_2, 16 );
  14795. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_3, 24 );
  14796. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_4, 32 );
  14797. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_5, 40 );
  14798. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_6, 48 );
  14799. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_7, 56 );
  14800. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_8, 64 );
  14801. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_9, 72 );
  14802. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_a, 80 );
  14803. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_b, 88 );
  14804. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_c, 96 );
  14805. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_d, 104);
  14806. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_e, 112);
  14807. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_f, 120);
  14808. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_0, 0);
  14809. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_1, 8 );
  14810. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_2, 16 );
  14811. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_3, 24 );
  14812. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_4, 32 );
  14813. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_5, 40 );
  14814. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_6, 48 );
  14815. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_7, 56 );
  14816. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_8, 64 );
  14817. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_9, 72 );
  14818. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_a, 80 );
  14819. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_b, 88 );
  14820. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_c, 96 );
  14821. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_d, 104);
  14822. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_e, 112);
  14823. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_f, 120);
  14824. PQ_RegisterWrite(VIP_reg_dpy_flcom0_magmax, 0x37);
  14825. PQ_RegisterWrite(VIP_reg_dpy_fl_blk_hnum, 40);
  14826. PQ_RegisterWrite(VIP_reg_dpy_fl_blk_vnum, 30);
  14827. //#debug mode
  14828. PQ_RegisterWrite(VIP_reg_dpy_fl_det_dbg_en, 0);
  14829. //#medium
  14830. PQ_RegisterWrite(VIP_reg_dpy_fl_det_factor, 9);
  14831. //PIP deal with the data that read from memory with 0-255 nominal range(JPEG case)
  14832. DRV_PICX_SetRGB2YCbCrRange(ePICX_YCBCR_255);
  14833. DRV_PICX_SetRGB2YCbCrMatrixOpt(FALSE);
  14834. DRV_GFX_SetRGB2YCbCrMatrixOpt(FALSE);
  14835. DRV_GFX_MemRequestOpt(ENABLE);
  14836. DRV_VDI_SetSNR();
  14837. PQ_RegisterWrite(VIP_reg_slr_auto_colorbar ,0x0);
  14838. PQ_RegisterWrite(VIP_reg_slr_detail_en ,0x0);
  14839. PQ_RegisterWrite(VIP_reg_slr_sat_th ,0x100);
  14840. PQ_RegisterWrite(VIP_reg_dpy_gm_cfg12bit, 0);
  14841. }
  14842. #ifdef NEW_COEFFICIENT
  14843. void load_coeff_table_nodelay(UINT8 index,UINT8 table)
  14844. {
  14845. INT32 i;
  14846. UINT32* COEFF=(UINT32*)&V_SCALING_UP;
  14847. UINT8 flag_noscaling_H=0;
  14848. switch(table)
  14849. {
  14850. case HCOEFF_NoScaling:
  14851. flag_noscaling_H=1;
  14852. break;
  14853. case VCOEFF_ScalingUP:
  14854. COEFF=(UINT32*)&V_SCALING_UP;
  14855. break;
  14856. case VCOEFF_Scaling_100_110:
  14857. COEFF=(UINT32*)&V_SCALING_100_110;
  14858. break;
  14859. case VCOEFF_Scaling_110_120:
  14860. COEFF=(UINT32*)&V_SCALING_110_120;
  14861. break;
  14862. case VCOEFF_Scaling_120_130:
  14863. COEFF=(UINT32*)&V_SCALING_120_130;
  14864. break;
  14865. case VCOEFF_Scaling_130_140:
  14866. COEFF=(UINT32*)&V_SCALING_130_140;
  14867. break;
  14868. case VCOEFF_Scaling_140_150:
  14869. COEFF=(UINT32*)&V_SCALING_140_150;
  14870. break;
  14871. case VCOEFF_Scaling_150_160:
  14872. COEFF=(UINT32*)&V_SCALING_150_160;
  14873. break;
  14874. case VCOEFF_Scaling_160_170:
  14875. COEFF=(UINT32*)&V_SCALING_160_170;
  14876. break;
  14877. case VCOEFF_Scaling_170_180:
  14878. COEFF=(UINT32*)&V_SCALING_170_180;
  14879. break;
  14880. case VCOEFF_Scaling_180_190:
  14881. COEFF=(UINT32*)&V_SCALING_180_190;
  14882. break;
  14883. case VCOEFF_Scaling_190_200:
  14884. COEFF=(UINT32*)&V_SCALING_190_200;
  14885. break;
  14886. case VCOEFF_Scaling_200_250:
  14887. COEFF=(UINT32*)&V_SCALING_200_250;
  14888. break;
  14889. case VCOEFF_Scaling_250_300:
  14890. COEFF=(UINT32*)&V_SCALING_250_300;
  14891. break;
  14892. case VCOEFF_Scaling_300_350:
  14893. COEFF=(UINT32*)&V_SCALING_300_350;
  14894. break;
  14895. case VCOEFF_Scaling_350_400:
  14896. COEFF=(UINT32*)&V_SCALING_350_400;
  14897. break;
  14898. case COEFF_Scaling_1:
  14899. COEFF=(UINT32*)&SCALING_1;
  14900. break;
  14901. default:
  14902. break;
  14903. }
  14904. PQ_RegisterWrite( VIP_reg_slr_coeff_sel, index);
  14905. //if((flag_noscaling_V==0)&&(flag_noscaling_H==0))
  14906. if(flag_noscaling_H==0)
  14907. {
  14908. for(i=0;i<=32;i++)
  14909. mips1_word_coeff_group_nodelay( i, COEFF[3*i+0], COEFF[3*i+1], COEFF[3*i+2]);
  14910. // printk(KERN_EMERG"load_coeff_table_nodelay<==\n");
  14911. }
  14912. else
  14913. {
  14914. mips1_word_coeff_group_nodelay( 0, 0, 0x10000000, 0);
  14915. //mips1_word_coeff_group_nodelay( 0, 0, 0, 0);
  14916. }
  14917. //if(index==2)
  14918. // PQ_RegisterWrite( VIP_reg_slr_coeff_sel, 0);
  14919. }//load_coeff_table~
  14920. void _PQ_FillNewCoefficient(UINT8 PRE_H_COEFF_TYPE,UINT8 POST_H_COEFF_TYPE,UINT8 V_COEFF_TYPE)
  14921. {
  14922. load_coeff_table_nodelay((UINT8)0,PRE_H_COEFF_TYPE);
  14923. load_coeff_table_nodelay((UINT8)2,V_COEFF_TYPE);
  14924. }
  14925. //================================================================================
  14926. // function name : PQ_Decide_Coefficient_Table
  14927. // input parameter :
  14928. // output parameter : none
  14929. // purpose : setup coefficient table in each scaler type
  14930. // return : none
  14931. // modify note : #34050, revision 53627, cross talk pattern unsmooth in 1280x760 or 1280x1024 pattern
  14932. // [how] if H size = 1280, set PRE_H_COEFF_TYPE = VCOEFF_Scaling_130_140
  14933. // #35850, revision 56413, cross talk pattern unsmooth inVG858, timing:982, Patten:923, p.size/4:3
  14934. // [how] if H size = 1280, add V_COEFF_TYPE = VCOEFF_Scaling_250_300;
  14935. // revision 59244, fonts unclear in PC, 1280x1024 panel
  14936. // [how] 1. revert 2 modification above (revision 53627, revision 56413)
  14937. // 2. set PRE_H_COEFF_TYPE = HCOEFF_NoScaling in specific input pattern
  14938. // #35850, revision 60738, cross talk pattern unsmooth inVG858, timing:982, Patten:923, p.size/4:3
  14939. // [how] 1. cancel the revert in revision 59244, and modify the coefficient table setting to PRE_H_COEFF_TYPE = VCOEFF_ScalingUP;
  14940. //================================================================================
  14941. void PQ_Decide_Coefficient_Table(UINT8 ucUserSource, DRV_SLR_CONFIG eSlrConfig, UINT32 PreHfactor, UINT32 PostHfactor, UINT32 Vfactor)
  14942. {
  14943. //the range of PreHfactor or Vfactor is 2048 * 1.1 = 2253, 2048 * 1.2 = 2458, etc...
  14944. UINT8 PRE_H_COEFF_TYPE=0,POST_H_COEFF_TYPE=0,V_COEFF_TYPE=0;
  14945. PRE_H_COEFF_TYPE=HCOEFF_NoScaling;
  14946. POST_H_COEFF_TYPE=HCOEFF_NoScaling;
  14947. V_COEFF_TYPE=VCOEFF_ScalingUP;
  14948. // Decide PRE_H_COEFF_TYPE by PreHfactor
  14949. //chienjen:using the same PRE_H_COEFF table as V_COEFF table
  14950. if(PreHfactor<2048) PRE_H_COEFF_TYPE=VCOEFF_ScalingUP;
  14951. else if(PreHfactor==2048) PRE_H_COEFF_TYPE=HCOEFF_NoScaling;
  14952. else if((PreHfactor>2048)&&(PreHfactor<=2253)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_100_110;
  14953. else if((PreHfactor>2253)&&(PreHfactor<=2458)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_110_120;
  14954. else if((PreHfactor>2458)&&(PreHfactor<=2662)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_120_130;
  14955. else if((PreHfactor>2662)&&(PreHfactor<=2867)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_130_140;
  14956. else if((PreHfactor>2867)&&(PreHfactor<=3072)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_140_150;
  14957. else if((PreHfactor>3072)&&(PreHfactor<=3277)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_150_160;
  14958. else if((PreHfactor>3277)&&(PreHfactor<=3482)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_160_170;
  14959. else if((PreHfactor>3482)&&(PreHfactor<=3686)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_170_180;
  14960. else if((PreHfactor>3686)&&(PreHfactor<=3891)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_180_190;
  14961. else if((PreHfactor>3891)&&(PreHfactor<=4096)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_190_200;
  14962. else if((PreHfactor>4096)&&(PreHfactor<=5120)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_200_250;
  14963. else if((PreHfactor>5120)&&(PreHfactor<=6144)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_250_300;
  14964. else if((PreHfactor>6144)&&(PreHfactor<=7168)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_300_350;
  14965. else if(PreHfactor>7168) PRE_H_COEFF_TYPE=VCOEFF_Scaling_350_400;
  14966. if(PostHfactor == 2048 && Vfactor == 2048)
  14967. Vfactor=2048;
  14968. else if(PostHfactor > 2048 || Vfactor> 2048)
  14969. Vfactor = max(PostHfactor, Vfactor);
  14970. // Decide V_COEFF_TYPE by Vfactor
  14971. if(Vfactor<2048 || PostHfactor<=2048) V_COEFF_TYPE=VCOEFF_ScalingUP;
  14972. else if((Vfactor>2048)&&(Vfactor<=2253)) V_COEFF_TYPE=VCOEFF_Scaling_100_110;
  14973. else if((Vfactor>2253)&&(Vfactor<=2458)) V_COEFF_TYPE=VCOEFF_Scaling_110_120;
  14974. else if((Vfactor>2458)&&(Vfactor<=2662)) V_COEFF_TYPE=VCOEFF_Scaling_120_130;
  14975. else if((Vfactor>2662)&&(Vfactor<=2867)) V_COEFF_TYPE=VCOEFF_Scaling_130_140;
  14976. else if((Vfactor>2867)&&(Vfactor<=3072)) V_COEFF_TYPE=VCOEFF_Scaling_140_150;
  14977. else if((Vfactor>3072)&&(Vfactor<=3277)) V_COEFF_TYPE=VCOEFF_Scaling_150_160;
  14978. else if((Vfactor>3277)&&(Vfactor<=3482)) V_COEFF_TYPE=VCOEFF_Scaling_160_170;
  14979. else if((Vfactor>3482)&&(Vfactor<=3686)) V_COEFF_TYPE=VCOEFF_Scaling_170_180;
  14980. else if((Vfactor>3686)&&(Vfactor<=3891)) V_COEFF_TYPE=VCOEFF_Scaling_180_190;
  14981. else if((Vfactor>3891)&&(Vfactor<=4096)) V_COEFF_TYPE=VCOEFF_Scaling_190_200;
  14982. else if((Vfactor>4096)&&(Vfactor<=5120)) V_COEFF_TYPE=VCOEFF_Scaling_200_250;
  14983. else if((Vfactor>5120)&&(Vfactor<=6144)) V_COEFF_TYPE=VCOEFF_Scaling_250_300;
  14984. else if((Vfactor>6144)&&(Vfactor<=7168)) V_COEFF_TYPE=VCOEFF_Scaling_300_350;
  14985. else if(Vfactor>7168) V_COEFF_TYPE=VCOEFF_Scaling_350_400;
  14986. if(eSlrConfig == eSLR_CONFIG_PRE_NON_POST_NON)
  14987. {
  14988. PRE_H_COEFF_TYPE = HCOEFF_NoScaling;
  14989. POST_H_COEFF_TYPE = HCOEFF_NoScaling;
  14990. V_COEFF_TYPE = VCOEFF_ScalingUP;
  14991. }
  14992. if( VIP_GetInputVSize() <= 600 ) //SD
  14993. {
  14994. if(VIP_IsATVSource())
  14995. V_COEFF_TYPE = VCOEFF_Scaling_110_120;
  14996. if(VIP_IsSourceDTV())
  14997. V_COEFF_TYPE = VCOEFF_Scaling_200_250;
  14998. }
  14999. if( _VIP_InputWidthEnlargeRate() > 0)
  15000. {
  15001. if(VIP_IsPCSource() && (PreHfactor / _VIP_InputWidthEnlargeRate())== 2048)
  15002. {
  15003. PRE_H_COEFF_TYPE = HCOEFF_NoScaling;
  15004. }
  15005. }
  15006. if(VIP_IsPCSource() && (VIP_GetInputHSize()/_VIP_InputWidthEnlargeRate()) == 1280) // #34050
  15007. {
  15008. //PRE_H_COEFF_TYPE = VCOEFF_Scaling_130_140;
  15009. //V_COEFF_TYPE = VCOEFF_Scaling_250_300; //#mantis 35850
  15010. PRE_H_COEFF_TYPE = VCOEFF_ScalingUP;
  15011. }
  15012. #ifdef CONFIG_USE_TCON_OUTPUT
  15013. if((VIP_GetUserSource() == SOURCE_EXTS && !VIP_IsPCSource()) || (VIP_GetUserSource() == SOURCE_HDMI))
  15014. {
  15015. if(PreHfactor == 0x81b && Vfactor == 0x7cb)//#49208
  15016. {
  15017. if((VIP_GetAspect()==ASPECT_ZOOM2) && (VIP_GetUserSource() == SOURCE_HDMI)) //#51737
  15018. {
  15019. PRE_H_COEFF_TYPE = COEFF_Scaling_1;
  15020. }
  15021. else
  15022. {
  15023. PRE_H_COEFF_TYPE = VCOEFF_Scaling_190_200;
  15024. }
  15025. V_COEFF_TYPE = VCOEFF_Scaling_170_180;
  15026. }
  15027. else if(PreHfactor == 2306 && Vfactor == 2310)
  15028. {
  15029. if((VIP_GetAspect()==ASPECT_ZOOM1) && (VIP_GetUserSource() == SOURCE_HDMI))
  15030. {
  15031. PRE_H_COEFF_TYPE = COEFF_Scaling_1;
  15032. }
  15033. }
  15034. }
  15035. #endif
  15036. if(VIP_GetUserSource() == SOURCE_MPEG && V_COEFF_TYPE>=VCOEFF_Scaling_180_190)
  15037. V_COEFF_TYPE = COEFF_Scaling_1;
  15038. //==============Fill Coefficient===============
  15039. _PQ_FillNewCoefficient(PRE_H_COEFF_TYPE,POST_H_COEFF_TYPE,V_COEFF_TYPE);
  15040. //======================================================================
  15041. }
  15042. #endif
  15043. void mips1_word_coeff_group(UINT8 ucAddr, UINT32 dw64, UINT32 dw68, UINT32 dw6c)
  15044. {
  15045. PQ_RegisterWrite(VIP_reg_slr_coeff_addr, ucAddr);
  15046. PQ_RegisterWrite(VIP_reg_slr_coeff_data2, dw64);
  15047. PQ_RegisterWrite(VIP_reg_slr_coeff_data1, dw68);
  15048. PQ_RegisterWrite(VIP_reg_slr_coeff_data0, dw6c);
  15049. }
  15050. #ifdef NEW_COEFFICIENT
  15051. void mips1_word_coeff_group_nodelay(UINT8 ucAddr, UINT32 dw64, UINT32 dw68, UINT32 dw6c)
  15052. {
  15053. //PQ_RegisterWrite(VIP_reg_slr_coeff_addr, ucAddr);
  15054. //PQ_RegisterWrite(VIP_reg_slr_coeff_data2, dw64);
  15055. //PQ_RegisterWrite(VIP_reg_slr_coeff_data1, dw68);
  15056. //PQ_RegisterWrite(VIP_reg_slr_coeff_data0, dw6c);
  15057. *(volatile UINT8*)(0xbe1cd060)=ucAddr;
  15058. *(volatile unsigned long*)(0xbe1cd064)=dw64;
  15059. *(volatile unsigned long*)(0xbe1cd068)=dw68;
  15060. *(volatile unsigned long*)(0xbe1cd06c)=dw6c;
  15061. //printk(KERN_EMERG"ucAddr=%d,dw64=0x%x,dw68=0x%x,dw6c=0x%x\n",ucAddr,dw64,dw68,dw6c);
  15062. }
  15063. #endif
  15064. void load_coeff_table(void)
  15065. {
  15066. INT32 i;
  15067. // printk(KERN_EMERG"load_coeff_table===>\n");
  15068. for(i=0;i<3;i++)
  15069. {
  15070. //2009-05-08 CJ fix HW bug
  15071. //SLR coeff. setting sequence : 0 �� 4 �� 5 �� 1 �� 5 �� 7 �� 6 �� 2 �� 0
  15072. //0, 1, 2 : Set oxbe1cd062 and write/read coeff.
  15073. //4, 5, 6, 7 : Olny set oxbe1cd062
  15074. if(i==1)
  15075. {
  15076. PQ_RegisterWrite( VIP_reg_slr_coeff_sel, 4);
  15077. PQ_RegisterWrite( VIP_reg_slr_coeff_sel, 5);
  15078. }
  15079. if(i==2)
  15080. {
  15081. PQ_RegisterWrite( VIP_reg_slr_coeff_sel, 5);
  15082. PQ_RegisterWrite( VIP_reg_slr_coeff_sel, 7);
  15083. PQ_RegisterWrite( VIP_reg_slr_coeff_sel, 6);
  15084. }
  15085. PQ_RegisterWrite( VIP_reg_slr_coeff_sel, i);
  15086. switch(i)
  15087. {
  15088. //prev_h/_h
  15089. case 0:
  15090. case 1:
  15091. //Because C.J's coeff. had line bugs, so use 328's h coeff
  15092. mips1_word_coeff_group( 0, 0x00000000, 0x10000000, 0x00000000);
  15093. mips1_word_coeff_group( 1, 0x0008FFCC, 0x10020037, 0xFFF8FFFC);
  15094. mips1_word_coeff_group( 2, 0x000EFF99, 0x10020071, 0xFFEFFFF8);
  15095. mips1_word_coeff_group( 3, 0x0014FF69, 0x0FFE00AE, 0xFFE5FFF4);
  15096. mips1_word_coeff_group( 4, 0x0019FF3B, 0x0FF700EC, 0xFFDAFFF0);
  15097. mips1_word_coeff_group( 5, 0x001EFF10, 0x0FED012E, 0xFFCEFFEC);
  15098. mips1_word_coeff_group( 6, 0x0021FEE7, 0x0FDF0171, 0xFFC1FFE8);
  15099. mips1_word_coeff_group( 7, 0x0024FEC0, 0x0FCE01B7, 0xFFB4FFE4);
  15100. mips1_word_coeff_group( 8, 0x0027FE9C, 0x0FBA01FF, 0xFFA5FFE1);
  15101. mips1_word_coeff_group( 9, 0x0028FE7B, 0x0FA20249, 0xFF96FFDD);
  15102. mips1_word_coeff_group(10, 0x0029FE5C, 0x0F880296, 0xFF86FFDA);
  15103. mips1_word_coeff_group(11, 0x0029FE3F, 0x0F6A02E4, 0xFF76FFD6);
  15104. mips1_word_coeff_group(12, 0x0028FE25, 0x0F480334, 0xFF64FFD4);
  15105. mips1_word_coeff_group(13, 0x0027FE0D, 0x0F230386, 0xFF52FFD1);
  15106. mips1_word_coeff_group(14, 0x0026FDF8, 0x0EFB03DA, 0xFF40FFCE);
  15107. mips1_word_coeff_group(15, 0x0024FDE5, 0x0ED00430, 0xFF2DFFCC);
  15108. mips1_word_coeff_group(16, 0x0021FDD5, 0x0EA10486, 0xFF1AFFCA);
  15109. mips1_word_coeff_group(17, 0x001EFDC7, 0x0E7004DF, 0xFF06FFC9);
  15110. mips1_word_coeff_group(18, 0x001BFDBB, 0x0E3B0538, 0xFEF2FFC8);
  15111. mips1_word_coeff_group(19, 0x0017FDB1, 0x0E030592, 0xFEDDFFC7);
  15112. mips1_word_coeff_group(20, 0x0013FDAA, 0x0DC805ED, 0xFEC9FFC7);
  15113. mips1_word_coeff_group(21, 0x000FFDA5, 0x0D8A0649, 0xFEB4FFC7);
  15114. mips1_word_coeff_group(22, 0x000BFDA2, 0x0D4906A6, 0xFE9FFFC7);
  15115. mips1_word_coeff_group(23, 0x0006FDA1, 0x0D050703, 0xFE8BFFC8);
  15116. mips1_word_coeff_group(24, 0x0002FDA2, 0x0CBF0760, 0xFE76FFC9);
  15117. mips1_word_coeff_group(25, 0xFFFDFDA5, 0x0C7607BD, 0xFE62FFCA);
  15118. mips1_word_coeff_group(26, 0xFFF9FDAA, 0x0C2A081A, 0xFE4FFFCC);
  15119. mips1_word_coeff_group(27, 0xFFF4FDB0, 0x0BDD0877, 0xFE3CFFCE);
  15120. mips1_word_coeff_group(28, 0xFFEFFDB8, 0x0B8D08D3, 0xFE29FFD1);
  15121. mips1_word_coeff_group(29, 0xFFEBFDC2, 0x0B3B092E, 0xFE17FFD4);
  15122. mips1_word_coeff_group(30, 0xFFE7FDCD, 0x0AE70989, 0xFE07FFD7);
  15123. mips1_word_coeff_group(31, 0xFFE2FDDA, 0x0A9209E3, 0xFDF7FFDB);
  15124. mips1_word_coeff_group(32, 0xFFDEFDE8, 0x0A3B0A3B, 0xFDE8FFDE);
  15125. break;
  15126. //_v
  15127. case 2:
  15128. mips1_word_coeff_group( 0, 0x00000000, 0x10000000, 0x00000000);
  15129. mips1_word_coeff_group( 1, 0x0000FFDC, 0x0FF70028, 0x00060000);
  15130. mips1_word_coeff_group( 2, 0x0000FFBB, 0x0FE80052, 0x000C0000);
  15131. mips1_word_coeff_group( 3, 0x0000FF9D, 0x0FD2007F, 0x00120000);
  15132. mips1_word_coeff_group( 4, 0x0000FF82, 0x0FB800AF, 0x00180000);
  15133. mips1_word_coeff_group( 5, 0x0000FF6A, 0x0F9700E1, 0x001E0000);
  15134. mips1_word_coeff_group( 6, 0x0000FF55, 0x0F720116, 0x00230000);
  15135. mips1_word_coeff_group( 7, 0x0000FF44, 0x0F48014D, 0x00280000);
  15136. mips1_word_coeff_group( 8, 0x0000FF35, 0x0F190186, 0x002C0000);
  15137. mips1_word_coeff_group( 9, 0x0000FF29, 0x0EE501C2, 0x00300000);
  15138. mips1_word_coeff_group(10, 0x0000FF20, 0x0EAE01FE, 0x00340000);
  15139. mips1_word_coeff_group(11, 0x0000FF19, 0x0E74023D, 0x00360000);
  15140. mips1_word_coeff_group(12, 0x0000FF15, 0x0E36027D, 0x00390000);
  15141. mips1_word_coeff_group(13, 0x0000FF13, 0x0DF502BF, 0x003A0000);
  15142. mips1_word_coeff_group(14, 0x0000FF13, 0x0DB10302, 0x003A0000);
  15143. mips1_word_coeff_group(15, 0x0000FF14, 0x0D6C0346, 0x003A0000);
  15144. mips1_word_coeff_group(16, 0x0000FF18, 0x0D24038B, 0x00390000);
  15145. mips1_word_coeff_group(17, 0x0000FF1D, 0x0CDA03D2, 0x00380000);
  15146. mips1_word_coeff_group(18, 0x0000FF24, 0x0C8F0419, 0x00350000);
  15147. mips1_word_coeff_group(19, 0x0000FF2B, 0x0C430461, 0x00320000);
  15148. mips1_word_coeff_group(20, 0x0000FF34, 0x0BF604A9, 0x002D0000);
  15149. mips1_word_coeff_group(21, 0x0000FF3E, 0x0BA704F3, 0x00280000);
  15150. mips1_word_coeff_group(22, 0x0000FF49, 0x0B59053D, 0x00230000);
  15151. mips1_word_coeff_group(23, 0x0000FF54, 0x0B090587, 0x001C0000);
  15152. mips1_word_coeff_group(24, 0x0000FF60, 0x0ABA05D2, 0x00150000);
  15153. mips1_word_coeff_group(25, 0x0000FF6C, 0x0A6A061E, 0x000D0000);
  15154. mips1_word_coeff_group(26, 0x0000FF78, 0x0A1A066A, 0x00040000);
  15155. mips1_word_coeff_group(27, 0x0000FF85, 0x09CA06B7, 0xFFFB0000);
  15156. mips1_word_coeff_group(28, 0x0000FF92, 0x097A0704, 0xFFF10000);
  15157. mips1_word_coeff_group(29, 0x0000FF9F, 0x092A0751, 0xFFE70000);
  15158. mips1_word_coeff_group(30, 0x0000FFAB, 0x08DB079F, 0xFFDC0000);
  15159. mips1_word_coeff_group(31, 0x0000FFB8, 0x088B07EE, 0xFFD00000);
  15160. mips1_word_coeff_group(32, 0x0000FFC4, 0x083C083C, 0xFFC40000);
  15161. break;
  15162. }//switch~
  15163. if(i==2)
  15164. PQ_RegisterWrite( VIP_reg_slr_coeff_sel, 0);
  15165. }//for~
  15166. // printk(KERN_EMERG"load_coeff_tabl<e===\n");
  15167. }//load_coeff_table~
  15168. void sp_w_table(void)
  15169. {
  15170. // printk(KERN_EMERG"sp_w_table==========================>\n");
  15171. ////dclk = 240mhz/8 = 30mhz
  15172. //mips1_byte( 0xbe1c0009, 0x8);//d clock dclk==>mclk*12/27.576 ex:19.45*12/27.576=8.46
  15173. //mips1_byte( 0xbe1c0009, 0x4);
  15174. //msleep(1000);
  15175. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  15176. //// MBW Config
  15177. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  15178. //
  15179. PQ_RegisterWrite(VIP_reg_slr_mbw_en, 0x1);
  15180. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_min, 0x0);
  15181. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_max, 0x0);
  15182. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_min_th, 0x0);
  15183. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_max_th, 0x0);
  15184. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_shift, 0x0);
  15185. PQ_RegisterWrite(VIP_reg_slr_spw_max, 0x20);
  15186. PQ_RegisterWrite(VIP_reg_slr_spw_min, 0x8);
  15187. PQ_RegisterWrite(VIP_reg_slr_spw_offset, 0x6);
  15188. PQ_RegisterWrite(VIP_reg_slr_spw_slope1, 0x40);
  15189. PQ_RegisterWrite(VIP_reg_slr_spw_slope2, 0x20);
  15190. //20100302 for �إ� 168c0 (avoid words blur) setting
  15191. PQ_RegisterWrite(VIP_reg_slr_mix_mb_hmot_th1 , 0x1);
  15192. PQ_RegisterWrite(VIP_reg_slr_mix_mb_hmot_th2, 8);
  15193. PQ_RegisterWrite(VIP_reg_slr_mix_mb_mmot_th1, 0x2);
  15194. PQ_RegisterWrite(VIP_reg_slr_mix_mb_mmot_th2, 8);
  15195. PQ_RegisterWrite(VIP_reg_slr_mix_mb_lmot_th1, 0x0);
  15196. PQ_RegisterWrite(VIP_reg_slr_mix_mb_lmot_th2, 0);
  15197. PQ_RegisterWrite(VIP_reg_slr_mix_mb_mot_th1, 0x3);
  15198. PQ_RegisterWrite(VIP_reg_slr_mix_mb_mot_th2, 0);
  15199. PQ_RegisterWrite(VIP_reg_slr_mix_max, 0x4);
  15200. PQ_RegisterWrite(VIP_reg_slr_mix_min, 5);
  15201. PQ_RegisterWrite(VIP_reg_slr_mesh_dec_th,0);
  15202. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_limit, 4);
  15203. PQ_RegisterWrite(VIP_reg_slr_spw_th, 0x8);
  15204. }
  15205. void PQ_AffectInPanelVSync_ISR(void)
  15206. {
  15207. PQHW_CONTEXT* pHwContext= &PQHwContext;
  15208. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  15209. PQ_SW_DynamicContrast_SceneChangeDetect_ISR();
  15210. PQ_Sharpness_POST_2D(FALSE, pMenuValue->iSharpness);
  15211. PQ_Brightness(FALSE, pMenuValue->iBrightness);
  15212. PQ_Sharpness(FALSE, pMenuValue->iSharpness);
  15213. PQ_DSSharpness(FALSE, pMenuValue->iSharpness);
  15214. PQ_DPYSharpness(FALSE, pMenuValue->iSharpness);
  15215. PQ_HorSharpness(FALSE, pMenuValue->iSharpness);
  15216. PQ_Sharpness_POSTDCTI(FALSE,pMenuValue->iSharpness);
  15217. PQ_Sharpness_POSTDLTI(FALSE, pMenuValue->iSharpness);
  15218. PQ_Sharpness_Peaking_DLTI(FALSE, pMenuValue->iSharpness);
  15219. if(!PQ_IsFadeEn())
  15220. {
  15221. PQ_Contrast(FALSE, pMenuValue->iContrast);
  15222. }
  15223. PQ_ColorMatrixSetup(FALSE, 0);
  15224. PQ_ColorMatrixComp(FALSE);
  15225. PQ_CheckMotionStatusMethod2(FALSE);
  15226. }
  15227. void PQ_AffectInInputVSync_ISR(void)
  15228. {
  15229. PQHW_CONTEXT* pHwContext= &PQHwContext;
  15230. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  15231. INT32 ucvdi_mot_cnt = PQ_RegisterRead(VIP_vdi_mot_cnt);
  15232. static int ResetCount;
  15233. static BOOL ResetFlag;
  15234. PQ_SWDTColorBar();
  15235. PQ_PureColorPatternDetect(20);
  15236. PQ_DigitalScanADC2Detect();
  15237. if((VIP_GetScalerPreScaleV() <= 576 && VIP_GetInterlaceMode() ) && PQ_GetColorProcessor() && VIP_GetColorCrossEnable())
  15238. {
  15239. if(ucvdi_mot_cnt > (VIP_GetInputHSize() * (VIP_GetInputVSize()>>VIP_GetInterlaceMode()) * 20 / 100))
  15240. {
  15241. PQ_ResetColorCrossMemData(TRUE);
  15242. PQ_SetColorCross(DISABLE);
  15243. PQ_RegisterWrite(VIP_reg_vdi_tnr_en, 0);
  15244. ResetCount = 2;
  15245. ResetFlag = TRUE;
  15246. }
  15247. if(ResetCount > 0)
  15248. {
  15249. ResetCount--;
  15250. }
  15251. if((ResetCount == 0) && (ResetFlag == TRUE))
  15252. {
  15253. PQ_ResetColorCrossMemData(FALSE);
  15254. PQ_SetColorCross(ENABLE);
  15255. PQ_RegisterWrite(VIP_reg_vdi_tnr_en, 1);
  15256. ResetFlag = FALSE;
  15257. }
  15258. }
  15259. PQ_Sharpness_PREDCTI(FALSE, pMenuValue->iSharpness);
  15260. PQ_Sharpness_PREDLTI(FALSE, pMenuValue->iSharpness);
  15261. PQ_HmeControl();
  15262. PQ_ChromaMotionDetectControl();
  15263. PQ_TpwControl();
  15264. #ifdef CONFIG_FORCE_NR_EFFECT_ENHANCED_IN_OFF_OPTION
  15265. PQ_SigmaNR(FALSE, 0xff, 0xff, 0xff);
  15266. #else
  15267. PQ_SigmaNR(FALSE, pMenuValue->ucNRLevel, 0xff, 0xff);
  15268. #endif
  15269. }
  15270. #ifdef CONFIG_ENABLE_MIR
  15271. void mips1_MIR_word_coeff_group_nodelay(UINT8 ucAddr, UINT32 dw64, UINT32 dw68, UINT32 dw6c)
  15272. {
  15273. mips1_byte_nodelay( 0xbe1ce060, ucAddr);
  15274. mips1_word_nodelay(0xbe1ce064, dw64);
  15275. mips1_word_nodelay(0xbe1ce068, dw68);
  15276. mips1_word_nodelay(0xbe1ce06c, dw6c);
  15277. }
  15278. void load_MIR_coeff_table_nodelay(UINT8 index, UINT8 table)
  15279. {
  15280. INT32 i;
  15281. UINT32* COEFF=(UINT32*)&V_SCALING_UP;
  15282. UINT8 flag_noscaling_V=0;
  15283. switch(table)
  15284. {
  15285. case HCOEFF_NoScaling:
  15286. flag_noscaling_V=1;
  15287. break;
  15288. case VCOEFF_ScalingUP:
  15289. COEFF=(UINT32*)&V_SCALING_UP;
  15290. break;
  15291. case VCOEFF_Scaling_100_110:
  15292. COEFF=(UINT32*)&V_SCALING_100_110;
  15293. break;
  15294. case VCOEFF_Scaling_110_120:
  15295. COEFF=(UINT32*)&V_SCALING_110_120;
  15296. break;
  15297. case VCOEFF_Scaling_120_130:
  15298. COEFF=(UINT32*)&V_SCALING_120_130;
  15299. break;
  15300. case VCOEFF_Scaling_130_140:
  15301. COEFF=(UINT32*)&V_SCALING_130_140;
  15302. break;
  15303. case VCOEFF_Scaling_140_150:
  15304. COEFF=(UINT32*)&V_SCALING_140_150;
  15305. break;
  15306. case VCOEFF_Scaling_150_160:
  15307. COEFF=(UINT32*)&V_SCALING_150_160;
  15308. break;
  15309. case VCOEFF_Scaling_160_170:
  15310. COEFF=(UINT32*)&V_SCALING_160_170;
  15311. break;
  15312. case VCOEFF_Scaling_170_180:
  15313. COEFF=(UINT32*)&V_SCALING_170_180;
  15314. break;
  15315. case VCOEFF_Scaling_180_190:
  15316. COEFF=(UINT32*)&V_SCALING_180_190;
  15317. break;
  15318. case VCOEFF_Scaling_190_200:
  15319. COEFF=(UINT32*)&V_SCALING_190_200;
  15320. break;
  15321. case VCOEFF_Scaling_200_250:
  15322. COEFF=(UINT32*)&V_SCALING_200_250;
  15323. break;
  15324. case VCOEFF_Scaling_250_300:
  15325. COEFF=(UINT32*)&V_SCALING_250_300;
  15326. break;
  15327. case VCOEFF_Scaling_300_350:
  15328. COEFF=(UINT32*)&V_SCALING_300_350;
  15329. break;
  15330. case VCOEFF_Scaling_350_400:
  15331. COEFF=(UINT32*)&V_SCALING_350_400;
  15332. break;
  15333. default: //case VCOEFF_Scaling_195_250 COEFF=(DWORD*)&V_SCALING_UP;
  15334. break;
  15335. }
  15336. if(flag_noscaling_V==0)
  15337. {
  15338. for(i=0;i<=32;i++)
  15339. mips1_MIR_word_coeff_group_nodelay( i, COEFF[3*i+0], COEFF[3*i+1], COEFF[3*i+2]);
  15340. }
  15341. else
  15342. {
  15343. mips1_MIR_word_coeff_group_nodelay( 0, 0, 0x10000000, 0); //??
  15344. }
  15345. }//load_coeff_table~
  15346. void PQ_MIR_FillNewCoefficient(UINT8 V_COEFF_TYPE)
  15347. {
  15348. load_MIR_coeff_table_nodelay((UINT8)0,V_COEFF_TYPE);
  15349. }
  15350. void PQ_MIR_Decide_Coefficient_Table(UINT32 Hfactor)
  15351. {
  15352. UINT8 V_COEFF_TYPE=0;
  15353. V_COEFF_TYPE=HCOEFF_NoScaling;
  15354. if(Hfactor<2048) V_COEFF_TYPE=VCOEFF_ScalingUP;
  15355. else if(Hfactor==2048) V_COEFF_TYPE=HCOEFF_NoScaling;
  15356. else if((Hfactor>2048)&&(Hfactor<=2253)) V_COEFF_TYPE=VCOEFF_Scaling_100_110;
  15357. else if((Hfactor>2253)&&(Hfactor<=2458)) V_COEFF_TYPE=VCOEFF_Scaling_110_120;
  15358. else if((Hfactor>2458)&&(Hfactor<=2662)) V_COEFF_TYPE=VCOEFF_Scaling_120_130;
  15359. else if((Hfactor>2662)&&(Hfactor<=2867)) V_COEFF_TYPE=VCOEFF_Scaling_130_140;
  15360. else if((Hfactor>2867)&&(Hfactor<=3072)) V_COEFF_TYPE=VCOEFF_Scaling_140_150;
  15361. else if((Hfactor>3072)&&(Hfactor<=3277)) V_COEFF_TYPE=VCOEFF_Scaling_150_160;
  15362. else if((Hfactor>3277)&&(Hfactor<=3482)) V_COEFF_TYPE=VCOEFF_Scaling_160_170;
  15363. else if((Hfactor>3482)&&(Hfactor<=3686)) V_COEFF_TYPE=VCOEFF_Scaling_170_180;
  15364. else if((Hfactor>3686)&&(Hfactor<=3891)) V_COEFF_TYPE=VCOEFF_Scaling_180_190;
  15365. else if((Hfactor>3891)&&(Hfactor<=4096)) V_COEFF_TYPE=VCOEFF_Scaling_190_200;
  15366. else if((Hfactor>4096)&&(Hfactor<=5120)) V_COEFF_TYPE=VCOEFF_Scaling_200_250;
  15367. else if((Hfactor>5120)&&(Hfactor<=6144)) V_COEFF_TYPE=VCOEFF_Scaling_250_300;
  15368. else if((Hfactor>6144)&&(Hfactor<=7168)) V_COEFF_TYPE=VCOEFF_Scaling_300_350;
  15369. else if(Hfactor>7168) V_COEFF_TYPE=VCOEFF_Scaling_350_400;
  15370. VIPDebugPrint("%s:Hfactor = %d, V_COEFF_TYPE = %d",__FUNCTION__, Hfactor, V_COEFF_TYPE);
  15371. //==============Fill Coefficient===============
  15372. PQ_MIR_FillNewCoefficient(V_COEFF_TYPE);
  15373. //======================================================================
  15374. }
  15375. #endif
  15376. // (1) re caculate PWM period by PWM freq (2) re caculate LCDBackLightMap
  15377. void PQ_SETPWMFreq(UINT32 PWMFreq)
  15378. {
  15379. //#ifndef CONFIG_PANEL_ADJ_INVERT
  15380. PBRVIP_FLASH brvip_flash_p = (PBRVIP_FLASH)SPI_PANELSET_SHADOWADDR;
  15381. //#endif
  15382. UINT32 nBLBase;
  15383. UINT32 dwBackLightAddrPeroid;
  15384. UINT32 dwBackLightAddr= 0;
  15385. UINT32 nPeroidmmiVale, nBackLightmmiVale;
  15386. UINT8 i;
  15387. UINT32 mapValue = 0;
  15388. UINT16 uwMaxduty, uwMinduty;
  15389. //get duty
  15390. #ifdef CONFIG_SUPPORT_PWMFrequency_SaveIn_FactoryMode
  15391. ptv_base_t ptvdev = getptvdev();
  15392. ptvdev->pBootRomShareData->PwmFreq = PWMFreq;
  15393. ptvdev->bflashsetting = TRUE;
  15394. #endif
  15395. dwBackLightAddrPeroid = REG_ADR1_PWM0_BACKLIGHT + (PQ_GetPanelPWMNum() * 8);
  15396. nPeroidmmiVale = *((UINT32 *)(dwBackLightAddrPeroid));
  15397. dwBackLightAddr= REG_ADR2_PWM0_BACKLIGHT + PQ_GetPanelPWMNum() * 8;
  15398. nBackLightmmiVale = *((UINT32 *)(dwBackLightAddr)) & 0xfffffff;
  15399. //nDutyValue = nBackLightmmiVale*100/nPeroidmmiVale;
  15400. if(PWMFreq <= 0)//check PWMFreq vaild
  15401. PWMFreq = 1;
  15402. //1.duty first 0
  15403. //*((UINT32 *)(dwBackLightAddr))= 0;
  15404. //2.set freq
  15405. nBLBase = REFCLK*1000/PWMFreq;
  15406. *((UINT32 *)(dwBackLightAddrPeroid)) = nBLBase-1;
  15407. //3.set duty
  15408. *((UINT32 *)(dwBackLightAddr)) = 0; // reset PWM
  15409. if((nPeroidmmiVale*PWMFreq) > 0)
  15410. {
  15411. mapValue = REFCLK*1000*nBackLightmmiVale/(nPeroidmmiVale*PWMFreq) | 0x80000000;
  15412. }
  15413. //*((UINT32 *)(dwBackLightAddr)) = mapValue | 0x80000000;
  15414. PQ_ChangeBackLight(mapValue, 1);
  15415. PQ_get_PWM_Duty(&uwMaxduty, &uwMinduty);
  15416. #if 0//def CONFIG_PANEL_ADJ_INVERT
  15417. #ifdef CONFIG_SUPPORT_PWM_DUTY_IN_DECIMAL
  15418. LCDBackLightMap[0] = nBLBase*uwMaxduty/1000;
  15419. LCDBackLightMap[14] = nBLBase*uwMinduty/1000;
  15420. #else
  15421. LCDBackLightMap[0] = nBLBase*uwMaxduty/100;
  15422. LCDBackLightMap[14] = nBLBase*uwMinduty/100;
  15423. #endif
  15424. for (i = 0; i< 15; i++)
  15425. {
  15426. LCDBackLightMap[i] = LCDBackLightMap[0]-(LCDBackLightMap[0]-LCDBackLightMap[14])*i/14;
  15427. }
  15428. #else
  15429. if(brvip_flash_p->LCDBackLight_Order)
  15430. {
  15431. #ifdef CONFIG_SUPPORT_PWM_DUTY_IN_DECIMAL
  15432. LCDBackLightMap[0] = nBLBase*uwMaxduty/1000;
  15433. LCDBackLightMap[14] = nBLBase*uwMinduty/1000;
  15434. #else
  15435. LCDBackLightMap[0] = nBLBase*uwMaxduty/100;
  15436. LCDBackLightMap[14] = nBLBase*uwMinduty/100;
  15437. #endif
  15438. for (i = 0; i< 15; i++)
  15439. {
  15440. LCDBackLightMap[i] = LCDBackLightMap[0]-(LCDBackLightMap[0]-LCDBackLightMap[14])*i/14;
  15441. }
  15442. }
  15443. else
  15444. {
  15445. #ifdef CONFIG_SUPPORT_PWM_DUTY_IN_DECIMAL
  15446. LCDBackLightMap[14] = nBLBase*uwMaxduty/1000;
  15447. LCDBackLightMap[0] = nBLBase*uwMinduty/1000;
  15448. #else
  15449. LCDBackLightMap[14] = nBLBase*uwMaxduty/100;
  15450. LCDBackLightMap[0] = nBLBase*uwMinduty/100;
  15451. #endif
  15452. for (i = 0; i< 15; i++)
  15453. {
  15454. LCDBackLightMap[i] = LCDBackLightMap[0]+(LCDBackLightMap[14]-LCDBackLightMap[0])*i/14;
  15455. //myprintk("after LCDBackLightMap[%d] = 0x%x", i, LCDBackLightMap[i]);
  15456. }
  15457. }
  15458. #endif
  15459. #ifdef DYNAMIC_BACKLIGHT
  15460. PQ_InitDynamicBackLight();
  15461. #endif
  15462. }
  15463. UINT32 PQ_GETCurrPWMFreq(void)
  15464. {
  15465. UINT32 dwBackLightAddrPeroid;
  15466. UINT32 nBLBase, uiPWMFreq;
  15467. dwBackLightAddrPeroid = REG_ADR1_PWM0_BACKLIGHT + (PQ_GetPanelPWMNum() * 8);
  15468. nBLBase = *((UINT32 *)(dwBackLightAddrPeroid));
  15469. if(nBLBase == 0)
  15470. nBLBase = 1;
  15471. uiPWMFreq = REFCLK*1000/nBLBase;
  15472. return uiPWMFreq;
  15473. }
  15474. UINT32 PQ_GETCurrPWM(void)
  15475. {
  15476. UINT32 dwBackLightAddr;
  15477. UINT32 nBLBase;
  15478. dwBackLightAddr= REG_ADR2_PWM0_BACKLIGHT + PQ_GetPanelPWMNum() * 8;
  15479. nBLBase = *((UINT32 *)(dwBackLightAddr)) & 0xfffffff;
  15480. if(nBLBase == 0)
  15481. nBLBase = 1;
  15482. return nBLBase;
  15483. }
  15484. void PQ_SetPWMOff(BOOL bStatus)
  15485. {
  15486. PQHW_CONTEXT* pHwContext= &PQHwContext;
  15487. pHwContext->bPWMOff = bStatus;
  15488. }
  15489. UINT32 PQ_GETCurrDutyPWM(void)
  15490. {
  15491. UINT32 dwBackLightAddrPeroid;
  15492. UINT32 dwBackLightAddr= 0;
  15493. UINT32 nPeroidmmiVale, nBackLightmmiVale,nDutyValue = 0;
  15494. dwBackLightAddrPeroid = REG_ADR1_PWM0_BACKLIGHT + (PQ_GetPanelPWMNum() * 8);
  15495. nPeroidmmiVale = *((UINT32 *)(dwBackLightAddrPeroid));
  15496. dwBackLightAddr= REG_ADR2_PWM0_BACKLIGHT + PQ_GetPanelPWMNum() * 8;
  15497. nBackLightmmiVale = *((UINT32 *)(dwBackLightAddr)) & 0xfffffff;
  15498. if(nPeroidmmiVale > 0)
  15499. {
  15500. #ifdef CONFIG_SUPPORT_PWM_DUTY_IN_DECIMAL
  15501. nDutyValue = nBackLightmmiVale*1000/nPeroidmmiVale;
  15502. #else
  15503. nDutyValue = nBackLightmmiVale*100/nPeroidmmiVale;
  15504. #endif
  15505. }
  15506. return nDutyValue;
  15507. }
  15508. void PQ_SETCurrDutyPWM(UINT16 uwDuty)
  15509. {
  15510. UINT32 dwBackLightAddrPeroid;
  15511. UINT32 nPeroidmmiVale, nPWMValue;
  15512. dwBackLightAddrPeroid = REG_ADR1_PWM0_BACKLIGHT + (PQ_GetPanelPWMNum() * 8);
  15513. nPeroidmmiVale = *((UINT32 *)(dwBackLightAddrPeroid));
  15514. #ifdef CONFIG_SUPPORT_PWM_DUTY_IN_DECIMAL
  15515. nPWMValue = nPeroidmmiVale*uwDuty/1000;
  15516. if(uwDuty != 0 && nPWMValue == 0)
  15517. {
  15518. nPWMValue = 0x1;
  15519. }
  15520. #else
  15521. nPWMValue = nPeroidmmiVale*uwDuty/100;
  15522. #endif
  15523. PQ_SetRealBackLight(nPWMValue);
  15524. }
  15525. UINT32 PQ_GETCurrPolarity(void)
  15526. {
  15527. UINT32 uiPolarity;
  15528. //#ifndef CONFIG_PANEL_ADJ_INVERT
  15529. PBRVIP_FLASH brvip_flash_p = (PBRVIP_FLASH)SPI_PANELSET_SHADOWADDR;
  15530. //#endif
  15531. #if 0//def CONFIG_PANEL_ADJ_INVERT
  15532. uiPolarity = 1;
  15533. #else
  15534. uiPolarity = brvip_flash_p->LCDBackLight_Order;
  15535. #endif
  15536. return uiPolarity;
  15537. }
  15538. /****************************************************************************
  15539. * Function : PQ_GETCurrElectricity
  15540. * Params : n/a
  15541. * Description: get the PWM value and mapping to electricity table
  15542. * Returns : return the mapping electricity value
  15543. ****************************************************************************/
  15544. UINT32 PQ_GETCurrElectricity(void)
  15545. {
  15546. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  15547. UINT32 i;
  15548. UINT32 dwcurrentDuty;
  15549. dwcurrentDuty = PQ_GETCurrDutyPWM();
  15550. for(i = 0; i < pDBL->Electricity_PWM_table_Size; i++)
  15551. {
  15552. if(pDBL->pElectricity_PWM_table[i].PWM_Value == dwcurrentDuty)
  15553. {
  15554. return pDBL->pElectricity_PWM_table[i].Electity_Value;
  15555. }
  15556. }
  15557. return 0;
  15558. }
  15559. UINT8 PQ_GetPanelPWMNum(void)
  15560. {
  15561. CUSTIMIZATION_TABLEPTR pCustimizationBase= (CUSTIMIZATION_TABLEPTR) SPI_OPTIONDATA_SHADOWADDR;
  15562. #ifdef CONFIG_PANEL_ADJ_AS_GPIO
  15563. return pCustimizationBase->PanelBackLightGPIONum;
  15564. #else
  15565. return pCustimizationBase->PanelPWMNum;
  15566. #endif
  15567. }
  15568. //****************************************************************************
  15569. //
  15570. // Function : PQ_SetFilmMode
  15571. // Params :
  15572. // Description: Enable/Disable 2:2 pulldown or 2:3 pulldown detection
  15573. // Returns : void
  15574. //****************************************************************************
  15575. void PQ_SetFilmMode(UINT8 ucEnable)
  15576. {
  15577. UINT32 vdi_hsize_i,vdi_vsize,vdi_total;
  15578. vdi_hsize_i= VIP_GetScalerPreScaleH(); //= (reg_adix_che-reg_adix_chs) * 2048 / reg_slr_hfactor
  15579. vdi_vsize= PQ_Get_VDI_VSize(); //= reg_adix_cve-reg_adix_cvs
  15580. vdi_total= vdi_hsize_i*vdi_vsize;
  15581. if( ucEnable)
  15582. {
  15583. PQ_RegisterWrite(VIP_reg_vdi_32qual_22result, 0);
  15584. if(VIP_GetUserSource() == SOURCE_CVD2 && VIP_IsAVSource())//KW request 2012/11/06
  15585. {
  15586. PQ_RegisterWrite(VIP_reg_vdi_combcnt_fm_same_thd, 0x450);
  15587. PQ_RegisterWrite(VIP_reg_vdi_combcnt_hm_fs_thd, 0x450);
  15588. }
  15589. else
  15590. {
  15591. PQ_RegisterWrite(VIP_reg_vdi_combcnt_fm_same_thd, vdi_total/115);
  15592. PQ_RegisterWrite(VIP_reg_vdi_combcnt_hm_fs_thd, vdi_total/58);
  15593. }
  15594. }
  15595. else
  15596. {
  15597. PQ_RegisterWrite(VIP_reg_vdi_32qual_22result, 1);
  15598. PQ_RegisterWrite(VIP_reg_vdi_combcnt_fm_same_thd, 0x5);
  15599. PQ_RegisterWrite(VIP_reg_vdi_combcnt_hm_fs_thd, 0x5);
  15600. }
  15601. }
  15602. /*******************************************************************
  15603. // function name : PQ_SetNotFullScreenPatchStatus & PQ_GetNotFullScreenPatchStatus
  15604. // input parameter : bStatus : if not full screen, set true
  15605. // output parameter : none
  15606. // purpose : patch for 131 sharpness bug, HW will fix it next chip
  15607. // return : none
  15608. *******************************************************************/
  15609. void PQ_SetNotFullScreenPatchStatus(BOOL bStatus)
  15610. {
  15611. PQHW_CONTEXT* pHwContext= &PQHwContext;
  15612. pHwContext->bNotFullScreen = bStatus;
  15613. PQ_RegisterWrite(VIP_reg_dpy_filter_chroma, bStatus);
  15614. PQ_PeakingFilterSetup();
  15615. }
  15616. UINT8 PQ_GetNotFullScreenPatchStatus(void)
  15617. {
  15618. PQHW_CONTEXT* pHwContext= &PQHwContext;
  15619. return pHwContext->bNotFullScreen;
  15620. }
  15621. UINT32 PQ_Get_VDI_VSize(void)
  15622. {
  15623. UINT8 ucInterlaceMode;
  15624. UINT32 vdi_vsize;
  15625. ucInterlaceMode = VIP_GetInterlaceMode();
  15626. if(ucInterlaceMode < 2)
  15627. {
  15628. vdi_vsize = VIP_GetlInputCaptureVSize()>>ucInterlaceMode;
  15629. return vdi_vsize;
  15630. }
  15631. else
  15632. {
  15633. return 0;
  15634. }
  15635. }
  15636. void PQ_SetColorCross(BOOL ucEnable)
  15637. {
  15638. if(ucEnable == DISABLE)
  15639. {
  15640. PQ_RegisterWrite(VIP_REG_H602F_CROSS, 0);
  15641. return;
  15642. }
  15643. if(VIP_GetInputVSize()==576 && VIP_GetInterlaceMode()==TRUE)
  15644. {
  15645. PQ_RegisterWrite(VIP_REG_H602F_CROSS, 0xf);
  15646. }
  15647. else
  15648. {
  15649. PQ_RegisterWrite(VIP_REG_H602F_CROSS, 0x3);
  15650. }
  15651. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_VCOMB_Y, 0x20);
  15652. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_TOGGLE_MAX, 0x48);
  15653. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_TOGGLE_MIN, 0x4);
  15654. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_TOGGLE_GAIN, 0x40);
  15655. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_TOGGLE_GAIN_C, 0x80);
  15656. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_TOGGLE_DIV_C, 0x8);
  15657. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_TC_MAX, 0xc0);
  15658. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_TC_INC, 0x3);
  15659. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_TC_DEC0, 0x1);
  15660. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_TC_DEC1, 0x2);
  15661. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_TC_DEC2, 0x8);
  15662. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_TC_DEC3, 0x10);
  15663. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_TC_DEC4, 0x14);
  15664. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_TC_DEC5, 0x18);
  15665. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_TC_DEC6, 0x20);
  15666. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_ALPHA_SUB, 0x5);
  15667. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_ALPHA_MUL, 0x8);
  15668. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_ALPHA_DIV, 0x5);
  15669. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_ALPHA_MAX, 0x20);
  15670. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_TOGGLE_MAX, 210);
  15671. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_TOGGLE_MIN, 0x10);
  15672. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_TC_MAX, 192);
  15673. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_TC_INC0, 0x3);
  15674. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_TC_INC1, 0x2);
  15675. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_TC_INC2, 0x1);
  15676. mips1_byte_nodelay( 0xbe1c6095, 0x1);
  15677. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_TC_DEC0, 0x1);
  15678. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_TC_DEC1, 0x2);
  15679. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_TC_DEC2, 0x8);
  15680. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_TC_DEC3, 0x10);
  15681. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_TC_DEC4, 0x14);
  15682. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_TC_DEC5, 0x18);
  15683. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_TC_DEC6, 0x20);
  15684. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_ALPHA_SUB, 0x5);
  15685. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_ALPHA_MUL, 0x8);
  15686. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_ALPHA_DIV, 0x5);
  15687. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_ALPHA_MAX, 0x20);
  15688. mips1_byte_nodelay( 0xbe1c60bf, 0x11); //no used any more
  15689. PQ_RegisterWrite(VIP_REG_VDI_CROSSYC_FD_CHG_THD_CUR, 0x1ffff);
  15690. PQ_RegisterWrite(VIP_REG_VDI_CROSSYC_FD_CHG_MBW_THD, 0xffff);
  15691. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_HPY_THR, 0);
  15692. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_HPY_DEC, 0x4);
  15693. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_STDY_THR, 0x21f);
  15694. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_STDC_THR, 0);
  15695. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_STDY_THR1, 0xff);
  15696. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_STDC_THR1, 0);
  15697. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_OPTION, 0xe);
  15698. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_TC_INC3, 0);
  15699. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_TC_INC4, 0x1);
  15700. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_CHROMA_DIF, 0);
  15701. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_CHROMA_SLP, 0);
  15702. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_HPC_THR, 0);
  15703. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_HPC_DEC, 0);
  15704. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_HPY_THR, 0);
  15705. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_HPY_DEC, 0);
  15706. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_STDY_THR, 0);
  15707. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_STDC_THR, 0x21f);
  15708. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_STDY_THR1, 0);
  15709. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_STDC_THR1, 0x1);
  15710. PQ_RegisterWrite(VIP_REG_VDI_Y2C_CTL, 0x1);
  15711. PQ_RegisterWrite(VIP_REG_VDI_C2Y_CTL, 0x1);
  15712. PQ_RegisterWrite(VIP_REG_VDI_Y2C_FC_TH, 0x68);
  15713. PQ_RegisterWrite(VIP_REG_VDI_Y2C_CMOT_DEC, 0x6);
  15714. PQ_RegisterWrite(VIP_REG_VDI_Y2C_CMOT_TH, 0x60);
  15715. PQ_RegisterWrite(VIP_REG_VDI_Y2C_SAT_TH, 0xa);
  15716. PQ_RegisterWrite(VIP_REG_VDI_C2Y_SAT_TH, 0x10);
  15717. PQ_RegisterWrite(VIP_REG_VDI_C2Y_LSAT_DEC, 0);
  15718. }
  15719. void PQ_GetRGBGainAdjustModuleCmd(UINT8 *param)
  15720. {
  15721. #ifdef CONFIG_WHITE_BALANCE_ADJUST_IN_DPY_MATRIX
  15722. param[0] = 0;
  15723. #else
  15724. param[0] = 1;
  15725. #endif
  15726. }
  15727. void PQ_GetRGBGainParamCmd(RGB_GAIN *param)
  15728. {
  15729. #ifdef CONFIG_WHITE_BALANCE_ADJUST_IN_DPY_MATRIX
  15730. RGBGain_Param[0].RGBGain[0] = 1024;
  15731. RGBGain_Param[0].RGBGain[1] = 1024;
  15732. RGBGain_Param[0].RGBGain[2] = 1024;
  15733. #else
  15734. PQHW_CONTEXT* pHwContext= &PQHwContext;
  15735. RGBGain_Param[0].RGBGain[0] = pHwContext->iRGain;
  15736. RGBGain_Param[0].RGBGain[1] = pHwContext->iGGain;
  15737. RGBGain_Param[0].RGBGain[2] = pHwContext->iBGain;
  15738. #endif
  15739. *param = RGBGain_Param[0];
  15740. //*param = SWDC_Param[0];
  15741. }
  15742. /**
  15743. * @brief reset the memory data for cross luma/chroma
  15744. *
  15745. * This function reset cross luma\chroma related data in memory, to resolved function
  15746. * delay 1-2 sec after scene change. resume the function after 3 frame
  15747. *
  15748. * @param bReset, 1 for reset memory data, 0 for recover setting
  15749. * @return n/a
  15750. */
  15751. void PQ_ResetColorCrossMemData(BOOL bReset)
  15752. {
  15753. if(bReset)
  15754. {
  15755. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_TC_MAX, 0);
  15756. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_TC_MAX, 0);
  15757. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_ALPHA_MAX, 0);
  15758. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_ALPHA_MAX, 0);
  15759. }
  15760. else
  15761. {
  15762. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_TC_MAX, 0xc0);
  15763. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_TC_MAX, 192);
  15764. PQ_RegisterWrite(VIP_REG_VDI_CROSS2Y_ALPHA_MAX, 0x20);
  15765. PQ_RegisterWrite(VIP_REG_VDI_CROSS2C_ALPHA_MAX, 0x20);
  15766. }
  15767. }
  15768. BOOL PQ_CheckCvd2NonSTDStatus(void)
  15769. {
  15770. #ifdef DRV_ENABLE_CVD2
  15771. UINT8 CVD2LockStatus = 0;
  15772. cvd2_TypeSigSTD CVD2_Non_standard;
  15773. UINT8 ucUserSource, ucSubSource;
  15774. VIP_GetSource(&ucUserSource, &ucSubSource);
  15775. if(ucUserSource != SOURCE_CVD2)
  15776. {
  15777. return FALSE;
  15778. }
  15779. DRV_CVD2_Get_LockStatus(&CVD2LockStatus);
  15780. if((CVD2LockStatus & (hlock|vlock) )== (hlock|vlock))
  15781. {
  15782. DRV_CVD2_CheckNonSTDStatus(&CVD2_Non_standard); //0x1
  15783. if(CVD2_Non_standard.horizontal_nSTD || CVD2_Non_standard.vertical_nSTD)
  15784. {
  15785. return TRUE;
  15786. }
  15787. }
  15788. #endif
  15789. return FALSE;
  15790. }
  15791. void PQ_SetJPEGDisplayModePatch(UINT8 ucDisplayMode)
  15792. {
  15793. PQHW_CONTEXT* pHwContext= &PQHwContext;
  15794. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  15795. if(ucDisplayMode == VIP_THUMBNAIL)
  15796. {
  15797. pHwContext->PqPatch.Post2DPatch = POST_2D_SHARPNESS_JPEG_THUMBNAIL_PATCH;
  15798. pHwContext->PqPatch.PostDLTIPatch = POST_DLTI_JPEG_THUMBNAIL_PATCH;
  15799. pHwContext->PqPatch.DPYSharpnessPatch = DPY_SHARPNESS_JPEG_THUMBNAIL_PATCH;
  15800. }
  15801. else
  15802. {
  15803. pHwContext->PqPatch.Post2DPatch = POST_2D_SHARPNESS_DEFAULT;
  15804. pHwContext->PqPatch.PostDLTIPatch = POST_DLTI_DEFAULT;
  15805. pHwContext->PqPatch.DPYSharpnessPatch = DPY_SHARPNESS_DEFAULT;
  15806. }
  15807. PQ_Sharpness_POST_2D(TRUE, pMenuValue->iSharpness);
  15808. PQ_Sharpness_POSTDLTI(TRUE, pMenuValue->iSharpness);
  15809. PQ_DPYSharpness(TRUE, pMenuValue->iSharpness);
  15810. }