mxl5005s.c 162 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663
  1. /*
  2. MaxLinear MXL5005S VSB/QAM/DVBT tuner driver
  3. Copyright (C) 2008 MaxLinear
  4. Copyright (C) 2006 Steven Toth <stoth@hauppauge.com>
  5. Functions:
  6. mxl5005s_reset()
  7. mxl5005s_writereg()
  8. mxl5005s_writeregs()
  9. mxl5005s_init()
  10. mxl5005s_reconfigure()
  11. mxl5005s_AssignTunerMode()
  12. mxl5005s_set_params()
  13. mxl5005s_get_frequency()
  14. mxl5005s_get_bandwidth()
  15. mxl5005s_release()
  16. mxl5005s_attach()
  17. Copyright (c) 2008 Realtek
  18. Copyright (c) 2008 Jan Hoogenraad, Barnaby Shearer, Andy Hasper
  19. Functions:
  20. mxl5005s_SetRfFreqHz()
  21. This program is free software; you can redistribute it and/or modify
  22. it under the terms of the GNU General Public License as published by
  23. the Free Software Foundation; either version 2 of the License, or
  24. (at your option) any later version.
  25. This program is distributed in the hope that it will be useful,
  26. but WITHOUT ANY WARRANTY; without even the implied warranty of
  27. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  28. GNU General Public License for more details.
  29. You should have received a copy of the GNU General Public License
  30. along with this program; if not, write to the Free Software
  31. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  32. */
  33. /*
  34. History of this driver (Steven Toth):
  35. I was given a public release of a linux driver that included
  36. support for the MaxLinear MXL5005S silicon tuner. Analysis of
  37. the tuner driver showed clearly three things.
  38. 1. The tuner driver didn't support the LinuxTV tuner API
  39. so the code Realtek added had to be removed.
  40. 2. A significant amount of the driver is reference driver code
  41. from MaxLinear, I felt it was important to identify and
  42. preserve this.
  43. 3. New code has to be added to interface correctly with the
  44. LinuxTV API, as a regular kernel module.
  45. Other than the reference driver enum's, I've clearly marked
  46. sections of the code and retained the copyright of the
  47. respective owners.
  48. */
  49. #include "mxl5005s.h"
  50. static int debug = 2;
  51. #define dprintk(level, arg...) do { \
  52. if (level <= debug) \
  53. printk(arg); \
  54. } while (0)
  55. #define TUNER_REGS_NUM 104
  56. #define INITCTRL_NUM 40
  57. #ifdef _MXL_PRODUCTION
  58. #define CHCTRL_NUM 39
  59. #else
  60. #define CHCTRL_NUM 36
  61. #endif
  62. #define MXLCTRL_NUM 189
  63. #define MASTER_CONTROL_ADDR 9
  64. /* Enumeration of Master Control Register State */
  65. typedef enum
  66. {
  67. MC_LOAD_START = 1,
  68. MC_POWER_DOWN,
  69. MC_SYNTH_RESET,
  70. MC_SEQ_OFF
  71. } Master_Control_State;
  72. /* Enumeration of MXL5005 Tuner Modulation Type */
  73. typedef enum
  74. {
  75. MXL_DEFAULT_MODULATION = 0,
  76. MXL_DVBT,
  77. MXL_ATSC,
  78. MXL_QAM,
  79. MXL_ANALOG_CABLE,
  80. MXL_ANALOG_OTA
  81. } Tuner_Modu_Type;
  82. /* MXL5005 Tuner Register Struct */
  83. typedef struct _TunerReg_struct
  84. {
  85. u16 Reg_Num; /* Tuner Register Address */
  86. u16 Reg_Val; /* Current sofware programmed value waiting to be writen */
  87. } TunerReg_struct;
  88. typedef enum
  89. {
  90. /* Initialization Control Names */
  91. DN_IQTN_AMP_CUT = 1, /* 1 */
  92. BB_MODE, /* 2 */
  93. BB_BUF, /* 3 */
  94. BB_BUF_OA, /* 4 */
  95. BB_ALPF_BANDSELECT, /* 5 */
  96. BB_IQSWAP, /* 6 */
  97. BB_DLPF_BANDSEL, /* 7 */
  98. RFSYN_CHP_GAIN, /* 8 */
  99. RFSYN_EN_CHP_HIGAIN, /* 9 */
  100. AGC_IF, /* 10 */
  101. AGC_RF, /* 11 */
  102. IF_DIVVAL, /* 12 */
  103. IF_VCO_BIAS, /* 13 */
  104. CHCAL_INT_MOD_IF, /* 14 */
  105. CHCAL_FRAC_MOD_IF, /* 15 */
  106. DRV_RES_SEL, /* 16 */
  107. I_DRIVER, /* 17 */
  108. EN_AAF, /* 18 */
  109. EN_3P, /* 19 */
  110. EN_AUX_3P, /* 20 */
  111. SEL_AAF_BAND, /* 21 */
  112. SEQ_ENCLK16_CLK_OUT, /* 22 */
  113. SEQ_SEL4_16B, /* 23 */
  114. XTAL_CAPSELECT, /* 24 */
  115. IF_SEL_DBL, /* 25 */
  116. RFSYN_R_DIV, /* 26 */
  117. SEQ_EXTSYNTHCALIF, /* 27 */
  118. SEQ_EXTDCCAL, /* 28 */
  119. AGC_EN_RSSI, /* 29 */
  120. RFA_ENCLKRFAGC, /* 30 */
  121. RFA_RSSI_REFH, /* 31 */
  122. RFA_RSSI_REF, /* 32 */
  123. RFA_RSSI_REFL, /* 33 */
  124. RFA_FLR, /* 34 */
  125. RFA_CEIL, /* 35 */
  126. SEQ_EXTIQFSMPULSE, /* 36 */
  127. OVERRIDE_1, /* 37 */
  128. BB_INITSTATE_DLPF_TUNE, /* 38 */
  129. TG_R_DIV, /* 39 */
  130. EN_CHP_LIN_B, /* 40 */
  131. /* Channel Change Control Names */
  132. DN_POLY = 51, /* 51 */
  133. DN_RFGAIN, /* 52 */
  134. DN_CAP_RFLPF, /* 53 */
  135. DN_EN_VHFUHFBAR, /* 54 */
  136. DN_GAIN_ADJUST, /* 55 */
  137. DN_IQTNBUF_AMP, /* 56 */
  138. DN_IQTNGNBFBIAS_BST, /* 57 */
  139. RFSYN_EN_OUTMUX, /* 58 */
  140. RFSYN_SEL_VCO_OUT, /* 59 */
  141. RFSYN_SEL_VCO_HI, /* 60 */
  142. RFSYN_SEL_DIVM, /* 61 */
  143. RFSYN_RF_DIV_BIAS, /* 62 */
  144. DN_SEL_FREQ, /* 63 */
  145. RFSYN_VCO_BIAS, /* 64 */
  146. CHCAL_INT_MOD_RF, /* 65 */
  147. CHCAL_FRAC_MOD_RF, /* 66 */
  148. RFSYN_LPF_R, /* 67 */
  149. CHCAL_EN_INT_RF, /* 68 */
  150. TG_LO_DIVVAL, /* 69 */
  151. TG_LO_SELVAL, /* 70 */
  152. TG_DIV_VAL, /* 71 */
  153. TG_VCO_BIAS, /* 72 */
  154. SEQ_EXTPOWERUP, /* 73 */
  155. OVERRIDE_2, /* 74 */
  156. OVERRIDE_3, /* 75 */
  157. OVERRIDE_4, /* 76 */
  158. SEQ_FSM_PULSE, /* 77 */
  159. GPIO_4B, /* 78 */
  160. GPIO_3B, /* 79 */
  161. GPIO_4, /* 80 */
  162. GPIO_3, /* 81 */
  163. GPIO_1B, /* 82 */
  164. DAC_A_ENABLE, /* 83 */
  165. DAC_B_ENABLE, /* 84 */
  166. DAC_DIN_A, /* 85 */
  167. DAC_DIN_B, /* 86 */
  168. #ifdef _MXL_PRODUCTION
  169. RFSYN_EN_DIV, /* 87 */
  170. RFSYN_DIVM, /* 88 */
  171. DN_BYPASS_AGC_I2C /* 89 */
  172. #endif
  173. } MXL5005_ControlName;
  174. /*
  175. * The following context is source code provided by MaxLinear.
  176. * MaxLinear source code - Common_MXL.h (?)
  177. */
  178. /* Constants */
  179. #define MXL5005S_REG_WRITING_TABLE_LEN_MAX 104
  180. #define MXL5005S_LATCH_BYTE 0xfe
  181. /* Register address, MSB, and LSB */
  182. #define MXL5005S_BB_IQSWAP_ADDR 59
  183. #define MXL5005S_BB_IQSWAP_MSB 0
  184. #define MXL5005S_BB_IQSWAP_LSB 0
  185. #define MXL5005S_BB_DLPF_BANDSEL_ADDR 53
  186. #define MXL5005S_BB_DLPF_BANDSEL_MSB 4
  187. #define MXL5005S_BB_DLPF_BANDSEL_LSB 3
  188. /* Standard modes */
  189. enum
  190. {
  191. MXL5005S_STANDARD_DVBT,
  192. MXL5005S_STANDARD_ATSC,
  193. };
  194. #define MXL5005S_STANDARD_MODE_NUM 2
  195. /* Bandwidth modes */
  196. enum
  197. {
  198. MXL5005S_BANDWIDTH_6MHZ = 6000000,
  199. MXL5005S_BANDWIDTH_7MHZ = 7000000,
  200. MXL5005S_BANDWIDTH_8MHZ = 8000000,
  201. };
  202. #define MXL5005S_BANDWIDTH_MODE_NUM 3
  203. /* MXL5005 Tuner Control Struct */
  204. typedef struct _TunerControl_struct {
  205. u16 Ctrl_Num; /* Control Number */
  206. u16 size; /* Number of bits to represent Value */
  207. u16 addr[25]; /* Array of Tuner Register Address for each bit position */
  208. u16 bit[25]; /* Array of bit position in Register Address for each bit position */
  209. u16 val[25]; /* Binary representation of Value */
  210. } TunerControl_struct;
  211. /* MXL5005 Tuner Struct */
  212. struct mxl5005s_state
  213. {
  214. u8 Mode; /* 0: Analog Mode ; 1: Digital Mode */
  215. u8 IF_Mode; /* for Analog Mode, 0: zero IF; 1: low IF */
  216. u32 Chan_Bandwidth; /* filter channel bandwidth (6, 7, 8) */
  217. u32 IF_OUT; /* Desired IF Out Frequency */
  218. u16 IF_OUT_LOAD; /* IF Out Load Resistor (200/300 Ohms) */
  219. u32 RF_IN; /* RF Input Frequency */
  220. u32 Fxtal; /* XTAL Frequency */
  221. u8 AGC_Mode; /* AGC Mode 0: Dual AGC; 1: Single AGC */
  222. u16 TOP; /* Value: take over point */
  223. u8 CLOCK_OUT; /* 0: turn off clock out; 1: turn on clock out */
  224. u8 DIV_OUT; /* 4MHz or 16MHz */
  225. u8 CAPSELECT; /* 0: disable On-Chip pulling cap; 1: enable */
  226. u8 EN_RSSI; /* 0: disable RSSI; 1: enable RSSI */
  227. u8 Mod_Type; /* Modulation Type; */
  228. /* 0 - Default; 1 - DVB-T; 2 - ATSC; 3 - QAM; 4 - Analog Cable */
  229. u8 TF_Type; /* Tracking Filter Type */
  230. /* 0 - Default; 1 - Off; 2 - Type C; 3 - Type C-H */
  231. /* Calculated Settings */
  232. u32 RF_LO; /* Synth RF LO Frequency */
  233. u32 IF_LO; /* Synth IF LO Frequency */
  234. u32 TG_LO; /* Synth TG_LO Frequency */
  235. /* Pointers to ControlName Arrays */
  236. u16 Init_Ctrl_Num; /* Number of INIT Control Names */
  237. TunerControl_struct
  238. Init_Ctrl[INITCTRL_NUM]; /* INIT Control Names Array Pointer */
  239. u16 CH_Ctrl_Num; /* Number of CH Control Names */
  240. TunerControl_struct
  241. CH_Ctrl[CHCTRL_NUM]; /* CH Control Name Array Pointer */
  242. u16 MXL_Ctrl_Num; /* Number of MXL Control Names */
  243. TunerControl_struct
  244. MXL_Ctrl[MXLCTRL_NUM]; /* MXL Control Name Array Pointer */
  245. /* Pointer to Tuner Register Array */
  246. u16 TunerRegs_Num; /* Number of Tuner Registers */
  247. TunerReg_struct
  248. TunerRegs[TUNER_REGS_NUM]; /* Tuner Register Array Pointer */
  249. /* Linux driver framework specific */
  250. struct mxl5005s_config *config;
  251. struct dvb_frontend *frontend;
  252. struct i2c_adapter *i2c;
  253. /* Cache values */
  254. u32 current_mode;
  255. };
  256. u16 MXL_ControlWrite(struct dvb_frontend *fe, u16 ControlNum, u32 value);
  257. u16 MXL_ControlRead(struct dvb_frontend *fe, u16 controlNum, u32 *value);
  258. u16 MXL_GetMasterControl(u8 *MasterReg, int state);
  259. void MXL_RegWriteBit(struct dvb_frontend *fe, u8 address, u8 bit, u8 bitVal);
  260. u16 MXL_GetCHRegister(struct dvb_frontend *fe, u8 *RegNum, u8 *RegVal, int *count);
  261. u32 MXL_Ceiling(u32 value, u32 resolution);
  262. u16 MXL_RegRead(struct dvb_frontend *fe, u8 RegNum, u8 *RegVal);
  263. u16 MXL_RegWrite(struct dvb_frontend *fe, u8 RegNum, u8 RegVal);
  264. u16 MXL_ControlWrite_Group(struct dvb_frontend *fe, u16 controlNum, u32 value, u16 controlGroup);
  265. u16 MXL_SetGPIO(struct dvb_frontend *fe, u8 GPIO_Num, u8 GPIO_Val);
  266. u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 * RegNum, u8 *RegVal, int *count);
  267. u32 MXL_GetXtalInt(u32 Xtal_Freq);
  268. u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq);
  269. void MXL_SynthIFLO_Calc(struct dvb_frontend *fe);
  270. void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe);
  271. u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 *RegNum, u8 *RegVal, int *count);
  272. int mxl5005s_writeregs(struct dvb_frontend *fe, u8 *addrtable, u8 *datatable, u8 len);
  273. u16 MXL_IFSynthInit(struct dvb_frontend *fe);
  274. int mxl5005s_AssignTunerMode(struct dvb_frontend *fe, u32 mod_type, u32 bandwidth);
  275. int mxl5005s_reconfigure(struct dvb_frontend *fe, u32 mod_type, u32 bandwidth);
  276. /* ----------------------------------------------------------------
  277. * Begin: Custom code salvaged from the Realtek driver.
  278. * Copyright (c) 2008 Realtek
  279. * Copyright (c) 2008 Jan Hoogenraad, Barnaby Shearer, Andy Hasper
  280. * This code is placed under the terms of the GNU General Public License
  281. *
  282. * Released by Realtek under GPLv2.
  283. * Thanks to Realtek for a lot of support we received !
  284. *
  285. * Revision: 080314 - original version
  286. */
  287. int mxl5005s_SetRfFreqHz(struct dvb_frontend *fe, unsigned long RfFreqHz)
  288. {
  289. struct mxl5005s_state *state = fe->tuner_priv;
  290. unsigned char AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
  291. unsigned char ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
  292. int TableLen;
  293. u32 IfDivval;
  294. unsigned char MasterControlByte;
  295. dprintk(1, "%s() freq=%ld\n", __func__, RfFreqHz);
  296. // Set MxL5005S tuner RF frequency according to MxL5005S tuner example code.
  297. // Tuner RF frequency setting stage 0
  298. MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET) ;
  299. AddrTable[0] = MASTER_CONTROL_ADDR;
  300. ByteTable[0] |= state->config->AgcMasterByte;
  301. mxl5005s_writeregs(fe, AddrTable, ByteTable, 1);
  302. // Tuner RF frequency setting stage 1
  303. MXL_TuneRF(fe, RfFreqHz);
  304. MXL_ControlRead(fe, IF_DIVVAL, &IfDivval);
  305. MXL_ControlWrite(fe, SEQ_FSM_PULSE, 0);
  306. MXL_ControlWrite(fe, SEQ_EXTPOWERUP, 1);
  307. MXL_ControlWrite(fe, IF_DIVVAL, 8);
  308. MXL_GetCHRegister(fe, AddrTable, ByteTable, &TableLen) ;
  309. MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START) ;
  310. AddrTable[TableLen] = MASTER_CONTROL_ADDR ;
  311. ByteTable[TableLen] = MasterControlByte | state->config->AgcMasterByte;
  312. TableLen += 1;
  313. mxl5005s_writeregs(fe, AddrTable, ByteTable, TableLen);
  314. // Wait 30 ms.
  315. msleep(150);
  316. // Tuner RF frequency setting stage 2
  317. MXL_ControlWrite(fe, SEQ_FSM_PULSE, 1) ;
  318. MXL_ControlWrite(fe, IF_DIVVAL, IfDivval) ;
  319. MXL_GetCHRegister_ZeroIF(fe, AddrTable, ByteTable, &TableLen) ;
  320. MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START) ;
  321. AddrTable[TableLen] = MASTER_CONTROL_ADDR ;
  322. ByteTable[TableLen] = MasterControlByte | state->config->AgcMasterByte ;
  323. TableLen += 1;
  324. mxl5005s_writeregs(fe, AddrTable, ByteTable, TableLen);
  325. msleep(100);
  326. return 0;
  327. }
  328. /* End: Custom code taken from the Realtek driver */
  329. /* ----------------------------------------------------------------
  330. * Begin: Reference driver code found in the Realtek driver.
  331. * Copyright (c) 2008 MaxLinear
  332. */
  333. u16 MXL5005_RegisterInit(struct dvb_frontend *fe)
  334. {
  335. struct mxl5005s_state *state = fe->tuner_priv;
  336. state->TunerRegs_Num = TUNER_REGS_NUM ;
  337. // state->TunerRegs = (TunerReg_struct *) calloc( TUNER_REGS_NUM, sizeof(TunerReg_struct) ) ;
  338. state->TunerRegs[0].Reg_Num = 9 ;
  339. state->TunerRegs[0].Reg_Val = 0x40 ;
  340. state->TunerRegs[1].Reg_Num = 11 ;
  341. state->TunerRegs[1].Reg_Val = 0x19 ;
  342. state->TunerRegs[2].Reg_Num = 12 ;
  343. state->TunerRegs[2].Reg_Val = 0x60 ;
  344. state->TunerRegs[3].Reg_Num = 13 ;
  345. state->TunerRegs[3].Reg_Val = 0x00 ;
  346. state->TunerRegs[4].Reg_Num = 14 ;
  347. state->TunerRegs[4].Reg_Val = 0x00 ;
  348. state->TunerRegs[5].Reg_Num = 15 ;
  349. state->TunerRegs[5].Reg_Val = 0xC0 ;
  350. state->TunerRegs[6].Reg_Num = 16 ;
  351. state->TunerRegs[6].Reg_Val = 0x00 ;
  352. state->TunerRegs[7].Reg_Num = 17 ;
  353. state->TunerRegs[7].Reg_Val = 0x00 ;
  354. state->TunerRegs[8].Reg_Num = 18 ;
  355. state->TunerRegs[8].Reg_Val = 0x00 ;
  356. state->TunerRegs[9].Reg_Num = 19 ;
  357. state->TunerRegs[9].Reg_Val = 0x34 ;
  358. state->TunerRegs[10].Reg_Num = 21 ;
  359. state->TunerRegs[10].Reg_Val = 0x00 ;
  360. state->TunerRegs[11].Reg_Num = 22 ;
  361. state->TunerRegs[11].Reg_Val = 0x6B ;
  362. state->TunerRegs[12].Reg_Num = 23 ;
  363. state->TunerRegs[12].Reg_Val = 0x35 ;
  364. state->TunerRegs[13].Reg_Num = 24 ;
  365. state->TunerRegs[13].Reg_Val = 0x70 ;
  366. state->TunerRegs[14].Reg_Num = 25 ;
  367. state->TunerRegs[14].Reg_Val = 0x3E ;
  368. state->TunerRegs[15].Reg_Num = 26 ;
  369. state->TunerRegs[15].Reg_Val = 0x82 ;
  370. state->TunerRegs[16].Reg_Num = 31 ;
  371. state->TunerRegs[16].Reg_Val = 0x00 ;
  372. state->TunerRegs[17].Reg_Num = 32 ;
  373. state->TunerRegs[17].Reg_Val = 0x40 ;
  374. state->TunerRegs[18].Reg_Num = 33 ;
  375. state->TunerRegs[18].Reg_Val = 0x53 ;
  376. state->TunerRegs[19].Reg_Num = 34 ;
  377. state->TunerRegs[19].Reg_Val = 0x81 ;
  378. state->TunerRegs[20].Reg_Num = 35 ;
  379. state->TunerRegs[20].Reg_Val = 0xC9 ;
  380. state->TunerRegs[21].Reg_Num = 36 ;
  381. state->TunerRegs[21].Reg_Val = 0x01 ;
  382. state->TunerRegs[22].Reg_Num = 37 ;
  383. state->TunerRegs[22].Reg_Val = 0x00 ;
  384. state->TunerRegs[23].Reg_Num = 41 ;
  385. state->TunerRegs[23].Reg_Val = 0x00 ;
  386. state->TunerRegs[24].Reg_Num = 42 ;
  387. state->TunerRegs[24].Reg_Val = 0xF8 ;
  388. state->TunerRegs[25].Reg_Num = 43 ;
  389. state->TunerRegs[25].Reg_Val = 0x43 ;
  390. state->TunerRegs[26].Reg_Num = 44 ;
  391. state->TunerRegs[26].Reg_Val = 0x20 ;
  392. state->TunerRegs[27].Reg_Num = 45 ;
  393. state->TunerRegs[27].Reg_Val = 0x80 ;
  394. state->TunerRegs[28].Reg_Num = 46 ;
  395. state->TunerRegs[28].Reg_Val = 0x88 ;
  396. state->TunerRegs[29].Reg_Num = 47 ;
  397. state->TunerRegs[29].Reg_Val = 0x86 ;
  398. state->TunerRegs[30].Reg_Num = 48 ;
  399. state->TunerRegs[30].Reg_Val = 0x00 ;
  400. state->TunerRegs[31].Reg_Num = 49 ;
  401. state->TunerRegs[31].Reg_Val = 0x00 ;
  402. state->TunerRegs[32].Reg_Num = 53 ;
  403. state->TunerRegs[32].Reg_Val = 0x94 ;
  404. state->TunerRegs[33].Reg_Num = 54 ;
  405. state->TunerRegs[33].Reg_Val = 0xFA ;
  406. state->TunerRegs[34].Reg_Num = 55 ;
  407. state->TunerRegs[34].Reg_Val = 0x92 ;
  408. state->TunerRegs[35].Reg_Num = 56 ;
  409. state->TunerRegs[35].Reg_Val = 0x80 ;
  410. state->TunerRegs[36].Reg_Num = 57 ;
  411. state->TunerRegs[36].Reg_Val = 0x41 ;
  412. state->TunerRegs[37].Reg_Num = 58 ;
  413. state->TunerRegs[37].Reg_Val = 0xDB ;
  414. state->TunerRegs[38].Reg_Num = 59 ;
  415. state->TunerRegs[38].Reg_Val = 0x00 ;
  416. state->TunerRegs[39].Reg_Num = 60 ;
  417. state->TunerRegs[39].Reg_Val = 0x00 ;
  418. state->TunerRegs[40].Reg_Num = 61 ;
  419. state->TunerRegs[40].Reg_Val = 0x00 ;
  420. state->TunerRegs[41].Reg_Num = 62 ;
  421. state->TunerRegs[41].Reg_Val = 0x00 ;
  422. state->TunerRegs[42].Reg_Num = 65 ;
  423. state->TunerRegs[42].Reg_Val = 0xF8 ;
  424. state->TunerRegs[43].Reg_Num = 66 ;
  425. state->TunerRegs[43].Reg_Val = 0xE4 ;
  426. state->TunerRegs[44].Reg_Num = 67 ;
  427. state->TunerRegs[44].Reg_Val = 0x90 ;
  428. state->TunerRegs[45].Reg_Num = 68 ;
  429. state->TunerRegs[45].Reg_Val = 0xC0 ;
  430. state->TunerRegs[46].Reg_Num = 69 ;
  431. state->TunerRegs[46].Reg_Val = 0x01 ;
  432. state->TunerRegs[47].Reg_Num = 70 ;
  433. state->TunerRegs[47].Reg_Val = 0x50 ;
  434. state->TunerRegs[48].Reg_Num = 71 ;
  435. state->TunerRegs[48].Reg_Val = 0x06 ;
  436. state->TunerRegs[49].Reg_Num = 72 ;
  437. state->TunerRegs[49].Reg_Val = 0x00 ;
  438. state->TunerRegs[50].Reg_Num = 73 ;
  439. state->TunerRegs[50].Reg_Val = 0x20 ;
  440. state->TunerRegs[51].Reg_Num = 76 ;
  441. state->TunerRegs[51].Reg_Val = 0xBB ;
  442. state->TunerRegs[52].Reg_Num = 77 ;
  443. state->TunerRegs[52].Reg_Val = 0x13 ;
  444. state->TunerRegs[53].Reg_Num = 81 ;
  445. state->TunerRegs[53].Reg_Val = 0x04 ;
  446. state->TunerRegs[54].Reg_Num = 82 ;
  447. state->TunerRegs[54].Reg_Val = 0x75 ;
  448. state->TunerRegs[55].Reg_Num = 83 ;
  449. state->TunerRegs[55].Reg_Val = 0x00 ;
  450. state->TunerRegs[56].Reg_Num = 84 ;
  451. state->TunerRegs[56].Reg_Val = 0x00 ;
  452. state->TunerRegs[57].Reg_Num = 85 ;
  453. state->TunerRegs[57].Reg_Val = 0x00 ;
  454. state->TunerRegs[58].Reg_Num = 91 ;
  455. state->TunerRegs[58].Reg_Val = 0x70 ;
  456. state->TunerRegs[59].Reg_Num = 92 ;
  457. state->TunerRegs[59].Reg_Val = 0x00 ;
  458. state->TunerRegs[60].Reg_Num = 93 ;
  459. state->TunerRegs[60].Reg_Val = 0x00 ;
  460. state->TunerRegs[61].Reg_Num = 94 ;
  461. state->TunerRegs[61].Reg_Val = 0x00 ;
  462. state->TunerRegs[62].Reg_Num = 95 ;
  463. state->TunerRegs[62].Reg_Val = 0x0C ;
  464. state->TunerRegs[63].Reg_Num = 96 ;
  465. state->TunerRegs[63].Reg_Val = 0x00 ;
  466. state->TunerRegs[64].Reg_Num = 97 ;
  467. state->TunerRegs[64].Reg_Val = 0x00 ;
  468. state->TunerRegs[65].Reg_Num = 98 ;
  469. state->TunerRegs[65].Reg_Val = 0xE2 ;
  470. state->TunerRegs[66].Reg_Num = 99 ;
  471. state->TunerRegs[66].Reg_Val = 0x00 ;
  472. state->TunerRegs[67].Reg_Num = 100 ;
  473. state->TunerRegs[67].Reg_Val = 0x00 ;
  474. state->TunerRegs[68].Reg_Num = 101 ;
  475. state->TunerRegs[68].Reg_Val = 0x12 ;
  476. state->TunerRegs[69].Reg_Num = 102 ;
  477. state->TunerRegs[69].Reg_Val = 0x80 ;
  478. state->TunerRegs[70].Reg_Num = 103 ;
  479. state->TunerRegs[70].Reg_Val = 0x32 ;
  480. state->TunerRegs[71].Reg_Num = 104 ;
  481. state->TunerRegs[71].Reg_Val = 0xB4 ;
  482. state->TunerRegs[72].Reg_Num = 105 ;
  483. state->TunerRegs[72].Reg_Val = 0x60 ;
  484. state->TunerRegs[73].Reg_Num = 106 ;
  485. state->TunerRegs[73].Reg_Val = 0x83 ;
  486. state->TunerRegs[74].Reg_Num = 107 ;
  487. state->TunerRegs[74].Reg_Val = 0x84 ;
  488. state->TunerRegs[75].Reg_Num = 108 ;
  489. state->TunerRegs[75].Reg_Val = 0x9C ;
  490. state->TunerRegs[76].Reg_Num = 109 ;
  491. state->TunerRegs[76].Reg_Val = 0x02 ;
  492. state->TunerRegs[77].Reg_Num = 110 ;
  493. state->TunerRegs[77].Reg_Val = 0x81 ;
  494. state->TunerRegs[78].Reg_Num = 111 ;
  495. state->TunerRegs[78].Reg_Val = 0xC0 ;
  496. state->TunerRegs[79].Reg_Num = 112 ;
  497. state->TunerRegs[79].Reg_Val = 0x10 ;
  498. state->TunerRegs[80].Reg_Num = 131 ;
  499. state->TunerRegs[80].Reg_Val = 0x8A ;
  500. state->TunerRegs[81].Reg_Num = 132 ;
  501. state->TunerRegs[81].Reg_Val = 0x10 ;
  502. state->TunerRegs[82].Reg_Num = 133 ;
  503. state->TunerRegs[82].Reg_Val = 0x24 ;
  504. state->TunerRegs[83].Reg_Num = 134 ;
  505. state->TunerRegs[83].Reg_Val = 0x00 ;
  506. state->TunerRegs[84].Reg_Num = 135 ;
  507. state->TunerRegs[84].Reg_Val = 0x00 ;
  508. state->TunerRegs[85].Reg_Num = 136 ;
  509. state->TunerRegs[85].Reg_Val = 0x7E ;
  510. state->TunerRegs[86].Reg_Num = 137 ;
  511. state->TunerRegs[86].Reg_Val = 0x40 ;
  512. state->TunerRegs[87].Reg_Num = 138 ;
  513. state->TunerRegs[87].Reg_Val = 0x38 ;
  514. state->TunerRegs[88].Reg_Num = 146 ;
  515. state->TunerRegs[88].Reg_Val = 0xF6 ;
  516. state->TunerRegs[89].Reg_Num = 147 ;
  517. state->TunerRegs[89].Reg_Val = 0x1A ;
  518. state->TunerRegs[90].Reg_Num = 148 ;
  519. state->TunerRegs[90].Reg_Val = 0x62 ;
  520. state->TunerRegs[91].Reg_Num = 149 ;
  521. state->TunerRegs[91].Reg_Val = 0x33 ;
  522. state->TunerRegs[92].Reg_Num = 150 ;
  523. state->TunerRegs[92].Reg_Val = 0x80 ;
  524. state->TunerRegs[93].Reg_Num = 156 ;
  525. state->TunerRegs[93].Reg_Val = 0x56 ;
  526. state->TunerRegs[94].Reg_Num = 157 ;
  527. state->TunerRegs[94].Reg_Val = 0x17 ;
  528. state->TunerRegs[95].Reg_Num = 158 ;
  529. state->TunerRegs[95].Reg_Val = 0xA9 ;
  530. state->TunerRegs[96].Reg_Num = 159 ;
  531. state->TunerRegs[96].Reg_Val = 0x00 ;
  532. state->TunerRegs[97].Reg_Num = 160 ;
  533. state->TunerRegs[97].Reg_Val = 0x00 ;
  534. state->TunerRegs[98].Reg_Num = 161 ;
  535. state->TunerRegs[98].Reg_Val = 0x00 ;
  536. state->TunerRegs[99].Reg_Num = 162 ;
  537. state->TunerRegs[99].Reg_Val = 0x40 ;
  538. state->TunerRegs[100].Reg_Num = 166 ;
  539. state->TunerRegs[100].Reg_Val = 0xAE ;
  540. state->TunerRegs[101].Reg_Num = 167 ;
  541. state->TunerRegs[101].Reg_Val = 0x1B ;
  542. state->TunerRegs[102].Reg_Num = 168 ;
  543. state->TunerRegs[102].Reg_Val = 0xF2 ;
  544. state->TunerRegs[103].Reg_Num = 195 ;
  545. state->TunerRegs[103].Reg_Val = 0x00 ;
  546. return 0 ;
  547. }
  548. u16 MXL5005_ControlInit(struct dvb_frontend *fe)
  549. {
  550. struct mxl5005s_state *state = fe->tuner_priv;
  551. state->Init_Ctrl_Num = INITCTRL_NUM;
  552. state->Init_Ctrl[0].Ctrl_Num = DN_IQTN_AMP_CUT ;
  553. state->Init_Ctrl[0].size = 1 ;
  554. state->Init_Ctrl[0].addr[0] = 73;
  555. state->Init_Ctrl[0].bit[0] = 7;
  556. state->Init_Ctrl[0].val[0] = 0;
  557. state->Init_Ctrl[1].Ctrl_Num = BB_MODE ;
  558. state->Init_Ctrl[1].size = 1 ;
  559. state->Init_Ctrl[1].addr[0] = 53;
  560. state->Init_Ctrl[1].bit[0] = 2;
  561. state->Init_Ctrl[1].val[0] = 1;
  562. state->Init_Ctrl[2].Ctrl_Num = BB_BUF ;
  563. state->Init_Ctrl[2].size = 2 ;
  564. state->Init_Ctrl[2].addr[0] = 53;
  565. state->Init_Ctrl[2].bit[0] = 1;
  566. state->Init_Ctrl[2].val[0] = 0;
  567. state->Init_Ctrl[2].addr[1] = 57;
  568. state->Init_Ctrl[2].bit[1] = 0;
  569. state->Init_Ctrl[2].val[1] = 1;
  570. state->Init_Ctrl[3].Ctrl_Num = BB_BUF_OA ;
  571. state->Init_Ctrl[3].size = 1 ;
  572. state->Init_Ctrl[3].addr[0] = 53;
  573. state->Init_Ctrl[3].bit[0] = 0;
  574. state->Init_Ctrl[3].val[0] = 0;
  575. state->Init_Ctrl[4].Ctrl_Num = BB_ALPF_BANDSELECT ;
  576. state->Init_Ctrl[4].size = 3 ;
  577. state->Init_Ctrl[4].addr[0] = 53;
  578. state->Init_Ctrl[4].bit[0] = 5;
  579. state->Init_Ctrl[4].val[0] = 0;
  580. state->Init_Ctrl[4].addr[1] = 53;
  581. state->Init_Ctrl[4].bit[1] = 6;
  582. state->Init_Ctrl[4].val[1] = 0;
  583. state->Init_Ctrl[4].addr[2] = 53;
  584. state->Init_Ctrl[4].bit[2] = 7;
  585. state->Init_Ctrl[4].val[2] = 1;
  586. state->Init_Ctrl[5].Ctrl_Num = BB_IQSWAP ;
  587. state->Init_Ctrl[5].size = 1 ;
  588. state->Init_Ctrl[5].addr[0] = 59;
  589. state->Init_Ctrl[5].bit[0] = 0;
  590. state->Init_Ctrl[5].val[0] = 0;
  591. state->Init_Ctrl[6].Ctrl_Num = BB_DLPF_BANDSEL ;
  592. state->Init_Ctrl[6].size = 2 ;
  593. state->Init_Ctrl[6].addr[0] = 53;
  594. state->Init_Ctrl[6].bit[0] = 3;
  595. state->Init_Ctrl[6].val[0] = 0;
  596. state->Init_Ctrl[6].addr[1] = 53;
  597. state->Init_Ctrl[6].bit[1] = 4;
  598. state->Init_Ctrl[6].val[1] = 1;
  599. state->Init_Ctrl[7].Ctrl_Num = RFSYN_CHP_GAIN ;
  600. state->Init_Ctrl[7].size = 4 ;
  601. state->Init_Ctrl[7].addr[0] = 22;
  602. state->Init_Ctrl[7].bit[0] = 4;
  603. state->Init_Ctrl[7].val[0] = 0;
  604. state->Init_Ctrl[7].addr[1] = 22;
  605. state->Init_Ctrl[7].bit[1] = 5;
  606. state->Init_Ctrl[7].val[1] = 1;
  607. state->Init_Ctrl[7].addr[2] = 22;
  608. state->Init_Ctrl[7].bit[2] = 6;
  609. state->Init_Ctrl[7].val[2] = 1;
  610. state->Init_Ctrl[7].addr[3] = 22;
  611. state->Init_Ctrl[7].bit[3] = 7;
  612. state->Init_Ctrl[7].val[3] = 0;
  613. state->Init_Ctrl[8].Ctrl_Num = RFSYN_EN_CHP_HIGAIN ;
  614. state->Init_Ctrl[8].size = 1 ;
  615. state->Init_Ctrl[8].addr[0] = 22;
  616. state->Init_Ctrl[8].bit[0] = 2;
  617. state->Init_Ctrl[8].val[0] = 0;
  618. state->Init_Ctrl[9].Ctrl_Num = AGC_IF ;
  619. state->Init_Ctrl[9].size = 4 ;
  620. state->Init_Ctrl[9].addr[0] = 76;
  621. state->Init_Ctrl[9].bit[0] = 0;
  622. state->Init_Ctrl[9].val[0] = 1;
  623. state->Init_Ctrl[9].addr[1] = 76;
  624. state->Init_Ctrl[9].bit[1] = 1;
  625. state->Init_Ctrl[9].val[1] = 1;
  626. state->Init_Ctrl[9].addr[2] = 76;
  627. state->Init_Ctrl[9].bit[2] = 2;
  628. state->Init_Ctrl[9].val[2] = 0;
  629. state->Init_Ctrl[9].addr[3] = 76;
  630. state->Init_Ctrl[9].bit[3] = 3;
  631. state->Init_Ctrl[9].val[3] = 1;
  632. state->Init_Ctrl[10].Ctrl_Num = AGC_RF ;
  633. state->Init_Ctrl[10].size = 4 ;
  634. state->Init_Ctrl[10].addr[0] = 76;
  635. state->Init_Ctrl[10].bit[0] = 4;
  636. state->Init_Ctrl[10].val[0] = 1;
  637. state->Init_Ctrl[10].addr[1] = 76;
  638. state->Init_Ctrl[10].bit[1] = 5;
  639. state->Init_Ctrl[10].val[1] = 1;
  640. state->Init_Ctrl[10].addr[2] = 76;
  641. state->Init_Ctrl[10].bit[2] = 6;
  642. state->Init_Ctrl[10].val[2] = 0;
  643. state->Init_Ctrl[10].addr[3] = 76;
  644. state->Init_Ctrl[10].bit[3] = 7;
  645. state->Init_Ctrl[10].val[3] = 1;
  646. state->Init_Ctrl[11].Ctrl_Num = IF_DIVVAL ;
  647. state->Init_Ctrl[11].size = 5 ;
  648. state->Init_Ctrl[11].addr[0] = 43;
  649. state->Init_Ctrl[11].bit[0] = 3;
  650. state->Init_Ctrl[11].val[0] = 0;
  651. state->Init_Ctrl[11].addr[1] = 43;
  652. state->Init_Ctrl[11].bit[1] = 4;
  653. state->Init_Ctrl[11].val[1] = 0;
  654. state->Init_Ctrl[11].addr[2] = 43;
  655. state->Init_Ctrl[11].bit[2] = 5;
  656. state->Init_Ctrl[11].val[2] = 0;
  657. state->Init_Ctrl[11].addr[3] = 43;
  658. state->Init_Ctrl[11].bit[3] = 6;
  659. state->Init_Ctrl[11].val[3] = 1;
  660. state->Init_Ctrl[11].addr[4] = 43;
  661. state->Init_Ctrl[11].bit[4] = 7;
  662. state->Init_Ctrl[11].val[4] = 0;
  663. state->Init_Ctrl[12].Ctrl_Num = IF_VCO_BIAS ;
  664. state->Init_Ctrl[12].size = 6 ;
  665. state->Init_Ctrl[12].addr[0] = 44;
  666. state->Init_Ctrl[12].bit[0] = 2;
  667. state->Init_Ctrl[12].val[0] = 0;
  668. state->Init_Ctrl[12].addr[1] = 44;
  669. state->Init_Ctrl[12].bit[1] = 3;
  670. state->Init_Ctrl[12].val[1] = 0;
  671. state->Init_Ctrl[12].addr[2] = 44;
  672. state->Init_Ctrl[12].bit[2] = 4;
  673. state->Init_Ctrl[12].val[2] = 0;
  674. state->Init_Ctrl[12].addr[3] = 44;
  675. state->Init_Ctrl[12].bit[3] = 5;
  676. state->Init_Ctrl[12].val[3] = 1;
  677. state->Init_Ctrl[12].addr[4] = 44;
  678. state->Init_Ctrl[12].bit[4] = 6;
  679. state->Init_Ctrl[12].val[4] = 0;
  680. state->Init_Ctrl[12].addr[5] = 44;
  681. state->Init_Ctrl[12].bit[5] = 7;
  682. state->Init_Ctrl[12].val[5] = 0;
  683. state->Init_Ctrl[13].Ctrl_Num = CHCAL_INT_MOD_IF ;
  684. state->Init_Ctrl[13].size = 7 ;
  685. state->Init_Ctrl[13].addr[0] = 11;
  686. state->Init_Ctrl[13].bit[0] = 0;
  687. state->Init_Ctrl[13].val[0] = 1;
  688. state->Init_Ctrl[13].addr[1] = 11;
  689. state->Init_Ctrl[13].bit[1] = 1;
  690. state->Init_Ctrl[13].val[1] = 0;
  691. state->Init_Ctrl[13].addr[2] = 11;
  692. state->Init_Ctrl[13].bit[2] = 2;
  693. state->Init_Ctrl[13].val[2] = 0;
  694. state->Init_Ctrl[13].addr[3] = 11;
  695. state->Init_Ctrl[13].bit[3] = 3;
  696. state->Init_Ctrl[13].val[3] = 1;
  697. state->Init_Ctrl[13].addr[4] = 11;
  698. state->Init_Ctrl[13].bit[4] = 4;
  699. state->Init_Ctrl[13].val[4] = 1;
  700. state->Init_Ctrl[13].addr[5] = 11;
  701. state->Init_Ctrl[13].bit[5] = 5;
  702. state->Init_Ctrl[13].val[5] = 0;
  703. state->Init_Ctrl[13].addr[6] = 11;
  704. state->Init_Ctrl[13].bit[6] = 6;
  705. state->Init_Ctrl[13].val[6] = 0;
  706. state->Init_Ctrl[14].Ctrl_Num = CHCAL_FRAC_MOD_IF ;
  707. state->Init_Ctrl[14].size = 16 ;
  708. state->Init_Ctrl[14].addr[0] = 13;
  709. state->Init_Ctrl[14].bit[0] = 0;
  710. state->Init_Ctrl[14].val[0] = 0;
  711. state->Init_Ctrl[14].addr[1] = 13;
  712. state->Init_Ctrl[14].bit[1] = 1;
  713. state->Init_Ctrl[14].val[1] = 0;
  714. state->Init_Ctrl[14].addr[2] = 13;
  715. state->Init_Ctrl[14].bit[2] = 2;
  716. state->Init_Ctrl[14].val[2] = 0;
  717. state->Init_Ctrl[14].addr[3] = 13;
  718. state->Init_Ctrl[14].bit[3] = 3;
  719. state->Init_Ctrl[14].val[3] = 0;
  720. state->Init_Ctrl[14].addr[4] = 13;
  721. state->Init_Ctrl[14].bit[4] = 4;
  722. state->Init_Ctrl[14].val[4] = 0;
  723. state->Init_Ctrl[14].addr[5] = 13;
  724. state->Init_Ctrl[14].bit[5] = 5;
  725. state->Init_Ctrl[14].val[5] = 0;
  726. state->Init_Ctrl[14].addr[6] = 13;
  727. state->Init_Ctrl[14].bit[6] = 6;
  728. state->Init_Ctrl[14].val[6] = 0;
  729. state->Init_Ctrl[14].addr[7] = 13;
  730. state->Init_Ctrl[14].bit[7] = 7;
  731. state->Init_Ctrl[14].val[7] = 0;
  732. state->Init_Ctrl[14].addr[8] = 12;
  733. state->Init_Ctrl[14].bit[8] = 0;
  734. state->Init_Ctrl[14].val[8] = 0;
  735. state->Init_Ctrl[14].addr[9] = 12;
  736. state->Init_Ctrl[14].bit[9] = 1;
  737. state->Init_Ctrl[14].val[9] = 0;
  738. state->Init_Ctrl[14].addr[10] = 12;
  739. state->Init_Ctrl[14].bit[10] = 2;
  740. state->Init_Ctrl[14].val[10] = 0;
  741. state->Init_Ctrl[14].addr[11] = 12;
  742. state->Init_Ctrl[14].bit[11] = 3;
  743. state->Init_Ctrl[14].val[11] = 0;
  744. state->Init_Ctrl[14].addr[12] = 12;
  745. state->Init_Ctrl[14].bit[12] = 4;
  746. state->Init_Ctrl[14].val[12] = 0;
  747. state->Init_Ctrl[14].addr[13] = 12;
  748. state->Init_Ctrl[14].bit[13] = 5;
  749. state->Init_Ctrl[14].val[13] = 1;
  750. state->Init_Ctrl[14].addr[14] = 12;
  751. state->Init_Ctrl[14].bit[14] = 6;
  752. state->Init_Ctrl[14].val[14] = 1;
  753. state->Init_Ctrl[14].addr[15] = 12;
  754. state->Init_Ctrl[14].bit[15] = 7;
  755. state->Init_Ctrl[14].val[15] = 0;
  756. state->Init_Ctrl[15].Ctrl_Num = DRV_RES_SEL ;
  757. state->Init_Ctrl[15].size = 3 ;
  758. state->Init_Ctrl[15].addr[0] = 147;
  759. state->Init_Ctrl[15].bit[0] = 2;
  760. state->Init_Ctrl[15].val[0] = 0;
  761. state->Init_Ctrl[15].addr[1] = 147;
  762. state->Init_Ctrl[15].bit[1] = 3;
  763. state->Init_Ctrl[15].val[1] = 1;
  764. state->Init_Ctrl[15].addr[2] = 147;
  765. state->Init_Ctrl[15].bit[2] = 4;
  766. state->Init_Ctrl[15].val[2] = 1;
  767. state->Init_Ctrl[16].Ctrl_Num = I_DRIVER ;
  768. state->Init_Ctrl[16].size = 2 ;
  769. state->Init_Ctrl[16].addr[0] = 147;
  770. state->Init_Ctrl[16].bit[0] = 0;
  771. state->Init_Ctrl[16].val[0] = 0;
  772. state->Init_Ctrl[16].addr[1] = 147;
  773. state->Init_Ctrl[16].bit[1] = 1;
  774. state->Init_Ctrl[16].val[1] = 1;
  775. state->Init_Ctrl[17].Ctrl_Num = EN_AAF ;
  776. state->Init_Ctrl[17].size = 1 ;
  777. state->Init_Ctrl[17].addr[0] = 147;
  778. state->Init_Ctrl[17].bit[0] = 7;
  779. state->Init_Ctrl[17].val[0] = 0;
  780. state->Init_Ctrl[18].Ctrl_Num = EN_3P ;
  781. state->Init_Ctrl[18].size = 1 ;
  782. state->Init_Ctrl[18].addr[0] = 147;
  783. state->Init_Ctrl[18].bit[0] = 6;
  784. state->Init_Ctrl[18].val[0] = 0;
  785. state->Init_Ctrl[19].Ctrl_Num = EN_AUX_3P ;
  786. state->Init_Ctrl[19].size = 1 ;
  787. state->Init_Ctrl[19].addr[0] = 156;
  788. state->Init_Ctrl[19].bit[0] = 0;
  789. state->Init_Ctrl[19].val[0] = 0;
  790. state->Init_Ctrl[20].Ctrl_Num = SEL_AAF_BAND ;
  791. state->Init_Ctrl[20].size = 1 ;
  792. state->Init_Ctrl[20].addr[0] = 147;
  793. state->Init_Ctrl[20].bit[0] = 5;
  794. state->Init_Ctrl[20].val[0] = 0;
  795. state->Init_Ctrl[21].Ctrl_Num = SEQ_ENCLK16_CLK_OUT ;
  796. state->Init_Ctrl[21].size = 1 ;
  797. state->Init_Ctrl[21].addr[0] = 137;
  798. state->Init_Ctrl[21].bit[0] = 4;
  799. state->Init_Ctrl[21].val[0] = 0;
  800. state->Init_Ctrl[22].Ctrl_Num = SEQ_SEL4_16B ;
  801. state->Init_Ctrl[22].size = 1 ;
  802. state->Init_Ctrl[22].addr[0] = 137;
  803. state->Init_Ctrl[22].bit[0] = 7;
  804. state->Init_Ctrl[22].val[0] = 0;
  805. state->Init_Ctrl[23].Ctrl_Num = XTAL_CAPSELECT ;
  806. state->Init_Ctrl[23].size = 1 ;
  807. state->Init_Ctrl[23].addr[0] = 91;
  808. state->Init_Ctrl[23].bit[0] = 5;
  809. state->Init_Ctrl[23].val[0] = 1;
  810. state->Init_Ctrl[24].Ctrl_Num = IF_SEL_DBL ;
  811. state->Init_Ctrl[24].size = 1 ;
  812. state->Init_Ctrl[24].addr[0] = 43;
  813. state->Init_Ctrl[24].bit[0] = 0;
  814. state->Init_Ctrl[24].val[0] = 1;
  815. state->Init_Ctrl[25].Ctrl_Num = RFSYN_R_DIV ;
  816. state->Init_Ctrl[25].size = 2 ;
  817. state->Init_Ctrl[25].addr[0] = 22;
  818. state->Init_Ctrl[25].bit[0] = 0;
  819. state->Init_Ctrl[25].val[0] = 1;
  820. state->Init_Ctrl[25].addr[1] = 22;
  821. state->Init_Ctrl[25].bit[1] = 1;
  822. state->Init_Ctrl[25].val[1] = 1;
  823. state->Init_Ctrl[26].Ctrl_Num = SEQ_EXTSYNTHCALIF ;
  824. state->Init_Ctrl[26].size = 1 ;
  825. state->Init_Ctrl[26].addr[0] = 134;
  826. state->Init_Ctrl[26].bit[0] = 2;
  827. state->Init_Ctrl[26].val[0] = 0;
  828. state->Init_Ctrl[27].Ctrl_Num = SEQ_EXTDCCAL ;
  829. state->Init_Ctrl[27].size = 1 ;
  830. state->Init_Ctrl[27].addr[0] = 137;
  831. state->Init_Ctrl[27].bit[0] = 3;
  832. state->Init_Ctrl[27].val[0] = 0;
  833. state->Init_Ctrl[28].Ctrl_Num = AGC_EN_RSSI ;
  834. state->Init_Ctrl[28].size = 1 ;
  835. state->Init_Ctrl[28].addr[0] = 77;
  836. state->Init_Ctrl[28].bit[0] = 7;
  837. state->Init_Ctrl[28].val[0] = 0;
  838. state->Init_Ctrl[29].Ctrl_Num = RFA_ENCLKRFAGC ;
  839. state->Init_Ctrl[29].size = 1 ;
  840. state->Init_Ctrl[29].addr[0] = 166;
  841. state->Init_Ctrl[29].bit[0] = 7;
  842. state->Init_Ctrl[29].val[0] = 1;
  843. state->Init_Ctrl[30].Ctrl_Num = RFA_RSSI_REFH ;
  844. state->Init_Ctrl[30].size = 3 ;
  845. state->Init_Ctrl[30].addr[0] = 166;
  846. state->Init_Ctrl[30].bit[0] = 0;
  847. state->Init_Ctrl[30].val[0] = 0;
  848. state->Init_Ctrl[30].addr[1] = 166;
  849. state->Init_Ctrl[30].bit[1] = 1;
  850. state->Init_Ctrl[30].val[1] = 1;
  851. state->Init_Ctrl[30].addr[2] = 166;
  852. state->Init_Ctrl[30].bit[2] = 2;
  853. state->Init_Ctrl[30].val[2] = 1;
  854. state->Init_Ctrl[31].Ctrl_Num = RFA_RSSI_REF ;
  855. state->Init_Ctrl[31].size = 3 ;
  856. state->Init_Ctrl[31].addr[0] = 166;
  857. state->Init_Ctrl[31].bit[0] = 3;
  858. state->Init_Ctrl[31].val[0] = 1;
  859. state->Init_Ctrl[31].addr[1] = 166;
  860. state->Init_Ctrl[31].bit[1] = 4;
  861. state->Init_Ctrl[31].val[1] = 0;
  862. state->Init_Ctrl[31].addr[2] = 166;
  863. state->Init_Ctrl[31].bit[2] = 5;
  864. state->Init_Ctrl[31].val[2] = 1;
  865. state->Init_Ctrl[32].Ctrl_Num = RFA_RSSI_REFL ;
  866. state->Init_Ctrl[32].size = 3 ;
  867. state->Init_Ctrl[32].addr[0] = 167;
  868. state->Init_Ctrl[32].bit[0] = 0;
  869. state->Init_Ctrl[32].val[0] = 1;
  870. state->Init_Ctrl[32].addr[1] = 167;
  871. state->Init_Ctrl[32].bit[1] = 1;
  872. state->Init_Ctrl[32].val[1] = 1;
  873. state->Init_Ctrl[32].addr[2] = 167;
  874. state->Init_Ctrl[32].bit[2] = 2;
  875. state->Init_Ctrl[32].val[2] = 0;
  876. state->Init_Ctrl[33].Ctrl_Num = RFA_FLR ;
  877. state->Init_Ctrl[33].size = 4 ;
  878. state->Init_Ctrl[33].addr[0] = 168;
  879. state->Init_Ctrl[33].bit[0] = 0;
  880. state->Init_Ctrl[33].val[0] = 0;
  881. state->Init_Ctrl[33].addr[1] = 168;
  882. state->Init_Ctrl[33].bit[1] = 1;
  883. state->Init_Ctrl[33].val[1] = 1;
  884. state->Init_Ctrl[33].addr[2] = 168;
  885. state->Init_Ctrl[33].bit[2] = 2;
  886. state->Init_Ctrl[33].val[2] = 0;
  887. state->Init_Ctrl[33].addr[3] = 168;
  888. state->Init_Ctrl[33].bit[3] = 3;
  889. state->Init_Ctrl[33].val[3] = 0;
  890. state->Init_Ctrl[34].Ctrl_Num = RFA_CEIL ;
  891. state->Init_Ctrl[34].size = 4 ;
  892. state->Init_Ctrl[34].addr[0] = 168;
  893. state->Init_Ctrl[34].bit[0] = 4;
  894. state->Init_Ctrl[34].val[0] = 1;
  895. state->Init_Ctrl[34].addr[1] = 168;
  896. state->Init_Ctrl[34].bit[1] = 5;
  897. state->Init_Ctrl[34].val[1] = 1;
  898. state->Init_Ctrl[34].addr[2] = 168;
  899. state->Init_Ctrl[34].bit[2] = 6;
  900. state->Init_Ctrl[34].val[2] = 1;
  901. state->Init_Ctrl[34].addr[3] = 168;
  902. state->Init_Ctrl[34].bit[3] = 7;
  903. state->Init_Ctrl[34].val[3] = 1;
  904. state->Init_Ctrl[35].Ctrl_Num = SEQ_EXTIQFSMPULSE ;
  905. state->Init_Ctrl[35].size = 1 ;
  906. state->Init_Ctrl[35].addr[0] = 135;
  907. state->Init_Ctrl[35].bit[0] = 0;
  908. state->Init_Ctrl[35].val[0] = 0;
  909. state->Init_Ctrl[36].Ctrl_Num = OVERRIDE_1 ;
  910. state->Init_Ctrl[36].size = 1 ;
  911. state->Init_Ctrl[36].addr[0] = 56;
  912. state->Init_Ctrl[36].bit[0] = 3;
  913. state->Init_Ctrl[36].val[0] = 0;
  914. state->Init_Ctrl[37].Ctrl_Num = BB_INITSTATE_DLPF_TUNE ;
  915. state->Init_Ctrl[37].size = 7 ;
  916. state->Init_Ctrl[37].addr[0] = 59;
  917. state->Init_Ctrl[37].bit[0] = 1;
  918. state->Init_Ctrl[37].val[0] = 0;
  919. state->Init_Ctrl[37].addr[1] = 59;
  920. state->Init_Ctrl[37].bit[1] = 2;
  921. state->Init_Ctrl[37].val[1] = 0;
  922. state->Init_Ctrl[37].addr[2] = 59;
  923. state->Init_Ctrl[37].bit[2] = 3;
  924. state->Init_Ctrl[37].val[2] = 0;
  925. state->Init_Ctrl[37].addr[3] = 59;
  926. state->Init_Ctrl[37].bit[3] = 4;
  927. state->Init_Ctrl[37].val[3] = 0;
  928. state->Init_Ctrl[37].addr[4] = 59;
  929. state->Init_Ctrl[37].bit[4] = 5;
  930. state->Init_Ctrl[37].val[4] = 0;
  931. state->Init_Ctrl[37].addr[5] = 59;
  932. state->Init_Ctrl[37].bit[5] = 6;
  933. state->Init_Ctrl[37].val[5] = 0;
  934. state->Init_Ctrl[37].addr[6] = 59;
  935. state->Init_Ctrl[37].bit[6] = 7;
  936. state->Init_Ctrl[37].val[6] = 0;
  937. state->Init_Ctrl[38].Ctrl_Num = TG_R_DIV ;
  938. state->Init_Ctrl[38].size = 6 ;
  939. state->Init_Ctrl[38].addr[0] = 32;
  940. state->Init_Ctrl[38].bit[0] = 2;
  941. state->Init_Ctrl[38].val[0] = 0;
  942. state->Init_Ctrl[38].addr[1] = 32;
  943. state->Init_Ctrl[38].bit[1] = 3;
  944. state->Init_Ctrl[38].val[1] = 0;
  945. state->Init_Ctrl[38].addr[2] = 32;
  946. state->Init_Ctrl[38].bit[2] = 4;
  947. state->Init_Ctrl[38].val[2] = 0;
  948. state->Init_Ctrl[38].addr[3] = 32;
  949. state->Init_Ctrl[38].bit[3] = 5;
  950. state->Init_Ctrl[38].val[3] = 0;
  951. state->Init_Ctrl[38].addr[4] = 32;
  952. state->Init_Ctrl[38].bit[4] = 6;
  953. state->Init_Ctrl[38].val[4] = 1;
  954. state->Init_Ctrl[38].addr[5] = 32;
  955. state->Init_Ctrl[38].bit[5] = 7;
  956. state->Init_Ctrl[38].val[5] = 0;
  957. state->Init_Ctrl[39].Ctrl_Num = EN_CHP_LIN_B ;
  958. state->Init_Ctrl[39].size = 1 ;
  959. state->Init_Ctrl[39].addr[0] = 25;
  960. state->Init_Ctrl[39].bit[0] = 3;
  961. state->Init_Ctrl[39].val[0] = 1;
  962. state->CH_Ctrl_Num = CHCTRL_NUM ;
  963. state->CH_Ctrl[0].Ctrl_Num = DN_POLY ;
  964. state->CH_Ctrl[0].size = 2 ;
  965. state->CH_Ctrl[0].addr[0] = 68;
  966. state->CH_Ctrl[0].bit[0] = 6;
  967. state->CH_Ctrl[0].val[0] = 1;
  968. state->CH_Ctrl[0].addr[1] = 68;
  969. state->CH_Ctrl[0].bit[1] = 7;
  970. state->CH_Ctrl[0].val[1] = 1;
  971. state->CH_Ctrl[1].Ctrl_Num = DN_RFGAIN ;
  972. state->CH_Ctrl[1].size = 2 ;
  973. state->CH_Ctrl[1].addr[0] = 70;
  974. state->CH_Ctrl[1].bit[0] = 6;
  975. state->CH_Ctrl[1].val[0] = 1;
  976. state->CH_Ctrl[1].addr[1] = 70;
  977. state->CH_Ctrl[1].bit[1] = 7;
  978. state->CH_Ctrl[1].val[1] = 0;
  979. state->CH_Ctrl[2].Ctrl_Num = DN_CAP_RFLPF ;
  980. state->CH_Ctrl[2].size = 9 ;
  981. state->CH_Ctrl[2].addr[0] = 69;
  982. state->CH_Ctrl[2].bit[0] = 5;
  983. state->CH_Ctrl[2].val[0] = 0;
  984. state->CH_Ctrl[2].addr[1] = 69;
  985. state->CH_Ctrl[2].bit[1] = 6;
  986. state->CH_Ctrl[2].val[1] = 0;
  987. state->CH_Ctrl[2].addr[2] = 69;
  988. state->CH_Ctrl[2].bit[2] = 7;
  989. state->CH_Ctrl[2].val[2] = 0;
  990. state->CH_Ctrl[2].addr[3] = 68;
  991. state->CH_Ctrl[2].bit[3] = 0;
  992. state->CH_Ctrl[2].val[3] = 0;
  993. state->CH_Ctrl[2].addr[4] = 68;
  994. state->CH_Ctrl[2].bit[4] = 1;
  995. state->CH_Ctrl[2].val[4] = 0;
  996. state->CH_Ctrl[2].addr[5] = 68;
  997. state->CH_Ctrl[2].bit[5] = 2;
  998. state->CH_Ctrl[2].val[5] = 0;
  999. state->CH_Ctrl[2].addr[6] = 68;
  1000. state->CH_Ctrl[2].bit[6] = 3;
  1001. state->CH_Ctrl[2].val[6] = 0;
  1002. state->CH_Ctrl[2].addr[7] = 68;
  1003. state->CH_Ctrl[2].bit[7] = 4;
  1004. state->CH_Ctrl[2].val[7] = 0;
  1005. state->CH_Ctrl[2].addr[8] = 68;
  1006. state->CH_Ctrl[2].bit[8] = 5;
  1007. state->CH_Ctrl[2].val[8] = 0;
  1008. state->CH_Ctrl[3].Ctrl_Num = DN_EN_VHFUHFBAR ;
  1009. state->CH_Ctrl[3].size = 1 ;
  1010. state->CH_Ctrl[3].addr[0] = 70;
  1011. state->CH_Ctrl[3].bit[0] = 5;
  1012. state->CH_Ctrl[3].val[0] = 0;
  1013. state->CH_Ctrl[4].Ctrl_Num = DN_GAIN_ADJUST ;
  1014. state->CH_Ctrl[4].size = 3 ;
  1015. state->CH_Ctrl[4].addr[0] = 73;
  1016. state->CH_Ctrl[4].bit[0] = 4;
  1017. state->CH_Ctrl[4].val[0] = 0;
  1018. state->CH_Ctrl[4].addr[1] = 73;
  1019. state->CH_Ctrl[4].bit[1] = 5;
  1020. state->CH_Ctrl[4].val[1] = 1;
  1021. state->CH_Ctrl[4].addr[2] = 73;
  1022. state->CH_Ctrl[4].bit[2] = 6;
  1023. state->CH_Ctrl[4].val[2] = 0;
  1024. state->CH_Ctrl[5].Ctrl_Num = DN_IQTNBUF_AMP ;
  1025. state->CH_Ctrl[5].size = 4 ;
  1026. state->CH_Ctrl[5].addr[0] = 70;
  1027. state->CH_Ctrl[5].bit[0] = 0;
  1028. state->CH_Ctrl[5].val[0] = 0;
  1029. state->CH_Ctrl[5].addr[1] = 70;
  1030. state->CH_Ctrl[5].bit[1] = 1;
  1031. state->CH_Ctrl[5].val[1] = 0;
  1032. state->CH_Ctrl[5].addr[2] = 70;
  1033. state->CH_Ctrl[5].bit[2] = 2;
  1034. state->CH_Ctrl[5].val[2] = 0;
  1035. state->CH_Ctrl[5].addr[3] = 70;
  1036. state->CH_Ctrl[5].bit[3] = 3;
  1037. state->CH_Ctrl[5].val[3] = 0;
  1038. state->CH_Ctrl[6].Ctrl_Num = DN_IQTNGNBFBIAS_BST ;
  1039. state->CH_Ctrl[6].size = 1 ;
  1040. state->CH_Ctrl[6].addr[0] = 70;
  1041. state->CH_Ctrl[6].bit[0] = 4;
  1042. state->CH_Ctrl[6].val[0] = 1;
  1043. state->CH_Ctrl[7].Ctrl_Num = RFSYN_EN_OUTMUX ;
  1044. state->CH_Ctrl[7].size = 1 ;
  1045. state->CH_Ctrl[7].addr[0] = 111;
  1046. state->CH_Ctrl[7].bit[0] = 4;
  1047. state->CH_Ctrl[7].val[0] = 0;
  1048. state->CH_Ctrl[8].Ctrl_Num = RFSYN_SEL_VCO_OUT ;
  1049. state->CH_Ctrl[8].size = 1 ;
  1050. state->CH_Ctrl[8].addr[0] = 111;
  1051. state->CH_Ctrl[8].bit[0] = 7;
  1052. state->CH_Ctrl[8].val[0] = 1;
  1053. state->CH_Ctrl[9].Ctrl_Num = RFSYN_SEL_VCO_HI ;
  1054. state->CH_Ctrl[9].size = 1 ;
  1055. state->CH_Ctrl[9].addr[0] = 111;
  1056. state->CH_Ctrl[9].bit[0] = 6;
  1057. state->CH_Ctrl[9].val[0] = 1;
  1058. state->CH_Ctrl[10].Ctrl_Num = RFSYN_SEL_DIVM ;
  1059. state->CH_Ctrl[10].size = 1 ;
  1060. state->CH_Ctrl[10].addr[0] = 111;
  1061. state->CH_Ctrl[10].bit[0] = 5;
  1062. state->CH_Ctrl[10].val[0] = 0;
  1063. state->CH_Ctrl[11].Ctrl_Num = RFSYN_RF_DIV_BIAS ;
  1064. state->CH_Ctrl[11].size = 2 ;
  1065. state->CH_Ctrl[11].addr[0] = 110;
  1066. state->CH_Ctrl[11].bit[0] = 0;
  1067. state->CH_Ctrl[11].val[0] = 1;
  1068. state->CH_Ctrl[11].addr[1] = 110;
  1069. state->CH_Ctrl[11].bit[1] = 1;
  1070. state->CH_Ctrl[11].val[1] = 0;
  1071. state->CH_Ctrl[12].Ctrl_Num = DN_SEL_FREQ ;
  1072. state->CH_Ctrl[12].size = 3 ;
  1073. state->CH_Ctrl[12].addr[0] = 69;
  1074. state->CH_Ctrl[12].bit[0] = 2;
  1075. state->CH_Ctrl[12].val[0] = 0;
  1076. state->CH_Ctrl[12].addr[1] = 69;
  1077. state->CH_Ctrl[12].bit[1] = 3;
  1078. state->CH_Ctrl[12].val[1] = 0;
  1079. state->CH_Ctrl[12].addr[2] = 69;
  1080. state->CH_Ctrl[12].bit[2] = 4;
  1081. state->CH_Ctrl[12].val[2] = 0;
  1082. state->CH_Ctrl[13].Ctrl_Num = RFSYN_VCO_BIAS ;
  1083. state->CH_Ctrl[13].size = 6 ;
  1084. state->CH_Ctrl[13].addr[0] = 110;
  1085. state->CH_Ctrl[13].bit[0] = 2;
  1086. state->CH_Ctrl[13].val[0] = 0;
  1087. state->CH_Ctrl[13].addr[1] = 110;
  1088. state->CH_Ctrl[13].bit[1] = 3;
  1089. state->CH_Ctrl[13].val[1] = 0;
  1090. state->CH_Ctrl[13].addr[2] = 110;
  1091. state->CH_Ctrl[13].bit[2] = 4;
  1092. state->CH_Ctrl[13].val[2] = 0;
  1093. state->CH_Ctrl[13].addr[3] = 110;
  1094. state->CH_Ctrl[13].bit[3] = 5;
  1095. state->CH_Ctrl[13].val[3] = 0;
  1096. state->CH_Ctrl[13].addr[4] = 110;
  1097. state->CH_Ctrl[13].bit[4] = 6;
  1098. state->CH_Ctrl[13].val[4] = 0;
  1099. state->CH_Ctrl[13].addr[5] = 110;
  1100. state->CH_Ctrl[13].bit[5] = 7;
  1101. state->CH_Ctrl[13].val[5] = 1;
  1102. state->CH_Ctrl[14].Ctrl_Num = CHCAL_INT_MOD_RF ;
  1103. state->CH_Ctrl[14].size = 7 ;
  1104. state->CH_Ctrl[14].addr[0] = 14;
  1105. state->CH_Ctrl[14].bit[0] = 0;
  1106. state->CH_Ctrl[14].val[0] = 0;
  1107. state->CH_Ctrl[14].addr[1] = 14;
  1108. state->CH_Ctrl[14].bit[1] = 1;
  1109. state->CH_Ctrl[14].val[1] = 0;
  1110. state->CH_Ctrl[14].addr[2] = 14;
  1111. state->CH_Ctrl[14].bit[2] = 2;
  1112. state->CH_Ctrl[14].val[2] = 0;
  1113. state->CH_Ctrl[14].addr[3] = 14;
  1114. state->CH_Ctrl[14].bit[3] = 3;
  1115. state->CH_Ctrl[14].val[3] = 0;
  1116. state->CH_Ctrl[14].addr[4] = 14;
  1117. state->CH_Ctrl[14].bit[4] = 4;
  1118. state->CH_Ctrl[14].val[4] = 0;
  1119. state->CH_Ctrl[14].addr[5] = 14;
  1120. state->CH_Ctrl[14].bit[5] = 5;
  1121. state->CH_Ctrl[14].val[5] = 0;
  1122. state->CH_Ctrl[14].addr[6] = 14;
  1123. state->CH_Ctrl[14].bit[6] = 6;
  1124. state->CH_Ctrl[14].val[6] = 0;
  1125. state->CH_Ctrl[15].Ctrl_Num = CHCAL_FRAC_MOD_RF ;
  1126. state->CH_Ctrl[15].size = 18 ;
  1127. state->CH_Ctrl[15].addr[0] = 17;
  1128. state->CH_Ctrl[15].bit[0] = 6;
  1129. state->CH_Ctrl[15].val[0] = 0;
  1130. state->CH_Ctrl[15].addr[1] = 17;
  1131. state->CH_Ctrl[15].bit[1] = 7;
  1132. state->CH_Ctrl[15].val[1] = 0;
  1133. state->CH_Ctrl[15].addr[2] = 16;
  1134. state->CH_Ctrl[15].bit[2] = 0;
  1135. state->CH_Ctrl[15].val[2] = 0;
  1136. state->CH_Ctrl[15].addr[3] = 16;
  1137. state->CH_Ctrl[15].bit[3] = 1;
  1138. state->CH_Ctrl[15].val[3] = 0;
  1139. state->CH_Ctrl[15].addr[4] = 16;
  1140. state->CH_Ctrl[15].bit[4] = 2;
  1141. state->CH_Ctrl[15].val[4] = 0;
  1142. state->CH_Ctrl[15].addr[5] = 16;
  1143. state->CH_Ctrl[15].bit[5] = 3;
  1144. state->CH_Ctrl[15].val[5] = 0;
  1145. state->CH_Ctrl[15].addr[6] = 16;
  1146. state->CH_Ctrl[15].bit[6] = 4;
  1147. state->CH_Ctrl[15].val[6] = 0;
  1148. state->CH_Ctrl[15].addr[7] = 16;
  1149. state->CH_Ctrl[15].bit[7] = 5;
  1150. state->CH_Ctrl[15].val[7] = 0;
  1151. state->CH_Ctrl[15].addr[8] = 16;
  1152. state->CH_Ctrl[15].bit[8] = 6;
  1153. state->CH_Ctrl[15].val[8] = 0;
  1154. state->CH_Ctrl[15].addr[9] = 16;
  1155. state->CH_Ctrl[15].bit[9] = 7;
  1156. state->CH_Ctrl[15].val[9] = 0;
  1157. state->CH_Ctrl[15].addr[10] = 15;
  1158. state->CH_Ctrl[15].bit[10] = 0;
  1159. state->CH_Ctrl[15].val[10] = 0;
  1160. state->CH_Ctrl[15].addr[11] = 15;
  1161. state->CH_Ctrl[15].bit[11] = 1;
  1162. state->CH_Ctrl[15].val[11] = 0;
  1163. state->CH_Ctrl[15].addr[12] = 15;
  1164. state->CH_Ctrl[15].bit[12] = 2;
  1165. state->CH_Ctrl[15].val[12] = 0;
  1166. state->CH_Ctrl[15].addr[13] = 15;
  1167. state->CH_Ctrl[15].bit[13] = 3;
  1168. state->CH_Ctrl[15].val[13] = 0;
  1169. state->CH_Ctrl[15].addr[14] = 15;
  1170. state->CH_Ctrl[15].bit[14] = 4;
  1171. state->CH_Ctrl[15].val[14] = 0;
  1172. state->CH_Ctrl[15].addr[15] = 15;
  1173. state->CH_Ctrl[15].bit[15] = 5;
  1174. state->CH_Ctrl[15].val[15] = 0;
  1175. state->CH_Ctrl[15].addr[16] = 15;
  1176. state->CH_Ctrl[15].bit[16] = 6;
  1177. state->CH_Ctrl[15].val[16] = 1;
  1178. state->CH_Ctrl[15].addr[17] = 15;
  1179. state->CH_Ctrl[15].bit[17] = 7;
  1180. state->CH_Ctrl[15].val[17] = 1;
  1181. state->CH_Ctrl[16].Ctrl_Num = RFSYN_LPF_R ;
  1182. state->CH_Ctrl[16].size = 5 ;
  1183. state->CH_Ctrl[16].addr[0] = 112;
  1184. state->CH_Ctrl[16].bit[0] = 0;
  1185. state->CH_Ctrl[16].val[0] = 0;
  1186. state->CH_Ctrl[16].addr[1] = 112;
  1187. state->CH_Ctrl[16].bit[1] = 1;
  1188. state->CH_Ctrl[16].val[1] = 0;
  1189. state->CH_Ctrl[16].addr[2] = 112;
  1190. state->CH_Ctrl[16].bit[2] = 2;
  1191. state->CH_Ctrl[16].val[2] = 0;
  1192. state->CH_Ctrl[16].addr[3] = 112;
  1193. state->CH_Ctrl[16].bit[3] = 3;
  1194. state->CH_Ctrl[16].val[3] = 0;
  1195. state->CH_Ctrl[16].addr[4] = 112;
  1196. state->CH_Ctrl[16].bit[4] = 4;
  1197. state->CH_Ctrl[16].val[4] = 1;
  1198. state->CH_Ctrl[17].Ctrl_Num = CHCAL_EN_INT_RF ;
  1199. state->CH_Ctrl[17].size = 1 ;
  1200. state->CH_Ctrl[17].addr[0] = 14;
  1201. state->CH_Ctrl[17].bit[0] = 7;
  1202. state->CH_Ctrl[17].val[0] = 0;
  1203. state->CH_Ctrl[18].Ctrl_Num = TG_LO_DIVVAL ;
  1204. state->CH_Ctrl[18].size = 4 ;
  1205. state->CH_Ctrl[18].addr[0] = 107;
  1206. state->CH_Ctrl[18].bit[0] = 3;
  1207. state->CH_Ctrl[18].val[0] = 0;
  1208. state->CH_Ctrl[18].addr[1] = 107;
  1209. state->CH_Ctrl[18].bit[1] = 4;
  1210. state->CH_Ctrl[18].val[1] = 0;
  1211. state->CH_Ctrl[18].addr[2] = 107;
  1212. state->CH_Ctrl[18].bit[2] = 5;
  1213. state->CH_Ctrl[18].val[2] = 0;
  1214. state->CH_Ctrl[18].addr[3] = 107;
  1215. state->CH_Ctrl[18].bit[3] = 6;
  1216. state->CH_Ctrl[18].val[3] = 0;
  1217. state->CH_Ctrl[19].Ctrl_Num = TG_LO_SELVAL ;
  1218. state->CH_Ctrl[19].size = 3 ;
  1219. state->CH_Ctrl[19].addr[0] = 107;
  1220. state->CH_Ctrl[19].bit[0] = 7;
  1221. state->CH_Ctrl[19].val[0] = 1;
  1222. state->CH_Ctrl[19].addr[1] = 106;
  1223. state->CH_Ctrl[19].bit[1] = 0;
  1224. state->CH_Ctrl[19].val[1] = 1;
  1225. state->CH_Ctrl[19].addr[2] = 106;
  1226. state->CH_Ctrl[19].bit[2] = 1;
  1227. state->CH_Ctrl[19].val[2] = 1;
  1228. state->CH_Ctrl[20].Ctrl_Num = TG_DIV_VAL ;
  1229. state->CH_Ctrl[20].size = 11 ;
  1230. state->CH_Ctrl[20].addr[0] = 109;
  1231. state->CH_Ctrl[20].bit[0] = 2;
  1232. state->CH_Ctrl[20].val[0] = 0;
  1233. state->CH_Ctrl[20].addr[1] = 109;
  1234. state->CH_Ctrl[20].bit[1] = 3;
  1235. state->CH_Ctrl[20].val[1] = 0;
  1236. state->CH_Ctrl[20].addr[2] = 109;
  1237. state->CH_Ctrl[20].bit[2] = 4;
  1238. state->CH_Ctrl[20].val[2] = 0;
  1239. state->CH_Ctrl[20].addr[3] = 109;
  1240. state->CH_Ctrl[20].bit[3] = 5;
  1241. state->CH_Ctrl[20].val[3] = 0;
  1242. state->CH_Ctrl[20].addr[4] = 109;
  1243. state->CH_Ctrl[20].bit[4] = 6;
  1244. state->CH_Ctrl[20].val[4] = 0;
  1245. state->CH_Ctrl[20].addr[5] = 109;
  1246. state->CH_Ctrl[20].bit[5] = 7;
  1247. state->CH_Ctrl[20].val[5] = 0;
  1248. state->CH_Ctrl[20].addr[6] = 108;
  1249. state->CH_Ctrl[20].bit[6] = 0;
  1250. state->CH_Ctrl[20].val[6] = 0;
  1251. state->CH_Ctrl[20].addr[7] = 108;
  1252. state->CH_Ctrl[20].bit[7] = 1;
  1253. state->CH_Ctrl[20].val[7] = 0;
  1254. state->CH_Ctrl[20].addr[8] = 108;
  1255. state->CH_Ctrl[20].bit[8] = 2;
  1256. state->CH_Ctrl[20].val[8] = 1;
  1257. state->CH_Ctrl[20].addr[9] = 108;
  1258. state->CH_Ctrl[20].bit[9] = 3;
  1259. state->CH_Ctrl[20].val[9] = 1;
  1260. state->CH_Ctrl[20].addr[10] = 108;
  1261. state->CH_Ctrl[20].bit[10] = 4;
  1262. state->CH_Ctrl[20].val[10] = 1;
  1263. state->CH_Ctrl[21].Ctrl_Num = TG_VCO_BIAS ;
  1264. state->CH_Ctrl[21].size = 6 ;
  1265. state->CH_Ctrl[21].addr[0] = 106;
  1266. state->CH_Ctrl[21].bit[0] = 2;
  1267. state->CH_Ctrl[21].val[0] = 0;
  1268. state->CH_Ctrl[21].addr[1] = 106;
  1269. state->CH_Ctrl[21].bit[1] = 3;
  1270. state->CH_Ctrl[21].val[1] = 0;
  1271. state->CH_Ctrl[21].addr[2] = 106;
  1272. state->CH_Ctrl[21].bit[2] = 4;
  1273. state->CH_Ctrl[21].val[2] = 0;
  1274. state->CH_Ctrl[21].addr[3] = 106;
  1275. state->CH_Ctrl[21].bit[3] = 5;
  1276. state->CH_Ctrl[21].val[3] = 0;
  1277. state->CH_Ctrl[21].addr[4] = 106;
  1278. state->CH_Ctrl[21].bit[4] = 6;
  1279. state->CH_Ctrl[21].val[4] = 0;
  1280. state->CH_Ctrl[21].addr[5] = 106;
  1281. state->CH_Ctrl[21].bit[5] = 7;
  1282. state->CH_Ctrl[21].val[5] = 1;
  1283. state->CH_Ctrl[22].Ctrl_Num = SEQ_EXTPOWERUP ;
  1284. state->CH_Ctrl[22].size = 1 ;
  1285. state->CH_Ctrl[22].addr[0] = 138;
  1286. state->CH_Ctrl[22].bit[0] = 4;
  1287. state->CH_Ctrl[22].val[0] = 1;
  1288. state->CH_Ctrl[23].Ctrl_Num = OVERRIDE_2 ;
  1289. state->CH_Ctrl[23].size = 1 ;
  1290. state->CH_Ctrl[23].addr[0] = 17;
  1291. state->CH_Ctrl[23].bit[0] = 5;
  1292. state->CH_Ctrl[23].val[0] = 0;
  1293. state->CH_Ctrl[24].Ctrl_Num = OVERRIDE_3 ;
  1294. state->CH_Ctrl[24].size = 1 ;
  1295. state->CH_Ctrl[24].addr[0] = 111;
  1296. state->CH_Ctrl[24].bit[0] = 3;
  1297. state->CH_Ctrl[24].val[0] = 0;
  1298. state->CH_Ctrl[25].Ctrl_Num = OVERRIDE_4 ;
  1299. state->CH_Ctrl[25].size = 1 ;
  1300. state->CH_Ctrl[25].addr[0] = 112;
  1301. state->CH_Ctrl[25].bit[0] = 7;
  1302. state->CH_Ctrl[25].val[0] = 0;
  1303. state->CH_Ctrl[26].Ctrl_Num = SEQ_FSM_PULSE ;
  1304. state->CH_Ctrl[26].size = 1 ;
  1305. state->CH_Ctrl[26].addr[0] = 136;
  1306. state->CH_Ctrl[26].bit[0] = 7;
  1307. state->CH_Ctrl[26].val[0] = 0;
  1308. state->CH_Ctrl[27].Ctrl_Num = GPIO_4B ;
  1309. state->CH_Ctrl[27].size = 1 ;
  1310. state->CH_Ctrl[27].addr[0] = 149;
  1311. state->CH_Ctrl[27].bit[0] = 7;
  1312. state->CH_Ctrl[27].val[0] = 0;
  1313. state->CH_Ctrl[28].Ctrl_Num = GPIO_3B ;
  1314. state->CH_Ctrl[28].size = 1 ;
  1315. state->CH_Ctrl[28].addr[0] = 149;
  1316. state->CH_Ctrl[28].bit[0] = 6;
  1317. state->CH_Ctrl[28].val[0] = 0;
  1318. state->CH_Ctrl[29].Ctrl_Num = GPIO_4 ;
  1319. state->CH_Ctrl[29].size = 1 ;
  1320. state->CH_Ctrl[29].addr[0] = 149;
  1321. state->CH_Ctrl[29].bit[0] = 5;
  1322. state->CH_Ctrl[29].val[0] = 1;
  1323. state->CH_Ctrl[30].Ctrl_Num = GPIO_3 ;
  1324. state->CH_Ctrl[30].size = 1 ;
  1325. state->CH_Ctrl[30].addr[0] = 149;
  1326. state->CH_Ctrl[30].bit[0] = 4;
  1327. state->CH_Ctrl[30].val[0] = 1;
  1328. state->CH_Ctrl[31].Ctrl_Num = GPIO_1B ;
  1329. state->CH_Ctrl[31].size = 1 ;
  1330. state->CH_Ctrl[31].addr[0] = 149;
  1331. state->CH_Ctrl[31].bit[0] = 3;
  1332. state->CH_Ctrl[31].val[0] = 0;
  1333. state->CH_Ctrl[32].Ctrl_Num = DAC_A_ENABLE ;
  1334. state->CH_Ctrl[32].size = 1 ;
  1335. state->CH_Ctrl[32].addr[0] = 93;
  1336. state->CH_Ctrl[32].bit[0] = 1;
  1337. state->CH_Ctrl[32].val[0] = 0;
  1338. state->CH_Ctrl[33].Ctrl_Num = DAC_B_ENABLE ;
  1339. state->CH_Ctrl[33].size = 1 ;
  1340. state->CH_Ctrl[33].addr[0] = 93;
  1341. state->CH_Ctrl[33].bit[0] = 0;
  1342. state->CH_Ctrl[33].val[0] = 0;
  1343. state->CH_Ctrl[34].Ctrl_Num = DAC_DIN_A ;
  1344. state->CH_Ctrl[34].size = 6 ;
  1345. state->CH_Ctrl[34].addr[0] = 92;
  1346. state->CH_Ctrl[34].bit[0] = 2;
  1347. state->CH_Ctrl[34].val[0] = 0;
  1348. state->CH_Ctrl[34].addr[1] = 92;
  1349. state->CH_Ctrl[34].bit[1] = 3;
  1350. state->CH_Ctrl[34].val[1] = 0;
  1351. state->CH_Ctrl[34].addr[2] = 92;
  1352. state->CH_Ctrl[34].bit[2] = 4;
  1353. state->CH_Ctrl[34].val[2] = 0;
  1354. state->CH_Ctrl[34].addr[3] = 92;
  1355. state->CH_Ctrl[34].bit[3] = 5;
  1356. state->CH_Ctrl[34].val[3] = 0;
  1357. state->CH_Ctrl[34].addr[4] = 92;
  1358. state->CH_Ctrl[34].bit[4] = 6;
  1359. state->CH_Ctrl[34].val[4] = 0;
  1360. state->CH_Ctrl[34].addr[5] = 92;
  1361. state->CH_Ctrl[34].bit[5] = 7;
  1362. state->CH_Ctrl[34].val[5] = 0;
  1363. state->CH_Ctrl[35].Ctrl_Num = DAC_DIN_B ;
  1364. state->CH_Ctrl[35].size = 6 ;
  1365. state->CH_Ctrl[35].addr[0] = 93;
  1366. state->CH_Ctrl[35].bit[0] = 2;
  1367. state->CH_Ctrl[35].val[0] = 0;
  1368. state->CH_Ctrl[35].addr[1] = 93;
  1369. state->CH_Ctrl[35].bit[1] = 3;
  1370. state->CH_Ctrl[35].val[1] = 0;
  1371. state->CH_Ctrl[35].addr[2] = 93;
  1372. state->CH_Ctrl[35].bit[2] = 4;
  1373. state->CH_Ctrl[35].val[2] = 0;
  1374. state->CH_Ctrl[35].addr[3] = 93;
  1375. state->CH_Ctrl[35].bit[3] = 5;
  1376. state->CH_Ctrl[35].val[3] = 0;
  1377. state->CH_Ctrl[35].addr[4] = 93;
  1378. state->CH_Ctrl[35].bit[4] = 6;
  1379. state->CH_Ctrl[35].val[4] = 0;
  1380. state->CH_Ctrl[35].addr[5] = 93;
  1381. state->CH_Ctrl[35].bit[5] = 7;
  1382. state->CH_Ctrl[35].val[5] = 0;
  1383. #ifdef _MXL_PRODUCTION
  1384. state->CH_Ctrl[36].Ctrl_Num = RFSYN_EN_DIV ;
  1385. state->CH_Ctrl[36].size = 1 ;
  1386. state->CH_Ctrl[36].addr[0] = 109;
  1387. state->CH_Ctrl[36].bit[0] = 1;
  1388. state->CH_Ctrl[36].val[0] = 1;
  1389. state->CH_Ctrl[37].Ctrl_Num = RFSYN_DIVM ;
  1390. state->CH_Ctrl[37].size = 2 ;
  1391. state->CH_Ctrl[37].addr[0] = 112;
  1392. state->CH_Ctrl[37].bit[0] = 5;
  1393. state->CH_Ctrl[37].val[0] = 0;
  1394. state->CH_Ctrl[37].addr[1] = 112;
  1395. state->CH_Ctrl[37].bit[1] = 6;
  1396. state->CH_Ctrl[37].val[1] = 0;
  1397. state->CH_Ctrl[38].Ctrl_Num = DN_BYPASS_AGC_I2C ;
  1398. state->CH_Ctrl[38].size = 1 ;
  1399. state->CH_Ctrl[38].addr[0] = 65;
  1400. state->CH_Ctrl[38].bit[0] = 1;
  1401. state->CH_Ctrl[38].val[0] = 0;
  1402. #endif
  1403. return 0 ;
  1404. }
  1405. // MaxLinear source code - MXL5005_c.cpp
  1406. // MXL5005.cpp : Defines the initialization routines for the DLL.
  1407. // 2.6.12
  1408. void InitTunerControls(struct dvb_frontend *fe)
  1409. {
  1410. MXL5005_RegisterInit(fe);
  1411. MXL5005_ControlInit(fe);
  1412. #ifdef _MXL_INTERNAL
  1413. MXL5005_MXLControlInit(fe);
  1414. #endif
  1415. }
  1416. ///////////////////////////////////////////////////////////////////////////////
  1417. // //
  1418. // Function: MXL_ConfigTuner //
  1419. // //
  1420. // Description: Configure MXL5005Tuner structure for desired //
  1421. // Channel Bandwidth/Channel Frequency //
  1422. // //
  1423. // //
  1424. // Functions used: //
  1425. // MXL_SynthIFLO_Calc //
  1426. // //
  1427. // Inputs: //
  1428. // Tuner_struct: structure defined at higher level //
  1429. // Mode: Tuner Mode (Analog/Digital) //
  1430. // IF_Mode: IF Mode ( Zero/Low ) //
  1431. // Bandwidth: Filter Channel Bandwidth (in Hz) //
  1432. // IF_out: Desired IF out Frequency (in Hz) //
  1433. // Fxtal: Crystal Frerquency (in Hz) //
  1434. // TOP: 0: Dual AGC; Value: take over point //
  1435. // IF_OUT_LOAD: IF out load resistor (200/300 Ohms) //
  1436. // CLOCK_OUT: 0: Turn off clock out; 1: turn on clock out //
  1437. // DIV_OUT: 0: Div-1; 1: Div-4 //
  1438. // CAPSELECT: 0: Disable On-chip pulling cap; 1: Enable //
  1439. // EN_RSSI: 0: Disable RSSI; 1: Enable RSSI //
  1440. // //
  1441. // Outputs: //
  1442. // Tuner //
  1443. // //
  1444. // Return: //
  1445. // 0 : Successful //
  1446. // > 0 : Failed //
  1447. // //
  1448. ///////////////////////////////////////////////////////////////////////////////
  1449. u16 MXL5005_TunerConfig(struct dvb_frontend *fe,
  1450. u8 Mode, /* 0: Analog Mode ; 1: Digital Mode */
  1451. u8 IF_mode, /* for Analog Mode, 0: zero IF; 1: low IF */
  1452. u32 Bandwidth, /* filter channel bandwidth (6, 7, 8) */
  1453. u32 IF_out, /* Desired IF Out Frequency */
  1454. u32 Fxtal, /* XTAL Frequency */
  1455. u8 AGC_Mode, /* AGC Mode - Dual AGC: 0, Single AGC: 1 */
  1456. u16 TOP, /* 0: Dual AGC; Value: take over point */
  1457. u16 IF_OUT_LOAD, /* IF Out Load Resistor (200 / 300 Ohms) */
  1458. u8 CLOCK_OUT, /* 0: turn off clock out; 1: turn on clock out */
  1459. u8 DIV_OUT, /* 0: Div-1; 1: Div-4 */
  1460. u8 CAPSELECT, /* 0: disable On-Chip pulling cap; 1: enable */
  1461. u8 EN_RSSI, /* 0: disable RSSI; 1: enable RSSI */
  1462. u8 Mod_Type, /* Modulation Type; */
  1463. /* 0 - Default; 1 - DVB-T; 2 - ATSC; 3 - QAM; 4 - Analog Cable */
  1464. u8 TF_Type /* Tracking Filter */
  1465. /* 0 - Default; 1 - Off; 2 - Type C; 3 - Type C-H */
  1466. )
  1467. {
  1468. struct mxl5005s_state *state = fe->tuner_priv;
  1469. u16 status = 0;
  1470. state->Mode = Mode;
  1471. state->IF_Mode = IF_mode;
  1472. state->Chan_Bandwidth = Bandwidth;
  1473. state->IF_OUT = IF_out;
  1474. state->Fxtal = Fxtal;
  1475. state->AGC_Mode = AGC_Mode;
  1476. state->TOP = TOP;
  1477. state->IF_OUT_LOAD = IF_OUT_LOAD;
  1478. state->CLOCK_OUT = CLOCK_OUT;
  1479. state->DIV_OUT = DIV_OUT;
  1480. state->CAPSELECT = CAPSELECT;
  1481. state->EN_RSSI = EN_RSSI;
  1482. state->Mod_Type = Mod_Type;
  1483. state->TF_Type = TF_Type;
  1484. /* Initialize all the controls and registers */
  1485. InitTunerControls(fe);
  1486. /* Synthesizer LO frequency calculation */
  1487. MXL_SynthIFLO_Calc(fe);
  1488. return status;
  1489. }
  1490. ///////////////////////////////////////////////////////////////////////////////
  1491. // //
  1492. // Function: MXL_SynthIFLO_Calc //
  1493. // //
  1494. // Description: Calculate Internal IF-LO Frequency //
  1495. // //
  1496. // Globals: //
  1497. // NONE //
  1498. // //
  1499. // Functions used: //
  1500. // NONE //
  1501. // //
  1502. // Inputs: //
  1503. // Tuner_struct: structure defined at higher level //
  1504. // //
  1505. // Outputs: //
  1506. // Tuner //
  1507. // //
  1508. // Return: //
  1509. // 0 : Successful //
  1510. // > 0 : Failed //
  1511. // //
  1512. ///////////////////////////////////////////////////////////////////////////////
  1513. void MXL_SynthIFLO_Calc(struct dvb_frontend *fe)
  1514. {
  1515. struct mxl5005s_state *state = fe->tuner_priv;
  1516. if (state->Mode == 1) /* Digital Mode */
  1517. state->IF_LO = state->IF_OUT;
  1518. else /* Analog Mode */
  1519. {
  1520. if(state->IF_Mode == 0) /* Analog Zero IF mode */
  1521. state->IF_LO = state->IF_OUT + 400000;
  1522. else /* Analog Low IF mode */
  1523. state->IF_LO = state->IF_OUT + state->Chan_Bandwidth/2;
  1524. }
  1525. }
  1526. ///////////////////////////////////////////////////////////////////////////////
  1527. // //
  1528. // Function: MXL_SynthRFTGLO_Calc //
  1529. // //
  1530. // Description: Calculate Internal RF-LO frequency and //
  1531. // internal Tone-Gen(TG)-LO frequency //
  1532. // //
  1533. // Globals: //
  1534. // NONE //
  1535. // //
  1536. // Functions used: //
  1537. // NONE //
  1538. // //
  1539. // Inputs: //
  1540. // Tuner_struct: structure defined at higher level //
  1541. // //
  1542. // Outputs: //
  1543. // Tuner //
  1544. // //
  1545. // Return: //
  1546. // 0 : Successful //
  1547. // > 0 : Failed //
  1548. // //
  1549. ///////////////////////////////////////////////////////////////////////////////
  1550. void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe)
  1551. {
  1552. struct mxl5005s_state *state = fe->tuner_priv;
  1553. if (state->Mode == 1) /* Digital Mode */ {
  1554. //remove 20.48MHz setting for 2.6.10
  1555. state->RF_LO = state->RF_IN;
  1556. state->TG_LO = state->RF_IN - 750000; //change for 2.6.6
  1557. } else /* Analog Mode */ {
  1558. if(state->IF_Mode == 0) /* Analog Zero IF mode */ {
  1559. state->RF_LO = state->RF_IN - 400000;
  1560. state->TG_LO = state->RF_IN - 1750000;
  1561. } else /* Analog Low IF mode */ {
  1562. state->RF_LO = state->RF_IN - state->Chan_Bandwidth/2;
  1563. state->TG_LO = state->RF_IN - state->Chan_Bandwidth + 500000;
  1564. }
  1565. }
  1566. }
  1567. ///////////////////////////////////////////////////////////////////////////////
  1568. // //
  1569. // Function: MXL_OverwriteICDefault //
  1570. // //
  1571. // Description: Overwrite the Default Register Setting //
  1572. // //
  1573. // //
  1574. // Functions used: //
  1575. // //
  1576. // Inputs: //
  1577. // Tuner_struct: structure defined at higher level //
  1578. // Outputs: //
  1579. // Tuner //
  1580. // //
  1581. // Return: //
  1582. // 0 : Successful //
  1583. // > 0 : Failed //
  1584. // //
  1585. ///////////////////////////////////////////////////////////////////////////////
  1586. u16 MXL_OverwriteICDefault(struct dvb_frontend *fe)
  1587. {
  1588. u16 status = 0;
  1589. status += MXL_ControlWrite(fe, OVERRIDE_1, 1);
  1590. status += MXL_ControlWrite(fe, OVERRIDE_2, 1);
  1591. status += MXL_ControlWrite(fe, OVERRIDE_3, 1);
  1592. status += MXL_ControlWrite(fe, OVERRIDE_4, 1);
  1593. return status;
  1594. }
  1595. ///////////////////////////////////////////////////////////////////////////////
  1596. // //
  1597. // Function: MXL_BlockInit //
  1598. // //
  1599. // Description: Tuner Initialization as a function of 'User Settings' //
  1600. // * User settings in Tuner strcuture must be assigned //
  1601. // first //
  1602. // //
  1603. // Globals: //
  1604. // NONE //
  1605. // //
  1606. // Functions used: //
  1607. // Tuner_struct: structure defined at higher level //
  1608. // //
  1609. // Inputs: //
  1610. // Tuner : Tuner structure defined at higher level //
  1611. // //
  1612. // Outputs: //
  1613. // Tuner //
  1614. // //
  1615. // Return: //
  1616. // 0 : Successful //
  1617. // > 0 : Failed //
  1618. // //
  1619. ///////////////////////////////////////////////////////////////////////////////
  1620. u16 MXL_BlockInit(struct dvb_frontend *fe)
  1621. {
  1622. struct mxl5005s_state *state = fe->tuner_priv;
  1623. u16 status = 0;
  1624. status += MXL_OverwriteICDefault(fe);
  1625. /* Downconverter Control Dig Ana */
  1626. status += MXL_ControlWrite(fe, DN_IQTN_AMP_CUT, state->Mode ? 1 : 0);
  1627. /* Filter Control Dig Ana */
  1628. status += MXL_ControlWrite(fe, BB_MODE, state->Mode ? 0 : 1);
  1629. status += MXL_ControlWrite(fe, BB_BUF, state->Mode ? 3 : 2);
  1630. status += MXL_ControlWrite(fe, BB_BUF_OA, state->Mode ? 1 : 0);
  1631. status += MXL_ControlWrite(fe, BB_IQSWAP, state->Mode ? 0 : 1);
  1632. status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 0);
  1633. /* Initialize Low-Pass Filter */
  1634. if (state->Mode) { /* Digital Mode */
  1635. switch (state->Chan_Bandwidth) {
  1636. case 8000000:
  1637. status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 0);
  1638. break;
  1639. case 7000000:
  1640. status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 2);
  1641. break;
  1642. case 6000000:
  1643. printk("%s() doing 6MHz digital\n", __func__);
  1644. status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 3);
  1645. break;
  1646. }
  1647. } else { /* Analog Mode */
  1648. switch (state->Chan_Bandwidth) {
  1649. case 8000000: /* Low Zero */
  1650. status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT, (state->IF_Mode ? 0 : 3));
  1651. break;
  1652. case 7000000:
  1653. status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT, (state->IF_Mode ? 1 : 4));
  1654. break;
  1655. case 6000000:
  1656. status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT, (state->IF_Mode ? 2 : 5));
  1657. break;
  1658. }
  1659. }
  1660. /* Charge Pump Control Dig Ana */
  1661. status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, state->Mode ? 5 : 8);
  1662. status += MXL_ControlWrite(fe, RFSYN_EN_CHP_HIGAIN, state->Mode ? 1 : 1);
  1663. status += MXL_ControlWrite(fe, EN_CHP_LIN_B, state->Mode ? 0 : 0);
  1664. /* AGC TOP Control */
  1665. if (state->AGC_Mode == 0) /* Dual AGC */ {
  1666. status += MXL_ControlWrite(fe, AGC_IF, 15);
  1667. status += MXL_ControlWrite(fe, AGC_RF, 15);
  1668. }
  1669. else /* Single AGC Mode Dig Ana */
  1670. status += MXL_ControlWrite(fe, AGC_RF, state->Mode ? 15 : 12);
  1671. if (state->TOP == 55) /* TOP == 5.5 */
  1672. status += MXL_ControlWrite(fe, AGC_IF, 0x0);
  1673. if (state->TOP == 72) /* TOP == 7.2 */
  1674. status += MXL_ControlWrite(fe, AGC_IF, 0x1);
  1675. if (state->TOP == 92) /* TOP == 9.2 */
  1676. status += MXL_ControlWrite(fe, AGC_IF, 0x2);
  1677. if (state->TOP == 110) /* TOP == 11.0 */
  1678. status += MXL_ControlWrite(fe, AGC_IF, 0x3);
  1679. if (state->TOP == 129) /* TOP == 12.9 */
  1680. status += MXL_ControlWrite(fe, AGC_IF, 0x4);
  1681. if (state->TOP == 147) /* TOP == 14.7 */
  1682. status += MXL_ControlWrite(fe, AGC_IF, 0x5);
  1683. if (state->TOP == 168) /* TOP == 16.8 */
  1684. status += MXL_ControlWrite(fe, AGC_IF, 0x6);
  1685. if (state->TOP == 194) /* TOP == 19.4 */
  1686. status += MXL_ControlWrite(fe, AGC_IF, 0x7);
  1687. if (state->TOP == 212) /* TOP == 21.2 */
  1688. status += MXL_ControlWrite(fe, AGC_IF, 0x9);
  1689. if (state->TOP == 232) /* TOP == 23.2 */
  1690. status += MXL_ControlWrite(fe, AGC_IF, 0xA);
  1691. if (state->TOP == 252) /* TOP == 25.2 */
  1692. status += MXL_ControlWrite(fe, AGC_IF, 0xB);
  1693. if (state->TOP == 271) /* TOP == 27.1 */
  1694. status += MXL_ControlWrite(fe, AGC_IF, 0xC);
  1695. if (state->TOP == 292) /* TOP == 29.2 */
  1696. status += MXL_ControlWrite(fe, AGC_IF, 0xD);
  1697. if (state->TOP == 317) /* TOP == 31.7 */
  1698. status += MXL_ControlWrite(fe, AGC_IF, 0xE);
  1699. if (state->TOP == 349) /* TOP == 34.9 */
  1700. status += MXL_ControlWrite(fe, AGC_IF, 0xF);
  1701. /* IF Synthesizer Control */
  1702. status += MXL_IFSynthInit(fe);
  1703. /* IF UpConverter Control */
  1704. if (state->IF_OUT_LOAD == 200) {
  1705. status += MXL_ControlWrite(fe, DRV_RES_SEL, 6);
  1706. status += MXL_ControlWrite(fe, I_DRIVER, 2);
  1707. }
  1708. if (state->IF_OUT_LOAD == 300) {
  1709. status += MXL_ControlWrite(fe, DRV_RES_SEL, 4);
  1710. status += MXL_ControlWrite(fe, I_DRIVER, 1);
  1711. }
  1712. /* Anti-Alias Filtering Control
  1713. * initialise Anti-Aliasing Filter
  1714. */
  1715. if (state->Mode) { /* Digital Mode */
  1716. if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 6280000UL) {
  1717. status += MXL_ControlWrite(fe, EN_AAF, 1);
  1718. status += MXL_ControlWrite(fe, EN_3P, 1);
  1719. status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
  1720. status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
  1721. }
  1722. if ((state->IF_OUT == 36125000UL) || (state->IF_OUT == 36150000UL)) {
  1723. status += MXL_ControlWrite(fe, EN_AAF, 1);
  1724. status += MXL_ControlWrite(fe, EN_3P, 1);
  1725. status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
  1726. status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1);
  1727. }
  1728. if (state->IF_OUT > 36150000UL) {
  1729. status += MXL_ControlWrite(fe, EN_AAF, 0);
  1730. status += MXL_ControlWrite(fe, EN_3P, 1);
  1731. status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
  1732. status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1);
  1733. }
  1734. } else { /* Analog Mode */
  1735. if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 5000000UL)
  1736. {
  1737. status += MXL_ControlWrite(fe, EN_AAF, 1);
  1738. status += MXL_ControlWrite(fe, EN_3P, 1);
  1739. status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
  1740. status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
  1741. }
  1742. if (state->IF_OUT > 5000000UL)
  1743. {
  1744. status += MXL_ControlWrite(fe, EN_AAF, 0);
  1745. status += MXL_ControlWrite(fe, EN_3P, 0);
  1746. status += MXL_ControlWrite(fe, EN_AUX_3P, 0);
  1747. status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
  1748. }
  1749. }
  1750. /* Demod Clock Out */
  1751. if (state->CLOCK_OUT)
  1752. status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 1);
  1753. else
  1754. status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 0);
  1755. if (state->DIV_OUT == 1)
  1756. status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 1);
  1757. if (state->DIV_OUT == 0)
  1758. status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 0);
  1759. /* Crystal Control */
  1760. if (state->CAPSELECT)
  1761. status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 1);
  1762. else
  1763. status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 0);
  1764. if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL)
  1765. status += MXL_ControlWrite(fe, IF_SEL_DBL, 1);
  1766. if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL)
  1767. status += MXL_ControlWrite(fe, IF_SEL_DBL, 0);
  1768. if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL)
  1769. status += MXL_ControlWrite(fe, RFSYN_R_DIV, 3);
  1770. if (state->Fxtal > 22000000UL && state->Fxtal <= 32000000UL)
  1771. status += MXL_ControlWrite(fe, RFSYN_R_DIV, 0);
  1772. /* Misc Controls */
  1773. if (state->Mode == 0 && state->IF_Mode == 1) /* Analog LowIF mode */
  1774. status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 0);
  1775. else
  1776. status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 1);
  1777. /* status += MXL_ControlRead(fe, IF_DIVVAL, &IF_DIVVAL_Val); */
  1778. /* Set TG_R_DIV */
  1779. status += MXL_ControlWrite(fe, TG_R_DIV, MXL_Ceiling(state->Fxtal, 1000000));
  1780. /* Apply Default value to BB_INITSTATE_DLPF_TUNE */
  1781. /* RSSI Control */
  1782. if (state->EN_RSSI)
  1783. {
  1784. status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
  1785. status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
  1786. status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
  1787. status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
  1788. /* RSSI reference point */
  1789. status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2);
  1790. status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 3);
  1791. status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
  1792. /* TOP point */
  1793. status += MXL_ControlWrite(fe, RFA_FLR, 0);
  1794. status += MXL_ControlWrite(fe, RFA_CEIL, 12);
  1795. }
  1796. /* Modulation type bit settings
  1797. * Override the control values preset
  1798. */
  1799. if (state->Mod_Type == MXL_DVBT) /* DVB-T Mode */
  1800. {
  1801. state->AGC_Mode = 1; /* Single AGC Mode */
  1802. /* Enable RSSI */
  1803. status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
  1804. status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
  1805. status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
  1806. status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
  1807. /* RSSI reference point */
  1808. status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
  1809. status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
  1810. status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
  1811. /* TOP point */
  1812. status += MXL_ControlWrite(fe, RFA_FLR, 2);
  1813. status += MXL_ControlWrite(fe, RFA_CEIL, 13);
  1814. if (state->IF_OUT <= 6280000UL) /* Low IF */
  1815. status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
  1816. else /* High IF */
  1817. status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
  1818. }
  1819. if (state->Mod_Type == MXL_ATSC) /* ATSC Mode */
  1820. {
  1821. state->AGC_Mode = 1; /* Single AGC Mode */
  1822. /* Enable RSSI */
  1823. status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
  1824. status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
  1825. status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
  1826. status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
  1827. /* RSSI reference point */
  1828. status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2);
  1829. status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 4);
  1830. status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
  1831. /* TOP point */
  1832. status += MXL_ControlWrite(fe, RFA_FLR, 2);
  1833. status += MXL_ControlWrite(fe, RFA_CEIL, 13);
  1834. status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 1);
  1835. status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5); /* Low Zero */
  1836. if (state->IF_OUT <= 6280000UL) /* Low IF */
  1837. status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
  1838. else /* High IF */
  1839. status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
  1840. }
  1841. if (state->Mod_Type == MXL_QAM) /* QAM Mode */
  1842. {
  1843. state->Mode = MXL_DIGITAL_MODE;
  1844. /* state->AGC_Mode = 1; */ /* Single AGC Mode */
  1845. /* Disable RSSI */ /* change here for v2.6.5 */
  1846. status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
  1847. status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
  1848. status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
  1849. status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
  1850. /* RSSI reference point */
  1851. status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
  1852. status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
  1853. status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);
  1854. status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3); /* change here for v2.6.5 */
  1855. if (state->IF_OUT <= 6280000UL) /* Low IF */
  1856. status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
  1857. else /* High IF */
  1858. status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
  1859. status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2);
  1860. }
  1861. if (state->Mod_Type == MXL_ANALOG_CABLE) {
  1862. /* Analog Cable Mode */
  1863. /* state->Mode = MXL_DIGITAL_MODE; */
  1864. state->AGC_Mode = 1; /* Single AGC Mode */
  1865. /* Disable RSSI */
  1866. status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
  1867. status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
  1868. status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
  1869. status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
  1870. status += MXL_ControlWrite(fe, AGC_IF, 1); /* change for 2.6.3 */
  1871. status += MXL_ControlWrite(fe, AGC_RF, 15);
  1872. status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
  1873. }
  1874. if (state->Mod_Type == MXL_ANALOG_OTA) {
  1875. /* Analog OTA Terrestrial mode add for 2.6.7 */
  1876. /* state->Mode = MXL_ANALOG_MODE; */
  1877. /* Enable RSSI */
  1878. status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
  1879. status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
  1880. status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
  1881. status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
  1882. /* RSSI reference point */
  1883. status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
  1884. status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
  1885. status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);
  1886. status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
  1887. status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
  1888. }
  1889. /* RSSI disable */
  1890. if(state->EN_RSSI == 0) {
  1891. status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
  1892. status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
  1893. status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
  1894. status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
  1895. }
  1896. return status;
  1897. }
  1898. ///////////////////////////////////////////////////////////////////////////////
  1899. // //
  1900. // Function: MXL_IFSynthInit //
  1901. // //
  1902. // Description: Tuner IF Synthesizer related register initialization //
  1903. // //
  1904. // Globals: //
  1905. // NONE //
  1906. // //
  1907. // Functions used: //
  1908. // Tuner_struct: structure defined at higher level //
  1909. // //
  1910. // Inputs: //
  1911. // Tuner : Tuner structure defined at higher level //
  1912. // //
  1913. // Outputs: //
  1914. // Tuner //
  1915. // //
  1916. // Return: //
  1917. // 0 : Successful //
  1918. // > 0 : Failed //
  1919. // //
  1920. ///////////////////////////////////////////////////////////////////////////////
  1921. u16 MXL_IFSynthInit(struct dvb_frontend *fe)
  1922. {
  1923. struct mxl5005s_state *state = fe->tuner_priv;
  1924. u16 status = 0 ;
  1925. // Declare Local Variables
  1926. u32 Fref = 0 ;
  1927. u32 Kdbl, intModVal ;
  1928. u32 fracModVal ;
  1929. Kdbl = 2 ;
  1930. if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL)
  1931. Kdbl = 2 ;
  1932. if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL)
  1933. Kdbl = 1 ;
  1934. //
  1935. // IF Synthesizer Control
  1936. //
  1937. if (state->Mode == 0 && state->IF_Mode == 1) // Analog Low IF mode
  1938. {
  1939. if (state->IF_LO == 41000000UL) {
  1940. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
  1941. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
  1942. Fref = 328000000UL ;
  1943. }
  1944. if (state->IF_LO == 47000000UL) {
  1945. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
  1946. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  1947. Fref = 376000000UL ;
  1948. }
  1949. if (state->IF_LO == 54000000UL) {
  1950. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10) ;
  1951. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
  1952. Fref = 324000000UL ;
  1953. }
  1954. if (state->IF_LO == 60000000UL) {
  1955. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10) ;
  1956. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  1957. Fref = 360000000UL ;
  1958. }
  1959. if (state->IF_LO == 39250000UL) {
  1960. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
  1961. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
  1962. Fref = 314000000UL ;
  1963. }
  1964. if (state->IF_LO == 39650000UL) {
  1965. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
  1966. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
  1967. Fref = 317200000UL ;
  1968. }
  1969. if (state->IF_LO == 40150000UL) {
  1970. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
  1971. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
  1972. Fref = 321200000UL ;
  1973. }
  1974. if (state->IF_LO == 40650000UL) {
  1975. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
  1976. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
  1977. Fref = 325200000UL ;
  1978. }
  1979. }
  1980. if (state->Mode || (state->Mode == 0 && state->IF_Mode == 0))
  1981. {
  1982. if (state->IF_LO == 57000000UL) {
  1983. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10) ;
  1984. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  1985. Fref = 342000000UL ;
  1986. }
  1987. if (state->IF_LO == 44000000UL) {
  1988. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
  1989. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  1990. Fref = 352000000UL ;
  1991. }
  1992. if (state->IF_LO == 43750000UL) {
  1993. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
  1994. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  1995. Fref = 350000000UL ;
  1996. }
  1997. if (state->IF_LO == 36650000UL) {
  1998. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
  1999. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2000. Fref = 366500000UL ;
  2001. }
  2002. if (state->IF_LO == 36150000UL) {
  2003. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
  2004. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2005. Fref = 361500000UL ;
  2006. }
  2007. if (state->IF_LO == 36000000UL) {
  2008. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
  2009. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2010. Fref = 360000000UL ;
  2011. }
  2012. if (state->IF_LO == 35250000UL) {
  2013. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
  2014. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2015. Fref = 352500000UL ;
  2016. }
  2017. if (state->IF_LO == 34750000UL) {
  2018. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
  2019. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2020. Fref = 347500000UL ;
  2021. }
  2022. if (state->IF_LO == 6280000UL) {
  2023. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07) ;
  2024. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2025. Fref = 376800000UL ;
  2026. }
  2027. if (state->IF_LO == 5000000UL) {
  2028. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09) ;
  2029. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2030. Fref = 360000000UL ;
  2031. }
  2032. if (state->IF_LO == 4500000UL) {
  2033. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06) ;
  2034. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2035. Fref = 360000000UL ;
  2036. }
  2037. if (state->IF_LO == 4570000UL) {
  2038. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06) ;
  2039. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2040. Fref = 365600000UL ;
  2041. }
  2042. if (state->IF_LO == 4000000UL) {
  2043. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x05) ;
  2044. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2045. Fref = 360000000UL ;
  2046. }
  2047. if (state->IF_LO == 57400000UL)
  2048. {
  2049. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10) ;
  2050. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2051. Fref = 344400000UL ;
  2052. }
  2053. if (state->IF_LO == 44400000UL)
  2054. {
  2055. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
  2056. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2057. Fref = 355200000UL ;
  2058. }
  2059. if (state->IF_LO == 44150000UL)
  2060. {
  2061. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
  2062. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2063. Fref = 353200000UL ;
  2064. }
  2065. if (state->IF_LO == 37050000UL)
  2066. {
  2067. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
  2068. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2069. Fref = 370500000UL ;
  2070. }
  2071. if (state->IF_LO == 36550000UL)
  2072. {
  2073. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
  2074. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2075. Fref = 365500000UL ;
  2076. }
  2077. if (state->IF_LO == 36125000UL) {
  2078. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
  2079. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2080. Fref = 361250000UL ;
  2081. }
  2082. if (state->IF_LO == 6000000UL) {
  2083. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07) ;
  2084. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2085. Fref = 360000000UL ;
  2086. }
  2087. if (state->IF_LO == 5400000UL)
  2088. {
  2089. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07) ;
  2090. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
  2091. Fref = 324000000UL ;
  2092. }
  2093. if (state->IF_LO == 5380000UL) {
  2094. printk("%s() doing 5.38\n", __func__);
  2095. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07) ;
  2096. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
  2097. Fref = 322800000UL ;
  2098. }
  2099. if (state->IF_LO == 5200000UL) {
  2100. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09) ;
  2101. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2102. Fref = 374400000UL ;
  2103. }
  2104. if (state->IF_LO == 4900000UL)
  2105. {
  2106. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09) ;
  2107. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2108. Fref = 352800000UL ;
  2109. }
  2110. if (state->IF_LO == 4400000UL)
  2111. {
  2112. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06) ;
  2113. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2114. Fref = 352000000UL ;
  2115. }
  2116. if (state->IF_LO == 4063000UL) //add for 2.6.8
  2117. {
  2118. status += MXL_ControlWrite(fe, IF_DIVVAL, 0x05) ;
  2119. status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
  2120. Fref = 365670000UL ;
  2121. }
  2122. }
  2123. // CHCAL_INT_MOD_IF
  2124. // CHCAL_FRAC_MOD_IF
  2125. intModVal = Fref / (state->Fxtal * Kdbl/2) ;
  2126. status += MXL_ControlWrite(fe, CHCAL_INT_MOD_IF, intModVal ) ;
  2127. fracModVal = (2<<15)*(Fref/1000 - (state->Fxtal/1000 * Kdbl/2) * intModVal);
  2128. fracModVal = fracModVal / ((state->Fxtal * Kdbl/2)/1000) ;
  2129. status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_IF, fracModVal) ;
  2130. return status ;
  2131. }
  2132. ///////////////////////////////////////////////////////////////////////////////
  2133. // //
  2134. // Function: MXL_GetXtalInt //
  2135. // //
  2136. // Description: return the Crystal Integration Value for //
  2137. // TG_VCO_BIAS calculation //
  2138. // //
  2139. // Globals: //
  2140. // NONE //
  2141. // //
  2142. // Functions used: //
  2143. // NONE //
  2144. // //
  2145. // Inputs: //
  2146. // Crystal Frequency Value in Hz //
  2147. // //
  2148. // Outputs: //
  2149. // Calculated Crystal Frequency Integration Value //
  2150. // //
  2151. // Return: //
  2152. // 0 : Successful //
  2153. // > 0 : Failed //
  2154. // //
  2155. ///////////////////////////////////////////////////////////////////////////////
  2156. u32 MXL_GetXtalInt(u32 Xtal_Freq)
  2157. {
  2158. if ((Xtal_Freq % 1000000) == 0)
  2159. return (Xtal_Freq / 10000) ;
  2160. else
  2161. return (((Xtal_Freq / 1000000) + 1)*100) ;
  2162. }
  2163. ///////////////////////////////////////////////////////////////////////////////
  2164. // //
  2165. // Function: MXL5005_TuneRF //
  2166. // //
  2167. // Description: Set control names to tune to requested RF_IN frequency //
  2168. // //
  2169. // Globals: //
  2170. // None //
  2171. // //
  2172. // Functions used: //
  2173. // MXL_SynthRFTGLO_Calc //
  2174. // MXL5005_ControlWrite //
  2175. // MXL_GetXtalInt //
  2176. // //
  2177. // Inputs: //
  2178. // Tuner : Tuner structure defined at higher level //
  2179. // //
  2180. // Outputs: //
  2181. // Tuner //
  2182. // //
  2183. // Return: //
  2184. // 0 : Successful //
  2185. // 1 : Unsuccessful //
  2186. ///////////////////////////////////////////////////////////////////////////////
  2187. u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq)
  2188. {
  2189. struct mxl5005s_state *state = fe->tuner_priv;
  2190. // Declare Local Variables
  2191. u16 status = 0;
  2192. u32 divider_val, E3, E4, E5, E5A;
  2193. u32 Fmax, Fmin, FmaxBin, FminBin;
  2194. u32 Kdbl_RF = 2;
  2195. u32 tg_divval;
  2196. u32 tg_lo;
  2197. u32 Xtal_Int;
  2198. u32 Fref_TG;
  2199. u32 Fvco;
  2200. // u32 temp;
  2201. Xtal_Int = MXL_GetXtalInt(state->Fxtal);
  2202. state->RF_IN = RF_Freq;
  2203. MXL_SynthRFTGLO_Calc(fe);
  2204. if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL)
  2205. Kdbl_RF = 2;
  2206. if (state->Fxtal > 22000000 && state->Fxtal <= 32000000)
  2207. Kdbl_RF = 1;
  2208. //
  2209. // Downconverter Controls
  2210. //
  2211. // Look-Up Table Implementation for:
  2212. // DN_POLY
  2213. // DN_RFGAIN
  2214. // DN_CAP_RFLPF
  2215. // DN_EN_VHFUHFBAR
  2216. // DN_GAIN_ADJUST
  2217. // Change the boundary reference from RF_IN to RF_LO
  2218. if (state->RF_LO < 40000000UL) {
  2219. return -1;
  2220. }
  2221. if (state->RF_LO >= 40000000UL && state->RF_LO <= 75000000UL) {
  2222. // Look-Up Table implementation
  2223. status += MXL_ControlWrite(fe, DN_POLY, 2);
  2224. status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
  2225. status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 423);
  2226. status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
  2227. status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 1);
  2228. }
  2229. if (state->RF_LO > 75000000UL && state->RF_LO <= 100000000UL) {
  2230. // Look-Up Table implementation
  2231. status += MXL_ControlWrite(fe, DN_POLY, 3);
  2232. status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
  2233. status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 222);
  2234. status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
  2235. status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 1);
  2236. }
  2237. if (state->RF_LO > 100000000UL && state->RF_LO <= 150000000UL) {
  2238. // Look-Up Table implementation
  2239. status += MXL_ControlWrite(fe, DN_POLY, 3);
  2240. status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
  2241. status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 147);
  2242. status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
  2243. status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 2);
  2244. }
  2245. if (state->RF_LO > 150000000UL && state->RF_LO <= 200000000UL) {
  2246. // Look-Up Table implementation
  2247. status += MXL_ControlWrite(fe, DN_POLY, 3);
  2248. status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
  2249. status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 9);
  2250. status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
  2251. status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 2);
  2252. }
  2253. if (state->RF_LO > 200000000UL && state->RF_LO <= 300000000UL) {
  2254. // Look-Up Table implementation
  2255. status += MXL_ControlWrite(fe, DN_POLY, 3) ;
  2256. status += MXL_ControlWrite(fe, DN_RFGAIN, 3) ;
  2257. status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0) ;
  2258. status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1) ;
  2259. status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3) ;
  2260. }
  2261. if (state->RF_LO > 300000000UL && state->RF_LO <= 650000000UL) {
  2262. // Look-Up Table implementation
  2263. status += MXL_ControlWrite(fe, DN_POLY, 3) ;
  2264. status += MXL_ControlWrite(fe, DN_RFGAIN, 1) ;
  2265. status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0) ;
  2266. status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 0) ;
  2267. status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3) ;
  2268. }
  2269. if (state->RF_LO > 650000000UL && state->RF_LO <= 900000000UL) {
  2270. // Look-Up Table implementation
  2271. status += MXL_ControlWrite(fe, DN_POLY, 3) ;
  2272. status += MXL_ControlWrite(fe, DN_RFGAIN, 2) ;
  2273. status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0) ;
  2274. status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 0) ;
  2275. status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3) ;
  2276. }
  2277. if (state->RF_LO > 900000000UL) {
  2278. return -1;
  2279. }
  2280. // DN_IQTNBUF_AMP
  2281. // DN_IQTNGNBFBIAS_BST
  2282. if (state->RF_LO >= 40000000UL && state->RF_LO <= 75000000UL) {
  2283. status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
  2284. status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
  2285. }
  2286. if (state->RF_LO > 75000000UL && state->RF_LO <= 100000000UL) {
  2287. status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
  2288. status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
  2289. }
  2290. if (state->RF_LO > 100000000UL && state->RF_LO <= 150000000UL) {
  2291. status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
  2292. status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
  2293. }
  2294. if (state->RF_LO > 150000000UL && state->RF_LO <= 200000000UL) {
  2295. status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
  2296. status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
  2297. }
  2298. if (state->RF_LO > 200000000UL && state->RF_LO <= 300000000UL) {
  2299. status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
  2300. status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
  2301. }
  2302. if (state->RF_LO > 300000000UL && state->RF_LO <= 400000000UL) {
  2303. status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
  2304. status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
  2305. }
  2306. if (state->RF_LO > 400000000UL && state->RF_LO <= 450000000UL) {
  2307. status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
  2308. status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
  2309. }
  2310. if (state->RF_LO > 450000000UL && state->RF_LO <= 500000000UL) {
  2311. status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
  2312. status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
  2313. }
  2314. if (state->RF_LO > 500000000UL && state->RF_LO <= 550000000UL) {
  2315. status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
  2316. status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
  2317. }
  2318. if (state->RF_LO > 550000000UL && state->RF_LO <= 600000000UL) {
  2319. status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
  2320. status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
  2321. }
  2322. if (state->RF_LO > 600000000UL && state->RF_LO <= 650000000UL) {
  2323. status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
  2324. status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
  2325. }
  2326. if (state->RF_LO > 650000000UL && state->RF_LO <= 700000000UL) {
  2327. status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
  2328. status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
  2329. }
  2330. if (state->RF_LO > 700000000UL && state->RF_LO <= 750000000UL) {
  2331. status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
  2332. status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
  2333. }
  2334. if (state->RF_LO > 750000000UL && state->RF_LO <= 800000000UL) {
  2335. status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
  2336. status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
  2337. }
  2338. if (state->RF_LO > 800000000UL && state->RF_LO <= 850000000UL) {
  2339. status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 10);
  2340. status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 1);
  2341. }
  2342. if (state->RF_LO > 850000000UL && state->RF_LO <= 900000000UL) {
  2343. status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 10);
  2344. status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 1);
  2345. }
  2346. //
  2347. // Set RF Synth and LO Path Control
  2348. //
  2349. // Look-Up table implementation for:
  2350. // RFSYN_EN_OUTMUX
  2351. // RFSYN_SEL_VCO_OUT
  2352. // RFSYN_SEL_VCO_HI
  2353. // RFSYN_SEL_DIVM
  2354. // RFSYN_RF_DIV_BIAS
  2355. // DN_SEL_FREQ
  2356. //
  2357. // Set divider_val, Fmax, Fmix to use in Equations
  2358. FminBin = 28000000UL ;
  2359. FmaxBin = 42500000UL ;
  2360. if (state->RF_LO >= 40000000UL && state->RF_LO <= FmaxBin) {
  2361. status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);
  2362. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);
  2363. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
  2364. status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
  2365. status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
  2366. status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);
  2367. divider_val = 64 ;
  2368. Fmax = FmaxBin ;
  2369. Fmin = FminBin ;
  2370. }
  2371. FminBin = 42500000UL ;
  2372. FmaxBin = 56000000UL ;
  2373. if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
  2374. status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);
  2375. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);
  2376. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
  2377. status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
  2378. status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
  2379. status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);
  2380. divider_val = 64 ;
  2381. Fmax = FmaxBin ;
  2382. Fmin = FminBin ;
  2383. }
  2384. FminBin = 56000000UL ;
  2385. FmaxBin = 85000000UL ;
  2386. if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
  2387. status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
  2388. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
  2389. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0) ;
  2390. status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
  2391. status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
  2392. status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1) ;
  2393. divider_val = 32 ;
  2394. Fmax = FmaxBin ;
  2395. Fmin = FminBin ;
  2396. }
  2397. FminBin = 85000000UL ;
  2398. FmaxBin = 112000000UL ;
  2399. if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
  2400. status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
  2401. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
  2402. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1) ;
  2403. status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
  2404. status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
  2405. status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1) ;
  2406. divider_val = 32 ;
  2407. Fmax = FmaxBin ;
  2408. Fmin = FminBin ;
  2409. }
  2410. FminBin = 112000000UL ;
  2411. FmaxBin = 170000000UL ;
  2412. if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
  2413. status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
  2414. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
  2415. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0) ;
  2416. status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
  2417. status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
  2418. status += MXL_ControlWrite(fe, DN_SEL_FREQ, 2) ;
  2419. divider_val = 16 ;
  2420. Fmax = FmaxBin ;
  2421. Fmin = FminBin ;
  2422. }
  2423. FminBin = 170000000UL ;
  2424. FmaxBin = 225000000UL ;
  2425. if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
  2426. status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
  2427. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
  2428. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1) ;
  2429. status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
  2430. status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
  2431. status += MXL_ControlWrite(fe, DN_SEL_FREQ, 2) ;
  2432. divider_val = 16 ;
  2433. Fmax = FmaxBin ;
  2434. Fmin = FminBin ;
  2435. }
  2436. FminBin = 225000000UL ;
  2437. FmaxBin = 300000000UL ;
  2438. if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
  2439. status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
  2440. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
  2441. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0) ;
  2442. status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
  2443. status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
  2444. status += MXL_ControlWrite(fe, DN_SEL_FREQ, 4) ;
  2445. divider_val = 8 ;
  2446. Fmax = 340000000UL ;
  2447. Fmin = FminBin ;
  2448. }
  2449. FminBin = 300000000UL ;
  2450. FmaxBin = 340000000UL ;
  2451. if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
  2452. status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1) ;
  2453. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0) ;
  2454. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0) ;
  2455. status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
  2456. status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
  2457. status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0) ;
  2458. divider_val = 8 ;
  2459. Fmax = FmaxBin ;
  2460. Fmin = 225000000UL ;
  2461. }
  2462. FminBin = 340000000UL ;
  2463. FmaxBin = 450000000UL ;
  2464. if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
  2465. status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1) ;
  2466. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0) ;
  2467. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1) ;
  2468. status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
  2469. status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 2) ;
  2470. status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0) ;
  2471. divider_val = 8 ;
  2472. Fmax = FmaxBin ;
  2473. Fmin = FminBin ;
  2474. }
  2475. FminBin = 450000000UL ;
  2476. FmaxBin = 680000000UL ;
  2477. if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
  2478. status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
  2479. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
  2480. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0) ;
  2481. status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 1) ;
  2482. status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
  2483. status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0) ;
  2484. divider_val = 4 ;
  2485. Fmax = FmaxBin ;
  2486. Fmin = FminBin ;
  2487. }
  2488. FminBin = 680000000UL ;
  2489. FmaxBin = 900000000UL ;
  2490. if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
  2491. status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
  2492. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
  2493. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1) ;
  2494. status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 1) ;
  2495. status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
  2496. status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0) ;
  2497. divider_val = 4 ;
  2498. Fmax = FmaxBin ;
  2499. Fmin = FminBin ;
  2500. }
  2501. // CHCAL_INT_MOD_RF
  2502. // CHCAL_FRAC_MOD_RF
  2503. // RFSYN_LPF_R
  2504. // CHCAL_EN_INT_RF
  2505. // Equation E3
  2506. // RFSYN_VCO_BIAS
  2507. E3 = (((Fmax-state->RF_LO)/1000)*32)/((Fmax-Fmin)/1000) + 8 ;
  2508. status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, E3) ;
  2509. // Equation E4
  2510. // CHCAL_INT_MOD_RF
  2511. E4 = (state->RF_LO*divider_val/1000)/(2*state->Fxtal*Kdbl_RF/1000) ;
  2512. MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, E4) ;
  2513. // Equation E5
  2514. // CHCAL_FRAC_MOD_RF
  2515. // CHCAL_EN_INT_RF
  2516. E5 = ((2<<17)*(state->RF_LO/10000*divider_val - (E4*(2*state->Fxtal*Kdbl_RF)/10000)))/(2*state->Fxtal*Kdbl_RF/10000) ;
  2517. status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, E5) ;
  2518. // Equation E5A
  2519. // RFSYN_LPF_R
  2520. E5A = (((Fmax - state->RF_LO)/1000)*4/((Fmax-Fmin)/1000)) + 1 ;
  2521. status += MXL_ControlWrite(fe, RFSYN_LPF_R, E5A) ;
  2522. // Euqation E5B
  2523. // CHCAL_EN_INIT_RF
  2524. status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, ((E5 == 0) ? 1 : 0));
  2525. //if (E5 == 0)
  2526. // status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, 1);
  2527. //else
  2528. // status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, E5) ;
  2529. //
  2530. // Set TG Synth
  2531. //
  2532. // Look-Up table implementation for:
  2533. // TG_LO_DIVVAL
  2534. // TG_LO_SELVAL
  2535. //
  2536. // Set divider_val, Fmax, Fmix to use in Equations
  2537. if (state->TG_LO < 33000000UL) {
  2538. return -1;
  2539. }
  2540. FminBin = 33000000UL ;
  2541. FmaxBin = 50000000UL ;
  2542. if (state->TG_LO >= FminBin && state->TG_LO <= FmaxBin) {
  2543. status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x6) ;
  2544. status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x0) ;
  2545. divider_val = 36 ;
  2546. Fmax = FmaxBin ;
  2547. Fmin = FminBin ;
  2548. }
  2549. FminBin = 50000000UL ;
  2550. FmaxBin = 67000000UL ;
  2551. if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
  2552. status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x1) ;
  2553. status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x0) ;
  2554. divider_val = 24 ;
  2555. Fmax = FmaxBin ;
  2556. Fmin = FminBin ;
  2557. }
  2558. FminBin = 67000000UL ;
  2559. FmaxBin = 100000000UL ;
  2560. if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
  2561. status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0xC) ;
  2562. status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2) ;
  2563. divider_val = 18 ;
  2564. Fmax = FmaxBin ;
  2565. Fmin = FminBin ;
  2566. }
  2567. FminBin = 100000000UL ;
  2568. FmaxBin = 150000000UL ;
  2569. if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
  2570. status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8) ;
  2571. status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2) ;
  2572. divider_val = 12 ;
  2573. Fmax = FmaxBin ;
  2574. Fmin = FminBin ;
  2575. }
  2576. FminBin = 150000000UL ;
  2577. FmaxBin = 200000000UL ;
  2578. if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
  2579. status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0) ;
  2580. status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2) ;
  2581. divider_val = 8 ;
  2582. Fmax = FmaxBin ;
  2583. Fmin = FminBin ;
  2584. }
  2585. FminBin = 200000000UL ;
  2586. FmaxBin = 300000000UL ;
  2587. if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
  2588. status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8) ;
  2589. status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x3) ;
  2590. divider_val = 6 ;
  2591. Fmax = FmaxBin ;
  2592. Fmin = FminBin ;
  2593. }
  2594. FminBin = 300000000UL ;
  2595. FmaxBin = 400000000UL ;
  2596. if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
  2597. status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0) ;
  2598. status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x3) ;
  2599. divider_val = 4 ;
  2600. Fmax = FmaxBin ;
  2601. Fmin = FminBin ;
  2602. }
  2603. FminBin = 400000000UL ;
  2604. FmaxBin = 600000000UL ;
  2605. if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
  2606. status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8) ;
  2607. status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x7) ;
  2608. divider_val = 3 ;
  2609. Fmax = FmaxBin ;
  2610. Fmin = FminBin ;
  2611. }
  2612. FminBin = 600000000UL ;
  2613. FmaxBin = 900000000UL ;
  2614. if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
  2615. status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0) ;
  2616. status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x7) ;
  2617. divider_val = 2 ;
  2618. Fmax = FmaxBin ;
  2619. Fmin = FminBin ;
  2620. }
  2621. // TG_DIV_VAL
  2622. tg_divval = (state->TG_LO*divider_val/100000)
  2623. *(MXL_Ceiling(state->Fxtal,1000000) * 100) / (state->Fxtal/1000) ;
  2624. status += MXL_ControlWrite(fe, TG_DIV_VAL, tg_divval) ;
  2625. if (state->TG_LO > 600000000UL)
  2626. status += MXL_ControlWrite(fe, TG_DIV_VAL, tg_divval + 1 ) ;
  2627. Fmax = 1800000000UL ;
  2628. Fmin = 1200000000UL ;
  2629. // to prevent overflow of 32 bit unsigned integer, use following equation. Edit for v2.6.4
  2630. Fref_TG = (state->Fxtal/1000)/ MXL_Ceiling(state->Fxtal, 1000000) ; // Fref_TF = Fref_TG*1000
  2631. Fvco = (state->TG_LO/10000) * divider_val * Fref_TG; //Fvco = Fvco/10
  2632. tg_lo = (((Fmax/10 - Fvco)/100)*32) / ((Fmax-Fmin)/1000)+8;
  2633. //below equation is same as above but much harder to debug.
  2634. //tg_lo = ( ((Fmax/10000 * Xtal_Int)/100) - ((state->TG_LO/10000)*divider_val*(state->Fxtal/10000)/100) )*32/((Fmax-Fmin)/10000 * Xtal_Int/100) + 8 ;
  2635. status += MXL_ControlWrite(fe, TG_VCO_BIAS , tg_lo) ;
  2636. //add for 2.6.5
  2637. //Special setting for QAM
  2638. if(state->Mod_Type == MXL_QAM)
  2639. {
  2640. if(state->RF_IN < 680000000)
  2641. status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3) ;
  2642. else
  2643. status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2) ;
  2644. }
  2645. //remove 20.48MHz setting for 2.6.10
  2646. //
  2647. // Off Chip Tracking Filter Control
  2648. //
  2649. if (state->TF_Type == MXL_TF_OFF) // Tracking Filter Off State; turn off all the banks
  2650. {
  2651. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ;
  2652. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ;
  2653. status += MXL_SetGPIO(fe, 3, 1) ; // turn off Bank 1
  2654. status += MXL_SetGPIO(fe, 1, 1) ; // turn off Bank 2
  2655. status += MXL_SetGPIO(fe, 4, 1) ; // turn off Bank 3
  2656. }
  2657. if (state->TF_Type == MXL_TF_C) // Tracking Filter type C
  2658. {
  2659. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ;
  2660. status += MXL_ControlWrite(fe, DAC_DIN_A, 0) ;
  2661. if (state->RF_IN >= 43000000 && state->RF_IN < 150000000)
  2662. {
  2663. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
  2664. status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
  2665. status += MXL_SetGPIO(fe, 3, 0) ; // Bank1 On
  2666. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  2667. status += MXL_SetGPIO(fe, 4, 1) ; // Bank3 Off
  2668. }
  2669. if (state->RF_IN >= 150000000 && state->RF_IN < 280000000)
  2670. {
  2671. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
  2672. status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
  2673. status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
  2674. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  2675. status += MXL_SetGPIO(fe, 4, 1) ; // Bank3 Off
  2676. }
  2677. if (state->RF_IN >= 280000000 && state->RF_IN < 360000000)
  2678. {
  2679. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
  2680. status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
  2681. status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
  2682. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  2683. status += MXL_SetGPIO(fe, 4, 0) ; // Bank3 On
  2684. }
  2685. if (state->RF_IN >= 360000000 && state->RF_IN < 560000000)
  2686. {
  2687. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
  2688. status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
  2689. status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
  2690. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  2691. status += MXL_SetGPIO(fe, 4, 0) ; // Bank3 On
  2692. }
  2693. if (state->RF_IN >= 560000000 && state->RF_IN < 580000000)
  2694. {
  2695. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
  2696. status += MXL_ControlWrite(fe, DAC_DIN_B, 29) ;
  2697. status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
  2698. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  2699. status += MXL_SetGPIO(fe, 4, 0) ; // Bank3 On
  2700. }
  2701. if (state->RF_IN >= 580000000 && state->RF_IN < 630000000)
  2702. {
  2703. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
  2704. status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
  2705. status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
  2706. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  2707. status += MXL_SetGPIO(fe, 4, 0) ; // Bank3 On
  2708. }
  2709. if (state->RF_IN >= 630000000 && state->RF_IN < 700000000)
  2710. {
  2711. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
  2712. status += MXL_ControlWrite(fe, DAC_DIN_B, 16) ;
  2713. status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
  2714. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  2715. status += MXL_SetGPIO(fe, 4, 1) ; // Bank3 Off
  2716. }
  2717. if (state->RF_IN >= 700000000 && state->RF_IN < 760000000)
  2718. {
  2719. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
  2720. status += MXL_ControlWrite(fe, DAC_DIN_B, 7) ;
  2721. status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
  2722. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  2723. status += MXL_SetGPIO(fe, 4, 1) ; // Bank3 Off
  2724. }
  2725. if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000)
  2726. {
  2727. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
  2728. status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
  2729. status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
  2730. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  2731. status += MXL_SetGPIO(fe, 4, 1) ; // Bank3 Off
  2732. }
  2733. }
  2734. if (state->TF_Type == MXL_TF_C_H) // Tracking Filter type C-H for Hauppauge only
  2735. {
  2736. printk("%s() CH filter\n", __func__);
  2737. status += MXL_ControlWrite(fe, DAC_DIN_A, 0) ;
  2738. if (state->RF_IN >= 43000000 && state->RF_IN < 150000000)
  2739. {
  2740. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
  2741. status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
  2742. status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
  2743. status += MXL_SetGPIO(fe, 1, 1) ; // Bank3 Off
  2744. }
  2745. if (state->RF_IN >= 150000000 && state->RF_IN < 280000000)
  2746. {
  2747. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
  2748. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  2749. status += MXL_SetGPIO(fe, 3, 0) ; // Bank2 On
  2750. status += MXL_SetGPIO(fe, 1, 1) ; // Bank3 Off
  2751. }
  2752. if (state->RF_IN >= 280000000 && state->RF_IN < 360000000)
  2753. {
  2754. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
  2755. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  2756. status += MXL_SetGPIO(fe, 3, 0) ; // Bank2 On
  2757. status += MXL_SetGPIO(fe, 1, 0) ; // Bank3 On
  2758. }
  2759. if (state->RF_IN >= 360000000 && state->RF_IN < 560000000)
  2760. {
  2761. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
  2762. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  2763. status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
  2764. status += MXL_SetGPIO(fe, 1, 0) ; // Bank3 On
  2765. }
  2766. if (state->RF_IN >= 560000000 && state->RF_IN < 580000000)
  2767. {
  2768. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
  2769. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  2770. status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
  2771. status += MXL_SetGPIO(fe, 1, 0) ; // Bank3 On
  2772. }
  2773. if (state->RF_IN >= 580000000 && state->RF_IN < 630000000)
  2774. {
  2775. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
  2776. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  2777. status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
  2778. status += MXL_SetGPIO(fe, 1, 0) ; // Bank3 On
  2779. }
  2780. if (state->RF_IN >= 630000000 && state->RF_IN < 700000000)
  2781. {
  2782. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
  2783. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  2784. status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
  2785. status += MXL_SetGPIO(fe, 1, 1) ; // Bank3 Off
  2786. }
  2787. if (state->RF_IN >= 700000000 && state->RF_IN < 760000000)
  2788. {
  2789. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
  2790. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  2791. status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
  2792. status += MXL_SetGPIO(fe, 1, 1) ; // Bank3 Off
  2793. }
  2794. if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000)
  2795. {
  2796. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
  2797. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  2798. status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
  2799. status += MXL_SetGPIO(fe, 1, 1) ; // Bank3 Off
  2800. }
  2801. }
  2802. if (state->TF_Type == MXL_TF_D) // Tracking Filter type D
  2803. {
  2804. status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
  2805. if (state->RF_IN >= 43000000 && state->RF_IN < 174000000)
  2806. {
  2807. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  2808. status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
  2809. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  2810. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  2811. }
  2812. if (state->RF_IN >= 174000000 && state->RF_IN < 250000000)
  2813. {
  2814. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  2815. status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
  2816. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  2817. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  2818. }
  2819. if (state->RF_IN >= 250000000 && state->RF_IN < 310000000)
  2820. {
  2821. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  2822. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  2823. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  2824. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  2825. }
  2826. if (state->RF_IN >= 310000000 && state->RF_IN < 360000000)
  2827. {
  2828. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  2829. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  2830. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  2831. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
  2832. }
  2833. if (state->RF_IN >= 360000000 && state->RF_IN < 470000000)
  2834. {
  2835. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  2836. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  2837. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  2838. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
  2839. }
  2840. if (state->RF_IN >= 470000000 && state->RF_IN < 640000000)
  2841. {
  2842. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
  2843. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  2844. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  2845. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
  2846. }
  2847. if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000)
  2848. {
  2849. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
  2850. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  2851. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  2852. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  2853. }
  2854. }
  2855. if (state->TF_Type == MXL_TF_D_L) // Tracking Filter type D-L for Lumanate ONLY change for 2.6.3
  2856. {
  2857. status += MXL_ControlWrite(fe, DAC_DIN_A, 0) ;
  2858. // if UHF and terrestrial => Turn off Tracking Filter
  2859. if (state->RF_IN >= 471000000 && (state->RF_IN - 471000000)%6000000 != 0)
  2860. {
  2861. // Turn off all the banks
  2862. status += MXL_SetGPIO(fe, 3, 1) ;
  2863. status += MXL_SetGPIO(fe, 1, 1) ;
  2864. status += MXL_SetGPIO(fe, 4, 1) ;
  2865. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ;
  2866. status += MXL_ControlWrite(fe, AGC_IF, 10) ;
  2867. }
  2868. else // if VHF or cable => Turn on Tracking Filter
  2869. {
  2870. if (state->RF_IN >= 43000000 && state->RF_IN < 140000000)
  2871. {
  2872. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
  2873. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 On
  2874. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  2875. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 Off
  2876. }
  2877. if (state->RF_IN >= 140000000 && state->RF_IN < 240000000)
  2878. {
  2879. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
  2880. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 On
  2881. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  2882. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 Off
  2883. }
  2884. if (state->RF_IN >= 240000000 && state->RF_IN < 340000000)
  2885. {
  2886. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
  2887. status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 Off
  2888. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 On
  2889. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 Off
  2890. }
  2891. if (state->RF_IN >= 340000000 && state->RF_IN < 430000000)
  2892. {
  2893. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
  2894. status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 Off
  2895. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  2896. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 On
  2897. }
  2898. if (state->RF_IN >= 430000000 && state->RF_IN < 470000000)
  2899. {
  2900. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 Off
  2901. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  2902. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 Off
  2903. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 On
  2904. }
  2905. if (state->RF_IN >= 470000000 && state->RF_IN < 570000000)
  2906. {
  2907. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
  2908. status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 Off
  2909. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 Off
  2910. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 On
  2911. }
  2912. if (state->RF_IN >= 570000000 && state->RF_IN < 620000000)
  2913. {
  2914. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 On
  2915. status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 Off
  2916. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  2917. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Offq
  2918. }
  2919. if (state->RF_IN >= 620000000 && state->RF_IN < 760000000)
  2920. {
  2921. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
  2922. status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 Off
  2923. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  2924. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  2925. }
  2926. if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000)
  2927. {
  2928. status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
  2929. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  2930. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  2931. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  2932. }
  2933. }
  2934. }
  2935. if (state->TF_Type == MXL_TF_E) // Tracking Filter type E
  2936. {
  2937. status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
  2938. if (state->RF_IN >= 43000000 && state->RF_IN < 174000000)
  2939. {
  2940. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  2941. status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
  2942. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  2943. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  2944. }
  2945. if (state->RF_IN >= 174000000 && state->RF_IN < 250000000)
  2946. {
  2947. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  2948. status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
  2949. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  2950. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  2951. }
  2952. if (state->RF_IN >= 250000000 && state->RF_IN < 310000000)
  2953. {
  2954. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  2955. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  2956. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  2957. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  2958. }
  2959. if (state->RF_IN >= 310000000 && state->RF_IN < 360000000)
  2960. {
  2961. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  2962. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  2963. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  2964. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
  2965. }
  2966. if (state->RF_IN >= 360000000 && state->RF_IN < 470000000)
  2967. {
  2968. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  2969. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  2970. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  2971. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
  2972. }
  2973. if (state->RF_IN >= 470000000 && state->RF_IN < 640000000)
  2974. {
  2975. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
  2976. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  2977. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  2978. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
  2979. }
  2980. if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000)
  2981. {
  2982. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
  2983. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  2984. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  2985. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  2986. }
  2987. }
  2988. if (state->TF_Type == MXL_TF_F) // Tracking Filter type F
  2989. {
  2990. status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
  2991. if (state->RF_IN >= 43000000 && state->RF_IN < 160000000)
  2992. {
  2993. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  2994. status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
  2995. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  2996. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  2997. }
  2998. if (state->RF_IN >= 160000000 && state->RF_IN < 210000000)
  2999. {
  3000. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  3001. status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
  3002. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  3003. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  3004. }
  3005. if (state->RF_IN >= 210000000 && state->RF_IN < 300000000)
  3006. {
  3007. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  3008. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  3009. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  3010. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  3011. }
  3012. if (state->RF_IN >= 300000000 && state->RF_IN < 390000000)
  3013. {
  3014. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  3015. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  3016. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  3017. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
  3018. }
  3019. if (state->RF_IN >= 390000000 && state->RF_IN < 515000000)
  3020. {
  3021. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  3022. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  3023. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  3024. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
  3025. }
  3026. if (state->RF_IN >= 515000000 && state->RF_IN < 650000000)
  3027. {
  3028. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
  3029. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  3030. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  3031. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
  3032. }
  3033. if (state->RF_IN >= 650000000 && state->RF_IN <= 900000000)
  3034. {
  3035. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
  3036. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  3037. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  3038. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  3039. }
  3040. }
  3041. if (state->TF_Type == MXL_TF_E_2) // Tracking Filter type E_2
  3042. {
  3043. status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
  3044. if (state->RF_IN >= 43000000 && state->RF_IN < 174000000)
  3045. {
  3046. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  3047. status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
  3048. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  3049. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  3050. }
  3051. if (state->RF_IN >= 174000000 && state->RF_IN < 250000000)
  3052. {
  3053. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  3054. status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
  3055. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  3056. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  3057. }
  3058. if (state->RF_IN >= 250000000 && state->RF_IN < 350000000)
  3059. {
  3060. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  3061. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  3062. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  3063. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  3064. }
  3065. if (state->RF_IN >= 350000000 && state->RF_IN < 400000000)
  3066. {
  3067. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  3068. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  3069. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  3070. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
  3071. }
  3072. if (state->RF_IN >= 400000000 && state->RF_IN < 570000000)
  3073. {
  3074. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  3075. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  3076. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  3077. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
  3078. }
  3079. if (state->RF_IN >= 570000000 && state->RF_IN < 770000000)
  3080. {
  3081. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
  3082. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  3083. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  3084. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
  3085. }
  3086. if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000)
  3087. {
  3088. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
  3089. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  3090. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  3091. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  3092. }
  3093. }
  3094. if (state->TF_Type == MXL_TF_G) // Tracking Filter type G add for v2.6.8
  3095. {
  3096. status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
  3097. if (state->RF_IN >= 50000000 && state->RF_IN < 190000000)
  3098. {
  3099. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  3100. status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
  3101. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  3102. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  3103. }
  3104. if (state->RF_IN >= 190000000 && state->RF_IN < 280000000)
  3105. {
  3106. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  3107. status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
  3108. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  3109. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  3110. }
  3111. if (state->RF_IN >= 280000000 && state->RF_IN < 350000000)
  3112. {
  3113. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  3114. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  3115. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  3116. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  3117. }
  3118. if (state->RF_IN >= 350000000 && state->RF_IN < 400000000)
  3119. {
  3120. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  3121. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  3122. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  3123. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
  3124. }
  3125. if (state->RF_IN >= 400000000 && state->RF_IN < 470000000) //modified for 2.6.11
  3126. {
  3127. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
  3128. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 On
  3129. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 Off
  3130. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  3131. }
  3132. if (state->RF_IN >= 470000000 && state->RF_IN < 640000000)
  3133. {
  3134. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  3135. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  3136. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  3137. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
  3138. }
  3139. if (state->RF_IN >= 640000000 && state->RF_IN < 820000000)
  3140. {
  3141. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
  3142. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  3143. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  3144. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
  3145. }
  3146. if (state->RF_IN >= 820000000 && state->RF_IN <= 900000000)
  3147. {
  3148. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
  3149. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  3150. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  3151. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  3152. }
  3153. }
  3154. if (state->TF_Type == MXL_TF_E_NA) // Tracking Filter type E-NA for Empia ONLY change for 2.6.8
  3155. {
  3156. status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
  3157. // if UHF and terrestrial=> Turn off Tracking Filter
  3158. if (state->RF_IN >= 471000000 && (state->RF_IN - 471000000)%6000000 != 0)
  3159. {
  3160. // Turn off all the banks
  3161. status += MXL_SetGPIO(fe, 3, 1) ;
  3162. status += MXL_SetGPIO(fe, 1, 1) ;
  3163. status += MXL_SetGPIO(fe, 4, 1) ;
  3164. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ;
  3165. //2.6.12
  3166. //Turn on RSSI
  3167. status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1) ;
  3168. status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1) ;
  3169. status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1) ;
  3170. status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1) ;
  3171. // RSSI reference point
  3172. status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5) ;
  3173. status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3) ;
  3174. status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2) ;
  3175. //status += MXL_ControlWrite(fe, AGC_IF, 10) ; //doesn't matter since RSSI is turn on
  3176. //following parameter is from analog OTA mode, can be change to seek better performance
  3177. status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3) ;
  3178. }
  3179. else //if VHF or Cable => Turn on Tracking Filter
  3180. {
  3181. //2.6.12
  3182. //Turn off RSSI
  3183. status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0) ;
  3184. //change back from above condition
  3185. status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5) ;
  3186. if (state->RF_IN >= 43000000 && state->RF_IN < 174000000)
  3187. {
  3188. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  3189. status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
  3190. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  3191. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  3192. }
  3193. if (state->RF_IN >= 174000000 && state->RF_IN < 250000000)
  3194. {
  3195. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  3196. status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
  3197. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  3198. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  3199. }
  3200. if (state->RF_IN >= 250000000 && state->RF_IN < 350000000)
  3201. {
  3202. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  3203. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  3204. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  3205. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  3206. }
  3207. if (state->RF_IN >= 350000000 && state->RF_IN < 400000000)
  3208. {
  3209. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  3210. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  3211. status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
  3212. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
  3213. }
  3214. if (state->RF_IN >= 400000000 && state->RF_IN < 570000000)
  3215. {
  3216. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
  3217. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  3218. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  3219. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
  3220. }
  3221. if (state->RF_IN >= 570000000 && state->RF_IN < 770000000)
  3222. {
  3223. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
  3224. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  3225. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  3226. status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
  3227. }
  3228. if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000)
  3229. {
  3230. status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
  3231. status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
  3232. status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
  3233. status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
  3234. }
  3235. }
  3236. }
  3237. return status ;
  3238. }
  3239. u16 MXL_SetGPIO(struct dvb_frontend *fe, u8 GPIO_Num, u8 GPIO_Val)
  3240. {
  3241. u16 status = 0;
  3242. if (GPIO_Num == 1)
  3243. status += MXL_ControlWrite(fe, GPIO_1B, GPIO_Val ? 0 : 1);
  3244. /* GPIO2 is not available */
  3245. if (GPIO_Num == 3) {
  3246. if (GPIO_Val == 1) {
  3247. status += MXL_ControlWrite(fe, GPIO_3, 0);
  3248. status += MXL_ControlWrite(fe, GPIO_3B, 0);
  3249. }
  3250. if (GPIO_Val == 0) {
  3251. status += MXL_ControlWrite(fe, GPIO_3, 1);
  3252. status += MXL_ControlWrite(fe, GPIO_3B, 1);
  3253. }
  3254. if (GPIO_Val == 3) { /* tri-state */
  3255. status += MXL_ControlWrite(fe, GPIO_3, 0);
  3256. status += MXL_ControlWrite(fe, GPIO_3B, 1);
  3257. }
  3258. }
  3259. if (GPIO_Num == 4) {
  3260. if (GPIO_Val == 1) {
  3261. status += MXL_ControlWrite(fe, GPIO_4, 0);
  3262. status += MXL_ControlWrite(fe, GPIO_4B, 0);
  3263. }
  3264. if (GPIO_Val == 0) {
  3265. status += MXL_ControlWrite(fe, GPIO_4, 1);
  3266. status += MXL_ControlWrite(fe, GPIO_4B, 1);
  3267. }
  3268. if (GPIO_Val == 3) { /* tri-state */
  3269. status += MXL_ControlWrite(fe, GPIO_4, 0);
  3270. status += MXL_ControlWrite(fe, GPIO_4B, 1);
  3271. }
  3272. }
  3273. return status;
  3274. }
  3275. ///////////////////////////////////////////////////////////////////////////////
  3276. // //
  3277. // Function: MXL_ControlWrite //
  3278. // //
  3279. // Description: Update control name value //
  3280. // //
  3281. // Globals: //
  3282. // NONE //
  3283. // //
  3284. // Functions used: //
  3285. // MXL_ControlWrite( Tuner, controlName, value, Group ) //
  3286. // //
  3287. // Inputs: //
  3288. // Tuner : Tuner structure //
  3289. // ControlName : Control name to be updated //
  3290. // value : Value to be written //
  3291. // //
  3292. // Outputs: //
  3293. // Tuner : Tuner structure defined at higher level //
  3294. // //
  3295. // Return: //
  3296. // 0 : Successful write //
  3297. // >0 : Value exceed maximum allowed for control number //
  3298. // //
  3299. ///////////////////////////////////////////////////////////////////////////////
  3300. u16 MXL_ControlWrite(struct dvb_frontend *fe, u16 ControlNum, u32 value)
  3301. {
  3302. u16 status = 0;
  3303. /* Will write ALL Matching Control Name */
  3304. status += MXL_ControlWrite_Group(fe, ControlNum, value, 1); /* Write Matching INIT Control */
  3305. status += MXL_ControlWrite_Group(fe, ControlNum, value, 2); /* Write Matching CH Control */
  3306. #ifdef _MXL_INTERNAL
  3307. status += MXL_ControlWrite_Group(fe, ControlNum, value, 3); /* Write Matching MXL Control */
  3308. #endif
  3309. return status;
  3310. }
  3311. ///////////////////////////////////////////////////////////////////////////////
  3312. // //
  3313. // Function: MXL_ControlWrite //
  3314. // //
  3315. // Description: Update control name value //
  3316. // //
  3317. // Globals: //
  3318. // NONE //
  3319. // //
  3320. // Functions used: //
  3321. // strcmp //
  3322. // //
  3323. // Inputs: //
  3324. // Tuner_struct: structure defined at higher level //
  3325. // ControlName : Control Name //
  3326. // value : Value Assigned to Control Name //
  3327. // controlGroup : Control Register Group //
  3328. // //
  3329. // Outputs: //
  3330. // NONE //
  3331. // //
  3332. // Return: //
  3333. // 0 : Successful write //
  3334. // 1 : Value exceed maximum allowed for control name //
  3335. // 2 : Control name not found //
  3336. // //
  3337. ///////////////////////////////////////////////////////////////////////////////
  3338. u16 MXL_ControlWrite_Group(struct dvb_frontend *fe, u16 controlNum, u32 value, u16 controlGroup)
  3339. {
  3340. struct mxl5005s_state *state = fe->tuner_priv;
  3341. u16 i, j, k;
  3342. u32 highLimit;
  3343. u32 ctrlVal;
  3344. if (controlGroup == 1) /* Initial Control */ {
  3345. for (i = 0; i < state->Init_Ctrl_Num; i++) {
  3346. if (controlNum == state->Init_Ctrl[i].Ctrl_Num) {
  3347. highLimit = 1 << state->Init_Ctrl[i].size;
  3348. if (value < highLimit) {
  3349. for (j = 0; j < state->Init_Ctrl[i].size; j++) {
  3350. state->Init_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
  3351. MXL_RegWriteBit(fe, (u8)(state->Init_Ctrl[i].addr[j]),
  3352. (u8)(state->Init_Ctrl[i].bit[j]),
  3353. (u8)((value>>j) & 0x01) );
  3354. }
  3355. ctrlVal = 0;
  3356. for (k = 0; k < state->Init_Ctrl[i].size; k++)
  3357. ctrlVal += state->Init_Ctrl[i].val[k] * (1 << k);
  3358. }
  3359. else
  3360. return -1;
  3361. }
  3362. }
  3363. }
  3364. if (controlGroup == 2) /* Chan change Control */ {
  3365. for (i = 0; i < state->CH_Ctrl_Num; i++) {
  3366. if (controlNum == state->CH_Ctrl[i].Ctrl_Num ) {
  3367. highLimit = 1 << state->CH_Ctrl[i].size;
  3368. if (value < highLimit) {
  3369. for (j = 0; j < state->CH_Ctrl[i].size; j++) {
  3370. state->CH_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
  3371. MXL_RegWriteBit(fe, (u8)(state->CH_Ctrl[i].addr[j]),
  3372. (u8)(state->CH_Ctrl[i].bit[j]),
  3373. (u8)((value>>j) & 0x01) );
  3374. }
  3375. ctrlVal = 0;
  3376. for (k = 0; k < state->CH_Ctrl[i].size; k++)
  3377. ctrlVal += state->CH_Ctrl[i].val[k] * (1 << k);
  3378. }
  3379. else
  3380. return -1;
  3381. }
  3382. }
  3383. }
  3384. #ifdef _MXL_INTERNAL
  3385. if (controlGroup == 3) /* Maxlinear Control */ {
  3386. for (i = 0; i < state->MXL_Ctrl_Num; i++) {
  3387. if (controlNum == state->MXL_Ctrl[i].Ctrl_Num ) {
  3388. highLimit = (1 << state->MXL_Ctrl[i].size) ;
  3389. if (value < highLimit) {
  3390. for (j = 0; j < state->MXL_Ctrl[i].size; j++) {
  3391. state->MXL_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
  3392. MXL_RegWriteBit(fe, (u8)(state->MXL_Ctrl[i].addr[j]),
  3393. (u8)(state->MXL_Ctrl[i].bit[j]),
  3394. (u8)((value>>j) & 0x01) );
  3395. }
  3396. ctrlVal = 0;
  3397. for(k = 0; k < state->MXL_Ctrl[i].size; k++)
  3398. ctrlVal += state->MXL_Ctrl[i].val[k] * (1 << k);
  3399. }
  3400. else
  3401. return -1;
  3402. }
  3403. }
  3404. }
  3405. #endif
  3406. return 0 ; /* successful return */
  3407. }
  3408. ///////////////////////////////////////////////////////////////////////////////
  3409. // //
  3410. // Function: MXL_RegWrite //
  3411. // //
  3412. // Description: Update tuner register value //
  3413. // //
  3414. // Globals: //
  3415. // NONE //
  3416. // //
  3417. // Functions used: //
  3418. // NONE //
  3419. // //
  3420. // Inputs: //
  3421. // Tuner_struct: structure defined at higher level //
  3422. // RegNum : Register address to be assigned a value //
  3423. // RegVal : Register value to write //
  3424. // //
  3425. // Outputs: //
  3426. // NONE //
  3427. // //
  3428. // Return: //
  3429. // 0 : Successful write //
  3430. // -1 : Invalid Register Address //
  3431. // //
  3432. ///////////////////////////////////////////////////////////////////////////////
  3433. u16 MXL_RegWrite(struct dvb_frontend *fe, u8 RegNum, u8 RegVal)
  3434. {
  3435. struct mxl5005s_state *state = fe->tuner_priv;
  3436. int i ;
  3437. for (i = 0; i < 104; i++) {
  3438. if (RegNum == state->TunerRegs[i].Reg_Num) {
  3439. state->TunerRegs[i].Reg_Val = RegVal;
  3440. return 0;
  3441. }
  3442. }
  3443. return 1;
  3444. }
  3445. ///////////////////////////////////////////////////////////////////////////////
  3446. // //
  3447. // Function: MXL_RegRead //
  3448. // //
  3449. // Description: Retrieve tuner register value //
  3450. // //
  3451. // Globals: //
  3452. // NONE //
  3453. // //
  3454. // Functions used: //
  3455. // NONE //
  3456. // //
  3457. // Inputs: //
  3458. // Tuner_struct: structure defined at higher level //
  3459. // RegNum : Register address to be assigned a value //
  3460. // //
  3461. // Outputs: //
  3462. // RegVal : Retrieved register value //
  3463. // //
  3464. // Return: //
  3465. // 0 : Successful read //
  3466. // -1 : Invalid Register Address //
  3467. // //
  3468. ///////////////////////////////////////////////////////////////////////////////
  3469. u16 MXL_RegRead(struct dvb_frontend *fe, u8 RegNum, u8 *RegVal)
  3470. {
  3471. struct mxl5005s_state *state = fe->tuner_priv;
  3472. int i ;
  3473. for (i = 0; i < 104; i++) {
  3474. if (RegNum == state->TunerRegs[i].Reg_Num ) {
  3475. *RegVal = (u8)(state->TunerRegs[i].Reg_Val);
  3476. return 0;
  3477. }
  3478. }
  3479. return 1;
  3480. }
  3481. ///////////////////////////////////////////////////////////////////////////////
  3482. // //
  3483. // Function: MXL_ControlRead //
  3484. // //
  3485. // Description: Retrieve the control value based on the control name //
  3486. // //
  3487. // Globals: //
  3488. // NONE //
  3489. // //
  3490. // Inputs: //
  3491. // Tuner_struct : structure defined at higher level //
  3492. // ControlName : Control Name //
  3493. // //
  3494. // Outputs: //
  3495. // value : returned control value //
  3496. // //
  3497. // Return: //
  3498. // 0 : Successful read //
  3499. // -1 : Invalid control name //
  3500. // //
  3501. ///////////////////////////////////////////////////////////////////////////////
  3502. u16 MXL_ControlRead(struct dvb_frontend *fe, u16 controlNum, u32 *value)
  3503. {
  3504. struct mxl5005s_state *state = fe->tuner_priv;
  3505. u32 ctrlVal ;
  3506. u16 i, k ;
  3507. for (i = 0; i < state->Init_Ctrl_Num ; i++) {
  3508. if (controlNum == state->Init_Ctrl[i].Ctrl_Num) {
  3509. ctrlVal = 0;
  3510. for (k = 0; k < state->Init_Ctrl[i].size; k++)
  3511. ctrlVal += state->Init_Ctrl[i].val[k] * (1 << k);
  3512. *value = ctrlVal;
  3513. return 0;
  3514. }
  3515. }
  3516. for (i = 0; i < state->CH_Ctrl_Num ; i++) {
  3517. if (controlNum == state->CH_Ctrl[i].Ctrl_Num) {
  3518. ctrlVal = 0;
  3519. for (k = 0; k < state->CH_Ctrl[i].size; k++)
  3520. ctrlVal += state->CH_Ctrl[i].val[k] * (1 << k);
  3521. *value = ctrlVal;
  3522. return 0;
  3523. }
  3524. }
  3525. #ifdef _MXL_INTERNAL
  3526. for (i = 0; i < state->MXL_Ctrl_Num ; i++) {
  3527. if (controlNum == state->MXL_Ctrl[i].Ctrl_Num) {
  3528. ctrlVal = 0;
  3529. for (k = 0; k < state->MXL_Ctrl[i].size; k++)
  3530. ctrlVal += state->MXL_Ctrl[i].val[k] * (1<<k);
  3531. *value = ctrlVal;
  3532. return 0;
  3533. }
  3534. }
  3535. #endif
  3536. return 1;
  3537. }
  3538. ///////////////////////////////////////////////////////////////////////////////
  3539. // //
  3540. // Function: MXL_ControlRegRead //
  3541. // //
  3542. // Description: Retrieve the register addresses and count related to a //
  3543. // a specific control name //
  3544. // //
  3545. // Globals: //
  3546. // NONE //
  3547. // //
  3548. // Inputs: //
  3549. // Tuner_struct : structure defined at higher level //
  3550. // ControlName : Control Name //
  3551. // //
  3552. // Outputs: //
  3553. // RegNum : returned register address array //
  3554. // count : returned register count related to a control //
  3555. // //
  3556. // Return: //
  3557. // 0 : Successful read //
  3558. // -1 : Invalid control name //
  3559. // //
  3560. ///////////////////////////////////////////////////////////////////////////////
  3561. u16 MXL_ControlRegRead(struct dvb_frontend *fe, u16 controlNum, u8 *RegNum, int * count)
  3562. {
  3563. struct mxl5005s_state *state = fe->tuner_priv;
  3564. u16 i, j, k ;
  3565. u16 Count ;
  3566. for (i = 0; i < state->Init_Ctrl_Num ; i++) {
  3567. if ( controlNum == state->Init_Ctrl[i].Ctrl_Num ) {
  3568. Count = 1;
  3569. RegNum[0] = (u8)(state->Init_Ctrl[i].addr[0]);
  3570. for (k = 1; k < state->Init_Ctrl[i].size; k++) {
  3571. for (j = 0; j < Count; j++) {
  3572. if (state->Init_Ctrl[i].addr[k] != RegNum[j]) {
  3573. Count ++;
  3574. RegNum[Count-1] = (u8)(state->Init_Ctrl[i].addr[k]);
  3575. }
  3576. }
  3577. }
  3578. *count = Count;
  3579. return 0;
  3580. }
  3581. }
  3582. for (i = 0; i < state->CH_Ctrl_Num ; i++) {
  3583. if ( controlNum == state->CH_Ctrl[i].Ctrl_Num ) {
  3584. Count = 1;
  3585. RegNum[0] = (u8)(state->CH_Ctrl[i].addr[0]);
  3586. for (k = 1; k < state->CH_Ctrl[i].size; k++) {
  3587. for (j= 0; j<Count; j++) {
  3588. if (state->CH_Ctrl[i].addr[k] != RegNum[j]) {
  3589. Count ++;
  3590. RegNum[Count-1] = (u8)(state->CH_Ctrl[i].addr[k]);
  3591. }
  3592. }
  3593. }
  3594. *count = Count;
  3595. return 0;
  3596. }
  3597. }
  3598. #ifdef _MXL_INTERNAL
  3599. for (i = 0; i < state->MXL_Ctrl_Num ; i++) {
  3600. if ( controlNum == state->MXL_Ctrl[i].Ctrl_Num ) {
  3601. Count = 1;
  3602. RegNum[0] = (u8)(state->MXL_Ctrl[i].addr[0]);
  3603. for (k = 1; k < state->MXL_Ctrl[i].size; k++) {
  3604. for (j = 0; j<Count; j++) {
  3605. if (state->MXL_Ctrl[i].addr[k] != RegNum[j]) {
  3606. Count ++;
  3607. RegNum[Count-1] = (u8)state->MXL_Ctrl[i].addr[k];
  3608. }
  3609. }
  3610. }
  3611. *count = Count;
  3612. return 0;
  3613. }
  3614. }
  3615. #endif
  3616. *count = 0;
  3617. return 1;
  3618. }
  3619. ///////////////////////////////////////////////////////////////////////////////
  3620. // //
  3621. // Function: MXL_RegWriteBit //
  3622. // //
  3623. // Description: Write a register for specified register address, //
  3624. // register bit and register bit value //
  3625. // //
  3626. // Globals: //
  3627. // NONE //
  3628. // //
  3629. // Inputs: //
  3630. // Tuner_struct : structure defined at higher level //
  3631. // address : register address //
  3632. // bit : register bit number //
  3633. // bitVal : register bit value //
  3634. // //
  3635. // Outputs: //
  3636. // NONE //
  3637. // //
  3638. // Return: //
  3639. // NONE //
  3640. // //
  3641. ///////////////////////////////////////////////////////////////////////////////
  3642. void MXL_RegWriteBit(struct dvb_frontend *fe, u8 address, u8 bit, u8 bitVal)
  3643. {
  3644. struct mxl5005s_state *state = fe->tuner_priv;
  3645. int i ;
  3646. const u8 AND_MAP[8] = {
  3647. 0xFE, 0xFD, 0xFB, 0xF7,
  3648. 0xEF, 0xDF, 0xBF, 0x7F } ;
  3649. const u8 OR_MAP[8] = {
  3650. 0x01, 0x02, 0x04, 0x08,
  3651. 0x10, 0x20, 0x40, 0x80 } ;
  3652. for (i = 0; i < state->TunerRegs_Num; i++) {
  3653. if (state->TunerRegs[i].Reg_Num == address) {
  3654. if (bitVal)
  3655. state->TunerRegs[i].Reg_Val |= OR_MAP[bit];
  3656. else
  3657. state->TunerRegs[i].Reg_Val &= AND_MAP[bit];
  3658. break ;
  3659. }
  3660. }
  3661. }
  3662. ///////////////////////////////////////////////////////////////////////////////
  3663. // //
  3664. // Function: MXL_Ceiling //
  3665. // //
  3666. // Description: Complete to closest increment of resolution //
  3667. // //
  3668. // Globals: //
  3669. // NONE //
  3670. // //
  3671. // Functions used: //
  3672. // NONE //
  3673. // //
  3674. // Inputs: //
  3675. // value : Input number to compute //
  3676. // resolution : Increment step //
  3677. // //
  3678. // Outputs: //
  3679. // NONE //
  3680. // //
  3681. // Return: //
  3682. // Computed value //
  3683. // //
  3684. ///////////////////////////////////////////////////////////////////////////////
  3685. u32 MXL_Ceiling(u32 value, u32 resolution)
  3686. {
  3687. return (value/resolution + (value % resolution > 0 ? 1 : 0));
  3688. }
  3689. //
  3690. // Retrieve the Initialzation Registers
  3691. //
  3692. u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 * RegNum, u8 *RegVal, int *count)
  3693. {
  3694. u16 status = 0;
  3695. int i ;
  3696. u8 RegAddr[] = {
  3697. 11, 12, 13, 22, 32, 43, 44, 53, 56, 59, 73,
  3698. 76, 77, 91, 134, 135, 137, 147,
  3699. 156, 166, 167, 168, 25 };
  3700. *count = sizeof(RegAddr) / sizeof(u8);
  3701. status += MXL_BlockInit(fe);
  3702. for (i = 0 ; i < *count; i++) {
  3703. RegNum[i] = RegAddr[i];
  3704. status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
  3705. }
  3706. return status;
  3707. }
  3708. u16 MXL_GetCHRegister(struct dvb_frontend *fe, u8 * RegNum, u8 *RegVal, int *count)
  3709. {
  3710. u16 status = 0;
  3711. int i ;
  3712. //add 77, 166, 167, 168 register for 2.6.12
  3713. #ifdef _MXL_PRODUCTION
  3714. u8 RegAddr[] = {14, 15, 16, 17, 22, 43, 65, 68, 69, 70, 73, 92, 93, 106,
  3715. 107, 108, 109, 110, 111, 112, 136, 138, 149, 77, 166, 167, 168 } ;
  3716. #else
  3717. u8 RegAddr[] = {14, 15, 16, 17, 22, 43, 68, 69, 70, 73, 92, 93, 106,
  3718. 107, 108, 109, 110, 111, 112, 136, 138, 149, 77, 166, 167, 168 } ;
  3719. //u8 RegAddr[171];
  3720. //for (i=0; i<=170; i++)
  3721. // RegAddr[i] = i;
  3722. #endif
  3723. *count = sizeof(RegAddr) / sizeof(u8);
  3724. for (i = 0 ; i < *count; i++) {
  3725. RegNum[i] = RegAddr[i];
  3726. status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
  3727. }
  3728. return status;
  3729. }
  3730. u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 * RegNum, u8 *RegVal, int *count)
  3731. {
  3732. u16 status = 0;
  3733. int i;
  3734. u8 RegAddr[] = {43, 136};
  3735. *count = sizeof(RegAddr) / sizeof(u8);
  3736. for (i = 0; i < *count; i++) {
  3737. RegNum[i] = RegAddr[i];
  3738. status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
  3739. }
  3740. return status;
  3741. }
  3742. u16 MXL_GetCHRegister_LowIF(struct dvb_frontend *fe, u8 * RegNum, u8 *RegVal, int *count)
  3743. {
  3744. u16 status = 0;
  3745. int i;
  3746. u8 RegAddr[] = { 138 };
  3747. *count = sizeof(RegAddr) / sizeof(u8);
  3748. for (i = 0; i < *count; i++) {
  3749. RegNum[i] = RegAddr[i];
  3750. status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
  3751. }
  3752. return status;
  3753. }
  3754. u16 MXL_GetMasterControl(u8 *MasterReg, int state)
  3755. {
  3756. if (state == 1) /* Load_Start */
  3757. *MasterReg = 0xF3;
  3758. if (state == 2) /* Power_Down */
  3759. *MasterReg = 0x41;
  3760. if (state == 3) /* Synth_Reset */
  3761. *MasterReg = 0xB1;
  3762. if (state == 4) /* Seq_Off */
  3763. *MasterReg = 0xF1;
  3764. return 0;
  3765. }
  3766. #ifdef _MXL_PRODUCTION
  3767. u16 MXL_VCORange_Test(struct dvb_frontend *fe, int VCO_Range)
  3768. {
  3769. struct mxl5005s_state *state = fe->tuner_priv;
  3770. u16 status = 0 ;
  3771. if (VCO_Range == 1) {
  3772. status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
  3773. status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
  3774. status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
  3775. status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
  3776. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
  3777. status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
  3778. status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
  3779. if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF Mode */ {
  3780. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
  3781. status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
  3782. status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
  3783. status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 180224);
  3784. }
  3785. if (state->Mode == 0 && state->IF_Mode == 0) /* Analog Zero IF Mode */ {
  3786. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
  3787. status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
  3788. status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
  3789. status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 222822);
  3790. }
  3791. if (state->Mode == 1) /* Digital Mode */ {
  3792. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
  3793. status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
  3794. status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
  3795. status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 229376);
  3796. }
  3797. }
  3798. if (VCO_Range == 2) {
  3799. status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
  3800. status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
  3801. status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
  3802. status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
  3803. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
  3804. status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
  3805. status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
  3806. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
  3807. status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
  3808. status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 41);
  3809. if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF Mode */ {
  3810. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
  3811. status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
  3812. status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
  3813. status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 206438);
  3814. }
  3815. if (state->Mode == 0 && state->IF_Mode == 0) /* Analog Zero IF Mode */ {
  3816. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
  3817. status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
  3818. status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
  3819. status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 206438);
  3820. }
  3821. if (state->Mode == 1) /* Digital Mode */ {
  3822. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
  3823. status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
  3824. status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 41);
  3825. status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 16384);
  3826. }
  3827. }
  3828. if (VCO_Range == 3) {
  3829. status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
  3830. status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
  3831. status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
  3832. status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
  3833. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
  3834. status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
  3835. status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
  3836. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
  3837. status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
  3838. status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
  3839. if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF Mode */ {
  3840. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
  3841. status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
  3842. status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 44);
  3843. status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 173670);
  3844. }
  3845. if (state->Mode == 0 && state->IF_Mode == 0) /* Analog Zero IF Mode */ {
  3846. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
  3847. status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
  3848. status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 44);
  3849. status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 173670);
  3850. }
  3851. if (state->Mode == 1) /* Digital Mode */ {
  3852. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
  3853. status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
  3854. status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
  3855. status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 245760);
  3856. }
  3857. }
  3858. if (VCO_Range == 4) {
  3859. status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
  3860. status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
  3861. status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
  3862. status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
  3863. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
  3864. status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
  3865. status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
  3866. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
  3867. status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
  3868. status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
  3869. if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF Mode */ {
  3870. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
  3871. status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
  3872. status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
  3873. status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 206438);
  3874. }
  3875. if (state->Mode == 0 && state->IF_Mode == 0) /* Analog Zero IF Mode */ {
  3876. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
  3877. status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
  3878. status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
  3879. status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 206438);
  3880. }
  3881. if (state->Mode == 1) /* Digital Mode */ {
  3882. status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
  3883. status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
  3884. status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
  3885. status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 212992);
  3886. }
  3887. }
  3888. return status;
  3889. }
  3890. u16 MXL_Hystersis_Test(struct dvb_frontend *fe, int Hystersis)
  3891. {
  3892. struct mxl5005s_state *state = fe->tuner_priv;
  3893. u16 status = 0;
  3894. if (Hystersis == 1)
  3895. status += MXL_ControlWrite(fe, DN_BYPASS_AGC_I2C, 1);
  3896. return status;
  3897. }
  3898. #endif
  3899. /* End: Reference driver code found in the Realtek driver that
  3900. * is copyright MaxLinear */
  3901. /* ----------------------------------------------------------------
  3902. * Begin: Everything after here is new code to adapt the
  3903. * proprietary Realtek driver into a Linux API tuner.
  3904. * Copyright (C) 2008 Steven Toth <stoth@hauppauge.com>
  3905. */
  3906. static int mxl5005s_reset(struct dvb_frontend *fe)
  3907. {
  3908. struct mxl5005s_state *state = fe->tuner_priv;
  3909. int ret = 0;
  3910. u8 buf[2] = { 0xff, 0x00 };
  3911. struct i2c_msg msg = { .addr = state->config->i2c_address, .flags = 0,
  3912. .buf = buf, .len = 2 };
  3913. dprintk(2, "%s()\n", __func__);
  3914. if (fe->ops.i2c_gate_ctrl)
  3915. fe->ops.i2c_gate_ctrl(fe, 1);
  3916. if (i2c_transfer(state->i2c, &msg, 1) != 1) {
  3917. printk(KERN_WARNING "mxl5005s I2C reset failed\n");
  3918. ret = -EREMOTEIO;
  3919. }
  3920. if (fe->ops.i2c_gate_ctrl)
  3921. fe->ops.i2c_gate_ctrl(fe, 0);
  3922. return ret;
  3923. }
  3924. /* Write a single byte to a single reg, latch the value if required by
  3925. * following the transaction with the latch byte.
  3926. */
  3927. static int mxl5005s_writereg(struct dvb_frontend *fe, u8 reg, u8 val, int latch)
  3928. {
  3929. struct mxl5005s_state *state = fe->tuner_priv;
  3930. u8 buf[3] = { reg, val, MXL5005S_LATCH_BYTE };
  3931. struct i2c_msg msg = { .addr = state->config->i2c_address, .flags = 0,
  3932. .buf = buf, .len = 3 };
  3933. if (latch == 0)
  3934. msg.len = 2;
  3935. dprintk(2, "%s(reg = 0x%x val = 0x%x addr = 0x%x)\n", __func__, reg, val, msg.addr);
  3936. if (i2c_transfer(state->i2c, &msg, 1) != 1) {
  3937. printk(KERN_WARNING "mxl5005s I2C write failed\n");
  3938. return -EREMOTEIO;
  3939. }
  3940. return 0;
  3941. }
  3942. int mxl5005s_writeregs(struct dvb_frontend *fe, u8 *addrtable, u8 *datatable, u8 len)
  3943. {
  3944. int ret = 0, i;
  3945. if (fe->ops.i2c_gate_ctrl)
  3946. fe->ops.i2c_gate_ctrl(fe, 1);
  3947. for (i = 0 ; i < len-1; i++) {
  3948. ret = mxl5005s_writereg(fe, addrtable[i], datatable[i], 0);
  3949. if (ret < 0)
  3950. break;
  3951. }
  3952. ret = mxl5005s_writereg(fe, addrtable[i], datatable[i], 1);
  3953. if (fe->ops.i2c_gate_ctrl)
  3954. fe->ops.i2c_gate_ctrl(fe, 0);
  3955. return ret;
  3956. }
  3957. int mxl5005s_init(struct dvb_frontend *fe)
  3958. {
  3959. dprintk(1, "%s()\n", __func__);
  3960. return mxl5005s_reconfigure(fe, MXL_QAM, MXL5005S_BANDWIDTH_6MHZ);
  3961. }
  3962. int mxl5005s_reconfigure(struct dvb_frontend *fe, u32 mod_type, u32 bandwidth)
  3963. {
  3964. struct mxl5005s_state *state = fe->tuner_priv;
  3965. u8 AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
  3966. u8 ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
  3967. int TableLen;
  3968. dprintk(1, "%s(type=%d, bw=%d)\n", __func__, mod_type, bandwidth);
  3969. mxl5005s_reset(fe);
  3970. /* Tuner initialization stage 0 */
  3971. MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET);
  3972. AddrTable[0] = MASTER_CONTROL_ADDR;
  3973. ByteTable[0] |= state->config->AgcMasterByte;
  3974. mxl5005s_writeregs(fe, AddrTable, ByteTable, 1);
  3975. mxl5005s_AssignTunerMode(fe, mod_type, bandwidth);
  3976. /* Tuner initialization stage 1 */
  3977. MXL_GetInitRegister(fe, AddrTable, ByteTable, &TableLen);
  3978. mxl5005s_writeregs(fe, AddrTable, ByteTable, TableLen);
  3979. return 0;
  3980. }
  3981. int mxl5005s_AssignTunerMode(struct dvb_frontend *fe, u32 mod_type, u32 bandwidth)
  3982. {
  3983. struct mxl5005s_state *state = fe->tuner_priv;
  3984. struct mxl5005s_config *c = state->config;
  3985. InitTunerControls(fe);
  3986. /* Set MxL5005S parameters. */
  3987. MXL5005_TunerConfig(
  3988. fe,
  3989. c->mod_mode,
  3990. c->if_mode,
  3991. bandwidth,
  3992. c->if_freq,
  3993. c->xtal_freq,
  3994. c->agc_mode,
  3995. c->top,
  3996. c->output_load,
  3997. c->clock_out,
  3998. c->div_out,
  3999. c->cap_select,
  4000. c->rssi_enable,
  4001. mod_type,
  4002. c->tracking_filter);
  4003. return 0;
  4004. }
  4005. static int mxl5005s_set_params(struct dvb_frontend *fe,
  4006. struct dvb_frontend_parameters *params)
  4007. {
  4008. struct mxl5005s_state *state = fe->tuner_priv;
  4009. u32 req_mode, req_bw = 0;
  4010. int ret;
  4011. dprintk(1, "%s()\n", __func__);
  4012. if (fe->ops.info.type == FE_ATSC) {
  4013. switch (params->u.vsb.modulation) {
  4014. case VSB_8:
  4015. req_mode = MXL_ATSC; break;
  4016. default:
  4017. case QAM_64:
  4018. case QAM_256:
  4019. case QAM_AUTO:
  4020. req_mode = MXL_QAM; break;
  4021. }
  4022. }
  4023. else req_mode = MXL_DVBT;
  4024. /* Change tuner for new modulation type if reqd */
  4025. if (req_mode != state->current_mode) {
  4026. switch (req_mode) {
  4027. case VSB_8:
  4028. case QAM_64:
  4029. case QAM_256:
  4030. case QAM_AUTO:
  4031. req_bw = MXL5005S_BANDWIDTH_6MHZ;
  4032. break;
  4033. default:
  4034. /* Assume DVB-T */
  4035. switch (params->u.ofdm.bandwidth) {
  4036. case BANDWIDTH_6_MHZ:
  4037. req_bw = MXL5005S_BANDWIDTH_6MHZ;
  4038. break;
  4039. case BANDWIDTH_7_MHZ:
  4040. req_bw = MXL5005S_BANDWIDTH_7MHZ;
  4041. break;
  4042. case BANDWIDTH_AUTO:
  4043. case BANDWIDTH_8_MHZ:
  4044. req_bw = MXL5005S_BANDWIDTH_8MHZ;
  4045. break;
  4046. }
  4047. }
  4048. state->current_mode = req_mode;
  4049. ret = mxl5005s_reconfigure(fe, req_mode, req_bw);
  4050. } else
  4051. ret = 0;
  4052. if (ret == 0) {
  4053. dprintk(1, "%s() freq=%d\n", __func__, params->frequency);
  4054. ret = mxl5005s_SetRfFreqHz(fe, params->frequency);
  4055. }
  4056. return ret;
  4057. }
  4058. static int mxl5005s_get_frequency(struct dvb_frontend *fe, u32 *frequency)
  4059. {
  4060. struct mxl5005s_state *state = fe->tuner_priv;
  4061. dprintk(1, "%s()\n", __func__);
  4062. *frequency = state->RF_IN;
  4063. return 0;
  4064. }
  4065. static int mxl5005s_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
  4066. {
  4067. struct mxl5005s_state *state = fe->tuner_priv;
  4068. dprintk(1, "%s()\n", __func__);
  4069. *bandwidth = state->Chan_Bandwidth;
  4070. return 0;
  4071. }
  4072. static int mxl5005s_release(struct dvb_frontend *fe)
  4073. {
  4074. dprintk(1, "%s()\n", __func__);
  4075. kfree(fe->tuner_priv);
  4076. fe->tuner_priv = NULL;
  4077. return 0;
  4078. }
  4079. static const struct dvb_tuner_ops mxl5005s_tuner_ops = {
  4080. .info = {
  4081. .name = "MaxLinear MXL5005S",
  4082. .frequency_min = 48000000,
  4083. .frequency_max = 860000000,
  4084. .frequency_step = 50000,
  4085. },
  4086. .release = mxl5005s_release,
  4087. .init = mxl5005s_init,
  4088. .set_params = mxl5005s_set_params,
  4089. .get_frequency = mxl5005s_get_frequency,
  4090. .get_bandwidth = mxl5005s_get_bandwidth,
  4091. };
  4092. struct dvb_frontend *mxl5005s_attach(struct dvb_frontend *fe,
  4093. struct i2c_adapter *i2c,
  4094. struct mxl5005s_config *config)
  4095. {
  4096. struct mxl5005s_state *state = NULL;
  4097. dprintk(1, "%s()\n", __func__);
  4098. state = kzalloc(sizeof(struct mxl5005s_state), GFP_KERNEL);
  4099. if (state == NULL)
  4100. return NULL;
  4101. state->frontend = fe;
  4102. state->config = config;
  4103. state->i2c = i2c;
  4104. state->current_mode = MXL_QAM;
  4105. printk(KERN_INFO "MXL5005S: Attached at address 0x%02x\n", config->i2c_address);
  4106. memcpy(&fe->ops.tuner_ops, &mxl5005s_tuner_ops, sizeof(struct dvb_tuner_ops));
  4107. fe->tuner_priv = state;
  4108. return fe;
  4109. }
  4110. EXPORT_SYMBOL(mxl5005s_attach);
  4111. MODULE_DESCRIPTION("MaxLinear MXL5005S silicon tuner driver");
  4112. MODULE_AUTHOR("Steven Toth");
  4113. MODULE_LICENSE("GPL");