mxl5005s.c 162 KB

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