si2176_func.c 159 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381
  1. /*
  2. * Silicon labs si2176 Tuner Device Driver
  3. *
  4. * Author: Bobby Yang <bo.yang@amlogic.com>
  5. *
  6. *
  7. * Copyright (C) 2010 Amlogic Inc.
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License version 2 as
  11. * published by the Free Software Foundation.
  12. */
  13. /* Standard Liniux Headers */
  14. #include <linux/module.h>
  15. #include <linux/i2c.h>
  16. #include <linux/delay.h>
  17. /* Local Headers */
  18. #include "si2176_func.h"
  19. #define I2C_TRY_MAX_CNT 3 //max try counter
  20. #ifdef CONFIG_MACH_MESON2_7366M_REFE01
  21. #define SI2176_B2A
  22. #else
  23. #define SI2176_B30
  24. #endif
  25. #ifdef SI2176_B30
  26. unsigned char firmwaretable[] = {
  27. 0x04,0x01,0x01,0x00,0xEE,0xA4,0xF3,0x6E,
  28. 0x0F,0x74,0xA9,0xF2,0x5C,0x9B,0x02,0xDB,
  29. 0x0F,0x15,0x15,0x1B,0xD9,0x4A,0x94,0x79,
  30. 0x05,0x5A,0x0A,0x7D,0xE7,0xDE,0x0E,0xBF,
  31. 0x22,0xE6,0x82,0x5B,0x50,0x2D,0xB6,0x3B,
  32. 0x07,0x86,0xA2,0x73,0xEC,0xFA,0x16,0x53,
  33. 0x05,0xD9,0xAD,0x33,0x43,0x27,0x56,0x7D,
  34. 0x22,0x6B,0xE2,0x86,0x56,0x29,0x36,0x5A,
  35. 0x05,0x6C,0xD1,0x6D,0x64,0x84,0x71,0xE1,
  36. 0x2A,0x8E,0x8C,0x59,0xAA,0x2C,0x85,0x2C,
  37. 0x05,0xCE,0xBA,0x9D,0x48,0x23,0xC7,0x6B,
  38. 0x2A,0x72,0x23,0xEB,0x90,0xDA,0xF2,0x11,
  39. 0x0F,0x1A,0x36,0xDA,0x66,0xD1,0xFA,0x07,
  40. 0x22,0xDA,0x72,0x94,0xBC,0xF3,0x0B,0x69,
  41. 0x05,0xBC,0xBC,0x11,0x4D,0xD5,0x0C,0xEE,
  42. 0x2F,0xF8,0xC9,0x55,0xB1,0xFC,0x4D,0x69,
  43. 0x27,0xC3,0xEB,0x0D,0x68,0xB6,0x76,0x8B,
  44. 0x2F,0x21,0xE5,0xBF,0xF6,0x00,0xA4,0x99,
  45. 0x2F,0x9E,0x3D,0x6B,0x4E,0x7E,0x10,0x0D,
  46. 0x27,0x3B,0xD4,0x41,0xA1,0xE3,0x7F,0x77,
  47. 0x2F,0xAD,0x07,0xA4,0x01,0xEB,0x57,0xD2,
  48. 0x2F,0x08,0xFD,0xA4,0xBA,0xEE,0x72,0xCF,
  49. 0x2F,0xD6,0x25,0x0C,0xD5,0x46,0xC1,0x89,
  50. 0x2F,0x46,0x74,0xF1,0xEC,0x3D,0xB8,0xD5,
  51. 0x27,0xB4,0xDC,0xFF,0xBB,0xD0,0x9A,0xA4,
  52. 0x27,0xD2,0x24,0x08,0x7A,0xEE,0x1D,0xB9,
  53. 0x27,0xE9,0x76,0x18,0xB1,0xBF,0x2E,0x8A,
  54. 0x2F,0x70,0x67,0x6B,0x23,0x03,0x21,0x5D,
  55. 0x27,0x50,0x88,0x28,0x86,0xB8,0x24,0x7A,
  56. 0x2F,0x6E,0xB6,0x29,0x8D,0xD7,0x3C,0x9F,
  57. 0x22,0x0A,0x18,0x5D,0xC2,0x46,0x5A,0x88,
  58. 0x0F,0xEC,0xF1,0x0F,0xE3,0x08,0xB9,0x6C,
  59. 0x2F,0xCF,0x80,0x97,0x25,0x7D,0x3A,0xB0,
  60. 0x2F,0xC3,0x0F,0x38,0xD9,0x0B,0xF2,0x89,
  61. 0x27,0x17,0xA0,0xEC,0xA2,0xD6,0xC4,0x1C,
  62. 0x07,0xFD,0x48,0xA6,0x65,0x87,0x2D,0x22,
  63. 0x2F,0xDF,0x23,0x69,0x91,0x91,0xCF,0xCC,
  64. 0x2F,0x8B,0x60,0x4B,0x29,0xF0,0x63,0xD1,
  65. 0x27,0x57,0xC7,0x8F,0xD5,0x96,0xD6,0x1C,
  66. 0x27,0x78,0x78,0x39,0x06,0x9E,0x8F,0x31,
  67. 0x27,0xAC,0xD5,0xB8,0x85,0x81,0xB7,0x57,
  68. 0x27,0x53,0xDA,0x47,0x89,0xA6,0xED,0x48,
  69. 0x27,0x7C,0xDE,0x41,0x44,0x2A,0xEA,0x55,
  70. 0x24,0x87,0xB3,0x94,0xEC,0xB6,0xAA,0x1B,
  71. 0x07,0x91,0x91,0xA9,0x9F,0x02,0xFA,0x20,
  72. 0x0F,0x04,0xDF,0xF9,0xBF,0x4B,0x6C,0x23,
  73. 0x05,0xC1,0x85,0xC3,0x51,0xA4,0x19,0x8D,
  74. 0x24,0x22,0x37,0x37,0x15,0xC5,0x44,0x7F,
  75. 0x05,0x4F,0x39,0x79,0xF2,0x0E,0xB4,0xFD
  76. };
  77. #endif //SI2176_B30
  78. #ifdef SI2176_B2A
  79. unsigned char firmwaretable[] = {
  80. 0x04,0x01,0x80,0x4E,0x47,0x00,0xEA,0x87,
  81. 0x05,0xFC,0xF3,0x1D,0x24,0xC9,0xEE,0x2F,
  82. 0x05,0x21,0xF0,0x68,0xC6,0x5C,0x69,0x1D,
  83. 0x27,0xAD,0x67,0xFC,0xA0,0xAB,0x2B,0x9D,
  84. 0x07,0x6D,0x3D,0xCB,0xE9,0x62,0x00,0x0F,
  85. 0x2F,0xE4,0xC5,0xDA,0xD8,0xBA,0x4C,0x34,
  86. 0x07,0x67,0xF7,0x41,0x96,0x22,0x4A,0x41,
  87. 0x0F,0x73,0xC6,0x7C,0x8D,0x5C,0xD2,0xCC,
  88. 0x2F,0x92,0xB0,0x67,0x98,0x04,0xDD,0x3F,
  89. 0x2F,0x41,0xE3,0x47,0xE1,0xD4,0xC9,0x71,
  90. 0x2F,0xCA,0xBE,0x93,0x73,0x79,0xE9,0x46,
  91. 0x2F,0x2F,0x7E,0x62,0x5E,0xB1,0xD3,0x88,
  92. 0x2F,0x22,0xFE,0x0C,0x9D,0xD7,0x82,0x04,
  93. 0x0F,0x88,0x1B,0xD4,0xDA,0x70,0x75,0xF5,
  94. 0x25,0x7F,0x15,0x2C,0xF9,0x27,0xC3,0xC8,
  95. 0x0F,0xF5,0x2F,0x8D,0x69,0x85,0x79,0xB3,
  96. 0x2F,0x1F,0x48,0xB0,0x71,0xB7,0x08,0x3E,
  97. 0x2C,0xEC,0x6F,0x3B,0x7E,0xFA,0x1A,0x47,
  98. 0x07,0x89,0x75,0xF6,0xA3,0x1E,0x1E,0xD2,
  99. 0x07,0x8F,0xEB,0x75,0xC8,0x29,0x97,0xFC,
  100. 0x0F,0xD0,0x88,0x3E,0x10,0xE4,0xF9,0x6A,
  101. 0x27,0x30,0x92,0x85,0x3D,0xC0,0x80,0xD1,
  102. 0x2C,0x95,0x8B,0xE9,0xE7,0x04,0x48,0x8A,
  103. 0x07,0x47,0x97,0x75,0xA3,0x12,0x00,0x60,
  104. 0x2F,0x39,0x0B,0x27,0x8C,0x22,0xA2,0x5D,
  105. 0x24,0xD5,0x81,0x69,0xB6,0x8B,0x85,0x82,
  106. 0x0F,0xB7,0x08,0x81,0x8B,0xAA,0x44,0x40,
  107. 0x2D,0xE4,0x47,0x5C,0xD7,0xCE,0x77,0xF8,
  108. 0x0F,0xA4,0x8C,0x1A,0xD3,0x95,0xDB,0x84,
  109. 0x25,0x98,0x22,0x9E,0xFF,0xEB,0x6B,0xB2,
  110. 0x07,0x2D,0xBC,0x92,0x02,0x93,0x20,0x5A,
  111. 0x2F,0x50,0x0B,0xEF,0xD7,0x15,0x55,0x5C,
  112. 0x21,0xFA,0x83,0x15,0xCA,0xF7,0x5B,0xA4,
  113. 0x07,0x1E,0x7A,0xFC,0x1F,0xAA,0xC1,0xD0,
  114. 0x0F,0x24,0xCD,0xC5,0x5E,0x8C,0xCE,0x99,
  115. 0x0F,0x17,0xD9,0xE5,0x2A,0x87,0xA3,0xC7,
  116. 0x07,0xA1,0xA0,0x16,0xC5,0xBC,0xA4,0x9C,
  117. 0x07,0xA1,0xC7,0x54,0xBA,0xB6,0xAC,0xDF,
  118. 0x22,0xEC,0xCD,0x20,0xE3,0xFD,0xB3,0x67,
  119. 0x0F,0x14,0xE6,0x02,0x65,0x19,0xB6,0x44,
  120. 0x22,0x1D,0x4C,0xF5,0x2E,0xD5,0xDC,0xD4,
  121. 0x0F,0x98,0x0C,0x3D,0x14,0x7B,0x8D,0x55,
  122. 0x2E,0x79,0x42,0xDF,0x83,0x35,0x43,0x13,
  123. 0x07,0xBC,0xFA,0xA8,0x91,0x04,0x9A,0xC5,
  124. 0x07,0x2C,0x51,0xA8,0x7C,0x0F,0x5A,0x3C,
  125. 0x0F,0x87,0x92,0x09,0x81,0xBF,0x4A,0x93,
  126. 0x0F,0xFA,0xB4,0x8A,0x22,0x56,0x21,0x5A,
  127. 0x0F,0xE4,0xC2,0x26,0x21,0x77,0xCE,0xDB,
  128. 0x2A,0xEF,0x2C,0x3E,0x46,0x39,0x6A,0x3E,
  129. 0x0F,0x72,0x95,0x02,0xC3,0x0B,0x4D,0x2B,
  130. 0x0F,0x05,0x14,0x06,0x05,0xB9,0x33,0x38,
  131. 0x07,0xCF,0x0F,0x75,0x16,0xC5,0x24,0xCC,
  132. 0x2F,0xB3,0x6F,0x36,0xF0,0x48,0xD8,0xA5,
  133. 0x21,0x7C,0xDE,0x90,0xF8,0xF4,0x7C,0x88,
  134. 0x0F,0x55,0x7D,0x70,0x41,0xE9,0xCB,0x13,
  135. 0x22,0x33,0x10,0xE6,0x18,0x67,0x0E,0x3A,
  136. 0x0F,0x69,0x40,0xE2,0xC0,0x76,0x41,0x98,
  137. 0x2A,0xCD,0x61,0xF3,0xAE,0x6A,0x79,0xBE,
  138. 0x07,0x92,0x1F,0xBC,0xDD,0xFD,0x6A,0x7E,
  139. 0x0F,0xBA,0x73,0x7A,0xE3,0xB0,0x1E,0xAF,
  140. 0x07,0xBE,0x7C,0x92,0xC9,0x55,0x79,0x8F,
  141. 0x27,0xE2,0x4B,0x8D,0x09,0x17,0xED,0x56,
  142. 0x25,0xC0,0x5A,0xDF,0x1B,0x35,0xFB,0x01,
  143. 0x07,0x2E,0x09,0x9B,0xE7,0x2A,0x45,0xBD,
  144. 0x2F,0x7D,0xB5,0x8C,0x27,0x66,0xCE,0x93,
  145. 0x27,0x0A,0x48,0x76,0x60,0x8B,0x79,0xCD,
  146. 0x27,0x28,0xBB,0x00,0x4F,0xBA,0x9C,0xF6,
  147. 0x27,0x02,0x51,0xBC,0x7F,0x0E,0x74,0x82,
  148. 0x27,0x8B,0xE2,0x67,0xDA,0x11,0x7F,0xE8,
  149. 0x23,0x8A,0xF6,0x78,0xCD,0x64,0xED,0xA9,
  150. 0x07,0xB2,0x01,0xC3,0xFD,0xE9,0x5E,0x0F,
  151. 0x25,0x03,0x6F,0xA0,0xF1,0xED,0x62,0x58,
  152. 0x07,0x16,0x18,0x69,0x7A,0x70,0x53,0x85,
  153. 0x0F,0xF2,0x9A,0x9B,0xE5,0xBB,0xF9,0x14,
  154. 0x07,0x38,0xB2,0xB2,0x3F,0xFD,0x4D,0xE2,
  155. 0x2F,0x50,0x2F,0x5F,0x21,0x23,0x8D,0xFB,
  156. 0x24,0xCB,0x14,0x01,0x3B,0xC5,0x03,0x28,
  157. 0x0F,0x05,0xD8,0x7B,0x3E,0x8B,0xDA,0xD6,
  158. 0x22,0xE7,0x83,0x00,0x06,0x50,0x66,0x6C,
  159. 0x07,0x28,0x13,0x6B,0x1F,0x85,0xA5,0xC4,
  160. 0x2F,0x9E,0xE2,0x25,0xAE,0xB8,0xB7,0xE2,
  161. 0x2F,0xF2,0x57,0x61,0x70,0x78,0x0E,0xC9,
  162. 0x2F,0x67,0x79,0xDE,0xF5,0x3F,0x79,0xA0,
  163. 0x22,0x90,0x6B,0xB7,0x0A,0xD1,0x1A,0x73,
  164. 0x0F,0x2B,0x51,0xEB,0xF1,0xF1,0xE2,0x19,
  165. 0x25,0xC1,0x05,0x38,0x66,0x31,0xB4,0xEA,
  166. 0x07,0xA7,0x9C,0xD7,0xDE,0xDF,0x6A,0xC3,
  167. 0x22,0xB4,0xC0,0x34,0x21,0x26,0x6D,0x7B,
  168. 0x07,0xD4,0xCA,0x42,0xF7,0x75,0x2D,0xBE,
  169. 0x2D,0x05,0x20,0x1A,0x62,0xA9,0x2F,0x19,
  170. 0x07,0xB4,0x20,0x50,0x0D,0x08,0x63,0x2C,
  171. 0x22,0x68,0xEE,0xB4,0x86,0x84,0x0A,0x60,
  172. 0x07,0xFA,0xE5,0xA8,0x75,0x95,0x7B,0x60,
  173. 0x2A,0xFD,0x5B,0x22,0x17,0x09,0xCE,0xD5,
  174. 0x07,0x7E,0x43,0x67,0x08,0x46,0x01,0x45,
  175. 0x07,0x8B,0x0F,0x9B,0x83,0x04,0x32,0xB3,
  176. 0x07,0xCC,0xB4,0xBC,0x43,0xC2,0x63,0xED,
  177. 0x0F,0x47,0x01,0xE7,0xF3,0xF6,0x03,0x93,
  178. 0x0F,0x84,0x33,0xA1,0x5B,0x87,0x49,0xF9,
  179. 0x07,0x5F,0xBE,0xCB,0x39,0xF2,0xAB,0x64,
  180. 0x07,0x24,0x7A,0xFE,0x9D,0x0D,0xC1,0x7A,
  181. 0x0F,0xC9,0x9B,0x62,0x1C,0x17,0xE6,0x25,
  182. 0x0F,0x93,0x74,0xAB,0x26,0xCF,0x5C,0xE5,
  183. 0x07,0x40,0x53,0x81,0xA8,0xF3,0xA1,0x69,
  184. 0x0F,0xAD,0xA5,0x6C,0x6D,0x1E,0x50,0x6F,
  185. 0x07,0x4C,0x70,0x78,0x09,0x58,0xDD,0x15,
  186. 0x0F,0x75,0x5E,0xDD,0x48,0x05,0x93,0xF6,
  187. 0x27,0xFC,0xF7,0xFD,0xD8,0xC6,0x01,0x82,
  188. 0x27,0xD7,0x22,0x8F,0xDF,0xE1,0x3E,0x0C,
  189. 0x2F,0x3C,0xD5,0x73,0x61,0x7D,0x86,0xB9,
  190. 0x27,0x72,0xE0,0x62,0xA6,0x4E,0xD2,0x9D,
  191. 0x27,0x2A,0x47,0xEA,0xE0,0x98,0x88,0xA9,
  192. 0x27,0x64,0x7E,0x9F,0x51,0x99,0xFA,0x74,
  193. 0x27,0xEC,0x20,0x2C,0xC5,0x3F,0x12,0xAF,
  194. 0x2F,0x3F,0xFB,0x55,0x09,0xD5,0x8B,0x22,
  195. 0x2F,0xB8,0x95,0x11,0xFE,0xA8,0x20,0x6E,
  196. 0x2F,0xD1,0x00,0x78,0x55,0x71,0xE0,0x15,
  197. 0x27,0x6C,0xE4,0x7D,0x02,0x19,0xFF,0x62,
  198. 0x2F,0x67,0xF7,0x05,0x05,0xB8,0xA6,0x15,
  199. 0x2F,0xFD,0x70,0x4F,0xCD,0x54,0x70,0x14,
  200. 0x2F,0x36,0x5C,0x6E,0x86,0x30,0xA1,0x61,
  201. 0x2F,0x3F,0x0D,0x95,0xD5,0x79,0x3C,0x4F,
  202. 0x27,0x2C,0x57,0xEA,0x2C,0x82,0x94,0x70,
  203. 0x27,0x47,0x0F,0x7B,0xCD,0x3A,0x98,0x84,
  204. 0x2F,0xC7,0x09,0x63,0x09,0xD8,0x67,0xE4,
  205. 0x27,0x65,0xA0,0x67,0x2C,0x90,0x19,0x9C,
  206. 0x2F,0xB1,0x99,0xA8,0x5D,0x66,0x23,0x16,
  207. 0x2F,0x7B,0x43,0xCB,0x33,0x1C,0x32,0xE7,
  208. 0x27,0xED,0x2D,0x46,0xA7,0x82,0xAA,0xA9,
  209. 0x2F,0xB5,0x50,0x59,0x87,0x0C,0xA4,0xE7,
  210. 0x21,0xF1,0x76,0x86,0x4D,0x3B,0x17,0xED,
  211. 0x0F,0x47,0xD3,0xE9,0xCC,0x47,0x98,0xE4,
  212. 0x2F,0x91,0x78,0x45,0xDF,0xFB,0x47,0xA6,
  213. 0x27,0x06,0xF2,0xE3,0x9C,0x8A,0x38,0xFD,
  214. 0x27,0x06,0x2E,0x75,0x90,0x82,0xDF,0x09,
  215. 0x2F,0x75,0x1A,0xA1,0x9A,0x0C,0xEF,0xF7,
  216. 0x2F,0x44,0x31,0x71,0x80,0x7F,0x02,0xCE,
  217. 0x27,0x85,0xC9,0xAE,0x61,0x0A,0xC1,0xA1,
  218. 0x27,0xB7,0xF3,0xE0,0xBE,0x44,0x92,0x3C,
  219. 0x2F,0x13,0xE8,0x4C,0x53,0x40,0xC4,0x28,
  220. 0x2F,0xEF,0xD9,0x05,0xA5,0x9C,0xCB,0x9E,
  221. 0x27,0x8B,0xED,0x4B,0x28,0xED,0xE1,0xE2,
  222. 0x2F,0x1A,0x3F,0xD2,0x1E,0xAC,0x38,0x2D,
  223. 0x24,0x18,0xFC,0x32,0x1E,0x7A,0x04,0x4B,
  224. 0x0F,0x49,0xA2,0xBE,0x22,0xA1,0x04,0x8D,
  225. 0x0F,0xC2,0x32,0xB8,0x54,0x55,0x2F,0xD5,
  226. 0x0F,0x95,0x1A,0x95,0x0B,0xA9,0x28,0x84,
  227. 0x22,0x25,0x9C,0x59,0x6C,0x76,0x6D,0xA2,
  228. 0x0F,0x5B,0xFC,0xE2,0x52,0xDD,0x3F,0x5E,
  229. 0x07,0xD8,0x22,0xAE,0xB2,0xC6,0x17,0xAF,
  230. 0x07,0xB2,0xB3,0xB6,0x25,0x0D,0x2B,0x4A,
  231. 0x07,0x55,0xB0,0xD5,0x8A,0x38,0x75,0x98,
  232. 0x0F,0x02,0x27,0x9D,0x5C,0x7A,0xD0,0x81,
  233. 0x07,0x95,0x85,0xE0,0x19,0x85,0x0B,0x00,
  234. 0x0F,0x57,0xEA,0x4C,0xE8,0xC8,0x3A,0x12,
  235. 0x0F,0x60,0xB9,0xA1,0x81,0x3F,0x45,0xA3,
  236. 0x2A,0x92,0x9B,0xE8,0x67,0x55,0xFC,0x79,
  237. 0x07,0xAA,0x03,0x8C,0x90,0x61,0x75,0xF5,
  238. 0x27,0x84,0x3D,0xA4,0xE8,0x38,0x24,0xEB,
  239. 0x27,0x38,0x4A,0xD3,0xBF,0x1C,0x72,0x1C,
  240. 0x27,0x60,0xCD,0x55,0x24,0xDC,0xAB,0x12,
  241. 0x2B,0xD2,0x34,0xC4,0x8C,0x5B,0xCA,0x2E,
  242. 0x07,0x5B,0xF8,0x1E,0x11,0x39,0x00,0xFF,
  243. 0x27,0xDE,0x8E,0xF2,0xAF,0x86,0x83,0xDE,
  244. 0x23,0x79,0x11,0xD9,0x3F,0xFE,0x69,0x6B,
  245. 0x07,0x72,0x42,0x1D,0xC6,0x71,0x10,0xBD,
  246. 0x07,0x77,0x6F,0x29,0xBB,0xFB,0x77,0x87,
  247. 0x27,0xD5,0xEA,0xF0,0x18,0x01,0xF6,0x36,
  248. 0x2F,0x70,0xF3,0xEB,0x79,0xF9,0x80,0x5A,
  249. 0x2F,0xD0,0x99,0x6B,0x62,0xD8,0x24,0xFF,
  250. 0x2F,0xCA,0x22,0x3D,0x32,0x9A,0xDD,0xF8,
  251. 0x27,0xD3,0xAD,0x71,0x2E,0x45,0x55,0x12,
  252. 0x27,0xB5,0x70,0x9F,0x4C,0x33,0x57,0x58,
  253. 0x2C,0x92,0xE9,0x6C,0x6E,0xA3,0x0F,0x9E,
  254. 0x0F,0xBC,0x53,0x82,0x9F,0x25,0xD8,0x63,
  255. 0x2F,0xBA,0xE3,0x03,0xF1,0x20,0xAA,0x82,
  256. 0x27,0xCB,0x4F,0x47,0x34,0x92,0xA5,0x20,
  257. 0x27,0x04,0x39,0xEF,0x08,0xA2,0x05,0x9F,
  258. 0x27,0xF3,0x71,0xD5,0xFC,0xBE,0xE3,0x51,
  259. 0x07,0xA3,0xFB,0x6F,0x91,0xD0,0x5A,0xE1,
  260. 0x2F,0xDC,0x7A,0x45,0x74,0x04,0x6D,0x68,
  261. 0x27,0xA1,0xB3,0x41,0x96,0xCA,0x8E,0xA0,
  262. 0x2F,0x29,0xB4,0x40,0xA1,0xE4,0x95,0xAC,
  263. 0x2F,0x61,0x18,0x40,0xEE,0x49,0xD8,0x19,
  264. 0x2A,0xE4,0x79,0x0B,0x77,0xCD,0x93,0xFA,
  265. 0x07,0x30,0xFE,0x99,0x6B,0x79,0x8A,0xC3,
  266. 0x2F,0x41,0xC3,0xC8,0x7C,0x93,0xF6,0xAC,
  267. 0x2F,0x2C,0x42,0x34,0x68,0x61,0x65,0x2E,
  268. 0x27,0x7E,0x50,0xFA,0xA2,0x7A,0xEA,0xA6,
  269. 0x27,0xE5,0x02,0x21,0x76,0x68,0xED,0xD8,
  270. 0x2F,0x26,0xCC,0xD2,0x56,0x14,0x29,0xAC,
  271. 0x27,0x00,0x86,0x55,0x85,0x8C,0xBC,0x66,
  272. 0x27,0xF4,0x3C,0xA7,0x43,0x0C,0x3F,0x8B,
  273. 0x2C,0x0F,0x66,0xA1,0xD2,0xA7,0x50,0x15,
  274. 0x07,0x63,0x9F,0x34,0xDE,0x74,0xFC,0x12,
  275. 0x27,0xF6,0x0E,0xF9,0xA7,0x6C,0x64,0x7F,
  276. 0x2F,0xB3,0xDD,0x1C,0xEE,0x65,0x14,0x87,
  277. 0x2F,0xD7,0x30,0x10,0x8E,0x20,0xA4,0x3C,
  278. 0x2A,0x98,0xA8,0xFF,0x48,0x3D,0x51,0x1C,
  279. 0x07,0xD9,0x0A,0x95,0xF3,0x6E,0x72,0x44,
  280. 0x27,0x4D,0x8E,0x0A,0x8B,0xA2,0xB1,0x13,
  281. 0x2A,0x13,0x7B,0x13,0x5F,0xBC,0x84,0x89,
  282. 0x0F,0x28,0xD6,0xAB,0x1D,0xB6,0x70,0xB0,
  283. 0x25,0x1D,0x8B,0xDE,0xDF,0xF7,0xDE,0xD4,
  284. 0x0F,0x12,0x2C,0x5E,0x1F,0x1D,0x31,0xC8,
  285. 0x2F,0x29,0xA3,0xB5,0x0C,0xA1,0xB5,0xCE,
  286. 0x2F,0xDC,0x77,0x00,0xB2,0xAF,0x2E,0xDF,
  287. 0x2F,0xAC,0x14,0xA1,0xF5,0xD2,0xBB,0x64,
  288. 0x0F,0x7E,0x5C,0x33,0xAA,0x23,0xE4,0x0C,
  289. 0x07,0x5E,0xD0,0x52,0x6E,0xBE,0xF6,0xF0,
  290. 0x0F,0x43,0x66,0x15,0x05,0x35,0x8B,0x24,
  291. 0x0F,0x50,0xB4,0x90,0x19,0x92,0x87,0x69,
  292. 0x07,0x87,0xDA,0x06,0x00,0x01,0x01,0x23,
  293. 0x27,0xFD,0xE2,0xCC,0x24,0x82,0x94,0xCA,
  294. 0x2D,0x9E,0x1C,0x0C,0x20,0xC3,0x30,0x53,
  295. 0x0F,0x7F,0x39,0xC6,0xD8,0x2C,0xEF,0xB4,
  296. 0x2F,0x60,0x08,0xCE,0x90,0xF0,0x45,0x05,
  297. 0x27,0xA7,0x4D,0xAD,0xBD,0xDD,0xFB,0xE4,
  298. 0x2F,0x11,0xB6,0xEF,0xF5,0xE8,0x56,0xC6,
  299. 0x27,0x19,0x05,0xF4,0x02,0x5F,0x51,0x37,
  300. 0x2F,0xBC,0x47,0x5E,0x77,0xAB,0xE1,0x4E,
  301. 0x24,0x94,0x99,0xA8,0xCB,0x96,0x4C,0xBE,
  302. 0x0F,0xB5,0x70,0xF9,0xCD,0xC3,0x80,0x19,
  303. 0x07,0xAE,0x88,0x48,0xA5,0x6E,0x65,0x68,
  304. 0x2F,0x35,0xDB,0x08,0x2D,0xDE,0x64,0x14,
  305. 0x2C,0x2A,0x46,0x51,0xC4,0x80,0x84,0x28,
  306. 0x0F,0x51,0x2B,0xC5,0x23,0x74,0x74,0x31,
  307. 0x2B,0x28,0x84,0x82,0x75,0x62,0xA6,0x93,
  308. 0x07,0x69,0x88,0x87,0x26,0x86,0xA1,0x3E,
  309. 0x07,0xB2,0xE4,0x5D,0x83,0x37,0x73,0xD0,
  310. 0x2F,0x9A,0x44,0xE2,0x10,0x54,0x9A,0x5A,
  311. 0x27,0xBE,0x54,0xDC,0x7F,0x4B,0xDF,0x2F,
  312. 0x2F,0x0D,0xF2,0xAC,0x8E,0x90,0x92,0xF1,
  313. 0x2B,0x83,0x5E,0x4B,0x73,0x83,0x8E,0x5E,
  314. 0x0F,0xF5,0x9A,0x54,0x3C,0x2C,0x64,0x92,
  315. 0x07,0xC0,0x55,0x13,0xF3,0x46,0x26,0x3E,
  316. 0x0F,0x41,0xF2,0xAA,0x85,0x50,0xF0,0xD0,
  317. 0x2F,0xE1,0x9D,0x66,0xD9,0x6A,0x57,0xC1,
  318. 0x21,0x88,0x28,0x05,0x19,0xFC,0xE4,0x44,
  319. 0x0F,0xC9,0x56,0xEC,0xF7,0x05,0xF4,0x10,
  320. 0x27,0x9C,0x3C,0xFC,0x44,0x43,0x9D,0x2C,
  321. 0x22,0xDD,0x28,0xC8,0xEB,0xB7,0x03,0x29,
  322. 0x0F,0x6B,0x4F,0x2F,0xF0,0xCD,0xF8,0x46,
  323. 0x07,0x32,0x55,0xF6,0x7E,0x02,0x42,0x2B,
  324. 0x07,0x27,0x77,0x2C,0x69,0x80,0x02,0x75,
  325. 0x2F,0x15,0x6B,0x2C,0x73,0x1A,0x2A,0xAB,
  326. 0x22,0x9C,0xF4,0x6D,0xC0,0xD9,0xA7,0xDB,
  327. 0x0F,0x71,0x95,0x9D,0xC4,0x18,0x5F,0x77,
  328. 0x0F,0x50,0xC5,0x0E,0x4F,0xC0,0x24,0xD5,
  329. 0x0F,0x74,0xCB,0xE5,0x2D,0xA9,0xEE,0x90,
  330. 0x07,0xB7,0x5A,0xEB,0x53,0xA0,0xB9,0x12,
  331. 0x0F,0x3F,0xE8,0x9F,0x19,0x54,0x97,0x30,
  332. 0x07,0x81,0x19,0x3C,0x3A,0x62,0x81,0xDE,
  333. 0x0F,0xEC,0x1E,0xBB,0x10,0xF3,0xD4,0xEE,
  334. 0x2A,0xCB,0x61,0xC0,0x92,0xD1,0xCF,0x16,
  335. 0x0F,0x6F,0x40,0xE2,0x47,0x05,0x7F,0xC5,
  336. 0x2F,0x5E,0x2A,0x9D,0x04,0x74,0x03,0x9D,
  337. 0x27,0xE6,0xC1,0x75,0x55,0xAD,0x90,0x6A,
  338. 0x27,0x2E,0xAB,0x09,0x07,0xA7,0xD1,0x4F,
  339. 0x27,0xF7,0x0D,0x38,0xFD,0x3C,0xC1,0xB9,
  340. 0x2F,0xA5,0xB8,0x58,0x91,0x29,0xFE,0x45,
  341. 0x27,0xD2,0x91,0x7A,0x92,0x5C,0x75,0xE0,
  342. 0x27,0x28,0x3C,0x85,0x87,0x28,0x6E,0x5D,
  343. 0x2F,0xCD,0x58,0xB3,0x98,0x2D,0x9C,0x5E,
  344. 0x2F,0xD2,0xFD,0xF9,0x6A,0xF2,0x6A,0x19,
  345. 0x2F,0xA8,0x86,0x34,0x3D,0x43,0xC8,0x7D,
  346. 0x27,0x11,0x53,0x0F,0x09,0x8A,0x83,0x79,
  347. 0x27,0x22,0x4F,0x7B,0x01,0x38,0x7C,0x26,
  348. 0x2F,0x67,0xD9,0x5A,0x43,0xC0,0x45,0xA9,
  349. 0x2F,0x88,0xB4,0xFE,0x11,0xD6,0xE8,0x9A,
  350. 0x27,0x67,0x12,0x76,0x47,0xC3,0x16,0x80,
  351. 0x27,0xF0,0x36,0xD1,0x78,0x3E,0xD3,0xC6,
  352. 0x27,0x6B,0x00,0x34,0xD8,0x5D,0x36,0xD5,
  353. 0x2F,0x13,0x15,0xB3,0x50,0x46,0xC0,0xD7,
  354. 0x27,0xFD,0x39,0x9F,0x80,0xF7,0xE2,0xD7,
  355. 0x2F,0xB0,0x79,0x88,0x58,0x60,0x8C,0xAD,
  356. 0x27,0x01,0x72,0x38,0xA2,0x90,0x7F,0x03,
  357. 0x27,0x09,0x47,0x8B,0xBA,0x5E,0x50,0x74,
  358. 0x2F,0x17,0xC7,0xAB,0xB4,0xF1,0xAD,0xFF,
  359. 0x27,0x58,0x31,0x3A,0xCC,0x09,0xDD,0xC2,
  360. 0x27,0x2A,0x9E,0x8F,0x5F,0xFB,0x5B,0xA2,
  361. 0x24,0x03,0xE1,0x25,0x90,0xFA,0xC5,0xB6,
  362. 0x0F,0x27,0xE2,0xEC,0xC3,0x3C,0x5D,0x7A,
  363. 0x2F,0x3A,0x64,0xCB,0x26,0x91,0x18,0xE7,
  364. 0x2F,0x12,0xE4,0x57,0x67,0xF7,0x36,0x6A,
  365. 0x2C,0x84,0x99,0xC9,0x9C,0x27,0x41,0x31,
  366. 0x0F,0x0D,0xAE,0x21,0x74,0x86,0x32,0x99,
  367. 0x2F,0x5B,0x28,0x58,0x6A,0x17,0x37,0xCF,
  368. 0x2F,0x5E,0xA9,0x93,0x06,0x58,0x1D,0x72,
  369. 0x2F,0x0F,0xC2,0x18,0xE7,0x18,0x0B,0x79,
  370. 0x2F,0x3F,0x0B,0x43,0x6B,0xDC,0xAE,0x9A,
  371. 0x27,0xCF,0xDB,0x02,0x60,0x9C,0xE6,0xB9,
  372. 0x27,0xC7,0x73,0x6D,0x40,0xF6,0x93,0xA8,
  373. 0x2F,0x4C,0x4A,0x63,0x09,0xD4,0xB7,0x73,
  374. 0x27,0xB2,0x98,0xBB,0xE2,0x06,0x52,0x02,
  375. 0x25,0x7B,0xA2,0x65,0x85,0xA3,0x7C,0xA2,
  376. 0x0F,0xB1,0x7D,0x1B,0x5A,0xF7,0xE2,0xA3,
  377. 0x27,0x80,0xEC,0xC0,0x43,0x34,0x5D,0xC4,
  378. 0x27,0xD4,0x2D,0x24,0x2E,0xA2,0xC0,0xE9,
  379. 0x29,0x5F,0xA8,0x39,0x18,0x15,0xB1,0x5A,
  380. 0x0F,0xAC,0xDC,0x91,0xF7,0x98,0xEF,0xA0,
  381. 0x2A,0xAF,0x1B,0xBF,0x4A,0xAC,0x31,0x3E,
  382. 0x0F,0x00,0x19,0x4E,0x63,0x9A,0x05,0x9C,
  383. 0x2F,0xD5,0xBA,0xDC,0x4C,0x40,0xC7,0x1A,
  384. 0x2A,0x55,0x3B,0xBE,0x5B,0xC1,0x9C,0x90,
  385. 0x0F,0x53,0x2E,0x8B,0x88,0x54,0xEA,0x13,
  386. 0x2A,0x3C,0x33,0x0D,0x08,0xC8,0xC1,0x20,
  387. 0x0F,0xE4,0x86,0xCB,0xB0,0x0E,0x74,0x39,
  388. 0x2F,0x36,0x8E,0x79,0x7C,0xC5,0xCF,0xAA,
  389. 0x2D,0x10,0x2A,0xA8,0x32,0xEB,0x5E,0x0E,
  390. 0x07,0xB2,0x56,0x84,0x01,0x4D,0x3F,0xF7,
  391. 0x27,0x28,0x98,0x33,0xB9,0x86,0x71,0xDE,
  392. 0x29,0x38,0x10,0x57,0x87,0xD8,0x0D,0x33,
  393. 0x07,0xD7,0x10,0x05,0x07,0x18,0xF4,0xDC,
  394. 0x2F,0xFF,0x36,0x59,0xFE,0x52,0xCB,0xB8,
  395. 0x25,0xEC,0x08,0x45,0x49,0x33,0xD6,0xAC,
  396. 0x0F,0x7E,0xFB,0xA7,0x80,0x4D,0xA7,0xD3,
  397. 0x22,0x29,0xCF,0x74,0xBA,0xDF,0x28,0xE6,
  398. 0x0F,0x07,0xC3,0xCA,0x5B,0x24,0x3E,0x3A,
  399. 0x07,0xB6,0x43,0x0C,0x31,0x67,0x8A,0xE9,
  400. 0x2F,0x2C,0xE3,0x76,0xA1,0x8B,0xB5,0x48,
  401. 0x24,0xDB,0x9A,0x16,0xBB,0x0F,0x17,0x0B,
  402. 0x07,0xB6,0x7C,0x26,0xD8,0x50,0x40,0x60,
  403. 0x2F,0x00,0x9F,0x73,0xEC,0x79,0x1D,0x2C,
  404. 0x25,0x9D,0x91,0xA9,0x31,0xE9,0x5E,0x68,
  405. 0x0F,0xF3,0xD5,0x77,0xEF,0x8A,0xB0,0xEF,
  406. 0x27,0xCA,0x2D,0xDA,0x00,0xFC,0x61,0x82,
  407. 0x27,0xB2,0x66,0x0D,0x38,0x94,0x44,0xA4,
  408. 0x2D,0x03,0x2F,0x1D,0xA3,0xAA,0xDE,0x93,
  409. 0x0F,0x9F,0x08,0xAA,0x46,0xCE,0xEE,0xC3,
  410. 0x27,0x94,0x16,0xCC,0xBC,0x80,0x93,0x43,
  411. 0x2B,0x3E,0x34,0x51,0x16,0x8C,0x16,0x7A,
  412. 0x07,0x74,0xEE,0x35,0x9A,0x7D,0xFF,0xFB,
  413. 0x2F,0xE2,0x86,0xFE,0x21,0xC4,0x05,0x48,
  414. 0x21,0x8B,0x45,0xCD,0x1C,0xFE,0xF8,0x7E,
  415. 0x0F,0x9A,0x06,0x9F,0x51,0xE8,0x12,0x61,
  416. 0x2F,0xAF,0x33,0x0D,0x0F,0xDE,0x8A,0xB4,
  417. 0x2C,0xD8,0x81,0xAF,0xF6,0x1A,0x21,0xFE,
  418. 0x0F,0x4A,0x5F,0x30,0x00,0x92,0xDC,0xE2,
  419. 0x27,0x1C,0x30,0xA0,0x6A,0x2C,0x92,0x55,
  420. 0x2F,0x25,0x5A,0x35,0x9B,0x82,0xED,0x3A,
  421. 0x27,0xD3,0xE8,0x99,0xD3,0xC5,0xA8,0xAA,
  422. 0x2F,0x91,0xC6,0x67,0xE6,0xB7,0x8F,0x43,
  423. 0x27,0xBE,0xE5,0xBD,0x56,0x20,0x71,0x29,
  424. 0x2F,0x0B,0xDB,0xFB,0x68,0xC8,0xE1,0x62,
  425. 0x2C,0x49,0x73,0xF5,0xE6,0x18,0xE3,0xE6,
  426. 0x0F,0xE2,0x02,0xC7,0x4D,0xD3,0xF3,0x1F,
  427. 0x27,0x2D,0x00,0xE2,0xA6,0x35,0x79,0x1D,
  428. 0x27,0x34,0xD2,0xF2,0x91,0x90,0x47,0xA9,
  429. 0x2D,0x67,0x1D,0xE7,0x6C,0x65,0x81,0x6B,
  430. 0x0F,0x9A,0xDA,0x7F,0xEE,0x35,0x3F,0xD0,
  431. 0x25,0x99,0xBD,0x32,0x03,0x43,0xB9,0xE4,
  432. 0x07,0x76,0xAB,0x25,0x9E,0x9B,0x4F,0xD0,
  433. 0x25,0x70,0x65,0xE3,0x65,0x03,0x04,0x0E,
  434. 0x0F,0x66,0xA3,0x93,0x5B,0x3D,0xFB,0xBD,
  435. 0x25,0xEC,0xDC,0x92,0x29,0xC7,0x66,0x39,
  436. 0x0F,0x2A,0x6F,0xC8,0x1C,0xC8,0xA7,0x13,
  437. 0x27,0xC8,0x91,0xCA,0xD7,0x11,0xCD,0x0B,
  438. 0x27,0x93,0x44,0x45,0x14,0xB0,0xC7,0xE6,
  439. 0x2F,0x93,0x4B,0x77,0x50,0x95,0xAB,0xD3,
  440. 0x27,0x46,0x1F,0xDD,0x51,0x12,0x1F,0x34,
  441. 0x27,0xD5,0x6B,0x4B,0xD8,0x1B,0x4A,0xEA,
  442. 0x27,0x71,0xED,0xBD,0xB9,0xEF,0x8F,0x78,
  443. 0x2F,0x45,0xA6,0x35,0x42,0x53,0x91,0x8F,
  444. 0x27,0x56,0xB1,0x7E,0xE4,0xDD,0xEF,0x1E,
  445. 0x27,0x5E,0x61,0x43,0xF6,0x4F,0x83,0xDE,
  446. 0x07,0xBC,0x25,0x3F,0x7A,0x7B,0x14,0xA0,
  447. 0x27,0x9A,0x53,0xE9,0x2D,0x1B,0xD5,0xEA,
  448. 0x22,0xBB,0x1A,0x77,0x4E,0xA2,0x5C,0x34,
  449. 0x0F,0x50,0x6C,0x52,0x72,0xEB,0x6E,0x61,
  450. 0x23,0x38,0x5B,0xA7,0x6E,0xC2,0x97,0xFA,
  451. 0x0F,0x78,0x3E,0x88,0x65,0xDB,0x02,0xC1,
  452. 0x2A,0xFB,0xF9,0xAE,0xE4,0x49,0xBB,0xD8,
  453. 0x07,0xCB,0x1D,0x02,0x8C,0xAF,0xA3,0x73,
  454. 0x07,0x8F,0xEE,0x4B,0xF1,0x6B,0xD8,0x95,
  455. 0x0F,0x51,0x23,0xA5,0x9D,0xF2,0xFB,0x5F,
  456. 0x2F,0xC7,0x23,0x81,0x6E,0x95,0x92,0x52,
  457. 0x2F,0x4B,0x6A,0xDE,0x02,0x01,0x9B,0x7F,
  458. 0x2F,0xB3,0x54,0x29,0x55,0xD0,0x01,0x3E,
  459. 0x27,0x19,0x24,0xFB,0xD8,0xF9,0x2A,0x3D,
  460. 0x27,0x3B,0x02,0x10,0xD6,0x33,0x41,0x6D,
  461. 0x0F,0x0C,0x9C,0xE4,0xDC,0x68,0xFB,0xBD,
  462. 0x2F,0xC0,0xF9,0xF9,0x85,0x91,0xBC,0x3B,
  463. 0x24,0x62,0x0C,0x5B,0x3B,0x70,0x1D,0x4D,
  464. 0x0F,0x4D,0x6C,0x39,0xE3,0x92,0xCF,0xF1,
  465. 0x07,0x19,0x3B,0x2C,0x67,0x48,0xDE,0x4D,
  466. 0x07,0x5B,0x08,0xC9,0x5F,0x97,0x65,0x0A,
  467. 0x07,0xCF,0x94,0x92,0xC5,0xFB,0x4F,0x5B,
  468. 0x0F,0x22,0x70,0x2D,0x54,0xD3,0xFC,0x62,
  469. 0x27,0xD3,0xA1,0xA5,0x98,0xDF,0x16,0x86,
  470. 0x2C,0xDB,0x07,0x98,0x84,0x68,0x5D,0x64,
  471. 0x07,0xE3,0xB3,0x19,0x4C,0x26,0x06,0xD9,
  472. 0x07,0xD6,0x4C,0xEA,0x63,0xBC,0x0D,0xB2,
  473. 0x27,0x0C,0x3B,0x1F,0x99,0x3B,0x80,0x43,
  474. 0x2F,0xF4,0x35,0xC2,0x5E,0x01,0xB9,0x82,
  475. 0x2C,0x4D,0xFB,0x6D,0x31,0x04,0xEF,0x09,
  476. 0x07,0x42,0x06,0x4D,0xCB,0x1F,0x08,0x83,
  477. 0x27,0x4C,0x8F,0xCA,0x57,0x93,0x6F,0x15,
  478. 0x2A,0x06,0xCA,0xBB,0xD7,0x9D,0xA3,0xD2,
  479. 0x0F,0xBF,0x42,0xE1,0xFC,0x75,0x60,0xE7,
  480. 0x07,0x8A,0x34,0xB9,0xD7,0x16,0xDD,0x5A,
  481. 0x0F,0xEF,0x8B,0x43,0x32,0x32,0xF0,0x42,
  482. 0x0F,0xED,0x55,0xFD,0x43,0xFD,0x79,0x30,
  483. 0x25,0x13,0xB7,0x0C,0xDB,0x45,0x7A,0x05,
  484. 0x0F,0xB4,0x24,0x6A,0x5C,0xFB,0x32,0x05,
  485. 0x2F,0xEF,0x3D,0x0A,0xF1,0x81,0x97,0x91,
  486. 0x2B,0xA2,0xDE,0x5A,0xCA,0x67,0xFB,0xDD,
  487. 0x07,0x84,0x98,0xD1,0x43,0x0C,0x29,0xC1,
  488. 0x27,0x0F,0xA4,0xDE,0x3D,0x70,0x20,0x13,
  489. 0x2F,0x3E,0x1A,0x5A,0xDB,0x21,0x41,0x9D,
  490. 0x21,0x86,0xB5,0x9B,0xA9,0xAD,0x57,0x0D,
  491. 0x0F,0xB1,0x46,0x18,0x26,0xCB,0xC2,0x44,
  492. 0x0F,0x71,0x97,0x62,0xF0,0x04,0x0F,0x6A,
  493. 0x2F,0x68,0x23,0x95,0x48,0x7F,0x27,0x09,
  494. 0x2C,0x8D,0x2C,0x08,0x5D,0x57,0x5E,0xBF,
  495. 0x07,0x8C,0x11,0xFE,0xE9,0x1C,0xA6,0x56,
  496. 0x2F,0xA4,0x62,0x1F,0xEB,0x0A,0x00,0x48,
  497. 0x27,0x9B,0x20,0x2A,0x00,0xC5,0x00,0x5F,
  498. 0x2F,0x36,0xF8,0x7A,0xEC,0xC2,0x77,0xD2,
  499. 0x2F,0x33,0xEF,0x18,0x40,0x39,0x52,0xFC,
  500. 0x27,0xC3,0x6F,0xC5,0x7A,0x54,0x0F,0xA7,
  501. 0x2F,0x60,0xFF,0x24,0x82,0x94,0xA1,0x3C,
  502. 0x2F,0x28,0x0E,0x04,0xA9,0x3B,0xD5,0x91,
  503. 0x25,0x6C,0xCD,0xCC,0xB9,0x87,0x9B,0x9C,
  504. 0x07,0x42,0x5C,0x47,0xA7,0xD1,0x0F,0x76,
  505. 0x27,0x66,0xD6,0x16,0x99,0x0A,0xDF,0x10,
  506. 0x26,0xB5,0x8B,0xC3,0xBF,0x0A,0xBE,0xC0,
  507. 0x07,0x8C,0x69,0xB4,0x64,0xC8,0x30,0x58,
  508. 0x27,0xD4,0xCB,0x5D,0x65,0xCE,0x09,0xE1,
  509. 0x25,0x84,0xC9,0x8E,0x09,0x98,0xA2,0xFD,
  510. 0x0F,0x30,0x02,0xC6,0x6F,0x41,0xA7,0xEB,
  511. 0x2F,0x25,0x7D,0xD0,0x2B,0x1D,0x51,0xA1,
  512. 0x2F,0x05,0x71,0x40,0xA7,0x15,0xAA,0xEA,
  513. 0x2F,0x88,0x09,0x96,0x1E,0xA6,0xB5,0x5D,
  514. 0x2F,0xCE,0x5B,0x8D,0x93,0x51,0x3A,0x75,
  515. 0x2F,0x8E,0xED,0x7E,0x4A,0xCD,0x7E,0xE4,
  516. 0x27,0x9B,0x51,0x5A,0x84,0x45,0x0C,0xC1,
  517. 0x2F,0x23,0xE1,0x14,0xC5,0x21,0x0A,0xA9,
  518. 0x2B,0xE7,0x45,0x49,0x00,0x16,0x49,0x1C,
  519. 0x07,0xE2,0xEB,0xCE,0x8F,0x98,0x85,0xDE,
  520. 0x07,0x50,0x86,0x8B,0x9D,0x5C,0x6C,0xA1,
  521. 0x2F,0x4F,0x84,0x05,0x50,0x67,0xA3,0x8F,
  522. 0x2F,0x37,0x21,0x83,0x85,0xBC,0x96,0xB7,
  523. 0x27,0x8A,0x0F,0x1E,0xBF,0x91,0x3C,0xBB,
  524. 0x2F,0x47,0x53,0x28,0x52,0x0E,0x31,0x14,
  525. 0x27,0x7E,0x8E,0xA6,0x8F,0xD7,0xE9,0xF2,
  526. 0x2D,0x74,0x41,0x12,0xD6,0xE3,0x84,0xF7,
  527. 0x07,0xB4,0xEE,0xCF,0x06,0xAA,0xDE,0x14,
  528. 0x2F,0xCF,0xA2,0xF7,0x5D,0x47,0x53,0x9A,
  529. 0x2F,0x1E,0x07,0x9B,0x9F,0x69,0x1E,0x12,
  530. 0x29,0xF2,0x3F,0xAD,0x67,0x86,0x8E,0x39,
  531. 0x07,0xD1,0x4F,0xDB,0x16,0xCB,0x29,0xB8,
  532. 0x0F,0xB4,0xB3,0x2B,0xA7,0x2B,0xDE,0x7F,
  533. 0x0F,0x6B,0x91,0xAD,0x6F,0xDE,0xF7,0x38,
  534. 0x2F,0xA0,0xF4,0x46,0xEA,0x31,0xA1,0x15,
  535. 0x2E,0xFD,0xA6,0x9C,0x25,0x5B,0x5A,0x3F,
  536. 0x0F,0x3F,0x38,0xCB,0x70,0x62,0x2A,0x47,
  537. 0x07,0xD1,0x44,0x03,0xE2,0x01,0xC5,0x90,
  538. 0x0F,0x05,0x13,0x1E,0x09,0x40,0xE9,0x82,
  539. 0x0F,0x48,0xDD,0x73,0x3E,0x16,0xBC,0x83,
  540. 0x0F,0x0A,0x77,0x10,0xB7,0x30,0x9A,0x5F,
  541. 0x0F,0xFE,0x91,0x5B,0x9D,0xB2,0x40,0x68,
  542. 0x05,0x6D,0x00,0xF4,0xDD,0x94,0xCD,0xD9,
  543. 0x2D,0x4C,0xBD,0x82,0x85,0x86,0xD4,0xC8,
  544. 0x0F,0xBB,0x17,0x82,0x3C,0x70,0xF9,0x0B,
  545. 0x07,0xAD,0x63,0x2C,0x2C,0x58,0x93,0x3C,
  546. 0x07,0xDD,0x4C,0xA7,0x3A,0x10,0x1F,0xAD,
  547. 0x0F,0x71,0x6C,0xF7,0xEA,0xA7,0x1D,0x08,
  548. 0x0F,0xB8,0xD1,0x23,0x5F,0xAC,0x95,0x69,
  549. 0x27,0x39,0x19,0x26,0xBA,0x35,0x80,0x49,
  550. 0x23,0xC7,0x53,0xC2,0x59,0xFD,0xE3,0x76,
  551. 0x0F,0x96,0xBD,0x16,0xD9,0x89,0xEE,0x17,
  552. 0x05,0xA0,0x5D,0xEF,0xAD,0x20,0xF3,0xDF,
  553. 0x22,0x92,0x9E,0xAF,0xAF,0x36,0x83,0xF8,
  554. 0x07,0x5D,0x25,0x68,0xCC,0xD0,0xD7,0xFB,
  555. 0x0F,0xE9,0xBB,0xD0,0x2D,0xE5,0xF7,0xBA,
  556. 0x2B,0x1A,0x6C,0xC9,0x1F,0xE5,0x49,0x62,
  557. 0x0F,0x03,0xCB,0x25,0xBF,0x5E,0x9C,0x14,
  558. 0x07,0xA3,0x5A,0xEC,0x2B,0x22,0x38,0x25,
  559. 0x2A,0xD0,0x4B,0xD1,0x3B,0x85,0x67,0x96,
  560. 0x0F,0x57,0x7C,0xF1,0x65,0xC9,0xFE,0x5D,
  561. 0x2A,0xF4,0xD2,0x00,0x20,0x8B,0xA0,0x2D,
  562. 0x07,0x98,0x89,0xC5,0x67,0x75,0x86,0xD0,
  563. 0x2A,0x31,0xD7,0xFC,0x6F,0x9A,0x80,0xDB,
  564. 0x05,0x84,0x33,0x32,0x2D,0x8E,0xC8,0xD7,
  565. 0x27,0x96,0x03,0x07,0x40,0x76,0x34,0x81,
  566. 0x22,0x4F,0x3B,0x49,0xF6,0x28,0x7A,0x42,
  567. 0x0F,0xE6,0xF0,0x79,0x3F,0xB5,0xEA,0x66,
  568. 0x0F,0x43,0xBF,0x62,0x88,0xB4,0x3A,0xF9,
  569. 0x0F,0x17,0xBE,0x7C,0x6B,0x5A,0x61,0x17,
  570. 0x05,0xDC,0x77,0xE7,0xCA,0xAB,0x9B,0xC4,
  571. 0x27,0x4F,0x99,0x94,0x13,0xF9,0x25,0x85,
  572. 0x2E,0x51,0x2E,0x5B,0x42,0xAA,0xFC,0xC9,
  573. 0x0F,0x4F,0x51,0x57,0x92,0x3D,0x89,0x18,
  574. 0x0F,0x93,0xA9,0xFA,0x18,0x68,0x05,0x51,
  575. 0x0F,0xE8,0x90,0xA5,0x90,0xA3,0x85,0x34,
  576. 0x07,0x0D,0x0E,0xAD,0x9A,0x39,0x6C,0xF5,
  577. 0x07,0x98,0xE1,0x36,0xD8,0xE7,0x1B,0x6C,
  578. 0x0F,0x04,0x70,0x6F,0x7B,0x1D,0x6F,0x39,
  579. 0x07,0xE7,0x47,0x84,0x25,0x47,0x03,0x0D,
  580. 0x2F,0x02,0x19,0x1A,0x53,0xBB,0x84,0x89,
  581. 0x2C,0xFB,0x9C,0xA2,0xCA,0x9C,0xD2,0x3F,
  582. 0x07,0xD4,0x03,0x21,0xE1,0x80,0xB7,0xEE,
  583. 0x07,0x39,0xA8,0x09,0xE5,0xB6,0x41,0xF1,
  584. 0x0F,0x93,0xD2,0x31,0x99,0xC0,0xEE,0xD3,
  585. 0x0F,0x43,0xE0,0x5E,0xF9,0x03,0xE6,0x6C,
  586. 0x0F,0x55,0x3F,0x75,0x54,0xA9,0x95,0xB2,
  587. 0x0F,0xF1,0x33,0x7C,0xC5,0xF2,0x0A,0x52,
  588. 0x07,0x0A,0xDB,0x63,0xA8,0x42,0xAA,0xD5,
  589. 0x2F,0x98,0x4B,0xDC,0xC1,0xC4,0x05,0x5D,
  590. 0x27,0x5E,0x74,0x5B,0x1B,0x38,0x12,0x57,
  591. 0x27,0x77,0xB7,0xEF,0x27,0x43,0xA8,0x2B,
  592. 0x25,0x41,0x80,0xDA,0x6F,0xF3,0xAD,0xD1,
  593. 0x05,0x1A,0x32,0x05,0x70,0x23,0x78,0x98,
  594. 0x27,0x7E,0xB3,0xEC,0xC2,0xED,0xB2,0x3A,
  595. 0x2F,0x3B,0x4E,0x3A,0x30,0xAB,0x3A,0xA1,
  596. 0x2F,0x3F,0xF8,0x35,0x43,0xCF,0x13,0xDB,
  597. 0x21,0x8B,0xD4,0x77,0x2F,0xC1,0xCD,0x90,
  598. 0x07,0x4B,0x20,0x4F,0x94,0x55,0x3B,0x6F,
  599. 0x2F,0xD3,0x10,0x2C,0xA1,0x55,0x1D,0xB0,
  600. 0x2A,0x48,0x59,0x38,0x40,0x73,0xA0,0xDE,
  601. 0x0F,0xCB,0x01,0x14,0x0C,0x78,0x73,0x93,
  602. 0x2F,0xBC,0x21,0x26,0x4C,0xE4,0x59,0x3B,
  603. 0x22,0x80,0xA4,0x2D,0xCB,0x89,0xC8,0xD6,
  604. 0x0F,0x42,0xFC,0x57,0x45,0xBA,0x98,0xA3,
  605. 0x2C,0x12,0xB0,0x69,0x24,0x12,0x19,0xCE,
  606. 0x0F,0x76,0xB8,0xA4,0x97,0x1F,0x3E,0x98,
  607. 0x2F,0x32,0x2D,0x37,0x64,0x9B,0x8F,0xA0,
  608. 0x2D,0xFC,0xBA,0x91,0x48,0x2D,0x9D,0x7C,
  609. 0x07,0x01,0x77,0x0A,0xA1,0x28,0xC3,0xEC,
  610. 0x07,0xBD,0x1C,0x56,0x63,0xFB,0xD3,0xED,
  611. 0x0F,0xF7,0x45,0xC6,0x07,0x60,0x00,0x3E,
  612. 0x24,0x1B,0x56,0xD9,0x56,0xE7,0xFC,0x54,
  613. 0x07,0x64,0xA4,0x97,0x04,0x26,0x10,0xFC,
  614. 0x27,0x33,0x0A,0x17,0xAD,0x4A,0x40,0x6D,
  615. 0x27,0x8B,0x3B,0x5E,0xD3,0x80,0x4D,0x45,
  616. 0x2F,0xDE,0x91,0x2F,0x9E,0x5E,0x5A,0xE1,
  617. 0x2E,0xB2,0xC2,0x14,0xF4,0x7F,0xEA,0xB0,
  618. 0x0F,0x68,0x43,0x68,0xCF,0x1E,0x54,0x49,
  619. 0x23,0x49,0x96,0x07,0xB0,0xB7,0x1E,0xDE,
  620. 0x0F,0x12,0xE6,0x38,0x5D,0xC7,0xAE,0x7B,
  621. 0x27,0xFA,0xED,0xCD,0x35,0x88,0x75,0x66,
  622. 0x27,0xA3,0xD4,0xE3,0x89,0x2C,0x6D,0x93,
  623. 0x2F,0x4A,0x78,0x7D,0x3A,0x0E,0xD3,0x89,
  624. 0x29,0x66,0x14,0x33,0x78,0x58,0xF9,0xC5,
  625. 0x07,0x91,0xC7,0x00,0x29,0xEB,0x8F,0x9C,
  626. 0x2F,0x48,0x78,0x21,0x76,0xDE,0x98,0x4F,
  627. 0x2F,0x3D,0x82,0xD2,0x95,0x79,0x48,0x13,
  628. 0x27,0xA4,0xCB,0x15,0xE1,0x05,0xCB,0xED,
  629. 0x2F,0x7A,0x7F,0x2B,0x61,0xEB,0x43,0xAC,
  630. 0x27,0xEF,0x82,0x8B,0xAF,0xDB,0x57,0x08,
  631. 0x2F,0x92,0xC9,0x6E,0x67,0xB5,0xC4,0x92,
  632. 0x27,0xE2,0x9B,0x76,0x75,0xC7,0x6E,0x19,
  633. 0x2F,0x66,0x54,0x44,0x3A,0x02,0x30,0x32,
  634. 0x27,0x66,0xB8,0x31,0x3B,0x3C,0x69,0x5E,
  635. 0x27,0xBC,0x94,0x12,0xE9,0x5D,0x19,0x69,
  636. 0x2F,0xD2,0xF8,0x54,0x7E,0xB4,0x81,0xD5,
  637. 0x23,0xE3,0x1A,0xC4,0x1E,0x5B,0x25,0x92,
  638. 0x07,0x3E,0xE3,0x43,0x13,0xEA,0xAF,0xEA,
  639. 0x2F,0xBD,0xAE,0x33,0x40,0x93,0x61,0x24,
  640. 0x07,0x03,0xD5,0x72,0xDD,0xAD,0x06,0x09,
  641. 0x27,0x13,0x7F,0x08,0xBA,0x60,0xCB,0x77,
  642. 0x2F,0xA0,0xFE,0x31,0x7B,0xCA,0x3D,0xCC,
  643. 0x27,0xDA,0xF1,0x43,0x40,0xDE,0xDD,0x63,
  644. 0x22,0x66,0x22,0x1E,0xE6,0x2F,0xBD,0x83,
  645. 0x07,0x7A,0x96,0xB7,0x14,0x87,0x90,0xD8,
  646. 0x27,0x50,0x06,0x1D,0xEC,0x35,0xF5,0xD3,
  647. 0x2F,0xCE,0x64,0x7F,0xE1,0xA0,0x97,0xF6,
  648. 0x2F,0xCB,0xB6,0x76,0xEF,0x08,0x1F,0x08,
  649. 0x2F,0xCF,0xC6,0x82,0xEF,0xE2,0x28,0xE3,
  650. 0x27,0xE5,0x65,0x80,0x90,0xA3,0x16,0x1C,
  651. 0x27,0x19,0xF9,0xD4,0x2F,0x13,0xB2,0xE6,
  652. 0x2F,0x96,0xA0,0x3E,0xBD,0x6E,0x9F,0x7E,
  653. 0x2F,0xC5,0x4E,0x11,0x89,0x49,0x39,0x70,
  654. 0x27,0xB0,0x9A,0x87,0x74,0xD6,0xDA,0x13,
  655. 0x27,0x34,0xC7,0x49,0x78,0x90,0x99,0x7E,
  656. 0x2F,0x13,0x14,0xF6,0x11,0xAA,0x82,0x26,
  657. 0x27,0x3C,0xB6,0xF9,0x79,0x25,0x3C,0x7C,
  658. 0x2F,0xFB,0xF8,0x5A,0xCF,0x28,0xD7,0x16,
  659. 0x27,0xA4,0xFE,0xB7,0x14,0x28,0x73,0xF0,
  660. 0x2F,0x5E,0x53,0x41,0xE9,0xC1,0x59,0x28,
  661. 0x2F,0x19,0x42,0x26,0xF3,0x60,0x43,0x87,
  662. 0x26,0xC1,0xAF,0x0A,0x25,0xF8,0x55,0x00,
  663. 0x0F,0xD9,0x6C,0x47,0xED,0x06,0x13,0xB5,
  664. 0x23,0x17,0xD1,0xC1,0x3B,0x8F,0xED,0x02,
  665. 0x0F,0xAD,0x54,0x63,0x0F,0x4D,0x6A,0xF8,
  666. 0x2D,0xED,0xCA,0xAC,0x73,0x17,0xD1,0x7F,
  667. 0x0F,0x3C,0xC1,0x65,0x94,0x62,0x8B,0x61,
  668. 0x2F,0x48,0x49,0xF3,0x58,0xBB,0x94,0x08,
  669. 0x2F,0x72,0xA7,0xFB,0x27,0xF1,0xD8,0xB0,
  670. 0x27,0x36,0xBD,0xE1,0xA8,0xEA,0xF5,0xA2,
  671. 0x2A,0x3C,0xF2,0x0A,0x72,0x4E,0x1E,0xCA,
  672. 0x07,0x14,0x45,0x88,0x60,0x06,0x5F,0xD3,
  673. 0x0F,0x77,0xF2,0xCB,0x57,0xAF,0x0B,0x17,
  674. 0x2B,0x2D,0xEB,0x5E,0x5C,0x57,0xAA,0x4B,
  675. 0x07,0x01,0x67,0xDB,0x57,0xCE,0x15,0x31,
  676. 0x2F,0x28,0xD2,0xF4,0xCF,0xA0,0x9D,0xA9,
  677. 0x2F,0x69,0x79,0xF3,0x5D,0xD6,0x06,0x45,
  678. 0x2F,0x56,0x0F,0x52,0xE7,0x5F,0x89,0xC1,
  679. 0x2F,0xA2,0x09,0x18,0xD1,0x90,0x16,0xD8,
  680. 0x27,0xCA,0x49,0x8D,0x5F,0x4B,0x56,0x0E,
  681. 0x2C,0x40,0x68,0x82,0xA4,0xC1,0x53,0x2D,
  682. 0x07,0x9D,0xDF,0x21,0x28,0x8E,0x9D,0xC2,
  683. 0x2D,0x00,0xB8,0xD3,0x08,0x72,0xC1,0xA7,
  684. 0x0F,0x54,0x6A,0x4D,0x03,0x4F,0x0E,0xBC,
  685. 0x2F,0xAD,0x3E,0x08,0xB3,0x13,0x26,0x34,
  686. 0x27,0xE4,0xB5,0x61,0xA8,0x38,0x49,0xAF,
  687. 0x24,0x41,0x92,0x62,0xFF,0x7D,0xBB,0xDE,
  688. 0x0F,0x8A,0xEF,0xC5,0x12,0x1F,0x6D,0x30,
  689. 0x27,0xE4,0xEA,0xB8,0x1B,0x7F,0xE0,0x7A,
  690. 0x25,0x60,0x5A,0x96,0x88,0xEB,0x0B,0x0C,
  691. 0x0F,0xB2,0x36,0x0E,0x7A,0x19,0x56,0xFC,
  692. 0x0F,0xF5,0x36,0x85,0x31,0xE5,0x71,0xEB,
  693. 0x27,0xF2,0xB2,0xBB,0x03,0x52,0x99,0x14,
  694. 0x2F,0xAA,0xA4,0x80,0x75,0x2F,0xB5,0x42,
  695. 0x2F,0xBC,0x73,0x62,0xE3,0x68,0xD2,0x65,
  696. 0x27,0x57,0xDD,0xF7,0x30,0xBA,0xB9,0xE1,
  697. 0x2F,0x35,0x91,0x28,0xC4,0x1C,0xC8,0xF5,
  698. 0x27,0x80,0xF9,0x9A,0xD6,0xD1,0x5D,0x28,
  699. 0x2F,0x4E,0x0E,0x7B,0xF5,0x66,0xEA,0xEA,
  700. 0x2F,0x1F,0x0B,0xC0,0x29,0x25,0x99,0x24,
  701. 0x2F,0xE9,0xA7,0xFD,0x8B,0x9E,0xC3,0x4F,
  702. 0x2F,0xBA,0x66,0x6B,0x94,0x34,0xF3,0x83,
  703. 0x2D,0x43,0x0B,0x94,0xE5,0x5D,0x28,0x9D,
  704. 0x07,0xFF,0x28,0x83,0xD1,0xCB,0xF5,0xEF,
  705. 0x07,0xB1,0xAD,0x0D,0xC4,0xAE,0x5B,0x62,
  706. 0x0F,0x65,0x80,0xD7,0x1A,0x3F,0x0C,0x50,
  707. 0x27,0xB5,0xB3,0xFF,0xB1,0x25,0x37,0x72,
  708. 0x27,0xD1,0x2C,0x45,0xDB,0x0A,0x8B,0xEA,
  709. 0x2F,0xF8,0x8C,0xB6,0x0B,0xD3,0x12,0x90,
  710. 0x2F,0xFE,0x4A,0x4A,0x36,0x27,0x8E,0x7B,
  711. 0x23,0xB1,0x6E,0x29,0x47,0x4C,0x7D,0xFC,
  712. 0x0F,0x97,0x35,0x8E,0x60,0x04,0xBE,0x20,
  713. 0x25,0x9C,0x68,0x67,0x46,0xF4,0x51,0xB3,
  714. 0x0F,0xC1,0x1B,0x62,0x65,0xF5,0x92,0xE1,
  715. 0x27,0x7F,0x76,0x18,0xAC,0x8A,0xD7,0x1F,
  716. 0x2A,0x95,0x22,0x41,0x0B,0xB0,0xE9,0xA7,
  717. 0x0F,0x49,0xC1,0x1A,0x77,0xFA,0x34,0x9F,
  718. 0x27,0xB5,0x15,0x94,0x15,0x6A,0x3D,0xD1,
  719. 0x2F,0xDB,0xD8,0xCF,0x53,0x6A,0xA3,0xAD,
  720. 0x2F,0x19,0x55,0xA2,0xFD,0x50,0x59,0xDA,
  721. 0x2F,0xA7,0x09,0x84,0xF9,0xD7,0x9A,0x0D,
  722. 0x0F,0x2D,0x40,0x48,0x9F,0xFA,0x58,0x8C,
  723. 0x2F,0x23,0xB9,0x34,0xA3,0x9E,0x4D,0x37,
  724. 0x2F,0x66,0xBF,0x21,0xC0,0xF2,0x0E,0x19,
  725. 0x2F,0xFE,0x8B,0xF9,0x5F,0x2B,0x16,0xE2,
  726. 0x27,0x7F,0x8D,0xC6,0x0F,0xEB,0xD5,0x02,
  727. 0x07,0x4A,0x1F,0xAA,0x73,0xDD,0x64,0xAA,
  728. 0x2F,0x70,0x02,0xEC,0x8A,0x7C,0xC1,0x8C,
  729. 0x2F,0x06,0xF2,0x6F,0x0D,0x35,0x19,0x85,
  730. 0x2F,0xEF,0xAF,0x58,0x1E,0x74,0xB2,0xBA,
  731. 0x2F,0xA8,0x09,0x6F,0x12,0x91,0x3F,0xB7,
  732. 0x2F,0x0F,0xD4,0x8B,0x1D,0xAF,0x3D,0x20,
  733. 0x2F,0x48,0x7E,0x2D,0x97,0x11,0x6E,0x0C,
  734. 0x2C,0x49,0xDD,0xF9,0x5B,0x0E,0xFA,0x1F,
  735. 0x0F,0x86,0x2A,0x74,0xE5,0x85,0x41,0x4A,
  736. 0x07,0xC0,0x14,0xD3,0x93,0x9A,0xB6,0x29,
  737. 0x07,0x78,0xFB,0xD0,0x76,0xF2,0xE2,0x23,
  738. 0x2F,0xC3,0x45,0x92,0xB1,0xF6,0x66,0x84,
  739. 0x0F,0x6C,0x59,0x1B,0x04,0x59,0xE1,0x67,
  740. 0x27,0xE4,0x19,0x79,0x84,0xED,0x71,0xC6,
  741. 0x2F,0xEA,0x7F,0x29,0x8E,0xB9,0x17,0xAA,
  742. 0x2F,0x9E,0xCA,0x11,0xF9,0x80,0x6B,0xC5,
  743. 0x2F,0x80,0xF0,0x11,0x72,0x39,0xC5,0x42,
  744. 0x2F,0xBE,0xDF,0xC1,0xC4,0xB6,0x06,0x5F,
  745. 0x27,0x92,0x7A,0xB5,0xBB,0x7D,0x72,0x59,
  746. 0x27,0xD9,0x2B,0x1A,0x87,0x9F,0x1C,0x52,
  747. 0x27,0x2C,0x11,0xDD,0xBA,0x95,0x25,0xB6,
  748. 0x2F,0xA7,0x71,0x5D,0x1B,0xF2,0xEE,0x8D,
  749. 0x2F,0xCB,0x4F,0x88,0x54,0xD9,0x7A,0x82,
  750. 0x2F,0x49,0x54,0x3B,0x9E,0x47,0xB0,0x74,
  751. 0x2F,0xC3,0xE6,0x26,0xD6,0x87,0x0E,0xA3,
  752. 0x2F,0xFE,0xA8,0xB0,0x05,0x49,0xF6,0x6D,
  753. 0x2F,0x04,0x92,0xB4,0x64,0xF9,0xC5,0xBE,
  754. 0x2F,0xE2,0x23,0x04,0x35,0x8E,0xA0,0x28,
  755. 0x27,0xD7,0x02,0xDC,0x6E,0x0C,0xF4,0x16,
  756. 0x2F,0x68,0xB6,0xB5,0xD6,0xD6,0xF3,0x12,
  757. 0x2F,0x69,0x80,0x9E,0x4D,0xE6,0xF8,0x7F,
  758. 0x27,0x49,0xB8,0x78,0xEF,0x0D,0x31,0x3D,
  759. 0x2F,0xC6,0xFA,0xA4,0x29,0x29,0xA9,0xD4,
  760. 0x27,0x90,0x25,0xE4,0x34,0x9E,0x68,0x52,
  761. 0x27,0xA3,0x1B,0xFB,0x20,0xDB,0x52,0x5C,
  762. 0x27,0x17,0x6F,0xA4,0x36,0x73,0x4A,0xE9,
  763. 0x27,0x18,0x90,0x87,0x89,0x30,0xB3,0x2A,
  764. 0x2F,0xAE,0xBB,0x6D,0x19,0x68,0x78,0x81,
  765. 0x2F,0x2B,0xB2,0x92,0xCE,0x69,0xCE,0xD7,
  766. 0x2F,0x7B,0x42,0x34,0x43,0x82,0x31,0x15,
  767. 0x27,0x6F,0xF3,0xD3,0xF6,0xCF,0xC3,0x18,
  768. 0x27,0xD3,0xCE,0x9C,0xA2,0xFC,0x2F,0x29,
  769. 0x27,0x74,0x9B,0x8E,0x0B,0x47,0x5B,0xFD,
  770. 0x2F,0xA8,0xE2,0x24,0x07,0xA1,0x89,0x56,
  771. 0x27,0xAE,0x66,0xF3,0xFE,0x3E,0x38,0xBD,
  772. 0x27,0xF6,0x1B,0xD5,0xE5,0x98,0xD7,0x0C,
  773. 0x27,0xBB,0x54,0xB8,0xC8,0x2D,0x12,0xC3,
  774. 0x2F,0x93,0x04,0xEF,0x0B,0x1B,0x6F,0x24,
  775. 0x2F,0x58,0xD9,0x78,0xA4,0xB1,0xB8,0x6C,
  776. 0x23,0xD2,0x4B,0x87,0x1A,0x96,0xFB,0x62,
  777. 0x27,0x50,0x4A,0xA6,0x8C,0x4F,0xEC,0x3D,
  778. 0x2F,0xA8,0xD2,0xB6,0x84,0x6F,0xBC,0x02,
  779. 0x2F,0x62,0xF1,0xB6,0x3D,0xBD,0xCB,0xC2,
  780. 0x23,0x95,0x6D,0x92,0x87,0x57,0x19,0xA1,
  781. 0x0F,0x6B,0x87,0x47,0xD5,0xEC,0x5D,0x39,
  782. 0x07,0x06,0x3F,0x05,0x60,0xC2,0x93,0x18,
  783. 0x2F,0xBD,0x49,0xC4,0xCA,0xDD,0x95,0xAA,
  784. 0x27,0x30,0x43,0x01,0x0B,0x40,0x94,0xEA,
  785. 0x23,0x74,0xAA,0x84,0x4C,0x48,0xC4,0x6A,
  786. 0x07,0x6C,0xFD,0xF5,0x94,0xEA,0xDC,0xC8,
  787. 0x07,0x4B,0x50,0x16,0xB6,0x4C,0xA0,0x57,
  788. 0x07,0xAB,0x5E,0x35,0x50,0x68,0xA4,0x20,
  789. 0x27,0xED,0x5B,0xAC,0x3B,0x81,0x81,0x2E,
  790. 0x2F,0xAB,0xE0,0x17,0x99,0xD4,0xEA,0x81,
  791. 0x27,0x7C,0xEA,0xBA,0x79,0x66,0x92,0xED,
  792. 0x2A,0xCA,0xFA,0xF1,0x4F,0x65,0xD5,0x36,
  793. 0x07,0x7C,0x5C,0xF6,0x9A,0xA0,0xE3,0xD2,
  794. 0x27,0xF2,0x12,0xDF,0xE1,0x07,0xE1,0x42,
  795. 0x2F,0xB9,0x2A,0xE2,0xFC,0xC0,0x48,0x5E,
  796. 0x27,0x89,0xB5,0x30,0x1F,0xBD,0x38,0x74,
  797. 0x23,0xF6,0xEF,0xAB,0x3C,0x42,0x6E,0x0C,
  798. 0x0F,0x0F,0x36,0x15,0x7E,0x5E,0x88,0xE4,
  799. 0x26,0x42,0x70,0xC0,0xA3,0xF6,0x8F,0x77,
  800. 0x07,0xE2,0x66,0xF4,0xA4,0xDE,0xBC,0x8F,
  801. 0x27,0x35,0x2D,0x7C,0xE3,0xB1,0xF7,0xA9,
  802. 0x27,0x4E,0xB4,0x94,0x42,0x4A,0x3C,0x88,
  803. 0x27,0xD3,0xEB,0x44,0xAD,0x39,0x1C,0x27,
  804. 0x27,0x16,0xBD,0x80,0x30,0xD6,0x4B,0xEE,
  805. 0x2F,0xEF,0x4F,0x2A,0x0B,0x3B,0xB7,0x57,
  806. 0x2B,0xE1,0xA3,0x22,0x1F,0x37,0xFB,0xAD,
  807. 0x07,0xF7,0xC2,0xB9,0x07,0xC2,0x52,0xC7,
  808. 0x2F,0x5D,0x62,0x4B,0x18,0x84,0x0B,0x41,
  809. 0x27,0x4B,0x9F,0x30,0x4A,0x1A,0xD6,0x88,
  810. 0x27,0x35,0xD0,0x96,0x19,0xE6,0xEB,0x68,
  811. 0x2F,0xFC,0xA3,0xD1,0xF0,0x92,0xB9,0xD6,
  812. 0x2F,0x0D,0x79,0xED,0x77,0x0D,0x34,0x09,
  813. 0x25,0x8C,0xD4,0xBA,0x75,0x3C,0xCD,0x42,
  814. 0x07,0x89,0x60,0x2C,0xD5,0x68,0x0E,0x2D,
  815. 0x2F,0x38,0xF9,0xAB,0x7D,0x60,0xB7,0x19,
  816. 0x2F,0x11,0x8E,0x85,0xF2,0x01,0x54,0x21,
  817. 0x2C,0x34,0xFE,0xDC,0x65,0x6B,0x9D,0xC8,
  818. 0x0F,0x55,0x3F,0xC8,0x78,0x28,0x72,0x38,
  819. 0x27,0x6B,0x0C,0x3A,0x76,0x1B,0x00,0x1E,
  820. 0x22,0x8E,0xCA,0x30,0x96,0xCC,0x23,0xFC,
  821. 0x0F,0xAF,0x51,0x4E,0x9B,0x8D,0x49,0x75,
  822. 0x0F,0x8C,0x40,0x45,0xA2,0x35,0x67,0x76,
  823. 0x07,0xD9,0x42,0x99,0x9A,0x99,0x7F,0xAA,
  824. 0x2F,0xD3,0x33,0x6A,0x60,0x5E,0x5E,0x7A,
  825. 0x2F,0xBE,0x4C,0x92,0x73,0xE5,0xD7,0x09,
  826. 0x2F,0x63,0x37,0x6A,0xE8,0x7E,0x9E,0xB6,
  827. 0x27,0xB3,0x38,0xA4,0x15,0x61,0x29,0x67,
  828. 0x2F,0xFB,0x4F,0xE9,0x6B,0xB2,0x06,0x52,
  829. 0x2F,0x5F,0xBF,0x06,0xF1,0xC2,0x72,0x01,
  830. 0x27,0x0C,0xAE,0x2A,0x2F,0x1B,0x4E,0x9D,
  831. 0x27,0x32,0xE8,0x1D,0x20,0xB8,0xB6,0x8B,
  832. 0x2F,0x7C,0x8F,0x2E,0x90,0x68,0x51,0xF4,
  833. 0x27,0xE6,0x6F,0xD0,0x03,0x8C,0xF8,0x0C,
  834. 0x27,0xCA,0x55,0xB1,0x5D,0xA7,0x21,0xEE,
  835. 0x2A,0xE6,0xB3,0xFB,0x42,0x81,0x57,0x80,
  836. 0x07,0xCE,0x04,0x8C,0xF8,0x11,0xCE,0x7F,
  837. 0x2A,0xBF,0xBC,0xEC,0xF1,0x17,0xF9,0x5F,
  838. 0x07,0xC0,0xE9,0xA4,0xFA,0x54,0x4E,0xE7,
  839. 0x07,0xA7,0x89,0x9C,0xE5,0xB4,0x6E,0x41,
  840. 0x07,0xA5,0xE3,0x09,0xB2,0x03,0x06,0xB9,
  841. 0x0F,0x31,0xC0,0x13,0x55,0x05,0x56,0x7D,
  842. 0x07,0xCB,0x9E,0x05,0x9B,0xCD,0xD0,0x84,
  843. 0x27,0x57,0xD6,0x7F,0xEA,0x4F,0xD2,0x72,
  844. 0x27,0x2E,0x62,0x4B,0xEA,0x5C,0x19,0x6F,
  845. 0x27,0x79,0xFE,0x3D,0x6C,0x03,0x2E,0x5B,
  846. 0x29,0xFF,0x98,0xAC,0x83,0xAA,0xB9,0x8F,
  847. 0x0F,0xC7,0xE8,0x13,0x1F,0x77,0x5B,0x5D,
  848. 0x07,0xB0,0xE9,0xFB,0xF2,0x5C,0xD0,0x85,
  849. 0x2D,0x6D,0x6B,0xB7,0x63,0xDE,0x20,0x88,
  850. 0x07,0xA0,0x5F,0x48,0x4C,0xE5,0x26,0xFB,
  851. 0x0F,0xAF,0x9D,0x02,0x6F,0x9C,0x11,0x21,
  852. 0x07,0x2A,0x13,0x35,0x77,0x45,0xDD,0xBC,
  853. 0x27,0x20,0xBE,0x34,0xA4,0x7A,0xA5,0x78,
  854. 0x27,0x30,0xD3,0xBE,0x03,0x69,0x9A,0x84,
  855. 0x29,0x93,0x6D,0x10,0xDF,0x9A,0x17,0x1E,
  856. 0x07,0x27,0xF8,0x66,0x9F,0x88,0xE1,0x82,
  857. 0x27,0x8F,0xCC,0xDD,0x85,0x96,0xED,0xE9,
  858. 0x07,0xAD,0xE3,0xDD,0xB1,0x6E,0xFD,0xBB,
  859. 0x07,0xDE,0xD5,0xB7,0x48,0x55,0xC4,0xE8,
  860. 0x07,0x24,0x2F,0x2F,0x85,0xA0,0xCF,0x28,
  861. 0x0F,0x75,0xAB,0x4D,0x1E,0x50,0xCC,0xBE,
  862. 0x2F,0x96,0x5E,0x53,0x35,0x42,0x15,0x9C,
  863. 0x2F,0x74,0x74,0xA7,0x29,0xC2,0x25,0x1B,
  864. 0x2F,0x64,0x9D,0x9E,0x56,0xE5,0x35,0x88,
  865. 0x29,0x4A,0xFF,0x29,0x51,0x4B,0xFF,0xB7,
  866. 0x07,0xF8,0x72,0x70,0xA6,0x92,0x82,0xAD,
  867. 0x2F,0x11,0xC5,0xAB,0x85,0x23,0xB1,0x45,
  868. 0x2A,0xFD,0x52,0x7B,0x12,0x48,0x03,0x30,
  869. 0x07,0x0B,0x14,0xE3,0x0F,0x74,0xFF,0x3F,
  870. 0x2F,0x3F,0x85,0xC6,0x70,0x65,0x11,0xBE,
  871. 0x27,0x43,0x01,0x1F,0x5D,0x56,0x64,0x97,
  872. 0x2F,0x01,0x18,0xBC,0xB8,0xB1,0x6F,0x34,
  873. 0x2F,0xF8,0x02,0x12,0x1C,0xBE,0xC4,0x7D,
  874. 0x2F,0xD5,0xB5,0x84,0xD6,0xCC,0xAB,0xAF,
  875. 0x27,0x4F,0xD5,0x8D,0xD5,0x19,0x41,0x90,
  876. 0x27,0x5D,0x87,0x96,0x1A,0x4F,0x8D,0x2E,
  877. 0x27,0x67,0x9B,0x8C,0xDE,0x44,0xB5,0x91,
  878. 0x2F,0x7E,0x71,0x8E,0xDB,0x1F,0x10,0x07,
  879. 0x27,0xDD,0x0F,0x1A,0xCF,0xEF,0xC4,0x6D,
  880. 0x27,0x74,0x95,0xE3,0x67,0x21,0x85,0x33,
  881. 0x23,0xE1,0x75,0x28,0x76,0x93,0x24,0xB3,
  882. 0x07,0x28,0x8C,0x75,0x2C,0xFE,0xE2,0x54,
  883. 0x2F,0x57,0x93,0x25,0x79,0x3E,0xDA,0x7C,
  884. 0x2F,0xA0,0x18,0x9A,0x23,0x56,0xCE,0xBE,
  885. 0x27,0xA3,0x6F,0x04,0xDE,0x7E,0x34,0x30,
  886. 0x2A,0xE0,0x2B,0xD9,0x6E,0x35,0x77,0x52,
  887. 0x07,0xA5,0x10,0x13,0x9A,0xB8,0xA7,0x88,
  888. 0x0F,0xE0,0x4B,0x0E,0x0D,0xDD,0xD6,0x17,
  889. 0x07,0xF0,0x19,0xA3,0x95,0xB1,0xEF,0xB3,
  890. 0x26,0x66,0x1F,0x90,0xDE,0x93,0x57,0x31,
  891. 0x07,0xED,0xB3,0x9E,0x9B,0x3B,0x16,0xE4,
  892. 0x0F,0x03,0xA0,0xF6,0xAD,0x88,0xC9,0x3E,
  893. 0x07,0x40,0x77,0x27,0xF9,0x6F,0x97,0x7A,
  894. 0x27,0xA5,0x41,0x55,0x02,0xB5,0xEC,0xF9,
  895. 0x2F,0x55,0x5B,0x2C,0x21,0x09,0xAB,0x2F,
  896. 0x21,0x19,0xFA,0x6F,0x14,0xDA,0x5F,0x93,
  897. 0x0F,0xF9,0x98,0xD2,0xB4,0x59,0x92,0x4E,
  898. 0x0F,0xC7,0xEE,0x3C,0xB8,0x87,0x5F,0x62,
  899. 0x0F,0xC1,0xB7,0x52,0x47,0x09,0xA7,0x3B,
  900. 0x22,0xEB,0x14,0xFF,0xC9,0x73,0xF8,0xFB,
  901. 0x0F,0xFF,0x49,0x36,0xD0,0xB0,0xF2,0x47,
  902. 0x27,0xD8,0x16,0x31,0x29,0xEB,0x2B,0xE9,
  903. 0x27,0x4F,0x4A,0xD6,0xBA,0xE3,0x43,0xF5,
  904. 0x2F,0x46,0x59,0xD7,0xB4,0x53,0x75,0xF5,
  905. 0x2F,0xE3,0xA5,0x2A,0xE7,0xB0,0x71,0xA3,
  906. 0x24,0xB5,0xD1,0x58,0xAD,0x4A,0x62,0xE5,
  907. 0x07,0x13,0x13,0xAB,0xA8,0x86,0xC6,0x90,
  908. 0x27,0xBF,0x58,0x28,0x7B,0xD1,0x38,0xA9,
  909. 0x27,0xED,0x59,0xD7,0xEF,0xEC,0x8B,0xCF,
  910. 0x27,0x39,0x83,0xFD,0x93,0x3F,0x9B,0x5B,
  911. 0x07,0x79,0xF2,0x32,0xA5,0x7F,0x28,0x19,
  912. 0x27,0x69,0xA0,0x9C,0xBF,0x47,0xB2,0x54,
  913. 0x2F,0x49,0xE7,0x9F,0x00,0x05,0xB6,0x60,
  914. 0x27,0x62,0x87,0x56,0xD9,0x92,0x7E,0x6A,
  915. 0x0F,0xAA,0x83,0x0E,0xDE,0xEB,0xCB,0x2B,
  916. 0x27,0x5F,0x65,0xE5,0x1C,0x0B,0x4F,0x60,
  917. 0x27,0x42,0x1C,0xD6,0xA9,0xD8,0x1F,0x83,
  918. 0x27,0xAD,0x1C,0xA4,0x08,0xDA,0xF7,0x45,
  919. 0x27,0xB5,0xDA,0x41,0xD2,0xEC,0x1E,0xB9,
  920. 0x2D,0xFE,0x1B,0xF7,0x54,0x24,0x05,0x72,
  921. 0x0F,0x4A,0x32,0x93,0x7A,0x05,0xD4,0xB8,
  922. 0x2F,0x44,0x19,0x76,0x44,0x1A,0x2E,0xA8,
  923. 0x2F,0xF1,0xBC,0x52,0xB0,0xA1,0x63,0x45,
  924. 0x27,0x10,0x80,0x5E,0xEC,0x1C,0xEC,0x39,
  925. 0x27,0x74,0xDA,0xB0,0xF2,0xA8,0x48,0x7E,
  926. 0x07,0xE1,0x7B,0x27,0x02,0x3B,0x8E,0x66,
  927. 0x2F,0xBE,0x4E,0x77,0xA2,0xA5,0xB7,0x25,
  928. 0x2F,0x89,0x8A,0x2B,0xF2,0xEB,0x55,0x46,
  929. 0x0F,0xBF,0x37,0x7F,0x1D,0x34,0xC2,0x15,
  930. 0x0F,0xF1,0x6A,0x4C,0x8E,0xA3,0xA8,0xC0,
  931. 0x2F,0x02,0xA7,0xF3,0x1A,0xDC,0x4A,0xAE,
  932. 0x2A,0xF9,0xD5,0x9A,0x82,0xDE,0x2F,0xCA,
  933. 0x0F,0xE1,0x27,0xA4,0x52,0xC7,0xA0,0xCB,
  934. 0x0F,0xBC,0x1D,0x57,0xB3,0xCE,0x81,0x3B,
  935. 0x0F,0x36,0xA2,0xD8,0x9F,0x4E,0x7B,0xE0,
  936. 0x2F,0xE4,0x86,0x1F,0x6A,0x20,0x36,0xCD,
  937. 0x2F,0x35,0x0A,0x06,0x2F,0x73,0x58,0xE4,
  938. 0x27,0xDF,0x7E,0x81,0xCE,0xE1,0xBA,0x8B,
  939. 0x2F,0x04,0x14,0x90,0x53,0x9E,0x6D,0x1E,
  940. 0x27,0x39,0x72,0x48,0x62,0xC9,0xAA,0x8D,
  941. 0x27,0x2A,0xCF,0x59,0x70,0x59,0xA2,0xE5,
  942. 0x27,0xB6,0x3B,0xA1,0xBD,0x15,0x37,0x9A,
  943. 0x25,0xB8,0x4B,0x9B,0x0F,0xD7,0x33,0xC8,
  944. 0x07,0xAB,0x28,0xF1,0x00,0x98,0x08,0x36,
  945. 0x27,0x9F,0xF2,0x49,0xB6,0x49,0xD8,0xCA,
  946. 0x2F,0x7B,0x21,0x46,0x58,0x7C,0xBD,0x83,
  947. 0x2F,0x46,0x97,0x0A,0x61,0xFB,0x63,0x86,
  948. 0x27,0xDF,0xF2,0x51,0xD8,0xB7,0x6F,0xA3,
  949. 0x25,0x32,0x80,0xA2,0xF3,0xAC,0xE2,0x60,
  950. 0x07,0xB8,0x4B,0xDC,0x57,0x66,0xEF,0x3F,
  951. 0x2F,0xCA,0x65,0x7D,0x6A,0x1B,0x04,0xC5,
  952. 0x2F,0xFE,0x27,0x20,0x6E,0xE5,0x95,0x92,
  953. 0x27,0xE3,0xC7,0x8C,0x63,0x06,0x8E,0x01,
  954. 0x27,0x6C,0x1C,0xD6,0x06,0x81,0x28,0x0F,
  955. 0x27,0xBB,0x25,0x41,0x38,0xE0,0x97,0xD7,
  956. 0x2F,0xB3,0x83,0x9F,0x9F,0x0D,0x69,0x51,
  957. 0x27,0xFF,0xDE,0x80,0x2E,0x47,0xA1,0x13,
  958. 0x2F,0x65,0xE3,0x72,0x04,0xCD,0x33,0x17,
  959. 0x27,0xF7,0xF9,0xDE,0xD4,0x3A,0x7F,0xE0,
  960. 0x2B,0x18,0x51,0x43,0xBA,0xE9,0x4E,0x1F,
  961. 0x07,0xFF,0x18,0x8A,0x00,0x63,0xD1,0x99,
  962. 0x27,0x05,0x03,0xF6,0xEC,0x09,0x1B,0xFE,
  963. 0x2F,0xD4,0x9B,0xDE,0x7B,0x0D,0xD5,0x88,
  964. 0x2F,0x89,0x11,0xE9,0x46,0xD3,0xB7,0x3F,
  965. 0x2F,0xD4,0x9C,0xD5,0x49,0xD9,0xB6,0x70,
  966. 0x27,0x61,0xD6,0xD0,0xC1,0x5D,0x46,0x71,
  967. 0x2F,0x51,0x5C,0x0A,0x3F,0x61,0xE5,0xA8,
  968. 0x2F,0xDC,0x3A,0x16,0xD3,0x59,0x32,0x05,
  969. 0x2F,0x81,0x19,0xDF,0x8A,0xE8,0x30,0xF9,
  970. 0x2F,0xF7,0x7D,0xF3,0x80,0x5C,0x8A,0xE4,
  971. 0x2C,0xE5,0x2D,0xA8,0x8F,0x2B,0x69,0x7D,
  972. 0x0F,0xF8,0xB2,0x04,0xE9,0xEB,0x48,0xBA,
  973. 0x07,0x9D,0x7F,0x8A,0xB8,0x52,0x7F,0x89,
  974. 0x0F,0x49,0x7A,0xC8,0x79,0x8E,0x96,0xF3,
  975. 0x07,0x5E,0xA1,0x1B,0x9B,0xD8,0xC0,0x89,
  976. 0x07,0xC6,0xF9,0xDD,0x37,0x22,0x07,0x6C,
  977. 0x0F,0xC5,0x98,0xD7,0xC4,0xDB,0xC7,0x76,
  978. 0x2F,0x5C,0x6C,0xDA,0xF1,0x34,0x2C,0xFD,
  979. 0x2F,0x7B,0x08,0xAD,0x4C,0x78,0x4A,0x93,
  980. 0x2F,0x0F,0xAF,0xA8,0x76,0x18,0x29,0x95,
  981. 0x2F,0x02,0x95,0x92,0x58,0x73,0x67,0xF6,
  982. 0x23,0x47,0xC6,0xBA,0x18,0xE6,0x6D,0xFF,
  983. 0x0F,0x30,0xDF,0xDE,0x45,0xD1,0x3C,0xC0,
  984. 0x2F,0xD9,0x44,0x67,0x9D,0x81,0x0D,0x04,
  985. 0x27,0x70,0xE9,0x92,0x18,0xEB,0xDE,0x02,
  986. 0x2F,0x27,0x37,0xDA,0xFC,0x47,0xD9,0x74,
  987. 0x2F,0x40,0xC7,0x60,0xDC,0xEA,0x82,0x6B,
  988. 0x27,0x3B,0x4B,0x9F,0x96,0x78,0x9F,0x5E,
  989. 0x0F,0x85,0x83,0x4C,0x67,0x74,0xED,0xAB,
  990. 0x2F,0x05,0x65,0x93,0xA5,0xFE,0xD7,0xA8,
  991. 0x2F,0x92,0x53,0x79,0xEC,0x58,0x30,0x0D,
  992. 0x27,0x47,0x00,0xFD,0xED,0x35,0x63,0xD6,
  993. 0x2F,0xB6,0xA6,0x13,0x5C,0x37,0x6E,0x09,
  994. 0x22,0xA9,0xA9,0xA4,0x1F,0xB9,0x24,0x84,
  995. 0x07,0x0F,0xBD,0x1B,0x4D,0x87,0x43,0x98,
  996. 0x07,0x08,0x25,0xA7,0x57,0x3C,0xEE,0x24,
  997. 0x07,0xFA,0x7A,0xC4,0x29,0x63,0x78,0xDD,
  998. 0x2F,0x4B,0xBE,0x8A,0x7F,0xE2,0xA3,0x02,
  999. 0x2F,0x54,0xBB,0xB3,0x76,0x35,0x53,0x5F,
  1000. 0x27,0xF4,0x6A,0xA1,0xC3,0xA3,0x24,0x4A,
  1001. 0x2D,0x4B,0x3E,0x00,0x9A,0xCF,0x2D,0xC3,
  1002. 0x07,0x53,0x79,0x88,0xC8,0x24,0xC6,0x75,
  1003. 0x2F,0xB1,0x28,0xE9,0x5D,0x24,0xF5,0xB5,
  1004. 0x2D,0x46,0x06,0x1C,0xE0,0xCE,0x1A,0x30,
  1005. 0x07,0xD5,0x9C,0xA6,0x12,0x48,0x9C,0xAF,
  1006. 0x27,0xDD,0xC8,0x9A,0x39,0x35,0xFE,0xEB,
  1007. 0x0F,0x40,0x5F,0x61,0x80,0xB4,0xC4,0xC8,
  1008. 0x2D,0xCA,0x29,0xC3,0x3D,0x1B,0x92,0xAC,
  1009. 0x0F,0x5E,0xDE,0x5F,0x50,0xDF,0x20,0xC4,
  1010. 0x22,0xC5,0x70,0x47,0x92,0x52,0x2D,0xCF,
  1011. 0x07,0xC4,0x25,0xFC,0x56,0x21,0xB6,0x19,
  1012. 0x27,0x12,0x0B,0xBF,0xCD,0xE1,0x32,0x5A,
  1013. 0x2F,0x21,0xDB,0x60,0xA9,0x0B,0x25,0x4D,
  1014. 0x2F,0x09,0x09,0xD6,0x4C,0xE4,0x32,0x93,
  1015. 0x22,0xF3,0x0C,0x54,0xC8,0xA4,0x07,0x62,
  1016. 0x0F,0xD9,0xFE,0x8D,0x77,0x7A,0x91,0x0D,
  1017. 0x07,0xD1,0x9F,0x68,0xBD,0x6C,0x2A,0x49,
  1018. 0x0F,0xF5,0xDC,0xA8,0xEF,0x89,0xA5,0xFD,
  1019. 0x2F,0x02,0x87,0xBA,0xEC,0xEE,0x98,0x49,
  1020. 0x27,0xFD,0x99,0x70,0x67,0x0D,0x71,0xBB,
  1021. 0x27,0x79,0xC5,0x5C,0xB3,0x0F,0xEE,0x85,
  1022. 0x2F,0x8F,0x66,0xBA,0xCF,0x10,0x43,0x16,
  1023. 0x07,0x58,0xC7,0x8A,0xE4,0x9E,0xF0,0xEA,
  1024. 0x0F,0xE9,0xB3,0x4D,0x6B,0xA9,0x05,0x8E,
  1025. 0x07,0xF4,0x44,0xDE,0x33,0x49,0xB4,0x19,
  1026. 0x2F,0x36,0x28,0x4C,0x36,0x9A,0x63,0xAC,
  1027. 0x27,0xC9,0xCB,0x52,0xF7,0x4B,0xC2,0x7E,
  1028. 0x2F,0xDC,0xA6,0xA9,0x69,0xC7,0x14,0x4C,
  1029. 0x2F,0x91,0x94,0x3E,0x63,0x62,0x19,0x7D,
  1030. 0x22,0x27,0x6A,0xA9,0xE0,0x43,0x06,0xEF,
  1031. 0x0F,0xB8,0x20,0x0E,0x46,0xA9,0x9E,0x03,
  1032. 0x27,0x15,0x9A,0xE2,0xE7,0x05,0x02,0x92,
  1033. 0x2B,0xAD,0xBC,0xC7,0x21,0xA2,0xB1,0x1A,
  1034. 0x0F,0x0F,0x67,0x26,0xA4,0x29,0x94,0x6F,
  1035. 0x07,0x96,0x61,0x91,0xB0,0xC5,0x13,0x53,
  1036. 0x27,0x5D,0x6F,0xBD,0x1E,0x20,0x5A,0x9A,
  1037. 0x2F,0x1B,0x34,0x01,0x4F,0x34,0x79,0xF9,
  1038. 0x27,0xA2,0xD9,0x4B,0x7F,0x1C,0x76,0x8F,
  1039. 0x07,0x9E,0x80,0xA3,0xD7,0xB4,0x92,0x38,
  1040. 0x27,0x04,0x9F,0x43,0x0E,0x96,0x3B,0xA8,
  1041. 0x21,0xD2,0x10,0xB8,0xB7,0xB8,0xA2,0xB3,
  1042. 0x0F,0x9F,0xB7,0x20,0x5A,0xA4,0xD2,0xC7,
  1043. 0x27,0x60,0xC7,0x51,0xF0,0x02,0xF5,0x51,
  1044. 0x2F,0x7A,0xCA,0x4A,0x23,0x28,0x20,0x05,
  1045. 0x2F,0xEF,0xF9,0xEB,0x73,0xE9,0xBF,0xE4,
  1046. 0x2F,0xFB,0x32,0x96,0x22,0x7F,0x95,0xA5,
  1047. 0x27,0x87,0xA4,0xFD,0xB3,0x81,0xD0,0x0D,
  1048. 0x27,0x8B,0x43,0xFF,0x86,0x45,0xFB,0x0E,
  1049. 0x27,0xCC,0x20,0x58,0x5F,0x9E,0x62,0x68,
  1050. 0x07,0xA0,0x86,0x22,0xE4,0xA1,0x66,0x12,
  1051. 0x0F,0xA3,0x83,0x11,0xE5,0xB5,0x2B,0xF9,
  1052. 0x07,0x52,0xE0,0x05,0xB9,0x53,0x59,0xE9,
  1053. 0x0F,0x2B,0xB9,0xEB,0xF6,0x58,0x48,0x1C,
  1054. 0x07,0xFC,0xC4,0x1B,0x6A,0xAA,0x67,0xF4,
  1055. 0x27,0x15,0x3A,0x5A,0x14,0x85,0x7F,0x8C,
  1056. 0x27,0xAC,0x6F,0x6C,0x93,0xF9,0x6D,0x38,
  1057. 0x2F,0x4B,0x1B,0x3E,0xFD,0xB1,0xD9,0xDE,
  1058. 0x27,0xD2,0xF2,0x29,0x26,0xF5,0x9D,0x03,
  1059. 0x21,0xBF,0x7A,0x6D,0x11,0x18,0x33,0xDE,
  1060. 0x07,0x0E,0xFF,0xC4,0x3F,0x3C,0xC7,0x38,
  1061. 0x24,0x9A,0x21,0x3D,0x57,0xDF,0x9D,0x0F,
  1062. 0x07,0x1B,0x84,0x11,0xF3,0x40,0xFE,0x87,
  1063. 0x27,0xBA,0x16,0xB3,0x29,0xD4,0x2B,0x17,
  1064. 0x27,0x6B,0x56,0xD3,0xF3,0x7E,0x32,0xAA,
  1065. 0x29,0x0F,0xF8,0x66,0x49,0x95,0x8C,0x52,
  1066. 0x0F,0xBD,0x20,0xD7,0x9A,0xB2,0xA1,0xFF,
  1067. 0x27,0xB0,0xF4,0x67,0x9B,0xF0,0x83,0x36,
  1068. 0x0F,0x8E,0xF1,0xCD,0x74,0x7A,0xC2,0x39,
  1069. 0x07,0xEB,0xF3,0x19,0x69,0xBD,0x71,0x95,
  1070. 0x0F,0xCF,0x9D,0x63,0x39,0xDD,0x17,0x12,
  1071. 0x0F,0x1B,0x61,0xFE,0x37,0x89,0x7E,0x5B,
  1072. 0x2F,0xC5,0xCC,0xDE,0x46,0x37,0x2A,0x79,
  1073. 0x2F,0xA9,0x41,0x5B,0x53,0xFB,0xCA,0x55,
  1074. 0x27,0x96,0xE5,0x7B,0xD0,0xBF,0x00,0x94,
  1075. 0x27,0xED,0x5F,0x8E,0xA6,0x27,0xB0,0xD9,
  1076. 0x24,0x30,0xDC,0x16,0xA9,0x5F,0xC5,0x59,
  1077. 0x0F,0x87,0xD4,0x24,0xB6,0xE3,0xC5,0x07,
  1078. 0x27,0x9E,0x67,0x9C,0x76,0x89,0xEE,0x64,
  1079. 0x21,0x74,0x30,0xED,0x63,0xC8,0x1C,0x17,
  1080. 0x07,0x56,0x7E,0x64,0x41,0x3E,0x92,0xC2,
  1081. 0x0F,0xDA,0xDF,0xB9,0x75,0x0F,0x63,0xD9,
  1082. 0x0F,0x25,0xA5,0xB5,0x01,0x3A,0x26,0xDA,
  1083. 0x05,0x1B,0x0A,0x1D,0x20,0xF2,0x38,0x9E,
  1084. 0x23,0x6A,0x71,0xE4,0xA2,0x7D,0x2B,0x71,
  1085. 0x0F,0x7D,0x3C,0x42,0x97,0x87,0xE8,0xBA,
  1086. 0x05,0x08,0x40,0xF8,0x74,0x55,0x88,0xB9
  1087. };
  1088. #endif //SI2176_B2A
  1089. #define NB_LINES (sizeof(firmwaretable)/(8*sizeof(unsigned char)))
  1090. //static unsigned char dlif_vidfilt_table[] = {0};
  1091. #define DLIF_VIDFILT_LINES (sizeof(dlif_vidfilt_table)/(8*sizeof(unsigned char)))
  1092. static si2176_common_reply_struct reply;
  1093. /************************************************************************************************************************
  1094. NAME: si2176_readcommandbytes function
  1095. DESCRIPTION:Read inbbytes from the i2c device into pucdatabuffer, return number of bytes read
  1096. Parameter: iI2CIndex, the index of the first byte to read.
  1097. Parameter: inbbytes, the number of bytes to read.
  1098. Parameter: *pucdatabuffer, a pointer to a buffer used to store the bytes
  1099. Porting: Replace with embedded system I2C read function
  1100. Returns: Actual number of bytes read.
  1101. ************************************************************************************************************************/
  1102. static int si2176_readcommandbytes(struct i2c_client *si2176, int inbbytes, unsigned char *pucdatabuffer)
  1103. {
  1104. int i2c_flag = 0;
  1105. int i = 0;
  1106. unsigned int i2c_try_cnt = I2C_TRY_MAX_CNT;
  1107. struct i2c_msg msg[] = {
  1108. {
  1109. .addr = si2176->addr,
  1110. .flags = I2C_M_RD,
  1111. .len = inbbytes,
  1112. .buf = pucdatabuffer,
  1113. },
  1114. };
  1115. repeat:
  1116. i2c_flag = i2c_transfer(si2176->adapter, msg, 1);
  1117. if (i2c_flag < 0) {
  1118. pr_err("%s: error in read sli2176, %d byte(s) should be read,. \n", __func__, inbbytes);
  1119. if (i++ < i2c_try_cnt) {
  1120. pr_err("%s: error in read sli2176, try again!!!\n", __func__);
  1121. goto repeat;
  1122. }
  1123. else
  1124. return -EIO;
  1125. }
  1126. else {
  1127. //pr_info("%s: read %d bytes\n", __func__, inbbytes);
  1128. return inbbytes;
  1129. }
  1130. }
  1131. /************************************************************************************************************************
  1132. NAME: si2176_writecommandbytes
  1133. DESCRIPTION: Write inbbytes from pucdatabuffer to the i2c device, return number of bytes written
  1134. Porting: Replace with inbbytes system I2C write function
  1135. Returns: Number of bytes written
  1136. ************************************************************************************************************************/
  1137. static int si2176_writecommandbytes(struct i2c_client *si2176, int inbbytes, unsigned char *pucdatabuffer)
  1138. {
  1139. int i2c_flag = 0;
  1140. int i = 0;
  1141. unsigned int i2c_try_cnt = I2C_TRY_MAX_CNT;
  1142. struct i2c_msg msg[] = {
  1143. {
  1144. .addr = si2176->addr,
  1145. .flags = 0, //|I2C_M_TEN,
  1146. .len = inbbytes,
  1147. .buf = pucdatabuffer,
  1148. }
  1149. };
  1150. repeat:
  1151. i2c_flag = i2c_transfer(si2176->adapter, msg, 1);
  1152. if (i2c_flag < 0) {
  1153. pr_err("%s: error in write sli2176, %d byte(s) should be read,. \n", __func__, inbbytes);
  1154. if (i++ < i2c_try_cnt) {
  1155. pr_err("%s: error in wirte sli2176, try again!!!\n", __func__);
  1156. goto repeat;
  1157. }
  1158. else
  1159. return -EIO;
  1160. }
  1161. else {
  1162. //pr_info("%s: write %d bytes\n", __func__, inbbytes);
  1163. return inbbytes;
  1164. }
  1165. }
  1166. /***********************************************************************************************************************
  1167. sli2176_pollforcts function
  1168. Use: CTS checking function
  1169. Used to check the CTS bit until it is set before sending the next command
  1170. Comments: The status byte definition being identical for all commands,
  1171. using this function to fill the status structure hels reducing the code size
  1172. Comments: waitForCTS = 1 => I2C polling
  1173. waitForCTS = 2 => INTB followed by a read (reading a HW byte using the cypress chip)
  1174. max timeout = 100 ms
  1175. Porting: If reading INTB is not possible, the waitForCTS = 2 case can be removed
  1176. Parameter: waitForCTS a flag indicating if waiting for CTS is required
  1177. Returns: 1 if the CTS bit is set, 0 otherwise
  1178. ***********************************************************************************************************************/
  1179. static unsigned char si2176_pollforcts(struct i2c_client *si2176)
  1180. {
  1181. unsigned char error_code = 0;
  1182. unsigned char loop_count = 0;
  1183. unsigned char rspbytebuffer[1];
  1184. for (loop_count=0; loop_count<50; loop_count++) { /* wait a maximum of 50*25ms = 1.25s */
  1185. if (si2176_readcommandbytes(si2176, 1, rspbytebuffer) != 1)
  1186. error_code = ERROR_SI2176_POLLING_CTS;
  1187. else
  1188. error_code = NO_SI2176_ERROR;
  1189. if (error_code || (rspbytebuffer[0] & 0x80))
  1190. goto exit;
  1191. mdelay(2); /* CTS not set, wait 2ms and retry */
  1192. }
  1193. error_code = ERROR_SI2176_CTS_TIMEOUT;
  1194. exit:
  1195. if (error_code)
  1196. pr_info("%s: poll cts function error:%d!!!...............\n", __func__, error_code);
  1197. return error_code;
  1198. }
  1199. /***********************************************************************************************************************
  1200. SI2176_CurrentResponseStatus function
  1201. Use: status checking function
  1202. Used to fill the SI2176_COMMON_REPLY_struct members with the ptDataBuffer byte's bits
  1203. Comments: The status byte definition being identical for all commands,
  1204. using this function to fill the status structure hels reducing the code size
  1205. Parameter: *ret the SI2176_COMMON_REPLY_struct
  1206. Parameter: ptDataBuffer a single byte received when reading a command's response (the first byte)
  1207. Returns: 0 if the err bit (bit 6) is unset, 1 otherwise
  1208. ***********************************************************************************************************************/
  1209. static unsigned char si2176_currentresponsestatus(si2176_common_reply_struct *common_reply, unsigned char ptdatabuffer)
  1210. {
  1211. /* _status_code_insertion_start */
  1212. common_reply->tunint = ((ptdatabuffer >> 0 ) & 0x01);
  1213. common_reply->atvint = ((ptdatabuffer >> 1 ) & 0x01);
  1214. common_reply->dtvint = ((ptdatabuffer >> 2 ) & 0x01);
  1215. common_reply->err = ((ptdatabuffer >> 6 ) & 0x01);
  1216. common_reply->cts = ((ptdatabuffer >> 7 ) & 0x01);
  1217. /* _status_code_insertion_point */
  1218. return (common_reply->err ? ERROR_SI2176_ERR : NO_SI2176_ERROR);
  1219. }
  1220. /***********************************************************************************************************************
  1221. si2176_pollforresponse function
  1222. Use: command response retrieval function
  1223. Used to retrieve the command response in the provided buffer,
  1224. poll for response either by I2C polling or wait for INTB
  1225. Comments: The status byte definition being identical for all commands,
  1226. using this function to fill the status structure hels reducing the code size
  1227. Comments: waitForCTS = 1 => I2C polling
  1228. waitForCTS = 2 => INTB followed by a read (reading a HW byte using the cypress chip)
  1229. max timeout = 100 ms
  1230. Porting: If reading INTB is not possible, the waitForCTS = 2 case can be removed
  1231. Parameter: waitforresponse a flag indicating if waiting for the response is required
  1232. Parameter: nbbytes the number of response bytes to read
  1233. Parameter: pbytebuffer a buffer into which bytes will be stored
  1234. Returns: 0 if no error, an error code otherwise
  1235. ***********************************************************************************************************************/
  1236. static unsigned char si2176_pollforresponse(struct i2c_client *si2176, unsigned char waitforresponse, unsigned int nbbytes, unsigned char *pbytebuffer, si2176_common_reply_struct *common_reply)
  1237. {
  1238. unsigned char error_code;
  1239. unsigned char loop_count;
  1240. for (loop_count=0; loop_count<50; loop_count++) { /* wait a maximum of 50*2ms = 100ms */
  1241. switch (waitforresponse) { /* type of response polling? */
  1242. case 0 : /* no polling? valid option, but shouldn't have been called */
  1243. error_code = NO_SI2176_ERROR; /* return no error */
  1244. goto exit;
  1245. case 1 : /* I2C polling status? */
  1246. if (si2176_readcommandbytes(si2176, nbbytes, pbytebuffer) != nbbytes)
  1247. error_code = ERROR_SI2176_POLLING_RESPONSE;
  1248. else
  1249. error_code = NO_SI2176_ERROR;
  1250. if (error_code)
  1251. goto exit; /* if error, exit with error code */
  1252. if (pbytebuffer[0] & 0x80) /* CTS set? */
  1253. {
  1254. error_code = si2176_currentresponsestatus(common_reply, pbytebuffer[0]);
  1255. goto exit; /* exit whether ERR set or not */
  1256. }
  1257. break;
  1258. default :
  1259. error_code = ERROR_SI2176_PARAMETER_OUT_OF_RANGE; /* support debug of invalid CTS poll parameter */
  1260. goto exit;
  1261. }
  1262. mdelay(2); /* CTS not set, wait 2ms and retry */
  1263. }
  1264. error_code = ERROR_SI2176_CTS_TIMEOUT;
  1265. exit:
  1266. return error_code;
  1267. }
  1268. /************************************************************************************************************************
  1269. NAME: CheckStatus
  1270. DESCRIPTION: Read Si2170 STATUS byte and return decoded status
  1271. Parameter: Si2170 Context (I2C address)
  1272. Parameter: Status byte (TUNINT, ATVINT, DTVINT, ERR, CTS, CHLINT, and CHL flags).
  1273. Returns: Si2170/I2C transaction error code
  1274. ************************************************************************************************************************/
  1275. #if 0
  1276. static int si2176_check_status(struct i2c_client *si2176, si2176_common_reply_struct *common_reply)
  1277. {
  1278. unsigned char buffer[1];
  1279. /* read STATUS byte */
  1280. if (si2176_pollforresponse(si2176, 1, 1, buffer, common_reply) != 0)
  1281. {
  1282. return ERROR_SI2176_POLLING_RESPONSE;
  1283. }
  1284. return 0;
  1285. }
  1286. #endif
  1287. /***********************************************************************************************************************
  1288. NAME: Si2170_L1_API_Patch
  1289. DESCRIPTION: Patch information function
  1290. Used to send a number of bytes to the Si2170. Useful to download the firmware.
  1291. Parameter: *api a pointer to the api context to initialize
  1292. Parameter: waitForCTS flag for CTS checking prior to sending a Si2170 API Command
  1293. Parameter: waitForResponse flag for CTS checking and Response readback after sending Si2170 API Command
  1294. Parameter: number of bytes to transmit
  1295. Parameter: Databuffer containing the bytes to transfer in an unsigned char array.
  1296. Returns: 0 if no error, else a nonzero int representing an error
  1297. ***********************************************************************************************************************/
  1298. static unsigned char si2176_api_patch(struct i2c_client *si2176, int inbbytes, unsigned char *pucdatabuffer, si2176_common_reply_struct *common_reply)
  1299. {
  1300. unsigned char res = 0;
  1301. unsigned char error_code = 0;
  1302. unsigned char rspbytebuffer[1];
  1303. res = si2176_pollforcts(si2176);
  1304. if (res != NO_SI2176_ERROR)
  1305. {
  1306. pr_info("%s: poll cts error:%d!!!!\n", __func__, res);
  1307. return res;
  1308. }
  1309. res = si2176_writecommandbytes(si2176, inbbytes, pucdatabuffer);
  1310. if (res!=inbbytes)
  1311. {
  1312. pr_info("%s: poll cts error:%d!!!!\n", __func__, ERROR_SI2176_SENDING_COMMAND);
  1313. return ERROR_SI2176_SENDING_COMMAND;
  1314. }
  1315. error_code = si2176_pollforresponse(si2176, 1, 1, rspbytebuffer, common_reply);
  1316. if (error_code)
  1317. pr_info("%s: poll response error:%d!!!!\n", __func__, error_code);
  1318. return error_code;
  1319. }
  1320. /* _commands_insertion_start */
  1321. #ifdef SI2176_AGC_OVERRIDE_CMD
  1322. /*---------------------------------------------------*/
  1323. /* SI2176_AGC_OVERRIDE COMMAND */
  1324. /*---------------------------------------------------*/
  1325. static unsigned char si2176_agc_override(struct i2c_client *si2176,
  1326. unsigned char force_max_gain,
  1327. unsigned char force_top_gain,
  1328. si2176_cmdreplyobj_t *rsp)
  1329. {
  1330. unsigned char error_code = 0;
  1331. unsigned char cmdbytebuffer[2];
  1332. unsigned char rspbytebuffer[1];
  1333. #ifdef DEBUG_RANGE_CHECK
  1334. if ( (force_max_gain > SI2176_AGC_OVERRIDE_CMD_FORCE_MAX_GAIN_MAX)
  1335. || (force_top_gain > SI2176_AGC_OVERRIDE_CMD_FORCE_TOP_GAIN_MAX) )
  1336. return ERROR_SI2176_PARAMETER_OUT_OF_RANGE;
  1337. #endif /* DEBUG_RANGE_CHECK */
  1338. error_code = si2176_pollforcts(si2176);
  1339. if (error_code)
  1340. {
  1341. pr_info("%s: poll cts error:%d!!!!\n", __func__, error_code);
  1342. goto exit;
  1343. }
  1344. cmdbytebuffer[0] = SI2176_AGC_OVERRIDE_CMD;
  1345. cmdbytebuffer[1] = (unsigned char) ( ( force_max_gain & SI2176_AGC_OVERRIDE_CMD_FORCE_MAX_GAIN_MASK ) << SI2176_AGC_OVERRIDE_CMD_FORCE_MAX_GAIN_LSB|
  1346. ( force_top_gain & SI2176_AGC_OVERRIDE_CMD_FORCE_TOP_GAIN_MASK ) << SI2176_AGC_OVERRIDE_CMD_FORCE_TOP_GAIN_LSB);
  1347. if (si2176_writecommandbytes(si2176, 2, cmdbytebuffer) != 2)
  1348. {
  1349. error_code = ERROR_SI2176_SENDING_COMMAND;
  1350. pr_info("%s: write command byte error:%d!!!!\n", __func__, error_code);
  1351. }
  1352. if (!error_code)
  1353. {
  1354. error_code = si2176_pollforresponse(si2176, 1, 1, rspbytebuffer, &reply);
  1355. if (error_code)
  1356. pr_info("%s: poll response error:%d!!!!\n", __func__, error_code);
  1357. rsp->agc_override.status = &reply;
  1358. }
  1359. exit:
  1360. return error_code;
  1361. }
  1362. #endif /* SI2176_AGC_OVERRIDE_CMD */
  1363. #ifdef SI2176_ATV_CW_TEST_CMD
  1364. /*---------------------------------------------------*/
  1365. /* SI2176_ATV_CW_TEST COMMAND */
  1366. /*---------------------------------------------------*/
  1367. static unsigned char si2176_atv_cw_test(struct i2c_client *si2176,
  1368. unsigned char pc_lock,
  1369. si2176_cmdreplyobj_t *rsp)
  1370. {
  1371. unsigned char error_code = 0;
  1372. unsigned char cmdbytebuffer[2];
  1373. unsigned char rspbytebuffer[1];
  1374. #ifdef DEBUG_RANGE_CHECK
  1375. if ( (pc_lock > SI2176_ATV_CW_TEST_CMD_PC_LOCK_MAX) )
  1376. return ERROR_SI2176_PARAMETER_OUT_OF_RANGE;
  1377. #endif /* DEBUG_RANGE_CHECK */
  1378. error_code = si2176_pollforcts(si2176);
  1379. if (error_code) goto exit;
  1380. cmdbytebuffer[0] = SI2176_ATV_CW_TEST_CMD;
  1381. cmdbytebuffer[1] = (unsigned char) ( ( pc_lock & SI2176_ATV_CW_TEST_CMD_PC_LOCK_MASK ) << SI2176_ATV_CW_TEST_CMD_PC_LOCK_LSB);
  1382. if (si2176_writecommandbytes(si2176, 2, cmdbytebuffer) != 2) error_code = ERROR_SI2176_SENDING_COMMAND;
  1383. if (!error_code)
  1384. {
  1385. error_code = si2176_pollforresponse(si2176, 1, 1, rspbytebuffer, &reply);
  1386. if (error_code)
  1387. pr_info("%s: poll response error:%d!!!!\n", __func__, error_code);
  1388. rsp->atv_cw_test.status = &reply;
  1389. }
  1390. exit:
  1391. return error_code;
  1392. }
  1393. #endif /* SI2176_ATV_CW_TEST_CMD */
  1394. #ifdef SI2176_ATV_RESTART_CMD
  1395. /*---------------------------------------------------*/
  1396. /* SI2176_ATV_RESTART COMMAND */
  1397. /*---------------------------------------------------*/
  1398. static unsigned char si2176_atv_restart(struct i2c_client *si2176,
  1399. unsigned char mode,
  1400. si2176_cmdreplyobj_t *rsp)
  1401. {
  1402. unsigned char error_code = 0;
  1403. unsigned char cmdbytebuffer[2];
  1404. unsigned char rspbytebuffer[1];
  1405. #ifdef DEBUG_RANGE_CHECK
  1406. if ( (mode > SI2176_ATV_RESTART_CMD_MODE_MAX) )
  1407. return ERROR_SI2176_PARAMETER_OUT_OF_RANGE;
  1408. #endif /* DEBUG_RANGE_CHECK */
  1409. error_code = si2176_pollforcts(si2176);
  1410. if (error_code)
  1411. {
  1412. pr_info("%s: poll cts error:%d!!!!\n", __func__, error_code);
  1413. goto exit;
  1414. }
  1415. cmdbytebuffer[0] = SI2176_ATV_RESTART_CMD;
  1416. cmdbytebuffer[1] = (unsigned char) ( ( mode & SI2176_ATV_RESTART_CMD_MODE_MASK ) << SI2176_ATV_RESTART_CMD_MODE_LSB);
  1417. if (si2176_writecommandbytes(si2176, 2, cmdbytebuffer) != 2)
  1418. {
  1419. error_code = ERROR_SI2176_SENDING_COMMAND;
  1420. pr_info("%s: write command byte error:%d!!!!\n", __func__, error_code);
  1421. }
  1422. if (!error_code)
  1423. {
  1424. error_code = si2176_pollforresponse(si2176, 1, 1, rspbytebuffer, &reply);
  1425. if (error_code)
  1426. pr_info("%s: poll response error:%d!!!!\n", __func__, error_code);
  1427. rsp->atv_restart.status = &reply;
  1428. }
  1429. exit:
  1430. return error_code;
  1431. }
  1432. #endif /* SI2176_ATV_RESTART_CMD */
  1433. #ifdef SI2176_ATV_STATUS_CMD
  1434. /*---------------------------------------------------*/
  1435. /* SI2176_ATV_STATUS COMMAND */
  1436. /*---------------------------------------------------*/
  1437. unsigned char si2176_atv_status(struct i2c_client *si2176,
  1438. unsigned char intack,
  1439. si2176_cmdreplyobj_t *rsp)
  1440. {
  1441. unsigned char error_code = 0;
  1442. unsigned char cmdbytebuffer[2];
  1443. unsigned char rspbytebuffer[11];
  1444. #ifdef DEBUG_RANGE_CHECK
  1445. if ( (intack > SI2176_ATV_STATUS_CMD_INTACK_MAX) )
  1446. return ERROR_SI2176_PARAMETER_OUT_OF_RANGE;
  1447. #endif /* DEBUG_RANGE_CHECK */
  1448. error_code = si2176_pollforcts(si2176);
  1449. if (error_code)
  1450. {
  1451. pr_info("%s: poll cts error:%d!!!!\n", __func__, error_code);
  1452. goto exit;
  1453. }
  1454. cmdbytebuffer[0] = SI2176_ATV_STATUS_CMD;
  1455. cmdbytebuffer[1] = (unsigned char) ( ( intack & SI2176_ATV_STATUS_CMD_INTACK_MASK ) << SI2176_ATV_STATUS_CMD_INTACK_LSB);
  1456. if (si2176_writecommandbytes(si2176, 2, cmdbytebuffer) != 2)
  1457. {
  1458. error_code = ERROR_SI2176_SENDING_COMMAND;
  1459. pr_info("%s: write command byte error:%d!!!!\n", __func__, error_code);
  1460. }
  1461. if (!error_code)
  1462. {
  1463. error_code = si2176_pollforresponse(si2176, 1, 11, rspbytebuffer, &reply);
  1464. if (error_code)
  1465. pr_info("%s: poll response error:%d!!!!\n", __func__, error_code);
  1466. rsp->atv_status.status = &reply;
  1467. if (!error_code)
  1468. {
  1469. rsp->atv_status.chlint = (( ( (rspbytebuffer[1] )) >> SI2176_ATV_STATUS_RESPONSE_CHLINT_LSB ) & SI2176_ATV_STATUS_RESPONSE_CHLINT_MASK );
  1470. rsp->atv_status.pclint = (( ( (rspbytebuffer[1] )) >> SI2176_ATV_STATUS_RESPONSE_PCLINT_LSB ) & SI2176_ATV_STATUS_RESPONSE_PCLINT_MASK );
  1471. rsp->atv_status.dlint = (( ( (rspbytebuffer[1] )) >> SI2176_ATV_STATUS_RESPONSE_DLINT_LSB ) & SI2176_ATV_STATUS_RESPONSE_DLINT_MASK );
  1472. rsp->atv_status.snrlint = (( ( (rspbytebuffer[1] )) >> SI2176_ATV_STATUS_RESPONSE_SNRLINT_LSB ) & SI2176_ATV_STATUS_RESPONSE_SNRLINT_MASK );
  1473. rsp->atv_status.snrhint = (( ( (rspbytebuffer[1] )) >> SI2176_ATV_STATUS_RESPONSE_SNRHINT_LSB ) & SI2176_ATV_STATUS_RESPONSE_SNRHINT_MASK );
  1474. rsp->atv_status.chl = (( ( (rspbytebuffer[2] )) >> SI2176_ATV_STATUS_RESPONSE_CHL_LSB ) & SI2176_ATV_STATUS_RESPONSE_CHL_MASK );
  1475. rsp->atv_status.pcl = (( ( (rspbytebuffer[2] )) >> SI2176_ATV_STATUS_RESPONSE_PCL_LSB ) & SI2176_ATV_STATUS_RESPONSE_PCL_MASK );
  1476. rsp->atv_status.dl = (( ( (rspbytebuffer[2] )) >> SI2176_ATV_STATUS_RESPONSE_DL_LSB ) & SI2176_ATV_STATUS_RESPONSE_DL_MASK );
  1477. rsp->atv_status.snrl = (( ( (rspbytebuffer[2] )) >> SI2176_ATV_STATUS_RESPONSE_SNRL_LSB ) & SI2176_ATV_STATUS_RESPONSE_SNRL_MASK );
  1478. rsp->atv_status.snrh = (( ( (rspbytebuffer[2] )) >> SI2176_ATV_STATUS_RESPONSE_SNRH_LSB ) & SI2176_ATV_STATUS_RESPONSE_SNRH_MASK );
  1479. rsp->atv_status.video_snr = (( ( (rspbytebuffer[3] )) >> SI2176_ATV_STATUS_RESPONSE_VIDEO_SNR_LSB ) & SI2176_ATV_STATUS_RESPONSE_VIDEO_SNR_MASK );
  1480. rsp->atv_status.afc_freq = (((( ( (rspbytebuffer[4] ) | (rspbytebuffer[5] << 8 )) >> SI2176_ATV_STATUS_RESPONSE_AFC_FREQ_LSB ) & SI2176_ATV_STATUS_RESPONSE_AFC_FREQ_MASK) <<SI2176_ATV_STATUS_RESPONSE_AFC_FREQ_SHIFT ) >>SI2176_ATV_STATUS_RESPONSE_AFC_FREQ_SHIFT );
  1481. rsp->atv_status.video_sc_spacing = (((( ( (rspbytebuffer[6] ) | (rspbytebuffer[7] << 8 )) >> SI2176_ATV_STATUS_RESPONSE_VIDEO_SC_SPACING_LSB ) & SI2176_ATV_STATUS_RESPONSE_VIDEO_SC_SPACING_MASK) <<SI2176_ATV_STATUS_RESPONSE_VIDEO_SC_SPACING_SHIFT ) >>SI2176_ATV_STATUS_RESPONSE_VIDEO_SC_SPACING_SHIFT );
  1482. rsp->atv_status.video_sys = (( ( (rspbytebuffer[8] )) >> SI2176_ATV_STATUS_RESPONSE_VIDEO_SYS_LSB ) & SI2176_ATV_STATUS_RESPONSE_VIDEO_SYS_MASK );
  1483. rsp->atv_status.color = (( ( (rspbytebuffer[8] )) >> SI2176_ATV_STATUS_RESPONSE_COLOR_LSB ) & SI2176_ATV_STATUS_RESPONSE_COLOR_MASK );
  1484. rsp->atv_status.trans = (( ( (rspbytebuffer[8] )) >> SI2176_ATV_STATUS_RESPONSE_TRANS_LSB ) & SI2176_ATV_STATUS_RESPONSE_TRANS_MASK );
  1485. rsp->atv_status.audio_sys = (( ( (rspbytebuffer[9] )) >> SI2176_ATV_STATUS_RESPONSE_AUDIO_SYS_LSB ) & SI2176_ATV_STATUS_RESPONSE_AUDIO_SYS_MASK );
  1486. rsp->atv_status.audio_demod_mode = (( ( (rspbytebuffer[9] )) >> SI2176_ATV_STATUS_RESPONSE_AUDIO_DEMOD_MODE_LSB ) & SI2176_ATV_STATUS_RESPONSE_AUDIO_DEMOD_MODE_MASK );
  1487. rsp->atv_status.audio_chan_bw = (( ( (rspbytebuffer[10] )) >> SI2176_ATV_STATUS_RESPONSE_AUDIO_CHAN_BW_LSB ) & SI2176_ATV_STATUS_RESPONSE_AUDIO_CHAN_BW_MASK );
  1488. }
  1489. }
  1490. exit:
  1491. return error_code;
  1492. }
  1493. #endif /* SI2176_ATV_STATUS_CMD */
  1494. #ifdef SI2176_CONFIG_PINS_CMD
  1495. /*---------------------------------------------------*/
  1496. /* SI2176_CONFIG_PINS COMMAND */
  1497. /*---------------------------------------------------*/
  1498. static unsigned char si2176_config_pins(struct i2c_client *si2176,
  1499. unsigned char gpio1_mode,
  1500. unsigned char gpio1_read,
  1501. unsigned char gpio2_mode,
  1502. unsigned char gpio2_read,
  1503. unsigned char gpio3_mode,
  1504. unsigned char gpio3_read,
  1505. unsigned char bclk1_mode,
  1506. unsigned char bclk1_read,
  1507. unsigned char xout_mode,
  1508. si2176_cmdreplyobj_t *rsp)
  1509. {
  1510. unsigned char error_code = 0;
  1511. unsigned char cmdbytebuffer[6];
  1512. unsigned char rspbytebuffer[6];
  1513. #ifdef DEBUG_RANGE_CHECK
  1514. if ( (gpio1_mode > SI2176_CONFIG_PINS_CMD_GPIO1_MODE_MAX)
  1515. || (gpio1_read > SI2176_CONFIG_PINS_CMD_GPIO1_READ_MAX)
  1516. || (gpio2_mode > SI2176_CONFIG_PINS_CMD_GPIO2_MODE_MAX)
  1517. || (gpio2_read > SI2176_CONFIG_PINS_CMD_GPIO2_READ_MAX)
  1518. || (gpio3_mode > SI2176_CONFIG_PINS_CMD_GPIO3_MODE_MAX)
  1519. || (gpio3_read > SI2176_CONFIG_PINS_CMD_GPIO3_READ_MAX)
  1520. || (bclk1_mode > SI2176_CONFIG_PINS_CMD_BCLK1_MODE_MAX)
  1521. || (bclk1_read > SI2176_CONFIG_PINS_CMD_BCLK1_READ_MAX)
  1522. || (xout_mode > SI2176_CONFIG_PINS_CMD_XOUT_MODE_MAX ) )
  1523. return ERROR_SI2176_PARAMETER_OUT_OF_RANGE;
  1524. #endif /* DEBUG_RANGE_CHECK */
  1525. error_code = si2176_pollforcts(si2176);
  1526. if (error_code)
  1527. {
  1528. pr_info("%s: poll cts error:%d!!!!\n", __func__, error_code);
  1529. goto exit;
  1530. }
  1531. cmdbytebuffer[0] = SI2176_CONFIG_PINS_CMD;
  1532. cmdbytebuffer[1] = (unsigned char) ( ( gpio1_mode & SI2176_CONFIG_PINS_CMD_GPIO1_MODE_MASK ) << SI2176_CONFIG_PINS_CMD_GPIO1_MODE_LSB|
  1533. ( gpio1_read & SI2176_CONFIG_PINS_CMD_GPIO1_READ_MASK ) << SI2176_CONFIG_PINS_CMD_GPIO1_READ_LSB);
  1534. cmdbytebuffer[2] = (unsigned char) ( ( gpio2_mode & SI2176_CONFIG_PINS_CMD_GPIO2_MODE_MASK ) << SI2176_CONFIG_PINS_CMD_GPIO2_MODE_LSB|
  1535. ( gpio2_read & SI2176_CONFIG_PINS_CMD_GPIO2_READ_MASK ) << SI2176_CONFIG_PINS_CMD_GPIO2_READ_LSB);
  1536. cmdbytebuffer[3] = (unsigned char) ( ( gpio3_mode & SI2176_CONFIG_PINS_CMD_GPIO3_MODE_MASK ) << SI2176_CONFIG_PINS_CMD_GPIO3_MODE_LSB|
  1537. ( gpio3_read & SI2176_CONFIG_PINS_CMD_GPIO3_READ_MASK ) << SI2176_CONFIG_PINS_CMD_GPIO3_READ_LSB);
  1538. cmdbytebuffer[4] = (unsigned char) ( ( bclk1_mode & SI2176_CONFIG_PINS_CMD_BCLK1_MODE_MASK ) << SI2176_CONFIG_PINS_CMD_BCLK1_MODE_LSB|
  1539. ( bclk1_read & SI2176_CONFIG_PINS_CMD_BCLK1_READ_MASK ) << SI2176_CONFIG_PINS_CMD_BCLK1_READ_LSB);
  1540. cmdbytebuffer[5] = (unsigned char) ( ( xout_mode & SI2176_CONFIG_PINS_CMD_XOUT_MODE_MASK ) << SI2176_CONFIG_PINS_CMD_XOUT_MODE_LSB );
  1541. if (si2176_writecommandbytes(si2176, 6, cmdbytebuffer) != 6)
  1542. {
  1543. error_code = ERROR_SI2176_SENDING_COMMAND;
  1544. pr_info("%s: write command byte error:%d!!!!\n", __func__, error_code);
  1545. }
  1546. if (!error_code)
  1547. {
  1548. error_code = si2176_pollforresponse(si2176, 1, 6, rspbytebuffer, &reply);
  1549. if (error_code)
  1550. pr_info("%s: poll response error:%d!!!!\n", __func__, error_code);
  1551. rsp->config_pins.status = &reply;
  1552. if (!error_code)
  1553. {
  1554. rsp->config_pins.gpio1_mode = (( ( (rspbytebuffer[1] )) >> SI2176_CONFIG_PINS_RESPONSE_GPIO1_MODE_LSB ) & SI2176_CONFIG_PINS_RESPONSE_GPIO1_MODE_MASK );
  1555. rsp->config_pins.gpio1_state = (( ( (rspbytebuffer[1] )) >> SI2176_CONFIG_PINS_RESPONSE_GPIO1_STATE_LSB ) & SI2176_CONFIG_PINS_RESPONSE_GPIO1_STATE_MASK );
  1556. rsp->config_pins.gpio2_mode = (( ( (rspbytebuffer[2] )) >> SI2176_CONFIG_PINS_RESPONSE_GPIO2_MODE_LSB ) & SI2176_CONFIG_PINS_RESPONSE_GPIO2_MODE_MASK );
  1557. rsp->config_pins.gpio2_state = (( ( (rspbytebuffer[2] )) >> SI2176_CONFIG_PINS_RESPONSE_GPIO2_STATE_LSB ) & SI2176_CONFIG_PINS_RESPONSE_GPIO2_STATE_MASK );
  1558. rsp->config_pins.gpio3_mode = (( ( (rspbytebuffer[3] )) >> SI2176_CONFIG_PINS_RESPONSE_GPIO3_MODE_LSB ) & SI2176_CONFIG_PINS_RESPONSE_GPIO3_MODE_MASK );
  1559. rsp->config_pins.gpio3_state = (( ( (rspbytebuffer[3] )) >> SI2176_CONFIG_PINS_RESPONSE_GPIO3_STATE_LSB ) & SI2176_CONFIG_PINS_RESPONSE_GPIO3_STATE_MASK );
  1560. rsp->config_pins.bclk1_mode = (( ( (rspbytebuffer[4] )) >> SI2176_CONFIG_PINS_RESPONSE_BCLK1_MODE_LSB ) & SI2176_CONFIG_PINS_RESPONSE_BCLK1_MODE_MASK );
  1561. rsp->config_pins.bclk1_state = (( ( (rspbytebuffer[4] )) >> SI2176_CONFIG_PINS_RESPONSE_BCLK1_STATE_LSB ) & SI2176_CONFIG_PINS_RESPONSE_BCLK1_STATE_MASK );
  1562. rsp->config_pins.xout_mode = (( ( (rspbytebuffer[5] )) >> SI2176_CONFIG_PINS_RESPONSE_XOUT_MODE_LSB ) & SI2176_CONFIG_PINS_RESPONSE_XOUT_MODE_MASK );
  1563. }
  1564. }
  1565. exit:
  1566. return error_code;
  1567. }
  1568. #endif /* SI2176_CONFIG_PINS_CMD */
  1569. #ifdef SI2176_EXIT_BOOTLOADER_CMD
  1570. /*---------------------------------------------------*/
  1571. /* SI2176_EXIT_BOOTLOADER COMMAND */
  1572. /*---------------------------------------------------*/
  1573. static unsigned char si2176_exit_bootloader(struct i2c_client *si2176,
  1574. unsigned char func,
  1575. unsigned char ctsien,
  1576. si2176_cmdreplyobj_t *rsp)
  1577. {
  1578. unsigned char error_code = 0;
  1579. unsigned char cmdbytebuffer[2];
  1580. unsigned char rspbytebuffer[1];
  1581. #ifdef DEBUG_RANGE_CHECK
  1582. if ( (func > SI2176_EXIT_BOOTLOADER_CMD_FUNC_MAX )
  1583. || (ctsien > SI2176_EXIT_BOOTLOADER_CMD_CTSIEN_MAX) )
  1584. return ERROR_SI2176_PARAMETER_OUT_OF_RANGE;
  1585. #endif /* DEBUG_RANGE_CHECK */
  1586. error_code = si2176_pollforcts(si2176);
  1587. if (error_code) goto exit;
  1588. cmdbytebuffer[0] = SI2176_EXIT_BOOTLOADER_CMD;
  1589. cmdbytebuffer[1] = (unsigned char) ( ( func & SI2176_EXIT_BOOTLOADER_CMD_FUNC_MASK ) << SI2176_EXIT_BOOTLOADER_CMD_FUNC_LSB |
  1590. ( ctsien & SI2176_EXIT_BOOTLOADER_CMD_CTSIEN_MASK ) << SI2176_EXIT_BOOTLOADER_CMD_CTSIEN_LSB);
  1591. if (si2176_writecommandbytes(si2176, 2, cmdbytebuffer) != 2) error_code = ERROR_SI2176_SENDING_COMMAND;
  1592. if (!error_code)
  1593. {
  1594. error_code = si2176_pollforresponse(si2176, 1, 1, rspbytebuffer, &reply);
  1595. if (error_code)
  1596. pr_info("%s: poll response error:%d!!!!\n", __func__, error_code);
  1597. rsp->exit_bootloader.status = &reply;
  1598. }
  1599. exit:
  1600. return error_code;
  1601. }
  1602. #endif /* SI2176_EXIT_BOOTLOADER_CMD */
  1603. #ifdef SI2176_FINE_TUNE_CMD
  1604. /*---------------------------------------------------*/
  1605. /* SI2176_FINE_TUNE COMMAND */
  1606. /*---------------------------------------------------*/
  1607. static unsigned char si2176_fine_tune(struct i2c_client *si2176,
  1608. unsigned char reserved,
  1609. int offset_500hz,
  1610. si2176_cmdreplyobj_t *rsp)
  1611. {
  1612. unsigned char error_code = 0;
  1613. unsigned char cmdbytebuffer[4];
  1614. unsigned char rspbytebuffer[1];
  1615. #ifdef DEBUG_RANGE_CHECK
  1616. if ( (reserved > SI2176_FINE_TUNE_CMD_RESERVED_MAX )
  1617. || (offset_500hz > SI2176_FINE_TUNE_CMD_OFFSET_500HZ_MAX) || (offset_500hz < SI2176_FINE_TUNE_CMD_OFFSET_500HZ_MIN) )
  1618. return ERROR_SI2176_PARAMETER_OUT_OF_RANGE;
  1619. #endif /* DEBUG_RANGE_CHECK */
  1620. error_code = si2176_pollforcts(si2176);
  1621. if (error_code)
  1622. {
  1623. pr_info("%s: poll cts error:%d!!!!\n", __func__, error_code);
  1624. goto exit;
  1625. }
  1626. cmdbytebuffer[0] = SI2176_FINE_TUNE_CMD;
  1627. cmdbytebuffer[1] = (unsigned char) ( ( reserved & SI2176_FINE_TUNE_CMD_RESERVED_MASK ) << SI2176_FINE_TUNE_CMD_RESERVED_LSB );
  1628. cmdbytebuffer[2] = (unsigned char) ( ( offset_500hz & SI2176_FINE_TUNE_CMD_OFFSET_500HZ_MASK ) << SI2176_FINE_TUNE_CMD_OFFSET_500HZ_LSB);
  1629. cmdbytebuffer[3] = (unsigned char) ((( offset_500hz & SI2176_FINE_TUNE_CMD_OFFSET_500HZ_MASK ) << SI2176_FINE_TUNE_CMD_OFFSET_500HZ_LSB)>>8);
  1630. if (si2176_writecommandbytes(si2176, 4, cmdbytebuffer) != 4)
  1631. {
  1632. error_code = ERROR_SI2176_SENDING_COMMAND;
  1633. pr_info("%s: write command byte error:%d!!!!\n", __func__, error_code);
  1634. }
  1635. if (!error_code)
  1636. {
  1637. error_code = si2176_pollforresponse(si2176, 1, 1, rspbytebuffer, &reply);
  1638. if (error_code)
  1639. pr_info("%s: poll response error:%d!!!!\n", __func__, error_code);
  1640. rsp->fine_tune.status = &reply;
  1641. }
  1642. exit:
  1643. return error_code;
  1644. }
  1645. #endif /* SI2176_FINE_TUNE_CMD */
  1646. #ifdef SI2176_GET_PROPERTY_CMD
  1647. /*---------------------------------------------------*/
  1648. /* SI2176_GET_PROPERTY COMMAND */
  1649. /*---------------------------------------------------*/
  1650. static unsigned char si2176_get_property(struct i2c_client *si2176,
  1651. unsigned char reserved,
  1652. unsigned int prop,
  1653. si2176_cmdreplyobj_t *rsp)
  1654. {
  1655. unsigned char error_code = 0;
  1656. unsigned char cmdbytebuffer[4];
  1657. unsigned char rspbytebuffer[4];
  1658. #ifdef DEBUG_RANGE_CHECK
  1659. if ( (reserved > SI2176_GET_PROPERTY_CMD_RESERVED_MAX) )
  1660. return ERROR_SI2176_PARAMETER_OUT_OF_RANGE;
  1661. #endif /* DEBUG_RANGE_CHECK */
  1662. error_code = si2176_pollforcts(si2176);
  1663. if (error_code)
  1664. {
  1665. pr_info("%s: poll cts error:%d!!!!\n", __func__, error_code);
  1666. goto exit;
  1667. }
  1668. cmdbytebuffer[0] = SI2176_GET_PROPERTY_CMD;
  1669. cmdbytebuffer[1] = (unsigned char) ( ( reserved & SI2176_GET_PROPERTY_CMD_RESERVED_MASK ) << SI2176_GET_PROPERTY_CMD_RESERVED_LSB);
  1670. cmdbytebuffer[2] = (unsigned char) ( ( prop & SI2176_GET_PROPERTY_CMD_PROP_MASK ) << SI2176_GET_PROPERTY_CMD_PROP_LSB );
  1671. cmdbytebuffer[3] = (unsigned char) ((( prop & SI2176_GET_PROPERTY_CMD_PROP_MASK ) << SI2176_GET_PROPERTY_CMD_PROP_LSB )>>8);
  1672. if (si2176_writecommandbytes(si2176, 4, cmdbytebuffer) != 4)
  1673. {
  1674. error_code = ERROR_SI2176_SENDING_COMMAND;
  1675. pr_info("%s: write command byte error:%d!!!!\n", __func__, error_code);
  1676. }
  1677. if (!error_code)
  1678. {
  1679. error_code = si2176_pollforresponse(si2176, 1, 4, rspbytebuffer, &reply);
  1680. if (error_code)
  1681. pr_info("%s: poll response error:%d!!!!\n", __func__, error_code);
  1682. rsp->get_property.status = &reply;
  1683. if (!error_code)
  1684. {
  1685. rsp->get_property.reserved = (( ( (rspbytebuffer[1] )) >> SI2176_GET_PROPERTY_RESPONSE_RESERVED_LSB ) & SI2176_GET_PROPERTY_RESPONSE_RESERVED_MASK );
  1686. rsp->get_property.data = (( ( (rspbytebuffer[2] ) | (rspbytebuffer[3] << 8 )) >> SI2176_GET_PROPERTY_RESPONSE_DATA_LSB ) & SI2176_GET_PROPERTY_RESPONSE_DATA_MASK );
  1687. }
  1688. }
  1689. exit:
  1690. return error_code;
  1691. }
  1692. #endif /* SI2176_GET_PROPERTY_CMD */
  1693. #ifdef SI2176_GET_REV_CMD
  1694. /*---------------------------------------------------*/
  1695. /* SI2176_GET_REV COMMAND */
  1696. /*---------------------------------------------------*/
  1697. static unsigned char si2176_get_rev(struct i2c_client *si2176,
  1698. si2176_cmdreplyobj_t *rsp)
  1699. {
  1700. unsigned char error_code = 0;
  1701. unsigned char cmdbytebuffer[1];
  1702. unsigned char rspbytebuffer[10];
  1703. error_code = si2176_pollforcts(si2176);
  1704. if (error_code) goto exit;
  1705. cmdbytebuffer[0] = SI2176_GET_REV_CMD;
  1706. if (si2176_writecommandbytes(si2176, 1, cmdbytebuffer) != 1) error_code = ERROR_SI2176_SENDING_COMMAND;
  1707. if (!error_code)
  1708. {
  1709. error_code = si2176_pollforresponse(si2176, 1, 10, rspbytebuffer, &reply);
  1710. if (error_code)
  1711. pr_info("%s: poll response error:%d!!!!\n", __func__, error_code);
  1712. rsp->get_rev.status = &reply;
  1713. if (!error_code)
  1714. {
  1715. rsp->get_rev.pn = (( ( (rspbytebuffer[1] )) >> SI2176_GET_REV_RESPONSE_PN_LSB ) & SI2176_GET_REV_RESPONSE_PN_MASK );
  1716. rsp->get_rev.fwmajor = (( ( (rspbytebuffer[2] )) >> SI2176_GET_REV_RESPONSE_FWMAJOR_LSB ) & SI2176_GET_REV_RESPONSE_FWMAJOR_MASK );
  1717. rsp->get_rev.fwminor = (( ( (rspbytebuffer[3] )) >> SI2176_GET_REV_RESPONSE_FWMINOR_LSB ) & SI2176_GET_REV_RESPONSE_FWMINOR_MASK );
  1718. rsp->get_rev.patch = (( ( (rspbytebuffer[4] ) | (rspbytebuffer[5] << 8 )) >> SI2176_GET_REV_RESPONSE_PATCH_LSB ) & SI2176_GET_REV_RESPONSE_PATCH_MASK );
  1719. rsp->get_rev.cmpmajor = (( ( (rspbytebuffer[6] )) >> SI2176_GET_REV_RESPONSE_CMPMAJOR_LSB ) & SI2176_GET_REV_RESPONSE_CMPMAJOR_MASK );
  1720. rsp->get_rev.cmpminor = (( ( (rspbytebuffer[7] )) >> SI2176_GET_REV_RESPONSE_CMPMINOR_LSB ) & SI2176_GET_REV_RESPONSE_CMPMINOR_MASK );
  1721. rsp->get_rev.cmpbuild = (( ( (rspbytebuffer[8] )) >> SI2176_GET_REV_RESPONSE_CMPBUILD_LSB ) & SI2176_GET_REV_RESPONSE_CMPBUILD_MASK );
  1722. rsp->get_rev.chiprev = (( ( (rspbytebuffer[9] )) >> SI2176_GET_REV_RESPONSE_CHIPREV_LSB ) & SI2176_GET_REV_RESPONSE_CHIPREV_MASK );
  1723. }
  1724. }
  1725. exit:
  1726. return error_code;
  1727. }
  1728. #endif /* SI2176_GET_REV_CMD */
  1729. #ifdef SI2176_PART_INFO_CMD
  1730. /*---------------------------------------------------*/
  1731. /* SI2176_PART_INFO COMMAND */
  1732. /*---------------------------------------------------*/
  1733. static unsigned char si2176_part_info(struct i2c_client *si2176,
  1734. si2176_cmdreplyobj_t *rsp)
  1735. {
  1736. unsigned char error_code = 0;
  1737. unsigned char cmdbytebuffer[1];
  1738. unsigned char rspbytebuffer[13];
  1739. error_code = si2176_pollforcts(si2176);
  1740. if (error_code) goto exit;
  1741. cmdbytebuffer[0] = SI2176_PART_INFO_CMD;
  1742. if (si2176_writecommandbytes(si2176, 1, cmdbytebuffer) != 1) error_code = ERROR_SI2176_SENDING_COMMAND;
  1743. if (!error_code)
  1744. {
  1745. error_code = si2176_pollforresponse(si2176, 1, 13, rspbytebuffer, &reply);
  1746. if (error_code)
  1747. pr_info("%s: poll response error:%d!!!!\n", __func__, error_code);
  1748. rsp->part_info.status = &reply;
  1749. if (!error_code)
  1750. {
  1751. rsp->part_info.chiprev = (( ( (rspbytebuffer[1] )) >> SI2176_PART_INFO_RESPONSE_CHIPREV_LSB ) & SI2176_PART_INFO_RESPONSE_CHIPREV_MASK );
  1752. rsp->part_info.part = (( ( (rspbytebuffer[2] )) >> SI2176_PART_INFO_RESPONSE_PART_LSB ) & SI2176_PART_INFO_RESPONSE_PART_MASK );
  1753. rsp->part_info.pmajor = (( ( (rspbytebuffer[3] )) >> SI2176_PART_INFO_RESPONSE_PMAJOR_LSB ) & SI2176_PART_INFO_RESPONSE_PMAJOR_MASK );
  1754. rsp->part_info.pminor = (( ( (rspbytebuffer[4] )) >> SI2176_PART_INFO_RESPONSE_PMINOR_LSB ) & SI2176_PART_INFO_RESPONSE_PMINOR_MASK );
  1755. rsp->part_info.pbuild = (( ( (rspbytebuffer[5] )) >> SI2176_PART_INFO_RESPONSE_PBUILD_LSB ) & SI2176_PART_INFO_RESPONSE_PBUILD_MASK );
  1756. rsp->part_info.reserved = (( ( (rspbytebuffer[6] ) | (rspbytebuffer[7] << 8 )) >> SI2176_PART_INFO_RESPONSE_RESERVED_LSB ) & SI2176_PART_INFO_RESPONSE_RESERVED_MASK );
  1757. rsp->part_info.serial = (( ( (rspbytebuffer[8] ) | (rspbytebuffer[9] << 8 ) | (rspbytebuffer[10] << 16 ) | (rspbytebuffer[11] << 24 )) >> SI2176_PART_INFO_RESPONSE_SERIAL_LSB ) & SI2176_PART_INFO_RESPONSE_SERIAL_MASK );
  1758. rsp->part_info.romid = (( ( (rspbytebuffer[12] )) >> SI2176_PART_INFO_RESPONSE_ROMID_LSB ) & SI2176_PART_INFO_RESPONSE_ROMID_MASK );
  1759. }
  1760. }
  1761. exit:
  1762. return error_code;
  1763. }
  1764. #endif /* SI2176_PART_INFO_CMD */
  1765. #ifdef SI2176_POWER_DOWN_CMD
  1766. /*---------------------------------------------------*/
  1767. /* SI2176_POWER_DOWN COMMAND */
  1768. /*---------------------------------------------------*/
  1769. static unsigned char si2176_power_down(struct i2c_client *si2176,
  1770. si2176_cmdreplyobj_t *rsp)
  1771. {
  1772. unsigned char error_code = 0;
  1773. unsigned char cmdbytebuffer[1];
  1774. unsigned char rspbytebuffer[1];
  1775. error_code = si2176_pollforcts(si2176);
  1776. if (error_code)
  1777. {
  1778. pr_info("%s: poll cts error:%d!!!!\n", __func__, error_code);
  1779. goto exit;
  1780. }
  1781. cmdbytebuffer[0] = SI2176_POWER_DOWN_CMD;
  1782. if (si2176_writecommandbytes(si2176, 1, cmdbytebuffer) != 1)
  1783. {
  1784. error_code = ERROR_SI2176_SENDING_COMMAND;
  1785. pr_info("%s: write command byte error:%d!!!!\n", __func__, error_code);
  1786. }
  1787. if (!error_code)
  1788. {
  1789. error_code = si2176_pollforresponse(si2176, 1, 1, rspbytebuffer, &reply);
  1790. if (error_code)
  1791. pr_info("%s: poll response error:%d!!!!\n", __func__, error_code);
  1792. rsp->power_down.status = &reply;
  1793. }
  1794. exit:
  1795. return error_code;
  1796. }
  1797. #endif /* SI2176_POWER_DOWN_CMD */
  1798. #ifdef SI2176_POWER_UP_CMD
  1799. /*---------------------------------------------------*/
  1800. /* SI2176_POWER_UP COMMAND */
  1801. /*---------------------------------------------------*/
  1802. static unsigned char si2176_power_up(struct i2c_client *si2176,
  1803. unsigned char subcode,
  1804. unsigned char reserved1,
  1805. unsigned char reserved2,
  1806. unsigned char reserved3,
  1807. unsigned char clock_mode,
  1808. unsigned char clock_freq,
  1809. unsigned char addr_mode,
  1810. unsigned char func,
  1811. unsigned char ctsien,
  1812. unsigned char wake_up,
  1813. si2176_cmdreplyobj_t *rsp)
  1814. {
  1815. unsigned char error_code = 0;
  1816. unsigned char cmdbytebuffer[9];
  1817. unsigned char rspbytebuffer[1];
  1818. #ifdef DEBUG_RANGE_CHECK
  1819. if ( (subcode > SI2176_POWER_UP_CMD_SUBCODE_MAX ) || (subcode < SI2176_POWER_UP_CMD_SUBCODE_MIN )
  1820. || (reserved1 > SI2176_POWER_UP_CMD_RESERVED1_MAX ) || (reserved1 < SI2176_POWER_UP_CMD_RESERVED1_MIN )
  1821. || (reserved2 > SI2176_POWER_UP_CMD_RESERVED2_MAX )
  1822. || (reserved3 > SI2176_POWER_UP_CMD_RESERVED3_MAX )
  1823. || (clock_mode > SI2176_POWER_UP_CMD_CLOCK_MODE_MAX) || (clock_mode < SI2176_POWER_UP_CMD_CLOCK_MODE_MIN)
  1824. || (clock_freq > SI2176_POWER_UP_CMD_CLOCK_FREQ_MAX)
  1825. || (addr_mode > SI2176_POWER_UP_CMD_ADDR_MODE_MAX )
  1826. || (func > SI2176_POWER_UP_CMD_FUNC_MAX )
  1827. || (ctsien > SI2176_POWER_UP_CMD_CTSIEN_MAX )
  1828. || (wake_up > SI2176_POWER_UP_CMD_WAKE_UP_MAX ) || (wake_up < SI2176_POWER_UP_CMD_WAKE_UP_MIN ) )
  1829. {
  1830. if(SI2176_DEBUG)
  1831. pr_info("%s: DEBUG_RANGE_CHECK!!!!\n", __func__);
  1832. return ERROR_SI2176_PARAMETER_OUT_OF_RANGE;
  1833. }
  1834. #endif /* DEBUG_RANGE_CHECK */
  1835. error_code = si2176_pollforcts(si2176);
  1836. if (error_code)
  1837. {
  1838. pr_info("%s: poll cts error:%d!!!!\n", __func__, error_code);
  1839. goto exit;
  1840. }
  1841. cmdbytebuffer[0] = SI2176_POWER_UP_CMD;
  1842. cmdbytebuffer[1] = (unsigned char) ( ( subcode & SI2176_POWER_UP_CMD_SUBCODE_MASK ) << SI2176_POWER_UP_CMD_SUBCODE_LSB );
  1843. cmdbytebuffer[2] = (unsigned char) ( ( reserved1 & SI2176_POWER_UP_CMD_RESERVED1_MASK ) << SI2176_POWER_UP_CMD_RESERVED1_LSB );
  1844. cmdbytebuffer[3] = (unsigned char) ( ( reserved2 & SI2176_POWER_UP_CMD_RESERVED2_MASK ) << SI2176_POWER_UP_CMD_RESERVED2_LSB );
  1845. cmdbytebuffer[4] = (unsigned char) ( ( reserved3 & SI2176_POWER_UP_CMD_RESERVED3_MASK ) << SI2176_POWER_UP_CMD_RESERVED3_LSB );
  1846. cmdbytebuffer[5] = (unsigned char) ( ( clock_mode & SI2176_POWER_UP_CMD_CLOCK_MODE_MASK ) << SI2176_POWER_UP_CMD_CLOCK_MODE_LSB|
  1847. ( clock_freq & SI2176_POWER_UP_CMD_CLOCK_FREQ_MASK ) << SI2176_POWER_UP_CMD_CLOCK_FREQ_LSB);
  1848. cmdbytebuffer[6] = (unsigned char) ( ( addr_mode & SI2176_POWER_UP_CMD_ADDR_MODE_MASK ) << SI2176_POWER_UP_CMD_ADDR_MODE_LSB );
  1849. cmdbytebuffer[7] = (unsigned char) ( ( func & SI2176_POWER_UP_CMD_FUNC_MASK ) << SI2176_POWER_UP_CMD_FUNC_LSB |
  1850. ( ctsien & SI2176_POWER_UP_CMD_CTSIEN_MASK ) << SI2176_POWER_UP_CMD_CTSIEN_LSB );
  1851. cmdbytebuffer[8] = (unsigned char) ( ( wake_up & SI2176_POWER_UP_CMD_WAKE_UP_MASK ) << SI2176_POWER_UP_CMD_WAKE_UP_LSB );
  1852. if (si2176_writecommandbytes(si2176, 9, cmdbytebuffer) != 9)
  1853. {
  1854. error_code = ERROR_SI2176_SENDING_COMMAND;
  1855. if (error_code)
  1856. pr_info("%s: si2176_writecommandbytes!!!!\n", __func__);
  1857. }
  1858. if (!error_code)
  1859. {
  1860. error_code = si2176_pollforresponse(si2176, 1, 1, rspbytebuffer, &reply);
  1861. if (error_code)
  1862. pr_info("%s: poll response error:%d!!!!\n", __func__, error_code);
  1863. rsp->power_up.status = &reply;
  1864. }
  1865. exit:
  1866. return error_code;
  1867. }
  1868. #endif /* SI2176_POWER_UP_CMD */
  1869. #ifdef SI2176_SET_PROPERTY_CMD
  1870. /*---------------------------------------------------*/
  1871. /* SI2176_SET_PROPERTY COMMAND */
  1872. /*---------------------------------------------------*/
  1873. static unsigned char si2176_set_property(struct i2c_client *si2176,
  1874. unsigned char reserved,
  1875. unsigned int prop,
  1876. unsigned int data,
  1877. si2176_cmdreplyobj_t *rsp)
  1878. {
  1879. unsigned char error_code = 0;
  1880. unsigned char cmdbytebuffer[6];
  1881. unsigned char rspbytebuffer[4];
  1882. error_code = si2176_pollforcts(si2176);
  1883. if (error_code)
  1884. {
  1885. pr_info("%s: poll cts error:%d!!!!\n", __func__, error_code);
  1886. goto exit;
  1887. }
  1888. cmdbytebuffer[0] = SI2176_SET_PROPERTY_CMD;
  1889. cmdbytebuffer[1] = (unsigned char) ( ( reserved & SI2176_SET_PROPERTY_CMD_RESERVED_MASK ) << SI2176_SET_PROPERTY_CMD_RESERVED_LSB);
  1890. cmdbytebuffer[2] = (unsigned char) ( ( prop & SI2176_SET_PROPERTY_CMD_PROP_MASK ) << SI2176_SET_PROPERTY_CMD_PROP_LSB );
  1891. cmdbytebuffer[3] = (unsigned char) ((( prop & SI2176_SET_PROPERTY_CMD_PROP_MASK ) << SI2176_SET_PROPERTY_CMD_PROP_LSB )>>8);
  1892. cmdbytebuffer[4] = (unsigned char) ( ( data & SI2176_SET_PROPERTY_CMD_DATA_MASK ) << SI2176_SET_PROPERTY_CMD_DATA_LSB );
  1893. cmdbytebuffer[5] = (unsigned char) ((( data & SI2176_SET_PROPERTY_CMD_DATA_MASK ) << SI2176_SET_PROPERTY_CMD_DATA_LSB )>>8);
  1894. if (si2176_writecommandbytes(si2176, 6, cmdbytebuffer) != 6)
  1895. {
  1896. error_code = ERROR_SI2176_SENDING_COMMAND;
  1897. pr_info("%s: write command byte error:%d!!!!\n", __func__, error_code);
  1898. }
  1899. if (!error_code)
  1900. {
  1901. error_code = si2176_pollforresponse(si2176, 1, 4, rspbytebuffer, &reply);
  1902. if (error_code)
  1903. pr_info("%s: poll response error:%d!!!!\n", __func__, error_code);
  1904. rsp->set_property.status = &reply;
  1905. if (!error_code)
  1906. {
  1907. rsp->set_property.reserved = (( ( (rspbytebuffer[1] )) >> SI2176_SET_PROPERTY_RESPONSE_RESERVED_LSB ) & SI2176_SET_PROPERTY_RESPONSE_RESERVED_MASK );
  1908. rsp->set_property.data = (( ( (rspbytebuffer[2] ) | (rspbytebuffer[3] << 8 )) >> SI2176_SET_PROPERTY_RESPONSE_DATA_LSB ) & SI2176_SET_PROPERTY_RESPONSE_DATA_MASK );
  1909. }
  1910. }
  1911. exit:
  1912. return error_code;
  1913. }
  1914. #endif /* SI2176_SET_PROPERTY_CMD */
  1915. #ifdef SI2176_STANDBY_CMD
  1916. /*---------------------------------------------------*/
  1917. /* SI2176_STANDBY COMMAND */
  1918. /*---------------------------------------------------*/
  1919. static unsigned char si2176_standby(struct i2c_client *si2176,
  1920. si2176_cmdreplyobj_t *rsp)
  1921. {
  1922. unsigned char error_code = 0;
  1923. unsigned char cmdbytebuffer[1];
  1924. unsigned char rspbytebuffer[1];
  1925. error_code = si2176_pollforcts(si2176);
  1926. if (error_code)
  1927. {
  1928. pr_info("%s: poll cts error:%d!!!!\n", __func__, error_code);
  1929. goto exit;
  1930. }
  1931. cmdbytebuffer[0] = SI2176_STANDBY_CMD;
  1932. if (si2176_writecommandbytes(si2176, 1, cmdbytebuffer) != 1)
  1933. {
  1934. error_code = ERROR_SI2176_SENDING_COMMAND;
  1935. pr_info("%s: write command byte error:%d!!!!\n", __func__, error_code);
  1936. }
  1937. if (!error_code)
  1938. {
  1939. error_code = si2176_pollforresponse(si2176, 1, 1, rspbytebuffer, &reply);
  1940. if (error_code)
  1941. pr_info("%s: poll response error:%d!!!!\n", __func__, error_code);
  1942. rsp->standby.status = &reply;
  1943. }
  1944. exit:
  1945. return error_code;
  1946. }
  1947. #endif /* SI2176_STANDBY_CMD */
  1948. #ifdef SI2176_TUNER_STATUS_CMD
  1949. /*---------------------------------------------------*/
  1950. /* SI2176_TUNER_STATUS COMMAND */
  1951. /*---------------------------------------------------*/
  1952. unsigned char si2176_tuner_status(struct i2c_client *si2176,
  1953. unsigned char intack,
  1954. si2176_cmdreplyobj_t *rsp)
  1955. {
  1956. unsigned char error_code = 0;
  1957. unsigned char cmdbytebuffer[2];
  1958. unsigned char rspbytebuffer[12];
  1959. #ifdef DEBUG_RANGE_CHECK
  1960. if ( (intack > SI2176_TUNER_STATUS_CMD_INTACK_MAX) )
  1961. return ERROR_SI2176_PARAMETER_OUT_OF_RANGE;
  1962. #endif /* DEBUG_RANGE_CHECK */
  1963. error_code = si2176_pollforcts(si2176);
  1964. if (error_code)
  1965. {
  1966. pr_info("%s: poll cts error:%d!!!!\n", __func__, error_code);
  1967. goto exit;
  1968. }
  1969. cmdbytebuffer[0] = SI2176_TUNER_STATUS_CMD;
  1970. cmdbytebuffer[1] = (unsigned char) ( ( intack & SI2176_TUNER_STATUS_CMD_INTACK_MASK ) << SI2176_TUNER_STATUS_CMD_INTACK_LSB);
  1971. if (si2176_writecommandbytes(si2176, 2, cmdbytebuffer) != 2)
  1972. {
  1973. error_code = ERROR_SI2176_SENDING_COMMAND;
  1974. pr_info("%s: write command byte error:%d!!!!\n", __func__, error_code);
  1975. }
  1976. if (!error_code)
  1977. {
  1978. error_code = si2176_pollforresponse(si2176, 1, 12, rspbytebuffer, &reply);
  1979. if (error_code)
  1980. pr_info("%s: poll response error:%d!!!!\n", __func__, error_code);
  1981. rsp->tuner_status.status = &reply;
  1982. if (!error_code)
  1983. {
  1984. rsp->tuner_status.tcint = (( ( (rspbytebuffer[1] )) >> SI2176_TUNER_STATUS_RESPONSE_TCINT_LSB ) & SI2176_TUNER_STATUS_RESPONSE_TCINT_MASK );
  1985. rsp->tuner_status.rssilint = (( ( (rspbytebuffer[1] )) >> SI2176_TUNER_STATUS_RESPONSE_RSSILINT_LSB ) & SI2176_TUNER_STATUS_RESPONSE_RSSILINT_MASK );
  1986. rsp->tuner_status.rssihint = (( ( (rspbytebuffer[1] )) >> SI2176_TUNER_STATUS_RESPONSE_RSSIHINT_LSB ) & SI2176_TUNER_STATUS_RESPONSE_RSSIHINT_MASK );
  1987. rsp->tuner_status.tc = (( ( (rspbytebuffer[2] )) >> SI2176_TUNER_STATUS_RESPONSE_TC_LSB ) & SI2176_TUNER_STATUS_RESPONSE_TC_MASK );
  1988. rsp->tuner_status.rssil = (( ( (rspbytebuffer[2] )) >> SI2176_TUNER_STATUS_RESPONSE_RSSIL_LSB ) & SI2176_TUNER_STATUS_RESPONSE_RSSIL_MASK );
  1989. rsp->tuner_status.rssih = (( ( (rspbytebuffer[2] )) >> SI2176_TUNER_STATUS_RESPONSE_RSSIH_LSB ) & SI2176_TUNER_STATUS_RESPONSE_RSSIH_MASK );
  1990. rsp->tuner_status.rssi = (((( ( (rspbytebuffer[3] )) >> SI2176_TUNER_STATUS_RESPONSE_RSSI_LSB ) & SI2176_TUNER_STATUS_RESPONSE_RSSI_MASK) <<SI2176_TUNER_STATUS_RESPONSE_RSSI_SHIFT ) >>SI2176_TUNER_STATUS_RESPONSE_RSSI_SHIFT );
  1991. rsp->tuner_status.freq = (( ( (rspbytebuffer[4] ) | (rspbytebuffer[5] << 8 ) | (rspbytebuffer[6] << 16 ) | (rspbytebuffer[7] << 24 )) >> SI2176_TUNER_STATUS_RESPONSE_FREQ_LSB ) & SI2176_TUNER_STATUS_RESPONSE_FREQ_MASK );
  1992. rsp->tuner_status.mode = (( ( (rspbytebuffer[8] )) >> SI2176_TUNER_STATUS_RESPONSE_MODE_LSB ) & SI2176_TUNER_STATUS_RESPONSE_MODE_MASK );
  1993. rsp->tuner_status.vco_code = (((( ( (rspbytebuffer[10] ) | (rspbytebuffer[11] << 8 )) >> SI2176_TUNER_STATUS_RESPONSE_VCO_CODE_LSB ) & SI2176_TUNER_STATUS_RESPONSE_VCO_CODE_MASK) <<SI2176_TUNER_STATUS_RESPONSE_VCO_CODE_SHIFT ) >>SI2176_TUNER_STATUS_RESPONSE_VCO_CODE_SHIFT );
  1994. }
  1995. }
  1996. exit:
  1997. return error_code;
  1998. }
  1999. #endif /* SI2176_TUNER_STATUS_CMD */
  2000. #ifdef SI2176_TUNER_TUNE_FREQ_CMD
  2001. /*---------------------------------------------------*/
  2002. /* SI2176_TUNER_TUNE_FREQ COMMAND */
  2003. /*---------------------------------------------------*/
  2004. unsigned char si2176_tuner_tune_freq(struct i2c_client *si2176,
  2005. unsigned char mode,
  2006. unsigned long freq,
  2007. si2176_cmdreplyobj_t *rsp)
  2008. {
  2009. unsigned char error_code = 0;
  2010. unsigned char cmdbytebuffer[8];
  2011. unsigned char rspbytebuffer[1];
  2012. #ifdef DEBUG_RANGE_CHECK
  2013. if ( (mode > SI2176_TUNER_TUNE_FREQ_CMD_MODE_MAX)
  2014. || (freq > SI2176_TUNER_TUNE_FREQ_CMD_FREQ_MAX) || (freq < SI2176_TUNER_TUNE_FREQ_CMD_FREQ_MIN) )
  2015. return ERROR_SI2176_PARAMETER_OUT_OF_RANGE;
  2016. #endif /* DEBUG_RANGE_CHECK */
  2017. error_code = si2176_pollforcts(si2176);
  2018. if (error_code)
  2019. {
  2020. pr_info("%s: poll cts error:%d!!!!\n", __func__, error_code);
  2021. goto exit;
  2022. }
  2023. cmdbytebuffer[0] = SI2176_TUNER_TUNE_FREQ_CMD;
  2024. cmdbytebuffer[1] = (unsigned char) ( ( mode & SI2176_TUNER_TUNE_FREQ_CMD_MODE_MASK ) << SI2176_TUNER_TUNE_FREQ_CMD_MODE_LSB);
  2025. cmdbytebuffer[2] = (unsigned char)0x00;
  2026. cmdbytebuffer[3] = (unsigned char)0x00;
  2027. cmdbytebuffer[4] = (unsigned char) ( ( freq & SI2176_TUNER_TUNE_FREQ_CMD_FREQ_MASK ) << SI2176_TUNER_TUNE_FREQ_CMD_FREQ_LSB);
  2028. cmdbytebuffer[5] = (unsigned char) ((( freq & SI2176_TUNER_TUNE_FREQ_CMD_FREQ_MASK ) << SI2176_TUNER_TUNE_FREQ_CMD_FREQ_LSB)>>8);
  2029. cmdbytebuffer[6] = (unsigned char) ((( freq & SI2176_TUNER_TUNE_FREQ_CMD_FREQ_MASK ) << SI2176_TUNER_TUNE_FREQ_CMD_FREQ_LSB)>>16);
  2030. cmdbytebuffer[7] = (unsigned char) ((( freq & SI2176_TUNER_TUNE_FREQ_CMD_FREQ_MASK ) << SI2176_TUNER_TUNE_FREQ_CMD_FREQ_LSB)>>24);
  2031. if (si2176_writecommandbytes(si2176, 8, cmdbytebuffer) != 8)
  2032. {
  2033. error_code = ERROR_SI2176_SENDING_COMMAND;
  2034. pr_info("%s: write command byte error:%d!!!!\n", __func__, error_code);
  2035. }
  2036. if (!error_code)
  2037. {
  2038. error_code = si2176_pollforresponse(si2176, 1, 1, rspbytebuffer, &reply);
  2039. if (error_code)
  2040. pr_info("%s: poll response error:%d!!!!\n", __func__, error_code);
  2041. rsp->tuner_tune_freq.status = &reply;
  2042. }
  2043. exit:
  2044. return error_code;
  2045. }
  2046. #endif /* SI2176_TUNER_TUNE_FREQ_CMD */
  2047. /* _commands_insertion_point */
  2048. /* _send_command2_insertion_start */
  2049. /* --------------------------------------------*/
  2050. /* SEND_COMMAND2 FUNCTION */
  2051. /* --------------------------------------------*/
  2052. unsigned char si2176_sendcommand(struct i2c_client *si2176, int cmd, si2176_cmdobj_t *c, si2176_cmdreplyobj_t *rsp)
  2053. {
  2054. switch (cmd)
  2055. {
  2056. #ifdef SI2176_AGC_OVERRIDE_CMD
  2057. case SI2176_AGC_OVERRIDE_CMD:
  2058. return si2176_agc_override(si2176, c->agc_override.force_max_gain, c->agc_override.force_top_gain, rsp);
  2059. break;
  2060. #endif /* SI2176_AGC_OVERRIDE_CMD */
  2061. #ifdef SI2176_ATV_CW_TEST_CMD
  2062. case SI2176_ATV_CW_TEST_CMD:
  2063. return si2176_atv_cw_test(si2176, c->atv_cw_test.pc_lock, rsp);
  2064. break;
  2065. #endif /* SI2176_ATV_CW_TEST_CMD */
  2066. #ifdef SI2176_ATV_RESTART_CMD
  2067. case SI2176_ATV_RESTART_CMD:
  2068. return si2176_atv_restart(si2176, c->atv_restart.mode, rsp);
  2069. break;
  2070. #endif /* SI2176_ATV_RESTART_CMD */
  2071. #ifdef SI2176_ATV_STATUS_CMD
  2072. case SI2176_ATV_STATUS_CMD:
  2073. return si2176_atv_status(si2176, c->atv_status.intack, rsp);
  2074. break;
  2075. #endif /* SI2176_ATV_STATUS_CMD */
  2076. #ifdef SI2176_CONFIG_PINS_CMD
  2077. case SI2176_CONFIG_PINS_CMD:
  2078. return si2176_config_pins(si2176, c->config_pins.gpio1_mode, c->config_pins.gpio1_read, c->config_pins.gpio2_mode, c->config_pins.gpio2_read, c->config_pins.gpio3_mode, c->config_pins.gpio3_read, c->config_pins.bclk1_mode, c->config_pins.bclk1_read, c->config_pins.xout_mode, rsp);
  2079. break;
  2080. #endif /* SI2176_CONFIG_PINS_CMD */
  2081. #ifdef SI2176_EXIT_BOOTLOADER_CMD
  2082. case SI2176_EXIT_BOOTLOADER_CMD:
  2083. return si2176_exit_bootloader(si2176, c->exit_bootloader.func, c->exit_bootloader.ctsien, rsp);
  2084. break;
  2085. #endif /* SI2176_EXIT_BOOTLOADER_CMD */
  2086. #ifdef SI2176_FINE_TUNE_CMD
  2087. case SI2176_FINE_TUNE_CMD:
  2088. return si2176_fine_tune(si2176, c->fine_tune.reserved, c->fine_tune.offset_500hz, rsp);
  2089. break;
  2090. #endif /* SI2176_FINE_TUNE_CMD */
  2091. #ifdef SI2176_GET_PROPERTY_CMD
  2092. case SI2176_GET_PROPERTY_CMD:
  2093. return si2176_get_property(si2176, c->get_property.reserved, c->get_property.prop, rsp);
  2094. break;
  2095. #endif /* SI2176_GET_PROPERTY_CMD */
  2096. #ifdef SI2176_GET_REV_CMD
  2097. case SI2176_GET_REV_CMD:
  2098. return si2176_get_rev(si2176, rsp);
  2099. break;
  2100. #endif /* SI2176_GET_REV_CMD */
  2101. #ifdef SI2176_PART_INFO_CMD
  2102. case SI2176_PART_INFO_CMD:
  2103. return si2176_part_info(si2176, rsp);
  2104. break;
  2105. #endif /* SI2176_PART_INFO_CMD */
  2106. #ifdef SI2176_POWER_DOWN_CMD
  2107. case SI2176_POWER_DOWN_CMD:
  2108. return si2176_power_down(si2176, rsp);
  2109. break;
  2110. #endif /* SI2176_POWER_DOWN_CMD */
  2111. #ifdef SI2176_POWER_UP_CMD
  2112. case SI2176_POWER_UP_CMD:
  2113. return si2176_power_up(si2176, c->power_up.subcode, c->power_up.reserved1, c->power_up.reserved2, c->power_up.reserved3, c->power_up.clock_mode, c->power_up.clock_freq, c->power_up.addr_mode, c->power_up.func, c->power_up.ctsien, c->power_up.wake_up, rsp);
  2114. break;
  2115. #endif /* SI2176_POWER_UP_CMD */
  2116. #ifdef SI2176_SET_PROPERTY_CMD
  2117. case SI2176_SET_PROPERTY_CMD:
  2118. return si2176_set_property(si2176, c->set_property.reserved, c->set_property.prop, c->set_property.data, rsp);
  2119. break;
  2120. #endif /* SI2176_SET_PROPERTY_CMD */
  2121. #ifdef SI2176_STANDBY_CMD
  2122. case SI2176_STANDBY_CMD:
  2123. return si2176_standby(si2176, rsp);
  2124. break;
  2125. #endif /* SI2176_STANDBY_CMD */
  2126. #ifdef SI2176_TUNER_STATUS_CMD
  2127. case SI2176_TUNER_STATUS_CMD:
  2128. return si2176_tuner_status(si2176, c->tuner_status.intack, rsp);
  2129. break;
  2130. #endif /* SI2176_TUNER_STATUS_CMD */
  2131. #ifdef SI2176_TUNER_TUNE_FREQ_CMD
  2132. case SI2176_TUNER_TUNE_FREQ_CMD:
  2133. return si2176_tuner_tune_freq(si2176, c->tuner_tune_freq.mode, c->tuner_tune_freq.freq, rsp);
  2134. break;
  2135. #endif /* SI2176_TUNER_TUNE_FREQ_CMD */
  2136. default :
  2137. break;
  2138. }
  2139. return 0;
  2140. }
  2141. /* _send_command2_insertion_point */
  2142. /***********************************************************************************************************************
  2143. si2176_setproperty function
  2144. Use: property set function
  2145. Used to call L1_SET_PROPERTY with the property Id and data provided.
  2146. Comments: This is a way to make sure CTS is polled when setting a property
  2147. Parameter: *api the SI2176 context
  2148. Parameter: waitforcts flag to wait for a CTS before issuing the property command
  2149. Parameter: waitforresponse flag to wait for a CTS after issuing the property command
  2150. Parameter: prop the property Id
  2151. Parameter: data the property bytes
  2152. Returns: 0 if no error, an error code otherwise
  2153. ***********************************************************************************************************************/
  2154. static unsigned char si2176_setproperty(struct i2c_client *si2176, unsigned int prop, int data, si2176_cmdreplyobj_t *rsp)
  2155. {
  2156. unsigned char reserved = 0;
  2157. return si2176_set_property(si2176, reserved, prop, data, rsp);
  2158. }
  2159. /***********************************************************************************************************************
  2160. si2176_getproperty function
  2161. Use: property get function
  2162. Used to call L1_GET_PROPERTY with the property Id provided.
  2163. Comments: This is a way to make sure CTS is polled when retrieving a property
  2164. Parameter: *api the SI2176 context
  2165. Parameter: waitforcts flag to wait for a CTS before issuing the property command
  2166. Parameter: waitforresponse flag to wait for a CTS after issuing the property command
  2167. Parameter: prop the property Id
  2168. Parameter: *data a buffer to store the property bytes into
  2169. Returns: 0 if no error, an error code otherwise
  2170. ***********************************************************************************************************************/
  2171. static unsigned char si2176_getproperty(struct i2c_client *si2176, unsigned int prop, int *data, si2176_cmdreplyobj_t *rsp)
  2172. {
  2173. unsigned char reserved = 0;
  2174. unsigned char res;
  2175. res = si2176_get_property(si2176, reserved, prop, rsp);
  2176. *data = rsp->get_property.data;
  2177. return res;
  2178. }
  2179. /* _set_property2_insertion_start */
  2180. /* --------------------------------------------*/
  2181. /* SET_PROPERTY2 FUNCTION */
  2182. /* --------------------------------------------*/
  2183. unsigned char si2176_sendproperty(struct i2c_client *si2176, unsigned int prop, si2176_propobj_t *p, si2176_cmdreplyobj_t *rsp)
  2184. {
  2185. int data = 0;
  2186. switch (prop)
  2187. {
  2188. #ifdef SI2176_ATV_AFC_RANGE_PROP
  2189. case SI2176_ATV_AFC_RANGE_PROP:
  2190. data = (p->atv_afc_range.range_khz & SI2176_ATV_AFC_RANGE_PROP_RANGE_KHZ_MASK) << SI2176_ATV_AFC_RANGE_PROP_RANGE_KHZ_LSB ;
  2191. break;
  2192. #endif /* SI2176_ATV_AFC_RANGE_PROP */
  2193. #ifdef SI2176_ATV_AF_OUT_PROP
  2194. case SI2176_ATV_AF_OUT_PROP:
  2195. data = (p->atv_af_out.volume & SI2176_ATV_AF_OUT_PROP_VOLUME_MASK) << SI2176_ATV_AF_OUT_PROP_VOLUME_LSB ;
  2196. break;
  2197. #endif /* SI2176_ATV_AF_OUT_PROP */
  2198. #ifdef SI2176_ATV_AGC_SPEED_PROP
  2199. case SI2176_ATV_AGC_SPEED_PROP:
  2200. data = (p->atv_agc_speed.if_agc_speed & SI2176_ATV_AGC_SPEED_PROP_IF_AGC_SPEED_MASK) << SI2176_ATV_AGC_SPEED_PROP_IF_AGC_SPEED_LSB ;
  2201. break;
  2202. #endif /* SI2176_ATV_AGC_SPEED_PROP */
  2203. #ifdef SI2176_ATV_AUDIO_MODE_PROP
  2204. case SI2176_ATV_AUDIO_MODE_PROP:
  2205. data = (p->atv_audio_mode.audio_sys & SI2176_ATV_AUDIO_MODE_PROP_AUDIO_SYS_MASK ) << SI2176_ATV_AUDIO_MODE_PROP_AUDIO_SYS_LSB |
  2206. (p->atv_audio_mode.demod_mode & SI2176_ATV_AUDIO_MODE_PROP_DEMOD_MODE_MASK) << SI2176_ATV_AUDIO_MODE_PROP_DEMOD_MODE_LSB |
  2207. (p->atv_audio_mode.chan_bw & SI2176_ATV_AUDIO_MODE_PROP_CHAN_BW_MASK ) << SI2176_ATV_AUDIO_MODE_PROP_CHAN_BW_LSB ;
  2208. break;
  2209. #endif /* SI2176_ATV_AUDIO_MODE_PROP */
  2210. #ifdef SI2176_ATV_CVBS_OUT_PROP
  2211. case SI2176_ATV_CVBS_OUT_PROP:
  2212. data = (p->atv_cvbs_out.offset & SI2176_ATV_CVBS_OUT_PROP_OFFSET_MASK) << SI2176_ATV_CVBS_OUT_PROP_OFFSET_LSB |
  2213. (p->atv_cvbs_out.amp & SI2176_ATV_CVBS_OUT_PROP_AMP_MASK ) << SI2176_ATV_CVBS_OUT_PROP_AMP_LSB ;
  2214. break;
  2215. #endif /* SI2176_ATV_CVBS_OUT_PROP */
  2216. #ifdef SI2176_ATV_CVBS_OUT_FINE_PROP
  2217. case SI2176_ATV_CVBS_OUT_FINE_PROP:
  2218. data = (p->atv_cvbs_out_fine.offset & SI2176_ATV_CVBS_OUT_FINE_PROP_OFFSET_MASK) << SI2176_ATV_CVBS_OUT_FINE_PROP_OFFSET_LSB |
  2219. (p->atv_cvbs_out_fine.amp & SI2176_ATV_CVBS_OUT_FINE_PROP_AMP_MASK ) << SI2176_ATV_CVBS_OUT_FINE_PROP_AMP_LSB ;
  2220. break;
  2221. #endif /* SI2176_ATV_CVBS_OUT_FINE_PROP */
  2222. #ifdef SI2176_ATV_IEN_PROP
  2223. case SI2176_ATV_IEN_PROP:
  2224. data = (p->atv_ien.chlien & SI2176_ATV_IEN_PROP_CHLIEN_MASK ) << SI2176_ATV_IEN_PROP_CHLIEN_LSB |
  2225. (p->atv_ien.pclien & SI2176_ATV_IEN_PROP_PCLIEN_MASK ) << SI2176_ATV_IEN_PROP_PCLIEN_LSB |
  2226. (p->atv_ien.dlien & SI2176_ATV_IEN_PROP_DLIEN_MASK ) << SI2176_ATV_IEN_PROP_DLIEN_LSB |
  2227. (p->atv_ien.snrlien & SI2176_ATV_IEN_PROP_SNRLIEN_MASK) << SI2176_ATV_IEN_PROP_SNRLIEN_LSB |
  2228. (p->atv_ien.snrhien & SI2176_ATV_IEN_PROP_SNRHIEN_MASK) << SI2176_ATV_IEN_PROP_SNRHIEN_LSB ;
  2229. break;
  2230. #endif /* SI2176_ATV_IEN_PROP */
  2231. #ifdef SI2176_ATV_INT_SENSE_PROP
  2232. case SI2176_ATV_INT_SENSE_PROP:
  2233. data = (p->atv_int_sense.chlnegen & SI2176_ATV_INT_SENSE_PROP_CHLNEGEN_MASK ) << SI2176_ATV_INT_SENSE_PROP_CHLNEGEN_LSB |
  2234. (p->atv_int_sense.pclnegen & SI2176_ATV_INT_SENSE_PROP_PCLNEGEN_MASK ) << SI2176_ATV_INT_SENSE_PROP_PCLNEGEN_LSB |
  2235. (p->atv_int_sense.dlnegen & SI2176_ATV_INT_SENSE_PROP_DLNEGEN_MASK ) << SI2176_ATV_INT_SENSE_PROP_DLNEGEN_LSB |
  2236. (p->atv_int_sense.snrlnegen & SI2176_ATV_INT_SENSE_PROP_SNRLNEGEN_MASK) << SI2176_ATV_INT_SENSE_PROP_SNRLNEGEN_LSB |
  2237. (p->atv_int_sense.snrhnegen & SI2176_ATV_INT_SENSE_PROP_SNRHNEGEN_MASK) << SI2176_ATV_INT_SENSE_PROP_SNRHNEGEN_LSB |
  2238. (p->atv_int_sense.chlposen & SI2176_ATV_INT_SENSE_PROP_CHLPOSEN_MASK ) << SI2176_ATV_INT_SENSE_PROP_CHLPOSEN_LSB |
  2239. (p->atv_int_sense.pclposen & SI2176_ATV_INT_SENSE_PROP_PCLPOSEN_MASK ) << SI2176_ATV_INT_SENSE_PROP_PCLPOSEN_LSB |
  2240. (p->atv_int_sense.dlposen & SI2176_ATV_INT_SENSE_PROP_DLPOSEN_MASK ) << SI2176_ATV_INT_SENSE_PROP_DLPOSEN_LSB |
  2241. (p->atv_int_sense.snrlposen & SI2176_ATV_INT_SENSE_PROP_SNRLPOSEN_MASK) << SI2176_ATV_INT_SENSE_PROP_SNRLPOSEN_LSB |
  2242. (p->atv_int_sense.snrhposen & SI2176_ATV_INT_SENSE_PROP_SNRHPOSEN_MASK) << SI2176_ATV_INT_SENSE_PROP_SNRHPOSEN_LSB ;
  2243. break;
  2244. #endif /* SI2176_ATV_INT_SENSE_PROP */
  2245. #ifdef SI2176_ATV_MIN_LVL_LOCK_PROP
  2246. case SI2176_ATV_MIN_LVL_LOCK_PROP:
  2247. data = (p->atv_min_lvl_lock.thrs & SI2176_ATV_MIN_LVL_LOCK_PROP_THRS_MASK) << SI2176_ATV_MIN_LVL_LOCK_PROP_THRS_LSB ;
  2248. break;
  2249. #endif /* SI2176_ATV_MIN_LVL_LOCK_PROP */
  2250. #ifdef SI2176_ATV_RF_TOP_PROP
  2251. case SI2176_ATV_RF_TOP_PROP:
  2252. data = (p->atv_rf_top.atv_rf_top & SI2176_ATV_RF_TOP_PROP_ATV_RF_TOP_MASK) << SI2176_ATV_RF_TOP_PROP_ATV_RF_TOP_LSB ;
  2253. break;
  2254. #endif /* SI2176_ATV_RF_TOP_PROP */
  2255. #ifdef SI2176_ATV_RSQ_RSSI_THRESHOLD_PROP
  2256. case SI2176_ATV_RSQ_RSSI_THRESHOLD_PROP:
  2257. data = (p->atv_rsq_rssi_threshold.lo & SI2176_ATV_RSQ_RSSI_THRESHOLD_PROP_LO_MASK) << SI2176_ATV_RSQ_RSSI_THRESHOLD_PROP_LO_LSB |
  2258. (p->atv_rsq_rssi_threshold.hi & SI2176_ATV_RSQ_RSSI_THRESHOLD_PROP_HI_MASK) << SI2176_ATV_RSQ_RSSI_THRESHOLD_PROP_HI_LSB ;
  2259. break;
  2260. #endif /* SI2176_ATV_RSQ_RSSI_THRESHOLD_PROP */
  2261. #ifdef SI2176_ATV_RSQ_SNR_THRESHOLD_PROP
  2262. case SI2176_ATV_RSQ_SNR_THRESHOLD_PROP:
  2263. data = (p->atv_rsq_snr_threshold.lo & SI2176_ATV_RSQ_SNR_THRESHOLD_PROP_LO_MASK) << SI2176_ATV_RSQ_SNR_THRESHOLD_PROP_LO_LSB |
  2264. (p->atv_rsq_snr_threshold.hi & SI2176_ATV_RSQ_SNR_THRESHOLD_PROP_HI_MASK) << SI2176_ATV_RSQ_SNR_THRESHOLD_PROP_HI_LSB ;
  2265. break;
  2266. #endif /* SI2176_ATV_RSQ_SNR_THRESHOLD_PROP */
  2267. #ifdef SI2176_ATV_SIF_OUT_PROP
  2268. case SI2176_ATV_SIF_OUT_PROP:
  2269. data = (p->atv_sif_out.offset & SI2176_ATV_SIF_OUT_PROP_OFFSET_MASK) << SI2176_ATV_SIF_OUT_PROP_OFFSET_LSB |
  2270. (p->atv_sif_out.amp & SI2176_ATV_SIF_OUT_PROP_AMP_MASK ) << SI2176_ATV_SIF_OUT_PROP_AMP_LSB ;
  2271. break;
  2272. #endif /* SI2176_ATV_SIF_OUT_PROP */
  2273. #ifdef SI2176_ATV_SOUND_AGC_LIMIT_PROP
  2274. case SI2176_ATV_SOUND_AGC_LIMIT_PROP:
  2275. data = (p->atv_sound_agc_limit.max_gain & SI2176_ATV_SOUND_AGC_LIMIT_PROP_MAX_GAIN_MASK) << SI2176_ATV_SOUND_AGC_LIMIT_PROP_MAX_GAIN_LSB |
  2276. (p->atv_sound_agc_limit.min_gain & SI2176_ATV_SOUND_AGC_LIMIT_PROP_MIN_GAIN_MASK) << SI2176_ATV_SOUND_AGC_LIMIT_PROP_MIN_GAIN_LSB ;
  2277. break;
  2278. #endif /* SI2176_ATV_SOUND_AGC_LIMIT_PROP */
  2279. #ifdef SI2176_ATV_VIDEO_EQUALIZER_PROP
  2280. case SI2176_ATV_VIDEO_EQUALIZER_PROP:
  2281. data = (p->atv_video_equalizer.slope & SI2176_ATV_VIDEO_EQUALIZER_PROP_SLOPE_MASK) << SI2176_ATV_VIDEO_EQUALIZER_PROP_SLOPE_LSB ;
  2282. break;
  2283. #endif /* SI2176_ATV_VIDEO_EQUALIZER_PROP */
  2284. #ifdef SI2176_ATV_VIDEO_MODE_PROP
  2285. case SI2176_ATV_VIDEO_MODE_PROP:
  2286. data = (p->atv_video_mode.video_sys & SI2176_ATV_VIDEO_MODE_PROP_VIDEO_SYS_MASK ) << SI2176_ATV_VIDEO_MODE_PROP_VIDEO_SYS_LSB |
  2287. (p->atv_video_mode.color & SI2176_ATV_VIDEO_MODE_PROP_COLOR_MASK ) << SI2176_ATV_VIDEO_MODE_PROP_COLOR_LSB |
  2288. (p->atv_video_mode.trans & SI2176_ATV_VIDEO_MODE_PROP_TRANS_MASK ) << SI2176_ATV_VIDEO_MODE_PROP_TRANS_LSB |
  2289. (p->atv_video_mode.invert_signal & SI2176_ATV_VIDEO_MODE_PROP_INVERT_SIGNAL_MASK ) << SI2176_ATV_VIDEO_MODE_PROP_INVERT_SIGNAL_LSB ;
  2290. break;
  2291. #endif /* SI2176_ATV_VIDEO_MODE_PROP */
  2292. #ifdef SI2176_ATV_VSNR_CAP_PROP
  2293. case SI2176_ATV_VSNR_CAP_PROP:
  2294. data = (p->atv_vsnr_cap.atv_vsnr_cap & SI2176_ATV_VSNR_CAP_PROP_ATV_VSNR_CAP_MASK) << SI2176_ATV_VSNR_CAP_PROP_ATV_VSNR_CAP_LSB ;
  2295. break;
  2296. #endif /* SI2176_ATV_VSNR_CAP_PROP */
  2297. #ifdef SI2176_ATV_VSYNC_TRACKING_PROP
  2298. case SI2176_ATV_VSYNC_TRACKING_PROP:
  2299. data = (p->atv_vsync_tracking.min_pulses_to_lock & SI2176_ATV_VSYNC_TRACKING_PROP_MIN_PULSES_TO_LOCK_MASK ) << SI2176_ATV_VSYNC_TRACKING_PROP_MIN_PULSES_TO_LOCK_LSB |
  2300. (p->atv_vsync_tracking.min_fields_to_unlock & SI2176_ATV_VSYNC_TRACKING_PROP_MIN_FIELDS_TO_UNLOCK_MASK) << SI2176_ATV_VSYNC_TRACKING_PROP_MIN_FIELDS_TO_UNLOCK_LSB ;
  2301. break;
  2302. #endif /* SI2176_ATV_VSYNC_TRACKING_PROP */
  2303. #ifdef SI2176_CRYSTAL_TRIM_PROP
  2304. case SI2176_CRYSTAL_TRIM_PROP:
  2305. data = (p->crystal_trim.xo_cap & SI2176_CRYSTAL_TRIM_PROP_XO_CAP_MASK) << SI2176_CRYSTAL_TRIM_PROP_XO_CAP_LSB ;
  2306. break;
  2307. #endif /* SI2176_CRYSTAL_TRIM_PROP */
  2308. #ifdef SI2176_DTV_LIF_FREQ_PROP
  2309. case SI2176_DTV_LIF_FREQ_PROP:
  2310. data = (p->dtv_lif_freq.offset & SI2176_DTV_LIF_FREQ_PROP_OFFSET_MASK) << SI2176_DTV_LIF_FREQ_PROP_OFFSET_LSB ;
  2311. break;
  2312. #endif /* SI2176_DTV_LIF_FREQ_PROP */
  2313. #ifdef SI2176_DTV_LIF_OUT_PROP
  2314. case SI2176_DTV_LIF_OUT_PROP:
  2315. data = (p->dtv_lif_out.offset & SI2176_DTV_LIF_OUT_PROP_OFFSET_MASK) << SI2176_DTV_LIF_OUT_PROP_OFFSET_LSB |
  2316. (p->dtv_lif_out.amp & SI2176_DTV_LIF_OUT_PROP_AMP_MASK ) << SI2176_DTV_LIF_OUT_PROP_AMP_LSB ;
  2317. break;
  2318. #endif /* SI2176_DTV_LIF_OUT_PROP */
  2319. #ifdef SI2176_DTV_MODE_PROP
  2320. case SI2176_DTV_MODE_PROP:
  2321. data = (p->dtv_mode.bw & SI2176_DTV_MODE_PROP_BW_MASK ) << SI2176_DTV_MODE_PROP_BW_LSB |
  2322. (p->dtv_mode.modulation & SI2176_DTV_MODE_PROP_MODULATION_MASK ) << SI2176_DTV_MODE_PROP_MODULATION_LSB |
  2323. (p->dtv_mode.invert_spectrum & SI2176_DTV_MODE_PROP_INVERT_SPECTRUM_MASK) << SI2176_DTV_MODE_PROP_INVERT_SPECTRUM_LSB ;
  2324. break;
  2325. #endif /* SI2176_DTV_MODE_PROP */
  2326. #ifdef SI2176_DTV_RF_TOP_PROP
  2327. case SI2176_DTV_RF_TOP_PROP:
  2328. data = (p->dtv_rf_top.dtv_rf_top & SI2176_DTV_RF_TOP_PROP_DTV_RF_TOP_MASK) << SI2176_DTV_RF_TOP_PROP_DTV_RF_TOP_LSB ;
  2329. break;
  2330. #endif /* SI2176_DTV_RF_TOP_PROP */
  2331. #ifdef SI2176_DTV_RSQ_RSSI_THRESHOLD_PROP
  2332. case SI2176_DTV_RSQ_RSSI_THRESHOLD_PROP:
  2333. data = (p->dtv_rsq_rssi_threshold.lo & SI2176_DTV_RSQ_RSSI_THRESHOLD_PROP_LO_MASK) << SI2176_DTV_RSQ_RSSI_THRESHOLD_PROP_LO_LSB |
  2334. (p->dtv_rsq_rssi_threshold.hi & SI2176_DTV_RSQ_RSSI_THRESHOLD_PROP_HI_MASK) << SI2176_DTV_RSQ_RSSI_THRESHOLD_PROP_HI_LSB ;
  2335. break;
  2336. #endif /* SI2176_DTV_RSQ_RSSI_THRESHOLD_PROP */
  2337. #ifdef SI2176_MASTER_IEN_PROP
  2338. case SI2176_MASTER_IEN_PROP:
  2339. data = (p->master_ien.tunien & SI2176_MASTER_IEN_PROP_TUNIEN_MASK) << SI2176_MASTER_IEN_PROP_TUNIEN_LSB |
  2340. (p->master_ien.atvien & SI2176_MASTER_IEN_PROP_ATVIEN_MASK) << SI2176_MASTER_IEN_PROP_ATVIEN_LSB |
  2341. (p->master_ien.dtvien & SI2176_MASTER_IEN_PROP_DTVIEN_MASK) << SI2176_MASTER_IEN_PROP_DTVIEN_LSB |
  2342. (p->master_ien.errien & SI2176_MASTER_IEN_PROP_ERRIEN_MASK) << SI2176_MASTER_IEN_PROP_ERRIEN_LSB |
  2343. (p->master_ien.ctsien & SI2176_MASTER_IEN_PROP_CTSIEN_MASK) << SI2176_MASTER_IEN_PROP_CTSIEN_LSB ;
  2344. break;
  2345. #endif /* SI2176_MASTER_IEN_PROP */
  2346. #ifdef SI2176_TUNER_BLOCKED_VCO_PROP
  2347. case SI2176_TUNER_BLOCKED_VCO_PROP:
  2348. data = (p->tuner_blocked_vco.vco_code & SI2176_TUNER_BLOCKED_VCO_PROP_VCO_CODE_MASK) << SI2176_TUNER_BLOCKED_VCO_PROP_VCO_CODE_LSB ;
  2349. break;
  2350. #endif /* SI2176_TUNER_BLOCKED_VCO_PROP */
  2351. #ifdef SI2176_TUNER_IEN_PROP
  2352. case SI2176_TUNER_IEN_PROP:
  2353. data = (p->tuner_ien.tcien & SI2176_TUNER_IEN_PROP_TCIEN_MASK ) << SI2176_TUNER_IEN_PROP_TCIEN_LSB |
  2354. (p->tuner_ien.rssilien & SI2176_TUNER_IEN_PROP_RSSILIEN_MASK) << SI2176_TUNER_IEN_PROP_RSSILIEN_LSB |
  2355. (p->tuner_ien.rssihien & SI2176_TUNER_IEN_PROP_RSSIHIEN_MASK) << SI2176_TUNER_IEN_PROP_RSSIHIEN_LSB ;
  2356. break;
  2357. #endif /* SI2176_TUNER_IEN_PROP */
  2358. #ifdef SI2176_TUNER_INT_SENSE_PROP
  2359. case SI2176_TUNER_INT_SENSE_PROP:
  2360. data = (p->tuner_int_sense.tcnegen & SI2176_TUNER_INT_SENSE_PROP_TCNEGEN_MASK ) << SI2176_TUNER_INT_SENSE_PROP_TCNEGEN_LSB |
  2361. (p->tuner_int_sense.rssilnegen & SI2176_TUNER_INT_SENSE_PROP_RSSILNEGEN_MASK) << SI2176_TUNER_INT_SENSE_PROP_RSSILNEGEN_LSB |
  2362. (p->tuner_int_sense.rssihnegen & SI2176_TUNER_INT_SENSE_PROP_RSSIHNEGEN_MASK) << SI2176_TUNER_INT_SENSE_PROP_RSSIHNEGEN_LSB |
  2363. (p->tuner_int_sense.tcposen & SI2176_TUNER_INT_SENSE_PROP_TCPOSEN_MASK ) << SI2176_TUNER_INT_SENSE_PROP_TCPOSEN_LSB |
  2364. (p->tuner_int_sense.rssilposen & SI2176_TUNER_INT_SENSE_PROP_RSSILPOSEN_MASK) << SI2176_TUNER_INT_SENSE_PROP_RSSILPOSEN_LSB |
  2365. (p->tuner_int_sense.rssihposen & SI2176_TUNER_INT_SENSE_PROP_RSSIHPOSEN_MASK) << SI2176_TUNER_INT_SENSE_PROP_RSSIHPOSEN_LSB ;
  2366. break;
  2367. #endif /* SI2176_TUNER_INT_SENSE_PROP */
  2368. #ifdef SI2176_TUNER_LO_INJECTION_PROP
  2369. case SI2176_TUNER_LO_INJECTION_PROP:
  2370. data = (p->tuner_lo_injection.band_1 & SI2176_TUNER_LO_INJECTION_PROP_BAND_1_MASK) << SI2176_TUNER_LO_INJECTION_PROP_BAND_1_LSB |
  2371. (p->tuner_lo_injection.band_2 & SI2176_TUNER_LO_INJECTION_PROP_BAND_2_MASK) << SI2176_TUNER_LO_INJECTION_PROP_BAND_2_LSB |
  2372. (p->tuner_lo_injection.band_3 & SI2176_TUNER_LO_INJECTION_PROP_BAND_3_MASK) << SI2176_TUNER_LO_INJECTION_PROP_BAND_3_LSB |
  2373. (p->tuner_lo_injection.band_4 & SI2176_TUNER_LO_INJECTION_PROP_BAND_4_MASK) << SI2176_TUNER_LO_INJECTION_PROP_BAND_4_LSB |
  2374. (p->tuner_lo_injection.band_5 & SI2176_TUNER_LO_INJECTION_PROP_BAND_5_MASK) << SI2176_TUNER_LO_INJECTION_PROP_BAND_5_LSB ;
  2375. break;
  2376. #endif /* SI2176_TUNER_LO_INJECTION_PROP */
  2377. default :
  2378. break;
  2379. }
  2380. return si2176_setproperty(si2176, prop , data, rsp);
  2381. }
  2382. /* _set_property2_insertion_point */
  2383. /* _get_property2_insertion_start */
  2384. /* --------------------------------------------*/
  2385. /* GET_PROPERTY2 FUNCTION */
  2386. /* --------------------------------------------*/
  2387. unsigned char si2176_receiveproperty(struct i2c_client *si2176, unsigned int prop, si2176_propobj_t *p, si2176_cmdreplyobj_t *rsp)
  2388. {
  2389. int data, res;
  2390. res = si2176_getproperty(si2176, prop, &data, rsp);
  2391. if (res!=NO_SI2176_ERROR) return res;
  2392. switch (prop)
  2393. {
  2394. #ifdef SI2176_ATV_AFC_RANGE_PROP
  2395. case SI2176_ATV_AFC_RANGE_PROP:
  2396. p->atv_afc_range.range_khz = (data >> SI2176_ATV_AFC_RANGE_PROP_RANGE_KHZ_LSB) & SI2176_ATV_AFC_RANGE_PROP_RANGE_KHZ_MASK;
  2397. break;
  2398. #endif /* SI2176_ATV_AFC_RANGE_PROP */
  2399. #ifdef SI2176_ATV_AF_OUT_PROP
  2400. case SI2176_ATV_AF_OUT_PROP:
  2401. p->atv_af_out.volume = (data >> SI2176_ATV_AF_OUT_PROP_VOLUME_LSB) & SI2176_ATV_AF_OUT_PROP_VOLUME_MASK;
  2402. break;
  2403. #endif /* SI2176_ATV_AF_OUT_PROP */
  2404. #ifdef SI2176_ATV_AGC_SPEED_PROP
  2405. case SI2176_ATV_AGC_SPEED_PROP:
  2406. p->atv_agc_speed.if_agc_speed = (data >> SI2176_ATV_AGC_SPEED_PROP_IF_AGC_SPEED_LSB) & SI2176_ATV_AGC_SPEED_PROP_IF_AGC_SPEED_MASK;
  2407. break;
  2408. #endif /* SI2176_ATV_AGC_SPEED_PROP */
  2409. #ifdef SI2176_ATV_AUDIO_MODE_PROP
  2410. case SI2176_ATV_AUDIO_MODE_PROP:
  2411. p->atv_audio_mode.audio_sys = (data >> SI2176_ATV_AUDIO_MODE_PROP_AUDIO_SYS_LSB ) & SI2176_ATV_AUDIO_MODE_PROP_AUDIO_SYS_MASK;
  2412. p->atv_audio_mode.demod_mode = (data >> SI2176_ATV_AUDIO_MODE_PROP_DEMOD_MODE_LSB) & SI2176_ATV_AUDIO_MODE_PROP_DEMOD_MODE_MASK;
  2413. p->atv_audio_mode.chan_bw = (data >> SI2176_ATV_AUDIO_MODE_PROP_CHAN_BW_LSB ) & SI2176_ATV_AUDIO_MODE_PROP_CHAN_BW_MASK;
  2414. break;
  2415. #endif /* SI2176_ATV_AUDIO_MODE_PROP */
  2416. #ifdef SI2176_ATV_CVBS_OUT_PROP
  2417. case SI2176_ATV_CVBS_OUT_PROP:
  2418. p->atv_cvbs_out.offset = (data >> SI2176_ATV_CVBS_OUT_PROP_OFFSET_LSB) & SI2176_ATV_CVBS_OUT_PROP_OFFSET_MASK;
  2419. p->atv_cvbs_out.amp = (data >> SI2176_ATV_CVBS_OUT_PROP_AMP_LSB ) & SI2176_ATV_CVBS_OUT_PROP_AMP_MASK;
  2420. break;
  2421. #endif /* SI2176_ATV_CVBS_OUT_PROP */
  2422. #ifdef SI2176_ATV_CVBS_OUT_FINE_PROP
  2423. case SI2176_ATV_CVBS_OUT_FINE_PROP:
  2424. p->atv_cvbs_out_fine.offset = (data >> SI2176_ATV_CVBS_OUT_FINE_PROP_OFFSET_LSB) & SI2176_ATV_CVBS_OUT_FINE_PROP_OFFSET_MASK;
  2425. p->atv_cvbs_out_fine.amp = (data >> SI2176_ATV_CVBS_OUT_FINE_PROP_AMP_LSB ) & SI2176_ATV_CVBS_OUT_FINE_PROP_AMP_MASK;
  2426. break;
  2427. #endif /* SI2176_ATV_CVBS_OUT_FINE_PROP */
  2428. #ifdef SI2176_ATV_IEN_PROP
  2429. case SI2176_ATV_IEN_PROP:
  2430. p->atv_ien.chlien = (data >> SI2176_ATV_IEN_PROP_CHLIEN_LSB ) & SI2176_ATV_IEN_PROP_CHLIEN_MASK;
  2431. p->atv_ien.pclien = (data >> SI2176_ATV_IEN_PROP_PCLIEN_LSB ) & SI2176_ATV_IEN_PROP_PCLIEN_MASK;
  2432. p->atv_ien.dlien = (data >> SI2176_ATV_IEN_PROP_DLIEN_LSB ) & SI2176_ATV_IEN_PROP_DLIEN_MASK;
  2433. p->atv_ien.snrlien = (data >> SI2176_ATV_IEN_PROP_SNRLIEN_LSB) & SI2176_ATV_IEN_PROP_SNRLIEN_MASK;
  2434. p->atv_ien.snrhien = (data >> SI2176_ATV_IEN_PROP_SNRHIEN_LSB) & SI2176_ATV_IEN_PROP_SNRHIEN_MASK;
  2435. break;
  2436. #endif /* SI2176_ATV_IEN_PROP */
  2437. #ifdef SI2176_ATV_INT_SENSE_PROP
  2438. case SI2176_ATV_INT_SENSE_PROP:
  2439. p->atv_int_sense.chlnegen = (data >> SI2176_ATV_INT_SENSE_PROP_CHLNEGEN_LSB ) & SI2176_ATV_INT_SENSE_PROP_CHLNEGEN_MASK;
  2440. p->atv_int_sense.pclnegen = (data >> SI2176_ATV_INT_SENSE_PROP_PCLNEGEN_LSB ) & SI2176_ATV_INT_SENSE_PROP_PCLNEGEN_MASK;
  2441. p->atv_int_sense.dlnegen = (data >> SI2176_ATV_INT_SENSE_PROP_DLNEGEN_LSB ) & SI2176_ATV_INT_SENSE_PROP_DLNEGEN_MASK;
  2442. p->atv_int_sense.snrlnegen = (data >> SI2176_ATV_INT_SENSE_PROP_SNRLNEGEN_LSB) & SI2176_ATV_INT_SENSE_PROP_SNRLNEGEN_MASK;
  2443. p->atv_int_sense.snrhnegen = (data >> SI2176_ATV_INT_SENSE_PROP_SNRHNEGEN_LSB) & SI2176_ATV_INT_SENSE_PROP_SNRHNEGEN_MASK;
  2444. p->atv_int_sense.chlposen = (data >> SI2176_ATV_INT_SENSE_PROP_CHLPOSEN_LSB ) & SI2176_ATV_INT_SENSE_PROP_CHLPOSEN_MASK;
  2445. p->atv_int_sense.pclposen = (data >> SI2176_ATV_INT_SENSE_PROP_PCLPOSEN_LSB ) & SI2176_ATV_INT_SENSE_PROP_PCLPOSEN_MASK;
  2446. p->atv_int_sense.dlposen = (data >> SI2176_ATV_INT_SENSE_PROP_DLPOSEN_LSB ) & SI2176_ATV_INT_SENSE_PROP_DLPOSEN_MASK;
  2447. p->atv_int_sense.snrlposen = (data >> SI2176_ATV_INT_SENSE_PROP_SNRLPOSEN_LSB) & SI2176_ATV_INT_SENSE_PROP_SNRLPOSEN_MASK;
  2448. p->atv_int_sense.snrhposen = (data >> SI2176_ATV_INT_SENSE_PROP_SNRHPOSEN_LSB) & SI2176_ATV_INT_SENSE_PROP_SNRHPOSEN_MASK;
  2449. break;
  2450. #endif /* SI2176_ATV_INT_SENSE_PROP */
  2451. #ifdef SI2176_ATV_MIN_LVL_LOCK_PROP
  2452. case SI2176_ATV_MIN_LVL_LOCK_PROP:
  2453. p->atv_min_lvl_lock.thrs = (data >> SI2176_ATV_MIN_LVL_LOCK_PROP_THRS_LSB) & SI2176_ATV_MIN_LVL_LOCK_PROP_THRS_MASK;
  2454. break;
  2455. #endif /* SI2176_ATV_MIN_LVL_LOCK_PROP */
  2456. #ifdef SI2176_ATV_RF_TOP_PROP
  2457. case SI2176_ATV_RF_TOP_PROP:
  2458. p->atv_rf_top.atv_rf_top = (data >> SI2176_ATV_RF_TOP_PROP_ATV_RF_TOP_LSB) & SI2176_ATV_RF_TOP_PROP_ATV_RF_TOP_MASK;
  2459. break;
  2460. #endif /* SI2176_ATV_RF_TOP_PROP */
  2461. #ifdef SI2176_ATV_RSQ_RSSI_THRESHOLD_PROP
  2462. case SI2176_ATV_RSQ_RSSI_THRESHOLD_PROP:
  2463. p->atv_rsq_rssi_threshold.lo = (data >> SI2176_ATV_RSQ_RSSI_THRESHOLD_PROP_LO_LSB) & SI2176_ATV_RSQ_RSSI_THRESHOLD_PROP_LO_MASK;
  2464. p->atv_rsq_rssi_threshold.hi = (data >> SI2176_ATV_RSQ_RSSI_THRESHOLD_PROP_HI_LSB) & SI2176_ATV_RSQ_RSSI_THRESHOLD_PROP_HI_MASK;
  2465. break;
  2466. #endif /* SI2176_ATV_RSQ_RSSI_THRESHOLD_PROP */
  2467. #ifdef SI2176_ATV_RSQ_SNR_THRESHOLD_PROP
  2468. case SI2176_ATV_RSQ_SNR_THRESHOLD_PROP:
  2469. p->atv_rsq_snr_threshold.lo = (data >> SI2176_ATV_RSQ_SNR_THRESHOLD_PROP_LO_LSB) & SI2176_ATV_RSQ_SNR_THRESHOLD_PROP_LO_MASK;
  2470. p->atv_rsq_snr_threshold.hi = (data >> SI2176_ATV_RSQ_SNR_THRESHOLD_PROP_HI_LSB) & SI2176_ATV_RSQ_SNR_THRESHOLD_PROP_HI_MASK;
  2471. break;
  2472. #endif /* SI2176_ATV_RSQ_SNR_THRESHOLD_PROP */
  2473. #ifdef SI2176_ATV_SIF_OUT_PROP
  2474. case SI2176_ATV_SIF_OUT_PROP:
  2475. p->atv_sif_out.offset = (data >> SI2176_ATV_SIF_OUT_PROP_OFFSET_LSB) & SI2176_ATV_SIF_OUT_PROP_OFFSET_MASK;
  2476. p->atv_sif_out.amp = (data >> SI2176_ATV_SIF_OUT_PROP_AMP_LSB ) & SI2176_ATV_SIF_OUT_PROP_AMP_MASK;
  2477. break;
  2478. #endif /* SI2176_ATV_SIF_OUT_PROP */
  2479. #ifdef SI2176_ATV_SOUND_AGC_LIMIT_PROP
  2480. case SI2176_ATV_SOUND_AGC_LIMIT_PROP:
  2481. p->atv_sound_agc_limit.max_gain = (data >> SI2176_ATV_SOUND_AGC_LIMIT_PROP_MAX_GAIN_LSB) & SI2176_ATV_SOUND_AGC_LIMIT_PROP_MAX_GAIN_MASK;
  2482. p->atv_sound_agc_limit.min_gain = (data >> SI2176_ATV_SOUND_AGC_LIMIT_PROP_MIN_GAIN_LSB) & SI2176_ATV_SOUND_AGC_LIMIT_PROP_MIN_GAIN_MASK;
  2483. break;
  2484. #endif /* SI2176_ATV_SOUND_AGC_LIMIT_PROP */
  2485. #ifdef SI2176_ATV_VIDEO_EQUALIZER_PROP
  2486. case SI2176_ATV_VIDEO_EQUALIZER_PROP:
  2487. p->atv_video_equalizer.slope = (data >> SI2176_ATV_VIDEO_EQUALIZER_PROP_SLOPE_LSB) & SI2176_ATV_VIDEO_EQUALIZER_PROP_SLOPE_MASK;
  2488. break;
  2489. #endif /* SI2176_ATV_VIDEO_EQUALIZER_PROP */
  2490. #ifdef SI2176_ATV_VIDEO_MODE_PROP
  2491. case SI2176_ATV_VIDEO_MODE_PROP:
  2492. p->atv_video_mode.video_sys = (data >> SI2176_ATV_VIDEO_MODE_PROP_VIDEO_SYS_LSB ) & SI2176_ATV_VIDEO_MODE_PROP_VIDEO_SYS_MASK;
  2493. p->atv_video_mode.color = (data >> SI2176_ATV_VIDEO_MODE_PROP_COLOR_LSB ) & SI2176_ATV_VIDEO_MODE_PROP_COLOR_MASK;
  2494. p->atv_video_mode.trans = (data >> SI2176_ATV_VIDEO_MODE_PROP_TRANS_LSB ) & SI2176_ATV_VIDEO_MODE_PROP_TRANS_MASK;
  2495. p->atv_video_mode.invert_signal = (data >> SI2176_ATV_VIDEO_MODE_PROP_INVERT_SIGNAL_LSB ) & SI2176_ATV_VIDEO_MODE_PROP_INVERT_SIGNAL_MASK;
  2496. break;
  2497. #endif /* SI2176_ATV_VIDEO_MODE_PROP */
  2498. #ifdef SI2176_ATV_VSNR_CAP_PROP
  2499. case SI2176_ATV_VSNR_CAP_PROP:
  2500. p->atv_vsnr_cap.atv_vsnr_cap = (data >> SI2176_ATV_VSNR_CAP_PROP_ATV_VSNR_CAP_LSB) & SI2176_ATV_VSNR_CAP_PROP_ATV_VSNR_CAP_MASK;
  2501. break;
  2502. #endif /* SI2176_ATV_VSNR_CAP_PROP */
  2503. #ifdef SI2176_ATV_VSYNC_TRACKING_PROP
  2504. case SI2176_ATV_VSYNC_TRACKING_PROP:
  2505. p->atv_vsync_tracking.min_pulses_to_lock = (data >> SI2176_ATV_VSYNC_TRACKING_PROP_MIN_PULSES_TO_LOCK_LSB ) & SI2176_ATV_VSYNC_TRACKING_PROP_MIN_PULSES_TO_LOCK_MASK;
  2506. p->atv_vsync_tracking.min_fields_to_unlock = (data >> SI2176_ATV_VSYNC_TRACKING_PROP_MIN_FIELDS_TO_UNLOCK_LSB) & SI2176_ATV_VSYNC_TRACKING_PROP_MIN_FIELDS_TO_UNLOCK_MASK;
  2507. break;
  2508. #endif /* SI2176_ATV_VSYNC_TRACKING_PROP */
  2509. #ifdef SI2176_CRYSTAL_TRIM_PROP
  2510. case SI2176_CRYSTAL_TRIM_PROP:
  2511. p->crystal_trim.xo_cap = (data >> SI2176_CRYSTAL_TRIM_PROP_XO_CAP_LSB) & SI2176_CRYSTAL_TRIM_PROP_XO_CAP_MASK;
  2512. break;
  2513. #endif /* SI2176_CRYSTAL_TRIM_PROP */
  2514. #ifdef SI2176_MASTER_IEN_PROP
  2515. case SI2176_MASTER_IEN_PROP:
  2516. p->master_ien.tunien = (data >> SI2176_MASTER_IEN_PROP_TUNIEN_LSB) & SI2176_MASTER_IEN_PROP_TUNIEN_MASK;
  2517. p->master_ien.atvien = (data >> SI2176_MASTER_IEN_PROP_ATVIEN_LSB) & SI2176_MASTER_IEN_PROP_ATVIEN_MASK;
  2518. p->master_ien.dtvien = (data >> SI2176_MASTER_IEN_PROP_DTVIEN_LSB) & SI2176_MASTER_IEN_PROP_DTVIEN_MASK;
  2519. p->master_ien.errien = (data >> SI2176_MASTER_IEN_PROP_ERRIEN_LSB) & SI2176_MASTER_IEN_PROP_ERRIEN_MASK;
  2520. p->master_ien.ctsien = (data >> SI2176_MASTER_IEN_PROP_CTSIEN_LSB) & SI2176_MASTER_IEN_PROP_CTSIEN_MASK;
  2521. break;
  2522. #endif /* SI2176_MASTER_IEN_PROP */
  2523. #ifdef SI2176_TUNER_BLOCKED_VCO_PROP
  2524. case SI2176_TUNER_BLOCKED_VCO_PROP:
  2525. p->tuner_blocked_vco.vco_code = (data >> SI2176_TUNER_BLOCKED_VCO_PROP_VCO_CODE_LSB) & SI2176_TUNER_BLOCKED_VCO_PROP_VCO_CODE_MASK;
  2526. break;
  2527. #endif /* SI2176_TUNER_BLOCKED_VCO_PROP */
  2528. #ifdef SI2176_TUNER_IEN_PROP
  2529. case SI2176_TUNER_IEN_PROP:
  2530. p->tuner_ien.tcien = (data >> SI2176_TUNER_IEN_PROP_TCIEN_LSB ) & SI2176_TUNER_IEN_PROP_TCIEN_MASK;
  2531. p->tuner_ien.rssilien = (data >> SI2176_TUNER_IEN_PROP_RSSILIEN_LSB) & SI2176_TUNER_IEN_PROP_RSSILIEN_MASK;
  2532. p->tuner_ien.rssihien = (data >> SI2176_TUNER_IEN_PROP_RSSIHIEN_LSB) & SI2176_TUNER_IEN_PROP_RSSIHIEN_MASK;
  2533. break;
  2534. #endif /* SI2176_TUNER_IEN_PROP */
  2535. #ifdef SI2176_TUNER_INT_SENSE_PROP
  2536. case SI2176_TUNER_INT_SENSE_PROP:
  2537. p->tuner_int_sense.tcnegen = (data >> SI2176_TUNER_INT_SENSE_PROP_TCNEGEN_LSB ) & SI2176_TUNER_INT_SENSE_PROP_TCNEGEN_MASK;
  2538. p->tuner_int_sense.rssilnegen = (data >> SI2176_TUNER_INT_SENSE_PROP_RSSILNEGEN_LSB) & SI2176_TUNER_INT_SENSE_PROP_RSSILNEGEN_MASK;
  2539. p->tuner_int_sense.rssihnegen = (data >> SI2176_TUNER_INT_SENSE_PROP_RSSIHNEGEN_LSB) & SI2176_TUNER_INT_SENSE_PROP_RSSIHNEGEN_MASK;
  2540. p->tuner_int_sense.tcposen = (data >> SI2176_TUNER_INT_SENSE_PROP_TCPOSEN_LSB ) & SI2176_TUNER_INT_SENSE_PROP_TCPOSEN_MASK;
  2541. p->tuner_int_sense.rssilposen = (data >> SI2176_TUNER_INT_SENSE_PROP_RSSILPOSEN_LSB) & SI2176_TUNER_INT_SENSE_PROP_RSSILPOSEN_MASK;
  2542. p->tuner_int_sense.rssihposen = (data >> SI2176_TUNER_INT_SENSE_PROP_RSSIHPOSEN_LSB) & SI2176_TUNER_INT_SENSE_PROP_RSSIHPOSEN_MASK;
  2543. break;
  2544. #endif /* SI2176_TUNER_INT_SENSE_PROP */
  2545. #ifdef SI2176_TUNER_LO_INJECTION_PROP
  2546. case SI2176_TUNER_LO_INJECTION_PROP:
  2547. p->tuner_lo_injection.band_1 = (data >> SI2176_TUNER_LO_INJECTION_PROP_BAND_1_LSB) & SI2176_TUNER_LO_INJECTION_PROP_BAND_1_MASK;
  2548. p->tuner_lo_injection.band_2 = (data >> SI2176_TUNER_LO_INJECTION_PROP_BAND_2_LSB) & SI2176_TUNER_LO_INJECTION_PROP_BAND_2_MASK;
  2549. p->tuner_lo_injection.band_3 = (data >> SI2176_TUNER_LO_INJECTION_PROP_BAND_3_LSB) & SI2176_TUNER_LO_INJECTION_PROP_BAND_3_MASK;
  2550. p->tuner_lo_injection.band_4 = (data >> SI2176_TUNER_LO_INJECTION_PROP_BAND_4_LSB) & SI2176_TUNER_LO_INJECTION_PROP_BAND_4_MASK;
  2551. p->tuner_lo_injection.band_5 = (data >> SI2176_TUNER_LO_INJECTION_PROP_BAND_5_LSB) & SI2176_TUNER_LO_INJECTION_PROP_BAND_5_MASK;
  2552. break;
  2553. #endif /* SI2176_TUNER_LO_INJECTION_PROP */
  2554. default :
  2555. break;
  2556. }
  2557. return res;
  2558. }
  2559. /************************************************************************************************************************
  2560. NAME: si2176_SetupATVDefaults
  2561. DESCRIPTION: Setup si2176 ATV startup configuration
  2562. This is a list of all the ATV configuration properties. Depending on your application, only a subset may be required.
  2563. The properties are stored in the global property structure 'prop'. The function ATVConfig(..) must be called
  2564. after any properties are modified.
  2565. Parameter: none
  2566. Returns: 0 if successful
  2567. Programming Guide Reference: Flowchart A.5 (ATV Setup flowchart)
  2568. ************************************************************************************************************************/
  2569. static int si2176_setupatvdefaults(si2176_propobj_t *prop)
  2570. {
  2571. prop->atv_cvbs_out.amp = 90;
  2572. prop->atv_cvbs_out.offset = 25;
  2573. prop->atv_sif_out.amp = 60;
  2574. prop->atv_sif_out.offset = 135;
  2575. prop->atv_sound_agc_limit.min_gain = -84;
  2576. prop->atv_sound_agc_limit.max_gain = 72;
  2577. prop->atv_afc_range.range_khz = 1000;
  2578. prop->atv_rf_top.atv_rf_top = SI2176_ATV_RF_TOP_PROP_ATV_RF_TOP_AUTO;
  2579. prop->atv_vsync_tracking.min_pulses_to_lock = 4;
  2580. prop->atv_vsync_tracking.min_fields_to_unlock = 16;
  2581. prop->atv_vsnr_cap.atv_vsnr_cap = 0;
  2582. prop->atv_cvbs_out_fine.amp = 100;
  2583. prop->atv_cvbs_out_fine.offset = 0;
  2584. #ifdef SI2176_B30
  2585. prop->atv_agc_speed.if_agc_speed = 178;//patch for skyworth
  2586. #elif defined(SI2176_B2A)
  2587. prop->atv_agc_speed.if_agc_speed = SI2176_ATV_AGC_SPEED_PROP_IF_AGC_SPEED_AUTO;
  2588. #endif
  2589. prop->atv_min_lvl_lock.thrs = 34;
  2590. prop->atv_af_out.volume = SI2176_ATV_AF_OUT_PROP_VOLUME_VOLUME_MAX;
  2591. prop->atv_rsq_rssi_threshold.hi = 0;
  2592. prop->atv_rsq_rssi_threshold.lo = -100;//-70;
  2593. prop->atv_rsq_snr_threshold.hi = 60;//40;
  2594. prop->atv_rsq_snr_threshold.lo = 15;//25;
  2595. prop->atv_video_equalizer.slope = 0;
  2596. prop->atv_int_sense.chlnegen = SI2176_ATV_INT_SENSE_PROP_CHLNEGEN_DISABLE;
  2597. prop->atv_int_sense.chlposen = SI2176_ATV_INT_SENSE_PROP_CHLPOSEN_DISABLE;//SI2176_ATV_INT_SENSE_PROP_CHLPOSEN_ENABLE;
  2598. prop->atv_int_sense.dlnegen = SI2176_ATV_INT_SENSE_PROP_DLNEGEN_DISABLE;
  2599. prop->atv_int_sense.dlposen = SI2176_ATV_INT_SENSE_PROP_DLPOSEN_DISABLE;//SI2176_ATV_INT_SENSE_PROP_DLPOSEN_ENABLE;
  2600. prop->atv_int_sense.pclnegen = SI2176_ATV_INT_SENSE_PROP_PCLNEGEN_DISABLE;
  2601. prop->atv_int_sense.pclposen = SI2176_ATV_INT_SENSE_PROP_PCLPOSEN_DISABLE;//SI2176_ATV_INT_SENSE_PROP_PCLPOSEN_ENABLE;
  2602. prop->atv_int_sense.snrhnegen = SI2176_ATV_INT_SENSE_PROP_SNRHNEGEN_DISABLE;
  2603. prop->atv_int_sense.snrhposen = SI2176_ATV_INT_SENSE_PROP_SNRHPOSEN_DISABLE;//SI2176_ATV_INT_SENSE_PROP_SNRHPOSEN_ENABLE;
  2604. prop->atv_int_sense.snrlnegen = SI2176_ATV_INT_SENSE_PROP_SNRLNEGEN_DISABLE;
  2605. prop->atv_int_sense.snrlposen = SI2176_ATV_INT_SENSE_PROP_SNRLPOSEN_DISABLE;//SI2176_ATV_INT_SENSE_PROP_SNRLPOSEN_ENABLE;
  2606. prop->atv_ien.chlien = SI2176_ATV_IEN_PROP_CHLIEN_ENABLE; /* enable only CHL to drive ATVINT */
  2607. prop->atv_ien.dlien = SI2176_ATV_IEN_PROP_DLIEN_DISABLE;
  2608. prop->atv_ien.pclien = SI2176_ATV_IEN_PROP_PCLIEN_DISABLE;
  2609. prop->atv_ien.snrhien = SI2176_ATV_IEN_PROP_SNRHIEN_DISABLE;
  2610. prop->atv_ien.snrlien = SI2176_ATV_IEN_PROP_SNRLIEN_DISABLE;
  2611. prop->atv_audio_mode.audio_sys = SI2176_ATV_AUDIO_MODE_PROP_AUDIO_SYS_MONO;
  2612. prop->atv_audio_mode.chan_bw = SI2176_ATV_AUDIO_MODE_PROP_CHAN_BW_DEFAULT;
  2613. prop->atv_audio_mode.demod_mode = SI2176_ATV_AUDIO_MODE_PROP_DEMOD_MODE_FM1;
  2614. prop->atv_video_mode.video_sys = SI2176_ATV_VIDEO_MODE_PROP_VIDEO_SYS_DK;
  2615. prop->atv_video_mode.trans = SI2176_ATV_VIDEO_MODE_PROP_TRANS_CABLE;//SI2176_ATV_VIDEO_MODE_PROP_TRANS_TERRESTRIAL;
  2616. prop->atv_video_mode.color = SI2176_ATV_VIDEO_MODE_PROP_COLOR_PAL_NTSC;
  2617. return 0;
  2618. }
  2619. /************************************************************************************************************************
  2620. NAME: si2176_SetupCommonDefaults
  2621. DESCRIPTION: Setup si2176 Common startup configuration
  2622. This is a list of all the common configuration properties. Depending on your application, only a subset may be required.
  2623. The properties are stored in the global property structure 'prop'. The function CommonConfig(..) must be called
  2624. after any of these properties are modified.
  2625. Parameter: none
  2626. Returns: 0 if successful
  2627. Programming Guide Reference: Flowchart A.6a (Common setup flowchart)
  2628. ************************************************************************************************************************/
  2629. static int si2176_setupcommondefaults(si2176_propobj_t *prop)
  2630. {
  2631. /**** Enable Interrupt Sources *******/
  2632. prop->master_ien.atvien = SI2176_MASTER_IEN_PROP_ATVIEN_ON;
  2633. prop->master_ien.ctsien = SI2176_MASTER_IEN_PROP_CTSIEN_ON;
  2634. prop->master_ien.dtvien = SI2176_MASTER_IEN_PROP_DTVIEN_OFF;//SI2176_MASTER_IEN_PROP_DTVIEN_ON;
  2635. prop->master_ien.errien = SI2176_MASTER_IEN_PROP_ERRIEN_OFF;//SI2176_MASTER_IEN_PROP_ERRIEN_ON;
  2636. prop->master_ien.tunien = SI2176_MASTER_IEN_PROP_TUNIEN_ON;
  2637. /* Crystal Trim adjustment */
  2638. prop->crystal_trim.xo_cap = 8;
  2639. return 0;
  2640. }
  2641. /************************************************************************************************************************
  2642. NAME: si2176_SetupTunerDefaults
  2643. DESCRIPTION: Setup si2176 Tuner startup configuration
  2644. This is a list of all the Tuner configuration properties. Depending on your application, only a subset may be required.
  2645. The properties are stored in the global property structure 'prop'. The function TunerConfig(..) must be called
  2646. after any of these properties are modified.
  2647. Parameter: none
  2648. Returns: 0 if successful
  2649. Programming Guide Reference: Flowchart A.6a (Tuner setup flowchart)
  2650. ************************************************************************************************************************/
  2651. static int si2176_setuptunerdefaults(si2176_propobj_t *prop)
  2652. {
  2653. /* Setting si2176_TUNER_IEN_PROP property */
  2654. prop->tuner_ien.tcien = SI2176_TUNER_IEN_PROP_TCIEN_ENABLE; /* enable only TC to drive TUNINT */
  2655. prop->tuner_ien.rssilien = SI2176_TUNER_IEN_PROP_RSSILIEN_ENABLE;
  2656. prop->tuner_ien.rssihien = SI2176_TUNER_IEN_PROP_RSSIHIEN_DISABLE;
  2657. /* Setting si2176_TUNER_BLOCK_VCO_PROP property */
  2658. prop->tuner_blocked_vco.vco_code = 0x8000;
  2659. /* Setting si2176_TUNER_INT_SENSE_PROP property */
  2660. prop->tuner_int_sense.rssihnegen = SI2176_TUNER_INT_SENSE_PROP_RSSIHNEGEN_DISABLE;
  2661. prop->tuner_int_sense.rssihposen = SI2176_TUNER_INT_SENSE_PROP_RSSIHPOSEN_ENABLE;
  2662. prop->tuner_int_sense.rssilnegen = SI2176_TUNER_INT_SENSE_PROP_RSSILNEGEN_DISABLE;
  2663. prop->tuner_int_sense.rssilposen = SI2176_TUNER_INT_SENSE_PROP_RSSILPOSEN_ENABLE;
  2664. prop->tuner_int_sense.tcnegen = SI2176_TUNER_INT_SENSE_PROP_RSSIHNEGEN_DISABLE;
  2665. prop->tuner_int_sense.tcposen = SI2176_TUNER_INT_SENSE_PROP_TCPOSEN_ENABLE;
  2666. /* Setting si2176_TUNER_LO_INJECTION_PROP property */
  2667. prop->tuner_lo_injection.band_1 = SI2176_TUNER_LO_INJECTION_PROP_BAND_1_HIGH_SIDE;
  2668. prop->tuner_lo_injection.band_2 = SI2176_TUNER_LO_INJECTION_PROP_BAND_2_LOW_SIDE;
  2669. prop->tuner_lo_injection.band_3 = SI2176_TUNER_LO_INJECTION_PROP_BAND_3_LOW_SIDE;
  2670. prop->tuner_lo_injection.band_4 = SI2176_TUNER_LO_INJECTION_PROP_BAND_4_LOW_SIDE;
  2671. prop->tuner_lo_injection.band_5 = SI2176_TUNER_LO_INJECTION_PROP_BAND_5_LOW_SIDE;
  2672. return 0;
  2673. }
  2674. /************************************************************************************************************************
  2675. NAME: si2176_ATVConfig
  2676. DESCRIPTION: Setup si2176 ATV properties configuration
  2677. This function will download all the ATV configuration properties stored in the global structure 'prop.
  2678. Depending on your application, only a subset may be required to be modified.
  2679. The function si2176_SetupATVDefaults() should be called before the first call to this function. Afterwards
  2680. to change a property change the appropriate element in the property structure 'prop' and call this routine.
  2681. Use the comments above the SetProperty2 calls as a guide to the parameters which are changed.
  2682. Parameter: Pointer to si2176 Context (I2C address)
  2683. Returns: I2C transaction error code, 0 if successful
  2684. Programming Guide Reference: Flowchart A.5 (ATV setup flowchart)
  2685. ************************************************************************************************************************/
  2686. int si2176_atvconfig(struct i2c_client *si2176, si2176_propobj_t *prop, si2176_cmdreplyobj_t *rsp)
  2687. {
  2688. /* Set ATV_CVBS_OUT property */
  2689. //prop.atv_cvbs_out.amp,
  2690. //prop.atv_cvbs_out.offset
  2691. if (si2176_sendproperty(si2176, SI2176_ATV_CVBS_OUT_PROP, prop, rsp) != 0)
  2692. {
  2693. return ERROR_SI2176_SENDING_COMMAND;
  2694. }
  2695. /* Set the ATV_SIF_OUT property */
  2696. //prop.atv_sif_out.amp,
  2697. //prop.atv_sif_out.offset
  2698. if (si2176_sendproperty(si2176, SI2176_ATV_SIF_OUT_PROP, prop, rsp) != 0)
  2699. {
  2700. return ERROR_SI2176_SENDING_COMMAND;
  2701. }
  2702. /* Set the si2176_ATV_SOUND_AGC_LIMIT property */
  2703. //prop.atv_sif_out.min_gain,
  2704. //prop.atv_sif_out.max_gain
  2705. if (si2176_sendproperty(si2176, SI2176_ATV_SOUND_AGC_LIMIT_PROP, prop, rsp) != 0)
  2706. {
  2707. return ERROR_SI2176_SENDING_COMMAND;
  2708. }
  2709. /* Set the ATV_AFC_RANGE property */
  2710. //prop.atv_afc_range.range_khz
  2711. if (si2176_sendproperty(si2176, SI2176_ATV_AFC_RANGE_PROP, prop, rsp) != 0)
  2712. {
  2713. return ERROR_SI2176_SENDING_COMMAND;
  2714. }
  2715. /* Set the ATV_RF_TOP property */
  2716. //prop.atv_rf_top.atv_rf_top
  2717. if (si2176_sendproperty(si2176, SI2176_ATV_RF_TOP_PROP, prop, rsp) != 0)
  2718. {
  2719. return ERROR_SI2176_SENDING_COMMAND;
  2720. }
  2721. /* Set the ATV_VSYNC_TRACKING property */
  2722. //prop.atv_vsync_tracking.min_pulses_to_lock,
  2723. //prop.atv_vsync_tracking.min_fields_to_unlock
  2724. if (si2176_sendproperty(si2176, SI2176_ATV_VSYNC_TRACKING_PROP, prop, rsp) != 0)
  2725. {
  2726. return ERROR_SI2176_SENDING_COMMAND;
  2727. }
  2728. /* Set the ATV_VSNR_CAP property */
  2729. //prop.atv_vsnr_cap.atv_vsnr_cap
  2730. if (si2176_sendproperty(si2176, SI2176_ATV_VSNR_CAP_PROP, prop, rsp) != 0)
  2731. {
  2732. return ERROR_SI2176_SENDING_COMMAND;
  2733. }
  2734. /* Set the ATV_CVBS_OUT_FINE property */
  2735. //prop.atv_cvbs_out_fine.amp,
  2736. //prop.atv_cvbs_out_fine.offset
  2737. if (si2176_sendproperty(si2176, SI2176_ATV_CVBS_OUT_FINE_PROP, prop, rsp) != 0)
  2738. {
  2739. return ERROR_SI2176_SENDING_COMMAND;
  2740. }
  2741. /* Set the ATV_AGC_SPEED property */
  2742. //prop.atv_agc_speed.if_agc_speed
  2743. if (si2176_sendproperty(si2176, SI2176_ATV_AGC_SPEED_PROP, prop, rsp) != 0)
  2744. {
  2745. return ERROR_SI2176_SENDING_COMMAND;
  2746. }
  2747. /* Set the ATV_MIN_LVL_LOCK property */
  2748. // prop.atv_min_lvl_lock.thrs
  2749. // prop.atv_min_lvl_lock.tol
  2750. if (si2176_sendproperty(si2176, SI2176_ATV_MIN_LVL_LOCK_PROP, prop, rsp) != 0)
  2751. {
  2752. return ERROR_SI2176_SENDING_COMMAND;
  2753. }
  2754. /* Set the ATV_AF_OUT property */
  2755. //prop.atv_af_out.volume
  2756. if (si2176_sendproperty(si2176, SI2176_ATV_AF_OUT_PROP, prop, rsp) != 0)
  2757. {
  2758. return ERROR_SI2176_SENDING_COMMAND;
  2759. }
  2760. /*Set the ATV_RSSI_RSQ_THRESHOLD property */
  2761. //prop.atv_rsq_rssi_threshold.hi,
  2762. //prop.atv_rsq_rssi_threshold.lo
  2763. if (si2176_sendproperty(si2176, SI2176_ATV_RSQ_RSSI_THRESHOLD_PROP, prop, rsp) != 0)
  2764. {
  2765. return ERROR_SI2176_SENDING_COMMAND;
  2766. }
  2767. /*Set the ATV_SNR_RSQ_THRESHOLD property */
  2768. //prop.atv_rsq_snr_threshold.hi,
  2769. //prop.atv_rsq_snr_threshold.lo
  2770. if (si2176_sendproperty(si2176, SI2176_ATV_RSQ_SNR_THRESHOLD_PROP, prop, rsp) != 0)
  2771. {
  2772. return ERROR_SI2176_SENDING_COMMAND;
  2773. }
  2774. /*Set the ATV_VIDEO_EQUALIZER property */
  2775. //prop.atv_video_equalizer.slope
  2776. if (si2176_sendproperty(si2176, SI2176_ATV_VIDEO_EQUALIZER_PROP, prop, rsp) != 0)
  2777. {
  2778. return ERROR_SI2176_SENDING_COMMAND;
  2779. }
  2780. /*Set the ATV_INT_SENSE property */
  2781. //prop.atv_int_sense.chlnegen,
  2782. //prop.atv_int_sense.chlposen,
  2783. //prop.atv_int_sense.dlnegen,
  2784. //prop.atv_int_sense.dlposen,
  2785. //prop.atv_int_sense.pclnegen,
  2786. //prop.atv_int_sense.pclposen,
  2787. //prop.atv_int_sense.snrhnegen,
  2788. //prop.atv_int_sense.snrhposen,
  2789. //prop.atv_int_sense.snrlnegen,
  2790. //prop.atv_int_sense.snrlposen
  2791. if (si2176_sendproperty(si2176, SI2176_ATV_INT_SENSE_PROP, prop, rsp) != 0)
  2792. {
  2793. return ERROR_SI2176_SENDING_COMMAND;
  2794. }
  2795. /* setup ATV_IEN_PROP IEN properties to enable ATVINT on CHL */
  2796. /* prop.atv_ien.chlien,
  2797. prop.atv_ien.pclien,
  2798. prop.atv_ien.dlien ,
  2799. prop.atv_ien.snrlien,
  2800. prop.atv_ien.snrhien */
  2801. if (si2176_sendproperty(si2176, SI2176_ATV_IEN_PROP, prop, rsp) != 0)
  2802. {
  2803. return ERROR_SI2176_SENDING_COMMAND;
  2804. }
  2805. /* Set the ATV_AUDIO_MODE property */
  2806. /* prop.atv_audio_mode.audio_sys,
  2807. prop.atv_audio_mode.chan_bw,
  2808. prop.atv_audio_mode.demod_mode */
  2809. if (si2176_sendproperty(si2176, SI2176_ATV_AUDIO_MODE_PROP, prop, rsp) != 0)
  2810. {
  2811. return ERROR_SI2176_SENDING_COMMAND;
  2812. }
  2813. /* Set the ATV_VIDEO_MODE property */
  2814. /* prop.atv_video_mode.video_sys,
  2815. prop.atv_video_mode.trans,
  2816. prop.atv_video_mode.color */
  2817. if (si2176_sendproperty(si2176, SI2176_ATV_VIDEO_MODE_PROP, prop, rsp) != 0)
  2818. {
  2819. return ERROR_SI2176_SENDING_COMMAND;
  2820. }
  2821. return 0;
  2822. }
  2823. /************************************************************************************************************************
  2824. NAME: si2176_CommonConfig
  2825. DESCRIPTION: Setup si2176 Common properties configuration
  2826. This function will download all the DTV configuration properties stored in the global structure 'prop.
  2827. Depending on your application, only a subset may be required to be modified.
  2828. The function si2176_SetupCommonDefaults() should be called before the first call to this function. Afterwards
  2829. to change a property change the appropriate element in the property structure 'prop' and call this routine.
  2830. Use the comments above the si2176_sendproperty calls as a guide to the parameters which are changed.
  2831. Parameter: Pointer to si2176 Context (I2C address)
  2832. Returns: I2C transaction error code, 0 if successful
  2833. Programming Guide Reference: Flowchart A.6a (Common setup flowchart)
  2834. ************************************************************************************************************************/
  2835. int si2176_commonconfig(struct i2c_client *si2176, si2176_propobj_t *prop, si2176_cmdreplyobj_t *rsp)
  2836. {
  2837. /* Setting si2176_MASTER_IEN_PROP property */
  2838. /***
  2839. prop.master_ien.atvien,
  2840. prop.master_ien.ctsien,
  2841. prop.master_ien.dtvien,
  2842. prop.master_ien.errien,
  2843. prop.master_ien.tunien */
  2844. if (si2176_sendproperty(si2176, SI2176_MASTER_IEN_PROP, prop, rsp) != 0)
  2845. {
  2846. return ERROR_SI2176_SENDING_COMMAND;
  2847. }
  2848. /* Setting si2176_CRYSTAL_TRIM_PROP */
  2849. // prop.crystal_trim.xo_cap
  2850. if (si2176_sendproperty(si2176, SI2176_CRYSTAL_TRIM_PROP, prop, rsp) != 0)
  2851. {
  2852. return ERROR_SI2176_SENDING_COMMAND;
  2853. }
  2854. return 0;
  2855. }
  2856. /************************************************************************************************************************
  2857. NAME: si2176_TunerConfig
  2858. DESCRIPTION: Setup si2176 Tuner (RF to IF analog path) properties configuration
  2859. This function will download all the DTV configuration properties stored in the global structure 'prop.
  2860. Depending on your application, only a subset may be required to be modified.
  2861. The function si2176_SetupTunerDefaults() should be called before the first call to this function. Afterwards
  2862. to change a property change the appropriate element in the property structure 'prop' and call this routine.
  2863. Use the comments above the si2176_sendproperty calls as a guide to the parameters which are changed.
  2864. Parameter: Pointer to si2176 Context (I2C address)
  2865. Returns: I2C transaction error code, 0 if successful
  2866. Programming Guide Reference: Flowchart A.6a (Tuner setup flowchart)
  2867. ************************************************************************************************************************/
  2868. int si2176_tunerconfig(struct i2c_client *si2176, si2176_propobj_t *prop, si2176_cmdreplyobj_t *rsp)
  2869. {
  2870. /* Set TUNER_IEN property */
  2871. /* prop.tuner_ien.tcien,
  2872. prop.tuner_ien.rssilien,
  2873. prop.tuner_ien.rssihien */
  2874. if (si2176_sendproperty(si2176, SI2176_TUNER_IEN_PROP, prop, rsp) != 0)
  2875. {
  2876. return ERROR_SI2176_SENDING_COMMAND;
  2877. }
  2878. /* Setting TUNER_BLOCKED_VCO property */
  2879. /* prop.tuner_blocked_vco.vco_code, */
  2880. if (si2176_sendproperty(si2176, SI2176_TUNER_BLOCKED_VCO_PROP, prop, rsp) != 0)
  2881. {
  2882. return ERROR_SI2176_SENDING_COMMAND;
  2883. }
  2884. /* Setting si2176_TUNER_INT_SENSE_PROP property */
  2885. /* prop.tuner_int_sense.rssihnegen,
  2886. prop.tuner_int_sense.rssihposen,
  2887. prop.tuner_int_sense.rssilnegen,
  2888. prop.tuner_int_sense.rssilposen,
  2889. prop.tuner_int_sense.tcnegen,
  2890. prop.tuner_int_sense.tcposen */
  2891. if (si2176_sendproperty(si2176, SI2176_TUNER_INT_SENSE_PROP, prop, rsp) != 0)
  2892. {
  2893. return ERROR_SI2176_SENDING_COMMAND;
  2894. }
  2895. /* Setting si2176_TUNER_LO_INJECTION_PROP property */
  2896. /* prop.tuner_lo_injection.band_1,
  2897. prop.tuner_lo_injection.band_2,
  2898. prop.tuner_lo_injection.band_3,
  2899. prop.tuner_lo_injection.band_4,
  2900. prop.tuner_lo_injection.band_5 */
  2901. if (si2176_sendproperty(si2176, SI2176_TUNER_LO_INJECTION_PROP, prop, rsp) != 0)
  2902. {
  2903. return ERROR_SI2176_SENDING_COMMAND;
  2904. }
  2905. return 0;
  2906. }
  2907. /************************************************************************************************************************
  2908. NAME: si2176_Tune
  2909. DESCRIPTIION: Tune si2176 in specified mode (ATV/DTV) at center frequency, wait for TUNINT and xTVINT with timeout
  2910. Parameter: Pointer to si2176 Context (I2C address)
  2911. Parameter: Mode (ATV or DTV) use si2176_TUNER_TUNE_FREQ_CMD_MODE_ATV or si2176_TUNER_TUNE_FREQ_CMD_MODE_DTV constants
  2912. Parameter: frequency (Hz) as a unsigned long integer
  2913. Parameter: rsp - commandResp structure to returns tune status info.
  2914. Returns: 0 if channel found. A nonzero value means either an error occurred or channel not locked.
  2915. Programming Guide Reference: Flowchart A.7 (Tune flowchart)
  2916. ************************************************************************************************************************/
  2917. int si2176_tune(struct i2c_client *si2176, unsigned char mode, unsigned long freq, si2176_cmdreplyobj_t *rsp, si2176_common_reply_struct *common_reply)
  2918. {
  2919. int return_code = 0,count = 0;
  2920. if (si2176_tuner_tune_freq(si2176, mode, freq, rsp) != 0)
  2921. {
  2922. pr_info("%s: tuner tune freq error:%d!!!!\n", __func__, ERROR_SI2176_SENDING_COMMAND);
  2923. return ERROR_SI2176_SENDING_COMMAND;
  2924. }
  2925. for (count=50; count ;count--)
  2926. {
  2927. return_code = si2176_pollforcts(si2176);
  2928. if (!return_code)
  2929. break;
  2930. mdelay(2);
  2931. }
  2932. if (!count)
  2933. {
  2934. pr_info("%s: poll cts error:%d!!!!\n", __func__, return_code);
  2935. return return_code;
  2936. }
  2937. #if 0
  2938. /* wait for TUNINT, timeout is 150ms */
  2939. for (count=75; count ;count--)
  2940. {
  2941. if ((return_code = si2176_check_status(si2176, common_reply)) != 0)
  2942. return return_code;
  2943. if (common_reply->tunint)
  2944. break;
  2945. mdelay(2);
  2946. }
  2947. if (!count)
  2948. {
  2949. pr_info("%s: ERROR_SI2176_TUNINT_TIMEOUT error:%d!!!!\n", __func__, ERROR_SI2176_TUNINT_TIMEOUT);
  2950. return ERROR_SI2176_TUNINT_TIMEOUT;
  2951. }
  2952. /* wait for xTVINT, timeout is 350ms for ATVINT and 6 ms for DTVINT */
  2953. count = ((mode==SI2176_TUNER_TUNE_FREQ_CMD_MODE_ATV) ? 300 : 3);
  2954. for (;count ;count--)
  2955. {
  2956. if ((return_code = si2176_check_status(si2176, common_reply)) != 0)
  2957. return return_code;
  2958. if ((mode==SI2176_TUNER_TUNE_FREQ_CMD_MODE_ATV) ? common_reply->atvint : common_reply->dtvint)
  2959. break;
  2960. mdelay(2);
  2961. }
  2962. if (!count)
  2963. {
  2964. pr_info("%s: ERROR_SI2176_XTVINT_TIMEOUT error:%d!!!!\n", __func__, ERROR_SI2176_XTVINT_TIMEOUT);
  2965. return ERROR_SI2176_XTVINT_TIMEOUT;
  2966. }
  2967. #endif
  2968. return return_code;
  2969. }
  2970. /************************************************************************************************************************
  2971. NAME: si2176_LoadVideofilter
  2972. DESCRIPTION: Load video filters from vidfiltTable in si2176_write_xTV_video_coeffs.h file into si2176
  2973. Programming Guide Reference: Flowchart A.4 (Download Video Filters flowchart)
  2974. Parameter: si2176 Context (I2C address)
  2975. Parameter: pointer to video filter table array
  2976. Parameter: number of lines in video filter table array (size in bytes / BYTES_PER_LINE)
  2977. Returns: si2176/I2C transaction error code, 0 if successful
  2978. ************************************************************************************************************************/
  2979. int si2176_loadvideofilter(struct i2c_client *si2176, unsigned char* vidfilttable, int lines, si2176_common_reply_struct *common_reply)
  2980. {
  2981. #define BYTES_PER_LINE 8
  2982. int line;
  2983. /* for each 8 bytes in VIDFILT_TABLE */
  2984. for (line = 0; line < lines; line++)
  2985. {
  2986. /* send that 8 byte I2C command to si2176 */
  2987. if (si2176_api_patch(si2176, BYTES_PER_LINE, vidfilttable+BYTES_PER_LINE*line, common_reply) != 0)
  2988. {
  2989. return ERROR_SI2176_SENDING_COMMAND;
  2990. }
  2991. }
  2992. return 0;
  2993. }
  2994. /************************************************************************************************************************
  2995. NAME: si2176_Configure
  2996. DESCRIPTION: Setup si2176 video filters, GPIOs/clocks, Common Properties startup, Tuner startup, ATV startup, and DTV startup.
  2997. Parameter: Pointer to si2176 Context (I2C address)
  2998. Parameter: rsp - commandResp structure buffer.
  2999. Returns: I2C transaction error code, 0 if successful
  3000. ************************************************************************************************************************/
  3001. int si2176_configure(struct i2c_client *si2176, si2176_propobj_t *prop, si2176_cmdreplyobj_t *rsp, si2176_common_reply_struct *common_reply)
  3002. {
  3003. int return_code = 0;
  3004. if(SI2176_DEBUG)
  3005. pr_info("%s: start!!!\n", __func__);
  3006. /* load ATV video filter file */
  3007. #ifdef USING_ATV_FILTER
  3008. if ((return_code = si2176_loadvideofilter(si2176, dlif_vidfilt_table, DLIF_VIDFILT_LINES, common_reply) != 0)
  3009. return return_code;
  3010. #endif
  3011. /* Set the GPIO Pins using the CONFIG_PINS command*/
  3012. if (si2176_config_pins(si2176, /* turn off BCLK1 and XOUT */
  3013. SI2176_CONFIG_PINS_CMD_GPIO1_MODE_NO_CHANGE,
  3014. SI2176_CONFIG_PINS_CMD_GPIO1_READ_DO_NOT_READ,
  3015. SI2176_CONFIG_PINS_CMD_GPIO2_MODE_NO_CHANGE,
  3016. SI2176_CONFIG_PINS_CMD_GPIO2_READ_DO_NOT_READ,
  3017. SI2176_CONFIG_PINS_CMD_GPIO3_MODE_NO_CHANGE,
  3018. SI2176_CONFIG_PINS_CMD_GPIO3_READ_DO_NOT_READ,
  3019. SI2176_CONFIG_PINS_CMD_BCLK1_MODE_DISABLE,
  3020. SI2176_CONFIG_PINS_CMD_BCLK1_READ_DO_NOT_READ,
  3021. SI2176_CONFIG_PINS_CMD_XOUT_MODE_DISABLE,
  3022. rsp) !=0)
  3023. {
  3024. pr_info("%s: config pins error:%d!!!!\n", __func__, ERROR_SI2176_SENDING_COMMAND);
  3025. return ERROR_SI2176_SENDING_COMMAND;
  3026. }
  3027. #if 1
  3028. /* Set Common Properties startup configuration */
  3029. si2176_setupcommondefaults(prop);
  3030. if ((return_code = si2176_commonconfig(si2176, prop, rsp)) != 0)
  3031. {
  3032. pr_info("%s: setup command defaults error:%d!!!!\n", __func__, return_code);
  3033. return return_code;
  3034. }
  3035. /* Set Tuner Properties startup configuration */
  3036. si2176_setuptunerdefaults(prop);
  3037. if ((return_code = si2176_tunerconfig(si2176, prop, rsp)) != 0)
  3038. {
  3039. pr_info("%s: setup tuner defaults error:%d!!!!\n", __func__, return_code);
  3040. return return_code;
  3041. }
  3042. /* Set ATV startup configuration */
  3043. si2176_setupatvdefaults(prop);
  3044. if ((return_code = si2176_atvconfig(si2176, prop, rsp)) != 0)
  3045. {
  3046. pr_info("%s: setup atv defaults error:%d!!!!\n", __func__, return_code);
  3047. return return_code;
  3048. }
  3049. #endif
  3050. return return_code;
  3051. }
  3052. /************************************************************************************************************************
  3053. NAME: si2176_LoadFirmware
  3054. DESCRIPTON: Load firmware from FIRMWARE_TABLE array in si2176_Firmware_x_y_build_z.h file into si2176
  3055. Requires si2176 to be in bootloader mode after PowerUp
  3056. Programming Guide Reference: Flowchart A.3 (Download FW PATCH flowchart)
  3057. Parameter: si2176 Context (I2C address)
  3058. Parameter: pointer to firmware table array
  3059. Parameter: number of lines in firmware table array (size in bytes / BYTES_PER_LINE)
  3060. Returns: si2176/I2C transaction error code, 0 if successful
  3061. ************************************************************************************************************************/
  3062. int si2176_loadfirmware(struct i2c_client *si2176, unsigned char* firmwaretable, int lines, si2176_common_reply_struct *common_reply)
  3063. {
  3064. int return_code = 0;
  3065. int line;
  3066. /* for each 8 bytes in FIRMWARE_TABLE */
  3067. for (line = 0; line < lines; line++)
  3068. {
  3069. /* send that 8 byte I2C command to si2176 */
  3070. if (si2176_api_patch(si2176, 8, firmwaretable+8*line, common_reply) != 0)
  3071. {
  3072. return ERROR_SI2176_LOADING_FIRMWARE;
  3073. }
  3074. }
  3075. return return_code;
  3076. }
  3077. /************************************************************************************************************************
  3078. NAME: si2176_StartFirmware
  3079. DESCRIPTION: Start si2176 firmware (put the si2176 into run mode)
  3080. Parameter: si2176 Context (I2C address)
  3081. Parameter (passed by Reference): ExitBootloadeer Response Status byte : tunint, atvint, dtvint, err, cts
  3082. Returns: I2C transaction error code, 0 if successful
  3083. ************************************************************************************************************************/
  3084. int si2176_startfirmware(struct i2c_client *si2176, si2176_cmdreplyobj_t *rsp)
  3085. {
  3086. if (si2176_exit_bootloader(si2176, SI2176_EXIT_BOOTLOADER_CMD_FUNC_TUNER, SI2176_EXIT_BOOTLOADER_CMD_CTSIEN_OFF, rsp) != 0)
  3087. {
  3088. return ERROR_SI2176_STARTING_FIRMWARE;
  3089. }
  3090. return 0;
  3091. }
  3092. /************************************************************************************************************************
  3093. NAME: si2176_PowerUpWithPatch
  3094. DESCRIPTION: Send si2176 API PowerUp Command with PowerUp to bootloader,
  3095. Check the Chip rev and part, and ROMID are compared to expected values.
  3096. Load the Firmware Patch then Start the Firmware.
  3097. Programming Guide Reference: Flowchart A.2a (POWER_UP with patch flowchart)
  3098. Parameter: si2176 Context (I2C address)
  3099. Returns: si2176/I2C transaction error code, 0 if successful
  3100. ************************************************************************************************************************/
  3101. int si2176_powerupwithpatch(struct i2c_client *si2176, si2176_cmdreplyobj_t *rsp, si2176_common_reply_struct *common_reply)
  3102. {
  3103. int return_code = 0;
  3104. return_code = si2176_power_up(si2176, /* always wait for CTS prior to POWER_UP command */
  3105. SI2176_POWER_UP_CMD_SUBCODE_CODE,
  3106. SI2176_POWER_UP_CMD_RESERVED1_RESERVED,
  3107. SI2176_POWER_UP_CMD_RESERVED2_RESERVED,
  3108. SI2176_POWER_UP_CMD_RESERVED3_RESERVED,
  3109. SI2176_POWER_UP_CMD_CLOCK_MODE_XTAL,
  3110. SI2176_POWER_UP_CMD_CLOCK_FREQ_CLK_24MHZ,
  3111. SI2176_POWER_UP_CMD_ADDR_MODE_CURRENT,
  3112. SI2176_POWER_UP_CMD_FUNC_BOOTLOADER, /* start in bootloader mode */
  3113. SI2176_POWER_UP_CMD_CTSIEN_DISABLE,
  3114. SI2176_POWER_UP_CMD_WAKE_UP_WAKE_UP,
  3115. rsp);
  3116. if (return_code)
  3117. pr_info("%s: si2176_power_up error:%d!!!\n", __func__, return_code);
  3118. #if 0
  3119. /* Get the Part Info from the chip. This command is only valid in Bootloader mode */
  3120. if (si2176_part_info(si2176, &rsp) != 0)
  3121. return ERROR_SI2176_SENDING_COMMAND;
  3122. /* Check the Chip revision, part and ROMID against expected values and report an error if incompatible */
  3123. if (rsp.part_info.chiprev != chiprev)
  3124. return ERROR_SI2176_INCOMPATIBLE_PART;
  3125. /* Part Number is represented as the last 2 digits */
  3126. if (rsp.part_info.part != part)
  3127. return ERROR_SI2176_INCOMPATIBLE_PART;
  3128. /* Part Major Version in ASCII */
  3129. if (rsp.part_info.pmajor != partmajorversion)
  3130. return ERROR_SI2176_INCOMPATIBLE_PART;
  3131. #endif
  3132. mdelay(25);
  3133. /* Load the Firmware */
  3134. if ((return_code = si2176_loadfirmware(si2176, firmwaretable, NB_LINES, common_reply)) != 0)
  3135. {
  3136. pr_info("%s: si2176_loadfirmware error:%d!!!\n", __func__, return_code);
  3137. return return_code;
  3138. }
  3139. /*Start the Firmware */
  3140. if ((return_code = si2176_startfirmware(si2176, rsp)) != 0) /* Start firmware */
  3141. {
  3142. pr_info("%s: si2176_startfirmware error:%d!!!\n", __func__, return_code);
  3143. return return_code;
  3144. }
  3145. mdelay(50);
  3146. if (si2176_get_rev(si2176, rsp) != 0)
  3147. {
  3148. pr_info("%s: si2176_get_rev error:%d!!!\n", __func__, ERROR_SI2176_SENDING_COMMAND);
  3149. return ERROR_SI2176_SENDING_COMMAND;
  3150. }
  3151. else
  3152. {
  3153. if(SI2176_DEBUG)
  3154. {
  3155. pr_info("%s: rsp.get_rev.pn : %d \n", __func__, rsp->get_rev.pn);
  3156. pr_info("%s: rsp.get_rev.fwmajor : %d \n", __func__, rsp->get_rev.fwmajor);
  3157. pr_info("%s: rsp.get_rev.fwminor : %d \n", __func__, rsp->get_rev.fwminor);
  3158. pr_info("%s: rsp.get_rev.patch : %d \n", __func__, rsp->get_rev.patch);
  3159. pr_info("%s: rsp.get_rev.cmpmajor :%d \n", __func__, rsp->get_rev.cmpmajor);
  3160. pr_info("%s: rsp.get_rev.cmpminor :%d \n", __func__, rsp->get_rev.cmpminor);
  3161. pr_info("%s: rsp.get_rev.cmpbuild :%d \n", __func__, rsp->get_rev.cmpbuild);
  3162. pr_info("%s: rsp.get_rev.chiprev : %d \n", __func__, (u32)rsp->get_rev.chiprev);
  3163. }
  3164. }
  3165. return return_code;
  3166. }
  3167. /************************************************************************************************************************
  3168. NAME: si2176_Init
  3169. DESCRIPTION:Reset and Initialize si2176
  3170. Parameter: si2176 Context (I2C address)
  3171. Returns: I2C transaction error code, 0 if successful
  3172. ************************************************************************************************************************/
  3173. int si2176_init(struct i2c_client *si2176, si2176_cmdreplyobj_t *rsp, si2176_common_reply_struct *common_reply)
  3174. {
  3175. int return_code = 0;
  3176. /* Reset si2176 */
  3177. /* TODO: SendRSTb requires porting to toggle the RSTb line low -> high */
  3178. //sendrstb();
  3179. return_code = si2176_powerupwithpatch(si2176, rsp, common_reply);
  3180. if (return_code) /* PowerUp into bootloader */
  3181. {
  3182. pr_info("%s: init si2176 error!!!\n", __func__);
  3183. }
  3184. /* At this point, FW is loaded and started. Return 0*/
  3185. return return_code;
  3186. }