pq_hw.c 497 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788
  1. #include "osdef.h" //joshua check
  2. #include <linux/delay.h>
  3. #include <linux/types.h>
  4. #include "pq_hw.h"
  5. #include "../../vip/533/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. #define VIP_DBL_INVALID_WHITE_LEVEL 0xffffffff
  17. PQHW_CONTEXT PQHwContext;
  18. struct work_struct WQ_NRAdjust, WQ_SWDC, WQ_ColorBarDetect;
  19. struct workqueue_struct *WQ_Struct_NRAdjust, *WQ_Struct_SWDC, *WQ_Struct_ColorBarDetect;
  20. #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,8)
  21. DEFINE_SEMAPHORE(LutTableLock);
  22. #else
  23. DECLARE_MUTEX (LutTableLock);
  24. #endif
  25. UINT8 utempSharpnesscValue;
  26. UINT8 utempCheckColorbarDTFunctionEN;
  27. UINT8 ucTempColorBarSaturation;
  28. UINT8 ucTempds_disable_func_en;
  29. UINT8 ucTempDCCSceneID;
  30. //#ifdef VIP_SW_DC
  31. #if 1
  32. UINT8 DLC_Source=0;
  33. //==================DLC TABLE START==========================
  34. //extern ST_SWDC_Slope PQ_SWDC_HistSlop[];
  35. //extern ST_SWDC_Chroma PQ_SWDC_HistChroma[];
  36. //extern ST_SWDC_Param PQ_SWDC_Param[];
  37. //extern ST_SWDC_Param SWDC_Param[];
  38. //extern ST_SWDC_Slope SWDC_HistSlop[];
  39. //extern ST_SWDC_Chroma SWDC_HistChroma[];
  40. extern ST_SWDC_Slope SWDC_HistSlop[];
  41. extern ST_SWDC_Chroma SWDC_HistChroma[];
  42. extern ST_SWDC_Param SWDC_Param[];
  43. //===================DLC TABLE END===========================
  44. #endif
  45. #ifdef DYNAMIC_BACKLIGHT
  46. #define VIP_DBL_LEVEL_DEGREE 256
  47. #define VIP_DBL_FRAME_INTERVAL 16
  48. #define VIP_DBL_FRAME_INTERVAL_MASK 0xf
  49. #define VIP_DBL_STATUS_NONE 0
  50. #define VIP_DBL_STATUS_DETECTING 1
  51. #define VIP_DBL_STATUS_ENTERING 2
  52. #define VIP_DBL_STATUS_KEEPING 3
  53. #define VIP_DBL_STATUS_LEAVING 4
  54. #define VIP_DBL_STATUS_DETECTING_WHITE_ENTERING 5
  55. #define VIP_DBL_INVALID_WHITE_LEVEL 0xffffffff
  56. #define VIP_DBL_WHITE_PATTERN_BRIGHTING
  57. DYNAMIC_BACKLIGHT_PARAM g_DynamicBackLight;//= {0, 0, 0, 0, 0, 0, 0, 25, 51, 192, 217, 144, FALSE, {0}};
  58. extern UINT32 LCDBackLightMap[15];
  59. extern const UINT16 LUT17x17DefAngle[17][17];
  60. extern const UINT16 LUT17x17DefSat[17][17];
  61. #endif //#ifdef DYNAMIC_BACKLIGHT
  62. extern BOOL VIP_IsJPEGSource(void);
  63. extern INT32 GetCustomerData(INT8 *pcTableName, INT8 **tablestart, UINT32 *tablesize);
  64. UINT8 check_usr_curve_setup_ok(void)
  65. {
  66. PQHW_CONTEXT* pHwContext= &PQHwContext;
  67. if((pHwContext->UserCurveSetup==0)&&(pHwContext->UserCurveInit==0))
  68. return (1);
  69. else return (0);
  70. }
  71. void PQ_HWDestroyWorkqueue(void)
  72. {
  73. cancel_work_sync(&WQ_NRAdjust);
  74. cancel_work_sync(&WQ_SWDC);
  75. cancel_work_sync(&WQ_ColorBarDetect);
  76. }
  77. UINT8 PQ_CheckSpecialRegister(UINT32 ulReg)
  78. {
  79. UINT8 Check;
  80. if((ulReg>>28) == 0 )//vip register
  81. {
  82. if( (ulReg&0xffff) == 0xc084 || //gamma
  83. (ulReg&0xffff) == 0xc184 || //lut
  84. (ulReg&0xffff) == 0xd062 || //vip coefficient table
  85. (ulReg&0xffff) == 0xd064 ||
  86. (ulReg&0xffff) == 0xd068 ||
  87. (ulReg&0xffff) == 0xd06c ||
  88. (ulReg&0xf000ffff) == 0xd060 || //vip coefficient table
  89. (ulReg&0xf000ffff) == 0xd064 ||
  90. (ulReg&0xf000ffff) == 0xd068 ||
  91. (ulReg&0xf000ffff) == 0xd06c
  92. )
  93. Check = TRUE;
  94. else
  95. Check = FALSE;
  96. }
  97. else
  98. Check = FALSE;
  99. return Check;
  100. }
  101. UINT32 PQ_GetRegisterType(UINT32 ulRegisterType)
  102. {
  103. switch(ulRegisterType)
  104. {
  105. case 0:
  106. return 0xBE1C0000;
  107. case 0x10000000:
  108. return 0xBE000000;
  109. case 0x20000000:
  110. return 0xBE2c0000;
  111. case 0x30000000:
  112. return 0xBE2d0000;
  113. default:
  114. return 0xBE1C0000;
  115. }
  116. }
  117. void PQ_DelayMS(UINT32 ulDelayMS )
  118. {
  119. if( irq_count() || in_atomic() )
  120. { //for TY request
  121. mdelay(ulDelayMS);
  122. }
  123. else
  124. {
  125. msleep(ulDelayMS);
  126. }
  127. }
  128. void PQ_DelayUS(UINT32 ulDelayUS )
  129. {
  130. udelay(ulDelayUS);
  131. }
  132. //****************************************************************************
  133. //
  134. // Function : PQ_RegisterWrite
  135. // Params : ulRegisterName -address of the index register
  136. // ulValue - value to program to the given bits of the register
  137. // Description: Sets the given bits of the given index register to the given value
  138. // ulRegisterName data format: TTTT WWWW WWSS SSSS AAAA AAAA AAAA AAAA
  139. // 0:reserved
  140. // T:register type 0000=VIP_register (offset 0xBE1C)
  141. // W:register used width
  142. // S:register start bit
  143. // A:register address
  144. // Returns : void
  145. //****************************************************************************
  146. void PQ_RegisterWrite(UINT32 ulRegisterName, UINT32 ulValue)
  147. {
  148. UINT32 ulData, ulBitMask, ulRegisterType;
  149. //if((ulRegisterName&0xffff)==0x0044 || (ulRegisterName&0xffff)==0x0045 || (ulRegisterName&0xffff)==0x0048)
  150. // PQDebugPrint("*****reg = 0x%lx, value = 0x%lx", ulRegisterName, ulValue);
  151. if(PQ_CheckSpecialRegister(ulRegisterName))
  152. {
  153. //sepcial register (ex lut, gamma table, coefficient table )
  154. ulRegisterType = PQ_GetRegisterType(ulRegisterName & REGISTER_TYPE_MASK);
  155. ulRegisterName &= REGISTER_ADDRESS_MASK;
  156. ulRegisterName |= ulRegisterType; //offset address
  157. *((volatile UINT32 *)(ulRegisterName)) = ulValue;
  158. //PQ_ADVANCE_HWPrint("reg(0x%lx) = 0x%lx", ulRegisterName, ulValue);
  159. }
  160. else if ( PQ_GetStartAndEndBits(ulRegisterName) <= WIDTH_BIT_8 )
  161. {
  162. ulBitMask = GET_VALUE_BITS(ulRegisterName, 0xFFFFFFFF);
  163. ulBitMask <<= PQ_GetRegisterStartBit(ulRegisterName);
  164. ulValue <<= PQ_GetRegisterStartBit(ulRegisterName);
  165. ulRegisterType = PQ_GetRegisterType(ulRegisterName & REGISTER_TYPE_MASK);
  166. ulRegisterName &= REGISTER_ADDRESS_MASK;
  167. ulRegisterName |= ulRegisterType; //offset address
  168. if(ulRegisterName%4)
  169. ulData = *((volatile UINT8*)(ulRegisterName));
  170. else
  171. ulData = *((volatile UINT32*)(ulRegisterName));
  172. ulData &= ~ulBitMask;
  173. ulData |= (ulValue & ulBitMask);
  174. if(ulRegisterName%4)
  175. *((volatile UINT8*)(ulRegisterName)) = ulData;
  176. else
  177. *((volatile UINT32*)(ulRegisterName)) = ulData;
  178. }
  179. else
  180. {
  181. ulBitMask = GET_VALUE_BITS(ulRegisterName, 0xFFFFFFFF);
  182. ulBitMask <<= PQ_GetRegisterStartBit(ulRegisterName);
  183. ulValue <<= PQ_GetRegisterStartBit(ulRegisterName);
  184. ulRegisterType = PQ_GetRegisterType(ulRegisterName & REGISTER_TYPE_MASK);
  185. ulRegisterName &= REGISTER_ADDRESS_MASK;
  186. ulRegisterName |= ulRegisterType; //offset address
  187. ulData = *((volatile UINT32*)(ulRegisterName));
  188. ulData &= ~ulBitMask;
  189. ulData |= (ulValue & ulBitMask);
  190. *((volatile UINT32 *)(ulRegisterName)) = ulData;
  191. }
  192. return;
  193. }
  194. //****************************************************************************
  195. //
  196. // Function : PQ_RegisterRead
  197. // Params : ulRegisterName -address of the index register
  198. // Description: read the given bits of the given index register to the value
  199. // ulRegisterName data format: TTTT WWWW WWSS SSSS AAAA AAAA AAAA AAAA
  200. // 0:reserved
  201. // T:register type 0000=VIP_register (offset 0xBE1C)
  202. // W:register used width
  203. // S:register start bit
  204. // A:register address
  205. // Returns : register data
  206. //****************************************************************************
  207. UINT32 PQ_RegisterRead(UINT32 ulRegisterName )
  208. {
  209. UINT32 ulData, ulBitMask, ulRegisterType, ulRegisterNameTmp;
  210. ulRegisterNameTmp=ulRegisterName;
  211. ulRegisterType = PQ_GetRegisterType(ulRegisterName & REGISTER_TYPE_MASK);
  212. ulRegisterNameTmp &= REGISTER_ADDRESS_MASK;
  213. ulRegisterNameTmp |= ulRegisterType; //offset address
  214. ulData = *((UINT32 *)(ulRegisterNameTmp));
  215. if ( PQ_GetStartAndEndBits(ulRegisterName) != ALL_BITS ){
  216. ulBitMask = GET_VALUE_BITS(ulRegisterName, 0xFFFFFFFF);
  217. ulBitMask <<= PQ_GetRegisterStartBit(ulRegisterName);
  218. ulData &= ulBitMask;
  219. ulData >>= (PQ_GetRegisterStartBit(ulRegisterName));
  220. }
  221. return ulData;
  222. }
  223. void PQ_GammaCorrect(UINT8 ucGrayLevel)
  224. {
  225. PQDebugPrint( "%s: ucGrayLevel= %d", __FUNCTION__, ucGrayLevel);
  226. PQ_RegisterWrite(VIP_reg_dpy_matrix_fix_in_en, ENABLE);
  227. PQ_RegisterWrite(VIP_reg_dpy_matrix_bypass, ENABLE);
  228. PQ_RegisterWrite(VIP_reg_dpy_dpy_dtype, 0);
  229. // PQ_RegisterWrite(VIP_reg_dpy_444, 0);
  230. PQ_RegisterWrite(VIP_reg_pnl_ovsc_yc, ucGrayLevel);
  231. PQ_RegisterWrite(VIP_reg_pnl_ovsc_cb, ucGrayLevel);
  232. PQ_RegisterWrite(VIP_reg_pnl_ovsc_cr, ucGrayLevel);
  233. PQ_RegisterWrite(VIP_reg_pnl_ovsc_yc_lsb2, 0);
  234. PQ_RegisterWrite(VIP_reg_pnl_ovsc_cb_lsb2, 0);
  235. PQ_RegisterWrite(VIP_reg_pnl_ovsc_cr_lsb2, 0);
  236. }
  237. //****************************************************************************
  238. //
  239. // Function : PQ_ColorMatrixComp
  240. // Params :
  241. // Description: Calc ColorMatrix compensetion for brightness, bias, dpy_yppn and matrix_self_offset.
  242. // Note : C1, C2, C3 register range adjust to 16bit in 531 (330 is 12bit)
  243. // Returns : void
  244. //****************************************************************************
  245. void PQ_ColorMatrixComp(UINT8 bReset)
  246. {
  247. PQHW_CONTEXT* pHwContext= &PQHwContext;
  248. COLOR_MATRIX_COMP_INT *pColorMatrixC = (COLOR_MATRIX_COMP_INT *)&pHwContext->iColorMatrixC1;
  249. INT32 iBias[3];
  250. INT32 iYPPComp[3];
  251. INT32 *piCTBias = &pHwContext->iRBias;
  252. INT32 i, iIsYPPEn;
  253. UINT8 ucUserSource, ucSubSource;
  254. LONG LONG INT32 litemp; // due to the calc may be overfloe 32bits
  255. static UINT8 bStart = FALSE;
  256. if(!PQ_IsFadeEn())
  257. {
  258. if(bReset)
  259. {
  260. bStart = TRUE;
  261. return;
  262. }
  263. }
  264. if(bStart || PQ_IsFadeEn())
  265. {
  266. bStart = FALSE;
  267. VIP_GetSource(&ucUserSource, &ucSubSource);
  268. iIsYPPEn = PQ_RegisterRead(VIP_reg_dpy_ypp) && (ucUserSource != SOURCE_JPEG);
  269. for (i = 0; i < 3; i++){
  270. litemp = (LONG LONG INT32)pHwContext->CurColorMatrix->CSC_Value[i*3]*(pColorMatrixC[i].iValue-iIsYPPEn*COLOR_MATRIX_YPP_COMP_OFFSET);
  271. litemp = litemp>>(COLOR_MATRIX_GAIN_BIT_SYSTEM);
  272. iYPPComp[i] = litemp;
  273. iBias[i] = piCTBias[i]+(pHwContext->iBrightness)+iYPPComp[i];
  274. iBias[i] = max(-2048, min(2047, iBias[i]));
  275. }
  276. PQ_RegisterWrite(VIP_reg_dpy_matrix_c1, pHwContext->bEnableColorProcess?iBias[0]:pColorMatrixC[0].iValue);
  277. PQ_RegisterWrite(VIP_reg_dpy_matrix_c2, pHwContext->bEnableColorProcess?iBias[1]:pColorMatrixC[1].iValue);
  278. PQ_RegisterWrite(VIP_reg_dpy_matrix_c3, pHwContext->bEnableColorProcess?iBias[2]:pColorMatrixC[2].iValue);
  279. }
  280. }
  281. void PQ_SetColorMatrix(UINT8 ucEnable)
  282. {
  283. PQHW_CONTEXT* pHwContext= &PQHwContext;
  284. pHwContext->ucMatrixbypassCtl = ucEnable;
  285. PQ_RegisterWrite(VIP_reg_dpy_matrix_bypass,ucEnable);
  286. }
  287. //****************************************************************************
  288. //
  289. // Function : PQ_ColorTempBias
  290. // Params :
  291. // Description: Powers up/down the panel as per the given power sequence timings
  292. // Returns : void
  293. //****************************************************************************
  294. void PQ_ColorTempBias(PQ_COLOR_TEMP_BIAS ucType, INT32 iValue)
  295. {
  296. PQHW_CONTEXT* pHwContext= &PQHwContext;
  297. UINT8 ucIndex = 0; // detect the index => R = 0, G = 1, B = 2;
  298. if( pHwContext->bEnableColorProcess==FALSE )
  299. iValue= 0;
  300. //PQDebugPrint("%s: ucType=%d, iValue=%d", __FUNCTION__, ucType, iValue);
  301. switch(ucType){
  302. case PQ_CT_BIAS_R:
  303. ucIndex = 0;
  304. break;
  305. case PQ_CT_BIAS_G:
  306. ucIndex = 1;
  307. break;
  308. case PQ_CT_BIAS_B:
  309. ucIndex = 2;
  310. break;
  311. }
  312. *((&pHwContext->iRBias)+ucIndex) = iValue;
  313. PQ_ColorMatrixComp(TRUE);
  314. }
  315. //================================================================================
  316. // function name : PQ_SetupColorSpaceConversionTable
  317. // input parameter : cPath,cType
  318. // output parameter : none
  319. // purpose : setup color space conversion matrix
  320. // return : none
  321. void PQ_SetupColorSpaceConversionTable(void)
  322. {
  323. PQHW_CONTEXT* pHwContext= &PQHwContext;
  324. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  325. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  326. UINT32 * pColorSpaceTable = 0, * p601ColorSpaceTable = 0, * p709ColorSpaceTable = 0 ;
  327. BOOL bEnableEnhancedColor;
  328. UINT32 tmp = 0;
  329. INT32 i;
  330. UINT8 ucTableIndex;
  331. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  332. COLOR_MATRIX_DATA *pCOLOR_MATRIX_DATA;
  333. ucTableIndex = pVtab->mColorMatrix.mGroupedIndex[ucCurrSrcIndex];
  334. pCOLOR_MATRIX_DATA = &pVtab->mColorMatrix.mSrcColorMatrix[ucTableIndex];
  335. i = 0;
  336. PQ_ADVANCE_HWPrint("%s: nColorSpaceMode=%d bColorProcess=%d cInputColorStandard=%d", __FUNCTION__, pHwContext->nColorSpaceMode, pHwContext->bEnableColorProcess, VIP_GetInputColorStandard());
  337. PQDebugPrint("%s: pHwContext->cInputDataFormat = %d",__FUNCTION__, VIP_GetInputDataFormat());
  338. if(VIP_GetInputDataFormat() == RGB)
  339. {
  340. if( VIP_GetRGB2YCbCrRange() == 0 )
  341. {
  342. p601ColorSpaceTable = ColorSpaceTableYCC_Limit601;
  343. p709ColorSpaceTable = ColorSpaceTableYCC_Limit709;
  344. }
  345. else if( VIP_GetRGB2YCbCrRange() == 1 )
  346. {
  347. p601ColorSpaceTable = ColorSpaceTableYCC_Full601;
  348. p709ColorSpaceTable = ColorSpaceTableYCC_Full709;
  349. }
  350. else
  351. {
  352. p601ColorSpaceTable = ColorSpaceTableYCC_Limit601;
  353. p709ColorSpaceTable = ColorSpaceTableYCC_Limit709;
  354. }
  355. }
  356. else if(pCOLOR_MATRIX_DATA->mSrcColorMatrix[1].CSC_Value[0]==(INT32)0xffffffff)
  357. {
  358. //vip table not set color matrix by source(for vtab 20)
  359. p601ColorSpaceTable = (UINT32*) &pVtab->mColorSpaceConversionTable[CSC_601];
  360. p709ColorSpaceTable = (UINT32*) &pVtab->mColorSpaceConversionTable[CSC_709];
  361. }
  362. else
  363. {
  364. p601ColorSpaceTable = (UINT32*) &pCOLOR_MATRIX_DATA->mSrcColorMatrix[CSC_601-1];
  365. p709ColorSpaceTable = (UINT32*) &pCOLOR_MATRIX_DATA->mSrcColorMatrix[CSC_709-1];
  366. }
  367. if( pHwContext->nColorSpaceMode==PQ_COLOR_SPACE_NORMAL )
  368. {
  369. if(VIP_IsPCSource()==TRUE) //yukuo VGA input range 10~245
  370. pColorSpaceTable=(UINT32*) &pVtab->mColorSpaceConversionTable[CSC_RGB];
  371. else
  372. pColorSpaceTable=p601ColorSpaceTable;
  373. }
  374. else if( pHwContext->nColorSpaceMode==PQ_COLOR_SPACE_WIDE )
  375. {
  376. pColorSpaceTable= (UINT32*) &pVtab->mColorSpaceConversionTable[CSC_709];
  377. }
  378. else //auto
  379. {
  380. if(VIP_GetInputDataFormat() == RGB)//when input is rgb, vip set posterior matrix depend on prior transform matrix
  381. {
  382. if(VIP_IsPCSource()==TRUE) //yukuo VGA input range 10~245
  383. pColorSpaceTable=(UINT32*)&pVtab->mColorSpaceConversionTable[CSC_RGB];
  384. else
  385. {
  386. if(PQ_GetDefinitionIndex() == PQ_HIGH_DEFINITION)
  387. {
  388. pColorSpaceTable = p709ColorSpaceTable;
  389. }
  390. else
  391. {
  392. pColorSpaceTable = p601ColorSpaceTable;
  393. }
  394. }
  395. }
  396. else //ypp format
  397. {
  398. switch(VIP_GetInputColorStandard())
  399. {
  400. case YCC_709:
  401. pColorSpaceTable=p709ColorSpaceTable;
  402. break;
  403. case YUV_FCC:
  404. pColorSpaceTable=ColorSpaceTableFCC;
  405. break;
  406. case YUV_624:
  407. case YUV_170M: //ex: ntsc
  408. pColorSpaceTable=ColorSpaceTable624;
  409. break;
  410. case YUV_240M: //ex
  411. pColorSpaceTable=ColorSpaceTable240M;
  412. break;
  413. case RGB: //rgb format is forcely transformed to ycc before dpy
  414. case YCC_601:
  415. pColorSpaceTable=p601ColorSpaceTable;
  416. break;
  417. default:
  418. if(VIP_GetInputVSize() > 700) //HD
  419. pColorSpaceTable=p709ColorSpaceTable;
  420. else
  421. pColorSpaceTable=p601ColorSpaceTable;
  422. break;
  423. }
  424. }
  425. }
  426. if(VIP_IsJPEGSource())
  427. {
  428. if(VIP_GetInputDataFormat() == RGB)
  429. {
  430. pColorSpaceTable =ColorSpaceBMP;
  431. PQ_RegisterWrite(VIP_reg_dpy_ypp, 0);
  432. }
  433. else
  434. {
  435. pColorSpaceTable =ColorSpaceJPEG;
  436. PQ_RegisterWrite(VIP_reg_dpy_ypp, 1);
  437. }
  438. }
  439. else if(VIP_GetInputDataFormat() != RGB)
  440. {
  441. PQ_RegisterWrite(VIP_reg_dpy_ypp, 1);
  442. }
  443. else
  444. {
  445. PQ_RegisterWrite(VIP_reg_dpy_ypp, 0);
  446. }
  447. pHwContext->CurColorMatrix = (CSC_SETTING*)pColorSpaceTable;
  448. // PQ_RegisterWrite(VIP_reg_dpy_hsy_bypass, DISABLE);
  449. //set rgb to ycbcr in JPEG RGB color space(to fix color error in RBG Space)
  450. PQ_RegisterWrite(VIP_reg_picx_clip_high, 0x3ac);
  451. PQ_RegisterWrite(VIP_reg_picx_clip_low, 0x40);
  452. if( VIP_IsJPEGSource() && VIP_GetInputDataFormat() == RGB )
  453. {
  454. PQ_RegisterWrite(VIP_reg_picx_yuv_bypass, 0);
  455. PQ_RegisterWrite(VIP_reg_picx_rgb2ycbcr_235, 0);
  456. if((VIP_IsInputDataFormatBGR()==TRUE) && (VIP_IsJPEGSource() ==TRUE))
  457. {
  458. PQ_RegisterWrite(VIP_reg_picx_rgbin_order,0);
  459. }
  460. else
  461. {
  462. PQ_RegisterWrite(VIP_reg_picx_rgbin_order,1);
  463. }
  464. //add picx rbg2ycc clip setting
  465. PQ_RegisterWrite(VIP_reg_picx_clip_high, 0x3ff); //M#1912
  466. PQ_RegisterWrite(VIP_reg_picx_clip_low, 0);//M#1912
  467. }
  468. else
  469. {
  470. PQ_RegisterWrite(VIP_reg_picx_yuv_bypass, 1);
  471. PQ_RegisterWrite(VIP_reg_picx_rgb2ycbcr_235, 0);
  472. PQ_RegisterWrite(VIP_reg_picx_rgbin_order,0);
  473. PQ_RegisterWrite(VIP_reg_picx_clip_high, 0x940);
  474. PQ_RegisterWrite(VIP_reg_picx_clip_low, 64);
  475. }
  476. PQ_RegisterWrite(VIP_reg_dpy_444, ENABLE);
  477. // PQ_RegisterWrite(VIP_reg_dpy_ypp, DISABLE); //request by VIP HW
  478. /*
  479. //add clip setting
  480. if(pColorSpaceTable==ColorSpaceTableJPEGRGB)
  481. {
  482. PQ_RegisterWrite(VIP_reg_dpy_mtx_min_yuv, 0);
  483. PQ_RegisterWrite(VIP_reg_dpy_mtx_max_uv, 1023);
  484. }
  485. else
  486. {
  487. PQ_RegisterWrite(VIP_reg_dpy_mtx_min_yuv, 64);
  488. PQ_RegisterWrite(VIP_reg_dpy_mtx_max_uv, 963);
  489. }
  490. */
  491. PQ_RegisterWrite(VIP_reg_dpy_mtx_min_yuv, 0);
  492. PQ_RegisterWrite(VIP_reg_dpy_mtx_max_y, 1023);
  493. PQ_RegisterWrite(VIP_reg_dpy_mtx_max_uv, 1023);
  494. //#if prevent_DPY_from_clamping_input_YCC_16_235
  495. // if(pHwContext->bEnableColorProcess)
  496. // PQ_RegisterWrite(VIP_reg_dpy_ypp, ENABLE);//2009-03-10 CC==> To prevent DPY from clamping input YCC to 16-235.
  497. //else
  498. // PQ_RegisterWrite(VIP_reg_dpy_ypp, DISABLE);
  499. //#else
  500. //PQ_RegisterWrite(VIP_reg_dpy_ypp, DISABLE);
  501. //#endif
  502. //PQ_RegisterWrite(VIP_reg_dpy_yuv_int, ENABLE);
  503. //PQ_RegisterWrite(VIP_reg_dpy_rgn_int, pHwContext->bSetupCRLuma?DISABLE:ENABLE);
  504. if(VIP_GetScreenOnSt() )
  505. PQ_SetColorMatrix(DISABLE);
  506. //PQ_RegisterWrite(VIP_reg_dpy_matrix_bypass, DISABLE);
  507. for(i=0;i<9;i++)
  508. PQ_ColorMatrixSetup(TRUE, i);
  509. //unsigned convert to signed number
  510. tmp = pColorSpaceTable[9] & 0x3fff;
  511. if(tmp > 0x2000)
  512. pHwContext->iColorMatrixC1 = -(0x4000 - tmp);
  513. else if(tmp < 0x2000)
  514. pHwContext->iColorMatrixC1 = tmp;
  515. else
  516. pHwContext->iColorMatrixC1 = 0;
  517. tmp = pColorSpaceTable[10] & 0x3fff;
  518. if(tmp > 0x2000)
  519. pHwContext->iColorMatrixC2 = -(0x4000 - tmp);
  520. else if(tmp < 0x2000)
  521. pHwContext->iColorMatrixC2 = tmp;
  522. else
  523. pHwContext->iColorMatrixC2 = 0;
  524. tmp = pColorSpaceTable[11] & 0x3fff;
  525. if(tmp > 0x2000)
  526. pHwContext->iColorMatrixC3 = -(0x4000 - tmp);
  527. else if(tmp < 0x2000)
  528. pHwContext->iColorMatrixC3 = tmp;
  529. else
  530. pHwContext->iColorMatrixC3 = 0;
  531. PQ_ColorTempBias(PQ_CT_BIAS_R, pMenuValue->iColorBias[0]);
  532. PQ_ColorTempBias(PQ_CT_BIAS_G, pMenuValue->iColorBias[1]);
  533. PQ_ColorTempBias(PQ_CT_BIAS_B, pMenuValue->iColorBias[2]);
  534. //pHwContext->iColorMatrixC1=pColorSpaceTable[9];
  535. //pHwContext->iColorMatrixC2= pColorSpaceTable[10];
  536. //pHwContext->iColorMatrixC3= pColorSpaceTable[11];
  537. //matrix_aXX are set only when rgb_int= 0
  538. /*
  539. PQ_RegisterWrite(VIP_reg_dpy_matrix_a11, pColorSpaceTable[0]);
  540. PQ_RegisterWrite(VIP_reg_dpy_matrix_a12, pColorSpaceTable[1]);
  541. PQ_RegisterWrite(VIP_reg_dpy_matrix_a13, pColorSpaceTable[2]);
  542. PQ_RegisterWrite(VIP_reg_dpy_matrix_a21, pColorSpaceTable[3]);
  543. PQ_RegisterWrite(VIP_reg_dpy_matrix_a22, pColorSpaceTable[4]);
  544. PQ_RegisterWrite(VIP_reg_dpy_matrix_a23, pColorSpaceTable[5]);
  545. PQ_RegisterWrite(VIP_reg_dpy_matrix_a31, pColorSpaceTable[6]);
  546. PQ_RegisterWrite(VIP_reg_dpy_matrix_a32, pColorSpaceTable[7]);
  547. PQ_RegisterWrite(VIP_reg_dpy_matrix_a33, pColorSpaceTable[8]);
  548. */
  549. PQ_RegisterWrite(VIP_reg_dpy_u_reset,DISABLE);
  550. bEnableEnhancedColor= pHwContext->bEnableColorProcess;
  551. #if 0
  552. //always open brightness, contrast and hue function
  553. bEnableColor= TRUE;
  554. #endif
  555. if( bEnableEnhancedColor )
  556. {
  557. //for color region
  558. PQ_RegisterWrite(VIP_reg_dpy_hsy_bypass, DISABLE);
  559. }
  560. else
  561. {
  562. PQ_RegisterWrite(VIP_reg_dpy_hsy_bypass, ENABLE);
  563. }
  564. }
  565. BOOL BluePatternFlag=0;
  566. void PQ_PureColorControl(INT16 ucPure, INT8 ucPicture)
  567. {
  568. INT8 ucYUVOffset;
  569. PQ_RegisterWrite(VIP_reg_dpy_mtx_out_range, 1);
  570. if(BluePatternFlag)
  571. {
  572. if(ucPure < 0)
  573. {
  574. if(ucPure==-1 && ucPicture==1) ucYUVOffset=6;
  575. else if(ucPure==-2 && ucPicture==1) ucYUVOffset=8;
  576. else if(ucPicture==2) ucYUVOffset=8;
  577. else if(ucPicture==3) ucYUVOffset=12;
  578. else ucYUVOffset=0;
  579. if(VIP_IsATVSource() && (VIP_GetStdColorSystem() <= CVD2_STD_NTSC_443) && ucPicture<=2) ucYUVOffset=10;
  580. PQ_RegisterWrite(VIP_reg_dpy_mtx_max_y, 1023-ucYUVOffset);
  581. PQ_RegisterWrite(VIP_reg_dpy_mtx_max_uv, 1023-ucYUVOffset);
  582. }
  583. else
  584. {
  585. if(ucPure<=6 && ucPicture==1) ucYUVOffset=6;
  586. else if(ucPure<=8 && ucPicture==2) ucYUVOffset=8;
  587. else if(ucPicture==3) ucYUVOffset=ucPure;
  588. else ucYUVOffset=ucPure;
  589. if(VIP_IsATVSource() && (VIP_GetStdColorSystem() <= CVD2_STD_NTSC_443) && ucPicture<=2) ucYUVOffset=10+ucPure;
  590. PQ_RegisterWrite(VIP_reg_dpy_mtx_max_y, 1023-ucYUVOffset+ucPure);
  591. PQ_RegisterWrite(VIP_reg_dpy_mtx_max_uv, 1023-ucYUVOffset+ucPure);
  592. }
  593. PQDebugPrint("%s: ucYUVOffset=%d\n", __FUNCTION__, ucYUVOffset);
  594. PQDebugPrint("%s: ucPure=%d ucPicture=%d\n", __FUNCTION__, ucPure,ucPicture);
  595. }
  596. else if( VIP_GetUserSource() == SOURCE_PATTERN )
  597. {
  598. PQ_RegisterWrite(VIP_reg_dpy_mtx_max_y, 1023);
  599. PQ_RegisterWrite(VIP_reg_dpy_mtx_max_uv, 1023);
  600. }
  601. else
  602. {
  603. ucYUVOffset=8;
  604. PQ_RegisterWrite(VIP_reg_dpy_mtx_max_y, 1023-ucYUVOffset);
  605. PQ_RegisterWrite(VIP_reg_dpy_mtx_max_uv, 1023-ucYUVOffset);
  606. }
  607. }
  608. void PQ_ColorSpaceMode(UINT8 ucMode, UINT8 ucInputSource)
  609. {
  610. PQHW_CONTEXT* pHwContext= &PQHwContext;
  611. //set color standard when jpeg to avoid it set the same as last source
  612. if(ucInputSource == SOURCE_JPEG)
  613. VIP_SetInputColorStandard(PQ_COLOR_SPACE_NORMAL);
  614. PQDebugPrint("%s: ucMode=%d ucOld=%d", __FUNCTION__, ucMode, pHwContext->nColorSpaceMode);
  615. if( ucMode!=pHwContext->nColorSpaceMode || ucMode==PQ_COLOR_SPACE_AUTO )
  616. {
  617. pHwContext->nColorSpaceMode= ucMode;
  618. //setup color space
  619. PQ_SetupColorSpaceConversionTable();
  620. }
  621. }
  622. void PQ_GetVtabHwRange(UINT8 ucFunID, INT32* pMin, INT32* pMax, INT32* pMiddle)
  623. {
  624. PQHW_CONTEXT* pHwContext= &PQHwContext;
  625. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  626. UINT8 ucTableIndex;
  627. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  628. RANGE_DATA *pRANGE_DATA;
  629. ucTableIndex = pVtab->mRange.mGroupedIndex[ucCurrSrcIndex];
  630. pRANGE_DATA = &pVtab->mRange.mRange_Data[ucTableIndex];
  631. if( ucFunID==PQ_BRIGHTNESS )
  632. {
  633. *pMin= pRANGE_DATA->BrightnessRange.min;
  634. *pMax= pRANGE_DATA->BrightnessRange.max;
  635. *pMiddle= pRANGE_DATA->BrightnessRange.middle;
  636. }
  637. else if( ucFunID==PQ_CONTRAST )
  638. {
  639. *pMin= pRANGE_DATA->ContrastRange.min;
  640. *pMax= pRANGE_DATA->ContrastRange.max;
  641. *pMiddle= pRANGE_DATA->ContrastRange.middle;
  642. }
  643. else if( ucFunID==PQ_SATURATION )
  644. {
  645. *pMin= pRANGE_DATA->SaturationRange.min;
  646. *pMax= pRANGE_DATA->SaturationRange.max;
  647. *pMiddle= pRANGE_DATA->SaturationRange.middle;
  648. }
  649. #if 0
  650. else if( ucFunID==VIP_HUE )
  651. {
  652. if( pVtab->HueRange.min>=0 && pVtab->HueRange.min<=32 )
  653. *pMin= pVtab->HueRange.min;
  654. if( pVtab->HueRange.max>=0 && pVtab->HueRange.max<=32 )
  655. *pMax= pVtab->HueRange.max;
  656. if( pVtab->HueRange.middle>=0 && pVtab->HueRange.middle<=32 )
  657. *pMiddle= pVtab->HueRange.middle;
  658. }
  659. #else
  660. else if( ucFunID==PQ_HUE )
  661. {
  662. if( pRANGE_DATA->HueRange.min>=0 && pRANGE_DATA->HueRange.min<=100 )
  663. *pMin= pRANGE_DATA->HueRange.min;
  664. if( pRANGE_DATA->HueRange.max>=0 && pRANGE_DATA->HueRange.max<=100 )
  665. *pMax= pRANGE_DATA->HueRange.max;
  666. if( pRANGE_DATA->HueRange.middle>=0 && pRANGE_DATA->HueRange.middle<=100 )
  667. *pMiddle= pRANGE_DATA->HueRange.middle;
  668. }
  669. #endif
  670. else if( ucFunID>=PQ_CT_R_GAIN && ucFunID<=PQ_CT_B_GAIN )
  671. {
  672. if(((pRANGE_DATA->ColorTempGainRange.min & 0xff000000) >>24) == 1)
  673. {
  674. switch(ucFunID)
  675. {
  676. case PQ_CT_R_GAIN:
  677. *pMin= pRANGE_DATA->ColorTempGainRange.min & 0xff;
  678. *pMax= pRANGE_DATA->ColorTempGainRange.max & 0xff;
  679. *pMiddle= pRANGE_DATA->ColorTempGainRange.middle & 0xff;
  680. break;
  681. case PQ_CT_G_GAIN:
  682. *pMin= (pRANGE_DATA->ColorTempGainRange.min & 0xff00) >> 8;
  683. *pMax= (pRANGE_DATA->ColorTempGainRange.max & 0xff00) >> 8;
  684. *pMiddle= (pRANGE_DATA->ColorTempGainRange.middle & 0xff00) >> 8;
  685. break;
  686. case PQ_CT_B_GAIN:
  687. *pMin= (pRANGE_DATA->ColorTempGainRange.min & 0xff0000) >> 16;
  688. *pMax= (pRANGE_DATA->ColorTempGainRange.max & 0xff0000) >> 16;
  689. *pMiddle= (pRANGE_DATA->ColorTempGainRange.middle & 0xff0000) >> 16;
  690. break;
  691. }
  692. }
  693. else
  694. {
  695. *pMin= pRANGE_DATA->ColorTempGainRange.min;
  696. *pMax= pRANGE_DATA->ColorTempGainRange.max;
  697. *pMiddle= pRANGE_DATA->ColorTempGainRange.middle;
  698. }
  699. }
  700. else if( ucFunID>=PQ_CT_R_BIAS && ucFunID<=PQ_CT_B_BIAS )
  701. {
  702. if(((pRANGE_DATA->ColorTempOffsetRange.min & 0xff000000) >> 24) == 1)
  703. {
  704. switch(ucFunID)
  705. {
  706. case PQ_CT_R_BIAS:
  707. *pMin= (INT8)(pRANGE_DATA->ColorTempOffsetRange.min & 0xff);
  708. *pMax= (INT8)(pRANGE_DATA->ColorTempOffsetRange.max & 0xff);
  709. *pMiddle= (INT8)(pRANGE_DATA->ColorTempOffsetRange.middle & 0xff);
  710. break;
  711. case PQ_CT_G_BIAS:
  712. *pMin= (INT8)((pRANGE_DATA->ColorTempOffsetRange.min & 0xff00) >> 8);
  713. *pMax= (INT8)((pRANGE_DATA->ColorTempOffsetRange.max & 0xff00) >> 8);
  714. *pMiddle= (INT8)((pRANGE_DATA->ColorTempOffsetRange.middle & 0xff00) >> 8);
  715. break;
  716. case PQ_CT_B_BIAS:
  717. *pMin= (INT8)((pRANGE_DATA->ColorTempOffsetRange.min & 0xff0000) >> 16);
  718. *pMax= (INT8)((pRANGE_DATA->ColorTempOffsetRange.max & 0xff0000) >> 16);
  719. *pMiddle= (INT8)((pRANGE_DATA->ColorTempOffsetRange.middle & 0xff0000) >> 16);
  720. break;
  721. }
  722. }
  723. else
  724. {
  725. *pMin= pRANGE_DATA->ColorTempOffsetRange.min;
  726. *pMax= pRANGE_DATA->ColorTempOffsetRange.max;
  727. *pMiddle= pRANGE_DATA->ColorTempOffsetRange.middle;
  728. }
  729. }
  730. }
  731. void PQ_GetVtabHwRangeExt(UINT8 ucFunID, INT32* pMidLeft, INT32* pMidRight)
  732. {
  733. PQHW_CONTEXT* pHwContext= &PQHwContext;
  734. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  735. UINT8 ucTableIndex;
  736. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  737. RANGE_DATA *pRANGE_DATA;
  738. ucTableIndex = pVtab->mRange.mGroupedIndex[ucCurrSrcIndex];
  739. pRANGE_DATA = &pVtab->mRange.mRange_Data[ucTableIndex];
  740. if( ucFunID==PQ_BRIGHTNESS )
  741. {
  742. *pMidLeft= pRANGE_DATA->BrightnessRangeExt.midleft;
  743. *pMidRight= pRANGE_DATA->BrightnessRangeExt.midright;
  744. }
  745. else if( ucFunID==PQ_CONTRAST )
  746. {
  747. *pMidLeft= pRANGE_DATA->ContrastRangeExt.midleft;
  748. *pMidRight= pRANGE_DATA->ContrastRangeExt.midright;
  749. }
  750. else if( ucFunID==PQ_SATURATION )
  751. {
  752. *pMidLeft= pRANGE_DATA->SaturationRangeExt.midleft;
  753. *pMidRight= pRANGE_DATA->SaturationRangeExt.midright;
  754. }
  755. }
  756. void PQ_YUV_Datat_Formal(UINT8 ucType)
  757. {
  758. PQHW_CONTEXT* pHwContext= &PQHwContext;
  759. pHwContext->ucYuvDataFormat = ucType;
  760. }
  761. UINT8 PQ_GET_YUV_Datat_Formal(void)
  762. {
  763. PQHW_CONTEXT* pHwContext= &PQHwContext;
  764. return pHwContext->ucYuvDataFormat;
  765. }
  766. void PQ_FleshTone_Init(void)
  767. {
  768. PQ_RegisterWrite(VIP_reg_dpy_flcom0_magmax, 0x37);
  769. PQ_RegisterWrite(VIP_reg_dpy_fil0_rgn_en, 0);
  770. PQ_RegisterWrite(VIP_reg_dpy_fil1_rgn_en, 0);
  771. PQ_RegisterWrite(VIP_reg_dpy_flcom0_rgn_en, 1);
  772. PQ_RegisterWrite(VIP_reg_dpy_flcom1_rgn_en, 0);
  773. PQ_RegisterWrite(VIP_reg_dpy_flcom2_rgn_en, 0);
  774. PQ_RegisterWrite(VIP_reg_dpy_fl_detail_minus, 0);
  775. PQ_RegisterWrite(VIP_reg_dpy_fl_detail_factor, 0);
  776. PQ_RegisterWrite(VIP_reg_dpy_fl_det_minus, 0);
  777. }
  778. void PQ_NR_TnrzEnable(void)
  779. {
  780. //add this function because color bar display abnormal when change source from pc to atv like mantis 42375.
  781. //#if(CONFIG_DRAMSIZE == 64)
  782. if(VIP_IsPCSource() || VIP_RunDVIMode())
  783. PQ_RegisterWrite(VIP_reg_vdi_tnrz_en, 0);//For 305 bandwidth issue.//307/506 should be ok.
  784. else
  785. //#endif
  786. PQ_RegisterWrite(VIP_reg_vdi_tnrz_en, 1);
  787. }
  788. //****************************************************************************
  789. // Function : PQ_NR_Init
  790. // Params : void
  791. // Description: (1)Disable 331 NR function related register(6994 ~ 6998) in 531
  792. // (2) Initial NR related register setting
  793. // Returns : void
  794. //****************************************************************************
  795. void PQ_NR_Init(void)
  796. {
  797. //685e 0xbb
  798. PQ_NR_TnrzEnable();
  799. PQ_RegisterWrite(VIP_reg_vdi_tnrz_th_dyn_adj, 1);
  800. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_dyn_adj, 0);
  801. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_dith_en, 1);
  802. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_mbw_en, 1);
  803. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_en, 1);
  804. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_sel, 0);
  805. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_bmax_sel, 1);
  806. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_alpha_inc, 0x8);
  807. //6860 0x42 , Grid Mobile Noise//6860 0xf8 640X480 YCBCR444 ColorBar shake
  808. PQ_RegisterWrite(VIP_reg_vdi_tnrz_chroma_tap_sel0, 0); //0x00406860
  809. PQ_RegisterWrite(VIP_reg_vdi_tnrz_chroma_tap_sel1, 0); //0x00416860
  810. PQ_RegisterWrite(VIP_reg_vdi_tnrz_debug_en, 0); //0x00426860
  811. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_blk_diff_sel, 1); //0x00436860
  812. PQ_RegisterWrite(VIP_reg_vdi_tnr_blk_diff_sel, 1); //0x00446860
  813. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_blk_diff_sel, 1); //0x00456860
  814. PQ_RegisterWrite(VIP_reg_vdi_tnrz_blk_diff_sel, 1); //0x00466860
  815. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_blk_diff_sel, 1); //0x00476860
  816. PQ_RegisterWrite(VIP_reg_vdi_mnr_gain_inc, 0);
  817. PQ_RegisterWrite(VIP_reg_vdi_snr_gain_th, 0);
  818. }
  819. void PQ_SetupStrength(PQ_ITEM ucItemID, UINT8 ucDegree)
  820. {
  821. PQHW_CONTEXT* pHwContext= &PQHwContext;
  822. const LUMA_TNR_STRENGTH* pLTNRStrength;
  823. const CHROMA_TNR_STRENGTH* pCTNRStrength;
  824. const LUMA_SNR1_STRENGTH* pLSNR1Strength;
  825. const BLOCK_NR_CORING* pBlockNrCoring;
  826. const BLOCK_NR_STRENGTH* pBlockNrStrength;
  827. const MOSQUITO_NR_CORING* pMosquitoNrCoring;
  828. const MOSQUITO_NR_STRENGTH* pMosquitoNrStrength;
  829. pHwContext->CVD2_store_nr_setting=0;
  830. //PQDebugPrint("ucItemID=%d ucDegree=%d\n",ucItemID, ucDegree);
  831. pHwContext->Degree=ucDegree;
  832. ucDegree = min(15, max(0, (INT32)ucDegree));
  833. if( ucItemID<PQ_ITEM_BLOCK_NR_CORING || (ucItemID >= PQ_ITEM_TNR_ULTRA_LOW && ucItemID <= PQ_ITEM_SNR2_ULTRA_LOW))
  834. {
  835. if( ucItemID==PQ_ITEM_LUMA_SNR1_CORING || ucItemID==PQ_ITEM_LUMA_SNR2_CORING )
  836. ucDegree = min(ucDegree,(UINT8)PQ_MAX_LSNR_DEGREE);
  837. else if(ucItemID == PQ_ITEM_SNR1_ULTRA_LOW || ucItemID == PQ_ITEM_SNR2_ULTRA_LOW)
  838. ucDegree = min(ucDegree,(UINT8)PQ_MAX_SNR_ULOW_DEGREE);
  839. else
  840. ucDegree = min(ucDegree,(UINT8)PQ_MAX_ITEM_DEGREE);
  841. }
  842. else
  843. {
  844. //digital NR
  845. ucDegree=min(ucDegree ,(UINT8)PQ_MAX_MPEGNR_DEGREE );
  846. }
  847. switch(ucItemID)
  848. {
  849. case PQ_ITEM_LUMA_TNR_CORING:
  850. PQ_RegisterWrite(VIP_reg_vdi_tnr_th1_adj_min,0);
  851. PQ_RegisterWrite(VIP_reg_vdi_tnr_th1,0);
  852. PQ_RegisterWrite(VIP_reg_vdi_tnr_th1_adj_max, 34);
  853. PQ_RegisterWrite(VIP_reg_vdi_tnr_th1_adj_fact, 40);
  854. PQ_RegisterWrite(VIP_reg_vdi_tnr_mbw1_alpha_adj, (VIP_GetInputVSize()<720)?8:0);
  855. PQ_RegisterWrite(VIP_reg_vdi_tnr_mbw2_alpha_adj, (VIP_GetInputVSize()<720)?12:8);
  856. PQ_RegisterWrite(VIP_reg_vdi_tnr_mbw3_alpha_adj, 16);
  857. PQ_RegisterWrite(VIP_reg_vdi_tnr_mbwm_alpha_adj, 24);
  858. break;
  859. case PQ_ITEM_LUMA_TNR_STRENGTH:
  860. if(VIP_IsATVSource())
  861. pLTNRStrength= &ATVLTNRStrength[ucDegree];
  862. else if(VIP_IsAVSource())
  863. pLTNRStrength= &AVLTNRStrength[ucDegree];
  864. else if(VIP_IsPCSource())
  865. {
  866. if(VIP_GetInputVSize()<720)
  867. pLTNRStrength= &PCSDLTNRStrength[ucDegree];
  868. else
  869. pLTNRStrength = &PCHDLTNRStrength[ucDegree];
  870. }
  871. else
  872. {
  873. if(VIP_GetInputVSize()<720)
  874. pLTNRStrength= &SDLTNRStrength[ucDegree];
  875. else
  876. pLTNRStrength = &HDLTNRStrength[ucDegree];
  877. }
  878. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_adj_min, pLTNRStrength->vdi_tnr_alpha_adj_min);
  879. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_init, pLTNRStrength->vdi_tnr_alpha_init);
  880. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_adj_min_dith, pLTNRStrength->vdi_tnr_alpha_adj_min_dith);
  881. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_alpha, pLTNRStrength->vdi_tnr_alpha);
  882. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_inc_fact,4);
  883. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_dec_fact,2);
  884. break;
  885. case PQ_ITEM_CHROMA_TNR_CORING:
  886. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_chroma,16);
  887. break;
  888. case PQ_ITEM_CHROMA_TNR_STRENGTH:
  889. pCTNRStrength = &CTNRStrength[ucDegree];
  890. if(VIP_GetUserSource() == SOURCE_CVD2)
  891. pCTNRStrength = &CVD2CTNRStrength[ucDegree];
  892. PQ_RegisterWrite(VIP_reg_vdi_tnr_th1_chroma, pCTNRStrength->vdi_tnr_alpha_chroma);
  893. break;
  894. case PQ_ITEM_TNR_ULTRA_LOW:
  895. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_th3, 0x800);
  896. break;
  897. case PQ_ITEM_LUMA_SNR1_CORING:
  898. if(VIP_IsATVSource() )
  899. {
  900. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring, 0x10);
  901. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_limit, 0xff);
  902. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_th1, 0x10);
  903. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_th2, 8);
  904. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_th3, 0);
  905. }
  906. else if(VIP_IsAVSource() )
  907. {
  908. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring, 0);
  909. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_limit, 0x20);
  910. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_th1, 4);
  911. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_th2, 4);
  912. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_th3, 0x16);
  913. }
  914. else
  915. {
  916. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring, 0xc);
  917. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_limit, 0x2c);
  918. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_th1, 4);
  919. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_th2, 4);
  920. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_coring_th3, 0x11);
  921. }
  922. break;
  923. case PQ_ITEM_LUMA_SNR1_STRENGTH:
  924. if(VIP_IsATVSource())
  925. pLSNR1Strength = &ATVLSNR1Strength[ucDegree];
  926. else if(VIP_IsAVSource())
  927. pLSNR1Strength = &AVLSNR1Strength[ucDegree];
  928. else if(VIP_IsPCSource())
  929. {
  930. if(VIP_GetlInputCaptureVSize()<720)
  931. pLSNR1Strength = &PCSDSNR1Strength[ucDegree];
  932. else
  933. pLSNR1Strength = &PCHDSNR1Strength[ucDegree];
  934. }
  935. else
  936. {
  937. if(VIP_GetlInputCaptureVSize()<720)
  938. pLSNR1Strength = &SDSNR1Strength[ucDegree];
  939. else
  940. pLSNR1Strength = &HDSNR1Strength[ucDegree];
  941. }
  942. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_gain_inc, pLSNR1Strength->vdi_snr_ulow_gain_inc);
  943. //PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_gain_inc, VIP_IsATVSource()?0x7f:0x20);
  944. if(VIP_IsATVSource())
  945. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_smooth, 0x10);
  946. else if(VIP_IsAVSource())
  947. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_smooth, 0x28);
  948. else
  949. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_smooth, 0x22);
  950. PQ_RegisterWrite(VIP_reg_vdi_snr_hl_trans, 0x10);
  951. break;
  952. case PQ_ITEM_LUMA_SNR2_CORING:
  953. if(VIP_IsATVSource() )
  954. {
  955. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring, 0x10);
  956. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_limit, 0xff);
  957. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_th1, 16);
  958. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_th2,8);
  959. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_th3, 0);
  960. }
  961. else if(VIP_IsAVSource() )
  962. {
  963. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring, 4);
  964. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_limit, 0x24);
  965. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_th1, 4);
  966. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_th2, 4);
  967. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_th3, 0x15);
  968. }
  969. else
  970. {
  971. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring, 0x14);
  972. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_limit, 0x34);
  973. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_th1, 4);
  974. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_th2, 4);
  975. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_coring_th3, 0xf);
  976. }
  977. break;
  978. case PQ_ITEM_LUMA_SNR2_STRENGTH:
  979. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_smooth, 0x22);
  980. PQ_RegisterWrite(VIP_reg_vdi_snr_vl_trans, 16);
  981. break;
  982. case PQ_ITEM_CHROMA_SNR_CORING:
  983. if(VIP_IsATVSource() )
  984. {
  985. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_coring_limit, 0x30);
  986. }
  987. else if(VIP_IsAVSource() )
  988. {
  989. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_coring_limit, 0x28);
  990. }
  991. else if(VIP_GetInputVSize() <720)
  992. {
  993. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_coring_limit, 0x2C);
  994. }
  995. else
  996. {
  997. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_coring_limit, 0x60);
  998. }
  999. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_coring, 0xc);
  1000. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_coring_th1, 0x4);
  1001. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_coring_th2,0x6);
  1002. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_coring_th3, 0x11);
  1003. break;
  1004. case PQ_ITEM_CHROMA_SNR_STRENGTH:
  1005. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_trans, 0x2c);
  1006. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_smooth, CSNRStrength[ucDegree].vdi_snr_hc_smooth);
  1007. break;
  1008. case PQ_ITEM_SNR1_ULTRA_LOW:
  1009. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_hl_coring, 0x30);
  1010. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_th3, 0x800);
  1011. break;
  1012. case PQ_ITEM_SNR2_ULTRA_LOW:
  1013. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_vl_coring, 0x30);
  1014. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_th3, 0x800);
  1015. break;
  1016. case PQ_ITEM_BLOCK_NR_CORING:
  1017. pBlockNrCoring= &BlockNrCoring[ucDegree];
  1018. PQ_RegisterWrite(VIP_reg_vdi_dbk_vdiff_th2, pBlockNrCoring->vdi_dbk_hdiff_th2);
  1019. PQ_RegisterWrite(VIP_reg_vdi_dbk_vdiff_hmot_th2, pBlockNrCoring->vdi_dbk_hdiff_th2 +2);
  1020. PQ_RegisterWrite(VIP_reg_vdi_dbk_vdiff_lmot_th2, pBlockNrCoring->vdi_dbk_hdiff_th2 -2);
  1021. PQ_RegisterWrite(VIP_reg_gfx_dbk_hdiff_hmot_th2, min(pBlockNrCoring->vdi_dbk_hdiff_th2 + 2, 42));
  1022. PQ_RegisterWrite(VIP_reg_gfx_dbk_hdiff_lmot_th2, max(pBlockNrCoring->vdi_dbk_hdiff_th2 - 2, 0));
  1023. PQ_RegisterWrite(VIP_reg_gfx_dbk_hdiff_th2, pBlockNrCoring->vdi_dbk_hdiff_th2);
  1024. break;
  1025. case PQ_ITEM_BLOCK_NR_STRENGTH:
  1026. pBlockNrStrength= &BlockNrStrength[ucDegree];
  1027. //yuling:must less than 42
  1028. PQ_RegisterWrite(VIP_reg_gfx_dbk_hdiff_hmot_th1, min(pBlockNrStrength->vdi_dbk_hdiff_th1 + 2, 42));
  1029. PQ_RegisterWrite(VIP_reg_gfx_dbk_hdiff_lmot_th1, max(pBlockNrStrength->vdi_dbk_hdiff_th1 - 2, 0));
  1030. PQ_RegisterWrite(VIP_reg_gfx_dbk_hdiff_th1, pBlockNrStrength->vdi_dbk_hdiff_th1);
  1031. PQ_RegisterWrite(VIP_reg_gfx_dbk_hdiff_slope1, pBlockNrStrength->vdi_dbk_hdiff_slope1);
  1032. PQ_RegisterWrite(VIP_reg_vdi_dbk_vdiff_th1,pBlockNrStrength->vdi_dbk_hdiff_th1);
  1033. PQ_RegisterWrite(VIP_reg_vdi_dbk_vfil_slope, pBlockNrStrength->vdi_dbk_hdiff_slope1);
  1034. PQ_RegisterWrite(VIP_reg_vdi_dbk_vdiff_hmot_th1,pBlockNrStrength->vdi_dbk_hdiff_th1+2);
  1035. PQ_RegisterWrite(VIP_reg_vdi_dbk_vdiff_lmot_th1,pBlockNrStrength->vdi_dbk_hdiff_th1-2);
  1036. break;
  1037. case PQ_ITEM_MOSQUITO_NR_CORING:
  1038. pMosquitoNrCoring= &MosquitoNrCoring[ucDegree];
  1039. PQ_RegisterWrite(VIP_reg_vdi_mnr_h_coring_inc, pMosquitoNrCoring->vdi_mnr_h_coring_inc);
  1040. #if 0
  1041. //2009-07-31 JY and bonnine request...............
  1042. //mnr filter in vertical direction:for all path except for ATV and DTV tuner be1c613a=0x1c
  1043. if((!(VIP_IsATVSource()))&&(VIP_GetUserSource()!=SOURCE_MPEG))
  1044. PQ_RegisterWrite(VIP_reg_vdi_mnr_v_coring_inc,0x1c);
  1045. else
  1046. PQ_RegisterWrite(VIP_reg_vdi_mnr_v_coring_inc, pMosquitoNrCoring->vdi_mnr_v_coring_inc);
  1047. #else
  1048. PQ_RegisterWrite(VIP_reg_vdi_mnr_v_coring_inc, pMosquitoNrCoring->vdi_mnr_v_coring_inc);
  1049. #endif
  1050. break;
  1051. case PQ_ITEM_MOSQUITO_NR_STRENGTH:
  1052. pMosquitoNrStrength= &MosquitoNrStrength[ucDegree];
  1053. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_gain_inc, pMosquitoNrStrength->vdi_mnr_gain_inc);
  1054. break;
  1055. }
  1056. }
  1057. void PQ_Set_NR_BlockAlpha(UINT8 NRBlockAlphaType)
  1058. {
  1059. PQHW_CONTEXT* pHwContext= &PQHwContext;
  1060. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  1061. UINT8 ucLevel;
  1062. UINT8 ucTableIndex;
  1063. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  1064. NR_Setting_BY_Group_Idx *pNR_Setting_BY_Group_Idx;
  1065. //UINT8 j;
  1066. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  1067. if(pVtab == NULL)
  1068. {
  1069. return ;
  1070. }
  1071. if (pVtab->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex] >= 8)
  1072. {
  1073. return;
  1074. }
  1075. //VIPDebugPrint("%s %d, ucCurrSrcIndex = %d\n",__FUNCTION__, __LINE__, ucCurrSrcIndex);
  1076. ucTableIndex = pVtab->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex];
  1077. //VIPDebugPrint("%s %d, ucTableIndex = %d\n",__FUNCTION__, __LINE__, ucTableIndex);
  1078. pNR_Setting_BY_Group_Idx = &pVtab->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex];
  1079. if(pNR_Setting_BY_Group_Idx == NULL)
  1080. {
  1081. return ;
  1082. }
  1083. ucLevel = pHwContext->nNRLevel-1;
  1084. //VIPDebugPrint("%s, NRBlockAlphaType = %d, nNRLevel = %d\n",__FUNCTION__,NRBlockAlphaType, pHwContext->nNRLevel);
  1085. if(pHwContext->nNRLevel == OFF &&
  1086. (VIP_GetUserSource() == SOURCE_CVD2 ||
  1087. (VIP_GetUserSource() == SOURCE_EXTS && !VIP_IsPCSource()))
  1088. )
  1089. {
  1090. ucLevel = 0;
  1091. }
  1092. if(pHwContext->nNRLevel == OFF &&
  1093. (VIP_GetUserSource() == SOURCE_JPEG ||
  1094. VIP_GetUserSource() == SOURCE_HDMI ||
  1095. VIP_GetUserSource() == SOURCE_MPEG ||
  1096. VIP_IsPCSource())
  1097. )
  1098. {
  1099. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr0, 0);
  1100. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr1, 0);
  1101. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr2, 0);
  1102. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr3, 0);
  1103. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr4, 0);
  1104. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac0, 255);
  1105. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac1, 255);
  1106. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac2, 255);
  1107. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac3, 255);
  1108. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac4, 255);
  1109. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac5, 255);
  1110. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp0, 0);
  1111. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp1, 0);
  1112. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp2, 0);
  1113. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp3, 0);
  1114. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp4, 0);
  1115. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp5, 0);
  1116. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_thr0, 0);
  1117. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_thr1, 0);
  1118. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_thr2, 0);
  1119. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_thr3, 0);
  1120. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_thr4, 0);
  1121. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac0, 255);
  1122. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac1, 255);
  1123. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac2, 255);
  1124. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac3, 255);
  1125. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac4, 255);
  1126. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac5, 255);
  1127. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp0, 0);
  1128. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp1, 0);
  1129. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp2, 0);
  1130. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp3, 0);
  1131. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp4, 0);
  1132. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp5, 0);
  1133. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr0, 0);
  1134. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr1, 0);
  1135. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr2, 0);
  1136. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr3, 0);
  1137. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr4, 0);
  1138. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac0, 255);
  1139. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac1, 255);
  1140. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac2, 255);
  1141. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac3, 255);
  1142. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac4, 255);
  1143. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac5, 255);
  1144. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp0, 0);
  1145. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp1, 0);
  1146. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp2, 0);
  1147. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp3, 0);
  1148. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp4, 0);
  1149. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp5, 0);
  1150. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_thr0, 0);
  1151. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_thr1, 0);
  1152. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_thr2, 0);
  1153. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_thr3, 0);
  1154. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_thr4, 0);
  1155. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac0, 255);
  1156. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac1, 255);
  1157. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac2, 255);
  1158. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac3, 255);
  1159. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac4, 255);
  1160. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac5, 255);
  1161. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp0, 0);
  1162. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp1, 0);
  1163. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp2, 0);
  1164. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp3, 0);
  1165. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp4, 0);
  1166. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp5, 0);
  1167. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr0, 0);
  1168. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr1, 0);
  1169. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr2, 0);
  1170. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr3, 0);
  1171. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr4, 0);
  1172. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac0, 255);
  1173. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac1, 255);
  1174. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac2, 255);
  1175. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac3, 255);
  1176. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac4, 255);
  1177. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac5, 255);
  1178. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp0, 0);
  1179. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp1, 0);
  1180. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp2, 0);
  1181. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp3, 0);
  1182. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp4, 0);
  1183. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp5, 0);
  1184. }
  1185. else
  1186. {
  1187. switch(NRBlockAlphaType){
  1188. case NR_BLOCK_ALPHA_TNR:
  1189. // TNR enable
  1190. if(pVtab->MagicNumber9 == NewTNRVer)
  1191. {
  1192. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mmap_en >> (ucTableIndex*4));
  1193. }
  1194. else
  1195. {
  1196. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mmap_en);
  1197. }
  1198. // thr 0 ~ 4
  1199. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mthr[0].Degree[ucLevel]);
  1200. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mthr[1].Degree[ucLevel]);
  1201. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mthr[2].Degree[ucLevel]);
  1202. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mthr[3].Degree[ucLevel]);
  1203. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_thr4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mthr[4].Degree[ucLevel]);
  1204. // slp 0 ~ 5
  1205. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mslp[0].Degree[ucLevel]);
  1206. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mslp[1].Degree[ucLevel]);
  1207. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mslp[2].Degree[ucLevel]);
  1208. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mslp[3].Degree[ucLevel]);
  1209. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mslp[4].Degree[ucLevel]);
  1210. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp5, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mslp[5].Degree[ucLevel]);
  1211. // fac 0 ~ 5
  1212. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mfac[0].Degree[ucLevel]);
  1213. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mfac[1].Degree[ucLevel]);
  1214. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mfac[2].Degree[ucLevel]);
  1215. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mfac[3].Degree[ucLevel]);
  1216. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mfac[4].Degree[ucLevel]);
  1217. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac5, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mfac[5].Degree[ucLevel]);
  1218. //for VIP_reg_vdi_tnr_map_en disable
  1219. PQ_RegisterWrite(VIP_reg_vdi_tnr_blk_diff_lp_en, 1);
  1220. PQ_RegisterWrite(VIP_reg_vdi_tnr_7tap, 0);
  1221. //
  1222. /*for(j = 0; j < 5; j++)
  1223. VIPDebugPrint("%s, mthr[%d].Degree[%d] = %d",__FUNCTION__, j, ucLevel, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mthr[j].Degree[ucLevel]);
  1224. for(j = 0; j < 6; j++)
  1225. {
  1226. VIPDebugPrint("%s, mslp[%d].Degree[%d] = %d",__FUNCTION__, j, ucLevel, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mslp[j].Degree[ucLevel]);
  1227. VIPDebugPrint("%s, mfac[%d].Degree[%d] = %d",__FUNCTION__, j,ucLevel, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR].mfac[j].Degree[ucLevel]);
  1228. }*/
  1229. break;
  1230. case NR_BLOCK_ALPHA_TNR_SNR:
  1231. // TNR_SNR enable
  1232. if(pVtab->MagicNumber9 == NewTNRVer)
  1233. {
  1234. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_en, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mmap_en >> (ucTableIndex*4));
  1235. }
  1236. else
  1237. {
  1238. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_en, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mmap_en);
  1239. }
  1240. // thr 0 ~ 4
  1241. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_thr0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mthr[0].Degree[ucLevel]);
  1242. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_thr1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mthr[1].Degree[ucLevel]);
  1243. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_thr2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mthr[2].Degree[ucLevel]);
  1244. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_thr3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mthr[3].Degree[ucLevel]);
  1245. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_thr4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mthr[4].Degree[ucLevel]);
  1246. // slp 0 ~ 5
  1247. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mslp[0].Degree[ucLevel]);
  1248. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mslp[1].Degree[ucLevel]);
  1249. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mslp[2].Degree[ucLevel]);
  1250. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mslp[3].Degree[ucLevel]);
  1251. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mslp[4].Degree[ucLevel]);
  1252. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_slp5, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mslp[5].Degree[ucLevel]);
  1253. // fac 0 ~ 5
  1254. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mfac[0].Degree[ucLevel]);
  1255. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mfac[1].Degree[ucLevel]);
  1256. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mfac[2].Degree[ucLevel]);
  1257. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mfac[3].Degree[ucLevel]);
  1258. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mfac[4].Degree[ucLevel]);
  1259. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_fac5, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_SNR].mfac[5].Degree[ucLevel]);
  1260. //for VIP_reg_vdi_tnr_snr_map_en disable
  1261. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_slope, 0x1f);//need default
  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_SNR].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_SNR].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_SNR].mfac[j].Degree[ucLevel]);
  1269. }*/
  1270. break;
  1271. case NR_BLOCK_ALPHA_TNR_C:
  1272. // TNR_C enable
  1273. if(pVtab->MagicNumber9 == NewTNRVer)
  1274. {
  1275. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_en, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mmap_en >> (ucTableIndex*4));
  1276. }
  1277. else
  1278. {
  1279. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_en, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mmap_en);
  1280. }
  1281. // thr 0 ~ 4
  1282. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mthr[0].Degree[ucLevel]);
  1283. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mthr[1].Degree[ucLevel]);
  1284. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mthr[2].Degree[ucLevel]);
  1285. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mthr[3].Degree[ucLevel]);
  1286. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mthr[4].Degree[ucLevel]);
  1287. // slp 0 ~ 5
  1288. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mslp[0].Degree[ucLevel]);
  1289. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mslp[1].Degree[ucLevel]);
  1290. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mslp[2].Degree[ucLevel]);
  1291. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mslp[3].Degree[ucLevel]);
  1292. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mslp[4].Degree[ucLevel]);
  1293. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp5, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mslp[5].Degree[ucLevel]);
  1294. // fac 0 ~ 5
  1295. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mfac[0].Degree[ucLevel]);
  1296. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mfac[1].Degree[ucLevel]);
  1297. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mfac[2].Degree[ucLevel]);
  1298. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mfac[3].Degree[ucLevel]);
  1299. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mfac[4].Degree[ucLevel]);
  1300. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac5, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNR_C].mfac[5].Degree[ucLevel]);
  1301. //
  1302. /*for(j = 0; j < 5; j++)
  1303. 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]);
  1304. for(j = 0; j < 6; j++)
  1305. {
  1306. 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]);
  1307. 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]);
  1308. }*/
  1309. break;
  1310. case NR_BLOCK_ALPHA_TNRZ:
  1311. // TNRZ enable
  1312. if(pVtab->MagicNumber9 == NewTNRVer)
  1313. {
  1314. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_en, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mmap_en >> (ucTableIndex*4));
  1315. }
  1316. else
  1317. {
  1318. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_en, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mmap_en);
  1319. }
  1320. // thr 0 ~ 4
  1321. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_thr0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mthr[0].Degree[ucLevel]);
  1322. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_thr1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mthr[1].Degree[ucLevel]);
  1323. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_thr2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mthr[2].Degree[ucLevel]);
  1324. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_thr3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mthr[3].Degree[ucLevel]);
  1325. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_thr4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mthr[4].Degree[ucLevel]);
  1326. // slp 0 ~ 5
  1327. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mslp[0].Degree[ucLevel]);
  1328. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mslp[1].Degree[ucLevel]);
  1329. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mslp[2].Degree[ucLevel]);
  1330. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mslp[3].Degree[ucLevel]);
  1331. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mslp[4].Degree[ucLevel]);
  1332. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_slp5, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mslp[5].Degree[ucLevel]);
  1333. // fac 0 ~ 5
  1334. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mfac[0].Degree[ucLevel]);
  1335. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mfac[1].Degree[ucLevel]);
  1336. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mfac[2].Degree[ucLevel]);
  1337. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mfac[3].Degree[ucLevel]);
  1338. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mfac[4].Degree[ucLevel]);
  1339. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_fac5, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mfac[5].Degree[ucLevel]);
  1340. //for VIP_reg_vdi_tnrz_map_en disable
  1341. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope, 31);
  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_TNRZ].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_TNRZ].mslp[j].Degree[ucLevel]);
  1348. VIPDebugPrint("%s, mfac[%d].Degree[%d] = %d",__FUNCTION__, j,ucLevel, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ].mfac[j].Degree[ucLevel]);
  1349. }*/
  1350. break;
  1351. case NR_BLOCK_ALPHA_TNRZ_C:
  1352. // TNRZ_C enable
  1353. if(pVtab->MagicNumber9 == NewTNRVer)
  1354. {
  1355. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_en, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mmap_en >> (ucTableIndex*4));
  1356. }
  1357. else
  1358. {
  1359. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_en, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mmap_en);
  1360. }
  1361. // thr 0 ~ 4
  1362. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mthr[0].Degree[ucLevel]);
  1363. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mthr[1].Degree[ucLevel]);
  1364. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mthr[2].Degree[ucLevel]);
  1365. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mthr[3].Degree[ucLevel]);
  1366. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mthr[4].Degree[ucLevel]);
  1367. // slp 0 ~ 5
  1368. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mslp[0].Degree[ucLevel]);
  1369. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mslp[1].Degree[ucLevel]);
  1370. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mslp[2].Degree[ucLevel]);
  1371. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mslp[3].Degree[ucLevel]);
  1372. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mslp[4].Degree[ucLevel]);
  1373. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp5, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mslp[5].Degree[ucLevel]);
  1374. // fac 0 ~ 5
  1375. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac0, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mfac[0].Degree[ucLevel]);
  1376. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac1, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mfac[1].Degree[ucLevel]);
  1377. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac2, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mfac[2].Degree[ucLevel]);
  1378. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac3, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mfac[3].Degree[ucLevel]);
  1379. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac4, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mfac[4].Degree[ucLevel]);
  1380. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac5, pNR_Setting_BY_Group_Idx->NRBlockAlpha[NR_BLOCK_ALPHA_TNRZ_C].mfac[5].Degree[ucLevel]);
  1381. // for VIP_reg_vdi_tnrz_c_map_en disable
  1382. PQ_RegisterWrite(VIP_reg_vdi_tnrz_th1_chroma, 20);
  1383. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_chroma, 25);
  1384. //
  1385. /*for(j = 0; j < 5; j++)
  1386. 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]);
  1387. for(j = 0; j < 6; j++)
  1388. {
  1389. 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]);
  1390. 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]);
  1391. }*/
  1392. break;
  1393. }
  1394. }
  1395. }
  1396. void PQ_Set_NR_SLR_SNR(UINT8 ucSLR_SNR_TYPE)
  1397. {
  1398. PQHW_CONTEXT* pHwContext= &PQHwContext;
  1399. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  1400. UINT8 ucLevel;
  1401. UINT8 ucTableIndex;
  1402. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  1403. SNR_Setting *pNR_SLR_SNR1;
  1404. SNR_Setting *pNR_SLR_SNR2;
  1405. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  1406. if (pVtab->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex] >= 8) return;
  1407. ucTableIndex = pVtab->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex];
  1408. pNR_SLR_SNR1 = &pVtab->mSNR1Setting[ucTableIndex];
  1409. pNR_SLR_SNR2 = &pVtab->mSNR2Setting[ucTableIndex];
  1410. ucLevel = (pHwContext->nNRLevel==OFF) ? 0 : (pHwContext->nNRLevel-1) ;
  1411. switch(ucSLR_SNR_TYPE){
  1412. case NR_SNR_BEFORE_SCALER:
  1413. //SNR1
  1414. PQ_RegisterWrite(VIP_reg_slr_snr_bypass, (pHwContext->nNRLevel==OFF) ? 1 : pNR_SLR_SNR1->SNR_MapByPass);
  1415. //LUMA
  1416. PQ_RegisterWrite(VIP_reg_slr_snr_sel, pNR_SLR_SNR1->SNR_Luma.SNR_Sel.Degree[ucLevel]);
  1417. PQ_RegisterWrite(VIP_reg_slr_snr_chk_middle_pxl, pNR_SLR_SNR1->SNR_Luma.SNR_Chk_Middle_Pxl.Degree[ucLevel]);
  1418. PQ_RegisterWrite(VIP_reg_slr_snr_th1, pNR_SLR_SNR1->SNR_Luma.SNR_th.Degree[ucLevel]);
  1419. PQ_RegisterWrite(VIP_reg_slr_snr_gain1, pNR_SLR_SNR1->SNR_Luma.SNR_Gain[0].Degree[ucLevel]);
  1420. PQ_RegisterWrite(VIP_reg_slr_snr_gain2, pNR_SLR_SNR1->SNR_Luma.SNR_Gain[1].Degree[ucLevel]);
  1421. PQ_RegisterWrite(VIP_reg_slr_snr_slope, pNR_SLR_SNR1->SNR_Luma.SNR_Slope.Degree[ucLevel]);
  1422. //CHROMA
  1423. PQ_RegisterWrite(VIP_reg_slr_snr_sel_c, pNR_SLR_SNR1->SNR_Chroma.SNR_Sel.Degree[ucLevel]);
  1424. PQ_RegisterWrite(VIP_reg_slr_snr_chk_middle_pxl_c, pNR_SLR_SNR1->SNR_Chroma.SNR_Chk_Middle_Pxl.Degree[ucLevel]);
  1425. PQ_RegisterWrite(VIP_reg_slr_snr_th1_c, pNR_SLR_SNR1->SNR_Chroma.SNR_th.Degree[ucLevel]);
  1426. PQ_RegisterWrite(VIP_reg_slr_snr_gain1_c, pNR_SLR_SNR1->SNR_Chroma.SNR_Gain[0].Degree[ucLevel]);
  1427. PQ_RegisterWrite(VIP_reg_slr_snr_gain2_c, pNR_SLR_SNR1->SNR_Chroma.SNR_Gain[1].Degree[ucLevel]);
  1428. PQ_RegisterWrite(VIP_reg_slr_snr_slope_c, pNR_SLR_SNR1->SNR_Chroma.SNR_Slope.Degree[ucLevel]);
  1429. break;
  1430. case NR_SNR_AFTER_SCALER:
  1431. //SNR2
  1432. PQ_RegisterWrite(VIP_reg_slr_s_snr_bypass, (pHwContext->nNRLevel==OFF) ? 1 : pNR_SLR_SNR2->SNR_MapByPass);
  1433. //LUMA
  1434. PQ_RegisterWrite(VIP_reg_slr_s_snr_sel, pNR_SLR_SNR2->SNR_Luma.SNR_Sel.Degree[ucLevel]);
  1435. PQ_RegisterWrite(VIP_reg_slr_s_snr_chk_middle_pxl, pNR_SLR_SNR2->SNR_Luma.SNR_Chk_Middle_Pxl.Degree[ucLevel]);
  1436. PQ_RegisterWrite(VIP_reg_slr_s_snr_th1, pNR_SLR_SNR2->SNR_Luma.SNR_th.Degree[ucLevel]);
  1437. PQ_RegisterWrite(VIP_reg_slr_s_snr_gain1, pNR_SLR_SNR2->SNR_Luma.SNR_Gain[0].Degree[ucLevel]);
  1438. PQ_RegisterWrite(VIP_reg_slr_s_snr_gain2, pNR_SLR_SNR2->SNR_Luma.SNR_Gain[1].Degree[ucLevel]);
  1439. PQ_RegisterWrite(VIP_reg_slr_s_snr_slope, pNR_SLR_SNR2->SNR_Luma.SNR_Slope.Degree[ucLevel]);
  1440. //CHROMA
  1441. PQ_RegisterWrite(VIP_reg_slr_s_snr_sel_c, pNR_SLR_SNR2->SNR_Chroma.SNR_Sel.Degree[ucLevel]);
  1442. PQ_RegisterWrite(VIP_reg_slr_s_snr_chk_middle_pxl_c, pNR_SLR_SNR2->SNR_Chroma.SNR_Chk_Middle_Pxl.Degree[ucLevel]);
  1443. PQ_RegisterWrite(VIP_reg_slr_s_snr_th1_c, pNR_SLR_SNR2->SNR_Chroma.SNR_th.Degree[ucLevel]);
  1444. PQ_RegisterWrite(VIP_reg_slr_s_snr_gain1_c, pNR_SLR_SNR2->SNR_Chroma.SNR_Gain[0].Degree[ucLevel]);
  1445. PQ_RegisterWrite(VIP_reg_slr_s_snr_gain2_c, pNR_SLR_SNR2->SNR_Chroma.SNR_Gain[1].Degree[ucLevel]);
  1446. PQ_RegisterWrite(VIP_reg_slr_s_snr_slope_c, pNR_SLR_SNR2->SNR_Chroma.SNR_Slope.Degree[ucLevel]);
  1447. break;
  1448. }
  1449. }
  1450. UINT32 PQ_ChromaBinPercentage(UINT8 ucBin)
  1451. {
  1452. UINT32 dwChromaHistTotal=1;
  1453. INT32 ulChromaHistBin[14];
  1454. UINT8 i=0;
  1455. UINT32 cbin=0;
  1456. for ( i=0 ; i<14 ; i++ )
  1457. {
  1458. dwChromaHistTotal += PQ_RegisterRead(VIP_reg_dpy_chroma_bin0+4*i);
  1459. ulChromaHistBin[i]= PQ_RegisterRead(VIP_reg_dpy_chroma_bin0+4*i);
  1460. }
  1461. if(dwChromaHistTotal == 0)
  1462. {
  1463. dwChromaHistTotal = 1;
  1464. }
  1465. if (VIP_IsATVSource() || VIP_IsAVSource())
  1466. cbin = ((ulChromaHistBin[ucBin]+1) * 999) / dwChromaHistTotal;
  1467. else
  1468. cbin = (ulChromaHistBin[ucBin] * 1000) / dwChromaHistTotal;
  1469. return (cbin);
  1470. }
  1471. BOOL PQ_SWDTColorBar(void)
  1472. {
  1473. #if 1
  1474. UINT8 i=0,dis_th=0, act_th=2;
  1475. UINT8 c_bin_cnt=0;
  1476. // UINT32 cb00,cb01,cb02,cb03,cb04,cb05,cb06,cb07,cb08,cb09,cb10,cb11,cb12,cb13,cb14,cb15,cb16,cb17;
  1477. UINT32 ulHunBinNum[18];
  1478. UINT32 CaptureWindowSize=0;
  1479. PQ_RegisterWrite(VIP_reg_slr_auto_colorbar ,0x0);
  1480. PQ_RegisterWrite(VIP_reg_slr_detail_en ,0x0);
  1481. PQ_RegisterWrite(VIP_reg_slr_detail_cnt_en ,0x0);
  1482. PQ_RegisterWrite(VIP_reg_slr_sat_th ,0x100);
  1483. ulHunBinNum[0]=PQ_RegisterRead(VIP_c_bin00_pre);
  1484. ulHunBinNum[1]=PQ_RegisterRead(VIP_c_bin01_pre);
  1485. ulHunBinNum[2]=PQ_RegisterRead(VIP_c_bin02_pre);
  1486. ulHunBinNum[3]=PQ_RegisterRead(VIP_c_bin03_pre);
  1487. ulHunBinNum[4]=PQ_RegisterRead(VIP_c_bin04_pre);
  1488. ulHunBinNum[5]=PQ_RegisterRead(VIP_c_bin05_pre);
  1489. ulHunBinNum[6]=PQ_RegisterRead(VIP_c_bin06_pre);
  1490. ulHunBinNum[7]=PQ_RegisterRead(VIP_c_bin07_pre);
  1491. ulHunBinNum[8]=PQ_RegisterRead(VIP_c_bin08_pre);
  1492. ulHunBinNum[9]=PQ_RegisterRead(VIP_c_bin09_pre);
  1493. ulHunBinNum[10]=PQ_RegisterRead(VIP_c_bin10_pre);
  1494. ulHunBinNum[11]=PQ_RegisterRead(VIP_c_bin11_pre);
  1495. ulHunBinNum[12]=PQ_RegisterRead(VIP_c_bin12_pre);
  1496. ulHunBinNum[13]=PQ_RegisterRead(VIP_c_bin13_pre);
  1497. ulHunBinNum[14]=PQ_RegisterRead(VIP_c_bin14_pre);
  1498. ulHunBinNum[15]=PQ_RegisterRead(VIP_c_bin15_pre);
  1499. ulHunBinNum[16]=PQ_RegisterRead(VIP_c_bin16_pre);
  1500. ulHunBinNum[17]=PQ_RegisterRead(VIP_c_bin17_pre);
  1501. 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));
  1502. for(i=0;i<18;i++)
  1503. {
  1504. if(CaptureWindowSize > 0)
  1505. ulHunBinNum[i] = (100*ulHunBinNum[i])/CaptureWindowSize;
  1506. }
  1507. c_bin_cnt=0;
  1508. for(i=0;i<18;i++)
  1509. {
  1510. if ((i==0)&&((ulHunBinNum[0]>act_th)&&
  1511. (((ulHunBinNum[17]<=dis_th)&&((ulHunBinNum[1]<=dis_th)||(ulHunBinNum[2]<=dis_th)))||
  1512. ((ulHunBinNum[1]<=dis_th)&&((ulHunBinNum[17]<=dis_th)||(ulHunBinNum[16]<=dis_th))))))
  1513. c_bin_cnt = c_bin_cnt + 1;
  1514. else if ((i==1)&&((ulHunBinNum[1]>act_th)&&
  1515. (((ulHunBinNum[0]<=dis_th)&&((ulHunBinNum[2]<=dis_th)||(ulHunBinNum[3]<=dis_th)))||
  1516. ((ulHunBinNum[2]<=dis_th)&&((ulHunBinNum[0]<=dis_th)||(ulHunBinNum[17]<=dis_th))))))
  1517. c_bin_cnt = c_bin_cnt + 1;
  1518. else if ((i==2)&&((ulHunBinNum[2]>act_th)&&
  1519. (((ulHunBinNum[1]<=dis_th)&&((ulHunBinNum[3]<=dis_th)||(ulHunBinNum[4]<=dis_th)))||
  1520. ((ulHunBinNum[3]<=dis_th)&&((ulHunBinNum[1]<=dis_th)||(ulHunBinNum[0]<=dis_th))))))
  1521. c_bin_cnt = c_bin_cnt + 1;
  1522. else if ((i>2)&&(ulHunBinNum[i]>act_th)&&
  1523. (((ulHunBinNum[(i-1)%18]<=dis_th)&&((ulHunBinNum[(i+1)%18]<=dis_th)||(ulHunBinNum[(i+2)%18]<=dis_th)))||
  1524. ((ulHunBinNum[(i+1)%18]<=dis_th)&&((ulHunBinNum[(i-1)%18]<=dis_th)||(ulHunBinNum[(i-2)%18]<=dis_th)))))
  1525. c_bin_cnt = c_bin_cnt + 1;
  1526. }
  1527. if((*((UINT8*)(0xbe1cd688))) == 0x1) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s:c_bin_cnt=%d \n\033[0m\n ",__LINE__,__FUNCTION__,c_bin_cnt);
  1528. if (c_bin_cnt>=6)
  1529. return 1;
  1530. else
  1531. return 0;
  1532. #else
  1533. return PQ_RegisterRead(VIP_reg_slr_auto_colorbar);
  1534. #endif
  1535. }
  1536. void PQ_EnColorBarDetectWorkQue_ISR(void)
  1537. {
  1538. queue_work(WQ_Struct_ColorBarDetect,&WQ_ColorBarDetect);
  1539. }
  1540. void PQ_SetColorBarFnFlag(UINT8 ucenable)
  1541. {
  1542. utempCheckColorbarDTFunctionEN = ucenable;
  1543. }
  1544. void PQ_ColorBarDetect(void) //sharlene
  1545. {
  1546. UINT8 ucSD, cnt_th=5, colorbar;
  1547. UINT32 vdi_vsize;
  1548. UINT8 ucUserSource;
  1549. UINT8 ucSubSource;
  1550. static UINT8 stable_cnt = 0;
  1551. if(VIP_IsSourceDTV()|| VIP_RunDVIMode() || VIP_IsPCSource() || VIP_GetVDIPause())
  1552. {
  1553. return ;
  1554. }
  1555. if((*((UINT8*)(0xbe1cd688))) == 0x2) return;
  1556. if(PQ_GetColorProcessor() == FALSE)
  1557. {
  1558. PQ_SetColorBarFnFlag(DISABLE);
  1559. PQ_Sharpness_PREDCTI(TRUE, utempSharpnesscValue);
  1560. PQ_Sharpness_POSTDCTI(TRUE,utempSharpnesscValue);
  1561. PQ_Sharpness_POST_2D(TRUE, utempSharpnesscValue);
  1562. PQ_RegisterWrite(VIP_reg_slr_icp_alpha, 0x200);
  1563. return;
  1564. }
  1565. vdi_vsize= PQ_Get_VDI_VSize();
  1566. ucSD = (vdi_vsize<=576)?1:0;
  1567. VIP_GetSource(&ucUserSource, &ucSubSource);
  1568. colorbar = PQ_SWDTColorBar();
  1569. if (colorbar==0 && stable_cnt != 0)
  1570. {
  1571. stable_cnt = stable_cnt - 1;
  1572. }
  1573. else if (colorbar!=0 && stable_cnt != cnt_th)
  1574. {
  1575. stable_cnt = stable_cnt + 1;
  1576. }
  1577. //PQ_RegisterWrite(VIP_deg_dpy_sat_all, ucTempColorBarSaturation+(6*stable_cnt));
  1578. if (colorbar==0 && utempCheckColorbarDTFunctionEN == 0)
  1579. {
  1580. if((*((UINT8*)(0xbe1cd688))) == 0x1) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: Colorbar Return \n\033[0m\n ",__LINE__,__FUNCTION__);
  1581. return;
  1582. }
  1583. else if (colorbar!=0 && utempCheckColorbarDTFunctionEN == 0 && stable_cnt == cnt_th)
  1584. {
  1585. printk(KERN_EMERG"\033[1m\033[40;35m [%s][%d]Colorbor Enable\033[0m\n ",__FUNCTION__,__LINE__);
  1586. if(ucSD) //SD
  1587. {
  1588. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_pre, 2);
  1589. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_pre, 2);
  1590. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_pre,0);
  1591. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_post, ucUserSource == SOURCE_CVD2?2:3);
  1592. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_post, ucUserSource == SOURCE_CVD2?2:5);
  1593. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_post, 0);
  1594. if(ucUserSource == SOURCE_CVD2){
  1595. if(VIP_IsATVSource()){
  1596. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_post, 0x2);
  1597. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_post, 0x2);
  1598. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_post,0x0);
  1599. if(VIP_GetStdColorSystem() > CVD2_STD_NTSC_443 && VIP_GetStdColorSystem() < CVD2_STD_SECAM)
  1600. {
  1601. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_post, 0x3);
  1602. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_post, 0x5);
  1603. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_post,0x3);
  1604. }
  1605. }
  1606. else{
  1607. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_post, 0x3);
  1608. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_post, 0x5);
  1609. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_post,0x5); }
  1610. if(VIP_GetStdColorSystem() != CVD2_STD_NTSC_443)
  1611. {
  1612. if (VIP_GetStdColorSystem() == CVD2_STD_SECAM)
  1613. {
  1614. PQ_RegisterWrite(VIP_reg_slr_icp_alpha, 0); //#33736
  1615. }
  1616. else
  1617. {
  1618. PQ_RegisterWrite(VIP_reg_slr_icp_alpha, 0x80);
  1619. }
  1620. }
  1621. else
  1622. {
  1623. PQ_RegisterWrite(VIP_reg_slr_icp_alpha, 0x200);
  1624. }
  1625. if( ucSubSource==S1_INPUT_CHANNEL || ucSubSource==S2_INPUT_CHANNEL || ucSubSource==S3_INPUT_CHANNEL ){ //#40329
  1626. PQ_RegisterWrite(VIP_reg_slr_dcti_c1_post, 0x173);
  1627. PQ_RegisterWrite(VIP_reg_slr_dcti_c2_post, 0x53);
  1628. PQ_RegisterWrite(VIP_reg_slr_dcti_c3_post, 0xf5b);
  1629. PQ_RegisterWrite(VIP_reg_slr_dcti_c4_post, 0xf0a);
  1630. PQ_RegisterWrite(VIP_reg_slr_dcti_c5_post, 0xf43);
  1631. PQ_RegisterWrite(VIP_reg_slr_dcti_c6_post, 0xf98);
  1632. PQ_RegisterWrite(VIP_reg_slr_dlti_scale_post, 0x0);
  1633. PQ_RegisterWrite(VIP_reg_slr_2d_l_scale, 0x2); }
  1634. }
  1635. else if (ucUserSource == SOURCE_HDMI) {
  1636. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_post, 0x3);
  1637. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_post, 0x5);
  1638. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_post, 0x0); }
  1639. else {
  1640. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_pre, 1); //#40391
  1641. PQ_RegisterWrite(VIP_reg_slr_dcti_c1_pre, 0x1c0);
  1642. PQ_RegisterWrite(VIP_reg_slr_dcti_c2_pre, 0xfdc);
  1643. PQ_RegisterWrite(VIP_reg_slr_dcti_c3_pre, 0xf19);
  1644. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_post, 0x3);
  1645. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_post, 0x5);
  1646. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_post, 0x5); }
  1647. if (VIP_IsATVSource() && (VIP_GetStdColorSystem() > CVD2_STD_NTSC_443 && VIP_GetStdColorSystem() <= CVD2_STD_SECAM))
  1648. {
  1649. PQ_RegisterWrite(VIP_reg_slr_2d_c_scale, 1);
  1650. if(VIP_GetStdColorSystem() == CVD2_STD_SECAM)
  1651. PQ_RegisterWrite(VIP_reg_slr_2d_c_scale, 0);
  1652. }
  1653. else
  1654. {
  1655. PQ_RegisterWrite(VIP_reg_slr_2d_c_scale, 0x3);
  1656. }
  1657. }
  1658. else //HD
  1659. {
  1660. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_pre, 0x3);
  1661. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_pre, 0x3);
  1662. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_pre,0x0);
  1663. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_post, 0x3);
  1664. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_post,0x5);
  1665. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_post,0x0);
  1666. }
  1667. PQ_RegisterWrite(VIP_reg_slr_pre_icp_en_pre, 0x1);
  1668. PQ_RegisterWrite(VIP_reg_slr_pre_icp_alpha_pre, 0x3);
  1669. //PQ_RegisterWrite(VIP_reg_slr_post_icp_en_pre, 0x1); //#34032
  1670. PQ_RegisterWrite(VIP_reg_slr_pre_icp_en_post, 0x1);
  1671. PQ_RegisterWrite(VIP_reg_slr_pre_icp_alpha_post,0x3);
  1672. PQ_RegisterWrite(VIP_reg_slr_post_icp_en_post, 0x1);
  1673. if(ucUserSource == SOURCE_CVD2)
  1674. {
  1675. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_0_post, 0x7f);
  1676. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_1_post, 0x7f);
  1677. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_2_post, 0x7f);
  1678. }
  1679. else
  1680. {
  1681. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_0_post, 0xff);
  1682. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_1_post, 0xff);
  1683. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_2_post, 0xff);
  1684. }
  1685. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_th0_post,0x0);
  1686. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_th1_post,0x0);
  1687. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_slope0_post,0x0);
  1688. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_slope1_post,0x0);
  1689. PQ_RegisterWrite(VIP_reg_slr_2d_c_sel, 0x1);
  1690. PQ_SetColorBarFnFlag(ENABLE);
  1691. }
  1692. else if(colorbar==0 && utempCheckColorbarDTFunctionEN ==1 && stable_cnt == 0)
  1693. {
  1694. PQ_SetColorBarFnFlag(DISABLE);
  1695. PQ_Sharpness_PREDCTI(TRUE, utempSharpnesscValue);
  1696. PQ_Sharpness_POSTDCTI(TRUE,utempSharpnesscValue);
  1697. PQ_Sharpness_POST_2D(TRUE, utempSharpnesscValue);
  1698. PQ_RegisterWrite(VIP_reg_slr_icp_alpha, 0x200);
  1699. if((*((UINT8*)(0xbe1cd688))) == 0x1) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: ColorBarDisable \n\033[0m\n ",__LINE__,__FUNCTION__);
  1700. PQDebugPrint("\033[1m\033[40;35m [%s][%d]ColorBarDisable \033[0m\n ",__FUNCTION__,__LINE__);
  1701. }
  1702. else
  1703. {
  1704. return;
  1705. }
  1706. }
  1707. void PQ_SetFuzzyEliminate(UINT8 ucEnable)
  1708. {
  1709. if(ucEnable)
  1710. {
  1711. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_lb_1, 0xa5);
  1712. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_rb_1, 0x104);
  1713. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_min_1, 0x10);
  1714. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_max_1, 0x3ff);
  1715. PQ_RegisterWrite(VIP_reg_vdi_tnr_y_lb_1, 0x30);
  1716. PQ_RegisterWrite(VIP_reg_vdi_tnr_y_rb_1, 0xff);
  1717. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_sel, 0x0f);
  1718. PQ_RegisterWrite(VIP_reg_vdi_alpha1_tnulow_en, 1);
  1719. PQ_RegisterWrite(VIP_reg_vdi_debug_fix_val0, 0xff);
  1720. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha1_inc, 0x39);
  1721. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_min_2, 0x19);
  1722. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_max_2, 0x79);
  1723. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_inc, 0x39);
  1724. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha1_tnulow_en, 1);
  1725. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_tulow_en, 1);
  1726. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_tnulow_en, 1);
  1727. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_lb_2, 0x64);
  1728. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_rb_2, 0x96);
  1729. PQ_RegisterWrite(VIP_reg_vdi_alpha_sel, 0x03);
  1730. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha1_inc, 0x39);
  1731. }
  1732. else
  1733. {
  1734. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_lb_1, 0x12c);
  1735. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_rb_1, 0x15e);
  1736. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_min_1, 0x1900);
  1737. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_max_1, 0x19000);
  1738. PQ_RegisterWrite(VIP_reg_vdi_tnr_y_lb_1, 0);
  1739. PQ_RegisterWrite(VIP_reg_vdi_tnr_y_rb_1, 0x40);
  1740. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_sel, 0x01);
  1741. PQ_RegisterWrite(VIP_reg_vdi_alpha1_tnulow_en, 0);
  1742. PQ_RegisterWrite(VIP_reg_vdi_debug_fix_val0, 0);
  1743. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha1_inc, 0x23);
  1744. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_lb_2, 175);
  1745. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_rb_2, 270);
  1746. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_min_2, 400);
  1747. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_max_2, 0xfffff);
  1748. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_inc, 0x0A);
  1749. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha1_tnulow_en, 0);
  1750. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_tulow_en, 0);
  1751. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_tnulow_en, 0);
  1752. PQ_RegisterWrite(VIP_reg_vdi_alpha_sel, 0x01);
  1753. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha1_inc, 0x23);
  1754. }
  1755. }
  1756. UINT32 ucVDI_MotionFlag = 0;
  1757. UINT32 ucTempM=0;
  1758. UINT32 ucVDI_Static_Cnt = 0;
  1759. UINT32 ucVDI_Static_Cnt_2 = 0;
  1760. void PQ_AdjustNr(void)
  1761. {
  1762. #ifdef ADJUST_NR_By_Yavg
  1763. PQHW_CONTEXT* pHwContext = &PQHwContext;
  1764. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  1765. UINT8 ucTableIndex;
  1766. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  1767. static UINT32 ucLastSwapNRLevel =0;
  1768. static UINT8 ucLastNRLevel = 0, ucAdjustTNRC = 0;
  1769. UINT8 ucResetTNRC = 0;
  1770. UINT32 ucSwapTNRLevel =0;
  1771. UINT32 ulHsize=0, ulVsize=0;
  1772. UINT32 dwTotalPixel =0;
  1773. // UINT32 ucVdiMotionCut=0;
  1774. // UINT8 ucCVD2_MotionFlag=0;// = (*((UINT8 *)(0xbe170195))&0x02);
  1775. UINT8 ucNRLevel = 0;
  1776. BOOL DPYGrayFlag=0;
  1777. UINT32 NRGain[5] = {SDNR_Gain_normal,SDNR_Gain_Low,SDNR_Gain_Mid,SDNR_Gain_High,600};
  1778. UINT8 ucNoiseStatus = 0;// =CVD2_GetNoiseStatus(&ucNoiseStatus);
  1779. UINT32 dwChromaHistTotal = 0;
  1780. BOOL ulChromaBin98 = 0;
  1781. UINT8 i=0;
  1782. UINT32 ucfield_diff_cnt = PQ_RegisterRead(VIP_field_diff_cnt);
  1783. UINT32 ucvdi_mot_cnt = PQ_RegisterRead(VIP_vdi_mot_cnt);
  1784. UINT32 ucvdi_vdbk_sts = PQ_RegisterRead(VIP_vdi_vdbk_sts);
  1785. UINT32 ucvdi_field_diff_cnt_lp = PQ_RegisterRead(VIP_field_diff_cnt_lp);
  1786. UINT8 CVD2NoiseLevel;
  1787. UINT8 CVD2LockStatus = 0;
  1788. BOOL ucCVD2_NSTD_Flag=0;
  1789. cvd2_TypeSigSTD CVD2_Non_standard;
  1790. BOOL ucVDI_static_flag = 0;
  1791. UINT32 ucCTNRLevel = NRGain[4];
  1792. static UINT8 ucStaticFlag = STATIC_FRAME, ucLastStaticFlag = 0xff; //#mantis 40034
  1793. NR_Setting_BY_Group_Idx *pNR_Setting_BY_Group_Idx;
  1794. #ifdef CONFIG_FORCE_NR_EFFECT_ENHANCED_IN_OFF_OPTION
  1795. BOOL SpecialFlag=0;
  1796. #endif
  1797. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  1798. if((*((UINT8*)(0xbe1cd688))) == 0x2) return;
  1799. if(PQ_GetColorProcessor() == FALSE || VIP_GetVDIPause())
  1800. return;
  1801. if (pVtab->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex] >= 8) return;
  1802. ucTableIndex = pVtab->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex];
  1803. pNR_Setting_BY_Group_Idx = &pVtab->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex];
  1804. //==Total Pixel=========
  1805. ulHsize = PQ_RegisterRead(VIP_reg_slr_out_width);
  1806. ulVsize = PQ_Get_VDI_VSize();
  1807. dwTotalPixel = ulHsize*ulVsize ;
  1808. //==========
  1809. if(dwTotalPixel==0)
  1810. {
  1811. ucLastNRLevel = 0;
  1812. return;
  1813. }
  1814. //==Gray Pattern========
  1815. if( ((PQ_RegisterRead(VIP_c_gray_bin_pre)*100)/dwTotalPixel) >= 98 )
  1816. DPYGrayFlag = 1;
  1817. else
  1818. DPYGrayFlag = 0;
  1819. //==MotionCut============
  1820. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s:63a4=%d,624c=%d,6238=%d \n\033[0m\n ",__LINE__,__FUNCTION__,ucfield_diff_cnt,ucvdi_mot_cnt,ucvdi_vdbk_sts);
  1821. ucVDI_MotionFlag = PQ_GetMotionStatus(); //#40034
  1822. if( VIP_IsATVSource() && (VIP_GetStdColorSystem() < CVD2_STD_SECAM))
  1823. {
  1824. if(ucvdi_mot_cnt > 300)
  1825. {
  1826. PQ_RegisterWrite(VIP_reg_slr_snr_sel, 3);
  1827. }
  1828. else
  1829. {
  1830. PQ_RegisterWrite(VIP_reg_slr_snr_sel, 0);
  1831. }
  1832. }
  1833. else
  1834. {
  1835. PQ_Set_NR_SLR_SNR(NR_SNR_BEFORE_SCALER);
  1836. }
  1837. //=======================
  1838. if (ucvdi_field_diff_cnt_lp <= 40 && ucVDI_Static_Cnt < 200)
  1839. {
  1840. ucVDI_Static_Cnt ++;
  1841. }
  1842. else if (ucvdi_field_diff_cnt_lp > 40 && ucVDI_Static_Cnt != 0)
  1843. {
  1844. ucVDI_Static_Cnt --;
  1845. }
  1846. if ( ucVDI_Static_Cnt >= 10 )
  1847. {
  1848. ucVDI_static_flag = 1;
  1849. }
  1850. else
  1851. {
  1852. ucVDI_static_flag = 0;
  1853. }
  1854. if( VIP_IsATVSource())
  1855. {
  1856. if(ucvdi_field_diff_cnt_lp >= 0x4fff && ucVDI_Static_Cnt_2 <30)
  1857. {
  1858. ucVDI_Static_Cnt_2++;
  1859. }
  1860. else if(ucvdi_field_diff_cnt_lp < 0x4fff && ucVDI_Static_Cnt_2 > 0)
  1861. {
  1862. ucVDI_Static_Cnt_2--;
  1863. }
  1864. }
  1865. else if(VIP_IsSourceDTV() || VIP_IsAVSource())
  1866. {
  1867. if(ucvdi_field_diff_cnt_lp >= 0x1ff && ucVDI_Static_Cnt_2 <30)
  1868. {
  1869. ucVDI_Static_Cnt_2++;
  1870. }
  1871. else if(ucvdi_field_diff_cnt_lp < 0x1ff && ucVDI_Static_Cnt_2 > 0)
  1872. {
  1873. ucVDI_Static_Cnt_2--;
  1874. }
  1875. }
  1876. else
  1877. {
  1878. if(ucvdi_field_diff_cnt_lp >= 0xff && ucVDI_Static_Cnt_2 <30)
  1879. {
  1880. ucVDI_Static_Cnt_2++;
  1881. }
  1882. else if(ucvdi_field_diff_cnt_lp < 0xff && ucVDI_Static_Cnt_2 > 0)
  1883. {
  1884. ucVDI_Static_Cnt_2--;
  1885. }
  1886. }
  1887. if(ucVDI_Static_Cnt_2 > 10)
  1888. {
  1889. ucStaticFlag = MOTION_FRAME;
  1890. }
  1891. else
  1892. {
  1893. ucStaticFlag = STATIC_FRAME;
  1894. }
  1895. //==Chroma==================
  1896. for ( i=0 ; i<14 ; i++ )
  1897. {
  1898. dwChromaHistTotal += PQ_RegisterRead(VIP_reg_dpy_chroma_bin0+4*i);
  1899. }
  1900. ulChromaBin98 = ( (((PQ_RegisterRead(VIP_reg_dpy_chroma_bin0)) *100) / (dwChromaHistTotal+1))> 98 )? 1:0;
  1901. //==CVD2NoiseLV==================
  1902. CVD2_GetNoiseStatus(&ucNoiseStatus);
  1903. if( (ucNoiseStatus > (ucTempM+2)) || (ucNoiseStatus < (ucTempM-2)))
  1904. ucTempM = ucNoiseStatus;
  1905. if ( ucTempM <= 5 )
  1906. CVD2NoiseLevel = 0;
  1907. else if ( ucTempM <= 8 )
  1908. CVD2NoiseLevel = 1;
  1909. else if ( ucTempM <= 20 )
  1910. CVD2NoiseLevel = 2;
  1911. else CVD2NoiseLevel = 3;
  1912. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: CVD2_Noise=%d \n\033[0m\n ",__LINE__,__FUNCTION__,ucTempM);
  1913. // ucCVD2_MotionFlag = (*((UINT8 *)(0xbe170195))&0x02);
  1914. //==CVD2_NonSTDStatus========================================================================
  1915. DRV_CVD2_Get_LockStatus(&CVD2LockStatus); //0x6
  1916. if((CVD2LockStatus & (hlock|vlock) )== (hlock|vlock))
  1917. {
  1918. DRV_CVD2_CheckNonSTDStatus(&CVD2_Non_standard); //0x1
  1919. if(CVD2_Non_standard.horizontal_nSTD)
  1920. ucCVD2_NSTD_Flag = 1;
  1921. else
  1922. ucCVD2_NSTD_Flag = 0;
  1923. }
  1924. //==Color Bar================================================================
  1925. if ( (PQ_SWDTColorBar() && ucStaticFlag == 0) || ucCVD2_NSTD_Flag == 1 )
  1926. {
  1927. ucSwapTNRLevel = NRGain[4];
  1928. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s ,0);
  1929. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s ,0);
  1930. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope ,2);
  1931. PQ_RegisterWrite(VIP_reg_slr_mbw_en ,1);
  1932. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,0);
  1933. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_en ,0);
  1934. if(VIP_IsATVSource() && (VIP_GetStdColorSystem() > CVD2_STD_NTSC_443 && VIP_GetStdColorSystem() < CVD2_STD_SECAM))
  1935. {
  1936. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_en ,0);
  1937. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_en ,0);
  1938. }
  1939. if(VIP_IsATVSource() && (VIP_GetStdColorSystem()== CVD2_STD_NTSC_M))
  1940. {
  1941. ucAdjustTNRC = TRUE;
  1942. //TNR C
  1943. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_en ,1);
  1944. // thr 0 ~ 4
  1945. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr0, 45);
  1946. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr1, 82);
  1947. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr2, 138);
  1948. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr3, 185);
  1949. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_thr4, 213);
  1950. // slp 0 ~ 5
  1951. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp0, 7);
  1952. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp1, 3);
  1953. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp2, 5);
  1954. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp3, 4);
  1955. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp4, 9);
  1956. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_slp5, 3);
  1957. // fac 0 ~ 5
  1958. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac0, 0);
  1959. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac1, 5);
  1960. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac2, 7);
  1961. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac3, 12);
  1962. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac4, 15);
  1963. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_map_fac5, 19);
  1964. //TNRZ C
  1965. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_en ,1);
  1966. // thr 0 ~ 4
  1967. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr0, 49);
  1968. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr1, 84);
  1969. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr2, 123);
  1970. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr3, 165);
  1971. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_thr4, 208);
  1972. // slp 0 ~ 5
  1973. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp0, 9);
  1974. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp1, 9);
  1975. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp2, 6);
  1976. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp3, 3);
  1977. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp4, 2);
  1978. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_slp5, 4);
  1979. // fac 0 ~ 5
  1980. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac0, 2);
  1981. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac1, 9);
  1982. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac2, 14);
  1983. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac3, 18);
  1984. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac4, 20);
  1985. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_map_fac5, 22);
  1986. }
  1987. else
  1988. {
  1989. if(ucAdjustTNRC)
  1990. {
  1991. ucAdjustTNRC = FALSE;
  1992. ucResetTNRC = TRUE;
  1993. }
  1994. }
  1995. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: ColorBar \n\033[0m\n ",__LINE__,__FUNCTION__);
  1996. }
  1997. else if(VIP_GetUserSource() == SOURCE_CVD2 && (VIP_IsATVSource() || VIP_GetStdColorSystem() == CVD2_STD_SECAM))
  1998. {
  1999. #ifndef CONFIG_FORCE_NR_EFFECT_ENHANCED_IN_OFF_OPTION
  2000. if(pHwContext->nNRLevel != OFF)
  2001. #endif
  2002. {
  2003. if (CVD2NoiseLevel == 0)
  2004. {
  2005. ucSwapTNRLevel = NRGain[1];
  2006. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s ,2);
  2007. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s ,2);
  2008. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope ,2);
  2009. PQ_RegisterWrite(VIP_reg_slr_mbw_en ,1);
  2010. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNR);
  2011. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNRZ);
  2012. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: ATV_NR-0 \n\033[0m\n ",__LINE__,__FUNCTION__);
  2013. }
  2014. else if (CVD2NoiseLevel == 1)
  2015. {
  2016. ucSwapTNRLevel = NRGain[2];
  2017. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNR);
  2018. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNRZ);
  2019. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s ,0);
  2020. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s ,0);
  2021. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope ,2);
  2022. PQ_RegisterWrite(VIP_reg_slr_mbw_en ,1);
  2023. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp3 ,6);
  2024. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp4 ,6);
  2025. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp5 ,6);
  2026. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: ATV_NR-1 \n\033[0m\n ",__LINE__,__FUNCTION__);
  2027. }
  2028. else if (CVD2NoiseLevel == 2)
  2029. {
  2030. ucSwapTNRLevel = NRGain[3];
  2031. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNR);
  2032. //PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNRZ);
  2033. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_en ,0);
  2034. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s ,0);
  2035. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s ,0);
  2036. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope ,2);
  2037. PQ_RegisterWrite(VIP_reg_slr_mbw_en ,1);
  2038. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac3, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+6);
  2039. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac4, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+12);
  2040. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac5, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+18);
  2041. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp3 ,6);
  2042. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp4 ,6);
  2043. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp5 ,6);
  2044. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: ATV_NR-2 \n\033[0m\n ",__LINE__,__FUNCTION__);
  2045. }
  2046. else
  2047. {
  2048. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: ATV_NR-3 \n\033[0m\n ",__LINE__,__FUNCTION__);
  2049. ucSwapTNRLevel = NRGain[4];
  2050. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s ,0);
  2051. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s ,0);
  2052. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope ,0x1f);
  2053. PQ_RegisterWrite(VIP_reg_slr_mbw_en ,0);
  2054. PQ_RegisterWrite(VIP_reg_ds_disable_func_en ,1);
  2055. if (DPYGrayFlag == 1 )//&& ulChromaBin98 == 1) //&& ucVDI_MotionFlag == 0)
  2056. {
  2057. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,0);
  2058. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_en ,0);
  2059. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: ATV_NR-3GY \n\033[0m\n ",__LINE__,__FUNCTION__);
  2060. }
  2061. else
  2062. {
  2063. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: ATV_NR-3NGY \n\033[0m\n ",__LINE__,__FUNCTION__);
  2064. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNR);
  2065. //PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNRZ);
  2066. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_en ,0);
  2067. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac3, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+6);
  2068. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac4, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+12);
  2069. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac5, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+18);
  2070. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp3 ,6);
  2071. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp4 ,6);
  2072. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp5 ,6);
  2073. }
  2074. }
  2075. /*if (VIP_GetStdColorSystem() == CVD2_STD_SECAM)
  2076. {
  2077. ucSwapTNRLevel = NRGain[4];
  2078. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,0);
  2079. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_en ,0);
  2080. SpecialFlag = 1;
  2081. }*/
  2082. if( ( ((ucTempDCCSceneID == 31 || ucTempDCCSceneID == 32) && ulChromaBin98) || PQ_ChromaBinPercentage(13)>980 ) && !ucVDI_MotionFlag )
  2083. {
  2084. ucSwapTNRLevel = NRGain[4];
  2085. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,0);
  2086. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_en ,0);
  2087. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s ,0);
  2088. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s ,0);
  2089. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope ,0x2);
  2090. PQ_RegisterWrite(VIP_reg_slr_mbw_en ,1);
  2091. #ifdef CONFIG_FORCE_NR_EFFECT_ENHANCED_IN_OFF_OPTION
  2092. SpecialFlag = 1;
  2093. #endif
  2094. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: 31/32 \n\033[0m\n ",__LINE__,__FUNCTION__);
  2095. }
  2096. }
  2097. #ifndef CONFIG_FORCE_NR_EFFECT_ENHANCED_IN_OFF_OPTION
  2098. else
  2099. {
  2100. ucSwapTNRLevel = NRGain[0];
  2101. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s ,2);
  2102. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s ,2);
  2103. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope ,2);
  2104. PQ_RegisterWrite(VIP_reg_slr_mbw_en ,1);
  2105. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,1);
  2106. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_en ,1);
  2107. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNR);
  2108. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNRZ);
  2109. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: ATV_NR-0 \n\033[0m\n ",__LINE__,__FUNCTION__);
  2110. }
  2111. #endif
  2112. if(ucAdjustTNRC)
  2113. {
  2114. ucAdjustTNRC = FALSE;
  2115. ucResetTNRC = TRUE;
  2116. }
  2117. }
  2118. else if( VIP_GetUserSource() == SOURCE_CVD2 && (!VIP_IsATVSource() && VIP_GetStdColorSystem() != CVD2_STD_SECAM))
  2119. {
  2120. if( ucNoiseStatus <= 1 )
  2121. {
  2122. ucSwapTNRLevel = NRGain[0];
  2123. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNR);
  2124. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNRZ);
  2125. }
  2126. else if(ucNoiseStatus <=0x5)
  2127. {
  2128. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNR);
  2129. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNRZ);
  2130. if(ucVDI_MotionFlag == 0)
  2131. ucSwapTNRLevel = NRGain[2];
  2132. else
  2133. ucSwapTNRLevel = NRGain[0];
  2134. }
  2135. else
  2136. {
  2137. ucSwapTNRLevel = NRGain[4];
  2138. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s ,0);
  2139. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s ,0);
  2140. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope ,0x1f);
  2141. PQ_RegisterWrite(VIP_reg_slr_mbw_en ,0);
  2142. if (DPYGrayFlag == 1 && ulChromaBin98 == 1 && ucVDI_MotionFlag == 0)
  2143. {
  2144. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_en ,0);
  2145. PQ_RegisterWrite(VIP_reg_vdi_tnrz_map_en ,0);
  2146. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: AV_NR-3_GY \n\033[0m\n ",__LINE__,__FUNCTION__);
  2147. }
  2148. else
  2149. {
  2150. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: AV_NR-3_NGY \n\033[0m\n ",__LINE__,__FUNCTION__);
  2151. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNR);
  2152. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNRZ);
  2153. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac3, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+6);
  2154. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac4, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+12);
  2155. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_fac5, PQ_RegisterRead(VIP_reg_vdi_tnr_map_fac2)+18);
  2156. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp3 ,6);
  2157. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp4 ,6);
  2158. PQ_RegisterWrite(VIP_reg_vdi_tnr_map_slp5 ,6);
  2159. }
  2160. }
  2161. if(ucAdjustTNRC)
  2162. {
  2163. ucAdjustTNRC = FALSE;
  2164. ucResetTNRC = TRUE;
  2165. }
  2166. }
  2167. else
  2168. {
  2169. ucSwapTNRLevel = NRGain[0];
  2170. }
  2171. if(ucResetTNRC)
  2172. {
  2173. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNR_C);
  2174. }
  2175. if((VIP_GetUserSource() == SOURCE_CVD2 || ((VIP_GetUserSource() == SOURCE_HDMI || VIP_IsSourceDTV() || (VIP_GetUserSource() == SOURCE_EXTS && !VIP_IsPCSource()))&& VIP_GetInputHSize()<=720 )) && (ucLastStaticFlag != ucStaticFlag))
  2176. {
  2177. if(ucStaticFlag == MOTION_FRAME)
  2178. {
  2179. PQ_SetFuzzyEliminate(ENABLE);
  2180. }
  2181. else
  2182. {
  2183. PQ_SetFuzzyEliminate(DISABLE);
  2184. }
  2185. }
  2186. ucLastStaticFlag = ucStaticFlag;
  2187. if((ucSwapTNRLevel == ucLastSwapNRLevel && ucLastNRLevel == pHwContext->nNRLevel) && !pHwContext->bNR_Reset_by_changeSrc)
  2188. {
  2189. return;
  2190. }
  2191. if(VIP_GetUserSource() != SOURCE_CVD2)
  2192. {
  2193. PQ_NR_Init();
  2194. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s ,3);
  2195. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s ,3);
  2196. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope ,2);
  2197. PQ_RegisterWrite(VIP_reg_slr_mbw_en ,1);
  2198. PQ_RegisterWrite(VIP_reg_ds_disable_func_en, ucTempds_disable_func_en);
  2199. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNR);
  2200. PQ_Set_NR_BlockAlpha(NR_BLOCK_ALPHA_TNRZ);
  2201. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: NO_DNR \n\033[0m\n ",__LINE__,__FUNCTION__);
  2202. }
  2203. else
  2204. PQ_NR_TnrzEnable();
  2205. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: ucSwapTNRLevel=%d \n\033[0m\n ",__LINE__,__FUNCTION__,ucSwapTNRLevel);
  2206. if((*((UINT8*)(0xbe1cd688))) == 0x8) printk(KERN_EMERG"\033[1m\033[40;35m [%d]%s: ucNRLevel=%d \n\033[0m\n ",__LINE__,__FUNCTION__,ucNRLevel);
  2207. if(pHwContext->nNRLevel>=WEAK && pHwContext->nNRLevel<=STRONG )
  2208. {
  2209. ucNRLevel = pHwContext->nNRLevel - 1;
  2210. }
  2211. else
  2212. {
  2213. ucNRLevel = OFF;
  2214. }
  2215. if((pHwContext->nNRLevel == OFF) && //NR OFF
  2216. (VIP_GetUserSource() == SOURCE_JPEG ||
  2217. VIP_GetUserSource() == SOURCE_HDMI ||
  2218. VIP_GetUserSource() == SOURCE_MPEG ||
  2219. VIP_IsPCSource()
  2220. ))
  2221. {
  2222. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_CORING, 0);
  2223. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH, 0);
  2224. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_CORING, 0);
  2225. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH, 0);
  2226. PQ_SetupStrength(PQ_ITEM_TNR_ULTRA_LOW, 0);
  2227. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_CORING, 0);
  2228. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_STRENGTH, 0);
  2229. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_CORING, 0);
  2230. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_STRENGTH, 0);
  2231. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_CORING, 0);
  2232. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_STRENGTH, 0);
  2233. }
  2234. else if((pHwContext->nNRLevel == OFF) && ((VIP_GetUserSource() == SOURCE_CVD2) ||(VIP_GetUserSource() == SOURCE_EXTS && !VIP_IsPCSource())))
  2235. {
  2236. #ifndef CONFIG_FORCE_NR_EFFECT_ENHANCED_IN_OFF_OPTION
  2237. if(VIP_IsATVSource())
  2238. {
  2239. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_CORING, 3);
  2240. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH, 3);
  2241. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_CORING, 3);
  2242. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH, 3);
  2243. PQ_SetupStrength(PQ_ITEM_TNR_ULTRA_LOW, 0);
  2244. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_CORING, 2);
  2245. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_STRENGTH, 0);
  2246. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_CORING, 2);
  2247. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_STRENGTH, 2);
  2248. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_CORING, 2);
  2249. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_STRENGTH, 1);
  2250. }
  2251. #else
  2252. if(SpecialFlag)
  2253. {
  2254. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_CORING, (UINT32)pNR_Setting_BY_Group_Idx->LumaTnrCoring.Degree[ucNRLevel] * ucSwapTNRLevel / 100);
  2255. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH,(UINT32) pNR_Setting_BY_Group_Idx->LumaTnrStrength.Degree[ucNRLevel] * ucSwapTNRLevel / 100);
  2256. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_CORING, (UINT32)pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[ucNRLevel] * ucSwapTNRLevel / 100);
  2257. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[ucNRLevel] * ucSwapTNRLevel / 100);
  2258. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_CORING, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr1Coring.Degree[ucNRLevel] * 100 / 100);
  2259. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr1Strength.Degree[ucNRLevel] * 100 / 100);
  2260. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_CORING, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr2Coring.Degree[ucNRLevel] * 100 / 100);
  2261. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr2Strength.Degree[ucNRLevel] * 100 / 100);
  2262. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_CORING, (UINT32)pNR_Setting_BY_Group_Idx->ChromaSnrCoring.Degree[ucNRLevel] * 100 / 100);
  2263. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->ChromaSnrStrength.Degree[ucNRLevel] * 100 / 100);
  2264. }
  2265. #endif
  2266. else
  2267. {
  2268. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_CORING, (UINT32)pNR_Setting_BY_Group_Idx->LumaTnrCoring.Degree[0] * 100 / 100);
  2269. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH,(UINT32) pNR_Setting_BY_Group_Idx->LumaTnrStrength.Degree[0] * 100 / 100);
  2270. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_CORING, (UINT32)pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[0] * 100 / 100);
  2271. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[0] * 100 / 100);
  2272. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_CORING, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr1Coring.Degree[0] * 100 / 100);
  2273. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr1Strength.Degree[0] * 100 / 100);
  2274. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_CORING, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr2Coring.Degree[0] * 100 / 100);
  2275. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr2Strength.Degree[0] * 100 / 100);
  2276. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_CORING, (UINT32)pNR_Setting_BY_Group_Idx->ChromaSnrCoring.Degree[0] * 100 / 100);
  2277. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->ChromaSnrStrength.Degree[0] * 100 / 100);
  2278. }
  2279. }
  2280. else
  2281. {
  2282. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_CORING, (UINT32)pNR_Setting_BY_Group_Idx->LumaTnrCoring.Degree[ucNRLevel] * ucSwapTNRLevel / 100);
  2283. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH,(UINT32) pNR_Setting_BY_Group_Idx->LumaTnrStrength.Degree[ucNRLevel] * ucSwapTNRLevel / 100);
  2284. if (VIP_GetUserSource() == SOURCE_MPEG && ucVDI_static_flag)
  2285. {
  2286. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_CORING, (UINT32)pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[ucNRLevel] * ucCTNRLevel);
  2287. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[ucNRLevel] * ucCTNRLevel);
  2288. }
  2289. else
  2290. {
  2291. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_CORING, (UINT32)pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[ucNRLevel] * ucSwapTNRLevel / 100);
  2292. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->ChromaTnrStrength.Degree[ucNRLevel] * ucSwapTNRLevel / 100);
  2293. }
  2294. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_CORING, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr1Coring.Degree[ucNRLevel] * 100 / 100);
  2295. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr1Strength.Degree[ucNRLevel] * 100 / 100);
  2296. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_CORING, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr2Coring.Degree[ucNRLevel] * 100 / 100);
  2297. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->LumaSnr2Strength.Degree[ucNRLevel] * 100 / 100);
  2298. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_CORING, (UINT32)pNR_Setting_BY_Group_Idx->ChromaSnrCoring.Degree[ucNRLevel] * 100 / 100);
  2299. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_STRENGTH, (UINT32)pNR_Setting_BY_Group_Idx->ChromaSnrStrength.Degree[ucNRLevel] * 100 / 100);
  2300. }
  2301. ucLastSwapNRLevel = ucSwapTNRLevel;
  2302. ucLastNRLevel = pHwContext->nNRLevel;
  2303. pHwContext->bNR_Reset_by_changeSrc = FALSE;
  2304. #endif
  2305. }
  2306. void PQ_LoadSettingValue(UINT8* pVipTable, UINT8 ucTableIndex)
  2307. {
  2308. PQ_TABLE_BOOK* pTableBook= (PQ_TABLE_BOOK*) pVipTable;
  2309. UINT32 ulTableOffset,ulTableCount,ulRegister,ulValue,ulTotal,i;
  2310. volatile UINT32* pAddr;
  2311. PQHW_CONTEXT* pHwContext= &PQHwContext;
  2312. // int j, k, m;
  2313. //int m;
  2314. INT32* pValArray= (INT32*) (&pHwContext->VtabCmnValue);
  2315. if( ucTableIndex>=pTableBook->nTotalTable )
  2316. return;
  2317. ulTotal= sizeof(VTAB_CMN_VALUE_DEFINE)/sizeof(INT32);
  2318. ulTableOffset= pTableBook->TableIndex[ucTableIndex].nOffset + (UINT32)pVipTable;
  2319. ulTableCount= pTableBook->TableIndex[ucTableIndex].nSize >> 3;
  2320. pAddr= (volatile UINT32*) ulTableOffset;
  2321. #if SEPERATE_YPBPR1_YPBPR2
  2322. if( ucTableIndex>=VTAB_EXTS_YPP_VALUE && ucTableIndex<=VTAB_EXTS_YPP2_HD_VALUE)
  2323. #else
  2324. if( ucTableIndex>=VTAB_EXTS_YPP_VALUE && ucTableIndex<=VTAB_HDMI_HD_VALUE)
  2325. #endif
  2326. {
  2327. ulTotal= sizeof(VTAB_SRC_VALUE_DEFINE)/sizeof(INT32);
  2328. pValArray= (INT32*) (&pHwContext->VtabSrcValue[ucTableIndex-VTAB_EXTS_YPP_VALUE]);
  2329. }
  2330. for (i=0; i<ulTableCount; i++)
  2331. {
  2332. ulRegister= *pAddr;
  2333. if( ulRegister & PQ_REG_VALUE_DEFINE )
  2334. {
  2335. ulRegister&= ~PQ_REG_VALUE_DEFINE;
  2336. ulValue= *(pAddr+1);
  2337. if(ucTableIndex ==1)
  2338. {
  2339. //if(ulRegister >= 0xffd)
  2340. //printk("ulRegister=0x%x ulValue=0x%x \n", ulRegister, ulValue);
  2341. }
  2342. //PQDebugPrint("%s: i=0x%lx ulRegister=0x%8.8lx ulValue=0x%8.8lx", __FUNCTION__, i, ulRegister, ulValue);
  2343. if( ulRegister<ulTotal )
  2344. {
  2345. *(&pValArray[ulRegister])= ulValue;
  2346. }
  2347. }
  2348. pAddr+= 2;
  2349. }
  2350. }
  2351. void PQ_InitVtabSRCValue_DF(void)
  2352. {
  2353. PQHW_CONTEXT* pHwContext= &PQHwContext;
  2354. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  2355. //VTAB_SRC_VALUE_DEFINE* pVtabSrcValue;
  2356. #if 0
  2357. int i;
  2358. DIN_FILTER df[VTAB_MAX_SOURCE]={
  2359. {0,0,0,0,0,0,0,0,0}, // YPP
  2360. {0,0,0,0,0,0,0,0,0}, // RGB
  2361. {1,0,0,1,0,0,1,0,0}, // ATV
  2362. {0,0,0,0,0,0,0,0,0}, // AV
  2363. {0,0,0,0,0,0,0,0,0}, // SV
  2364. {1,0,0,1,0,0,1,0,0}, // MPEG
  2365. {0,0,0,0,0,0,0,0,0}, // HDMI
  2366. {0,0,0,0,0,0,0,0,0}, // SCART_RGB
  2367. {0,0,0,0,0,0,0,0,0}, // YPP_HD
  2368. {1,0,0,1,0,0,1,0,0}, // MPEG_HD
  2369. {0,0,0,0,0,0,0,0,0}, // HDMI_HD
  2370. #if SEPERATE_YPBPR1_YPBPR2
  2371. {0,0,0,0,0,0,0,0,0}, // YPP2_SD
  2372. {0,0,0,0,0,0,0,0,0}, // YPP2_HD
  2373. #endif
  2374. };
  2375. i = 0;
  2376. for(i=0; i<VTAB_MAX_SOURCE; i++)
  2377. {
  2378. pVtabSrcValue= &pHwContext->VtabSrcValue[i];
  2379. memcpy(&pVtabSrcValue->DeinterlaceFilter, &df[i], sizeof(DIN_FILTER));
  2380. }
  2381. #endif
  2382. memset(&pVtab->mDeinterlaceFilter.mDeIN_Fil_Data, 0, sizeof(DEIN_FILTER_DATA));
  2383. }
  2384. void PQ_InitVtabValue(void)
  2385. {
  2386. PQHW_CONTEXT* pHwContext= &PQHwContext;
  2387. VTAB_CMN_VALUE_DEFINE* pVtabCmnValue= &pHwContext->VtabCmnValue;
  2388. // VTAB_SRC_VALUE_DEFINE* pVtabSrcValue;
  2389. /*SHARP_INFO sharp_strong[4]= { //hl,hc,vl,vc
  2390. { 6, -2, 100, 127, {63}, 0, 0}, { 6, -2, 100, 127, {63}, 0, 0},
  2391. { 2, -2, 16, 32, {20}, 0, 0}, { 2, -2, 4, 32, {8}, 0, 0} };
  2392. SHARP_INFO sharp_normal[4]= {
  2393. { 6, -2, 20, 64, {8}, 0, 0}, { 6, -2, 20, 64, {8}, 0, 0},
  2394. { 2, -2, 8, 24, {16}, 0, 0}, { 2, -2, 8, 24, {4}, 0, 0} };
  2395. SHARP_INFO sharp_weak[4]= {
  2396. { 6, -2, 0, 0, {4}, 0, 0}, { 6, -2, 0, 0, {4}, 0, 0},
  2397. { 2, -2, 2, 6, {12}, 0, 0}, { 2, -2, 2, 6, {2}, 0, 0} };
  2398. */
  2399. PEAKING_SETTING pk[3]= {
  2400. {-11, 2, 7, 4}, //SD
  2401. {-6, 12, 2, -2},
  2402. {1, 7, 2, 1}, //HD
  2403. };
  2404. STRENGTH_DEFINE StrengthDefine;
  2405. //DC_STRENGTH_DEFINE DCStrengthDefine;
  2406. UINT8 i, PCSrcIdx;
  2407. CSC_SETTING ColorMatirx[2] = {{{0xffffffff}},{{0xffffffff}}};
  2408. INT32 SharpRatio[6] = {6,8,8,10,8,8};
  2409. DS_SHARP_INFO DSWeak[2] = {{0,0,0,16,1023,118,0,{0},{0}},{0,0,0,16,1023,118,0,{0},{0}}};
  2410. DS_SHARP_INFO DSNormal[2] = {{24,48,48,16,1023,118,0,{64},{128}},{24,48,48,16,1023,118,0,{0},{0}}};
  2411. DS_SHARP_INFO DSStrong[2] = {{36,72,72,16,1023,118,0,{64},{128}},{36,72,72,16,1023,118,0,{0},{0}}};
  2412. UINT8 ucSatGainDefault[16] = {0x4a,0x4c,0x4c,0x53,0x50,0x4b,0x48,0x44,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40};
  2413. UINT32 dwDarkSharpDefault[6] = {0x19000c8, 0x3200258, 0xfa0032, 0x3cf0307, 0x102a1004, 0x4};
  2414. #if 0 //( defined(CONFIG_SUPPORT_ATV_PAL) && defined(CONFIG_LOCATION_IS_CN) )
  2415. //ATV
  2416. df[2].sd_slr_mix_ach= df[2].md_slr_mix_ach= df[2].hd_slr_mix_ach= 2; //2009-06-19 JY,
  2417. df[2].sd_vdi_mad_hlp_en= df[2].md_vdi_mad_hlp_en= df[2].hd_vdi_mad_hlp_en= 0;
  2418. #endif
  2419. //init 601/709 FleshTone and ColorRegion
  2420. pVtabCmnValue->mGmaOpt.pc_no_gamma = 0;
  2421. pVtabCmnValue->ucLoadScartRGBTab = 0;
  2422. memcpy(&pVtabCmnValue->mSharpRatio[0], &SharpRatio,sizeof(DS_SHARP_RATIO) );
  2423. memcpy(&pVtabCmnValue->mSharpRatio[1], &SharpRatio,sizeof(DS_SHARP_RATIO) );
  2424. pVtabCmnValue->iSharpRatio6 = 0;
  2425. pVtabCmnValue->iSharpRatio6_c = 0;
  2426. //init CSC Table
  2427. memcpy(&pVtabCmnValue->mColorSpaceConversionTable[CSC_RGB], ColorSpaceTableRGB, sizeof(CSC_SETTING));
  2428. memcpy(&pVtabCmnValue->mColorSpaceConversionTable[CSC_601], ColorSpaceTableYCC_Full601, sizeof(CSC_SETTING));
  2429. memcpy(&pVtabCmnValue->mColorSpaceConversionTable[CSC_709], ColorSpaceTableYCC_Full709, sizeof(CSC_SETTING));
  2430. memset(pVtabCmnValue->mSatGainCurve.mSatGainCurveSource, 0x0, 20);
  2431. memset(pVtabCmnValue->mSatGainCurve.sat_gb, 0x40, 8*16); // set linier
  2432. memcpy(pVtabCmnValue->mSatGainCurve.sat_gb, ucSatGainDefault, 16); // for compatibility setting before VIPTable v32
  2433. //calc sharpness pivotx,y
  2434. for(i=0; i<4; i++)
  2435. {
  2436. //PQ_CalcPivotxy(&sharp_strong[i]);
  2437. //PQ_CalcPivotxy(&sharp_normal[i]);
  2438. //PQ_CalcPivotxy(&sharp_weak[i]);
  2439. }
  2440. //init nr,mpeg nr strength define
  2441. StrengthDefine.Degree[WEAK-1]= 4;
  2442. StrengthDefine.Degree[MEDIUM-1]= 8;
  2443. StrengthDefine.Degree[STRONG-1]= 12;
  2444. for(i=0; i<VIP_TABLE_GROUPED_NUMBER; i++)
  2445. {
  2446. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].LumaTnrCoring, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  2447. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].LumaTnrStrength, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  2448. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].ChromaTnrCoring, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  2449. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].ChromaTnrStrength, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  2450. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].LumaSnr1Coring, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  2451. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].LumaSnr1Strength, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  2452. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].LumaSnr2Coring, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  2453. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].LumaSnr2Strength, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  2454. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].ChromaSnrCoring, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  2455. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].ChromaSnrStrength, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  2456. //weifeng, need check if still used after 531
  2457. //memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].TnrUltraLowAlpha, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  2458. //memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].Snr1UltraLowCoring, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  2459. //memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].Snr2UltraLowCoring, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  2460. }
  2461. //init nr,mpeg nr strength define
  2462. StrengthDefine.Degree[WEAK-1]= 2;
  2463. StrengthDefine.Degree[MEDIUM-1]= 5;
  2464. StrengthDefine.Degree[STRONG-1]= 8;
  2465. for(i=0; i<VIP_TABLE_GROUPED_NUMBER; i++)
  2466. {
  2467. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].BlockNrCoring, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  2468. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].BlockNrStrength, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  2469. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].MosquitoNrCoring, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  2470. memcpy(&pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].MosquitoNrStrength, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  2471. }
  2472. //ultra low en
  2473. for(i=0; i<VIP_TABLE_GROUPED_NUMBER; i++)
  2474. {
  2475. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].TnrUltraLowCtl= 0;
  2476. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[i].SnrUltraLowCtl= 0;
  2477. }
  2478. //init peaking setting
  2479. for(i=0; i<VIP_TABLE_GROUPED_NUMBER; i++)
  2480. {
  2481. printk("[%s-%d]=======>!!! Initial Peaking\n", __FUNCTION__, __LINE__);
  2482. memcpy(&pVtabCmnValue->mPeaking.mPeaking_Data[i], pk, 3*sizeof(PEAKING_SETTING));
  2483. }
  2484. PCSrcIdx = pVtabCmnValue->mDS_Sharpenss.mGroupedIndex[SRC_INDEX_PC];
  2485. StrengthDefine.Degree[WEAK-1]= 0x88a886;
  2486. StrengthDefine.Degree[MEDIUM-1]= 0x88a886;
  2487. StrengthDefine.Degree[STRONG-1]= 0x88a886;
  2488. for(i=0; i<VIP_TABLE_GROUPED_NUMBER; i++)
  2489. {
  2490. //ds sharpness
  2491. memcpy(pVtabCmnValue->mDS_Sharpenss.mDS_Sharpness_Data[i].DSSharpWeak, DSWeak, 2*sizeof(DS_SHARP_INFO));
  2492. memcpy(pVtabCmnValue->mDS_Sharpenss.mDS_Sharpness_Data[i].DSSharpNormal, DSNormal, 2*sizeof(DS_SHARP_INFO));
  2493. memcpy(pVtabCmnValue->mDS_Sharpenss.mDS_Sharpness_Data[i].DSSharpStrong, DSStrong, 2*sizeof(DS_SHARP_INFO));
  2494. //horizontal sharpness 20120724
  2495. memcpy(pVtabCmnValue->mHOR_Sharpenss.mHOR_Sharpness_Data[i].HorSharpWeak, DSWeak, 2*sizeof(DS_SHARP_INFO));
  2496. memcpy(pVtabCmnValue->mHOR_Sharpenss.mHOR_Sharpness_Data[i].HorSharpNormal, DSNormal, 2*sizeof(DS_SHARP_INFO));
  2497. memcpy(pVtabCmnValue->mHOR_Sharpenss.mHOR_Sharpness_Data[i].HorSharpStrong, DSStrong, 2*sizeof(DS_SHARP_INFO));
  2498. memset(&pVtabCmnValue->mHOR_Sharpenss.mHOR_Sharpness_Data[i].HorSharpWeak[0], 0, 3*sizeof(INT32));
  2499. memset(&pVtabCmnValue->mHOR_Sharpenss.mHOR_Sharpness_Data[i].HorSharpWeak[1], 0, 3*sizeof(INT32));
  2500. memset(&pVtabCmnValue->mHOR_Sharpenss.mHOR_Sharpness_Data[i].HorSharpNormal[0], 0, 3*sizeof(INT32));
  2501. memset(&pVtabCmnValue->mHOR_Sharpenss.mHOR_Sharpness_Data[i].HorSharpNormal[1], 0, 3*sizeof(INT32));
  2502. memset(&pVtabCmnValue->mHOR_Sharpenss.mHOR_Sharpness_Data[i].HorSharpStrong[0], 0, 3*sizeof(INT32));
  2503. memset(&pVtabCmnValue->mHOR_Sharpenss.mHOR_Sharpness_Data[i].HorSharpStrong[1], 0, 3*sizeof(INT32));
  2504. //sharpness filter
  2505. if(i == PCSrcIdx) // pc source
  2506. {
  2507. pVtabCmnValue->mDS_Sharpenss.mDS_Sharpness_Data[i].DS_Sharp_Angle = 0x00020202;
  2508. }
  2509. else
  2510. {
  2511. pVtabCmnValue->mDS_Sharpenss.mDS_Sharpness_Data[i].DS_Sharp_Angle = 0x00040404;
  2512. }
  2513. memcpy(&pVtabCmnValue->mDS_Sharpenss.mDS_Sharpness_Data[i].SlrSharpRatio, &StrengthDefine, sizeof(STRENGTH_DEFINE));
  2514. memcpy(&pVtabCmnValue->mDS_Sharpenss.mDS_Sharpness_Data[i].DSSharpDark,dwDarkSharpDefault, sizeof(DARK_SHARP_INFO));
  2515. memcpy(&pVtabCmnValue->mHOR_Sharpenss.mHOR_Sharpness_Data[i].HorSharpDark,dwDarkSharpDefault, sizeof(DARK_SHARP_INFO));
  2516. }
  2517. //memcpy(pVtabCmnValue->, MiddleRegion, 4*sizeof(CR_MSETTING) );
  2518. for(i=0; i<VIP_TABLE_GROUPED_NUMBER; i++)
  2519. {
  2520. //init reg range
  2521. pVtabCmnValue->mRange.mRange_Data[i].BrightnessRange.min= -64;
  2522. pVtabCmnValue->mRange.mRange_Data[i].BrightnessRange.max= 64;
  2523. pVtabCmnValue->mRange.mRange_Data[i].BrightnessRange.middle= 0;
  2524. pVtabCmnValue->mRange.mRange_Data[i].ContrastRange.min= 0x20;
  2525. pVtabCmnValue->mRange.mRange_Data[i].ContrastRange.max= 0x60;
  2526. pVtabCmnValue->mRange.mRange_Data[i].ContrastRange.middle= 0x40;
  2527. pVtabCmnValue->mRange.mRange_Data[i].SaturationRange.min= 0;
  2528. pVtabCmnValue->mRange.mRange_Data[i].SaturationRange.max= 127;
  2529. pVtabCmnValue->mRange.mRange_Data[i].SaturationRange.middle= 64;
  2530. pVtabCmnValue->mRange.mRange_Data[i].HueRange.min= 0;
  2531. pVtabCmnValue->mRange.mRange_Data[i].HueRange.max= 32;
  2532. pVtabCmnValue->mRange.mRange_Data[i].HueRange.middle= 16;
  2533. pVtabCmnValue->mRange.mRange_Data[i].ColorTempGainRange.min= 0;
  2534. pVtabCmnValue->mRange.mRange_Data[i].ColorTempGainRange.max= 127;
  2535. pVtabCmnValue->mRange.mRange_Data[i].ColorTempGainRange.middle= 64;
  2536. pVtabCmnValue->mRange.mRange_Data[i].ColorTempOffsetRange.min= -128;
  2537. pVtabCmnValue->mRange.mRange_Data[i].ColorTempOffsetRange.max= 127;
  2538. pVtabCmnValue->mRange.mRange_Data[i].ColorTempOffsetRange.middle= 0;
  2539. //init color region contrl by source
  2540. //for(j = 0; j <4; j++)
  2541. //pVtabSrcValue->ColorRegionSrcCtl[j] = 0x80; //ctl disable
  2542. memcpy(pVtabCmnValue->mColorMatrix.mSrcColorMatrix[i].mSrcColorMatrix, ColorMatirx, 2*sizeof(CSC_SETTING));
  2543. //init dynamic contrast
  2544. /*
  2545. DCStrengthDefine.Degree[WEAK-1]=0x00000119;
  2546. DCStrengthDefine.Degree[MEDIUM-1]=0x00000134;
  2547. DCStrengthDefine.Degree[STRONG-1]=0x0000014c;
  2548. DCStrengthDefine.Degree[WEAK-1]=0x011900e8;
  2549. DCStrengthDefine.Degree[MEDIUM-1]=0x013400d5;
  2550. DCStrengthDefine.Degree[STRONG-1]=0x014c00c4;
  2551. DCStrengthDefine.Degree[WEAK-1]=0x00108080;
  2552. DCStrengthDefine.Degree[MEDIUM-1]=0x00108080;
  2553. DCStrengthDefine.Degree[STRONG-1]=0x00108080;
  2554. */
  2555. memset(&pVtabCmnValue->mRange.mRange_Data[i].BrightnessRangeExt, 0, sizeof(REG_RANGE_EXT)); // 0 -> disable default
  2556. memset(&pVtabCmnValue->mRange.mRange_Data[i].ContrastRangeExt, 0, sizeof(REG_RANGE_EXT)); // 0 -> disable default
  2557. memset(&pVtabCmnValue->mRange.mRange_Data[i].SaturationRangeExt, 0, sizeof(REG_RANGE_EXT)); // 0 -> disable default
  2558. }
  2559. pVtabCmnValue->SlrLowAngleOrMBWDisable = 0x7;
  2560. //initialize to avoid kernal panic before assign the pointer
  2561. pHwContext->CurColorMatrix=&pVtabCmnValue->mColorSpaceConversionTable[CSC_601];
  2562. }
  2563. //================================================================================
  2564. // function name : PQ_InitialTable()
  2565. // input parameter : none
  2566. // output parameter : none
  2567. // purpose : setup PQ initial value or fix setting
  2568. // return :
  2569. void PQ_InitialTable(void)
  2570. {
  2571. PQHW_CONTEXT* pHwContext= &PQHwContext;
  2572. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  2573. pHwContext->LoadPQTable=0;
  2574. #ifdef DYNAMIC_BACKLIGHT
  2575. pHwContext->ucLocationMode = STOREMODE;
  2576. pHwContext->ucDynamicBacklightMode=0;
  2577. PQ_InitDynamicBackLight();
  2578. #endif //#ifdef DYNAMIC_BACKLIGHT
  2579. pHwContext->CurColorMatrix = NULL;
  2580. pHwContext->pCurVtabSrcValue= &pHwContext->VtabSrcValue[0];
  2581. pMenuValue->bNoGamma = FALSE; // VIP_SetupGammaTable(ENABLE, 0);
  2582. pHwContext->nColorSpaceMode= PQ_COLOR_SPACE_NONE;
  2583. pHwContext->bDynamicSaturation= DISABLE;
  2584. pHwContext->bEnableColorProcess= TRUE;
  2585. pHwContext->bFadeEn = FALSE;
  2586. pHwContext->bPWMOff = FALSE;
  2587. memset(&pHwContext->mSharp_PREDCTI_Reserve, 0, sizeof(SHARP_PREDCTI_RESERVE));
  2588. memset(&pHwContext->mSharp_POSTDCTI_Reserve, 0, sizeof(SHARP_POSTDCTI_RESERVE));
  2589. memset(&pHwContext->mSharp_POSTDLTI_Reserve, 0, sizeof(SHARP_POSTDLTI_RESERVE));
  2590. memset(&pHwContext->mSharp_POST2D_Reserve, 0, sizeof(SHARP_POST2D_RESERVE));
  2591. pHwContext->PqPatch.Post2DPatch = POST_2D_SHARPNESS_DEFAULT;
  2592. spin_lock_init(&pHwContext->Spin_PresetContrast);
  2593. PQ_InitVtabValue();
  2594. //default menu value¡õ¡õ
  2595. pMenuValue->iContrast = pHwContext->iCurrContrastValue = 1024;
  2596. //default menu value¡ô¡ô
  2597. PQ_RegisterWrite(VIP_reg_dpy_dither_sel, 0);
  2598. //OSD & GAMMA swap enable in 531
  2599. PQ_RegisterWrite(DPY_COMM_C08C_DW_C08C, 1);
  2600. PQ_DS_Init();
  2601. PQ_NR_Init();
  2602. PQ_FleshTone_Init();
  2603. PQ_HW_Initial();
  2604. PQ_DefaultSetting();
  2605. #ifdef CONFIG_PANEL_LM201WE3_TLF5_1680X1050__S2TEK_IS_DEFAULT
  2606. //OSD & GAMMA swap enable in 531
  2607. PQ_RegisterWrite(VIP_reg_osd_after_gamma, 0);
  2608. #else
  2609. PQ_RegisterWrite(VIP_reg_osd_after_gamma, 1);
  2610. #endif
  2611. pHwContext->CVD2_store_nr_setting=0;
  2612. //PQ_RegisterWrite(VIP_reg_dpy_round, 0x0);
  2613. //20140624 HD VideoBook Blue pettern
  2614. //HiVi Case15 Blue+Gray pattern, junction with black edges
  2615. PQ_RegisterWrite(VIP_reg_dpy_ye0_idx_sat, 0x9);
  2616. WQ_Struct_NRAdjust = create_singlethread_workqueue("NR_Adjust_Workqueue");
  2617. INIT_WORK(&WQ_NRAdjust,(work_func_t)PQ_AdjustNr);
  2618. WQ_Struct_SWDC = create_singlethread_workqueue("SWDC_Workqueue");
  2619. INIT_WORK(&WQ_SWDC,(work_func_t)PQ_SW_DynamicContrast_SceneChangeDetect_ISR);
  2620. WQ_Struct_ColorBarDetect = create_singlethread_workqueue("ColorBarDetect_Workqueue");
  2621. INIT_WORK(&WQ_ColorBarDetect,(work_func_t)PQ_ColorBarDetect);
  2622. }
  2623. //****************************************************************************
  2624. //
  2625. // Function : PQ_Brightness
  2626. // Params : iValue (-128~+127)
  2627. // Description:
  2628. // Returns : void
  2629. //****************************************************************************
  2630. void PQ_Brightness(UINT8 bReset, INT32 iValue) //-128~+127 => -64~64
  2631. {
  2632. PQHW_CONTEXT* pHwContext= &PQHwContext;
  2633. static UINT8 bStart = FALSE;
  2634. if(bReset)
  2635. {
  2636. bStart = TRUE;
  2637. return;
  2638. }
  2639. if(bStart)
  2640. {
  2641. bStart = FALSE;
  2642. if( pHwContext->bEnableColorProcess==FALSE )
  2643. iValue= 0;
  2644. //iValue -=512;
  2645. iValue -=BRIGHTNESS_OFFSET;
  2646. PQDebugPrint("%s: iValue=%d\n", __FUNCTION__, iValue);
  2647. pHwContext->iBrightness=iValue;
  2648. PQ_ColorMatrixComp(TRUE);
  2649. PQ_PureColorControl((iValue-1)/21, 1);
  2650. }
  2651. }
  2652. void PQ_ColorMatrixSetup(UINT8 bReset, UINT8 ucNum)
  2653. {
  2654. PQHW_CONTEXT* pHwContext= &PQHwContext;
  2655. INT32 *piGain = &pHwContext->iRGain;
  2656. INT32 iCSC_AfterHueSat = 50;
  2657. INT32 iCSC_Value;
  2658. LONG LONG INT32 lliTmpValue;
  2659. COLOR_MATRIX_INT *pCurMatrix = (COLOR_MATRIX_INT *)pHwContext->CurColorMatrix->CSC_Value;
  2660. static UINT16 usNum = 0;
  2661. static UINT8 bStart = FALSE;
  2662. if(!pHwContext->CurColorMatrix)
  2663. return;
  2664. if(bReset)
  2665. {
  2666. usNum |= 1<<ucNum;
  2667. bStart = TRUE;
  2668. return;
  2669. }
  2670. if(bStart)
  2671. {
  2672. INT32 i;
  2673. bStart = FALSE;
  2674. for(i=0;i<9;i++)
  2675. {
  2676. if(((usNum>>i)&1) == 1)
  2677. {
  2678. ucNum = i;
  2679. if (ucNum%3)
  2680. {
  2681. switch(ucNum%3)
  2682. {
  2683. case 1:
  2684. iCSC_AfterHueSat = pCurMatrix[ucNum].iValue*NewHueSetting[pHwContext->iHue].cosine-
  2685. pCurMatrix[ucNum+1].iValue*NewHueSetting[pHwContext->iHue].sine;
  2686. break;
  2687. case 2:
  2688. iCSC_AfterHueSat = pCurMatrix[ucNum].iValue*NewHueSetting[pHwContext->iHue].cosine+
  2689. pCurMatrix[ucNum-1].iValue*NewHueSetting[pHwContext->iHue].sine;
  2690. break;
  2691. }
  2692. iCSC_AfterHueSat *= pHwContext->iSaturation;
  2693. }
  2694. else
  2695. iCSC_AfterHueSat = pCurMatrix[ucNum].iValue<<(8+COLOR_MATRIX_GAIN_BIT_SYSTEM);
  2696. lliTmpValue = pHwContext->iContrast * (LONG LONG INT32)piGain[ucNum/3];
  2697. lliTmpValue = lliTmpValue * iCSC_AfterHueSat;
  2698. lliTmpValue = lliTmpValue >> (COLOR_MATRIX_GAIN_BIT_SYSTEM+COLOR_MATRIX_GAIN_BIT_SYSTEM+COLOR_MATRIX_GAIN_BIT_SYSTEM+8);
  2699. iCSC_Value = lliTmpValue;
  2700. //PQ_ADVANCE_HWPrint("%s: contrast = %d , gain = %d, matrix = %d ",__FUNCTION__,pHwContext->iContrast , iGain , pHwContext->CurColorMatrix->CSC_Value[ucNum]);
  2701. //PQ_ADVANCE_HWPrint("%s: matrix[%d] = %d",__FUNCTION__, ucNum, iTmpValue);
  2702. iCSC_Value = min(8191, max(iCSC_Value, -8192));
  2703. PQ_RegisterWrite(VIP_reg_dpy_matrix_a11 + ucNum*4 , pHwContext->bEnableColorProcess?iCSC_Value:pCurMatrix[ucNum].iValue);
  2704. usNum &= ~(1<<i);
  2705. }
  2706. }
  2707. }
  2708. }
  2709. //****************************************************************************
  2710. //
  2711. // Function : PQ_Contrast
  2712. // Params :
  2713. // Description:
  2714. // Returns : void
  2715. //****************************************************************************
  2716. void PQ_Contrast(UINT8 bReset, INT32 iValue) // 0 ~ 127 => 0x20~0x60
  2717. {
  2718. PQHW_CONTEXT* pHwContext= &PQHwContext;
  2719. INT32 i;
  2720. static UINT8 bStart = FALSE;
  2721. if(!PQ_IsFadeEn())//if fade effect, do contrast
  2722. {
  2723. if(bReset)
  2724. {
  2725. bStart = TRUE;
  2726. return;
  2727. }
  2728. }
  2729. if(bStart || PQ_IsFadeEn())
  2730. {
  2731. bStart = FALSE;
  2732. if( pHwContext->bEnableColorProcess==FALSE)
  2733. iValue=64;
  2734. if(PQ_IsFadeEn()==FALSE) //backup for fade in/out
  2735. pHwContext->iCurrContrastValue= iValue;
  2736. pHwContext->iContrast=iValue<<(COLOR_MATRIX_GAIN_BIT_SYSTEM-COLOR_MATRIX_GAIN_OSD_BIT_SYSTEM);
  2737. for(i=0; i<9 ;i++)
  2738. PQ_ColorMatrixSetup(TRUE, i);
  2739. PQ_ColorMatrixComp(TRUE);
  2740. PQ_PureColorControl((iValue-1024+1)/10, 2);
  2741. }
  2742. }
  2743. //****************************************************************************
  2744. // Function : PQ_Sharpness_Control_In_3D
  2745. // Params : bStatus : 0 = stop sharpness and NR function, 1 = resume sharpness and NR fnction
  2746. // Description: (1)in 3D mode, disable sharpness_2D and bypass NR
  2747. // Returns : void
  2748. //****************************************************************************
  2749. void PQ_Sharpness_Control_In_3D(UINT8 bStatus)
  2750. {
  2751. if(bStatus == DISABLE)
  2752. {
  2753. PQ_RegisterWrite(VIP_reg_slr_2d_sharp_en, DISABLE);
  2754. PQ_RegisterWrite(VIP_reg_slr_snr_bypass, ENABLE);
  2755. PQ_RegisterWrite(VIP_reg_slr_s_snr_bypass, ENABLE);
  2756. }
  2757. else
  2758. {
  2759. PQHW_CONTEXT* pHwContext= &PQHwContext;
  2760. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  2761. SHARP_POST2DSHARPNESS* pPost2DSharpness = &pVtab->mSharpness_Post2DSharpness;
  2762. SHARP_POST2DSHARPNESS_DATA* pPost2DSharpData;
  2763. UINT8 ucCurrSrcIndex, ucTableIndex;
  2764. ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  2765. ucTableIndex = pPost2DSharpness->mGroupedIndex[ucCurrSrcIndex];
  2766. pPost2DSharpData = &pPost2DSharpness->mPost2DSharpData[ucTableIndex];
  2767. PQ_RegisterWrite(VIP_reg_slr_2d_sharp_en, pPost2DSharpData->iPost2DSharpEnable);
  2768. PQ_RegisterWrite(VIP_reg_slr_snr_bypass, DISABLE);
  2769. PQ_RegisterWrite(VIP_reg_slr_s_snr_bypass, DISABLE);
  2770. }
  2771. }
  2772. void PQ_Sharpness_PREDCTI(BOOL bReset, UINT8 ucValue)
  2773. {
  2774. PQHW_CONTEXT* pHwContext= &PQHwContext;
  2775. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  2776. SHARP_PREDCTI* pSHARP_PREDCTI = &pVtab->mSharpness_PreDCTI;
  2777. SHARP_PREDCTI_DATA* pSHARP_PREDCTI_DATA;
  2778. SHARP_PREDCTI_RESERVE* pSharp_PRECTI_Reserve;
  2779. UINT8 ucCurrSrcIndex, ucTableIndex;
  2780. 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};
  2781. static UINT32 dwPreDCTITHReg[2] = {VIP_reg_slr_dcti_gain_th0_pre,VIP_reg_slr_dcti_gain_th1_pre};
  2782. static UINT32 dwPreDCTISlopeReg[2] = {VIP_reg_slr_dcti_gain_slope0_pre,VIP_reg_slr_dcti_gain_slope1_pre};
  2783. static UINT8 bStart = FALSE;
  2784. ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  2785. if ((ucCurrSrcIndex >= SRC_INDEX_UNKNOWN))
  2786. {
  2787. PQDebugPrint("%s: SrcIndex (%d) unknown/invalid, pLUTTable->SrcCount (%d)!", __FUNCTION__, ucCurrSrcIndex,pLUTTable->SrcCount);
  2788. return;
  2789. }
  2790. ucTableIndex = pSHARP_PREDCTI->mGroupedIndex[ucCurrSrcIndex];
  2791. pSHARP_PREDCTI_DATA = &pSHARP_PREDCTI->mPreDCTIData[ucTableIndex];
  2792. pSharp_PRECTI_Reserve = &pHwContext->mSharp_PREDCTI_Reserve;
  2793. if(bReset)
  2794. {
  2795. bStart = TRUE;
  2796. if( ucValue>127 )
  2797. ucValue= 127;
  2798. PQDebugPrint("%s:ucValue=%d", __FUNCTION__, ucValue);
  2799. if( ucValue<64 )
  2800. {
  2801. 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;
  2802. 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;
  2803. 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;
  2804. 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;
  2805. 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;
  2806. 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;
  2807. 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;
  2808. }
  2809. else
  2810. {
  2811. //from normal to strong
  2812. ucValue-= 64;
  2813. 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;
  2814. 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;
  2815. 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;
  2816. 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;
  2817. 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;
  2818. 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;
  2819. 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;
  2820. }
  2821. pSharp_PRECTI_Reserve->iTargetScale = pSHARP_PREDCTI_DATA->iScale[PQ_SHARPNESS_50PERCENT];
  2822. pSharp_PRECTI_Reserve->iTargetGainTap = pSHARP_PREDCTI_DATA->iGainTap[PQ_SHARPNESS_50PERCENT];
  2823. pSharp_PRECTI_Reserve->iTargetShootTap = pSHARP_PREDCTI_DATA->iShootTap[PQ_SHARPNESS_50PERCENT];
  2824. return;
  2825. }
  2826. if(bStart)
  2827. {
  2828. bStart = FALSE;
  2829. if( pHwContext->bEnableColorProcess==FALSE )
  2830. {
  2831. PQ_RegisterWrite(dwPreDCTIFacReg[0], 0);
  2832. PQ_RegisterWrite(dwPreDCTIFacReg[1], 0);
  2833. PQ_RegisterWrite(dwPreDCTIFacReg[2], 0);
  2834. return;
  2835. }
  2836. #ifdef CONFIG_APPLY_DIFFERENT_SHARPNESS_SETTING_IN_PANEL_INVERT
  2837. if(VIP_GetFlipMode()==HV_FLIP || VIP_GetFlipMode() == H_FLIP || VIP_GetFlipMode() == V_FLIP || VIP_GetPanelInvert())
  2838. {
  2839. /* Modify sharpness setting in invert panel here */
  2840. }
  2841. else
  2842. {
  2843. /* Modify another sharpness setting in regular panel here */
  2844. }
  2845. #else
  2846. /* Check different setting status and remove same setting item to here */
  2847. #endif
  2848. if(VIP_IsSourceDTV() || !PQ_SWDTColorBar())
  2849. {
  2850. PQ_RegisterWrite(VIP_reg_slr_dcti_en_pre, pSHARP_PREDCTI_DATA->iPreDCTIEnable);
  2851. PQ_RegisterWrite(VIP_reg_slr_pre_icp_en_pre, pSHARP_PREDCTI_DATA->iPreChromaFilterEnable);
  2852. PQ_RegisterWrite(VIP_reg_slr_pre_icp_alpha_pre, pSHARP_PREDCTI_DATA->iPreChromaFilterLevel);
  2853. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_pre, pSharp_PRECTI_Reserve->iTargetScale);
  2854. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_pre, pSharp_PRECTI_Reserve->iTargetGainTap);
  2855. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_pre, pSharp_PRECTI_Reserve->iTargetShootTap);
  2856. }
  2857. PQ_RegisterWrite(VIP_reg_slr_post_icp_en_pre, pSHARP_PREDCTI_DATA->iPostChromaFilterEnable);
  2858. PQ_RegisterWrite(VIP_reg_slr_dcti_c1_pre, pSHARP_PREDCTI_DATA->icoef[0]);
  2859. PQ_RegisterWrite(VIP_reg_slr_dcti_c2_pre, pSHARP_PREDCTI_DATA->icoef[1]);
  2860. PQ_RegisterWrite(VIP_reg_slr_dcti_c3_pre, pSHARP_PREDCTI_DATA->icoef[2]);
  2861. PQ_RegisterWrite(dwPreDCTIFacReg[0], pSharp_PRECTI_Reserve->iTagetFac0);
  2862. PQ_RegisterWrite(dwPreDCTIFacReg[1], pSharp_PRECTI_Reserve->iTagetFac1);
  2863. PQ_RegisterWrite(dwPreDCTIFacReg[2], pSharp_PRECTI_Reserve->iTagetFac2);
  2864. PQ_RegisterWrite(dwPreDCTITHReg[0], pSharp_PRECTI_Reserve->iTagetTh0);
  2865. PQ_RegisterWrite(dwPreDCTITHReg[1], pSharp_PRECTI_Reserve->iTagetTh1);
  2866. PQ_RegisterWrite(dwPreDCTISlopeReg[0], pSharp_PRECTI_Reserve->iTagetSlp0);
  2867. PQ_RegisterWrite(dwPreDCTISlopeReg[1], pSharp_PRECTI_Reserve->iTagetSlp1);
  2868. utempCheckColorbarDTFunctionEN = 0;
  2869. }
  2870. }
  2871. void PQ_Sharpness_POSTDCTI(BOOL bReset,UINT8 ucValue)
  2872. {
  2873. PQHW_CONTEXT* pHwContext= &PQHwContext;
  2874. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  2875. SHARP_POSTDCTI* pSHARP_POSTDCTI = &pVtab->mSharpness_PostDCTI;
  2876. SHARP_POSTDCTI_DATA* pPostDCTIData;
  2877. SHARP_POSTDCTI_RESERVE *pSharp_POSTDCTI_Reserve;
  2878. UINT8 ucCurrSrcIndex, ucTableIndex;
  2879. static UINT8 bStart = FALSE;
  2880. ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  2881. if ((ucCurrSrcIndex >= SRC_INDEX_UNKNOWN))
  2882. {
  2883. PQDebugPrint("%s: SrcIndex (%d) unknown/invalid, pLUTTable->SrcCount (%d)!", __FUNCTION__, ucCurrSrcIndex,pLUTTable->SrcCount);
  2884. return;
  2885. }
  2886. ucTableIndex = pSHARP_POSTDCTI->mGroupedIndex[ucCurrSrcIndex];
  2887. pPostDCTIData = &pSHARP_POSTDCTI->mPostDCTIData[ucTableIndex];
  2888. pSharp_POSTDCTI_Reserve = &pHwContext->mSharp_POSTDCTI_Reserve;
  2889. if(bReset)
  2890. {
  2891. bStart = TRUE;
  2892. if( ucValue>127 )
  2893. ucValue= 127;
  2894. PQDebugPrint("%s:ucValue=%d", __FUNCTION__, ucValue);
  2895. if( ucValue<64 )
  2896. {
  2897. pSharp_POSTDCTI_Reserve->iTagetFac0 = pPostDCTIData->iGain0[PQ_SHARPNESS_0PERCENT]+ (pPostDCTIData->iGain0[PQ_SHARPNESS_50PERCENT] - pPostDCTIData->iGain0[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  2898. pSharp_POSTDCTI_Reserve->iTagetFac1 = pPostDCTIData->iGain1[PQ_SHARPNESS_0PERCENT]+ (pPostDCTIData->iGain1[PQ_SHARPNESS_50PERCENT] - pPostDCTIData->iGain1[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  2899. pSharp_POSTDCTI_Reserve->iTagetFac2 = pPostDCTIData->iGain2[PQ_SHARPNESS_0PERCENT]+ (pPostDCTIData->iGain2[PQ_SHARPNESS_50PERCENT] - pPostDCTIData->iGain2[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  2900. pSharp_POSTDCTI_Reserve->iTagetTh0 = pPostDCTIData->iTh0[PQ_SHARPNESS_0PERCENT]+ (pPostDCTIData->iTh0[PQ_SHARPNESS_50PERCENT] - pPostDCTIData->iTh0[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  2901. pSharp_POSTDCTI_Reserve->iTagetTh1 = pPostDCTIData->iTh1[PQ_SHARPNESS_0PERCENT]+ (pPostDCTIData->iTh1[PQ_SHARPNESS_50PERCENT] - pPostDCTIData->iTh1[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  2902. pSharp_POSTDCTI_Reserve->iTagetSlp0 = pPostDCTIData->iSlope0[PQ_SHARPNESS_0PERCENT]+ (pPostDCTIData->iSlope0[PQ_SHARPNESS_50PERCENT] - pPostDCTIData->iSlope0[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  2903. pSharp_POSTDCTI_Reserve->iTagetSlp1 = pPostDCTIData->iSlope1[PQ_SHARPNESS_0PERCENT]+ (pPostDCTIData->iSlope1[PQ_SHARPNESS_50PERCENT] - pPostDCTIData->iSlope1[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  2904. pSharp_POSTDCTI_Reserve->iTargetScale = pPostDCTIData->iScale[PQ_SHARPNESS_0PERCENT]+ (pPostDCTIData->iScale[PQ_SHARPNESS_50PERCENT] - pPostDCTIData->iScale[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  2905. pSharp_POSTDCTI_Reserve->iTargetGainTap = pPostDCTIData->iGainTap[PQ_SHARPNESS_0PERCENT]+ (pPostDCTIData->iGainTap[PQ_SHARPNESS_50PERCENT] - pPostDCTIData->iGainTap[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  2906. pSharp_POSTDCTI_Reserve->iTargetShootTap = pPostDCTIData->iShootTap[PQ_SHARPNESS_0PERCENT]+ (pPostDCTIData->iShootTap[PQ_SHARPNESS_50PERCENT] - pPostDCTIData->iShootTap[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  2907. }
  2908. else
  2909. {
  2910. //from normal to strong
  2911. ucValue-= 64;
  2912. pSharp_POSTDCTI_Reserve->iTagetFac0 = pPostDCTIData->iGain0[PQ_SHARPNESS_50PERCENT]+ (pPostDCTIData->iGain0[PQ_SHARPNESS_100PERCENT] - pPostDCTIData->iGain0[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  2913. pSharp_POSTDCTI_Reserve->iTagetFac1 = pPostDCTIData->iGain1[PQ_SHARPNESS_50PERCENT]+ (pPostDCTIData->iGain1[PQ_SHARPNESS_100PERCENT] - pPostDCTIData->iGain1[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  2914. pSharp_POSTDCTI_Reserve->iTagetFac2 = pPostDCTIData->iGain2[PQ_SHARPNESS_50PERCENT]+ (pPostDCTIData->iGain2[PQ_SHARPNESS_100PERCENT] - pPostDCTIData->iGain2[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  2915. pSharp_POSTDCTI_Reserve->iTagetTh0 = pPostDCTIData->iTh0[PQ_SHARPNESS_50PERCENT]+ (pPostDCTIData->iTh0[PQ_SHARPNESS_100PERCENT] - pPostDCTIData->iTh0[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  2916. pSharp_POSTDCTI_Reserve->iTagetTh1 = pPostDCTIData->iTh1[PQ_SHARPNESS_50PERCENT]+ (pPostDCTIData->iTh1[PQ_SHARPNESS_100PERCENT] - pPostDCTIData->iTh1[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  2917. pSharp_POSTDCTI_Reserve->iTagetSlp0 = pPostDCTIData->iSlope0[PQ_SHARPNESS_50PERCENT]+ (pPostDCTIData->iSlope0[PQ_SHARPNESS_100PERCENT] - pPostDCTIData->iSlope0[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  2918. pSharp_POSTDCTI_Reserve->iTagetSlp1 = pPostDCTIData->iSlope1[PQ_SHARPNESS_50PERCENT]+ (pPostDCTIData->iSlope1[PQ_SHARPNESS_100PERCENT] - pPostDCTIData->iSlope1[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  2919. pSharp_POSTDCTI_Reserve->iTargetScale = pPostDCTIData->iScale[PQ_SHARPNESS_50PERCENT]+ (pPostDCTIData->iScale[PQ_SHARPNESS_100PERCENT] - pPostDCTIData->iScale[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  2920. pSharp_POSTDCTI_Reserve->iTargetGainTap = pPostDCTIData->iGainTap[PQ_SHARPNESS_50PERCENT]+ (pPostDCTIData->iGainTap[PQ_SHARPNESS_100PERCENT] - pPostDCTIData->iGainTap[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  2921. pSharp_POSTDCTI_Reserve->iTargetShootTap = pPostDCTIData->iShootTap[PQ_SHARPNESS_50PERCENT]+ (pPostDCTIData->iShootTap[PQ_SHARPNESS_100PERCENT] - pPostDCTIData->iShootTap[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  2922. }
  2923. pSharp_POSTDCTI_Reserve->iTargetScale = pPostDCTIData->iScale[PQ_SHARPNESS_50PERCENT];
  2924. pSharp_POSTDCTI_Reserve->iTargetGainTap = pPostDCTIData->iGainTap[PQ_SHARPNESS_50PERCENT];
  2925. pSharp_POSTDCTI_Reserve->iTargetShootTap = pPostDCTIData->iShootTap[PQ_SHARPNESS_50PERCENT];
  2926. return;
  2927. }
  2928. if(bStart)
  2929. {
  2930. bStart = FALSE;
  2931. if( pHwContext->bEnableColorProcess==FALSE )
  2932. {
  2933. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_0_post, 0);
  2934. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_1_post, 0);
  2935. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_2_post, 0);
  2936. return;
  2937. }
  2938. #ifdef CONFIG_APPLY_DIFFERENT_SHARPNESS_SETTING_IN_PANEL_INVERT
  2939. if(VIP_GetFlipMode()==HV_FLIP || VIP_GetFlipMode() == H_FLIP || VIP_GetFlipMode() == V_FLIP || VIP_GetPanelInvert())
  2940. {/* Add sharpness setting in invert panel here */ }
  2941. else
  2942. {/* Add sharpness setting in regular panel here */}
  2943. #else
  2944. /* Check different setting status and remove same setting item to here */
  2945. #endif
  2946. PQ_RegisterWrite(VIP_reg_slr_dcti_en_post, pPostDCTIData->iPostDCTIEnable);
  2947. PQ_RegisterWrite(VIP_reg_slr_dcti_c1_post, pPostDCTIData->icoef[0]);
  2948. PQ_RegisterWrite(VIP_reg_slr_dcti_c2_post, pPostDCTIData->icoef[1]);
  2949. PQ_RegisterWrite(VIP_reg_slr_dcti_c3_post, pPostDCTIData->icoef[2]);
  2950. PQ_RegisterWrite(VIP_reg_slr_dcti_c4_post, pPostDCTIData->icoef[3]);
  2951. PQ_RegisterWrite(VIP_reg_slr_dcti_c5_post, pPostDCTIData->icoef[4]);
  2952. PQ_RegisterWrite(VIP_reg_slr_dcti_c6_post, pPostDCTIData->icoef[5]);
  2953. if(VIP_IsSourceDTV() || !PQ_SWDTColorBar())
  2954. {
  2955. PQ_RegisterWrite(VIP_reg_slr_post_icp_en_post, pPostDCTIData->iPostChromaFilterEnable);
  2956. PQ_RegisterWrite(VIP_reg_slr_pre_icp_en_post, pPostDCTIData->iPreChromaFilterEnable);
  2957. PQ_RegisterWrite(VIP_reg_slr_pre_icp_alpha_post, pPostDCTIData->iPostChromaFilterLevel);
  2958. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_0_post, pSharp_POSTDCTI_Reserve->iTagetFac0);
  2959. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_1_post, pSharp_POSTDCTI_Reserve->iTagetFac1);
  2960. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_2_post, pSharp_POSTDCTI_Reserve->iTagetFac2);
  2961. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_th0_post, pSharp_POSTDCTI_Reserve->iTagetTh0);
  2962. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_th1_post, pSharp_POSTDCTI_Reserve->iTagetTh1);
  2963. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_slope0_post, pSharp_POSTDCTI_Reserve->iTagetSlp0);
  2964. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_slope1_post, pSharp_POSTDCTI_Reserve->iTagetSlp1);
  2965. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_post, pSharp_POSTDCTI_Reserve->iTargetScale);
  2966. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_post, pSharp_POSTDCTI_Reserve->iTargetGainTap);
  2967. PQ_RegisterWrite(VIP_reg_slr_dcti_shoot_tap_post, pSharp_POSTDCTI_Reserve->iTargetShootTap);
  2968. }
  2969. if ( !utempCheckColorbarDTFunctionEN && VIP_IsAVSource() && (VIP_GetStdColorSystem() == CVD2_STD_NTSC_443))
  2970. {
  2971. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_post, 0x3); //#40362
  2972. PQ_RegisterWrite(VIP_reg_slr_dcti_gain_tap_post, 0x5);
  2973. PQ_RegisterWrite(VIP_reg_slr_dcti_c1_post, 0x173);
  2974. PQ_RegisterWrite(VIP_reg_slr_dcti_c2_post, 0x53);
  2975. PQ_RegisterWrite(VIP_reg_slr_dcti_c3_post, 0xf5b);
  2976. PQ_RegisterWrite(VIP_reg_slr_dcti_c4_post, 0xf0a);
  2977. PQ_RegisterWrite(VIP_reg_slr_dcti_c5_post, 0xf43);
  2978. PQ_RegisterWrite(VIP_reg_slr_dcti_c6_post, 0xf98);
  2979. }
  2980. utempCheckColorbarDTFunctionEN = 0;
  2981. }
  2982. }
  2983. void PQ_Sharpness_POSTDLTI(BOOL bReset,UINT8 ucValue)
  2984. {
  2985. PQHW_CONTEXT* pHwContext= &PQHwContext;
  2986. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  2987. SHARP_POSTDLTI* pSHARP_POSTDCTI = &pVtab->mSharpness_PostDLTI;
  2988. SHARP_POSTDLTI_DATA* pPostDLTIData;
  2989. SHARP_POSTDLTI_RESERVE *pSharp_POSTDLTI_Reserve;
  2990. UINT8 ucCurrSrcIndex, ucTableIndex;
  2991. static UINT8 bStart = FALSE;
  2992. ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  2993. if ((ucCurrSrcIndex >= SRC_INDEX_UNKNOWN))
  2994. {
  2995. PQDebugPrint("%s: SrcIndex (%d) unknown/invalid, pLUTTable->SrcCount (%d)!", __FUNCTION__, ucCurrSrcIndex,pLUTTable->SrcCount);
  2996. return;
  2997. }
  2998. ucTableIndex = pSHARP_POSTDCTI->mGroupedIndex[ucCurrSrcIndex];
  2999. pPostDLTIData = &pSHARP_POSTDCTI->mPostDLTIData[ucTableIndex];
  3000. pSharp_POSTDLTI_Reserve = &pHwContext->mSharp_POSTDLTI_Reserve;
  3001. if(bReset)
  3002. {
  3003. bStart = TRUE;
  3004. if( ucValue>127 )
  3005. ucValue= 127;
  3006. PQDebugPrint("%s:ucValue=%d", __FUNCTION__, ucValue);
  3007. if( ucValue<64 )
  3008. {
  3009. pSharp_POSTDLTI_Reserve->iTagetFac0 = pPostDLTIData->iGain0[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iGain0[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iGain0[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3010. pSharp_POSTDLTI_Reserve->iTagetFac1 = pPostDLTIData->iGain1[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iGain1[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iGain1[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3011. pSharp_POSTDLTI_Reserve->iTagetFac2 = pPostDLTIData->iGain2[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iGain2[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iGain2[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3012. pSharp_POSTDLTI_Reserve->iTagetTh0 = pPostDLTIData->iTh0[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iTh0[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iTh0[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3013. pSharp_POSTDLTI_Reserve->iTagetTh1 = pPostDLTIData->iTh1[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iTh1[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iTh1[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3014. pSharp_POSTDLTI_Reserve->iTagetSlp0 = pPostDLTIData->iSlope0[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iSlope0[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iSlope0[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3015. pSharp_POSTDLTI_Reserve->iTagetSlp1 = pPostDLTIData->iSlope1[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iSlope1[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iSlope1[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3016. pSharp_POSTDLTI_Reserve->iTargetDCMode = pPostDLTIData->iDnamicClipMode[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iDnamicClipMode[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iDnamicClipMode[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3017. pSharp_POSTDLTI_Reserve->iTargetDCOverShoot = pPostDLTIData->iDnamicClipOverShoot[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iDnamicClipOverShoot[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iDnamicClipOverShoot[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3018. pSharp_POSTDLTI_Reserve->iTargetDCUnderShoot = pPostDLTIData->iDnamicClipUnderShoot[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iDnamicClipUnderShoot[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iDnamicClipUnderShoot[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3019. pSharp_POSTDLTI_Reserve->iTargetDCOverShootfac = pPostDLTIData->iDnamicClipOverShootfac[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iDnamicClipOverShootfac[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iDnamicClipOverShootfac[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3020. pSharp_POSTDLTI_Reserve->iTargetDCUnderShootfac = pPostDLTIData->iDnamicClipUnderShootfac[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iDnamicClipUnderShootfac[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iDnamicClipUnderShootfac[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3021. pSharp_POSTDLTI_Reserve->iTargetNorOverShoot = pPostDLTIData->iNormalOverShoot[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iNormalOverShoot[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iNormalOverShoot[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3022. pSharp_POSTDLTI_Reserve->iTargetNorlUnderShoot = pPostDLTIData->iNormalUnderShoot[PQ_SHARPNESS_0PERCENT]+ (pPostDLTIData->iNormalUnderShoot[PQ_SHARPNESS_50PERCENT] - pPostDLTIData->iNormalUnderShoot[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3023. }
  3024. else
  3025. {
  3026. //from normal to strong
  3027. ucValue-= 64;
  3028. pSharp_POSTDLTI_Reserve->iTagetFac0 = pPostDLTIData->iGain0[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iGain0[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iGain0[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3029. pSharp_POSTDLTI_Reserve->iTagetFac1 = pPostDLTIData->iGain1[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iGain1[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iGain1[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3030. pSharp_POSTDLTI_Reserve->iTagetFac2 = pPostDLTIData->iGain2[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iGain2[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iGain2[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3031. pSharp_POSTDLTI_Reserve->iTagetTh0 = pPostDLTIData->iTh0[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iTh0[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iTh0[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3032. pSharp_POSTDLTI_Reserve->iTagetTh1 = pPostDLTIData->iTh1[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iTh1[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iTh1[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3033. pSharp_POSTDLTI_Reserve->iTagetSlp0 = pPostDLTIData->iSlope0[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iSlope0[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iSlope0[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3034. pSharp_POSTDLTI_Reserve->iTagetSlp1 = pPostDLTIData->iSlope1[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iSlope1[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iSlope1[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3035. pSharp_POSTDLTI_Reserve->iTargetDCMode = pPostDLTIData->iDnamicClipMode[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iDnamicClipMode[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iDnamicClipMode[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3036. pSharp_POSTDLTI_Reserve->iTargetDCOverShoot = pPostDLTIData->iDnamicClipOverShoot[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iDnamicClipOverShoot[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iDnamicClipOverShoot[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3037. pSharp_POSTDLTI_Reserve->iTargetDCUnderShoot = pPostDLTIData->iDnamicClipUnderShoot[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iDnamicClipUnderShoot[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iDnamicClipUnderShoot[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3038. pSharp_POSTDLTI_Reserve->iTargetDCOverShootfac = pPostDLTIData->iDnamicClipOverShootfac[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iDnamicClipOverShootfac[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iDnamicClipOverShootfac[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3039. pSharp_POSTDLTI_Reserve->iTargetDCUnderShootfac = pPostDLTIData->iDnamicClipUnderShootfac[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iDnamicClipUnderShootfac[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iDnamicClipUnderShootfac[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3040. pSharp_POSTDLTI_Reserve->iTargetNorOverShoot = pPostDLTIData->iNormalOverShoot[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iNormalOverShoot[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iNormalOverShoot[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3041. pSharp_POSTDLTI_Reserve->iTargetNorlUnderShoot = pPostDLTIData->iNormalUnderShoot[PQ_SHARPNESS_50PERCENT]+ (pPostDLTIData->iNormalUnderShoot[PQ_SHARPNESS_100PERCENT] - pPostDLTIData->iNormalUnderShoot[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3042. }
  3043. pSharp_POSTDLTI_Reserve->iTargetScale = pPostDLTIData->iScale[PQ_SHARPNESS_50PERCENT];
  3044. pSharp_POSTDLTI_Reserve->iTargetGainTap = pPostDLTIData->iGainTap[PQ_SHARPNESS_50PERCENT];
  3045. pSharp_POSTDLTI_Reserve->iTargetShootTap = pPostDLTIData->iShootTap[PQ_SHARPNESS_50PERCENT];
  3046. return;
  3047. }
  3048. if(bStart)
  3049. {
  3050. bStart = FALSE;
  3051. if( pHwContext->bEnableColorProcess==FALSE )
  3052. {
  3053. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_0_post, 0);
  3054. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_1_post, 0);
  3055. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_2_post, 0);
  3056. return;
  3057. }
  3058. #ifdef CONFIG_APPLY_DIFFERENT_SHARPNESS_SETTING_IN_PANEL_INVERT
  3059. if(VIP_GetFlipMode()==HV_FLIP || VIP_GetFlipMode() == H_FLIP || VIP_GetFlipMode() == V_FLIP || VIP_GetPanelInvert())
  3060. {/* Add another sharpness setting in invert panel here */ }
  3061. else
  3062. {/* Add another sharpness setting in regular panel here */}
  3063. #else
  3064. /* Check different setting status and remove same setting item to here */
  3065. #endif
  3066. PQ_RegisterWrite(VIP_reg_slr_dlti_dclip_en_post, pPostDLTIData->iDynamicClipEnable);
  3067. PQ_RegisterWrite(VIP_reg_slr_dlti_c1_post, pPostDLTIData->icoef[0]);
  3068. PQ_RegisterWrite(VIP_reg_slr_dlti_c2_post, pPostDLTIData->icoef[1]);
  3069. PQ_RegisterWrite(VIP_reg_slr_dlti_c3_post, pPostDLTIData->icoef[2]);
  3070. PQ_RegisterWrite(VIP_reg_slr_dlti_c4_post, pPostDLTIData->icoef[3]);
  3071. PQ_RegisterWrite(VIP_reg_slr_dlti_c5_post, pPostDLTIData->icoef[4]);
  3072. PQ_RegisterWrite(VIP_reg_slr_dlti_c6_post, pPostDLTIData->icoef[5]);
  3073. PQ_RegisterWrite(VIP_reg_slr_dlti_dclip_sel_post, pSharp_POSTDLTI_Reserve->iTargetDCMode);
  3074. PQ_RegisterWrite(VIP_reg_slr_dlti_ovsht_dclip_post, pSharp_POSTDLTI_Reserve->iTargetDCOverShoot);
  3075. PQ_RegisterWrite(VIP_reg_slr_dlti_unsht_dclip_post, pSharp_POSTDLTI_Reserve->iTargetDCUnderShoot);
  3076. PQ_RegisterWrite(VIP_reg_slr_dlti_ovsht_fac_post, pSharp_POSTDLTI_Reserve->iTargetDCOverShootfac);
  3077. PQ_RegisterWrite(VIP_reg_slr_dlti_unsht_fac_post, pSharp_POSTDLTI_Reserve->iTargetDCUnderShootfac);
  3078. PQ_RegisterWrite(VIP_reg_slr_dlti_ovsht_clip_post, pSharp_POSTDLTI_Reserve->iTargetNorOverShoot);
  3079. PQ_RegisterWrite(VIP_reg_slr_dlti_unsht_clip_post, pSharp_POSTDLTI_Reserve->iTargetNorlUnderShoot);
  3080. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_0_post, pSharp_POSTDLTI_Reserve->iTagetFac0);
  3081. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_1_post, pSharp_POSTDLTI_Reserve->iTagetFac1);
  3082. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_2_post, pSharp_POSTDLTI_Reserve->iTagetFac2);
  3083. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_th0_post, pSharp_POSTDLTI_Reserve->iTagetTh0);
  3084. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_th1_post, pSharp_POSTDLTI_Reserve->iTagetTh1);
  3085. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_slope0_post, pSharp_POSTDLTI_Reserve->iTagetSlp0);
  3086. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_slope1_post, pSharp_POSTDLTI_Reserve->iTagetSlp1);
  3087. PQ_RegisterWrite(VIP_reg_slr_dlti_scale_post, pSharp_POSTDLTI_Reserve->iTargetScale);
  3088. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_tap_post, pSharp_POSTDLTI_Reserve->iTargetGainTap);
  3089. PQ_RegisterWrite(VIP_reg_slr_dlti_shoot_tap_post, pSharp_POSTDLTI_Reserve->iTargetShootTap);
  3090. }
  3091. }
  3092. void PQ_Sharpness_POST_2D(BOOL bReset,UINT8 ucValue)
  3093. {
  3094. PQHW_CONTEXT* pHwContext= &PQHwContext;
  3095. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  3096. SHARP_POST2DSHARPNESS* pPost2DSharpness = &pVtab->mSharpness_Post2DSharpness;
  3097. SHARP_POST2DSHARPNESS_DATA* pPost2DSharpData;
  3098. SHARP_POST2D_RESERVE *pSharp_POST2D_Reserve;
  3099. UINT8 ucCurrSrcIndex, ucTableIndex, ucUserSource, ucSubSource;
  3100. static UINT8 bStart = FALSE;
  3101. VIP_GetSource(&ucUserSource, &ucSubSource);
  3102. ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  3103. if ((ucCurrSrcIndex >= SRC_INDEX_UNKNOWN))
  3104. {
  3105. PQDebugPrint("%s: SrcIndex (%d) unknown/invalid, pLUTTable->SrcCount (%d)!", __FUNCTION__, ucCurrSrcIndex,pLUTTable->SrcCount);
  3106. return;
  3107. }
  3108. ucTableIndex = pPost2DSharpness->mGroupedIndex[ucCurrSrcIndex];
  3109. pPost2DSharpData = &pPost2DSharpness->mPost2DSharpData[ucTableIndex];
  3110. pSharp_POST2D_Reserve = &pHwContext->mSharp_POST2D_Reserve;
  3111. if(bReset)
  3112. {
  3113. bStart = TRUE;
  3114. if( ucValue>127 )
  3115. ucValue= 127;
  3116. PQDebugPrint("%s:ucValue=%d", __FUNCTION__, ucValue);
  3117. if( ucValue<64 )
  3118. {
  3119. 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;
  3120. 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;
  3121. 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;
  3122. 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;
  3123. 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;
  3124. 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;
  3125. 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;
  3126. 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;
  3127. 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;
  3128. 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;
  3129. 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;
  3130. pSharp_POST2D_Reserve->iTargetNorOverShoot = pPost2DSharpData->iNormalOverShoot[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iNormalOverShoot[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iNormalOverShoot[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3131. pSharp_POST2D_Reserve->iTargetNorlUnderShoot = pPost2DSharpData->iNormalUnderShoot[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iNormalUnderShoot[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iNormalUnderShoot[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3132. pSharp_POST2D_Reserve->iTargetOverShootfac = pPost2DSharpData->iOverShootFactor[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iOverShootFactor[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iOverShootFactor[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3133. pSharp_POST2D_Reserve->iTargetUnderShootfac = pPost2DSharpData->iUnderShootFactor[PQ_SHARPNESS_0PERCENT]+ (pPost2DSharpData->iUnderShootFactor[PQ_SHARPNESS_50PERCENT] - pPost2DSharpData->iUnderShootFactor[PQ_SHARPNESS_0PERCENT]) * ucValue / 63;
  3134. 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;
  3135. 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;
  3136. 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;
  3137. 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;
  3138. 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;
  3139. 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;
  3140. 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;
  3141. 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;
  3142. 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;
  3143. 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;
  3144. 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;
  3145. }
  3146. else
  3147. {
  3148. //from normal to strong
  3149. ucValue-= 64;
  3150. 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;
  3151. 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;
  3152. 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;
  3153. 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;
  3154. 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;
  3155. 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;
  3156. 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;
  3157. 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;
  3158. 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;
  3159. 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;
  3160. 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;
  3161. pSharp_POST2D_Reserve->iTargetNorOverShoot = pPost2DSharpData->iNormalOverShoot[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iNormalOverShoot[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iNormalOverShoot[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3162. pSharp_POST2D_Reserve->iTargetNorlUnderShoot = pPost2DSharpData->iNormalUnderShoot[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iNormalUnderShoot[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iNormalUnderShoot[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3163. pSharp_POST2D_Reserve->iTargetOverShootfac = pPost2DSharpData->iOverShootFactor[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iOverShootFactor[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iOverShootFactor[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3164. pSharp_POST2D_Reserve->iTargetUnderShootfac = pPost2DSharpData->iUnderShootFactor[PQ_SHARPNESS_50PERCENT]+ (pPost2DSharpData->iUnderShootFactor[PQ_SHARPNESS_100PERCENT] - pPost2DSharpData->iUnderShootFactor[PQ_SHARPNESS_50PERCENT]) * ucValue / 63;
  3165. 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;
  3166. 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;
  3167. 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;
  3168. 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;
  3169. 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;
  3170. 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;
  3171. 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;
  3172. 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;
  3173. 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;
  3174. 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;
  3175. 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;
  3176. }
  3177. return;
  3178. }
  3179. if(bStart)
  3180. {
  3181. bStart = FALSE;
  3182. if( pHwContext->bEnableColorProcess==FALSE )
  3183. {
  3184. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_0, 0);
  3185. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_1, 0);
  3186. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_2, 0);
  3187. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_0, 0);
  3188. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_1, 0);
  3189. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_2, 0);
  3190. return;
  3191. }
  3192. #ifdef CONFIG_APPLY_DIFFERENT_SHARPNESS_SETTING_IN_PANEL_INVERT
  3193. if(VIP_GetFlipMode()==HV_FLIP || VIP_GetFlipMode() == H_FLIP || VIP_GetFlipMode() == V_FLIP || VIP_GetPanelInvert())
  3194. {/* Add sharpness setting in invert panel here */ }
  3195. else
  3196. {/* Add sharpness setting in regular panel here */}
  3197. #else
  3198. /* Check different setting status and remove same setting item to here */
  3199. #endif
  3200. //PQ_RegisterWrite(_en_post, pPostDLTIData->iPostDLTIEnable);
  3201. if(_VIP_GetPreviewWndowStatus() || pHwContext->PqPatch.Post2DPatch == POST_2D_SHARPNESS_JPEG_THUMBNAIL_PATCH)
  3202. {
  3203. PQ_RegisterWrite(VIP_reg_slr_2d_sharp_en,0);
  3204. //printk("\n\n THUMBNAIL \n\n");
  3205. }
  3206. else
  3207. {
  3208. PQ_RegisterWrite(VIP_reg_slr_2d_sharp_en, pPost2DSharpData->iPost2DSharpEnable);
  3209. //printk("\n\n NORMAL \n\n");
  3210. }
  3211. //PQ_RegisterWrite(VIP_reg_slr_2d_sharp_en, pPost2DSharpData->iPost2DSharpEnable);
  3212. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_0, pSharp_POST2D_Reserve->iTagetFac0_L);
  3213. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_1, pSharp_POST2D_Reserve->iTagetFac1_L);
  3214. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_2, pSharp_POST2D_Reserve->iTagetFac2_L);
  3215. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_th0, pSharp_POST2D_Reserve->iTagetTh0_L);
  3216. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_th1, pSharp_POST2D_Reserve->iTagetTh1_L);
  3217. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_slope0, pSharp_POST2D_Reserve->iTagetSlp0_L);
  3218. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_slope1, pSharp_POST2D_Reserve->iTagetSlp1_L);
  3219. PQ_RegisterWrite(VIP_reg_slr_2d_l_sel, pSharp_POST2D_Reserve->iTargetFM_L);
  3220. PQ_RegisterWrite(VIP_reg_slr_2d_l_scale, pSharp_POST2D_Reserve->iTargetScale_L); //replace set in PQ_DSSetting()
  3221. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_tap, pSharp_POST2D_Reserve->iTargetGainTap_L);
  3222. PQ_RegisterWrite(VIP_reg_slr_2d_l_shoot_tap, pSharp_POST2D_Reserve->iTargetShootTap_L);
  3223. PQ_RegisterWrite(VIP_reg_slr_2d_l_ovsht_clip, pSharp_POST2D_Reserve->iTargetNorOverShoot);
  3224. PQ_RegisterWrite(VIP_reg_slr_2d_l_unsht_clip, pSharp_POST2D_Reserve->iTargetNorlUnderShoot);
  3225. PQ_RegisterWrite(VIP_reg_slr_2d_l_ovsht_fac, pSharp_POST2D_Reserve->iTargetOverShootfac);
  3226. PQ_RegisterWrite(VIP_reg_slr_2d_l_unsht_fac, pSharp_POST2D_Reserve->iTargetUnderShootfac);
  3227. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_0, pSharp_POST2D_Reserve->iTagetFac0_C);
  3228. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_1, pSharp_POST2D_Reserve->iTagetFac1_C);
  3229. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_2, pSharp_POST2D_Reserve->iTagetFac2_C);
  3230. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_th0, pSharp_POST2D_Reserve->iTagetTh0_C);
  3231. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_th1, pSharp_POST2D_Reserve->iTagetTh1_C);
  3232. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_slope0, pSharp_POST2D_Reserve->iTagetSlp0_C);
  3233. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_slope1, pSharp_POST2D_Reserve->iTagetSlp1_C);
  3234. PQ_RegisterWrite(VIP_reg_slr_2d_c_gain_tap, pSharp_POST2D_Reserve->iTargetGainTap_C);
  3235. PQ_RegisterWrite(VIP_reg_slr_2d_c_shoot_tap, pSharp_POST2D_Reserve->iTargetShootTap_C);
  3236. if(VIP_IsSourceDTV() || !PQ_SWDTColorBar())
  3237. {
  3238. PQ_RegisterWrite(VIP_reg_slr_2d_c_sel, pSharp_POST2D_Reserve->iTargetFM_C);
  3239. PQ_RegisterWrite(VIP_reg_slr_2d_c_scale, pSharp_POST2D_Reserve->iTargetScale_C);
  3240. }
  3241. if((VIP_GetUserSource() == SOURCE_CVD2) || (!VIP_IsPCSource() && (VIP_GetUserSource() == SOURCE_EXTS) && (VIP_GetInputVSize() < 600))||((VIP_GetUserSource() == SOURCE_MPEG)&& (VIP_GetInputVSize() < 600))) //mmantis 35657
  3242. {
  3243. PQ_RegisterWrite(VIP_reg_slr_ds_cond1_sel3, 1);
  3244. PQ_RegisterWrite(VIP_reg_slr_ds_sad_lr_max, 0);
  3245. }
  3246. else
  3247. {
  3248. PQ_RegisterWrite(VIP_reg_slr_ds_cond1_sel3, 0);
  3249. PQ_RegisterWrite(VIP_reg_slr_ds_sad_lr_max, 0x18);
  3250. }
  3251. if(VIP_IsSCARTSource() && VIP_IsAVSource())
  3252. {
  3253. PQ_RegisterWrite(VIP_reg_slr_2d_l_scale, 0x00); //#40517 & #40758
  3254. }
  3255. else if (VIP_IsAVSource())
  3256. {
  3257. if (VIP_GetStdColorSystem() >= CVD2_STD_PAL_IBGDK && VIP_GetStdColorSystem() <= CVD2_STD_PAL_60)
  3258. {
  3259. PQ_RegisterWrite(VIP_reg_slr_2d_l_scale, 0x0); //#40758
  3260. }
  3261. else
  3262. {
  3263. PQ_RegisterWrite(VIP_reg_slr_2d_l_scale, 0x01); //#40758
  3264. }
  3265. }
  3266. else if (VIP_GetUserSource() == SOURCE_HDMI || ((VIP_GetUserSource() == SOURCE_EXTS || VIP_IsPCSource()) && VIP_GetInputVSize() > 700))
  3267. {
  3268. PQ_RegisterWrite(VIP_reg_slr_2d_l_scale, 0x01); //#40619 & #40860 & #41344
  3269. }
  3270. }
  3271. }
  3272. void PQ_HorSharpness(BOOL bReset,UINT8 ucValue)//horizontal sharpness
  3273. {
  3274. PQHW_CONTEXT* pHwContext= &PQHwContext;
  3275. //VTAB_SRC_VALUE_DEFINE* pSrcVtab= pHwContext->pCurVtabSrcValue;
  3276. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  3277. INT32 i, Res;
  3278. UINT8 ucTableIndex;
  3279. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  3280. HOR_SHARPNESS_DATA *pHOR_SHARPNESS_DATA;
  3281. static UINT32 dwHorFacReg[6] = {
  3282. VIP_reg_slr_hor_sharp_fac0,VIP_reg_slr_hor_sharp_fac1,VIP_reg_slr_hor_sharp_fac2,
  3283. VIP_reg_slr_hor_sharp_fac0_c,VIP_reg_slr_hor_sharp_fac1_c,VIP_reg_slr_hor_sharp_fac2_c};
  3284. static UINT32 dwHorTHReg[4] = {
  3285. VIP_reg_slr_hor_sharp_th_0,VIP_reg_slr_hor_sharp_th_1,
  3286. VIP_reg_slr_hor_sharp_th_0_c,VIP_reg_slr_hor_sharp_th_1_c};
  3287. static UINT32 dwHorSlopeReg[4] = {
  3288. VIP_reg_slr_hor_sharp_slope_0,VIP_reg_slr_hor_sharp_slope_1,
  3289. VIP_reg_slr_hor_sharp_slope_0_c,VIP_reg_slr_hor_sharp_slope_1_c};
  3290. static UINT32 dwHorOvershtReg[2] = {
  3291. VIP_reg_slr_hor_sharp_oversht_ylmt,VIP_reg_slr_hor_sharp_oversht_clmt};
  3292. static UINT32 dwHorUndershtReg[2] = {
  3293. VIP_reg_slr_hor_sharp_undersht_ylmt,VIP_reg_slr_hor_sharp_undersht_clmt};
  3294. DS_SHARP_INFO TargetInfo;
  3295. static UINT8 bStart = FALSE;
  3296. memset(&TargetInfo, 0, sizeof(DS_SHARP_INFO));//Ren request 20120724
  3297. if(bReset)
  3298. {
  3299. bStart = TRUE;
  3300. return;
  3301. }
  3302. if(bStart)
  3303. {
  3304. bStart = FALSE;
  3305. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  3306. if (pVtab->mHOR_Sharpenss.mGroupedIndex[ucCurrSrcIndex] >= 8) return;
  3307. ucTableIndex = pVtab->mHOR_Sharpenss.mGroupedIndex[ucCurrSrcIndex];
  3308. pHOR_SHARPNESS_DATA = &pVtab->mHOR_Sharpenss.mHOR_Sharpness_Data[ucTableIndex];
  3309. if( pHwContext->bEnableColorProcess==FALSE )
  3310. {
  3311. for(i = 0; i <2; i++)
  3312. {
  3313. PQ_RegisterWrite(dwHorFacReg[i*3], TargetInfo.fac0);
  3314. PQ_RegisterWrite(dwHorFacReg[i*3+1], TargetInfo.fac1);
  3315. PQ_RegisterWrite(dwHorFacReg[i*3+2], TargetInfo.fac2);
  3316. }
  3317. return;
  3318. }
  3319. if( ucValue>127 )
  3320. ucValue= 127;
  3321. PQDebugPrint("%s:ucValue=%d", __FUNCTION__, ucValue);
  3322. if(900 < VIP_GetInputVSize()) // > (1080+720)/2
  3323. Res = 2;
  3324. else if((VIP_GetInputVSize() <= 900 && 648 < VIP_GetInputVSize())) // (720+576)/2 < X <= (1080+720)/2
  3325. Res = 1;
  3326. else //if((VIP_GetInputVSize() <= ((720+576) /2)))
  3327. Res = 0;
  3328. if (1!=pHOR_SHARPNESS_DATA->HorSharpNormal[0].undersht[3]) Res = 0;
  3329. if( ucValue<64 )
  3330. {
  3331. //from weak to normal
  3332. for(i = 0; i <2; i++)
  3333. {
  3334. TargetInfo.fac0 = pHOR_SHARPNESS_DATA->HorSharpWeak[i].fac0+ (pHOR_SHARPNESS_DATA->HorSharpNormal[i].fac0-pHOR_SHARPNESS_DATA->HorSharpWeak[i].fac0) * ucValue / 63;
  3335. TargetInfo.fac1 = pHOR_SHARPNESS_DATA->HorSharpWeak[i].fac1+ (pHOR_SHARPNESS_DATA->HorSharpNormal[i].fac1-pHOR_SHARPNESS_DATA->HorSharpWeak[i].fac1) * ucValue / 63;
  3336. TargetInfo.fac2 = pHOR_SHARPNESS_DATA->HorSharpWeak[i].fac2+ (pHOR_SHARPNESS_DATA->HorSharpNormal[i].fac2-pHOR_SHARPNESS_DATA->HorSharpWeak[i].fac2) * ucValue / 63;
  3337. TargetInfo.th0 = pHOR_SHARPNESS_DATA->HorSharpWeak[i].th0 + (pHOR_SHARPNESS_DATA->HorSharpNormal[i].th0-pHOR_SHARPNESS_DATA->HorSharpWeak[i].th0) * ucValue / 63;
  3338. TargetInfo.th1 = pHOR_SHARPNESS_DATA->HorSharpWeak[i].th1 + (pHOR_SHARPNESS_DATA->HorSharpNormal[i].th1-pHOR_SHARPNESS_DATA->HorSharpWeak[i].th1) * ucValue / 63;
  3339. TargetInfo.slope0 = pHOR_SHARPNESS_DATA->HorSharpWeak[i].slope0 + (pHOR_SHARPNESS_DATA->HorSharpNormal[i].slope0-pHOR_SHARPNESS_DATA->HorSharpWeak[i].slope0) * ucValue / 63;
  3340. TargetInfo.slope1 = pHOR_SHARPNESS_DATA->HorSharpWeak[i].slope1 + (pHOR_SHARPNESS_DATA->HorSharpNormal[i].slope1-pHOR_SHARPNESS_DATA->HorSharpWeak[i].slope1) * ucValue / 63;
  3341. 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;
  3342. 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;
  3343. PQ_RegisterWrite(dwHorFacReg[i*3], TargetInfo.fac0);
  3344. PQ_RegisterWrite(dwHorFacReg[i*3+1], TargetInfo.fac1);
  3345. PQ_RegisterWrite(dwHorFacReg[i*3+2], TargetInfo.fac2);
  3346. PQ_RegisterWrite(dwHorTHReg[i*2], TargetInfo.th0);
  3347. PQ_RegisterWrite(dwHorTHReg[i*2+1], TargetInfo.th1);
  3348. PQ_RegisterWrite(dwHorSlopeReg[i*2], TargetInfo.slope0);
  3349. PQ_RegisterWrite(dwHorSlopeReg[i*2+1], TargetInfo.slope1);
  3350. PQ_RegisterWrite(dwHorOvershtReg[i], TargetInfo.oversht[Res]);
  3351. PQ_RegisterWrite(dwHorUndershtReg[i], TargetInfo.undersht[Res]);
  3352. }
  3353. }
  3354. else
  3355. {
  3356. //from normal to strong
  3357. ucValue-= 64;
  3358. for(i = 0; i <2; i++)
  3359. {
  3360. TargetInfo.fac0 = pHOR_SHARPNESS_DATA->HorSharpNormal[i].fac0+ (pHOR_SHARPNESS_DATA->HorSharpStrong[i].fac0-pHOR_SHARPNESS_DATA->HorSharpNormal[i].fac0) * ucValue / 63;
  3361. TargetInfo.fac1 = pHOR_SHARPNESS_DATA->HorSharpNormal[i].fac1+ (pHOR_SHARPNESS_DATA->HorSharpStrong[i].fac1-pHOR_SHARPNESS_DATA->HorSharpNormal[i].fac1) * ucValue / 63;
  3362. TargetInfo.fac2 = pHOR_SHARPNESS_DATA->HorSharpNormal[i].fac2+ (pHOR_SHARPNESS_DATA->HorSharpStrong[i].fac2-pHOR_SHARPNESS_DATA->HorSharpNormal[i].fac2) * ucValue / 63;
  3363. TargetInfo.th0 = pHOR_SHARPNESS_DATA->HorSharpNormal[i].th0 + (pHOR_SHARPNESS_DATA->HorSharpStrong[i].th0-pHOR_SHARPNESS_DATA->HorSharpNormal[i].th0) * ucValue / 63;
  3364. TargetInfo.th1 = pHOR_SHARPNESS_DATA->HorSharpNormal[i].th1 + (pHOR_SHARPNESS_DATA->HorSharpStrong[i].th1-pHOR_SHARPNESS_DATA->HorSharpNormal[i].th1) * ucValue / 63;
  3365. TargetInfo.slope0 = pHOR_SHARPNESS_DATA->HorSharpNormal[i].slope0 + (pHOR_SHARPNESS_DATA->HorSharpStrong[i].slope0-pHOR_SHARPNESS_DATA->HorSharpNormal[i].slope0) * ucValue / 63;
  3366. TargetInfo.slope1 = pHOR_SHARPNESS_DATA->HorSharpNormal[i].slope1 + (pHOR_SHARPNESS_DATA->HorSharpStrong[i].slope1-pHOR_SHARPNESS_DATA->HorSharpNormal[i].slope1) * ucValue / 63;
  3367. 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;
  3368. 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;
  3369. PQ_RegisterWrite(dwHorFacReg[i*3], TargetInfo.fac0);
  3370. PQ_RegisterWrite(dwHorFacReg[i*3+1], TargetInfo.fac1);
  3371. PQ_RegisterWrite(dwHorFacReg[i*3+2], TargetInfo.fac2);
  3372. PQ_RegisterWrite(dwHorTHReg[i*2], TargetInfo.th0);
  3373. PQ_RegisterWrite(dwHorTHReg[i*2+1], TargetInfo.th1);
  3374. PQ_RegisterWrite(dwHorSlopeReg[i*2], TargetInfo.slope0);
  3375. PQ_RegisterWrite(dwHorSlopeReg[i*2+1], TargetInfo.slope1);
  3376. PQ_RegisterWrite(dwHorOvershtReg[i], TargetInfo.oversht[Res]);
  3377. PQ_RegisterWrite(dwHorUndershtReg[i], TargetInfo.undersht[Res]);
  3378. }
  3379. }
  3380. #ifdef CONFIG_APPLY_DIFFERENT_SHARPNESS_SETTING_IN_PANEL_INVERT
  3381. if(VIP_GetFlipMode()==HV_FLIP || VIP_GetFlipMode() == H_FLIP || VIP_GetFlipMode() == V_FLIP || VIP_GetPanelInvert())
  3382. {/* Add sharpness setting in invert panel here */ }
  3383. else
  3384. {/* Add sharpness setting in regular panel here */}
  3385. #else
  3386. /* Check different setting status and remove same setting item to here */
  3387. #endif
  3388. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_en, pHOR_SHARPNESS_DATA->HorSharpDark.enable);
  3389. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_th0, pHOR_SHARPNESS_DATA->HorSharpDark.th[0]);
  3390. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_th1, pHOR_SHARPNESS_DATA->HorSharpDark.th[1]);
  3391. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_th2, pHOR_SHARPNESS_DATA->HorSharpDark.th[2]);
  3392. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_th3, pHOR_SHARPNESS_DATA->HorSharpDark.th[3]);
  3393. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_fac0, pHOR_SHARPNESS_DATA->HorSharpDark.fac[0]);
  3394. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_fac1, pHOR_SHARPNESS_DATA->HorSharpDark.fac[1]);
  3395. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_fac2, pHOR_SHARPNESS_DATA->HorSharpDark.fac[2]);
  3396. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_fac3, pHOR_SHARPNESS_DATA->HorSharpDark.fac[3]);
  3397. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_slope0, pHOR_SHARPNESS_DATA->HorSharpDark.slope[0]);
  3398. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_slope1, pHOR_SHARPNESS_DATA->HorSharpDark.slope[1]);
  3399. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_slope2, pHOR_SHARPNESS_DATA->HorSharpDark.slope[2]);
  3400. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_slope3, pHOR_SHARPNESS_DATA->HorSharpDark.slope[3]);
  3401. PQ_RegisterWrite(VIP_reg_slr_hor_dark_sharp_slope4, pHOR_SHARPNESS_DATA->HorSharpDark.slope[4]);
  3402. }
  3403. }
  3404. void PQ_DSSharpness(BOOL bReset,UINT8 ucValue)
  3405. {
  3406. PQHW_CONTEXT* pHwContext= &PQHwContext;
  3407. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  3408. INT32 i, j, Res;
  3409. static UINT8 bStart = FALSE;
  3410. UINT32 SharpRatioTemp;
  3411. static UINT32 dwDS_FacReg[6] = {
  3412. VIP_reg_slr_sharp_fac0,VIP_reg_slr_sharp_fac1,VIP_reg_slr_sharp_fac2,
  3413. VIP_reg_slr_sharp_fac0_c,VIP_reg_slr_sharp_fac1_c,VIP_reg_slr_sharp_fac2_c};
  3414. static UINT32 dwDS_THReg[4] = {
  3415. VIP_reg_slr_ds_sharp_th_0,VIP_reg_slr_ds_sharp_th_1,
  3416. VIP_reg_slr_ds_sharp_th_0_c,VIP_reg_slr_ds_sharp_th_1_c};
  3417. static UINT32 dwDS_SlopeReg[4] = {
  3418. VIP_reg_slr_ds_sharp_slope_0,VIP_reg_slr_ds_sharp_slope_1,
  3419. VIP_reg_slr_ds_sharp_slope_0_c,VIP_reg_slr_ds_sharp_slope_1_c};
  3420. static UINT32 dwDS_OvershtReg[2] = {
  3421. VIP_reg_slr_dscale_sharp_oversht_ylmt,VIP_reg_slr_dscale_sharp_oversht_clmt};
  3422. static UINT32 dwDS_UndershtReg[2] = {
  3423. VIP_reg_slr_dscale_sharp_undersht_ylmt,VIP_reg_slr_dscale_sharp_undersht_clmt};
  3424. static UINT32 dwDS_Y_RatioReg[7] = {
  3425. VIP_reg_slr_ds_sharp_ratio_0,VIP_reg_slr_ds_sharp_ratio_1,VIP_reg_slr_ds_sharp_ratio_2,
  3426. VIP_reg_slr_ds_sharp_ratio_3,VIP_reg_slr_ds_sharp_ratio_4,VIP_reg_slr_ds_sharp_ratio_5,
  3427. VIP_reg_slr_ds_sharp_ratio_6};
  3428. static UINT32 dwDS_C_RatioReg[6] = {
  3429. VIP_reg_slr_ds_sharp_ratio_0_c,VIP_reg_slr_ds_sharp_ratio_1_c,VIP_reg_slr_ds_sharp_ratio_2_c,
  3430. VIP_reg_slr_ds_sharp_ratio_3_c,VIP_reg_slr_ds_sharp_ratio_4_c,VIP_reg_slr_ds_sharp_ratio_5_c};
  3431. DS_SHARP_INFO TargetInfo;
  3432. UINT8 ucTableIndex;
  3433. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  3434. DS_SHARPNESS_DATA *pDS_SHARPNESS_DATA;
  3435. if(bReset)
  3436. {
  3437. bStart = TRUE;
  3438. PQ_HorSharpness(TRUE, ucValue);
  3439. return;
  3440. }
  3441. if(bStart)
  3442. {
  3443. bStart = FALSE;
  3444. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  3445. if (pVtab->mDS_Sharpenss.mGroupedIndex[ucCurrSrcIndex] >= 8) return;
  3446. ucTableIndex = pVtab->mDS_Sharpenss.mGroupedIndex[ucCurrSrcIndex];
  3447. pDS_SHARPNESS_DATA = &pVtab->mDS_Sharpenss.mDS_Sharpness_Data[ucTableIndex];
  3448. memset(&TargetInfo, 0, sizeof(DS_SHARP_INFO));//Ren request 20120724
  3449. //===================start ds sharpness==========================================
  3450. if( pHwContext->bEnableColorProcess==FALSE )
  3451. {
  3452. for(j = 0; j <2; j++)
  3453. {
  3454. PQ_RegisterWrite(dwDS_FacReg[j*3], TargetInfo.fac0);
  3455. PQ_RegisterWrite(dwDS_FacReg[j*3+1], TargetInfo.fac1);
  3456. PQ_RegisterWrite(dwDS_FacReg[j*3+2], TargetInfo.fac2);
  3457. }
  3458. return;
  3459. }
  3460. if( ucValue>127 )
  3461. ucValue= 127;
  3462. PQDebugPrint("%s:ucValue=%d", __FUNCTION__, ucValue);
  3463. if(900 < VIP_GetInputVSize()) // > (1080+720)/2
  3464. Res = 2;
  3465. else if((VIP_GetInputVSize() <= 900 && 648 < VIP_GetInputVSize())) // (720+576)/2 < X <= (1080+720)/2
  3466. Res = 1;
  3467. else //if((VIP_GetInputVSize() <= ((720+576) /2)))
  3468. Res = 0;
  3469. if (1!=pDS_SHARPNESS_DATA->DSSharpNormal[0].undersht[3]) Res = 0;
  3470. if( ucValue<64 )
  3471. {
  3472. //from weak to normal
  3473. for(j = 0; j <2; j++)
  3474. {
  3475. TargetInfo.fac0 = pDS_SHARPNESS_DATA->DSSharpWeak[j].fac0+ (pDS_SHARPNESS_DATA->DSSharpNormal[j].fac0-pDS_SHARPNESS_DATA->DSSharpWeak[j].fac0) * ucValue / 63;
  3476. TargetInfo.fac1 = pDS_SHARPNESS_DATA->DSSharpWeak[j].fac1+ (pDS_SHARPNESS_DATA->DSSharpNormal[j].fac1-pDS_SHARPNESS_DATA->DSSharpWeak[j].fac1) * ucValue / 63;
  3477. TargetInfo.fac2 = pDS_SHARPNESS_DATA->DSSharpWeak[j].fac2+ (pDS_SHARPNESS_DATA->DSSharpNormal[j].fac2-pDS_SHARPNESS_DATA->DSSharpWeak[j].fac2) * ucValue / 63;
  3478. TargetInfo.th0 = pDS_SHARPNESS_DATA->DSSharpWeak[j].th0 + (pDS_SHARPNESS_DATA->DSSharpNormal[j].th0-pDS_SHARPNESS_DATA->DSSharpWeak[j].th0) * ucValue / 63;
  3479. TargetInfo.th1 = pDS_SHARPNESS_DATA->DSSharpWeak[j].th1 + (pDS_SHARPNESS_DATA->DSSharpNormal[j].th1-pDS_SHARPNESS_DATA->DSSharpWeak[j].th1) * ucValue / 63;
  3480. TargetInfo.slope0 = pDS_SHARPNESS_DATA->DSSharpWeak[j].slope0 + (pDS_SHARPNESS_DATA->DSSharpNormal[j].slope0-pDS_SHARPNESS_DATA->DSSharpWeak[j].slope0) * ucValue / 63;
  3481. TargetInfo.slope1 = pDS_SHARPNESS_DATA->DSSharpWeak[j].slope1 + (pDS_SHARPNESS_DATA->DSSharpNormal[j].slope1-pDS_SHARPNESS_DATA->DSSharpWeak[j].slope1) * ucValue / 63;
  3482. 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;
  3483. 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;
  3484. PQ_RegisterWrite(dwDS_FacReg[j*3], TargetInfo.fac0);
  3485. PQ_RegisterWrite(dwDS_FacReg[j*3+1], TargetInfo.fac1);
  3486. PQ_RegisterWrite(dwDS_FacReg[j*3+2], TargetInfo.fac2);
  3487. PQ_RegisterWrite(dwDS_THReg[j*2], TargetInfo.th0);
  3488. PQ_RegisterWrite(dwDS_THReg[j*2+1], TargetInfo.th1);
  3489. PQ_RegisterWrite(dwDS_SlopeReg[j*2], TargetInfo.slope0);
  3490. PQ_RegisterWrite(dwDS_SlopeReg[j*2+1], TargetInfo.slope1);
  3491. PQ_RegisterWrite(dwDS_OvershtReg[j], TargetInfo.oversht[Res]);
  3492. PQ_RegisterWrite(dwDS_UndershtReg[j], TargetInfo.undersht[Res]);
  3493. }
  3494. }
  3495. else
  3496. {
  3497. //from normal to strong
  3498. ucValue-= 64;
  3499. for(j = 0; j <2; j++)
  3500. {
  3501. TargetInfo.fac0 = pDS_SHARPNESS_DATA->DSSharpNormal[j].fac0+ (pDS_SHARPNESS_DATA->DSSharpStrong[j].fac0-pDS_SHARPNESS_DATA->DSSharpNormal[j].fac0) * ucValue / 63;
  3502. TargetInfo.fac1 = pDS_SHARPNESS_DATA->DSSharpNormal[j].fac1+ (pDS_SHARPNESS_DATA->DSSharpStrong[j].fac1-pDS_SHARPNESS_DATA->DSSharpNormal[j].fac1) * ucValue / 63;
  3503. TargetInfo.fac2 = pDS_SHARPNESS_DATA->DSSharpNormal[j].fac2+ (pDS_SHARPNESS_DATA->DSSharpStrong[j].fac2-pDS_SHARPNESS_DATA->DSSharpNormal[j].fac2) * ucValue / 63;
  3504. TargetInfo.th0 = pDS_SHARPNESS_DATA->DSSharpNormal[j].th0 + (pDS_SHARPNESS_DATA->DSSharpStrong[j].th0-pDS_SHARPNESS_DATA->DSSharpNormal[j].th0) * ucValue / 63;
  3505. TargetInfo.th1 = pDS_SHARPNESS_DATA->DSSharpNormal[j].th1 + (pDS_SHARPNESS_DATA->DSSharpStrong[j].th1-pDS_SHARPNESS_DATA->DSSharpNormal[j].th1) * ucValue / 63;
  3506. TargetInfo.slope0 = pDS_SHARPNESS_DATA->DSSharpNormal[j].slope0 + (pDS_SHARPNESS_DATA->DSSharpStrong[j].slope0-pDS_SHARPNESS_DATA->DSSharpNormal[j].slope0) * ucValue / 63;
  3507. TargetInfo.slope1 = pDS_SHARPNESS_DATA->DSSharpNormal[j].slope1 + (pDS_SHARPNESS_DATA->DSSharpStrong[j].slope1-pDS_SHARPNESS_DATA->DSSharpNormal[j].slope1) * ucValue / 63;
  3508. 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;
  3509. 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;
  3510. PQ_RegisterWrite(dwDS_FacReg[j*3], TargetInfo.fac0);
  3511. PQ_RegisterWrite(dwDS_FacReg[j*3+1], TargetInfo.fac1);
  3512. PQ_RegisterWrite(dwDS_FacReg[j*3+2], TargetInfo.fac2);
  3513. PQ_RegisterWrite(dwDS_THReg[j*2], TargetInfo.th0);
  3514. PQ_RegisterWrite(dwDS_THReg[j*2+1], TargetInfo.th1);
  3515. PQ_RegisterWrite(dwDS_SlopeReg[j*2], TargetInfo.slope0);
  3516. PQ_RegisterWrite(dwDS_SlopeReg[j*2+1], TargetInfo.slope1);
  3517. PQ_RegisterWrite(dwDS_OvershtReg[j], TargetInfo.oversht[Res]);
  3518. PQ_RegisterWrite(dwDS_UndershtReg[j], TargetInfo.undersht[Res]);
  3519. }
  3520. }
  3521. //ratio
  3522. SharpRatioTemp = pDS_SHARPNESS_DATA->SlrSharpRatio.Degree[Res];
  3523. #ifdef CONFIG_APPLY_DIFFERENT_SHARPNESS_SETTING_IN_PANEL_INVERT
  3524. if(VIP_GetFlipMode()==HV_FLIP || VIP_GetFlipMode() == H_FLIP || VIP_GetFlipMode() == V_FLIP || VIP_GetPanelInvert())
  3525. {/* Add sharpness setting in invert panel here */ }
  3526. else
  3527. {/* Add sharpness setting in regular panel here */}
  3528. #else
  3529. /* Check different setting status and remove same setting item to here */
  3530. #endif
  3531. for(i=0; i<7; i++)
  3532. {
  3533. PQ_RegisterWrite(dwDS_Y_RatioReg[i], SharpRatioTemp & 0xf);
  3534. SharpRatioTemp = SharpRatioTemp >> 4;
  3535. }
  3536. for(i = 0; i <6; i++)
  3537. {
  3538. PQ_RegisterWrite(dwDS_C_RatioReg[i], pVtab->mSharpRatio[1].ratio[i]);
  3539. }
  3540. PQ_RegisterWrite(VIP_reg_slr_ds_sharp_ratio_6_c, pVtab->iSharpRatio6_c);
  3541. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_en, pDS_SHARPNESS_DATA->DSSharpDark.enable);
  3542. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_th0, pDS_SHARPNESS_DATA->DSSharpDark.th[0]);
  3543. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_th1, pDS_SHARPNESS_DATA->DSSharpDark.th[1]);
  3544. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_th2, pDS_SHARPNESS_DATA->DSSharpDark.th[2]);
  3545. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_th3, pDS_SHARPNESS_DATA->DSSharpDark.th[3]);
  3546. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_fac0, pDS_SHARPNESS_DATA->DSSharpDark.fac[0]);
  3547. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_fac1, pDS_SHARPNESS_DATA->DSSharpDark.fac[1]);
  3548. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_fac2, pDS_SHARPNESS_DATA->DSSharpDark.fac[2]);
  3549. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_fac3, pDS_SHARPNESS_DATA->DSSharpDark.fac[3]);
  3550. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_slope0, pDS_SHARPNESS_DATA->DSSharpDark.slope[0]);
  3551. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_slope1, pDS_SHARPNESS_DATA->DSSharpDark.slope[1]);
  3552. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_slope2, pDS_SHARPNESS_DATA->DSSharpDark.slope[2]);
  3553. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_slope3, pDS_SHARPNESS_DATA->DSSharpDark.slope[3]);
  3554. PQ_RegisterWrite(VIP_reg_slr_ds_dark_sharp_slope4, pDS_SHARPNESS_DATA->DSSharpDark.slope[4]);
  3555. }
  3556. }
  3557. void PQ_DPYSharpness(BOOL bReset,UINT8 ucValue)
  3558. {
  3559. PQHW_CONTEXT* pHwContext= &PQHwContext;
  3560. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  3561. SHARP_INFO target,*strong,*normal,*weak;
  3562. INT32 i, Res;
  3563. UINT8 ucTableIndex;
  3564. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  3565. static UINT32 dwTransReg[8]= {
  3566. VIP_reg_dpy_filter_hl_trans1, VIP_reg_dpy_filter_hl_trans2, VIP_reg_dpy_filter_hc_trans1, VIP_reg_dpy_filter_hc_trans2,
  3567. VIP_reg_dpy_filter_vl_trans1, VIP_reg_dpy_filter_vl_trans2, VIP_reg_dpy_filter_vc_trans1, VIP_reg_dpy_filter_vc_trans2};
  3568. static UINT32 dwSmoothReg[4]= {
  3569. VIP_reg_dpy_filter_hl_smooth1, VIP_reg_dpy_filter_hc_smooth1, VIP_reg_dpy_filter_vl_smooth, VIP_reg_dpy_filter_vc_smooth};
  3570. static UINT32 dwSharpReg[4]= {
  3571. VIP_reg_dpy_filter_hl_sharp, VIP_reg_dpy_filter_hc_sharp, VIP_reg_dpy_filter_vl_sharp, VIP_reg_dpy_filter_vc_sharp};
  3572. static UINT32 dwLimitLReg[4]= {
  3573. 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};
  3574. static UINT32 dwLimitHReg[4]= {
  3575. 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};
  3576. static UINT32 dwPivotReg[8]= {
  3577. VIP_reg_dpy_filter_hl_pivotx, VIP_reg_dpy_filter_hl_pivoty, VIP_reg_dpy_filter_hc_pivotx, VIP_reg_dpy_filter_hc_pivoty,
  3578. VIP_reg_dpy_filter_vl_pivotx, VIP_reg_dpy_filter_vl_pivoty, VIP_reg_dpy_filter_vc_pivotx, VIP_reg_dpy_filter_vc_pivoty};
  3579. SHARPNESS_DATA *pSharpness_setting;
  3580. static UINT8 bStart = FALSE;
  3581. if(bReset)
  3582. {
  3583. bStart = TRUE;
  3584. return;
  3585. }
  3586. if(bStart)
  3587. {
  3588. bStart = FALSE;
  3589. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  3590. if (pVtab->mSharpenss.mGroupedIndex[ucCurrSrcIndex] >= 8) return;
  3591. ucTableIndex = pVtab->mSharpenss.mGroupedIndex[ucCurrSrcIndex];
  3592. pSharpness_setting = &pVtab->mSharpenss.mSharpness_Data[ucTableIndex];
  3593. if( pHwContext->bEnableColorProcess==FALSE )
  3594. {
  3595. for(i=0; i<4; i++)
  3596. {
  3597. PQ_RegisterWrite(dwSmoothReg[i], 0);
  3598. PQ_RegisterWrite(dwSharpReg[i], 0);
  3599. }
  3600. return;
  3601. }
  3602. pHwContext->menu_sharpness=1;
  3603. if( ucValue>127 )
  3604. ucValue= 127;
  3605. PQDebugPrint("%s:ucValue=%d", __FUNCTION__, ucValue);
  3606. if((((DRV_SLR_GetFactor_HFactor())*(DRV_SLR_GetFactor_HFactor_6HV())*100)/(2048*2048))>90)
  3607. Res = 2;
  3608. else if(VIP_GetInputVSize() >= 1000) //1080
  3609. Res = 2;
  3610. else if(VIP_GetInputVSize() >= 700) //720
  3611. Res = 1;
  3612. else
  3613. Res = 0;
  3614. if (1!=pSharpness_setting->sharp_normal[0].limit[3]) Res = 0;
  3615. if( ucValue<64 )
  3616. {
  3617. //from weak to normal
  3618. for(i=0; i<4; i++)
  3619. {
  3620. weak = &pSharpness_setting->sharp_weak[i];
  3621. normal = &pSharpness_setting->sharp_normal[i];
  3622. //target.x1= weak->x1 + (normal->x1-weak->x1) * ucValue / 63;
  3623. target.m1= weak->m1 + (normal->m1-weak->m1) * ucValue / 63;
  3624. //target.x2= weak->x2 + (normal->x2-weak->x2) * ucValue / 63;
  3625. target.m2= weak->m2 + (normal->m2-weak->m2) * ucValue / 63;
  3626. target.smooth= weak->smooth + (normal->smooth-weak->smooth) * ucValue / 63;
  3627. target.sharp= weak->sharp + (normal->sharp-weak->sharp) * ucValue / 63;
  3628. target.limit[Res]= weak->limit[Res] + (normal->limit[Res]-weak->limit[Res]) * ucValue / 63;
  3629. target.pivotx= weak->pivotx + (normal->pivotx-weak->pivotx) * ucValue / 63;
  3630. target.pivoty= weak->pivoty + (normal->pivoty-weak->pivoty) * ucValue / 63;
  3631. PQ_RegisterWrite(dwTransReg[i*2], target.m1);
  3632. PQ_RegisterWrite(dwTransReg[i*2+1], target.m2);
  3633. PQ_RegisterWrite(dwSmoothReg[i], target.smooth);
  3634. PQ_RegisterWrite(dwSharpReg[i], target.sharp);
  3635. PQ_RegisterWrite(dwLimitLReg[i], target.limit[Res]);
  3636. PQ_RegisterWrite(dwLimitHReg[i], target.limit[Res]);
  3637. PQ_RegisterWrite(dwPivotReg[i*2], target.pivotx);
  3638. PQ_RegisterWrite(dwPivotReg[i*2+1], target.pivoty);
  3639. }
  3640. }
  3641. else
  3642. {
  3643. //from normal to strong
  3644. ucValue-= 64;
  3645. for(i=0; i<4; i++)
  3646. {
  3647. strong = &pSharpness_setting->sharp_strong[i];
  3648. normal = &pSharpness_setting->sharp_normal[i];
  3649. //target.x1= normal->x1 + ( strong->x1-normal->x1) * ucValue / 63;
  3650. target.m1= normal->m1 + ( strong->m1-normal->m1) * ucValue / 63;
  3651. //target.x2= normal->x2 + ( strong->x2-normal->x2) * ucValue / 63;
  3652. target.m2= normal->m2 + ( strong->m2-normal->m2) * ucValue / 63;
  3653. target.smooth= normal->smooth + ( strong->smooth-normal->smooth) * ucValue / 63;
  3654. target.sharp= normal->sharp + ( strong->sharp-normal->sharp) * ucValue / 63;
  3655. target.limit[Res]= normal->limit[Res] + ( strong->limit[Res]-normal->limit[Res]) * ucValue / 63;
  3656. target.pivotx= normal->pivotx + ( strong->pivotx-normal->pivotx) * ucValue / 63;
  3657. target.pivoty= normal->pivoty + ( strong->pivoty-normal->pivoty) * ucValue / 63;
  3658. PQ_RegisterWrite(dwTransReg[i*2], target.m1);
  3659. PQ_RegisterWrite(dwTransReg[i*2+1], target.m2);
  3660. PQ_RegisterWrite(dwSmoothReg[i], target.smooth);
  3661. PQ_RegisterWrite(dwSharpReg[i], target.sharp);
  3662. PQ_RegisterWrite(dwLimitLReg[i], target.limit[Res]);
  3663. PQ_RegisterWrite(dwLimitHReg[i], target.limit[Res]);
  3664. PQ_RegisterWrite(dwPivotReg[i*2], target.pivotx);
  3665. PQ_RegisterWrite(dwPivotReg[i*2+1], target.pivoty);
  3666. }
  3667. }
  3668. #ifdef CONFIG_APPLY_DIFFERENT_SHARPNESS_SETTING_IN_PANEL_INVERT
  3669. if(VIP_GetFlipMode()==HV_FLIP || VIP_GetFlipMode() == H_FLIP || VIP_GetFlipMode() == V_FLIP || VIP_GetPanelInvert())
  3670. {/* Add sharpness setting in invert panel here */ }
  3671. else
  3672. {/* Add sharpness setting in regular panel here */}
  3673. #else
  3674. /* Check different setting status and remove same setting item to here */
  3675. #endif
  3676. PQ_RegisterWrite(VIP_reg_dpy_filter_y_v1, 16);
  3677. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_v1, 16);
  3678. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_v1, 16);
  3679. PQ_RegisterWrite(VIP_reg_dpy_filter_vl_hp_limit, 0xff);
  3680. pHwContext->menu_sharpness=0;
  3681. pHwContext->hc_sharp=(INT8)PQ_RegisterRead(VIP_reg_dpy_filter_hc_sharp);
  3682. pHwContext->hl_sharp=(INT8)PQ_RegisterRead(VIP_reg_dpy_filter_hl_sharp);
  3683. pHwContext->hc_menu_sharp=PQ_RegisterRead(VIP_reg_dpy_filter_hc_sharp);
  3684. pHwContext->hl_menu_sharp=PQ_RegisterRead(VIP_reg_dpy_filter_hl_sharp);
  3685. pHwContext->hc_smooth=(INT8)PQ_RegisterRead(VIP_reg_dpy_filter_hc_smooth1);
  3686. pHwContext->hl_smooth=(INT8)PQ_RegisterRead(VIP_reg_dpy_filter_hl_smooth1);
  3687. }
  3688. }
  3689. void PQ_CalcPivotxy(SHARP_INFO* sharp_info)
  3690. {
  3691. #if 0
  3692. INT32 x1,m1,x2,m2,sharp;
  3693. INT32* pivotx= &sharp_info->pivotx;
  3694. INT32* pivoty= &sharp_info->pivoty;
  3695. x1= sharp_info->x1;
  3696. m1= sharp_info->m1;
  3697. x2= sharp_info->x2;
  3698. m2= sharp_info->m2;
  3699. sharp= sharp_info->sharp;
  3700. if(m1==m2) {printk(KERN_EMERG"ERROR!! /0\n");m1=m2+1;}
  3701. *pivotx= (m1*x1 - m2*x2) / (m1-m2);
  3702. *pivoty= ((*pivotx- x1)*m1 + sharp * 8) / 8;
  3703. *pivotx= *pivotx/2;
  3704. #endif
  3705. }
  3706. //****************************************************************************
  3707. //
  3708. // Function : PQ_Sharpness
  3709. // Params :
  3710. // Description:
  3711. // Returns : void
  3712. // P.S only for YUV in no effect in RGB
  3713. //****************************************************************************
  3714. void PQ_Sharpness(BOOL bReset,UINT8 ucValue)//-128~+127 =>0~127
  3715. {
  3716. //ds sharpness(365 new function)
  3717. PQHW_CONTEXT* pHwContext= &PQHwContext;
  3718. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  3719. UINT32 DS_Sharp_Control;
  3720. INT32 HD_Ds, HD_Angle, MD_Ds, MD_Angle, SD_Ds, SD_Angle;
  3721. UINT8 ucTableIndex;
  3722. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  3723. DS_SHARPNESS_DATA *pDS_SHARPNESS_DATA;
  3724. static UINT8 bStart = FALSE;
  3725. if(bReset)
  3726. {
  3727. bStart = TRUE;
  3728. PQ_DSSharpness(TRUE, ucValue);
  3729. PQ_DPYSharpness(TRUE, ucValue);
  3730. PQ_Sharpness_POSTDLTI(TRUE, ucValue);
  3731. if(!utempCheckColorbarDTFunctionEN || VIP_IsSourceDTV())
  3732. {
  3733. PQ_Sharpness_PREDCTI(TRUE, ucValue);
  3734. PQ_Sharpness_POSTDCTI(TRUE,ucValue);
  3735. PQ_Sharpness_POST_2D(TRUE, ucValue);
  3736. }
  3737. return;
  3738. }
  3739. if(bStart)
  3740. {
  3741. bStart = FALSE;
  3742. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  3743. if (pVtab->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex] >= 8) return;
  3744. ucTableIndex = pVtab->mDS_Sharpenss.mGroupedIndex[ucCurrSrcIndex];
  3745. pDS_SHARPNESS_DATA = &pVtab->mDS_Sharpenss.mDS_Sharpness_Data[ucTableIndex];
  3746. DS_Sharp_Control = pDS_SHARPNESS_DATA->DS_Sharp_Angle;
  3747. //PQDebugPrint("%s: DS_Sharp_Control=%d", __FUNCTION__, (INT32)DS_Sharp_Control);
  3748. SD_Ds = (DS_Sharp_Control & 0x3);
  3749. SD_Angle = ((DS_Sharp_Control >> 2) & 0x3);
  3750. MD_Ds = ((DS_Sharp_Control >> 8) & 0x3);
  3751. MD_Angle = ((DS_Sharp_Control >> 10) & 0x3);
  3752. HD_Ds = ((DS_Sharp_Control >> 16) & 0x3);
  3753. HD_Angle = ((DS_Sharp_Control >> 18) & 0x3);
  3754. //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);
  3755. #ifdef CONFIG_APPLY_DIFFERENT_SHARPNESS_SETTING_IN_PANEL_INVERT
  3756. if(VIP_GetFlipMode()==HV_FLIP || VIP_GetFlipMode() == H_FLIP || VIP_GetFlipMode() == V_FLIP || VIP_GetPanelInvert())
  3757. {/* Add another sharpness setting in invert panel here */ }
  3758. else
  3759. {
  3760. /* Add sharpness setting in regular panel here */
  3761. }
  3762. #else
  3763. /* Check different setting status and remove same setting item to here */
  3764. #endif
  3765. if(900 < VIP_GetInputVSize()) // > (1080+720)/2
  3766. {
  3767. PQ_RegisterWrite(VIP_reg_ds_disable_func_en, HD_Ds);
  3768. PQ_RegisterWrite(VIP_reg_ds_disable_angle_sel, HD_Angle);
  3769. }
  3770. else if((VIP_GetInputVSize() <= 900 && 648 < VIP_GetInputVSize())) // (720+576)/2 < X <= (1080+720)/2
  3771. {
  3772. PQ_RegisterWrite(VIP_reg_ds_disable_func_en, MD_Ds);
  3773. PQ_RegisterWrite(VIP_reg_ds_disable_angle_sel, MD_Angle);
  3774. }
  3775. else //if((VIP_GetInputVSize() <= ((720+576) /2)))
  3776. {
  3777. PQ_RegisterWrite(VIP_reg_ds_disable_func_en, SD_Ds);
  3778. PQ_RegisterWrite(VIP_reg_ds_disable_angle_sel, SD_Angle);
  3779. }
  3780. //lower ds sharpness to avoid detail lose in high frequency (chroma pattern 1)
  3781. //weifeng, modify by sharlen request, for DTV image interlace
  3782. //Mantis 25083,25909 Lack of sharpness
  3783. if(VIP_GetUserSource()== SOURCE_MPEG && VIP_GetInputVSize() > 600)
  3784. {
  3785. PQ_RegisterWrite(VIP_reg_slr_comb_slope_2_nom ,0x3);//0x0 Jagged edge
  3786. PQ_RegisterWrite(VIP_reg_slr_comb_th_nom ,0x8);
  3787. // PQ_RegisterWrite(VIP_reg_slr_mesh_filter_en ,1);
  3788. }
  3789. if(VIP_GetInputHSize()<=400)
  3790. {
  3791. PQ_RegisterWrite(VIP_reg_ds_disable_func_en ,0x1);
  3792. PQ_RegisterWrite(VIP_reg_ds_disable_angle_sel ,0x1);
  3793. }
  3794. }
  3795. ucTempds_disable_func_en = PQ_RegisterRead(VIP_reg_ds_disable_func_en);
  3796. }
  3797. //****************************************************************************
  3798. //
  3799. // Function : PQ_Saturation
  3800. // Params :
  3801. // Description:
  3802. // Returns : void
  3803. //****************************************************************************
  3804. void PQ_Saturation(INT32 iValue) // 0 ~ 127
  3805. {
  3806. PQHW_CONTEXT* pHwContext= &PQHwContext;
  3807. pHwContext->iSaturation = iValue<<(COLOR_MATRIX_GAIN_BIT_SYSTEM-COLOR_MATRIX_GAIN_OSD_BIT_SYSTEM);
  3808. PQ_ColorMatrixSetup(TRUE, 1);
  3809. PQ_ColorMatrixSetup(TRUE, 2);
  3810. PQ_ColorMatrixSetup(TRUE, 4);
  3811. PQ_ColorMatrixSetup(TRUE, 5);
  3812. PQ_ColorMatrixSetup(TRUE, 7);
  3813. PQ_ColorMatrixSetup(TRUE, 8);
  3814. }
  3815. void PQ_ColorStyleSaturation(UINT8 ucType)
  3816. {
  3817. PQHW_CONTEXT* pHwContext= &PQHwContext;
  3818. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  3819. pMenuValue->ucColorStyle = ucType;
  3820. PQ_Saturation(pMenuValue->iSaturation);
  3821. }
  3822. //****************************************************************************
  3823. //
  3824. // Function : PQ_Hue
  3825. // Params :
  3826. // Description: Powers up/down the panel as per the given power sequence timings
  3827. // Returns : void
  3828. //****************************************************************************
  3829. void PQ_Hue(UINT8 ucIndex) // 0 ~ 31 ->0 ~ 100
  3830. {
  3831. PQHW_CONTEXT* pHwContext= &PQHwContext;
  3832. if( pHwContext->bEnableColorProcess==FALSE )
  3833. ucIndex= 50;//16;
  3834. PQDebugPrint("%s: ucIndex=%d", __FUNCTION__, ucIndex);
  3835. if( ucIndex<101 ) //sizeof(HueSetting)/sizeof(HUE)=33
  3836. {
  3837. pHwContext->iHue = ucIndex;
  3838. PQ_ColorMatrixSetup(TRUE, 1);
  3839. PQ_ColorMatrixSetup(TRUE, 2);
  3840. PQ_ColorMatrixSetup(TRUE, 4);
  3841. PQ_ColorMatrixSetup(TRUE, 5);
  3842. PQ_ColorMatrixSetup(TRUE, 7);
  3843. PQ_ColorMatrixSetup(TRUE, 8);
  3844. PQ_PureColorControl(ucIndex-100, 3);
  3845. }
  3846. }
  3847. //****************************************************************************
  3848. //
  3849. // Function : PQ_ColorTempGain
  3850. // Params :
  3851. // Description: Powers up/down the panel as per the given power sequence timings
  3852. // Returns : void
  3853. //****************************************************************************
  3854. void PQ_ColorTempGain(PQ_COLOR_TEMP_GAIN ucType, INT32 iValue)
  3855. {
  3856. PQHW_CONTEXT* pHwContext= &PQHwContext;
  3857. if( pHwContext->bEnableColorProcess==FALSE )
  3858. iValue= 1<<COLOR_MATRIX_GAIN_OSD_BIT_SYSTEM;
  3859. switch(ucType){
  3860. case PQ_CT_GAIN_R:
  3861. pHwContext->iRGain=iValue<<(COLOR_MATRIX_GAIN_BIT_SYSTEM-COLOR_MATRIX_GAIN_OSD_BIT_SYSTEM);
  3862. PQ_ColorMatrixSetup(TRUE, 0);
  3863. PQ_ColorMatrixSetup(TRUE, 1);
  3864. PQ_ColorMatrixSetup(TRUE, 2);
  3865. break;
  3866. case PQ_CT_GAIN_G:
  3867. pHwContext->iGGain=iValue<<(COLOR_MATRIX_GAIN_BIT_SYSTEM-COLOR_MATRIX_GAIN_OSD_BIT_SYSTEM);
  3868. PQ_ColorMatrixSetup(TRUE, 3);
  3869. PQ_ColorMatrixSetup(TRUE, 4);
  3870. PQ_ColorMatrixSetup(TRUE, 5);
  3871. break;
  3872. case PQ_CT_GAIN_B:
  3873. pHwContext->iBGain=iValue<<(COLOR_MATRIX_GAIN_BIT_SYSTEM-COLOR_MATRIX_GAIN_OSD_BIT_SYSTEM);
  3874. PQ_ColorMatrixSetup(TRUE, 6);
  3875. PQ_ColorMatrixSetup(TRUE, 7);
  3876. PQ_ColorMatrixSetup(TRUE, 8);
  3877. break;
  3878. }
  3879. PQ_ColorMatrixComp(TRUE);
  3880. }
  3881. static UINT8 bShift = 0;
  3882. static UINT16 bHsize,bVsize;
  3883. UINT16 bHStart_t = 0,bVStart_t = 0;
  3884. void PQ_regionLumaAverage(UINT8 bRegionIndex,UINT8 bTotalHnum,UINT8 bTotalVnum)
  3885. {
  3886. UINT16 bOUTH = 0, bOUTV = 0;
  3887. UINT16 bHStart,bVStart;
  3888. UINT16 bHStartTemp = 0;
  3889. UINT8 bnumber = 0;
  3890. if((bRegionIndex + 1) > (bTotalHnum * bTotalVnum))
  3891. {
  3892. return;
  3893. }
  3894. bOUTH = VIP_GetOutputHSize();
  3895. bOUTV = VIP_GetOutputVSize();
  3896. if((bOUTH== 0) || (bOUTV == 0))
  3897. {
  3898. return;
  3899. }
  3900. if(bTotalHnum > 0)
  3901. {
  3902. bnumber = bRegionIndex / bTotalHnum;
  3903. bHsize = bOUTH / bTotalHnum;
  3904. bVsize = bOUTV / bTotalVnum;
  3905. }
  3906. bHStart = bHsize * (bRegionIndex - bnumber * bTotalHnum);
  3907. bVStart = bVsize * bnumber;
  3908. if(bHStart > 1)
  3909. bHStart = bHStart - 1;
  3910. if (bVStart > 1)
  3911. bVStart = bVStart - 1;
  3912. if(PQ_RegisterRead( VIP_reg_dpy_rgbstat_en) == 0)
  3913. {
  3914. PQ_RegisterWrite( VIP_reg_dpy_rgbstat_en, 1);
  3915. }
  3916. if((bHStart >= bHsize) && (bHStart <= bOUTH/2))
  3917. {
  3918. bHStartTemp = bOUTH - (bHStart + bHsize);
  3919. PQ_RegisterWrite( VIP_reg_dpy_rgbstat_rhs, bHStartTemp);
  3920. PQ_RegisterWrite( VIP_reg_dpy_rgbstat_rvs, bVStart);
  3921. if((bHStartTemp + bHsize) > (bOUTH- 1))
  3922. {
  3923. bHsize = bOUTH - bHStartTemp;
  3924. }
  3925. }
  3926. else
  3927. {
  3928. PQ_RegisterWrite( VIP_reg_dpy_rgbstat_lhs, bHStart);
  3929. PQ_RegisterWrite( VIP_reg_dpy_rgbstat_lvs, bVStart);
  3930. if((bHStart + bHsize) > (bOUTH- 1))
  3931. {
  3932. bHsize = bOUTH - bHStart;
  3933. }
  3934. }
  3935. if((bVStart + bVsize) > (bOUTV - 1))
  3936. {
  3937. bVsize = bOUTV - bVStart;
  3938. }
  3939. PQ_RegisterWrite( VIP_reg_dpy_rgbstat_hsize, bHsize-1);
  3940. PQ_RegisterWrite( VIP_reg_dpy_rgbstat_vsize, bVsize-1);
  3941. if((bHsize * bVsize) < (1024 * 8))// 2 13
  3942. {
  3943. bShift = 11;
  3944. PQ_RegisterWrite(VIP_reg_dpy_rgbstat_sft, 0);
  3945. }
  3946. else if((bHsize * bVsize) < (1024 * 32))
  3947. {
  3948. bShift = 13;
  3949. PQ_RegisterWrite(VIP_reg_dpy_rgbstat_sft, 1);
  3950. }
  3951. else if((bHsize * bVsize) < (1024 * 128))
  3952. {
  3953. bShift = 15;
  3954. PQ_RegisterWrite(VIP_reg_dpy_rgbstat_sft, 2);
  3955. }
  3956. else
  3957. {
  3958. bShift = 17;
  3959. PQ_RegisterWrite(VIP_reg_dpy_rgbstat_sft, 3);
  3960. }
  3961. if((bRegionIndex>=1)&&(bHStart > 1))
  3962. {
  3963. bHStart_t = bHStart + 1;
  3964. }
  3965. else
  3966. {
  3967. bHStart_t = bHStart;
  3968. }
  3969. if(bHStart_t >= bOUTH)
  3970. {
  3971. bHStart_t = bOUTH - 1;
  3972. }
  3973. if((bRegionIndex>=1)&&(bVStart > 1))
  3974. {
  3975. bVStart_t = bVStart + 1;
  3976. }
  3977. else
  3978. {
  3979. bVStart_t = bVStart;
  3980. }
  3981. if(bVStart_t >= bOUTV)
  3982. {
  3983. bVStart_t = bOUTV - 1;
  3984. }
  3985. mdelay(15);
  3986. }
  3987. void PQ_GetRegionLumaAverage(UINT16* bRegionYaverage)
  3988. {
  3989. UINT32 ulValue = 0;
  3990. UINT32 bRed = 0,bGreen = 0,bBlue = 0;
  3991. UINT16 temp = 0;
  3992. mdelay(10);
  3993. ulValue = PQ_RegisterRead(VIP_reg_dpy_blkl0_dout);
  3994. if((bHsize * bVsize) > 0)
  3995. {
  3996. bRed = ((ulValue&0x3ff)<<bShift )/(bHsize * bVsize);
  3997. bGreen = (((ulValue>>20)&0x3ff)<<bShift)/(bHsize * bVsize) ;
  3998. bBlue = (((ulValue>>10)&0x3ff)<<bShift)/(bHsize * bVsize);
  3999. }
  4000. temp = (299 * bRed)/1000 + (587 * bGreen)/1000 + (114 * bBlue)/1000;
  4001. if(temp > 255)
  4002. temp = 255;
  4003. *bRegionYaverage = temp;
  4004. }
  4005. void PQ_GetRegionvalue(RegionHVStartSize* bRegionvalue)
  4006. {
  4007. bRegionvalue->bHsize = bHsize;
  4008. bRegionvalue->bVsize = bVsize;
  4009. bRegionvalue->bHstart = bHStart_t;
  4010. bRegionvalue->bVstart = bVStart_t;
  4011. }
  4012. void PQ_UltraLowSetting(UINT8 ucEnable)
  4013. {
  4014. if(ucEnable)
  4015. {
  4016. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_color_hl_coring, 0x50);
  4017. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_lb_1, 0x12c);
  4018. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_rb_1, 0x15e);
  4019. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_min_1, 0x1900);
  4020. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_max_1, 0x19000);
  4021. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_lb_2, 175);
  4022. PQ_RegisterWrite(VIP_reg_vdi_tnr_hue_rb_2, 270);
  4023. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_min_2, 400);
  4024. PQ_RegisterWrite(VIP_reg_vdi_tnr_sat_max_2, 0xfffff);
  4025. PQ_RegisterWrite(VIP_reg_vdi_color_cnt_th, 0);
  4026. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_color_hl_coring2, (VIP_GetInputVSize()<720)?32:0);
  4027. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_color_vl_coring2, (VIP_GetInputVSize()<720)?32:0);
  4028. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_color_en, 1);
  4029. /*
  4030. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_debug, 0);
  4031. PQ_RegisterWrite(VIP_reg_vdi_colorHsulowL1, 0);
  4032. PQ_RegisterWrite(VIP_reg_vdi_colorHsulowL2, 1);
  4033. PQ_RegisterWrite(VIP_reg_vdi_colorHtulowL1, 0);
  4034. PQ_RegisterWrite(VIP_reg_vdi_colorHtulowL2, 0);
  4035. */
  4036. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_color_th1, 0x24);
  4037. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_color_th2, 0x3);
  4038. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_color_th3, 0x850);
  4039. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_color_th4, 0);
  4040. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_color_th1, 0x22);
  4041. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_color_th2, 0x02);
  4042. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_color_th3, 0x850);
  4043. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_color_th4, 0x00);
  4044. #if 0
  4045. if(VIP_IsPCSource())
  4046. {
  4047. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_th1, 64);
  4048. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_th2, 8);
  4049. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_th4, 0);
  4050. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_th3, 3600);
  4051. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_th1, 64);
  4052. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_th2, 8);
  4053. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_th4, 0);
  4054. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_bmax_sel, 1);
  4055. }
  4056. else
  4057. #endif
  4058. {
  4059. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_th1, 0x24);
  4060. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_th2, 0x2);
  4061. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_bmax_sel, 1);
  4062. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_th3, 0x800);
  4063. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_th4, 0x0);
  4064. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_th1, 0x24);
  4065. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_th2, 0x02);
  4066. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_th4, 0x00);
  4067. }
  4068. //PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_alpha, 0x10);
  4069. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_th3, 0x800);
  4070. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_lp_en, 1);
  4071. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_bmax_sel, 1);
  4072. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_hl_coring, 0x30);
  4073. PQ_RegisterWrite(VIP_reg_vdi_snr_ulow_vl_coring, 0x30);
  4074. //PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_alpha, 0x10);
  4075. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_dyn_adj, 1);
  4076. PQ_RegisterWrite(VIP_reg_vdi_tnr_th_dyn_adj, 1);
  4077. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_dith_en, 1);
  4078. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_en, 1);
  4079. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_mbw_en, 0);
  4080. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_sel, 1);
  4081. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_sel, 0);
  4082. }
  4083. else
  4084. {
  4085. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_dyn_adj, 1);
  4086. PQ_RegisterWrite(VIP_reg_vdi_tnr_th_dyn_adj, 1);
  4087. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_dith_en, 1);
  4088. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_en, 0);
  4089. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_mbw_en, 0);
  4090. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_sel, 1);
  4091. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_sel, 0);
  4092. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_color_en, 0);
  4093. }
  4094. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_dyn_adj, (VIP_GetInputVSize()<720)?0:1);
  4095. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_en, (VIP_GetInputVSize()<720)?1:0);
  4096. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_mbw_en, 1);
  4097. }
  4098. void PQ_NRLevel(UINT32 nr_level, UINT32 vdi_total)
  4099. {
  4100. PQHW_CONTEXT* pHwContext= &PQHwContext;
  4101. #ifndef ADJUST_NR_By_Yavg
  4102. VTAB_CMN_VALUE_DEFINE* pVtabCmnValue= &pHwContext->VtabCmnValue;
  4103. UINT8 ucCurrSrcIndex,ucTableIndex;
  4104. UINT8 ucLevel= nr_level;
  4105. ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  4106. if ((ucCurrSrcIndex >= SRC_INDEX_UNKNOWN))
  4107. {
  4108. PQDebugPrint("%s: SrcIndex (%d) unknown/invalid, pLUTTable->SrcCount (%d)!", __FUNCTION__, ucCurrSrcIndex,pLUTTable->SrcCount);
  4109. return;
  4110. }
  4111. ucTableIndex = pVtabCmnValue->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex];
  4112. #endif
  4113. pHwContext->iAdjustNRCounter = 0;
  4114. ///if(vdi_total>=4095) vdi_total=4095;
  4115. PQ_RegisterWrite(VIP_reg_vdi_tnr_v_ref, 8);
  4116. PQ_RegisterWrite(VIP_reg_vdi_tnr_u_ref, 8);
  4117. PQ_RegisterWrite(VIP_reg_vdi_tnr_u_ref, (VIP_GetInputVSize()<720)?40:24);;
  4118. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_en, 1);
  4119. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_en, (VIP_GetInputVSize()<720)?1:0);
  4120. if( nr_level == OFF &&
  4121. (VIP_GetUserSource() == SOURCE_JPEG ||
  4122. VIP_GetUserSource() == SOURCE_HDMI ||
  4123. VIP_GetUserSource() == SOURCE_MPEG ||
  4124. VIP_IsPCSource())
  4125. )
  4126. {
  4127. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_CORING, 0);
  4128. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH, 0);
  4129. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_CORING, 0);
  4130. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH, 0);
  4131. PQ_SetupStrength(PQ_ITEM_TNR_ULTRA_LOW, 0);
  4132. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_CORING, 0);
  4133. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_STRENGTH, 0);
  4134. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_CORING, 0);
  4135. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_STRENGTH, 0);
  4136. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_CORING, 0);
  4137. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_STRENGTH, 0);
  4138. }
  4139. #ifndef ADJUST_NR_By_Yavg
  4140. else if(ucLevel>=WEAK && ucLevel<=STRONG )
  4141. {
  4142. ucLevel-= 1;
  4143. PQDebugPrint("%s: nr degrees= %d %d %d %d %d %d %d %d %d %d %d %d %d\n", __FUNCTION__,
  4144. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaTnrCoring.Degree[ucLevel],
  4145. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaTnrStrength.Degree[ucLevel],
  4146. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].ChromaTnrCoring.Degree[ucLevel],
  4147. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].ChromaTnrStrength.Degree[ucLevel],
  4148. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaSnr1Coring.Degree[ucLevel],
  4149. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaSnr1Strength.Degree[ucLevel],
  4150. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaSnr2Coring.Degree[ucLevel],
  4151. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaSnr2Strength.Degree[ucLevel],
  4152. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].ChromaSnrCoring.Degree[ucLevel],
  4153. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].ChromaSnrStrength.Degree[ucLevel],
  4154. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].TnrUltraLowAlpha.Degree[ucLevel],
  4155. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].Snr1UltraLowCoring.Degree[ucLevel],
  4156. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].Snr2UltraLowCoring.Degree[ucLevel]
  4157. );
  4158. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_CORING, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaTnrCoring.Degree[ucLevel]);
  4159. PQ_SetupStrength(PQ_ITEM_LUMA_TNR_STRENGTH, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaTnrStrength.Degree[ucLevel]);
  4160. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_CORING, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].ChromaTnrCoring.Degree[ucLevel]);
  4161. PQ_SetupStrength(PQ_ITEM_CHROMA_TNR_STRENGTH, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].ChromaTnrStrength.Degree[ucLevel]);
  4162. PQ_SetupStrength(PQ_ITEM_TNR_ULTRA_LOW, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].TnrUltraLowAlpha.Degree[ucLevel]);
  4163. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_CORING, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaSnr1Coring.Degree[ucLevel]);
  4164. PQ_SetupStrength(PQ_ITEM_LUMA_SNR1_STRENGTH, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaSnr1Strength.Degree[ucLevel]);
  4165. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_CORING, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaSnr2Coring.Degree[ucLevel]);
  4166. PQ_SetupStrength(PQ_ITEM_LUMA_SNR2_STRENGTH, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].LumaSnr2Strength.Degree[ucLevel]);
  4167. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_CORING, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].ChromaSnrCoring.Degree[ucLevel]);
  4168. PQ_SetupStrength(PQ_ITEM_CHROMA_SNR_STRENGTH, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].ChromaSnrStrength.Degree[ucLevel]);
  4169. PQ_SetupStrength(PQ_ITEM_SNR1_ULTRA_LOW, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].Snr1UltraLowCoring.Degree[ucLevel]);
  4170. PQ_SetupStrength(PQ_ITEM_SNR2_ULTRA_LOW, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].Snr2UltraLowCoring.Degree[ucLevel]);
  4171. }
  4172. #endif
  4173. PQ_UltraLowSetting(ENABLE);
  4174. }
  4175. //****************************************************************************
  4176. //
  4177. // Function : PQ_3DNoiseReductoin
  4178. // Params :
  4179. // Description:
  4180. // Returns : void
  4181. //****************************************************************************
  4182. void PQ_3DNoiseReductoin(UINT8 ucMode,UINT8 iUserMin, UINT8 iUserMax )
  4183. {
  4184. PQHW_CONTEXT* pHwContext= &PQHwContext;
  4185. UINT32 vdi_hsize_i,vdi_vsize,vdi_total;
  4186. BOOL bNrEnable;
  4187. if( pHwContext->bEnableColorProcess==FALSE )
  4188. ucMode= OFF;
  4189. PQDebugPrint("%s:nNRLevel=%d\n", __FUNCTION__, ucMode);
  4190. pHwContext->nNRLevel= ucMode;
  4191. pHwContext->ucNRUserMin = iUserMin;
  4192. pHwContext->ucNRUserMax = iUserMax;
  4193. bNrEnable= (pHwContext->nNRLevel>OFF) ? ENABLE : DISABLE;
  4194. #ifdef ADJUST_NR_By_Yavg
  4195. if (VIP_GetUserSource()!= SOURCE_HDMI && VIP_GetUserSource()!= SOURCE_MPEG)
  4196. {
  4197. bNrEnable = ENABLE;
  4198. }
  4199. #endif
  4200. //#if(CONFIG_DRAMSIZE == 64)
  4201. if(VIP_IsPCSource()|| VIP_RunDVIMode())
  4202. {
  4203. bNrEnable=DISABLE;
  4204. }
  4205. //#endif
  4206. PQ_RegisterWrite(VIP_reg_vdi_tnr_en, bNrEnable); //always open to let VIP_field_diff_cnt can work
  4207. PQ_RegisterWrite(VIP_reg_vdi_snr_hfil_en, bNrEnable);
  4208. PQ_RegisterWrite(VIP_reg_vdi_snr_vfil_en, bNrEnable);
  4209. if (VIP_GetUserSource()==SOURCE_CVD2)
  4210. PQ_RegisterWrite(VIP_reg_vdi_sigmanr_en, 0);
  4211. else
  4212. PQ_RegisterWrite(VIP_reg_vdi_sigmanr_en, bNrEnable);
  4213. vdi_hsize_i= VIP_GetScalerPreScaleH();
  4214. vdi_vsize= PQ_Get_VDI_VSize();
  4215. vdi_total= vdi_hsize_i*vdi_vsize;
  4216. #if 0
  4217. if (VIP_GetUserSource()==1 && VIP_IsATVSource())
  4218. PQ_NRLevel(ucMode + 1, vdi_total);
  4219. else
  4220. #endif
  4221. PQ_NRLevel(ucMode, vdi_total);
  4222. }
  4223. void PQ_MPEGNRLevel(UINT32 nr_level, UINT32 vdi_total)
  4224. {
  4225. PQHW_CONTEXT* pHwContext= &PQHwContext;
  4226. VTAB_CMN_VALUE_DEFINE* pVtabCmnValue= &pHwContext->VtabCmnValue;
  4227. UINT8 ucLevel= nr_level;
  4228. //if(vdi_total>=4095) vdi_total=4095;
  4229. UINT32 maxedgev_th;
  4230. UINT8 ucCurrSrcIndex,ucTableIndex;
  4231. ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  4232. if ((ucCurrSrcIndex >= SRC_INDEX_UNKNOWN))
  4233. {
  4234. PQDebugPrint("%s: SrcIndex (%d) unknown/invalid, pLUTTable->SrcCount (%d)!", __FUNCTION__, ucCurrSrcIndex,pLUTTable->SrcCount);
  4235. return;
  4236. }
  4237. ucTableIndex = pVtabCmnValue->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex];
  4238. maxedgev_th=vdi_total/337;
  4239. if(maxedgev_th>=4095) maxedgev_th=4095;
  4240. if( nr_level==WEAK )
  4241. {
  4242. //DeBlock
  4243. PQ_RegisterWrite(VIP_reg_vdi_maxedgev_th, maxedgev_th);
  4244. //MNR
  4245. PQ_RegisterWrite(VIP_reg_vdi_mad_mnr_thd, 6);
  4246. }
  4247. else if( nr_level==STRONG )
  4248. {
  4249. //DeBlock
  4250. PQ_RegisterWrite(VIP_reg_vdi_maxedgev_th, maxedgev_th);
  4251. //MNR
  4252. PQ_RegisterWrite(VIP_reg_vdi_mad_mnr_thd, 4);
  4253. }
  4254. else
  4255. {
  4256. //DeBlock
  4257. PQ_RegisterWrite(VIP_reg_vdi_maxedgev_th, maxedgev_th);
  4258. //MNR
  4259. PQ_RegisterWrite(VIP_reg_vdi_mad_mnr_thd, 4);
  4260. }
  4261. if( ucLevel>=WEAK && ucLevel<=STRONG )
  4262. {
  4263. ucLevel-= 1;
  4264. PQDebugPrint("%s: mpeg nr degrees= %d %d %d %d", __FUNCTION__,
  4265. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].BlockNrCoring.Degree[ucLevel],
  4266. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].BlockNrStrength.Degree[ucLevel],
  4267. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].MosquitoNrCoring.Degree[ucLevel],
  4268. pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].MosquitoNrStrength.Degree[ucLevel]
  4269. );
  4270. PQ_SetupStrength(PQ_ITEM_BLOCK_NR_CORING, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].BlockNrCoring.Degree[ucLevel]);
  4271. PQ_SetupStrength(PQ_ITEM_BLOCK_NR_STRENGTH, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].BlockNrStrength.Degree[ucLevel]);
  4272. PQ_SetupStrength(PQ_ITEM_MOSQUITO_NR_CORING, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].MosquitoNrCoring.Degree[ucLevel]);
  4273. PQ_SetupStrength(PQ_ITEM_MOSQUITO_NR_STRENGTH, pVtabCmnValue->mNRSetting.mNRSetting_byGroupIdx[ucTableIndex].MosquitoNrStrength.Degree[ucLevel]);
  4274. }
  4275. }
  4276. void PQ_MPEGNoiseReductoin(UINT8 ucLevel,UINT8 iUserMin, UINT8 iUserMax )
  4277. {
  4278. PQHW_CONTEXT* pHwContext= &PQHwContext;
  4279. UINT32 vdi_hsize_i,vdi_vsize,vdi_total;
  4280. BOOL bNrEnable;
  4281. BOOL bDeblockEnable;
  4282. if( pHwContext->bEnableColorProcess==FALSE )
  4283. ucLevel= OFF;
  4284. PQDebugPrint("%s:nMpegNRLevel=%d", __FUNCTION__, ucLevel);
  4285. pHwContext->nMPEGNRLevel= ucLevel;
  4286. pHwContext->ucMPEGNRUserMax = iUserMax;
  4287. pHwContext->ucMPEGNRUserMin = iUserMin;
  4288. bNrEnable= (pHwContext->nMPEGNRLevel>OFF) ? ENABLE : DISABLE;
  4289. bNrEnable= (bNrEnable) && (!VIP_IsPCSource() || !VIP_RunDVIMode());
  4290. bDeblockEnable=(!VIP_IsPCSource()) && (!VIP_RunDVIMode());
  4291. PQ_RegisterWrite(VIP_reg_gfx_dbk_en, bNrEnable && bDeblockEnable);
  4292. #if 0
  4293. if(pHwContext->cInputDataFormat == RGB && !VIP_IsPCSource())
  4294. PQ_RegisterWrite(VIP_reg_vdi_mnr_fil_en, 0);
  4295. else
  4296. PQ_RegisterWrite(VIP_reg_vdi_mnr_fil_en, bNrEnable);
  4297. #else
  4298. PQ_RegisterWrite(VIP_reg_vdi_mnr_fil_en, bNrEnable && (VIP_GetInputDataFormat()!=RGB));
  4299. #endif
  4300. if( bNrEnable )
  4301. {
  4302. vdi_hsize_i= VIP_GetScalerPreScaleH();
  4303. vdi_vsize= PQ_Get_VDI_VSize();
  4304. vdi_total= vdi_hsize_i*vdi_vsize;
  4305. PQ_MPEGNRLevel(ucLevel, vdi_total);
  4306. }
  4307. }
  4308. //****************************************************************************
  4309. //
  4310. // Function : PQ_SetGammaTable
  4311. // Params : *pulAddr
  4312. // Description: set gamma table to VIP
  4313. // Returns : 0=fail ,1=success
  4314. //****************************************************************************
  4315. BOOL PQ_SetGammaTable(UINT32 *pulAddr)
  4316. {
  4317. INT32 iTableCnt;
  4318. PQ_RegisterWrite(VIP_reg_dpy_gmlut_addr,0); //initial index for gamma table write
  4319. for (iTableCnt=0;iTableCnt<GAMMA_RGB_MAXINDEX_512;iTableCnt++){
  4320. PQ_RegisterWrite(VIP_reg_dpy_gmlut_data, *pulAddr );
  4321. pulAddr++;
  4322. }
  4323. return TRUE;
  4324. }
  4325. //****************************************************************************
  4326. //
  4327. // Function : PQ_LoadGammaTable
  4328. // Params : *pulAddr
  4329. // Description: read out gamma table form VIP
  4330. // Returns : table data size
  4331. //****************************************************************************
  4332. UINT32 PQ_LoadGammaTable(UINT32 *pulAddr)
  4333. {
  4334. INT32 iTableCnt;
  4335. PQ_RegisterWrite(VIP_reg_dpy_gmlut_addr,0); //initial index for gamma table write
  4336. for (iTableCnt=0;iTableCnt<GAMMA_RGB_MAXINDEX_512;iTableCnt++){
  4337. *pulAddr=PQ_RegisterRead(VIP_reg_dpy_gmlut_data);
  4338. pulAddr++;
  4339. }
  4340. *pulAddr=0x35536953; //identify gamma table string
  4341. pulAddr++;
  4342. *pulAddr=0x475f3631;
  4343. pulAddr++;
  4344. *pulAddr=0x616d6d61;
  4345. return 4108; //gamma talbe total size
  4346. }
  4347. void PQ_SetupGammaTable(UINT8 ucEnable, UINT8 ucTableIndex)
  4348. {
  4349. volatile UINT32 *pGammaTable = NULL;
  4350. UINT8 pGammaTableID[15];
  4351. UINT32 ulCounter;
  4352. BOOL b12BitGammaTable= FALSE;
  4353. PQHW_CONTEXT* pHwContext= &PQHwContext;
  4354. PQDebugPrint("%s: ucEnable=%d, ucTableIndex=%d", __FUNCTION__, ucEnable, ucTableIndex);
  4355. if(pHwContext->GammaIndex != ucTableIndex || pHwContext->GammaEnable != ucEnable)//prevent blanking from duplicate setting
  4356. {
  4357. if(ucEnable == ENABLE)
  4358. {
  4359. if(ucTableIndex>2) // gamma table index is out of range
  4360. {
  4361. PQDebugPrint("%s: [ERROR!!] ucTableIndex is illegal(out of range: 0~2)", __FUNCTION__);
  4362. return;
  4363. }
  4364. pGammaTable = (volatile UINT32*) (SPI_GAMMATABLE_SHADOWADDR+(SPI_GAMMATABLE_SIZE*ucTableIndex));
  4365. memcpy(pGammaTableID, ((UINT8 *)pGammaTable)+0x1000, 14);
  4366. memset(&pGammaTableID[14], 0, 1);
  4367. PQDebugPrint("%s: tag of table %d is %s", __FUNCTION__, ucTableIndex, pGammaTableID);
  4368. if( memcmp(pGammaTableID, ID_GammaString12, 14)==0 )
  4369. {
  4370. b12BitGammaTable= TRUE;
  4371. }
  4372. else if( memcmp(pGammaTableID, ID_GammaString10, 12)==0 ) //recognize prefix 12 characters
  4373. {
  4374. b12BitGammaTable= FALSE;
  4375. }
  4376. else
  4377. {
  4378. PQDebugPrint("%s: Gamma Table ID is illegal, diable gamma table!!", __FUNCTION__);
  4379. pHwContext->GammaEnable = DISABLE;
  4380. PQ_RegisterWrite(VIP_reg_dpy_no_gamma, ENABLE); //disable gamma function
  4381. return;
  4382. }
  4383. // start to setup gamma table as following if ucTableIndex and GammaTableID are correct
  4384. pHwContext->GammaIndex=ucTableIndex;
  4385. pHwContext->GammaEnable = ENABLE;
  4386. PQ_RegisterWrite(VIP_reg_dpy_no_gamma, ENABLE); //disable gamma function
  4387. 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
  4388. //write gamma table
  4389. PQ_RegisterWrite(VIP_reg_dpy_gmlut_addr,0); //initial index for gamma table write
  4390. for (ulCounter=0;ulCounter<GAMMA_RGB_MAXINDEX;ulCounter=ulCounter+2) //input data 10/12 bits
  4391. {
  4392. #ifdef CONFIG_PANEL_LM201WE3_TLF5_1680X1050__S2TEK_IS_DEFAULT
  4393. UINT16 TempR,TempB,TempG;
  4394. TempR = 1023 - ((pGammaTable[ulCounter] & 0x3ff00000) >> 20);
  4395. TempG = 1023 - ((pGammaTable[ulCounter] & 0xFFD00) >> 10);
  4396. TempB = 1023 - (pGammaTable[ulCounter] & 0x3FF);
  4397. pGammaTable[ulCounter] = (TempR << 20) + (TempG << 10) + TempB;
  4398. if(!b12BitGammaTable)
  4399. {
  4400. PQ_RegisterWrite(VIP_reg_dpy_gmlut_data,pGammaTable[ulCounter]);
  4401. }
  4402. else
  4403. {
  4404. PQ_RegisterWrite(VIP_reg_dpy_gmlut_data,pGammaTable[ulCounter]);
  4405. PQ_RegisterWrite(VIP_reg_dpy_gmlut_data,pGammaTable[ulCounter+1]);
  4406. }
  4407. #else //short setting time to avoid setting error
  4408. if(!b12BitGammaTable)
  4409. {
  4410. PQ_RegisterWrite(VIP_reg_dpy_gmlut_data,pGammaTable[ulCounter]);
  4411. }
  4412. else
  4413. {
  4414. PQ_RegisterWrite(VIP_reg_dpy_gmlut_data,pGammaTable[ulCounter]);
  4415. PQ_RegisterWrite(VIP_reg_dpy_gmlut_data,pGammaTable[ulCounter+1]);
  4416. }
  4417. #endif
  4418. }
  4419. PQ_RegisterWrite(VIP_reg_dpy_no_gamma, DISABLE); //enable gamma function
  4420. PQ_RegisterWrite(VIP_reg_dpy_gmlut_addr,0);
  4421. PQ_RegisterWrite(VIP_reg_dpy_gm_cfg12bit, b12BitGammaTable);
  4422. }
  4423. else
  4424. {
  4425. pHwContext->GammaEnable = DISABLE;
  4426. PQDebugPrint("Without Gamma Table.......Turn off Gamma correction.");
  4427. PQ_RegisterWrite(VIP_reg_dpy_no_gamma, ENABLE); //disable gamma function
  4428. }
  4429. }
  4430. }
  4431. void PQ_ColorProcesser(UINT8 ucEnable)
  4432. {
  4433. PQHW_CONTEXT* pHwContext= &PQHwContext;
  4434. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  4435. PQ_ADVANCE_HWPrint( "%s: ucEnable=%d", __FUNCTION__, ucEnable);
  4436. pHwContext->bEnableColorProcess= ucEnable;
  4437. if( ucEnable==DISABLE )
  4438. {
  4439. //Set Normal values
  4440. PQ_Brightness(TRUE, 1024);
  4441. PQ_Contrast(TRUE, 1024);
  4442. PQ_Sharpness(TRUE, 0); //64 //should set 0 to disable sharpness by ren's request
  4443. PQ_Saturation(1024);
  4444. #if 0
  4445. PQ_Hue(16);
  4446. #else
  4447. PQ_Hue(50);
  4448. #endif
  4449. //Disable ypp mode
  4450. //PQ_RegisterWrite(VIP_reg_dpy_ypp, DISABLE); //should before brightness setting
  4451. //Disable color temp
  4452. PQ_ColorTempGain(PQ_CT_GAIN_R, 1024);
  4453. PQ_ColorTempGain(PQ_CT_GAIN_G, 1024);
  4454. PQ_ColorTempGain(PQ_CT_GAIN_B, 1024);
  4455. PQ_ColorTempBias(PQ_CT_BIAS_R, 0);
  4456. PQ_ColorTempBias(PQ_CT_BIAS_G, 0);
  4457. PQ_ColorTempBias(PQ_CT_BIAS_B, 0);
  4458. //Disable dynamic contrast
  4459. //bypass color processer
  4460. PQ_RegisterWrite(VIP_reg_dpy_hsy_bypass,1);
  4461. //Disable dynamic saturationm, in fact it disable the hw saturation
  4462. PQ_RegisterWrite(VIP_reg_dpy_hsv,0);
  4463. //Clear sharpness value
  4464. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_smooth1, 0);
  4465. PQ_RegisterWrite(VIP_reg_dpy_filter_hc_smooth1, 0);
  4466. PQ_RegisterWrite(VIP_reg_dpy_filter_vl_smooth, 0);
  4467. PQ_RegisterWrite(VIP_reg_dpy_filter_vc_smooth, 0);
  4468. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_sharp, 0);
  4469. PQ_RegisterWrite(VIP_reg_dpy_filter_hc_sharp, 0);
  4470. PQ_RegisterWrite(VIP_reg_dpy_filter_vl_sharp, 0);
  4471. PQ_RegisterWrite(VIP_reg_dpy_filter_vc_sharp, 0);
  4472. //Disable NR
  4473. PQ_3DNoiseReductoin(OFF, 0, 0);
  4474. PQ_MPEGNoiseReductoin(OFF, 0, 0);
  4475. //Disable LUT
  4476. PQ_SetupLUTTable(DISABLE);
  4477. }
  4478. else
  4479. {
  4480. //Restore menu values
  4481. PQ_Brightness(TRUE, pMenuValue->iBrightness);
  4482. PQ_Contrast(TRUE, pMenuValue->iContrast);
  4483. PQ_Sharpness(TRUE, pMenuValue->iSharpness);
  4484. PQ_Saturation(pMenuValue->iSaturation);
  4485. PQ_Hue(pMenuValue->iHue);
  4486. //Restore ypp mode
  4487. //#if prevent_DPY_from_clamping_input_YCC_16_235
  4488. //PQ_RegisterWrite(VIP_reg_dpy_ypp, ENABLE); //should before brightness setting
  4489. //#endif
  4490. //Enable color temp
  4491. PQ_ColorTempGain(PQ_CT_GAIN_R, pMenuValue->iColorTemp[0]);
  4492. PQ_ColorTempGain(PQ_CT_GAIN_G, pMenuValue->iColorTemp[1]);
  4493. PQ_ColorTempGain(PQ_CT_GAIN_B, pMenuValue->iColorTemp[2]);
  4494. PQ_ColorTempBias(PQ_CT_BIAS_R, pMenuValue->iColorBias[0]);
  4495. PQ_ColorTempBias(PQ_CT_BIAS_G, pMenuValue->iColorBias[1]);
  4496. PQ_ColorTempBias(PQ_CT_BIAS_B, pMenuValue->iColorBias[2]);
  4497. //Restore dynamic contrast
  4498. //Enable color processer
  4499. PQ_RegisterWrite(VIP_reg_dpy_hsy_bypass,0);
  4500. //Enable dynamic saturation, in fact it enable the hw saturation
  4501. PQ_RegisterWrite(VIP_reg_dpy_hsv,1);
  4502. //Enable NR
  4503. PQ_3DNoiseReductoin(pMenuValue->ucNRLevel, pHwContext->ucNRUserMin, pHwContext->ucNRUserMax);
  4504. PQ_MPEGNoiseReductoin(pMenuValue->ucMPEGNRLevel, pHwContext->ucMPEGNRUserMin, pHwContext->ucMPEGNRUserMax);
  4505. //Enable LUT
  4506. PQ_SetupLUTTable(ENABLE);
  4507. }
  4508. }
  4509. void PQ_ColorProcesserDisable(void)
  4510. {
  4511. PQ_ColorProcesser(DISABLE);
  4512. }
  4513. void PQ_DemoModeWidth(void)
  4514. {
  4515. UINT32 split_width,vdi_hsize_i,vdi_hds;
  4516. UINT32 dpy_hds;
  4517. dpy_hds= PQ_RegisterRead(VIP_reg_dpy_hds)*2;
  4518. vdi_hsize_i= VIP_GetScalerPreScaleH();
  4519. vdi_hds= 0;
  4520. split_width= 0;
  4521. if( PQ_RegisterRead(VIP_reg_vdi_tnr_debug_en)!=0 )
  4522. {
  4523. split_width= (dpy_hds+(VIP_GetOutputHSize()/2))/2;
  4524. PQDebugPrint("split width=%d ", split_width);
  4525. PQ_RegisterWrite(VIP_reg_dpy_split_width, split_width);//Dynamic Contrast
  4526. if( VIP_GetOutputHSize()>=1920 && split_width==1023 )
  4527. {
  4528. if(VIP_GetOutputHSize()> 0)
  4529. {
  4530. vdi_hds= (1023-(dpy_hds)) * vdi_hsize_i / VIP_GetOutputHSize();
  4531. }
  4532. }
  4533. else
  4534. vdi_hds= vdi_hsize_i /2;
  4535. PQ_RegisterWrite(VIP_reg_vdi_tnr_dbg_offset, vdi_hds);
  4536. }
  4537. else
  4538. {
  4539. PQ_RegisterWrite(VIP_reg_dpy_split_width, 0);//Dynamic Contrast
  4540. PQ_RegisterWrite(VIP_reg_vdi_tnr_dbg_offset, 0);
  4541. }
  4542. }
  4543. void PQ_NERegion(BOOL bDemoMode, UINT32 vdi_hsize_i, UINT32 vdi_vsize)
  4544. {
  4545. UINT32 vdi_hds,vdi_ne_total;
  4546. UINT32 vdi_hsize;
  4547. PQ_RegisterWrite(VIP_reg_vdi_ne_field_diff_th, 10);
  4548. PQ_RegisterWrite(VIP_reg_vdi_ne_static_u0, 0x20);
  4549. PQ_RegisterWrite(VIP_reg_vdi_ne_static_v0, 0x40);
  4550. PQ_RegisterWrite(VIP_reg_vdi_ne_static_u1, 0x10);
  4551. PQ_RegisterWrite(VIP_reg_vdi_ne_static_v1, 0x20);
  4552. PQ_RegisterWrite(VIP_reg_vdi_ne_alpha,4);
  4553. //set ne estimate
  4554. vdi_hds= bDemoMode ? PQ_RegisterRead(VIP_reg_vdi_tnr_dbg_offset): 0;
  4555. vdi_hsize= vdi_hsize_i - vdi_hds;
  4556. vdi_ne_total= vdi_hsize * vdi_vsize;
  4557. if(bDemoMode)
  4558. PQ_RegisterWrite(VIP_reg_vdi_ne_hds, vdi_hds + 2);
  4559. else
  4560. PQ_RegisterWrite(VIP_reg_vdi_ne_hds, 2);
  4561. PQ_RegisterWrite(VIP_reg_vdi_ne_hde, vdi_hsize_i - 3);
  4562. PQ_RegisterWrite(VIP_reg_vdi_ne_vds, 1);
  4563. PQ_RegisterWrite(VIP_reg_vdi_ne_vde, vdi_vsize - 2);
  4564. PQ_RegisterWrite(VIP_reg_vdi_ne_fd_chg_thd, vdi_ne_total *2 / 17);
  4565. PQ_RegisterWrite(VIP_reg_vdi_ne_invald_thd, vdi_ne_total *2 / 17);
  4566. PQ_RegisterWrite(VIP_reg_vdi_ne_fd_chg_thd_cur, vdi_ne_total *2 / 17);
  4567. //981113 hw design
  4568. PQ_RegisterWrite(VIP_reg_vdi_ne_mot_th1, 0xc0);
  4569. PQ_RegisterWrite(VIP_reg_vdi_ne_mot_th2, 0xffffffff);
  4570. PQ_RegisterWrite(VIP_reg_vdi_ne_fd_chg_mbw_thd, (VIP_GetInputVSize()<720 )?0x546:0x1feb);
  4571. PQ_RegisterWrite(VIP_reg_vdi_ne_total_th, vdi_ne_total/87);
  4572. //UINT32 ne_reliable_th = (vdi_ne_total * 3)/100;
  4573. PQ_RegisterWrite(VIP_reg_vdi_ne_reliable_th, 3456);//ne_reliable_th);
  4574. //PC Modified 2008-12-05 update
  4575. //1.set ne_dth_min 4 (UINT8 0xbe1c6324 4)
  4576. //2.set ne_dth_max 32 (UINT8 0xbe1c6325 32)
  4577. PQ_RegisterWrite(VIP_reg_vdi_ne_block_dth_min, 4);
  4578. PQ_RegisterWrite(VIP_reg_vdi_ne_block_dth_max, 40);//2008-12-08 PC
  4579. PQ_RegisterWrite(VIP_reg_vdi_ne_block_cth_max, 0x0);
  4580. //# block_std_th = 4^2 * 15 ^2
  4581. PQ_RegisterWrite(VIP_reg_vdi_ne_blk_std_thd, 3600);
  4582. }
  4583. void PQ_DPYDemoModeEnable(UINT8 demo_enable)
  4584. {
  4585. UINT32 split_width;
  4586. UINT32 dpy_hds;
  4587. PQDebugPrint("demo_enable=%d ", demo_enable);
  4588. if( demo_enable)
  4589. {
  4590. dpy_hds= PQ_RegisterRead(VIP_reg_dpy_hds)*2;
  4591. split_width= (dpy_hds+(VIP_GetOutputHSize()/2))/2;
  4592. PQDebugPrint("split width=%d ", split_width);
  4593. PQ_RegisterWrite(VIP_reg_dpy_split_width, split_width);
  4594. }
  4595. else
  4596. PQ_RegisterWrite(VIP_reg_dpy_split_width, 0);
  4597. }
  4598. void PQ_DemoModeEnable(UINT8 demo_enable)
  4599. {
  4600. UINT32 vdi_hsize_i,vdi_vsize;
  4601. PQDebugPrint("demo_enable=%d ", demo_enable);
  4602. vdi_hsize_i= VIP_GetScalerPreScaleH();
  4603. vdi_vsize= PQ_Get_VDI_VSize();
  4604. if(demo_enable)
  4605. {
  4606. PQ_RegisterWrite(VIP_reg_slr_dbg_view, 1); // Lowangle
  4607. PQ_RegisterWrite(VIP_reg_vdi_tnr_debug_en, 0x1); // Tnr
  4608. PQ_RegisterWrite(VIP_reg_vdi_snr_debug_en, 0x1); // Snr
  4609. }
  4610. else
  4611. {
  4612. PQ_RegisterWrite(VIP_reg_slr_dbg_view, 0); // Lowangle
  4613. PQ_RegisterWrite(VIP_reg_vdi_tnr_debug_en, 0); // Tnr
  4614. PQ_RegisterWrite(VIP_reg_vdi_snr_debug_en, 0); // Snr
  4615. PQ_RegisterWrite(VIP_reg_dpy_split_width, 0);//Dynamic Contrast
  4616. }
  4617. PQ_DemoModeWidth();
  4618. if(DRV_SLR_GetConfig() == eSLR_CONFIG_PRE_6HV_POST_H)
  4619. {
  4620. if(DRV_SLR_GetFactor_VFactor() > 0)
  4621. {
  4622. vdi_vsize*=2048/DRV_SLR_GetFactor_VFactor();
  4623. }
  4624. }
  4625. PQ_NERegion(demo_enable, vdi_hsize_i, vdi_vsize);
  4626. }
  4627. void PQ_StaticGammaSetup(INT8 cOffset)
  4628. {
  4629. }
  4630. void PQ_DynamicGammaSetting_ISR(void)
  4631. {
  4632. PQHW_CONTEXT* pHwContext= &PQHwContext;
  4633. pHwContext->GammaCount = (pHwContext->GammaCount+1)%16;
  4634. }
  4635. UINT8 PQ_GetGammaEnableSt(void)
  4636. {
  4637. PQHW_CONTEXT* pHwContext= &PQHwContext;
  4638. return pHwContext->GammaEnable;
  4639. }
  4640. /**
  4641. * @brief Set Dither OFF, method 1 or method 2
  4642. *
  4643. * This function select the Dither method or disable. There are 2 different dither method : method 1 & method 2,
  4644. * or user can disable the dither function by select dither OFF
  4645. *
  4646. * @param ucStatus means select dither method 1, dither method 2 or Disable dither function
  4647. * @note : method 1 set c346 to 0, method set C346 = 1 & C342 = 1, Disable set C346 = 1 & C342 = 2
  4648. * @return n/a
  4649. */
  4650. void PQ_SetDithering(UINT8 ucStatus)
  4651. {
  4652. if(ucStatus == PQ_DITHER_METHOD_1)
  4653. {
  4654. PQ_RegisterWrite(VIP_reg_dpy_dither_sel, 0);
  4655. }
  4656. else
  4657. {
  4658. PQ_RegisterWrite(VIP_reg_dpy_dither_sel, 1);
  4659. if(ucStatus == PQ_DITHER_DISABLE)
  4660. {
  4661. PQ_RegisterWrite(VIP_reg_dpy_dither_v2, DISABLE);
  4662. }
  4663. else
  4664. {
  4665. PQ_RegisterWrite(VIP_reg_dpy_dither_v2, ENABLE);
  4666. }
  4667. }
  4668. }
  4669. /**
  4670. * @brief Set Dither level
  4671. *
  4672. * This function set the Dither level
  4673. * dither method 1
  4674. * 0: 12bit => 12bit panel dither
  4675. * 1: 12bit => 10bit panel dither
  4676. * 2: 12bit => 9bit panel dither
  4677. * 3: 12bit => 8bit panel dither
  4678. * 4: 12bit => 7bit panel dither
  4679. * 5: 12bit => 6bit panel dither
  4680. * 0xbe1cc000[4] - 1: 3D 0: 2D
  4681. *
  4682. * dither method 2
  4683. * 0: (12 -> 10)- level1
  4684. * 1: (12 -> 9) ¡Vlevel2
  4685. * 2: (12 -> 8) ¡Vlevel3
  4686. * 3: (12 -> 6) ¡Vlevel4
  4687. * level = auto : depend on panel bits define
  4688. *
  4689. * 3D : involve time difference (the dither effect of each pixel in each frame will be different)
  4690. *
  4691. * @param ucLevel means dither setting in different panel bit
  4692. * @return n/a
  4693. */
  4694. void PQ_DitheringLevel(UINT8 ucLevel)
  4695. {
  4696. UINT32 autoulPanelBits;
  4697. UINT8 ucDitherSel;
  4698. ucDitherSel = PQ_RegisterRead(VIP_reg_dpy_dither_sel);
  4699. if(ucDitherSel) //method 2
  4700. {
  4701. if(ucLevel == PQ_Panel_10_BITS)
  4702. {
  4703. PQ_RegisterWrite(VIP_reg_dpy_data_type_v2, 0);
  4704. }
  4705. else if(ucLevel == PQ_Panel_9_BITS)
  4706. {
  4707. PQ_RegisterWrite(VIP_reg_dpy_data_type_v2, 1);
  4708. }
  4709. else if(ucLevel == PQ_Panel_8_BITS)
  4710. {
  4711. PQ_RegisterWrite(VIP_reg_dpy_data_type_v2, 2);
  4712. }
  4713. else if(ucLevel == PQ_Panel_6_BITS)
  4714. {
  4715. PQ_RegisterWrite(VIP_reg_dpy_data_type_v2, 3);
  4716. }
  4717. else // dither level = auto
  4718. {
  4719. //vip's output is 12bit, the transform is dependent on lvds's resolution.
  4720. autoulPanelBits = PQ_RegisterRead(REGISTER_ADDRESS_LVDS_MAPPING); // 0xC1B4[13:12] : lvds bit-per-pixel type
  4721. autoulPanelBits = ((autoulPanelBits >> 12) & 0x3);
  4722. if( autoulPanelBits == 0 ) // 18bpp -> 6bit
  4723. {
  4724. PQ_RegisterWrite(VIP_reg_dpy_data_type_v2, 3);
  4725. }
  4726. else if( autoulPanelBits == 1 ) // 24bpp -> 8bit
  4727. {
  4728. PQ_RegisterWrite(VIP_reg_dpy_data_type_v2, 2);
  4729. }
  4730. else if( autoulPanelBits == 2 ) // 30bpp -> 10bit
  4731. {
  4732. PQ_RegisterWrite(VIP_reg_dpy_data_type_v2, 0);
  4733. }
  4734. }
  4735. }
  4736. else //method 1
  4737. {
  4738. if(ucLevel != PQ_AUTO_DETECT_Panel_BITS)
  4739. {
  4740. PQ_RegisterWrite(VIP_reg_dpy_dither, ucLevel);
  4741. }
  4742. else // dither level = auto
  4743. {
  4744. //vip's output is 12bit, the transform is dependent on lvds's resolution.
  4745. autoulPanelBits = PQ_RegisterRead(REGISTER_ADDRESS_LVDS_MAPPING); // 0xC1B4[13:12] : lvds bit-per-pixel type
  4746. autoulPanelBits = ((autoulPanelBits >> 12) & 0x3);
  4747. if( autoulPanelBits == 0 ) // 18bpp -> 6bit
  4748. {
  4749. PQ_RegisterWrite(VIP_reg_dpy_dither, PQ_Panel_6_BITS);
  4750. }
  4751. else if( autoulPanelBits == 1 ) // 24bpp -> 8bit
  4752. {
  4753. PQ_RegisterWrite(VIP_reg_dpy_dither, PQ_Panel_8_BITS);
  4754. }
  4755. else if( autoulPanelBits == 2 ) // 30bpp -> 10bit
  4756. {
  4757. PQ_RegisterWrite(VIP_reg_dpy_dither, PQ_Panel_10_BITS);
  4758. }
  4759. else if( autoulPanelBits == 3 ) // 36bpp -> 12bit
  4760. {
  4761. PQ_RegisterWrite(VIP_reg_dpy_dither, PQ_Panel_12_BITS);
  4762. }
  4763. }
  4764. }
  4765. }
  4766. /**
  4767. * @brief Set Dither algorithm
  4768. *
  4769. * This function set the Dither algoritm
  4770. * 2D : regular algoritm (the dither effect of each pixel in each frame will be the same)
  4771. * 3D : involve time difference (the dither effect of each pixel in each frame will be different)
  4772. *
  4773. * @param ucAlgo means type of dither algorithm, can be 0 for 2D, 1 for 3D
  4774. * @note : method 1 control c000[4], method 2 control C344
  4775. * @return n/a
  4776. */
  4777. void PQ_DitheringAlgo(UINT8 ucAlgo)
  4778. {
  4779. UINT8 ucDitherSel;
  4780. ucDitherSel = PQ_RegisterRead(VIP_reg_dpy_dither_sel);
  4781. if(ucDitherSel) // dither ethod 2
  4782. {
  4783. PQ_RegisterWrite(VIP_reg_dpy_tmp_dither_v2, ucAlgo);
  4784. }
  4785. else //method 1
  4786. {
  4787. PQ_RegisterWrite(VIP_reg_dpy_tmp_dither, ucAlgo);
  4788. }
  4789. }
  4790. //****************************************************************************
  4791. //
  4792. // Function : PQ_AccessColorMatrix
  4793. // Params : pulData = point of data, AcessMode=Read 0 Write 1, dwDataSize=size of pData
  4794. // Description: Access ColorMatrix for PQ Tool I/O (include brightness, contrast, ColorTemp, Saturation, Hue)
  4795. // Returns : 0=fail ,1=success
  4796. //****************************************************************************
  4797. BOOL PQ_AccessColorMatrix(UINT32 *pulData, INT32 AccessMode, UINT32 dwDataSize)
  4798. {
  4799. INT32 i;
  4800. PQHW_CONTEXT* pHwContext= &PQHwContext;
  4801. ST_PQ_CMDSET_CLR_MATRIX_EX* pclrMatrix = (ST_PQ_CMDSET_CLR_MATRIX_EX*)pulData;
  4802. BOOL isEx = sizeof(ST_PQ_CMDSET_CLR_MATRIX_EX) == dwDataSize;
  4803. if (AccessMode) //write to TV
  4804. {
  4805. memcpy(pHwContext->CurColorMatrix, &pclrMatrix->curMatrix, sizeof(CSC_SETTING));
  4806. pHwContext->iColorMatrixC1 = pclrMatrix->iMatrixC[0];
  4807. pHwContext->iColorMatrixC2 = pclrMatrix->iMatrixC[1];
  4808. pHwContext->iColorMatrixC3 = pclrMatrix->iMatrixC[2];
  4809. pHwContext->iBrightness = pclrMatrix->iBrightness;
  4810. pHwContext->iContrast = pclrMatrix->iContrast;
  4811. pHwContext->iRGain = pclrMatrix->iCTRGBGain[0];
  4812. pHwContext->iGGain = pclrMatrix->iCTRGBGain[1];
  4813. pHwContext->iBGain = pclrMatrix->iCTRGBGain[2];
  4814. pHwContext->iRBias = pclrMatrix->iCTRGBBias[0];
  4815. pHwContext->iGBias = pclrMatrix->iCTRGBBias[1];
  4816. pHwContext->iBBias = pclrMatrix->iCTRGBBias[2];
  4817. pHwContext->iHue = pclrMatrix->iHue;
  4818. pHwContext->iSaturation = pclrMatrix->iSaturation;
  4819. for (i = 0; i < 9; i++)
  4820. PQ_ColorMatrixSetup(TRUE, i);
  4821. PQ_ColorMatrixComp(TRUE);
  4822. }
  4823. else //read from TV
  4824. {
  4825. memcpy(&pclrMatrix->curMatrix, pHwContext->CurColorMatrix, sizeof(CSC_SETTING));
  4826. pclrMatrix->iMatrixC[0] = pHwContext->iColorMatrixC1;
  4827. pclrMatrix->iMatrixC[1] = pHwContext->iColorMatrixC2;
  4828. pclrMatrix->iMatrixC[2] = pHwContext->iColorMatrixC3;
  4829. pclrMatrix->iBrightness = pHwContext->iBrightness;
  4830. pclrMatrix->iContrast= pHwContext->iContrast;
  4831. pclrMatrix->iCTRGBGain[0] = pHwContext->iRGain;
  4832. pclrMatrix->iCTRGBGain[1] = pHwContext->iGGain;
  4833. pclrMatrix->iCTRGBGain[2] = pHwContext->iBGain;
  4834. pclrMatrix->iCTRGBBias[0] = pHwContext->iRBias;
  4835. pclrMatrix->iCTRGBBias[1] = pHwContext->iGBias;
  4836. pclrMatrix->iCTRGBBias[2] = pHwContext->iBBias;
  4837. pclrMatrix->iHue = pHwContext->iHue;
  4838. pclrMatrix->iSaturation= pHwContext->iSaturation;
  4839. if (isEx)
  4840. {
  4841. pclrMatrix->iOSDGainBit=COLOR_MATRIX_GAIN_OSD_BIT_SYSTEM;
  4842. pclrMatrix->iOSDBiasBit=COLOR_MATRIX_BIAS_OSD_BIT_SYSTEM;
  4843. }
  4844. }
  4845. return TRUE;
  4846. }
  4847. //****************************************************************************
  4848. //
  4849. // Function : VIP_AcessColorLUT
  4850. // Params : *pulAddr, AcessMode=Read0Write1, bNew=if 330C's LUT, LUTBlockIndex=330C's LUT EvenOdd Block index
  4851. // Description: set color LUT to VIP or get color LUT from VIP
  4852. // Returns : 0=fail ,1=success
  4853. //****************************************************************************
  4854. BOOL PQ_AccessColorLUT(UINT32 *pulAddr, INT32 AccessMode, BOOL bNew, INT32 LUTBlockIndex)
  4855. {
  4856. INT32 ColorLUT330C_Block_PointNum[8] = {729, 648, 648, 576, 648, 576, 576, 512}; // 8 block
  4857. INT32 iTableCnt;
  4858. INT32 DataNum = 512; // for 330A
  4859. INT32 DataStartAddr = 0; // for 330A
  4860. if (bNew)
  4861. {
  4862. DataNum = ColorLUT330C_Block_PointNum[LUTBlockIndex]; // for 330C
  4863. DataStartAddr = LUTBlockIndex<<10; // for 330C
  4864. }
  4865. PQ_RegisterWrite(VIP_reg_dpy_rgn_addr,DataStartAddr);
  4866. if (1 == AccessMode)
  4867. {
  4868. for (iTableCnt=0;iTableCnt<DataNum;iTableCnt++){
  4869. PQ_RegisterWrite(VIP_reg_dpy_rgn_data, *pulAddr);
  4870. pulAddr++;
  4871. }
  4872. }
  4873. else
  4874. {
  4875. for (iTableCnt=0;iTableCnt<DataNum;iTableCnt++){
  4876. *pulAddr=PQ_RegisterRead(VIP_reg_dpy_rgn_data);
  4877. pulAddr++;
  4878. }
  4879. }
  4880. return TRUE;
  4881. }
  4882. BOOL PQ_AccessColorLUTV3(UINT32 *pulAddr, INT32 AccessMode, BOOL bNew, INT32 LUTBlockIndex)
  4883. {
  4884. UINT32 ColorLUT531_Block_PointNum[8] = {640, 640, 768, 768, 640, 640, 768, 768}; // 8 block
  4885. INT32 iTableCnt;
  4886. INT32 DataNum ;
  4887. INT32 DataStartAddr = 0; // for 330A
  4888. //if (bNew)
  4889. //{
  4890. DataNum = ColorLUT531_Block_PointNum[LUTBlockIndex]; // for 330C
  4891. DataStartAddr = LUTBlockIndex<<10; // for 330C
  4892. // *(unsigned long*)(0xbe1c0000)=LUTBlockIndex;
  4893. // *(unsigned long*)(0xbe1c0004)=DataStartAddr;
  4894. //}
  4895. PQ_RegisterWrite(VIP_reg_dpy_rgn_addr,DataStartAddr);
  4896. if (1 == AccessMode)
  4897. {
  4898. // unsigned long tt;
  4899. // tt=DataNum;
  4900. // *(volatile unsigned char*)(0xbe1cc6a9)=0;
  4901. // msleep(1000);
  4902. //DataNum=10;
  4903. for (iTableCnt=0;iTableCnt<DataNum;iTableCnt++){
  4904. //PQ_RegisterWrite(VIP_reg_dpy_rgn_addr,iTableCnt);
  4905. *(volatile unsigned long*)(0xbe1cc184)=((*pulAddr));//+0x80);
  4906. pulAddr++;
  4907. }
  4908. //*(unsigned char*)(0xbe1cc6a9)=1;
  4909. //return TRUE;
  4910. // for (iTableCnt=0;iTableCnt<DataNum;iTableCnt++){
  4911. // PQ_RegisterWrite(VIP_reg_dpy_rgn_addr,DataStartAddr+iTableCnt);
  4912. // mytemp=PQ_RegisterRead(VIP_reg_dpy_rgn_data);
  4913. // if(mytemp!=0x80) tt=0xfff;
  4914. // }
  4915. // *(unsigned long*)(0xbe1c0000)=(LUTBlockIndex<<12)+tt;
  4916. // *(unsigned char*)(0xbe1cc6a9)=1;
  4917. }
  4918. else
  4919. {
  4920. for (iTableCnt=0;iTableCnt<DataNum;iTableCnt++){
  4921. *pulAddr=PQ_RegisterRead(VIP_reg_dpy_rgn_data);
  4922. pulAddr++;
  4923. }
  4924. }
  4925. return TRUE;
  4926. }
  4927. //****************************************************************************
  4928. //
  4929. // Function : PQ_SetColorLUTStr
  4930. // Params : *pulAddr
  4931. // Description: set color LUT strength to VIP
  4932. // Returns : 0=fail ,1=success
  4933. //****************************************************************************
  4934. BOOL PQ_SetColorLUTStr(UINT16 *pwAddr)
  4935. {
  4936. INT32 iTableCnt;
  4937. PQ_RegisterWrite(VIP_reg_dpy_rgn_addr,512);
  4938. for (iTableCnt=0;iTableCnt<512;iTableCnt++){
  4939. PQ_RegisterWrite(VIP_reg_dpy_rgn_data, *pwAddr );
  4940. pwAddr++;
  4941. }
  4942. return TRUE;
  4943. }
  4944. //****************************************************************************
  4945. //
  4946. // Function : PQ_GetColorLUTStr
  4947. // Params : *pulAddr
  4948. // Description: get color LUT strength from VIP
  4949. // Returns : 0=fail ,1=success
  4950. //****************************************************************************
  4951. BOOL PQ_GetColorLUTStr(UINT16 *pwAddr)
  4952. {
  4953. INT32 iTableCnt;
  4954. PQ_RegisterWrite(VIP_reg_dpy_rgn_addr,512);
  4955. for (iTableCnt=0;iTableCnt<512;iTableCnt++){
  4956. *pwAddr=PQ_RegisterRead(VIP_reg_dpy_rgn_data);
  4957. pwAddr++;
  4958. }
  4959. return TRUE;
  4960. }
  4961. UINT8 indexi = 0;
  4962. void PQ_GetHistBin(UINT32 *Y_Hist)
  4963. {
  4964. UINT32 ulHistBin ;
  4965. ulHistBin = PQ_RegisterRead(VIP_reg_dpy_hist_bin0+indexi*4) << 1;
  4966. *Y_Hist = ulHistBin;
  4967. }
  4968. void PQ_SetHistBinindex(UINT8 index)
  4969. {
  4970. indexi = index;
  4971. }
  4972. void PQ_GetYavg(UINT32 *Y_AVG)
  4973. {
  4974. UINT32 dwTotalPixel = 0;
  4975. UINT32 ulHistBin[16];
  4976. int i;
  4977. for(i = 0; i <16; i++)
  4978. {
  4979. ulHistBin[i] = PQ_RegisterRead(VIP_reg_dpy_hist_bin0+i*4);
  4980. dwTotalPixel += ulHistBin[i];
  4981. }
  4982. if(dwTotalPixel ==0)
  4983. {
  4984. *Y_AVG = 0;
  4985. }
  4986. else
  4987. {
  4988. *Y_AVG = PQ_RegisterRead(VIP_reg_dpy_y_sum)*256 / dwTotalPixel;
  4989. }
  4990. }
  4991. UINT8 PQ_GetAvgY_Value(void)
  4992. {
  4993. UINT32 dwTotalPixel = 0;
  4994. UINT32 ulHistBin[16];
  4995. int i;
  4996. UINT8 ucavgY = 0;
  4997. for(i = 0; i <16; i++)
  4998. {
  4999. ulHistBin[i] = PQ_RegisterRead(VIP_reg_dpy_hist_bin0+i*4);
  5000. dwTotalPixel += ulHistBin[i];
  5001. }
  5002. if(dwTotalPixel ==0)
  5003. {
  5004. ucavgY = 0;
  5005. }
  5006. else
  5007. {
  5008. ucavgY = PQ_RegisterRead(VIP_reg_dpy_y_sum)*256 / dwTotalPixel;
  5009. }
  5010. return ucavgY;
  5011. }
  5012. //****************************************************************************
  5013. //
  5014. // Function : PQ_ParsePQCmdSet
  5015. // Params : *pulAddr, data format [size][cmd][data(size UINT8)] = [4bytes][4bytes][nbytes]
  5016. // Description: Parse PQ Command Set. This function will be called by PQ tool, please don't remove it // by ren
  5017. // Returns : 0=fail ,1=success
  5018. //****************************************************************************
  5019. BOOL PQ_ParsePQCmdSet(UINT32 *pulAddr)
  5020. {
  5021. // MultiPanelHeader_t *MultiPanelHeader = (void *)(SPI_PANELSET_FLASHADDR);
  5022. UINT32 ColorLUT330C_Block_PointNum[8] = {729, 648, 648, 576, 648, 576, 576, 512}; // 8 block
  5023. UINT32 ColorLUT531_Block_PointNum[8] = {640, 640, 768, 768, 640, 640, 768, 768}; // 8 block
  5024. UINT32 dwTotalSize = pulAddr[0];
  5025. UINT32 dwDataSize = dwTotalSize-8; // 8 = sizeof(Size_DWORD)+sizeof(Cmd_DWORD);
  5026. INT32 Cmd = pulAddr[1]&0xffff;
  5027. INT32 SubCmd = pulAddr[1]>>16;
  5028. UINT32 *pDataSatrt = pulAddr+2;
  5029. switch(Cmd)
  5030. {
  5031. case PQ_CMDSET_GET_RGN_LUT:
  5032. if (0x800 != dwDataSize) return FALSE; // 800 = LUT size(UINT32*8*8*8)
  5033. else
  5034. {
  5035. pulAddr[0] = 0x800; // must fill data size on size colum when get function
  5036. return PQ_AccessColorLUT(pDataSatrt, 0/*Read*/, FALSE, 0);
  5037. }
  5038. break;
  5039. case PQ_CMDSET_SET_RGN_LUT:
  5040. if (0x800 != dwDataSize) return FALSE;
  5041. else
  5042. {
  5043. pulAddr[0] = 0; // must fill 0 when set funtion
  5044. return PQ_AccessColorLUT(pDataSatrt, 1/*Write*/, FALSE, 0);
  5045. }
  5046. break;
  5047. case PQ_CMDSET_GET_RGN_LUT_STR:
  5048. if (0x400 != dwDataSize) return FALSE; // 400 = LUT Str size(UINT16*8*8*8)
  5049. else
  5050. {
  5051. pulAddr[0] = 0x400; // must fill data size on size colum when get function
  5052. return PQ_GetColorLUTStr((UINT16*)pDataSatrt);
  5053. }
  5054. break;
  5055. case PQ_CMDSET_SET_RGN_LUT_STR:
  5056. if (0x400 != dwDataSize) return FALSE;
  5057. else
  5058. {
  5059. pulAddr[0] = 0; // must fill 0 when set funtion
  5060. return PQ_SetColorLUTStr((UINT16*)pDataSatrt);
  5061. }
  5062. break;
  5063. case PQ_CMDSET_GET_RGN_LUT_330C:
  5064. if (SubCmd >= 8) return FALSE; // only 0~7 block
  5065. if ((ColorLUT330C_Block_PointNum[SubCmd]*4) != dwDataSize) return FALSE;
  5066. else
  5067. {
  5068. pulAddr[0] = ColorLUT330C_Block_PointNum[SubCmd]*4; // must fill data size on size colum when get function
  5069. return PQ_AccessColorLUT(pDataSatrt, 0/*Read*/, TRUE, SubCmd);
  5070. }
  5071. break;
  5072. case PQ_CMDSET_SET_RGN_LUT_330C:
  5073. if (SubCmd >= 8) return FALSE; // only 0~7 block
  5074. if ((ColorLUT330C_Block_PointNum[SubCmd]*4) != dwDataSize) return FALSE;
  5075. else
  5076. {
  5077. pulAddr[0] = 0; // must fill 0 when set funtion
  5078. return PQ_AccessColorLUT(pDataSatrt, 1/*Write*/, TRUE, SubCmd);
  5079. }
  5080. break;
  5081. case PQ_CMDSET_GET_RGN_LUT_V3:
  5082. //*(unsigned long*)(0xbe1c0000)=0x135;
  5083. if (SubCmd >= 8) return FALSE; // only 0~7 block
  5084. if ((ColorLUT531_Block_PointNum[SubCmd]*4) != dwDataSize) return FALSE;
  5085. else
  5086. {
  5087. pulAddr[0] = ColorLUT531_Block_PointNum[SubCmd]*4; // must fill data size on size colum when get function
  5088. return PQ_AccessColorLUTV3(pDataSatrt, 0/*Read*/, TRUE, SubCmd);
  5089. }
  5090. break;
  5091. case PQ_CMDSET_SET_RGN_LUT_V3:
  5092. //--------- Set V3 LUT ------------
  5093. if (SubCmd >= 8)
  5094. {
  5095. *(unsigned long*)(0xbe1c0000)=0x136;
  5096. return FALSE; // only 0~7 block
  5097. }
  5098. if ((ColorLUT531_Block_PointNum[SubCmd]*4) != dwDataSize)
  5099. {
  5100. *(unsigned long*)(0xbe1c0000)=dwDataSize;
  5101. *(unsigned long*)(0xbe1c0004)=ColorLUT531_Block_PointNum[SubCmd]*4;
  5102. return FALSE;
  5103. }
  5104. else
  5105. {
  5106. *(unsigned long*)(0xbe1c0000)=0x138;
  5107. pulAddr[0] = 0; // must fill 0 when set funtion
  5108. return PQ_AccessColorLUTV3(pDataSatrt, 1/*Write*/, TRUE, SubCmd);
  5109. }
  5110. break;
  5111. case PQ_CMDSET_GET_COLOR_MATRIX:
  5112. if (sizeof(ST_PQ_CMDSET_CLR_MATRIX) != dwDataSize && sizeof(ST_PQ_CMDSET_CLR_MATRIX_EX) != dwDataSize) return FALSE;
  5113. else
  5114. {
  5115. pulAddr[0] = dwDataSize; // must fill data size on size colum when get function
  5116. return PQ_AccessColorMatrix(pDataSatrt, 0/*Read*/, dwDataSize);
  5117. }
  5118. break;
  5119. case PQ_CMDSET_SET_COLOR_MATRIX:
  5120. if (sizeof(ST_PQ_CMDSET_CLR_MATRIX) != dwDataSize && sizeof(ST_PQ_CMDSET_CLR_MATRIX_EX) != dwDataSize) return FALSE;
  5121. else
  5122. {
  5123. pulAddr[0] = 0; // must fill 0 when set funtion
  5124. return PQ_AccessColorMatrix(pDataSatrt, 1/*Write*/, dwDataSize);
  5125. }
  5126. break;
  5127. //#ifdef VIP_SW_DC
  5128. #if 1
  5129. case PQ_CMDSET_GET_SW_DC_SCENE_DET_SLOPE:
  5130. if (sizeof(ST_SWDC_Slope) != dwDataSize) return FALSE;
  5131. else
  5132. {
  5133. pulAddr[0] = dwDataSize; // must fill data size on size colum when get function
  5134. PQ_GetSWDCSlopeCmd((ST_SWDC_Slope*)pDataSatrt);
  5135. return TRUE;
  5136. }
  5137. break;
  5138. case PQ_CMDSET_SET_SW_DC_SCENE_DET_SLOPE:
  5139. if (sizeof(ST_SWDC_Slope) != dwDataSize) return FALSE;
  5140. else
  5141. {
  5142. pulAddr[0] = 0; // must fill 0 when set funtion
  5143. PQ_SetSWDCSlopeCmd((ST_SWDC_Slope*)pDataSatrt);
  5144. return TRUE;
  5145. }
  5146. break;
  5147. case PQ_CMDSET_GET_SW_DC_SCENE_DET_CHROMA:
  5148. if (sizeof(ST_SWDC_Chroma) != dwDataSize) return FALSE;
  5149. else
  5150. {
  5151. pulAddr[0] = dwDataSize; // must fill data size on size colum when get function
  5152. PQ_GetSWDCChromaCmd((ST_SWDC_Chroma*)pDataSatrt);
  5153. return TRUE;
  5154. }
  5155. break;
  5156. case PQ_CMDSET_SET_SW_DC_SCENE_DET_CHROMA:
  5157. if (sizeof(ST_SWDC_Chroma) != dwDataSize) return FALSE;
  5158. else
  5159. {
  5160. pulAddr[0] = 0; // must fill 0 when set funtion
  5161. PQ_SetSWDCChromaCmd((ST_SWDC_Chroma*)pDataSatrt);
  5162. return TRUE;
  5163. }
  5164. break;
  5165. case PQ_CMDSET_GET_SW_DC_SCENE_DET_PARAM:
  5166. if (sizeof(ST_SWDC_Param) != dwDataSize) return FALSE;
  5167. else
  5168. {
  5169. pulAddr[0] = dwDataSize; // must fill data size on size colum when get function
  5170. PQ_GetSWDCParamCmd((ST_SWDC_Param*)pDataSatrt);
  5171. return TRUE;
  5172. }
  5173. break;
  5174. case PQ_CMDSET_SET_SW_DC_SCENE_DET_PARAM:
  5175. if (sizeof(ST_SWDC_Param) != dwDataSize) return FALSE;
  5176. else
  5177. {
  5178. pulAddr[0] = 0; // must fill data size on size colum when get function
  5179. PQ_SetSWDCParamCmd((ST_SWDC_Param*)pDataSatrt);
  5180. return TRUE;
  5181. }
  5182. break;
  5183. case PQ_CMDSET_GET_SW_DC_SCENE_DET_INFO:
  5184. if (sizeof(ST_SWDC_Info) != dwDataSize) return FALSE;
  5185. else
  5186. {
  5187. pulAddr[0] = dwDataSize; // must fill data size on size colum when get function
  5188. PQ_GetSWDCInfoCmd((ST_SWDC_Info*)pDataSatrt);
  5189. return TRUE;
  5190. }
  5191. break;
  5192. case PQ_CMDSET_SET_SW_DC_SCENE_DET_SOURCE:
  5193. if (sizeof(UINT8) != dwDataSize) return FALSE;
  5194. else
  5195. {
  5196. pulAddr[0] = 0; // must fill data size on size colum when get function
  5197. PQ_SetSWDCSourceCmd((UINT8*)pDataSatrt);
  5198. return TRUE;
  5199. }
  5200. break;
  5201. case PQ_CMDSET_GET_SW_DC_SCENE_DET_SOURCE:
  5202. if (sizeof(UINT8) != dwDataSize) return FALSE;
  5203. else
  5204. {
  5205. pulAddr[0] = dwDataSize; // must fill data size on size colum when get function
  5206. PQ_GetSWDCSourceCmd((UINT8*)pDataSatrt);
  5207. return TRUE;
  5208. }
  5209. break;
  5210. #endif
  5211. case PQ_CMDSET_GET_VIP_FLASH_INFO:
  5212. if (sizeof(VIP_FLASH_INFO) < dwDataSize) return FALSE;
  5213. else
  5214. {
  5215. VIP_FLASH_INFO FlashInfo;
  5216. memset(&FlashInfo, 0, sizeof(VIP_FLASH_INFO));
  5217. if (SubCmd) { //get size
  5218. FlashInfo.PANELSET_SHADOWADDR = SPI_PANELSET_FLASHSIZE;
  5219. FlashInfo.VIPTABLE_SHADOWADDR = SPI_VIPTABLE_FLASHSIZE;
  5220. FlashInfo.GAMMATABLE_SHADOWADDR = SPI_GAMMATABLE_FLASHSIZE;
  5221. #ifdef SPI_LOGO_FLASHSIZE
  5222. FlashInfo.LOGO_SHADOWADDR = SPI_LOGO_FLASHSIZE;
  5223. #endif
  5224. #ifdef SPI_COLORLUTTABLE_SHADOWADDR
  5225. FlashInfo.LUTTABLE_SHADOWADDR = SPI_COLORLUTTABLE_FLASHSIZE;
  5226. #endif
  5227. } else { //get addr
  5228. FlashInfo.PANELSET_SHADOWADDR = SPI_PANELSET_SHADOWADDR;
  5229. FlashInfo.VIPTABLE_SHADOWADDR = SPI_VIPTABLE_SHADOWADDR;
  5230. FlashInfo.GAMMATABLE_SHADOWADDR = SPI_GAMMATABLE_SHADOWADDR;
  5231. #ifdef SPI_LOGO_FLASHADDR
  5232. FlashInfo.LOGO_SHADOWADDR = SPI_LOGO_FLASHADDR;
  5233. #endif
  5234. #ifdef SPI_COLORLUTTABLE_SHADOWADDR
  5235. FlashInfo.LUTTABLE_SHADOWADDR = SPI_COLORLUTTABLE_SHADOWADDR;
  5236. #endif
  5237. }
  5238. memcpy(pDataSatrt, &FlashInfo, dwDataSize);
  5239. pulAddr[0] = dwDataSize;
  5240. return TRUE;
  5241. }
  5242. case PQ_CMDSET_GET_DRV_CURRENT_SOURCE:
  5243. if (sizeof(UINT8) != dwDataSize) return FALSE;
  5244. else
  5245. {
  5246. pulAddr[0] = dwDataSize; // must fill data size on size colum when get function
  5247. PQ_GetDrvCurrentSourceCmd((UINT8*)pDataSatrt);
  5248. return TRUE;
  5249. }
  5250. break;
  5251. case PQ_CMDSET_SET_NR_ADJUST_STATUS:
  5252. if (sizeof(UINT8) != dwDataSize)
  5253. {
  5254. return FALSE;
  5255. }
  5256. else
  5257. {
  5258. VIP_SetStopNRAdjustFlag((BOOL*)pDataSatrt);
  5259. return TRUE;
  5260. }
  5261. break;
  5262. default:
  5263. return FALSE;
  5264. }
  5265. return FALSE;
  5266. }
  5267. void PQ_PeakingFilterSetup(void)
  5268. {
  5269. PQHW_CONTEXT* pHwContext= &PQHwContext;
  5270. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  5271. PEAKING_SETTING *pPeaking;
  5272. UINT8 ucTableIndex;
  5273. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  5274. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  5275. if (pVtab->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex] >= 8) return;
  5276. ucTableIndex = pVtab->mPeaking.mGroupedIndex[ucCurrSrcIndex];
  5277. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h1, 0x778);
  5278. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h2, 0x3a);
  5279. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h3, 0xb);
  5280. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h4, 0x7fb);
  5281. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h1, 0x778);
  5282. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h2, 0x3a);
  5283. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h3, 0xb);
  5284. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h4, 0x7fb);
  5285. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h1, 0x778);
  5286. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h2, 0x3a);
  5287. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h3, 0xb);
  5288. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h4, 0x7fb);
  5289. // PQ_RegisterWrite(VIP_reg_dpy_filter_hl_smooth, 64); //menu adjust
  5290. // PQ_RegisterWrite(VIP_reg_dpy_filter_hl_sharp, 64); //menu adjust
  5291. // PQ_RegisterWrite(VIP_reg_dpy_filter_hc_smooth, 64); //menu adjust
  5292. // PQ_RegisterWrite(VIP_reg_dpy_filter_hc_sharp, 64); //menu adjust
  5293. //for sharpness
  5294. //if( pHwContext->ulInputHSize>=1900 ) //1920x1080 i/p==>1900/1920*2048=0x7EA
  5295. if((((DRV_SLR_GetFactor_HFactor())*(DRV_SLR_GetFactor_HFactor_6HV())*100)/(2048*2048))>90)
  5296. pPeaking= &pVtab->mPeaking.mPeaking_Data[ucTableIndex].Peaking[2];
  5297. else if(VIP_GetInputVSize() >= 1000) //1080
  5298. pPeaking= &pVtab->mPeaking.mPeaking_Data[ucTableIndex].Peaking[2];
  5299. else if(VIP_GetInputVSize() >= 700) //720
  5300. pPeaking= &pVtab->mPeaking.mPeaking_Data[ucTableIndex].Peaking[1];
  5301. else
  5302. pPeaking= &pVtab->mPeaking.mPeaking_Data[ucTableIndex].Peaking[0];
  5303. PQDebugPrint("%s: filter=%d %d %d %d",__FUNCTION__, pPeaking->filter_y_h1, pPeaking->filter_y_h2, pPeaking->filter_y_h3, pPeaking->filter_y_h4);
  5304. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h1, pPeaking->filter_y_h1);
  5305. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h2, pPeaking->filter_y_h2);
  5306. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h3, pPeaking->filter_y_h3);
  5307. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h4, pPeaking->filter_y_h4);
  5308. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h1, pPeaking->filter_y_h1);
  5309. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h2, pPeaking->filter_y_h2);
  5310. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h3, pPeaking->filter_y_h3);
  5311. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h4, pPeaking->filter_y_h4);
  5312. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h1, pPeaking->filter_y_h1);
  5313. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h2, pPeaking->filter_y_h2);
  5314. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h3, pPeaking->filter_y_h3);
  5315. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h4, pPeaking->filter_y_h4);
  5316. }
  5317. //================================================================================
  5318. // function name : PQ_FilterSetup
  5319. // input parameter : ucSource,ucSubSource,cInterlaceMode
  5320. // output parameter : none
  5321. // purpose : setup mesh filter and icp filter
  5322. // return : none
  5323. void PQ_FilterSetup(UINT8 ucSource, UINT8 ucSubSource)
  5324. {
  5325. typedef struct _REG
  5326. {
  5327. UINT32 hds, hde, vds, vde;
  5328. }REG;
  5329. PQHW_CONTEXT* pHwContext= &PQHwContext;
  5330. UINT8 ucDisableICP,i;
  5331. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  5332. REG LowMbwReg[3];
  5333. UINT32 tmp;
  5334. //ucDisableICP= (pHwContext->cInterlaceMode==FALSE && ucSource!=SOURCE_MPEG) ||
  5335. // (ucSource==SOURCE_PATTERN) ||
  5336. // (ucSource==SOURCE_JPEG) ||
  5337. // (ucSource==SOURCE_EXTS && ucSubSource==RGB);
  5338. //CJ changed rule at 2009/06/24
  5339. //ICP function For p338, p358 :
  5340. //1. ATV :
  5341. //UINT8 0xbe1cd0b0 0x1 ------------- enable
  5342. //UINT16 0xbe1cd0b4 0x100 ------------- alpha
  5343. //2. PC, ADI Pattern :
  5344. //UINT8 0xbe1cd0b0 0x0
  5345. //3. Others: (interlace and progressive)
  5346. //UINT8 0xbe1cd0b0 0x1
  5347. //UINT16 0xbe1cd0b4 0x200
  5348. //
  5349. ucDisableICP= (ucSource==SOURCE_PATTERN) ||
  5350. (ucSource==SOURCE_JPEG) ||
  5351. (ucSource==SOURCE_EXTS && ucSubSource==RGB); //990924 hdhi-rgb needs mesh filter to remove for PQ request
  5352. //|| (pHwContext->cInputDataFormat==RGB); //pc, dvi or hdmi-rgb
  5353. //dpy peaking filter is required to reference to scalling factor
  5354. PQ_PeakingFilterSetup();
  5355. PQ_DeinterlaceFilter();
  5356. if( ucDisableICP )
  5357. {
  5358. PQ_RegisterWrite(VIP_reg_slr_mesh_filter_en, 0);
  5359. PQ_RegisterWrite(VIP_reg_slr_icp_fix_en, 0);
  5360. }
  5361. else
  5362. {
  5363. if(ucSource==SOURCE_HDMI||ucSource==SOURCE_MPEG)
  5364. {
  5365. PQ_RegisterWrite(VIP_reg_slr_mesh_filter_en, 3);
  5366. }
  5367. else if(ucSource==SOURCE_CVD2 || (VIP_GetUserSource() == EXTS && (VIP_GetInputVSize() < 500)))
  5368. {
  5369. //fix roof scene not clear in av & atv
  5370. PQ_RegisterWrite(VIP_reg_slr_mesh_filter_en, 2);
  5371. }
  5372. else
  5373. {
  5374. PQ_RegisterWrite(VIP_reg_slr_mesh_filter_en, 1);
  5375. }
  5376. PQ_RegisterWrite(VIP_reg_slr_icp_fix_en, 1);
  5377. PQ_RegisterWrite(VIP_reg_slr_mesh_filter_expand, 4);
  5378. PQ_RegisterWrite(VIP_reg_slr_mesh_filter_ver_expand, 1);
  5379. PQ_RegisterWrite(VIP_reg_slr_comb_th_1_nom, 0);
  5380. PQ_RegisterWrite(VIP_reg_slr_comb_slope_1_nom, 1023);
  5381. PQ_RegisterWrite(VIP_reg_slr_comb_min_nom, 4);
  5382. PQ_RegisterWrite(VIP_reg_slr_comb_th_2_nom, 48);
  5383. PQ_RegisterWrite(VIP_reg_slr_comb_slope_2_nom, 28);
  5384. if(ucSource == CVD2)
  5385. PQ_RegisterWrite(VIP_reg_slr_comb_th_nom, 0x2);//0xa);//20111228 request from Bonnie
  5386. else if( ucSource == EXTS && !VIP_IsPCSource())
  5387. PQ_RegisterWrite(VIP_reg_slr_comb_th_nom,0x3); //4);//20111228 request from Bonnie
  5388. else
  5389. PQ_RegisterWrite(VIP_reg_slr_comb_th_nom, 3);
  5390. PQ_RegisterWrite(VIP_reg_slr_comb_th_1_mesh, 0);
  5391. PQ_RegisterWrite(VIP_reg_slr_comb_slope_1_mesh, 1023);
  5392. PQ_RegisterWrite(VIP_reg_slr_comb_min_mesh, 0);
  5393. PQ_RegisterWrite(VIP_reg_slr_comb_th_2_mesh, 48);
  5394. PQ_RegisterWrite(VIP_reg_slr_comb_slope_2_mesh, 28);
  5395. PQ_RegisterWrite(VIP_reg_slr_comb_th_mesh, 3);
  5396. PQ_RegisterWrite(VIP_reg_slr_icp_fix_expand, 4);
  5397. PQ_RegisterWrite(VIP_reg_slr_icp_alpha, 0x200); //ATV LOGO ICP
  5398. if(VIP_GetUserSource() == CVD2 || (VIP_GetUserSource() == EXTS && (!VIP_IsPCSource())))
  5399. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th, 9); //111114:show modify
  5400. else
  5401. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th, 0);
  5402. if(VIP_GetUserSource()==SOURCE_HDMI)
  5403. {
  5404. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_h, 256);
  5405. }
  5406. else if(VIP_IsATVSource()==1)
  5407. {
  5408. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_h, 10);
  5409. }
  5410. else
  5411. {
  5412. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_h, ((VIP_GetUserSource() == CVD2) && !VIP_IsATVSource())?10:310);
  5413. }
  5414. if ( ( ucSource == HDMI && !VIP_RunDVIMode()) || ucSource == MPEG )//|| ( ucSource == EXTS && !pHwContext->bPCSource) )
  5415. {
  5416. if (abs(VIP_GetInputVSize() - 480) < 15 || abs(VIP_GetInputVSize() - 576) < 15 )
  5417. {
  5418. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_h, 0xa);
  5419. }
  5420. }
  5421. else if( ucSource == EXTS && !VIP_IsPCSource())
  5422. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_h, 0xa);
  5423. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_v, 48);
  5424. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_hv, 48);
  5425. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_factor, 8);
  5426. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_factor_h, 48);
  5427. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_factor_v, 8);
  5428. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_factor_hv, 8);
  5429. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_factor_h_inc, 8);
  5430. if ( VIP_GetUserSource() == SOURCE_EXTS && !VIP_IsPCSource() && VIP_GetInputVSize() > 700 )
  5431. {
  5432. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_option, 0x0); //40861
  5433. }
  5434. }
  5435. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th, 9);
  5436. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_h, 0xf);
  5437. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_v, 0x5a);
  5438. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_hv, 0x5a);
  5439. PQ_RegisterWrite(VIP_reg_slr_icp_th, 2);
  5440. PQ_SLR_ColorBarDetailSet();
  5441. PQ_DSSetting();
  5442. PQ_Sharpness(TRUE, pMenuValue->iSharpness); // 20110929 shanlene
  5443. //low angle disable and BMBW disable for 9561
  5444. PQ_RegisterWrite(VIP_reg_slr_low_dis_rgn1_en,0);
  5445. PQ_RegisterWrite(VIP_reg_slr_low_dis_rgn2_en,0);
  5446. PQ_RegisterWrite(VIP_reg_slr_low_dis_rgn3_en,0);
  5447. PQ_RegisterWrite(VIP_reg_slr_mbw_dis_rgn1_en, 0);
  5448. PQ_RegisterWrite(VIP_reg_slr_mbw_dis_rgn2_en, 0);
  5449. PQ_RegisterWrite(VIP_reg_slr_mbw_dis_rgn3_en, 0);
  5450. LowMbwReg[0].hds = 0xf;
  5451. LowMbwReg[0].hde = 0x55;
  5452. LowMbwReg[0].vds = 0xa;
  5453. LowMbwReg[0].vde = 0x1a4;
  5454. LowMbwReg[1].hds = 0x5;
  5455. LowMbwReg[1].hde = VIP_GetScalerPreScaleH();
  5456. LowMbwReg[1].vds = 0x19a;
  5457. LowMbwReg[1].vde = 0x1bd;
  5458. LowMbwReg[2].hds = 0x5;
  5459. LowMbwReg[2].hde = VIP_GetScalerPreScaleH();
  5460. LowMbwReg[2].vds = 0x2;
  5461. LowMbwReg[2].vde = 0x3c;
  5462. if(ucSource == CVD2 && VIP_IsATVSource() )
  5463. {
  5464. VTAB_CMN_VALUE_DEFINE* pVtabCmnValue= &pHwContext->VtabCmnValue;
  5465. UINT32 selectRigester = pVtabCmnValue->SlrLowAngleOrMBWDisable;
  5466. PQ_RegisterWrite(VIP_reg_slr_low_dis_rgn1_en,1);
  5467. PQ_RegisterWrite(VIP_reg_slr_low_dis_rgn2_en,1);
  5468. PQ_RegisterWrite(VIP_reg_slr_low_dis_rgn3_en,1);
  5469. PQ_RegisterWrite(VIP_reg_slr_mbw_dis_rgn1_en, 0);
  5470. PQ_RegisterWrite(VIP_reg_slr_mbw_dis_rgn2_en, 0);
  5471. PQ_RegisterWrite(VIP_reg_slr_mbw_dis_rgn3_en, 0);
  5472. if(!PQ_NtscPalDetect()){
  5473. //PAL
  5474. LowMbwReg[0].vde = 0x230;
  5475. LowMbwReg[1].hds = 0x2;
  5476. LowMbwReg[1].vde = 0x2bc;
  5477. LowMbwReg[1].vds = 0x1f4;
  5478. LowMbwReg[1].vde = 0x230;
  5479. LowMbwReg[2].hds = 0x2;
  5480. /*
  5481. PQ_RegisterWrite(VIP_reg_slr_low_dis1_vde, 0x230);
  5482. PQ_RegisterWrite(VIP_reg_slr_low_dis2_hds, 0x02);
  5483. PQ_RegisterWrite(VIP_reg_slr_low_dis2_hde, 0x2BC);
  5484. PQ_RegisterWrite(VIP_reg_slr_low_dis2_vds, 0x1F4);
  5485. PQ_RegisterWrite(VIP_reg_slr_low_dis2_vde, 0x230);
  5486. PQ_RegisterWrite(VIP_reg_slr_low_dis3_hds, 0x02);
  5487. PQ_RegisterWrite(VIP_reg_slr_mbw_dis1_vde, 0x230);
  5488. PQ_RegisterWrite(VIP_reg_slr_mbw_dis2_hds, 0x02);
  5489. PQ_RegisterWrite(VIP_reg_slr_mbw_dis2_hde, 0x2BC);
  5490. PQ_RegisterWrite(VIP_reg_slr_mbw_dis2_vds, 0x1F4);
  5491. PQ_RegisterWrite(VIP_reg_slr_mbw_dis2_vde, 0x230);
  5492. PQ_RegisterWrite(VIP_reg_slr_mbw_dis3_hds, 0x02);
  5493. */
  5494. }
  5495. PQ_RegisterWrite(VIP_reg_slr_low_dis_rgn1_en, (0x1 == (selectRigester&0x1)) ? 1 : 0);
  5496. PQ_RegisterWrite(VIP_reg_slr_low_dis_rgn2_en, (0x2 == (selectRigester&0x2)) ? 1 : 0);
  5497. PQ_RegisterWrite(VIP_reg_slr_low_dis_rgn3_en, (0x4 == (selectRigester&0x4)) ? 1 : 0);
  5498. PQ_RegisterWrite(VIP_reg_slr_mbw_dis_rgn1_en, (0x8 == (selectRigester&0x8))? 1 : 0);
  5499. PQ_RegisterWrite(VIP_reg_slr_mbw_dis_rgn2_en, (0x10 == (selectRigester&0x10)) ? 1 : 0);
  5500. PQ_RegisterWrite(VIP_reg_slr_mbw_dis_rgn3_en, (0x20 == (selectRigester&0x20)) ? 1 : 0);
  5501. #if VIP_FLIP_FUN
  5502. if(VIP_GetPanelInvert())
  5503. {
  5504. for(i=0;i<3;i++)
  5505. {
  5506. tmp = LowMbwReg[i].hds;
  5507. LowMbwReg[i].hds = VIP_GetScalerPreScaleH()- LowMbwReg[i].hde;
  5508. LowMbwReg[i].hde = VIP_GetScalerPreScaleH()- tmp;
  5509. tmp = LowMbwReg[i].vds;
  5510. LowMbwReg[i].vds = VIP_GetScalerPreScaleV()- LowMbwReg[i].vde;
  5511. LowMbwReg[i].vde = VIP_GetScalerPreScaleV()- tmp;
  5512. }
  5513. }
  5514. #endif
  5515. for(i = 0;i <3 ; i++)
  5516. {
  5517. PQ_RegisterWrite(VIP_reg_slr_low_dis1_hds + i*16, LowMbwReg[i].hds);
  5518. PQ_RegisterWrite(VIP_reg_slr_low_dis1_hde + i*16, LowMbwReg[i].hde);
  5519. PQ_RegisterWrite(VIP_reg_slr_low_dis1_vds + i*16, LowMbwReg[i].vds);
  5520. PQ_RegisterWrite(VIP_reg_slr_low_dis1_vde + i*16, LowMbwReg[i].vde);
  5521. PQ_RegisterWrite(VIP_reg_slr_mbw_dis1_hds + i*16, LowMbwReg[i].hds);
  5522. PQ_RegisterWrite(VIP_reg_slr_mbw_dis1_hde + i*16, LowMbwReg[i].hde);
  5523. PQ_RegisterWrite(VIP_reg_slr_mbw_dis1_vds + i*16, LowMbwReg[i].vds);
  5524. PQ_RegisterWrite(VIP_reg_slr_mbw_dis1_vde + i*16, LowMbwReg[i].vde);
  5525. }
  5526. PQ_RegisterWrite(VIP_reg_vdi_mad_fc_mbw_lth, 0x100);//fix roof scene not clarity in av
  5527. }
  5528. else
  5529. {
  5530. PQ_RegisterWrite(VIP_reg_vdi_mad_fc_mbw_lth, 0x10);//fix roof scene not clarity
  5531. }
  5532. if(abs(VIP_GetInputVSize())<10 && VIP_GetInterlaceMode()) //sharlene //PQ2009 ¤å¦r²¾°Ê´¡½u
  5533. {
  5534. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_limit, 0x8);
  5535. }
  5536. else
  5537. {
  5538. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_limit, 0x4);
  5539. }
  5540. #if 1 //130903 sony_PQ_PAL P#73 move mesh for atv
  5541. PQ_RegisterWrite(VIP_reg_slr_mix_edge_ach, 2);
  5542. PQ_RegisterWrite(VIP_reg_slr_mix_acv, 4);
  5543. PQ_RegisterWrite(VIP_reg_slr_mix_edge_bch, 2);
  5544. PQ_RegisterWrite(VIP_reg_slr_mbw_expand_sel, 1);
  5545. #else
  5546. PQ_RegisterWrite(VIP_reg_slr_mix_edge_ach, VIP_IsATVSource()?3:2);
  5547. PQ_RegisterWrite(VIP_reg_slr_mix_acv, VIP_IsATVSource()?1:4);
  5548. PQ_RegisterWrite(VIP_reg_slr_mix_edge_bch, VIP_IsATVSource()?3:2);
  5549. PQ_RegisterWrite(VIP_reg_slr_mbw_expand_sel, VIP_IsATVSource()?3:1);
  5550. #endif
  5551. PQ_LowAngleSetting();
  5552. }
  5553. void PQ_LowAngleSetting(void)
  5554. {
  5555. PQ_RegisterWrite(VIP_reg_slr_mix_sad0_factor ,32);
  5556. PQ_RegisterWrite(VIP_reg_slr_mix_sad1_factor ,64);
  5557. PQ_RegisterWrite(VIP_reg_slr_mix_ext_angle_en ,1);
  5558. PQ_RegisterWrite(VIP_reg_slr_mix_max_diff_value ,0);
  5559. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_en ,0);
  5560. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_th ,2);
  5561. PQ_RegisterWrite(VIP_reg_slr_mix_angle90_aug_th ,1);
  5562. PQ_RegisterWrite(VIP_reg_slr_mix_angle90_aug_limit ,36);
  5563. PQ_RegisterWrite(VIP_reg_slr_mix_hedge_th ,40);
  5564. PQ_RegisterWrite(VIP_reg_slr_mix_no_favor_angle90_en ,1);
  5565. PQ_RegisterWrite(VIP_reg_slr_mix_sad_diff_th1 ,0);
  5566. PQ_RegisterWrite(VIP_reg_slr_mix_sad_diff_th2 ,16);
  5567. PQ_RegisterWrite(VIP_reg_slr_mix_dir90_diff_th ,10);
  5568. PQ_RegisterWrite(VIP_reg_slr_mix_vedge_th ,20);
  5569. PQ_RegisterWrite(VIP_reg_slr_mix_vedge_num_th ,8);
  5570. PQ_RegisterWrite(VIP_reg_slr_mix_vedge_angle_th ,21);
  5571. PQ_RegisterWrite(VIP_reg_slr_mix_detail_hedge_en ,1);
  5572. PQ_RegisterWrite(VIP_reg_slr_mix_detail_hedge_clipth ,64);
  5573. PQ_RegisterWrite(VIP_reg_slr_mix_high_angle_th ,5);
  5574. PQ_RegisterWrite(VIP_reg_slr_mix_low_angle_th ,21);
  5575. PQ_RegisterWrite(VIP_reg_slr_mix_dir_conflict_en ,1);
  5576. PQ_RegisterWrite(VIP_reg_slr_mix_conflict_mth ,1);
  5577. PQ_RegisterWrite(VIP_reg_slr_mix_good_dir_th1 ,80);
  5578. PQ_RegisterWrite(VIP_reg_slr_mix_good_dir_th2 ,50);
  5579. PQ_RegisterWrite(VIP_reg_slr_mix_check_angle_th ,8);
  5580. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_check_en ,0);
  5581. PQ_RegisterWrite(VIP_reg_slr_mix_forward_com_en ,1);
  5582. PQ_RegisterWrite(VIP_reg_slr_mix_forward_com_stage ,2);
  5583. PQ_RegisterWrite(VIP_reg_slr_mix_fc_lost_angle_th1 ,100);
  5584. PQ_RegisterWrite(VIP_reg_slr_mix_fc_lost_angle_th2 ,20);
  5585. PQ_RegisterWrite(VIP_reg_slr_mix_fc_lost_angle_th3 ,48);
  5586. PQ_RegisterWrite(VIP_reg_slr_mix_fc_hedge_th ,48);
  5587. PQ_RegisterWrite(VIP_reg_slr_mix_backward_com_en ,1);
  5588. PQ_RegisterWrite(VIP_reg_slr_mix_backward_com_stage ,2);
  5589. PQ_RegisterWrite(VIP_reg_slr_mix_bc_lost_angle_th1 ,120);
  5590. PQ_RegisterWrite(VIP_reg_slr_mix_bc_lost_angle_th2 ,50);
  5591. PQ_RegisterWrite(VIP_reg_slr_mix_bc_lost_angle_th3 ,36);
  5592. PQ_RegisterWrite(VIP_reg_slr_mix_bc_hedge_th ,48);
  5593. PQ_RegisterWrite(VIP_reg_slr_mix_median_filter_mth ,1);
  5594. PQ_RegisterWrite(VIP_reg_slr_mix_col_size ,720);
  5595. PQ_RegisterWrite(VIP_reg_slr_mix_dir_diff_th ,36);
  5596. PQ_RegisterWrite(VIP_reg_slr_mix_big_dir_diff_th ,80);
  5597. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_01 ,7);
  5598. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_02 ,8);
  5599. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_03 ,9);
  5600. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_04 ,10);
  5601. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_05 ,11);
  5602. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_06 ,12);
  5603. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_07 ,13);
  5604. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_08 ,14);
  5605. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_09 ,15);
  5606. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_10 ,16);
  5607. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_11 ,16);
  5608. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_12 ,16);
  5609. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_13 ,16);
  5610. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_14 ,16);
  5611. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_15 ,16);
  5612. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_16 ,16);
  5613. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_17 ,16);
  5614. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_18 ,16);
  5615. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_19 ,16);
  5616. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_20 ,16);
  5617. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_21 ,16);
  5618. PQ_RegisterWrite(VIP_reg_slr_mix_store_post_en ,0);
  5619. PQ_RegisterWrite(VIP_reg_slr_mix_nan_en ,1);
  5620. PQ_RegisterWrite(VIP_reg_slr_mix_ana_en ,1);
  5621. PQ_RegisterWrite(VIP_reg_slr_mix_hlh_en ,1);
  5622. PQ_RegisterWrite(VIP_reg_slr_mix_eup ,16);
  5623. PQ_RegisterWrite(VIP_reg_slr_mix_edn ,16);
  5624. PQ_RegisterWrite(VIP_reg_slr_mix_center_com_en ,1);
  5625. PQ_RegisterWrite(VIP_reg_slr_mix_center_com_stage ,2);
  5626. PQ_RegisterWrite(VIP_reg_slr_mix_cnf_win5 ,1);
  5627. PQ_RegisterWrite(VIP_reg_slr_mix_detail_hedge_win ,6);
  5628. PQ_RegisterWrite(VIP_reg_slr_mix_fix_ccom_a90_en ,1);
  5629. PQ_RegisterWrite(VIP_reg_slr_mix_fix_ccom_a90_th ,32);
  5630. PQ_RegisterWrite(VIP_reg_slr_mix_angle_sel_sub ,1048575);
  5631. //for atv ÄÁÂ\¿÷¾¦issue low angle adjust to 0xff from hw suggest
  5632. if(VIP_IsATVSource())
  5633. PQ_RegisterWrite(VIP_reg_slr_mix_angle_sel_main ,0xff);
  5634. else
  5635. PQ_RegisterWrite(VIP_reg_slr_mix_angle_sel_main ,1048575);
  5636. PQ_RegisterWrite(VIP_reg_slr_mix_lr_dec_en ,1);
  5637. PQ_RegisterWrite(VIP_reg_slr_mix_chk_confidence_en ,1);
  5638. PQ_RegisterWrite(VIP_reg_slr_mix_last_2n1a_en ,1);
  5639. PQ_RegisterWrite(VIP_reg_slr_mix_last_5n3a_en ,1);
  5640. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_00 ,0);
  5641. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_01 ,0);
  5642. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_02 ,0);
  5643. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_03 ,0);
  5644. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_04 ,0);
  5645. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_05 ,0);
  5646. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_06 ,0);
  5647. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_07 ,0);
  5648. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_08 ,0);
  5649. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_09 ,0);
  5650. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_10 ,0);
  5651. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_11 ,0);
  5652. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_12 ,0);
  5653. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_13 ,0);
  5654. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_14 ,0);
  5655. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_15 ,0);
  5656. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_16 ,0);
  5657. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_17 ,0);
  5658. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_18 ,0);
  5659. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_19 ,0);
  5660. PQ_RegisterWrite(VIP_reg_slr_mix_angle_distance_20 ,0);
  5661. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_en ,0);
  5662. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_th2 ,10);
  5663. PQ_RegisterWrite(VIP_reg_slr_mix_invalid_la_th1 ,1);
  5664. PQ_RegisterWrite(VIP_reg_slr_mix_invalid_la_th2 ,5);
  5665. PQ_RegisterWrite(VIP_reg_slr_mix_chroma_diff_th1 ,24);
  5666. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_01_th1 ,2);
  5667. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_02_th1 ,2);
  5668. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_03_th1 ,2);
  5669. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_04_th1 ,2);
  5670. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_05_th1 ,2);
  5671. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_06_th1 ,2);
  5672. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_07_th1 ,2);
  5673. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_08_th1 ,2);
  5674. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_09_th1 ,3);
  5675. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_10_th1 ,3);
  5676. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_11_th1 ,3);
  5677. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_12_th1 ,3);
  5678. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_13_th1 ,3);
  5679. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_14_th1 ,4);
  5680. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_15_th1 ,4);
  5681. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_16_th1 ,4);
  5682. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_17_th1 ,5);
  5683. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_18_th1 ,5);
  5684. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_19_th1 ,5);
  5685. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_20_th1 ,5);
  5686. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_dis_en ,0);
  5687. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_dis_th1 ,3);
  5688. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_dis_th2 ,96);
  5689. PQ_RegisterWrite(VIP_reg_slr_mix_dir_diff_th2 ,50);
  5690. PQ_RegisterWrite(VIP_reg_slr_mix_big_dir_diff_th2 ,100);
  5691. PQ_RegisterWrite(VIP_reg_slr_mix_dir_diff_bound ,6); //*((BYTE*)(0xbe1cd388)) = 6;
  5692. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_en_hw ,1); //*((BYTE*)(0xbe1cd389)) = 1;
  5693. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_en_th ,50); //*((BYTE*)(0xbe1cd38a)) = 50;
  5694. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_en_th2 ,1); //*((BYTE*)(0xbe1cd38b)) = 1;
  5695. PQ_RegisterWrite(VIP_reg_slr_mix_break_angle_en_win ,5); //*((BYTE*)(0xbe1cd38c)) = 5;
  5696. PQ_RegisterWrite(VIP_reg_slr_mix_sad2_factor ,32); //*((BYTE*)(0xbe1cd38d)) = 32;
  5697. PQ_RegisterWrite(VIP_reg_slr_mix_sad3_factor ,16); //*((BYTE*)(0xbe1cd38e)) = 16;
  5698. PQ_RegisterWrite(VIP_reg_slr_mix_sad4_factor ,16); //*((BYTE*)(0xbe1cd38f)) = 16;
  5699. PQ_RegisterWrite(VIP_reg_slr_mix_sad5_factor ,16); //*((BYTE*)(0xbe1cd390)) = 16;
  5700. PQ_RegisterWrite(VIP_reg_slr_mix_sad6_factor ,16); //*((BYTE*)(0xbe1cd391)) = 16;
  5701. PQ_RegisterWrite(VIP_reg_slr_mix_sad7_factor ,16); //*((BYTE*)(0xbe1cd392)) = 16;
  5702. PQ_RegisterWrite(VIP_reg_slr_mix_sad8_factor ,16); //*((BYTE*)(0xbe1cd393)) = 16;
  5703. PQ_RegisterWrite(VIP_reg_slr_mix_sadx01_factor ,0); //*((BYTE*)(0xbe1cd394)) = 0;
  5704. PQ_RegisterWrite(VIP_reg_slr_mix_sadx02_factor ,0); //*((BYTE*)(0xbe1cd395)) = 0;
  5705. PQ_RegisterWrite(VIP_reg_slr_mix_sadx03_factor ,16); //*((BYTE*)(0xbe1cd396)) = 16;
  5706. PQ_RegisterWrite(VIP_reg_slr_mix_sadx04_factor ,16); //*((BYTE*)(0xbe1cd397)) = 16;
  5707. PQ_RegisterWrite(VIP_reg_slr_mix_sadx05_factor ,12); //*((BYTE*)(0xbe1cd398)) = 12;
  5708. PQ_RegisterWrite(VIP_reg_slr_mix_sadx06_factor ,12); //*((BYTE*)(0xbe1cd399)) = 12;
  5709. PQ_RegisterWrite(VIP_reg_slr_mix_sadx07_factor ,8); //*((BYTE*)(0xbe1cd39a)) = 8;
  5710. PQ_RegisterWrite(VIP_reg_slr_mix_sadx08_factor ,8); //*((BYTE*)(0xbe1cd39b)) = 8;
  5711. PQ_RegisterWrite(VIP_reg_slr_mix_sadx09_factor ,4); //*((BYTE*)(0xbe1cd39c)) = 4;
  5712. PQ_RegisterWrite(VIP_reg_slr_mix_sadx10_factor ,4); //*((BYTE*)(0xbe1cd39d)) = 4;
  5713. PQ_RegisterWrite(VIP_reg_slr_low_angle_dis ,255); //*((BYTE*)(0xbe1cd39e)) = 255;
  5714. PQ_RegisterWrite(VIP_reg_slr_mix_sada01_factor ,16); //*((BYTE*)(0xbe1cd39f)) = 16;
  5715. PQ_RegisterWrite(VIP_reg_slr_mix_sada02_factor ,16); //*((BYTE*)(0xbe1cd3a0)) = 16;
  5716. PQ_RegisterWrite(VIP_reg_slr_mix_sada03_factor ,32); //*((BYTE*)(0xbe1cd3a1)) = 32;
  5717. PQ_RegisterWrite(VIP_reg_slr_mix_sada04_factor ,32); //*((BYTE*)(0xbe1cd3a2)) = 32;
  5718. PQ_RegisterWrite(VIP_reg_slr_mix_sada05_factor ,16); //*((BYTE*)(0xbe1cd3a3)) = 16;
  5719. PQ_RegisterWrite(VIP_reg_slr_mix_sada06_factor ,16); //*((BYTE*)(0xbe1cd3a4)) = 16;
  5720. PQ_RegisterWrite(VIP_reg_slr_mix_sada07_factor ,16); //*((BYTE*)(0xbe1cd3a5)) = 16;
  5721. PQ_RegisterWrite(VIP_reg_slr_mix_sada08_factor ,16); //*((BYTE*)(0xbe1cd3a6)) = 16;
  5722. PQ_RegisterWrite(VIP_reg_slr_mix_sada09_factor ,16); //*((BYTE*)(0xbe1cd3a7)) = 16;
  5723. PQ_RegisterWrite(VIP_reg_slr_mix_sada10_factor ,16); //*((BYTE*)(0xbe1cd3a8)) = 16;
  5724. PQ_RegisterWrite(VIP_reg_slr_mix_sada11_factor ,16); //*((BYTE*)(0xbe1cd3a9)) = 16;
  5725. PQ_RegisterWrite(VIP_reg_slr_mix_sada12_factor ,16); //*((BYTE*)(0xbe1cd3aa)) = 16;
  5726. PQ_RegisterWrite(VIP_reg_slr_mix_sada13_factor ,16); //*((BYTE*)(0xbe1cd3ab)) = 16;
  5727. PQ_RegisterWrite(VIP_reg_slr_mix_sada14_factor ,16); //*((BYTE*)(0xbe1cd3ac)) = 16;
  5728. PQ_RegisterWrite(VIP_reg_slr_mix_sada15_factor ,16); //*((BYTE*)(0xbe1cd3ad)) = 16;
  5729. PQ_RegisterWrite(VIP_reg_slr_mix_sada16_factor ,16); //*((BYTE*)(0xbe1cd3ae)) = 16;
  5730. PQ_RegisterWrite(VIP_reg_slr_mix_sada17_factor ,32); //*((BYTE*)(0xbe1cd3af)) = 32;
  5731. PQ_RegisterWrite(VIP_reg_slr_mix_sada18_factor ,32); //*((BYTE*)(0xbe1cd3b0)) = 32;
  5732. PQ_RegisterWrite(VIP_reg_slr_mix_sada19_factor ,32); //*((BYTE*)(0xbe1cd3b1)) = 32;
  5733. PQ_RegisterWrite(VIP_reg_slr_mix_sada20_factor ,32); //*((BYTE*)(0xbe1cd3b2)) = 32;
  5734. PQ_RegisterWrite(VIP_reg_slr_min_sad_sft ,0); //*((BYTE*)(0xbe1cd3b3)) = 0;
  5735. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_01 ,0); //*((DWORD*)(0xbe1cd3b4)) = 0;
  5736. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_02 ,0); //*((DWORD*)(0xbe1cd3b8)) = 0;
  5737. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_03 ,0); //*((DWORD*)(0xbe1cd3bc)) = 0;
  5738. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_04 ,0); //*((DWORD*)(0xbe1cd3e0)) = 0;
  5739. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_05 ,0); //*((DWORD*)(0xbe1cd3e4)) = 0;
  5740. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_06 ,0); //*((DWORD*)(0xbe1cd3e8)) = 0;
  5741. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_07 ,0); //*((DWORD*)(0xbe1cd3ec)) = 0;
  5742. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_08 ,0); //*((DWORD*)(0xbe1cd3f0)) = 0;
  5743. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_09 ,0); //*((DWORD*)(0xbe1cd3f4)) = 0;
  5744. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_10 ,0xa); //*((DWORD*)(0xbe1cd3f8)) = 0xa;
  5745. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_11 ,0x14); //*((DWORD*)(0xbe1cd3fc)) = 0x14;
  5746. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_12 ,0x28); //*((DWORD*)(0xbe1cd430)) = 0x28;
  5747. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_13 ,0x50); //*((DWORD*)(0xbe1cd434)) = 0x50;
  5748. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_14 ,0xa0); //*((DWORD*)(0xbe1cd438)) = 0xa0;
  5749. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_15 ,0x140); //*((DWORD*)(0xbe1cd43c)) = 0x140;
  5750. PQ_RegisterWrite(VIP_reg_slr_mix_max_sad_add_16 ,0x258); //*((DWORD*)(0xbe1cd450)) = 0x258;
  5751. }
  5752. void PQ_ConditionSetting(UINT8 ucMode)
  5753. {
  5754. if (ucMode == MODE_DeinterlaceFilter)
  5755. {
  5756. ///////////////////////////////////////////////////////////
  5757. // From MAD Setup on 7 Places
  5758. ///////////////////////////////////////////////////////////
  5759. if( (VIP_GetUserSource()==SOURCE_MPEG && VIP_GetInputHSize()<800 && VIP_GetInterlaceMode()) || VIP_IsAVSource() || VIP_IsATVSource() )
  5760. {
  5761. // for eric request to improve the sd quality like mantis 43324
  5762. PQ_RegisterWrite(VIP_reg_vdi_mad_hlp_en, 0);
  5763. // NTSC building horizontal line flicker issue #45589
  5764. if((VIP_IsAVSource() || VIP_IsATVSource()) && (VIP_GetStdColorSystem() <= CVD2_STD_NTSC_443))
  5765. {
  5766. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_xoff1, 5);
  5767. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_xoff2, 13);
  5768. }
  5769. else
  5770. {
  5771. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_xoff1, 0);
  5772. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_xoff2, 8);
  5773. }
  5774. }
  5775. else
  5776. {
  5777. PQ_RegisterWrite(VIP_reg_vdi_mad_hlp_en, 1);
  5778. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_xoff1, 5);
  5779. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_xoff2, 13);
  5780. }
  5781. ///////////////////////////////////////////////////////////
  5782. // From FilterSetup ach on 6 places, bch on 2 places
  5783. ///////////////////////////////////////////////////////////
  5784. }
  5785. }
  5786. void PQ_VDeblockFilterEnable(void)
  5787. {
  5788. if(VIP_IsATVSource())
  5789. PQ_RegisterWrite(VIP_reg_vdi_block_vfil_en, 0);
  5790. else
  5791. PQ_RegisterWrite(VIP_reg_vdi_block_vfil_en, 1);
  5792. }
  5793. BOOL PQ_NtscPalDetect(void)
  5794. {
  5795. BOOL bNtscMode= FALSE;
  5796. UINT8 ucSource,ucNtscPalStatus= 0;
  5797. UINT32 Hin_total,Vin_total;
  5798. UINT32 InputFrameRate= 0;
  5799. ucSource=VIP_GetUserSource();
  5800. switch (ucSource){
  5801. case SOURCE_HDMI:
  5802. ucNtscPalStatus=PQ_RegisterRead(VIP_sta_hdmi_frmrate);
  5803. break;
  5804. case SOURCE_MPEG:
  5805. ucNtscPalStatus=PQ_RegisterRead(VIP_sta_mpga_frmrate);
  5806. break;
  5807. case SOURCE_CVD2:
  5808. ucNtscPalStatus=PQ_RegisterRead(VIP_sta_cvd2_frmrate);
  5809. break;
  5810. case SOURCE_EXTS:
  5811. ucNtscPalStatus=PQ_RegisterRead(VIP_sta_exts_frmrate);
  5812. break;
  5813. }
  5814. //PQDebugPrint("ucNtscPalStatus=%d", ucNtscPalStatus);
  5815. if( ucNtscPalStatus==1 || ucNtscPalStatus==2 ) //50Hz
  5816. {
  5817. bNtscMode= FALSE;
  5818. }
  5819. else if( ucNtscPalStatus==4 || ucNtscPalStatus==5 ) //60Hz
  5820. {
  5821. bNtscMode= TRUE;
  5822. }
  5823. else
  5824. {
  5825. VIP_GetSyncLatchCount(DRV_ADI_GetSourceSelect(), &Hin_total, &Vin_total);
  5826. if( (Hin_total>0) && (Vin_total>0) )
  5827. InputFrameRate=((SYSTEM_CLK)/(Hin_total*Vin_total));
  5828. if((abs(60-InputFrameRate)<5)/*||(InputFrameRate<44)*/)
  5829. bNtscMode=TRUE;
  5830. else
  5831. bNtscMode=FALSE;
  5832. }
  5833. PQDebugPrint("%s bNtscMode=%d", __FUNCTION__,bNtscMode);
  5834. return bNtscMode;
  5835. }
  5836. void PQ_DS_Init(void)
  5837. {
  5838. PQ_RegisterWrite(VIP_reg_slr_ds_full_angle, 0);
  5839. PQ_RegisterWrite(VIP_reg_slr_dscale_cross_shoot_ctrl_taps, 1);
  5840. PQ_RegisterWrite(VIP_reg_slr_dscale_other_shoot_ctrl_taps, 1);
  5841. PQ_RegisterWrite(VIP_reg_slr_dscale_cross_shoot_ctrl_taps_c, 2);
  5842. PQ_RegisterWrite(VIP_reg_slr_dscale_other_shoot_ctrl_taps_c, 2);
  5843. PQ_RegisterWrite(VIP_reg_slr_ds_sharp_gain_ctrl_en, 1);
  5844. PQ_RegisterWrite(VIP_reg_slr_ds_sharp_gain_ctrl_tap, 0);
  5845. PQ_RegisterWrite(VIP_reg_slr_ds_sharp_gain_ctrl_en_c, 1);
  5846. PQ_RegisterWrite(VIP_reg_slr_ds_sharp_gain_ctrl_tap_c, 0);
  5847. PQ_RegisterWrite(VIP_reg_slr_motion_cond, 4);
  5848. PQ_RegisterWrite(VIP_reg_slr_h_salt_fil_en ,0x0);
  5849. }
  5850. void PQ_DSSetting(void)
  5851. {
  5852. //531 Test#################################################################################
  5853. PQ_RegisterWrite(VIP_reg_slr_ds_angle_0_weight,0x10);// 0x0140D250 // 16 , "N"
  5854. PQ_RegisterWrite(VIP_reg_slr_ds_angle_90_weight,0x10);// 0x0140D251 // 16 , "N"
  5855. PQ_RegisterWrite(VIP_reg_slr_ds_angle_67_weight,0x10);// 0x0140D252 // 16 , "N"
  5856. PQ_RegisterWrite(VIP_reg_slr_ds_angle_113_weight,0x10);// 0x0140D253 // 16 , "N"
  5857. PQ_RegisterWrite(VIP_reg_slr_ds_angle_45_weight,0x10);// 0x0140D254 // 16 , "N"
  5858. PQ_RegisterWrite(VIP_reg_slr_ds_angle_135_weight,0x10);// 0x0140D255 // 16 , "N"
  5859. PQ_RegisterWrite(VIP_reg_slr_ds_angle_23_weight,0x10);// 0x0140D256 // 16 , "N"
  5860. PQ_RegisterWrite(VIP_reg_slr_ds_angle_157_weight,0x10);// 0x0140D257 // 16 , "N"
  5861. PQ_RegisterWrite(VIP_reg_slr_ds_angle_16_weight,0x10);// 0x0140D258 // 16 , "N"
  5862. PQ_RegisterWrite(VIP_reg_slr_ds_angle_164_weight,0x10);// 0x0140D259 // 16 , "N"
  5863. PQ_RegisterWrite(VIP_reg_slr_ds_angle_56_weight,0x10);// 0x0140D25A // 16 , "N"
  5864. PQ_RegisterWrite(VIP_reg_slr_ds_angle_124_weight,0x10);// 0x0140D25B // 16 , "N"
  5865. PQ_RegisterWrite(VIP_reg_slr_ds_angle_34_weight,0x10);// 0x0140D25C // 16 , "N"
  5866. PQ_RegisterWrite(VIP_reg_slr_ds_angle_146_weight,0x10);// 0x0140D25D // 16 , "N"
  5867. PQ_RegisterWrite(VIP_reg_slr_ds_angle_74_weight,0x10);// 0x0140D25E // 16 , "N"
  5868. PQ_RegisterWrite(VIP_reg_slr_ds_angle_106_weight,0x10);// 0x0140D25F // 16 , "N"
  5869. PQ_RegisterWrite(VIP_reg_slr_ds_dbg_en,0x0);// 0x0040D260 // 0 , "N"
  5870. PQ_RegisterWrite(VIP_reg_slr_ds_sharp_dbg_en,0x0);// 0x0040D261 // 0 , "N"
  5871. //D262 for Chroma Pattern#1, Sharpness smooth
  5872. PQ_RegisterWrite(VIP_reg_slr_ds_angle_limit_en,0x72);// 0x01C0D262 // 0 , "N"
  5873. PQ_RegisterWrite(VIP_reg_slr_ds_hp_fix_mth,0x3);// 0x0080D264 // 3 , "N"
  5874. PQ_RegisterWrite(VIP_reg_slr_ds_hp_clip_sel,0x1);// 0x0040D265 // 0 , "N"
  5875. PQ_RegisterWrite(VIP_reg_slr_ds_ver_sht, 2);
  5876. PQ_RegisterWrite(VIP_reg_slr_ds_hp_clip_th,0x18);// 0x0240D268 // 24 , "N"
  5877. PQ_RegisterWrite(VIP_reg_slr_ds_hp_hsum_max_th,0x480);// 0x0380D26C // 1152 , "N"
  5878. PQ_RegisterWrite(VIP_reg_slr_ds_hp_hsum_min_th,0x180);// 0x0380D270 // 384 , "N"
  5879. PQ_RegisterWrite(VIP_reg_slr_ds_hp_vsum_max_th,0x480);// 0x0380D274 // 1152 , "N"
  5880. PQ_RegisterWrite(VIP_reg_slr_ds_hp_vsum_min_th,0x180);// 0x0380D278 // 384 , "N"
  5881. PQ_RegisterWrite(VIP_reg_slr_ds_hp_mixsum_max_th,0x600);// 0x03C0D27C // 1536 , "N"
  5882. PQ_RegisterWrite(VIP_reg_slr_ds_hp_vsum_hsum_ratio,0x06);// 0x0140D280 // 6 , "N"
  5883. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th,0x9);// 0x0240D2B0 // 60 , "N"
  5884. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_h,0xf);// 0x0240D2B4 // 15 , "N"
  5885. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_v,0x5a);// 0x0240D2B8 // 90 , "N"
  5886. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_th_hv,0x5a);// 0x0240D2BC // 90 , "N"
  5887. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_factor,0x08);// 0x01C0D2C0 // 24 , "N"
  5888. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_factor_h,0x30);// 0x01C0D2C1 // 48 , "N"
  5889. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_factor_v,0x08);// 0x01C0D2C2 // 8 , "N"
  5890. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_factor_hv,0x08);// 0x01C0D2C3 // 8 , "N"
  5891. PQ_RegisterWrite(VIP_reg_slr_ds_sad_cross_factor_h_inc,0x08);// 0x01C0D2C4 // 8 , "N"
  5892. PQ_RegisterWrite(VIP_reg_slr_ds_sad_lr_lp,0x01);// 0x0040D2D0 // 1 , "N"
  5893. PQ_RegisterWrite(VIP_reg_slr_ds_cross_alpha_th,0x03);// 0x0100D2D1 // 3 , "N"
  5894. PQ_RegisterWrite(VIP_reg_slr_ds_sad_lr_restrict,0x01);// 0x0040D2D2 // 1 , "N"
  5895. PQ_RegisterWrite(VIP_reg_slr_ds_strong_lr_th1,0x30);// 0x0200D2D3 // 48 , "N"
  5896. PQ_RegisterWrite(VIP_reg_slr_ds_strong_lr_th2,0x30);// 0x0200D2D4 // 48 , "N"
  5897. PQ_RegisterWrite(VIP_reg_slr_ds_strong_lr_ratio1,0x8);// 0x0100D2D5 // 8 , "N"
  5898. PQ_RegisterWrite(VIP_reg_slr_ds_strong_lr_ratio2,0x8);// 0x0100D2D6 // 8 , "N"
  5899. PQ_RegisterWrite(VIP_reg_slr_ds_weak_lr_th1,0x10);// 0x0200D2D7 // 16 , "N"
  5900. PQ_RegisterWrite(VIP_reg_slr_ds_weak_lr_th2,0x10);// 0x0200D2D8 // 16 , "N"
  5901. PQ_RegisterWrite(VIP_reg_slr_ds_weak_lr_ratio1,0x05);// 0x0100D2D9 // 5 , "N"
  5902. PQ_RegisterWrite(VIP_reg_slr_ds_weak_lr_ratio2,0x04);// 0x0100D2DA // 4 , "N"
  5903. PQ_RegisterWrite(VIP_reg_slr_ds_sum_lr_ratio1,0x05);// 0x0100D2DB // 5 , "N"
  5904. PQ_RegisterWrite(VIP_reg_slr_ds_sum_lr_ratio2,0x05);// 0x0100D2DC // 5 , "N"
  5905. PQ_RegisterWrite(VIP_reg_slr_ds_sad_l_r_min,0x10);// 0x0200D2DD // 16 , "N"
  5906. PQ_RegisterWrite(VIP_reg_slr_ds_sad_lr_min,0x60);// 0x0200D2DE // 96 , "N"
  5907. PQ_RegisterWrite(VIP_reg_slr_ds_sad_max,0xc8);// 0x0240D2E0 // 200 , "N"
  5908. PQ_RegisterWrite(VIP_reg_slr_ds_sad_med,0x88);// 0x0240D2E4 // 136 , "N"
  5909. PQ_RegisterWrite(VIP_reg_slr_ds_sad_min1,0x30);// 0x0200D2E8 // 48 , "N"
  5910. PQ_RegisterWrite(VIP_reg_slr_ds_sad_min2,0x0);// 0x0200D2E9 // 0 , "N"
  5911. PQ_RegisterWrite(VIP_reg_slr_ds_sad_margin,0x18);// 0x0200D2EC // 24 , "N"
  5912. PQ_RegisterWrite(VIP_reg_slr_ds_sumsad_ratio,0x06);// 0x0100D2F0 // 6 , "N"
  5913. PQ_RegisterWrite(VIP_reg_slr_ds_sad_factor1,0x30);// 0x01C0D2F2 // 48 , "N"
  5914. PQ_RegisterWrite(VIP_reg_slr_ds_sad_factor2_1,0x5);// 0x01C0D2F3 // 5 , "N"
  5915. PQ_RegisterWrite(VIP_reg_slr_ds_sad_factor2_2,0x20);// 0x01C0D2F4 // 32 , "N"
  5916. PQ_RegisterWrite(VIP_reg_slr_ds_sad_factor3,0x4);// 0x01C0D2F5 // 4 , "N"
  5917. PQ_RegisterWrite(VIP_reg_slr_ds_sad_factor4_1,0x1);// 0x0100D2F6 // 1 , "N"
  5918. PQ_RegisterWrite(VIP_reg_slr_ds_sad_factor4_2,0x2);// 0x0100D2F7 // 2 , "N"
  5919. PQ_RegisterWrite(VIP_reg_slr_ds_sad_factor3_lmt,0x18);// 0x0140D2F8 // 24 , "N"
  5920. PQ_RegisterWrite(VIP_reg_slr_ds_dis_subsad,0x01);// 0x0040D2F9 // 1 , "N"
  5921. PQ_RegisterWrite(VIP_reg_slr_ds_sad_ratio1,0x0a);// 0x0100D2FA // 10 , "N"
  5922. PQ_RegisterWrite(VIP_reg_slr_ds_sad_ratio2,0x06);// 0x0100D2FB // 6 , "N"
  5923. PQ_RegisterWrite(VIP_reg_slr_ds_sad_ratio3,0x02);// 0x0140D2FC // 2 , "N"
  5924. PQ_RegisterWrite(VIP_reg_slr_ds_sad_ratio4,0x08);// 0x0140D2FD // 8 , "N"
  5925. // PQ_RegisterWrite(VIP_reg_ds_disable_angle_sel,0x0);// 0x0040D2FE // 0 , "N"
  5926. // PQ_RegisterWrite(VIP_reg_ds_disable_func_en,0x0);// 0x0080D2FF // 0 , "N"
  5927. PQ_RegisterWrite(VIP_reg_slr_ds_dis_blending,0x0);// 0x0040D300 // 0 , "N"
  5928. // PQ_RegisterWrite(VIP_reg_slr_dscale_strong_edge_lp,0x0);// 0x0040D301 // 0 , "N"
  5929. PQ_RegisterWrite(VIP_reg_slr_dscale_cross_shoot_ctrl_taps,0x1);// 0x0080D302 // 1 , "N
  5930. PQ_RegisterWrite(VIP_reg_slr_dscale_other_shoot_ctrl_taps,0x1);// 0x0080D303 // 1 , "N
  5931. PQ_RegisterWrite(VIP_reg_slr_dbg_angle_en,0xffff);// 0x0400D308 // 65535 , "N"
  5932. PQ_RegisterWrite(VIP_reg_slr_dbg_dis_color,0x01000000);// 0x0040D30C // 0 , "N"
  5933. PQ_RegisterWrite(VIP_reg_slr_ds_sharp_gain_ctrl_tap,0x0);// 0x0040D31C // 0 , "E"
  5934. PQ_RegisterWrite(VIP_reg_slr_ds_salt_filter_en,0x07);// 0x00C0D330 // 7 , "N"
  5935. PQ_RegisterWrite(VIP_reg_slr_ds_salt_diff_th1,0x0a);// 0x0200D331 // 10 , "N"
  5936. PQ_RegisterWrite(VIP_reg_slr_ds_salt_diff_th2,0x05);// 0x0200D332 // 5 , "N"
  5937. PQ_RegisterWrite(VIP_reg_slr_ds_salt_diff_th3,0x05);// 0x0200D333 // 5 , "N"
  5938. PQ_RegisterWrite(VIP_reg_slr_ds_salt_comb_th,0x0);// 0x0240D334 // 0 , "N"
  5939. PQ_RegisterWrite(VIP_reg_slr_ds_salt_comb_slope,0x100);// 0x02C0D338 // 256 , "N"
  5940. PQ_RegisterWrite(VIP_reg_slr_ds_sad_noise_level,0x20);// 0x0200D358 // 35 , "N"
  5941. PQ_RegisterWrite(VIP_reg_slr_ds_border_h_en,0x0);// 0x0040D364 // 0 , "N"
  5942. PQ_RegisterWrite(VIP_reg_slr_ds_border_h_th,0x04);// 0x0100D365 // 4 , "N"
  5943. PQ_RegisterWrite(VIP_reg_slr_ds_border_v_en,0x0);// 0x0040D366 // 0 , "N"
  5944. PQ_RegisterWrite(VIP_reg_slr_ds_border_v_th,0x03);// 0x0100D367 // 3 , "N"
  5945. PQ_RegisterWrite(VIP_reg_slr_ds_dis_min_diff,0x0);// 0x0040D368 // 0 , "N"
  5946. PQ_RegisterWrite(VIP_reg_slr_ds_cond1_sel1,0x01);// 0x0040D36A // 1 , "N"
  5947. PQ_RegisterWrite(VIP_reg_slr_ds_cond1_sel2,0x01);// 0x0040D36B // 1 , "N"
  5948. PQ_RegisterWrite(VIP_reg_slr_ds_neg_factor1,0x01);// 0x0040D36C // 1 , "N"
  5949. PQ_RegisterWrite(VIP_reg_slr_ds_cross_blend,0x0);// 0x0040D36E // 1 , "N"
  5950. PQ_RegisterWrite(VIP_reg_slr_ds_dis_74d,0x0);// 0x0040D36F // 0 , "N"
  5951. PQ_RegisterWrite(VIP_reg_slr_ds_dis_74_sum,0x1);// 0x0041D36F // 0 , "N"
  5952. PQ_RegisterWrite(VIP_reg_slr_ds_sumsad_limit,0x1);// 0x0042D36F // 1 , "N"
  5953. PQ_RegisterWrite(VIP_reg_slr_ds_sharp_gain_ctrl_tap_c,0x0);// 0x0040D41C // 0 , "E"
  5954. PQ_RegisterWrite(VIP_reg_slr_ds_sharp_gain_ctrl_tap_c,0x0);// 0x0040D41C // 0 , "E"
  5955. //531 settings
  5956. if(VIP_IsATVSource())
  5957. {
  5958. PQ_RegisterWrite(VIP_reg_slr_ds_ultra_sharp ,0x0);// 0x0100D36D // 15 , "N"
  5959. PQ_RegisterWrite(VIP_reg_slr_h_salt_fil_th ,0x1);
  5960. }
  5961. else
  5962. {
  5963. PQ_RegisterWrite(VIP_reg_slr_ds_ultra_sharp ,0x0f);// 0x0100D36D // 15 , "N"
  5964. PQ_RegisterWrite(VIP_reg_slr_h_salt_fil_th ,0x10);
  5965. }
  5966. if(VIP_GetInputVSize()<=576)
  5967. PQ_RegisterWrite(VIP_reg_slr_ds_full_angle,0x0);
  5968. else
  5969. PQ_RegisterWrite(VIP_reg_slr_ds_full_angle,0x1);
  5970. //Temp settings for 533
  5971. if(VIP_IsATVSource())
  5972. {
  5973. PQ_RegisterWrite(VIP_reg_slr_dlti_scale_post ,0x00); //0x0080DF74
  5974. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_0_post ,0x20); //0x0200DF0C
  5975. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_1_post ,0x40); //0x0200DF10
  5976. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_2_post ,0x40); //0x0200DF14
  5977. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_2 ,0xf0); //0x0200DD14
  5978. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_1 ,0xf0); //0x0200DD10
  5979. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_0 ,0x60); //0x0200DD0C
  5980. }
  5981. else
  5982. {
  5983. PQ_RegisterWrite(VIP_reg_slr_dlti_scale_post ,0x01); //0x0080DF74
  5984. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_0_post ,0x40); //0x0200DF0C
  5985. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_1_post ,0x80); //0x0200DF10
  5986. PQ_RegisterWrite(VIP_reg_slr_dlti_gain_2_post ,0x80); //0x0200DF14
  5987. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_2 ,0x80); //0x0200DD14
  5988. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_1 ,0x80); //0x0200DD10
  5989. PQ_RegisterWrite(VIP_reg_slr_2d_l_gain_0 ,0x40); //0x0200DD0C
  5990. }
  5991. }
  5992. void PQ_SLR_ColorBarDetailSet(void)
  5993. {
  5994. UINT32 CaptureWindowSize=0;
  5995. 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));
  5996. PQ_RegisterWrite(VIP_reg_slr_valid_bin_th , ((4*CaptureWindowSize)/100)); //sonyPQ(NTSC) 720P colorbar 5 to 4
  5997. PQ_RegisterWrite(VIP_reg_slr_gray_bin_th , ((5*CaptureWindowSize)/10));
  5998. PQ_RegisterWrite(VIP_reg_slr_dcti_scale_color ,0);
  5999. PQ_RegisterWrite(VIP_reg_slr_detail_en ,0x0); //Sony PQ(NTSC) ColorBar
  6000. PQ_RegisterWrite(VIP_reg_slr_null_bin_th ,0x100);
  6001. if (VIP_GetUserSource() == EXTS && !VIP_IsPCSource())
  6002. PQ_RegisterWrite(VIP_reg_slr_detail_bin_th , ((7*CaptureWindowSize)/10));
  6003. else
  6004. PQ_RegisterWrite(VIP_reg_slr_detail_bin_th , ((5*CaptureWindowSize)/10));
  6005. PQDebugPrint("\033[1m\033[40;35m%s:CaptureWindowSize = %d\033[0m\n", __FUNCTION__,CaptureWindowSize);
  6006. 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));
  6007. 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));
  6008. 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));
  6009. }
  6010. void PQ_DeinterlaceFilter(void)
  6011. {
  6012. PQHW_CONTEXT* pHwContext= &PQHwContext;
  6013. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  6014. INT32 Val1,Val2,Val3;
  6015. UINT8 ucTableIndex;
  6016. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  6017. DEIN_FILTER_DATA *pDEIN_FILTER_DATA;
  6018. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  6019. if (pVtab->mNRSetting.mNRSourceGroupedIndex[ucCurrSrcIndex] >= 8) return;
  6020. ucTableIndex = pVtab->mDeinterlaceFilter.mGroupedIndex[ucCurrSrcIndex];
  6021. pDEIN_FILTER_DATA = &pVtab->mDeinterlaceFilter.mDeIN_Fil_Data[ucTableIndex];
  6022. if( VIP_GetInputHSize()>=1900 )
  6023. {
  6024. Val1 = pDEIN_FILTER_DATA->hd_vdi_mad_hlp_en;
  6025. Val2 = pDEIN_FILTER_DATA->hd_slr_mix_ach;
  6026. Val3 = pDEIN_FILTER_DATA->hd_slr_mix_bch;
  6027. }
  6028. else if( VIP_GetInputHSize()<800 )
  6029. {
  6030. Val1 = pDEIN_FILTER_DATA->sd_vdi_mad_hlp_en;
  6031. Val2 = pDEIN_FILTER_DATA->sd_slr_mix_ach;
  6032. Val3 = pDEIN_FILTER_DATA->sd_slr_mix_bch;
  6033. }
  6034. else
  6035. {
  6036. Val1 = pDEIN_FILTER_DATA->md_vdi_mad_hlp_en;
  6037. Val2 = pDEIN_FILTER_DATA->md_slr_mix_ach;
  6038. Val3 = pDEIN_FILTER_DATA->md_slr_mix_bch;
  6039. }
  6040. PQ_RegisterWrite(VIP_reg_vdi_mad_hlp_en, Val1);
  6041. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_ach, Val2);
  6042. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_bch, Val3);
  6043. #if 0
  6044. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_ach, 2);
  6045. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_bch, 2);
  6046. #else
  6047. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_ach, VIP_IsATVSource()?3:2);
  6048. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_bch, VIP_IsATVSource()?3:2);
  6049. #endif
  6050. #if 0
  6051. if(VIP_GetUserSource()==SOURCE_HDMI && pHwContext->cInterlaceMode)
  6052. {
  6053. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_ach, 1);
  6054. PQ_RegisterWrite(VIP_reg_slr_mix_smooth_bch, 1);
  6055. }
  6056. #endif
  6057. PQ_ConditionSetting(MODE_DeinterlaceFilter);
  6058. PQ_RegisterWrite(VIP_reg_slr_mix_vedge_acw_en ,0);
  6059. PQ_RegisterWrite(VIP_reg_slr_mix_vedge_acw_sel ,0);
  6060. PQ_RegisterWrite(VIP_reg_slr_mix_vedge_bw_en ,0);
  6061. PQ_RegisterWrite(VIP_reg_slr_mix_vedge_bw_sel ,0);
  6062. PQ_RegisterWrite(VIP_reg_slr_mix_vedge_mbw_en ,0);
  6063. PQ_RegisterWrite(VIP_reg_slr_mix_vedge_mbw_sel ,0);
  6064. }
  6065. VTAB_SRC_VALUE_DEFINE* PQ_GetSourceVTab(UINT8 ucSource, UINT8 ucSubSource)
  6066. {
  6067. PQHW_CONTEXT* pHwContext= &PQHwContext;
  6068. VTAB_SRC_VALUE_DEFINE* pVtab= &pHwContext->VtabSrcValue[0];
  6069. VTAB_CMN_VALUE_DEFINE* pVtabCmnValue= &pHwContext->VtabCmnValue;
  6070. switch(ucSource)
  6071. {
  6072. case EXTS:
  6073. if( ucSubSource==YPP1 || ucSubSource==YPP2)
  6074. {
  6075. if(PQ_GetDefinitionIndex())
  6076. {
  6077. pVtab= &pHwContext->VtabSrcValue[VTAB_EXTS_YPP_HD_VALUE-VTAB_EXTS_YPP_VALUE]; //YPP_HD
  6078. }
  6079. else
  6080. {
  6081. pVtab= &pHwContext->VtabSrcValue[0]; //YPP
  6082. }
  6083. #if SEPERATE_YPBPR1_YPBPR2
  6084. if(ucSubSource==YPP2 && VIP_JudgeDVDSource())
  6085. {
  6086. if(PQ_GetDefinitionIndex())
  6087. {
  6088. pVtab= &pHwContext->VtabSrcValue[VTAB_EXTS_YPP2_HD_VALUE-VTAB_EXTS_YPP_VALUE]; //YPP2_HD(DVD)
  6089. }
  6090. else
  6091. {
  6092. pVtab= &pHwContext->VtabSrcValue[VTAB_EXTS_YPP2_SD_VALUE-VTAB_EXTS_YPP_VALUE]; //YPP2_SD(DVD)
  6093. }
  6094. }
  6095. #endif
  6096. }
  6097. else if( ucSubSource==DSUB )
  6098. {
  6099. pVtab= &pHwContext->VtabSrcValue[VTAB_EXTS_RGB_VALUE-VTAB_EXTS_YPP_VALUE]; //RGB
  6100. }
  6101. if(ucSubSource==SCART_RGB1)
  6102. {
  6103. PQDebugPrint("%s: load %s table",__FUNCTION__, pVtabCmnValue->ucLoadScartRGBTab?"Scart RGB":"YPP");
  6104. if(pVtabCmnValue->ucLoadScartRGBTab)
  6105. {
  6106. pVtab= &pHwContext->VtabSrcValue[VTAB_SCART_RGB_VALUE-VTAB_EXTS_YPP_VALUE];//SCART_RGB
  6107. }
  6108. else
  6109. {
  6110. pVtab= &pHwContext->VtabSrcValue[VTAB_EXTS_YPP_VALUE-VTAB_EXTS_YPP_VALUE];//YPP
  6111. }
  6112. }
  6113. break;
  6114. case CVD2:
  6115. if( ucSubSource==TV_INPUT_CHANNEL )
  6116. {
  6117. pVtab= &pHwContext->VtabSrcValue[VTAB_CVD2_TV_VALUE-VTAB_EXTS_YPP_VALUE];
  6118. }
  6119. else if( ucSubSource==AV1_INPUT_CHANNEL || ucSubSource==AV2_INPUT_CHANNEL || ucSubSource==AV3_INPUT_CHANNEL )
  6120. {
  6121. pVtab= &pHwContext->VtabSrcValue[VTAB_CVD2_AV_VALUE-VTAB_EXTS_YPP_VALUE];
  6122. }
  6123. if( ucSubSource==S1_INPUT_CHANNEL || ucSubSource==S2_INPUT_CHANNEL || ucSubSource==S3_INPUT_CHANNEL )
  6124. {
  6125. pVtab= &pHwContext->VtabSrcValue[VTAB_CVD2_SV_VALUE-VTAB_EXTS_YPP_VALUE];
  6126. }
  6127. break;
  6128. case MPEG:
  6129. if(PQ_GetDefinitionIndex())
  6130. {
  6131. pVtab= &pHwContext->VtabSrcValue[VTAB_MPEG_HD_VALUE-VTAB_EXTS_YPP_VALUE]; //MPEG_HD
  6132. }
  6133. else
  6134. {
  6135. pVtab= &pHwContext->VtabSrcValue[VTAB_MPEG_VALUE-VTAB_EXTS_YPP_VALUE]; //MPEG_SD
  6136. }
  6137. break;
  6138. case HDMI:
  6139. if(VIP_RunDVIMode())
  6140. {
  6141. pVtab= &pHwContext->VtabSrcValue[VTAB_EXTS_RGB_VALUE-VTAB_EXTS_YPP_VALUE];
  6142. }
  6143. else
  6144. {
  6145. if(PQ_GetDefinitionIndex())
  6146. {
  6147. pVtab= &pHwContext->VtabSrcValue[VTAB_HDMI_HD_VALUE-VTAB_EXTS_YPP_VALUE]; //HDMI_HD
  6148. }
  6149. else
  6150. {
  6151. pVtab= &pHwContext->VtabSrcValue[VTAB_HDMI_VALUE-VTAB_EXTS_YPP_VALUE]; //HDMI_SD
  6152. }
  6153. }
  6154. break;
  6155. case JPEG:
  6156. case PATN:
  6157. pVtab= &pHwContext->VtabSrcValue[VTAB_EXTS_RGB_VALUE-VTAB_EXTS_YPP_VALUE];
  6158. break;
  6159. }
  6160. return pVtab;
  6161. }
  6162. void PQ_DeblockFilterAndDetect(BOOL bDemoMode, UINT32 vdi_hsize_i, UINT32 vdi_vsize)
  6163. {
  6164. UINT32 vdi_hds,vdi_ne_total;
  6165. UINT32 vdi_hsize;
  6166. BOOL bNrEnable;
  6167. BOOL bDeblockEnable;
  6168. UINT8 ucTmp;
  6169. PQHW_CONTEXT* pHwContext = &PQHwContext;
  6170. //set ne estimate
  6171. vdi_hds= bDemoMode ? PQ_RegisterRead(VIP_reg_vdi_tnr_dbg_offset): 0;
  6172. vdi_hsize= vdi_hsize_i - vdi_hds;
  6173. vdi_ne_total= vdi_hsize * vdi_vsize;
  6174. bNrEnable= (pHwContext->nMPEGNRLevel>OFF) ? ENABLE : DISABLE;
  6175. bNrEnable= (bNrEnable) && (!VIP_IsPCSource() && !VIP_RunDVIMode());
  6176. bDeblockEnable=(!VIP_IsPCSource()) && (!VIP_RunDVIMode());
  6177. //## horizontal detection and filter enable
  6178. //0x4128
  6179. PQ_RegisterWrite(VIP_reg_gfx_dbk_en, bNrEnable && bDeblockEnable);
  6180. PQ_RegisterWrite(VIP_reg_gfx_dbk_fil_en, bNrEnable);// && (pHwContext->cInputDataFormat!=RGB));
  6181. PQ_RegisterWrite(VIP_reg_gfx_dbk_filc_en, 1);
  6182. PQ_RegisterWrite(VIP_reg_gfx_dbk_lp_sel, 0);
  6183. PQ_RegisterWrite(VIP_reg_gfx_dbk_fil_dbg_en, 0);
  6184. PQ_RegisterWrite(VIP_reg_gfx_dbk_ratio_dis, 0);
  6185. PQ_RegisterWrite(VIP_reg_gfx_maxedgeh_th, vdi_ne_total/ 225);
  6186. PQ_RegisterWrite(VIP_reg_gfx_maxedgeh_ratio_th, 3);
  6187. PQ_RegisterWrite(VIP_reg_gfx_maxedgeh_scale_th, 0x2fff);
  6188. PQ_RegisterWrite(VIP_reg_gfx_blockedgeh_fil_th_min, VIP_GetUserSource() == SOURCE_MPEG?0:2);
  6189. PQ_RegisterWrite(VIP_reg_gfx_maxedgeh2_minth, 0xc);
  6190. PQ_RegisterWrite(VIP_reg_gfx_dbk_hdiff_th3, 0x8);
  6191. //## vertical deblock detection and filter
  6192. PQ_RegisterWrite(VIP_reg_vdi_maxedgev_ratio_th, 16);
  6193. PQ_RegisterWrite(VIP_reg_vdi_dbk_vdiff_th3, 0x2);
  6194. PQ_RegisterWrite(VIP_reg_vdi_maxedgev_th, vdi_ne_total/348);
  6195. //0x6060
  6196. PQ_VDeblockFilterEnable();
  6197. PQ_RegisterWrite(VIP_reg_vdi_dbk_ratio_dis, 0);
  6198. PQ_RegisterWrite(VIP_reg_vdi_dbk_vqh_dis, 1);
  6199. PQ_RegisterWrite(VIP_reg_vdi_dbk_vdet_4tap, 1);
  6200. PQ_RegisterWrite(VIP_reg_vdi_dbk_vfil_minth, 2);
  6201. PQ_RegisterWrite(VIP_reg_vdi_dbk_vfil_maxth, 0xff);
  6202. PQ_RegisterWrite(VIP_reg_vdi_dbk_hmot_th, (vdi_ne_total* 15)/ 100);
  6203. PQ_RegisterWrite(VIP_reg_vdi_dbk_mot_th, (vdi_ne_total* 5)/ 100);
  6204. //330
  6205. ucTmp = PQ_RegisterRead(VIP_reg_gfx_dbk_mode_force);
  6206. if(abs(VIP_GetInputVSize() -1080)<10)
  6207. PQ_RegisterWrite(VIP_reg_gfx_dbk_mode_force , ucTmp&(~0x4));
  6208. else
  6209. PQ_RegisterWrite(VIP_reg_gfx_dbk_mode_force , ucTmp|0x4);
  6210. //PQ_RegisterWrite(VIP_reg_gfx_blockedgeh_minth, 0x3);//SonyPQ Menu vertical border discontinuity
  6211. PQ_RegisterWrite(VIP_reg_gfx_blockedgeh_minth, 0x9);//HiVi Case#20 H Line resolution blur
  6212. }
  6213. void PQ_HmeSetup(UINT32 vdi_hsize_i, UINT32 vdi_vsize)
  6214. {
  6215. //new mad setting for kw
  6216. if(VIP_GetInterlaceMode())
  6217. {
  6218. UINT32 slr_hds, slr_hde,slr_vds,slr_vde,hme_height, tmp;
  6219. //disable full screen hme to avoid 330C,HDMI-480i,2d>3d,MEMC Disk->MovingPlaneBuildings,«Ø¿vª«·|§Ã¶}
  6220. /*
  6221. if( (VIP_GetUserSource() == SOURCE_CVD2&& !VIP_IsATVSource() && abs(pHwContext->ulInputHSize-720)<50 ) || (VIP_GetUserSource() == SOURCE_HDMI&& pHwContext->ulInputHSize<=720 ))
  6222. {
  6223. slr_hds = 2 ;
  6224. slr_hde = 2*(vdi_hsize_i-1)+1;
  6225. slr_vds = 5;
  6226. slr_vde = 2*(vdi_vsize-2)-1;
  6227. #if VIP_FLIP_FUN
  6228. if(VIP_GetPanelInvert())
  6229. {
  6230. tmp = slr_hds;
  6231. slr_hds = vdi_hsize_i - slr_hde;
  6232. slr_hde = vdi_hsize_i - tmp;
  6233. tmp = slr_vds;
  6234. slr_vds = vdi_vsize - slr_vde;
  6235. slr_vde = vdi_vsize - tmp;
  6236. }
  6237. #endif
  6238. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_en, 1);
  6239. PQ_RegisterWrite(VIP_reg_slr_hme_rgn_en, 1);
  6240. PQ_RegisterWrite(VIP_reg_vdi_mad_hme_det_hs, 1);
  6241. PQ_RegisterWrite(VIP_reg_vdi_mad_hme_det_he, vdi_hsize_i-1);
  6242. PQ_RegisterWrite(VIP_reg_vdi_mad_hme_det_vs, 1);
  6243. PQ_RegisterWrite(VIP_reg_vdi_mad_hme_det_ve, vdi_vsize-1);
  6244. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_det_vs, 2);
  6245. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_det_ve, vdi_vsize-2);
  6246. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_r_cnt_h, 100);
  6247. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_r_cnt_m, 100);
  6248. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_r_cnt_l, 100);
  6249. PQ_RegisterWrite(VIP_reg_slr_hme_hds, slr_hds);
  6250. PQ_RegisterWrite(VIP_reg_slr_hme_hde, slr_hde);
  6251. PQ_RegisterWrite(VIP_reg_slr_hme_vds, slr_vds);
  6252. PQ_RegisterWrite(VIP_reg_slr_hme_vde, slr_vde);
  6253. PQ_RegisterWrite(VIP_reg_slr_gmv_comb_en, 1);
  6254. PQ_RegisterWrite(VIP_reg_slr_gmv_comb_th, 0);
  6255. }
  6256. else */
  6257. if(VIP_IsATVSource())
  6258. {
  6259. slr_hds = 2 ;
  6260. slr_hde = vdi_hsize_i-2;
  6261. hme_height = vdi_vsize/4;
  6262. slr_vds = 2*(vdi_vsize-hme_height)+3;
  6263. slr_vde = 2*(vdi_vsize-2)-1;
  6264. #if VIP_FLIP_FUN
  6265. if(VIP_GetPanelInvert())
  6266. {
  6267. tmp = slr_hds;
  6268. slr_hds = vdi_hsize_i - slr_hde;
  6269. slr_hde = vdi_hsize_i - tmp;
  6270. tmp = slr_vds;
  6271. //slr_vds = 2*vdi_vsize - slr_vde;
  6272. slr_vds = 2*vdi_vsize - slr_vde+1;//20130102 CJ&KW--GME window setup
  6273. //slr_vde = 2*vdi_vsize - tmp;
  6274. slr_vde = 2*vdi_vsize - tmp-3;//20130102 CJ&KW--GME window setup
  6275. }
  6276. #endif
  6277. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_en, 1);
  6278. PQ_RegisterWrite(VIP_reg_slr_hme_rgn_en, 1);
  6279. PQ_RegisterWrite(VIP_reg_vdi_mad_hme_det_hs, 180);
  6280. PQ_RegisterWrite(VIP_reg_vdi_mad_hme_det_he, vdi_hsize_i-180);
  6281. PQ_RegisterWrite(VIP_reg_vdi_mad_hme_det_vs, vdi_vsize-hme_height+1);
  6282. PQ_RegisterWrite(VIP_reg_vdi_mad_hme_det_ve, vdi_vsize-1);
  6283. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_det_vs, vdi_vsize-hme_height);
  6284. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_det_ve, vdi_vsize-2);
  6285. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_r_minus, 0);
  6286. PQ_RegisterWrite(VIP_reg_vdi_mad_hme_ambg_th, 8192);
  6287. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_vldcnt_th,3);
  6288. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_r_cnt_h, 2);
  6289. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_r_cnt_m, 2);
  6290. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_r_cnt_l, 2);
  6291. PQ_RegisterWrite(VIP_reg_slr_hme_hds, slr_hds);
  6292. PQ_RegisterWrite(VIP_reg_slr_hme_hde, slr_hde);
  6293. PQ_RegisterWrite(VIP_reg_slr_hme_vds, slr_vds);
  6294. PQ_RegisterWrite(VIP_reg_slr_hme_vde, slr_vde);
  6295. /*
  6296. PQ_RegisterWrite(VIP_reg_slr_hme_hds, 2);
  6297. PQ_RegisterWrite(VIP_reg_slr_hme_hde, VIP_GetScalerPreScaleH()-2);
  6298. PQ_RegisterWrite(VIP_reg_slr_hme_vds, 2*(vdi_vsize-28)+1);
  6299. PQ_RegisterWrite(VIP_reg_slr_hme_vde, 2*(vdi_vsize-2)-1);
  6300. */
  6301. PQ_RegisterWrite(VIP_reg_slr_gmv_comb_en, 1);
  6302. PQ_RegisterWrite(VIP_reg_slr_gmv_comb_th, 0);
  6303. PQ_RegisterWrite(VIP_reg_slr_gmv_hedge_th,0x8);
  6304. }
  6305. else
  6306. {
  6307. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_en, 0);
  6308. PQ_RegisterWrite(VIP_reg_slr_hme_rgn_en, 0);
  6309. }
  6310. }
  6311. else
  6312. {
  6313. PQ_RegisterWrite(VIP_reg_vdi_mad_gmv_en, 0);
  6314. PQ_RegisterWrite(VIP_reg_slr_hme_rgn_en, 0);
  6315. }
  6316. }
  6317. void PQ_HmeControl(void)
  6318. {
  6319. static int counter=256;
  6320. //for JunYun suggest, 22 & 32 need close hme for «Ø¿vª«±ÛÂà·|¤À§Ãissue
  6321. if(VIP_IsATVSource() &&(VIP_GetStdColorSystem()<=CVD2_STD_NTSC_443))
  6322. {
  6323. if((PQ_RegisterRead(VIP_vdi_32det_sts)& 0x1000)>>12)
  6324. {
  6325. counter--;
  6326. if(counter==0)
  6327. PQ_RegisterWrite(VIP_reg_slr_hme_rgn_en, 0);
  6328. else if(counter<0)
  6329. counter=0;
  6330. }
  6331. else
  6332. {
  6333. counter++;
  6334. if(counter==255)
  6335. PQ_RegisterWrite(VIP_reg_slr_hme_rgn_en, 1);
  6336. else if(counter>255)
  6337. counter=255;
  6338. }
  6339. }
  6340. }
  6341. UINT8 PQ_GetMotionStatus(void)
  6342. {
  6343. UINT32 ucvdi_mot_cnt = PQ_RegisterRead(VIP_vdi_mot_cnt);
  6344. UINT32 ucvdi_vdbk_sts = PQ_RegisterRead(VIP_vdi_vdbk_sts);
  6345. if(ucvdi_mot_cnt == 0 && ucvdi_vdbk_sts < 32) // ucvdi_vdbk_sts<32 mean ucvdi_field_diff_cnt_lp < thr
  6346. {
  6347. return STATIC_FRAME;
  6348. }
  6349. else
  6350. {
  6351. return MOTION_FRAME;
  6352. }
  6353. }
  6354. void PQ_SetMotioncond(void)
  6355. {
  6356. UINT32 ucvdi_mot_cnt = PQ_RegisterRead(VIP_vdi_mot_cnt);
  6357. if (ucvdi_mot_cnt < STATIC_FRAME_THRESHOLD)
  6358. {
  6359. PQ_RegisterWrite(VIP_reg_slr_motion_cond, 0);
  6360. }
  6361. else
  6362. {
  6363. PQ_RegisterWrite(VIP_reg_slr_motion_cond, 4);
  6364. }
  6365. }
  6366. //****************************************************************************
  6367. //
  6368. // Function : PQ_GmeEnableControl
  6369. // Params : none
  6370. // Description: enable /disable GME function in specific status
  6371. // Returns : void
  6372. // note :VIP_reg_vdi_mad_mcd_en must sync with VIP_reg_slr_gme_en
  6373. // 1. all color syste in CVD2 output within display and scan channel is 720 width in 533, the condiction VIP_GetScalerPreScaleH()<=720 will
  6374. // always true, mean GME will always enable in 533/CVD2, disable GME in CVD2 source to sync the behavior with 331
  6375. //
  6376. //****************************************************************************
  6377. void PQ_GmeEnableControl(void)
  6378. {
  6379. UINT8 ucUserSource;
  6380. UINT8 ucSubSource;
  6381. UINT8 ucSD;
  6382. UINT8 uDisableFlag = FALSE;
  6383. VIP_GetSource(&ucUserSource, &ucSubSource);
  6384. /*MPEG has MHEG5 it will cut edge cause the HD detect to SD, cause some video fuzzy. like mantis 0038744 */
  6385. if(ucUserSource == SOURCE_MPEG)
  6386. ucSD = (VIP_GetInputHSize()<=720 && VIP_GetInterlaceMode())?1:0;
  6387. else
  6388. ucSD = (VIP_GetScalerPreScaleH()<=720 && VIP_GetInterlaceMode())?1:0;
  6389. if(ucUserSource == SOURCE_MPEG|| ucUserSource == SOURCE_CVD2)
  6390. {
  6391. uDisableFlag = TRUE;
  6392. }
  6393. /*[20160328] close gme in dtv beacuse it has too many garbage issue in ff/fb when playing like mantis 35178/34491*/
  6394. if((ucSD) && !VIP_GetBobTopSt()&& (!uDisableFlag))// Set GME ON
  6395. {
  6396. PQ_RegisterWrite(VIP_reg_slr_gme_en, 1);
  6397. PQ_RegisterWrite(VIP_reg_vdi_mad_mcd_en, 1);// must sync with VIP_reg_slr_gme_en
  6398. }
  6399. else
  6400. {
  6401. PQ_RegisterWrite(VIP_reg_slr_gme_en, 0);
  6402. PQ_RegisterWrite(VIP_reg_vdi_mad_mcd_en, 0);// must sync with VIP_reg_slr_gme_en
  6403. }
  6404. if(ucUserSource == SOURCE_CVD2)
  6405. {
  6406. PQ_RegisterWrite(VIP_reg_vdi_lb_double_en, 0);
  6407. }
  6408. else
  6409. {
  6410. PQ_RegisterWrite(VIP_reg_vdi_lb_double_en, ucSD?1:0);
  6411. }
  6412. }
  6413. void PQ_GmeSetupWritePath(void)
  6414. {
  6415. if(((VIP_GetScalerPreScaleH()<=720 && VIP_GetInterlaceMode())) && !VIP_GetBobTopSt())
  6416. {
  6417. UINT8 ucSD;
  6418. UINT32 ulHsize, ulVsize;
  6419. ucSD = (VIP_GetScalerPreScaleH()<=720 && VIP_GetInterlaceMode())?1:0;
  6420. ulHsize = PQ_RegisterRead(VIP_reg_slr_out_width);//VIP_GetScalerPreScaleH();
  6421. ulVsize = PQ_Get_VDI_VSize();
  6422. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_comb_c1th1 ,((28000 *(( ulHsize * ulVsize*10) / (720 *480)))/10));
  6423. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_comb_c2th1 ,((7000* (( ulHsize * ulVsize*10) / (720 *480)))/10));
  6424. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_comb_c2th2 ,((500 * (( ulHsize * ulVsize*10) / (720 *480)))/10));
  6425. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_comb_c3th1 ,((38 * (( ulHsize * ulVsize*10) / (720 *480)))/10));
  6426. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_comb_th ,((1050 * (( ulHsize * ulVsize*10) / (720 *480)))/10));
  6427. PQ_RegisterWrite(VIP_reg_picx_ynx_en, 0); //chienjen
  6428. if((ucSD) && !VIP_GetBobTopSt())
  6429. {
  6430. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hsize , ulHsize/8);
  6431. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_0ve , ulVsize/6-1);
  6432. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_1ve ,(ulVsize/6-1) + ulVsize/6);
  6433. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_2ve ,(ulVsize/6-1) + ulVsize/6 * 2);
  6434. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_3ve ,(ulVsize/6-1) + ulVsize/6 * 3);
  6435. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_4ve ,(ulVsize/6-1) + ulVsize/6 * 4);
  6436. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_5ve , ulVsize-1);
  6437. }
  6438. }
  6439. PQ_GmeEnableControl();
  6440. }
  6441. void PQ_GmeSetupReadPath(void)
  6442. {
  6443. if(((VIP_GetScalerPreScaleH()<=720 && VIP_GetInterlaceMode())) && !VIP_GetBobTopSt())
  6444. {
  6445. UINT32 ulHsize, ulVsize;
  6446. ulHsize = PQ_RegisterRead(VIP_reg_slr_out_width);//VIP_GetScalerPreScaleH();
  6447. ulVsize = PQ_Get_VDI_VSize();
  6448. PQ_RegisterWrite(VIP_reg_slr_gme_block_hnum, ulHsize/8);
  6449. PQ_RegisterWrite(VIP_reg_slr_gme_block_hnum_last, ulHsize - 7*(ulHsize/8));
  6450. PQ_RegisterWrite(VIP_reg_slr_gme_block_vnum, ulVsize/6);
  6451. PQ_RegisterWrite(VIP_reg_slr_gme_block_vnum_last, ulVsize- 5*(ulVsize/6));
  6452. PQ_RegisterWrite(VIP_reg_slr_gme_mvx_limit, 9);
  6453. PQ_RegisterWrite(VIP_reg_slr_gme_ysht_pol, 1);
  6454. PQ_RegisterWrite(VIP_reg_slr_gme_mvx_pol, 0);
  6455. PQ_RegisterWrite(VIP_reg_slr_gme_mvy_pol, 1);
  6456. PQ_RegisterWrite(VIP_reg_slr_gme_sel_pol, 1);
  6457. PQ_RegisterWrite(VIP_reg_slr_gme_blend_sel, 0);
  6458. PQ_RegisterWrite(VIP_reg_slr_gme_mvcnt_yth, 10);
  6459. PQ_RegisterWrite(VIP_reg_slr_3field_diff_th, 0x100);
  6460. PQ_RegisterWrite(VIP_reg_slr_sd_3field_mix_en, 0);
  6461. }
  6462. PQ_RegisterWrite(VIP_reg_slr_sd_3field_en, 0);
  6463. }
  6464. void PQ_MADSetup(UINT32 vdi_hsize_i, UINT32 vdi_vsize, UINT32 vdi_total)
  6465. {
  6466. UINT32 rscomb_hsize,rscomb_vsize,rscomb_total;
  6467. //Enable all MAD function
  6468. //0x6070
  6469. //PQ_RegisterWrite(VIP_reg_vdi_mad_hlp_en, 1);
  6470. PQ_RegisterWrite(VIP_reg_vdi_mad_tpc_en, 1);
  6471. PQ_RegisterWrite(VIP_reg_vdi_mad_mot_diff_dis, 1);
  6472. if((VIP_GetUserSource()==MPEG) && (VIP_GetInputResMode() == RESMODE_1920X1080) && (VIP_GetInterlaceMode()))
  6473. PQ_RegisterWrite(VIP_reg_vdi_mad_iir_en, 0);
  6474. else
  6475. PQ_RegisterWrite(VIP_reg_vdi_mad_iir_en, 1);
  6476. PQ_RegisterWrite(VIP_reg_vdi_mad_smw_en, 1);
  6477. // PQ_RegisterWrite(VIP_reg_vdi_mad_smw_sel, 1);
  6478. PQ_RegisterWrite(VIP_reg_vdi_mad_sb_iir_en, 1);
  6479. PQ_RegisterWrite(VIP_reg_vdi_mad_comb_en, 1);
  6480. //--------------------------------------------------------------------------------------------------
  6481. //0x6071
  6482. PQ_RegisterWrite(VIP_reg_vdi_mad_stc_en, 1);
  6483. PQ_RegisterWrite(VIP_reg_vdi_mad_dyn_en, 1);
  6484. PQ_RegisterWrite(VIP_reg_vdi_mad_mnr_det_en, 1);
  6485. PQ_RegisterWrite(VIP_reg_vdi_mad_mnr_fil_mth, 1);
  6486. PQ_RegisterWrite(VIP_reg_vdi_mad_32cmp_sel, 1);
  6487. PQ_RegisterWrite(VIP_reg_vdi_mad_comb_rgn_en, 1);
  6488. // PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_hfil_en, 0);
  6489. // PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_hfil_sel, 0);
  6490. //0x6072
  6491. PQ_RegisterWrite(VIP_reg_vdi_mad_loa_pol, 0);
  6492. PQ_RegisterWrite(VIP_reg_vdi_mad_mot_sel, 0);
  6493. PQ_RegisterWrite(VIP_reg_vdi_mad_pix32_dyn_en, 1);
  6494. PQ_RegisterWrite(VIP_reg_vdi_mad_32mot_sel, 0);
  6495. // PQ_RegisterWrite(VIP_reg_vdi_mad_m2s_adj_en, 0);
  6496. PQ_RegisterWrite(VIP_reg_vdi_mad_m2sg_alpha_adj_en, 1);
  6497. PQ_RegisterWrite(VIP_reg_vdi_mad_hlp_c_en, 0);
  6498. //0x6073
  6499. PQ_RegisterWrite(VIP_reg_vdi_mad_tp_vfil_coef, 3);
  6500. //Comb detection
  6501. rscomb_hsize= (vdi_hsize_i+3)/4;
  6502. rscomb_vsize= (vdi_vsize+3)/4;
  6503. rscomb_total= rscomb_hsize * rscomb_vsize;
  6504. PQ_RegisterWrite(VIP_reg_vdi_mad_comb_th2, 32);
  6505. PQ_RegisterWrite(VIP_reg_vdi_mad_comb_th1, 8); //2009-01-05 pc update
  6506. if((VIP_GetInputResMode() == RESMODE_720X480) && (VIP_GetInterlaceMode()))
  6507. PQ_RegisterWrite(VIP_reg_vdi_mad_scomb_th1, 0xa); //2015-01-06 HiviCase Mobile subtitles
  6508. else
  6509. PQ_RegisterWrite(VIP_reg_vdi_mad_scomb_th1, 32); //2009-01-05 pc update
  6510. PQ_RegisterWrite(VIP_reg_vdi_mad_scomb_th2, 64);
  6511. PQ_RegisterWrite(VIP_reg_vdi_mad_rscomb_hsize, rscomb_hsize);
  6512. PQ_RegisterWrite(VIP_reg_vdi_mad_rscomb_vsize, rscomb_vsize);
  6513. PQ_RegisterWrite(VIP_reg_vdi_mad_rscomb_nrthd, rscomb_total/80); //x0.125
  6514. PQ_RegisterWrite(VIP_reg_vdi_mad_rscomb_ucthd, rscomb_total/200);//x0.005
  6515. PQ_RegisterWrite(VIP_reg_vdi_mad_rscomb_bcthd, rscomb_total/200);//x0.005
  6516. //set field_compare
  6517. PQ_RegisterWrite(VIP_reg_vdi_ne_vds, 1);
  6518. PQ_RegisterWrite(VIP_reg_vdi_ne_vde, vdi_vsize-2);
  6519. PQ_RegisterWrite(VIP_reg_vdi_mad_fc_hds, 2);
  6520. if(VIP_IsAVSource() && (VIP_GetStdColorSystem() == CVD2_STD_NTSC_M || VIP_GetStdColorSystem() == CVD2_STD_NTSC_443))
  6521. {
  6522. //PQ_RegisterWrite(VIP_reg_vdi_mad_fc_hde, 0x318); //mantis #35655
  6523. PQ_RegisterWrite(VIP_reg_vdi_mad_fc_hde, 0x375); //video book deinterlace#1 ch#6 text comb issue, trade off behavior between #35655 and text issue
  6524. }
  6525. else
  6526. {
  6527. PQ_RegisterWrite(VIP_reg_vdi_mad_fc_hde, vdi_hsize_i-3);
  6528. }
  6529. PQ_RegisterWrite(VIP_reg_vdi_mad_himotfd_thd, vdi_total/10);
  6530. PQ_RegisterWrite(VIP_reg_vdi_mad_lomotfd_thd, vdi_total/540);
  6531. {
  6532. UINT8 ucHDMI1080i = (VIP_GetUserSource()==SOURCE_HDMI && VIP_GetInterlaceMode());
  6533. //# gdet setting
  6534. PQ_RegisterWrite(VIP_reg_vdi_mad_gdet_period, ucHDMI1080i?4:1);
  6535. PQ_RegisterWrite(VIP_reg_vdi_mad_gdet_th, ucHDMI1080i?0xca80:vdi_total/16);
  6536. // PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_m2sg_a, 16);
  6537. // PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_m2sg_b, 0);
  6538. // PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_m2sg_a, 16);
  6539. // PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_m2sg_b, 0);
  6540. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_s2mg_alpha, 3);
  6541. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_m2sg_alpha, 8);
  6542. }
  6543. //static degree th
  6544. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_static_th, 9);
  6545. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_iir_stc_th, 7);
  6546. //6501 0x35
  6547. PQ_RegisterWrite(VIP_reg_vdi_mad_sd_denom_max_en, 1);
  6548. PQ_RegisterWrite(VIP_reg_vdi_mad_sd_denom_hhp_en, 0);
  6549. PQ_RegisterWrite(VIP_reg_vdi_mad_tpc_w_adj_en, 1);
  6550. PQ_RegisterWrite(VIP_reg_vdi_field_block_choice, 0);
  6551. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_absdiff_en, VIP_IsATVSource()?0:1);
  6552. PQ_RegisterWrite(VIP_reg_vdi_mad_mot_diff_dis, 1);
  6553. PQ_RegisterWrite(VIP_reg_vdi_mad_pix_stc_sel, 0);
  6554. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_m2sg_alpha, 8);
  6555. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_m2sg_alpha, 8);
  6556. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope, VIP_IsAVSource()?4:2);
  6557. if(VIP_IsAVSource() && VIP_GetStdColorSystem() == CVD2_STD_NTSC_443)
  6558. {
  6559. PQ_RegisterWrite(VIP_reg_vdi_mad_mbw_slope, 2);
  6560. }
  6561. #if 0
  6562. if(VIP_GetUserSource()==SOURCE_HDMI && pHwContext->cInterlaceMode)
  6563. PQ_RegisterWrite(VIP_reg_slr_spw_lp_mth, 1);
  6564. else
  6565. PQ_RegisterWrite(VIP_reg_slr_spw_lp_mth, VIP_IsATVSource()?1:0);
  6566. #elif 0
  6567. PQ_RegisterWrite(VIP_reg_slr_spw_lp_mth, 0);
  6568. #else
  6569. PQ_RegisterWrite(VIP_reg_slr_spw_lp_mth, VIP_IsATVSource()?1:0);
  6570. #endif
  6571. if(VIP_GetUserSource() == SOURCE_MPEG || (VIP_GetInterlaceMode() && abs(VIP_GetInputVSize() -1080)<20))
  6572. {
  6573. PQ_RegisterWrite(VIP_reg_slr_mix_static_feature, 0);
  6574. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_m2ss_alpha, 3);
  6575. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_m2s_alpha, 3);
  6576. }else
  6577. {
  6578. PQ_RegisterWrite(VIP_reg_slr_mix_static_feature, 1);
  6579. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_m2ss_alpha, 8);
  6580. PQ_RegisterWrite(VIP_reg_vdi_mad_tpw_m2s_alpha, 4);
  6581. }
  6582. if(VIP_GetInterlaceMode() && abs(VIP_GetInputVSize() -1080)<20)
  6583. PQ_RegisterWrite(VIP_reg_slr_static_en2, 0);
  6584. else
  6585. PQ_RegisterWrite(VIP_reg_slr_static_en2, 1);
  6586. PQ_HmeSetup(vdi_hsize_i, vdi_vsize);
  6587. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_mins_thz, 4);
  6588. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_meds_thz, 3);
  6589. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_maxs_thz, 6);
  6590. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_mins_th1, 4);
  6591. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_meds_th1, 7);
  6592. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_mins_th2, 7);
  6593. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_min_thz, 0);
  6594. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_med_thz, 2);
  6595. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_max_thz, 3);
  6596. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_min_th1, 3);
  6597. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_med_th1, 4);
  6598. PQ_RegisterWrite(VIP_reg_vdi_mad_mc_hdiff_min_th2, 6);
  6599. }
  6600. void PQ_2232DetSetup(UINT32 vdi_total)
  6601. {
  6602. //Dynamic 32 detection
  6603. PQ_RegisterWrite(VIP_reg_vdi_mad_pixel32_thd, 40);
  6604. PQ_RegisterWrite(VIP_reg_vdi_mad_pixel32_minthd, 20);
  6605. PQ_RegisterWrite(VIP_reg_vdi_mad_pixel32_maxthd, 80);
  6606. PQ_RegisterWrite(VIP_reg_vdi_mad_pixel32_motthd, 32);
  6607. PQ_RegisterWrite(VIP_reg_vdi_mad_mchfield_thd, vdi_total/1200);
  6608. PQ_RegisterWrite(VIP_reg_vdi_mad_mchfield_minthd, vdi_total/2400);
  6609. PQ_RegisterWrite(VIP_reg_vdi_mad_mchfield_maxthd, vdi_total/800);
  6610. if(VIP_GetUserSource() == SOURCE_CVD2 && VIP_IsAVSource())//KW request 2012/11/06
  6611. {
  6612. PQ_RegisterWrite(VIP_reg_vdi_fastmotion_thd, 0x4500); //yj, 20160121
  6613. PQ_RegisterWrite(VIP_reg_vdi_combcnt_fm_same_thd, 0x450);
  6614. PQ_RegisterWrite(VIP_reg_vdi_combcnt_hm_fs_thd, 0x450);
  6615. PQ_RegisterWrite(VIP_reg_vdi_fm_miss_comb_min, 0x90f);
  6616. PQ_RegisterWrite(VIP_reg_vdi_22movie_verfy_thd, 0xa);
  6617. }
  6618. else
  6619. {
  6620. if(VIP_GetUserSource() == SOURCE_HDMI && VIP_GetInterlaceMode() && (VIP_GetInputVSize() <= (480+24)))
  6621. {
  6622. PQ_RegisterWrite(VIP_reg_vdi_fastmotion_thd, 0x3300);
  6623. }
  6624. else
  6625. {
  6626. PQ_RegisterWrite(VIP_reg_vdi_fastmotion_thd, vdi_total/14);
  6627. }
  6628. //Dynamic 22 detection
  6629. PQ_RegisterWrite(VIP_reg_vdi_combcnt_fm_same_thd, vdi_total/115);
  6630. PQ_RegisterWrite(VIP_reg_vdi_combcnt_hm_fs_thd, vdi_total/58);
  6631. //PQ_RegisterWrite(VIP_reg_vdi_fm_miss_comb_min, vdi_total/675);
  6632. PQ_RegisterWrite(VIP_reg_vdi_fm_miss_comb_min, (vdi_total-2800)/132);
  6633. PQ_RegisterWrite(VIP_reg_vdi_22movie_verfy_thd, 0x5);
  6634. }
  6635. //if(VIP_GetUserSource() == SOURCE_CVD2 || pHwContext->bScartRGBMode)
  6636. // PQ_RegisterWrite(VIP_reg_vdi_22fastmotion_thd, 0xfb0); //to fix 45 degree white line is borken in 22 issue
  6637. //else
  6638. // PQ_RegisterWrite(VIP_reg_vdi_22fastmotion_thd, vdi_total/5);
  6639. PQ_RegisterWrite(VIP_reg_vdi_22fastmotion_thd ,0xffff);
  6640. PQ_RegisterWrite(VIP_reg_vdi_combratio_fm_same ,0x10);
  6641. PQ_RegisterWrite(VIP_reg_vdi_combratio_fm_miss ,0x80);
  6642. PQ_RegisterWrite(VIP_reg_vdi_combratio_hm_fm_same ,0x10);
  6643. PQ_RegisterWrite(VIP_reg_vdi_combratio_hm_fm_miss ,0x80);
  6644. PQ_RegisterWrite(VIP_reg_vdi_ad_break_fc_thd, vdi_total/1350);
  6645. PQ_RegisterWrite(VIP_reg_vdi_ad_break_comb_thd, vdi_total/45);
  6646. PQ_RegisterWrite(VIP_reg_vdi_stc_break_fc_thd, vdi_total/1350);
  6647. PQ_RegisterWrite(VIP_reg_vdi_22fastback_off, 0);
  6648. PQ_RegisterWrite(VIP_reg_vdi_22fast_break, 1);
  6649. PQ_RegisterWrite(VIP_reg_vdi_22static_break, 1);
  6650. PQ_RegisterWrite(VIP_reg_vdi_22fastsim_kikin, 0);
  6651. //0x6141
  6652. //PQ_RegisterWrite(VIP_reg_vdi_dyn32_en,1);
  6653. PQ_RegisterWrite(VIP_reg_vdi_last_mov32_en, 1);
  6654. PQ_RegisterWrite(VIP_reg_vdi_fsame32_sel, 1);
  6655. PQ_RegisterWrite(VIP_reg_vdi_dyn32_en, 1);
  6656. PQ_RegisterWrite(VIP_reg_vdi_fast_syncback, 1);
  6657. PQ_RegisterWrite(VIP_reg_vdi_fastsim_kikin, 0);
  6658. PQ_RegisterWrite(VIP_reg_vdi_32qual_22result, 0);
  6659. PQ_RegisterWrite(VIP_reg_vdi_32subt_break_en, 0);
  6660. PQ_RegisterWrite(VIP_reg_slr_mesh_en, 0);
  6661. PQ_RegisterWrite(VIP_reg_vdi_sameframe_thd, 0x24);
  6662. }
  6663. void PQ_VDISize(void)
  6664. {
  6665. PQHW_CONTEXT* pHwContext= &PQHwContext;
  6666. BOOL bDemoMode,bMpegNrEnable;
  6667. UINT32 vdi_hsize_i,vdi_vsize,vdi_total;
  6668. bDemoMode= PQ_RegisterRead(VIP_reg_vdi_tnr_debug_en);
  6669. bMpegNrEnable= (pHwContext->nMPEGNRLevel>OFF) ? ENABLE : DISABLE;
  6670. vdi_hsize_i= VIP_GetScalerPreScaleH(); //= (reg_adix_che-reg_adix_chs) * 2048 / reg_slr_hfactor
  6671. vdi_vsize= PQ_Get_VDI_VSize(); //= reg_adix_cve-reg_adix_cvs
  6672. vdi_total= vdi_hsize_i*vdi_vsize;
  6673. PQ_MADSetup(vdi_hsize_i, vdi_vsize, vdi_total);
  6674. if(VIP_GetFrameBufferNum() == 1 || VIP_IsATVSource() || VIP_IsSourceDTV())
  6675. {
  6676. PQ_SetFilmMode(DISABLE);
  6677. }
  6678. else
  6679. {
  6680. PQ_2232DetSetup(vdi_total);
  6681. }
  6682. PQ_NERegion(bDemoMode, vdi_hsize_i, vdi_vsize); //NR relative setting
  6683. PQ_NRLevel(pHwContext->nNRLevel, vdi_total);
  6684. if( bMpegNrEnable )
  6685. {
  6686. PQ_MPEGNRLevel(pHwContext->nMPEGNRLevel, vdi_total);
  6687. }
  6688. //Deblock filter
  6689. PQ_DeblockFilterAndDetect(bDemoMode, vdi_hsize_i, vdi_vsize);
  6690. }
  6691. BOOL PQ_CheckTableCheckSum(UINT8* pVipTable)
  6692. {
  6693. PQ_TABLE_BOOK* pTableBook= (PQ_TABLE_BOOK*) pVipTable;
  6694. UINT32 ulCheckSum,i;
  6695. ulCheckSum= 0;
  6696. for(i=pTableBook->nChkFrom; i<pTableBook->nChkTo; i++)
  6697. {
  6698. ulCheckSum+= pVipTable[i];
  6699. }
  6700. if(ulCheckSum == pTableBook->nChkSum )
  6701. return TRUE;
  6702. else
  6703. return FALSE;
  6704. }
  6705. void PQ_LoadSettingTable(UINT8* pVipTable, UINT8 ucTableIndex)
  6706. {
  6707. PQ_TABLE_BOOK* pTableBook= (PQ_TABLE_BOOK*) pVipTable;
  6708. UINT32 ulTableOffset,ulTableCount,ulRegister,ulValue,i;
  6709. volatile UINT32* pAddr;
  6710. if( ucTableIndex>=pTableBook->nTotalTable )
  6711. return;
  6712. ulTableOffset= pTableBook->TableIndex[ucTableIndex].nOffset + (UINT32)pVipTable;
  6713. ulTableCount= pTableBook->TableIndex[ucTableIndex].nSize >> 3;
  6714. pAddr= (volatile UINT32*) ulTableOffset;
  6715. for (i=0; i<ulTableCount; i++)
  6716. {
  6717. ulRegister= *pAddr;
  6718. if((ulRegister & PQ_REG_END_OF_SUB_TAB) != PQ_REG_END_OF_SUB_TAB)
  6719. {
  6720. ulValue= *(pAddr+1);
  6721. //PQDebugPrint("%s: i=0x%lx ulRegister=0x%8.8lx ulValue=0x%8.8lx", __FUNCTION__, i, ulRegister, ulValue);
  6722. PQ_RegisterWrite(ulRegister, ulValue);
  6723. //printk("Register:0x%x,Value:0x%x \n",ulRegister,ulValue);
  6724. }
  6725. pAddr+= 2;
  6726. }
  6727. }
  6728. void PQ_DefaultSetting(void)
  6729. {
  6730. UINT8* pVipTable= (UINT8*) SPI_VIPTABLE_SHADOWADDR;
  6731. PQHW_CONTEXT* pHwContext= &PQHwContext;
  6732. UINT8 i;
  6733. //new function since 533
  6734. *(volatile unsigned char*)(0xbe1cddfd)=0x0; // suggest by JengYun 20160713
  6735. /*Some common settings initialize here*/
  6736. //for Constrast
  6737. PQ_RegisterWrite(VIP_reg_dpy_rgb_int, 1);
  6738. //for Saturation
  6739. PQ_RegisterWrite(VIP_reg_dpy_hsv, 0x1);
  6740. //for Hue, Flesh-tone, ColorRegion, Dynamic Constrast
  6741. PQ_RegisterWrite(VIP_reg_dpy_yuv_int, 0x1);
  6742. PQ_RegisterWrite(VIP_reg_dpy_rgn_int, 0x1);
  6743. //PQ_RegisterWrite(VIP_reg_dpy_u_reset, 0x0);
  6744. PQ_RegisterWrite(VIP_reg_dpy_rgb_int, 0);
  6745. if( PQ_CheckTableCheckSum(pVipTable) )
  6746. {
  6747. PQDebugPrint("%s: Load VipTable from flash rom", __FUNCTION__);
  6748. PQ_LoadSettingTable(pVipTable, VTAB_INITIAL_TALBE);
  6749. PQ_LoadSettingValue(pVipTable, VTAB_INITIAL_VALUE);
  6750. for(i=0; i<VTAB_MAX_SOURCE; i++)
  6751. PQ_LoadSettingValue(pVipTable, VTAB_EXTS_YPP_VALUE+i);
  6752. }
  6753. else
  6754. {
  6755. PQDebugPrint("%s: VipTable is not loaded, using default setting.", __FUNCTION__);
  6756. /*Some initial values not adjustable in menu*/
  6757. //Sync Detection range for cnt H-V
  6758. PQ_RegisterWrite(VIP_reg_adi_exts_hs_thd, 0xf);
  6759. PQ_RegisterWrite(VIP_reg_adi_exts_vs_thd, 0x7);
  6760. /*Init Brightness*/
  6761. /*Init Constrast*/
  6762. /*Init Sharpness*/
  6763. //Luma Sharpness filter
  6764. //PQ_RegisterWrite(VIP_reg_dpy_filter_hl_smooth, 0x8); //menu adjust
  6765. //PQ_RegisterWrite(VIP_reg_dpy_filter_hl_sharp, 0x20); //menu adjust
  6766. //PQ_RegisterWrite(VIP_reg_dpy_filter_hl_pivotx, 0x0); //menu adjust
  6767. //PQ_RegisterWrite(VIP_reg_dpy_filter_hl_pivoty, 0x0); //menu adjust
  6768. //PQ_RegisterWrite(VIP_reg_dpy_filter_hl_trans1, 2); //menu adjust
  6769. //PQ_RegisterWrite(VIP_reg_dpy_filter_hl_trans2, -2); //menu adjust
  6770. //PQ_RegisterWrite(VIP_reg_dpy_filter_hl_limit, 0x0); //menu adjust
  6771. //Protect strong vertical edge from jaggy
  6772. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_alpha_th, 0x18);
  6773. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_alpha_trans, 0);
  6774. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_alpha_limit, 0x8);
  6775. //PQ_RegisterWrite(VIP_reg_dpy_filter_hc_smooth, 0x0); //menu adjust
  6776. //PQ_RegisterWrite(VIP_reg_dpy_filter_hc_sharp, 0x10); //menu adjust
  6777. //PQ_RegisterWrite(VIP_reg_dpy_filter_hc_pivotx, 0x0c); //menu adjust
  6778. //PQ_RegisterWrite(VIP_reg_dpy_filter_hc_pivoty, 0x0); //menu adjust
  6779. //PQ_RegisterWrite(VIP_reg_dpy_filter_hc_trans1, 2); //menu adjust
  6780. //PQ_RegisterWrite(VIP_reg_dpy_filter_hc_trans2, -2); //menu adjust
  6781. //PQ_RegisterWrite(VIP_reg_dpy_filter_hc_limit, 0x0);//menu adjust
  6782. //PQ_RegisterWrite(VIP_reg_dpy_filter_vl_pivotx, 0x0); //menu adjust
  6783. //PQ_RegisterWrite(VIP_reg_dpy_filter_vl_pivoty, 0x0); //menu adjust
  6784. //PQ_RegisterWrite(VIP_reg_dpy_filter_vl_smooth, 0x8); //menu adjust
  6785. //PQ_RegisterWrite(VIP_reg_dpy_filter_vl_sharp, 0x8); //menu adjust
  6786. //PQ_RegisterWrite(VIP_reg_dpy_filter_vl_trans1, 2); //menu adjust
  6787. //PQ_RegisterWrite(VIP_reg_dpy_filter_vl_trans2, -2); //menu adjust
  6788. //PQ_RegisterWrite(VIP_reg_dpy_filter_vl_limit, 0x0); //menu adjust
  6789. //PQ_RegisterWrite(VIP_reg_dpy_filter_vl_hp_limit, 0x14); //menu adjust
  6790. //PQ_RegisterWrite(VIP_reg_dpy_filter_vc_smooth, 0x0); //menu adjust
  6791. //PQ_RegisterWrite(VIP_reg_dpy_filter_vc_sharp, 0x10); //menu adjust
  6792. //PQ_RegisterWrite(VIP_reg_dpy_filter_vc_pivotx, 0x0c); //menu adjust
  6793. //PQ_RegisterWrite(VIP_reg_dpy_filter_vc_pivoty, 0x0); //menu adjust
  6794. //PQ_RegisterWrite(VIP_reg_dpy_filter_vc_trans1, 2); //menu adjust
  6795. //PQ_RegisterWrite(VIP_reg_dpy_filter_vc_trans2, -2);//menu adjust
  6796. //PQ_RegisterWrite(VIP_reg_dpy_filter_vc_limit, 0x0); //menu adjust
  6797. PQ_RegisterWrite(VIP_reg_dpy_filter_chroma, 0x1);
  6798. //VIP_ProgramColorProcess() setup this
  6799. //PQ_RegisterWrite(VIP_reg_dpy_filter_y_h1, 0x78);
  6800. //PQ_RegisterWrite(VIP_reg_dpy_filter_y_h2, 0x8);
  6801. //PQ_RegisterWrite(VIP_reg_dpy_filter_y_h3, 0x0);
  6802. //PQ_RegisterWrite(VIP_reg_dpy_filter_y_h4, 0x4);
  6803. //PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h1, 0x78);
  6804. //PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h2, 0x8);
  6805. //PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h3, 0x0);
  6806. //PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h4, 0x4);
  6807. //PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h1, 0x78);
  6808. //PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h2, 0x8);
  6809. //PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h3, 0x0);
  6810. //PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h4, 0x4);
  6811. //VIP_ProgramColorProcess() setup this
  6812. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h1, 0x778);
  6813. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h2, 0x3a);
  6814. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h3, 0xb);
  6815. PQ_RegisterWrite(VIP_reg_dpy_filter_y_h4, 0x7fb);
  6816. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h1, 0x778);
  6817. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h2, 0x3a);
  6818. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h3, 0xb);
  6819. PQ_RegisterWrite(VIP_reg_dpy_filter_cb_h4, 0x7fb);
  6820. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h1, 0x778);
  6821. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h2, 0x3a);
  6822. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h3, 0xb);
  6823. PQ_RegisterWrite(VIP_reg_dpy_filter_cr_h4, 0x7fb);
  6824. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_smooth1, 64); //menu adjust
  6825. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_sharp, 64); //menu adjust
  6826. PQ_RegisterWrite(VIP_reg_dpy_filter_hc_smooth1, 64); //menu adjust
  6827. PQ_RegisterWrite(VIP_reg_dpy_filter_hc_sharp, 64); //menu adjust
  6828. /*Init Dynamic Contrast */
  6829. //PQ_RegisterWrite(VIP_reg_dpy_hist_en,DISABLE);
  6830. //PQ_RegisterWrite(VIP_reg_dpy_hist_dyn_bp, 0x0);
  6831. PQ_RegisterWrite(VIP_reg_dpy_hist_int, ENABLE);
  6832. PQ_RegisterWrite(VIP_reg_dpy_hist_chroma_en, 0x1);
  6833. }
  6834. PQ_3DNoiseReductoin(OFF, 0, 0);
  6835. PQ_MPEGNoiseReductoin(OFF,0,0);
  6836. PQ_RegisterWrite(VIP_reg_dpy_u_reset, 0x0);
  6837. pHwContext->LoadPQTable=1;
  6838. //330
  6839. PQ_Default_Color_Lut_Setting();
  6840. PQ_RegisterWrite(VIP_reg_dpy_first_layer, 3);
  6841. }
  6842. //================================================================================
  6843. // function name : PQ_VideoDetectionSetup
  6844. // input parameter :
  6845. // output parameter : none
  6846. // purpose : setup vdi control register
  6847. // return : none
  6848. void PQ_VideoDetectionSetup(UINT8 ucSource, UINT8 ucSubSource, BOOL bFunctionEnable)
  6849. {
  6850. PQHW_CONTEXT* pHwContext= &PQHwContext;
  6851. UINT32 vdi_hsize_i,vdi_vsize,vdi_total;
  6852. BOOL bDemoMode,bNrEnable,bMpegNrEnable,bATVSource,bPCSource;
  6853. BOOL bTNRForChroma= TRUE;
  6854. BOOL bDeblockEnable;
  6855. PQDebugPrint("%s: InterlaceMode=%d", __FUNCTION__, VIP_GetInterlaceMode());
  6856. PQ_RegisterWrite(VIP_reg_vdi_reset, 1);
  6857. //deinterlace setup
  6858. if(VIP_GetInterlaceMode())
  6859. {
  6860. PQ_RegisterWrite(VIP_reg_vdi_interlace, 1);
  6861. }
  6862. else
  6863. {
  6864. PQ_RegisterWrite(VIP_reg_vdi_interlace, 0);
  6865. }
  6866. PQ_RegisterWrite(VIP_reg_vdi_bypass, bFunctionEnable ? 0 : 1); //always open in 9561
  6867. //if(pHwContext->cInterlaceMode==0){PQ_RegisterWrite(VIP_reg_gfx_buf_bypass,1);}
  6868. PQ_RegisterWrite(VIP_reg_gfx_buf_bypass,0);
  6869. if( bFunctionEnable )
  6870. {
  6871. bATVSource= (ucSource==CVD2) && (ucSubSource==TV_INPUT_CHANNEL);
  6872. bPCSource= (ucSource==EXTS) && (ucSubSource==DSUB);
  6873. //2008.12.11, Emily: 1080i/p is disabled, either.
  6874. //bMrd_4prev1= (VIP_GetInterlaceMode() && VIP_GetInputVSize()<1080) ? ENABLE : DISABLE;
  6875. //disable TNRForChroma if v prescalling down is used or pixelclock is too large.
  6876. //2008-12-15 Add condiction-PC/DVI close TNR
  6877. /*
  6878. #if 0
  6879. bTNRForChroma= TRUE;
  6880. #else
  6881. bTNRForChroma= (DRV_SLR_GetConfig() == eSLR_CONFIG_PRE_6HV_POST_H) &&
  6882. (VIP_GetSourcePixelClock()<110000000) &&
  6883. (VIP_GetInputDataFormat()!=RGB)
  6884. ? ENABLE : DISABLE;
  6885. #endif
  6886. if((ucSource==MPEG)&&(VIP_GetInputVSize()>576))
  6887. bTNRForChroma=DISABLE;
  6888. if((VIP_GetCHIP_ID() & 0xff)>0x30 && VIP_GetUserSource() == SOURCE_MPEG)
  6889. bTNRForChroma=DISABLE;
  6890. if((VIP_GetCHIP_ID() & 0xff)==0x30 && VIP_GetInputVSize()>720)// for insufficient bandwidth
  6891. bTNRForChroma=DISABLE;
  6892. else if(VIP_IsAVSource())
  6893. bTNRForChroma=DISABLE;
  6894. */
  6895. //Chroma TNR always Enable (DTV 1080i Disable)
  6896. if( (ucSource==MPEG) && (VIP_GetInputVSize()>720) && VIP_GetInterlaceMode())
  6897. bTNRForChroma=DISABLE;
  6898. else
  6899. bTNRForChroma=ENABLE;
  6900. bDemoMode= PQ_RegisterRead(VIP_reg_vdi_tnr_debug_en);
  6901. bNrEnable= (pHwContext->nNRLevel>OFF) ? ENABLE :DISABLE;
  6902. bMpegNrEnable= (pHwContext->nMPEGNRLevel>OFF) ? ENABLE : DISABLE;
  6903. bDeblockEnable= (!VIP_IsPCSource()) && (!VIP_RunDVIMode()) && (VIP_GetInputResMode()!=RESMODE_NON_STD);
  6904. vdi_hsize_i= VIP_GetScalerPreScaleH(); //= (reg_adix_che-reg_adix_chs) * 2048 / reg_slr_hfactor
  6905. vdi_vsize= PQ_Get_VDI_VSize(); //= reg_adix_cve-reg_adix_cvs
  6906. vdi_total= vdi_hsize_i*vdi_vsize;
  6907. //0x6000
  6908. //PQ_RegisterWrite(VIP_reg_vdi_reset, 0);
  6909. PQ_RegisterWrite(VIP_reg_vdi_mrd_en, 1);
  6910. PQ_RegisterWrite(VIP_reg_vdi_nomrd_4prev1, VIP_GetInterlaceMode()?0:1);
  6911. //PQ_RegisterWrite(VIP_reg_vdi_interlace, pHwContext->cInterlaceMode);
  6912. PQ_RegisterWrite(VIP_reg_vdi_take_m32, 0);
  6913. PQ_RegisterWrite(VIP_reg_vdi_take_m22, 0);
  6914. //PQ_RegisterWrite(VIP_reg_vdi_pause_en, 0); //VIP_InputFreeze() setup this
  6915. //0x6001
  6916. //Rule 1:
  6917. //If NR is off, disable all except MAD.
  6918. //If NR is on, enable all for Interlace mode.
  6919. //Disable MAD, but keep deblock and mosquito detection active for progressive mode.
  6920. //So 0x6001[2] = vdi_interlace, Others = nr_on
  6921. //Rule 2:
  6922. //Noise Reduction On/Off : 6001[0], 6001[3,4], 6002[3]
  6923. //MPEG Noise Reduction On/Off : 6001[1], 6001[6]
  6924. #ifdef ADJUST_NR_By_Yavg
  6925. if (VIP_GetUserSource()!= SOURCE_HDMI && VIP_GetUserSource()!= SOURCE_MPEG)
  6926. bNrEnable = ENABLE;
  6927. #endif
  6928. //#if(CONFIG_DRAMSIZE == 64)
  6929. if(VIP_IsPCSource() || VIP_RunDVIMode())
  6930. bNrEnable=DISABLE;
  6931. //#endif
  6932. PQ_RegisterWrite(VIP_reg_vdi_tnr_en, bNrEnable); //always enable in ATV, AV
  6933. PQ_RegisterWrite(VIP_reg_vdi_dbk_en, bMpegNrEnable && bDeblockEnable); //PC-2008-12-18
  6934. #ifdef VIP_SCALER_3D
  6935. if(VIP_GetInput3dType() == INPUT_3D_INTERLEAVING)
  6936. PQ_RegisterWrite(VIP_reg_vdi_mad_en,DISABLE);
  6937. else
  6938. #endif
  6939. PQ_RegisterWrite(VIP_reg_vdi_mad_en, VIP_GetInterlaceMode() ? ENABLE: DISABLE);
  6940. PQ_RegisterWrite(VIP_reg_vdi_snr_hfil_en, bNrEnable);
  6941. PQ_RegisterWrite(VIP_reg_vdi_snr_vfil_en, bNrEnable);
  6942. if(ucSource==CVD2)
  6943. PQ_RegisterWrite(VIP_reg_vdi_sigmanr_en,0);//to reduce edge for CVD2 2009-03-09 requested by PC/Henry
  6944. else
  6945. PQ_RegisterWrite(VIP_reg_vdi_sigmanr_en, bNrEnable);
  6946. PQ_RegisterWrite(VIP_reg_vdi_sigmanr_opt1, 1);
  6947. //2008-12-15 PC/DVI close MBW
  6948. #if 0
  6949. if(pHwContext->cInputDataFormat==RGB && !bPCSource )
  6950. #else
  6951. if((VIP_GetInputDataFormat()==RGB) || bPCSource )
  6952. #endif
  6953. PQ_RegisterWrite(VIP_reg_vdi_mnr_fil_en, 0);
  6954. else
  6955. PQ_RegisterWrite(VIP_reg_vdi_mnr_fil_en, bMpegNrEnable);
  6956. //0x6002
  6957. if ((ucSource==SOURCE_EXTS) && PQ_GET_YUV_Datat_Formal()<3)
  6958. {
  6959. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_en, DISABLE);
  6960. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_en, DISABLE);
  6961. }
  6962. else
  6963. {
  6964. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_en, bTNRForChroma); //disable this can save memory bandwidth
  6965. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_en, bTNRForChroma);
  6966. }
  6967. PQ_RegisterWrite(VIP_reg_vdi_mad_loa_en, 1);
  6968. PQ_MADSetup(vdi_hsize_i, vdi_vsize, vdi_total);
  6969. if(VIP_GetFrameBufferNum() == 1 || VIP_IsATVSource() || VIP_IsSourceDTV())
  6970. {
  6971. PQ_SetFilmMode(DISABLE);
  6972. }
  6973. else
  6974. {
  6975. PQ_2232DetSetup(vdi_total);
  6976. }
  6977. PQ_NERegion(bDemoMode, vdi_hsize_i, vdi_vsize); //NR relative setting
  6978. PQ_NRLevel(pHwContext->nNRLevel, vdi_total);
  6979. if( bMpegNrEnable )
  6980. {
  6981. PQ_MPEGNRLevel(pHwContext->nMPEGNRLevel, vdi_total);
  6982. }
  6983. //TNR, SNR adjust by NE
  6984. //0x6020=0x2f
  6985. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_dyn_adj, 1);
  6986. PQ_RegisterWrite(VIP_reg_vdi_tnr_th_dyn_adj, 1);
  6987. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_dith_en, 1);
  6988. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_mbw_en, 0);
  6989. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_sel, 1);
  6990. PQ_RegisterWrite(VIP_reg_vdi_tnr_7tap, 0);
  6991. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_sel, 0);
  6992. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_dyn_adj, VIP_GetInputVSize()<720?0:1);
  6993. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_low_en, 1);
  6994. PQ_RegisterWrite(VIP_reg_vdi_tnr_ultra_mbw_en, 1);
  6995. //6100=0x17
  6996. #if 0
  6997. if(VIP_IsPCSource())
  6998. {
  6999. PQ_RegisterWrite(VIP_reg_vdi_snr_adj_en,1);
  7000. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_en, 1);
  7001. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_lp_en, 1);
  7002. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_bmax_sel, 1);
  7003. PQ_RegisterWrite(VIP_reg_vdi_snr_hor_mix_en, 1);
  7004. }
  7005. else
  7006. #endif
  7007. {
  7008. PQ_RegisterWrite(VIP_reg_vdi_snr_adj_en,1);
  7009. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_lp_en, 1);
  7010. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_bmax_sel, 0);
  7011. PQ_RegisterWrite(VIP_reg_vdi_snr_hor_mix_en, 1);
  7012. }
  7013. PQ_RegisterWrite(VIP_reg_vdi_tnr_th1_s, 9);
  7014. //0x6032, 0x6035, 0x6026,
  7015. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s, 1);
  7016. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s, 1);
  7017. //0x6036~0x603a //x
  7018. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_th1_s, 10);
  7019. PQ_RegisterWrite(VIP_reg_vdi_snr_h_fact0, 0x08);
  7020. PQ_RegisterWrite(VIP_reg_vdi_snr_h_fact1, 0x04);
  7021. PQ_RegisterWrite(VIP_reg_vdi_snr_h_fact2, 0x00); //Lee Sir-2009-02-10
  7022. PQ_RegisterWrite(VIP_reg_vdi_snr_filter_sel_slope, bATVSource ? 0x3c : 0x20); //Lee Sir-2009-02-10
  7023. PQ_RegisterWrite(VIP_reg_vdi_sigmanr_strength, bATVSource ? 0x4 : 0x3); //Lee Sir-2009-02-10
  7024. PQ_RegisterWrite(VIP_reg_vdi_tnr_th1_s, 0);
  7025. PQ_RegisterWrite(VIP_reg_vdi_snr_ultra_low_bmax_sel, 1);
  7026. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope, VIP_GetInputVSize()<720?79:0x7f);
  7027. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_s, VIP_GetInputVSize()<720?3:2);
  7028. PQ_RegisterWrite(VIP_reg_vdi_tnrz_slope_s, VIP_GetInputVSize()<720?3:2);
  7029. PQ_RegisterWrite(VIP_reg_vdi_tnr_slope_chroma, VIP_GetUserSource()==SOURCE_CVD2?31:48);
  7030. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_th1_s, 0);
  7031. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_slope_s, 2);
  7032. PQ_RegisterWrite(VIP_reg_vdi_snr_strong_edge_th, VIP_GetInputVSize()<720?0x60:0);
  7033. //Deblock filter
  7034. PQ_DeblockFilterAndDetect(bDemoMode, vdi_hsize_i, vdi_vsize);
  7035. //MNR filter
  7036. PQ_RegisterWrite(VIP_reg_vdi_mad_mnr_hedge_th, 80);
  7037. PQ_RegisterWrite(VIP_reg_vdi_mad_mnr_vedge_th, 80);
  7038. PQ_RegisterWrite(VIP_reg_vdi_mad_mnr_3pixdet_en, 1);
  7039. PQ_RegisterWrite(VIP_reg_vdi_mad_mnr_hexpn_en, 1);
  7040. }
  7041. VIP_SetVDIMode();
  7042. PQ_RegisterWrite(VIP_reg_vdi_reset, 0);
  7043. PQ_RegisterWrite(VIP_reg_vdi_sigmanr_factor,2);//2009-07-14 yuling adjust the factor to pass some ADC pattern shake issue.
  7044. #if CONFIG_CHIPID == 0x533
  7045. /*20160706 for JunYun request to add reg control tnr en*/
  7046. //if(((PQ_RegisterRead(VIP_reg_picx_dummyf)&0xff)>>4)==3)
  7047. PQ_RegisterWrite(VIP_reg_gfx_dummy2, 0);
  7048. if(VIP_GetBWModeStatus())
  7049. {
  7050. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_en, DISABLE);
  7051. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_en, DISABLE);
  7052. PQ_RegisterWrite(VIP_reg_vdi_mad_tpc_en, DISABLE);
  7053. //PQ_RegisterWrite(VIP_reg_gfx_dummy2,0x2); // 533 A1 if bypass and tnrc disable, reduce chroma bandwidth setting
  7054. }
  7055. #endif
  7056. }
  7057. void PQ_SetMenuValue(UINT8 ucFunID, INT32 iValue)
  7058. {
  7059. PQHW_CONTEXT* pHwContext= &PQHwContext;
  7060. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  7061. INT32* pMenuValueArray= (INT32*) (&pHwContext->MenuValue);
  7062. if( ucFunID<=PQ_HUE )
  7063. {
  7064. pMenuValueArray[ucFunID-PQ_BRIGHTNESS]= iValue;
  7065. #ifdef DynamicBacklight_EnergyEfficiency
  7066. if(ucFunID - PQ_BRIGHTNESS == PQ_CONTRAST)
  7067. {
  7068. if(PQ_GetDynamicBLType()==DYNAMIC_BL_ENERGY_EFFICIENCY)
  7069. PQ_EEBackLightDetect(TRUE);
  7070. }
  7071. #endif
  7072. }
  7073. else if( ucFunID>=PQ_CT_R_GAIN && ucFunID<=PQ_CT_B_GAIN )
  7074. {
  7075. pMenuValue->iColorTemp[ucFunID-PQ_CT_R_GAIN]= iValue;
  7076. }
  7077. else if( ucFunID>=PQ_CT_R_BIAS && ucFunID<=PQ_CT_B_BIAS )
  7078. {
  7079. pMenuValue->iColorBias[ucFunID-PQ_CT_R_BIAS]= iValue;
  7080. }
  7081. else if( ucFunID==PQ_DYNAMIC_CONTRAST )
  7082. {
  7083. pMenuValue->ucDCLevel= iValue;
  7084. }
  7085. else if( ucFunID==PQ_STATIC_GAMMA )
  7086. {
  7087. pMenuValue->cSGOffset= iValue;
  7088. }
  7089. else if( ucFunID==PQ_DIGITAL_NR )
  7090. {
  7091. pMenuValue->ucNRLevel= iValue;
  7092. }
  7093. else if( ucFunID==PQ_MPEG_NOISE_FILTER )
  7094. {
  7095. pMenuValue->ucMPEGNRLevel= iValue;
  7096. }
  7097. else if( ucFunID==PQ_GAMMATABLE)
  7098. {
  7099. if (iValue == 0xff)
  7100. pMenuValue->bNoGamma=TRUE;
  7101. else
  7102. pMenuValue->bNoGamma=FALSE;
  7103. }
  7104. }
  7105. void PQ_SourceSetting(UINT8 ucSource, UINT8 ucSubSource)
  7106. {
  7107. PQHW_CONTEXT* pHwContext= &PQHwContext;
  7108. VTAB_SRC_VALUE_DEFINE* pVtab= PQ_GetSourceVTab(ucSource, ucSubSource);
  7109. VTAB_CMN_VALUE_DEFINE* pVtabCmnValue= &pHwContext->VtabCmnValue;
  7110. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  7111. #ifndef MENU_SET_ENHANCED_COLOR
  7112. INT8 cSG;
  7113. #endif
  7114. //PQ_DLC_SRC bPq_Index;
  7115. pHwContext->PqPatch.Post2DPatch = POST_2D_SHARPNESS_DEFAULT;
  7116. //printk(KERN_EMERG"ucSource=%d ucSubSource=%d\n",ucSource, ucSubSource);
  7117. //VIP_IsAVSource()= (ucSource==CVD2) && ((ucSubSource==AV1_INPUT_CHANNEL)|(ucSubSource==AV2_INPUT_CHANNEL));
  7118. pHwContext->pCurVtabSrcValue= pVtab;
  7119. //printk(KERN_EMERG"VIP_IsAVSource()=%d\n",VIP_IsAVSource());
  7120. #ifndef MENU_SET_ENHANCED_COLOR
  7121. //some enhanced setting not appearing in menu are setup here
  7122. pHwContext->nMPEGNRLevel= MEDIUM;
  7123. pHwContext->bNR_Reset_by_changeSrc = TRUE;
  7124. cSG= 0;
  7125. PQ_ColorSpaceMode(PQ_COLOR_SPACE_AUTO, ucSource);
  7126. PQ_SetMenuValue(PQ_MPEG_NOISE_FILTER, MEDIUM);
  7127. PQ_SetMenuValue(PQ_STATIC_GAMMA, cSG);
  7128. #endif
  7129. if (pVtabCmnValue->mGmaOpt.pc_no_gamma)
  7130. {
  7131. if (VIP_RunDVIMode() || VIP_IsPCSource())
  7132. {
  7133. PQDebugPrint("VTab, PC or DVI Turn off Gamma correction.");
  7134. PQ_RegisterWrite(VIP_reg_dpy_no_gamma, ENABLE); //disable gamma function
  7135. }
  7136. else
  7137. {
  7138. PQ_RegisterWrite(VIP_reg_dpy_no_gamma, pMenuValue->bNoGamma);
  7139. }
  7140. }
  7141. //bPq_Index = VIP_Get_PQ_Source(ucSource,ucSubSource);
  7142. //printk("SOURCE=%d \n",bPq_Index);
  7143. //#ifdef VIP_SW_DC
  7144. #if 1
  7145. PQ_SW_DynamicContrast_Param(0);
  7146. #endif
  7147. PQ_Set_UV_Coring();
  7148. PQ_SetFuzzyEliminate(DISABLE);
  7149. ucVDI_Static_Cnt_2 = 0; //reset after change source
  7150. PQ_SetColorBarFnFlag(DISABLE);
  7151. }
  7152. void PQ_SourceSelect(UINT8 ucUserInputSource)
  7153. {
  7154. //Default Value_331
  7155. PQ_RegisterWrite(VIP_reg_slr_yout_lw_limit ,0x0);
  7156. switch(ucUserInputSource)
  7157. {
  7158. case SOURCE_MPEG:
  7159. break;
  7160. case SOURCE_CVD2:
  7161. PQ_RegisterWrite(VIP_reg_slr_yout_lw_limit ,0x40);
  7162. break;
  7163. case SOURCE_HDMI:
  7164. break;
  7165. case SOURCE_EXTS:
  7166. break;
  7167. case SOURCE_PATTERN:
  7168. break;
  7169. case SOURCE_JPEG:
  7170. break;
  7171. }
  7172. }
  7173. void PQ_DPYSetup(UINT8 ucUserSource,UINT8 ucSubSource)
  7174. {
  7175. PQ_SetupLUTTable(ENABLE);
  7176. PQ_SetupSaturationGainCurve(ENABLE);
  7177. //sharp if dbk
  7178. PQ_RegisterWrite(VIP_reg_dpy_hfil_dbk_ctl,VIP_IsAVSource()?1:0);
  7179. PQ_RegisterWrite(VIP_reg_dpy_half_dbk_opt,VIP_IsAVSource()?1:2);
  7180. PQ_RegisterWrite(VIP_reg_dpy_filter_hl_sharp_dbk, VIP_IsAVSource()?0x20:0);
  7181. PQ_RegisterWrite(VIP_reg_dpy_filter_hc_sharp_dbk, VIP_IsAVSource()?0x20:0);
  7182. #if 0
  7183. //for bonnie request to avoid color noise in atv
  7184. PQ_RegisterWrite(VIP_reg_dpy_uv_coring_th,VIP_IsATVSource()?7:4);
  7185. #endif
  7186. }
  7187. void PQ_EnNRWorkQue_ISR(void)
  7188. {
  7189. PQHW_CONTEXT* pHwContext = &PQHwContext;
  7190. if (pHwContext->bSceneChg)
  7191. queue_work(WQ_Struct_NRAdjust,&WQ_NRAdjust);
  7192. else
  7193. {
  7194. if((++pHwContext->iAdjustNRCounter)>=0) //250
  7195. {
  7196. pHwContext->iAdjustNRCounter = 0;
  7197. queue_work(WQ_Struct_NRAdjust,&WQ_NRAdjust);
  7198. }
  7199. }
  7200. }
  7201. INT32 PQ_GetMenuHueValue(void)
  7202. {
  7203. PQHW_CONTEXT* pHwContext = &PQHwContext;
  7204. return pHwContext->MenuValue.iHue;
  7205. }
  7206. void PQ_SetLocationMode(UINT8 ucMode)
  7207. {
  7208. PQHW_CONTEXT* pHwContext= &PQHwContext;
  7209. pHwContext->ucLocationMode = ucMode;
  7210. }
  7211. void PQ_SetCurrContrastValue(INT32 iValue)
  7212. {
  7213. PQHW_CONTEXT* pHwContext = &PQHwContext;
  7214. pHwContext->iCurrContrastValue = iValue;
  7215. }
  7216. INT32 PQ_GetCurrContrastValue(void)
  7217. {
  7218. PQHW_CONTEXT* pHwContext = &PQHwContext;
  7219. return pHwContext->iCurrContrastValue;
  7220. }
  7221. void PQ_AdjustNRCounter_ISR(INT32 AdjustNRCounter)
  7222. {
  7223. PQHW_CONTEXT* pHwContext= &PQHwContext;
  7224. pHwContext->iAdjustNRCounter = AdjustNRCounter;
  7225. }
  7226. INT32 PQ_GetMenuColorBias(UINT8 index)
  7227. {
  7228. PQHW_CONTEXT* pHwContext= &PQHwContext;
  7229. return pHwContext->MenuValue.iColorBias[index];
  7230. }
  7231. void PQ_SetColorProcessor(BOOL bEnable)
  7232. {
  7233. PQHW_CONTEXT* pHwContext= &PQHwContext;
  7234. pHwContext->bEnableColorProcess= bEnable;
  7235. }
  7236. BOOL PQ_GetColorProcessor(void)
  7237. {
  7238. PQHW_CONTEXT* pHwContext= &PQHwContext;
  7239. return pHwContext->bEnableColorProcess;
  7240. }
  7241. BOOL PQ_GetMatrixbypassCtl(void)
  7242. {
  7243. PQHW_CONTEXT* pHwContext= &PQHwContext;
  7244. return pHwContext->ucMatrixbypassCtl;
  7245. }
  7246. UINT8 PQ_Get_Source_Grouped_Index(void)
  7247. {
  7248. UINT8 ucCurrSrcIndex=SRC_INDEX_UNKNOWN;
  7249. UINT8 ucNTSC;
  7250. UINT8 ucUserSource;
  7251. UINT8 ucSubSource;
  7252. UINT8 bDVDSource;
  7253. bDVDSource = VIP_JudgeDVDSource();//Differentiate YPbPr and DVD
  7254. VIP_GetSource(&ucUserSource, &ucSubSource);
  7255. switch(VIP_GetUserSource())
  7256. {
  7257. case SOURCE_CVD2:
  7258. ucNTSC = (VIP_GetStdColorSystem() == CVD2_STD_NTSC_M || VIP_GetStdColorSystem() == CVD2_STD_NTSC_443);
  7259. if (VIP_IsATVSource())
  7260. {
  7261. if (ucNTSC)
  7262. {
  7263. ucCurrSrcIndex = SRC_INDEX_ATV_NTSC;
  7264. }
  7265. else
  7266. {
  7267. ucCurrSrcIndex = SRC_INDEX_ATV_PAL;
  7268. }
  7269. }
  7270. else if (VIP_IsAVSource())
  7271. {
  7272. if (ucNTSC)
  7273. {
  7274. ucCurrSrcIndex = SRC_INDEX_AV_NTSC;
  7275. }
  7276. else
  7277. {
  7278. ucCurrSrcIndex = SRC_INDEX_AV_PAL;
  7279. }
  7280. }
  7281. else if (VIP_IsSVSource())
  7282. {
  7283. if (ucNTSC)
  7284. {
  7285. ucCurrSrcIndex = SRC_INDEX_SVideo_NTSC;
  7286. }
  7287. else
  7288. {
  7289. ucCurrSrcIndex = SRC_INDEX_SVideo_PAL;
  7290. }
  7291. }
  7292. break;
  7293. case SOURCE_EXTS:
  7294. if (VIP_IsPCSource())
  7295. {
  7296. ucCurrSrcIndex = SRC_INDEX_PC;
  7297. }
  7298. else if(ucSubSource==SCART_RGB1)
  7299. {
  7300. ucCurrSrcIndex = SRC_INDEX_SCART_RGB;
  7301. }
  7302. else
  7303. {
  7304. /* tune for ypp source */
  7305. if(bDVDSource)
  7306. {
  7307. ucCurrSrcIndex = SRC_INDEX_DVD;
  7308. }
  7309. else
  7310. {
  7311. if (VIP_GetInputVSize()>576+24) /* safer boundary */
  7312. {
  7313. ucCurrSrcIndex = SRC_INDEX_Component_HD;
  7314. }
  7315. else
  7316. {
  7317. ucCurrSrcIndex = SRC_INDEX_Component_SD;
  7318. }
  7319. }
  7320. }
  7321. break;
  7322. case SOURCE_HDMI:
  7323. if (VIP_RunDVIMode())
  7324. {
  7325. ucCurrSrcIndex = SRC_INDEX_DVI;
  7326. }
  7327. else
  7328. {
  7329. if(VIP_GetInputVSize()>576+24) /* safer boundary */
  7330. {
  7331. ucCurrSrcIndex = SRC_INDEX_HDMI_HD;
  7332. }
  7333. else
  7334. {
  7335. ucCurrSrcIndex = SRC_INDEX_HDMI_SD;
  7336. }
  7337. break;
  7338. }
  7339. break;
  7340. case SOURCE_MPEG:
  7341. if(VIP_GetInputVSize()>576+24) /* safer boundary */
  7342. {
  7343. ucCurrSrcIndex = SRC_INDEX_DTV_HD;
  7344. }
  7345. else
  7346. {
  7347. ucCurrSrcIndex = SRC_INDEX_DTV_SD;
  7348. }
  7349. break;
  7350. case SOURCE_JPEG:
  7351. case SOURCE_PATTERN:
  7352. ucCurrSrcIndex = SRC_INDEX_JPEG;
  7353. break;
  7354. }
  7355. return ucCurrSrcIndex;
  7356. }
  7357. #ifdef CONFIG_COLORLUT_14_COLOR
  7358. #define COLORLUT_RGN_NUM 14
  7359. #elif defined(CONFIG_COLORLUT_10_COLOR)
  7360. #define COLORLUT_RGN_NUM 10
  7361. #else
  7362. #define COLORLUT_RGN_NUM 7
  7363. #endif
  7364. #define LUT_HEAD_ID 0x54554c //T=0x54 U=0x55 L=0x4c
  7365. #define m_Global_S_offset 8
  7366. static UINT8 lut_rgn_hue_min[COLORLUT_RGN_NUM] = {0};
  7367. static UINT8 lut_rgn_hue_max[COLORLUT_RGN_NUM] = {0};
  7368. static UINT8 lut_rgn_sat_min[COLORLUT_RGN_NUM] = {0};
  7369. static UINT8 lut_rgn_sat_max[COLORLUT_RGN_NUM] = {0};
  7370. static UINT8 lut_rgn_y_min[COLORLUT_RGN_NUM] = {0};
  7371. static UINT8 lut_rgn_y_max[COLORLUT_RGN_NUM] = {0};
  7372. static UINT8 lut_rgn_en[COLORLUT_RGN_NUM] = {0};
  7373. static INT8 lut_rgn_hue_gain[COLORLUT_RGN_NUM] = {0};
  7374. static INT8 lut_rgn_sat_gain[COLORLUT_RGN_NUM] = {0};
  7375. static INT8 lut_rgn_y_gain[COLORLUT_RGN_NUM] = {0};
  7376. static UINT8 lut_smooth_level = 0;//0~100
  7377. static UINT8 lut_make[COLORLUT_RGN_NUM] = {0};
  7378. void PQ_Default_Color_Lut_Setting(void)
  7379. {
  7380. INT32 i;
  7381. volatile UINT8 * pLUT = (volatile UINT8*) SPI_COLORLUTTABLE_SHADOWADDR;
  7382. PLUTTable pLUTTable = (PLUTTable) pLUT;
  7383. if (*(UINT8*)0xbe000005>=0x30) //chip ver.
  7384. return;
  7385. PQ_RegisterWrite(VIP_reg_dpy_yuv_lut_en, 1);
  7386. PQ_RegisterWrite(VIP_reg_dpy_first_layer, 0);
  7387. PQ_RegisterWrite(VIP_reg_dpy_outer_index, 0);
  7388. if(pLUTTable->HueScale==1)
  7389. PQ_RegisterWrite(VIP_reg_dpy_diff_level, 0x41);
  7390. else
  7391. PQ_RegisterWrite(VIP_reg_dpy_diff_level, 0x40);
  7392. PQ_RegisterWrite(VIP_reg_dpy_sat_outer_min, 0xa0);
  7393. PQ_RegisterWrite(VIP_reg_dpy_sat_inner_min, 0xa0);
  7394. PQ_RegisterWrite(VIP_reg_dpy_rgn_addr, 0x0);
  7395. //add init lut value, because not all lut reg will use.
  7396. for(i=0; i< 7936; i++)
  7397. {
  7398. PQ_RegisterWrite(VIP_reg_dpy_rgn_data, 0);//COLOR_LUTABLE[i]);
  7399. }
  7400. }
  7401. int GetHwAddr(int HValue,int SValue,int YValue,int AddrOffset,int type)
  7402. {
  7403. int Addr=0;
  7404. //TRACE("H=%d S=%d Y=%d",HValue,SValue,YValue);
  7405. if(type==1)
  7406. {
  7407. Addr = HValue + (SValue<<4) + (96*YValue);
  7408. if(Addr>767)
  7409. Addr = 767;
  7410. }
  7411. else if(type==2)
  7412. {
  7413. Addr = HValue + (SValue<<4) + (80*YValue);
  7414. if(Addr>639)
  7415. Addr = 639;
  7416. }
  7417. Addr = (AddrOffset << 10) | Addr;
  7418. return Addr;
  7419. }
  7420. void GetHueMapValue(int Index,int *index_hue_e,int *index_hue_o,int *hue_e)
  7421. {
  7422. int HueValue;
  7423. int index_hue;
  7424. int BaseHueValue=45;
  7425. if(Index>31)
  7426. Index=Index-32;
  7427. HueValue = Index*BaseHueValue;
  7428. index_hue=(HueValue*91+32)/4096;
  7429. *hue_e = (index_hue%2 ==0) ?1 :0;
  7430. if(index_hue>=31)
  7431. *index_hue_e=0;
  7432. else if(*hue_e==0)
  7433. *index_hue_e = (index_hue+1)/2;
  7434. else
  7435. *index_hue_e = index_hue/2;
  7436. if(index_hue>=32)
  7437. *index_hue_o=15;
  7438. else
  7439. *index_hue_o= index_hue/2;
  7440. }
  7441. void GetLumaMapValue(int Index,int *index_luma_e,int *index_luma_o,int *luma_e)
  7442. {
  7443. int LumaValue;
  7444. int index_luma;
  7445. int BaseLumaValue=64;
  7446. LumaValue = (Index+1)*BaseLumaValue;
  7447. if(LumaValue>1023)
  7448. LumaValue=1023;
  7449. index_luma = LumaValue/64;
  7450. *luma_e = (index_luma%2 ==0) ?1 :0;
  7451. if(*luma_e==0)
  7452. *index_luma_e = (index_luma+1)/2 - 1;
  7453. else
  7454. *index_luma_e = index_luma/2 - 1;
  7455. *index_luma_o = index_luma/2;
  7456. }
  7457. void GetSatMapValue(int Index,int *index_sat_e,int *index_sat_o,int *sat_e)
  7458. {
  7459. int SatValue;
  7460. int index_sat;
  7461. int BaseSatValue=64;
  7462. SatValue = Index*BaseSatValue+64; //64~704
  7463. index_sat = (SatValue-64)/64;
  7464. *sat_e = (index_sat%2==1) ?1 :0;
  7465. *index_sat_e = index_sat/2;
  7466. if(*sat_e==1)
  7467. *index_sat_o=(index_sat+1)/2;
  7468. else
  7469. *index_sat_o= index_sat/2;
  7470. if (*index_sat_e>4)
  7471. *index_sat_e = 4;
  7472. if (*index_sat_o>5)
  7473. *index_sat_o = 5;
  7474. //TRACE("sat %d %d %d",*index_sat_e,*index_sat_o,*sat_e);
  7475. }
  7476. int GetLutHwAddress(int HueIndex,int SatIndex,int LumaIndex)
  7477. {
  7478. int dwAddr=0;
  7479. int hw_hue_e;
  7480. int hw_hue_o;
  7481. int hue_e;
  7482. int hw_luma_e;
  7483. int hw_luma_o;
  7484. int luma_e;
  7485. int hw_sat_e;
  7486. int hw_sat_o;
  7487. int sat_e;
  7488. GetHueMapValue(HueIndex,&hw_hue_e,&hw_hue_o,&hue_e);
  7489. GetLumaMapValue(LumaIndex,&hw_luma_e,&hw_luma_o,&luma_e);
  7490. GetSatMapValue(SatIndex,&hw_sat_e,&hw_sat_o,&sat_e);
  7491. if ((hue_e==1)&& (sat_e==1) &&( luma_e==1))
  7492. dwAddr = GetHwAddr(hw_hue_e,hw_sat_e,hw_luma_e,0,2);
  7493. else if ((hue_e==1)&& (sat_e==1) &&(luma_e==0))
  7494. dwAddr = GetHwAddr(hw_hue_e,hw_sat_e,hw_luma_o,1,2);
  7495. else if ((hue_e==1)&& (sat_e==0) &&(luma_e==1))
  7496. dwAddr = GetHwAddr(hw_hue_e,hw_sat_o,hw_luma_e,2,1);
  7497. else if ((hue_e==1)&& (sat_e==0) &&(luma_e==0))
  7498. dwAddr = GetHwAddr(hw_hue_e,hw_sat_o,hw_luma_o,3,1);
  7499. else if ((hue_e==0)&& (sat_e==1) &&(luma_e==1))
  7500. dwAddr = GetHwAddr(hw_hue_o,hw_sat_e,hw_luma_e,4,2);
  7501. else if ((hue_e==0)&& (sat_e==1) &&(luma_e==0))
  7502. dwAddr = GetHwAddr(hw_hue_o,hw_sat_e,hw_luma_o,5,2);
  7503. else if ((hue_e==0)&& (sat_e==0) &&(luma_e==1))
  7504. dwAddr = GetHwAddr(hw_hue_o,hw_sat_o,hw_luma_e,6,1);
  7505. else if ((hue_e==0)&& (sat_e==0) &&(luma_e==0))
  7506. dwAddr = GetHwAddr(hw_hue_o,hw_sat_o,hw_luma_o,7,1);
  7507. return dwAddr;
  7508. }
  7509. void PQ_ColorLUTSortOffsetToPt(UINT32 *dwOffsetSort, LUT_OFFSET ptLUTout[16][11][32])
  7510. {
  7511. //int i, j, x, y, z, xv=0, yv=0, zv=0;
  7512. int x,y,z;
  7513. int HValue=0,SValue=0,YValue=0;
  7514. UINT32 dwAddr;
  7515. UINT32 dwOffset;
  7516. //int DiffLevel=0;//g_SiSUart.ReadFromSiS(0xbe1ccb54)&0x3;
  7517. for (z = 0; z < 16; z++)
  7518. {
  7519. for (y = 0; y < 11; y++)
  7520. {
  7521. for (x = 0; x < 32; x++)
  7522. {
  7523. dwAddr = GetLutHwAddress(x,y,z);
  7524. dwOffset = dwOffsetSort[dwAddr];
  7525. HValue = (dwOffset>>11)&0x1f; //H
  7526. if((HValue>>4)==1)
  7527. HValue=(-1)*(16-(HValue&0xf));
  7528. SValue = ((dwOffset>>6)&0x1f)-m_Global_S_offset; //S
  7529. YValue = (dwOffset)&0x3f; //Y
  7530. if((YValue>>5)==1)//Y<0
  7531. {//2+
  7532. YValue=(-1)*(32-(YValue&0x1f));
  7533. //if(zv==0)
  7534. // zv=-32;
  7535. }//2-
  7536. ptLUTout[z][y][x].Hoffset = HValue;
  7537. ptLUTout[z][y][x].Soffset = SValue;
  7538. ptLUTout[z][y][x].Yoffset = YValue;
  7539. }
  7540. }
  7541. }
  7542. // AfxMessageBox("exit here............2");
  7543. }
  7544. void _PQ_ColorLUTSortOffsetToPt(UINT32 *dwOffsetSort, LUT_OFFSET *ptLUTout,int HueIndex,int SatIndex,int LumaIndex)
  7545. {
  7546. int HValue=0,SValue=0,YValue=0;
  7547. UINT32 dwAddr;
  7548. UINT32 dwOffset;
  7549. dwAddr = GetLutHwAddress(HueIndex,SatIndex,LumaIndex);
  7550. dwOffset = dwOffsetSort[dwAddr];
  7551. HValue = (dwOffset>>11)&0x1f; //H
  7552. if((HValue>>4)==1)
  7553. HValue=(-1)*(16-(HValue&0xf));
  7554. SValue = ((dwOffset>>6)&0x1f)-m_Global_S_offset; //S
  7555. YValue = (dwOffset)&0x3f; //Y
  7556. if((YValue>>5)==1)//Y<0
  7557. {//2+
  7558. YValue=(-1)*(32-(YValue&0x1f));
  7559. //if(zv==0)
  7560. // zv=-32;
  7561. }//2-
  7562. ptLUTout->Hoffset = HValue;
  7563. ptLUTout->Soffset = SValue;
  7564. ptLUTout->Yoffset = YValue;
  7565. }
  7566. void PQ_ColorLUTSortLUTV3(LUT_OFFSET ptLUTout[16][11][32])//, UINT32 *dwOffsetSort)
  7567. {
  7568. int x, y, z;
  7569. int iHdiff, iSdiff, iYdiff;
  7570. //INT32 xd, yd, zd;
  7571. UINT32 dwAddr;
  7572. //int nCount[8];
  7573. //int nMax[8];
  7574. //UINT32 nMax[8];
  7575. UINT32 dwOffset;
  7576. //memset(nCount, 0, sizeof(nCount));
  7577. //memset(nMax, 0, sizeof(nMax));
  7578. for (z = 0; z < 16; z++)
  7579. {
  7580. for (y = 0; y < 11; y++)
  7581. {
  7582. for (x = 0; x < 32; x++)
  7583. {
  7584. iHdiff=ptLUTout[z][y][x].Hoffset;
  7585. iSdiff=ptLUTout[z][y][x].Soffset+m_Global_S_offset;
  7586. iYdiff=ptLUTout[z][y][x].Yoffset;
  7587. if (iHdiff > 15)
  7588. {
  7589. iHdiff = 15;
  7590. }
  7591. if(iHdiff < -16)
  7592. {
  7593. iHdiff = -16;
  7594. }
  7595. if (iSdiff > 31)
  7596. {
  7597. iSdiff = 31;
  7598. }
  7599. if(iSdiff < 0)
  7600. {
  7601. iSdiff = 0;
  7602. }
  7603. if (iYdiff > 31)
  7604. {
  7605. iYdiff = 31;
  7606. }
  7607. if(iYdiff < -32)
  7608. {
  7609. iYdiff = -32;
  7610. }
  7611. dwOffset = ((iHdiff&0x1f)<<11) | ((iSdiff&0x1f)<<6) |(iYdiff&0x3f);
  7612. dwAddr = GetLutHwAddress(x, y, z);
  7613. //dwOffsetSort[dwAddr] = dwOffset;
  7614. PQ_RegisterWrite(VIP_reg_dpy_rgn_addr,dwAddr);
  7615. PQ_RegisterWrite(VIP_reg_dpy_rgn_data,dwOffset);
  7616. }
  7617. }
  7618. }
  7619. }
  7620. void _PQ_ColorLUTSortLUTV3(LUT_OFFSET ptLUTout,int HueIndex,int SatIndex,int LumaIndex)//, UINT32 *dwOffsetSort)
  7621. {
  7622. int iHdiff, iSdiff, iYdiff;
  7623. //INT32 xd, yd, zd;
  7624. UINT32 dwAddr;
  7625. //int nCount[8];
  7626. //int nMax[8];
  7627. //UINT32 nMax[8];
  7628. UINT32 dwOffset;
  7629. //memset(nCount, 0, sizeof(nCount));
  7630. //memset(nMax, 0, sizeof(nMax));
  7631. iHdiff=ptLUTout.Hoffset;
  7632. iSdiff=ptLUTout.Soffset+m_Global_S_offset;
  7633. iYdiff=ptLUTout.Yoffset;
  7634. if (iHdiff > 15)
  7635. {
  7636. iHdiff = 15;
  7637. }
  7638. if(iHdiff < -16)
  7639. {
  7640. iHdiff = -16;
  7641. }
  7642. if (iSdiff > 31)
  7643. {
  7644. iSdiff = 31;
  7645. }
  7646. if(iSdiff < 0)
  7647. {
  7648. iSdiff = 0;
  7649. }
  7650. if (iYdiff > 31)
  7651. {
  7652. iYdiff = 31;
  7653. }
  7654. if(iYdiff < -32)
  7655. {
  7656. iYdiff = -32;
  7657. }
  7658. dwOffset = ((iHdiff&0x1f)<<11) | ((iSdiff&0x1f)<<6) |(iYdiff&0x3f);
  7659. dwAddr = GetLutHwAddress(HueIndex,SatIndex,LumaIndex);
  7660. //dwOffsetSort[dwAddr] = dwOffset;
  7661. PQ_RegisterWrite(VIP_reg_dpy_rgn_addr,dwAddr);
  7662. PQ_RegisterWrite(VIP_reg_dpy_rgn_data,dwOffset);
  7663. }
  7664. BOOL PQ_ColorLUT_CalcRegion(
  7665. UINT8 *hue_max, UINT8 *hue_min, UINT8 *sat_max, UINT8 *sat_min, UINT8 *y_max, UINT8 *y_min,
  7666. INT8 *hue_gain, INT8 *sat_gain, INT8 *y_gain,
  7667. UINT8 *en, INT32 regnum, UINT32* dwDataAddr)//, UINT32* dwDataAddrOut)
  7668. {
  7669. static COLORLUT_BUF *pbuf = NULL;
  7670. //LUT_OFFSET ptLut;
  7671. INT32 y, h, s, ridx;
  7672. int st_hLevel[32] = {0, 45, 90, 135, 180, 225, 270, 315, 360, 405,
  7673. 450, 495, 540, 585, 630, 675, 720, 765, 810, 855,
  7674. 900, 945, 990, 1035, 1080, 1125, 1170, 1215, 1260,
  7675. 1305, 1350, 1395};
  7676. int st_sLevel[11] = {0, 64, 128, 192, 256, 320, 384, 448, 512, 576, 640};
  7677. int st_vLevel[16] = {64, 128, 192, 256, 320, 384, 448, 512, 576, 640 ,704, 768, 832, 896, 960, 1024};
  7678. if (NULL == pbuf)
  7679. pbuf = (COLORLUT_BUF*)drv_vmalloc(sizeof(COLORLUT_BUF),MODULEID_VIP);
  7680. if (NULL == pbuf)
  7681. return FALSE;
  7682. memset(pbuf, 0, sizeof(COLORLUT_BUF));
  7683. PQ_ColorLUTSortOffsetToPt(dwDataAddr, pbuf->lutOffset);
  7684. for (ridx = 0; ridx < regnum; ridx++)
  7685. {
  7686. if (en[ridx]) {
  7687. int Yc, Hc, Sc, Ymin, Ymax, Hmin, Hmax, Smin, Smax;
  7688. int Yration = 0, Hration = 0, Sration = 0;
  7689. int fac;
  7690. Ymin = st_vLevel[y_min[ridx]];
  7691. Ymax = st_vLevel[y_max[ridx]];
  7692. Yc = (Ymin + Ymax)/2;
  7693. Hmin = st_hLevel[hue_min[ridx]];
  7694. Hmax = st_hLevel[hue_max[ridx]];
  7695. if (Hmax > Hmin) {
  7696. Hc = (Hmin + Hmax)/2;
  7697. }else {
  7698. int max, tmp;
  7699. tmp = 1440 - Hmin;
  7700. max = Hmax + tmp;
  7701. Hc = (max/2) + Hmin;
  7702. if (Hc >= 1440) {
  7703. Hc = Hc - 1440;
  7704. }
  7705. }
  7706. Smin = st_sLevel[sat_min[ridx]];
  7707. Smax = st_sLevel[sat_max[ridx]];
  7708. Sc = (Smin + Smax)/2;
  7709. for (y = 0; y < 16; y++)
  7710. {
  7711. if (y >= y_min[ridx] && y <= y_max[ridx])
  7712. {
  7713. if (st_vLevel[y] >= Yc)
  7714. {
  7715. if((Ymax-Yc) > 0)
  7716. {
  7717. Yration = ((st_vLevel[y] - Yc)*100)/(Ymax-Yc);
  7718. }
  7719. }
  7720. else
  7721. {
  7722. if((Ymax-Yc) > 0)
  7723. {
  7724. Yration = ((Yc - st_vLevel[y])*100)/(Ymax-Yc);
  7725. }
  7726. }
  7727. for (s = 0; s < 11; s++)
  7728. {
  7729. if (s >= sat_min[ridx] && s <= sat_max[ridx])
  7730. {
  7731. if (st_sLevel[s] >= Sc)
  7732. {
  7733. if((Smax-Sc) > 0)
  7734. {
  7735. Sration = ((st_sLevel[s] - Sc)*100)/(Smax-Sc);
  7736. }
  7737. }
  7738. else
  7739. {
  7740. if((Smax-Sc) > 0)
  7741. {
  7742. Sration = ((Sc - st_sLevel[s])*100)/(Smax-Sc);
  7743. }
  7744. }
  7745. for (h = 0; h < 32; h++)
  7746. {
  7747. int inrange = FALSE;
  7748. if (Hmin <= Hmax)
  7749. {
  7750. if (h >= hue_min[ridx] && h <= hue_max[ridx])
  7751. {
  7752. inrange = TRUE;
  7753. }
  7754. }
  7755. else
  7756. {
  7757. if (h >= hue_min[ridx] && h >= hue_max[ridx])
  7758. {
  7759. inrange = TRUE;
  7760. }
  7761. else if (h <= hue_min[ridx] && h <= hue_max[ridx])
  7762. {
  7763. inrange = TRUE;
  7764. }
  7765. }
  7766. if (inrange)
  7767. {
  7768. int upper, lower;
  7769. if (Hmin < Hmax)
  7770. {
  7771. if (st_hLevel[h] >= Hc ) {
  7772. upper = st_hLevel[h] - Hc;
  7773. }else {
  7774. upper = Hc - st_hLevel[h];
  7775. }
  7776. lower = Hmax - Hc;
  7777. }
  7778. else
  7779. {
  7780. int shift, tmpmax_angle, tmplevel, tmp_Hc;
  7781. shift = 1440 - Hmin;
  7782. tmpmax_angle = Hmax + shift;
  7783. if (Hc > Hmax)
  7784. {
  7785. tmp_Hc = Hc + shift - 1440;
  7786. }
  7787. else
  7788. {
  7789. tmp_Hc = Hc + shift;
  7790. }
  7791. if (st_hLevel[h] > Hmax)
  7792. {
  7793. tmplevel = st_hLevel[h] + shift - 1440;
  7794. }
  7795. else
  7796. {
  7797. tmplevel = st_hLevel[h]+ shift;
  7798. }
  7799. if (tmplevel >= tmp_Hc ) {
  7800. upper = tmplevel - tmp_Hc;
  7801. }else {
  7802. upper = tmp_Hc - tmplevel;
  7803. }
  7804. lower = tmpmax_angle - tmp_Hc;
  7805. }
  7806. if(lower > 0)
  7807. {
  7808. Hration = (upper*100)/(lower);
  7809. }
  7810. fac = Yration > Hration ? Yration : Hration;
  7811. fac = Sration > fac ? Sration : fac;
  7812. fac = 100 - ((fac*lut_smooth_level)/100);
  7813. //printk("y = %d, h = %d, s =%d, Yration = %d, Hration = %d, Sration =%d, fac = %d\n", y, h, s, Yration, Hration, Sration, fac);
  7814. //_PQ_ColorLUTSortOffsetToPt(dwDataAddr,&ptLut,y,s,h);
  7815. if (lut_make[ridx])
  7816. {
  7817. pbuf->lutOffset[y][s][h].Hoffset = -32;
  7818. pbuf->lutOffset[y][s][h].Soffset = -32;
  7819. pbuf->lutOffset[y][s][h].Yoffset = -32;
  7820. }
  7821. else
  7822. {
  7823. pbuf->lutOffset[y][s][h].Hoffset += (hue_gain[ridx]*fac)/100;
  7824. pbuf->lutOffset[y][s][h].Soffset += (sat_gain[ridx]*fac)/100;
  7825. pbuf->lutOffset[y][s][h].Yoffset += (y_gain[ridx]*fac)/100;
  7826. }
  7827. //_PQ_ColorLUTSortLUTV3(ptLut,y,s,h);
  7828. }
  7829. }
  7830. }
  7831. }
  7832. }
  7833. }
  7834. }
  7835. }
  7836. PQ_ColorLUTSortLUTV3(pbuf->lutOffset);//,dwDataAddrOut);
  7837. //drv_vfree(pbuf, MODULEID_VIP);
  7838. return TRUE;
  7839. }
  7840. unsigned long pqcrcTable[256] = {
  7841. 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
  7842. 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
  7843. 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2,
  7844. 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
  7845. 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,
  7846. 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
  7847. 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C,
  7848. 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
  7849. 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423,
  7850. 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
  7851. 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106,
  7852. 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
  7853. 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D,
  7854. 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
  7855. 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,
  7856. 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
  7857. 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7,
  7858. 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
  7859. 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA,
  7860. 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
  7861. 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
  7862. 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
  7863. 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84,
  7864. 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
  7865. 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
  7866. 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
  7867. 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E,
  7868. 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
  7869. 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55,
  7870. 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
  7871. 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28,
  7872. 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
  7873. 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F,
  7874. 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
  7875. 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,
  7876. 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
  7877. 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,
  7878. 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
  7879. 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC,
  7880. 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
  7881. 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
  7882. 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
  7883. 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
  7884. };
  7885. unsigned long CountCRC32(char *pData, int len)
  7886. {
  7887. unsigned long crc;
  7888. int i;
  7889. unsigned long c;
  7890. crc = 0xFFFFFFFF;
  7891. for(i=0; i<len; i++)
  7892. {
  7893. c = (unsigned long)pData[i];
  7894. crc = ((crc>>8) & 0x00FFFFFF) ^ pqcrcTable[ (crc^c) & 0xFF ];
  7895. }
  7896. return( crc^0xFFFFFFFF );
  7897. }
  7898. BOOL CheckLutCRC(UINT32 FileSize)
  7899. {
  7900. volatile UINT8 * pLUT = (volatile UINT8*) SPI_COLORLUTTABLE_SHADOWADDR;
  7901. char *DataStart = (char *)pLUT;
  7902. int CRCSize;
  7903. unsigned long CRCValue;
  7904. int CRCAddr;
  7905. unsigned long dwCRC;
  7906. int ret=FALSE;
  7907. CRCSize = FileSize - sizeof(LUTHead)-16;
  7908. CRCValue = CountCRC32(DataStart+sizeof(LUTHead),CRCSize);
  7909. CRCAddr= CRCSize+sizeof(LUTHead)+12;
  7910. dwCRC = ((DataStart[CRCAddr+3]&0xff)<<24)|((DataStart[CRCAddr+2]&0xff)<<16)|((DataStart[CRCAddr+1]&0xff)<<8)|(DataStart[CRCAddr]&0xff);
  7911. //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);
  7912. if(CRCValue==dwCRC)
  7913. {
  7914. ret=TRUE;
  7915. }
  7916. return ret;
  7917. }
  7918. BOOL PQ_SetupLUTTable(UINT8 ucEnable)
  7919. {
  7920. volatile UINT8 * pLUT = (volatile UINT8*) SPI_COLORLUTTABLE_SHADOWADDR;
  7921. UINT32 *pdwLUT = (UINT32 *) pLUT;
  7922. PLUTTable pLUTTable = (PLUTTable) pLUT;
  7923. LUTTableInfo *pTblInfo;
  7924. UINT32 * pLUTPivotTable ;
  7925. UINT16 IndexOffset;
  7926. UINT32 ulXorCRC;
  7927. UINT8 ucCurrSrcIndex, ucTableIndex;
  7928. UINT32 i;
  7929. //UINT8 Is330C=0;
  7930. //INT32 ColorLUT330C_Block_PointNum[8] = {729, 648, 648, 576, 648, 576, 576, 512}; /* 8 block */
  7931. INT32 ColorLUT531_Block_PointNum[8] = {640, 640, 768, 768,640, 640, 768, 768}; /* 8 block */
  7932. INT32 DataNum;
  7933. INT32 iTableCnt;
  7934. printk(KERN_EMERG"%s: ucEnable=%d pLUT=%p", __FUNCTION__, ucEnable, pLUT);
  7935. *(volatile unsigned char*)(0xbe1c0000)=0x13;
  7936. /* validate table */
  7937. if (memcmp(pLUTTable->LUTID,"LUT",3))
  7938. {
  7939. printk(KERN_EMERG"%s: LUT Table ID incorrect!", __FUNCTION__);
  7940. return FALSE;
  7941. }
  7942. ulXorCRC = 0;
  7943. for (i=0;i<pLUTTable->FileSize/sizeof(UINT32);i++)
  7944. {
  7945. ulXorCRC ^= pdwLUT[i];
  7946. }
  7947. if (ulXorCRC && CheckLutCRC(pLUTTable->FileSize)==FALSE)
  7948. {
  7949. printk(KERN_EMERG"%s: XorCRC invalid!", __FUNCTION__);
  7950. return FALSE;
  7951. }
  7952. if (pLUTTable->IndexOffset!= offsetof(LUTTable,TblInfo))
  7953. {
  7954. printk(KERN_EMERG"%s: Table (version %d) format changed!", __FUNCTION__, pLUTTable->Version);
  7955. }
  7956. if (pLUTTable->IndexOffset > pLUTTable->HeadLength)
  7957. {
  7958. printk(KERN_EMERG"%s: Table Index offset %d > HeadLength %d !", __FUNCTION__, pLUTTable->IndexOffset, pLUTTable->HeadLength);
  7959. }
  7960. ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  7961. if ((ucCurrSrcIndex >= SRC_INDEX_UNKNOWN) || (ucCurrSrcIndex >= pLUTTable->SrcCount))
  7962. {
  7963. printk(KERN_EMERG"%s: SrcIndex (%d) unknown/invalid, pLUTTable->SrcCount (%d)!", __FUNCTION__, ucCurrSrcIndex,pLUTTable->SrcCount);
  7964. return FALSE;
  7965. }
  7966. ucTableIndex = pLUTTable->SrcIndex[ucCurrSrcIndex];
  7967. if (ucTableIndex >= pLUTTable->TableCount)
  7968. {
  7969. printk(KERN_EMERG"%s: SrcIndex value (%d) > TableCount (%d)!", __FUNCTION__, ucCurrSrcIndex, pLUTTable->TableCount);
  7970. return FALSE;
  7971. }
  7972. /*
  7973. if(pHwContext->LUTIndex != ucTableIndex || pHwContext->LUTEnable != ucEnable)//prevent blanking from duplicate setting
  7974. */
  7975. {
  7976. /*
  7977. pHwContext->LUTIndex = ucTableIndex;
  7978. pHwContext->LUTEnable = ucEnable;
  7979. */
  7980. if( ucEnable!=DISABLE )
  7981. {
  7982. IndexOffset = pLUTTable->IndexOffset;
  7983. pTblInfo = (LUTTableInfo *) (pLUT+IndexOffset);
  7984. pLUTPivotTable = (UINT32 *)(pLUT + pTblInfo[ucTableIndex].TableOffset);
  7985. down(&LutTableLock);
  7986. //printk(KERN_EMERG"Loading LUT Table from table index %d start.......", ucTableIndex);
  7987. {
  7988. BOOL bCalcRegionOK = FALSE;
  7989. //static UINT32 *dwDataNew = NULL;
  7990. //if(dwDataNew==NULL)
  7991. //dwDataNew = (UINT32*)drv_vmalloc(7936*4,MODULEID_VIP);
  7992. //if (NULL != dwDataNew)
  7993. //{
  7994. bCalcRegionOK = PQ_ColorLUT_CalcRegion(
  7995. lut_rgn_hue_max, lut_rgn_hue_min, lut_rgn_sat_max, lut_rgn_sat_min, lut_rgn_y_max, lut_rgn_y_min,
  7996. lut_rgn_hue_gain, lut_rgn_sat_gain, lut_rgn_y_gain,
  7997. lut_rgn_en, COLORLUT_RGN_NUM, pLUTPivotTable);//, dwDataNew);
  7998. if(bCalcRegionOK==FALSE)
  7999. {
  8000. DataNum = 0;
  8001. for (i=0;i<8;i++)
  8002. {
  8003. PQ_RegisterWrite(VIP_reg_dpy_rgn_addr,i<<10);
  8004. for (iTableCnt=0;iTableCnt<ColorLUT531_Block_PointNum[i];iTableCnt++)//for (iTableCnt=0;iTableCnt<ColorLUT330C_Block_PointNum[i];iTableCnt++)
  8005. {
  8006. //PQ_RegisterWrite(VIP_reg_dpy_rgn_data, bCalcRegionOK? dwDataNew[DataNum]:pLUTPivotTable[DataNum]);
  8007. *(volatile unsigned long*)(0xbe1cc184) = pLUTPivotTable[DataNum];//+0x80);
  8008. //printk(KERN_EMERG"[%d]:%08x",DataNum,dwDataNew[DataNum]);
  8009. DataNum++;
  8010. if(DataNum==640) DataNum=1024;
  8011. if(DataNum==1664) DataNum=2048;
  8012. if(DataNum==2816) DataNum=3072;
  8013. if(DataNum==3840) DataNum=4096;
  8014. if(DataNum==4736) DataNum=5120;
  8015. if(DataNum==5760) DataNum=6144;
  8016. if(DataNum==6912) DataNum=7168;
  8017. }
  8018. }
  8019. }
  8020. //drv_vfree(dwDataNew, MODULEID_VIP);
  8021. //dwDataNew = NULL;
  8022. //}
  8023. PQ_RegisterWrite(VIP_reg_dpy_rgn_addr, 0x0);
  8024. PQ_RegisterWrite(VIP_reg_dpy_yuv_lut_en,1);
  8025. }
  8026. up(&LutTableLock);
  8027. }
  8028. else
  8029. {
  8030. PQDebugPrint("Turn off LUT.");
  8031. PQ_RegisterWrite(VIP_reg_dpy_yuv_lut_en,0);
  8032. }
  8033. }
  8034. return TRUE;
  8035. }
  8036. BOOL PQ_CheckLastLutValue(void)
  8037. {
  8038. static unsigned long LastCRC=0xff;
  8039. static int LastSrcIndex=0xff;
  8040. unsigned long dwCRCValue;
  8041. UINT8 num = COLORLUT_RGN_NUM;
  8042. 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)+
  8043. 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)+
  8044. 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;
  8045. if(LastSrcIndex==PQ_Get_Source_Grouped_Index() && LastCRC==dwCRCValue)
  8046. {
  8047. return FALSE;
  8048. }
  8049. else
  8050. {
  8051. LastSrcIndex=PQ_Get_Source_Grouped_Index();
  8052. LastCRC = dwCRCValue;
  8053. return TRUE;
  8054. }
  8055. }
  8056. void PQ_ColorLUT_SetRegion(INT32 iRegionIdx, INT32 iSatGain, INT32 iYGain, INT32 iRotAngle, INT32 iRotGain, INT32 bEnable, BOOL bSet)
  8057. {
  8058. if (iRegionIdx < 0 || iRegionIdx >= COLORLUT_RGN_NUM)
  8059. {
  8060. return;
  8061. }
  8062. lut_rgn_en[iRegionIdx] = bEnable;
  8063. lut_rgn_hue_gain[iRegionIdx] = iRotGain;
  8064. lut_rgn_sat_gain[iRegionIdx] = iSatGain;
  8065. lut_rgn_y_gain[iRegionIdx] = iYGain;
  8066. if(bSet)
  8067. {
  8068. if(PQ_CheckLastLutValue())
  8069. {
  8070. PQ_SetupLUTTable(ENABLE);
  8071. }
  8072. }
  8073. }
  8074. void PQ_ColorLUT_SetRange(UINT8 RegionIdx, UINT8 bMake, UINT8 HueMin, UINT8 HueMax, UINT8 SatMin, UINT8 SatMax, UINT8 YMin, UINT8 YMax, UINT8 SmoothLevel, BOOL bSet)
  8075. {
  8076. if (RegionIdx >= COLORLUT_RGN_NUM)
  8077. {
  8078. return;
  8079. }
  8080. lut_make[RegionIdx] = bMake;
  8081. lut_rgn_hue_min[RegionIdx] = HueMin;
  8082. lut_rgn_hue_max[RegionIdx] = HueMax;
  8083. lut_rgn_sat_min[RegionIdx] = SatMin;
  8084. lut_rgn_sat_max[RegionIdx] = SatMax;
  8085. lut_rgn_y_min[RegionIdx] = YMin;
  8086. lut_rgn_y_max[RegionIdx] = YMax;
  8087. lut_smooth_level = SmoothLevel;
  8088. if (bSet)
  8089. {
  8090. PQ_SetupLUTTable(ENABLE);
  8091. }
  8092. }
  8093. void PQ_SetupSaturationGainCurve(BOOL bEnable)
  8094. {
  8095. INT32 i;
  8096. PQHW_CONTEXT* pHwContext= &PQHwContext;
  8097. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  8098. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  8099. UINT32 dwSatGainAddr;
  8100. UINT8 ucTableIndex;
  8101. SAT_GAIN_CURVE_V2I_DATA* pSatData;
  8102. dwSatGainAddr = VIP_reg_dpy_sat_g0b;
  8103. if ((ucCurrSrcIndex >= SRC_INDEX_UNKNOWN))
  8104. {
  8105. PQDebugPrint("%s: SrcIndex (%d) unknown/invalid, pLUTTable->SrcCount (%d)!\n", __FUNCTION__, ucCurrSrcIndex,pLUTTable->SrcCount);
  8106. return;
  8107. }
  8108. ucTableIndex = pVtab->mSatGainCurve_V2.mGroupedIndex[ucCurrSrcIndex];
  8109. pSatData = &pVtab->mSatGainCurve_V2.mSatGainCurve_V2_Data[ucTableIndex];
  8110. //Set VIP_deg_dpy_sat_en
  8111. PQ_RegisterWrite(DPY_DISX_CB58_DW_CB58,(((PQ_RegisterRead(DPY_DISX_CB58_DW_CB58))&0xfeffffff)|(pSatData->iDpySatEn<<24)));
  8112. //Set VIP_reg_dpy_sat_opt
  8113. PQ_RegisterWrite(DPY_DISX_CB58_DW_CB58,(((PQ_RegisterRead(DPY_DISX_CB58_DW_CB58))&0xfdffffff)|(pSatData->iDpySatOpt<<25)));
  8114. //Set VIP_deg_dpy_sat_all
  8115. PQ_RegisterWrite(DPY_DISX_CB54_DW_CB54,(((PQ_RegisterRead(DPY_DISX_CB54_DW_CB54))&0x00ffffff)|(pSatData->iDpySatAll<<24)));
  8116. ucTempColorBarSaturation = PQ_RegisterRead(VIP_deg_dpy_sat_all);
  8117. //Set VIP_deg_dpy_hue
  8118. PQ_RegisterWrite(DPY_DISX_CB58_DW_CB58,(((PQ_RegisterRead(DPY_DISX_CB58_DW_CB58))&0xffff00ff)|(pSatData->iDpySatHue<<8)));
  8119. #if CONFIG_CHIPID==0x531
  8120. for (i = 0; i < 17; i++)
  8121. {
  8122. PQ_RegisterWrite(dwSatGainAddr+i*4, pSatData->iSat_Gain[i]);
  8123. }
  8124. #else
  8125. for (i = 0; i < 17; i++)
  8126. {
  8127. PQ_RegisterWrite(dwSatGainAddr+i, pSatData->iSat_Gain[i]);
  8128. }
  8129. #endif
  8130. }
  8131. void PQ_GetRegInfo(PQ_RegInfo* pRegInfo)
  8132. {
  8133. pRegInfo->NRRangeMax = 3; //0=OFF 1=WEAK 2=MEDIUM 3=STRONG
  8134. pRegInfo->NRRangeMid = 2;
  8135. pRegInfo->NRRangeMin = 0;
  8136. pRegInfo->GammaRangeMax = 2; //cType : 0=SD Video, 1=HD Video, 2=RGB
  8137. pRegInfo->GammaRangeMid = 1;
  8138. pRegInfo->GammaRangeMin = 0;
  8139. pRegInfo->BacklightRangeMax = 3; //0=OFF 1=WEAK 2=MEDIUM 3=STRONG
  8140. pRegInfo->BacklightRangeMid = 2;
  8141. pRegInfo->BacklightRangeMin = 0;
  8142. }
  8143. BOOL PQ_IsFadeEn(void)
  8144. {
  8145. PQHW_CONTEXT* pHwContext= &PQHwContext;
  8146. return pHwContext->bFadeEn;
  8147. }
  8148. void PQ_SetFadeValue(BOOL bFadeEn, UINT8 ucStartValue, UINT8 ucEndValue, UINT8 ucIncValue)
  8149. {
  8150. PQHW_CONTEXT* pHwContext= &PQHwContext;
  8151. pHwContext->bFadeEn = bFadeEn;
  8152. pHwContext->ucFadeStartValue = ucStartValue;
  8153. pHwContext->ucFadeEndValue = ucEndValue;
  8154. pHwContext->ucFadeIncValue = ucIncValue;
  8155. }
  8156. void PQ_SetFadeInOut(void)
  8157. {
  8158. UINT32 ulContrastValue;
  8159. PQHW_CONTEXT* pHwContext= &PQHwContext;
  8160. UINT8 ucStartValue = pHwContext->ucFadeStartValue;
  8161. UINT8 ucEndValue = pHwContext->ucFadeEndValue;
  8162. UINT8 ucIncValue = pHwContext->ucFadeIncValue;
  8163. static UINT32 ulcurValue = 0;
  8164. static UINT8 counter = 0;
  8165. if (pHwContext->bFadeEn)
  8166. {
  8167. if (counter == 0)
  8168. ulcurValue = ucStartValue;
  8169. ulContrastValue = ulcurValue * PQ_GetCurrContrastValue() / 256;
  8170. PQ_Contrast(TRUE, ulContrastValue);
  8171. if (ucEndValue > ucStartValue)
  8172. {
  8173. if (ulcurValue < ucEndValue)
  8174. {
  8175. ulcurValue += ucIncValue;
  8176. counter++;
  8177. }
  8178. else
  8179. {
  8180. PQ_Contrast(TRUE, (ucEndValue * PQ_GetCurrContrastValue() + 128) / 256);
  8181. ulcurValue = 0;
  8182. counter = 0;
  8183. pHwContext->bFadeEn = 0;
  8184. }
  8185. }
  8186. else
  8187. {
  8188. if ((signed)ulcurValue > ucEndValue)
  8189. {
  8190. ulcurValue -= ucIncValue;
  8191. counter++;
  8192. }
  8193. else
  8194. {
  8195. PQ_Contrast(TRUE, (ucEndValue * PQ_GetCurrContrastValue() + 128) / 256);
  8196. ulcurValue = 0;
  8197. counter = 0;
  8198. pHwContext->bFadeEn = 0;
  8199. }
  8200. }
  8201. }
  8202. }
  8203. //#ifdef VIP_SW_DC
  8204. #if 1
  8205. void PQ_GetSWDCParamCmd(ST_SWDC_Param *param)
  8206. {
  8207. //if(DLC_Source <7)
  8208. //{
  8209. // *param =PQ_SWDC_Param[DLC_Source];
  8210. //}
  8211. //else
  8212. {
  8213. *param = SWDC_Param[0];
  8214. }
  8215. }
  8216. void PQ_SetSWDCParamCmd(ST_SWDC_Param *param)
  8217. {
  8218. SWDC_Param[0]= *param;
  8219. PQ_RegisterWrite(VIP_reg_dpy_hist_en,SWDC_Param[0].ucSWDC_En);
  8220. }
  8221. void PQ_GetSWDCSlopeCmd(ST_SWDC_Slope *pstSlope)
  8222. {
  8223. //if(DLC_Source <7)
  8224. //{
  8225. // *pstSlope =PQ_SWDC_HistSlop[DLC_Source];// Get Current Value
  8226. //}
  8227. //else
  8228. {
  8229. *pstSlope = SWDC_HistSlop[0];
  8230. }
  8231. }
  8232. void PQ_SetSWDCSlopeCmd(ST_SWDC_Slope *pstSlope)
  8233. {
  8234. SWDC_HistSlop[0]=*pstSlope;
  8235. }
  8236. void PQ_GetSWDCChromaCmd(ST_SWDC_Chroma *pstChroma)
  8237. {
  8238. //if(DLC_Source <7)
  8239. //{
  8240. // *pstChroma = PQ_SWDC_HistChroma[DLC_Source];// Get Current Value
  8241. //}
  8242. //else
  8243. {
  8244. *pstChroma = SWDC_HistChroma[0];
  8245. }
  8246. }
  8247. void PQ_SetSWDCChromaCmd(ST_SWDC_Chroma *pstChroma)
  8248. {
  8249. SWDC_HistChroma[0] = *pstChroma;
  8250. }
  8251. void PQ_GetSWDCInfoCmd(ST_SWDC_Info *info)
  8252. {
  8253. PQHW_CONTEXT* pHwContext= &PQHwContext;
  8254. info->ulHistCaseCur = pHwContext->ulHistCaseCur;
  8255. }
  8256. void PQ_SetSWDCSourceCmd(UINT8 *param)
  8257. {
  8258. DLC_Source =param[0];
  8259. }
  8260. void PQ_GetSWDCSourceCmd(UINT8 *param)
  8261. {
  8262. param[0] = DLC_Source;
  8263. }
  8264. void PQ_GetDrvCurrentSourceCmd(UINT8 *param)
  8265. {
  8266. UINT8 ucUserSource;
  8267. UINT8 ucSubSource;
  8268. VIP_GetSource(&ucUserSource, &ucSubSource);
  8269. switch(ucUserSource)
  8270. {
  8271. case SOURCE_CVD2:
  8272. if (VIP_IsATVSource())
  8273. {
  8274. param[0] = PQTOOL_SOURCE_ATV;
  8275. }
  8276. else if (VIP_IsAVSource())
  8277. {
  8278. param[0] = PQTOOL_SOURCE_AV;
  8279. }
  8280. else if (VIP_IsSVSource())
  8281. {
  8282. param[0] = PQTOOL_SOURCE_SV;
  8283. }
  8284. break;
  8285. case SOURCE_EXTS:
  8286. if (VIP_IsPCSource())
  8287. {
  8288. param[0] = PQTOOL_SOURCE_PC;
  8289. }
  8290. else
  8291. {
  8292. param[0] = PQTOOL_SOURCE_COMPONENT;
  8293. }
  8294. break;
  8295. case SOURCE_HDMI:
  8296. if (VIP_RunDVIMode())
  8297. {
  8298. param[0] = PQTOOL_SOURCE_DVI;
  8299. }
  8300. else
  8301. {
  8302. param[0] = PQTOOL_SOURCE_HDMI;
  8303. }
  8304. break;
  8305. case SOURCE_MPEG:
  8306. param[0] = PQTOOL_SOURCE_DTV;
  8307. break;
  8308. case SOURCE_JPEG:
  8309. case SOURCE_PATTERN:
  8310. param[0] = PQTOOL_SOURCE_JPEG;
  8311. break;
  8312. default:
  8313. param[0] = 0xff;
  8314. break;
  8315. }
  8316. }
  8317. void PQ_SW_DynamicContrast_UserCurveAdjust(void)
  8318. {
  8319. PQHW_CONTEXT* pHwContext= &PQHwContext;
  8320. INT32 i,j, sum = 0;
  8321. INT32 iSlop[4][15];
  8322. for(i = 0; i<4;i++)
  8323. {
  8324. for(j = 0; j<15;j++)
  8325. {
  8326. iSlop[i][j] = (((INT32)(SWDC_HistSlop->SWDC_HistSlop[i+32][j])*2-256)*((INT32)SWDC_Param->wSWDC_Static_Alpha[i]-128)+64)/128;
  8327. }
  8328. }
  8329. for(i = 0; i<15;i++)
  8330. {
  8331. pHwContext->ulCurveSlop[i]= (iSlop[0][i]+iSlop[1][i]+iSlop[2][i]+iSlop[3][i]);
  8332. sum += (INT32)pHwContext->ulCurveSlop[i];
  8333. }
  8334. pHwContext->ulCurveSlop[15] = (-sum);
  8335. }
  8336. void PQ_SW_DynamicContrast_Param(UINT8 ucSource)
  8337. {
  8338. //SWDC_HistSlop[0] = PQ_SWDC_HistSlop[ucSource];
  8339. //SWDC_HistChroma[0] = PQ_SWDC_HistChroma[ucSource];
  8340. //SWDC_Param[0] = PQ_SWDC_Param[ucSource];
  8341. PQHW_CONTEXT* pHwContext= &PQHwContext;
  8342. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  8343. UINT8 ucTableIndex;
  8344. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  8345. DLC_SET_CURVE_PARAM *pDLC_SET_CURVE_PARAM;
  8346. ucTableIndex = pVtab->mDynContrast.mGroupedIndex[ucCurrSrcIndex];
  8347. pDLC_SET_CURVE_PARAM = &pVtab->mDynContrast.mDLC_Table[ucTableIndex];
  8348. SWDC_HistSlop[0] = pDLC_SET_CURVE_PARAM->dlc_luma_slope;
  8349. SWDC_HistChroma[0] = pDLC_SET_CURVE_PARAM->dlc_chroma_slope;
  8350. SWDC_Param[0].ucSWDC_En = (UINT8)pDLC_SET_CURVE_PARAM->dlc_En;
  8351. SWDC_Param[0].ucSWDC_Var_Cond_En = (UINT8)pDLC_SET_CURVE_PARAM->dlc_Var_Cond_En;
  8352. SWDC_Param[0].wSWDC_Ratio[0] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Ratio[0];
  8353. SWDC_Param[0].wSWDC_Ratio[1] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Ratio[1];
  8354. SWDC_Param[0].wSWDC_Ratio[2] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Ratio[2];
  8355. SWDC_Param[0].wSWDC_Ratio[3] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Ratio[3];
  8356. SWDC_Param[0].wSWDC_Ratio[4] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Ratio[4];
  8357. SWDC_Param[0].wSWDC_Ratio[5] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Ratio[5];
  8358. SWDC_Param[0].wSWDC_Factor[0] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Factor[0];
  8359. SWDC_Param[0].wSWDC_Factor[1] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Factor[1];
  8360. SWDC_Param[0].wSWDC_Factor[2] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Factor[2];
  8361. SWDC_Param[0].wSWDC_Factor[3] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Factor[3];
  8362. SWDC_Param[0].wSWDC_Factor[4] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Factor[4];
  8363. SWDC_Param[0].wSWDC_Alpha = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Alpha;
  8364. SWDC_Param[0].wSWDC_Static_Alpha[0] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Static_Alpha[0];
  8365. SWDC_Param[0].wSWDC_Static_Alpha[1] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Static_Alpha[1];
  8366. SWDC_Param[0].wSWDC_Static_Alpha[2] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Static_Alpha[2];
  8367. SWDC_Param[0].wSWDC_Static_Alpha[3] = (UINT16)pDLC_SET_CURVE_PARAM->dlc_Static_Alpha[3];
  8368. SWDC_Param[0].wSWDC_YLevel = (UINT16)pDLC_SET_CURVE_PARAM->dlc_YLevel;
  8369. SWDC_Param[0].wSWDC_CLevel = (UINT16)pDLC_SET_CURVE_PARAM->dlc_CLevel;
  8370. PQ_RegisterWrite(VIP_reg_dpy_hist_en, SWDC_Param[0].ucSWDC_En);
  8371. }
  8372. void PQ_EnSWDCWorkQue_ISR(void)
  8373. {
  8374. PQ_SW_DynamicContrast_SceneChangeDetect_ISR();
  8375. //queue_work(WQ_Struct_SWDC,&WQ_SWDC);
  8376. }
  8377. void PQ_SW_DynamicContrast_SceneChangeDetect_ISR(void)
  8378. {
  8379. typedef struct _HIST_WEIGHT
  8380. {
  8381. UINT8 ucIndex;
  8382. UINT32 ulWeight;
  8383. } HIST_WEIGHT;
  8384. PQHW_CONTEXT* pHwContext= &PQHwContext;
  8385. HIST_WEIGHT CurHistWeight[4];
  8386. static HIST_WEIGHT PreHistWeight[4];
  8387. UINT32 dwTotalPixel;
  8388. UINT16 Var_ratio[6], Var_Factor[5];
  8389. UINT32 ulHistBin[16];
  8390. UINT32 ulCurAvgY;
  8391. static UINT32 ulPreAvgY = 0;
  8392. INT32 ulTargetSlop[16], ulTargetChroma[16];
  8393. static INT32 ulPreTargetSlop[16] = {256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256};
  8394. static INT32 ulPreTargetChroma[16]={256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256, 256};
  8395. UINT8 ucSceneChangeEvent = 0, ChangeCondition[7], Var_cond_en[8], HistogramCase[32] , BinNormal=0,BinNull=0, ulcond1,ulcond2,ulcond3,ulcond4,ulcond5, ulcondS;
  8396. INT32 i, j, tmp, alpha,iYLevel,iCLevel,tmp1,tmp2,tmp3,tmp4,tmp5,tmp6, clr_ulcondS;
  8397. static INT32 PreYLevel = 0, PreCLevel = 0, PreulcondS = 0, ulHistCasePre = 0, hit_flicker = 0, even_frame = 0, pre_nr = 0, flicker_cnt = 0;
  8398. UINT8 HistCaseNum=0;
  8399. // UINT32 ulHsize,ulVsize;
  8400. // UINT32 /*dwInputCW_TotalPixel,*/ dwChromaHistTotal=0;
  8401. BOOL /*DPYGrayFlag=0,*/ ulChromaBin98=0, ulChromaBin99=0;
  8402. BOOL GrayPatternFlag=0;
  8403. UINT32 ulCurChromaBinPercentage,ulCurChromaBinPercentage7,ulCurChromaBinPercentage8;
  8404. /* //==Total Pixel=========
  8405. ulHsize = PQ_RegisterRead(VIP_reg_slr_out_width);
  8406. ulVsize = VIP_GetlInputCaptureVSize()>>VIP_GetInterlaceMode();
  8407. dwInputCW_TotalPixel = ulHsize*ulVsize ;
  8408. */ //==Chroma==================
  8409. UINT8 ucSWDC_En_Temp=0;
  8410. if(PQ_GetColorProcessor() == FALSE)
  8411. {
  8412. ucSWDC_En_Temp = FALSE;
  8413. }
  8414. else
  8415. {
  8416. ucSWDC_En_Temp = SWDC_Param[0].ucSWDC_En;
  8417. }
  8418. ulCurChromaBinPercentage = PQ_ChromaBinPercentage(0);
  8419. if (VIP_IsATVSource() || VIP_IsAVSource())
  8420. {
  8421. if ( ulCurChromaBinPercentage > 998 )
  8422. ulChromaBin99 = (ulCurChromaBinPercentage > 998)? 1:0; // 1 : black/w
  8423. else
  8424. ulChromaBin98 = (ulCurChromaBinPercentage > 997)? 1:0; // 1 : gray ; 0 : other
  8425. }
  8426. else
  8427. ulChromaBin98 = (PQ_ChromaBinPercentage(0)>980)? 1:0;
  8428. if (VIP_GetStdColorSystem() == CVD2_STD_SECAM)
  8429. {
  8430. ulChromaBin98 = (PQ_ChromaBinPercentage(0)>950)? 1:0;
  8431. }
  8432. //==========================
  8433. //UINT8 CustUC_DbgEn;
  8434. //enable sw dc
  8435. PQ_RegisterWrite(VIP_reg_dpy_bin_sel_hist, 1);
  8436. PQ_RegisterWrite(VIP_reg_dpy_hist_int, 0);
  8437. // PQ_RegisterWrite(VIP_reg_dpy_hist_en, SWDC_Param[0].ucSWDC_En);
  8438. PQ_RegisterWrite(VIP_reg_dpy_hist_en, ucSWDC_En_Temp);
  8439. Var_ratio[0] = SWDC_Param[0].wSWDC_Ratio[0];
  8440. Var_ratio[1] = SWDC_Param[0].wSWDC_Ratio[1];
  8441. Var_ratio[2] = SWDC_Param[0].wSWDC_Ratio[2];
  8442. Var_ratio[3] = SWDC_Param[0].wSWDC_Ratio[3];
  8443. Var_ratio[4] = SWDC_Param[0].wSWDC_Ratio[4];
  8444. Var_ratio[5] = SWDC_Param[0].wSWDC_Ratio[5];
  8445. for(i=0; i<8; i++)
  8446. Var_cond_en[i] = (SWDC_Param[0].ucSWDC_Var_Cond_En>>i)&0x01;
  8447. Var_cond_en[1] = 0;
  8448. Var_Factor[0] = SWDC_Param[0].wSWDC_Factor[0];
  8449. Var_Factor[1] = SWDC_Param[0].wSWDC_Factor[1];
  8450. Var_Factor[2] = SWDC_Param[0].wSWDC_Factor[2];
  8451. Var_Factor[3] = SWDC_Param[0].wSWDC_Factor[3];
  8452. Var_Factor[4] = SWDC_Param[0].wSWDC_Factor[4];
  8453. alpha = SWDC_Param[0].wSWDC_Alpha;
  8454. iYLevel = SWDC_Param[0].wSWDC_YLevel;
  8455. iCLevel = SWDC_Param[0].wSWDC_CLevel;
  8456. dwTotalPixel = 0;
  8457. for(i = 0; i <16; i++)
  8458. {
  8459. ulHistBin[i] = PQ_RegisterRead(VIP_reg_dpy_hist_bin0+i*4);
  8460. dwTotalPixel += ulHistBin[i];
  8461. }
  8462. for(i = 0; i<4; i++)
  8463. CurHistWeight[i].ucIndex= i;
  8464. if(PreHistWeight[0].ucIndex == 0 && PreHistWeight[1].ucIndex == 0 && PreHistWeight[2].ucIndex == 0 && PreHistWeight[3].ucIndex == 0)
  8465. {
  8466. for(i = 0; i<4; i++)
  8467. PreHistWeight[i].ucIndex= i;
  8468. }
  8469. if((PQ_RegisterRead(VIP_reg_dpy_en) == 0 ) || (dwTotalPixel ==0)) //DCR init value
  8470. {
  8471. for(i=0; i<16; i++)
  8472. {
  8473. PQ_RegisterWrite(VIP_reg_dpy_hist_slope0+i*4 ,256);
  8474. PQ_RegisterWrite(VIP_reg_dpy_hist_start0+i*4 ,i*64*16);
  8475. PQ_RegisterWrite(VIP_reg_dpy_hist_chroma0+i*4 ,256);
  8476. }
  8477. return;
  8478. }
  8479. if(dwTotalPixel > 0)
  8480. {
  8481. ulCurAvgY = PQ_RegisterRead(VIP_reg_dpy_y_sum)*256 / dwTotalPixel;
  8482. }
  8483. CurHistWeight[0].ulWeight= (7*ulHistBin[0] + 9*ulHistBin[1] + 9*ulHistBin[2] + 4*ulHistBin[3] + 2*ulHistBin[4] + ulHistBin[5])>>5;
  8484. 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;
  8485. 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;
  8486. CurHistWeight[3].ulWeight= ( ulHistBin[10] + 2*ulHistBin[11] + 4*ulHistBin[12] + 9*ulHistBin[13] + 9*ulHistBin[14] + 7*ulHistBin[15])>>5;
  8487. //sorting
  8488. for(i = 0 ; i<4 ; i++)
  8489. for(j=0; j<3-i; j++)
  8490. if(CurHistWeight[j].ulWeight<CurHistWeight[j+1].ulWeight)
  8491. {
  8492. tmp = CurHistWeight[j].ulWeight;
  8493. CurHistWeight[j].ulWeight= CurHistWeight[j+1].ulWeight;
  8494. CurHistWeight[j+1].ulWeight= tmp;
  8495. tmp = CurHistWeight[j].ucIndex;
  8496. CurHistWeight[j].ucIndex= CurHistWeight[j+1].ucIndex;
  8497. CurHistWeight[j+1].ucIndex= tmp;
  8498. }
  8499. //ChangeCondition[0] = Var_cond_en[0] && ((ulCurAvgY<<8)>=(Var_ratio[0]*ulPreAvgY) || (ulCurAvgY<<8)<=(Var_ratio[1]*ulPreAvgY));
  8500. ChangeCondition[0] = Var_cond_en[0] && ((ulCurAvgY<<8)>=(Var_ratio[0]*ulPreAvgY) || (ulPreAvgY<<8)>=(Var_ratio[0]*ulCurAvgY));
  8501. //ChangeCondition[1] = Var_cond_en[1] || (ulCurAvgY<<8)>=(Var_ratio[2]*ulPreAvgY) || (ulCurAvgY<<8)<=(Var_ratio[3]*ulPreAvgY);
  8502. ChangeCondition[1] = Var_cond_en[1] || (ulCurAvgY<<8)>=(Var_ratio[2]*ulPreAvgY) || (ulPreAvgY<<8)>=(Var_ratio[2]*ulCurAvgY);
  8503. ///ChangeCondition[1] = 0;
  8504. ChangeCondition[2] = ((CurHistWeight[0].ucIndex != PreHistWeight[0].ucIndex) && (CurHistWeight[0].ucIndex != PreHistWeight[1].ucIndex)) &&
  8505. ((CurHistWeight[1].ucIndex != PreHistWeight[0].ucIndex) && (CurHistWeight[1].ucIndex != PreHistWeight[1].ucIndex));
  8506. ChangeCondition[3] = (CurHistWeight[0].ucIndex == PreHistWeight[1].ucIndex) &&
  8507. ((CurHistWeight[0].ulWeight<<8)>=Var_ratio[4]*CurHistWeight[1].ulWeight &&
  8508. (PreHistWeight[0].ulWeight<<8)>=Var_ratio[5]*PreHistWeight[1].ulWeight);
  8509. ucSceneChangeEvent = ChangeCondition[0] ||
  8510. ( ChangeCondition[1] && ((Var_cond_en[2]&&ChangeCondition[2])||(Var_cond_en[3]&&ChangeCondition[3])));
  8511. if(PreYLevel != iYLevel || PreCLevel!=iCLevel)
  8512. ucSceneChangeEvent = 1;
  8513. if(ucSceneChangeEvent)
  8514. {
  8515. PQDebugPrint("%s: ChangeCondition = %d, %d, %d, %d ",__FUNCTION__,ChangeCondition[0],ChangeCondition[1],ChangeCondition[2],ChangeCondition[3]);
  8516. }
  8517. //for spacial case I
  8518. BinNull = 0;
  8519. BinNormal = 0;
  8520. if (Var_cond_en[4]==1)
  8521. {
  8522. for(i=0; i<16; i++)
  8523. {
  8524. if(ulHistBin[i]<dwTotalPixel*50/1000)
  8525. {
  8526. if (ulHistBin[i]<dwTotalPixel*25/1000) // *10 to *20
  8527. BinNull ++;
  8528. }
  8529. else
  8530. {
  8531. if ((i==0)&&(ulHistBin[1]<dwTotalPixel*50/1000))
  8532. BinNormal ++;
  8533. else if ((i==15)&&(ulHistBin[14]<dwTotalPixel*50/1000))
  8534. BinNormal ++;
  8535. else if ((i==14)&&(ulHistBin[13]<dwTotalPixel*50/1000)&&(ulHistBin[15]<dwTotalPixel*50/1000))
  8536. BinNormal ++;
  8537. else if ((i==13)&&(ulHistBin[i-1]<dwTotalPixel*50/1000)&&((ulHistBin[i+1]<dwTotalPixel*50/1000)||
  8538. (ulHistBin[i+2]<dwTotalPixel*50/1000)))
  8539. BinNormal ++;
  8540. else if ((i==12)&&(ulHistBin[i-1]<dwTotalPixel*50/1000)&&((ulHistBin[i+1]<dwTotalPixel*50/1000)||
  8541. (ulHistBin[i+2]<dwTotalPixel*50/1000)||
  8542. (ulHistBin[i+3]<dwTotalPixel*50/1000)))
  8543. BinNormal ++;
  8544. else if ((i< 12)&&(i>0)&&(ulHistBin[i-1]<dwTotalPixel*50/1000)&&((ulHistBin[i+1]<dwTotalPixel*50/1000)||
  8545. (ulHistBin[i+2]<dwTotalPixel*50/1000)||
  8546. (ulHistBin[i+3]<dwTotalPixel*50/1000)||
  8547. (ulHistBin[i+4]<dwTotalPixel*50/1000)))
  8548. BinNormal ++;
  8549. }
  8550. }
  8551. }
  8552. //ulcondS = (BinNull>14 || BinNormal>=4);
  8553. ulcondS = (BinNull>16 || BinNormal>=4);
  8554. clr_ulcondS = (BinNull<14 || BinNormal<4);
  8555. if (ucSceneChangeEvent)
  8556. {
  8557. PreulcondS = ulcondS;
  8558. }
  8559. else if (clr_ulcondS)
  8560. {
  8561. PreulcondS = 0;
  8562. }
  8563. if (ucSceneChangeEvent==0 && even_frame)
  8564. {
  8565. even_frame = 0;
  8566. return;
  8567. }
  8568. else
  8569. {
  8570. if (even_frame)
  8571. even_frame = 0;
  8572. else
  8573. even_frame = 1;
  8574. }
  8575. tmp = (CurHistWeight[0].ulWeight+CurHistWeight[1].ulWeight+CurHistWeight[2].ulWeight+CurHistWeight[3].ulWeight);
  8576. ulcond1 = (CurHistWeight[0].ulWeight<<8)>=Var_Factor[0]*(UINT32)tmp;
  8577. ulcond2 = (ulcond1==0) && ((CurHistWeight[0].ulWeight<<8)>=Var_Factor[3]*CurHistWeight[1].ulWeight) &&
  8578. ((CurHistWeight[0].ulWeight<<8)+(CurHistWeight[1].ulWeight<<8))>=Var_Factor[1]*(UINT32)tmp;
  8579. ulcond3 = (ulcond1==0) && ((CurHistWeight[0].ulWeight<<8)< Var_Factor[3]*CurHistWeight[1].ulWeight) &&
  8580. ((CurHistWeight[0].ulWeight<<8)+(CurHistWeight[1].ulWeight<<8))>=Var_Factor[1]*(UINT32)tmp;
  8581. ulcond4 = (ulcond1==0) && (ulcond2==0) && (ulcond3==0) && ((CurHistWeight[1].ulWeight<<8)>=Var_Factor[4]*CurHistWeight[2].ulWeight) &&
  8582. ((CurHistWeight[0].ulWeight<<8)+(CurHistWeight[1].ulWeight<<8)+(CurHistWeight[2].ulWeight<<8))>=Var_Factor[2]*(UINT32)tmp;
  8583. ulcond5 = (ulcond1==0) && (ulcond2==0) && (ulcond3==0) && ((CurHistWeight[1].ulWeight<<8)< Var_Factor[4]*CurHistWeight[2].ulWeight) &&
  8584. ((CurHistWeight[0].ulWeight<<8)+(CurHistWeight[1].ulWeight<<8)+(CurHistWeight[2].ulWeight<<8))>=Var_Factor[2]*(UINT32)tmp;
  8585. if(PreulcondS)
  8586. {
  8587. ulcond1 = ulcond2 = ulcond3 = ulcond4 = ulcond5 = 0;
  8588. HistogramCase[31] =1;
  8589. }
  8590. else
  8591. HistogramCase[31] =0;
  8592. HistogramCase[0] = (CurHistWeight[0].ucIndex==0) && ulcond1;
  8593. HistogramCase[1] = (CurHistWeight[0].ucIndex==0 && CurHistWeight[1].ucIndex==1) && ulcond2;
  8594. HistogramCase[2] = ((CurHistWeight[0].ucIndex==0 || CurHistWeight[0].ucIndex==1)) && ((CurHistWeight[1].ucIndex==0 || CurHistWeight[1].ucIndex==1)) && ulcond3;
  8595. HistogramCase[3] = (CurHistWeight[0].ucIndex==1 && CurHistWeight[1].ucIndex==0) && ulcond2;
  8596. HistogramCase[4] = (CurHistWeight[0].ucIndex==1) && ulcond1;
  8597. HistogramCase[5] = (CurHistWeight[0].ucIndex==1 && CurHistWeight[1].ucIndex==2) && ulcond2;
  8598. HistogramCase[6] = ((CurHistWeight[0].ucIndex==1 || CurHistWeight[0].ucIndex==2)) && ((CurHistWeight[1].ucIndex==1 || CurHistWeight[1].ucIndex==2)) && ulcond3;
  8599. HistogramCase[7] = (CurHistWeight[0].ucIndex==2 && CurHistWeight[1].ucIndex==1) && ulcond2;
  8600. HistogramCase[8] = (CurHistWeight[0].ucIndex==2) && ulcond1;
  8601. HistogramCase[9] = (CurHistWeight[0].ucIndex==2 && CurHistWeight[1].ucIndex==3) && ulcond2;
  8602. HistogramCase[10] = ((CurHistWeight[0].ucIndex==2 || CurHistWeight[0].ucIndex==3)) && ((CurHistWeight[1].ucIndex==2 || CurHistWeight[1].ucIndex==3)) && ulcond3;
  8603. HistogramCase[11] = (CurHistWeight[0].ucIndex==3 && CurHistWeight[1].ucIndex==2) && ulcond2;
  8604. HistogramCase[12] = (CurHistWeight[0].ucIndex==3) && ulcond1;
  8605. HistogramCase[13] = (CurHistWeight[0].ucIndex==0 && CurHistWeight[1].ucIndex==3) && ulcond2;
  8606. HistogramCase[14] = ((CurHistWeight[0].ucIndex==0 || CurHistWeight[0].ucIndex==3)) && ((CurHistWeight[1].ucIndex==0 || CurHistWeight[1].ucIndex==3)) && ulcond3;
  8607. HistogramCase[15] = (CurHistWeight[0].ucIndex==3 && CurHistWeight[1].ucIndex==0) && ulcond2;
  8608. HistogramCase[16] = (CurHistWeight[0].ucIndex==0 && CurHistWeight[1].ucIndex==2) && ulcond2;
  8609. HistogramCase[17] = (CurHistWeight[0].ucIndex==2 && CurHistWeight[1].ucIndex==0) && ulcond2;
  8610. HistogramCase[18] = ((CurHistWeight[0].ucIndex==0 || CurHistWeight[0].ucIndex==2)) && ((CurHistWeight[1].ucIndex==0 || CurHistWeight[1].ucIndex==2)) && ulcond3;
  8611. HistogramCase[19] = (CurHistWeight[0].ucIndex==1 && CurHistWeight[1].ucIndex==3) && ulcond2;
  8612. HistogramCase[20] = (CurHistWeight[0].ucIndex==3 && CurHistWeight[1].ucIndex==1) && ulcond2;
  8613. HistogramCase[21] = ((CurHistWeight[0].ucIndex==1 || CurHistWeight[0].ucIndex==3)) && ((CurHistWeight[1].ucIndex==1 || CurHistWeight[1].ucIndex==3)) && ulcond3;
  8614. HistogramCase[22] = (CurHistWeight[3].ucIndex==3) && ulcond5;
  8615. HistogramCase[23] = (CurHistWeight[3].ucIndex==3) && ulcond4;
  8616. HistogramCase[24] = (CurHistWeight[3].ucIndex==0) && ulcond5;
  8617. HistogramCase[25] = (CurHistWeight[3].ucIndex==0) && ulcond4;
  8618. HistogramCase[26] = (CurHistWeight[3].ucIndex==2) && ulcond5;
  8619. HistogramCase[27] = (CurHistWeight[3].ucIndex==2) && ulcond4;
  8620. HistogramCase[28] = (CurHistWeight[3].ucIndex==1) && ulcond5;
  8621. HistogramCase[29] = (CurHistWeight[3].ucIndex==1) && ulcond4;
  8622. pHwContext->ulHistCaseCur = 0;
  8623. for(i=0; i<30; i++)
  8624. {
  8625. if(HistogramCase[i] == 1)
  8626. pHwContext->ulHistCaseCur = i+1;
  8627. }
  8628. /*
  8629. if( (((PQ_RegisterRead(VIP_c_gray_bin_pre)*100)/dwInputCW_TotalPixel) >= 98) && ulChromaBin98 )
  8630. DPYGrayFlag = 1;
  8631. else
  8632. DPYGrayFlag = 0;
  8633. */
  8634. if ( HistogramCase[6]==1 || HistogramCase[22]==1 || HistogramCase[23]==1 || HistogramCase[24]==1)
  8635. GrayPatternFlag = 1;
  8636. else
  8637. GrayPatternFlag = 0;
  8638. /*
  8639. if ((PreulcondS==1)||(((HistogramCase[22]==1)||(HistogramCase[24]==1)||(HistogramCase[6]==1))&&(DPYGrayFlag==1)))
  8640. pHwContext->ulHistCaseCur = 32;
  8641. else if (pHwContext->ulHistCaseCur==0)
  8642. pHwContext->ulHistCaseCur = 31;
  8643. */
  8644. if ( PreulcondS==1|| (GrayPatternFlag !=1 && ulChromaBin99==1) )
  8645. {
  8646. if ( (((ulHistBin[0]+ulHistBin[1]+ulHistBin[14]+ulHistBin[15])*100) / dwTotalPixel ) > 65 )
  8647. pHwContext->ulHistCaseCur = 32; // black & white scene
  8648. else
  8649. pHwContext->ulHistCaseCur = 31; // gray scene
  8650. }
  8651. else if ( pHwContext->ulHistCaseCur==0 || (GrayPatternFlag ==1 && ulChromaBin98==1))
  8652. pHwContext->ulHistCaseCur = 31; // gray scene
  8653. else if ( pHwContext->ulHistCaseCur==0 || (GrayPatternFlag ==1 && ulChromaBin99==1))
  8654. pHwContext->ulHistCaseCur = 31; // gray scene
  8655. ucTempDCCSceneID = pHwContext->ulHistCaseCur;
  8656. // prevent flicker
  8657. if (Var_cond_en[6]==1)
  8658. {
  8659. tmp1 = 0;
  8660. for(i=0; i<4; i++)
  8661. {
  8662. if ((INT32)CurHistWeight[i].ulWeight>=(INT32)PreHistWeight[i].ulWeight)
  8663. {
  8664. tmp = ((INT32)CurHistWeight[i].ulWeight-(INT32)PreHistWeight[i].ulWeight);
  8665. if ((flicker_cnt>0)&&(flicker_cnt<20))
  8666. flicker_cnt = flicker_cnt + 1;
  8667. else if (flicker_cnt<20)
  8668. flicker_cnt = flicker_cnt + 2;
  8669. }
  8670. else
  8671. {
  8672. tmp = ((INT32)PreHistWeight[i].ulWeight-(INT32)CurHistWeight[i].ulWeight);
  8673. if ((flicker_cnt<0)&&(flicker_cnt>-20))
  8674. flicker_cnt = flicker_cnt - 1;
  8675. else if (flicker_cnt>-20)
  8676. flicker_cnt = flicker_cnt - 2;
  8677. }
  8678. tmp1 += tmp;
  8679. }
  8680. tmp = (PreHistWeight[0].ulWeight+PreHistWeight[1].ulWeight+PreHistWeight[2].ulWeight+PreHistWeight[3].ulWeight)/18;
  8681. if ((tmp1 < tmp)&&(flicker_cnt<10)&&(flicker_cnt>-10)&&
  8682. (pHwContext->ulHistCaseCur!=ulHistCasePre)&&
  8683. (ucSceneChangeEvent==0)&&
  8684. (ulHistCasePre!=32 || pHwContext->ulHistCaseCur!= 32)&&
  8685. (PQ_ChromaBinPercentage(0)<980)&&
  8686. (((CurHistWeight[0].ucIndex == PreHistWeight[0].ucIndex)||(CurHistWeight[0].ucIndex == PreHistWeight[1].ucIndex))&&
  8687. ((CurHistWeight[1].ucIndex == PreHistWeight[0].ucIndex)||(CurHistWeight[1].ucIndex == PreHistWeight[1].ucIndex))))
  8688. {
  8689. pHwContext->ulHistCaseCur = ulHistCasePre;
  8690. hit_flicker = 1;
  8691. }
  8692. else
  8693. {
  8694. flicker_cnt = 0;
  8695. hit_flicker = 0;
  8696. }
  8697. }
  8698. if(pHwContext->ulHistCaseCur != ulHistCasePre)
  8699. {
  8700. //PQDebugPrint("tmp1 = %d", tmp1);
  8701. PQDebugPrint("ulHistCaseCur = %d, ulHistCasePre = %d", (pHwContext->ulHistCaseCur-1), (ulHistCasePre-1));
  8702. PQDebugPrint("index =%9d%9d%9d%9d ", CurHistWeight[0].ucIndex, CurHistWeight[1].ucIndex, CurHistWeight[2].ucIndex, CurHistWeight[3].ucIndex);
  8703. PQDebugPrint("weight=%9ld%9ld%9ld%9ld ", CurHistWeight[0].ulWeight, CurHistWeight[1].ulWeight, CurHistWeight[2].ulWeight, CurHistWeight[3].ulWeight);
  8704. }
  8705. HistCaseNum = pHwContext->ulHistCaseCur - 1;
  8706. for(i=0; i<16; i++)
  8707. {
  8708. ulTargetSlop[i]= SWDC_HistSlop[0].SWDC_HistSlop[HistCaseNum][i]*2;
  8709. ulTargetChroma[i]= SWDC_HistChroma[0].SWDC_HistChroma[HistCaseNum][i]*2;
  8710. }
  8711. // shrink black level 20140116
  8712. if (Var_cond_en[3]==1 && PQ_GetAvgY_Value()>120 && pHwContext->ulHistCaseCur != 31 && pHwContext->ulHistCaseCur != 32)
  8713. {
  8714. // if (((HistCaseNum==0)&&(((ulHistBin[0]+ulHistBin[1])>dwTotalPixel*600/1000)&&((ulHistBin[2]+ulHistBin[3])<dwTotalPixel*75/1000))) ||
  8715. // ((ulHistBin[0]>dwTotalPixel*150/1000)&&((ulHistBin[0]+ulHistBin[1])>dwTotalPixel*600/1000)&&((ulHistBin[2]+ulHistBin[3])<dwTotalPixel*150/1000)))
  8716. //(((ulHistBin[1]+ulHistBin[2])>dwTotalPixel*600/1000)&&(ulHistBin[3]<dwTotalPixel*150/1000)) ||
  8717. // (((ulHistBin[0]+ulHistBin[1]+ulHistBin[2])>dwTotalPixel*900/1000)&&(ulHistBin[3]<dwTotalPixel*50/1000)) ||
  8718. // ((ulHistBin[2]>dwTotalPixel*900/1000)&&(ulHistBin[3]<dwTotalPixel*50/1000)))
  8719. // {
  8720. if ((ulHistBin[0]+ulHistBin[1]+ulHistBin[2]+ulHistBin[3])>dwTotalPixel*200/1000)
  8721. {
  8722. tmp1 = 8*ulTargetSlop[0]/10;//8*ulTargetSlop[0]/10; //ulTargetSlop[0]/2;
  8723. tmp2 = 4*ulTargetSlop[1]/10;//3*ulTargetSlop[1]/4; //3*ulTargetSlop[1]/4;
  8724. tmp3 = 7*ulTargetSlop[2]/8;//7*ulTargetSlop[2]/8; //9*ulTargetSlop[2]/10;
  8725. }
  8726. else
  8727. {
  8728. tmp1 = ulTargetSlop[0]/2;
  8729. tmp2 = 3*ulTargetSlop[1]/4;
  8730. tmp3 = 9*ulTargetSlop[2]/10;
  8731. }
  8732. tmp = (ulTargetSlop[0]-tmp1) + (ulTargetSlop[1]-tmp2) + (ulTargetSlop[2]-tmp3);
  8733. ulTargetSlop[0] = tmp1;
  8734. ulTargetSlop[1] = tmp2;
  8735. ulTargetSlop[2] = tmp3;
  8736. tmp4 = tmp/13;
  8737. tmp5 = tmp - 13*tmp4;
  8738. for (i=3; i<15; i++)
  8739. {
  8740. ulTargetSlop[i] = ulTargetSlop[i] + tmp4;
  8741. }
  8742. ulTargetSlop[15] = ulTargetSlop[15] + tmp4 + tmp5;
  8743. // }
  8744. }
  8745. //for spacial case II (reduce background noise effect)
  8746. //if (Var_cond_en[5]==1)
  8747. if (Var_cond_en[5]==1 || pHwContext->ulHistCaseCur == 32 )
  8748. {
  8749. tmp = 0;
  8750. tmp1 = 0;
  8751. for(i=2; i<14; i++)
  8752. {
  8753. if ((((ulHistBin[i]>dwTotalPixel*250/1000)&&(ulHistBin[i]>3*ulHistBin[i-1])&&(ulHistBin[i]>3*ulHistBin[i+1])) ||
  8754. ((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))
  8755. {
  8756. if (i<4)
  8757. tmp2 = 2*ulTargetSlop[i]/3;
  8758. else
  8759. tmp2 = ulTargetSlop[i]/2;
  8760. pre_nr = 1;
  8761. tmp3 = ulTargetSlop[i]-tmp2;
  8762. tmp += tmp3;
  8763. ulTargetSlop[i] = tmp2;
  8764. }
  8765. else if (((((ulHistBin[i]+ulHistBin[i+1])>dwTotalPixel*500/1000)&&(ulHistBin[i]>dwTotalPixel*250/1000)&&
  8766. ((ulHistBin[i]+ulHistBin[i+1])>6*ulHistBin[i-1])&&((ulHistBin[i]+ulHistBin[i+1])>6*ulHistBin[i+2])) ||
  8767. ((pre_nr==1)&&((ulHistBin[i]+ulHistBin[i+1])>dwTotalPixel*450/1000)&&(ulHistBin[i]>dwTotalPixel*240/1000)&&
  8768. ((ulHistBin[i]+ulHistBin[i+1])>5*ulHistBin[i-1])&&((ulHistBin[i]+ulHistBin[i+1])>5*ulHistBin[i+2]))) &&(ulTargetSlop[i]>64))
  8769. {
  8770. if (ulHistBin[i]>5*ulHistBin[i+1]/3)
  8771. {
  8772. if (i<4)
  8773. tmp2 = 2*ulTargetSlop[i]/3;
  8774. else
  8775. tmp2 = ulTargetSlop[i]/2;
  8776. tmp3 = ulTargetSlop[i]-tmp2;
  8777. tmp += tmp3;
  8778. ulTargetSlop[i] = tmp2;
  8779. }
  8780. else if (ulHistBin[i+1]>5*ulHistBin[i]/3)
  8781. {
  8782. if (i<4)
  8783. tmp2 = 2*ulTargetSlop[i+1]/3;
  8784. else
  8785. tmp2 = ulTargetSlop[i+1]/2;
  8786. tmp3 = ulTargetSlop[i+1]-tmp2;
  8787. tmp += tmp3;
  8788. ulTargetSlop[i+1] = tmp2;
  8789. }
  8790. else
  8791. {
  8792. tmp2 = 2*ulTargetSlop[i]/3;
  8793. tmp3 = ulTargetSlop[i]-tmp2;
  8794. tmp += tmp3;
  8795. ulTargetSlop[i] = tmp2;
  8796. tmp2 = 2*ulTargetSlop[i+1]/3;
  8797. tmp3 = ulTargetSlop[i+1]-tmp2;
  8798. tmp += tmp3;
  8799. ulTargetSlop[i+1] = tmp2;
  8800. }
  8801. pre_nr = 1;
  8802. }
  8803. else if ((((ulHistBin[i]>dwTotalPixel*350/1000)&&((ulHistBin[i]+ulHistBin[i-1])<=dwTotalPixel*500/1000)) ||
  8804. ((pre_nr==1)&&(ulHistBin[i]>dwTotalPixel*300/1000)&&((ulHistBin[i]+ulHistBin[i-1])<=dwTotalPixel*450/1000)))&&(ulTargetSlop[i]>64))
  8805. {
  8806. if (i<4)
  8807. tmp2 = 2*ulTargetSlop[i]/3;
  8808. else
  8809. tmp2 = ulTargetSlop[i]/2;
  8810. tmp3 = ulTargetSlop[i]-tmp2;
  8811. tmp += tmp3;
  8812. ulTargetSlop[i] = tmp2;
  8813. pre_nr = 1;
  8814. }
  8815. else
  8816. {
  8817. pre_nr = 0;
  8818. }
  8819. }
  8820. tmp3 = tmp>>4;
  8821. tmp4 = tmp - 16*tmp3;
  8822. for(i=0; i<15; i++)
  8823. {
  8824. tmp5 = (INT32)ulTargetSlop[i] + tmp3;
  8825. if (tmp5>4095)
  8826. {
  8827. tmp4 += (tmp5 - 4095);
  8828. ulTargetSlop[i] = 4095;
  8829. }
  8830. else
  8831. ulTargetSlop[i] = tmp5;
  8832. }
  8833. tmp6 = (INT32)ulTargetSlop[15] + tmp3 + tmp4;
  8834. if (tmp6>4095)
  8835. ulTargetSlop[15] = 4095;
  8836. else
  8837. ulTargetSlop[15] = tmp6;
  8838. }
  8839. // static contrast
  8840. PQ_SW_DynamicContrast_UserCurveAdjust();
  8841. tmp1 = 0;
  8842. tmp2 = 0;
  8843. for(i=0; i<16; i++)
  8844. {
  8845. tmp =(INT32)ulTargetSlop[i] + (INT32)pHwContext->ulCurveSlop[i];
  8846. if (tmp<0)
  8847. tmp = 0;
  8848. else if (tmp>4095)
  8849. tmp = 4095;
  8850. tmp1 += tmp;
  8851. if ((tmp1>4095)&&(tmp2<=4095))
  8852. ulTargetSlop[i] = 4095-tmp2;
  8853. else if (tmp1>4095)
  8854. ulTargetSlop[i] = 0;
  8855. else
  8856. ulTargetSlop[i] = tmp;
  8857. tmp2 = tmp1;
  8858. }
  8859. tmp1 = 0;
  8860. tmp2 = 0;
  8861. for(i=0; i<16; i++)
  8862. {
  8863. tmp = (((INT32)ulTargetSlop[i]-256)*iYLevel+256*256+128)>>8;
  8864. if (tmp<0)
  8865. tmp = 0;
  8866. else
  8867. tmp1 += tmp;
  8868. if ((tmp1>4095)&&(tmp2<=4095))
  8869. ulTargetSlop[i] = 4095-tmp2;
  8870. else if (tmp1>4095)
  8871. ulTargetSlop[i] = 0;
  8872. else
  8873. ulTargetSlop[i] = tmp; //21
  8874. tmp2 = tmp1;
  8875. ulTargetChroma[i] = (((INT32)ulTargetChroma[i]-256)*iCLevel+256*256+128)>>8;
  8876. }
  8877. //for spacial case III ( expand white )
  8878. //tmp = ulHistBin[12]+ulHistBin[13]+ulHistBin[14]+ulHistBin[15];
  8879. //if (Var_cond_en[7]==1)// && (tmp > dwTotalPixel*10/1000))
  8880. if ((Var_cond_en[7]==1 || pHwContext->ulHistCaseCur == 31) && pHwContext->ulHistCaseCur != 32)
  8881. {
  8882. tmp1 = 0;
  8883. tmp2 = 96;
  8884. if ((ulHistBin[12]+ulHistBin[13]+ulHistBin[14]+ulHistBin[15])>dwTotalPixel*250/1000)
  8885. {
  8886. for (i=12; i<16; i++)
  8887. {
  8888. if ((INT32)ulTargetSlop[i]<(i-11)*tmp2)
  8889. {
  8890. tmp = (i-11)*tmp2 - (INT32)ulTargetSlop[i];
  8891. tmp1 += tmp;
  8892. ulTargetSlop[i] = (i-11)*tmp2;
  8893. }
  8894. }
  8895. tmp2 = tmp1>>4;
  8896. tmp3 = tmp1-16*tmp2;
  8897. for (i=0; i<16; i++)
  8898. {
  8899. tmp4 = ulTargetSlop[i];
  8900. if (tmp4>tmp2)
  8901. ulTargetSlop[i] = tmp4-tmp2;
  8902. else
  8903. {
  8904. ulTargetSlop[i] = 0;
  8905. tmp3 = tmp3 + (tmp2-tmp4);
  8906. }
  8907. }
  8908. tmp2 = tmp3>>2;
  8909. tmp5 = tmp3-4*tmp2;
  8910. for (i=12; i<16; i++)
  8911. {
  8912. tmp4 = ulTargetSlop[i];
  8913. if (tmp4>tmp2)
  8914. ulTargetSlop[i] = tmp4-tmp2;
  8915. else
  8916. {
  8917. ulTargetSlop[i] = 0;
  8918. tmp5 = tmp5 + (tmp2-tmp4);
  8919. }
  8920. }
  8921. tmp4 = ulTargetSlop[15];
  8922. if (tmp4 > tmp5)
  8923. ulTargetSlop[15] = tmp4 - tmp5;
  8924. else
  8925. ulTargetSlop[15] = 0;
  8926. }
  8927. }
  8928. tmp1 =0;
  8929. tmp2 = 0;
  8930. for(i=0; i<16; i++)
  8931. {
  8932. if(!ucSceneChangeEvent)
  8933. {
  8934. tmp = (INT32)ulTargetSlop[i] + (((INT32)ulPreTargetSlop[i]-(INT32)ulTargetSlop[i])*alpha)/256;
  8935. tmp1 += tmp;
  8936. if ((tmp1>4095)&&(tmp2<=4095))
  8937. ulTargetSlop[i] = 4095-tmp2;
  8938. else if (tmp1>4095)
  8939. ulTargetSlop[i] = 0;
  8940. else
  8941. ulTargetSlop[i] = tmp; //21
  8942. tmp2 = tmp1;
  8943. }
  8944. if(!ucSceneChangeEvent)
  8945. {
  8946. tmp = (INT32)ulTargetChroma[i] + (((INT32)ulPreTargetChroma[i]-(INT32)ulTargetChroma[i])*alpha)/256;
  8947. ulTargetChroma[i] = tmp;
  8948. }
  8949. }
  8950. // For special case IV - pure blue pattern : noise
  8951. ulCurChromaBinPercentage7 = PQ_ChromaBinPercentage(7);
  8952. ulCurChromaBinPercentage8 = PQ_ChromaBinPercentage(8);
  8953. if ( (ulHistBin[1] == dwTotalPixel || ulHistBin[2] == dwTotalPixel) && (ulCurChromaBinPercentage7 > 998 || ulCurChromaBinPercentage8 > 998) ) BluePatternFlag = 1;
  8954. else BluePatternFlag = 0;
  8955. //set register
  8956. for(i=0; i<16; i++)
  8957. {
  8958. PQ_RegisterWrite(VIP_reg_dpy_hist_slope0+i*4 ,ulTargetSlop[i]);
  8959. }
  8960. PQ_RegisterWrite(VIP_reg_dpy_hist_start0 , 0);
  8961. tmp = 0;
  8962. for(i=1; i<16; i++)
  8963. {
  8964. tmp = tmp +(ulTargetSlop[i-1]<<2);
  8965. if (tmp>16367)
  8966. {
  8967. tmp = 16367;
  8968. ulTargetSlop[i] = 0;
  8969. PQ_RegisterWrite(VIP_reg_dpy_hist_slope0+i*4 ,ulTargetSlop[i]);
  8970. }
  8971. PQ_RegisterWrite(VIP_reg_dpy_hist_start0+i*4 ,tmp);
  8972. }
  8973. for(i=0; i<16; i++)
  8974. {
  8975. PQ_RegisterWrite(VIP_reg_dpy_hist_chroma0+i*4 ,ulTargetChroma[i]);
  8976. }
  8977. ulPreAvgY = ulCurAvgY;
  8978. if (hit_flicker==0) memcpy(PreHistWeight, CurHistWeight, sizeof(UINT32)*8);
  8979. ulHistCasePre = pHwContext->ulHistCaseCur;
  8980. PreYLevel = iYLevel;
  8981. PreCLevel = iCLevel;
  8982. memcpy(ulPreTargetSlop,ulTargetSlop,sizeof(INT32)*16);
  8983. memcpy(ulPreTargetChroma, ulTargetChroma,sizeof(INT32)*16);
  8984. // *(UINT8 *)0xbe1cd688=0x0; //sharlene
  8985. }
  8986. void PQ_SW_DynamicContrast_Enable(UINT8 wValue)
  8987. {
  8988. if(wValue >1)
  8989. {
  8990. return;
  8991. }
  8992. SWDC_Param[0].ucSWDC_En = wValue;
  8993. }
  8994. UINT8 PQ_GetDynamicContrastEnable(void)
  8995. {
  8996. return SWDC_Param[0].ucSWDC_En;
  8997. }
  8998. void PQ_SW_DynamicContrast_Y_Level(UINT16 wValue)
  8999. {
  9000. if(wValue >512)
  9001. {
  9002. return;
  9003. }
  9004. SWDC_Param[0].wSWDC_YLevel= wValue;
  9005. }
  9006. void PQ_SW_DynamicContrast_C_Level(UINT16 wValue)
  9007. {
  9008. if(wValue >512)
  9009. {
  9010. return;
  9011. }
  9012. SWDC_Param[0].wSWDC_CLevel= wValue;
  9013. }
  9014. void PQ_SW_DynamicContrast_Alpha_Mode(UINT8 bMode ,UINT8 bValue)
  9015. {
  9016. if(bMode>3)
  9017. {
  9018. return;
  9019. }
  9020. SWDC_Param[0].wSWDC_Static_Alpha[bMode]= bValue;
  9021. }
  9022. #endif
  9023. UINT8 VIP_Get_PQ_Source(UINT8 ucSource, UINT8 ucSubSource)
  9024. {
  9025. PQ_DLC_SRC bIndex=HDMI_IN;
  9026. switch(ucSource)
  9027. {
  9028. case EXTS:
  9029. if( ucSubSource==YPP1 || ucSubSource==YPP2)
  9030. {
  9031. if(PQ_GetDefinitionIndex())
  9032. {
  9033. bIndex = COMP_HD_IN;
  9034. }
  9035. else
  9036. {
  9037. bIndex = COMP_IN;
  9038. }
  9039. #if SEPERATE_YPBPR1_YPBPR2
  9040. if(VIP_JudgeDVDSource()) //DVD have no HD resolution
  9041. {
  9042. bIndex = DVD_IN;
  9043. }
  9044. #endif
  9045. }
  9046. else if(ucSubSource==SCART_RGB1)
  9047. {
  9048. bIndex = SCART_IN;
  9049. }
  9050. else if( ucSubSource==DSUB )
  9051. {
  9052. bIndex = PC_IN;
  9053. }
  9054. break;
  9055. case CVD2:
  9056. if( ucSubSource==TV_INPUT_CHANNEL )
  9057. {
  9058. bIndex = ATV_IN;
  9059. }
  9060. else if( ucSubSource==AV1_INPUT_CHANNEL || ucSubSource==AV2_INPUT_CHANNEL || ucSubSource==AV3_INPUT_CHANNEL )
  9061. {
  9062. bIndex = AV_IN;
  9063. }
  9064. if( ucSubSource==S1_INPUT_CHANNEL || ucSubSource==S2_INPUT_CHANNEL || ucSubSource==S3_INPUT_CHANNEL )
  9065. {
  9066. bIndex = SV_IN;
  9067. }
  9068. break;
  9069. case MPEG:
  9070. {
  9071. if(PQ_GetDefinitionIndex())
  9072. {
  9073. bIndex = DTV_HD_IN;
  9074. }
  9075. else
  9076. {
  9077. bIndex = DTV_IN;
  9078. }
  9079. }
  9080. break;
  9081. case HDMI:
  9082. default:
  9083. if(VIP_RunDVIMode())
  9084. {
  9085. bIndex = PC_IN;
  9086. }
  9087. else
  9088. {
  9089. if(PQ_GetDefinitionIndex())
  9090. {
  9091. bIndex = HDMI_HD_IN;
  9092. }
  9093. else
  9094. {
  9095. bIndex = HDMI_IN;
  9096. }
  9097. }
  9098. break;
  9099. case JPEG:
  9100. case PATN:
  9101. bIndex = PC_IN;
  9102. break;
  9103. }
  9104. return bIndex;
  9105. }
  9106. #ifdef DYNAMIC_BACKLIGHT
  9107. UINT8 PQ_GETAllBlackStatus(void)
  9108. {
  9109. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  9110. return pDBL->ucAllBlackStatus;
  9111. }
  9112. UINT32 PQ_GetBackLight(void)
  9113. {
  9114. PQHW_CONTEXT* pHwContext= &PQHwContext;
  9115. UINT32 dwCur, dwBackLightAddr= REG_ADR2_PWM0_BACKLIGHT + PQ_GetPanelPWMNum() * 8;
  9116. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  9117. dwCur= *((UINT32 *)(dwBackLightAddr));
  9118. dwCur &= (~0x80000000);
  9119. if(pDBL->ucOrder)
  9120. dwCur = pDBL->dwTableMax - dwCur + pDBL->dwTableMin;
  9121. if(pHwContext->ucLocationMode == HOMEMODE)
  9122. {
  9123. dwCur = pDBL->dwLightMin + ((dwCur - pDBL->dwLightMin)*100+32)/70;
  9124. }
  9125. return dwCur;
  9126. }
  9127. void PQ_SetDIM_REF_CTRL(UINT32 pwm_number, UINT32 status, UINT32 mmiovalue)
  9128. {
  9129. UINT32 dwBackLightAddr, dwBackLightAddrPeroid;
  9130. PBRVIP_FLASH brvip_flash_p = (PBRVIP_FLASH)SPI_PANELSET_SHADOWADDR;
  9131. u32 BLBase = 0;
  9132. u32 Pclk = 0;
  9133. #ifdef CONFIG_SUPPORT_PWMFrequency_SaveIn_FactoryMode
  9134. BootRomShareData_t *BootromShareData = (void *) KMFBR_ShareData_ShadowAddress;
  9135. #endif
  9136. #ifdef CONFIG_SUPPORT_PWMFrequency_SaveIn_FactoryMode
  9137. if(BootromShareData->PwmFreq == 0)
  9138. BootromShareData->PwmFreq = brvip_flash_p->LCDBackLight_PWMFrq;
  9139. #endif
  9140. if(brvip_flash_p->LCDBackLight_PWMSrc == 0)
  9141. {
  9142. if(brvip_flash_p->PanelParameter.LvdsParam_60.TxDiv > 0)
  9143. {
  9144. 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);
  9145. }
  9146. #ifdef CONFIG_SUPPORT_PWMFrequency_SaveIn_FactoryMode
  9147. if(BootromShareData->PwmFreq > 0)
  9148. {
  9149. BLBase = Pclk /BootromShareData->PwmFreq;
  9150. }
  9151. #else
  9152. if(brvip_flash_p->LCDBackLight_PWMFrq > 0)
  9153. {
  9154. BLBase = Pclk /brvip_flash_p->LCDBackLight_PWMFrq;
  9155. }
  9156. #endif
  9157. }
  9158. else
  9159. {
  9160. #ifdef CONFIG_SUPPORT_PWMFrequency_SaveIn_FactoryMode
  9161. if(BootromShareData->PwmFreq > 0)
  9162. {
  9163. BLBase = REFCLK*1000/BootromShareData->PwmFreq;
  9164. }
  9165. #else
  9166. if(brvip_flash_p->LCDBackLight_PWMFrq > 0)
  9167. {
  9168. BLBase = REFCLK*1000/brvip_flash_p->LCDBackLight_PWMFrq;
  9169. }
  9170. #endif
  9171. }
  9172. if(BLBase == 0)
  9173. {
  9174. BLBase = 1; //avoid overflowed constant
  9175. }
  9176. if ( pwm_number < 4 ) {
  9177. dwBackLightAddrPeroid = REG_ADR1_PWM0_BACKLIGHT + (pwm_number * 8);
  9178. dwBackLightAddr = REG_ADR2_PWM0_BACKLIGHT + (pwm_number * 8);
  9179. *((UINT32 *)(dwBackLightAddr)) = 0; // turn off PWM
  9180. if ( status != 0 ) { // turn on PWM
  9181. #ifdef CONFIG_PANEL_BACKLIGHT_DIM_REF
  9182. if ( (pwm_number==0) || (pwm_number==2) ) { // REF 25KHz, Duty: 80%
  9183. if(CONFIG_PANEL_PWM_REF_PERIOD > 0)
  9184. {
  9185. *((UINT32 *)(dwBackLightAddrPeroid)) = 0x1770000 / CONFIG_PANEL_PWM_REF_PERIOD;
  9186. *((UINT32 *)(dwBackLightAddr)) = ((0x1770000 / CONFIG_PANEL_PWM_REF_PERIOD) * CONFIG_PANEL_PWM_DIM_DUTY/100) | 0x80000000;
  9187. }
  9188. }
  9189. else if ( pwm_number == 3) {
  9190. *((UINT32 *)(dwBackLightAddrPeroid)) = BLBase-1;
  9191. *((UINT32 *)(dwBackLightAddr)) = mmiovalue;
  9192. }
  9193. #else
  9194. *((UINT32 *)(dwBackLightAddrPeroid)) = BLBase-1;
  9195. *((UINT32 *)(dwBackLightAddr)) = mmiovalue;
  9196. #endif
  9197. }
  9198. #ifdef CONFIG_PANEL_PWM_REF_INV
  9199. if ( (0==status) && ((0==pwm_number) || (2==pwm_number)) ) {
  9200. if(CONFIG_PANEL_PWM_REF_PERIOD > 0)
  9201. {
  9202. *((UINT32 *)(dwBackLightAddrPeroid)) = (0x1770000 / CONFIG_PANEL_PWM_REF_PERIOD)-1;
  9203. *((UINT32 *)(dwBackLightAddr)) = (0x1770000 / CONFIG_PANEL_PWM_REF_PERIOD) | 0x80000000;
  9204. }
  9205. #if (CONFIG_CHIPID == 0x331 || CONFIG_CHIPID == 0x533)
  9206. if ( 2==pwm_number ) {
  9207. GPIOFunctionSelect(30, 0);
  9208. }
  9209. #endif
  9210. }
  9211. #if 0
  9212. #elif defined(CONFIG_PANEL_ADJ_INVERT)
  9213. if ( (0==status) && (2==pwm_number) ) {
  9214. #if (CONFIG_CHIPID == 0x331 || CONFIG_CHIPID == 0x533)
  9215. GPIOFunctionSelect(30, 0);
  9216. #endif
  9217. }
  9218. #endif
  9219. #endif
  9220. }
  9221. }
  9222. void PQ_SetBackLight(UINT32 dwValue)
  9223. {
  9224. PQHW_CONTEXT* pHwContext= &PQHwContext;
  9225. UINT32 dwBackLightAddr= REG_ADR2_PWM0_BACKLIGHT + PQ_GetPanelPWMNum() * 8;
  9226. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  9227. if(pHwContext->ucLocationMode == HOMEMODE)
  9228. {
  9229. dwValue = pDBL->dwLightMin + ((dwValue - pDBL->dwLightMin)*70+50)/100;
  9230. }
  9231. if(pDBL->ucOrder)
  9232. {
  9233. dwValue = pDBL->dwTableMax - dwValue + pDBL->dwTableMin;
  9234. }
  9235. *((UINT32 *)(dwBackLightAddr))= dwValue|0x80000000;
  9236. }
  9237. UINT32 PQ_GetRealBackLight(void)
  9238. {
  9239. UINT32 dwCur, dwBackLightAddr= REG_ADR2_PWM0_BACKLIGHT + PQ_GetPanelPWMNum() * 8;
  9240. dwCur= *((UINT32 *)(dwBackLightAddr));
  9241. dwCur &= (~0x80000000);
  9242. return dwCur;
  9243. }
  9244. void PQ_SetRealBackLight(UINT32 dwValue)
  9245. {
  9246. UINT32 dwBackLightAddr= REG_ADR2_PWM0_BACKLIGHT + PQ_GetPanelPWMNum() * 8;
  9247. *((UINT32 *)(dwBackLightAddr))= dwValue|0x80000000;
  9248. }
  9249. UINT32 PQ_GetHomeModeValue(UINT32 *pValue)
  9250. {
  9251. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  9252. PQHW_CONTEXT* pHwContext= &PQHwContext;
  9253. UINT32 uiValue= *pValue;
  9254. if(pHwContext->ucLocationMode == HOMEMODE)
  9255. {
  9256. uiValue = pDBL->dwLightMin + ((uiValue - pDBL->dwLightMin)*80+50)/100;
  9257. }
  9258. return uiValue;
  9259. }
  9260. void PQ_GetLightSensorInfo(UINT8 ucLSensorEn,UINT8 ucIndex, UINT32 dwLight)
  9261. {
  9262. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  9263. PQHW_CONTEXT* pHwContext= &PQHwContext;
  9264. UINT32 ulCurBackLight, ulCurBLRate = 0;//, ulTargeBackLight
  9265. static UINT8 ucLastLSensorEn = 0;
  9266. UINT8 ucTmpLevel;
  9267. dwLight &= ~(0x80000000);
  9268. if(pDBL->ucOrder)
  9269. dwLight = pDBL->dwTableMax - dwLight + pDBL->dwTableMin;
  9270. PQDebugPrint("%s:ucLSensorEn = %d, udwLight = %ld(0x%lx)",__FUNCTION__, ucLSensorEn, dwLight, dwLight);
  9271. if(pHwContext->ucLocationMode != STOREMODE)
  9272. {
  9273. pHwContext->ucLocationMode = STOREMODE;
  9274. PQDebugPrint("&&&&&&&&&&close store mode&&&&&&&&&&&");
  9275. }
  9276. if( dwLight < pDBL->dwTableMin || dwLight>pDBL->dwTableMax )
  9277. {
  9278. PQDebugPrint("out of range:%ld~%ld(%ld)", pDBL->dwTableMin, pDBL->dwTableMax, dwLight);
  9279. return;
  9280. }
  9281. pDBL->bLightSensor = ucLSensorEn;
  9282. PQDebugPrint("pDBL->dwLightMax = %ld, pDBL->dwLightMin = %ld", pDBL->dwLightMax, pDBL->dwLightMin);
  9283. if(pDBL->bLSChangeBacklight)
  9284. {
  9285. if((pDBL->dwLightMax-pDBL->dwLightMin) > 0)
  9286. {
  9287. ulCurBLRate = (pDBL->dwLSTarge-pDBL->dwLightMin)*100/(pDBL->dwLightMax-pDBL->dwLightMin);
  9288. }
  9289. }
  9290. else
  9291. {
  9292. if((pDBL->dwLightMax-pDBL->dwLightMin) > 0)
  9293. {
  9294. ulCurBLRate = (PQ_GetBackLight()-pDBL->dwLightMin)*100/(pDBL->dwLightMax-pDBL->dwLightMin);
  9295. }
  9296. }
  9297. ulCurBLRate = min((UINT32)100,ulCurBLRate);
  9298. PQDebugPrint("pDBL->dwTableMin = %ld, pDBL->dwTableMax = %ld, ulCurBLRate = %ld", pDBL->dwTableMin, pDBL->dwTableMax, ulCurBLRate);
  9299. if(ucLSensorEn)
  9300. {
  9301. if((pDBL->dwTableMax-pDBL->dwTableMin) > 0)
  9302. {
  9303. pDBL->dwBackLightRate = (dwLight-pDBL->dwTableMin)*100/(pDBL->dwTableMax-pDBL->dwTableMin);
  9304. }
  9305. if(pDBL->dwBackLightRate == 0)
  9306. pDBL->dwBackLightRate = 100;
  9307. pDBL->dwLightMin = pDBL->dwTableMin;
  9308. pDBL->dwLightMid = pDBL->dwTableMin + (pDBL->dwTableMid-pDBL->dwTableMin)*pDBL->dwBackLightRate/100;
  9309. pDBL->dwLightMax = pDBL->dwTableMin + (pDBL->dwTableMax-pDBL->dwTableMin)*pDBL->dwBackLightRate/100;
  9310. pDBL->dwLightNormal = pDBL->dwTableMin + (pDBL->dwTableNormal-pDBL->dwTableMin)*pDBL->dwBackLightRate/100;
  9311. if(pDBL->dwBackLightRate == 100)
  9312. {
  9313. pDBL->dwLightMin = pDBL->dwTableMin;
  9314. pDBL->dwLightMid = pDBL->dwTableMid;
  9315. pDBL->dwLightMax = pDBL->dwTableMax;
  9316. pDBL->dwLightNormal = pDBL->dwTableNormal;
  9317. }
  9318. }
  9319. else
  9320. {
  9321. pDBL->dwBackLightRate = 100;
  9322. pDBL->dwLightMin = pDBL->dwTableMin;
  9323. pDBL->dwLightMid = pDBL->dwTableMid;
  9324. pDBL->dwLightMax = pDBL->dwTableMax;
  9325. pDBL->dwLightNormal = pDBL->dwTableNormal;
  9326. }
  9327. PQDebugPrint("pDBL->dwBackLightRate = %ld, ucLSensorEn = %d, ucLastLSensorEn = %d", pDBL->dwBackLightRate, ucLSensorEn, ucLastLSensorEn);
  9328. if(pDBL->ucLevel==OFF && pDBL->bLSChangeBacklight==0)
  9329. return;
  9330. if(pDBL->ucAllBlackStatus)
  9331. {
  9332. PQDebugPrint("ignore lightsensor change");
  9333. return;
  9334. }
  9335. //slow change back light when light sensor disable<->enable
  9336. ulCurBackLight = PQ_GetBackLight();
  9337. if(pDBL->dwBackLightRate != 100)
  9338. pDBL->dwLSTarge = pDBL->dwLightMin + (pDBL->dwLightMax-pDBL->dwLightMin)*ulCurBLRate/100;
  9339. else
  9340. pDBL->dwLSTarge = ulCurBackLight;
  9341. pDBL->iLSADD = max((INT32)(pDBL->dwLSTarge - ulCurBackLight)/50, 30);
  9342. pDBL->bLSChangeBacklight = 1;
  9343. PQDebugPrint("rate0:%ld(0x%lx) -> %ld(0x%lx), idiff = %d",ulCurBackLight, ulCurBackLight, pDBL->dwLSTarge, pDBL->dwLSTarge, pDBL->iLSADD);
  9344. ucTmpLevel = pDBL->ucLevel;
  9345. pDBL->ucLevel = OFF;
  9346. if(pDBL->iLSADD == 0 || ucLastLSensorEn == ucLSensorEn)
  9347. PQ_SetBackLight(pDBL->dwLSTarge);
  9348. else
  9349. {
  9350. if(pDBL->bLSChangeBacklight)
  9351. {
  9352. while(pDBL->dwLSTarge != ulCurBackLight)
  9353. {
  9354. if( (signed)((signed)ulCurBackLight+pDBL->iLSADD)<0 )
  9355. ulCurBackLight = 0;
  9356. else
  9357. ulCurBackLight += pDBL->iLSADD;
  9358. if(abs((signed)ulCurBackLight - pDBL->dwLSTarge) < abs(pDBL->iLSADD))
  9359. {
  9360. ulCurBackLight = pDBL->dwLSTarge;
  9361. }
  9362. PQ_SetBackLight(ulCurBackLight);
  9363. PQ_DelayMS(10);
  9364. }
  9365. }
  9366. }
  9367. PQDebugPrint("turn on dynamic backlight:pDBL->ucLevel = %d\n\n", pDBL->ucLevel);
  9368. pDBL->bLSChangeBacklight = 0;
  9369. pDBL->ucLevel = ucTmpLevel;
  9370. ucLastLSensorEn = ucLSensorEn;
  9371. }
  9372. void PQ_SetBacklightParameter(UINT8 ucTop,UINT8 ucBot,UINT8 ucTh_low,UINT8 ucTh_High)
  9373. {
  9374. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  9375. pDBL->ucTop = ucTop;
  9376. pDBL->ucBot = ucBot ;
  9377. pDBL->ucTh_low=ucTh_low ;
  9378. pDBL->ucTh_High=ucTh_High;
  9379. PQDebugPrint("ucTop = %d, ucBot = %d, ucTh_High = %d, ucTh_low = %d",
  9380. pDBL->ucTop, pDBL->ucBot, pDBL->ucTh_High, pDBL->ucTh_low);
  9381. }
  9382. void PQ_LightSensorChange(void)
  9383. {
  9384. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  9385. UINT32 ulCurBackLight = PQ_GetBackLight();
  9386. static UINT8 ucTmpLevel=0xff;
  9387. static UINT32 ucLastBL = 0;
  9388. if(pDBL->bLSChangeBacklight)
  9389. {
  9390. if( pDBL->ucLevel!=0)
  9391. {
  9392. ucTmpLevel = pDBL->ucLevel;
  9393. pDBL->ucLevel = OFF;
  9394. PQDebugPrint("turn off dynamic backlight");
  9395. }
  9396. if(pDBL->dwLSTarge != ulCurBackLight)
  9397. {
  9398. if( (signed)((signed)ulCurBackLight+pDBL->iLSADD)<0 )
  9399. ulCurBackLight = 0;
  9400. else
  9401. ulCurBackLight += pDBL->iLSADD;
  9402. if(abs((signed)ulCurBackLight - pDBL->dwLSTarge) < abs(pDBL->iLSADD))
  9403. {
  9404. //PQDebugPrint("abs(%d-%d)<%d",ulCurBackLight, pDBL->dwLSTarge, pDBL->iLSADD );
  9405. ulCurBackLight = pDBL->dwLSTarge;
  9406. }
  9407. PQ_SetBackLight(ulCurBackLight);
  9408. if(ucLastBL == ulCurBackLight)
  9409. {
  9410. PQDebugPrint("ERR:ulCurBackLight = %ld, pDBL->iLSADD = %d, pDBL->dwLSTarge = %ld", ulCurBackLight, pDBL->iLSADD, pDBL->dwLSTarge);
  9411. ulCurBackLight = pDBL->dwLSTarge;
  9412. PQ_SetBackLight(ulCurBackLight);
  9413. return;
  9414. }
  9415. ucLastBL = ulCurBackLight;
  9416. //PQDebugPrint("%s:rate0:backlight = %ld(0x%lx)",__FUNCTION__, ulCurBackLight, ulCurBackLight);
  9417. }
  9418. else
  9419. {
  9420. ucLastBL = 0;
  9421. pDBL->bLSChangeBacklight = 0;
  9422. pDBL->ucLevel = ucTmpLevel;
  9423. PQDebugPrint("turn on dynamic backlight:pDBL->ucLevel = %d", pDBL->ucLevel);
  9424. }
  9425. }
  9426. }
  9427. void PQ_InitDynamicBackLight(void)
  9428. {
  9429. PBRVIP_FLASH brvip_flash_p = (PBRVIP_FLASH)SPI_PANELSET_SHADOWADDR;
  9430. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  9431. #ifdef CONFIG_SUPPORT_PWMFrequency_SaveIn_FactoryMode
  9432. BootRomShareData_t *BootromShareData = (void *) KMFBR_ShareData_ShadowAddress;
  9433. #endif
  9434. INT32 i;
  9435. UINT32 BLBase = 0, Pclk = 0;
  9436. UINT16 uwMaxduty, uwMinduty;
  9437. sema_init(&pDBL->sem, 1);
  9438. pDBL->ucLevel= OFF;
  9439. pDBL->ucLevelTarget= OFF;
  9440. pDBL->nBound1= 45; //boundary for black ~=10%
  9441. pDBL->nBound2= 65; //boundary for keeping black ~=20%
  9442. pDBL->nBound3= 203; //boundary for keeping white ~=80%
  9443. pDBL->nBound4= 203; //boundary for white ~=90%
  9444. pDBL->wDetectFrameCount= 176; //16x
  9445. #if 0//def CONFIG_PANEL_ADJ_INVERT
  9446. pDBL->ucOrder = 1;
  9447. #else
  9448. pDBL->ucOrder = brvip_flash_p->LCDBackLight_Order;
  9449. #endif
  9450. pDBL->ucDynamicBLType = DYNAMIC_BL_FORMAL;
  9451. GetCustomerData("gElectricity_PWM_table", (void *)&(pDBL->pElectricity_PWM_table), &(pDBL->Electricity_PWM_table_Size));
  9452. pDBL->Electricity_PWM_table_Size = pDBL->Electricity_PWM_table_Size/sizeof(Electity_PWM_Mapping_Table);
  9453. PQ_get_PWM_Duty(&uwMaxduty, &uwMinduty);
  9454. #ifdef CONFIG_SUPPORT_PWMFrequency_SaveIn_FactoryMode
  9455. if(BootromShareData->PwmFreq == 0)
  9456. BootromShareData->PwmFreq = brvip_flash_p->LCDBackLight_PWMFrq;
  9457. #endif
  9458. //LCDBackLightMap[] has possibly not yet initialized here, so vip get value by itself.
  9459. if(brvip_flash_p->LCDBackLight_PWMSrc == 0)
  9460. {
  9461. if((brvip_flash_p->PanelParameter.LvdsParam_60.TxDiv) > 0)
  9462. {
  9463. 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);
  9464. }
  9465. #ifdef CONFIG_SUPPORT_PWMFrequency_SaveIn_FactoryMode
  9466. if(BootromShareData->PwmFreq > 0)
  9467. {
  9468. BLBase = Pclk /BootromShareData->PwmFreq;
  9469. }
  9470. #else
  9471. if(brvip_flash_p->LCDBackLight_PWMFrq > 0)
  9472. {
  9473. BLBase = Pclk /brvip_flash_p->LCDBackLight_PWMFrq;
  9474. }
  9475. #endif
  9476. }
  9477. else
  9478. {
  9479. #ifdef CONFIG_SUPPORT_PWMFrequency_SaveIn_FactoryMode
  9480. if(BootromShareData->PwmFreq > 0)
  9481. {
  9482. BLBase = REFCLK*1000/BootromShareData->PwmFreq;
  9483. }
  9484. #else
  9485. if(brvip_flash_p->LCDBackLight_PWMFrq > 0)
  9486. {
  9487. BLBase = REFCLK*1000/brvip_flash_p->LCDBackLight_PWMFrq;
  9488. }
  9489. #endif
  9490. }
  9491. //LCDBackLightMap[] has possibly not yet initialized here, so vip get value by itself.
  9492. for(i = 0; i <15; i++)
  9493. {
  9494. #ifdef CONFIG_SUPPORT_PWM_DUTY_IN_DECIMAL
  9495. pDBL->BacklightTab[i] = round(BLBase*uwMinduty, 1000) + round((BLBase*(uwMaxduty - uwMinduty) * i), 14*1000);
  9496. #else
  9497. pDBL->BacklightTab[i] = round(BLBase*uwMinduty, 100) + round((BLBase*(uwMaxduty - uwMinduty) * i), 14*100);
  9498. #endif
  9499. }
  9500. pDBL->dwTableMin= pDBL->BacklightTab[0];
  9501. pDBL->dwTableMax= pDBL->BacklightTab[14];
  9502. pDBL->dwTableMid= pDBL->BacklightTab[7];
  9503. pDBL->dwTableNormal= pDBL->BacklightTab[12];
  9504. // to avoid the PWM is wrong order(smaller->larger is right) in panelset.ini
  9505. if( pDBL->dwTableMin>pDBL->dwTableMax )
  9506. {
  9507. pDBL->dwTableNormal= pDBL->dwTableMin;
  9508. pDBL->dwTableMin= pDBL->dwTableMax;
  9509. pDBL->dwTableMax= pDBL->dwTableNormal;
  9510. pDBL->dwTableNormal= pDBL->BacklightTab[2]; //14-12
  9511. }
  9512. pDBL->dwLightMax = pDBL->dwTableMax;
  9513. pDBL->dwLightMid = pDBL->dwTableMid;
  9514. pDBL->dwLightMin = pDBL->dwTableMin;
  9515. pDBL->dwLightNormal= pDBL->dwTableNormal;
  9516. pDBL->dwLightMid =pDBL->dwTableMid;
  9517. pDBL->dwLightQuot= (pDBL->dwTableMax-pDBL->dwTableMin)/VIP_DBL_LEVEL_DEGREE;
  9518. pDBL->bLSChangeBacklight = 0;
  9519. pDBL->bLightSensor = 0;
  9520. pDBL->dwBackLightRate = 100;
  9521. pDBL->ucHistMinPercentage = 40;
  9522. pDBL->nBound1= 42; //16+219*12%
  9523. pDBL->nBound2= 60; //16+219*20%
  9524. pDBL->nBound3= 191; //16+219*80%
  9525. pDBL->nBound4= 209; //16+219*88%
  9526. pDBL->wDetectFrameCount= 288;
  9527. 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);
  9528. PQDebugPrint("%s: dwLightMin=0x%lx dwLightMax=0x%lx dwLightNormal=0x%lx dwLightQuot=0x%lx", __FUNCTION__, pDBL->dwLightMin, pDBL->dwLightMax, pDBL->dwLightNormal, pDBL->dwLightQuot);
  9529. PQDebugPrint("%s: dwTableMin=0x%lx dwTableMax=0x%lx dwTableNormal=0x%lx dwLightQuot=0x%lx", __FUNCTION__, pDBL->dwTableMin, pDBL->dwTableMax, pDBL->dwTableNormal, pDBL->dwLightQuot);
  9530. }
  9531. void PQ_DynamicBackLightAP(UINT8 ucLevel, UINT32 dwMap)
  9532. {
  9533. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  9534. if(dwMap <=14)
  9535. PQ_EnableDynamicBackLight(ucLevel, pDBL->BacklightTab[dwMap]);
  9536. }
  9537. void PQ_EnableDynamicBackLight(UINT8 ucLevel, UINT32 dwLightUser)
  9538. {
  9539. #ifdef DynamicBacklight_EnergyEfficiency
  9540. PQHW_CONTEXT* pHwContext= &PQHwContext;
  9541. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  9542. BOOL bEnable = (ucLevel>=WEAK && ucLevel<=STRONG);
  9543. #endif
  9544. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  9545. //UINT32 dwCur,dwTarget;
  9546. UINT32 dwTarget;
  9547. //INT32 iLoop,iAdd;//,iStep= 8;
  9548. UINT8 ucTmpLS;
  9549. if(PQ_GetColorProcessor() == FALSE)
  9550. return;
  9551. PQ_ADVANCE_HWPrint("%s: ucLevel=%d dwLightUser=0x%x pDBL->ucOrder = %d", __FUNCTION__, ucLevel, dwLightUser, pDBL->ucOrder);
  9552. down(&pDBL->sem);
  9553. pDBL->ucLevel= OFF;
  9554. ucTmpLS = pDBL->bLightSensor;
  9555. pDBL->bLightSensor = OFF; //turn off to prevent action at the same time
  9556. dwTarget= pDBL->dwTableNormal;
  9557. #ifdef DynamicBacklight_EnergyEfficiency
  9558. if(PQ_GetDynamicBLType() == DYNAMIC_BL_ENERGY_EFFICIENCY)
  9559. {
  9560. pDBL->dwTableNormal= pDBL->BacklightTab[12];
  9561. if( pDBL->dwTableMin>pDBL->dwTableMax )
  9562. pDBL->dwTableNormal= pDBL->BacklightTab[2]; //14-12
  9563. }
  9564. #endif
  9565. if( dwTarget>=pDBL->dwTableMin && dwTarget<=pDBL->dwTableMax )
  9566. {
  9567. PQDebugPrint("default = %ld(0x%lx)",dwTarget,dwTarget);
  9568. if(ucTmpLS)
  9569. dwTarget = pDBL->dwTableMin + ((dwTarget - pDBL->dwTableMin)*pDBL->dwBackLightRate+50)/100;
  9570. }
  9571. //init for BL variables
  9572. pDBL->bLightSensor = ucTmpLS;
  9573. pDBL->bLSChangeBacklight = 0;
  9574. PQ_BackLightDetect(TRUE);
  9575. pDBL->dwWhiteLevel= VIP_DBL_INVALID_WHITE_LEVEL;
  9576. pDBL->dwLightTarget= pDBL->dwLightNormal;
  9577. pDBL->iAdd= 0;
  9578. pDBL->ucLevelTarget= ucLevel;
  9579. #ifdef DynamicBacklight_EnergyEfficiency
  9580. if(PQ_GetDynamicBLType()==DYNAMIC_BL_ENERGY_EFFICIENCY)
  9581. {
  9582. if(!bEnable)
  9583. {
  9584. PQ_PresetBackLight(TRUE, dwTarget, BL_QUICK);
  9585. PQ_PresetContrast(TRUE, pMenuValue->iContrast, 1);
  9586. }
  9587. else
  9588. {
  9589. PQ_EEBackLightDetect(FALSE);
  9590. PQ_PresetBackLight(TRUE, pDBL->dwLightTarget, BL_QUICK);
  9591. }
  9592. }
  9593. else
  9594. #endif
  9595. {
  9596. PQ_PresetBackLight(TRUE, dwTarget, PQ_GetHomeModeValue(&dwTarget) > PQ_GetRealBackLight() ? BL_QUICK : BL_SLOW);
  9597. }
  9598. pDBL->ucAllBlackStatus = 0;
  9599. up(&pDBL->sem);
  9600. }
  9601. void PQ_PresetBackLight(BOOL bReset, UINT32 dwLightTarget, INT32 nSpeed)
  9602. {
  9603. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  9604. static UINT8 nPollingIndex= 0;
  9605. static INT32 iAdd = 0;
  9606. static UINT32 dwCur = 0;
  9607. static UINT32 dwTarget = 0;
  9608. static UINT32 dwNext = 0;
  9609. static UINT8 nStep = 1;
  9610. static BOOL bStart = FALSE;
  9611. if(bReset)
  9612. {
  9613. pDBL->ucLevel= OFF;
  9614. dwCur = PQ_GetRealBackLight();
  9615. dwTarget = PQ_GetHomeModeValue(&dwLightTarget);
  9616. if(nSpeed == BL_SLOW)
  9617. nStep = 5;
  9618. else
  9619. nStep = 12;
  9620. iAdd = pDBL->dwLightQuot * nStep;
  9621. if( dwTarget<dwCur )
  9622. iAdd= -(iAdd);
  9623. nPollingIndex = 0;
  9624. bStart = TRUE;
  9625. PQDebugPrint("%s:dwCur = %ld(%#lx), dwTarget = %ld(%#lx), nStep = %d, iAdd = %d",__FUNCTION__,dwCur, dwCur, dwTarget, dwTarget, nStep , iAdd);
  9626. }
  9627. if(bStart == TRUE)
  9628. {
  9629. nPollingIndex++;
  9630. if(nPollingIndex<3)
  9631. return;
  9632. nPollingIndex = 0;
  9633. dwCur = PQ_GetRealBackLight();
  9634. dwNext= dwCur+iAdd;
  9635. if( abs(dwCur - dwTarget) <= abs(dwCur - dwNext))
  9636. {
  9637. dwNext= dwTarget;
  9638. }
  9639. if((iAdd > 0 && dwCur > dwTarget) || (iAdd < 0 && dwCur < dwTarget) || iAdd == 0)//prevent other driver set backlight traversing our target value.
  9640. {
  9641. PQ_SetRealBackLight(dwTarget);
  9642. dwNext = dwCur = dwTarget;
  9643. }
  9644. if( dwNext!=dwCur )
  9645. {
  9646. PQ_SetRealBackLight(dwNext);
  9647. //PQDebugPrint("%s: dwNext=0x%lx dwCur=0x%lx dwTarget=0x%lx pDBL->dwLightMin=0x%lx\n", __FUNCTION__, dwNext, dwCur, dwTarget, pDBL->dwLightMin);
  9648. }
  9649. else
  9650. {
  9651. PQDebugPrint("%s: DONE!!! dwCur=%#lx(%ld)\n", __FUNCTION__, dwCur, dwCur);
  9652. bStart = FALSE;
  9653. pDBL->ucLevel= pDBL->ucLevelTarget;
  9654. }
  9655. }
  9656. }
  9657. void PQ_BackLightDetect(BOOL bReset)
  9658. {
  9659. PQ_PresetBackLight(FALSE, 0, 0);
  9660. #if 0
  9661. #else
  9662. #if 0
  9663. VIP_LEDBackLightDetect(bReset);
  9664. #else
  9665. #ifdef DynamicBacklight_EnergyEfficiency
  9666. if(PQ_GetDynamicBLType() == DYNAMIC_BL_ENERGY_EFFICIENCY)
  9667. {
  9668. PQ_EEBackLightDetect(bReset);
  9669. PQ_PresetContrast(FALSE, 0, 0);
  9670. }
  9671. else
  9672. #endif
  9673. #if 0
  9674. #else
  9675. PQ_FormalBackLightDetect(bReset);
  9676. #endif
  9677. #endif
  9678. #endif
  9679. }
  9680. UINT32 PQ_BackLightTarget(UINT8 nDBLStatus, UINT8 nWhiteCondition, UINT32 dwCur)
  9681. {
  9682. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  9683. UINT32 dwLightTarget;
  9684. #if 0
  9685. INT32 nStep,nSlowStep,nQuickStep;
  9686. nSlowStep= 1;
  9687. nQuickStep= 3;
  9688. if( nDBLStatus==VIP_DBL_STATUS_ENTERING )
  9689. {
  9690. dwLightTarget= (nWhiteCondition==1) ? pDBL->dwLightMin : pDBL->dwLightMax;
  9691. nStep= (nWhiteCondition==1) ? nSlowStep : nQuickStep; //white color want to increase the steps
  9692. }
  9693. else
  9694. {
  9695. dwLightTarget= pDBL->dwLightNormal;
  9696. nStep= nQuickStep;
  9697. }
  9698. pDBL->dwLightTarget= dwLightTarget;
  9699. pDBL->iAdd= pDBL->dwLightQuot*nStep;
  9700. if( dwLightTarget<dwCur )
  9701. pDBL->iAdd= -(pDBL->iAdd);
  9702. #else
  9703. UINT32 dwFrameCount = 0,dwDiff;
  9704. if( nDBLStatus==VIP_DBL_STATUS_ENTERING )
  9705. {
  9706. if( nWhiteCondition==1 )
  9707. {
  9708. dwLightTarget= pDBL->dwLightMin;
  9709. dwDiff= pDBL->dwLightNormal-pDBL->dwLightMin;
  9710. if( pDBL->ucLevel==MEDIUM )
  9711. dwLightTarget= pDBL->dwLightNormal - (dwDiff>>1);
  9712. else if( pDBL->ucLevel==WEAK )
  9713. dwLightTarget= pDBL->dwLightNormal - (dwDiff>>2);
  9714. }
  9715. else
  9716. {
  9717. dwLightTarget= pDBL->dwLightMax;
  9718. dwDiff= pDBL->dwLightMax-pDBL->dwLightNormal;
  9719. if( pDBL->ucLevel==MEDIUM )
  9720. dwLightTarget= pDBL->dwLightNormal + (dwDiff>>1);
  9721. else if( pDBL->ucLevel==WEAK )
  9722. dwLightTarget= pDBL->dwLightNormal + (dwDiff>>2);
  9723. }
  9724. }
  9725. else
  9726. {
  9727. dwLightTarget= pDBL->dwLightNormal;
  9728. }
  9729. //dwCur must be pDBL->dwLightNormal here
  9730. if(pDBL->dwLightQuot==0)
  9731. pDBL->dwLightQuot =1;
  9732. if(pDBL->dwLightQuot > 0)
  9733. {
  9734. dwFrameCount= abs(dwLightTarget-dwCur) / pDBL->dwLightQuot;
  9735. }
  9736. if( nDBLStatus==VIP_DBL_STATUS_ENTERING )
  9737. dwFrameCount= 3 * dwFrameCount;
  9738. if( dwFrameCount==0 )
  9739. dwFrameCount= 1;
  9740. pDBL->dwLightTarget= dwLightTarget;
  9741. pDBL->iAdd= 2*((signed)pDBL->dwLightTarget-(signed)dwCur)/(signed)dwFrameCount;
  9742. if(dwFrameCount<3)
  9743. dwFrameCount = 3;
  9744. if(pDBL->iAdd == 0)
  9745. {
  9746. if((dwFrameCount/3) > 0)
  9747. {
  9748. pDBL->iAdd= 2*((signed)pDBL->dwLightTarget-(signed)dwCur)/(signed)(dwFrameCount/3);
  9749. }
  9750. }
  9751. #endif
  9752. PQDebugPrint("%s: dwLightTarget=0x%lx dwCur=0x%lx iAdd=%x", __FUNCTION__, dwLightTarget, dwCur, pDBL->iAdd);
  9753. return dwLightTarget;
  9754. }
  9755. BOOL PQ_ColorSearchAutoDet(UINT8 ucPath, UINT8 ucColorType ,UINT32 *pulMaxValue, UINT32*pulMinValue)
  9756. {
  9757. BOOL bResault = TRUE;
  9758. static UINT8 ucErrorCnt=ERR_CNT, ucStage = 0;
  9759. static UINT32 MaxValue = 0xffffff, MinValue = 0xffffff;
  9760. if(ucStage == 0)
  9761. {
  9762. PQ_RegisterWrite(VIP_reg_adix_sch_csel, ucColorType); //0-Green/Y, 1-Blue/Pb, 2-Red/Pr
  9763. PQ_RegisterWrite(VIP_reg_adix_sch_en, ENABLE);
  9764. ucErrorCnt=ERR_CNT;
  9765. ucStage =1;
  9766. }else
  9767. {
  9768. ucErrorCnt --;
  9769. if(PQ_RegisterRead(VIP_reg_adix_sch_en)==0)
  9770. {
  9771. MaxValue=PQ_RegisterRead(VIP_sta_xp_color_max);
  9772. MinValue=PQ_RegisterRead(VIP_sta_xp_color_min);
  9773. ucStage =0;
  9774. }
  9775. if(ucErrorCnt == 0)
  9776. {
  9777. ucStage =0;
  9778. bResault = FALSE;
  9779. }
  9780. }
  9781. *pulMaxValue = MaxValue;
  9782. *pulMinValue = MinValue;
  9783. return bResault;
  9784. }
  9785. UINT8 PQ_AllBlackDetect(void)
  9786. {
  9787. UINT32 ulThreshold = (VIP_GetInputDataFormat()==RGB)?10:16;
  9788. UINT32 ulMaxValue, ulMinValue;
  9789. PQ_ColorSearchAutoDet(1, 0 ,&ulMaxValue, &ulMinValue);
  9790. ulMaxValue = ulMaxValue >>2;
  9791. ulMinValue = ulMinValue >>2;
  9792. if(ulMaxValue <= ulThreshold && ulMinValue <= ulThreshold)
  9793. {
  9794. return TRUE;
  9795. }
  9796. else
  9797. {
  9798. return FALSE;
  9799. }
  9800. }
  9801. void PQ_LEDBackLightDetect(BOOL bReset)
  9802. {
  9803. //static UINT8 nPollingIndex= 0;
  9804. static UINT16 wDetectCount= 0, dwLast;
  9805. //static UINT8 nEnteringWhiteCondition= 0;
  9806. static UINT8 nPrevWhiteCondition= 0xff;
  9807. static UINT8 nDBLStatus= VIP_DBL_STATUS_DETECTING, TurnOffBL = 0;
  9808. //BOOL bNeedDown=0;
  9809. UINT8 i,nWhiteCondition;
  9810. UINT32 nGrayLevelCount[16]; // 21 bit at max
  9811. UINT32 dwTotalPixel,dwTotalWhite,dwWhiteLevel;
  9812. UINT32 dwCur,dwTarget=0,dwNext;
  9813. //UINT32 dwGrayLevelAddr= 0xbe1cc6dc;
  9814. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  9815. static UINT8 LastLSChang = 0xff;
  9816. if( bReset )
  9817. {
  9818. //nPollingIndex= 0;
  9819. wDetectCount= 0;
  9820. //nEnteringWhiteCondition= 0;
  9821. nPrevWhiteCondition= 0xff;
  9822. nDBLStatus= VIP_DBL_STATUS_DETECTING;
  9823. LastLSChang = 0xff;
  9824. return;
  9825. }
  9826. if( pDBL->ucLevel==OFF && pDBL->bLSChangeBacklight==0)
  9827. {
  9828. nPrevWhiteCondition = 0xfd;
  9829. LastLSChang = 0xff;
  9830. return;
  9831. }
  9832. for(i=0;i<16;i++)
  9833. nGrayLevelCount[i] = PQ_RegisterRead(VIP_reg_dpy_hist_bin0+i*4);
  9834. dwTotalPixel= 0;
  9835. dwTotalWhite= 0;
  9836. for(i=0; i<16; i++)
  9837. {
  9838. dwTotalWhite+= nGrayLevelCount[i] * (i*16+8);
  9839. dwTotalPixel+= nGrayLevelCount[i];
  9840. }
  9841. if( dwTotalPixel==0 )
  9842. return;
  9843. dwWhiteLevel = dwTotalWhite / dwTotalPixel;
  9844. //White Condition has 5 scopes which is divided by dbl_bound1~4.
  9845. if(PQ_AllBlackDetect())
  9846. nWhiteCondition= 0;
  9847. else if( dwWhiteLevel<=pDBL->nBound1 )
  9848. nWhiteCondition= 1;
  9849. else if( dwWhiteLevel<=pDBL->nBound2 )
  9850. nWhiteCondition= 2;
  9851. else if( dwWhiteLevel<=pDBL->nBound3 )
  9852. nWhiteCondition= 3;
  9853. else
  9854. nWhiteCondition= 5;
  9855. //PQDebugPrint("%s:dwWhiteLevel = %ld, nWhiteCondition = %d",__FUNCTION__, dwWhiteLevel, nWhiteCondition);
  9856. //if(nPrevWhiteCondition!=nWhiteCondition)
  9857. // PQDebugPrint("dwWhiteLevel = %ld, nPrevWhiteCondition = %d, nWhiteCondition = %d", dwWhiteLevel, nPrevWhiteCondition, nWhiteCondition);
  9858. //smooth change in white condition
  9859. if(nPrevWhiteCondition!=nWhiteCondition)
  9860. {
  9861. if( nDBLStatus!=VIP_DBL_STATUS_DETECTING)
  9862. nWhiteCondition = nPrevWhiteCondition;
  9863. else
  9864. {
  9865. if((nPrevWhiteCondition == 0 && pDBL->ucAllBlackStatus)&& nWhiteCondition >=1)
  9866. nWhiteCondition = 1;
  9867. else if(nPrevWhiteCondition == 1&& nWhiteCondition >=3)
  9868. nWhiteCondition = 3;
  9869. if(nPrevWhiteCondition == 5 && nWhiteCondition <=3)
  9870. nWhiteCondition = 3;
  9871. else if(nPrevWhiteCondition == 3 && nWhiteCondition <=1)
  9872. nWhiteCondition = 1;
  9873. }
  9874. }
  9875. //notice kmf if enter/leave all black status
  9876. dwCur=PQ_GetBackLight();
  9877. if(dwCur == pDBL->dwTableMin && dwLast != pDBL->dwTableMin)
  9878. {
  9879. pDBL->ucAllBlackStatus = 1;
  9880. GPIOSetValueByPinFunc(GPIO_PIN_LEDBL_DETECT, GPIO_FUNC_OFFLEVEL);
  9881. PQDebugPrint("noticekmf:enter all black status");
  9882. //noticekmf(NOTICEMSG_BL_ON_OFF, &pDBL->ucAllBlackStatus); weichih mark due to KMF doesn't handle this message
  9883. }
  9884. else
  9885. {
  9886. if(nPrevWhiteCondition == 0 && nWhiteCondition!=0 && TurnOffBL ==1)
  9887. {
  9888. pDBL->ucAllBlackStatus = 0;
  9889. TurnOffBL = 0;
  9890. GPIOSetValueByPinFunc(GPIO_PIN_LEDBL_DETECT, GPIO_FUNC_ONLEVEL);
  9891. PQDebugPrint("noticekmf:leave all black status");
  9892. //noticekmf(NOTICEMSG_BL_ON_OFF, &pDBL->ucAllBlackStatus); weichih mark due to KMF doesn't handle this message
  9893. }
  9894. }
  9895. if(nPrevWhiteCondition != nWhiteCondition)
  9896. {
  9897. PQDebugPrint("%s:change to WhiteCondition = %d\n",__FUNCTION__, nWhiteCondition);
  9898. }
  9899. //cancel dynamic backlight when light sensor change
  9900. if(LastLSChang==0 && pDBL->bLSChangeBacklight==1)
  9901. {
  9902. nDBLStatus=VIP_DBL_STATUS_DETECTING;
  9903. pDBL->iAdd = 0;
  9904. }
  9905. //do dynamic backlight again
  9906. if(LastLSChang==1 && pDBL->bLSChangeBacklight==0)
  9907. nPrevWhiteCondition = nWhiteCondition+1;
  9908. switch(nWhiteCondition)
  9909. {
  9910. case 0:
  9911. if(nPrevWhiteCondition!=nWhiteCondition)
  9912. wDetectCount = 0;
  9913. else
  9914. {
  9915. if(wDetectCount == 6000)
  9916. {
  9917. pDBL->dwLightTarget = pDBL->dwTableMin;
  9918. dwCur=PQ_GetBackLight();
  9919. pDBL->iAdd = (INT32)(pDBL->dwLightTarget - dwCur)/(300);
  9920. PQDebugPrint("&&&&&in 60s(set min backlight), pDBL->dwLightTarget = %ld, pDBL->iAdd = %d, dwCur = %ld", pDBL->dwLightTarget, pDBL->iAdd, dwCur);
  9921. nDBLStatus=VIP_DBL_STATUS_ENTERING;
  9922. TurnOffBL = 1;
  9923. }
  9924. }
  9925. if(pDBL->ucAllBlackStatus && PQ_GetBackLight()!=pDBL->dwTableMin)
  9926. {
  9927. PQDebugPrint("redetect black status");
  9928. pDBL->ucAllBlackStatus = 0;
  9929. wDetectCount = 0;
  9930. }
  9931. if(wDetectCount < 50000)
  9932. wDetectCount++;
  9933. break;
  9934. case 1:
  9935. if(nPrevWhiteCondition!=nWhiteCondition)
  9936. {
  9937. //static UINT8 ucIncreaseStep = 0;
  9938. wDetectCount = 0;
  9939. if(nPrevWhiteCondition==0)
  9940. {
  9941. pDBL->dwLightTarget = pDBL->dwLightMid;
  9942. dwCur=PQ_GetBackLight();
  9943. //if(pDBL->dwLightTarget < dwCur)
  9944. {
  9945. pDBL->iAdd = (INT32)(pDBL->dwLightTarget - dwCur)/(300);
  9946. PQDebugPrint("&&&&&(increase)in 5s(50 percent backlight) pDBL->dwLightTarget = %ld, pDBL->iAdd = %d, dwCur = %ld", pDBL->dwLightTarget, pDBL->iAdd, dwCur);
  9947. nDBLStatus=VIP_DBL_STATUS_ENTERING;
  9948. //ucIncreaseStep = 1;
  9949. }
  9950. }
  9951. }
  9952. else
  9953. {
  9954. if( wDetectCount == 500)
  9955. {
  9956. pDBL->dwLightTarget = pDBL->dwLightMid;
  9957. dwCur=PQ_GetBackLight();
  9958. //if(pDBL->dwLightTarget < dwCur)
  9959. {
  9960. pDBL->iAdd = (INT32)(pDBL->dwLightTarget - dwCur)/(300);
  9961. PQDebugPrint("&&&&&(decrease)in 5s(50 percent backlight) pDBL->dwLightTarget = %ld, pDBL->iAdd = %d, dwCur = %ld", pDBL->dwLightTarget, pDBL->iAdd, dwCur);
  9962. nDBLStatus=VIP_DBL_STATUS_ENTERING;
  9963. }
  9964. }
  9965. /*
  9966. else if(wDetectCount == 6800)
  9967. {
  9968. pDBL->dwLightTarget = pDBL->dwLightMin;
  9969. dwCur=PQ_GetBackLight();
  9970. pDBL->iAdd = (INT32)(pDBL->dwLightTarget - dwCur)/300;
  9971. PQDebugPrint("&&&&&in 60s(set min backlight), pDBL->dwLightTarget = %ld, pDBL->iAdd = %d, dwCur = %ld", pDBL->dwLightTarget, pDBL->iAdd, dwCur);
  9972. nDBLStatus=VIP_DBL_STATUS_ENTERING;
  9973. }
  9974. */
  9975. }
  9976. if(wDetectCount < 50000)
  9977. wDetectCount++;
  9978. break;
  9979. case 2:/*
  9980. if(nPrevWhiteCondition!=nWhiteCondition)
  9981. {
  9982. wDetectCount = 0;
  9983. dwCur=PQ_GetBackLight();
  9984. if(dwCur <= pDBL->dwLightMid)
  9985. {
  9986. pDBL->dwLightTarget = pDBL->dwLightMid;
  9987. dwCur=PQ_GetBackLight();
  9988. pDBL->iAdd = (INT32)(pDBL->dwLightTarget - dwCur)/(200/4);
  9989. PQDebugPrint("&&&&&set to 50 percent backlight");//, pDBL->dwLightTarget = %ld, pDBL->iAdd = %d, dwCur = %ld", pDBL->dwLightTarget, pDBL->iAdd, dwCur);
  9990. nDBLStatus=VIP_DBL_STATUS_ENTERING;
  9991. }
  9992. else
  9993. {
  9994. nDBLStatus=VIP_DBL_STATUS_KEEPING;
  9995. PQDebugPrint("&&&&&keep current backlight");
  9996. }
  9997. }
  9998. break;*/
  9999. case 3:
  10000. if(nPrevWhiteCondition!=nWhiteCondition)
  10001. {
  10002. wDetectCount = 0;
  10003. pDBL->dwLightTarget = pDBL->dwLightNormal;
  10004. dwCur=PQ_GetBackLight();
  10005. pDBL->iAdd = (INT32)(pDBL->dwLightTarget - dwCur)/(200);
  10006. nDBLStatus=VIP_DBL_STATUS_LEAVING ;
  10007. PQDebugPrint("&&&&&return to default backlight: %ld -> %ld", dwCur, pDBL->dwLightTarget);
  10008. }
  10009. break;
  10010. case 5:
  10011. if(nPrevWhiteCondition!=nWhiteCondition)
  10012. wDetectCount = 0;
  10013. else
  10014. {
  10015. if(wDetectCount == (300))
  10016. {
  10017. pDBL->dwLightTarget = pDBL->dwLightMax;
  10018. dwCur=PQ_GetBackLight();
  10019. pDBL->iAdd = (INT32)(pDBL->dwLightTarget - dwCur)/(200);
  10020. nDBLStatus=VIP_DBL_STATUS_ENTERING;
  10021. PQDebugPrint("&&&&&in 3(set max backlight), pDBL->dwLightTarget = %ld, pDBL->iAdd = %d, dwCur = %ld", pDBL->dwLightTarget, pDBL->iAdd, dwCur);
  10022. }
  10023. }
  10024. if(wDetectCount < 50000)
  10025. wDetectCount++;
  10026. break;
  10027. }
  10028. if( (nDBLStatus==VIP_DBL_STATUS_ENTERING || nDBLStatus==VIP_DBL_STATUS_LEAVING))
  10029. {
  10030. if(pDBL->iAdd==0)
  10031. nDBLStatus = VIP_DBL_STATUS_DETECTING;
  10032. dwCur=PQ_GetBackLight();
  10033. dwTarget= pDBL->dwLightTarget;
  10034. dwNext= dwCur+pDBL->iAdd;
  10035. if( (signed)((signed)dwCur+pDBL->iAdd)<0)
  10036. dwNext= 0;
  10037. if( abs(dwCur - dwTarget) <= abs(dwCur - dwNext))
  10038. {
  10039. dwNext= dwTarget;
  10040. }
  10041. //PQDebugPrint("%s: dwCur=0x%lx dwNext=0x%lx, dwTarget=0x%lx", __FUNCTION__, dwCur, dwNext, dwTarget);
  10042. if( dwNext!=dwCur )
  10043. {
  10044. PQ_SetBackLight(dwNext);
  10045. }
  10046. else
  10047. nDBLStatus = VIP_DBL_STATUS_DETECTING;
  10048. }
  10049. nPrevWhiteCondition= nWhiteCondition;
  10050. LastLSChang = pDBL->bLSChangeBacklight;
  10051. dwLast = dwCur;
  10052. }
  10053. //Frame rate is 60Hz(60 frame/sec) if handle on vsync, or 50 frame/sec if handle on 20ms timer.
  10054. //DBL is detected every 16 frames, this period is about 1/4 sec.
  10055. void PQ_FormalBackLightDetect(BOOL bReset)
  10056. {
  10057. static UINT8 nPollingIndex= 0;
  10058. static UINT16 wDetectFrameCount= 0;
  10059. static UINT8 nEnteringWhiteCondition= 0;
  10060. static UINT8 nPrevWhiteCondition= 0;
  10061. static UINT8 nDBLStatus= VIP_DBL_STATUS_DETECTING;
  10062. BOOL bNeedDown=0;
  10063. UINT8 i,nWhiteCondition;
  10064. UINT32 nGrayLevelCount[16]; // 21 bit at max
  10065. UINT32 dwTotalPixel,dwTotalWeight,dwWhiteLevel;
  10066. UINT32 dwCur,dwTarget=0,dwNext;
  10067. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  10068. if( bReset )
  10069. {
  10070. nPollingIndex= 0;
  10071. wDetectFrameCount= 0;
  10072. nEnteringWhiteCondition= 0;
  10073. nPrevWhiteCondition= 0;
  10074. nDBLStatus= VIP_DBL_STATUS_DETECTING;
  10075. return;
  10076. }
  10077. if( pDBL->ucLevel==OFF )
  10078. {
  10079. return;
  10080. }
  10081. nPollingIndex++;
  10082. if( (nDBLStatus==VIP_DBL_STATUS_ENTERING) || (nDBLStatus==VIP_DBL_STATUS_LEAVING) )
  10083. {
  10084. if( nPollingIndex<3 ) //=25/8
  10085. return;
  10086. }
  10087. else
  10088. {
  10089. if( nPollingIndex<25 ) //16ms x 16 Frame / 10ms = 25.6
  10090. {
  10091. return;
  10092. }
  10093. }
  10094. nPollingIndex= 0;
  10095. dwTotalPixel= 0;
  10096. dwTotalWeight= 0;
  10097. for(i=0; i<16; i++)
  10098. {
  10099. nGrayLevelCount[i] = PQ_RegisterRead(VIP_reg_dpy_hist_bin0+i*4);
  10100. dwTotalPixel+= nGrayLevelCount[i];
  10101. dwTotalWeight+= nGrayLevelCount[i]*i+(nGrayLevelCount[i]>>1); //count*i.5
  10102. }
  10103. if( dwTotalPixel==0 )
  10104. return;
  10105. dwCur=PQ_GetBackLight();
  10106. //Rule1: Calc rate of white pixel
  10107. //dwWhiteLevel= (dwTotalWhite<<8)/dwTotalPixel; // n x 256 to expand to VIP_DBL_LEVEL_DEGREE
  10108. //Rule2: Calc weighted average
  10109. dwWhiteLevel= (dwTotalWeight<<4)/dwTotalPixel; // n x 16 to expand to VIP_DBL_LEVEL_DEGREE
  10110. #if 1
  10111. if( pDBL->dwWhiteLevel!=VIP_DBL_INVALID_WHITE_LEVEL )
  10112. {
  10113. if( pDBL->dwWhiteLevel<128 )
  10114. {
  10115. if( dwWhiteLevel<pDBL->dwWhiteLevel )
  10116. dwWhiteLevel= (3*pDBL->dwWhiteLevel + dwWhiteLevel)>>2; //0.75*pDBL->dwWhiteLevel + 0.25*dwWhiteLevel;
  10117. else
  10118. dwWhiteLevel= (pDBL->dwWhiteLevel + 3*dwWhiteLevel)>>2; //0.25*pDBL->dwWhiteLevel + 0.75*dwWhiteLevel
  10119. }
  10120. else
  10121. {
  10122. if( dwWhiteLevel<pDBL->dwWhiteLevel )
  10123. dwWhiteLevel= (pDBL->dwWhiteLevel + 3*dwWhiteLevel)>>2;
  10124. else
  10125. dwWhiteLevel= (3*pDBL->dwWhiteLevel + dwWhiteLevel)>>2;
  10126. }
  10127. }
  10128. pDBL->dwWhiteLevel= dwWhiteLevel;
  10129. #endif
  10130. //White Condition has 5 scopes which is divided by dbl_bound1~4.
  10131. if( dwWhiteLevel<=pDBL->nBound1 )
  10132. nWhiteCondition= 1;
  10133. else if( dwWhiteLevel<=pDBL->nBound2 )
  10134. nWhiteCondition= 2;
  10135. #ifdef VIP_DBL_WHITE_PATTERN_BRIGHTING
  10136. else if( dwWhiteLevel<=pDBL->nBound3 )
  10137. nWhiteCondition= 3;
  10138. else if( dwWhiteLevel<=pDBL->nBound4 )
  10139. nWhiteCondition= 4;
  10140. else
  10141. nWhiteCondition= 5;
  10142. #else
  10143. else
  10144. nWhiteCondition= 3;
  10145. #endif
  10146. switch(nDBLStatus)
  10147. {
  10148. case VIP_DBL_STATUS_DETECTING:
  10149. case VIP_DBL_STATUS_DETECTING_WHITE_ENTERING:
  10150. if( nPrevWhiteCondition!=nWhiteCondition )
  10151. {
  10152. wDetectFrameCount= 0;
  10153. if( nDBLStatus==VIP_DBL_STATUS_DETECTING_WHITE_ENTERING )
  10154. {
  10155. if( (nPrevWhiteCondition<3 && nWhiteCondition>=3) || (nPrevWhiteCondition>3 && nWhiteCondition<=3) )
  10156. {
  10157. nDBLStatus= VIP_DBL_STATUS_LEAVING;
  10158. }
  10159. }
  10160. }
  10161. else if( nWhiteCondition==1 || nWhiteCondition==5 )
  10162. {
  10163. wDetectFrameCount+= VIP_DBL_FRAME_INTERVAL;
  10164. if( wDetectFrameCount==pDBL->wDetectFrameCount ) //50 frams x 3 sec if 144
  10165. {
  10166. dwTarget= PQ_BackLightTarget(VIP_DBL_STATUS_ENTERING, nWhiteCondition, dwCur);//nWhiteCondition==1 ? pDBL->dwLightMin : pDBL->dwLightMax;
  10167. if( (nWhiteCondition==1 && dwCur>dwTarget) || (nWhiteCondition==5 && dwCur<dwTarget) )
  10168. {
  10169. nDBLStatus= VIP_DBL_STATUS_ENTERING;
  10170. nEnteringWhiteCondition= nWhiteCondition;
  10171. }
  10172. else
  10173. {
  10174. wDetectFrameCount= 0;
  10175. }
  10176. }
  10177. }
  10178. if( nDBLStatus==VIP_DBL_STATUS_LEAVING )
  10179. {
  10180. PQ_BackLightTarget(nDBLStatus, nWhiteCondition, dwCur);
  10181. PQDebugPrint("%s: Leaving while detection and entering , dwTarget=normal", __FUNCTION__);
  10182. }
  10183. if( nDBLStatus==VIP_DBL_STATUS_ENTERING )
  10184. {
  10185. //PQ_BackLightTarget(nDBLStatus, nWhiteCondition, dwCur);
  10186. PQDebugPrint("%s: Entering %s , dwTarget=0x%lx", __FUNCTION__, nWhiteCondition==1?"Black":"White", dwTarget);
  10187. }
  10188. break;
  10189. case VIP_DBL_STATUS_ENTERING: //nPrevWhiteCondition must be 1 or 5
  10190. if( nPrevWhiteCondition!=nWhiteCondition )
  10191. {
  10192. if( nPrevWhiteCondition==1 )
  10193. nDBLStatus= nWhiteCondition>=3?VIP_DBL_STATUS_LEAVING:VIP_DBL_STATUS_DETECTING_WHITE_ENTERING;
  10194. else if( nPrevWhiteCondition==5 )
  10195. nDBLStatus= nWhiteCondition<=3?VIP_DBL_STATUS_LEAVING:VIP_DBL_STATUS_DETECTING_WHITE_ENTERING;
  10196. wDetectFrameCount= 0;
  10197. if( nDBLStatus==VIP_DBL_STATUS_LEAVING )
  10198. {
  10199. PQ_BackLightTarget(nDBLStatus, nWhiteCondition, dwCur);
  10200. PQDebugPrint("%s: Leaving while entering , dwTarget=normal", __FUNCTION__);
  10201. }
  10202. }
  10203. break;
  10204. case VIP_DBL_STATUS_KEEPING: //nPrevWhiteCondition must be 1, 5, 2 or 4
  10205. if( nPrevWhiteCondition!=nWhiteCondition )
  10206. {
  10207. if( nPrevWhiteCondition<3 )
  10208. {
  10209. if( nWhiteCondition>=3 )
  10210. nDBLStatus= VIP_DBL_STATUS_LEAVING;
  10211. }
  10212. else if( nPrevWhiteCondition>3 )
  10213. {
  10214. if( nWhiteCondition<=3 )
  10215. nDBLStatus= VIP_DBL_STATUS_LEAVING;
  10216. }
  10217. wDetectFrameCount= 0;
  10218. if( nDBLStatus==VIP_DBL_STATUS_LEAVING )
  10219. {
  10220. PQ_BackLightTarget(nDBLStatus, nWhiteCondition, dwCur);
  10221. PQDebugPrint("%s: Leaving while keeping , dwTarget=normal", __FUNCTION__);
  10222. }
  10223. }
  10224. break;
  10225. case VIP_DBL_STATUS_LEAVING:
  10226. break;
  10227. }
  10228. if( nDBLStatus==VIP_DBL_STATUS_ENTERING )
  10229. {
  10230. bNeedDown= nEnteringWhiteCondition==1 ? TRUE : FALSE;
  10231. }
  10232. else if( nDBLStatus==VIP_DBL_STATUS_LEAVING )
  10233. {
  10234. bNeedDown= nEnteringWhiteCondition==1 ? FALSE : TRUE;
  10235. }
  10236. if( nDBLStatus==VIP_DBL_STATUS_ENTERING || nDBLStatus==VIP_DBL_STATUS_LEAVING )
  10237. {
  10238. dwTarget= pDBL->dwLightTarget;
  10239. dwNext= dwCur+pDBL->iAdd;
  10240. if( (signed)((signed)dwCur+pDBL->iAdd)<0 )
  10241. dwNext= 0;
  10242. //PQDebugPrint("%s: bNeedDown=%d dwCur=0x%lx dwNext=0x%lx", __FUNCTION__, bNeedDown, dwCur, dwNext);
  10243. if( (bNeedDown && dwNext<dwTarget) || ( !bNeedDown && dwNext>dwTarget ) )
  10244. {
  10245. dwNext= dwTarget;
  10246. nDBLStatus= (nDBLStatus==VIP_DBL_STATUS_ENTERING)?VIP_DBL_STATUS_KEEPING:VIP_DBL_STATUS_DETECTING;
  10247. PQDebugPrint("%s: dwNext=0x%lx Reach end", __FUNCTION__, dwNext);
  10248. }
  10249. if( dwNext!=dwCur )
  10250. {
  10251. PQ_SetBackLight(dwNext);
  10252. }
  10253. }
  10254. nPrevWhiteCondition= nWhiteCondition;
  10255. }
  10256. UINT32 PQ_EEBackLightTarget(UINT8 nDBLStatus, UINT32 dwWhiteLevel, UINT32 dwCur)
  10257. {
  10258. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  10259. //UINT32 dwLightTarget;
  10260. INT32 nStep,nSlowStep,nQuickStep;
  10261. //UINT32 ActiveMinBackLight = pDBL->dwTableMin;
  10262. //UINT32 dwBacklight40Percent;
  10263. nSlowStep= 1;//5;
  10264. nQuickStep= 3;//12;
  10265. if( nDBLStatus==VIP_DBL_STATUS_ENTERING )
  10266. {
  10267. nStep= nQuickStep; //white color want to increase the steps
  10268. }
  10269. else if( nDBLStatus==VIP_DBL_STATUS_KEEPING )
  10270. {
  10271. //dwLightTarget = PQ_GetHomeModeValue(&dwLightTarget);
  10272. nStep= nSlowStep;
  10273. }
  10274. else if( nDBLStatus==VIP_DBL_STATUS_LEAVING )
  10275. {
  10276. //dwLightTarget = PQ_GetHomeModeValue(&dwLightTarget);
  10277. nStep= nQuickStep;
  10278. }
  10279. else
  10280. {
  10281. nStep= nQuickStep;
  10282. }
  10283. //pDBL->dwLightTarget= dwLightTarget;
  10284. //PQDebugPrint("%s:dwLightTarget=%#lx(%ld) OSD max=%#lx(%ld) pDBL->dwTableNormal=%#lx(%ld)",__FUNCTION__, dwLightTarget, dwLightTarget, pDBL->dwTableNormal, pDBL->dwTableNormal, pDBL->dwTableNormal, pDBL->dwTableNormal);
  10285. if((pDBL->dwLightQuot+1)/2 == 0)
  10286. pDBL->iAdd= nStep;
  10287. else
  10288. pDBL->iAdd= ((pDBL->dwLightQuot+1)/2)*nStep;
  10289. if( pDBL->dwLightTarget<dwCur )
  10290. pDBL->iAdd= -(pDBL->iAdd);
  10291. return pDBL->dwLightTarget;
  10292. }
  10293. void PQ_EEBackLightDetect(BOOL bReset)
  10294. {
  10295. PQHW_CONTEXT * pHwContext= &PQHwContext;
  10296. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  10297. //VIP_SOURCE_INFO* pSourceInfo = VIP_GetSourceInfo();
  10298. static UINT8 nPollingIndex= 0;
  10299. //static UINT16 dwLast;
  10300. //static UINT8 nEnteringWhiteCondition= 0;
  10301. static UINT8 nPrevWhiteCondition= 0xff;
  10302. static UINT8 nDBLStatus= VIP_DBL_STATUS_DETECTING;
  10303. static UINT8 nHistGrayLevel= 0;
  10304. //BOOL bNeedDown=0;
  10305. UINT8 nWhiteCondition;
  10306. UINT32 nGrayLevelCount[16]; // 21 bit at max
  10307. UINT32 dwTotalPixel,dwWhiteLevel, dwPixelCount;
  10308. UINT32 dwCur,dwTarget=0,dwNext;//, dwHistPWM, dwHistPWMMin;
  10309. INT32 nContrast;
  10310. UINT32 nPercentage1 = 1000;
  10311. UINT32 nPercentage2;
  10312. INT32 i;
  10313. //UINT32 dwGrayLevelAddr= 0xbe1cc6dc;
  10314. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  10315. if( bReset )
  10316. {
  10317. nPollingIndex= 0;
  10318. //nEnteringWhiteCondition= 0;
  10319. nPrevWhiteCondition= 0;
  10320. nDBLStatus= VIP_DBL_STATUS_DETECTING;
  10321. return;
  10322. }
  10323. if( pDBL->ucLevel==OFF )
  10324. {
  10325. nPrevWhiteCondition = 0xfd;
  10326. return;
  10327. }
  10328. if(pHwContext->bPWMOff) // if Set baclight off, notset PWM anymore
  10329. {
  10330. return;
  10331. }
  10332. nPollingIndex++;
  10333. if( (nDBLStatus==VIP_DBL_STATUS_ENTERING) || (nDBLStatus==VIP_DBL_STATUS_LEAVING) || (nDBLStatus==VIP_DBL_STATUS_KEEPING) )
  10334. {
  10335. if( nPollingIndex<3 ) //=25/8
  10336. return;
  10337. }
  10338. else
  10339. {
  10340. if( nPollingIndex<3 ) //16ms x 16 Frame / 10ms = 25.6
  10341. {
  10342. return;
  10343. }
  10344. }
  10345. nPollingIndex= 0;
  10346. dwTotalPixel= 0;
  10347. for(i=0; i<16; i++)
  10348. {
  10349. nGrayLevelCount[i] = PQ_RegisterRead(VIP_reg_dpy_hist_bin0+i*4);
  10350. dwTotalPixel+= nGrayLevelCount[i];
  10351. }
  10352. if( dwTotalPixel==0 )
  10353. return;
  10354. 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
  10355. //if(pSourceInfo->ucUserSource == CVD2)
  10356. //dwWhiteLevel +=16;
  10357. //PQDebugPrint("%s:dwWhiteLevel = %ld\n",__FUNCTION__, dwWhiteLevel);
  10358. dwCur=PQ_GetRealBackLight();
  10359. //White Condition has 3 scopes.
  10360. if( dwWhiteLevel<=60)//pDBL->nBound1 )
  10361. nWhiteCondition= 1;
  10362. else if(dwWhiteLevel<=104)//pDBL->nBound3)
  10363. nWhiteCondition= 2;
  10364. else
  10365. nWhiteCondition= 3;
  10366. if(nPrevWhiteCondition != nWhiteCondition)
  10367. {
  10368. PQDebugPrint("%s:change to WhiteCondition = %d\n",__FUNCTION__, nWhiteCondition);
  10369. }
  10370. switch(nWhiteCondition)
  10371. {
  10372. case 1:
  10373. if(nPrevWhiteCondition!=nWhiteCondition)
  10374. {
  10375. //==============================================histogram 1% counting and algorithm2
  10376. dwPixelCount = 0;
  10377. for(i=15; i>=0; i--)
  10378. {
  10379. //PQDebugPrint("%s:nGrayLevelCount[%d] = %ld",__FUNCTION__, i, nGrayLevelCount[i]);
  10380. dwPixelCount += nGrayLevelCount[i];
  10381. if(dwPixelCount > (dwTotalPixel + 50)/100)//find 1% hist position from nGrayLevelCount[15] to nGrayLevelCount[0]
  10382. break;
  10383. }
  10384. PQDebugPrint("%s:%%1 gray level position[0~15] : i=%d dwPixelCount=%ld dwTotalPixel=%ld",__FUNCTION__, i, dwPixelCount, dwTotalPixel);
  10385. if(abs((INT32)nHistGrayLevel - (INT32)i)>1)
  10386. nHistGrayLevel = i;
  10387. nPercentage1 = 1000;
  10388. nPercentage2 = pDBL->ucHistMinPercentage * 10 + (nHistGrayLevel * (100 - pDBL->ucHistMinPercentage) * 10 + 8)/15;
  10389. if(pHwContext->ucDynamicBacklightMode == 1)
  10390. {
  10391. if(pDBL->ucOrder)
  10392. pDBL->dwLightTarget = pDBL->dwLightMax - (pDBL->dwLightMax - pDBL->dwTableNormal) * nPercentage1 / 1000;
  10393. else
  10394. pDBL->dwLightTarget = pDBL->dwTableMin + (pDBL->dwTableNormal - pDBL->dwTableMin) * nPercentage1 / 1000;
  10395. }
  10396. else if(pHwContext->ucDynamicBacklightMode == 2)
  10397. {
  10398. if(pDBL->ucOrder)
  10399. pDBL->dwLightTarget = pDBL->dwLightMax - (pDBL->dwLightMax - pDBL->dwTableNormal) * nPercentage2 / 1000;
  10400. else
  10401. pDBL->dwLightTarget = pDBL->dwTableMin + (pDBL->dwTableNormal - pDBL->dwTableMin) * nPercentage2 / 1000;
  10402. }
  10403. else
  10404. {
  10405. if(pDBL->ucOrder)
  10406. pDBL->dwLightTarget = pDBL->dwLightMax - (pDBL->dwLightMax - pDBL->dwTableNormal) * (nPercentage1 * nPercentage2/1000) / 1000;
  10407. else
  10408. pDBL->dwLightTarget = pDBL->dwTableMin + (pDBL->dwTableNormal - pDBL->dwTableMin) * (nPercentage1 * nPercentage2/1000) / 1000;
  10409. }
  10410. PQDebugPrint("%s:pDBL->dwLightMax=%ld pDBL->dwTableNormal=%ld",__FUNCTION__, pDBL->dwLightMax, pDBL->dwTableNormal);
  10411. PQDebugPrint("%s:ucDynamicBacklightMode=%d nPercentage1=%ld nPercentage2=%ld final Percentage=%ld",__FUNCTION__, pHwContext->ucDynamicBacklightMode, nPercentage1, nPercentage2, (nPercentage1 * nPercentage2+500) / 1000);
  10412. //==============================================
  10413. nContrast = pMenuValue->iContrast + 30 - (30 * nHistGrayLevel / 15);
  10414. nDBLStatus=VIP_DBL_STATUS_ENTERING;
  10415. PQ_EEBackLightTarget(VIP_DBL_STATUS_ENTERING, dwWhiteLevel, dwCur);
  10416. PQDebugPrint("%s:pDBL->dwLightTarget=%ld(%#lx)", __FUNCTION__, pDBL->dwLightTarget, pDBL->dwLightTarget);
  10417. PQ_PresetContrast(TRUE, nContrast, 1);
  10418. }
  10419. break;
  10420. case 2:
  10421. //==============================================histogram 1% counting and algorithm2
  10422. dwPixelCount = 0;
  10423. for(i=15; i>=0; i--)
  10424. {
  10425. dwPixelCount += nGrayLevelCount[i];
  10426. if(dwPixelCount > (dwTotalPixel + 50)/100)//find 1% hist position from nGrayLevelCount[15] to nGrayLevelCount[0]
  10427. break;
  10428. }
  10429. PQDebugPrint("%s:%%1 gray level position[0~15] : i=%d dwPixelCount=%ld dwTotalPixel=%ld",__FUNCTION__, i, dwPixelCount, dwTotalPixel);
  10430. if(abs((INT32)nHistGrayLevel - (INT32)i)>1)
  10431. nHistGrayLevel = i;
  10432. nPercentage1 = 1000 - (1000-400)*(dwWhiteLevel-60)/(104-60);
  10433. nPercentage2 = pDBL->ucHistMinPercentage * 10 + (nHistGrayLevel * (100 - pDBL->ucHistMinPercentage) * 10 + 8)/15;
  10434. if(pHwContext->ucDynamicBacklightMode == 1)
  10435. {
  10436. if(pDBL->ucOrder)
  10437. pDBL->dwLightTarget = pDBL->dwLightMax - (pDBL->dwLightMax - pDBL->dwTableNormal) * nPercentage1 / 1000;
  10438. else
  10439. pDBL->dwLightTarget = pDBL->dwTableMin + (pDBL->dwTableNormal - pDBL->dwTableMin) * nPercentage1 / 1000;
  10440. }
  10441. else if(pHwContext->ucDynamicBacklightMode == 2)
  10442. {
  10443. if(pDBL->ucOrder)
  10444. pDBL->dwLightTarget = pDBL->dwLightMax - (pDBL->dwLightMax - pDBL->dwTableNormal) * nPercentage2 / 1000;
  10445. else
  10446. pDBL->dwLightTarget = pDBL->dwTableMin + (pDBL->dwTableNormal - pDBL->dwTableMin) * nPercentage2 / 1000;
  10447. }
  10448. else
  10449. {
  10450. if(pDBL->ucOrder)
  10451. pDBL->dwLightTarget = pDBL->dwLightMax - (pDBL->dwLightMax - pDBL->dwTableNormal) * (nPercentage1 * nPercentage2/1000) / 1000;
  10452. else
  10453. pDBL->dwLightTarget = pDBL->dwTableMin + (pDBL->dwTableNormal - pDBL->dwTableMin) * (nPercentage1 * nPercentage2/1000) / 1000;
  10454. }
  10455. PQDebugPrint("%s:pDBL->dwLightMax=%ld pDBL->dwTableNormal=%ld",__FUNCTION__, pDBL->dwLightMax, pDBL->dwTableNormal);
  10456. PQDebugPrint("%s:ucDynamicBacklightMode=%d nPercentage1=%ld nPercentage2=%ld final Percentage=%ld",__FUNCTION__, pHwContext->ucDynamicBacklightMode, nPercentage1, nPercentage2, (nPercentage1 * nPercentage2+500) / 1000);
  10457. //==============================================
  10458. nContrast = pMenuValue->iContrast + 30 - (30 * nHistGrayLevel / 15);
  10459. nDBLStatus=VIP_DBL_STATUS_KEEPING;
  10460. PQ_EEBackLightTarget(VIP_DBL_STATUS_KEEPING, dwWhiteLevel, dwCur);
  10461. PQ_PresetContrast(TRUE, nContrast, 1);
  10462. break;
  10463. case 3:
  10464. if(nPrevWhiteCondition!=nWhiteCondition)
  10465. {
  10466. //==============================================histogram 1% counting and algorithm2
  10467. dwPixelCount = 0;
  10468. for(i=15; i>=0; i--)
  10469. {
  10470. dwPixelCount += nGrayLevelCount[i];
  10471. if(dwPixelCount > (dwTotalPixel + 50)/100)//find 1% hist position from nGrayLevelCount[15] to nGrayLevelCount[0]
  10472. break;
  10473. }
  10474. PQDebugPrint("%s:%%1 gray level position[0~15] : i=%d dwPixelCount=%ld dwTotalPixel=%ld",__FUNCTION__, i, dwPixelCount, dwTotalPixel);
  10475. if(abs((INT32)nHistGrayLevel - (INT32)i)>1)
  10476. nHistGrayLevel = i;
  10477. nPercentage1 = 400;
  10478. nPercentage2 = pDBL->ucHistMinPercentage * 10 + (nHistGrayLevel * (100 - pDBL->ucHistMinPercentage) * 10 + 8)/15;
  10479. if(pHwContext->ucDynamicBacklightMode == 1)
  10480. {
  10481. if(pDBL->ucOrder)
  10482. pDBL->dwLightTarget = pDBL->dwLightMax - (pDBL->dwLightMax - pDBL->dwTableNormal) * nPercentage1 / 1000;
  10483. else
  10484. pDBL->dwLightTarget = pDBL->dwTableMin + (pDBL->dwTableNormal - pDBL->dwTableMin) * nPercentage1 / 1000;
  10485. }
  10486. else if(pHwContext->ucDynamicBacklightMode == 2)
  10487. {
  10488. if(pDBL->ucOrder)
  10489. pDBL->dwLightTarget = pDBL->dwLightMax - (pDBL->dwLightMax - pDBL->dwTableNormal) * nPercentage2 / 1000;
  10490. else
  10491. pDBL->dwLightTarget = pDBL->dwTableMin + (pDBL->dwTableNormal - pDBL->dwTableMin) * nPercentage2 / 1000;
  10492. }
  10493. else
  10494. {
  10495. if(pDBL->ucOrder)
  10496. pDBL->dwLightTarget = pDBL->dwLightMax - (pDBL->dwLightMax - pDBL->dwTableNormal) * (nPercentage1 * nPercentage2/1000) / 1000;
  10497. else
  10498. pDBL->dwLightTarget = pDBL->dwTableMin + (pDBL->dwTableNormal - pDBL->dwTableMin) * (nPercentage1 * nPercentage2/1000) / 1000;
  10499. }
  10500. PQDebugPrint("%s:pDBL->dwLightMax=%ld pDBL->dwTableNormal=%ld",__FUNCTION__, pDBL->dwLightMax, pDBL->dwTableNormal);
  10501. PQDebugPrint("%s:ucDynamicBacklightMode=%d nPercentage1=%ld nPercentage2=%ld final Percentage=%ld",__FUNCTION__, pHwContext->ucDynamicBacklightMode, nPercentage1, nPercentage2, (nPercentage1 * nPercentage2+500) / 1000);
  10502. //==============================================
  10503. nContrast = pMenuValue->iContrast + 30 - (30 * nHistGrayLevel / 15);
  10504. nDBLStatus=VIP_DBL_STATUS_LEAVING;
  10505. PQ_EEBackLightTarget(VIP_DBL_STATUS_LEAVING, dwWhiteLevel, dwCur);
  10506. PQDebugPrint("%s:pDBL->dwLightTarget=%ld(%#lx)", __FUNCTION__, pDBL->dwLightTarget, pDBL->dwLightTarget);
  10507. PQ_PresetContrast(TRUE, nContrast, 1);
  10508. }
  10509. break;
  10510. }
  10511. if( nDBLStatus==VIP_DBL_STATUS_ENTERING || nDBLStatus==VIP_DBL_STATUS_KEEPING || nDBLStatus==VIP_DBL_STATUS_LEAVING )
  10512. {
  10513. dwCur=PQ_GetRealBackLight();
  10514. dwTarget= pDBL->dwLightTarget;//(pDBL->dwTableNormal==0) ? pDBL->dwLightTarget : pDBL->dwLightTarget * dwHistPWM / pDBL->dwTableNormal;
  10515. dwNext= dwCur+pDBL->iAdd;
  10516. if( abs(dwCur - dwTarget) <= abs(dwCur - dwNext))
  10517. {
  10518. dwNext= dwTarget;
  10519. }
  10520. if((pDBL->iAdd > 0 && dwCur > dwTarget) || (pDBL->iAdd < 0 && dwCur < dwTarget))//prevent other driver set backlight traversing our target value.
  10521. {
  10522. PQ_SetRealBackLight(dwTarget);
  10523. dwNext = dwCur = dwTarget;
  10524. }
  10525. if( dwNext!=dwCur )
  10526. {
  10527. PQ_SetRealBackLight(dwNext);
  10528. }
  10529. else
  10530. {
  10531. nDBLStatus = VIP_DBL_STATUS_DETECTING;
  10532. }
  10533. }
  10534. nPrevWhiteCondition= nWhiteCondition;
  10535. }
  10536. void PQ_PresetContrast(BOOL bReset, INT32 iValue, INT32 nSpeed)
  10537. {
  10538. PQHW_CONTEXT * pHwContext= &PQHwContext;
  10539. static UINT32 nPollingIndex= 0;
  10540. static INT32 iAdd = 0;
  10541. static INT32 dwCur = 0;
  10542. static INT32 dwTarget = 0;
  10543. static INT32 dwNext = 0;
  10544. static BOOL bStart = FALSE;
  10545. if(bReset)
  10546. {
  10547. if(iValue == 0)
  10548. {
  10549. if(nSpeed == 0)
  10550. {
  10551. bStart = FALSE;
  10552. PQDebugPrint("%s:stop!!!",__FUNCTION__);
  10553. }
  10554. else
  10555. {
  10556. PQDebugPrint("%s:iValue = %d, menu value error!!!",__FUNCTION__,iValue);
  10557. }
  10558. return;
  10559. }
  10560. if(iValue == dwTarget)
  10561. return;
  10562. spin_lock(&pHwContext->Spin_PresetContrast);
  10563. iAdd = nSpeed;
  10564. dwCur = pHwContext->iContrast>>COLOR_MATRIX_GAIN_OSD_DIFFBIT;
  10565. dwTarget = iValue;
  10566. if( dwTarget<dwCur )
  10567. iAdd= -(iAdd);
  10568. nPollingIndex = 0;
  10569. bStart = TRUE;
  10570. spin_unlock(&pHwContext->Spin_PresetContrast);
  10571. PQDebugPrint("%s:dwCur = %ld(%#lx), dwTarget = %ld(%#lx), iAdd = %d",__FUNCTION__,dwCur, dwCur, dwTarget, dwTarget, iAdd);
  10572. }
  10573. if(bStart == TRUE)
  10574. {
  10575. nPollingIndex++;
  10576. if(nPollingIndex<75)
  10577. return;
  10578. nPollingIndex = 0;
  10579. dwCur = (pHwContext->iContrast>>COLOR_MATRIX_GAIN_OSD_DIFFBIT);
  10580. dwNext= dwCur+iAdd;
  10581. if( abs(dwCur - dwTarget) <= abs(dwCur - dwNext))
  10582. {
  10583. dwNext= dwTarget;
  10584. }
  10585. if((iAdd > 0 && dwCur > dwTarget) || (iAdd < 0 && dwCur < dwTarget))//prevent other driver set backlight traversing our target value.
  10586. {
  10587. PQ_Contrast(TRUE, dwTarget);
  10588. dwNext = dwCur = dwTarget;
  10589. }
  10590. if( dwNext!=dwCur )
  10591. {
  10592. PQ_Contrast(TRUE, dwNext);
  10593. //PQDebugPrint("%s: dwNext=0x%lx dwCur=0x%lx dwTarget=0x%lx pDBL->dwLightMin=0x%lx\n", __FUNCTION__, dwNext, dwCur, dwTarget, pDBL->dwLightMin);
  10594. }
  10595. else
  10596. {
  10597. PQDebugPrint("%s: DONE!!! dwCur=%#lx(%ld)\n", __FUNCTION__, dwCur, dwCur);
  10598. bStart = FALSE;
  10599. }
  10600. }
  10601. }
  10602. void PQ_SISPresetContrast(UINT8 ucValue, INT32 nSpeed)
  10603. {
  10604. PQHW_CONTEXT * pHwContext= &PQHwContext;
  10605. static UINT32 nPollingIndex= 0;
  10606. static INT32 iAdd = 0;
  10607. static UINT32 dwCur = 0;
  10608. static UINT32 dwTarget = 0;
  10609. static UINT32 dwNext = 0;
  10610. if(ucValue == 0)
  10611. {
  10612. PQDebugPrint("%s:ucValue = %d, menu value error!!!",__FUNCTION__,ucValue);
  10613. return;
  10614. }
  10615. dwCur = pHwContext->iContrast>>COLOR_MATRIX_GAIN_OSD_DIFFBIT;
  10616. if(ucValue == dwCur)
  10617. return;
  10618. iAdd = nSpeed;
  10619. dwTarget = ucValue;
  10620. if( dwTarget<dwCur )
  10621. iAdd= -(iAdd);
  10622. //PQDebugPrint("%s:dwCur = %ld(%#lx), dwTarget = %ld(%#lx), iAdd = %d",__FUNCTION__,dwCur, dwCur, dwTarget, dwTarget, iAdd);
  10623. nPollingIndex++;
  10624. if(nPollingIndex<75)
  10625. return;
  10626. nPollingIndex = 0;
  10627. PQDebugPrint("[Robert]%s:in\n\n",__FUNCTION__);
  10628. dwNext= dwCur+iAdd;
  10629. if( abs(dwCur - dwTarget) <= abs(dwCur - dwNext))
  10630. {
  10631. dwNext= dwTarget;
  10632. }
  10633. if((iAdd > 0 && dwCur > dwTarget) || (iAdd < 0 && dwCur < dwTarget))//prevent other driver set backlight traversing our target value.
  10634. {
  10635. PQ_Contrast(TRUE, dwTarget);
  10636. dwNext = dwCur = dwTarget;
  10637. }
  10638. if( dwNext!=dwCur )
  10639. {
  10640. PQ_Contrast(TRUE, dwNext);
  10641. //PQDebugPrint("%s: dwNext=0x%lx dwCur=0x%lx dwTarget=0x%lx pDBL->dwLightMin=0x%lx\n", __FUNCTION__, dwNext, dwCur, dwTarget, pDBL->dwLightMin);
  10642. }
  10643. }
  10644. void PQ_SetDynamicBacklightMode(UINT8 ucMode)
  10645. {
  10646. PQHW_CONTEXT* pHwContext= &PQHwContext;
  10647. pHwContext->ucDynamicBacklightMode = ucMode;
  10648. PQ_BackLightDetect(TRUE);
  10649. }
  10650. void PQ_SetBackLightLevel(UINT8 ucLevel)
  10651. {
  10652. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  10653. UINT32 dwValue;
  10654. dwValue = pDBL->BacklightTab[ucLevel];
  10655. PQ_EnableDynamicBackLight(STRONG, dwValue);
  10656. }
  10657. void PQ_SetBacklightHistMin(UINT8 ucValue)
  10658. {
  10659. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  10660. if(ucValue <=100)
  10661. {
  10662. pDBL->ucHistMinPercentage = ucValue;
  10663. PQDebugPrint("%s: HistMinPercentage=%d\n", __FUNCTION__, pDBL->ucHistMinPercentage);
  10664. }
  10665. else
  10666. {
  10667. PQDebugPrint("%s: unqualified value(%d)!!!\n", __FUNCTION__, ucValue);
  10668. return;
  10669. }
  10670. PQ_BackLightDetect(TRUE);
  10671. }
  10672. void PQ_SetDynamicBLType(UINT8 ucType)
  10673. {
  10674. PQHW_CONTEXT* pHwContext= &PQHwContext;
  10675. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  10676. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  10677. PQDebugPrint("%s: ucType=%d\n", __FUNCTION__, ucType);
  10678. pDBL->ucDynamicBLType = ucType;
  10679. if(ucType!=DYNAMIC_BL_ENERGY_EFFICIENCY || pDBL->ucLevel==OFF)
  10680. {
  10681. PQ_PresetContrast(TRUE, pMenuValue->iContrast, 1);
  10682. }
  10683. #ifdef DynamicBacklight_EnergyEfficiency
  10684. if(ucType == DYNAMIC_BL_ENERGY_EFFICIENCY)
  10685. {
  10686. pDBL->dwTableNormal= pDBL->BacklightTab[12];
  10687. if( pDBL->dwTableMin>pDBL->dwTableMax )
  10688. pDBL->dwTableNormal= pDBL->BacklightTab[2]; //14-12
  10689. }
  10690. #endif
  10691. PQ_BackLightDetect(TRUE);
  10692. }
  10693. UINT8 PQ_GetDynamicBLType(void)
  10694. {
  10695. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  10696. return pDBL->ucDynamicBLType;
  10697. }
  10698. UINT8 PQ_GetOrderedBackLight(UINT32 *pLight)
  10699. {
  10700. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  10701. if(pDBL->ucOrder)
  10702. *pLight = pDBL->dwTableMax - *pLight + pDBL->dwTableMin;
  10703. return TRUE;
  10704. }
  10705. void PQ_SetMaxPWM(UINT32 ucValue)
  10706. {
  10707. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  10708. ucValue = (~0x80000000) & ucValue;
  10709. PQDebugPrint("%s: %ld(%#lx)", __FUNCTION__, ucValue, ucValue);
  10710. if(pDBL->dwTableMin>pDBL->dwTableMax)
  10711. {
  10712. if(ucValue > pDBL->dwTableMin)
  10713. {
  10714. PQDebugPrint("%s: out of range!! >= dwTableMin", __FUNCTION__);
  10715. return;
  10716. }
  10717. }
  10718. else
  10719. {
  10720. if(ucValue < pDBL->dwTableMin)
  10721. {
  10722. PQDebugPrint("%s: out of range!! <= dwTableMin", __FUNCTION__);
  10723. return;
  10724. }
  10725. }
  10726. if(pDBL->ucOrder)
  10727. ucValue = pDBL->dwTableMax- ucValue + pDBL->dwTableMin;
  10728. pDBL->dwLightMax = ucValue;
  10729. PQ_BackLightDetect(TRUE);
  10730. PQ_PresetContrast(TRUE, 0, 0);
  10731. }
  10732. void PQ_FlDetLevel(UINT8 ucLevel)
  10733. {
  10734. UINT32 WindowH = PQ_RegisterRead(VIP_reg_pnl_hde) - PQ_RegisterRead(VIP_reg_pnl_hds);
  10735. UINT32 WindowV = PQ_RegisterRead(VIP_reg_pnl_vde) - PQ_RegisterRead(VIP_reg_pnl_vds);
  10736. PQ_RegisterWrite(VIP_reg_dpy_fl_blk_hnum, ceil(WindowH*2,48));
  10737. PQ_RegisterWrite(VIP_reg_dpy_fl_blk_vnum, ceil(WindowV,36));
  10738. if(VIP_GetPanelHeight()==1200)
  10739. {
  10740. /*1920x1200 panel must cause video twinkle in flashtone part like #35997*/
  10741. ucLevel = 0;
  10742. }
  10743. PQ_RegisterWrite(VIP_reg_dpy_fl_det_en, ucLevel?1:0);
  10744. PQDebugPrint("%s: ucLevel = %d",__FUNCTION__, ucLevel);
  10745. switch(ucLevel)
  10746. {
  10747. case STRONG:
  10748. PQ_RegisterWrite(VIP_reg_dpy_fl_det_factor, 15);
  10749. PQ_RegisterWrite(VIP_reg_dpy_fl_max, 63);
  10750. break;
  10751. case MEDIUM:
  10752. PQ_RegisterWrite(VIP_reg_dpy_fl_det_factor, 9);
  10753. PQ_RegisterWrite(VIP_reg_dpy_fl_max, 40);
  10754. break;
  10755. case WEAK:
  10756. PQ_RegisterWrite(VIP_reg_dpy_fl_det_factor, 3);
  10757. PQ_RegisterWrite(VIP_reg_dpy_fl_max, 16);
  10758. break;
  10759. }
  10760. }
  10761. void PQ_Set_UV_Coring(void)
  10762. {
  10763. PQHW_CONTEXT* pHwContext= &PQHwContext;
  10764. VTAB_CMN_VALUE_DEFINE* pVtab= &pHwContext->VtabCmnValue;
  10765. UINT8 ucTableIndex;
  10766. UINT8 ucCurrSrcIndex = PQ_Get_Source_Grouped_Index();
  10767. UV_Coring_BY_Group_Idx *pUV_Coring_Setting;
  10768. if (ucCurrSrcIndex >= min(SRC_INDEX_UNKNOWN, 20)) return;
  10769. if (pVtab->mUV_Coring.mUV_CoringGroupedIndex[ucCurrSrcIndex] >= 8) return;
  10770. ucTableIndex = pVtab->mUV_Coring.mUV_CoringGroupedIndex[ucCurrSrcIndex];
  10771. pUV_Coring_Setting = &pVtab->mUV_Coring.UV_Coring_BY_Group_Idx[ucTableIndex];
  10772. if(pUV_Coring_Setting->iUVCoring_en)
  10773. {
  10774. PQ_RegisterWrite(VIP_reg_uv_coring_en, ENABLE);
  10775. PQ_RegisterWrite(VIP_reg_uv_coring, pUV_Coring_Setting->iUVCoring);
  10776. }
  10777. else
  10778. {
  10779. PQ_RegisterWrite(VIP_reg_uv_coring_en, OFF);
  10780. }
  10781. }
  10782. #endif //#ifdef DYNAMIC_BACKLIGHT
  10783. void PQ_set_PWM_Duty(UINT16 uwMaxDuty, UINT16 uwMinDuty)
  10784. {
  10785. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  10786. pDBL->PWMDutyMax = uwMaxDuty;
  10787. pDBL->PWMDutyMin = uwMinDuty;
  10788. }
  10789. void PQ_get_PWM_Duty(UINT16* uwMaxDuty, UINT16* uwMinDuty)
  10790. {
  10791. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  10792. *uwMaxDuty = pDBL->PWMDutyMax;
  10793. *uwMinDuty = pDBL->PWMDutyMin;
  10794. }
  10795. UINT8 PQ_GetDefinitionIndex(void)
  10796. {
  10797. UINT8 PQ_Definition = PQ_STANDARD_DEFINITION;
  10798. if(VIP_GetInputVSize()>576+24) /* safer boundary */
  10799. {
  10800. PQ_Definition = PQ_HIGH_DEFINITION;
  10801. }
  10802. return PQ_Definition;
  10803. }
  10804. void PQ_HW_Initial(void)
  10805. {
  10806. PQ_RegisterWrite(VIP_reg_slr_mix_hdiff_th, 64);
  10807. PQ_RegisterWrite(VIP_reg_slr_mix_vdiff_th, 64);
  10808. //post 2d sharpness overshoot fac
  10809. PQ_RegisterWrite(VIP_reg_slr_2d_c_ovsht_fac, 0);
  10810. PQ_RegisterWrite(VIP_reg_slr_2d_c_unsht_fac, 0);
  10811. PQ_RegisterWrite(VIP_reg_slr_2d_c_ovsht_clip, 0);
  10812. PQ_RegisterWrite(VIP_reg_slr_2d_c_unsht_clip, 0);
  10813. PQ_RegisterWrite(VIP_reg_slr_dcti_smooth_gain, 64);
  10814. PQ_RegisterWrite(VIP_reg_gfx_dbk_max_1_3_ratio_en, 1);
  10815. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_th_dyn_adj, 0x01);
  10816. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_en, 0);
  10817. PQ_RegisterWrite(VIP_reg_vdi_snr_demo_inv, 0);
  10818. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_lp_en, 0);
  10819. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_map_s_en, 0);
  10820. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_blk_diff_lp_en, 0);
  10821. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_fact0, 0x08);
  10822. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_fact1, 0x04);
  10823. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_fact2, 0x00);
  10824. PQ_RegisterWrite(VIP_reg_vdi_snr_hc_lp_gain, 0x2B);
  10825. PQ_RegisterWrite(VIP_reg_vdi_tnr_chroma_tap_sel, 0x00);
  10826. if (PQ_GET_YUV_Datat_Formal()== 0 || PQ_GET_YUV_Datat_Formal()==1)
  10827. {
  10828. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha1_tulow_en, 1);
  10829. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha1_tnulow_en, 0);
  10830. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_tulow_en, 0);
  10831. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_tnulow_en, 0);
  10832. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_en, 0);
  10833. PQ_RegisterWrite(VIP_reg_vdi_tnrz_demo_inv, 0);
  10834. PQ_RegisterWrite(VIP_reg_vdi_lb_double_en, 1);
  10835. PQ_RegisterWrite(VIP_reg_vdi_std_5row, 0);
  10836. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_en, 0);
  10837. PQ_RegisterWrite(VIP_reg_vdi_mad_loa_en, 1);
  10838. PQ_RegisterWrite(VIP_reg_vdi_selcurframe2dpy, 0);
  10839. }
  10840. else
  10841. {
  10842. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha1_tulow_en, 1);
  10843. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha1_tnulow_en, 0);
  10844. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_tulow_en, 0);
  10845. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_tnulow_en, 0);
  10846. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_en, 1);
  10847. PQ_RegisterWrite(VIP_reg_vdi_tnrz_demo_inv, 0);
  10848. PQ_RegisterWrite(VIP_reg_vdi_lb_double_en, 1);
  10849. PQ_RegisterWrite(VIP_reg_vdi_std_5row, 1);
  10850. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_en, 1);
  10851. PQ_RegisterWrite(VIP_reg_vdi_mad_loa_en, 1);
  10852. PQ_RegisterWrite(VIP_reg_vdi_selcurframe2dpy, 0);
  10853. }
  10854. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ul_low_stb_th, 0x04);
  10855. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_adj_max, 0x30);
  10856. PQ_RegisterWrite(VIP_reg_vdi_tnrz_v_ref, 0x08);
  10857. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_inc_fact, 0x04);
  10858. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_dec_fact, 0x02);
  10859. PQ_RegisterWrite(VIP_reg_vdi_tnrz_u_ref, 0x08);
  10860. PQ_RegisterWrite(VIP_reg_vdi_tnrz_th1, 0x00);
  10861. PQ_RegisterWrite(VIP_reg_vdi_tnrz_th1_adj_fact, 0x28);
  10862. PQ_RegisterWrite(VIP_reg_vdi_tnrz_th1_adj_min, 0x00);
  10863. PQ_RegisterWrite(VIP_reg_vdi_tnrz_th1_adj_max, 0x22);
  10864. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_u_ref, 0x08);
  10865. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_th1, 0x00);
  10866. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_th1_adj_fact, 0x28);
  10867. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_th1_adj_min, 0x00);
  10868. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_th1_adj_max, 0x22);
  10869. PQ_RegisterWrite(VIP_reg_vdi_tnrz_clamp_fac1, 0x02);
  10870. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_clamp_fac1, 0x02);
  10871. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_init, 0x04);
  10872. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_adj_min_dith, 0x04);
  10873. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_adj_min, 0x04);
  10874. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_alpha, 0x04);
  10875. PQ_RegisterWrite(VIP_reg_vdi_tnrz_th1_s, 0x00);
  10876. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_th1_s, 0x00);
  10877. PQ_RegisterWrite(VIP_reg_vdi_tnr_snr_slope_s, 0x03);
  10878. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_th1, 0x24);
  10879. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_th2, 0x02);
  10880. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_th3, 0x800);
  10881. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_th4, 0x00);
  10882. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_color_th1, 0x24);
  10883. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_color_th2, 0x03);
  10884. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_color_th4, 0x00);
  10885. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_color_th3, 0x850);
  10886. PQ_RegisterWrite(VIP_reg_vdi_tnr_mbw1_alpha_adj, 0x08);
  10887. PQ_RegisterWrite(VIP_reg_vdi_tnr_mbw2_alpha_adj, 0x0C);
  10888. PQ_RegisterWrite(VIP_reg_vdi_tnr_mbw3_alpha_adj, 0x10);
  10889. PQ_RegisterWrite(VIP_reg_vdi_tnr_mbwm_alpha_adj, 0x18);
  10890. PQ_RegisterWrite(VIP_reg_vdi_tnrz_mbw1_alpha_adj, 0x08);
  10891. PQ_RegisterWrite(VIP_reg_vdi_tnrz_mbw2_alpha_adj, 0x0C);
  10892. PQ_RegisterWrite(VIP_reg_vdi_tnrz_mbw3_alpha_adj, 0x10);
  10893. PQ_RegisterWrite(VIP_reg_vdi_tnrz_mbwm_alpha_adj, 0x18);
  10894. PQ_RegisterWrite(VIP_reg_vdi_tnr_ulow_mbw1_alpha_adj, 0x10);
  10895. PQ_RegisterWrite(VIP_reg_vdi_tnr_ulow_mbw2_alpha_adj, 0x18);
  10896. PQ_RegisterWrite(VIP_reg_vdi_tnr_ulow_mbw3_alpha_adj, 0x20);
  10897. PQ_RegisterWrite(VIP_reg_vdi_tnr_ulow_mbwm_alpha_adj, 0x28);
  10898. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ulow_mbw1_alpha_adj, 0x10);
  10899. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ulow_mbw2_alpha_adj, 0x18);
  10900. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ulow_mbw3_alpha_adj, 0x20);
  10901. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ulow_mbwm_alpha_adj, 0x28);
  10902. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_chroma, 0x10);
  10903. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_th1_s, 0x00);
  10904. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_slope_s, 0x00);
  10905. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_add1, 0x00);
  10906. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_add2, 0x00);
  10907. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_add3, 0x00);
  10908. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_add4, 0x00);
  10909. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_add5, 0x00);
  10910. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_add6, 0x00);
  10911. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_add7, 0x00);
  10912. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_add1, 0x00);
  10913. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_add2, 0x00);
  10914. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_add3, 0x00);
  10915. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_add4, 0x00);
  10916. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_add5, 0x00);
  10917. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_add6, 0x00);
  10918. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_add7, 0x00);
  10919. PQ_RegisterWrite(VIP_reg_vdi_ne_fd_chg_mbw_thd, 0x680);
  10920. PQ_RegisterWrite(VIP_reg_vdi_tnr_y_lb_1, 0);
  10921. PQ_RegisterWrite(VIP_reg_vdi_tnr_y_rb_1, 0x40);
  10922. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha1_inc, 0x3c);
  10923. PQ_RegisterWrite(VIP_reg_vdi_alpha_sel, 0x01);
  10924. PQ_RegisterWrite(VIP_reg_vdi_alpha1_tulow_en, 0x01);
  10925. PQ_RegisterWrite(VIP_reg_vdi_alpha1_tnulow_en, 0);
  10926. PQ_RegisterWrite(VIP_reg_vdi_alpha2_tulow_en, 0);
  10927. PQ_RegisterWrite(VIP_reg_vdi_alpha2_tnulow_en, 0);
  10928. PQ_RegisterWrite(VIP_reg_vdi_alpha1_sulow_en, 0);
  10929. PQ_RegisterWrite(VIP_reg_vdi_alpha1_snulow_en, 0);
  10930. PQ_RegisterWrite(VIP_reg_vdi_alpha2_sulow_en, 0);
  10931. PQ_RegisterWrite(VIP_reg_vdi_alpha2_snulow_en, 0);
  10932. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha1_inc, 0x23);
  10933. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha2_inc, 0x23);
  10934. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha1_dec, 0x0A);
  10935. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha2_dec, 0x0A);
  10936. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_sel, 0x01);
  10937. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha1_inc, 0x23);
  10938. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha1_dec, 0x23);
  10939. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_inc, 0x0A);
  10940. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha2_dec, 0x0A);
  10941. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_init, 0x04);
  10942. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_adj_min_dith, 0x04);
  10943. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_adj_min, 0x04);
  10944. PQ_RegisterWrite(VIP_reg_vdi_tnrz_ultra_low_alpha, 0x04);
  10945. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_en, 0x01);
  10946. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_edgemode0, 0x01);
  10947. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_edgemode1, 0);
  10948. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_filter_sel, 0x01);
  10949. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_clamp_sel, 0x01);
  10950. PQ_RegisterWrite(VIP_reg_vdi_snr_2df_edge_en, 0x01);
  10951. PQ_RegisterWrite(VIP_reg_vdi_snr_2df_edge_sel, 0);
  10952. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_mode1fac, 0x08);
  10953. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_length, 0x03);
  10954. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_cls_max, 0x40);
  10955. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_cls_min, 0x20);
  10956. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_cls_slp, 0x10);
  10957. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_cls_thr, 0x00);
  10958. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_clamp_thr, 0x2f);
  10959. PQ_RegisterWrite(VIP_reg_vdi_snr_dering_clamp_max, 0x10);
  10960. PQ_RegisterWrite(VIP_reg_vdi_snr_2df_edge_fac, 0x08);
  10961. PQ_RegisterWrite(VIP_reg_vdi_snr_2df_edge_cls_thr, 0x00);
  10962. PQ_RegisterWrite(VIP_reg_vdi_snr_2df_edge_cls_slp, 0x20);
  10963. PQ_RegisterWrite(VIP_reg_vdi_snr_2df_edge_cls_min, 0x30);
  10964. PQ_RegisterWrite(VIP_reg_vdi_snr_2df_edge_cls_max, 0x40);
  10965. PQ_RegisterWrite(VIP_reg_vdi_snr_2df_edge_fil_sel, 0x01);
  10966. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_typ0, 0x1);
  10967. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_typ1, 0);
  10968. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_typ2, 0);
  10969. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_typ3, 0x1);
  10970. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_clamp_typ0, 0x1);
  10971. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_clamp_typ1, 0);
  10972. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_clamp_typ2, 0);
  10973. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_clamp_typ3, 0x1);
  10974. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_fac, 0x10);
  10975. PQ_RegisterWrite(VIP_reg_vdi_tnrz_clamp_fac, 0x18);
  10976. PQ_RegisterWrite(VIP_reg_vdi_tnrz_u_ref_s, 0x0);
  10977. PQ_RegisterWrite(VIP_reg_vdi_tnrz_th1_adj_fact_s, 0x0);
  10978. PQ_RegisterWrite(VIP_reg_vdi_tnrz_th1_adj_min_s, 0x0);
  10979. PQ_RegisterWrite(VIP_reg_vdi_tnrz_th1_adj_max_s, 0x0);
  10980. PQ_RegisterWrite(VIP_reg_vdi_snr_fun_debug, 0x0);
  10981. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_fac1, 0x02);
  10982. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_clamp_fac, 0x30);
  10983. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_clamp_fac, 0x30);
  10984. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_tap0, 0x00);
  10985. PQ_RegisterWrite(VIP_reg_vdi_tnr_clamp_tap1, 0x00);
  10986. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_clamp_tap0, 0x00);
  10987. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_clamp_tap1, 0x00);
  10988. PQ_RegisterWrite(VIP_reg_vdi_tnrz_clamp_tap0, 0x00);
  10989. PQ_RegisterWrite(VIP_reg_vdi_tnrz_clamp_tap1, 0x00);
  10990. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_clamp_tap0, 0x00);
  10991. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_clamp_tap1, 0x00);
  10992. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_lp, 0x25);
  10993. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_div0, 0x00);
  10994. PQ_RegisterWrite(VIP_reg_vdi_tnr_alpha_div1, 0x00);
  10995. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_alpha_div0, 0x00);
  10996. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_alpha_div1, 0x00);
  10997. //20170320 Modify default value because of mantis 0042440
  10998. PQ_RegisterWrite(VIP_reg_vdi_tnr_8bit0, 0x00);
  10999. PQ_RegisterWrite(VIP_reg_vdi_tnr_8bit1, 0x01);
  11000. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_8bit0, 0x00);
  11001. PQ_RegisterWrite(VIP_reg_vdi_tnr_c_8bit1, 0x01);
  11002. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_div0, 0x00);
  11003. PQ_RegisterWrite(VIP_reg_vdi_tnrz_alpha_div1, 0x00);
  11004. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_alpha_div0, 0x00);
  11005. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_alpha_div0, 0x00);
  11006. PQ_RegisterWrite(VIP_reg_vdi_tnrz_8bit0, 0x00);
  11007. PQ_RegisterWrite(VIP_reg_vdi_tnrz_8bit1, 0x00);
  11008. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_8bit0, 0x00);
  11009. PQ_RegisterWrite(VIP_reg_vdi_tnrz_c_8bit1, 0x00);
  11010. PQ_RegisterWrite(VIP_reg_vdi_debug_fix_val0, 0);
  11011. PQ_RegisterWrite(VIP_reg_vdi_debug_fix_val1, 128);
  11012. PQ_RegisterWrite(VIP_reg_vdi_debug_fix_val2, 255);
  11013. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_0, 0);
  11014. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_1, 0x08);
  11015. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_2, 0x10);
  11016. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_3, 24);
  11017. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_4, 32);
  11018. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_5, 40);
  11019. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_6, 48);
  11020. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_7, 56);
  11021. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_8, 64);
  11022. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_9, 72);
  11023. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_a, 80);
  11024. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_b, 88);
  11025. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_c, 96);
  11026. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_d, 104);
  11027. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_e, 112);
  11028. PQ_RegisterWrite(VIP_reg_vdi_ne_asd_thr_f, 120);
  11029. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_0, 0);
  11030. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_1, 8 );
  11031. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_2, 16 );
  11032. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_3, 24 );
  11033. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_4, 32 );
  11034. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_5, 40 );
  11035. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_6, 48 );
  11036. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_7, 56 );
  11037. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_8, 64 );
  11038. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_9, 72 );
  11039. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_a, 80 );
  11040. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_b, 88 );
  11041. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_c, 96 );
  11042. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_d, 104);
  11043. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_e, 112);
  11044. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_thr_f, 120);
  11045. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_0, 0);
  11046. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_1, 8 );
  11047. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_2, 16 );
  11048. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_3, 24 );
  11049. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_4, 32 );
  11050. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_5, 40 );
  11051. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_6, 48 );
  11052. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_7, 56 );
  11053. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_8, 64 );
  11054. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_9, 72 );
  11055. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_a, 80 );
  11056. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_b, 88 );
  11057. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_c, 96 );
  11058. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_d, 104);
  11059. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_e, 112);
  11060. PQ_RegisterWrite(VIP_reg_vdi_ne_sad_asd_thr_f, 120);
  11061. PQ_RegisterWrite(VIP_reg_dpy_flcom0_magmax, 0x37);
  11062. PQ_RegisterWrite(VIP_reg_dpy_fl_blk_hnum, 40);
  11063. PQ_RegisterWrite(VIP_reg_dpy_fl_blk_vnum, 30);
  11064. //#debug mode
  11065. PQ_RegisterWrite(VIP_reg_dpy_fl_det_dbg_en, 0);
  11066. //#medium
  11067. PQ_RegisterWrite(VIP_reg_dpy_fl_det_factor, 9);
  11068. }
  11069. #ifdef NEW_COEFFICIENT
  11070. void load_coeff_table_nodelay(UINT8 index,UINT8 table)
  11071. {
  11072. INT32 i;
  11073. UINT32* COEFF=(UINT32*)&V_SCALING_UP;
  11074. UINT8 flag_noscaling_H=0;
  11075. switch(table)
  11076. {
  11077. case HCOEFF_NoScaling:
  11078. flag_noscaling_H=1;
  11079. break;
  11080. case VCOEFF_ScalingUP:
  11081. COEFF=(UINT32*)&V_SCALING_UP;
  11082. break;
  11083. case VCOEFF_Scaling_100_110:
  11084. COEFF=(UINT32*)&V_SCALING_100_110;
  11085. break;
  11086. case VCOEFF_Scaling_110_120:
  11087. COEFF=(UINT32*)&V_SCALING_110_120;
  11088. break;
  11089. case VCOEFF_Scaling_120_130:
  11090. COEFF=(UINT32*)&V_SCALING_120_130;
  11091. break;
  11092. case VCOEFF_Scaling_130_140:
  11093. COEFF=(UINT32*)&V_SCALING_130_140;
  11094. break;
  11095. case VCOEFF_Scaling_140_150:
  11096. COEFF=(UINT32*)&V_SCALING_140_150;
  11097. break;
  11098. case VCOEFF_Scaling_150_160:
  11099. COEFF=(UINT32*)&V_SCALING_150_160;
  11100. break;
  11101. case VCOEFF_Scaling_160_170:
  11102. COEFF=(UINT32*)&V_SCALING_160_170;
  11103. break;
  11104. case VCOEFF_Scaling_170_180:
  11105. COEFF=(UINT32*)&V_SCALING_170_180;
  11106. break;
  11107. case VCOEFF_Scaling_180_190:
  11108. COEFF=(UINT32*)&V_SCALING_180_190;
  11109. break;
  11110. case VCOEFF_Scaling_190_200:
  11111. COEFF=(UINT32*)&V_SCALING_190_200;
  11112. break;
  11113. case VCOEFF_Scaling_200_250:
  11114. COEFF=(UINT32*)&V_SCALING_200_250;
  11115. break;
  11116. case VCOEFF_Scaling_250_300:
  11117. COEFF=(UINT32*)&V_SCALING_250_300;
  11118. break;
  11119. case VCOEFF_Scaling_300_350:
  11120. COEFF=(UINT32*)&V_SCALING_300_350;
  11121. break;
  11122. case VCOEFF_Scaling_350_400:
  11123. COEFF=(UINT32*)&V_SCALING_350_400;
  11124. break;
  11125. default:
  11126. break;
  11127. }
  11128. PQ_RegisterWrite( VIP_reg_slr_coeff_sel, index);
  11129. //if((flag_noscaling_V==0)&&(flag_noscaling_H==0))
  11130. if(flag_noscaling_H==0)
  11131. {
  11132. for(i=0;i<=32;i++)
  11133. mips1_word_coeff_group_nodelay( i, COEFF[3*i+0], COEFF[3*i+1], COEFF[3*i+2]);
  11134. // printk(KERN_EMERG"load_coeff_table_nodelay<==\n");
  11135. }
  11136. else
  11137. {
  11138. mips1_word_coeff_group_nodelay( 0, 0, 0x10000000, 0);
  11139. //mips1_word_coeff_group_nodelay( 0, 0, 0, 0);
  11140. }
  11141. //if(index==2)
  11142. // PQ_RegisterWrite( VIP_reg_slr_coeff_sel, 0);
  11143. }//load_coeff_table~
  11144. void _PQ_FillNewCoefficient(UINT8 PRE_H_COEFF_TYPE,UINT8 POST_H_COEFF_TYPE,UINT8 V_COEFF_TYPE)
  11145. {
  11146. load_coeff_table_nodelay((UINT8)0,PRE_H_COEFF_TYPE);
  11147. load_coeff_table_nodelay((UINT8)2,V_COEFF_TYPE);
  11148. }
  11149. //================================================================================
  11150. // function name : PQ_Decide_Coefficient_Table
  11151. // input parameter :
  11152. // output parameter : none
  11153. // purpose : setup coefficient table in each scaler type
  11154. // return : none
  11155. // modify note : #34050, revision 53627, cross talk pattern unsmooth in 1280x760 or 1280x1024 pattern
  11156. // [how] if H size = 1280, set PRE_H_COEFF_TYPE = VCOEFF_Scaling_130_140
  11157. // #35850, revision 56413, cross talk pattern unsmooth inVG858, timing:982, Patten:923, p.size/4:3
  11158. // [how] if H size = 1280, add V_COEFF_TYPE = VCOEFF_Scaling_250_300;
  11159. // revision 59244, fonts unclear in PC, 1280x1024 panel
  11160. // [how] 1. revert 2 modification above (revision 53627, revision 56413)
  11161. // 2. set PRE_H_COEFF_TYPE = HCOEFF_NoScaling in specific input pattern
  11162. // #35850, revision 60738, cross talk pattern unsmooth inVG858, timing:982, Patten:923, p.size/4:3
  11163. // [how] 1. cancel the revert in revision 59244, and modify the coefficient table setting to PRE_H_COEFF_TYPE = VCOEFF_ScalingUP;
  11164. //================================================================================
  11165. void PQ_Decide_Coefficient_Table(UINT8 ucUserSource, DRV_SLR_CONFIG eSlrConfig, UINT32 PreHfactor, UINT32 PostHfactor, UINT32 Vfactor)
  11166. {
  11167. //the range of PreHfactor or Vfactor is 2048 * 1.1 = 2253, 2048 * 1.2 = 2458, etc...
  11168. UINT8 PRE_H_COEFF_TYPE=0,POST_H_COEFF_TYPE=0,V_COEFF_TYPE=0;
  11169. PRE_H_COEFF_TYPE=HCOEFF_NoScaling;
  11170. POST_H_COEFF_TYPE=HCOEFF_NoScaling;
  11171. V_COEFF_TYPE=VCOEFF_ScalingUP;
  11172. // Decide PRE_H_COEFF_TYPE by PreHfactor
  11173. //chienjen:using the same PRE_H_COEFF table as V_COEFF table
  11174. if(PreHfactor<2048) PRE_H_COEFF_TYPE=VCOEFF_ScalingUP;
  11175. else if(PreHfactor==2048) PRE_H_COEFF_TYPE=HCOEFF_NoScaling;
  11176. else if((PreHfactor>2048)&&(PreHfactor<=2253)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_100_110;
  11177. else if((PreHfactor>2253)&&(PreHfactor<=2458)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_110_120;
  11178. else if((PreHfactor>2458)&&(PreHfactor<=2662)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_120_130;
  11179. else if((PreHfactor>2662)&&(PreHfactor<=2867)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_130_140;
  11180. else if((PreHfactor>2867)&&(PreHfactor<=3072)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_140_150;
  11181. else if((PreHfactor>3072)&&(PreHfactor<=3277)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_150_160;
  11182. else if((PreHfactor>3277)&&(PreHfactor<=3482)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_160_170;
  11183. else if((PreHfactor>3482)&&(PreHfactor<=3686)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_170_180;
  11184. else if((PreHfactor>3686)&&(PreHfactor<=3891)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_180_190;
  11185. else if((PreHfactor>3891)&&(PreHfactor<=4096)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_190_200;
  11186. else if((PreHfactor>4096)&&(PreHfactor<=5120)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_200_250;
  11187. else if((PreHfactor>5120)&&(PreHfactor<=6144)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_250_300;
  11188. else if((PreHfactor>6144)&&(PreHfactor<=7168)) PRE_H_COEFF_TYPE=VCOEFF_Scaling_300_350;
  11189. else if(PreHfactor>7168) PRE_H_COEFF_TYPE=VCOEFF_Scaling_350_400;
  11190. if(PostHfactor == 2048 && Vfactor == 2048)
  11191. Vfactor=2048;
  11192. else if(PostHfactor > 2048 || Vfactor> 2048)
  11193. Vfactor = max(PostHfactor, Vfactor);
  11194. // Decide V_COEFF_TYPE by Vfactor
  11195. if(Vfactor<2048 || PostHfactor<=2048) V_COEFF_TYPE=VCOEFF_ScalingUP;
  11196. else if((Vfactor>2048)&&(Vfactor<=2253)) V_COEFF_TYPE=VCOEFF_Scaling_100_110;
  11197. else if((Vfactor>2253)&&(Vfactor<=2458)) V_COEFF_TYPE=VCOEFF_Scaling_110_120;
  11198. else if((Vfactor>2458)&&(Vfactor<=2662)) V_COEFF_TYPE=VCOEFF_Scaling_120_130;
  11199. else if((Vfactor>2662)&&(Vfactor<=2867)) V_COEFF_TYPE=VCOEFF_Scaling_130_140;
  11200. else if((Vfactor>2867)&&(Vfactor<=3072)) V_COEFF_TYPE=VCOEFF_Scaling_140_150;
  11201. else if((Vfactor>3072)&&(Vfactor<=3277)) V_COEFF_TYPE=VCOEFF_Scaling_150_160;
  11202. else if((Vfactor>3277)&&(Vfactor<=3482)) V_COEFF_TYPE=VCOEFF_Scaling_160_170;
  11203. else if((Vfactor>3482)&&(Vfactor<=3686)) V_COEFF_TYPE=VCOEFF_Scaling_170_180;
  11204. else if((Vfactor>3686)&&(Vfactor<=3891)) V_COEFF_TYPE=VCOEFF_Scaling_180_190;
  11205. else if((Vfactor>3891)&&(Vfactor<=4096)) V_COEFF_TYPE=VCOEFF_Scaling_190_200;
  11206. else if((Vfactor>4096)&&(Vfactor<=5120)) V_COEFF_TYPE=VCOEFF_Scaling_200_250;
  11207. else if((Vfactor>5120)&&(Vfactor<=6144)) V_COEFF_TYPE=VCOEFF_Scaling_250_300;
  11208. else if((Vfactor>6144)&&(Vfactor<=7168)) V_COEFF_TYPE=VCOEFF_Scaling_300_350;
  11209. else if(Vfactor>7168) V_COEFF_TYPE=VCOEFF_Scaling_350_400;
  11210. if(eSlrConfig == eSLR_CONFIG_PRE_NON_POST_NON)
  11211. {
  11212. PRE_H_COEFF_TYPE = HCOEFF_NoScaling;
  11213. POST_H_COEFF_TYPE = HCOEFF_NoScaling;
  11214. V_COEFF_TYPE = VCOEFF_ScalingUP;
  11215. }
  11216. if( VIP_GetInputVSize() <= 600 ) //SD
  11217. {
  11218. if(VIP_IsATVSource())
  11219. V_COEFF_TYPE = VCOEFF_Scaling_110_120;
  11220. if(VIP_IsSourceDTV())
  11221. V_COEFF_TYPE = VCOEFF_Scaling_200_250;
  11222. }
  11223. if( _VIP_InputWidthEnlargeRate() > 0)
  11224. {
  11225. if(VIP_IsPCSource() && (PreHfactor / _VIP_InputWidthEnlargeRate())== 2048)
  11226. {
  11227. PRE_H_COEFF_TYPE = HCOEFF_NoScaling;
  11228. }
  11229. }
  11230. if(VIP_IsPCSource() && (VIP_GetInputHSize()/_VIP_InputWidthEnlargeRate()) == 1280) // #34050
  11231. {
  11232. //PRE_H_COEFF_TYPE = VCOEFF_Scaling_130_140;
  11233. //V_COEFF_TYPE = VCOEFF_Scaling_250_300; //#mantis 35850
  11234. PRE_H_COEFF_TYPE = VCOEFF_ScalingUP;
  11235. }
  11236. //==============Fill Coefficient===============
  11237. _PQ_FillNewCoefficient(PRE_H_COEFF_TYPE,POST_H_COEFF_TYPE,V_COEFF_TYPE);
  11238. //======================================================================
  11239. }
  11240. #endif
  11241. void mips1_word_coeff_group(UINT8 ucAddr, UINT32 dw64, UINT32 dw68, UINT32 dw6c)
  11242. {
  11243. PQ_RegisterWrite(VIP_reg_slr_coeff_addr, ucAddr);
  11244. PQ_RegisterWrite(VIP_reg_slr_coeff_data2, dw64);
  11245. PQ_RegisterWrite(VIP_reg_slr_coeff_data1, dw68);
  11246. PQ_RegisterWrite(VIP_reg_slr_coeff_data0, dw6c);
  11247. }
  11248. #ifdef NEW_COEFFICIENT
  11249. void mips1_word_coeff_group_nodelay(UINT8 ucAddr, UINT32 dw64, UINT32 dw68, UINT32 dw6c)
  11250. {
  11251. //PQ_RegisterWrite(VIP_reg_slr_coeff_addr, ucAddr);
  11252. //PQ_RegisterWrite(VIP_reg_slr_coeff_data2, dw64);
  11253. //PQ_RegisterWrite(VIP_reg_slr_coeff_data1, dw68);
  11254. //PQ_RegisterWrite(VIP_reg_slr_coeff_data0, dw6c);
  11255. *(volatile UINT8*)(0xbe1cd060)=ucAddr;
  11256. *(volatile unsigned long*)(0xbe1cd064)=dw64;
  11257. *(volatile unsigned long*)(0xbe1cd068)=dw68;
  11258. *(volatile unsigned long*)(0xbe1cd06c)=dw6c;
  11259. //printk(KERN_EMERG"ucAddr=%d,dw64=0x%x,dw68=0x%x,dw6c=0x%x\n",ucAddr,dw64,dw68,dw6c);
  11260. }
  11261. #endif
  11262. void load_coeff_table(void)
  11263. {
  11264. INT32 i;
  11265. // printk(KERN_EMERG"load_coeff_table===>\n");
  11266. for(i=0;i<3;i++)
  11267. {
  11268. //2009-05-08 CJ fix HW bug
  11269. //SLR coeff. setting sequence : 0  à 4  à 5  à 1  à 5  à 7  à 6  à 2  à 0
  11270. //0, 1, 2 : Set oxbe1cd062 and write/read coeff.
  11271. //4, 5, 6, 7 : Olny set oxbe1cd062
  11272. if(i==1)
  11273. {
  11274. PQ_RegisterWrite( VIP_reg_slr_coeff_sel, 4);
  11275. PQ_RegisterWrite( VIP_reg_slr_coeff_sel, 5);
  11276. }
  11277. if(i==2)
  11278. {
  11279. PQ_RegisterWrite( VIP_reg_slr_coeff_sel, 5);
  11280. PQ_RegisterWrite( VIP_reg_slr_coeff_sel, 7);
  11281. PQ_RegisterWrite( VIP_reg_slr_coeff_sel, 6);
  11282. }
  11283. PQ_RegisterWrite( VIP_reg_slr_coeff_sel, i);
  11284. switch(i)
  11285. {
  11286. //prev_h/_h
  11287. case 0:
  11288. case 1:
  11289. //Because C.J's coeff. had line bugs, so use 328's h coeff
  11290. mips1_word_coeff_group( 0, 0x00000000, 0x10000000, 0x00000000);
  11291. mips1_word_coeff_group( 1, 0x0008FFCC, 0x10020037, 0xFFF8FFFC);
  11292. mips1_word_coeff_group( 2, 0x000EFF99, 0x10020071, 0xFFEFFFF8);
  11293. mips1_word_coeff_group( 3, 0x0014FF69, 0x0FFE00AE, 0xFFE5FFF4);
  11294. mips1_word_coeff_group( 4, 0x0019FF3B, 0x0FF700EC, 0xFFDAFFF0);
  11295. mips1_word_coeff_group( 5, 0x001EFF10, 0x0FED012E, 0xFFCEFFEC);
  11296. mips1_word_coeff_group( 6, 0x0021FEE7, 0x0FDF0171, 0xFFC1FFE8);
  11297. mips1_word_coeff_group( 7, 0x0024FEC0, 0x0FCE01B7, 0xFFB4FFE4);
  11298. mips1_word_coeff_group( 8, 0x0027FE9C, 0x0FBA01FF, 0xFFA5FFE1);
  11299. mips1_word_coeff_group( 9, 0x0028FE7B, 0x0FA20249, 0xFF96FFDD);
  11300. mips1_word_coeff_group(10, 0x0029FE5C, 0x0F880296, 0xFF86FFDA);
  11301. mips1_word_coeff_group(11, 0x0029FE3F, 0x0F6A02E4, 0xFF76FFD6);
  11302. mips1_word_coeff_group(12, 0x0028FE25, 0x0F480334, 0xFF64FFD4);
  11303. mips1_word_coeff_group(13, 0x0027FE0D, 0x0F230386, 0xFF52FFD1);
  11304. mips1_word_coeff_group(14, 0x0026FDF8, 0x0EFB03DA, 0xFF40FFCE);
  11305. mips1_word_coeff_group(15, 0x0024FDE5, 0x0ED00430, 0xFF2DFFCC);
  11306. mips1_word_coeff_group(16, 0x0021FDD5, 0x0EA10486, 0xFF1AFFCA);
  11307. mips1_word_coeff_group(17, 0x001EFDC7, 0x0E7004DF, 0xFF06FFC9);
  11308. mips1_word_coeff_group(18, 0x001BFDBB, 0x0E3B0538, 0xFEF2FFC8);
  11309. mips1_word_coeff_group(19, 0x0017FDB1, 0x0E030592, 0xFEDDFFC7);
  11310. mips1_word_coeff_group(20, 0x0013FDAA, 0x0DC805ED, 0xFEC9FFC7);
  11311. mips1_word_coeff_group(21, 0x000FFDA5, 0x0D8A0649, 0xFEB4FFC7);
  11312. mips1_word_coeff_group(22, 0x000BFDA2, 0x0D4906A6, 0xFE9FFFC7);
  11313. mips1_word_coeff_group(23, 0x0006FDA1, 0x0D050703, 0xFE8BFFC8);
  11314. mips1_word_coeff_group(24, 0x0002FDA2, 0x0CBF0760, 0xFE76FFC9);
  11315. mips1_word_coeff_group(25, 0xFFFDFDA5, 0x0C7607BD, 0xFE62FFCA);
  11316. mips1_word_coeff_group(26, 0xFFF9FDAA, 0x0C2A081A, 0xFE4FFFCC);
  11317. mips1_word_coeff_group(27, 0xFFF4FDB0, 0x0BDD0877, 0xFE3CFFCE);
  11318. mips1_word_coeff_group(28, 0xFFEFFDB8, 0x0B8D08D3, 0xFE29FFD1);
  11319. mips1_word_coeff_group(29, 0xFFEBFDC2, 0x0B3B092E, 0xFE17FFD4);
  11320. mips1_word_coeff_group(30, 0xFFE7FDCD, 0x0AE70989, 0xFE07FFD7);
  11321. mips1_word_coeff_group(31, 0xFFE2FDDA, 0x0A9209E3, 0xFDF7FFDB);
  11322. mips1_word_coeff_group(32, 0xFFDEFDE8, 0x0A3B0A3B, 0xFDE8FFDE);
  11323. break;
  11324. //_v
  11325. case 2:
  11326. mips1_word_coeff_group( 0, 0x00000000, 0x10000000, 0x00000000);
  11327. mips1_word_coeff_group( 1, 0x0000FFDC, 0x0FF70028, 0x00060000);
  11328. mips1_word_coeff_group( 2, 0x0000FFBB, 0x0FE80052, 0x000C0000);
  11329. mips1_word_coeff_group( 3, 0x0000FF9D, 0x0FD2007F, 0x00120000);
  11330. mips1_word_coeff_group( 4, 0x0000FF82, 0x0FB800AF, 0x00180000);
  11331. mips1_word_coeff_group( 5, 0x0000FF6A, 0x0F9700E1, 0x001E0000);
  11332. mips1_word_coeff_group( 6, 0x0000FF55, 0x0F720116, 0x00230000);
  11333. mips1_word_coeff_group( 7, 0x0000FF44, 0x0F48014D, 0x00280000);
  11334. mips1_word_coeff_group( 8, 0x0000FF35, 0x0F190186, 0x002C0000);
  11335. mips1_word_coeff_group( 9, 0x0000FF29, 0x0EE501C2, 0x00300000);
  11336. mips1_word_coeff_group(10, 0x0000FF20, 0x0EAE01FE, 0x00340000);
  11337. mips1_word_coeff_group(11, 0x0000FF19, 0x0E74023D, 0x00360000);
  11338. mips1_word_coeff_group(12, 0x0000FF15, 0x0E36027D, 0x00390000);
  11339. mips1_word_coeff_group(13, 0x0000FF13, 0x0DF502BF, 0x003A0000);
  11340. mips1_word_coeff_group(14, 0x0000FF13, 0x0DB10302, 0x003A0000);
  11341. mips1_word_coeff_group(15, 0x0000FF14, 0x0D6C0346, 0x003A0000);
  11342. mips1_word_coeff_group(16, 0x0000FF18, 0x0D24038B, 0x00390000);
  11343. mips1_word_coeff_group(17, 0x0000FF1D, 0x0CDA03D2, 0x00380000);
  11344. mips1_word_coeff_group(18, 0x0000FF24, 0x0C8F0419, 0x00350000);
  11345. mips1_word_coeff_group(19, 0x0000FF2B, 0x0C430461, 0x00320000);
  11346. mips1_word_coeff_group(20, 0x0000FF34, 0x0BF604A9, 0x002D0000);
  11347. mips1_word_coeff_group(21, 0x0000FF3E, 0x0BA704F3, 0x00280000);
  11348. mips1_word_coeff_group(22, 0x0000FF49, 0x0B59053D, 0x00230000);
  11349. mips1_word_coeff_group(23, 0x0000FF54, 0x0B090587, 0x001C0000);
  11350. mips1_word_coeff_group(24, 0x0000FF60, 0x0ABA05D2, 0x00150000);
  11351. mips1_word_coeff_group(25, 0x0000FF6C, 0x0A6A061E, 0x000D0000);
  11352. mips1_word_coeff_group(26, 0x0000FF78, 0x0A1A066A, 0x00040000);
  11353. mips1_word_coeff_group(27, 0x0000FF85, 0x09CA06B7, 0xFFFB0000);
  11354. mips1_word_coeff_group(28, 0x0000FF92, 0x097A0704, 0xFFF10000);
  11355. mips1_word_coeff_group(29, 0x0000FF9F, 0x092A0751, 0xFFE70000);
  11356. mips1_word_coeff_group(30, 0x0000FFAB, 0x08DB079F, 0xFFDC0000);
  11357. mips1_word_coeff_group(31, 0x0000FFB8, 0x088B07EE, 0xFFD00000);
  11358. mips1_word_coeff_group(32, 0x0000FFC4, 0x083C083C, 0xFFC40000);
  11359. break;
  11360. }//switch~
  11361. if(i==2)
  11362. PQ_RegisterWrite( VIP_reg_slr_coeff_sel, 0);
  11363. }//for~
  11364. // printk(KERN_EMERG"load_coeff_tabl<e===\n");
  11365. }//load_coeff_table~
  11366. void sp_w_table(void)
  11367. {
  11368. // printk(KERN_EMERG"sp_w_table==========================>\n");
  11369. ////dclk = 240mhz/8 = 30mhz
  11370. //mips1_byte( 0xbe1c0009, 0x8);//d clock dclk==>mclk*12/27.576 ex:19.45*12/27.576=8.46
  11371. //mips1_byte( 0xbe1c0009, 0x4);
  11372. //msleep(1000);
  11373. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  11374. //// MBW Config
  11375. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  11376. //
  11377. PQ_RegisterWrite(VIP_reg_slr_mbw_en, 0x1);
  11378. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_min, 0x0);
  11379. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_max, 0x0);
  11380. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_min_th, 0x0);
  11381. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_max_th, 0x0);
  11382. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_shift, 0x0);
  11383. PQ_RegisterWrite(VIP_reg_slr_spw_max, 0x20);
  11384. PQ_RegisterWrite(VIP_reg_slr_spw_min, 0x8);
  11385. PQ_RegisterWrite(VIP_reg_slr_spw_offset, 0x6);
  11386. PQ_RegisterWrite(VIP_reg_slr_spw_slope1, 0x40);
  11387. PQ_RegisterWrite(VIP_reg_slr_spw_slope2, 0x20);
  11388. //20100302 for «Ø¥ô 168c0 (avoid words blur) setting
  11389. PQ_RegisterWrite(VIP_reg_slr_mix_mb_hmot_th1 , 0x1);
  11390. PQ_RegisterWrite(VIP_reg_slr_mix_mb_hmot_th2, 8);
  11391. PQ_RegisterWrite(VIP_reg_slr_mix_mb_mmot_th1, 0x2);
  11392. PQ_RegisterWrite(VIP_reg_slr_mix_mb_mmot_th2, 8);
  11393. PQ_RegisterWrite(VIP_reg_slr_mix_mb_lmot_th1, 0x0);
  11394. PQ_RegisterWrite(VIP_reg_slr_mix_mb_lmot_th2, 0);
  11395. PQ_RegisterWrite(VIP_reg_slr_mix_mb_mot_th1, 0x3);
  11396. PQ_RegisterWrite(VIP_reg_slr_mix_mb_mot_th2, 0);
  11397. PQ_RegisterWrite(VIP_reg_slr_mix_max, 0x4);
  11398. PQ_RegisterWrite(VIP_reg_slr_mix_min, 5);
  11399. PQ_RegisterWrite(VIP_reg_slr_mesh_dec_th,0);
  11400. PQ_RegisterWrite(VIP_reg_slr_mix_mbw_limit, 4);
  11401. PQ_RegisterWrite(VIP_reg_slr_spw_th, 0x8);
  11402. }
  11403. void PQ_AffectInPanelVSync_ISR(void)
  11404. {
  11405. PQHW_CONTEXT* pHwContext= &PQHwContext;
  11406. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  11407. PQ_Sharpness_POST_2D(FALSE, pMenuValue->iSharpness);
  11408. PQ_Brightness(FALSE, pMenuValue->iBrightness);
  11409. PQ_Sharpness(FALSE, pMenuValue->iSharpness);
  11410. PQ_DSSharpness(FALSE, pMenuValue->iSharpness);
  11411. PQ_DPYSharpness(FALSE, pMenuValue->iSharpness);
  11412. PQ_HorSharpness(FALSE, pMenuValue->iSharpness);
  11413. PQ_Sharpness_POSTDCTI(FALSE,pMenuValue->iSharpness);
  11414. PQ_Sharpness_POSTDLTI(FALSE, pMenuValue->iSharpness);
  11415. if(!PQ_IsFadeEn())
  11416. {
  11417. PQ_Contrast(FALSE, pMenuValue->iContrast);
  11418. }
  11419. PQ_ColorMatrixSetup(FALSE, 0);
  11420. PQ_ColorMatrixComp(FALSE);
  11421. }
  11422. void PQ_AffectInInputVSync_ISR(void)
  11423. {
  11424. PQHW_CONTEXT* pHwContext= &PQHwContext;
  11425. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  11426. PQ_Sharpness_PREDCTI(FALSE, pMenuValue->iSharpness);
  11427. PQ_HmeControl();
  11428. }
  11429. #ifdef CONFIG_ENABLE_MIR
  11430. void mips1_MIR_word_coeff_group_nodelay(UINT8 ucAddr, UINT32 dw64, UINT32 dw68, UINT32 dw6c)
  11431. {
  11432. mips1_byte_nodelay( 0xbe1ce060, ucAddr);
  11433. mips1_word_nodelay(0xbe1ce064, dw64);
  11434. mips1_word_nodelay(0xbe1ce068, dw68);
  11435. mips1_word_nodelay(0xbe1ce06c, dw6c);
  11436. }
  11437. void load_MIR_coeff_table_nodelay(UINT8 index, UINT8 table)
  11438. {
  11439. INT32 i;
  11440. UINT32* COEFF=(UINT32*)&V_SCALING_UP;
  11441. UINT8 flag_noscaling_V=0;
  11442. switch(table)
  11443. {
  11444. case HCOEFF_NoScaling:
  11445. flag_noscaling_V=1;
  11446. break;
  11447. case VCOEFF_ScalingUP:
  11448. COEFF=(UINT32*)&V_SCALING_UP;
  11449. break;
  11450. case VCOEFF_Scaling_100_110:
  11451. COEFF=(UINT32*)&V_SCALING_100_110;
  11452. break;
  11453. case VCOEFF_Scaling_110_120:
  11454. COEFF=(UINT32*)&V_SCALING_110_120;
  11455. break;
  11456. case VCOEFF_Scaling_120_130:
  11457. COEFF=(UINT32*)&V_SCALING_120_130;
  11458. break;
  11459. case VCOEFF_Scaling_130_140:
  11460. COEFF=(UINT32*)&V_SCALING_130_140;
  11461. break;
  11462. case VCOEFF_Scaling_140_150:
  11463. COEFF=(UINT32*)&V_SCALING_140_150;
  11464. break;
  11465. case VCOEFF_Scaling_150_160:
  11466. COEFF=(UINT32*)&V_SCALING_150_160;
  11467. break;
  11468. case VCOEFF_Scaling_160_170:
  11469. COEFF=(UINT32*)&V_SCALING_160_170;
  11470. break;
  11471. case VCOEFF_Scaling_170_180:
  11472. COEFF=(UINT32*)&V_SCALING_170_180;
  11473. break;
  11474. case VCOEFF_Scaling_180_190:
  11475. COEFF=(UINT32*)&V_SCALING_180_190;
  11476. break;
  11477. case VCOEFF_Scaling_190_200:
  11478. COEFF=(UINT32*)&V_SCALING_190_200;
  11479. break;
  11480. case VCOEFF_Scaling_200_250:
  11481. COEFF=(UINT32*)&V_SCALING_200_250;
  11482. break;
  11483. case VCOEFF_Scaling_250_300:
  11484. COEFF=(UINT32*)&V_SCALING_250_300;
  11485. break;
  11486. case VCOEFF_Scaling_300_350:
  11487. COEFF=(UINT32*)&V_SCALING_300_350;
  11488. break;
  11489. case VCOEFF_Scaling_350_400:
  11490. COEFF=(UINT32*)&V_SCALING_350_400;
  11491. break;
  11492. default: //case VCOEFF_Scaling_195_250 COEFF=(DWORD*)&V_SCALING_UP;
  11493. break;
  11494. }
  11495. if(flag_noscaling_V==0)
  11496. {
  11497. for(i=0;i<=32;i++)
  11498. mips1_MIR_word_coeff_group_nodelay( i, COEFF[3*i+0], COEFF[3*i+1], COEFF[3*i+2]);
  11499. }
  11500. else
  11501. {
  11502. mips1_MIR_word_coeff_group_nodelay( 0, 0, 0x10000000, 0); //??
  11503. }
  11504. }//load_coeff_table~
  11505. void PQ_MIR_FillNewCoefficient(UINT8 V_COEFF_TYPE)
  11506. {
  11507. load_MIR_coeff_table_nodelay((UINT8)0,V_COEFF_TYPE);
  11508. }
  11509. void PQ_MIR_Decide_Coefficient_Table(UINT32 Hfactor)
  11510. {
  11511. UINT8 V_COEFF_TYPE=0;
  11512. V_COEFF_TYPE=HCOEFF_NoScaling;
  11513. if(Hfactor<2048) V_COEFF_TYPE=VCOEFF_ScalingUP;
  11514. else if(Hfactor==2048) V_COEFF_TYPE=HCOEFF_NoScaling;
  11515. else if((Hfactor>2048)&&(Hfactor<=2253)) V_COEFF_TYPE=VCOEFF_Scaling_100_110;
  11516. else if((Hfactor>2253)&&(Hfactor<=2458)) V_COEFF_TYPE=VCOEFF_Scaling_110_120;
  11517. else if((Hfactor>2458)&&(Hfactor<=2662)) V_COEFF_TYPE=VCOEFF_Scaling_120_130;
  11518. else if((Hfactor>2662)&&(Hfactor<=2867)) V_COEFF_TYPE=VCOEFF_Scaling_130_140;
  11519. else if((Hfactor>2867)&&(Hfactor<=3072)) V_COEFF_TYPE=VCOEFF_Scaling_140_150;
  11520. else if((Hfactor>3072)&&(Hfactor<=3277)) V_COEFF_TYPE=VCOEFF_Scaling_150_160;
  11521. else if((Hfactor>3277)&&(Hfactor<=3482)) V_COEFF_TYPE=VCOEFF_Scaling_160_170;
  11522. else if((Hfactor>3482)&&(Hfactor<=3686)) V_COEFF_TYPE=VCOEFF_Scaling_170_180;
  11523. else if((Hfactor>3686)&&(Hfactor<=3891)) V_COEFF_TYPE=VCOEFF_Scaling_180_190;
  11524. else if((Hfactor>3891)&&(Hfactor<=4096)) V_COEFF_TYPE=VCOEFF_Scaling_190_200;
  11525. else if((Hfactor>4096)&&(Hfactor<=5120)) V_COEFF_TYPE=VCOEFF_Scaling_200_250;
  11526. else if((Hfactor>5120)&&(Hfactor<=6144)) V_COEFF_TYPE=VCOEFF_Scaling_250_300;
  11527. else if((Hfactor>6144)&&(Hfactor<=7168)) V_COEFF_TYPE=VCOEFF_Scaling_300_350;
  11528. else if(Hfactor>7168) V_COEFF_TYPE=VCOEFF_Scaling_350_400;
  11529. VIPDebugPrint("%s:Hfactor = %d, V_COEFF_TYPE = %d",__FUNCTION__, Hfactor, V_COEFF_TYPE);
  11530. //==============Fill Coefficient===============
  11531. PQ_MIR_FillNewCoefficient(V_COEFF_TYPE);
  11532. //======================================================================
  11533. }
  11534. #endif
  11535. // (1) re caculate PWM period by PWM freq (2) re caculate LCDBackLightMap
  11536. void PQ_SETPWMFreq(UINT32 PWMFreq)
  11537. {
  11538. //#ifndef CONFIG_PANEL_ADJ_INVERT
  11539. PBRVIP_FLASH brvip_flash_p = (PBRVIP_FLASH)SPI_PANELSET_SHADOWADDR;
  11540. //#endif
  11541. UINT32 nBLBase;
  11542. UINT32 dwBackLightAddrPeroid;
  11543. UINT32 dwBackLightAddr= 0;
  11544. UINT32 nPeroidmmiVale, nBackLightmmiVale;
  11545. UINT8 i;
  11546. UINT32 mapValue = 0;
  11547. UINT16 uwMaxduty, uwMinduty;
  11548. //get duty
  11549. #ifdef CONFIG_SUPPORT_PWMFrequency_SaveIn_FactoryMode
  11550. ptv_base_t ptvdev = getptvdev();
  11551. ptvdev->pBootRomShareData->PwmFreq = PWMFreq;
  11552. ptvdev->bflashsetting = TRUE;
  11553. #endif
  11554. dwBackLightAddrPeroid = REG_ADR1_PWM0_BACKLIGHT + (PQ_GetPanelPWMNum() * 8);
  11555. nPeroidmmiVale = *((UINT32 *)(dwBackLightAddrPeroid));
  11556. dwBackLightAddr= REG_ADR2_PWM0_BACKLIGHT + PQ_GetPanelPWMNum() * 8;
  11557. nBackLightmmiVale = *((UINT32 *)(dwBackLightAddr)) & 0xfffffff;
  11558. //nDutyValue = nBackLightmmiVale*100/nPeroidmmiVale;
  11559. if(PWMFreq <= 0)//check PWMFreq vaild
  11560. PWMFreq = 1;
  11561. //1.duty first 0
  11562. //*((UINT32 *)(dwBackLightAddr))= 0;
  11563. //2.set freq
  11564. nBLBase = REFCLK*1000/PWMFreq;
  11565. *((UINT32 *)(dwBackLightAddrPeroid)) = nBLBase-1;
  11566. //3.set duty
  11567. *((UINT32 *)(dwBackLightAddr)) = 0; // reset PWM
  11568. if((nPeroidmmiVale*PWMFreq) > 0)
  11569. {
  11570. mapValue = REFCLK*1000*nBackLightmmiVale/(nPeroidmmiVale*PWMFreq) | 0x80000000;
  11571. }
  11572. //*((UINT32 *)(dwBackLightAddr)) = mapValue | 0x80000000;
  11573. PQ_ChangeBackLight(mapValue, 1);
  11574. PQ_get_PWM_Duty(&uwMaxduty, &uwMinduty);
  11575. #if 0//def CONFIG_PANEL_ADJ_INVERT
  11576. #ifdef CONFIG_SUPPORT_PWM_DUTY_IN_DECIMAL
  11577. LCDBackLightMap[0] = nBLBase*uwMaxduty/1000;
  11578. LCDBackLightMap[14] = nBLBase*uwMinduty/1000;
  11579. #else
  11580. LCDBackLightMap[0] = nBLBase*uwMaxduty/100;
  11581. LCDBackLightMap[14] = nBLBase*uwMinduty/100;
  11582. #endif
  11583. for (i = 0; i< 15; i++)
  11584. {
  11585. LCDBackLightMap[i] = LCDBackLightMap[0]-(LCDBackLightMap[0]-LCDBackLightMap[14])*i/14;
  11586. }
  11587. #else
  11588. if(brvip_flash_p->LCDBackLight_Order)
  11589. {
  11590. #ifdef CONFIG_SUPPORT_PWM_DUTY_IN_DECIMAL
  11591. LCDBackLightMap[0] = nBLBase*uwMaxduty/1000;
  11592. LCDBackLightMap[14] = nBLBase*uwMinduty/1000;
  11593. #else
  11594. LCDBackLightMap[0] = nBLBase*uwMaxduty/100;
  11595. LCDBackLightMap[14] = nBLBase*uwMinduty/100;
  11596. #endif
  11597. for (i = 0; i< 15; i++)
  11598. {
  11599. LCDBackLightMap[i] = LCDBackLightMap[0]-(LCDBackLightMap[0]-LCDBackLightMap[14])*i/14;
  11600. }
  11601. }
  11602. else
  11603. {
  11604. #ifdef CONFIG_SUPPORT_PWM_DUTY_IN_DECIMAL
  11605. LCDBackLightMap[14] = nBLBase*uwMaxduty/1000;
  11606. LCDBackLightMap[0] = nBLBase*uwMinduty/1000;
  11607. #else
  11608. LCDBackLightMap[14] = nBLBase*uwMaxduty/100;
  11609. LCDBackLightMap[0] = nBLBase*uwMinduty/100;
  11610. #endif
  11611. for (i = 0; i< 15; i++)
  11612. {
  11613. LCDBackLightMap[i] = LCDBackLightMap[0]+(LCDBackLightMap[14]-LCDBackLightMap[0])*i/14;
  11614. //myprintk("after LCDBackLightMap[%d] = 0x%x", i, LCDBackLightMap[i]);
  11615. }
  11616. }
  11617. #endif
  11618. #ifdef DYNAMIC_BACKLIGHT
  11619. PQ_InitDynamicBackLight();
  11620. #endif
  11621. }
  11622. UINT32 PQ_GETCurrPWMFreq(void)
  11623. {
  11624. UINT32 dwBackLightAddrPeroid;
  11625. UINT32 nBLBase, uiPWMFreq;
  11626. dwBackLightAddrPeroid = REG_ADR1_PWM0_BACKLIGHT + (PQ_GetPanelPWMNum() * 8);
  11627. nBLBase = *((UINT32 *)(dwBackLightAddrPeroid));
  11628. if(nBLBase == 0)
  11629. nBLBase = 1;
  11630. uiPWMFreq = REFCLK*1000/nBLBase;
  11631. return uiPWMFreq;
  11632. }
  11633. UINT32 PQ_GETCurrPWM(void)
  11634. {
  11635. UINT32 dwBackLightAddr;
  11636. UINT32 nBLBase;
  11637. dwBackLightAddr= REG_ADR2_PWM0_BACKLIGHT + PQ_GetPanelPWMNum() * 8;
  11638. nBLBase = *((UINT32 *)(dwBackLightAddr)) & 0xfffffff;
  11639. if(nBLBase == 0)
  11640. nBLBase = 1;
  11641. return nBLBase;
  11642. }
  11643. void PQ_SetPWMOff(BOOL bStatus)
  11644. {
  11645. PQHW_CONTEXT* pHwContext= &PQHwContext;
  11646. pHwContext->bPWMOff = bStatus;
  11647. }
  11648. UINT32 PQ_GETCurrDutyPWM(void)
  11649. {
  11650. UINT32 dwBackLightAddrPeroid;
  11651. UINT32 dwBackLightAddr= 0;
  11652. UINT32 nPeroidmmiVale, nBackLightmmiVale,nDutyValue = 0;
  11653. dwBackLightAddrPeroid = REG_ADR1_PWM0_BACKLIGHT + (PQ_GetPanelPWMNum() * 8);
  11654. nPeroidmmiVale = *((UINT32 *)(dwBackLightAddrPeroid));
  11655. dwBackLightAddr= REG_ADR2_PWM0_BACKLIGHT + PQ_GetPanelPWMNum() * 8;
  11656. nBackLightmmiVale = *((UINT32 *)(dwBackLightAddr)) & 0xfffffff;
  11657. if(nPeroidmmiVale > 0)
  11658. {
  11659. #ifdef CONFIG_SUPPORT_PWM_DUTY_IN_DECIMAL
  11660. nDutyValue = nBackLightmmiVale*1000/nPeroidmmiVale;
  11661. #else
  11662. nDutyValue = nBackLightmmiVale*100/nPeroidmmiVale;
  11663. #endif
  11664. }
  11665. return nDutyValue;
  11666. }
  11667. void PQ_SETCurrDutyPWM(UINT16 uwDuty)
  11668. {
  11669. UINT32 dwBackLightAddrPeroid;
  11670. UINT32 nPeroidmmiVale, nPWMValue;
  11671. dwBackLightAddrPeroid = REG_ADR1_PWM0_BACKLIGHT + (PQ_GetPanelPWMNum() * 8);
  11672. nPeroidmmiVale = *((UINT32 *)(dwBackLightAddrPeroid));
  11673. #ifdef CONFIG_SUPPORT_PWM_DUTY_IN_DECIMAL
  11674. nPWMValue = nPeroidmmiVale*uwDuty/1000;
  11675. if(uwDuty != 0 && nPWMValue == 0)
  11676. {
  11677. nPWMValue = 0x1;
  11678. }
  11679. #else
  11680. nPWMValue = nPeroidmmiVale*uwDuty/100;
  11681. #endif
  11682. PQ_SetRealBackLight(nPWMValue);
  11683. }
  11684. UINT32 PQ_GETCurrPolarity(void)
  11685. {
  11686. UINT32 uiPolarity;
  11687. //#ifndef CONFIG_PANEL_ADJ_INVERT
  11688. PBRVIP_FLASH brvip_flash_p = (PBRVIP_FLASH)SPI_PANELSET_SHADOWADDR;
  11689. //#endif
  11690. #if 0 //def CONFIG_PANEL_ADJ_INVERT
  11691. uiPolarity = 1;
  11692. #else
  11693. uiPolarity = brvip_flash_p->LCDBackLight_Order;
  11694. #endif
  11695. return uiPolarity;
  11696. }
  11697. UINT32 PQ_GETCurrElectricity(void)
  11698. {
  11699. DYNAMIC_BACKLIGHT_PARAM* pDBL= &g_DynamicBackLight;
  11700. UINT32 i;
  11701. UINT32 dwcurrentDuty;
  11702. dwcurrentDuty = PQ_GETCurrDutyPWM();
  11703. for(i = 0; i < pDBL->Electricity_PWM_table_Size; i++)
  11704. {
  11705. if(pDBL->pElectricity_PWM_table[i].PWM_Value == dwcurrentDuty)
  11706. {
  11707. return pDBL->pElectricity_PWM_table[i].Electity_Value;
  11708. }
  11709. }
  11710. return 0;
  11711. }
  11712. UINT8 PQ_GetPanelPWMNum(void)
  11713. {
  11714. CUSTIMIZATION_TABLEPTR pCustimizationBase= (CUSTIMIZATION_TABLEPTR) SPI_OPTIONDATA_SHADOWADDR;
  11715. #ifdef CONFIG_PANEL_ADJ_AS_GPIO
  11716. return pCustimizationBase->PanelBackLightGPIONum;
  11717. #else
  11718. return pCustimizationBase->PanelPWMNum;
  11719. #endif
  11720. }
  11721. //****************************************************************************
  11722. //
  11723. // Function : PQ_SetFilmMode
  11724. // Params :
  11725. // Description: Enable/Disable 2:2 pulldown or 2:3 pulldown detection
  11726. // Returns : void
  11727. //****************************************************************************
  11728. void PQ_SetFilmMode(UINT8 ucEnable)
  11729. {
  11730. UINT32 vdi_hsize_i,vdi_vsize,vdi_total;
  11731. vdi_hsize_i= VIP_GetScalerPreScaleH(); //= (reg_adix_che-reg_adix_chs) * 2048 / reg_slr_hfactor
  11732. vdi_vsize= PQ_Get_VDI_VSize(); //= reg_adix_cve-reg_adix_cvs
  11733. vdi_total= vdi_hsize_i*vdi_vsize;
  11734. if( ucEnable)
  11735. {
  11736. PQ_RegisterWrite(VIP_reg_vdi_32qual_22result, 0);
  11737. if(VIP_GetUserSource() == SOURCE_CVD2 && VIP_IsAVSource())//KW request 2012/11/06
  11738. {
  11739. PQ_RegisterWrite(VIP_reg_vdi_combcnt_fm_same_thd, 0x450);
  11740. PQ_RegisterWrite(VIP_reg_vdi_combcnt_hm_fs_thd, 0x450);
  11741. }
  11742. else
  11743. {
  11744. PQ_RegisterWrite(VIP_reg_vdi_combcnt_fm_same_thd, vdi_total/115);
  11745. PQ_RegisterWrite(VIP_reg_vdi_combcnt_hm_fs_thd, vdi_total/58);
  11746. }
  11747. }
  11748. else
  11749. {
  11750. PQ_RegisterWrite(VIP_reg_vdi_32qual_22result, 1);
  11751. PQ_RegisterWrite(VIP_reg_vdi_combcnt_fm_same_thd, 0x5);
  11752. PQ_RegisterWrite(VIP_reg_vdi_combcnt_hm_fs_thd, 0x5);
  11753. }
  11754. }
  11755. UINT32 PQ_Get_VDI_VSize(void)
  11756. {
  11757. UINT8 ucInterlaceMode;
  11758. UINT32 vdi_vsize;
  11759. ucInterlaceMode = VIP_GetInterlaceMode();
  11760. if(ucInterlaceMode < 2)
  11761. {
  11762. vdi_vsize = VIP_GetlInputCaptureVSize()>>ucInterlaceMode;
  11763. return vdi_vsize;
  11764. }
  11765. else
  11766. {
  11767. return 0;
  11768. }
  11769. }
  11770. void PQ_SetJPEGDisplayModePatch(UINT8 ucDisplayMode)
  11771. {
  11772. PQHW_CONTEXT* pHwContext= &PQHwContext;
  11773. PQ_MENU_VALUE* pMenuValue= &pHwContext->MenuValue;
  11774. if(ucDisplayMode == VIP_THUMBNAIL)
  11775. {
  11776. pHwContext->PqPatch.Post2DPatch = POST_2D_SHARPNESS_JPEG_THUMBNAIL_PATCH;
  11777. PQ_RegisterWrite(VIP_reg_slr_dlti_dclip_en_post, 1);
  11778. }
  11779. else
  11780. {
  11781. pHwContext->PqPatch.Post2DPatch = POST_2D_SHARPNESS_DEFAULT;
  11782. }
  11783. PQ_Sharpness_POST_2D(TRUE, pMenuValue->iSharpness);
  11784. }