12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518951995209521952295239524952595269527952895299530953195329533953495359536953795389539954095419542954395449545954695479548954995509551955295539554955595569557955895599560956195629563956495659566956795689569957095719572957395749575957695779578957995809581958295839584958595869587958895899590959195929593959495959596959795989599960096019602960396049605960696079608960996109611961296139614961596169617961896199620962196229623962496259626962796289629963096319632963396349635963696379638963996409641964296439644964596469647964896499650965196529653965496559656965796589659966096619662966396649665966696679668966996709671967296739674967596769677967896799680968196829683968496859686968796889689969096919692969396949695969696979698969997009701970297039704970597069707970897099710971197129713971497159716971797189719972097219722972397249725972697279728972997309731973297339734973597369737973897399740974197429743974497459746974797489749975097519752975397549755975697579758975997609761976297639764976597669767976897699770977197729773977497759776977797789779978097819782978397849785978697879788978997909791979297939794979597969797979897999800980198029803980498059806980798089809981098119812981398149815981698179818981998209821982298239824982598269827982898299830983198329833983498359836983798389839984098419842984398449845984698479848984998509851985298539854985598569857985898599860986198629863986498659866986798689869987098719872987398749875987698779878987998809881988298839884988598869887988898899890989198929893989498959896989798989899990099019902990399049905990699079908990999109911991299139914991599169917991899199920992199229923992499259926992799289929993099319932993399349935993699379938993999409941994299439944994599469947994899499950995199529953995499559956995799589959996099619962996399649965996699679968996999709971997299739974997599769977997899799980998199829983998499859986998799889989999099919992999399949995999699979998999910000100011000210003100041000510006100071000810009100101001110012100131001410015100161001710018100191002010021100221002310024100251002610027100281002910030100311003210033100341003510036100371003810039100401004110042100431004410045100461004710048100491005010051100521005310054100551005610057100581005910060100611006210063100641006510066100671006810069100701007110072100731007410075100761007710078100791008010081100821008310084100851008610087100881008910090100911009210093100941009510096100971009810099101001010110102101031010410105101061010710108101091011010111101121011310114101151011610117101181011910120101211012210123101241012510126101271012810129101301013110132101331013410135101361013710138101391014010141101421014310144101451014610147101481014910150101511015210153101541015510156101571015810159101601016110162101631016410165101661016710168101691017010171101721017310174101751017610177101781017910180101811018210183101841018510186101871018810189101901019110192101931019410195101961019710198101991020010201102021020310204102051020610207102081020910210102111021210213102141021510216102171021810219102201022110222102231022410225102261022710228102291023010231102321023310234102351023610237102381023910240102411024210243102441024510246102471024810249102501025110252102531025410255102561025710258102591026010261102621026310264102651026610267102681026910270102711027210273102741027510276102771027810279102801028110282102831028410285102861028710288102891029010291102921029310294102951029610297102981029910300103011030210303103041030510306103071030810309103101031110312103131031410315103161031710318103191032010321103221032310324103251032610327103281032910330103311033210333103341033510336103371033810339103401034110342103431034410345103461034710348103491035010351103521035310354103551035610357103581035910360103611036210363103641036510366103671036810369103701037110372103731037410375103761037710378103791038010381103821038310384103851038610387103881038910390103911039210393103941039510396103971039810399104001040110402104031040410405104061040710408104091041010411104121041310414104151041610417104181041910420104211042210423104241042510426104271042810429104301043110432104331043410435104361043710438104391044010441104421044310444104451044610447104481044910450104511045210453104541045510456104571045810459104601046110462104631046410465104661046710468104691047010471104721047310474104751047610477104781047910480104811048210483104841048510486104871048810489104901049110492104931049410495104961049710498104991050010501105021050310504105051050610507105081050910510105111051210513105141051510516105171051810519105201052110522105231052410525105261052710528105291053010531105321053310534 |
- /****************************************************************************
- * ixj.c
- *
- * Device Driver for Quicknet Technologies, Inc.'s Telephony cards
- * including the Internet PhoneJACK, Internet PhoneJACK Lite,
- * Internet PhoneJACK PCI, Internet LineJACK, Internet PhoneCARD and
- * SmartCABLE
- *
- * (c) Copyright 1999-2001 Quicknet Technologies, Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- *
- * Author: Ed Okerson, <eokerson@quicknet.net>
- *
- * Contributors: Greg Herlein, <gherlein@quicknet.net>
- * David W. Erhart, <derhart@quicknet.net>
- * John Sellers, <jsellers@quicknet.net>
- * Mike Preston, <mpreston@quicknet.net>
- *
- * Fixes: David Huggins-Daines, <dhd@cepstral.com>
- * Fabio Ferrari, <fabio.ferrari@digitro.com.br>
- * Artis Kugevics, <artis@mt.lv>
- * Daniele Bellucci, <bellucda@tiscali.it>
- *
- * More information about the hardware related to this driver can be found
- * at our website: http://www.quicknet.net
- *
- * IN NO EVENT SHALL QUICKNET TECHNOLOGIES, INC. BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
- * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF QUICKNET
- * TECHNOLOGIES, INC. HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * QUICKNET TECHNOLOGIES, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND QUICKNET TECHNOLOGIES, INC. HAS NO OBLIGATION
- * TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- *
- ***************************************************************************/
- /*
- * $Log: ixj.c,v $
- *
- * Revision 4.8 2003/07/09 19:39:00 Daniele Bellucci
- * Audit some copy_*_user and minor cleanup.
- *
- * Revision 4.7 2001/08/13 06:19:33 craigs
- * Added additional changes from Alan Cox and John Anderson for
- * 2.2 to 2.4 cleanup and bounds checking
- *
- * Revision 4.6 2001/08/13 01:05:05 craigs
- * Really fixed PHONE_QUERY_CODEC problem this time
- *
- * Revision 4.5 2001/08/13 00:11:03 craigs
- * Fixed problem in handling of PHONE_QUERY_CODEC, thanks to Shane Anderson
- *
- * Revision 4.4 2001/08/07 07:58:12 craigs
- * Changed back to three digit version numbers
- * Added tagbuild target to allow automatic and easy tagging of versions
- *
- * Revision 4.3 2001/08/07 07:24:47 craigs
- * Added ixj-ver.h to allow easy configuration management of driver
- * Added display of version number in /prox/ixj
- *
- * Revision 4.2 2001/08/06 07:07:19 craigs
- * Reverted IXJCTL_DSP_TYPE and IXJCTL_DSP_VERSION files to original
- * behaviour of returning int rather than short *
- *
- * Revision 4.1 2001/08/05 00:17:37 craigs
- * More changes for correct PCMCIA installation
- * Start of changes for backward Linux compatibility
- *
- * Revision 4.0 2001/08/04 12:33:12 craigs
- * New version using GNU autoconf
- *
- * Revision 3.105 2001/07/20 23:14:32 eokerson
- * More work on CallerID generation when using ring cadences.
- *
- * Revision 3.104 2001/07/06 01:33:55 eokerson
- * Some bugfixes from Robert Vojta <vojta@ipex.cz> and a few mods to the Makefile.
- *
- * Revision 3.103 2001/07/05 19:20:16 eokerson
- * Updated HOWTO
- * Changed mic gain to 30dB on Internet LineJACK mic/speaker port.
- *
- * Revision 3.102 2001/07/03 23:51:21 eokerson
- * Un-mute mic on Internet LineJACK when in speakerphone mode.
- *
- * Revision 3.101 2001/07/02 19:26:56 eokerson
- * Removed initialiazation of ixjdebug and ixj_convert_loaded so they will go in the .bss instead of the .data
- *
- * Revision 3.100 2001/07/02 19:18:27 eokerson
- * Changed driver to make dynamic allocation possible. We now pass IXJ * between functions instead of array indexes.
- * Fixed the way the POTS and PSTN ports interact during a PSTN call to allow local answering.
- * Fixed speaker mode on Internet LineJACK.
- *
- * Revision 3.99 2001/05/09 14:11:16 eokerson
- * Fixed kmalloc error in ixj_build_filter_cadence. Thanks David Chan <cat@waulogy.stanford.edu>.
- *
- * Revision 3.98 2001/05/08 19:55:33 eokerson
- * Fixed POTS hookstate detection while it is connected to PSTN port.
- *
- * Revision 3.97 2001/05/08 00:01:04 eokerson
- * Fixed kernel oops when sending caller ID data.
- *
- * Revision 3.96 2001/05/04 23:09:30 eokerson
- * Now uses one kernel timer for each card, instead of one for the entire driver.
- *
- * Revision 3.95 2001/04/25 22:06:47 eokerson
- * Fixed squawking at beginning of some G.723.1 calls.
- *
- * Revision 3.94 2001/04/03 23:42:00 eokerson
- * Added linear volume ioctls
- * Added raw filter load ioctl
- *
- * Revision 3.93 2001/02/27 01:00:06 eokerson
- * Fixed blocking in CallerID.
- * Reduced size of ixj structure for smaller driver footprint.
- *
- * Revision 3.92 2001/02/20 22:02:59 eokerson
- * Fixed isapnp and pcmcia module compatibility for 2.4.x kernels.
- * Improved PSTN ring detection.
- * Fixed wink generation on POTS ports.
- *
- * Revision 3.91 2001/02/13 00:55:44 eokerson
- * Turn AEC back on after changing frame sizes.
- *
- * Revision 3.90 2001/02/12 16:42:00 eokerson
- * Added ALAW codec, thanks to Fabio Ferrari for the table based converters to make ALAW from ULAW.
- *
- * Revision 3.89 2001/02/12 15:41:16 eokerson
- * Fix from Artis Kugevics - Tone gains were not being set correctly.
- *
- * Revision 3.88 2001/02/05 23:25:42 eokerson
- * Fixed lockup bugs with deregister.
- *
- * Revision 3.87 2001/01/29 21:00:39 eokerson
- * Fix from Fabio Ferrari <fabio.ferrari@digitro.com.br> to properly handle EAGAIN and EINTR during non-blocking write.
- * Updated copyright date.
- *
- * Revision 3.86 2001/01/23 23:53:46 eokerson
- * Fixes to G.729 compatibility.
- *
- * Revision 3.85 2001/01/23 21:30:36 eokerson
- * Added verbage about cards supported.
- * Removed commands that put the card in low power mode at some times that it should not be in low power mode.
- *
- * Revision 3.84 2001/01/22 23:32:10 eokerson
- * Some bugfixes from David Huggins-Daines, <dhd@cepstral.com> and other cleanups.
- *
- * Revision 3.83 2001/01/19 14:51:41 eokerson
- * Fixed ixj_WriteDSPCommand to decrement usage counter when command fails.
- *
- * Revision 3.82 2001/01/19 00:34:49 eokerson
- * Added verbosity to write overlap errors.
- *
- * Revision 3.81 2001/01/18 23:56:54 eokerson
- * Fixed PSTN line test functions.
- *
- * Revision 3.80 2001/01/18 22:29:27 eokerson
- * Updated AEC/AGC values for different cards.
- *
- * Revision 3.79 2001/01/17 02:58:54 eokerson
- * Fixed AEC reset after Caller ID.
- * Fixed Codec lockup after Caller ID on Call Waiting when not using 30ms frames.
- *
- * Revision 3.78 2001/01/16 19:43:09 eokerson
- * Added support for Linux 2.4.x kernels.
- *
- * Revision 3.77 2001/01/09 04:00:52 eokerson
- * Linetest will now test the line, even if it has previously succeded.
- *
- * Revision 3.76 2001/01/08 19:27:00 eokerson
- * Fixed problem with standard cable on Internet PhoneCARD.
- *
- * Revision 3.75 2000/12/22 16:52:14 eokerson
- * Modified to allow hookstate detection on the POTS port when the PSTN port is selected.
- *
- * Revision 3.74 2000/12/08 22:41:50 eokerson
- * Added capability for G729B.
- *
- * Revision 3.73 2000/12/07 23:35:16 eokerson
- * Added capability to have different ring pattern before CallerID data.
- * Added hookstate checks in CallerID routines to stop FSK.
- *
- * Revision 3.72 2000/12/06 19:31:31 eokerson
- * Modified signal behavior to only send one signal per event.
- *
- * Revision 3.71 2000/12/06 03:23:08 eokerson
- * Fixed CallerID on Call Waiting.
- *
- * Revision 3.70 2000/12/04 21:29:37 eokerson
- * Added checking to Smart Cable gain functions.
- *
- * Revision 3.69 2000/12/04 21:05:20 eokerson
- * Changed ixjdebug levels.
- * Added ioctls to change gains in Internet Phone CARD Smart Cable.
- *
- * Revision 3.68 2000/12/04 00:17:21 craigs
- * Changed mixer voice gain to +6dB rather than 0dB
- *
- * Revision 3.67 2000/11/30 21:25:51 eokerson
- * Fixed write signal errors.
- *
- * Revision 3.66 2000/11/29 22:42:44 eokerson
- * Fixed PSTN ring detect problems.
- *
- * Revision 3.65 2000/11/29 07:31:55 craigs
- * Added new 425Hz filter co-efficients
- * Added card-specific DTMF prescaler initialisation
- *
- * Revision 3.64 2000/11/28 14:03:32 craigs
- * Changed certain mixer initialisations to be 0dB rather than 12dB
- * Added additional information to /proc/ixj
- *
- * Revision 3.63 2000/11/28 11:38:41 craigs
- * Added display of AEC modes in AUTO and AGC mode
- *
- * Revision 3.62 2000/11/28 04:05:44 eokerson
- * Improved PSTN ring detection routine.
- *
- * Revision 3.61 2000/11/27 21:53:12 eokerson
- * Fixed flash detection.
- *
- * Revision 3.60 2000/11/27 15:57:29 eokerson
- * More work on G.729 load routines.
- *
- * Revision 3.59 2000/11/25 21:55:12 eokerson
- * Fixed errors in G.729 load routine.
- *
- * Revision 3.58 2000/11/25 04:08:29 eokerson
- * Added board locks around G.729 and TS85 load routines.
- *
- * Revision 3.57 2000/11/24 05:35:17 craigs
- * Added ability to retrieve mixer values on LineJACK
- * Added complete initialisation of all mixer values at startup
- * Fixed spelling mistake
- *
- * Revision 3.56 2000/11/23 02:52:11 robertj
- * Added cvs change log keyword.
- * Fixed bug in capabilities list when using G.729 module.
- *
- */
- #include "ixj-ver.h"
- #define PERFMON_STATS
- #define IXJDEBUG 0
- #define MAXRINGS 5
- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/sched.h>
- #include <linux/kernel.h> /* printk() */
- #include <linux/fs.h> /* everything... */
- #include <linux/errno.h> /* error codes */
- #include <linux/slab.h>
- #include <linux/mm.h>
- #include <linux/ioport.h>
- #include <linux/interrupt.h>
- #include <linux/proc_fs.h>
- #include <linux/poll.h>
- #include <linux/timer.h>
- #include <linux/delay.h>
- #include <linux/pci.h>
- #include <asm/io.h>
- #include <asm/uaccess.h>
- #include <linux/isapnp.h>
- #include "ixj.h"
- #define TYPE(inode) (iminor(inode) >> 4)
- #define NUM(inode) (iminor(inode) & 0xf)
- static int ixjdebug;
- static int hertz = HZ;
- static int samplerate = 100;
- module_param(ixjdebug, int, 0);
- /************************************************************************
- *
- * ixjdebug meanings are now bit mapped instead of level based
- * Values can be or'ed together to turn on multiple messages
- *
- * bit 0 (0x0001) = any failure
- * bit 1 (0x0002) = general messages
- * bit 2 (0x0004) = POTS ringing related
- * bit 3 (0x0008) = PSTN events
- * bit 4 (0x0010) = PSTN Cadence state details
- * bit 5 (0x0020) = Tone detection triggers
- * bit 6 (0x0040) = Tone detection cadence details
- * bit 7 (0x0080) = ioctl tracking
- * bit 8 (0x0100) = signal tracking
- * bit 9 (0x0200) = CallerID generation details
- *
- ************************************************************************/
- #ifdef IXJ_DYN_ALLOC
- static IXJ *ixj[IXJMAX];
- #define get_ixj(b) ixj[(b)]
- /*
- * Allocate a free IXJ device
- */
-
- static IXJ *ixj_alloc()
- {
- for(cnt=0; cnt<IXJMAX; cnt++)
- {
- if(ixj[cnt] == NULL || !ixj[cnt]->DSPbase)
- {
- j = kmalloc(sizeof(IXJ), GFP_KERNEL);
- if (j == NULL)
- return NULL;
- ixj[cnt] = j;
- return j;
- }
- }
- return NULL;
- }
- static void ixj_fsk_free(IXJ *j)
- {
- kfree(j->fskdata);
- j->fskdata = NULL;
- }
- static void ixj_fsk_alloc(IXJ *j)
- {
- if(!j->fskdata) {
- j->fskdata = kmalloc(8000, GFP_KERNEL);
- if (!j->fskdata) {
- if(ixjdebug & 0x0200) {
- printk("IXJ phone%d - allocate failed\n", j->board);
- }
- return;
- } else {
- j->fsksize = 8000;
- if(ixjdebug & 0x0200) {
- printk("IXJ phone%d - allocate succeded\n", j->board);
- }
- }
- }
- }
- #else
- static IXJ ixj[IXJMAX];
- #define get_ixj(b) (&ixj[(b)])
- /*
- * Allocate a free IXJ device
- */
-
- static IXJ *ixj_alloc(void)
- {
- int cnt;
- for(cnt=0; cnt<IXJMAX; cnt++) {
- if(!ixj[cnt].DSPbase)
- return &ixj[cnt];
- }
- return NULL;
- }
- static inline void ixj_fsk_free(IXJ *j) {;}
- static inline void ixj_fsk_alloc(IXJ *j)
- {
- j->fsksize = 8000;
- }
- #endif
- #ifdef PERFMON_STATS
- #define ixj_perfmon(x) ((x)++)
- #else
- #define ixj_perfmon(x) do { } while(0)
- #endif
- static int ixj_convert_loaded;
- static int ixj_WriteDSPCommand(unsigned short, IXJ *j);
- /************************************************************************
- *
- * These are function definitions to allow external modules to register
- * enhanced functionality call backs.
- *
- ************************************************************************/
- static int Stub(IXJ * J, unsigned long arg)
- {
- return 0;
- }
- static IXJ_REGFUNC ixj_PreRead = &Stub;
- static IXJ_REGFUNC ixj_PostRead = &Stub;
- static IXJ_REGFUNC ixj_PreWrite = &Stub;
- static IXJ_REGFUNC ixj_PostWrite = &Stub;
- static void ixj_read_frame(IXJ *j);
- static void ixj_write_frame(IXJ *j);
- static void ixj_init_timer(IXJ *j);
- static void ixj_add_timer(IXJ * j);
- static void ixj_timeout(unsigned long ptr);
- static int read_filters(IXJ *j);
- static int LineMonitor(IXJ *j);
- static int ixj_fasync(int fd, struct file *, int mode);
- static int ixj_set_port(IXJ *j, int arg);
- static int ixj_set_pots(IXJ *j, int arg);
- static int ixj_hookstate(IXJ *j);
- static int ixj_record_start(IXJ *j);
- static void ixj_record_stop(IXJ *j);
- static void set_rec_volume(IXJ *j, int volume);
- static int get_rec_volume(IXJ *j);
- static int set_rec_codec(IXJ *j, int rate);
- static void ixj_vad(IXJ *j, int arg);
- static int ixj_play_start(IXJ *j);
- static void ixj_play_stop(IXJ *j);
- static int ixj_set_tone_on(unsigned short arg, IXJ *j);
- static int ixj_set_tone_off(unsigned short, IXJ *j);
- static int ixj_play_tone(IXJ *j, char tone);
- static void ixj_aec_start(IXJ *j, int level);
- static int idle(IXJ *j);
- static void ixj_ring_on(IXJ *j);
- static void ixj_ring_off(IXJ *j);
- static void aec_stop(IXJ *j);
- static void ixj_ringback(IXJ *j);
- static void ixj_busytone(IXJ *j);
- static void ixj_dialtone(IXJ *j);
- static void ixj_cpt_stop(IXJ *j);
- static char daa_int_read(IXJ *j);
- static char daa_CR_read(IXJ *j, int cr);
- static int daa_set_mode(IXJ *j, int mode);
- static int ixj_linetest(IXJ *j);
- static int ixj_daa_write(IXJ *j);
- static int ixj_daa_cid_read(IXJ *j);
- static void DAA_Coeff_US(IXJ *j);
- static void DAA_Coeff_UK(IXJ *j);
- static void DAA_Coeff_France(IXJ *j);
- static void DAA_Coeff_Germany(IXJ *j);
- static void DAA_Coeff_Australia(IXJ *j);
- static void DAA_Coeff_Japan(IXJ *j);
- static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf);
- static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr);
- static int ixj_init_tone(IXJ *j, IXJ_TONE * ti);
- static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp);
- static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp);
- /* Serial Control Interface funtions */
- static int SCI_Control(IXJ *j, int control);
- static int SCI_Prepare(IXJ *j);
- static int SCI_WaitHighSCI(IXJ *j);
- static int SCI_WaitLowSCI(IXJ *j);
- static DWORD PCIEE_GetSerialNumber(WORD wAddress);
- static int ixj_PCcontrol_wait(IXJ *j);
- static void ixj_pre_cid(IXJ *j);
- static void ixj_write_cid(IXJ *j);
- static void ixj_write_cid_bit(IXJ *j, int bit);
- static int set_base_frame(IXJ *j, int size);
- static int set_play_codec(IXJ *j, int rate);
- static void set_rec_depth(IXJ *j, int depth);
- static int ixj_mixer(long val, IXJ *j);
- /************************************************************************
- CT8020/CT8021 Host Programmers Model
- Host address Function Access
- DSPbase +
- 0-1 Aux Software Status Register (reserved) Read Only
- 2-3 Software Status Register Read Only
- 4-5 Aux Software Control Register (reserved) Read Write
- 6-7 Software Control Register Read Write
- 8-9 Hardware Status Register Read Only
- A-B Hardware Control Register Read Write
- C-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only
- E-F Host Recieve (Read) Data Buffer Access Port (buffer input) Read Only
- ************************************************************************/
- static inline void ixj_read_HSR(IXJ *j)
- {
- j->hsr.bytes.low = inb_p(j->DSPbase + 8);
- j->hsr.bytes.high = inb_p(j->DSPbase + 9);
- }
- static inline int IsControlReady(IXJ *j)
- {
- ixj_read_HSR(j);
- return j->hsr.bits.controlrdy ? 1 : 0;
- }
- static inline int IsPCControlReady(IXJ *j)
- {
- j->pccr1.byte = inb_p(j->XILINXbase + 3);
- return j->pccr1.bits.crr ? 1 : 0;
- }
- static inline int IsStatusReady(IXJ *j)
- {
- ixj_read_HSR(j);
- return j->hsr.bits.statusrdy ? 1 : 0;
- }
- static inline int IsRxReady(IXJ *j)
- {
- ixj_read_HSR(j);
- ixj_perfmon(j->rxreadycheck);
- return j->hsr.bits.rxrdy ? 1 : 0;
- }
- static inline int IsTxReady(IXJ *j)
- {
- ixj_read_HSR(j);
- ixj_perfmon(j->txreadycheck);
- return j->hsr.bits.txrdy ? 1 : 0;
- }
- static inline void set_play_volume(IXJ *j, int volume)
- {
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "IXJ: /dev/phone%d Setting Play Volume to 0x%4.4x\n", j->board, volume);
- ixj_WriteDSPCommand(0xCF02, j);
- ixj_WriteDSPCommand(volume, j);
- }
- static int set_play_volume_linear(IXJ *j, int volume)
- {
- int newvolume, dspplaymax;
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4x\n", j->board, volume);
- if(volume > 100 || volume < 0) {
- return -1;
- }
- /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
- switch (j->cardtype) {
- case QTI_PHONEJACK:
- dspplaymax = 0x380;
- break;
- case QTI_LINEJACK:
- if(j->port == PORT_PSTN) {
- dspplaymax = 0x48;
- } else {
- dspplaymax = 0x100;
- }
- break;
- case QTI_PHONEJACK_LITE:
- dspplaymax = 0x380;
- break;
- case QTI_PHONEJACK_PCI:
- dspplaymax = 0x6C;
- break;
- case QTI_PHONECARD:
- dspplaymax = 0x50;
- break;
- default:
- return -1;
- }
- newvolume = (dspplaymax * volume) / 100;
- set_play_volume(j, newvolume);
- return 0;
- }
- static inline void set_play_depth(IXJ *j, int depth)
- {
- if (depth > 60)
- depth = 60;
- if (depth < 0)
- depth = 0;
- ixj_WriteDSPCommand(0x5280 + depth, j);
- }
- static inline int get_play_volume(IXJ *j)
- {
- ixj_WriteDSPCommand(0xCF00, j);
- return j->ssr.high << 8 | j->ssr.low;
- }
- static int get_play_volume_linear(IXJ *j)
- {
- int volume, newvolume, dspplaymax;
- /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
- switch (j->cardtype) {
- case QTI_PHONEJACK:
- dspplaymax = 0x380;
- break;
- case QTI_LINEJACK:
- if(j->port == PORT_PSTN) {
- dspplaymax = 0x48;
- } else {
- dspplaymax = 0x100;
- }
- break;
- case QTI_PHONEJACK_LITE:
- dspplaymax = 0x380;
- break;
- case QTI_PHONEJACK_PCI:
- dspplaymax = 0x6C;
- break;
- case QTI_PHONECARD:
- dspplaymax = 100;
- break;
- default:
- return -1;
- }
- volume = get_play_volume(j);
- newvolume = (volume * 100) / dspplaymax;
- if(newvolume > 100)
- newvolume = 100;
- return newvolume;
- }
- static inline BYTE SLIC_GetState(IXJ *j)
- {
- if (j->cardtype == QTI_PHONECARD) {
- j->pccr1.byte = 0;
- j->psccr.bits.dev = 3;
- j->psccr.bits.rw = 1;
- outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
- ixj_PCcontrol_wait(j);
- j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
- ixj_PCcontrol_wait(j);
- if (j->pslic.bits.powerdown)
- return PLD_SLIC_STATE_OC;
- else if (!j->pslic.bits.ring0 && !j->pslic.bits.ring1)
- return PLD_SLIC_STATE_ACTIVE;
- else
- return PLD_SLIC_STATE_RINGING;
- } else {
- j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
- }
- return j->pld_slicr.bits.state;
- }
- static BOOL SLIC_SetState(BYTE byState, IXJ *j)
- {
- BOOL fRetVal = FALSE;
- if (j->cardtype == QTI_PHONECARD) {
- if (j->flags.pcmciasct) {
- switch (byState) {
- case PLD_SLIC_STATE_TIPOPEN:
- case PLD_SLIC_STATE_OC:
- j->pslic.bits.powerdown = 1;
- j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
- fRetVal = TRUE;
- break;
- case PLD_SLIC_STATE_RINGING:
- if (j->readers || j->writers) {
- j->pslic.bits.powerdown = 0;
- j->pslic.bits.ring0 = 1;
- j->pslic.bits.ring1 = 0;
- fRetVal = TRUE;
- }
- break;
- case PLD_SLIC_STATE_OHT: /* On-hook transmit */
- case PLD_SLIC_STATE_STANDBY:
- case PLD_SLIC_STATE_ACTIVE:
- if (j->readers || j->writers) {
- j->pslic.bits.powerdown = 0;
- } else {
- j->pslic.bits.powerdown = 1;
- }
- j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
- fRetVal = TRUE;
- break;
- case PLD_SLIC_STATE_APR: /* Active polarity reversal */
- case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
- default:
- fRetVal = FALSE;
- break;
- }
- j->psccr.bits.dev = 3;
- j->psccr.bits.rw = 0;
- outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
- ixj_PCcontrol_wait(j);
- }
- } else {
- /* Set the C1, C2, C3 & B2EN signals. */
- switch (byState) {
- case PLD_SLIC_STATE_OC:
- j->pld_slicw.bits.c1 = 0;
- j->pld_slicw.bits.c2 = 0;
- j->pld_slicw.bits.c3 = 0;
- j->pld_slicw.bits.b2en = 0;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- fRetVal = TRUE;
- break;
- case PLD_SLIC_STATE_RINGING:
- j->pld_slicw.bits.c1 = 1;
- j->pld_slicw.bits.c2 = 0;
- j->pld_slicw.bits.c3 = 0;
- j->pld_slicw.bits.b2en = 1;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- fRetVal = TRUE;
- break;
- case PLD_SLIC_STATE_ACTIVE:
- j->pld_slicw.bits.c1 = 0;
- j->pld_slicw.bits.c2 = 1;
- j->pld_slicw.bits.c3 = 0;
- j->pld_slicw.bits.b2en = 0;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- fRetVal = TRUE;
- break;
- case PLD_SLIC_STATE_OHT: /* On-hook transmit */
- j->pld_slicw.bits.c1 = 1;
- j->pld_slicw.bits.c2 = 1;
- j->pld_slicw.bits.c3 = 0;
- j->pld_slicw.bits.b2en = 0;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- fRetVal = TRUE;
- break;
- case PLD_SLIC_STATE_TIPOPEN:
- j->pld_slicw.bits.c1 = 0;
- j->pld_slicw.bits.c2 = 0;
- j->pld_slicw.bits.c3 = 1;
- j->pld_slicw.bits.b2en = 0;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- fRetVal = TRUE;
- break;
- case PLD_SLIC_STATE_STANDBY:
- j->pld_slicw.bits.c1 = 1;
- j->pld_slicw.bits.c2 = 0;
- j->pld_slicw.bits.c3 = 1;
- j->pld_slicw.bits.b2en = 1;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- fRetVal = TRUE;
- break;
- case PLD_SLIC_STATE_APR: /* Active polarity reversal */
- j->pld_slicw.bits.c1 = 0;
- j->pld_slicw.bits.c2 = 1;
- j->pld_slicw.bits.c3 = 1;
- j->pld_slicw.bits.b2en = 0;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- fRetVal = TRUE;
- break;
- case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
- j->pld_slicw.bits.c1 = 1;
- j->pld_slicw.bits.c2 = 1;
- j->pld_slicw.bits.c3 = 1;
- j->pld_slicw.bits.b2en = 0;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- fRetVal = TRUE;
- break;
- default:
- fRetVal = FALSE;
- break;
- }
- }
- return fRetVal;
- }
- static int ixj_wink(IXJ *j)
- {
- BYTE slicnow;
- slicnow = SLIC_GetState(j);
- j->pots_winkstart = jiffies;
- SLIC_SetState(PLD_SLIC_STATE_OC, j);
- msleep(jiffies_to_msecs(j->winktime));
- SLIC_SetState(slicnow, j);
- return 0;
- }
- static void ixj_init_timer(IXJ *j)
- {
- init_timer(&j->timer);
- j->timer.function = ixj_timeout;
- j->timer.data = (unsigned long)j;
- }
- static void ixj_add_timer(IXJ *j)
- {
- j->timer.expires = jiffies + (hertz / samplerate);
- add_timer(&j->timer);
- }
- static void ixj_tone_timeout(IXJ *j)
- {
- IXJ_TONE ti;
- j->tone_state++;
- if (j->tone_state == 3) {
- j->tone_state = 0;
- if (j->cadence_t) {
- j->tone_cadence_state++;
- if (j->tone_cadence_state >= j->cadence_t->elements_used) {
- switch (j->cadence_t->termination) {
- case PLAY_ONCE:
- ixj_cpt_stop(j);
- break;
- case REPEAT_LAST_ELEMENT:
- j->tone_cadence_state--;
- ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
- break;
- case REPEAT_ALL:
- j->tone_cadence_state = 0;
- if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
- ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
- ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
- ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
- ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
- ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
- ixj_init_tone(j, &ti);
- }
- ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j);
- ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j);
- ixj_play_tone(j, j->cadence_t->ce[0].index);
- break;
- }
- } else {
- if (j->cadence_t->ce[j->tone_cadence_state].gain0) {
- ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
- ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
- ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
- ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
- ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
- ixj_init_tone(j, &ti);
- }
- ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j);
- ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j);
- ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
- }
- }
- }
- }
- static inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir)
- {
- if(j->ixj_signals[event]) {
- if(ixjdebug & 0x0100)
- printk("Sending signal for event %d\n", event);
- /* Send apps notice of change */
- /* see config.h for macro definition */
- kill_fasync(&(j->async_queue), j->ixj_signals[event], dir);
- }
- }
- static void ixj_pstn_state(IXJ *j)
- {
- int var;
- union XOPXR0 XR0, daaint;
- var = 10;
- XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg;
- daaint.reg = 0;
- XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
- j->pld_scrr.byte = inb_p(j->XILINXbase);
- if (j->pld_scrr.bits.daaflag) {
- daa_int_read(j);
- if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) {
- if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
- daaint.bitreg.RING = 1;
- if(ixjdebug & 0x0008) {
- printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
- }
- } else {
- daa_set_mode(j, SOP_PU_RESET);
- }
- }
- if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) {
- daaint.bitreg.Caller_ID = 1;
- j->pstn_cid_intr = 1;
- j->pstn_cid_received = jiffies;
- if(ixjdebug & 0x0008) {
- printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
- }
- }
- if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) {
- daaint.bitreg.Cadence = 1;
- if(ixjdebug & 0x0008) {
- printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
- }
- }
- if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) {
- daaint.bitreg.VDD_OK = 1;
- daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK;
- }
- }
- daa_CR_read(j, 1);
- if(j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR != XR0.bitreg.RMR && time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
- daaint.bitreg.RMR = 1;
- daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
- if(ixjdebug & 0x0008) {
- printk(KERN_INFO "IXJ DAA RMR /dev/phone%d was %s for %ld\n", j->board, XR0.bitreg.RMR?"on":"off", jiffies - j->pstn_last_rmr);
- }
- j->pstn_prev_rmr = j->pstn_last_rmr;
- j->pstn_last_rmr = jiffies;
- }
- switch(j->daa_mode) {
- case SOP_PU_SLEEP:
- if (daaint.bitreg.RING) {
- if (!j->flags.pstn_ringing) {
- if (j->daa_mode != SOP_PU_RINGING) {
- j->pstn_ring_int = jiffies;
- daa_set_mode(j, SOP_PU_RINGING);
- }
- }
- }
- break;
- case SOP_PU_RINGING:
- if (daaint.bitreg.RMR) {
- if (ixjdebug & 0x0008) {
- printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
- }
- if (daaint.bitreg.SI_1) { /* Rising edge of RMR */
- j->flags.pstn_rmr = 1;
- j->pstn_ring_start = jiffies;
- j->pstn_ring_stop = 0;
- j->ex.bits.pstn_ring = 0;
- if (j->cadence_f[4].state == 0) {
- j->cadence_f[4].state = 1;
- j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000);
- j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000);
- j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000);
- } else if (j->cadence_f[4].state == 2) {
- if((time_after(jiffies, j->cadence_f[4].off1min) &&
- time_before(jiffies, j->cadence_f[4].off1max))) {
- if (j->cadence_f[4].on2) {
- j->cadence_f[4].state = 3;
- j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000));
- j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000));
- j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000));
- } else {
- j->cadence_f[4].state = 7;
- }
- } else {
- if (ixjdebug & 0x0008) {
- printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
- j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
- j->cadence_f[4].off1);
- }
- j->cadence_f[4].state = 0;
- }
- } else if (j->cadence_f[4].state == 4) {
- if((time_after(jiffies, j->cadence_f[4].off2min) &&
- time_before(jiffies, j->cadence_f[4].off2max))) {
- if (j->cadence_f[4].on3) {
- j->cadence_f[4].state = 5;
- j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000));
- j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000));
- j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000));
- } else {
- j->cadence_f[4].state = 7;
- }
- } else {
- if (ixjdebug & 0x0008) {
- printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
- j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
- j->cadence_f[4].off2);
- }
- j->cadence_f[4].state = 0;
- }
- } else if (j->cadence_f[4].state == 6) {
- if((time_after(jiffies, j->cadence_f[4].off3min) &&
- time_before(jiffies, j->cadence_f[4].off3max))) {
- j->cadence_f[4].state = 7;
- } else {
- if (ixjdebug & 0x0008) {
- printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
- j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
- j->cadence_f[4].off3);
- }
- j->cadence_f[4].state = 0;
- }
- } else {
- j->cadence_f[4].state = 0;
- }
- } else { /* Falling edge of RMR */
- j->pstn_ring_start = 0;
- j->pstn_ring_stop = jiffies;
- if (j->cadence_f[4].state == 1) {
- if(!j->cadence_f[4].on1) {
- j->cadence_f[4].state = 7;
- } else if((time_after(jiffies, j->cadence_f[4].on1min) &&
- time_before(jiffies, j->cadence_f[4].on1max))) {
- if (j->cadence_f[4].off1) {
- j->cadence_f[4].state = 2;
- j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000));
- j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000));
- j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000));
- } else {
- j->cadence_f[4].state = 7;
- }
- } else {
- if (ixjdebug & 0x0008) {
- printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
- j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
- j->cadence_f[4].on1);
- }
- j->cadence_f[4].state = 0;
- }
- } else if (j->cadence_f[4].state == 3) {
- if((time_after(jiffies, j->cadence_f[4].on2min) &&
- time_before(jiffies, j->cadence_f[4].on2max))) {
- if (j->cadence_f[4].off2) {
- j->cadence_f[4].state = 4;
- j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000));
- j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000));
- j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000));
- } else {
- j->cadence_f[4].state = 7;
- }
- } else {
- if (ixjdebug & 0x0008) {
- printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
- j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
- j->cadence_f[4].on2);
- }
- j->cadence_f[4].state = 0;
- }
- } else if (j->cadence_f[4].state == 5) {
- if((time_after(jiffies, j->cadence_f[4].on3min) &&
- time_before(jiffies, j->cadence_f[4].on3max))) {
- if (j->cadence_f[4].off3) {
- j->cadence_f[4].state = 6;
- j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000));
- j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000));
- j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000));
- } else {
- j->cadence_f[4].state = 7;
- }
- } else {
- j->cadence_f[4].state = 0;
- }
- } else {
- if (ixjdebug & 0x0008) {
- printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
- j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
- j->cadence_f[4].on3);
- }
- j->cadence_f[4].state = 0;
- }
- }
- if (ixjdebug & 0x0010) {
- printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
- }
- if (ixjdebug & 0x0010) {
- switch(j->cadence_f[4].state) {
- case 1:
- printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
- j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max);
- break;
- case 2:
- printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
- j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max);
- break;
- case 3:
- printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
- j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max);
- break;
- case 4:
- printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
- j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max);
- break;
- case 5:
- printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
- j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max);
- break;
- case 6:
- printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
- j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max);
- break;
- }
- }
- }
- if (j->cadence_f[4].state == 7) {
- j->cadence_f[4].state = 0;
- j->pstn_ring_stop = jiffies;
- j->ex.bits.pstn_ring = 1;
- ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN);
- if(ixjdebug & 0x0008) {
- printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies);
- }
- }
- if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) ||
- (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) {
- if(ixjdebug & 0x0008) {
- printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies);
- printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int);
- printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop);
- }
- j->pstn_ring_stop = j->pstn_ring_int = 0;
- daa_set_mode(j, SOP_PU_SLEEP);
- }
- outb_p(j->pld_scrw.byte, j->XILINXbase);
- if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) {
- ixj_daa_cid_read(j);
- j->ex.bits.caller_id = 1;
- ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN);
- j->pstn_cid_intr = 0;
- }
- if (daaint.bitreg.Cadence) {
- if(ixjdebug & 0x0008) {
- printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board);
- }
- daa_set_mode(j, SOP_PU_SLEEP);
- j->ex.bits.pstn_ring = 0;
- }
- break;
- case SOP_PU_CONVERSATION:
- if (daaint.bitreg.VDD_OK) {
- if(!daaint.bitreg.SI_0) {
- if (!j->pstn_winkstart) {
- if(ixjdebug & 0x0008) {
- printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies);
- }
- j->pstn_winkstart = jiffies;
- }
- } else {
- if (j->pstn_winkstart) {
- if(ixjdebug & 0x0008) {
- printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies);
- }
- j->pstn_winkstart = 0;
- }
- }
- }
- if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) {
- if(ixjdebug & 0x0008) {
- printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies);
- }
- daa_set_mode(j, SOP_PU_SLEEP);
- j->pstn_winkstart = 0;
- j->ex.bits.pstn_wink = 1;
- ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN);
- }
- break;
- }
- }
- static void ixj_timeout(unsigned long ptr)
- {
- int board;
- unsigned long jifon;
- IXJ *j = (IXJ *)ptr;
- board = j->board;
- if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) {
- ixj_perfmon(j->timerchecks);
- j->hookstate = ixj_hookstate(j);
- if (j->tone_state) {
- if (!(j->hookstate)) {
- ixj_cpt_stop(j);
- if (j->m_hook) {
- j->m_hook = 0;
- j->ex.bits.hookstate = 1;
- ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
- }
- clear_bit(board, &j->busyflags);
- ixj_add_timer(j);
- return;
- }
- if (j->tone_state == 1)
- jifon = ((hertz * j->tone_on_time) * 25 / 100000);
- else
- jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000);
- if (time_before(jiffies, j->tone_start_jif + jifon)) {
- if (j->tone_state == 1) {
- ixj_play_tone(j, j->tone_index);
- if (j->dsp.low == 0x20) {
- clear_bit(board, &j->busyflags);
- ixj_add_timer(j);
- return;
- }
- } else {
- ixj_play_tone(j, 0);
- if (j->dsp.low == 0x20) {
- clear_bit(board, &j->busyflags);
- ixj_add_timer(j);
- return;
- }
- }
- } else {
- ixj_tone_timeout(j);
- if (j->flags.dialtone) {
- ixj_dialtone(j);
- }
- if (j->flags.busytone) {
- ixj_busytone(j);
- if (j->dsp.low == 0x20) {
- clear_bit(board, &j->busyflags);
- ixj_add_timer(j);
- return;
- }
- }
- if (j->flags.ringback) {
- ixj_ringback(j);
- if (j->dsp.low == 0x20) {
- clear_bit(board, &j->busyflags);
- ixj_add_timer(j);
- return;
- }
- }
- if (!j->tone_state) {
- ixj_cpt_stop(j);
- }
- }
- }
- if (!(j->tone_state && j->dsp.low == 0x20)) {
- if (IsRxReady(j)) {
- ixj_read_frame(j);
- }
- if (IsTxReady(j)) {
- ixj_write_frame(j);
- }
- }
- if (j->flags.cringing) {
- if (j->hookstate & 1) {
- j->flags.cringing = 0;
- ixj_ring_off(j);
- } else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) {
- switch(j->cadence_f[5].state) {
- case 0:
- j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000));
- if (time_before(jiffies, j->cadence_f[5].on1dot)) {
- if(ixjdebug & 0x0004) {
- printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
- }
- ixj_ring_on(j);
- }
- j->cadence_f[5].state = 1;
- break;
- case 1:
- if (time_after(jiffies, j->cadence_f[5].on1dot)) {
- j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000));
- if(ixjdebug & 0x0004) {
- printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
- }
- ixj_ring_off(j);
- j->cadence_f[5].state = 2;
- }
- break;
- case 2:
- if (time_after(jiffies, j->cadence_f[5].off1dot)) {
- if(ixjdebug & 0x0004) {
- printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
- }
- ixj_ring_on(j);
- if (j->cadence_f[5].on2) {
- j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000));
- j->cadence_f[5].state = 3;
- } else {
- j->cadence_f[5].state = 7;
- }
- }
- break;
- case 3:
- if (time_after(jiffies, j->cadence_f[5].on2dot)) {
- if(ixjdebug & 0x0004) {
- printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
- }
- ixj_ring_off(j);
- if (j->cadence_f[5].off2) {
- j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000));
- j->cadence_f[5].state = 4;
- } else {
- j->cadence_f[5].state = 7;
- }
- }
- break;
- case 4:
- if (time_after(jiffies, j->cadence_f[5].off2dot)) {
- if(ixjdebug & 0x0004) {
- printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
- }
- ixj_ring_on(j);
- if (j->cadence_f[5].on3) {
- j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000));
- j->cadence_f[5].state = 5;
- } else {
- j->cadence_f[5].state = 7;
- }
- }
- break;
- case 5:
- if (time_after(jiffies, j->cadence_f[5].on3dot)) {
- if(ixjdebug & 0x0004) {
- printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
- }
- ixj_ring_off(j);
- if (j->cadence_f[5].off3) {
- j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000));
- j->cadence_f[5].state = 6;
- } else {
- j->cadence_f[5].state = 7;
- }
- }
- break;
- case 6:
- if (time_after(jiffies, j->cadence_f[5].off3dot)) {
- if(ixjdebug & 0x0004) {
- printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
- }
- j->cadence_f[5].state = 7;
- }
- break;
- case 7:
- if(ixjdebug & 0x0004) {
- printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
- }
- j->flags.cidring = 1;
- j->cadence_f[5].state = 0;
- break;
- }
- if (j->flags.cidring && !j->flags.cidsent) {
- j->flags.cidsent = 1;
- if(j->fskdcnt) {
- SLIC_SetState(PLD_SLIC_STATE_OHT, j);
- ixj_pre_cid(j);
- }
- j->flags.cidring = 0;
- }
- clear_bit(board, &j->busyflags);
- ixj_add_timer(j);
- return;
- } else {
- if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) {
- if (j->flags.cidring && !j->flags.cidsent) {
- j->flags.cidsent = 1;
- if(j->fskdcnt) {
- SLIC_SetState(PLD_SLIC_STATE_OHT, j);
- ixj_pre_cid(j);
- }
- j->flags.cidring = 0;
- }
- j->ring_cadence_t--;
- if (j->ring_cadence_t == -1)
- j->ring_cadence_t = 15;
- j->ring_cadence_jif = jiffies;
- if (j->ring_cadence & 1 << j->ring_cadence_t) {
- if(j->flags.cidsent && j->cadence_f[5].en_filter)
- j->flags.firstring = 1;
- else
- ixj_ring_on(j);
- } else {
- ixj_ring_off(j);
- if(!j->flags.cidsent)
- j->flags.cidring = 1;
- }
- }
- clear_bit(board, &j->busyflags);
- ixj_add_timer(j);
- return;
- }
- }
- if (!j->flags.ringing) {
- if (j->hookstate) { /* & 1) { */
- if (j->dsp.low != 0x20 &&
- SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) {
- SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
- }
- LineMonitor(j);
- read_filters(j);
- ixj_WriteDSPCommand(0x511B, j);
- j->proc_load = j->ssr.high << 8 | j->ssr.low;
- if (!j->m_hook && (j->hookstate & 1)) {
- j->m_hook = j->ex.bits.hookstate = 1;
- ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
- }
- } else {
- if (j->ex.bits.dtmf_ready) {
- j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0;
- }
- if (j->m_hook) {
- j->m_hook = 0;
- j->ex.bits.hookstate = 1;
- ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
- }
- }
- }
- if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) {
- ixj_pstn_state(j);
- }
- if (j->ex.bytes) {
- wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
- }
- clear_bit(board, &j->busyflags);
- }
- ixj_add_timer(j);
- }
- static int ixj_status_wait(IXJ *j)
- {
- unsigned long jif;
- jif = jiffies + ((60 * hertz) / 100);
- while (!IsStatusReady(j)) {
- ixj_perfmon(j->statuswait);
- if (time_after(jiffies, jif)) {
- ixj_perfmon(j->statuswaitfail);
- return -1;
- }
- }
- return 0;
- }
- static int ixj_PCcontrol_wait(IXJ *j)
- {
- unsigned long jif;
- jif = jiffies + ((60 * hertz) / 100);
- while (!IsPCControlReady(j)) {
- ixj_perfmon(j->pcontrolwait);
- if (time_after(jiffies, jif)) {
- ixj_perfmon(j->pcontrolwaitfail);
- return -1;
- }
- }
- return 0;
- }
- static int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j)
- {
- BYTES bytes;
- unsigned long jif;
- atomic_inc(&j->DSPWrite);
- if(atomic_read(&j->DSPWrite) > 1) {
- printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j->board, cmd);
- return -1;
- }
- bytes.high = (cmd & 0xFF00) >> 8;
- bytes.low = cmd & 0x00FF;
- jif = jiffies + ((60 * hertz) / 100);
- while (!IsControlReady(j)) {
- ixj_perfmon(j->iscontrolready);
- if (time_after(jiffies, jif)) {
- ixj_perfmon(j->iscontrolreadyfail);
- atomic_dec(&j->DSPWrite);
- if(atomic_read(&j->DSPWrite) > 0) {
- printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j->board, cmd);
- while(atomic_read(&j->DSPWrite) > 0) {
- atomic_dec(&j->DSPWrite);
- }
- }
- return -1;
- }
- }
- outb(bytes.low, j->DSPbase + 6);
- outb(bytes.high, j->DSPbase + 7);
- if (ixj_status_wait(j)) {
- j->ssr.low = 0xFF;
- j->ssr.high = 0xFF;
- atomic_dec(&j->DSPWrite);
- if(atomic_read(&j->DSPWrite) > 0) {
- printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j->board, cmd);
- while(atomic_read(&j->DSPWrite) > 0) {
- atomic_dec(&j->DSPWrite);
- }
- }
- return -1;
- }
- /* Read Software Status Register */
- j->ssr.low = inb_p(j->DSPbase + 2);
- j->ssr.high = inb_p(j->DSPbase + 3);
- atomic_dec(&j->DSPWrite);
- if(atomic_read(&j->DSPWrite) > 0) {
- printk("IXJ %d DSP overlaped command 0x%4.4x\n", j->board, cmd);
- while(atomic_read(&j->DSPWrite) > 0) {
- atomic_dec(&j->DSPWrite);
- }
- }
- return 0;
- }
- /***************************************************************************
- *
- * General Purpose IO Register read routine
- *
- ***************************************************************************/
- static inline int ixj_gpio_read(IXJ *j)
- {
- if (ixj_WriteDSPCommand(0x5143, j))
- return -1;
- j->gpio.bytes.low = j->ssr.low;
- j->gpio.bytes.high = j->ssr.high;
- return 0;
- }
- static inline void LED_SetState(int state, IXJ *j)
- {
- if (j->cardtype == QTI_LINEJACK) {
- j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0;
- j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0;
- j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0;
- j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0;
- outb(j->pld_scrw.byte, j->XILINXbase);
- }
- }
- /*********************************************************************
- * GPIO Pins are configured as follows on the Quicknet Internet
- * PhoneJACK Telephony Cards
- *
- * POTS Select GPIO_6=0 GPIO_7=0
- * Mic/Speaker Select GPIO_6=0 GPIO_7=1
- * Handset Select GPIO_6=1 GPIO_7=0
- *
- * SLIC Active GPIO_1=0 GPIO_2=1 GPIO_5=0
- * SLIC Ringing GPIO_1=1 GPIO_2=1 GPIO_5=0
- * SLIC Open Circuit GPIO_1=0 GPIO_2=0 GPIO_5=0
- *
- * Hook Switch changes reported on GPIO_3
- *********************************************************************/
- static int ixj_set_port(IXJ *j, int arg)
- {
- if (j->cardtype == QTI_PHONEJACK_LITE) {
- if (arg != PORT_POTS)
- return 10;
- else
- return 0;
- }
- switch (arg) {
- case PORT_POTS:
- j->port = PORT_POTS;
- switch (j->cardtype) {
- case QTI_PHONECARD:
- if (j->flags.pcmciasct == 1)
- SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
- else
- return 11;
- break;
- case QTI_PHONEJACK_PCI:
- j->pld_slicw.pcib.mic = 0;
- j->pld_slicw.pcib.spk = 0;
- outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
- break;
- case QTI_LINEJACK:
- ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */
- if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to
- Software Control Register */
- return 2;
- j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
- outb(j->pld_scrw.byte, j->XILINXbase);
- j->pld_clock.byte = 0;
- outb(j->pld_clock.byte, j->XILINXbase + 0x04);
- j->pld_slicw.bits.rly1 = 1;
- j->pld_slicw.bits.spken = 0;
- outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
- ixj_mixer(0x1200, j); /* Turn Off MIC switch on mixer left */
- ixj_mixer(0x1401, j); /* Turn On Mono1 switch on mixer left */
- ixj_mixer(0x1300, j); /* Turn Off MIC switch on mixer right */
- ixj_mixer(0x1501, j); /* Turn On Mono1 switch on mixer right */
- ixj_mixer(0x0E80, j); /*Mic mute */
- ixj_mixer(0x0F00, j); /* Set mono out (SLIC) to 0dB */
- ixj_mixer(0x0080, j); /* Mute Master Left volume */
- ixj_mixer(0x0180, j); /* Mute Master Right volume */
- SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
- /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
- break;
- case QTI_PHONEJACK:
- j->gpio.bytes.high = 0x0B;
- j->gpio.bits.gpio6 = 0;
- j->gpio.bits.gpio7 = 0;
- ixj_WriteDSPCommand(j->gpio.word, j);
- break;
- }
- break;
- case PORT_PSTN:
- if (j->cardtype == QTI_LINEJACK) {
- ixj_WriteDSPCommand(0xC534, j); /* Write CODEC config to Software Control Register */
- j->pld_slicw.bits.rly3 = 0;
- j->pld_slicw.bits.rly1 = 1;
- j->pld_slicw.bits.spken = 0;
- outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
- j->port = PORT_PSTN;
- } else {
- return 4;
- }
- break;
- case PORT_SPEAKER:
- j->port = PORT_SPEAKER;
- switch (j->cardtype) {
- case QTI_PHONECARD:
- if (j->flags.pcmciasct) {
- SLIC_SetState(PLD_SLIC_STATE_OC, j);
- }
- break;
- case QTI_PHONEJACK_PCI:
- j->pld_slicw.pcib.mic = 1;
- j->pld_slicw.pcib.spk = 1;
- outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
- break;
- case QTI_LINEJACK:
- ixj_set_pots(j, 0); /* Disconnect POTS/PSTN relay */
- if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to
- Software Control Register */
- return 2;
- j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
- outb(j->pld_scrw.byte, j->XILINXbase);
- j->pld_clock.byte = 0;
- outb(j->pld_clock.byte, j->XILINXbase + 0x04);
- j->pld_slicw.bits.rly1 = 1;
- j->pld_slicw.bits.spken = 1;
- outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
- ixj_mixer(0x1201, j); /* Turn On MIC switch on mixer left */
- ixj_mixer(0x1400, j); /* Turn Off Mono1 switch on mixer left */
- ixj_mixer(0x1301, j); /* Turn On MIC switch on mixer right */
- ixj_mixer(0x1500, j); /* Turn Off Mono1 switch on mixer right */
- ixj_mixer(0x0E06, j); /*Mic un-mute 0dB */
- ixj_mixer(0x0F80, j); /* Mute mono out (SLIC) */
- ixj_mixer(0x0000, j); /* Set Master Left volume to 0dB */
- ixj_mixer(0x0100, j); /* Set Master Right volume to 0dB */
- break;
- case QTI_PHONEJACK:
- j->gpio.bytes.high = 0x0B;
- j->gpio.bits.gpio6 = 0;
- j->gpio.bits.gpio7 = 1;
- ixj_WriteDSPCommand(j->gpio.word, j);
- break;
- }
- break;
- case PORT_HANDSET:
- if (j->cardtype != QTI_PHONEJACK) {
- return 5;
- } else {
- j->gpio.bytes.high = 0x0B;
- j->gpio.bits.gpio6 = 1;
- j->gpio.bits.gpio7 = 0;
- ixj_WriteDSPCommand(j->gpio.word, j);
- j->port = PORT_HANDSET;
- }
- break;
- default:
- return 6;
- break;
- }
- return 0;
- }
- static int ixj_set_pots(IXJ *j, int arg)
- {
- if (j->cardtype == QTI_LINEJACK) {
- if (arg) {
- if (j->port == PORT_PSTN) {
- j->pld_slicw.bits.rly1 = 0;
- outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
- j->flags.pots_pstn = 1;
- return 1;
- } else {
- j->flags.pots_pstn = 0;
- return 0;
- }
- } else {
- j->pld_slicw.bits.rly1 = 1;
- outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
- j->flags.pots_pstn = 0;
- return 1;
- }
- } else {
- return 0;
- }
- }
- static void ixj_ring_on(IXJ *j)
- {
- if (j->dsp.low == 0x20) /* Internet PhoneJACK */
- {
- if (ixjdebug & 0x0004)
- printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
- j->gpio.bytes.high = 0x0B;
- j->gpio.bytes.low = 0x00;
- j->gpio.bits.gpio1 = 1;
- j->gpio.bits.gpio2 = 1;
- j->gpio.bits.gpio5 = 0;
- ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring signal */
- } else /* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */
- {
- if (ixjdebug & 0x0004)
- printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
- SLIC_SetState(PLD_SLIC_STATE_RINGING, j);
- }
- }
- static int ixj_siadc(IXJ *j, int val)
- {
- if(j->cardtype == QTI_PHONECARD){
- if(j->flags.pcmciascp){
- if(val == -1)
- return j->siadc.bits.rxg;
- if(val < 0 || val > 0x1F)
- return -1;
- j->siadc.bits.hom = 0; /* Handset Out Mute */
- j->siadc.bits.lom = 0; /* Line Out Mute */
- j->siadc.bits.rxg = val; /*(0xC000 - 0x41C8) / 0x4EF; RX PGA Gain */
- j->psccr.bits.addr = 6; /* R/W Smart Cable Register Address */
- j->psccr.bits.rw = 0; /* Read / Write flag */
- j->psccr.bits.dev = 0;
- outb(j->siadc.byte, j->XILINXbase + 0x00);
- outb(j->psccr.byte, j->XILINXbase + 0x01);
- ixj_PCcontrol_wait(j);
- return j->siadc.bits.rxg;
- }
- }
- return -1;
- }
- static int ixj_sidac(IXJ *j, int val)
- {
- if(j->cardtype == QTI_PHONECARD){
- if(j->flags.pcmciascp){
- if(val == -1)
- return j->sidac.bits.txg;
- if(val < 0 || val > 0x1F)
- return -1;
- j->sidac.bits.srm = 1; /* Speaker Right Mute */
- j->sidac.bits.slm = 1; /* Speaker Left Mute */
- j->sidac.bits.txg = val; /* (0xC000 - 0x45E4) / 0x5D3; TX PGA Gain */
- j->psccr.bits.addr = 7; /* R/W Smart Cable Register Address */
- j->psccr.bits.rw = 0; /* Read / Write flag */
- j->psccr.bits.dev = 0;
- outb(j->sidac.byte, j->XILINXbase + 0x00);
- outb(j->psccr.byte, j->XILINXbase + 0x01);
- ixj_PCcontrol_wait(j);
- return j->sidac.bits.txg;
- }
- }
- return -1;
- }
- static int ixj_pcmcia_cable_check(IXJ *j)
- {
- j->pccr1.byte = inb_p(j->XILINXbase + 0x03);
- if (!j->flags.pcmciastate) {
- j->pccr2.byte = inb_p(j->XILINXbase + 0x02);
- if (j->pccr1.bits.drf || j->pccr2.bits.rstc) {
- j->flags.pcmciastate = 4;
- return 0;
- }
- if (j->pccr1.bits.ed) {
- j->pccr1.bits.ed = 0;
- j->psccr.bits.dev = 3;
- j->psccr.bits.rw = 1;
- outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
- ixj_PCcontrol_wait(j);
- j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
- j->pslic.bits.led2 = j->pslic.bits.det ? 1 : 0;
- j->psccr.bits.dev = 3;
- j->psccr.bits.rw = 0;
- outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
- ixj_PCcontrol_wait(j);
- return j->pslic.bits.led2 ? 1 : 0;
- } else if (j->flags.pcmciasct) {
- return j->r_hook;
- } else {
- return 1;
- }
- } else if (j->flags.pcmciastate == 4) {
- if (!j->pccr1.bits.drf) {
- j->flags.pcmciastate = 3;
- }
- return 0;
- } else if (j->flags.pcmciastate == 3) {
- j->pccr2.bits.pwr = 0;
- j->pccr2.bits.rstc = 1;
- outb(j->pccr2.byte, j->XILINXbase + 0x02);
- j->checkwait = jiffies + (hertz * 2);
- j->flags.incheck = 1;
- j->flags.pcmciastate = 2;
- return 0;
- } else if (j->flags.pcmciastate == 2) {
- if (j->flags.incheck) {
- if (time_before(jiffies, j->checkwait)) {
- return 0;
- } else {
- j->flags.incheck = 0;
- }
- }
- j->pccr2.bits.pwr = 0;
- j->pccr2.bits.rstc = 0;
- outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
- j->flags.pcmciastate = 1;
- return 0;
- } else if (j->flags.pcmciastate == 1) {
- j->flags.pcmciastate = 0;
- if (!j->pccr1.bits.drf) {
- j->psccr.bits.dev = 3;
- j->psccr.bits.rw = 1;
- outb_p(j->psccr.byte, j->XILINXbase + 0x01);
- ixj_PCcontrol_wait(j);
- j->flags.pcmciascp = 1; /* Set Cable Present Flag */
- j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03; /* Get Cable Type */
- if (j->flags.pcmciasct == 3) {
- j->flags.pcmciastate = 4;
- return 0;
- } else if (j->flags.pcmciasct == 0) {
- j->pccr2.bits.pwr = 1;
- j->pccr2.bits.rstc = 0;
- outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
- j->port = PORT_SPEAKER;
- } else {
- j->port = PORT_POTS;
- }
- j->sic1.bits.cpd = 0; /* Chip Power Down */
- j->sic1.bits.mpd = 0; /* MIC Bias Power Down */
- j->sic1.bits.hpd = 0; /* Handset Bias Power Down */
- j->sic1.bits.lpd = 0; /* Line Bias Power Down */
- j->sic1.bits.spd = 1; /* Speaker Drive Power Down */
- j->psccr.bits.addr = 1; /* R/W Smart Cable Register Address */
- j->psccr.bits.rw = 0; /* Read / Write flag */
- j->psccr.bits.dev = 0;
- outb(j->sic1.byte, j->XILINXbase + 0x00);
- outb(j->psccr.byte, j->XILINXbase + 0x01);
- ixj_PCcontrol_wait(j);
- j->sic2.bits.al = 0; /* Analog Loopback DAC analog -> ADC analog */
- j->sic2.bits.dl2 = 0; /* Digital Loopback DAC -> ADC one bit */
- j->sic2.bits.dl1 = 0; /* Digital Loopback ADC -> DAC one bit */
- j->sic2.bits.pll = 0; /* 1 = div 10, 0 = div 5 */
- j->sic2.bits.hpd = 0; /* HPF disable */
- j->psccr.bits.addr = 2; /* R/W Smart Cable Register Address */
- j->psccr.bits.rw = 0; /* Read / Write flag */
- j->psccr.bits.dev = 0;
- outb(j->sic2.byte, j->XILINXbase + 0x00);
- outb(j->psccr.byte, j->XILINXbase + 0x01);
- ixj_PCcontrol_wait(j);
- j->psccr.bits.addr = 3; /* R/W Smart Cable Register Address */
- j->psccr.bits.rw = 0; /* Read / Write flag */
- j->psccr.bits.dev = 0;
- outb(0x00, j->XILINXbase + 0x00); /* PLL Divide N1 */
- outb(j->psccr.byte, j->XILINXbase + 0x01);
- ixj_PCcontrol_wait(j);
- j->psccr.bits.addr = 4; /* R/W Smart Cable Register Address */
- j->psccr.bits.rw = 0; /* Read / Write flag */
- j->psccr.bits.dev = 0;
- outb(0x09, j->XILINXbase + 0x00); /* PLL Multiply M1 */
- outb(j->psccr.byte, j->XILINXbase + 0x01);
- ixj_PCcontrol_wait(j);
- j->sirxg.bits.lig = 1; /* Line In Gain */
- j->sirxg.bits.lim = 1; /* Line In Mute */
- j->sirxg.bits.mcg = 0; /* MIC In Gain was 3 */
- j->sirxg.bits.mcm = 0; /* MIC In Mute */
- j->sirxg.bits.him = 0; /* Handset In Mute */
- j->sirxg.bits.iir = 1; /* IIR */
- j->psccr.bits.addr = 5; /* R/W Smart Cable Register Address */
- j->psccr.bits.rw = 0; /* Read / Write flag */
- j->psccr.bits.dev = 0;
- outb(j->sirxg.byte, j->XILINXbase + 0x00);
- outb(j->psccr.byte, j->XILINXbase + 0x01);
- ixj_PCcontrol_wait(j);
- ixj_siadc(j, 0x17);
- ixj_sidac(j, 0x1D);
- j->siaatt.bits.sot = 0;
- j->psccr.bits.addr = 9; /* R/W Smart Cable Register Address */
- j->psccr.bits.rw = 0; /* Read / Write flag */
- j->psccr.bits.dev = 0;
- outb(j->siaatt.byte, j->XILINXbase + 0x00);
- outb(j->psccr.byte, j->XILINXbase + 0x01);
- ixj_PCcontrol_wait(j);
- if (j->flags.pcmciasct == 1 && !j->readers && !j->writers) {
- j->psccr.byte = j->pslic.byte = 0;
- j->pslic.bits.powerdown = 1;
- j->psccr.bits.dev = 3;
- j->psccr.bits.rw = 0;
- outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
- ixj_PCcontrol_wait(j);
- }
- }
- return 0;
- } else {
- j->flags.pcmciascp = 0;
- return 0;
- }
- return 0;
- }
- static int ixj_hookstate(IXJ *j)
- {
- int fOffHook = 0;
- switch (j->cardtype) {
- case QTI_PHONEJACK:
- ixj_gpio_read(j);
- fOffHook = j->gpio.bits.gpio3read ? 1 : 0;
- break;
- case QTI_LINEJACK:
- case QTI_PHONEJACK_LITE:
- case QTI_PHONEJACK_PCI:
- SLIC_GetState(j);
- if(j->cardtype == QTI_LINEJACK && j->flags.pots_pstn == 1 && (j->readers || j->writers)) {
- fOffHook = j->pld_slicr.bits.potspstn ? 1 : 0;
- if(fOffHook != j->p_hook) {
- if(!j->checkwait) {
- j->checkwait = jiffies;
- }
- if(time_before(jiffies, j->checkwait + 2)) {
- fOffHook ^= 1;
- } else {
- j->checkwait = 0;
- }
- j->p_hook = fOffHook;
- printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ld\n", j->board, fOffHook, jiffies);
- }
- } else {
- if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE ||
- j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) {
- if (j->flags.ringing || j->flags.cringing) {
- if (!in_interrupt()) {
- msleep(20);
- }
- SLIC_GetState(j);
- if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) {
- ixj_ring_on(j);
- }
- }
- if (j->cardtype == QTI_PHONEJACK_PCI) {
- j->pld_scrr.byte = inb_p(j->XILINXbase);
- fOffHook = j->pld_scrr.pcib.det ? 1 : 0;
- } else
- fOffHook = j->pld_slicr.bits.det ? 1 : 0;
- }
- }
- break;
- case QTI_PHONECARD:
- fOffHook = ixj_pcmcia_cable_check(j);
- break;
- }
- if (j->r_hook != fOffHook) {
- j->r_hook = fOffHook;
- if (j->port == PORT_SPEAKER || j->port == PORT_HANDSET) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) {
- j->ex.bits.hookstate = 1;
- ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
- } else if (!fOffHook) {
- j->flash_end = jiffies + ((60 * hertz) / 100);
- }
- }
- if (fOffHook) {
- if(time_before(jiffies, j->flash_end)) {
- j->ex.bits.flash = 1;
- j->flash_end = 0;
- ixj_kill_fasync(j, SIG_FLASH, POLL_IN);
- }
- } else {
- if(time_before(jiffies, j->flash_end)) {
- fOffHook = 1;
- }
- }
- if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION)
- fOffHook |= 2;
- if (j->port == PORT_SPEAKER) {
- if(j->cardtype == QTI_PHONECARD) {
- if(j->flags.pcmciascp && j->flags.pcmciasct) {
- fOffHook |= 2;
- }
- } else {
- fOffHook |= 2;
- }
- }
- if (j->port == PORT_HANDSET)
- fOffHook |= 2;
- return fOffHook;
- }
- static void ixj_ring_off(IXJ *j)
- {
- if (j->dsp.low == 0x20) /* Internet PhoneJACK */
- {
- if (ixjdebug & 0x0004)
- printk(KERN_INFO "IXJ Ring Off\n");
- j->gpio.bytes.high = 0x0B;
- j->gpio.bytes.low = 0x00;
- j->gpio.bits.gpio1 = 0;
- j->gpio.bits.gpio2 = 1;
- j->gpio.bits.gpio5 = 0;
- ixj_WriteDSPCommand(j->gpio.word, j);
- } else /* Internet LineJACK */
- {
- if (ixjdebug & 0x0004)
- printk(KERN_INFO "IXJ Ring Off\n");
- if(!j->flags.cidplay)
- SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
- SLIC_GetState(j);
- }
- }
- static void ixj_ring_start(IXJ *j)
- {
- j->flags.cringing = 1;
- if (ixjdebug & 0x0004)
- printk(KERN_INFO "IXJ Cadence Ringing Start /dev/phone%d\n", j->board);
- if (ixj_hookstate(j) & 1) {
- if (j->port == PORT_POTS)
- ixj_ring_off(j);
- j->flags.cringing = 0;
- if (ixjdebug & 0x0004)
- printk(KERN_INFO "IXJ Cadence Ringing Stopped /dev/phone%d off hook\n", j->board);
- } else if(j->cadence_f[5].enable && (!j->cadence_f[5].en_filter)) {
- j->ring_cadence_jif = jiffies;
- j->flags.cidsent = j->flags.cidring = 0;
- j->cadence_f[5].state = 0;
- if(j->cadence_f[5].on1)
- ixj_ring_on(j);
- } else {
- j->ring_cadence_jif = jiffies;
- j->ring_cadence_t = 15;
- if (j->ring_cadence & 1 << j->ring_cadence_t) {
- ixj_ring_on(j);
- } else {
- ixj_ring_off(j);
- }
- j->flags.cidsent = j->flags.cidring = j->flags.firstring = 0;
- }
- }
- static int ixj_ring(IXJ *j)
- {
- char cntr;
- unsigned long jif;
- j->flags.ringing = 1;
- if (ixj_hookstate(j) & 1) {
- ixj_ring_off(j);
- j->flags.ringing = 0;
- return 1;
- }
- for (cntr = 0; cntr < j->maxrings; cntr++) {
- jif = jiffies + (1 * hertz);
- ixj_ring_on(j);
- while (time_before(jiffies, jif)) {
- if (ixj_hookstate(j) & 1) {
- ixj_ring_off(j);
- j->flags.ringing = 0;
- return 1;
- }
- schedule_timeout_interruptible(1);
- if (signal_pending(current))
- break;
- }
- jif = jiffies + (3 * hertz);
- ixj_ring_off(j);
- while (time_before(jiffies, jif)) {
- if (ixj_hookstate(j) & 1) {
- msleep(10);
- if (ixj_hookstate(j) & 1) {
- j->flags.ringing = 0;
- return 1;
- }
- }
- schedule_timeout_interruptible(1);
- if (signal_pending(current))
- break;
- }
- }
- ixj_ring_off(j);
- j->flags.ringing = 0;
- return 0;
- }
- static int ixj_open(struct phone_device *p, struct file *file_p)
- {
- IXJ *j = get_ixj(p->board);
- file_p->private_data = j;
- if (!j->DSPbase)
- return -ENODEV;
- if (file_p->f_mode & FMODE_READ) {
- if(!j->readers) {
- j->readers++;
- } else {
- return -EBUSY;
- }
- }
- if (file_p->f_mode & FMODE_WRITE) {
- if(!j->writers) {
- j->writers++;
- } else {
- if (file_p->f_mode & FMODE_READ){
- j->readers--;
- }
- return -EBUSY;
- }
- }
- if (j->cardtype == QTI_PHONECARD) {
- j->pslic.bits.powerdown = 0;
- j->psccr.bits.dev = 3;
- j->psccr.bits.rw = 0;
- outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
- ixj_PCcontrol_wait(j);
- }
- j->flags.cidplay = 0;
- j->flags.cidcw_ack = 0;
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "Opening board %d\n", p->board);
- j->framesread = j->frameswritten = 0;
- return 0;
- }
- static int ixj_release(struct inode *inode, struct file *file_p)
- {
- IXJ_TONE ti;
- int cnt;
- IXJ *j = file_p->private_data;
- int board = j->p.board;
- /*
- * Set up locks to ensure that only one process is talking to the DSP at a time.
- * This is necessary to keep the DSP from locking up.
- */
- while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
- schedule_timeout_interruptible(1);
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "Closing board %d\n", NUM(inode));
- if (j->cardtype == QTI_PHONECARD)
- ixj_set_port(j, PORT_SPEAKER);
- else
- ixj_set_port(j, PORT_POTS);
- aec_stop(j);
- ixj_play_stop(j);
- ixj_record_stop(j);
- set_play_volume(j, 0x100);
- set_rec_volume(j, 0x100);
- ixj_ring_off(j);
- /* Restore the tone table to default settings. */
- ti.tone_index = 10;
- ti.gain0 = 1;
- ti.freq0 = hz941;
- ti.gain1 = 0;
- ti.freq1 = hz1209;
- ixj_init_tone(j, &ti);
- ti.tone_index = 11;
- ti.gain0 = 1;
- ti.freq0 = hz941;
- ti.gain1 = 0;
- ti.freq1 = hz1336;
- ixj_init_tone(j, &ti);
- ti.tone_index = 12;
- ti.gain0 = 1;
- ti.freq0 = hz941;
- ti.gain1 = 0;
- ti.freq1 = hz1477;
- ixj_init_tone(j, &ti);
- ti.tone_index = 13;
- ti.gain0 = 1;
- ti.freq0 = hz800;
- ti.gain1 = 0;
- ti.freq1 = 0;
- ixj_init_tone(j, &ti);
- ti.tone_index = 14;
- ti.gain0 = 1;
- ti.freq0 = hz1000;
- ti.gain1 = 0;
- ti.freq1 = 0;
- ixj_init_tone(j, &ti);
- ti.tone_index = 15;
- ti.gain0 = 1;
- ti.freq0 = hz1250;
- ti.gain1 = 0;
- ti.freq1 = 0;
- ixj_init_tone(j, &ti);
- ti.tone_index = 16;
- ti.gain0 = 1;
- ti.freq0 = hz950;
- ti.gain1 = 0;
- ti.freq1 = 0;
- ixj_init_tone(j, &ti);
- ti.tone_index = 17;
- ti.gain0 = 1;
- ti.freq0 = hz1100;
- ti.gain1 = 0;
- ti.freq1 = 0;
- ixj_init_tone(j, &ti);
- ti.tone_index = 18;
- ti.gain0 = 1;
- ti.freq0 = hz1400;
- ti.gain1 = 0;
- ti.freq1 = 0;
- ixj_init_tone(j, &ti);
- ti.tone_index = 19;
- ti.gain0 = 1;
- ti.freq0 = hz1500;
- ti.gain1 = 0;
- ti.freq1 = 0;
- ixj_init_tone(j, &ti);
- ti.tone_index = 20;
- ti.gain0 = 1;
- ti.freq0 = hz1600;
- ti.gain1 = 0;
- ti.freq1 = 0;
- ixj_init_tone(j, &ti);
- ti.tone_index = 21;
- ti.gain0 = 1;
- ti.freq0 = hz1800;
- ti.gain1 = 0;
- ti.freq1 = 0;
- ixj_init_tone(j, &ti);
- ti.tone_index = 22;
- ti.gain0 = 1;
- ti.freq0 = hz2100;
- ti.gain1 = 0;
- ti.freq1 = 0;
- ixj_init_tone(j, &ti);
- ti.tone_index = 23;
- ti.gain0 = 1;
- ti.freq0 = hz1300;
- ti.gain1 = 0;
- ti.freq1 = 0;
- ixj_init_tone(j, &ti);
- ti.tone_index = 24;
- ti.gain0 = 1;
- ti.freq0 = hz2450;
- ti.gain1 = 0;
- ti.freq1 = 0;
- ixj_init_tone(j, &ti);
- ti.tone_index = 25;
- ti.gain0 = 1;
- ti.freq0 = hz350;
- ti.gain1 = 0;
- ti.freq1 = hz440;
- ixj_init_tone(j, &ti);
- ti.tone_index = 26;
- ti.gain0 = 1;
- ti.freq0 = hz440;
- ti.gain1 = 0;
- ti.freq1 = hz480;
- ixj_init_tone(j, &ti);
- ti.tone_index = 27;
- ti.gain0 = 1;
- ti.freq0 = hz480;
- ti.gain1 = 0;
- ti.freq1 = hz620;
- ixj_init_tone(j, &ti);
- set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */
- set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */
- j->ex.bits.dtmf_ready = 0;
- j->dtmf_state = 0;
- j->dtmf_wp = j->dtmf_rp = 0;
- j->rec_mode = j->play_mode = -1;
- j->flags.ringing = 0;
- j->maxrings = MAXRINGS;
- j->ring_cadence = USA_RING_CADENCE;
- if(j->cadence_f[5].enable) {
- j->cadence_f[5].enable = j->cadence_f[5].en_filter = j->cadence_f[5].state = 0;
- }
- j->drybuffer = 0;
- j->winktime = 320;
- j->flags.dtmf_oob = 0;
- for (cnt = 0; cnt < 4; cnt++)
- j->cadence_f[cnt].enable = 0;
- idle(j);
- if(j->cardtype == QTI_PHONECARD) {
- SLIC_SetState(PLD_SLIC_STATE_OC, j);
- }
- if (file_p->f_mode & FMODE_READ)
- j->readers--;
- if (file_p->f_mode & FMODE_WRITE)
- j->writers--;
- if (j->read_buffer && !j->readers) {
- kfree(j->read_buffer);
- j->read_buffer = NULL;
- j->read_buffer_size = 0;
- }
- if (j->write_buffer && !j->writers) {
- kfree(j->write_buffer);
- j->write_buffer = NULL;
- j->write_buffer_size = 0;
- }
- j->rec_codec = j->play_codec = 0;
- j->rec_frame_size = j->play_frame_size = 0;
- j->flags.cidsent = j->flags.cidring = 0;
- ixj_fasync(-1, file_p, 0); /* remove from list of async notification */
- if(j->cardtype == QTI_LINEJACK && !j->readers && !j->writers) {
- ixj_set_port(j, PORT_PSTN);
- daa_set_mode(j, SOP_PU_SLEEP);
- ixj_set_pots(j, 1);
- }
- ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
- /* Set up the default signals for events */
- for (cnt = 0; cnt < 35; cnt++)
- j->ixj_signals[cnt] = SIGIO;
- /* Set the excetion signal enable flags */
- j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
- j->ex_sig.bits.caller_id = j->ex_sig.bits.pstn_wink = j->ex_sig.bits.f0 = j->ex_sig.bits.f1 = j->ex_sig.bits.f2 =
- j->ex_sig.bits.f3 = j->ex_sig.bits.fc0 = j->ex_sig.bits.fc1 = j->ex_sig.bits.fc2 = j->ex_sig.bits.fc3 = 1;
- file_p->private_data = NULL;
- clear_bit(board, &j->busyflags);
- return 0;
- }
- static int read_filters(IXJ *j)
- {
- unsigned short fc, cnt, trg;
- int var;
- trg = 0;
- if (ixj_WriteDSPCommand(0x5144, j)) {
- if(ixjdebug & 0x0001) {
- printk(KERN_INFO "Read Frame Counter failed!\n");
- }
- return -1;
- }
- fc = j->ssr.high << 8 | j->ssr.low;
- if (fc == j->frame_count)
- return 1;
- j->frame_count = fc;
- if (j->dtmf_proc)
- return 1;
- var = 10;
- for (cnt = 0; cnt < 4; cnt++) {
- if (ixj_WriteDSPCommand(0x5154 + cnt, j)) {
- if(ixjdebug & 0x0001) {
- printk(KERN_INFO "Select Filter %d failed!\n", cnt);
- }
- return -1;
- }
- if (ixj_WriteDSPCommand(0x515C, j)) {
- if(ixjdebug & 0x0001) {
- printk(KERN_INFO "Read Filter History %d failed!\n", cnt);
- }
- return -1;
- }
- j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low;
- if (j->cadence_f[cnt].enable) {
- if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) {
- if (j->cadence_f[cnt].state == 0) {
- j->cadence_f[cnt].state = 1;
- j->cadence_f[cnt].on1min = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 - var)) / 10000));
- j->cadence_f[cnt].on1dot = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100)) / 10000));
- j->cadence_f[cnt].on1max = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 + var)) / 10000));
- } else if (j->cadence_f[cnt].state == 2 &&
- (time_after(jiffies, j->cadence_f[cnt].off1min) &&
- time_before(jiffies, j->cadence_f[cnt].off1max))) {
- if (j->cadence_f[cnt].on2) {
- j->cadence_f[cnt].state = 3;
- j->cadence_f[cnt].on2min = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 - var)) / 10000));
- j->cadence_f[cnt].on2dot = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100)) / 10000));
- j->cadence_f[cnt].on2max = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 + var)) / 10000));
- } else {
- j->cadence_f[cnt].state = 7;
- }
- } else if (j->cadence_f[cnt].state == 4 &&
- (time_after(jiffies, j->cadence_f[cnt].off2min) &&
- time_before(jiffies, j->cadence_f[cnt].off2max))) {
- if (j->cadence_f[cnt].on3) {
- j->cadence_f[cnt].state = 5;
- j->cadence_f[cnt].on3min = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 - var)) / 10000));
- j->cadence_f[cnt].on3dot = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100)) / 10000));
- j->cadence_f[cnt].on3max = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 + var)) / 10000));
- } else {
- j->cadence_f[cnt].state = 7;
- }
- } else {
- j->cadence_f[cnt].state = 0;
- }
- } else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) {
- if (j->cadence_f[cnt].state == 1) {
- if(!j->cadence_f[cnt].on1) {
- j->cadence_f[cnt].state = 7;
- } else if((time_after(jiffies, j->cadence_f[cnt].on1min) &&
- time_before(jiffies, j->cadence_f[cnt].on1max))) {
- if(j->cadence_f[cnt].off1) {
- j->cadence_f[cnt].state = 2;
- j->cadence_f[cnt].off1min = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 - var)) / 10000));
- j->cadence_f[cnt].off1dot = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100)) / 10000));
- j->cadence_f[cnt].off1max = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 + var)) / 10000));
- } else {
- j->cadence_f[cnt].state = 7;
- }
- } else {
- j->cadence_f[cnt].state = 0;
- }
- } else if (j->cadence_f[cnt].state == 3) {
- if((time_after(jiffies, j->cadence_f[cnt].on2min) &&
- time_before(jiffies, j->cadence_f[cnt].on2max))) {
- if(j->cadence_f[cnt].off2) {
- j->cadence_f[cnt].state = 4;
- j->cadence_f[cnt].off2min = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 - var)) / 10000));
- j->cadence_f[cnt].off2dot = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100)) / 10000));
- j->cadence_f[cnt].off2max = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 + var)) / 10000));
- } else {
- j->cadence_f[cnt].state = 7;
- }
- } else {
- j->cadence_f[cnt].state = 0;
- }
- } else if (j->cadence_f[cnt].state == 5) {
- if ((time_after(jiffies, j->cadence_f[cnt].on3min) &&
- time_before(jiffies, j->cadence_f[cnt].on3max))) {
- if(j->cadence_f[cnt].off3) {
- j->cadence_f[cnt].state = 6;
- j->cadence_f[cnt].off3min = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 - var)) / 10000));
- j->cadence_f[cnt].off3dot = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100)) / 10000));
- j->cadence_f[cnt].off3max = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 + var)) / 10000));
- } else {
- j->cadence_f[cnt].state = 7;
- }
- } else {
- j->cadence_f[cnt].state = 0;
- }
- } else {
- j->cadence_f[cnt].state = 0;
- }
- } else {
- switch(j->cadence_f[cnt].state) {
- case 1:
- if(time_after(jiffies, j->cadence_f[cnt].on1dot) &&
- !j->cadence_f[cnt].off1 &&
- !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 &&
- !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
- j->cadence_f[cnt].state = 7;
- }
- break;
- case 3:
- if(time_after(jiffies, j->cadence_f[cnt].on2dot) &&
- !j->cadence_f[cnt].off2 &&
- !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
- j->cadence_f[cnt].state = 7;
- }
- break;
- case 5:
- if(time_after(jiffies, j->cadence_f[cnt].on3dot) &&
- !j->cadence_f[cnt].off3) {
- j->cadence_f[cnt].state = 7;
- }
- break;
- }
- }
- if (ixjdebug & 0x0040) {
- printk(KERN_INFO "IXJ Tone Cadence state = %d /dev/phone%d at %ld\n", j->cadence_f[cnt].state, j->board, jiffies);
- switch(j->cadence_f[cnt].state) {
- case 0:
- printk(KERN_INFO "IXJ /dev/phone%d No Tone detected\n", j->board);
- break;
- case 1:
- printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ld\n", j->board,
- j->cadence_f[cnt].on1, j->cadence_f[cnt].on1min, j->cadence_f[cnt].on1dot, j->cadence_f[cnt].on1max);
- break;
- case 2:
- printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off1min,
- j->cadence_f[cnt].off1max);
- break;
- case 3:
- printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on2min,
- j->cadence_f[cnt].on2max);
- break;
- case 4:
- printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off2min,
- j->cadence_f[cnt].off2max);
- break;
- case 5:
- printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on3min,
- j->cadence_f[cnt].on3max);
- break;
- case 6:
- printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off3min,
- j->cadence_f[cnt].off3max);
- break;
- }
- }
- }
- if (j->cadence_f[cnt].state == 7) {
- j->cadence_f[cnt].state = 0;
- if (j->cadence_f[cnt].enable == 1)
- j->cadence_f[cnt].enable = 0;
- switch (cnt) {
- case 0:
- if(ixjdebug & 0x0020) {
- printk(KERN_INFO "Filter Cadence 0 triggered %ld\n", jiffies);
- }
- j->ex.bits.fc0 = 1;
- ixj_kill_fasync(j, SIG_FC0, POLL_IN);
- break;
- case 1:
- if(ixjdebug & 0x0020) {
- printk(KERN_INFO "Filter Cadence 1 triggered %ld\n", jiffies);
- }
- j->ex.bits.fc1 = 1;
- ixj_kill_fasync(j, SIG_FC1, POLL_IN);
- break;
- case 2:
- if(ixjdebug & 0x0020) {
- printk(KERN_INFO "Filter Cadence 2 triggered %ld\n", jiffies);
- }
- j->ex.bits.fc2 = 1;
- ixj_kill_fasync(j, SIG_FC2, POLL_IN);
- break;
- case 3:
- if(ixjdebug & 0x0020) {
- printk(KERN_INFO "Filter Cadence 3 triggered %ld\n", jiffies);
- }
- j->ex.bits.fc3 = 1;
- ixj_kill_fasync(j, SIG_FC3, POLL_IN);
- break;
- }
- }
- if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) ||
- (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) {
- if((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12))) {
- trg = 1;
- } else if((j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3))) {
- trg = 0;
- }
- switch (cnt) {
- case 0:
- if(ixjdebug & 0x0020) {
- printk(KERN_INFO "Filter 0 triggered %d at %ld\n", trg, jiffies);
- }
- j->ex.bits.f0 = 1;
- ixj_kill_fasync(j, SIG_F0, POLL_IN);
- break;
- case 1:
- if(ixjdebug & 0x0020) {
- printk(KERN_INFO "Filter 1 triggered %d at %ld\n", trg, jiffies);
- }
- j->ex.bits.f1 = 1;
- ixj_kill_fasync(j, SIG_F1, POLL_IN);
- break;
- case 2:
- if(ixjdebug & 0x0020) {
- printk(KERN_INFO "Filter 2 triggered %d at %ld\n", trg, jiffies);
- }
- j->ex.bits.f2 = 1;
- ixj_kill_fasync(j, SIG_F2, POLL_IN);
- break;
- case 3:
- if(ixjdebug & 0x0020) {
- printk(KERN_INFO "Filter 3 triggered %d at %ld\n", trg, jiffies);
- }
- j->ex.bits.f3 = 1;
- ixj_kill_fasync(j, SIG_F3, POLL_IN);
- break;
- }
- }
- }
- return 0;
- }
- static int LineMonitor(IXJ *j)
- {
- if (j->dtmf_proc) {
- return -1;
- }
- j->dtmf_proc = 1;
- if (ixj_WriteDSPCommand(0x7000, j)) /* Line Monitor */
- return -1;
- j->dtmf.bytes.high = j->ssr.high;
- j->dtmf.bytes.low = j->ssr.low;
- if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) {
- j->dtmf_state = 1;
- j->dtmf_current = j->dtmf.bits.digit;
- }
- if (j->dtmf_state && !j->dtmf.bits.dtmf_valid) /* && j->dtmf_wp != j->dtmf_rp) */
- {
- if(!j->cidcw_wait) {
- j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current;
- j->dtmf_wp++;
- if (j->dtmf_wp == 79)
- j->dtmf_wp = 0;
- j->ex.bits.dtmf_ready = 1;
- if(j->ex_sig.bits.dtmf_ready) {
- ixj_kill_fasync(j, SIG_DTMF_READY, POLL_IN);
- }
- }
- else if(j->dtmf_current == 0x00 || j->dtmf_current == 0x0D) {
- if(ixjdebug & 0x0020) {
- printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ld\n", j->board, j->dtmf_current, jiffies);
- }
- j->flags.cidcw_ack = 1;
- }
- j->dtmf_state = 0;
- }
- j->dtmf_proc = 0;
- return 0;
- }
- /************************************************************************
- *
- * Functions to allow alaw <-> ulaw conversions.
- *
- ************************************************************************/
- static void ulaw2alaw(unsigned char *buff, unsigned long len)
- {
- static unsigned char table_ulaw2alaw[] =
- {
- 0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D,
- 0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25,
- 0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D,
- 0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35,
- 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02,
- 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A,
- 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12,
- 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B,
- 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63,
- 0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79,
- 0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71,
- 0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D,
- 0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45,
- 0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D,
- 0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51,
- 0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5,
- 0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD,
- 0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5,
- 0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD,
- 0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5,
- 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82,
- 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A,
- 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92,
- 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB,
- 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3,
- 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9,
- 0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1,
- 0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD,
- 0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5,
- 0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD,
- 0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1,
- 0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5
- };
- while (len--)
- {
- *buff = table_ulaw2alaw[*(unsigned char *)buff];
- buff++;
- }
- }
- static void alaw2ulaw(unsigned char *buff, unsigned long len)
- {
- static unsigned char table_alaw2ulaw[] =
- {
- 0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C,
- 0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24,
- 0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C,
- 0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34,
- 0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D,
- 0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05,
- 0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D,
- 0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15,
- 0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65,
- 0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E,
- 0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A,
- 0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D,
- 0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B,
- 0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43,
- 0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59,
- 0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51,
- 0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC,
- 0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4,
- 0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC,
- 0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4,
- 0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D,
- 0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85,
- 0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D,
- 0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95,
- 0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5,
- 0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE,
- 0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA,
- 0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED,
- 0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB,
- 0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3,
- 0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9,
- 0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1
- };
- while (len--)
- {
- *buff = table_alaw2ulaw[*(unsigned char *)buff];
- buff++;
- }
- }
- static ssize_t ixj_read(struct file * file_p, char __user *buf, size_t length, loff_t * ppos)
- {
- unsigned long i = *ppos;
- IXJ * j = get_ixj(NUM(file_p->f_dentry->d_inode));
- DECLARE_WAITQUEUE(wait, current);
- if (j->flags.inread)
- return -EALREADY;
- j->flags.inread = 1;
- add_wait_queue(&j->read_q, &wait);
- set_current_state(TASK_INTERRUPTIBLE);
- mb();
- while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {
- ++j->read_wait;
- if (file_p->f_flags & O_NONBLOCK) {
- set_current_state(TASK_RUNNING);
- remove_wait_queue(&j->read_q, &wait);
- j->flags.inread = 0;
- return -EAGAIN;
- }
- if (!ixj_hookstate(j)) {
- set_current_state(TASK_RUNNING);
- remove_wait_queue(&j->read_q, &wait);
- j->flags.inread = 0;
- return 0;
- }
- interruptible_sleep_on(&j->read_q);
- if (signal_pending(current)) {
- set_current_state(TASK_RUNNING);
- remove_wait_queue(&j->read_q, &wait);
- j->flags.inread = 0;
- return -EINTR;
- }
- }
- remove_wait_queue(&j->read_q, &wait);
- set_current_state(TASK_RUNNING);
- /* Don't ever copy more than the user asks */
- if(j->rec_codec == ALAW)
- ulaw2alaw(j->read_buffer, min(length, j->read_buffer_size));
- i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size));
- j->read_buffer_ready = 0;
- if (i) {
- j->flags.inread = 0;
- return -EFAULT;
- } else {
- j->flags.inread = 0;
- return min(length, j->read_buffer_size);
- }
- }
- static ssize_t ixj_enhanced_read(struct file * file_p, char __user *buf, size_t length,
- loff_t * ppos)
- {
- int pre_retval;
- ssize_t read_retval = 0;
- IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode));
- pre_retval = ixj_PreRead(j, 0L);
- switch (pre_retval) {
- case NORMAL:
- read_retval = ixj_read(file_p, buf, length, ppos);
- ixj_PostRead(j, 0L);
- break;
- case NOPOST:
- read_retval = ixj_read(file_p, buf, length, ppos);
- break;
- case POSTONLY:
- ixj_PostRead(j, 0L);
- break;
- default:
- read_retval = pre_retval;
- }
- return read_retval;
- }
- static ssize_t ixj_write(struct file *file_p, const char __user *buf, size_t count, loff_t * ppos)
- {
- unsigned long i = *ppos;
- IXJ *j = file_p->private_data;
- DECLARE_WAITQUEUE(wait, current);
- if (j->flags.inwrite)
- return -EALREADY;
- j->flags.inwrite = 1;
- add_wait_queue(&j->write_q, &wait);
- set_current_state(TASK_INTERRUPTIBLE);
- mb();
- while (!j->write_buffers_empty) {
- ++j->write_wait;
- if (file_p->f_flags & O_NONBLOCK) {
- set_current_state(TASK_RUNNING);
- remove_wait_queue(&j->write_q, &wait);
- j->flags.inwrite = 0;
- return -EAGAIN;
- }
- if (!ixj_hookstate(j)) {
- set_current_state(TASK_RUNNING);
- remove_wait_queue(&j->write_q, &wait);
- j->flags.inwrite = 0;
- return 0;
- }
- interruptible_sleep_on(&j->write_q);
- if (signal_pending(current)) {
- set_current_state(TASK_RUNNING);
- remove_wait_queue(&j->write_q, &wait);
- j->flags.inwrite = 0;
- return -EINTR;
- }
- }
- set_current_state(TASK_RUNNING);
- remove_wait_queue(&j->write_q, &wait);
- if (j->write_buffer_wp + count >= j->write_buffer_end)
- j->write_buffer_wp = j->write_buffer;
- i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size));
- if (i) {
- j->flags.inwrite = 0;
- return -EFAULT;
- }
- if(j->play_codec == ALAW)
- alaw2ulaw(j->write_buffer_wp, min(count, j->write_buffer_size));
- j->flags.inwrite = 0;
- return min(count, j->write_buffer_size);
- }
- static ssize_t ixj_enhanced_write(struct file * file_p, const char __user *buf, size_t count, loff_t * ppos)
- {
- int pre_retval;
- ssize_t write_retval = 0;
- IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode));
- pre_retval = ixj_PreWrite(j, 0L);
- switch (pre_retval) {
- case NORMAL:
- write_retval = ixj_write(file_p, buf, count, ppos);
- if (write_retval > 0) {
- ixj_PostWrite(j, 0L);
- j->write_buffer_wp += write_retval;
- j->write_buffers_empty--;
- }
- break;
- case NOPOST:
- write_retval = ixj_write(file_p, buf, count, ppos);
- if (write_retval > 0) {
- j->write_buffer_wp += write_retval;
- j->write_buffers_empty--;
- }
- break;
- case POSTONLY:
- ixj_PostWrite(j, 0L);
- break;
- default:
- write_retval = pre_retval;
- }
- return write_retval;
- }
- static void ixj_read_frame(IXJ *j)
- {
- int cnt, dly;
- if (j->read_buffer) {
- for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
- if (!(cnt % 16) && !IsRxReady(j)) {
- dly = 0;
- while (!IsRxReady(j)) {
- if (dly++ > 5) {
- dly = 0;
- break;
- }
- udelay(10);
- }
- }
- /* Throw away word 0 of the 8021 compressed format to get standard G.729. */
- if (j->rec_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
- inb_p(j->DSPbase + 0x0E);
- inb_p(j->DSPbase + 0x0F);
- }
- *(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E);
- *(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F);
- }
- ++j->framesread;
- if (j->intercom != -1) {
- if (IsTxReady(get_ixj(j->intercom))) {
- for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
- if (!(cnt % 16) && !IsTxReady(j)) {
- dly = 0;
- while (!IsTxReady(j)) {
- if (dly++ > 5) {
- dly = 0;
- break;
- }
- udelay(10);
- }
- }
- outb_p(*(j->read_buffer + cnt), get_ixj(j->intercom)->DSPbase + 0x0C);
- outb_p(*(j->read_buffer + cnt + 1), get_ixj(j->intercom)->DSPbase + 0x0D);
- }
- get_ixj(j->intercom)->frameswritten++;
- }
- } else {
- j->read_buffer_ready = 1;
- wake_up_interruptible(&j->read_q); /* Wake any blocked readers */
- wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
- if(j->ixj_signals[SIG_READ_READY])
- ixj_kill_fasync(j, SIG_READ_READY, POLL_OUT);
- }
- }
- }
- static short fsk[][6][20] =
- {
- {
- {
- 0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196,
- -16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722
- },
- {
- -28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,
- -32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876
- },
- {
- -28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715,
- -16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846
- },
- {
- 0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196,
- 16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722
- },
- {
- 28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481,
- 32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876
- },
- {
- 28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715,
- 16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846
- }
- },
- {
- {
- 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126,
- 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126
- },
- {
- -28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051,
- 28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051
- },
- {
- -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925,
- 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925
- },
- {
- 0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126,
- 0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126
- },
- {
- 28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051,
- -28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051
- },
- {
- 28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925,
- -28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925
- }
- }
- };
- static void ixj_write_cid_bit(IXJ *j, int bit)
- {
- while (j->fskcnt < 20) {
- if(j->fskdcnt < (j->fsksize - 1))
- j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt];
- j->fskcnt += 3;
- }
- j->fskcnt %= 20;
- if (!bit)
- j->fskz++;
- if (j->fskz >= 6)
- j->fskz = 0;
- }
- static void ixj_write_cid_byte(IXJ *j, char byte)
- {
- IXJ_CBYTE cb;
- cb.cbyte = byte;
- ixj_write_cid_bit(j, 0);
- ixj_write_cid_bit(j, cb.cbits.b0 ? 1 : 0);
- ixj_write_cid_bit(j, cb.cbits.b1 ? 1 : 0);
- ixj_write_cid_bit(j, cb.cbits.b2 ? 1 : 0);
- ixj_write_cid_bit(j, cb.cbits.b3 ? 1 : 0);
- ixj_write_cid_bit(j, cb.cbits.b4 ? 1 : 0);
- ixj_write_cid_bit(j, cb.cbits.b5 ? 1 : 0);
- ixj_write_cid_bit(j, cb.cbits.b6 ? 1 : 0);
- ixj_write_cid_bit(j, cb.cbits.b7 ? 1 : 0);
- ixj_write_cid_bit(j, 1);
- }
- static void ixj_write_cid_seize(IXJ *j)
- {
- int cnt;
- for (cnt = 0; cnt < 150; cnt++) {
- ixj_write_cid_bit(j, 0);
- ixj_write_cid_bit(j, 1);
- }
- for (cnt = 0; cnt < 180; cnt++) {
- ixj_write_cid_bit(j, 1);
- }
- }
- static void ixj_write_cidcw_seize(IXJ *j)
- {
- int cnt;
- for (cnt = 0; cnt < 80; cnt++) {
- ixj_write_cid_bit(j, 1);
- }
- }
- static int ixj_write_cid_string(IXJ *j, char *s, int checksum)
- {
- int cnt;
- for (cnt = 0; cnt < strlen(s); cnt++) {
- ixj_write_cid_byte(j, s[cnt]);
- checksum = (checksum + s[cnt]);
- }
- return checksum;
- }
- static void ixj_pad_fsk(IXJ *j, int pad)
- {
- int cnt;
- for (cnt = 0; cnt < pad; cnt++) {
- if(j->fskdcnt < (j->fsksize - 1))
- j->fskdata[j->fskdcnt++] = 0x0000;
- }
- for (cnt = 0; cnt < 720; cnt++) {
- if(j->fskdcnt < (j->fsksize - 1))
- j->fskdata[j->fskdcnt++] = 0x0000;
- }
- }
- static void ixj_pre_cid(IXJ *j)
- {
- j->cid_play_codec = j->play_codec;
- j->cid_play_frame_size = j->play_frame_size;
- j->cid_play_volume = get_play_volume(j);
- j->cid_play_flag = j->flags.playing;
- j->cid_rec_codec = j->rec_codec;
- j->cid_rec_volume = get_rec_volume(j);
- j->cid_rec_flag = j->flags.recording;
- j->cid_play_aec_level = j->aec_level;
- switch(j->baseframe.low) {
- case 0xA0:
- j->cid_base_frame_size = 20;
- break;
- case 0x50:
- j->cid_base_frame_size = 10;
- break;
- case 0xF0:
- j->cid_base_frame_size = 30;
- break;
- }
- ixj_play_stop(j);
- ixj_cpt_stop(j);
- j->flags.cidplay = 1;
- set_base_frame(j, 30);
- set_play_codec(j, LINEAR16);
- set_play_volume(j, 0x1B);
- ixj_play_start(j);
- }
- static void ixj_post_cid(IXJ *j)
- {
- ixj_play_stop(j);
- if(j->cidsize > 5000) {
- SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
- }
- j->flags.cidplay = 0;
- if(ixjdebug & 0x0200) {
- printk("IXJ phone%d Finished Playing CallerID data %ld\n", j->board, jiffies);
- }
- ixj_fsk_free(j);
- j->fskdcnt = 0;
- set_base_frame(j, j->cid_base_frame_size);
- set_play_codec(j, j->cid_play_codec);
- ixj_aec_start(j, j->cid_play_aec_level);
- set_play_volume(j, j->cid_play_volume);
- set_rec_codec(j, j->cid_rec_codec);
- set_rec_volume(j, j->cid_rec_volume);
- if(j->cid_rec_flag)
- ixj_record_start(j);
- if(j->cid_play_flag)
- ixj_play_start(j);
- if(j->cid_play_flag) {
- wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
- }
- }
- static void ixj_write_cid(IXJ *j)
- {
- char sdmf1[50];
- char sdmf2[50];
- char sdmf3[80];
- char mdmflen, len1, len2, len3;
- int pad;
- int checksum = 0;
- if (j->dsp.low == 0x20 || j->flags.cidplay)
- return;
- j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
- j->cidsize = j->cidcnt = 0;
- ixj_fsk_alloc(j);
- strcpy(sdmf1, j->cid_send.month);
- strcat(sdmf1, j->cid_send.day);
- strcat(sdmf1, j->cid_send.hour);
- strcat(sdmf1, j->cid_send.min);
- strcpy(sdmf2, j->cid_send.number);
- strcpy(sdmf3, j->cid_send.name);
- len1 = strlen(sdmf1);
- len2 = strlen(sdmf2);
- len3 = strlen(sdmf3);
- mdmflen = len1 + len2 + len3 + 6;
- while(1){
- ixj_write_cid_seize(j);
- ixj_write_cid_byte(j, 0x80);
- checksum = 0x80;
- ixj_write_cid_byte(j, mdmflen);
- checksum = checksum + mdmflen;
- ixj_write_cid_byte(j, 0x01);
- checksum = checksum + 0x01;
- ixj_write_cid_byte(j, len1);
- checksum = checksum + len1;
- checksum = ixj_write_cid_string(j, sdmf1, checksum);
- if(ixj_hookstate(j) & 1)
- break;
- ixj_write_cid_byte(j, 0x02);
- checksum = checksum + 0x02;
- ixj_write_cid_byte(j, len2);
- checksum = checksum + len2;
- checksum = ixj_write_cid_string(j, sdmf2, checksum);
- if(ixj_hookstate(j) & 1)
- break;
- ixj_write_cid_byte(j, 0x07);
- checksum = checksum + 0x07;
- ixj_write_cid_byte(j, len3);
- checksum = checksum + len3;
- checksum = ixj_write_cid_string(j, sdmf3, checksum);
- if(ixj_hookstate(j) & 1)
- break;
- checksum %= 256;
- checksum ^= 0xFF;
- checksum += 1;
- ixj_write_cid_byte(j, (char) checksum);
- pad = j->fskdcnt % 240;
- if (pad) {
- pad = 240 - pad;
- }
- ixj_pad_fsk(j, pad);
- break;
- }
- ixj_write_frame(j);
- }
- static void ixj_write_cidcw(IXJ *j)
- {
- IXJ_TONE ti;
- char sdmf1[50];
- char sdmf2[50];
- char sdmf3[80];
- char mdmflen, len1, len2, len3;
- int pad;
- int checksum = 0;
- if (j->dsp.low == 0x20 || j->flags.cidplay)
- return;
- j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
- j->cidsize = j->cidcnt = 0;
- ixj_fsk_alloc(j);
- j->flags.cidcw_ack = 0;
- ti.tone_index = 23;
- ti.gain0 = 1;
- ti.freq0 = hz440;
- ti.gain1 = 0;
- ti.freq1 = 0;
- ixj_init_tone(j, &ti);
- ixj_set_tone_on(1500, j);
- ixj_set_tone_off(32, j);
- if(ixjdebug & 0x0200) {
- printk("IXJ cidcw phone%d first tone start at %ld\n", j->board, jiffies);
- }
- ixj_play_tone(j, 23);
- clear_bit(j->board, &j->busyflags);
- while(j->tone_state)
- schedule_timeout_interruptible(1);
- while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
- schedule_timeout_interruptible(1);
- if(ixjdebug & 0x0200) {
- printk("IXJ cidcw phone%d first tone end at %ld\n", j->board, jiffies);
- }
- ti.tone_index = 24;
- ti.gain0 = 1;
- ti.freq0 = hz2130;
- ti.gain1 = 0;
- ti.freq1 = hz2750;
- ixj_init_tone(j, &ti);
- ixj_set_tone_off(10, j);
- ixj_set_tone_on(600, j);
- if(ixjdebug & 0x0200) {
- printk("IXJ cidcw phone%d second tone start at %ld\n", j->board, jiffies);
- }
- ixj_play_tone(j, 24);
- clear_bit(j->board, &j->busyflags);
- while(j->tone_state)
- schedule_timeout_interruptible(1);
- while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
- schedule_timeout_interruptible(1);
- if(ixjdebug & 0x0200) {
- printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies);
- }
- j->cidcw_wait = jiffies + ((50 * hertz) / 100);
- clear_bit(j->board, &j->busyflags);
- while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait))
- schedule_timeout_interruptible(1);
- while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
- schedule_timeout_interruptible(1);
- j->cidcw_wait = 0;
- if(!j->flags.cidcw_ack) {
- if(ixjdebug & 0x0200) {
- printk("IXJ cidcw phone%d did not receive ACK from display %ld\n", j->board, jiffies);
- }
- ixj_post_cid(j);
- if(j->cid_play_flag) {
- wake_up_interruptible(&j->write_q); /* Wake any blocked readers */
- }
- return;
- } else {
- ixj_pre_cid(j);
- }
- j->flags.cidcw_ack = 0;
- strcpy(sdmf1, j->cid_send.month);
- strcat(sdmf1, j->cid_send.day);
- strcat(sdmf1, j->cid_send.hour);
- strcat(sdmf1, j->cid_send.min);
- strcpy(sdmf2, j->cid_send.number);
- strcpy(sdmf3, j->cid_send.name);
- len1 = strlen(sdmf1);
- len2 = strlen(sdmf2);
- len3 = strlen(sdmf3);
- mdmflen = len1 + len2 + len3 + 6;
- ixj_write_cidcw_seize(j);
- ixj_write_cid_byte(j, 0x80);
- checksum = 0x80;
- ixj_write_cid_byte(j, mdmflen);
- checksum = checksum + mdmflen;
- ixj_write_cid_byte(j, 0x01);
- checksum = checksum + 0x01;
- ixj_write_cid_byte(j, len1);
- checksum = checksum + len1;
- checksum = ixj_write_cid_string(j, sdmf1, checksum);
- ixj_write_cid_byte(j, 0x02);
- checksum = checksum + 0x02;
- ixj_write_cid_byte(j, len2);
- checksum = checksum + len2;
- checksum = ixj_write_cid_string(j, sdmf2, checksum);
- ixj_write_cid_byte(j, 0x07);
- checksum = checksum + 0x07;
- ixj_write_cid_byte(j, len3);
- checksum = checksum + len3;
- checksum = ixj_write_cid_string(j, sdmf3, checksum);
- checksum %= 256;
- checksum ^= 0xFF;
- checksum += 1;
- ixj_write_cid_byte(j, (char) checksum);
- pad = j->fskdcnt % 240;
- if (pad) {
- pad = 240 - pad;
- }
- ixj_pad_fsk(j, pad);
- if(ixjdebug & 0x0200) {
- printk("IXJ cidcw phone%d sent FSK data at %ld\n", j->board, jiffies);
- }
- }
- static void ixj_write_vmwi(IXJ *j, int msg)
- {
- char mdmflen;
- int pad;
- int checksum = 0;
- if (j->dsp.low == 0x20 || j->flags.cidplay)
- return;
- j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
- j->cidsize = j->cidcnt = 0;
- ixj_fsk_alloc(j);
- mdmflen = 3;
- if (j->port == PORT_POTS)
- SLIC_SetState(PLD_SLIC_STATE_OHT, j);
- ixj_write_cid_seize(j);
- ixj_write_cid_byte(j, 0x82);
- checksum = 0x82;
- ixj_write_cid_byte(j, mdmflen);
- checksum = checksum + mdmflen;
- ixj_write_cid_byte(j, 0x0B);
- checksum = checksum + 0x0B;
- ixj_write_cid_byte(j, 1);
- checksum = checksum + 1;
- if(msg) {
- ixj_write_cid_byte(j, 0xFF);
- checksum = checksum + 0xFF;
- }
- else {
- ixj_write_cid_byte(j, 0x00);
- checksum = checksum + 0x00;
- }
- checksum %= 256;
- checksum ^= 0xFF;
- checksum += 1;
- ixj_write_cid_byte(j, (char) checksum);
- pad = j->fskdcnt % 240;
- if (pad) {
- pad = 240 - pad;
- }
- ixj_pad_fsk(j, pad);
- }
- static void ixj_write_frame(IXJ *j)
- {
- int cnt, frame_count, dly;
- IXJ_WORD dat;
- BYTES blankword;
- frame_count = 0;
- if(j->flags.cidplay) {
- for(cnt = 0; cnt < 480; cnt++) {
- if (!(cnt % 16) && !IsTxReady(j)) {
- dly = 0;
- while (!IsTxReady(j)) {
- if (dly++ > 5) {
- dly = 0;
- break;
- }
- udelay(10);
- }
- }
- dat.word = j->fskdata[j->cidcnt++];
- outb_p(dat.bytes.low, j->DSPbase + 0x0C);
- outb_p(dat.bytes.high, j->DSPbase + 0x0D);
- cnt++;
- }
- if(j->cidcnt >= j->fskdcnt) {
- ixj_post_cid(j);
- }
- /* This may seem rude, but if we just played one frame of FSK data for CallerID
- and there is real audio data in the buffer, we need to throw it away because
- we just used it's time slot */
- if (j->write_buffer_rp > j->write_buffer_wp) {
- j->write_buffer_rp += j->cid_play_frame_size * 2;
- if (j->write_buffer_rp >= j->write_buffer_end) {
- j->write_buffer_rp = j->write_buffer;
- }
- j->write_buffers_empty++;
- wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
- wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
- }
- } else if (j->write_buffer && j->write_buffers_empty < 1) {
- if (j->write_buffer_wp > j->write_buffer_rp) {
- frame_count =
- (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2);
- }
- if (j->write_buffer_rp > j->write_buffer_wp) {
- frame_count =
- (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) +
- (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2);
- }
- if (frame_count >= 1) {
- if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) {
- switch (j->play_mode) {
- case PLAYBACK_MODE_ULAW:
- case PLAYBACK_MODE_ALAW:
- blankword.low = blankword.high = 0xFF;
- break;
- case PLAYBACK_MODE_8LINEAR:
- case PLAYBACK_MODE_16LINEAR:
- blankword.low = blankword.high = 0x00;
- break;
- case PLAYBACK_MODE_8LINEAR_WSS:
- blankword.low = blankword.high = 0x80;
- break;
- }
- for (cnt = 0; cnt < 16; cnt++) {
- if (!(cnt % 16) && !IsTxReady(j)) {
- dly = 0;
- while (!IsTxReady(j)) {
- if (dly++ > 5) {
- dly = 0;
- break;
- }
- udelay(10);
- }
- }
- outb_p((blankword.low), j->DSPbase + 0x0C);
- outb_p((blankword.high), j->DSPbase + 0x0D);
- }
- j->flags.play_first_frame = 0;
- } else if (j->play_codec == G723_63 && j->flags.play_first_frame) {
- for (cnt = 0; cnt < 24; cnt++) {
- if(cnt == 12) {
- blankword.low = 0x02;
- blankword.high = 0x00;
- }
- else {
- blankword.low = blankword.high = 0x00;
- }
- if (!(cnt % 16) && !IsTxReady(j)) {
- dly = 0;
- while (!IsTxReady(j)) {
- if (dly++ > 5) {
- dly = 0;
- break;
- }
- udelay(10);
- }
- }
- outb_p((blankword.low), j->DSPbase + 0x0C);
- outb_p((blankword.high), j->DSPbase + 0x0D);
- }
- j->flags.play_first_frame = 0;
- }
- for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) {
- if (!(cnt % 16) && !IsTxReady(j)) {
- dly = 0;
- while (!IsTxReady(j)) {
- if (dly++ > 5) {
- dly = 0;
- break;
- }
- udelay(10);
- }
- }
- /* Add word 0 to G.729 frames for the 8021. Right now we don't do VAD/CNG */
- if (j->play_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
- if (j->write_buffer_rp[cnt] == 0 &&
- j->write_buffer_rp[cnt + 1] == 0 &&
- j->write_buffer_rp[cnt + 2] == 0 &&
- j->write_buffer_rp[cnt + 3] == 0 &&
- j->write_buffer_rp[cnt + 4] == 0 &&
- j->write_buffer_rp[cnt + 5] == 0 &&
- j->write_buffer_rp[cnt + 6] == 0 &&
- j->write_buffer_rp[cnt + 7] == 0 &&
- j->write_buffer_rp[cnt + 8] == 0 &&
- j->write_buffer_rp[cnt + 9] == 0) {
- /* someone is trying to write silence lets make this a type 0 frame. */
- outb_p(0x00, j->DSPbase + 0x0C);
- outb_p(0x00, j->DSPbase + 0x0D);
- } else {
- /* so all other frames are type 1. */
- outb_p(0x01, j->DSPbase + 0x0C);
- outb_p(0x00, j->DSPbase + 0x0D);
- }
- }
- outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C);
- outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D);
- *(j->write_buffer_rp + cnt) = 0;
- *(j->write_buffer_rp + cnt + 1) = 0;
- }
- j->write_buffer_rp += j->play_frame_size * 2;
- if (j->write_buffer_rp >= j->write_buffer_end) {
- j->write_buffer_rp = j->write_buffer;
- }
- j->write_buffers_empty++;
- wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
- wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
- ++j->frameswritten;
- }
- } else {
- j->drybuffer++;
- }
- if(j->ixj_signals[SIG_WRITE_READY]) {
- ixj_kill_fasync(j, SIG_WRITE_READY, POLL_OUT);
- }
- }
- static int idle(IXJ *j)
- {
- if (ixj_WriteDSPCommand(0x0000, j)) /* DSP Idle */
- return 0;
- if (j->ssr.high || j->ssr.low) {
- return 0;
- } else {
- j->play_mode = -1;
- j->flags.playing = 0;
- j->rec_mode = -1;
- j->flags.recording = 0;
- return 1;
- }
- }
- static int set_base_frame(IXJ *j, int size)
- {
- unsigned short cmd;
- int cnt;
- idle(j);
- j->cid_play_aec_level = j->aec_level;
- aec_stop(j);
- for (cnt = 0; cnt < 10; cnt++) {
- if (idle(j))
- break;
- }
- if (j->ssr.high || j->ssr.low)
- return -1;
- if (j->dsp.low != 0x20) {
- switch (size) {
- case 30:
- cmd = 0x07F0;
- /* Set Base Frame Size to 240 pg9-10 8021 */
- break;
- case 20:
- cmd = 0x07A0;
- /* Set Base Frame Size to 160 pg9-10 8021 */
- break;
- case 10:
- cmd = 0x0750;
- /* Set Base Frame Size to 80 pg9-10 8021 */
- break;
- default:
- return -1;
- }
- } else {
- if (size == 30)
- return size;
- else
- return -1;
- }
- if (ixj_WriteDSPCommand(cmd, j)) {
- j->baseframe.high = j->baseframe.low = 0xFF;
- return -1;
- } else {
- j->baseframe.high = j->ssr.high;
- j->baseframe.low = j->ssr.low;
- /* If the status returned is 0x0000 (pg9-9 8021) the call failed */
- if(j->baseframe.high == 0x00 && j->baseframe.low == 0x00) {
- return -1;
- }
- }
- ixj_aec_start(j, j->cid_play_aec_level);
- return size;
- }
- static int set_rec_codec(IXJ *j, int rate)
- {
- int retval = 0;
- j->rec_codec = rate;
- switch (rate) {
- case G723_63:
- if (j->ver.low != 0x12 || ixj_convert_loaded) {
- j->rec_frame_size = 12;
- j->rec_mode = 0;
- } else {
- retval = 1;
- }
- break;
- case G723_53:
- if (j->ver.low != 0x12 || ixj_convert_loaded) {
- j->rec_frame_size = 10;
- j->rec_mode = 0;
- } else {
- retval = 1;
- }
- break;
- case TS85:
- if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
- j->rec_frame_size = 16;
- j->rec_mode = 0;
- } else {
- retval = 1;
- }
- break;
- case TS48:
- if (j->ver.low != 0x12 || ixj_convert_loaded) {
- j->rec_frame_size = 9;
- j->rec_mode = 0;
- } else {
- retval = 1;
- }
- break;
- case TS41:
- if (j->ver.low != 0x12 || ixj_convert_loaded) {
- j->rec_frame_size = 8;
- j->rec_mode = 0;
- } else {
- retval = 1;
- }
- break;
- case G728:
- if (j->dsp.low != 0x20) {
- j->rec_frame_size = 48;
- j->rec_mode = 0;
- } else {
- retval = 1;
- }
- break;
- case G729:
- if (j->dsp.low != 0x20) {
- if (!j->flags.g729_loaded) {
- retval = 1;
- break;
- }
- switch (j->baseframe.low) {
- case 0xA0:
- j->rec_frame_size = 10;
- break;
- case 0x50:
- j->rec_frame_size = 5;
- break;
- default:
- j->rec_frame_size = 15;
- break;
- }
- j->rec_mode = 0;
- } else {
- retval = 1;
- }
- break;
- case G729B:
- if (j->dsp.low != 0x20) {
- if (!j->flags.g729_loaded) {
- retval = 1;
- break;
- }
- switch (j->baseframe.low) {
- case 0xA0:
- j->rec_frame_size = 12;
- break;
- case 0x50:
- j->rec_frame_size = 6;
- break;
- default:
- j->rec_frame_size = 18;
- break;
- }
- j->rec_mode = 0;
- } else {
- retval = 1;
- }
- break;
- case ULAW:
- switch (j->baseframe.low) {
- case 0xA0:
- j->rec_frame_size = 80;
- break;
- case 0x50:
- j->rec_frame_size = 40;
- break;
- default:
- j->rec_frame_size = 120;
- break;
- }
- j->rec_mode = 4;
- break;
- case ALAW:
- switch (j->baseframe.low) {
- case 0xA0:
- j->rec_frame_size = 80;
- break;
- case 0x50:
- j->rec_frame_size = 40;
- break;
- default:
- j->rec_frame_size = 120;
- break;
- }
- j->rec_mode = 4;
- break;
- case LINEAR16:
- switch (j->baseframe.low) {
- case 0xA0:
- j->rec_frame_size = 160;
- break;
- case 0x50:
- j->rec_frame_size = 80;
- break;
- default:
- j->rec_frame_size = 240;
- break;
- }
- j->rec_mode = 5;
- break;
- case LINEAR8:
- switch (j->baseframe.low) {
- case 0xA0:
- j->rec_frame_size = 80;
- break;
- case 0x50:
- j->rec_frame_size = 40;
- break;
- default:
- j->rec_frame_size = 120;
- break;
- }
- j->rec_mode = 6;
- break;
- case WSS:
- switch (j->baseframe.low) {
- case 0xA0:
- j->rec_frame_size = 80;
- break;
- case 0x50:
- j->rec_frame_size = 40;
- break;
- default:
- j->rec_frame_size = 120;
- break;
- }
- j->rec_mode = 7;
- break;
- default:
- kfree(j->read_buffer);
- j->rec_frame_size = 0;
- j->rec_mode = -1;
- j->read_buffer = NULL;
- j->read_buffer_size = 0;
- retval = 1;
- break;
- }
- return retval;
- }
- static int ixj_record_start(IXJ *j)
- {
- unsigned short cmd = 0x0000;
- if (j->read_buffer) {
- ixj_record_stop(j);
- }
- j->flags.recording = 1;
- ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
- if(ixjdebug & 0x0002)
- printk("IXJ %d Starting Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
- if (!j->rec_mode) {
- switch (j->rec_codec) {
- case G723_63:
- cmd = 0x5131;
- break;
- case G723_53:
- cmd = 0x5132;
- break;
- case TS85:
- cmd = 0x5130; /* TrueSpeech 8.5 */
- break;
- case TS48:
- cmd = 0x5133; /* TrueSpeech 4.8 */
- break;
- case TS41:
- cmd = 0x5134; /* TrueSpeech 4.1 */
- break;
- case G728:
- cmd = 0x5135;
- break;
- case G729:
- case G729B:
- cmd = 0x5136;
- break;
- default:
- return 1;
- }
- if (ixj_WriteDSPCommand(cmd, j))
- return -1;
- }
- if (!j->read_buffer) {
- if (!j->read_buffer)
- j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC);
- if (!j->read_buffer) {
- printk("Read buffer allocation for ixj board %d failed!\n", j->board);
- return -ENOMEM;
- }
- }
- j->read_buffer_size = j->rec_frame_size * 2;
- if (ixj_WriteDSPCommand(0x5102, j)) /* Set Poll sync mode */
- return -1;
- switch (j->rec_mode) {
- case 0:
- cmd = 0x1C03; /* Record C1 */
- break;
- case 4:
- if (j->ver.low == 0x12) {
- cmd = 0x1E03; /* Record C1 */
- } else {
- cmd = 0x1E01; /* Record C1 */
- }
- break;
- case 5:
- if (j->ver.low == 0x12) {
- cmd = 0x1E83; /* Record C1 */
- } else {
- cmd = 0x1E81; /* Record C1 */
- }
- break;
- case 6:
- if (j->ver.low == 0x12) {
- cmd = 0x1F03; /* Record C1 */
- } else {
- cmd = 0x1F01; /* Record C1 */
- }
- break;
- case 7:
- if (j->ver.low == 0x12) {
- cmd = 0x1F83; /* Record C1 */
- } else {
- cmd = 0x1F81; /* Record C1 */
- }
- break;
- }
- if (ixj_WriteDSPCommand(cmd, j))
- return -1;
- if (j->flags.playing) {
- ixj_aec_start(j, j->aec_level);
- }
- return 0;
- }
- static void ixj_record_stop(IXJ *j)
- {
- if (ixjdebug & 0x0002)
- printk("IXJ %d Stopping Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
- kfree(j->read_buffer);
- j->read_buffer = NULL;
- j->read_buffer_size = 0;
- if (j->rec_mode > -1) {
- ixj_WriteDSPCommand(0x5120, j);
- j->rec_mode = -1;
- }
- j->flags.recording = 0;
- }
- static void ixj_vad(IXJ *j, int arg)
- {
- if (arg)
- ixj_WriteDSPCommand(0x513F, j);
- else
- ixj_WriteDSPCommand(0x513E, j);
- }
- static void set_rec_depth(IXJ *j, int depth)
- {
- if (depth > 60)
- depth = 60;
- if (depth < 0)
- depth = 0;
- ixj_WriteDSPCommand(0x5180 + depth, j);
- }
- static void set_dtmf_prescale(IXJ *j, int volume)
- {
- ixj_WriteDSPCommand(0xCF07, j);
- ixj_WriteDSPCommand(volume, j);
- }
- static int get_dtmf_prescale(IXJ *j)
- {
- ixj_WriteDSPCommand(0xCF05, j);
- return j->ssr.high << 8 | j->ssr.low;
- }
- static void set_rec_volume(IXJ *j, int volume)
- {
- if(j->aec_level == AEC_AGC) {
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j->board, volume);
- ixj_WriteDSPCommand(0xCF96, j);
- ixj_WriteDSPCommand(volume, j);
- } else {
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j->board, volume);
- ixj_WriteDSPCommand(0xCF03, j);
- ixj_WriteDSPCommand(volume, j);
- }
- }
- static int set_rec_volume_linear(IXJ *j, int volume)
- {
- int newvolume, dsprecmax;
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j->board, volume);
- if(volume > 100 || volume < 0) {
- return -1;
- }
- /* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
- switch (j->cardtype) {
- case QTI_PHONEJACK:
- dsprecmax = 0x440;
- break;
- case QTI_LINEJACK:
- dsprecmax = 0x180;
- ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
- ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
- ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
- break;
- case QTI_PHONEJACK_LITE:
- dsprecmax = 0x4C0;
- break;
- case QTI_PHONEJACK_PCI:
- dsprecmax = 0x100;
- break;
- case QTI_PHONECARD:
- dsprecmax = 0x400;
- break;
- default:
- return -1;
- }
- newvolume = (dsprecmax * volume) / 100;
- set_rec_volume(j, newvolume);
- return 0;
- }
- static int get_rec_volume(IXJ *j)
- {
- if(j->aec_level == AEC_AGC) {
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "Getting AGC Threshold\n");
- ixj_WriteDSPCommand(0xCF86, j);
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "AGC Threshold is 0x%2.2x%2.2x\n", j->ssr.high, j->ssr.low);
- return j->ssr.high << 8 | j->ssr.low;
- } else {
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "Getting Record Volume\n");
- ixj_WriteDSPCommand(0xCF01, j);
- return j->ssr.high << 8 | j->ssr.low;
- }
- }
- static int get_rec_volume_linear(IXJ *j)
- {
- int volume, newvolume, dsprecmax;
- switch (j->cardtype) {
- case QTI_PHONEJACK:
- dsprecmax = 0x440;
- break;
- case QTI_LINEJACK:
- dsprecmax = 0x180;
- break;
- case QTI_PHONEJACK_LITE:
- dsprecmax = 0x4C0;
- break;
- case QTI_PHONEJACK_PCI:
- dsprecmax = 0x100;
- break;
- case QTI_PHONECARD:
- dsprecmax = 0x400;
- break;
- default:
- return -1;
- }
- volume = get_rec_volume(j);
- newvolume = (volume * 100) / dsprecmax;
- if(newvolume > 100)
- newvolume = 100;
- return newvolume;
- }
- static int get_rec_level(IXJ *j)
- {
- int retval;
- ixj_WriteDSPCommand(0xCF88, j);
- retval = j->ssr.high << 8 | j->ssr.low;
- retval = (retval * 256) / 240;
- return retval;
- }
- static void ixj_aec_start(IXJ *j, int level)
- {
- j->aec_level = level;
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "AGC set = 0x%2.2x\n", j->aec_level);
- if (!level) {
- aec_stop(j);
- } else {
- if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
- ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer */
- ixj_WriteDSPCommand(0x0300, j);
- }
- ixj_WriteDSPCommand(0xB001, j); /* AEC On */
- ixj_WriteDSPCommand(0xE013, j); /* Advanced AEC C1 */
- switch (level) {
- case AEC_LOW:
- ixj_WriteDSPCommand(0x0000, j); /* Advanced AEC C2 = off */
- ixj_WriteDSPCommand(0xE011, j);
- ixj_WriteDSPCommand(0xFFFF, j);
- ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
- ixj_WriteDSPCommand(0x0000, j); /* to off */
-
- break;
- case AEC_MED:
- ixj_WriteDSPCommand(0x0600, j); /* Advanced AEC C2 = on medium */
- ixj_WriteDSPCommand(0xE011, j);
- ixj_WriteDSPCommand(0x0080, j);
- ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
- ixj_WriteDSPCommand(0x0000, j); /* to off */
-
- break;
- case AEC_HIGH:
- ixj_WriteDSPCommand(0x0C00, j); /* Advanced AEC C2 = on high */
- ixj_WriteDSPCommand(0xE011, j);
- ixj_WriteDSPCommand(0x0080, j);
- ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
- ixj_WriteDSPCommand(0x0000, j); /* to off */
-
- break;
- case AEC_AGC:
- /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */
- ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
- ixj_WriteDSPCommand(0xE011, j);
- ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
- ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
- if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
- ixj_WriteDSPCommand(0x0224, j);
- else
- ixj_WriteDSPCommand(0x1224, j);
- ixj_WriteDSPCommand(0xE014, j);
- ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
- ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
- /* Now we can set the AGC initial parameters and turn it on */
- ixj_WriteDSPCommand(0xCF90, j); /* Set AGC Minumum gain */
- ixj_WriteDSPCommand(0x0020, j); /* to 0.125 (-18dB) */
-
- ixj_WriteDSPCommand(0xCF91, j); /* Set AGC Maximum gain */
- ixj_WriteDSPCommand(0x1000, j); /* to 16 (24dB) */
-
- ixj_WriteDSPCommand(0xCF92, j); /* Set AGC start gain */
- ixj_WriteDSPCommand(0x0800, j); /* to 8 (+18dB) */
-
- ixj_WriteDSPCommand(0xCF93, j); /* Set AGC hold time */
- ixj_WriteDSPCommand(0x1F40, j); /* to 2 seconds (units are 250us) */
-
- ixj_WriteDSPCommand(0xCF94, j); /* Set AGC Attack Time Constant */
- ixj_WriteDSPCommand(0x0005, j); /* to 8ms */
-
- ixj_WriteDSPCommand(0xCF95, j); /* Set AGC Decay Time Constant */
- ixj_WriteDSPCommand(0x000D, j); /* to 4096ms */
-
- ixj_WriteDSPCommand(0xCF96, j); /* Set AGC Attack Threshold */
- ixj_WriteDSPCommand(0x1200, j); /* to 25% */
-
- ixj_WriteDSPCommand(0xCF97, j); /* Set AGC Enable */
- ixj_WriteDSPCommand(0x0001, j); /* to on */
-
- break;
- case AEC_AUTO:
- ixj_WriteDSPCommand(0x0002, j); /* Attenuation scaling factor of 2 */
- ixj_WriteDSPCommand(0xE011, j);
- ixj_WriteDSPCommand(0x0100, j); /* Higher Threshold Floor */
- ixj_WriteDSPCommand(0xE012, j); /* Set Train and Lock */
- if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
- ixj_WriteDSPCommand(0x0224, j);
- else
- ixj_WriteDSPCommand(0x1224, j);
- ixj_WriteDSPCommand(0xE014, j);
- ixj_WriteDSPCommand(0x0003, j); /* Lock threashold at 3dB */
- ixj_WriteDSPCommand(0xE338, j); /* Set Echo Suppresser Attenuation to 0dB */
- break;
- }
- }
- }
- static void aec_stop(IXJ *j)
- {
- j->aec_level = AEC_OFF;
- if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
- ixj_WriteDSPCommand(0xE022, j); /* Move AEC filter buffer back */
- ixj_WriteDSPCommand(0x0700, j);
- }
- if (j->play_mode != -1 && j->rec_mode != -1)
- {
- ixj_WriteDSPCommand(0xB002, j); /* AEC Stop */
- }
- }
- static int set_play_codec(IXJ *j, int rate)
- {
- int retval = 0;
- j->play_codec = rate;
- switch (rate) {
- case G723_63:
- if (j->ver.low != 0x12 || ixj_convert_loaded) {
- j->play_frame_size = 12;
- j->play_mode = 0;
- } else {
- retval = 1;
- }
- break;
- case G723_53:
- if (j->ver.low != 0x12 || ixj_convert_loaded) {
- j->play_frame_size = 10;
- j->play_mode = 0;
- } else {
- retval = 1;
- }
- break;
- case TS85:
- if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
- j->play_frame_size = 16;
- j->play_mode = 0;
- } else {
- retval = 1;
- }
- break;
- case TS48:
- if (j->ver.low != 0x12 || ixj_convert_loaded) {
- j->play_frame_size = 9;
- j->play_mode = 0;
- } else {
- retval = 1;
- }
- break;
- case TS41:
- if (j->ver.low != 0x12 || ixj_convert_loaded) {
- j->play_frame_size = 8;
- j->play_mode = 0;
- } else {
- retval = 1;
- }
- break;
- case G728:
- if (j->dsp.low != 0x20) {
- j->play_frame_size = 48;
- j->play_mode = 0;
- } else {
- retval = 1;
- }
- break;
- case G729:
- if (j->dsp.low != 0x20) {
- if (!j->flags.g729_loaded) {
- retval = 1;
- break;
- }
- switch (j->baseframe.low) {
- case 0xA0:
- j->play_frame_size = 10;
- break;
- case 0x50:
- j->play_frame_size = 5;
- break;
- default:
- j->play_frame_size = 15;
- break;
- }
- j->play_mode = 0;
- } else {
- retval = 1;
- }
- break;
- case G729B:
- if (j->dsp.low != 0x20) {
- if (!j->flags.g729_loaded) {
- retval = 1;
- break;
- }
- switch (j->baseframe.low) {
- case 0xA0:
- j->play_frame_size = 12;
- break;
- case 0x50:
- j->play_frame_size = 6;
- break;
- default:
- j->play_frame_size = 18;
- break;
- }
- j->play_mode = 0;
- } else {
- retval = 1;
- }
- break;
- case ULAW:
- switch (j->baseframe.low) {
- case 0xA0:
- j->play_frame_size = 80;
- break;
- case 0x50:
- j->play_frame_size = 40;
- break;
- default:
- j->play_frame_size = 120;
- break;
- }
- j->play_mode = 2;
- break;
- case ALAW:
- switch (j->baseframe.low) {
- case 0xA0:
- j->play_frame_size = 80;
- break;
- case 0x50:
- j->play_frame_size = 40;
- break;
- default:
- j->play_frame_size = 120;
- break;
- }
- j->play_mode = 2;
- break;
- case LINEAR16:
- switch (j->baseframe.low) {
- case 0xA0:
- j->play_frame_size = 160;
- break;
- case 0x50:
- j->play_frame_size = 80;
- break;
- default:
- j->play_frame_size = 240;
- break;
- }
- j->play_mode = 6;
- break;
- case LINEAR8:
- switch (j->baseframe.low) {
- case 0xA0:
- j->play_frame_size = 80;
- break;
- case 0x50:
- j->play_frame_size = 40;
- break;
- default:
- j->play_frame_size = 120;
- break;
- }
- j->play_mode = 4;
- break;
- case WSS:
- switch (j->baseframe.low) {
- case 0xA0:
- j->play_frame_size = 80;
- break;
- case 0x50:
- j->play_frame_size = 40;
- break;
- default:
- j->play_frame_size = 120;
- break;
- }
- j->play_mode = 5;
- break;
- default:
- kfree(j->write_buffer);
- j->play_frame_size = 0;
- j->play_mode = -1;
- j->write_buffer = NULL;
- j->write_buffer_size = 0;
- retval = 1;
- break;
- }
- return retval;
- }
- static int ixj_play_start(IXJ *j)
- {
- unsigned short cmd = 0x0000;
- if (j->write_buffer) {
- ixj_play_stop(j);
- }
- if(ixjdebug & 0x0002)
- printk("IXJ %d Starting Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
- j->flags.playing = 1;
- ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
- j->flags.play_first_frame = 1;
- j->drybuffer = 0;
- if (!j->play_mode) {
- switch (j->play_codec) {
- case G723_63:
- cmd = 0x5231;
- break;
- case G723_53:
- cmd = 0x5232;
- break;
- case TS85:
- cmd = 0x5230; /* TrueSpeech 8.5 */
- break;
- case TS48:
- cmd = 0x5233; /* TrueSpeech 4.8 */
- break;
- case TS41:
- cmd = 0x5234; /* TrueSpeech 4.1 */
- break;
- case G728:
- cmd = 0x5235;
- break;
- case G729:
- case G729B:
- cmd = 0x5236;
- break;
- default:
- return 1;
- }
- if (ixj_WriteDSPCommand(cmd, j))
- return -1;
- }
- j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC);
- if (!j->write_buffer) {
- printk("Write buffer allocation for ixj board %d failed!\n", j->board);
- return -ENOMEM;
- }
- /* j->write_buffers_empty = 2; */
- j->write_buffers_empty = 1;
- j->write_buffer_size = j->play_frame_size * 2;
- j->write_buffer_end = j->write_buffer + j->play_frame_size * 2;
- j->write_buffer_rp = j->write_buffer_wp = j->write_buffer;
- if (ixj_WriteDSPCommand(0x5202, j)) /* Set Poll sync mode */
- return -1;
- switch (j->play_mode) {
- case 0:
- cmd = 0x2C03;
- break;
- case 2:
- if (j->ver.low == 0x12) {
- cmd = 0x2C23;
- } else {
- cmd = 0x2C21;
- }
- break;
- case 4:
- if (j->ver.low == 0x12) {
- cmd = 0x2C43;
- } else {
- cmd = 0x2C41;
- }
- break;
- case 5:
- if (j->ver.low == 0x12) {
- cmd = 0x2C53;
- } else {
- cmd = 0x2C51;
- }
- break;
- case 6:
- if (j->ver.low == 0x12) {
- cmd = 0x2C63;
- } else {
- cmd = 0x2C61;
- }
- break;
- }
- if (ixj_WriteDSPCommand(cmd, j))
- return -1;
- if (ixj_WriteDSPCommand(0x2000, j)) /* Playback C2 */
- return -1;
- if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j)) /* Playback C3 */
- return -1;
- if (j->flags.recording) {
- ixj_aec_start(j, j->aec_level);
- }
- return 0;
- }
- static void ixj_play_stop(IXJ *j)
- {
- if (ixjdebug & 0x0002)
- printk("IXJ %d Stopping Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
- kfree(j->write_buffer);
- j->write_buffer = NULL;
- j->write_buffer_size = 0;
- if (j->play_mode > -1) {
- ixj_WriteDSPCommand(0x5221, j); /* Stop playback and flush buffers. 8022 reference page 9-40 */
- j->play_mode = -1;
- }
- j->flags.playing = 0;
- }
- static inline int get_play_level(IXJ *j)
- {
- int retval;
- ixj_WriteDSPCommand(0xCF8F, j); /* 8022 Reference page 9-38 */
- return j->ssr.high << 8 | j->ssr.low;
- retval = j->ssr.high << 8 | j->ssr.low;
- retval = (retval * 256) / 240;
- return retval;
- }
- static unsigned int ixj_poll(struct file *file_p, poll_table * wait)
- {
- unsigned int mask = 0;
- IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode));
- poll_wait(file_p, &(j->poll_q), wait);
- if (j->read_buffer_ready > 0)
- mask |= POLLIN | POLLRDNORM; /* readable */
- if (j->write_buffers_empty > 0)
- mask |= POLLOUT | POLLWRNORM; /* writable */
- if (j->ex.bytes)
- mask |= POLLPRI;
- return mask;
- }
- static int ixj_play_tone(IXJ *j, char tone)
- {
- if (!j->tone_state) {
- if(ixjdebug & 0x0002) {
- printk("IXJ %d starting tone %d at %ld\n", j->board, tone, jiffies);
- }
- if (j->dsp.low == 0x20) {
- idle(j);
- }
- j->tone_start_jif = jiffies;
- j->tone_state = 1;
- }
- j->tone_index = tone;
- if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j))
- return -1;
- return 0;
- }
- static int ixj_set_tone_on(unsigned short arg, IXJ *j)
- {
- j->tone_on_time = arg;
- if (ixj_WriteDSPCommand(0x6E04, j)) /* Set Tone On Period */
- return -1;
- if (ixj_WriteDSPCommand(arg, j))
- return -1;
- return 0;
- }
- static int SCI_WaitHighSCI(IXJ *j)
- {
- int cnt;
- j->pld_scrr.byte = inb_p(j->XILINXbase);
- if (!j->pld_scrr.bits.sci) {
- for (cnt = 0; cnt < 10; cnt++) {
- udelay(32);
- j->pld_scrr.byte = inb_p(j->XILINXbase);
- if ((j->pld_scrr.bits.sci))
- return 1;
- }
- if (ixjdebug & 0x0001)
- printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte);
- return 0;
- } else
- return 1;
- }
- static int SCI_WaitLowSCI(IXJ *j)
- {
- int cnt;
- j->pld_scrr.byte = inb_p(j->XILINXbase);
- if (j->pld_scrr.bits.sci) {
- for (cnt = 0; cnt < 10; cnt++) {
- udelay(32);
- j->pld_scrr.byte = inb_p(j->XILINXbase);
- if (!(j->pld_scrr.bits.sci))
- return 1;
- }
- if (ixjdebug & 0x0001)
- printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte);
- return 0;
- } else
- return 1;
- }
- static int SCI_Control(IXJ *j, int control)
- {
- switch (control) {
- case SCI_End:
- j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
- j->pld_scrw.bits.c1 = 0; /* to no selection */
- break;
- case SCI_Enable_DAA:
- j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
- j->pld_scrw.bits.c1 = 0; /* to write to DAA */
- break;
- case SCI_Enable_Mixer:
- j->pld_scrw.bits.c0 = 0; /* Set PLD Serial control interface */
- j->pld_scrw.bits.c1 = 1; /* to write to mixer */
- break;
- case SCI_Enable_EEPROM:
- j->pld_scrw.bits.c0 = 1; /* Set PLD Serial control interface */
- j->pld_scrw.bits.c1 = 1; /* to write to EEPROM */
- break;
- default:
- return 0;
- break;
- }
- outb_p(j->pld_scrw.byte, j->XILINXbase);
- switch (control) {
- case SCI_End:
- return 1;
- break;
- case SCI_Enable_DAA:
- case SCI_Enable_Mixer:
- case SCI_Enable_EEPROM:
- if (!SCI_WaitHighSCI(j))
- return 0;
- break;
- default:
- return 0;
- break;
- }
- return 1;
- }
- static int SCI_Prepare(IXJ *j)
- {
- if (!SCI_Control(j, SCI_End))
- return 0;
- if (!SCI_WaitLowSCI(j))
- return 0;
- return 1;
- }
- static int ixj_get_mixer(long val, IXJ *j)
- {
- int reg = (val & 0x1F00) >> 8;
- return j->mix.vol[reg];
- }
- static int ixj_mixer(long val, IXJ *j)
- {
- BYTES bytes;
- bytes.high = (val & 0x1F00) >> 8;
- bytes.low = val & 0x00FF;
- /* save mixer value so we can get back later on */
- j->mix.vol[bytes.high] = bytes.low;
- outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03); /* Load Mixer Address */
- outb_p(bytes.low, j->XILINXbase + 0x02); /* Load Mixer Data */
- SCI_Control(j, SCI_Enable_Mixer);
- SCI_Control(j, SCI_End);
- return 0;
- }
- static int daa_load(BYTES * p_bytes, IXJ *j)
- {
- outb_p(p_bytes->high, j->XILINXbase + 0x03);
- outb_p(p_bytes->low, j->XILINXbase + 0x02);
- if (!SCI_Control(j, SCI_Enable_DAA))
- return 0;
- else
- return 1;
- }
- static int ixj_daa_cr4(IXJ *j, char reg)
- {
- BYTES bytes;
- switch (j->daa_mode) {
- case SOP_PU_SLEEP:
- bytes.high = 0x14;
- break;
- case SOP_PU_RINGING:
- bytes.high = 0x54;
- break;
- case SOP_PU_CONVERSATION:
- bytes.high = 0x94;
- break;
- case SOP_PU_PULSEDIALING:
- bytes.high = 0xD4;
- break;
- }
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg;
- switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {
- case 0:
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;
- break;
- case 1:
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2;
- break;
- case 2:
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1;
- break;
- case 3:
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3;
- break;
- }
- bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
- if (!daa_load(&bytes, j))
- return 0;
- if (!SCI_Prepare(j))
- return 0;
- return 1;
- }
- static char daa_int_read(IXJ *j)
- {
- BYTES bytes;
- if (!SCI_Prepare(j))
- return 0;
- bytes.high = 0x38;
- bytes.low = 0x00;
- outb_p(bytes.high, j->XILINXbase + 0x03);
- outb_p(bytes.low, j->XILINXbase + 0x02);
- if (!SCI_Control(j, SCI_Enable_DAA))
- return 0;
- bytes.high = inb_p(j->XILINXbase + 0x03);
- bytes.low = inb_p(j->XILINXbase + 0x02);
- if (bytes.low != ALISDAA_ID_BYTE) {
- if (ixjdebug & 0x0001)
- printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
- return 0;
- }
- if (!SCI_Control(j, SCI_Enable_DAA))
- return 0;
- if (!SCI_Control(j, SCI_End))
- return 0;
- bytes.high = inb_p(j->XILINXbase + 0x03);
- bytes.low = inb_p(j->XILINXbase + 0x02);
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high;
- return 1;
- }
- static char daa_CR_read(IXJ *j, int cr)
- {
- IXJ_WORD wdata;
- BYTES bytes;
- if (!SCI_Prepare(j))
- return 0;
- switch (j->daa_mode) {
- case SOP_PU_SLEEP:
- bytes.high = 0x30 + cr;
- break;
- case SOP_PU_RINGING:
- bytes.high = 0x70 + cr;
- break;
- case SOP_PU_CONVERSATION:
- bytes.high = 0xB0 + cr;
- break;
- case SOP_PU_PULSEDIALING:
- bytes.high = 0xF0 + cr;
- break;
- }
- bytes.low = 0x00;
- outb_p(bytes.high, j->XILINXbase + 0x03);
- outb_p(bytes.low, j->XILINXbase + 0x02);
- if (!SCI_Control(j, SCI_Enable_DAA))
- return 0;
- bytes.high = inb_p(j->XILINXbase + 0x03);
- bytes.low = inb_p(j->XILINXbase + 0x02);
- if (bytes.low != ALISDAA_ID_BYTE) {
- if (ixjdebug & 0x0001)
- printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
- return 0;
- }
- if (!SCI_Control(j, SCI_Enable_DAA))
- return 0;
- if (!SCI_Control(j, SCI_End))
- return 0;
- wdata.word = inw_p(j->XILINXbase + 0x02);
- switch(cr){
- case 5:
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = wdata.bytes.high;
- break;
- case 4:
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = wdata.bytes.high;
- break;
- case 3:
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = wdata.bytes.high;
- break;
- case 2:
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = wdata.bytes.high;
- break;
- case 1:
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = wdata.bytes.high;
- break;
- case 0:
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = wdata.bytes.high;
- break;
- default:
- return 0;
- }
- return 1;
- }
- static int ixj_daa_cid_reset(IXJ *j)
- {
- int i;
- BYTES bytes;
- if (ixjdebug & 0x0002)
- printk("DAA Clearing CID ram\n");
- if (!SCI_Prepare(j))
- return 0;
- bytes.high = 0x58;
- bytes.low = 0x00;
- outb_p(bytes.high, j->XILINXbase + 0x03);
- outb_p(bytes.low, j->XILINXbase + 0x02);
- if (!SCI_Control(j, SCI_Enable_DAA))
- return 0;
- if (!SCI_WaitHighSCI(j))
- return 0;
- for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) {
- bytes.high = bytes.low = 0x00;
- outb_p(bytes.high, j->XILINXbase + 0x03);
- if (i < ALISDAA_CALLERID_SIZE - 1)
- outb_p(bytes.low, j->XILINXbase + 0x02);
- if (!SCI_Control(j, SCI_Enable_DAA))
- return 0;
- if (!SCI_WaitHighSCI(j))
- return 0;
- }
- if (!SCI_Control(j, SCI_End))
- return 0;
- if (ixjdebug & 0x0002)
- printk("DAA CID ram cleared\n");
- return 1;
- }
- static int ixj_daa_cid_read(IXJ *j)
- {
- int i;
- BYTES bytes;
- char CID[ALISDAA_CALLERID_SIZE], mContinue;
- char *pIn, *pOut;
- if (!SCI_Prepare(j))
- return 0;
- bytes.high = 0x78;
- bytes.low = 0x00;
- outb_p(bytes.high, j->XILINXbase + 0x03);
- outb_p(bytes.low, j->XILINXbase + 0x02);
- if (!SCI_Control(j, SCI_Enable_DAA))
- return 0;
- if (!SCI_WaitHighSCI(j))
- return 0;
- bytes.high = inb_p(j->XILINXbase + 0x03);
- bytes.low = inb_p(j->XILINXbase + 0x02);
- if (bytes.low != ALISDAA_ID_BYTE) {
- if (ixjdebug & 0x0001)
- printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
- return 0;
- }
- for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) {
- bytes.high = bytes.low = 0x00;
- outb_p(bytes.high, j->XILINXbase + 0x03);
- outb_p(bytes.low, j->XILINXbase + 0x02);
- if (!SCI_Control(j, SCI_Enable_DAA))
- return 0;
- if (!SCI_WaitHighSCI(j))
- return 0;
- CID[i + 0] = inb_p(j->XILINXbase + 0x03);
- CID[i + 1] = inb_p(j->XILINXbase + 0x02);
- }
- if (!SCI_Control(j, SCI_End))
- return 0;
- pIn = CID;
- pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
- mContinue = 1;
- while (mContinue) {
- if ((pIn[1] & 0x03) == 0x01) {
- pOut[0] = pIn[0];
- }
- if ((pIn[2] & 0x0c) == 0x04) {
- pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2);
- }
- if ((pIn[3] & 0x30) == 0x10) {
- pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4);
- }
- if ((pIn[4] & 0xc0) == 0x40) {
- pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6);
- } else {
- mContinue = FALSE;
- }
- pIn += 5, pOut += 4;
- }
- memset(&j->cid, 0, sizeof(PHONE_CID));
- pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
- pOut += 4;
- strncpy(j->cid.month, pOut, 2);
- pOut += 2;
- strncpy(j->cid.day, pOut, 2);
- pOut += 2;
- strncpy(j->cid.hour, pOut, 2);
- pOut += 2;
- strncpy(j->cid.min, pOut, 2);
- pOut += 3;
- j->cid.numlen = *pOut;
- pOut += 1;
- strncpy(j->cid.number, pOut, j->cid.numlen);
- pOut += j->cid.numlen + 1;
- j->cid.namelen = *pOut;
- pOut += 1;
- strncpy(j->cid.name, pOut, j->cid.namelen);
- ixj_daa_cid_reset(j);
- return 1;
- }
- static char daa_get_version(IXJ *j)
- {
- BYTES bytes;
- if (!SCI_Prepare(j))
- return 0;
- bytes.high = 0x35;
- bytes.low = 0x00;
- outb_p(bytes.high, j->XILINXbase + 0x03);
- outb_p(bytes.low, j->XILINXbase + 0x02);
- if (!SCI_Control(j, SCI_Enable_DAA))
- return 0;
- bytes.high = inb_p(j->XILINXbase + 0x03);
- bytes.low = inb_p(j->XILINXbase + 0x02);
- if (bytes.low != ALISDAA_ID_BYTE) {
- if (ixjdebug & 0x0001)
- printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
- return 0;
- }
- if (!SCI_Control(j, SCI_Enable_DAA))
- return 0;
- if (!SCI_Control(j, SCI_End))
- return 0;
- bytes.high = inb_p(j->XILINXbase + 0x03);
- bytes.low = inb_p(j->XILINXbase + 0x02);
- if (ixjdebug & 0x0002)
- printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes.high, bytes.low);
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high;
- return bytes.high;
- }
- static int daa_set_mode(IXJ *j, int mode)
- {
- /* NOTE:
- The DAA *MUST* be in the conversation mode if the
- PSTN line is to be seized (PSTN line off-hook).
- Taking the PSTN line off-hook while the DAA is in
- a mode other than conversation mode will cause a
- hardware failure of the ALIS-A part.
- NOTE:
- The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
- if the PSTN line is on-hook. Failure to have the PSTN line
- in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
- ALIS-A part.
- */
- BYTES bytes;
- j->flags.pstn_rmr = 0;
- if (!SCI_Prepare(j))
- return 0;
- switch (mode) {
- case SOP_PU_RESET:
- j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
- outb_p(j->pld_scrw.byte, j->XILINXbase);
- j->pld_slicw.bits.rly2 = 0;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- bytes.high = 0x10;
- bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
- daa_load(&bytes, j);
- if (!SCI_Prepare(j))
- return 0;
- j->daa_mode = SOP_PU_SLEEP;
- break;
- case SOP_PU_SLEEP:
- if(j->daa_mode == SOP_PU_SLEEP)
- {
- break;
- }
- if (ixjdebug & 0x0008)
- printk(KERN_INFO "phone DAA: SOP_PU_SLEEP at %ld\n", jiffies);
- /* if(j->daa_mode == SOP_PU_CONVERSATION) */
- {
- j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
- outb_p(j->pld_scrw.byte, j->XILINXbase);
- j->pld_slicw.bits.rly2 = 0;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- bytes.high = 0x10;
- bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
- daa_load(&bytes, j);
- if (!SCI_Prepare(j))
- return 0;
- }
- j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
- outb_p(j->pld_scrw.byte, j->XILINXbase);
- j->pld_slicw.bits.rly2 = 0;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- bytes.high = 0x10;
- bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
- daa_load(&bytes, j);
- if (!SCI_Prepare(j))
- return 0;
- j->daa_mode = SOP_PU_SLEEP;
- j->flags.pstn_ringing = 0;
- j->ex.bits.pstn_ring = 0;
- j->pstn_sleeptil = jiffies + (hertz / 4);
- wake_up_interruptible(&j->read_q); /* Wake any blocked readers */
- wake_up_interruptible(&j->write_q); /* Wake any blocked writers */
- wake_up_interruptible(&j->poll_q); /* Wake any blocked selects */
- break;
- case SOP_PU_RINGING:
- if (ixjdebug & 0x0008)
- printk(KERN_INFO "phone DAA: SOP_PU_RINGING at %ld\n", jiffies);
- j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
- outb_p(j->pld_scrw.byte, j->XILINXbase);
- j->pld_slicw.bits.rly2 = 0;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- bytes.high = 0x50;
- bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
- daa_load(&bytes, j);
- if (!SCI_Prepare(j))
- return 0;
- j->daa_mode = SOP_PU_RINGING;
- break;
- case SOP_PU_CONVERSATION:
- if (ixjdebug & 0x0008)
- printk(KERN_INFO "phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies);
- bytes.high = 0x90;
- bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
- daa_load(&bytes, j);
- if (!SCI_Prepare(j))
- return 0;
- j->pld_slicw.bits.rly2 = 1;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- j->pld_scrw.bits.daafsyncen = 1; /* Turn on DAA Frame Sync */
- outb_p(j->pld_scrw.byte, j->XILINXbase);
- j->daa_mode = SOP_PU_CONVERSATION;
- j->flags.pstn_ringing = 0;
- j->ex.bits.pstn_ring = 0;
- j->pstn_sleeptil = jiffies;
- j->pstn_ring_start = j->pstn_ring_stop = j->pstn_ring_int = 0;
- break;
- case SOP_PU_PULSEDIALING:
- if (ixjdebug & 0x0008)
- printk(KERN_INFO "phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies);
- j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
- outb_p(j->pld_scrw.byte, j->XILINXbase);
- j->pld_slicw.bits.rly2 = 0;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- bytes.high = 0xD0;
- bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
- daa_load(&bytes, j);
- if (!SCI_Prepare(j))
- return 0;
- j->daa_mode = SOP_PU_PULSEDIALING;
- break;
- default:
- break;
- }
- return 1;
- }
- static int ixj_daa_write(IXJ *j)
- {
- BYTES bytes;
- j->flags.pstncheck = 1;
- daa_set_mode(j, SOP_PU_SLEEP);
- if (!SCI_Prepare(j))
- return 0;
- outb_p(j->pld_scrw.byte, j->XILINXbase);
- bytes.high = 0x14;
- bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg;
- bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg;
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg;
- bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
- if (!daa_load(&bytes, j))
- return 0;
- if (!SCI_Prepare(j))
- return 0;
- bytes.high = 0x1F;
- bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg;
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg;
- bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg;
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg;
- bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg;
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg;
- bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg;
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg;
- bytes.low = 0x00;
- if (!daa_load(&bytes, j))
- return 0;
- if (!SCI_Prepare(j))
- return 0;
- bytes.high = 0x00;
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0];
- bytes.low = 0x00;
- if (!daa_load(&bytes, j))
- return 0;
- if (!SCI_Control(j, SCI_End))
- return 0;
- if (!SCI_WaitLowSCI(j))
- return 0;
- bytes.high = 0x01;
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0];
- bytes.low = 0x00;
- if (!daa_load(&bytes, j))
- return 0;
- if (!SCI_Control(j, SCI_End))
- return 0;
- if (!SCI_WaitLowSCI(j))
- return 0;
- bytes.high = 0x02;
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0];
- bytes.low = 0x00;
- if (!daa_load(&bytes, j))
- return 0;
- if (!SCI_Control(j, SCI_End))
- return 0;
- if (!SCI_WaitLowSCI(j))
- return 0;
- bytes.high = 0x03;
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0];
- bytes.low = 0x00;
- if (!daa_load(&bytes, j))
- return 0;
- if (!SCI_Control(j, SCI_End))
- return 0;
- if (!SCI_WaitLowSCI(j))
- return 0;
- bytes.high = 0x04;
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0];
- bytes.low = 0x00;
- if (!daa_load(&bytes, j))
- return 0;
- if (!SCI_Control(j, SCI_End))
- return 0;
- if (!SCI_WaitLowSCI(j))
- return 0;
- bytes.high = 0x05;
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0];
- bytes.low = 0x00;
- if (!daa_load(&bytes, j))
- return 0;
- if (!SCI_Control(j, SCI_End))
- return 0;
- if (!SCI_WaitLowSCI(j))
- return 0;
- bytes.high = 0x06;
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0];
- bytes.low = 0x00;
- if (!daa_load(&bytes, j))
- return 0;
- if (!SCI_Control(j, SCI_End))
- return 0;
- if (!SCI_WaitLowSCI(j))
- return 0;
- bytes.high = 0x07;
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0];
- bytes.low = 0x00;
- if (!daa_load(&bytes, j))
- return 0;
- if (!SCI_Control(j, SCI_End))
- return 0;
- if (!SCI_WaitLowSCI(j))
- return 0;
- bytes.high = 0x08;
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0];
- bytes.low = 0x00;
- if (!daa_load(&bytes, j))
- return 0;
- if (!SCI_Control(j, SCI_End))
- return 0;
- if (!SCI_WaitLowSCI(j))
- return 0;
- bytes.high = 0x09;
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0];
- bytes.low = 0x00;
- if (!daa_load(&bytes, j))
- return 0;
- if (!SCI_Control(j, SCI_End))
- return 0;
- if (!SCI_WaitLowSCI(j))
- return 0;
- bytes.high = 0x0A;
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0];
- bytes.low = 0x00;
- if (!daa_load(&bytes, j))
- return 0;
- if (!SCI_Control(j, SCI_End))
- return 0;
- if (!SCI_WaitLowSCI(j))
- return 0;
- bytes.high = 0x0B;
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0];
- bytes.low = 0x00;
- if (!daa_load(&bytes, j))
- return 0;
- if (!SCI_Control(j, SCI_End))
- return 0;
- if (!SCI_WaitLowSCI(j))
- return 0;
- bytes.high = 0x0C;
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0];
- bytes.low = 0x00;
- if (!daa_load(&bytes, j))
- return 0;
- if (!SCI_Control(j, SCI_End))
- return 0;
- if (!SCI_WaitLowSCI(j))
- return 0;
- bytes.high = 0x0D;
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0];
- bytes.low = 0x00;
- if (!daa_load(&bytes, j))
- return 0;
- if (!SCI_Control(j, SCI_End))
- return 0;
- if (!SCI_WaitLowSCI(j))
- return 0;
- bytes.high = 0x0E;
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0];
- bytes.low = 0x00;
- if (!daa_load(&bytes, j))
- return 0;
- if (!SCI_Control(j, SCI_End))
- return 0;
- if (!SCI_WaitLowSCI(j))
- return 0;
- bytes.high = 0x0F;
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2];
- bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1];
- if (!daa_load(&bytes, j))
- return 0;
- bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0];
- bytes.low = 0x00;
- if (!daa_load(&bytes, j))
- return 0;
- udelay(32);
- j->pld_scrr.byte = inb_p(j->XILINXbase);
- if (!SCI_Control(j, SCI_End))
- return 0;
- outb_p(j->pld_scrw.byte, j->XILINXbase);
- if (ixjdebug & 0x0002)
- printk("DAA Coefficients Loaded\n");
- j->flags.pstncheck = 0;
- return 1;
- }
- int ixj_set_tone_off(unsigned short arg, IXJ *j)
- {
- j->tone_off_time = arg;
- if (ixj_WriteDSPCommand(0x6E05, j)) /* Set Tone Off Period */
- return -1;
- if (ixj_WriteDSPCommand(arg, j))
- return -1;
- return 0;
- }
- static int ixj_get_tone_on(IXJ *j)
- {
- if (ixj_WriteDSPCommand(0x6E06, j)) /* Get Tone On Period */
- return -1;
- return 0;
- }
- static int ixj_get_tone_off(IXJ *j)
- {
- if (ixj_WriteDSPCommand(0x6E07, j)) /* Get Tone Off Period */
- return -1;
- return 0;
- }
- static void ixj_busytone(IXJ *j)
- {
- j->flags.ringback = 0;
- j->flags.dialtone = 0;
- j->flags.busytone = 1;
- ixj_set_tone_on(0x07D0, j);
- ixj_set_tone_off(0x07D0, j);
- ixj_play_tone(j, 27);
- }
- static void ixj_dialtone(IXJ *j)
- {
- j->flags.ringback = 0;
- j->flags.dialtone = 1;
- j->flags.busytone = 0;
- if (j->dsp.low == 0x20) {
- return;
- } else {
- ixj_set_tone_on(0xFFFF, j);
- ixj_set_tone_off(0x0000, j);
- ixj_play_tone(j, 25);
- }
- }
- static void ixj_cpt_stop(IXJ *j)
- {
- if(j->tone_state || j->tone_cadence_state)
- {
- j->flags.dialtone = 0;
- j->flags.busytone = 0;
- j->flags.ringback = 0;
- ixj_set_tone_on(0x0001, j);
- ixj_set_tone_off(0x0000, j);
- ixj_play_tone(j, 0);
- j->tone_state = j->tone_cadence_state = 0;
- if (j->cadence_t) {
- kfree(j->cadence_t->ce);
- kfree(j->cadence_t);
- j->cadence_t = NULL;
- }
- }
- if (j->play_mode == -1 && j->rec_mode == -1)
- idle(j);
- if (j->play_mode != -1 && j->dsp.low == 0x20)
- ixj_play_start(j);
- if (j->rec_mode != -1 && j->dsp.low == 0x20)
- ixj_record_start(j);
- }
- static void ixj_ringback(IXJ *j)
- {
- j->flags.busytone = 0;
- j->flags.dialtone = 0;
- j->flags.ringback = 1;
- ixj_set_tone_on(0x0FA0, j);
- ixj_set_tone_off(0x2EE0, j);
- ixj_play_tone(j, 26);
- }
- static void ixj_testram(IXJ *j)
- {
- ixj_WriteDSPCommand(0x3001, j); /* Test External SRAM */
- }
- static int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp)
- {
- ixj_cadence *lcp;
- IXJ_CADENCE_ELEMENT __user *cep;
- IXJ_CADENCE_ELEMENT *lcep;
- IXJ_TONE ti;
- int err;
- lcp = kmalloc(sizeof(ixj_cadence), GFP_KERNEL);
- if (lcp == NULL)
- return -ENOMEM;
- err = -EFAULT;
- if (copy_from_user(&lcp->elements_used,
- &cp->elements_used, sizeof(int)))
- goto out;
- if (copy_from_user(&lcp->termination,
- &cp->termination, sizeof(IXJ_CADENCE_TERM)))
- goto out;
- if (get_user(cep, &cp->ce))
- goto out;
- err = -EINVAL;
- if ((unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE_ELEMENT))
- goto out;
- err = -ENOMEM;
- lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
- if (!lcep)
- goto out;
- err = -EFAULT;
- if (copy_from_user(lcep, cep, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used))
- goto out1;
- if (j->cadence_t) {
- kfree(j->cadence_t->ce);
- kfree(j->cadence_t);
- }
- lcp->ce = (void *) lcep;
- j->cadence_t = lcp;
- j->tone_cadence_state = 0;
- ixj_set_tone_on(lcp->ce[0].tone_on_time, j);
- ixj_set_tone_off(lcp->ce[0].tone_off_time, j);
- if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
- ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
- ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
- ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
- ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
- ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
- ixj_init_tone(j, &ti);
- }
- ixj_play_tone(j, lcp->ce[0].index);
- return 1;
- out1:
- kfree(lcep);
- out:
- kfree(lcp);
- return err;
- }
- static int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp)
- {
- IXJ_FILTER_CADENCE *lcp;
- lcp = kmalloc(sizeof(IXJ_FILTER_CADENCE), GFP_KERNEL);
- if (lcp == NULL) {
- if(ixjdebug & 0x0001) {
- printk(KERN_INFO "Could not allocate memory for cadence\n");
- }
- return -ENOMEM;
- }
- if (copy_from_user(lcp, cp, sizeof(IXJ_FILTER_CADENCE))) {
- if(ixjdebug & 0x0001) {
- printk(KERN_INFO "Could not copy cadence to kernel\n");
- }
- kfree(lcp);
- return -EFAULT;
- }
- if (lcp->filter > 5) {
- if(ixjdebug & 0x0001) {
- printk(KERN_INFO "Cadence out of range\n");
- }
- kfree(lcp);
- return -1;
- }
- j->cadence_f[lcp->filter].state = 0;
- j->cadence_f[lcp->filter].enable = lcp->enable;
- j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter;
- j->cadence_f[lcp->filter].on1 = lcp->on1;
- j->cadence_f[lcp->filter].on1min = 0;
- j->cadence_f[lcp->filter].on1max = 0;
- j->cadence_f[lcp->filter].off1 = lcp->off1;
- j->cadence_f[lcp->filter].off1min = 0;
- j->cadence_f[lcp->filter].off1max = 0;
- j->cadence_f[lcp->filter].on2 = lcp->on2;
- j->cadence_f[lcp->filter].on2min = 0;
- j->cadence_f[lcp->filter].on2max = 0;
- j->cadence_f[lcp->filter].off2 = lcp->off2;
- j->cadence_f[lcp->filter].off2min = 0;
- j->cadence_f[lcp->filter].off2max = 0;
- j->cadence_f[lcp->filter].on3 = lcp->on3;
- j->cadence_f[lcp->filter].on3min = 0;
- j->cadence_f[lcp->filter].on3max = 0;
- j->cadence_f[lcp->filter].off3 = lcp->off3;
- j->cadence_f[lcp->filter].off3min = 0;
- j->cadence_f[lcp->filter].off3max = 0;
- if(ixjdebug & 0x0002) {
- printk(KERN_INFO "Cadence %d loaded\n", lcp->filter);
- }
- kfree(lcp);
- return 0;
- }
- static void add_caps(IXJ *j)
- {
- j->caps = 0;
- j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET;
- strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)");
- j->caplist[j->caps].captype = vendor;
- j->caplist[j->caps].handle = j->caps++;
- j->caplist[j->caps].captype = device;
- switch (j->cardtype) {
- case QTI_PHONEJACK:
- strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK");
- break;
- case QTI_LINEJACK:
- strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK");
- break;
- case QTI_PHONEJACK_LITE:
- strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite");
- break;
- case QTI_PHONEJACK_PCI:
- strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI");
- break;
- case QTI_PHONECARD:
- strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneCARD");
- break;
- }
- j->caplist[j->caps].cap = j->cardtype;
- j->caplist[j->caps].handle = j->caps++;
- strcpy(j->caplist[j->caps].desc, "POTS");
- j->caplist[j->caps].captype = port;
- j->caplist[j->caps].cap = pots;
- j->caplist[j->caps].handle = j->caps++;
- /* add devices that can do speaker/mic */
- switch (j->cardtype) {
- case QTI_PHONEJACK:
- case QTI_LINEJACK:
- case QTI_PHONEJACK_PCI:
- case QTI_PHONECARD:
- strcpy(j->caplist[j->caps].desc, "SPEAKER");
- j->caplist[j->caps].captype = port;
- j->caplist[j->caps].cap = speaker;
- j->caplist[j->caps].handle = j->caps++;
- default:
- break;
- }
- /* add devices that can do handset */
- switch (j->cardtype) {
- case QTI_PHONEJACK:
- strcpy(j->caplist[j->caps].desc, "HANDSET");
- j->caplist[j->caps].captype = port;
- j->caplist[j->caps].cap = handset;
- j->caplist[j->caps].handle = j->caps++;
- break;
- default:
- break;
- }
- /* add devices that can do PSTN */
- switch (j->cardtype) {
- case QTI_LINEJACK:
- strcpy(j->caplist[j->caps].desc, "PSTN");
- j->caplist[j->caps].captype = port;
- j->caplist[j->caps].cap = pstn;
- j->caplist[j->caps].handle = j->caps++;
- break;
- default:
- break;
- }
- /* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */
- strcpy(j->caplist[j->caps].desc, "ULAW");
- j->caplist[j->caps].captype = codec;
- j->caplist[j->caps].cap = ULAW;
- j->caplist[j->caps].handle = j->caps++;
- strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit");
- j->caplist[j->caps].captype = codec;
- j->caplist[j->caps].cap = LINEAR16;
- j->caplist[j->caps].handle = j->caps++;
- strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit");
- j->caplist[j->caps].captype = codec;
- j->caplist[j->caps].cap = LINEAR8;
- j->caplist[j->caps].handle = j->caps++;
- strcpy(j->caplist[j->caps].desc, "Windows Sound System");
- j->caplist[j->caps].captype = codec;
- j->caplist[j->caps].cap = WSS;
- j->caplist[j->caps].handle = j->caps++;
- /* software ALAW codec, made from ULAW */
- strcpy(j->caplist[j->caps].desc, "ALAW");
- j->caplist[j->caps].captype = codec;
- j->caplist[j->caps].cap = ALAW;
- j->caplist[j->caps].handle = j->caps++;
- /* version 12 of the 8020 does the following codecs in a broken way */
- if (j->dsp.low != 0x20 || j->ver.low != 0x12) {
- strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps");
- j->caplist[j->caps].captype = codec;
- j->caplist[j->caps].cap = G723_63;
- j->caplist[j->caps].handle = j->caps++;
- strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps");
- j->caplist[j->caps].captype = codec;
- j->caplist[j->caps].cap = G723_53;
- j->caplist[j->caps].handle = j->caps++;
- strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8kbps");
- j->caplist[j->caps].captype = codec;
- j->caplist[j->caps].cap = TS48;
- j->caplist[j->caps].handle = j->caps++;
- strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1kbps");
- j->caplist[j->caps].captype = codec;
- j->caplist[j->caps].cap = TS41;
- j->caplist[j->caps].handle = j->caps++;
- }
- /* 8020 chips can do TS8.5 native, and 8021/8022 can load it */
- if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
- strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5kbps");
- j->caplist[j->caps].captype = codec;
- j->caplist[j->caps].cap = TS85;
- j->caplist[j->caps].handle = j->caps++;
- }
- /* 8021 chips can do G728 */
- if (j->dsp.low == 0x21) {
- strcpy(j->caplist[j->caps].desc, "G.728 16kbps");
- j->caplist[j->caps].captype = codec;
- j->caplist[j->caps].cap = G728;
- j->caplist[j->caps].handle = j->caps++;
- }
- /* 8021/8022 chips can do G729 if loaded */
- if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
- strcpy(j->caplist[j->caps].desc, "G.729A 8kbps");
- j->caplist[j->caps].captype = codec;
- j->caplist[j->caps].cap = G729;
- j->caplist[j->caps].handle = j->caps++;
- }
- if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
- strcpy(j->caplist[j->caps].desc, "G.729B 8kbps");
- j->caplist[j->caps].captype = codec;
- j->caplist[j->caps].cap = G729B;
- j->caplist[j->caps].handle = j->caps++;
- }
- }
- static int capabilities_check(IXJ *j, struct phone_capability *pcreq)
- {
- int cnt;
- int retval = 0;
- for (cnt = 0; cnt < j->caps; cnt++) {
- if (pcreq->captype == j->caplist[cnt].captype
- && pcreq->cap == j->caplist[cnt].cap) {
- retval = 1;
- break;
- }
- }
- return retval;
- }
- static int ixj_ioctl(struct inode *inode, struct file *file_p, unsigned int cmd, unsigned long arg)
- {
- IXJ_TONE ti;
- IXJ_FILTER jf;
- IXJ_FILTER_RAW jfr;
- void __user *argp = (void __user *)arg;
- unsigned int raise, mant;
- unsigned int minor = iminor(inode);
- int board = NUM(inode);
- IXJ *j = get_ixj(NUM(inode));
- int retval = 0;
- /*
- * Set up locks to ensure that only one process is talking to the DSP at a time.
- * This is necessary to keep the DSP from locking up.
- */
- while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
- schedule_timeout_interruptible(1);
- if (ixjdebug & 0x0040)
- printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
- if (minor >= IXJMAX) {
- clear_bit(board, &j->busyflags);
- return -ENODEV;
- }
- /*
- * Check ioctls only root can use.
- */
- if (!capable(CAP_SYS_ADMIN)) {
- switch (cmd) {
- case IXJCTL_TESTRAM:
- case IXJCTL_HZ:
- retval = -EPERM;
- }
- }
- switch (cmd) {
- case IXJCTL_TESTRAM:
- ixj_testram(j);
- retval = (j->ssr.high << 8) + j->ssr.low;
- break;
- case IXJCTL_CARDTYPE:
- retval = j->cardtype;
- break;
- case IXJCTL_SERIAL:
- retval = j->serial;
- break;
- case IXJCTL_VERSION:
- {
- char arg_str[100];
- snprintf(arg_str, sizeof(arg_str),
- "\nDriver version %i.%i.%i", IXJ_VER_MAJOR,
- IXJ_VER_MINOR, IXJ_BLD_VER);
- if (copy_to_user(argp, arg_str, strlen(arg_str)))
- retval = -EFAULT;
- }
- break;
- case PHONE_RING_CADENCE:
- j->ring_cadence = arg;
- break;
- case IXJCTL_CIDCW:
- if(arg) {
- if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
- retval = -EFAULT;
- break;
- }
- } else {
- memset(&j->cid_send, 0, sizeof(PHONE_CID));
- }
- ixj_write_cidcw(j);
- break;
- /* Binary compatbility */
- case OLD_PHONE_RING_START:
- arg = 0;
- /* Fall through */
- case PHONE_RING_START:
- if(arg) {
- if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
- retval = -EFAULT;
- break;
- }
- ixj_write_cid(j);
- } else {
- memset(&j->cid_send, 0, sizeof(PHONE_CID));
- }
- ixj_ring_start(j);
- break;
- case PHONE_RING_STOP:
- j->flags.cringing = 0;
- if(j->cadence_f[5].enable) {
- j->cadence_f[5].state = 0;
- }
- ixj_ring_off(j);
- break;
- case PHONE_RING:
- retval = ixj_ring(j);
- break;
- case PHONE_EXCEPTION:
- retval = j->ex.bytes;
- if(j->ex.bits.flash) {
- j->flash_end = 0;
- j->ex.bits.flash = 0;
- }
- j->ex.bits.pstn_ring = 0;
- j->ex.bits.caller_id = 0;
- j->ex.bits.pstn_wink = 0;
- j->ex.bits.f0 = 0;
- j->ex.bits.f1 = 0;
- j->ex.bits.f2 = 0;
- j->ex.bits.f3 = 0;
- j->ex.bits.fc0 = 0;
- j->ex.bits.fc1 = 0;
- j->ex.bits.fc2 = 0;
- j->ex.bits.fc3 = 0;
- j->ex.bits.reserved = 0;
- break;
- case PHONE_HOOKSTATE:
- j->ex.bits.hookstate = 0;
- retval = j->hookstate; //j->r_hook;
- break;
- case IXJCTL_SET_LED:
- LED_SetState(arg, j);
- break;
- case PHONE_FRAME:
- retval = set_base_frame(j, arg);
- break;
- case PHONE_REC_CODEC:
- retval = set_rec_codec(j, arg);
- break;
- case PHONE_VAD:
- ixj_vad(j, arg);
- break;
- case PHONE_REC_START:
- ixj_record_start(j);
- break;
- case PHONE_REC_STOP:
- ixj_record_stop(j);
- break;
- case PHONE_REC_DEPTH:
- set_rec_depth(j, arg);
- break;
- case PHONE_REC_VOLUME:
- if(arg == -1) {
- retval = get_rec_volume(j);
- }
- else {
- set_rec_volume(j, arg);
- retval = arg;
- }
- break;
- case PHONE_REC_VOLUME_LINEAR:
- if(arg == -1) {
- retval = get_rec_volume_linear(j);
- }
- else {
- set_rec_volume_linear(j, arg);
- retval = arg;
- }
- break;
- case IXJCTL_DTMF_PRESCALE:
- if(arg == -1) {
- retval = get_dtmf_prescale(j);
- }
- else {
- set_dtmf_prescale(j, arg);
- retval = arg;
- }
- break;
- case PHONE_REC_LEVEL:
- retval = get_rec_level(j);
- break;
- case IXJCTL_SC_RXG:
- retval = ixj_siadc(j, arg);
- break;
- case IXJCTL_SC_TXG:
- retval = ixj_sidac(j, arg);
- break;
- case IXJCTL_AEC_START:
- ixj_aec_start(j, arg);
- break;
- case IXJCTL_AEC_STOP:
- aec_stop(j);
- break;
- case IXJCTL_AEC_GET_LEVEL:
- retval = j->aec_level;
- break;
- case PHONE_PLAY_CODEC:
- retval = set_play_codec(j, arg);
- break;
- case PHONE_PLAY_START:
- retval = ixj_play_start(j);
- break;
- case PHONE_PLAY_STOP:
- ixj_play_stop(j);
- break;
- case PHONE_PLAY_DEPTH:
- set_play_depth(j, arg);
- break;
- case PHONE_PLAY_VOLUME:
- if(arg == -1) {
- retval = get_play_volume(j);
- }
- else {
- set_play_volume(j, arg);
- retval = arg;
- }
- break;
- case PHONE_PLAY_VOLUME_LINEAR:
- if(arg == -1) {
- retval = get_play_volume_linear(j);
- }
- else {
- set_play_volume_linear(j, arg);
- retval = arg;
- }
- break;
- case PHONE_PLAY_LEVEL:
- retval = get_play_level(j);
- break;
- case IXJCTL_DSP_TYPE:
- retval = (j->dsp.high << 8) + j->dsp.low;
- break;
- case IXJCTL_DSP_VERSION:
- retval = (j->ver.high << 8) + j->ver.low;
- break;
- case IXJCTL_HZ:
- hertz = arg;
- break;
- case IXJCTL_RATE:
- if (arg > hertz)
- retval = -1;
- else
- samplerate = arg;
- break;
- case IXJCTL_DRYBUFFER_READ:
- put_user(j->drybuffer, (unsigned long __user *) argp);
- break;
- case IXJCTL_DRYBUFFER_CLEAR:
- j->drybuffer = 0;
- break;
- case IXJCTL_FRAMES_READ:
- put_user(j->framesread, (unsigned long __user *) argp);
- break;
- case IXJCTL_FRAMES_WRITTEN:
- put_user(j->frameswritten, (unsigned long __user *) argp);
- break;
- case IXJCTL_READ_WAIT:
- put_user(j->read_wait, (unsigned long __user *) argp);
- break;
- case IXJCTL_WRITE_WAIT:
- put_user(j->write_wait, (unsigned long __user *) argp);
- break;
- case PHONE_MAXRINGS:
- j->maxrings = arg;
- break;
- case PHONE_SET_TONE_ON_TIME:
- ixj_set_tone_on(arg, j);
- break;
- case PHONE_SET_TONE_OFF_TIME:
- ixj_set_tone_off(arg, j);
- break;
- case PHONE_GET_TONE_ON_TIME:
- if (ixj_get_tone_on(j)) {
- retval = -1;
- } else {
- retval = (j->ssr.high << 8) + j->ssr.low;
- }
- break;
- case PHONE_GET_TONE_OFF_TIME:
- if (ixj_get_tone_off(j)) {
- retval = -1;
- } else {
- retval = (j->ssr.high << 8) + j->ssr.low;
- }
- break;
- case PHONE_PLAY_TONE:
- if (!j->tone_state)
- retval = ixj_play_tone(j, arg);
- else
- retval = -1;
- break;
- case PHONE_GET_TONE_STATE:
- retval = j->tone_state;
- break;
- case PHONE_DTMF_READY:
- retval = j->ex.bits.dtmf_ready;
- break;
- case PHONE_GET_DTMF:
- if (ixj_hookstate(j)) {
- if (j->dtmf_rp != j->dtmf_wp) {
- retval = j->dtmfbuffer[j->dtmf_rp];
- j->dtmf_rp++;
- if (j->dtmf_rp == 79)
- j->dtmf_rp = 0;
- if (j->dtmf_rp == j->dtmf_wp) {
- j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
- }
- }
- }
- break;
- case PHONE_GET_DTMF_ASCII:
- if (ixj_hookstate(j)) {
- if (j->dtmf_rp != j->dtmf_wp) {
- switch (j->dtmfbuffer[j->dtmf_rp]) {
- case 10:
- retval = 42; /* '*'; */
- break;
- case 11:
- retval = 48; /*'0'; */
- break;
- case 12:
- retval = 35; /*'#'; */
- break;
- case 28:
- retval = 65; /*'A'; */
- break;
- case 29:
- retval = 66; /*'B'; */
- break;
- case 30:
- retval = 67; /*'C'; */
- break;
- case 31:
- retval = 68; /*'D'; */
- break;
- default:
- retval = 48 + j->dtmfbuffer[j->dtmf_rp];
- break;
- }
- j->dtmf_rp++;
- if (j->dtmf_rp == 79)
- j->dtmf_rp = 0;
- if(j->dtmf_rp == j->dtmf_wp)
- {
- j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
- }
- }
- }
- break;
- case PHONE_DTMF_OOB:
- j->flags.dtmf_oob = arg;
- break;
- case PHONE_DIALTONE:
- ixj_dialtone(j);
- break;
- case PHONE_BUSY:
- ixj_busytone(j);
- break;
- case PHONE_RINGBACK:
- ixj_ringback(j);
- break;
- case PHONE_WINK:
- if(j->cardtype == QTI_PHONEJACK)
- retval = -1;
- else
- retval = ixj_wink(j);
- break;
- case PHONE_CPT_STOP:
- ixj_cpt_stop(j);
- break;
- case PHONE_QUERY_CODEC:
- {
- struct phone_codec_data pd;
- int val;
- int proto_size[] = {
- -1,
- 12, 10, 16, 9, 8, 48, 5,
- 40, 40, 80, 40, 40, 6
- };
- if(copy_from_user(&pd, argp, sizeof(pd))) {
- retval = -EFAULT;
- break;
- }
- if(pd.type<1 || pd.type>13) {
- retval = -EPROTONOSUPPORT;
- break;
- }
- if(pd.type<G729)
- val=proto_size[pd.type];
- else switch(j->baseframe.low)
- {
- case 0xA0:val=2*proto_size[pd.type];break;
- case 0x50:val=proto_size[pd.type];break;
- default:val=proto_size[pd.type]*3;break;
- }
- pd.buf_min=pd.buf_max=pd.buf_opt=val;
- if(copy_to_user(argp, &pd, sizeof(pd)))
- retval = -EFAULT;
- break;
- }
- case IXJCTL_DSP_IDLE:
- idle(j);
- break;
- case IXJCTL_MIXER:
- if ((arg & 0xff) == 0xff)
- retval = ixj_get_mixer(arg, j);
- else
- ixj_mixer(arg, j);
- break;
- case IXJCTL_DAA_COEFF_SET:
- switch (arg) {
- case DAA_US:
- DAA_Coeff_US(j);
- retval = ixj_daa_write(j);
- break;
- case DAA_UK:
- DAA_Coeff_UK(j);
- retval = ixj_daa_write(j);
- break;
- case DAA_FRANCE:
- DAA_Coeff_France(j);
- retval = ixj_daa_write(j);
- break;
- case DAA_GERMANY:
- DAA_Coeff_Germany(j);
- retval = ixj_daa_write(j);
- break;
- case DAA_AUSTRALIA:
- DAA_Coeff_Australia(j);
- retval = ixj_daa_write(j);
- break;
- case DAA_JAPAN:
- DAA_Coeff_Japan(j);
- retval = ixj_daa_write(j);
- break;
- default:
- retval = 1;
- break;
- }
- break;
- case IXJCTL_DAA_AGAIN:
- ixj_daa_cr4(j, arg | 0x02);
- break;
- case IXJCTL_PSTN_LINETEST:
- retval = ixj_linetest(j);
- break;
- case IXJCTL_VMWI:
- ixj_write_vmwi(j, arg);
- break;
- case IXJCTL_CID:
- if (copy_to_user(argp, &j->cid, sizeof(PHONE_CID)))
- retval = -EFAULT;
- j->ex.bits.caller_id = 0;
- break;
- case IXJCTL_WINK_DURATION:
- j->winktime = arg;
- break;
- case IXJCTL_PORT:
- if (arg)
- retval = ixj_set_port(j, arg);
- else
- retval = j->port;
- break;
- case IXJCTL_POTS_PSTN:
- retval = ixj_set_pots(j, arg);
- break;
- case PHONE_CAPABILITIES:
- add_caps(j);
- retval = j->caps;
- break;
- case PHONE_CAPABILITIES_LIST:
- add_caps(j);
- if (copy_to_user(argp, j->caplist, sizeof(struct phone_capability) * j->caps))
- retval = -EFAULT;
- break;
- case PHONE_CAPABILITIES_CHECK:
- {
- struct phone_capability cap;
- if (copy_from_user(&cap, argp, sizeof(cap)))
- retval = -EFAULT;
- else {
- add_caps(j);
- retval = capabilities_check(j, &cap);
- }
- }
- break;
- case PHONE_PSTN_SET_STATE:
- daa_set_mode(j, arg);
- break;
- case PHONE_PSTN_GET_STATE:
- retval = j->daa_mode;
- j->ex.bits.pstn_ring = 0;
- break;
- case IXJCTL_SET_FILTER:
- if (copy_from_user(&jf, argp, sizeof(jf)))
- retval = -EFAULT;
- retval = ixj_init_filter(j, &jf);
- break;
- case IXJCTL_SET_FILTER_RAW:
- if (copy_from_user(&jfr, argp, sizeof(jfr)))
- retval = -EFAULT;
- else
- retval = ixj_init_filter_raw(j, &jfr);
- break;
- case IXJCTL_GET_FILTER_HIST:
- if(arg<0||arg>3)
- retval = -EINVAL;
- else
- retval = j->filter_hist[arg];
- break;
- case IXJCTL_INIT_TONE:
- if (copy_from_user(&ti, argp, sizeof(ti)))
- retval = -EFAULT;
- else
- retval = ixj_init_tone(j, &ti);
- break;
- case IXJCTL_TONE_CADENCE:
- retval = ixj_build_cadence(j, argp);
- break;
- case IXJCTL_FILTER_CADENCE:
- retval = ixj_build_filter_cadence(j, argp);
- break;
- case IXJCTL_SIGCTL:
- if (copy_from_user(&j->sigdef, argp, sizeof(IXJ_SIGDEF))) {
- retval = -EFAULT;
- break;
- }
- j->ixj_signals[j->sigdef.event] = j->sigdef.signal;
- if(j->sigdef.event < 33) {
- raise = 1;
- for(mant = 0; mant < j->sigdef.event; mant++){
- raise *= 2;
- }
- if(j->sigdef.signal)
- j->ex_sig.bytes |= raise;
- else
- j->ex_sig.bytes &= (raise^0xffff);
- }
- break;
- case IXJCTL_INTERCOM_STOP:
- if(arg < 0 || arg >= IXJMAX)
- return -EINVAL;
- j->intercom = -1;
- ixj_record_stop(j);
- ixj_play_stop(j);
- idle(j);
- get_ixj(arg)->intercom = -1;
- ixj_record_stop(get_ixj(arg));
- ixj_play_stop(get_ixj(arg));
- idle(get_ixj(arg));
- break;
- case IXJCTL_INTERCOM_START:
- if(arg < 0 || arg >= IXJMAX)
- return -EINVAL;
- j->intercom = arg;
- ixj_record_start(j);
- ixj_play_start(j);
- get_ixj(arg)->intercom = board;
- ixj_play_start(get_ixj(arg));
- ixj_record_start(get_ixj(arg));
- break;
- }
- if (ixjdebug & 0x0040)
- printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
- clear_bit(board, &j->busyflags);
- return retval;
- }
- static int ixj_fasync(int fd, struct file *file_p, int mode)
- {
- IXJ *j = get_ixj(NUM(file_p->f_dentry->d_inode));
- return fasync_helper(fd, file_p, mode, &j->async_queue);
- }
- static struct file_operations ixj_fops =
- {
- .owner = THIS_MODULE,
- .read = ixj_enhanced_read,
- .write = ixj_enhanced_write,
- .poll = ixj_poll,
- .ioctl = ixj_ioctl,
- .release = ixj_release,
- .fasync = ixj_fasync
- };
- static int ixj_linetest(IXJ *j)
- {
- j->flags.pstncheck = 1; /* Testing */
- j->flags.pstn_present = 0; /* Assume the line is not there */
- daa_int_read(j); /*Clear DAA Interrupt flags */
- /* */
- /* Hold all relays in the normally de-energized position. */
- /* */
- j->pld_slicw.bits.rly1 = 0;
- j->pld_slicw.bits.rly2 = 0;
- j->pld_slicw.bits.rly3 = 0;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
- outb_p(j->pld_scrw.byte, j->XILINXbase);
- j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
- if (j->pld_slicr.bits.potspstn) {
- j->flags.pots_pstn = 1;
- j->flags.pots_correct = 0;
- LED_SetState(0x4, j);
- } else {
- j->flags.pots_pstn = 0;
- j->pld_slicw.bits.rly1 = 0;
- j->pld_slicw.bits.rly2 = 0;
- j->pld_slicw.bits.rly3 = 1;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
- outb_p(j->pld_scrw.byte, j->XILINXbase);
- daa_set_mode(j, SOP_PU_CONVERSATION);
- msleep(1000);
- daa_int_read(j);
- daa_set_mode(j, SOP_PU_RESET);
- if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
- j->flags.pots_correct = 0; /* Should not be line voltage on POTS port. */
- LED_SetState(0x4, j);
- j->pld_slicw.bits.rly3 = 0;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- } else {
- j->flags.pots_correct = 1;
- LED_SetState(0x8, j);
- j->pld_slicw.bits.rly1 = 1;
- j->pld_slicw.bits.rly2 = 0;
- j->pld_slicw.bits.rly3 = 0;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- }
- }
- j->pld_slicw.bits.rly3 = 0;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- daa_set_mode(j, SOP_PU_CONVERSATION);
- msleep(1000);
- daa_int_read(j);
- daa_set_mode(j, SOP_PU_RESET);
- if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
- j->pstn_sleeptil = jiffies + (hertz / 4);
- j->flags.pstn_present = 1;
- } else {
- j->flags.pstn_present = 0;
- }
- if (j->flags.pstn_present) {
- if (j->flags.pots_correct) {
- LED_SetState(0xA, j);
- } else {
- LED_SetState(0x6, j);
- }
- } else {
- if (j->flags.pots_correct) {
- LED_SetState(0x9, j);
- } else {
- LED_SetState(0x5, j);
- }
- }
- j->flags.pstncheck = 0; /* Testing */
- return j->flags.pstn_present;
- }
- static int ixj_selfprobe(IXJ *j)
- {
- unsigned short cmd;
- int cnt;
- BYTES bytes;
- init_waitqueue_head(&j->poll_q);
- init_waitqueue_head(&j->read_q);
- init_waitqueue_head(&j->write_q);
- while(atomic_read(&j->DSPWrite) > 0)
- atomic_dec(&j->DSPWrite);
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "Write IDLE to Software Control Register\n");
- ixj_WriteDSPCommand(0x0FE0, j); /* Put the DSP in full power mode. */
- if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
- return -1;
- /* The read values of the SSR should be 0x00 for the IDLE command */
- if (j->ssr.low || j->ssr.high)
- return -1;
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "Get Device ID Code\n");
- if (ixj_WriteDSPCommand(0x3400, j)) /* Get Device ID Code */
- return -1;
- j->dsp.low = j->ssr.low;
- j->dsp.high = j->ssr.high;
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "Get Device Version Code\n");
- if (ixj_WriteDSPCommand(0x3800, j)) /* Get Device Version Code */
- return -1;
- j->ver.low = j->ssr.low;
- j->ver.high = j->ssr.high;
- if (!j->cardtype) {
- if (j->dsp.low == 0x21) {
- bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02);
- outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02);
- /* Test for Internet LineJACK or Internet PhoneJACK Lite */
- bytes.low = inb_p(j->XILINXbase + 0x02);
- if (bytes.low == bytes.high) /* Register is read only on */
- /* Internet PhoneJack Lite */
- {
- j->cardtype = QTI_PHONEJACK_LITE;
- if (!request_region(j->XILINXbase, 4, "ixj control")) {
- printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
- return -1;
- }
- j->pld_slicw.pcib.e1 = 1;
- outb_p(j->pld_slicw.byte, j->XILINXbase);
- } else {
- j->cardtype = QTI_LINEJACK;
- if (!request_region(j->XILINXbase, 8, "ixj control")) {
- printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
- return -1;
- }
- }
- } else if (j->dsp.low == 0x22) {
- j->cardtype = QTI_PHONEJACK_PCI;
- request_region(j->XILINXbase, 4, "ixj control");
- j->pld_slicw.pcib.e1 = 1;
- outb_p(j->pld_slicw.byte, j->XILINXbase);
- } else
- j->cardtype = QTI_PHONEJACK;
- } else {
- switch (j->cardtype) {
- case QTI_PHONEJACK:
- if (!j->dsp.low != 0x20) {
- j->dsp.high = 0x80;
- j->dsp.low = 0x20;
- ixj_WriteDSPCommand(0x3800, j);
- j->ver.low = j->ssr.low;
- j->ver.high = j->ssr.high;
- }
- break;
- case QTI_LINEJACK:
- if (!request_region(j->XILINXbase, 8, "ixj control")) {
- printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
- return -1;
- }
- break;
- case QTI_PHONEJACK_LITE:
- case QTI_PHONEJACK_PCI:
- if (!request_region(j->XILINXbase, 4, "ixj control")) {
- printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
- return -1;
- }
- j->pld_slicw.pcib.e1 = 1;
- outb_p(j->pld_slicw.byte, j->XILINXbase);
- break;
- case QTI_PHONECARD:
- break;
- }
- }
- if (j->dsp.low == 0x20 || j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "Write CODEC config to Software Control Register\n");
- if (ixj_WriteDSPCommand(0xC462, j)) /* Write CODEC config to Software Control Register */
- return -1;
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "Write CODEC timing to Software Control Register\n");
- if (j->cardtype == QTI_PHONEJACK) {
- cmd = 0x9FF2;
- } else {
- cmd = 0x9FF5;
- }
- if (ixj_WriteDSPCommand(cmd, j)) /* Write CODEC timing to Software Control Register */
- return -1;
- } else {
- if (set_base_frame(j, 30) != 30)
- return -1;
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "Write CODEC config to Software Control Register\n");
- if (j->cardtype == QTI_PHONECARD) {
- if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
- return -1;
- }
- if (j->cardtype == QTI_LINEJACK) {
- if (ixj_WriteDSPCommand(0xC528, j)) /* Write CODEC config to Software Control Register */
- return -1;
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "Turn on the PLD Clock at 8Khz\n");
- j->pld_clock.byte = 0;
- outb_p(j->pld_clock.byte, j->XILINXbase + 0x04);
- }
- }
- if (j->dsp.low == 0x20) {
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "Configure GPIO pins\n");
- j->gpio.bytes.high = 0x09;
- /* bytes.low = 0xEF; 0xF7 */
- j->gpio.bits.gpio1 = 1;
- j->gpio.bits.gpio2 = 1;
- j->gpio.bits.gpio3 = 0;
- j->gpio.bits.gpio4 = 1;
- j->gpio.bits.gpio5 = 1;
- j->gpio.bits.gpio6 = 1;
- j->gpio.bits.gpio7 = 1;
- ixj_WriteDSPCommand(j->gpio.word, j); /* Set GPIO pin directions */
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "Enable SLIC\n");
- j->gpio.bytes.high = 0x0B;
- j->gpio.bytes.low = 0x00;
- j->gpio.bits.gpio1 = 0;
- j->gpio.bits.gpio2 = 1;
- j->gpio.bits.gpio5 = 0;
- ixj_WriteDSPCommand(j->gpio.word, j); /* send the ring stop signal */
- j->port = PORT_POTS;
- } else {
- if (j->cardtype == QTI_LINEJACK) {
- LED_SetState(0x1, j);
- msleep(100);
- LED_SetState(0x2, j);
- msleep(100);
- LED_SetState(0x4, j);
- msleep(100);
- LED_SetState(0x8, j);
- msleep(100);
- LED_SetState(0x0, j);
- daa_get_version(j);
- if (ixjdebug & 0x0002)
- printk("Loading DAA Coefficients\n");
- DAA_Coeff_US(j);
- if (!ixj_daa_write(j)) {
- printk("DAA write failed on board %d\n", j->board);
- return -1;
- }
- if(!ixj_daa_cid_reset(j)) {
- printk("DAA CID reset failed on board %d\n", j->board);
- return -1;
- }
- j->flags.pots_correct = 0;
- j->flags.pstn_present = 0;
- ixj_linetest(j);
- if (j->flags.pots_correct) {
- j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
- outb_p(j->pld_scrw.byte, j->XILINXbase);
- j->pld_slicw.bits.rly1 = 1;
- j->pld_slicw.bits.spken = 1;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
- /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
- j->port = PORT_POTS;
- }
- ixj_set_port(j, PORT_PSTN);
- ixj_set_pots(j, 1);
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "Enable Mixer\n");
- ixj_mixer(0x0000, j); /*Master Volume Left unmute 0db */
- ixj_mixer(0x0100, j); /*Master Volume Right unmute 0db */
- ixj_mixer(0x0203, j); /*Voice Left Volume unmute 6db */
- ixj_mixer(0x0303, j); /*Voice Right Volume unmute 6db */
- ixj_mixer(0x0480, j); /*FM Left mute */
- ixj_mixer(0x0580, j); /*FM Right mute */
- ixj_mixer(0x0680, j); /*CD Left mute */
- ixj_mixer(0x0780, j); /*CD Right mute */
- ixj_mixer(0x0880, j); /*Line Left mute */
- ixj_mixer(0x0980, j); /*Line Right mute */
- ixj_mixer(0x0A80, j); /*Aux left mute */
- ixj_mixer(0x0B80, j); /*Aux right mute */
- ixj_mixer(0x0C00, j); /*Mono1 unmute 12db */
- ixj_mixer(0x0D80, j); /*Mono2 mute */
- ixj_mixer(0x0E80, j); /*Mic mute */
- ixj_mixer(0x0F00, j); /*Mono Out Volume unmute 0db */
- ixj_mixer(0x1000, j); /*Voice Left and Right out only */
- ixj_mixer(0x110C, j);
- ixj_mixer(0x1200, j); /*Mono1 switch on mixer left */
- ixj_mixer(0x1401, j);
- ixj_mixer(0x1300, j); /*Mono1 switch on mixer right */
- ixj_mixer(0x1501, j);
- ixj_mixer(0x1700, j); /*Clock select */
- ixj_mixer(0x1800, j); /*ADC input from mixer */
- ixj_mixer(0x1901, j); /*Mic gain 30db */
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "Setting Default US Ring Cadence Detection\n");
- j->cadence_f[4].state = 0;
- j->cadence_f[4].on1 = 0; /*Cadence Filter 4 is used for PSTN ring cadence */
- j->cadence_f[4].off1 = 0;
- j->cadence_f[4].on2 = 0;
- j->cadence_f[4].off2 = 0;
- j->cadence_f[4].on3 = 0;
- j->cadence_f[4].off3 = 0; /* These should represent standard US ring pulse. */
- j->pstn_last_rmr = jiffies;
- } else {
- if (j->cardtype == QTI_PHONECARD) {
- ixj_WriteDSPCommand(0xCF07, j);
- ixj_WriteDSPCommand(0x00B0, j);
- ixj_set_port(j, PORT_SPEAKER);
- } else {
- ixj_set_port(j, PORT_POTS);
- SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
- /* SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
- }
- }
- }
- j->intercom = -1;
- j->framesread = j->frameswritten = 0;
- j->read_wait = j->write_wait = 0;
- j->rxreadycheck = j->txreadycheck = 0;
- /* initialise the DTMF prescale to a sensible value */
- if (j->cardtype == QTI_LINEJACK) {
- set_dtmf_prescale(j, 0x10);
- } else {
- set_dtmf_prescale(j, 0x40);
- }
- set_play_volume(j, 0x100);
- set_rec_volume(j, 0x100);
- if (ixj_WriteDSPCommand(0x0000, j)) /* Write IDLE to Software Control Register */
- return -1;
- /* The read values of the SSR should be 0x00 for the IDLE command */
- if (j->ssr.low || j->ssr.high)
- return -1;
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "Enable Line Monitor\n");
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n");
- if (ixj_WriteDSPCommand(0x7E01, j)) /* Asynchronous Line Monitor */
- return -1;
- if (ixjdebug & 0x002)
- printk(KERN_INFO "Enable DTMF Detectors\n");
- if (ixj_WriteDSPCommand(0x5151, j)) /* Enable DTMF detection */
- return -1;
- if (ixj_WriteDSPCommand(0x6E01, j)) /* Set Asyncronous Tone Generation */
- return -1;
- set_rec_depth(j, 2); /* Set Record Channel Limit to 2 frames */
- set_play_depth(j, 2); /* Set Playback Channel Limit to 2 frames */
- j->ex.bits.dtmf_ready = 0;
- j->dtmf_state = 0;
- j->dtmf_wp = j->dtmf_rp = 0;
- j->rec_mode = j->play_mode = -1;
- j->flags.ringing = 0;
- j->maxrings = MAXRINGS;
- j->ring_cadence = USA_RING_CADENCE;
- j->drybuffer = 0;
- j->winktime = 320;
- j->flags.dtmf_oob = 0;
- for (cnt = 0; cnt < 4; cnt++)
- j->cadence_f[cnt].enable = 0;
- /* must be a device on the specified address */
- ixj_WriteDSPCommand(0x0FE3, j); /* Put the DSP in 1/5 power mode. */
- /* Set up the default signals for events */
- for (cnt = 0; cnt < 35; cnt++)
- j->ixj_signals[cnt] = SIGIO;
- /* Set the excetion signal enable flags */
- j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
- j->ex_sig.bits.caller_id = j->ex_sig.bits.pstn_wink = j->ex_sig.bits.f0 = j->ex_sig.bits.f1 = j->ex_sig.bits.f2 =
- j->ex_sig.bits.f3 = j->ex_sig.bits.fc0 = j->ex_sig.bits.fc1 = j->ex_sig.bits.fc2 = j->ex_sig.bits.fc3 = 1;
- #ifdef IXJ_DYN_ALLOC
- j->fskdata = NULL;
- #endif
- j->fskdcnt = 0;
- j->cidcw_wait = 0;
-
- /* Register with the Telephony for Linux subsystem */
- j->p.f_op = &ixj_fops;
- j->p.open = ixj_open;
- j->p.board = j->board;
- phone_register_device(&j->p, PHONE_UNIT_ANY);
- ixj_init_timer(j);
- ixj_add_timer(j);
- return 0;
- }
- /*
- * Exported service for pcmcia card handling
- */
-
- IXJ *ixj_pcmcia_probe(unsigned long dsp, unsigned long xilinx)
- {
- IXJ *j = ixj_alloc();
- j->board = 0;
- j->DSPbase = dsp;
- j->XILINXbase = xilinx;
- j->cardtype = QTI_PHONECARD;
- ixj_selfprobe(j);
- return j;
- }
- EXPORT_SYMBOL(ixj_pcmcia_probe); /* Fpr PCMCIA */
- static int ixj_get_status_proc(char *buf)
- {
- int len;
- int cnt;
- IXJ *j;
- len = 0;
- len += sprintf(buf + len, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, IXJ_VER_MINOR, IXJ_BLD_VER);
- len += sprintf(buf + len, "\nsizeof IXJ struct %Zd bytes", sizeof(IXJ));
- len += sprintf(buf + len, "\nsizeof DAA struct %Zd bytes", sizeof(DAA_REGS));
- len += sprintf(buf + len, "\nUsing old telephony API");
- len += sprintf(buf + len, "\nDebug Level %d\n", ixjdebug);
- for (cnt = 0; cnt < IXJMAX; cnt++) {
- j = get_ixj(cnt);
- if(j==NULL)
- continue;
- if (j->DSPbase) {
- len += sprintf(buf + len, "\nCard Num %d", cnt);
- len += sprintf(buf + len, "\nDSP Base Address 0x%4.4x", j->DSPbase);
- if (j->cardtype != QTI_PHONEJACK)
- len += sprintf(buf + len, "\nXILINX Base Address 0x%4.4x", j->XILINXbase);
- len += sprintf(buf + len, "\nDSP Type %2.2x%2.2x", j->dsp.high, j->dsp.low);
- len += sprintf(buf + len, "\nDSP Version %2.2x.%2.2x", j->ver.high, j->ver.low);
- len += sprintf(buf + len, "\nSerial Number %8.8x", j->serial);
- switch (j->cardtype) {
- case (QTI_PHONEJACK):
- len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK");
- break;
- case (QTI_LINEJACK):
- len += sprintf(buf + len, "\nCard Type = Internet LineJACK");
- if (j->flags.g729_loaded)
- len += sprintf(buf + len, " w/G.729 A/B");
- len += sprintf(buf + len, " Country = %d", j->daa_country);
- break;
- case (QTI_PHONEJACK_LITE):
- len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite");
- if (j->flags.g729_loaded)
- len += sprintf(buf + len, " w/G.729 A/B");
- break;
- case (QTI_PHONEJACK_PCI):
- len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK PCI");
- if (j->flags.g729_loaded)
- len += sprintf(buf + len, " w/G.729 A/B");
- break;
- case (QTI_PHONECARD):
- len += sprintf(buf + len, "\nCard Type = Internet PhoneCARD");
- if (j->flags.g729_loaded)
- len += sprintf(buf + len, " w/G.729 A/B");
- len += sprintf(buf + len, "\nSmart Cable %spresent", j->pccr1.bits.drf ? "not " : "");
- if (!j->pccr1.bits.drf)
- len += sprintf(buf + len, "\nSmart Cable type %d", j->flags.pcmciasct);
- len += sprintf(buf + len, "\nSmart Cable state %d", j->flags.pcmciastate);
- break;
- default:
- len += sprintf(buf + len, "\nCard Type = %d", j->cardtype);
- break;
- }
- len += sprintf(buf + len, "\nReaders %d", j->readers);
- len += sprintf(buf + len, "\nWriters %d", j->writers);
- add_caps(j);
- len += sprintf(buf + len, "\nCapabilities %d", j->caps);
- if (j->dsp.low != 0x20)
- len += sprintf(buf + len, "\nDSP Processor load %d", j->proc_load);
- if (j->flags.cidsent)
- len += sprintf(buf + len, "\nCaller ID data sent");
- else
- len += sprintf(buf + len, "\nCaller ID data not sent");
- len += sprintf(buf + len, "\nPlay CODEC ");
- switch (j->play_codec) {
- case G723_63:
- len += sprintf(buf + len, "G.723.1 6.3");
- break;
- case G723_53:
- len += sprintf(buf + len, "G.723.1 5.3");
- break;
- case TS85:
- len += sprintf(buf + len, "TrueSpeech 8.5");
- break;
- case TS48:
- len += sprintf(buf + len, "TrueSpeech 4.8");
- break;
- case TS41:
- len += sprintf(buf + len, "TrueSpeech 4.1");
- break;
- case G728:
- len += sprintf(buf + len, "G.728");
- break;
- case G729:
- len += sprintf(buf + len, "G.729");
- break;
- case G729B:
- len += sprintf(buf + len, "G.729B");
- break;
- case ULAW:
- len += sprintf(buf + len, "uLaw");
- break;
- case ALAW:
- len += sprintf(buf + len, "aLaw");
- break;
- case LINEAR16:
- len += sprintf(buf + len, "16 bit Linear");
- break;
- case LINEAR8:
- len += sprintf(buf + len, "8 bit Linear");
- break;
- case WSS:
- len += sprintf(buf + len, "Windows Sound System");
- break;
- default:
- len += sprintf(buf + len, "NO CODEC CHOSEN");
- break;
- }
- len += sprintf(buf + len, "\nRecord CODEC ");
- switch (j->rec_codec) {
- case G723_63:
- len += sprintf(buf + len, "G.723.1 6.3");
- break;
- case G723_53:
- len += sprintf(buf + len, "G.723.1 5.3");
- break;
- case TS85:
- len += sprintf(buf + len, "TrueSpeech 8.5");
- break;
- case TS48:
- len += sprintf(buf + len, "TrueSpeech 4.8");
- break;
- case TS41:
- len += sprintf(buf + len, "TrueSpeech 4.1");
- break;
- case G728:
- len += sprintf(buf + len, "G.728");
- break;
- case G729:
- len += sprintf(buf + len, "G.729");
- break;
- case G729B:
- len += sprintf(buf + len, "G.729B");
- break;
- case ULAW:
- len += sprintf(buf + len, "uLaw");
- break;
- case ALAW:
- len += sprintf(buf + len, "aLaw");
- break;
- case LINEAR16:
- len += sprintf(buf + len, "16 bit Linear");
- break;
- case LINEAR8:
- len += sprintf(buf + len, "8 bit Linear");
- break;
- case WSS:
- len += sprintf(buf + len, "Windows Sound System");
- break;
- default:
- len += sprintf(buf + len, "NO CODEC CHOSEN");
- break;
- }
- len += sprintf(buf + len, "\nAEC ");
- switch (j->aec_level) {
- case AEC_OFF:
- len += sprintf(buf + len, "Off");
- break;
- case AEC_LOW:
- len += sprintf(buf + len, "Low");
- break;
- case AEC_MED:
- len += sprintf(buf + len, "Med");
- break;
- case AEC_HIGH:
- len += sprintf(buf + len, "High");
- break;
- case AEC_AUTO:
- len += sprintf(buf + len, "Auto");
- break;
- case AEC_AGC:
- len += sprintf(buf + len, "AEC/AGC");
- break;
- default:
- len += sprintf(buf + len, "unknown(%i)", j->aec_level);
- break;
- }
- len += sprintf(buf + len, "\nRec volume 0x%x", get_rec_volume(j));
- len += sprintf(buf + len, "\nPlay volume 0x%x", get_play_volume(j));
- len += sprintf(buf + len, "\nDTMF prescale 0x%x", get_dtmf_prescale(j));
-
- len += sprintf(buf + len, "\nHook state %d", j->hookstate); /* j->r_hook); */
- if (j->cardtype == QTI_LINEJACK) {
- len += sprintf(buf + len, "\nPOTS Correct %d", j->flags.pots_correct);
- len += sprintf(buf + len, "\nPSTN Present %d", j->flags.pstn_present);
- len += sprintf(buf + len, "\nPSTN Check %d", j->flags.pstncheck);
- len += sprintf(buf + len, "\nPOTS to PSTN %d", j->flags.pots_pstn);
- switch (j->daa_mode) {
- case SOP_PU_SLEEP:
- len += sprintf(buf + len, "\nDAA PSTN On Hook");
- break;
- case SOP_PU_RINGING:
- len += sprintf(buf + len, "\nDAA PSTN Ringing");
- len += sprintf(buf + len, "\nRinging state = %d", j->cadence_f[4].state);
- break;
- case SOP_PU_CONVERSATION:
- len += sprintf(buf + len, "\nDAA PSTN Off Hook");
- break;
- case SOP_PU_PULSEDIALING:
- len += sprintf(buf + len, "\nDAA PSTN Pulse Dialing");
- break;
- }
- len += sprintf(buf + len, "\nDAA RMR = %d", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR);
- len += sprintf(buf + len, "\nDAA VDD OK = %d", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK);
- len += sprintf(buf + len, "\nDAA CR0 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg);
- len += sprintf(buf + len, "\nDAA CR1 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg);
- len += sprintf(buf + len, "\nDAA CR2 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg);
- len += sprintf(buf + len, "\nDAA CR3 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg);
- len += sprintf(buf + len, "\nDAA CR4 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg);
- len += sprintf(buf + len, "\nDAA CR5 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg);
- len += sprintf(buf + len, "\nDAA XR0 = 0x%02x", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg);
- len += sprintf(buf + len, "\nDAA ringstop %ld - jiffies %ld", j->pstn_ring_stop, jiffies);
- }
- switch (j->port) {
- case PORT_POTS:
- len += sprintf(buf + len, "\nPort POTS");
- break;
- case PORT_PSTN:
- len += sprintf(buf + len, "\nPort PSTN");
- break;
- case PORT_SPEAKER:
- len += sprintf(buf + len, "\nPort SPEAKER/MIC");
- break;
- case PORT_HANDSET:
- len += sprintf(buf + len, "\nPort HANDSET");
- break;
- }
- if (j->dsp.low == 0x21 || j->dsp.low == 0x22) {
- len += sprintf(buf + len, "\nSLIC state ");
- switch (SLIC_GetState(j)) {
- case PLD_SLIC_STATE_OC:
- len += sprintf(buf + len, "OC");
- break;
- case PLD_SLIC_STATE_RINGING:
- len += sprintf(buf + len, "RINGING");
- break;
- case PLD_SLIC_STATE_ACTIVE:
- len += sprintf(buf + len, "ACTIVE");
- break;
- case PLD_SLIC_STATE_OHT: /* On-hook transmit */
- len += sprintf(buf + len, "OHT");
- break;
- case PLD_SLIC_STATE_TIPOPEN:
- len += sprintf(buf + len, "TIPOPEN");
- break;
- case PLD_SLIC_STATE_STANDBY:
- len += sprintf(buf + len, "STANDBY");
- break;
- case PLD_SLIC_STATE_APR: /* Active polarity reversal */
- len += sprintf(buf + len, "APR");
- break;
- case PLD_SLIC_STATE_OHTPR: /* OHT polarity reversal */
- len += sprintf(buf + len, "OHTPR");
- break;
- default:
- len += sprintf(buf + len, "%d", SLIC_GetState(j));
- break;
- }
- }
- len += sprintf(buf + len, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low);
- len += sprintf(buf + len, "\nCID Base Frame %2d", j->cid_base_frame_size);
- #ifdef PERFMON_STATS
- len += sprintf(buf + len, "\nTimer Checks %ld", j->timerchecks);
- len += sprintf(buf + len, "\nRX Ready Checks %ld", j->rxreadycheck);
- len += sprintf(buf + len, "\nTX Ready Checks %ld", j->txreadycheck);
- len += sprintf(buf + len, "\nFrames Read %ld", j->framesread);
- len += sprintf(buf + len, "\nFrames Written %ld", j->frameswritten);
- len += sprintf(buf + len, "\nDry Buffer %ld", j->drybuffer);
- len += sprintf(buf + len, "\nRead Waits %ld", j->read_wait);
- len += sprintf(buf + len, "\nWrite Waits %ld", j->write_wait);
- len += sprintf(buf + len, "\nStatus Waits %ld", j->statuswait);
- len += sprintf(buf + len, "\nStatus Wait Fails %ld", j->statuswaitfail);
- len += sprintf(buf + len, "\nPControl Waits %ld", j->pcontrolwait);
- len += sprintf(buf + len, "\nPControl Wait Fails %ld", j->pcontrolwaitfail);
- len += sprintf(buf + len, "\nIs Control Ready Checks %ld", j->iscontrolready);
- len += sprintf(buf + len, "\nIs Control Ready Check failures %ld", j->iscontrolreadyfail);
-
- #endif
- len += sprintf(buf + len, "\n");
- }
- }
- return len;
- }
- static int ixj_read_proc(char *page, char **start, off_t off,
- int count, int *eof, void *data)
- {
- int len = ixj_get_status_proc(page);
- if (len <= off+count) *eof = 1;
- *start = page + off;
- len -= off;
- if (len>count) len = count;
- if (len<0) len = 0;
- return len;
- }
- static void cleanup(void)
- {
- int cnt;
- IXJ *j;
- for (cnt = 0; cnt < IXJMAX; cnt++) {
- j = get_ixj(cnt);
- if(j != NULL && j->DSPbase) {
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "IXJ: Deleting timer for /dev/phone%d\n", cnt);
- del_timer(&j->timer);
- if (j->cardtype == QTI_LINEJACK) {
- j->pld_scrw.bits.daafsyncen = 0; /* Turn off DAA Frame Sync */
- outb_p(j->pld_scrw.byte, j->XILINXbase);
- j->pld_slicw.bits.rly1 = 0;
- j->pld_slicw.bits.rly2 = 0;
- j->pld_slicw.bits.rly3 = 0;
- outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
- LED_SetState(0x0, j);
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
- release_region(j->XILINXbase, 8);
- } else if (j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
- release_region(j->XILINXbase, 4);
- }
- kfree(j->read_buffer);
- kfree(j->write_buffer);
- if (j->dev)
- pnp_device_detach(j->dev);
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt);
- phone_unregister_device(&j->p);
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "IXJ: Releasing DSP address for /dev/phone%d\n", cnt);
- release_region(j->DSPbase, 16);
- #ifdef IXJ_DYN_ALLOC
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "IXJ: Freeing memory for /dev/phone%d\n", cnt);
- kfree(j);
- ixj[cnt] = NULL;
- #endif
- }
- }
- if (ixjdebug & 0x0002)
- printk(KERN_INFO "IXJ: Removing /proc/ixj\n");
- remove_proc_entry ("ixj", NULL);
- }
- /* Typedefs */
- typedef struct {
- BYTE length;
- DWORD bits;
- } DATABLOCK;
- static void PCIEE_WriteBit(WORD wEEPROMAddress, BYTE lastLCC, BYTE byData)
- {
- lastLCC = lastLCC & 0xfb;
- lastLCC = lastLCC | (byData ? 4 : 0);
- outb(lastLCC, wEEPROMAddress); /*set data out bit as appropriate */
- mdelay(1);
- lastLCC = lastLCC | 0x01;
- outb(lastLCC, wEEPROMAddress); /*SK rising edge */
- byData = byData << 1;
- lastLCC = lastLCC & 0xfe;
- mdelay(1);
- outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */
- }
- static BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC)
- {
- mdelay(1);
- lastLCC = lastLCC | 0x01;
- outb(lastLCC, wEEPROMAddress); /*SK rising edge */
- lastLCC = lastLCC & 0xfe;
- mdelay(1);
- outb(lastLCC, wEEPROMAddress); /*after delay, SK falling edge */
- return ((inb(wEEPROMAddress) >> 3) & 1);
- }
- static BOOL PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult)
- {
- BYTE lastLCC;
- WORD wEEPROMAddress = wAddress + 3;
- DWORD i;
- BYTE byResult;
- *pwResult = 0;
- lastLCC = inb(wEEPROMAddress);
- lastLCC = lastLCC | 0x02;
- lastLCC = lastLCC & 0xfe;
- outb(lastLCC, wEEPROMAddress); /* CS hi, SK lo */
- mdelay(1); /* delay */
- PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
- PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
- PCIEE_WriteBit(wEEPROMAddress, lastLCC, 0);
- for (i = 0; i < 8; i++) {
- PCIEE_WriteBit(wEEPROMAddress, lastLCC, wLoc & 0x80 ? 1 : 0);
- wLoc <<= 1;
- }
- for (i = 0; i < 16; i++) {
- byResult = PCIEE_ReadBit(wEEPROMAddress, lastLCC);
- *pwResult = (*pwResult << 1) | byResult;
- }
- mdelay(1); /* another delay */
- lastLCC = lastLCC & 0xfd;
- outb(lastLCC, wEEPROMAddress); /* negate CS */
- return 0;
- }
- static DWORD PCIEE_GetSerialNumber(WORD wAddress)
- {
- WORD wLo, wHi;
- if (PCIEE_ReadWord(wAddress, 62, &wLo))
- return 0;
- if (PCIEE_ReadWord(wAddress, 63, &wHi))
- return 0;
- return (((DWORD) wHi << 16) | wLo);
- }
- static int dspio[IXJMAX + 1] =
- {
- 0,
- };
- static int xio[IXJMAX + 1] =
- {
- 0,
- };
- module_param_array(dspio, int, NULL, 0);
- module_param_array(xio, int, NULL, 0);
- MODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net");
- MODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
- MODULE_LICENSE("GPL");
- static void __exit ixj_exit(void)
- {
- cleanup();
- }
- static IXJ *new_ixj(unsigned long port)
- {
- IXJ *res;
- if (!request_region(port, 16, "ixj DSP")) {
- printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", port);
- return NULL;
- }
- res = ixj_alloc();
- if (!res) {
- release_region(port, 16);
- printk(KERN_INFO "ixj: out of memory\n");
- return NULL;
- }
- res->DSPbase = port;
- return res;
- }
- static int __init ixj_probe_isapnp(int *cnt)
- {
- int probe = 0;
- int func = 0x110;
- struct pnp_dev *dev = NULL, *old_dev = NULL;
- while (1) {
- do {
- IXJ *j;
- int result;
- old_dev = dev;
- dev = pnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'),
- ISAPNP_FUNCTION(func), old_dev);
- if (!dev || !dev->card)
- break;
- result = pnp_device_attach(dev);
- if (result < 0) {
- printk("pnp attach failed %d \n", result);
- break;
- }
- if (pnp_activate_dev(dev) < 0) {
- printk("pnp activate failed (out of resources?)\n");
- pnp_device_detach(dev);
- return -ENOMEM;
- }
- if (!pnp_port_valid(dev, 0)) {
- pnp_device_detach(dev);
- return -ENODEV;
- }
- j = new_ixj(pnp_port_start(dev, 0));
- if (!j)
- break;
- if (func != 0x110)
- j->XILINXbase = pnp_port_start(dev, 1); /* get real port */
- switch (func) {
- case (0x110):
- j->cardtype = QTI_PHONEJACK;
- break;
- case (0x310):
- j->cardtype = QTI_LINEJACK;
- break;
- case (0x410):
- j->cardtype = QTI_PHONEJACK_LITE;
- break;
- }
- j->board = *cnt;
- probe = ixj_selfprobe(j);
- if(!probe) {
- j->serial = dev->card->serial;
- j->dev = dev;
- switch (func) {
- case 0x110:
- printk(KERN_INFO "ixj: found Internet PhoneJACK at 0x%x\n", j->DSPbase);
- break;
- case 0x310:
- printk(KERN_INFO "ixj: found Internet LineJACK at 0x%x\n", j->DSPbase);
- break;
- case 0x410:
- printk(KERN_INFO "ixj: found Internet PhoneJACK Lite at 0x%x\n", j->DSPbase);
- break;
- }
- }
- ++*cnt;
- } while (dev);
- if (func == 0x410)
- break;
- if (func == 0x310)
- func = 0x410;
- if (func == 0x110)
- func = 0x310;
- dev = NULL;
- }
- return probe;
- }
-
- static int __init ixj_probe_isa(int *cnt)
- {
- int i, probe;
- /* Use passed parameters for older kernels without PnP */
- for (i = 0; i < IXJMAX; i++) {
- if (dspio[i]) {
- IXJ *j = new_ixj(dspio[i]);
- if (!j)
- break;
- j->XILINXbase = xio[i];
- j->cardtype = 0;
- j->board = *cnt;
- probe = ixj_selfprobe(j);
- j->dev = NULL;
- ++*cnt;
- }
- }
- return 0;
- }
- static int __init ixj_probe_pci(int *cnt)
- {
- struct pci_dev *pci = NULL;
- int i, probe = 0;
- IXJ *j = NULL;
- for (i = 0; i < IXJMAX - *cnt; i++) {
- pci = pci_find_device(0x15E2, 0x0500, pci);
- if (!pci)
- break;
- if (pci_enable_device(pci))
- break;
- j = new_ixj(pci_resource_start(pci, 0));
- if (!j)
- break;
- j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2);
- j->XILINXbase = j->DSPbase + 0x10;
- j->cardtype = QTI_PHONEJACK_PCI;
- j->board = *cnt;
- probe = ixj_selfprobe(j);
- if (!probe)
- printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", j->DSPbase);
- ++*cnt;
- }
- return probe;
- }
- static int __init ixj_init(void)
- {
- int cnt = 0;
- int probe = 0;
- cnt = 0;
- /* These might be no-ops, see above. */
- if ((probe = ixj_probe_isapnp(&cnt)) < 0) {
- return probe;
- }
- if ((probe = ixj_probe_isa(&cnt)) < 0) {
- return probe;
- }
- if ((probe = ixj_probe_pci(&cnt)) < 0) {
- return probe;
- }
- printk(KERN_INFO "ixj driver initialized.\n");
- create_proc_read_entry ("ixj", 0, NULL, ixj_read_proc, NULL);
- return probe;
- }
- module_init(ixj_init);
- module_exit(ixj_exit);
- static void DAA_Coeff_US(IXJ *j)
- {
- int i;
- j->daa_country = DAA_US;
- /*----------------------------------------------- */
- /* CAO */
- for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
- j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
- }
- /* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x03;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x4B;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x5D;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xCD;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x24;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xC5;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
- /* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x71;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x1A;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xB5;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
- /* Bytes for FRX-filter (08): 03,8F,48,F2,8F,48,70,08 */
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x05;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xA3;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x72;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x3F;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x3B;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
- /* Bytes for FRR-filter (07): 04,8F,38,7F,9B,EA,B0,08 */
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x05;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x3E;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x32;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xDA;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
- /* Bytes for AX-filter (0A): 16,55,DD,CA */
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x41;
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
- /* Bytes for AR-filter (09): 52,D3,11,42 */
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
- /* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA5;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
- /* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xA2;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2B;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAB;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xCC;
- /* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xD2;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x24;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBA;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xA9;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x3B;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xA6;
- /* ; (10K, 0.68uF) */
- /* */
- /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
- /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
- /* Levelmetering Ringing (0D):B2,45,0F,8E */
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
- /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
- /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */
- /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */
- /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */
- /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */
- /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */
- /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */
- /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */
- /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */
- /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
- /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */
- /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */
- /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */
- /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */
- /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */
- /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */
- /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */
- /* j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */
- /* */
- /* Levelmetering Ringing (0D):B2,45,0F,8E */
- /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */
- /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */
- /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */
- /* j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */
- /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
- /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
- /* */
- /* ;CR Registers */
- /* Config. Reg. 0 (filters) (cr0):FE ; CLK gen. by crystal */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
- /* Config. Reg. 1 (dialing) (cr1):05 */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
- /* Config. Reg. 2 (caller ID) (cr2):04 */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
- /* Config. Reg. 3 (testloops) (cr3):03 ; SEL Bit==0, HP-disabled */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
- /* Config. Reg. 4 (analog gain) (cr4):02 */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
- /* Config. Reg. 5 (Version) (cr5):02 */
- /* Config. Reg. 6 (Reserved) (cr6):00 */
- /* Config. Reg. 7 (Reserved) (cr7):00 */
- /* */
- /* ;xr Registers */
- /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
- j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
- /* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x3C;
- /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
- /* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off == 1 */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x3B; /*0x32; */
- /* Ext. Reg. 4 (Cadence) (xr4):00 */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
- /* Ext. Reg. 5 (Ring timer) (xr5):22 */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
- /* Ext. Reg. 6 (Power State) (xr6):00 */
- j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
- /* Ext. Reg. 7 (Vdd) (xr7):40 */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
- /* */
- /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
- /* 12,33,5A,C3 ; 770 Hz */
- /* 13,3C,5B,32 ; 852 Hz */
- /* 1D,1B,5C,CC ; 941 Hz */
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
- /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
- /* EC,1D,52,22 ; 1336 Hz */
- /* AA,AC,51,D2 ; 1477 Hz */
- /* 9B,3B,51,25 ; 1633 Hz */
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
- }
- static void DAA_Coeff_UK(IXJ *j)
- {
- int i;
- j->daa_country = DAA_UK;
- /*----------------------------------------------- */
- /* CAO */
- for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
- j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
- }
- /* Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xC2;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xA8;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xCB;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
- /* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x40;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xA4;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
- /* Bytes for FRX-filter (08): 07,9B,ED,24,B2,A2,A0,08 */
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9B;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xED;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x24;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0xB2;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0xA2;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xA0;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
- /* Bytes for FRR-filter (07): 0F,92,F2,B2,87,D2,30,08 */
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x92;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF2;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0xB2;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xD2;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x30;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
- /* Bytes for AX-filter (0A): 1B,A5,DD,CA */
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x1B;
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xA5;
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
- /* Bytes for AR-filter (09): E2,27,10,D6 */
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x27;
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
- /* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x2D;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x38;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x8B;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xD0;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
- /* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x5A;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x53;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xF0;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x0B;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5F;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x84;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xD4;
- /* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x6A;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA4;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x8F;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x52;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xF5;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x32;
- /* ; idle */
- /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
- /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
- /* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V less possible? */
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
- /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
- /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
- /* ;CR Registers */
- /* Config. Reg. 0 (filters) (cr0):FF */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
- /* Config. Reg. 1 (dialing) (cr1):05 */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
- /* Config. Reg. 2 (caller ID) (cr2):04 */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
- /* Config. Reg. 3 (testloops) (cr3):00 ; */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
- /* Config. Reg. 4 (analog gain) (cr4):02 */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
- /* Config. Reg. 5 (Version) (cr5):02 */
- /* Config. Reg. 6 (Reserved) (cr6):00 */
- /* Config. Reg. 7 (Reserved) (cr7):00 */
- /* ;xr Registers */
- /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
- j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
- /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
- /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
- /* Ext. Reg. 3 (DC Char) (xr3):36 ; */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
- /* Ext. Reg. 4 (Cadence) (xr4):00 */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
- /* Ext. Reg. 5 (Ring timer) (xr5):22 */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
- /* Ext. Reg. 6 (Power State) (xr6):00 */
- j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
- /* Ext. Reg. 7 (Vdd) (xr7):46 */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */
- /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
- /* 12,33,5A,C3 ; 770 Hz */
- /* 13,3C,5B,32 ; 852 Hz */
- /* 1D,1B,5C,CC ; 941 Hz */
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
- /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
- /* EC,1D,52,22 ; 1336 Hz */
- /* AA,AC,51,D2 ; 1477 Hz */
- /* 9B,3B,51,25 ; 1633 Hz */
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
- }
- static void DAA_Coeff_France(IXJ *j)
- {
- int i;
- j->daa_country = DAA_FRANCE;
- /*----------------------------------------------- */
- /* CAO */
- for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
- j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
- }
- /* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA2;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x43;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2C;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x22;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xAF;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
- /* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x67;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xCE;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x2C;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x22;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
- /* Bytes for FRX-filter (08): 07,9A,28,F6,23,4A,B0,08 */
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9A;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x28;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0xF6;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x23;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x4A;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xB0;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
- /* Bytes for FRR-filter (07): 03,8F,F9,2F,9E,FA,20,08 */
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9E;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xFA;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
- /* Bytes for AX-filter (0A): 16,B5,DD,CA */
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16;
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
- /* Bytes for AR-filter (09): 52,C7,10,D6 */
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
- /* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA6;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
- /* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAC;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x30;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x78;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAC;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x2C;
- /* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA5;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x22;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2C;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x45;
- /* ; idle */
- /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
- /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
- /* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
- /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
- /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
- /* ;CR Registers */
- /* Config. Reg. 0 (filters) (cr0):FF */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
- /* Config. Reg. 1 (dialing) (cr1):05 */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
- /* Config. Reg. 2 (caller ID) (cr2):04 */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
- /* Config. Reg. 3 (testloops) (cr3):00 ; */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
- /* Config. Reg. 4 (analog gain) (cr4):02 */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
- /* Config. Reg. 5 (Version) (cr5):02 */
- /* Config. Reg. 6 (Reserved) (cr6):00 */
- /* Config. Reg. 7 (Reserved) (cr7):00 */
- /* ;xr Registers */
- /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
- j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
- /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
- /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
- /* Ext. Reg. 3 (DC Char) (xr3):36 ; */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
- /* Ext. Reg. 4 (Cadence) (xr4):00 */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
- /* Ext. Reg. 5 (Ring timer) (xr5):22 */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
- /* Ext. Reg. 6 (Power State) (xr6):00 */
- j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
- /* Ext. Reg. 7 (Vdd) (xr7):46 */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46; /* 0x46 ??? Should it be 0x00? */
- /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
- /* 12,33,5A,C3 ; 770 Hz */
- /* 13,3C,5B,32 ; 852 Hz */
- /* 1D,1B,5C,CC ; 941 Hz */
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
- /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
- /* EC,1D,52,22 ; 1336 Hz */
- /* AA,AC,51,D2 ; 1477 Hz */
- /* 9B,3B,51,25 ; 1633 Hz */
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
- }
- static void DAA_Coeff_Germany(IXJ *j)
- {
- int i;
- j->daa_country = DAA_GERMANY;
- /*----------------------------------------------- */
- /* CAO */
- for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
- j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
- }
- /* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xCE;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xB8;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xD2;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xB0;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
- /* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x45;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x8F;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0C;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xD2;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
- /* Bytes for FRX-filter (08): 07,AA,E2,34,24,89,20,08 */
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xAA;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x24;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x89;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x20;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
- /* Bytes for FRR-filter (07): 02,87,FA,37,9A,CA,B0,08 */
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x02;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xFA;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x37;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9A;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCA;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
- /* Bytes for AX-filter (0A): 72,D5,DD,CA */
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x72;
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xD5;
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
- /* Bytes for AR-filter (09): 72,42,13,4B */
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x72;
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x42;
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x13;
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x4B;
- /* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAD;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
- /* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x42;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x5A;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x1A;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x27;
- /* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x63;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x26;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBD;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x4B;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xA3;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xC2;
- /* ; (10K, 0.68uF) */
- /* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3B;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x9B;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xBA;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0xD4;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
- /* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0xD4;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
- /* Levelmetering Ringing (0D):B2,45,0F,8E */
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2;
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
- /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
- /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
- /* ;CR Registers */
- /* Config. Reg. 0 (filters) (cr0):FF ; all Filters enabled, CLK from ext. source */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
- /* Config. Reg. 1 (dialing) (cr1):05 ; Manual Ring, Ring metering enabled */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
- /* Config. Reg. 2 (caller ID) (cr2):04 ; Analog Gain 0dB, FSC internal */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
- /* Config. Reg. 3 (testloops) (cr3):00 ; SEL Bit==0, HP-enabled */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
- /* Config. Reg. 4 (analog gain) (cr4):02 */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
- /* Config. Reg. 5 (Version) (cr5):02 */
- /* Config. Reg. 6 (Reserved) (cr6):00 */
- /* Config. Reg. 7 (Reserved) (cr7):00 */
- /* ;xr Registers */
- /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
- j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
- /* Ext. Reg. 1 (Interrupt enable) (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
- /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
- /* Ext. Reg. 3 (DC Char) (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x32;
- /* Ext. Reg. 4 (Cadence) (xr4):00 */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
- /* Ext. Reg. 5 (Ring timer) (xr5):22 */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
- /* Ext. Reg. 6 (Power State) (xr6):00 */
- j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
- /* Ext. Reg. 7 (Vdd) (xr7):40 ; VDD=4.25 V */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
- /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
- /* 12,33,5A,C3 ; 770 Hz */
- /* 13,3C,5B,32 ; 852 Hz */
- /* 1D,1B,5C,CC ; 941 Hz */
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
- /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
- /* EC,1D,52,22 ; 1336 Hz */
- /* AA,AC,51,D2 ; 1477 Hz */
- /* 9B,3B,51,25 ; 1633 Hz */
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
- }
- static void DAA_Coeff_Australia(IXJ *j)
- {
- int i;
- j->daa_country = DAA_AUSTRALIA;
- /*----------------------------------------------- */
- /* CAO */
- for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
- j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
- }
- /* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA3;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xAA;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x28;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xB3;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x82;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xD0;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
- /* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x70;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x96;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x09;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x32;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x6B;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xC0;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
- /* Bytes for FRX-filter (08): 07,96,E2,34,32,9B,30,08 */
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x96;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x32;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x9B;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
- /* Bytes for FRR-filter (07): 0F,9A,E9,2F,22,CC,A0,08 */
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x9A;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xE9;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x22;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCC;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xA0;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
- /* Bytes for AX-filter (0A): CB,45,DD,CA */
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0xCB;
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x45;
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
- /* Bytes for AR-filter (09): 1B,67,10,D6 */
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x1B;
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x67;
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
- /* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAF;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
- /* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xDB;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x52;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x38;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x01;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x82;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAC;
- /* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x4A;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x3E;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x2C;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x3B;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x24;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x46;
- /* ; idle */
- /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
- /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
- /* Levelmetering Ringing (0D):32,45,B5,84 ; 50Hz 20V */
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
- /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
- /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
- /* ;CR Registers */
- /* Config. Reg. 0 (filters) (cr0):FF */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
- /* Config. Reg. 1 (dialing) (cr1):05 */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
- /* Config. Reg. 2 (caller ID) (cr2):04 */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
- /* Config. Reg. 3 (testloops) (cr3):00 ; */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
- /* Config. Reg. 4 (analog gain) (cr4):02 */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
- /* Config. Reg. 5 (Version) (cr5):02 */
- /* Config. Reg. 6 (Reserved) (cr6):00 */
- /* Config. Reg. 7 (Reserved) (cr7):00 */
- /* ;xr Registers */
- /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
- j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
- /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
- /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
- /* Ext. Reg. 3 (DC Char) (xr3):2B ; */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B;
- /* Ext. Reg. 4 (Cadence) (xr4):00 */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
- /* Ext. Reg. 5 (Ring timer) (xr5):22 */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
- /* Ext. Reg. 6 (Power State) (xr6):00 */
- j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
- /* Ext. Reg. 7 (Vdd) (xr7):40 */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
- /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
- /* 12,33,5A,C3 ; 770 Hz */
- /* 13,3C,5B,32 ; 852 Hz */
- /* 1D,1B,5C,CC ; 941 Hz */
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
- /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
- /* EC,1D,52,22 ; 1336 Hz */
- /* AA,AC,51,D2 ; 1477 Hz */
- /* 9B,3B,51,25 ; 1633 Hz */
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
- }
- static void DAA_Coeff_Japan(IXJ *j)
- {
- int i;
- j->daa_country = DAA_JAPAN;
- /*----------------------------------------------- */
- /* CAO */
- for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
- j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
- }
- /* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xBD;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2D;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xBA;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xF9;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
- /* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x6F;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xF7;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0E;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x34;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
- j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
- /* Bytes for FRX-filter (08): 02,8F,68,77,9C,58,F0,08 */
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x02;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x68;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x77;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x9C;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x58;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xF0;
- j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
- /* Bytes for FRR-filter (07): 03,8F,38,73,87,EA,20,08 */
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0x38;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x73;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
- j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
- /* Bytes for AX-filter (0A): 51,C5,DD,CA */
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x51;
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xC5;
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
- j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
- /* Bytes for AR-filter (09): 25,A7,10,D6 */
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xA7;
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
- j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
- /* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAE;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
- /* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAB;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x99;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5B;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x89;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x28;
- /* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x25;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x34;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xC5;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x4C;
- j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBA;
- /* ; idle */
- /* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
- /* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
- j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
- /* Levelmetering Ringing (0D):AA,35,0F,8E ; 25Hz 30V ????????? */
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
- j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
- /* Caller ID 1st Tone (0E):CA,0E,CA,09,99,99,99,99 */
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
- /* Caller ID 2nd Tone (0F):FD,B5,BA,07,DA,00,00,00 */
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
- j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
- /* ;CR Registers */
- /* Config. Reg. 0 (filters) (cr0):FF */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
- /* Config. Reg. 1 (dialing) (cr1):05 */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
- /* Config. Reg. 2 (caller ID) (cr2):04 */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
- /* Config. Reg. 3 (testloops) (cr3):00 ; */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
- /* Config. Reg. 4 (analog gain) (cr4):02 */
- j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
- /* Config. Reg. 5 (Version) (cr5):02 */
- /* Config. Reg. 6 (Reserved) (cr6):00 */
- /* Config. Reg. 7 (Reserved) (cr7):00 */
- /* ;xr Registers */
- /* Ext. Reg. 0 (Interrupt Reg.) (xr0):02 */
- j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02; /* SO_1 set to '1' because it is inverted. */
- /* Ext. Reg. 1 (Interrupt enable) (xr1):1C */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C; /* RING, Caller ID, VDD_OK */
- /* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
- /* Ext. Reg. 3 (DC Char) (xr3):22 ; */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22;
- /* Ext. Reg. 4 (Cadence) (xr4):00 */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
- /* Ext. Reg. 5 (Ring timer) (xr5):22 */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
- /* Ext. Reg. 6 (Power State) (xr6):00 */
- j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
- /* Ext. Reg. 7 (Vdd) (xr7):40 */
- j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40; /* 0x40 ??? Should it be 0x00? */
- /* DTMF Tone 1 (0B): 11,B3,5A,2C ; 697 Hz */
- /* 12,33,5A,C3 ; 770 Hz */
- /* 13,3C,5B,32 ; 852 Hz */
- /* 1D,1B,5C,CC ; 941 Hz */
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
- /* DTMF Tone 2 (0C): 32,32,52,B3 ; 1209 Hz */
- /* EC,1D,52,22 ; 1336 Hz */
- /* AA,AC,51,D2 ; 1477 Hz */
- /* 9B,3B,51,25 ; 1633 Hz */
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
- j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
- }
- static s16 tone_table[][19] =
- {
- { /* f20_50[] 11 */
- 32538, /* A1 = 1.985962 */
- -32325, /* A2 = -0.986511 */
- -343, /* B2 = -0.010493 */
- 0, /* B1 = 0 */
- 343, /* B0 = 0.010493 */
- 32619, /* A1 = 1.990906 */
- -32520, /* A2 = -0.992462 */
- 19179, /* B2 = 0.585327 */
- -19178, /* B1 = -1.170593 */
- 19179, /* B0 = 0.585327 */
- 32723, /* A1 = 1.997314 */
- -32686, /* A2 = -0.997528 */
- 9973, /* B2 = 0.304352 */
- -9955, /* B1 = -0.607605 */
- 9973, /* B0 = 0.304352 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f133_200[] 12 */
- 32072, /* A1 = 1.95752 */
- -31896, /* A2 = -0.973419 */
- -435, /* B2 = -0.013294 */
- 0, /* B1 = 0 */
- 435, /* B0 = 0.013294 */
- 32188, /* A1 = 1.9646 */
- -32400, /* A2 = -0.98877 */
- 15139, /* B2 = 0.462036 */
- -14882, /* B1 = -0.908356 */
- 15139, /* B0 = 0.462036 */
- 32473, /* A1 = 1.981995 */
- -32524, /* A2 = -0.992584 */
- 23200, /* B2 = 0.708008 */
- -23113, /* B1 = -1.410706 */
- 23200, /* B0 = 0.708008 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f300 13 */
- 31769, /* A1 = -1.939026 */
- -32584, /* A2 = 0.994385 */
- -475, /* B2 = -0.014522 */
- 0, /* B1 = 0.000000 */
- 475, /* B0 = 0.014522 */
- 31789, /* A1 = -1.940247 */
- -32679, /* A2 = 0.997284 */
- 17280, /* B2 = 0.527344 */
- -16865, /* B1 = -1.029358 */
- 17280, /* B0 = 0.527344 */
- 31841, /* A1 = -1.943481 */
- -32681, /* A2 = 0.997345 */
- 543, /* B2 = 0.016579 */
- -525, /* B1 = -0.032097 */
- 543, /* B0 = 0.016579 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f300_420[] 14 */
- 30750, /* A1 = 1.876892 */
- -31212, /* A2 = -0.952515 */
- -804, /* B2 = -0.024541 */
- 0, /* B1 = 0 */
- 804, /* B0 = 0.024541 */
- 30686, /* A1 = 1.872925 */
- -32145, /* A2 = -0.980988 */
- 14747, /* B2 = 0.450043 */
- -13703, /* B1 = -0.836395 */
- 14747, /* B0 = 0.450043 */
- 31651, /* A1 = 1.931824 */
- -32321, /* A2 = -0.986389 */
- 24425, /* B2 = 0.745422 */
- -23914, /* B1 = -1.459595 */
- 24427, /* B0 = 0.745483 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f330 15 */
- 31613, /* A1 = -1.929565 */
- -32646, /* A2 = 0.996277 */
- -185, /* B2 = -0.005657 */
- 0, /* B1 = 0.000000 */
- 185, /* B0 = 0.005657 */
- 31620, /* A1 = -1.929932 */
- -32713, /* A2 = 0.998352 */
- 19253, /* B2 = 0.587585 */
- -18566, /* B1 = -1.133179 */
- 19253, /* B0 = 0.587585 */
- 31674, /* A1 = -1.933228 */
- -32715, /* A2 = 0.998413 */
- 2575, /* B2 = 0.078590 */
- -2495, /* B1 = -0.152283 */
- 2575, /* B0 = 0.078590 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f300_425[] 16 */
- 30741, /* A1 = 1.876282 */
- -31475, /* A2 = -0.960541 */
- -703, /* B2 = -0.021484 */
- 0, /* B1 = 0 */
- 703, /* B0 = 0.021484 */
- 30688, /* A1 = 1.873047 */
- -32248, /* A2 = -0.984161 */
- 14542, /* B2 = 0.443787 */
- -13523, /* B1 = -0.825439 */
- 14542, /* B0 = 0.443817 */
- 31494, /* A1 = 1.922302 */
- -32366, /* A2 = -0.987762 */
- 21577, /* B2 = 0.658508 */
- -21013, /* B1 = -1.282532 */
- 21577, /* B0 = 0.658508 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f330_440[] 17 */
- 30627, /* A1 = 1.869324 */
- -31338, /* A2 = -0.95636 */
- -843, /* B2 = -0.025749 */
- 0, /* B1 = 0 */
- 843, /* B0 = 0.025749 */
- 30550, /* A1 = 1.864685 */
- -32221, /* A2 = -0.983337 */
- 13594, /* B2 = 0.414886 */
- -12589, /* B1 = -0.768402 */
- 13594, /* B0 = 0.414886 */
- 31488, /* A1 = 1.921936 */
- -32358, /* A2 = -0.987518 */
- 24684, /* B2 = 0.753296 */
- -24029, /* B1 = -1.466614 */
- 24684, /* B0 = 0.753296 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f340 18 */
- 31546, /* A1 = -1.925476 */
- -32646, /* A2 = 0.996277 */
- -445, /* B2 = -0.013588 */
- 0, /* B1 = 0.000000 */
- 445, /* B0 = 0.013588 */
- 31551, /* A1 = -1.925781 */
- -32713, /* A2 = 0.998352 */
- 23884, /* B2 = 0.728882 */
- -22979, /* B1 = -1.402527 */
- 23884, /* B0 = 0.728882 */
- 31606, /* A1 = -1.929138 */
- -32715, /* A2 = 0.998413 */
- 863, /* B2 = 0.026367 */
- -835, /* B1 = -0.050985 */
- 863, /* B0 = 0.026367 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f350_400[] 19 */
- 31006, /* A1 = 1.892517 */
- -32029, /* A2 = -0.977448 */
- -461, /* B2 = -0.014096 */
- 0, /* B1 = 0 */
- 461, /* B0 = 0.014096 */
- 30999, /* A1 = 1.892029 */
- -32487, /* A2 = -0.991455 */
- 11325, /* B2 = 0.345612 */
- -10682, /* B1 = -0.651978 */
- 11325, /* B0 = 0.345612 */
- 31441, /* A1 = 1.919067 */
- -32526, /* A2 = -0.992615 */
- 24324, /* B2 = 0.74231 */
- -23535, /* B1 = -1.436523 */
- 24324, /* B0 = 0.74231 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f350_440[] */
- 30634, /* A1 = 1.869751 */
- -31533, /* A2 = -0.962341 */
- -680, /* B2 = -0.020782 */
- 0, /* B1 = 0 */
- 680, /* B0 = 0.020782 */
- 30571, /* A1 = 1.865906 */
- -32277, /* A2 = -0.985016 */
- 12894, /* B2 = 0.393524 */
- -11945, /* B1 = -0.729065 */
- 12894, /* B0 = 0.393524 */
- 31367, /* A1 = 1.91449 */
- -32379, /* A2 = -0.988129 */
- 23820, /* B2 = 0.726929 */
- -23104, /* B1 = -1.410217 */
- 23820, /* B0 = 0.726929 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f350_450[] */
- 30552, /* A1 = 1.864807 */
- -31434, /* A2 = -0.95929 */
- -690, /* B2 = -0.021066 */
- 0, /* B1 = 0 */
- 690, /* B0 = 0.021066 */
- 30472, /* A1 = 1.859924 */
- -32248, /* A2 = -0.984161 */
- 13385, /* B2 = 0.408478 */
- -12357, /* B1 = -0.754242 */
- 13385, /* B0 = 0.408478 */
- 31358, /* A1 = 1.914001 */
- -32366, /* A2 = -0.987732 */
- 26488, /* B2 = 0.80835 */
- -25692, /* B1 = -1.568176 */
- 26490, /* B0 = 0.808411 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f360 */
- 31397, /* A1 = -1.916321 */
- -32623, /* A2 = 0.995605 */
- -117, /* B2 = -0.003598 */
- 0, /* B1 = 0.000000 */
- 117, /* B0 = 0.003598 */
- 31403, /* A1 = -1.916687 */
- -32700, /* A2 = 0.997925 */
- 3388, /* B2 = 0.103401 */
- -3240, /* B1 = -0.197784 */
- 3388, /* B0 = 0.103401 */
- 31463, /* A1 = -1.920410 */
- -32702, /* A2 = 0.997986 */
- 13346, /* B2 = 0.407288 */
- -12863, /* B1 = -0.785126 */
- 13346, /* B0 = 0.407288 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f380_420[] */
- 30831, /* A1 = 1.881775 */
- -32064, /* A2 = -0.978546 */
- -367, /* B2 = -0.01122 */
- 0, /* B1 = 0 */
- 367, /* B0 = 0.01122 */
- 30813, /* A1 = 1.880737 */
- -32456, /* A2 = -0.990509 */
- 11068, /* B2 = 0.337769 */
- -10338, /* B1 = -0.631042 */
- 11068, /* B0 = 0.337769 */
- 31214, /* A1 = 1.905212 */
- -32491, /* A2 = -0.991577 */
- 16374, /* B2 = 0.499695 */
- -15781, /* B1 = -0.963196 */
- 16374, /* B0 = 0.499695 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f392 */
- 31152, /* A1 = -1.901428 */
- -32613, /* A2 = 0.995300 */
- -314, /* B2 = -0.009605 */
- 0, /* B1 = 0.000000 */
- 314, /* B0 = 0.009605 */
- 31156, /* A1 = -1.901672 */
- -32694, /* A2 = 0.997742 */
- 28847, /* B2 = 0.880371 */
- -2734, /* B1 = -0.166901 */
- 28847, /* B0 = 0.880371 */
- 31225, /* A1 = -1.905823 */
- -32696, /* A2 = 0.997803 */
- 462, /* B2 = 0.014108 */
- -442, /* B1 = -0.027019 */
- 462, /* B0 = 0.014108 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f400_425[] */
- 30836, /* A1 = 1.882141 */
- -32296, /* A2 = -0.985596 */
- -324, /* B2 = -0.009903 */
- 0, /* B1 = 0 */
- 324, /* B0 = 0.009903 */
- 30825, /* A1 = 1.881409 */
- -32570, /* A2 = -0.993958 */
- 16847, /* B2 = 0.51416 */
- -15792, /* B1 = -0.963898 */
- 16847, /* B0 = 0.51416 */
- 31106, /* A1 = 1.89856 */
- -32584, /* A2 = -0.994415 */
- 9579, /* B2 = 0.292328 */
- -9164, /* B1 = -0.559357 */
- 9579, /* B0 = 0.292328 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f400_440[] */
- 30702, /* A1 = 1.873962 */
- -32134, /* A2 = -0.980682 */
- -517, /* B2 = -0.015793 */
- 0, /* B1 = 0 */
- 517, /* B0 = 0.015793 */
- 30676, /* A1 = 1.872375 */
- -32520, /* A2 = -0.992462 */
- 8144, /* B2 = 0.24855 */
- -7596, /* B1 = -0.463684 */
- 8144, /* B0 = 0.24855 */
- 31084, /* A1 = 1.897217 */
- -32547, /* A2 = -0.993256 */
- 22713, /* B2 = 0.693176 */
- -21734, /* B1 = -1.326599 */
- 22713, /* B0 = 0.693176 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f400_450[] */
- 30613, /* A1 = 1.86853 */
- -32031, /* A2 = -0.977509 */
- -618, /* B2 = -0.018866 */
- 0, /* B1 = 0 */
- 618, /* B0 = 0.018866 */
- 30577, /* A1 = 1.866272 */
- -32491, /* A2 = -0.991577 */
- 9612, /* B2 = 0.293335 */
- -8935, /* B1 = -0.54541 */
- 9612, /* B0 = 0.293335 */
- 31071, /* A1 = 1.896484 */
- -32524, /* A2 = -0.992584 */
- 21596, /* B2 = 0.659058 */
- -20667, /* B1 = -1.261414 */
- 21596, /* B0 = 0.659058 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f420 */
- 30914, /* A1 = -1.886841 */
- -32584, /* A2 = 0.994385 */
- -426, /* B2 = -0.013020 */
- 0, /* B1 = 0.000000 */
- 426, /* B0 = 0.013020 */
- 30914, /* A1 = -1.886841 */
- -32679, /* A2 = 0.997314 */
- 17520, /* B2 = 0.534668 */
- -16471, /* B1 = -1.005310 */
- 17520, /* B0 = 0.534668 */
- 31004, /* A1 = -1.892334 */
- -32683, /* A2 = 0.997406 */
- 819, /* B2 = 0.025023 */
- -780, /* B1 = -0.047619 */
- 819, /* B0 = 0.025023 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- #if 0
- { /* f425 */
- 30881, /* A1 = -1.884827 */
- -32603, /* A2 = 0.994965 */
- -496, /* B2 = -0.015144 */
- 0, /* B1 = 0.000000 */
- 496, /* B0 = 0.015144 */
- 30880, /* A1 = -1.884766 */
- -32692, /* A2 = 0.997711 */
- 24767, /* B2 = 0.755859 */
- -23290, /* B1 = -1.421509 */
- 24767, /* B0 = 0.755859 */
- 30967, /* A1 = -1.890076 */
- -32694, /* A2 = 0.997772 */
- 728, /* B2 = 0.022232 */
- -691, /* B1 = -0.042194 */
- 728, /* B0 = 0.022232 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- #else
- {
- 30850,
- -32534,
- -504,
- 0,
- 504,
- 30831,
- -32669,
- 24303,
- -22080,
- 24303,
- 30994,
- -32673,
- 1905,
- -1811,
- 1905,
- 5,
- 129,
- 17,
- 0xff5
- },
- #endif
- { /* f425_450[] */
- 30646, /* A1 = 1.870544 */
- -32327, /* A2 = -0.986572 */
- -287, /* B2 = -0.008769 */
- 0, /* B1 = 0 */
- 287, /* B0 = 0.008769 */
- 30627, /* A1 = 1.869324 */
- -32607, /* A2 = -0.995087 */
- 13269, /* B2 = 0.404968 */
- -12376, /* B1 = -0.755432 */
- 13269, /* B0 = 0.404968 */
- 30924, /* A1 = 1.887512 */
- -32619, /* A2 = -0.995453 */
- 19950, /* B2 = 0.608826 */
- -18940, /* B1 = -1.156006 */
- 19950, /* B0 = 0.608826 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f425_475[] */
- 30396, /* A1 = 1.855225 */
- -32014, /* A2 = -0.97699 */
- -395, /* B2 = -0.012055 */
- 0, /* B1 = 0 */
- 395, /* B0 = 0.012055 */
- 30343, /* A1 = 1.85199 */
- -32482, /* A2 = -0.991302 */
- 17823, /* B2 = 0.543945 */
- -16431, /* B1 = -1.002869 */
- 17823, /* B0 = 0.543945 */
- 30872, /* A1 = 1.884338 */
- -32516, /* A2 = -0.99231 */
- 18124, /* B2 = 0.553101 */
- -17246, /* B1 = -1.052673 */
- 18124, /* B0 = 0.553101 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f435 */
- 30796, /* A1 = -1.879639 */
- -32603, /* A2 = 0.994965 */
- -254, /* B2 = -0.007762 */
- 0, /* B1 = 0.000000 */
- 254, /* B0 = 0.007762 */
- 30793, /* A1 = -1.879456 */
- -32692, /* A2 = 0.997711 */
- 18934, /* B2 = 0.577820 */
- -17751, /* B1 = -1.083496 */
- 18934, /* B0 = 0.577820 */
- 30882, /* A1 = -1.884888 */
- -32694, /* A2 = 0.997772 */
- 1858, /* B2 = 0.056713 */
- -1758, /* B1 = -0.107357 */
- 1858, /* B0 = 0.056713 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f440_450[] */
- 30641, /* A1 = 1.870239 */
- -32458, /* A2 = -0.99057 */
- -155, /* B2 = -0.004735 */
- 0, /* B1 = 0 */
- 155, /* B0 = 0.004735 */
- 30631, /* A1 = 1.869568 */
- -32630, /* A2 = -0.995789 */
- 11453, /* B2 = 0.349548 */
- -10666, /* B1 = -0.651001 */
- 11453, /* B0 = 0.349548 */
- 30810, /* A1 = 1.880554 */
- -32634, /* A2 = -0.995941 */
- 12237, /* B2 = 0.373474 */
- -11588, /* B1 = -0.707336 */
- 12237, /* B0 = 0.373474 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f440_480[] */
- 30367, /* A1 = 1.853455 */
- -32147, /* A2 = -0.981079 */
- -495, /* B2 = -0.015113 */
- 0, /* B1 = 0 */
- 495, /* B0 = 0.015113 */
- 30322, /* A1 = 1.850769 */
- -32543, /* A2 = -0.993134 */
- 10031, /* B2 = 0.306152 */
- -9252, /* B1 = -0.564728 */
- 10031, /* B0 = 0.306152 */
- 30770, /* A1 = 1.878052 */
- -32563, /* A2 = -0.993774 */
- 22674, /* B2 = 0.691956 */
- -21465, /* B1 = -1.31012 */
- 22674, /* B0 = 0.691956 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f445 */
- 30709, /* A1 = -1.874329 */
- -32603, /* A2 = 0.994965 */
- -83, /* B2 = -0.002545 */
- 0, /* B1 = 0.000000 */
- 83, /* B0 = 0.002545 */
- 30704, /* A1 = -1.874084 */
- -32692, /* A2 = 0.997711 */
- 10641, /* B2 = 0.324738 */
- -9947, /* B1 = -0.607147 */
- 10641, /* B0 = 0.324738 */
- 30796, /* A1 = -1.879639 */
- -32694, /* A2 = 0.997772 */
- 10079, /* B2 = 0.307587 */
- 9513, /* B1 = 0.580688 */
- 10079, /* B0 = 0.307587 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f450 */
- 30664, /* A1 = -1.871643 */
- -32603, /* A2 = 0.994965 */
- -164, /* B2 = -0.005029 */
- 0, /* B1 = 0.000000 */
- 164, /* B0 = 0.005029 */
- 30661, /* A1 = -1.871399 */
- -32692, /* A2 = 0.997711 */
- 15294, /* B2 = 0.466736 */
- -14275, /* B1 = -0.871307 */
- 15294, /* B0 = 0.466736 */
- 30751, /* A1 = -1.876953 */
- -32694, /* A2 = 0.997772 */
- 3548, /* B2 = 0.108284 */
- -3344, /* B1 = -0.204155 */
- 3548, /* B0 = 0.108284 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f452 */
- 30653, /* A1 = -1.870911 */
- -32615, /* A2 = 0.995361 */
- -209, /* B2 = -0.006382 */
- 0, /* B1 = 0.000000 */
- 209, /* B0 = 0.006382 */
- 30647, /* A1 = -1.870605 */
- -32702, /* A2 = 0.997986 */
- 18971, /* B2 = 0.578979 */
- -17716, /* B1 = -1.081299 */
- 18971, /* B0 = 0.578979 */
- 30738, /* A1 = -1.876099 */
- -32702, /* A2 = 0.998016 */
- 2967, /* B2 = 0.090561 */
- -2793, /* B1 = -0.170502 */
- 2967, /* B0 = 0.090561 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f475 */
- 30437, /* A1 = -1.857727 */
- -32603, /* A2 = 0.994965 */
- -264, /* B2 = -0.008062 */
- 0, /* B1 = 0.000000 */
- 264, /* B0 = 0.008062 */
- 30430, /* A1 = -1.857300 */
- -32692, /* A2 = 0.997711 */
- 21681, /* B2 = 0.661682 */
- -20082, /* B1 = -1.225708 */
- 21681, /* B0 = 0.661682 */
- 30526, /* A1 = -1.863220 */
- -32694, /* A2 = 0.997742 */
- 1559, /* B2 = 0.047600 */
- -1459, /* B1 = -0.089096 */
- 1559, /* B0 = 0.047600 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f480_620[] */
- 28975, /* A1 = 1.768494 */
- -30955, /* A2 = -0.944672 */
- -1026, /* B2 = -0.03133 */
- 0, /* B1 = 0 */
- 1026, /* B0 = 0.03133 */
- 28613, /* A1 = 1.746399 */
- -32089, /* A2 = -0.979309 */
- 14214, /* B2 = 0.433807 */
- -12202, /* B1 = -0.744812 */
- 14214, /* B0 = 0.433807 */
- 30243, /* A1 = 1.845947 */
- -32238, /* A2 = -0.983856 */
- 24825, /* B2 = 0.757629 */
- -23402, /* B1 = -1.428345 */
- 24825, /* B0 = 0.757629 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f494 */
- 30257, /* A1 = -1.846741 */
- -32605, /* A2 = 0.995056 */
- -249, /* B2 = -0.007625 */
- 0, /* B1 = 0.000000 */
- 249, /* B0 = 0.007625 */
- 30247, /* A1 = -1.846191 */
- -32694, /* A2 = 0.997772 */
- 18088, /* B2 = 0.552002 */
- -16652, /* B1 = -1.016418 */
- 18088, /* B0 = 0.552002 */
- 30348, /* A1 = -1.852295 */
- -32696, /* A2 = 0.997803 */
- 2099, /* B2 = 0.064064 */
- -1953, /* B1 = -0.119202 */
- 2099, /* B0 = 0.064064 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f500 */
- 30202, /* A1 = -1.843431 */
- -32624, /* A2 = 0.995622 */
- -413, /* B2 = -0.012622 */
- 0, /* B1 = 0.000000 */
- 413, /* B0 = 0.012622 */
- 30191, /* A1 = -1.842721 */
- -32714, /* A2 = 0.998364 */
- 25954, /* B2 = 0.792057 */
- -23890, /* B1 = -1.458131 */
- 25954, /* B0 = 0.792057 */
- 30296, /* A1 = -1.849172 */
- -32715, /* A2 = 0.998397 */
- 2007, /* B2 = 0.061264 */
- -1860, /* B1 = -0.113568 */
- 2007, /* B0 = 0.061264 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f520 */
- 30001, /* A1 = -1.831116 */
- -32613, /* A2 = 0.995270 */
- -155, /* B2 = -0.004750 */
- 0, /* B1 = 0.000000 */
- 155, /* B0 = 0.004750 */
- 29985, /* A1 = -1.830200 */
- -32710, /* A2 = 0.998260 */
- 6584, /* B2 = 0.200928 */
- -6018, /* B1 = -0.367355 */
- 6584, /* B0 = 0.200928 */
- 30105, /* A1 = -1.837524 */
- -32712, /* A2 = 0.998291 */
- 23812, /* B2 = 0.726685 */
- -21936, /* B1 = -1.338928 */
- 23812, /* B0 = 0.726685 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f523 */
- 29964, /* A1 = -1.828918 */
- -32601, /* A2 = 0.994904 */
- -101, /* B2 = -0.003110 */
- 0, /* B1 = 0.000000 */
- 101, /* B0 = 0.003110 */
- 29949, /* A1 = -1.827942 */
- -32700, /* A2 = 0.997925 */
- 11041, /* B2 = 0.336975 */
- -10075, /* B1 = -0.614960 */
- 11041, /* B0 = 0.336975 */
- 30070, /* A1 = -1.835388 */
- -32702, /* A2 = 0.997986 */
- 16762, /* B2 = 0.511536 */
- -15437, /* B1 = -0.942230 */
- 16762, /* B0 = 0.511536 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f525 */
- 29936, /* A1 = -1.827209 */
- -32584, /* A2 = 0.994415 */
- -91, /* B2 = -0.002806 */
- 0, /* B1 = 0.000000 */
- 91, /* B0 = 0.002806 */
- 29921, /* A1 = -1.826233 */
- -32688, /* A2 = 0.997559 */
- 11449, /* B2 = 0.349396 */
- -10426, /* B1 = -0.636383 */
- 11449, /* B0 = 0.349396 */
- 30045, /* A1 = -1.833862 */
- -32688, /* A2 = 0.997589 */
- 13055, /* B2 = 0.398407 */
- -12028, /* B1 = -0.734161 */
- 13055, /* B0 = 0.398407 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f540_660[] */
- 28499, /* A1 = 1.739441 */
- -31129, /* A2 = -0.949982 */
- -849, /* B2 = -0.025922 */
- 0, /* B1 = 0 */
- 849, /* B0 = 0.025922 */
- 28128, /* A1 = 1.716797 */
- -32130, /* A2 = -0.98056 */
- 14556, /* B2 = 0.444214 */
- -12251, /* B1 = -0.747772 */
- 14556, /* B0 = 0.444244 */
- 29667, /* A1 = 1.81073 */
- -32244, /* A2 = -0.984039 */
- 23038, /* B2 = 0.703064 */
- -21358, /* B1 = -1.303589 */
- 23040, /* B0 = 0.703125 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f587 */
- 29271, /* A1 = -1.786560 */
- -32599, /* A2 = 0.994873 */
- -490, /* B2 = -0.014957 */
- 0, /* B1 = 0.000000 */
- 490, /* B0 = 0.014957 */
- 29246, /* A1 = -1.785095 */
- -32700, /* A2 = 0.997925 */
- 28961, /* B2 = 0.883850 */
- -25796, /* B1 = -1.574463 */
- 28961, /* B0 = 0.883850 */
- 29383, /* A1 = -1.793396 */
- -32700, /* A2 = 0.997955 */
- 1299, /* B2 = 0.039650 */
- -1169, /* B1 = -0.071396 */
- 1299, /* B0 = 0.039650 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f590 */
- 29230, /* A1 = -1.784058 */
- -32584, /* A2 = 0.994415 */
- -418, /* B2 = -0.012757 */
- 0, /* B1 = 0.000000 */
- 418, /* B0 = 0.012757 */
- 29206, /* A1 = -1.782593 */
- -32688, /* A2 = 0.997559 */
- 36556, /* B2 = 1.115601 */
- -32478, /* B1 = -1.982300 */
- 36556, /* B0 = 1.115601 */
- 29345, /* A1 = -1.791077 */
- -32688, /* A2 = 0.997589 */
- 897, /* B2 = 0.027397 */
- -808, /* B1 = -0.049334 */
- 897, /* B0 = 0.027397 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f600 */
- 29116, /* A1 = -1.777100 */
- -32603, /* A2 = 0.994965 */
- -165, /* B2 = -0.005039 */
- 0, /* B1 = 0.000000 */
- 165, /* B0 = 0.005039 */
- 29089, /* A1 = -1.775452 */
- -32708, /* A2 = 0.998199 */
- 6963, /* B2 = 0.212494 */
- -6172, /* B1 = -0.376770 */
- 6963, /* B0 = 0.212494 */
- 29237, /* A1 = -1.784485 */
- -32710, /* A2 = 0.998230 */
- 24197, /* B2 = 0.738464 */
- -21657, /* B1 = -1.321899 */
- 24197, /* B0 = 0.738464 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f660 */
- 28376, /* A1 = -1.731934 */
- -32567, /* A2 = 0.993896 */
- -363, /* B2 = -0.011102 */
- 0, /* B1 = 0.000000 */
- 363, /* B0 = 0.011102 */
- 28337, /* A1 = -1.729614 */
- -32683, /* A2 = 0.997434 */
- 21766, /* B2 = 0.664246 */
- -18761, /* B1 = -1.145081 */
- 21766, /* B0 = 0.664246 */
- 28513, /* A1 = -1.740356 */
- -32686, /* A2 = 0.997498 */
- 2509, /* B2 = 0.076584 */
- -2196, /* B1 = -0.134041 */
- 2509, /* B0 = 0.076584 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f700 */
- 27844, /* A1 = -1.699463 */
- -32563, /* A2 = 0.993744 */
- -366, /* B2 = -0.011187 */
- 0, /* B1 = 0.000000 */
- 366, /* B0 = 0.011187 */
- 27797, /* A1 = -1.696655 */
- -32686, /* A2 = 0.997498 */
- 22748, /* B2 = 0.694214 */
- -19235, /* B1 = -1.174072 */
- 22748, /* B0 = 0.694214 */
- 27995, /* A1 = -1.708740 */
- -32688, /* A2 = 0.997559 */
- 2964, /* B2 = 0.090477 */
- -2546, /* B1 = -0.155449 */
- 2964, /* B0 = 0.090477 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f740 */
- 27297, /* A1 = -1.666077 */
- -32551, /* A2 = 0.993408 */
- -345, /* B2 = -0.010540 */
- 0, /* B1 = 0.000000 */
- 345, /* B0 = 0.010540 */
- 27240, /* A1 = -1.662598 */
- -32683, /* A2 = 0.997406 */
- 22560, /* B2 = 0.688477 */
- -18688, /* B1 = -1.140625 */
- 22560, /* B0 = 0.688477 */
- 27461, /* A1 = -1.676147 */
- -32684, /* A2 = 0.997467 */
- 3541, /* B2 = 0.108086 */
- -2985, /* B1 = -0.182220 */
- 3541, /* B0 = 0.108086 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f750 */
- 27155, /* A1 = -1.657410 */
- -32551, /* A2 = 0.993408 */
- -462, /* B2 = -0.014117 */
- 0, /* B1 = 0.000000 */
- 462, /* B0 = 0.014117 */
- 27097, /* A1 = -1.653870 */
- -32683, /* A2 = 0.997406 */
- 32495, /* B2 = 0.991699 */
- -26776, /* B1 = -1.634338 */
- 32495, /* B0 = 0.991699 */
- 27321, /* A1 = -1.667542 */
- -32684, /* A2 = 0.997467 */
- 1835, /* B2 = 0.056007 */
- -1539, /* B1 = -0.093948 */
- 1835, /* B0 = 0.056007 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f750_1450[] */
- 19298, /* A1 = 1.177917 */
- -24471, /* A2 = -0.746796 */
- -4152, /* B2 = -0.126709 */
- 0, /* B1 = 0 */
- 4152, /* B0 = 0.126709 */
- 12902, /* A1 = 0.787476 */
- -29091, /* A2 = -0.887817 */
- 12491, /* B2 = 0.38121 */
- -1794, /* B1 = -0.109528 */
- 12494, /* B0 = 0.381317 */
- 26291, /* A1 = 1.604736 */
- -30470, /* A2 = -0.929901 */
- 28859, /* B2 = 0.880737 */
- -26084, /* B1 = -1.592102 */
- 28861, /* B0 = 0.880798 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f770 */
- 26867, /* A1 = -1.639832 */
- -32551, /* A2 = 0.993408 */
- -123, /* B2 = -0.003755 */
- 0, /* B1 = 0.000000 */
- 123, /* B0 = 0.003755 */
- 26805, /* A1 = -1.636108 */
- -32683, /* A2 = 0.997406 */
- 17297, /* B2 = 0.527863 */
- -14096, /* B1 = -0.860382 */
- 17297, /* B0 = 0.527863 */
- 27034, /* A1 = -1.650085 */
- -32684, /* A2 = 0.997467 */
- 12958, /* B2 = 0.395477 */
- -10756, /* B1 = -0.656525 */
- 12958, /* B0 = 0.395477 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f800 */
- 26413, /* A1 = -1.612122 */
- -32547, /* A2 = 0.993286 */
- -223, /* B2 = -0.006825 */
- 0, /* B1 = 0.000000 */
- 223, /* B0 = 0.006825 */
- 26342, /* A1 = -1.607849 */
- -32686, /* A2 = 0.997498 */
- 6391, /* B2 = 0.195053 */
- -5120, /* B1 = -0.312531 */
- 6391, /* B0 = 0.195053 */
- 26593, /* A1 = -1.623108 */
- -32688, /* A2 = 0.997559 */
- 23681, /* B2 = 0.722717 */
- -19328, /* B1 = -1.179688 */
- 23681, /* B0 = 0.722717 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f816 */
- 26168, /* A1 = -1.597209 */
- -32528, /* A2 = 0.992706 */
- -235, /* B2 = -0.007182 */
- 0, /* B1 = 0.000000 */
- 235, /* B0 = 0.007182 */
- 26092, /* A1 = -1.592590 */
- -32675, /* A2 = 0.997192 */
- 20823, /* B2 = 0.635498 */
- -16510, /* B1 = -1.007751 */
- 20823, /* B0 = 0.635498 */
- 26363, /* A1 = -1.609070 */
- -32677, /* A2 = 0.997253 */
- 6739, /* B2 = 0.205688 */
- -5459, /* B1 = -0.333206 */
- 6739, /* B0 = 0.205688 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f850 */
- 25641, /* A1 = -1.565063 */
- -32536, /* A2 = 0.992950 */
- -121, /* B2 = -0.003707 */
- 0, /* B1 = 0.000000 */
- 121, /* B0 = 0.003707 */
- 25560, /* A1 = -1.560059 */
- -32684, /* A2 = 0.997437 */
- 18341, /* B2 = 0.559753 */
- -14252, /* B1 = -0.869904 */
- 18341, /* B0 = 0.559753 */
- 25837, /* A1 = -1.577026 */
- -32684, /* A2 = 0.997467 */
- 16679, /* B2 = 0.509003 */
- -13232, /* B1 = -0.807648 */
- 16679, /* B0 = 0.509003 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f857_1645[] */
- 16415, /* A1 = 1.001953 */
- -23669, /* A2 = -0.722321 */
- -4549, /* B2 = -0.138847 */
- 0, /* B1 = 0 */
- 4549, /* B0 = 0.138847 */
- 8456, /* A1 = 0.516174 */
- -28996, /* A2 = -0.884918 */
- 13753, /* B2 = 0.419724 */
- -12, /* B1 = -0.000763 */
- 13757, /* B0 = 0.419846 */
- 24632, /* A1 = 1.503418 */
- -30271, /* A2 = -0.923828 */
- 29070, /* B2 = 0.887146 */
- -25265, /* B1 = -1.542114 */
- 29073, /* B0 = 0.887268 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f900 */
- 24806, /* A1 = -1.514099 */
- -32501, /* A2 = 0.991852 */
- -326, /* B2 = -0.009969 */
- 0, /* B1 = 0.000000 */
- 326, /* B0 = 0.009969 */
- 24709, /* A1 = -1.508118 */
- -32659, /* A2 = 0.996674 */
- 20277, /* B2 = 0.618835 */
- -15182, /* B1 = -0.926636 */
- 20277, /* B0 = 0.618835 */
- 25022, /* A1 = -1.527222 */
- -32661, /* A2 = 0.996735 */
- 4320, /* B2 = 0.131836 */
- -3331, /* B1 = -0.203339 */
- 4320, /* B0 = 0.131836 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f900_1300[] */
- 19776, /* A1 = 1.207092 */
- -27437, /* A2 = -0.837341 */
- -2666, /* B2 = -0.081371 */
- 0, /* B1 = 0 */
- 2666, /* B0 = 0.081371 */
- 16302, /* A1 = 0.995026 */
- -30354, /* A2 = -0.926361 */
- 10389, /* B2 = 0.317062 */
- -3327, /* B1 = -0.203064 */
- 10389, /* B0 = 0.317062 */
- 24299, /* A1 = 1.483154 */
- -30930, /* A2 = -0.943909 */
- 25016, /* B2 = 0.763428 */
- -21171, /* B1 = -1.292236 */
- 25016, /* B0 = 0.763428 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f935_1215[] */
- 20554, /* A1 = 1.254517 */
- -28764, /* A2 = -0.877838 */
- -2048, /* B2 = -0.062515 */
- 0, /* B1 = 0 */
- 2048, /* B0 = 0.062515 */
- 18209, /* A1 = 1.11145 */
- -30951, /* A2 = -0.94458 */
- 9390, /* B2 = 0.286575 */
- -3955, /* B1 = -0.241455 */
- 9390, /* B0 = 0.286575 */
- 23902, /* A1 = 1.458923 */
- -31286, /* A2 = -0.954803 */
- 23252, /* B2 = 0.709595 */
- -19132, /* B1 = -1.167725 */
- 23252, /* B0 = 0.709595 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f941_1477[] */
- 17543, /* A1 = 1.07074 */
- -26220, /* A2 = -0.800201 */
- -3298, /* B2 = -0.100647 */
- 0, /* B1 = 0 */
- 3298, /* B0 = 0.100647 */
- 12423, /* A1 = 0.75827 */
- -30036, /* A2 = -0.916626 */
- 12651, /* B2 = 0.386078 */
- -2444, /* B1 = -0.14917 */
- 12653, /* B0 = 0.386154 */
- 23518, /* A1 = 1.435425 */
- -30745, /* A2 = -0.938293 */
- 27282, /* B2 = 0.832581 */
- -22529, /* B1 = -1.375122 */
- 27286, /* B0 = 0.832703 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f942 */
- 24104, /* A1 = -1.471252 */
- -32507, /* A2 = 0.992065 */
- -351, /* B2 = -0.010722 */
- 0, /* B1 = 0.000000 */
- 351, /* B0 = 0.010722 */
- 23996, /* A1 = -1.464600 */
- -32671, /* A2 = 0.997040 */
- 22848, /* B2 = 0.697266 */
- -16639, /* B1 = -1.015564 */
- 22848, /* B0 = 0.697266 */
- 24332, /* A1 = -1.485168 */
- -32673, /* A2 = 0.997101 */
- 4906, /* B2 = 0.149727 */
- -3672, /* B1 = -0.224174 */
- 4906, /* B0 = 0.149727 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f950 */
- 23967, /* A1 = -1.462830 */
- -32507, /* A2 = 0.992065 */
- -518, /* B2 = -0.015821 */
- 0, /* B1 = 0.000000 */
- 518, /* B0 = 0.015821 */
- 23856, /* A1 = -1.456055 */
- -32671, /* A2 = 0.997040 */
- 26287, /* B2 = 0.802246 */
- -19031, /* B1 = -1.161560 */
- 26287, /* B0 = 0.802246 */
- 24195, /* A1 = -1.476746 */
- -32673, /* A2 = 0.997101 */
- 2890, /* B2 = 0.088196 */
- -2151, /* B1 = -0.131317 */
- 2890, /* B0 = 0.088196 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f950_1400[] */
- 18294, /* A1 = 1.116638 */
- -26962, /* A2 = -0.822845 */
- -2914, /* B2 = -0.088936 */
- 0, /* B1 = 0 */
- 2914, /* B0 = 0.088936 */
- 14119, /* A1 = 0.861786 */
- -30227, /* A2 = -0.922455 */
- 11466, /* B2 = 0.349945 */
- -2833, /* B1 = -0.172943 */
- 11466, /* B0 = 0.349945 */
- 23431, /* A1 = 1.430115 */
- -30828, /* A2 = -0.940796 */
- 25331, /* B2 = 0.773071 */
- -20911, /* B1 = -1.276367 */
- 25331, /* B0 = 0.773071 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f975 */
- 23521, /* A1 = -1.435608 */
- -32489, /* A2 = 0.991516 */
- -193, /* B2 = -0.005915 */
- 0, /* B1 = 0.000000 */
- 193, /* B0 = 0.005915 */
- 23404, /* A1 = -1.428467 */
- -32655, /* A2 = 0.996582 */
- 17740, /* B2 = 0.541412 */
- -12567, /* B1 = -0.767029 */
- 17740, /* B0 = 0.541412 */
- 23753, /* A1 = -1.449829 */
- -32657, /* A2 = 0.996613 */
- 9090, /* B2 = 0.277405 */
- -6662, /* B1 = -0.406647 */
- 9090, /* B0 = 0.277405 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f1000 */
- 23071, /* A1 = -1.408203 */
- -32489, /* A2 = 0.991516 */
- -293, /* B2 = -0.008965 */
- 0, /* B1 = 0.000000 */
- 293, /* B0 = 0.008965 */
- 22951, /* A1 = -1.400818 */
- -32655, /* A2 = 0.996582 */
- 5689, /* B2 = 0.173645 */
- -3951, /* B1 = -0.241150 */
- 5689, /* B0 = 0.173645 */
- 23307, /* A1 = -1.422607 */
- -32657, /* A2 = 0.996613 */
- 18692, /* B2 = 0.570435 */
- -13447, /* B1 = -0.820770 */
- 18692, /* B0 = 0.570435 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f1020 */
- 22701, /* A1 = -1.385620 */
- -32474, /* A2 = 0.991058 */
- -292, /* B2 = -0.008933 */
- 0, /*163840 , B1 = 10.000000 */
- 292, /* B0 = 0.008933 */
- 22564, /* A1 = -1.377258 */
- -32655, /* A2 = 0.996552 */
- 20756, /* B2 = 0.633423 */
- -14176, /* B1 = -0.865295 */
- 20756, /* B0 = 0.633423 */
- 22960, /* A1 = -1.401428 */
- -32657, /* A2 = 0.996613 */
- 6520, /* B2 = 0.198990 */
- -4619, /* B1 = -0.281937 */
- 6520, /* B0 = 0.198990 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f1050 */
- 22142, /* A1 = -1.351501 */
- -32474, /* A2 = 0.991058 */
- -147, /* B2 = -0.004493 */
- 0, /* B1 = 0.000000 */
- 147, /* B0 = 0.004493 */
- 22000, /* A1 = -1.342834 */
- -32655, /* A2 = 0.996552 */
- 15379, /* B2 = 0.469360 */
- -10237, /* B1 = -0.624847 */
- 15379, /* B0 = 0.469360 */
- 22406, /* A1 = -1.367554 */
- -32657, /* A2 = 0.996613 */
- 17491, /* B2 = 0.533783 */
- -12096, /* B1 = -0.738312 */
- 17491, /* B0 = 0.533783 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f1100_1750[] */
- 12973, /* A1 = 0.79184 */
- -24916, /* A2 = -0.760376 */
- 6655, /* B2 = 0.203102 */
- 367, /* B1 = 0.0224 */
- 6657, /* B0 = 0.203171 */
- 5915, /* A1 = 0.361053 */
- -29560, /* A2 = -0.90213 */
- -7777, /* B2 = -0.23735 */
- 0, /* B1 = 0 */
- 7777, /* B0 = 0.23735 */
- 20510, /* A1 = 1.251892 */
- -30260, /* A2 = -0.923462 */
- 26662, /* B2 = 0.81366 */
- -20573, /* B1 = -1.255737 */
- 26668, /* B0 = 0.813843 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f1140 */
- 20392, /* A1 = -1.244629 */
- -32460, /* A2 = 0.990601 */
- -270, /* B2 = -0.008240 */
- 0, /* B1 = 0.000000 */
- 270, /* B0 = 0.008240 */
- 20218, /* A1 = -1.234009 */
- -32655, /* A2 = 0.996582 */
- 21337, /* B2 = 0.651154 */
- -13044, /* B1 = -0.796143 */
- 21337, /* B0 = 0.651154 */
- 20684, /* A1 = -1.262512 */
- -32657, /* A2 = 0.996643 */
- 8572, /* B2 = 0.261612 */
- -5476, /* B1 = -0.334244 */
- 8572, /* B0 = 0.261612 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f1200 */
- 19159, /* A1 = -1.169373 */
- -32456, /* A2 = 0.990509 */
- -335, /* B2 = -0.010252 */
- 0, /* B1 = 0.000000 */
- 335, /* B0 = 0.010252 */
- 18966, /* A1 = -1.157593 */
- -32661, /* A2 = 0.996735 */
- 6802, /* B2 = 0.207588 */
- -3900, /* B1 = -0.238098 */
- 6802, /* B0 = 0.207588 */
- 19467, /* A1 = -1.188232 */
- -32661, /* A2 = 0.996765 */
- 25035, /* B2 = 0.764008 */
- -15049, /* B1 = -0.918579 */
- 25035, /* B0 = 0.764008 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f1209 */
- 18976, /* A1 = -1.158264 */
- -32439, /* A2 = 0.989990 */
- -183, /* B2 = -0.005588 */
- 0, /* B1 = 0.000000 */
- 183, /* B0 = 0.005588 */
- 18774, /* A1 = -1.145874 */
- -32650, /* A2 = 0.996429 */
- 15468, /* B2 = 0.472076 */
- -8768, /* B1 = -0.535217 */
- 15468, /* B0 = 0.472076 */
- 19300, /* A1 = -1.177979 */
- -32652, /* A2 = 0.996490 */
- 19840, /* B2 = 0.605499 */
- -11842, /* B1 = -0.722809 */
- 19840, /* B0 = 0.605499 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f1330 */
- 16357, /* A1 = -0.998413 */
- -32368, /* A2 = 0.987793 */
- -217, /* B2 = -0.006652 */
- 0, /* B1 = 0.000000 */
- 217, /* B0 = 0.006652 */
- 16107, /* A1 = -0.983126 */
- -32601, /* A2 = 0.994904 */
- 11602, /* B2 = 0.354065 */
- -5555, /* B1 = -0.339111 */
- 11602, /* B0 = 0.354065 */
- 16722, /* A1 = -1.020630 */
- -32603, /* A2 = 0.994965 */
- 15574, /* B2 = 0.475311 */
- -8176, /* B1 = -0.499069 */
- 15574, /* B0 = 0.475311 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f1336 */
- 16234, /* A1 = -0.990875 */
- 32404, /* A2 = -0.988922 */
- -193, /* B2 = -0.005908 */
- 0, /* B1 = 0.000000 */
- 193, /* B0 = 0.005908 */
- 15986, /* A1 = -0.975769 */
- -32632, /* A2 = 0.995880 */
- 18051, /* B2 = 0.550903 */
- -8658, /* B1 = -0.528473 */
- 18051, /* B0 = 0.550903 */
- 16591, /* A1 = -1.012695 */
- -32634, /* A2 = 0.995941 */
- 15736, /* B2 = 0.480240 */
- -8125, /* B1 = -0.495926 */
- 15736, /* B0 = 0.480240 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f1366 */
- 15564, /* A1 = -0.949982 */
- -32404, /* A2 = 0.988922 */
- -269, /* B2 = -0.008216 */
- 0, /* B1 = 0.000000 */
- 269, /* B0 = 0.008216 */
- 15310, /* A1 = -0.934479 */
- -32632, /* A2 = 0.995880 */
- 10815, /* B2 = 0.330063 */
- -4962, /* B1 = -0.302887 */
- 10815, /* B0 = 0.330063 */
- 15924, /* A1 = -0.971924 */
- -32634, /* A2 = 0.995941 */
- 18880, /* B2 = 0.576172 */
- -9364, /* B1 = -0.571594 */
- 18880, /* B0 = 0.576172 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f1380 */
- 15247, /* A1 = -0.930603 */
- -32397, /* A2 = 0.988708 */
- -244, /* B2 = -0.007451 */
- 0, /* B1 = 0.000000 */
- 244, /* B0 = 0.007451 */
- 14989, /* A1 = -0.914886 */
- -32627, /* A2 = 0.995697 */
- 18961, /* B2 = 0.578644 */
- -8498, /* B1 = -0.518707 */
- 18961, /* B0 = 0.578644 */
- 15608, /* A1 = -0.952667 */
- -32628, /* A2 = 0.995758 */
- 11145, /* B2 = 0.340134 */
- -5430, /* B1 = -0.331467 */
- 11145, /* B0 = 0.340134 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f1400 */
- 14780, /* A1 = -0.902130 */
- -32393, /* A2 = 0.988586 */
- -396, /* B2 = -0.012086 */
- 0, /* B1 = 0.000000 */
- 396, /* B0 = 0.012086 */
- 14510, /* A1 = -0.885651 */
- -32630, /* A2 = 0.995819 */
- 6326, /* B2 = 0.193069 */
- -2747, /* B1 = -0.167671 */
- 6326, /* B0 = 0.193069 */
- 15154, /* A1 = -0.924957 */
- -32632, /* A2 = 0.995850 */
- 23235, /* B2 = 0.709076 */
- -10983, /* B1 = -0.670380 */
- 23235, /* B0 = 0.709076 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f1477 */
- 13005, /* A1 = -0.793793 */
- -32368, /* A2 = 0.987823 */
- -500, /* B2 = -0.015265 */
- 0, /* B1 = 0.000000 */
- 500, /* B0 = 0.015265 */
- 12708, /* A1 = -0.775665 */
- -32615, /* A2 = 0.995331 */
- 11420, /* B2 = 0.348526 */
- -4306, /* B1 = -0.262833 */
- 11420, /* B0 = 0.348526 */
- 13397, /* A1 = -0.817688 */
- -32615, /* A2 = 0.995361 */
- 9454, /* B2 = 0.288528 */
- -3981, /* B1 = -0.243027 */
- 9454, /* B0 = 0.288528 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f1600 */
- 10046, /* A1 = -0.613190 */
- -32331, /* A2 = 0.986694 */
- -455, /* B2 = -0.013915 */
- 0, /* B1 = 0.000000 */
- 455, /* B0 = 0.013915 */
- 9694, /* A1 = -0.591705 */
- -32601, /* A2 = 0.994934 */
- 6023, /* B2 = 0.183815 */
- -1708, /* B1 = -0.104279 */
- 6023, /* B0 = 0.183815 */
- 10478, /* A1 = -0.639587 */
- -32603, /* A2 = 0.994965 */
- 22031, /* B2 = 0.672333 */
- -7342, /* B1 = -0.448151 */
- 22031, /* B0 = 0.672333 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f1633_1638[] */
- 9181, /* A1 = 0.560394 */
- -32256, /* A2 = -0.984375 */
- -556, /* B2 = -0.016975 */
- 0, /* B1 = 0 */
- 556, /* B0 = 0.016975 */
- 8757, /* A1 = 0.534515 */
- -32574, /* A2 = -0.99408 */
- 8443, /* B2 = 0.25769 */
- -2135, /* B1 = -0.130341 */
- 8443, /* B0 = 0.25769 */
- 9691, /* A1 = 0.591522 */
- -32574, /* A2 = -0.99411 */
- 15446, /* B2 = 0.471375 */
- -4809, /* B1 = -0.293579 */
- 15446, /* B0 = 0.471375 */
- 7, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f1800 */
- 5076, /* A1 = -0.309875 */
- -32304, /* A2 = 0.985840 */
- -508, /* B2 = -0.015503 */
- 0, /* B1 = 0.000000 */
- 508, /* B0 = 0.015503 */
- 4646, /* A1 = -0.283600 */
- -32605, /* A2 = 0.995026 */
- 6742, /* B2 = 0.205780 */
- -878, /* B1 = -0.053635 */
- 6742, /* B0 = 0.205780 */
- 5552, /* A1 = -0.338928 */
- -32605, /* A2 = 0.995056 */
- 23667, /* B2 = 0.722260 */
- -4297, /* B1 = -0.262329 */
- 23667, /* B0 = 0.722260 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- { /* f1860 */
- 3569, /* A1 = -0.217865 */
- -32292, /* A2 = 0.985504 */
- -239, /* B2 = -0.007322 */
- 0, /* B1 = 0.000000 */
- 239, /* B0 = 0.007322 */
- 3117, /* A1 = -0.190277 */
- -32603, /* A2 = 0.994965 */
- 18658, /* B2 = 0.569427 */
- -1557, /* B1 = -0.095032 */
- 18658, /* B0 = 0.569427 */
- 4054, /* A1 = -0.247437 */
- -32603, /* A2 = 0.994965 */
- 18886, /* B2 = 0.576385 */
- -2566, /* B1 = -0.156647 */
- 18886, /* B0 = 0.576385 */
- 5, /* Internal filter scaling */
- 159, /* Minimum in-band energy threshold */
- 21, /* 21/32 in-band to broad-band ratio */
- 0x0FF5 /* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
- },
- };
- static int ixj_init_filter(IXJ *j, IXJ_FILTER * jf)
- {
- unsigned short cmd;
- int cnt, max;
- if (jf->filter > 3) {
- return -1;
- }
- if (ixj_WriteDSPCommand(0x5154 + jf->filter, j)) /* Select Filter */
- return -1;
- if (!jf->enable) {
- if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */
- return -1;
- else
- return 0;
- } else {
- if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */
- return -1;
- /* Select the filter (f0 - f3) to use. */
- if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))
- return -1;
- }
- if (jf->freq < 12 && jf->freq > 3) {
- /* Select the frequency for the selected filter. */
- if (ixj_WriteDSPCommand(0x5170 + jf->freq, j))
- return -1;
- } else if (jf->freq > 11) {
- /* We need to load a programmable filter set for undefined */
- /* frequencies. So we will point the filter to a programmable set. */
- /* Since there are only 4 filters and 4 programmable sets, we will */
- /* just point the filter to the same number set and program it for the */
- /* frequency we want. */
- if (ixj_WriteDSPCommand(0x5170 + jf->filter, j))
- return -1;
- if (j->ver.low != 0x12) {
- cmd = 0x515B;
- max = 19;
- } else {
- cmd = 0x515E;
- max = 15;
- }
- if (ixj_WriteDSPCommand(cmd, j))
- return -1;
- for (cnt = 0; cnt < max; cnt++) {
- if (ixj_WriteDSPCommand(tone_table[jf->freq - 12][cnt], j))
- return -1;
- }
- }
- j->filter_en[jf->filter] = jf->enable;
- return 0;
- }
- static int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr)
- {
- unsigned short cmd;
- int cnt, max;
- if (jfr->filter > 3) {
- return -1;
- }
- if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j)) /* Select Filter */
- return -1;
- if (!jfr->enable) {
- if (ixj_WriteDSPCommand(0x5152, j)) /* Disable Filter */
- return -1;
- else
- return 0;
- } else {
- if (ixj_WriteDSPCommand(0x5153, j)) /* Enable Filter */
- return -1;
- /* Select the filter (f0 - f3) to use. */
- if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))
- return -1;
- }
- /* We need to load a programmable filter set for undefined */
- /* frequencies. So we will point the filter to a programmable set. */
- /* Since there are only 4 filters and 4 programmable sets, we will */
- /* just point the filter to the same number set and program it for the */
- /* frequency we want. */
- if (ixj_WriteDSPCommand(0x5170 + jfr->filter, j))
- return -1;
- if (j->ver.low != 0x12) {
- cmd = 0x515B;
- max = 19;
- } else {
- cmd = 0x515E;
- max = 15;
- }
- if (ixj_WriteDSPCommand(cmd, j))
- return -1;
- for (cnt = 0; cnt < max; cnt++) {
- if (ixj_WriteDSPCommand(jfr->coeff[cnt], j))
- return -1;
- }
- j->filter_en[jfr->filter] = jfr->enable;
- return 0;
- }
- static int ixj_init_tone(IXJ *j, IXJ_TONE * ti)
- {
- int freq0, freq1;
- unsigned short data;
- if (ti->freq0) {
- freq0 = ti->freq0;
- } else {
- freq0 = 0x7FFF;
- }
- if (ti->freq1) {
- freq1 = ti->freq1;
- } else {
- freq1 = 0x7FFF;
- }
- if(ti->tone_index > 12 && ti->tone_index < 28)
- {
- if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j))
- return -1;
- if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j))
- return -1;
- data = freq0;
- if (ixj_WriteDSPCommand(data, j))
- return -1;
- data = freq1;
- if (ixj_WriteDSPCommand(data, j))
- return -1;
- }
- return freq0;
- }
|