123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700 |
- /*
- * rn6752 - Arkmicro rn6752 video decoder driver
- *
- * Copyright (c) 2020,2021 Arkmicro, Inc.
- * This code is placed under the terms of the GNU General Public License v2
- */
- #include <linux/module.h>
- #include <linux/init.h>
- #include <linux/errno.h>
- #include <linux/kernel.h>
- #include <linux/interrupt.h>
- #include <linux/i2c.h>
- #include <linux/slab.h>
- #include <linux/of.h>
- #include <linux/gpio/consumer.h>
- #include <linux/videodev2.h>
- #include <media/v4l2-ioctl.h>
- #include <media/v4l2-event.h>
- #include <media/v4l2-device.h>
- #include <media/v4l2-ctrls.h>
- #include <linux/mutex.h>
- #include <linux/delay.h>
- extern int dvr_get_pragressive(void);
- extern void dvr_restart(void);
- //#define RN6752_CVBS_PAL_CHECK_ERR //rn6752 signal check error
- #define RN6752V1_CVBS_PAL_PROGRESSIVE
- struct rn6752 {
- struct v4l2_ctrl_handler hdl;
- struct v4l2_subdev sd;
- struct gpio_desc *reset_gpio;
- struct workqueue_struct *eq_queue;
- struct work_struct eq_work;
- struct i2c_client *client;
- struct timer_list timer;
- volatile bool timer_start;
- volatile int timer_timeout;
- struct timer_list work_timer;
- int mode;
- int itu601in;
- int camera_mode;
- int progressive;
- int curr_channel;
- int signal;
- int id;
- volatile int enter_eq_work;
- int enter_auxin;
- int dvr_start;
- int enter_carback;
- int last_source;
- u32 input;
- u8 brightness;
- u8 contrast;
- u8 saturation;
- u8 hue;
- unsigned short default_addr;
- };
- static bool rn6752_dbg = false;
- #define VIDIOC_GET_RESOLUTION _IOWR('V', BASE_VIDIOC_PRIVATE + 1, int)
- #define VIDIOC_GET_PROGRESSIVE _IOWR('V', BASE_VIDIOC_PRIVATE + 2, int)
- #define VIDIOC_GET_CHIPINFO _IOWR('V', BASE_VIDIOC_PRIVATE + 3, int)
- #define VIDIOC_ENTER_CARBACK _IOWR('V', BASE_VIDIOC_PRIVATE + 4, int)
- #define VIDIOC_EXIT_CARBACK _IOWR('V', BASE_VIDIOC_PRIVATE + 5, int)
- #define VIDIOC_GET_ITU601_ENABLE _IOWR('V', BASE_VIDIOC_PRIVATE + 6, int)
- #define VIDIOC_SET_AVIN_MODE _IOWR('V', BASE_VIDIOC_PRIVATE + 7, int)
- #define VIDIOC_ENABLE_TIME _IOWR('V', BASE_VIDIOC_PRIVATE + 8, int)
- #define ARK_DVR_BRIGHTNESS_MASK (1<<0)
- #define ARK_DVR_CONTRAST_MASK (1<<1)
- #define ARK_DVR_SATURATION_MASK (1<<2)
- #define ARK_DVR_HUE_MASK (1<<3)
- #define ARK_DVR_SHARPNESS_MASK (1<<4)
- #define RN6752_STATUS 0x26
- #define RN6752_BUS_STATUS 0xaf
- #define RN6752_CONTRAST_CTL 0xd3
- #define RN6752_BRIGHT_CTL 0xd4
- #define RN6752_HUE_CTL 0xd5
- #define RN6752_SATURATION_CTL 0xd6
- #define RN6752_INPUT_CTL 0xdc
- enum {
- RN6752_MODE_NONE,
- //CVBS mode
- RN6752_MODE_CVBS_PAL,
- RN6752_MODE_CVBS_NTSC,
- //add other mode
-
- //720P mode
- RN6752_MODE_720P_25FPS,
- RN6752_MODE_720P_30FPS,
- RN6752_MODE_1080P_25FPS,
- RN6752_MODE_1080P_30FPS,
- RN6752_MODE_END,
- };
- enum {
- RN6752_BRIGHTNESS_ADDR = 0x01,
- RN6752_CONTRAST_ADDR = 0x02,
- RN6752_SATURATION_ADDR = 0x03,
- RN6752_HUE_ADDR = 0x04,
- RN6752_SHARPNESS_ADDR = 0x05
- };
- enum {
- RN675X_ID_UNKNOWN,
- RN675X_ID_RN6752,
- RN675X_ID_RN6752M,
- RN675X_ID_RN6752V1,
- RN675X_ID_END
- };
- enum dvr_source {
- DVR_SOURCE_CAMERA,
- DVR_SOURCE_AUX,
- DVR_SOURCE_DVD,
- };
- enum {
- TYPE_UNKNOWN = -1,
- TYPE_CVBS = 0,
- TYPE_720P,
- TYPE_1080P,
- };
- enum carback_camera_mode {
- CARBACK_CAMERA_MODE_DYNAMIC,
- CARBACK_CAMERA_MODE_CVBS_PAL,
- CARBACK_CAMERA_MODE_CVBS_NTST,
- CARBACK_CAMERA_MODE_720P25,
- CARBACK_CAMERA_MODE_720P30,
- CARBACK_CAMERA_MODE_1080P25,
- CARBACK_CAMERA_MODE_1080P30,
- //add others mode.
- CARBACK_CAMERA_MODE_END
- };
- enum {
- TYPE_UNDEF = -1,
- TYPE_ARK7116 = 0,
- TYPE_ARK7116H,
- TYPE_RN6752,
- TYPE_PR2000,
- };
- const char rxchip_rn6752_cvbs_pal[] = {
- // 720H@50, 27MHz, BT656 output
- // Slave address is 0x58
- // Register, data
- // if clock source(Xin) of RN675x is 26MHz, please add these procedures marked first
- //0xD2, 0x85, // disable auto clock detect
- //0xD6, 0x37, // 27MHz default
- //0xD8, 0x18, // switch to 26MHz clock
- //delay(100), // delay 100ms
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x00, // enable 72MHz sampling
- 0xDB, 0x8F, // internal use*
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x2C, 0x30, // select sync slice points
- 0x50, 0x00, // 720H resolution select for BT.601
- 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
- 0x63, 0x09, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x00, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x07, 0x22, // PAL format
- 0x2F, 0x14, // internal use
- 0x5E, 0x03, // disable H-scaling control
- 0x5B, 0x00, //
- 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x3E, 0x32, // AVID & VBLK out for BT.601
- 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x46, 0x23, // AVID & VBLK out for BT.601
- 0x28, 0x92, // cropping //old:0x92
- 0x00, 0x00, // internal use*
- 0x2D, 0xF2, // cagc adjust
- 0x0D, 0x20, // cagc initial value
- // 0x05, 0x00, // sharpness
- // 0x04, 0x80, // hue
- 0x11, 0x03,
- 0x37, 0x33,
- 0x61, 0x6C,
- 0xDF, 0xFF, // enable 720H format
- 0x8E, 0x00, // single channel output for VP
- 0x8F, 0x00, // 720H mode for VP
- 0x8D, 0x31, // enable VP out
- 0x89, 0x00, // select 27MHz for SCLK
- 0x88, 0xC1, // enable SCLK out
- 0x81, 0x01, // turn on video decoder
- 0x96, 0x00, // select AVID & VBLK as status indicator
- 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
- 0x98, 0x00, // video timing pin status
- 0x9A, 0x40, // select AVID & VBLK as status indicator
- 0x9B, 0xE1, // enable status indicator out on HSYNC
- 0x9C, 0x00, // video timing pin status
- };
- const char rxchip_rn6752_cvbs_ntsc[] = {
- // 720H@60, 27MHz, BT656 output
- // Slave address is 0x58
- // Register, data
- // if clock source(Xin) of RN675x is 26MHz, please add these procedures marked first
- //0xD2, 0x85, // disable auto clock detect
- //0xD6, 0x37, // 27MHz default
- //0xD8, 0x18, // switch to 26MHz clock
- //delay(100), // delay 100ms
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x00, // enable 72MHz sampling
- 0xDB, 0x8F, // internal use*
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x2C, 0x30, // select sync slice points
- 0x50, 0x00, // 720H resolution select for BT.601
- 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
- 0x63, 0x09, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x00, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x07, 0x23, // NTSC format
- 0x2F, 0x14, // internal use
- 0x5E, 0x03, // disable H-scaling control
- 0x5B, 0x00, //
- 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x3E, 0x32, // AVID & VBLK out for BT.601
- 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x46, 0x23, // AVID & VBLK out for BT.601
- 0x28, 0x92, // cropping
- 0x00, 0x00, // internal use*
- 0x2D, 0xF2, // cagc adjust
- 0x0D, 0x20, // cagc initial value
- // 0x05, 0x00, // sharpness
- // 0x04, 0x80, // hue
- 0x11, 0x03,
- 0x37, 0x33,
- 0x61, 0x6C,
- 0xDF, 0xFF, // enable 720H format
- 0x8E, 0x00, // single channel output for VP
- 0x8F, 0x00, // 720H mode for VP
- 0x8D, 0x31, // enable VP out
- 0x89, 0x00, // select 27MHz for SCLK
- 0x88, 0xC1, // enable SCLK out
- 0x81, 0x01, // turn on video decoder
- 0x96, 0x00, // select AVID & VBLK as status indicator
- 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
- 0x98, 0x00, // video timing pin status
- 0x9A, 0x40, // select AVID & VBLK as status indicator
- 0x9B, 0xE1, // enable status indicator out on HSYNC
- 0x9C, 0x00, // video timing pin status
- };
- const char rxchip_rn6752_720p_pal[]=
- {
- // 720P@25, 72MHz, BT656 output
- // Slave address is 0x58
- // Register, data
- // if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
- //0xD2, 0x85, // disable auto clock detect
- //0xD6, 0x37, // 27MHz default
- //0xD8, 0x18, // switch to 26MHz clock
- //delay(100), // delay 100ms
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x04, // enable 72MHz sampling
- 0xDB, 0x8F, // internal use*
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x2C, 0x30, // select sync slice points
- 0x50, 0x02, // 720p resolution select for BT.601
- 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
- 0x63, 0xBD, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x02, // data for extended register :Pal
- 0x58, 0x01, // enable extended register write
- 0x07, 0x23, // 720p format
- 0x2F, 0x04, // internal use*
- 0x5E, 0x0B, // enable H-scaling control
- 0x51, 0x44, // scale factor1
- 0x52, 0x86, // scale factor2
- 0x53, 0x22, // scale factor3
- 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x3E, 0x32, // AVID & VBLK out for BT.601
- 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x46, 0x23, // AVID & VBLK out for BT.601
- 0x28, 0x92, // cropping
- 0x00, 0x20, // internal use*
- 0x2D, 0xF2, // cagc adjust
- 0x0D, 0x20, // cagc initial value
- // 0x05, 0x00, // sharpness
- // 0x04, 0x80, // hue
- 0x11, 0x84,
- 0x37, 0x33,
- 0x61, 0x6C,
- 0xDF, 0xFE, // enable 720p format
- 0x8E, 0x00, // single channel output for VP
- 0x8F, 0x80, // 720p mode for VP
- 0x8D, 0x31, // enable VP out
- 0x89, 0x09, // select 72MHz for SCLK
- 0x88, 0xC1, // enable SCLK out
- 0x81, 0x01, // turn on video decoder
- 0x96, 0x00, // select AVID & VBLK as status indicator
- 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
- 0x98, 0x00, // video timing pin status
- 0x9A, 0x40, // select AVID & VBLK as status indicator
- 0x9B, 0xE1, // enable status indicator out on HSYNC
- 0x9C, 0x00, // video timing pin status
- };
- const char rxchip_rn6752_720p_ntsc[] = {
- // 720P@30, 72MHz, BT656 output
- // Slave address is 0x58
- // Register, data
- // if clock source(Xin) of RN675x is 26MHz, please add these procedures marked first
- //0xD2, 0x85, // disable auto clock detect
- //0xD6, 0x37, // 27MHz default
- //0xD8, 0x18, // switch to 26MHz clock
- //delay(100), // delay 100ms
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x04, // enable 72MHz sampling
- 0xDB, 0x8F, // internal use*
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x2C, 0x30, // select sync slice points
- 0x50, 0x02, // 720p resolution select for BT.601
- 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
- 0x63, 0xBD, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x04, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x07, 0x23, // 720p format
- 0x2F, 0x04, // internal use*
- 0x5E, 0x0B, // enable H-scaling control
- 0x51, 0x44, // scale factor1
- 0x52, 0x86, // scale factor2
- 0x53, 0x22, // scale factor3
- 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x3E, 0x32, // AVID & VBLK out for BT.601
- 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x46, 0x23, // AVID & VBLK out for BT.601
- 0x28, 0x92, // cropping
- 0x00, 0x20, // internal use*
- 0x2D, 0xF2, // cagc adjust
- 0x0D, 0x20, // cagc initial value
- // 0x05, 0x00, // sharpness
- // 0x04, 0x80, // hue
- 0x11, 0x84,
- 0x37, 0x33,
- 0x61, 0x6C,
- 0xDF, 0xFE, // enable 720p format
- 0x8E, 0x00, // single channel output for VP
- 0x8F, 0x80, // 720p mode for VP
- 0x8D, 0x31, // enable VP out
- 0x89, 0x09, // select 72MHz for SCLK
- 0x88, 0xC1, // enable SCLK out
- 0x81, 0x01, // turn on video decoder
- 0x96, 0x00, // select AVID & VBLK as status indicator
- 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
- 0x98, 0x00, // video timing pin status
- 0x9A, 0x40, // select AVID & VBLK as status indicator
- 0x9B, 0xE1, // enable status indicator out on HSYNC
- 0x9C, 0x00, // video timing pin status
- };
- static const char rn6752_itu656_cvbs_pal[]=
- {
- #if 1
- //\B5\A5\B3\A1\CA\E4\B3\F6\C5\E4\D6\C3(itu656)
- // 720H@50, 27MHz, BT601 output
- // Slave address is 0x58
- // Register, data
- // if clock source(Xin) of RN675x is 26MHz, please add these procedures marked first
- //0xD2, 0x85, // disable auto clock detect
- //0xD6, 0x37, // 27MHz default
- //0xD8, 0x18, // switch to 26MHz clock
- //delay(100), // delay 100ms
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x00, // enable 72MHz sampling
- 0xDB, 0x8F, // internal use*
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x2C, 0x30, // select sync slice points
- 0x50, 0x00, // 720H resolution select for BT.601
- 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
- 0x63, 0x09, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x00, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x07, 0x22, // PAL format
- 0x2F, 0x14, // internal use
- 0x5E, 0x03, // disable H-scaling control
- 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x3E, 0x32, // AVID & VBLK out for BT.601
- 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x46, 0x23, // AVID & VBLK out for BT.601
- 0x47, 0xC3, // for customer project
- 0x41, 0x00,
- 0x42, 0x00,
- 0x20, 0x24,
- 0x21, 0x46,
- 0x22, 0xAF,
- 0x23, 0X17,
- 0x24, 0X37,
- 0x25, 0X17,
- 0x26, 0X00,
- 0x28, 0xE2, // cropping
- 0x00, 0x00, // internal use*
- 0x2D, 0xF2, // cagc adjust
- 0x0D, 0x20, // cagc initial value
- 0x05, 0x00, // sharpness
- 0x04, 0x80, // hue
- 0x11, 0x03,
- 0x37, 0x33,
- 0x61, 0x6C,
- 0xDF, 0xFF, // enable 720H format
- 0x8E, 0x00, // single channel output for VP
- 0x8F, 0x00, // 720H mode for VP
- 0x8D, 0x31, // enable VP out
- 0x89, 0x00, // select 27MHz for SCLK
- 0x88, 0xC1, // enable SCLK out
- 0x81, 0x01, // turn on video decoder
- 0x96, 0x00, // select AVID & VBLK as status indicator
- 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
- 0x98, 0x00, // video timing pin status
- 0x9A, 0x40, // select AVID & VBLK as status indicator
- 0x9B, 0xE1, // enable status indicator out on HSYNC
- 0x9C, 0x00, // video timing pin status
- #else
- //\u02eb\B3\A1\CA\E4\B3\F6\C5\E4\D6\C3(itu656)
- // 720H@50, 27MHz, BT656 output
- // Slave address is 0x58
- // Register, data
- // if clock source(Xin) of RN675x is 26MHz, please add these procedures marked first
- //0xD2, 0x85, // disable auto clock detect
- //0xD6, 0x37, // 27MHz default
- //0xD8, 0x18, // switch to 26MHz clock
- //delay(100), // delay 100ms
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x00, // enable 72MHz sampling
- 0xDB, 0x8F, // internal use*
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x2C, 0x30, // select sync slice points
- 0x50, 0x00, // 720H resolution select for BT.601
- 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
- 0x63, 0x09, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x00, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x07, 0x22, // PAL format
- 0x2F, 0x14, // internal use
- 0x5E, 0x03, // disable H-scaling control
- 0x5B, 0x00, //
- 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x3E, 0x32, // AVID & VBLK out for BT.601
- 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x46, 0x23, // AVID & VBLK out for BT.601
- 0x28, 0x92, // cropping
- 0x00, 0x00, // internal use*
- 0x2D, 0xF2, // cagc adjust
- 0x0D, 0x20, // cagc initial value
- 0x05, 0x00, // sharpness
- 0x04, 0x80, // hue
- 0x11, 0x03,
- 0x37, 0x33,
- 0x61, 0x6C,
- 0xDF, 0xFF, // enable 720H format
- 0x8E, 0x00, // single channel output for VP
- 0x8F, 0x00, // 720H mode for VP
- 0x8D, 0x31, // enable VP out
- 0x89, 0x00, // select 27MHz for SCLK
- 0x88, 0xC1, // enable SCLK out
- 0x81, 0x01, // turn on video decoder
- 0x96, 0x00, // select AVID & VBLK as status indicator
- 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
- 0x98, 0x00, // video timing pin status
- 0x9A, 0x40, // select AVID & VBLK as status indicator
- 0x9B, 0xE1, // enable status indicator out on HSYNC
- 0x9C, 0x00, // video timing pin status
- #endif
- };
- static const char rn6752_itu656_cvbs_ntsc[]=
- {
- #if 0
- //\B5\A5\B3\A1\CA\E4\B3\F6\C5\E4\D6\C3(itu656)
- // 720H@60, 27MHz, BT601 output
- // Slave address is 0x58
- // Register, data
- // if clock source(Xin) of RN675x is 26MHz, please add these procedures marked first
- //0xD2, 0x85, // disable auto clock detect
- //0xD6, 0x37, // 27MHz default
- //0xD8, 0x18, // switch to 26MHz clock
- //delay(100), // delay 100ms
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x00, // enable 72MHz sampling
- 0xDB, 0x8F, // internal use*
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x2C, 0x30, // select sync slice points
- 0x50, 0x00, // 720H resolution select for BT.601
- 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
- 0x63, 0x09, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x00, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x07, 0x23, // NTSC format
- 0x2F, 0x14, // internal use
- 0x5E, 0x03, // disable H-scaling control
- 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x3E, 0x32, // AVID & VBLK out for BT.601
- 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x46, 0x23, // AVID & VBLK out for BT.601
- 0x47, 0xC3, // for customer project
- 0x41, 0x00,
- 0x42, 0x00,
- 0x20, 0x24,
- 0x21, 0x43,
- 0x22, 0xAC,
- 0x23, 0X11,
- 0x24, 0X01,
- 0x25, 0X11,
- 0x26, 0X01,
- 0x28, 0xE2, // cropping
- 0x00, 0x00, // internal use*
- 0x2D, 0xF2, // cagc adjust
- 0x0D, 0x20, // cagc initial value
- 0x05, 0x00, // sharpness
- 0x04, 0x80, // hue
- 0x11, 0x03,
- 0x37, 0x33,
- 0x61, 0x6C,
- 0xDF, 0xFF, // enable 720H format
- 0x8E, 0x00, // single channel output for VP
- 0x8F, 0x00, // 720H mode for VP
- 0x8D, 0x31, // enable VP out
- 0x89, 0x00, // select 27MHz for SCLK
- 0x88, 0xC1, // enable SCLK out
- 0x81, 0x01, // turn on video decoder
- 0x96, 0x00, // select AVID & VBLK as status indicator
- 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
- 0x98, 0x00, // video timing pin status
- 0x9A, 0x40, // select AVID & VBLK as status indicator
- 0x9B, 0xE1, // enable status indicator out on HSYNC
- 0x9C, 0x00, // video timing pin status
- #else
- //\u02eb\B3\A1\CA\E4\B3\F6\C5\E4\D6\C3(itu656)
- // 720H@60, 27MHz, BT656 output
- // Slave address is 0x58
- // Register, data
- // if clock source(Xin) of RN675x is 26MHz, please add these procedures marked first
- //0xD2, 0x85, // disable auto clock detect
- //0xD6, 0x37, // 27MHz default
- //0xD8, 0x18, // switch to 26MHz clock
- //delay(100), // delay 100ms
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x00, // enable 72MHz sampling
- 0xDB, 0x8F, // internal use*
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x2C, 0x30, // select sync slice points
- 0x50, 0x00, // 720H resolution select for BT.601
- 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
- 0x63, 0x09, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x00, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x07, 0x23, // NTSC format
- 0x2F, 0x14, // internal use
- 0x5E, 0x03, // disable H-scaling control
- 0x5B, 0x00, //
- 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x3E, 0x32, // AVID & VBLK out for BT.601
- 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x46, 0x23, // AVID & VBLK out for BT.601
- 0x28, 0x92, // cropping
- 0x00, 0x00, // internal use*
- 0x2D, 0xF2, // cagc adjust
- 0x0D, 0x20, // cagc initial value
- 0x05, 0x00, // sharpness
- 0x04, 0x80, // hue
- 0x11, 0x03,
- 0x37, 0x33,
- 0x61, 0x6C,
- 0xDF, 0xFF, // enable 720H format
- 0x8E, 0x00, // single channel output for VP
- 0x8F, 0x00, // 720H mode for VP
- 0x8D, 0x31, // enable VP out
- 0x89, 0x00, // select 27MHz for SCLK
- 0x88, 0xC1, // enable SCLK out
- 0x81, 0x01, // turn on video decoder
- 0x96, 0x00, // select AVID & VBLK as status indicator
- 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
- 0x98, 0x00, // video timing pin status
- 0x9A, 0x40, // select AVID & VBLK as status indicator
- 0x9B, 0xE1, // enable status indicator out on HSYNC
- 0x9C, 0x00, // video timing pin status
- #endif
- };
- static const char rn6752_itu656_720p_pal[]=
- {
- #if 0
- // 720P@25, 72MHz, BT656 output
- // Slave address is 0x58
- // Register, data
- // if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
- //0xD2, 0x85, // disable auto clock detect
- //0xD6, 0x37, // 27MHz default
- //0xD8, 0x18, // switch to 26MHz clock
- //delay(100), // delay 100ms
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x04, // enable 72MHz sampling
- 0xDB, 0x8F, // internal use*
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x2C, 0x30, // select sync slice points
- 0x50, 0x02, // 720p resolution select for BT.601
- 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
- 0x63, 0xBD, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x02, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x07, 0x23, // 720p format
- 0x2F, 0x04, // internal use*
- 0x5E, 0x0B, // enable H-scaling control
- 0x51, 0x44, // scale factor1
- 0x52, 0x86, // scale factor2
- 0x53, 0x22, // scale factor3
- 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x3E, 0x32, // AVID & VBLK out for BT.601
- 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x46, 0x23, // AVID & VBLK out for BT.601
- 0x28, 0x92, // cropping
- 0x00, 0x20, // internal use*
- 0x2D, 0xF2, // cagc adjust
- 0x0D, 0x20, // cagc initial value
- 0x05, 0x00, // sharpness
- 0x04, 0x80, // hue
- 0x37, 0x33,
- 0x61, 0x6C,
- 0xDF, 0xFE, // enable 720p format
- 0x8E, 0x00, // single channel output for VP
- 0x8F, 0x80, // 720p mode for VP
- 0x8D, 0x31, // enable VP out
- 0x89, 0x09, // select 72MHz for SCLK
- 0x88, 0xC1, // enable SCLK out
- 0x81, 0x01, // turn on video decoder
- 0x96, 0x00, // select AVID & VBLK as status indicator
- 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
- 0x98, 0x00, // video timing pin status
- 0x9A, 0x40, // select AVID & VBLK as status indicator
- 0x9B, 0xE1, // enable status indicator out on HSYNC
- 0x9C, 0x00, // video timing pin status
- #else
- //add 20211104
- // 720P@25, 72MHz, BT656 output
- // Slave address is 0x58
- // Register, data
- // if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
- //0xD2, 0x85, // disable auto clock detect
- //0xD6, 0x37, // 27MHz default
- //0xD8, 0x18, // switch to 26MHz clock
- //delay(100), // delay 100ms
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x04, // enable 72MHz sampling
- 0xDB, 0x8F, // internal use*
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x2C, 0x30, // select sync slice points
- 0x50, 0x02, // 720p resolution select for BT.601
- 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
- 0x63, 0xBD, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x02, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x07, 0x23, // 720p format
- 0x2F, 0x04, // internal use*
- 0x5E, 0x0B, // enable H-scaling control
- 0x51, 0x44, // scale factor1
- 0x52, 0x86, // scale factor2
- 0x53, 0x22, // scale factor3
- 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x3E, 0x32, // AVID & VBLK out for BT.601
- 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x46, 0x23, // AVID & VBLK out for BT.601
- 0x28, 0x92, // cropping
- 0x00, 0x20, // internal use*
- 0x2D, 0xF2, // cagc adjust
- 0x0D, 0x20, // cagc initial value
- 0x05, 0x00, // sharpness
- 0x04, 0x80, // hue
- 0x37, 0x33,
- 0x61, 0x6C,
- 0xDF, 0xFE, // enable 720p format
- 0x8E, 0x00, // single channel output for VP
- 0x8F, 0x80, // 720p mode for VP
- 0x8D, 0x31, // enable VP out
- 0x89, 0x09, // select 72MHz for SCLK
- 0x88, 0xC1, // enable SCLK out
- 0x81, 0x01, // turn on video decoder
- 0x96, 0x00, // select AVID & VBLK as status indicator
- 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
- 0x98, 0x00, // video timing pin status
- 0x9A, 0x40, // select AVID & VBLK as status indicator
- 0x9B, 0xE1, // enable status indicator out on HSYNC
- 0x9C, 0x00, // video timing pin status
- #endif
- };
- static const char rn6752_itu656_720p_ntsc[]=
- {
- #if 0
- // 720P@30, 72MHz, BT656 output
- // Slave address is 0x58
- // Register, data
- // if clock source(Xin) of RN675x is 26MHz, please add these procedures marked first
- //0xD2, 0x85, // disable auto clock detect
- //0xD6, 0x37, // 27MHz default
- //0xD8, 0x18, // switch to 26MHz clock
- //delay(100), // delay 100ms
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x04, // enable 72MHz sampling
- 0xDB, 0x8F, // internal use*
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x2C, 0x30, // select sync slice points
- 0x50, 0x02, // 720p resolution select for BT.601
- 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
- 0x63, 0xBD, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x04, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x07, 0x23, // 720p format
- 0x2F, 0x04, // internal use*
- 0x5E, 0x0B, // enable H-scaling control
- 0x51, 0x44, // scale factor1
- 0x52, 0x86, // scale factor2
- 0x53, 0x22, // scale factor3
- 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x3E, 0x32, // AVID & VBLK out for BT.601
- 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x46, 0x23, // AVID & VBLK out for BT.601
- 0x28, 0x92, // cropping
- 0x00, 0x20, // internal use*
- 0x2D, 0xF2, // cagc adjust
- 0x0D, 0x20, // cagc initial value
- 0x05, 0x00, // sharpness
- 0x04, 0x80, // hue
- 0x37, 0x33,
- 0x61, 0x6C,
- 0xDF, 0xFE, // enable 720p format
- 0x8E, 0x00, // single channel output for VP
- 0x8F, 0x80, // 720p mode for VP
- 0x8D, 0x31, // enable VP out
- 0x89, 0x09, // select 72MHz for SCLK
- 0x88, 0xC1, // enable SCLK out
- 0x81, 0x01, // turn on video decoder
- 0x96, 0x00, // select AVID & VBLK as status indicator
- 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
- 0x98, 0x00, // video timing pin status
- 0x9A, 0x40, // select AVID & VBLK as status indicator
- 0x9B, 0xE1, // enable status indicator out on HSYNC
- 0x9C, 0x00, // video timing pin status
- #else
- //add 20211104
- // 720P@30, 72MHz, BT656 output
- // Slave address is 0x58
- // Register, data
- // if clock source(Xin) of RN675x is 26MHz, please add these procedures marked first
- //0xD2, 0x85, // disable auto clock detect
- //0xD6, 0x37, // 27MHz default
- //0xD8, 0x18, // switch to 26MHz clock
- //delay(100), // delay 100ms
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x04, // enable 72MHz sampling
- 0xDB, 0x8F, // internal use*
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x2C, 0x30, // select sync slice points
- 0x50, 0x02, // 720p resolution select for BT.601
- 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
- 0x63, 0xBD, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x04, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x07, 0x23, // 720p format
- 0x2F, 0x04, // internal use*
- 0x5E, 0x0B, // enable H-scaling control
- 0x51, 0x44, // scale factor1
- 0x52, 0x86, // scale factor2
- 0x53, 0x22, // scale factor3
- 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x3E, 0x32, // AVID & VBLK out for BT.601
- 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
- 0x46, 0x23, // AVID & VBLK out for BT.601
- 0x28, 0x92, // cropping
- 0x00, 0x20, // internal use*
- 0x2D, 0xF2, // cagc adjust
- 0x0D, 0x20, // cagc initial value
- 0x05, 0x00, // sharpness
- 0x04, 0x80, // hue
- 0x37, 0x33,
- 0x61, 0x6C,
- 0xDF, 0xFE, // enable 720p format
- 0x8E, 0x00, // single channel output for VP
- 0x8F, 0x80, // 720p mode for VP
- 0x8D, 0x31, // enable VP out
- 0x89, 0x09, // select 72MHz for SCLK
- 0x88, 0xC1, // enable SCLK out
- 0x81, 0x01, // turn on video decoder
- 0x96, 0x00, // select AVID & VBLK as status indicator
- 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
- 0x98, 0x00, // video timing pin status
- 0x9A, 0x40, // select AVID & VBLK as status indicator
- 0x9B, 0xE1, // enable status indicator out on HSYNC
- 0x9C, 0x00, // video timing pin status
- #endif
- };
- static const char rn6752m_itu656_cvbs_pal[]=
- {
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x04,
- 0xDF, 0x0F, // enable CVBS format
- // ch0
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x00, 0x00, // internal use*
- 0x06, 0x08, // internal use*
- 0x07, 0x62, // HD format
- 0x2A, 0x81, // filter control
- 0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
- 0x3F, 0x10, // channel ID
- 0x4C, 0x37, // equalizer
- 0x4F, 0x00, // sync control
- 0x50, 0x00, // 720p resolution
- 0x56, 0x01, // 72M mode and BT656 mode
- 0x5F, 0x00, // blank level
- 0x63, 0x75, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x00, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x59, 0x33, // extended register access
- 0x5A, 0x02, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x5B, 0x00, // H-scaling control
- 0x5E, 0x01, // enable H-scaling control
- 0x6A, 0x00, // H-scaling control
- 0x28, 0xB2, // cropping
- 0x20, 0x24,
- 0x23, 0x17,
- 0x24, 0x37,
- 0x25, 0x17,
- 0x26, 0x00,
- 0x42, 0x00,
- 0x03, 0x80, // saturation
- 0x04, 0x80, // hue
- 0x05, 0x03, // sharpness
- 0x57, 0x20, // black/white stretch
- 0x68, 0x32, // coring
- 0x37, 0x33,
- 0x61, 0x6C,
- 0x8E, 0x00, // single channel output for VP
- 0x8F, 0x80, // 720p mode for VP
- 0x8D, 0x31, // enable VP out
- 0x89, 0x09, // select 72MHz for SCLK
- 0x88, 0x41, // enable SCLK out
- };
- static const char rn6752m_itu656_cvbs_ntsc[] = {
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x04,
- 0xDF, 0x0F, // enable CVBS format
- // ch0
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x00, 0x00, // internal use*
- 0x06, 0x08, // internal use*
- 0x07, 0x63, // HD format
- 0x2A, 0x81, // filter control
- 0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
- 0x3F, 0x10, // channel ID
- 0x4C, 0x37, // equalizer
- 0x4F, 0x00, // sync control
- 0x50, 0x00, // 720p resolution
- 0x56, 0x01, // 72M mode and BT656 mode
- 0x5F, 0x00, // blank level
- 0x63, 0x75, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x00, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x59, 0x33, // extended register access
- 0x5A, 0x02, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x5B, 0x00, // H-scaling control
- 0x5E, 0x01, // enable H-scaling control
- 0x6A, 0x00, // H-scaling control
- // 0x28, 0xB2, // cropping // rn6752M default:0xB2 //add by helen
- 0x28, 0x92, // cropping // rn6752V1 default:0x92
- 0x20, 0x24,
- 0x23, 0x11,
- 0x24, 0x05,
- 0x25, 0x11,
- 0x26, 0x00,
- 0x42, 0x00,
- 0x03, 0x80, // saturation
- 0x04, 0x80, // hue
- 0x05, 0x03, // sharpness
- 0x57, 0x20, // black/white stretch
- 0x68, 0x32, // coring
- 0x37, 0x33,
- 0x61, 0x6C,
- 0x8E, 0x00, // single channel output for VP
- 0x8F, 0x80, // 720p mode for VP
- 0x8D, 0x31, // enable VP out
- 0x89, 0x09, // select 72MHz for SCLK
- 0x88, 0x41, // enable SCLK out
- };
- const char rn6752m_itu656_720p_25fps[] = {
- // 720P@25 BT656
- // Slave address is 0x58
- // Register, data
- // if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
- //0xD2, 0x85, // disable auto clock detect
- //0xD6, 0x37, // 27MHz default
- //0xD8, 0x18, // switch to 26MHz clock
- //delay(100), // delay 100ms
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x04, // enable 72MHz sampling
- 0xDF, 0xFE, // enable HD format
- 0x88, 0x40, // disable SCLK0B out
- 0xF6, 0x40, // disable SCLK3A out
- // ch0
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x00, 0x20, // internal use*
- 0x06, 0x08, // internal use*
- 0x07, 0x63, // HD format
- 0x2A, 0x01, // filter control
- 0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
- 0x3F, 0x10, // channel ID
- 0x4C, 0x37, // equalizer
- 0x4F, 0x03, // sync control
- 0x50, 0x02, // 720p resolution
- 0x56, 0x01, // BT 72M mode
- 0x5F, 0x40, // blank level
- 0x63, 0xF5, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x42, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x59, 0x33, // extended register access
- 0x5A, 0x23, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x51, 0xE1, // scale factor1
- 0x52, 0x88, // scale factor2
- 0x53, 0x12, // scale factor3
- 0x5B, 0x07, // H-scaling control
- 0x5E, 0x08, // enable H-scaling control
- 0x6A, 0x82, // H-scaling control
- 0x28, 0x92, // cropping
- 0x03, 0x80, // saturation
- 0x04, 0x80, // hue
- 0x05, 0x00, // sharpness
- 0x57, 0x23, // black/white stretch
- 0x68, 0x32, // coring
- 0x37, 0x33,
- 0x61, 0x6C,
- // VP1
- 0x8E, 0x00, // single channel output for VP1
- 0x8F, 0x80, // 720p mode for VP1
- 0x8D, 0x31, // enable VP1 out
- 0x89, 0x09, // select 72MHz for SCLK
- 0x88, 0x41, // enable SCLK out
- };
- static const char rn6752v1_itu656_cvbs_pal[]=
- {
- // D1@50 with mipi 2 data lanes + 1 clock lane out
- // pin24/23 data lane0, pin18/17 data lane3
- // pin16/15 data lane2, pin12/11 data lane1
- // pin14/13 clock lane
- // Slave address is 0x58
- // Register, data
- // if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
- //0xD2, 0x85, // disable auto clock detect
- //0xD6, 0x37, // 27MHz default
- //0xD8, 0x18, // switch to 26MHz clock
- //delay(100), // delay 100ms
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x04,
- 0xDF, 0x0F, // enable CVBS format
- 0x88, 0x00,
- 0xF6, 0x00,
- // ch0
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x00, 0x00, // internal use*
- 0x06, 0x08, // internal use*
- 0x07, 0x62, // HD format
- 0x2A, 0x81, // filter control
- 0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
- 0x3F, 0x10, // channel ID
- 0x4C, 0x37, // equalizer
- 0x4F, 0x00, // sync control
- 0x50, 0x00, // 720p resolution
- 0x56, 0x01, // 72M mode and BT656 mode
- 0x5F, 0x00, // blank level
- 0x63, 0x75, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x00, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x59, 0x33, // extended register access
- 0x5A, 0x02, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x5B, 0x00, // H-scaling control
- 0x5E, 0x01, // enable H-scaling control
- 0x6A, 0x00, // H-scaling control
- 0x28, 0xB2, // cropping //\B5\A5\B3\A1\CA\E4\B3\F6:0xB2 \u02eb\B3\A1\CA\E4\B3\F6:0x92 //only for msn
- 0x20, 0x24,
- 0x23, 0x17,
- 0x24, 0x37,
- 0x25, 0x17,
- 0x26, 0x00,
- 0x42, 0x00,
- 0x03, 0x80, // saturation
- 0x04, 0x80, // hue
- 0x05, 0x03, // sharpness
- 0x57, 0x20, // black/white stretch
- 0x68, 0x32, // coring
- 0x37, 0x33,
- 0x61, 0x6C,
- 0x8E, 0x00, // single channel output for VP
- 0x8F, 0x80, // 720p mode for VP
- 0x8D, 0x31, // enable VP out
- 0x89, 0x09, // select 72MHz for SCLK
- 0x88, 0x41, // enable SCLK out
- };
- static const char rn6752v1_itu656_cvbs_ntsc[] = {
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x04,
- 0xDF, 0x0F, // enable CVBS format
- // ch0
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x00, 0x00, // internal use*
- 0x06, 0x08, // internal use*
- 0x07, 0x63, // HD format
- 0x2A, 0x81, // filter control
- 0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
- 0x3F, 0x10, // channel ID
- 0x4C, 0x37, // equalizer
- 0x4F, 0x00, // sync control
- 0x50, 0x00, // 720p resolution
- 0x56, 0x01, // 72M mode and BT656 mode
- 0x5F, 0x00, // blank level
- 0x63, 0x75, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x00, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x59, 0x33, // extended register access
- 0x5A, 0x02, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x5B, 0x00, // H-scaling control
- 0x5E, 0x01, // enable H-scaling control
- 0x6A, 0x00, // H-scaling control
- 0x28, 0xB2, // cropping
- 0x20, 0x24,
- 0x23, 0x11,
- 0x24, 0x05,
- 0x25, 0x11,
- 0x26, 0x00,
- 0x42, 0x00,
- 0x03, 0x80, // saturation
- 0x04, 0x80, // hue
- 0x05, 0x03, // sharpness
- 0x57, 0x20, // black/white stretch
- 0x68, 0x32, // coring
- 0x37, 0x33,
- 0x61, 0x6C,
- 0x8E, 0x00, // single channel output for VP
- 0x8F, 0x80, // 720p mode for VP
- 0x8D, 0x31, // enable VP out
- 0x89, 0x09, // select 72MHz for SCLK
- 0x88, 0x41, // enable SCLK out
- };
- static const char rn6752v1_itu656_720p_25fps[] = {
- // 720P@25 BT656
- // Slave address is 0x58
- // Register, data
- // if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
- //0xD2, 0x85, // disable auto clock detect
- //0xD6, 0x37, // 27MHz default
- //0xD8, 0x18, // switch to 26MHz clock
- //delay(100), // delay 100ms
- 0xF0, 0x1F,
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x04, // enable 72MHz sampling
- 0xDF, 0xFE, // enable HD format
- 0x88, 0x40, // disable SCLK0B out
- 0xF6, 0x40, // disable SCLK3A out
- // ch0
- //0xff,0x00;0x00,0x60 //rn6752v1_video_Test:color bars test pattern output
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x00, 0x20, // internal use*
- 0x06, 0x08, // internal use*
- 0x07, 0x63, // HD format
- 0x2A, 0x01, // filter control
- 0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
- 0x3F, 0x10, // channel ID
- 0x4C, 0x37, // equalizer
- 0x4F, 0x03, // sync control
- 0x50, 0x02, // 720p resolution
- 0x56, 0x01, // BT 72M mode
- 0x5F, 0x40, // blank level
- 0x63, 0xF5, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x42, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x59, 0x33, // extended register access
- 0x5A, 0x23, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x51, 0xE1, // scale factor1
- 0x52, 0x88, // scale factor2
- 0x53, 0x12, // scale factor3
- 0x5B, 0x07, // H-scaling control
- 0x5E, 0x08, // enable H-scaling control
- 0x6A, 0x82, // H-scaling control
- 0x28, 0x92, // cropping
- 0x03, 0x80, // saturation
- 0x04, 0x80, // hue
- 0x05, 0x00, // sharpness
- 0x57, 0x23, // black/white stretch
- 0x68, 0x32, // coring
- 0x37, 0x33,
- 0x61, 0x6C,
- // VP1
- 0x8E, 0x00, // single channel output for VP1
- 0x8F, 0x80, // 720p mode for VP1
- 0x8D, 0x31, // enable VP1 out
- 0x89, 0x09, // select 72MHz for SCLK
- 0x88, 0x41, // enable SCLK out
- };
- static const char rn6752m_itu656_720p_30fps[] = {
- // 720P@30 BT656
- // Slave address is 0x58
- // Register, data
- // if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
- //0xD2, 0x85, // disable auto clock detect
- //0xD6, 0x37, // 27MHz default
- //0xD8, 0x18, // switch to 26MHz clock
- //delay(100), // delay 100ms
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x04, // enable 72MHz sampling
- 0xDF, 0xFE, // enable HD format
- 0x88, 0x40, // disable SCLK0B out
- 0xF6, 0x40, // disable SCLK3A out
- // ch0
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x00, 0x20, // internal use*
- 0x06, 0x08, // internal use*
- 0x07, 0x63, // HD format
- 0x2A, 0x01, // filter control
- 0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
- 0x3F, 0x10, // channel ID
- 0x4C, 0x37, // equalizer
- 0x4F, 0x03, // sync control
- 0x50, 0x02, // 720p resolution
- 0x56, 0x01, // 72M mode and BT656 mode
- 0x5F, 0x40, // blank level
- 0x63, 0xF5, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x44, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x59, 0x33, // extended register access
- 0x5A, 0x23, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x51, 0x4E, // scale factor1
- 0x52, 0x87, // scale factor2
- 0x53, 0x12, // scale factor3
- 0x5B, 0x07, // H-scaling control
- 0x5E, 0x08, // enable H-scaling control
- 0x6A, 0x82, // H-scaling control
- 0x28, 0x92, // cropping
- 0x03, 0x80, // saturation
- 0x04, 0x80, // hue
- 0x05, 0x00, // sharpness
- 0x57, 0x23, // black/white stretch
- 0x68, 0x32, // coring
- 0x37, 0x33,
- 0x61, 0x6C,
- // VP1
- 0x8E, 0x00, // single channel output for VP1
- 0x8F, 0x80, // 720p mode for VP1
- 0x8D, 0x31, // enable VP1 out
- 0x89, 0x09, // select 72MHz for SCLK
- 0x88, 0x41, // enable SCLK out
- };
- static const char rn6752m_itu656_1080p_25fps[] = {
- // 1080P@25 BT656
- // Slave address is 0x58
- // Register, data
- // if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
- //0xD2, 0x85, // disable auto clock detect
- //0xD6, 0x37, // 27MHz default
- //0xD8, 0x18, // switch to 26MHz clock
- //delay(100), // delay 100ms
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x04, //
- 0xDF, 0xFE, // enable HD format
- 0xF0, 0xC0,
- 0x88, 0x40, // disable SCLK0B out
- 0xF6, 0x40, // disable SCLK3A out
- // ch0
- //0xff,0x00;0x00,0x60 //rn6752v1_video_Test:color bars test pattern output
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x00, 0x20, //0x20 internal use*
- 0x06, 0x08, // internal use*
- 0x07, 0x63, // HD format
- 0x2A, 0x01, // filter control
- 0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
- 0x3F, 0x10, // channel ID
- 0x4C, 0x37, // equalizer
- 0x4F, 0x03, // sync control
- 0x50, 0x03, // 1080p resolution
- 0x56, 0x02, // 144M and BT656 mode
- 0x5F, 0x44, // blank level
- 0x63, 0xF8, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x48, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x59, 0x33, // extended register access
- 0x5A, 0x23, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x51, 0xF4, // scale factor1
- 0x52, 0x29, // scale factor2
- 0x53, 0x15, // scale factor3
- 0x5B, 0x01, // H-scaling control
- 0x5E, 0x08, // enable H-scaling control
- 0x6A, 0x87, // H-scaling control
- 0x28, 0x92, // cropping
- 0x03, 0x80, // saturation
- 0x04, 0x80, // hue
- 0x05, 0x04, // sharpness
- 0x57, 0x23, // black/white stretch
- 0x68, 0x00, // coring
- 0x37, 0x33,
- 0x61, 0x6C,
- 0x8E, 0x00, // single channel output for VP
- 0x8F, 0x80, // 1080p mode for VP
- 0x8D, 0x31, // enable VP out
- 0x89, 0x0A, // select 144MHz for SCLK
- 0x88, 0x41, // enable SCLK out
- };
- static const char rn6752m_itu656_1080p_30fps[] = {
- // 1080P@30 BT656
- // Slave address is 0x58
- // Register, data
- // if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
- //0xD2, 0x85, // disable auto clock detect
- //0xD6, 0x37, // 27MHz default
- //0xD8, 0x18, // switch to 26MHz clock
- //delay(100), // delay 100ms
- 0x81, 0x01, // turn on video decoder
- 0xA3, 0x04, //
- 0xDF, 0xFE, // enable HD format
- 0xF0, 0xC0,
- 0x88, 0x40, // disable SCLK0B out
- 0xF6, 0x40, // disable SCLK3A out
- // ch0
- //0xff,0x00;0x00,0x60 //rn6752v1_video_Test:color bars test pattern output
- 0xFF, 0x00, // switch to ch0 (default; optional)
- 0x00, 0x20, // internal use*
- 0x06, 0x08, // internal use*
- 0x07, 0x63, // HD format
- 0x2A, 0x01, // filter control
- 0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
- 0x3F, 0x10, // channel ID
- 0x4C, 0x37, // equalizer
- 0x4F, 0x03, // sync control
- 0x50, 0x03, // 1080p resolution
- 0x56, 0x02, // 144M and BT656 mode
- 0x5F, 0x44, // blank level
- 0x63, 0xF8, // filter control
- 0x59, 0x00, // extended register access
- 0x5A, 0x49, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x59, 0x33, // extended register access
- 0x5A, 0x23, // data for extended register
- 0x58, 0x01, // enable extended register write
- 0x51, 0xF4, // scale factor1
- 0x52, 0x29, // scale factor2
- 0x53, 0x15, // scale factor3
- 0x5B, 0x01, // H-scaling control
- 0x5E, 0x08, // enable H-scaling control
- 0x6A, 0x87, // H-scaling control
- 0x28, 0x92, // cropping
- 0x03, 0x80, // saturation
- 0x04, 0x80, // hue
- 0x05, 0x04, // sharpness
- 0x57, 0x23, // black/white stretch
- 0x68, 0x00, // coring
- 0x37, 0x33,
- 0x61, 0x6C,
- 0x8E, 0x00, // single channel output for VP
- 0x8F, 0x80, // 1080p mode for VP
- 0x8D, 0x31, // enable VP out
- 0x89, 0x0A, // select 144MHz for SCLK
- 0x88, 0x43, // enable SCLK out //default:0x41 clock_Invert:0x43 add:2021-11-15
- };
- static inline struct rn6752 *to_rn6752(struct v4l2_subdev *sd)
- {
- return container_of(sd, struct rn6752, sd);
- }
- static inline struct v4l2_subdev *to_sd(struct v4l2_ctrl *ctrl)
- {
- return &container_of(ctrl->handler, struct rn6752, hdl)->sd;
- }
- #if 0
- static int rn6752_read(struct v4l2_subdev *sd, unsigned char addr)
- {
- struct i2c_client *client = v4l2_get_subdevdata(sd);
- int rc;
- rc = i2c_smbus_read_byte_data(client, addr);
- if (rc < 0) {
- dev_err(sd->dev, "i2c i/o error: rc == %d\n", rc);
- return rc;
- }
- dev_dbg(sd->dev, "rn6752: read 0x%02x = %02x\n", addr, rc);
- return rc;
- }
- static int rn6752_write(struct v4l2_subdev *sd, unsigned char addr,
- unsigned char value)
- {
- struct i2c_client *client = v4l2_get_subdevdata(sd);
- int rc;
- dev_dbg(sd->dev, "rn6752: writing %02x %02x\n", addr, value);
- rc = i2c_smbus_write_byte_data(client, addr, value);
- if (rc < 0)
- dev_err(sd->dev, "i2c i/o error: rc == %d\n", rc);
- return rc;
- }
- static unsigned char amt_read_reg(struct rn6752 *decoder, unsigned int reg)
- {
- struct v4l2_subdev *sd = &decoder->sd;
- struct i2c_client *client = v4l2_get_subdevdata(sd);
- int rc;
- rc = i2c_smbus_read_byte_data(client, reg & 0xff);
- client->addr = decoder->default_addr;
- if (rc < 0) {
- dev_err(sd->dev, "i2c i/o error: rc == %d\n", rc);
- return rc;
- }
- dev_dbg(sd->dev, "rn6752: read 0x%04x = %02x\n", reg, rc);
- return rc;
- }
- static int amt_write_reg(struct rn6752 *decoder, unsigned int reg, unsigned char value)
- {
- struct v4l2_subdev *sd = &decoder->sd;
- struct i2c_client *client = v4l2_get_subdevdata(sd);
- int rc;
- dev_dbg(sd->dev, "rn6752: writing %04x %02x\n", reg, value);
- rc = i2c_smbus_write_byte_data(client, reg & 0xff, value);
- client->addr = decoder->default_addr;
- if (rc < 0)
- dev_err(sd->dev, "i2c i/o error: rc == %d\n", rc);
- return rc;
- }
- #endif
- /******************************************************************************************************/
- static int rn6752_write_byte(struct rn6752 *decoder,unsigned char regaddr, unsigned char regval)
- {
- struct i2c_client *client;
- struct i2c_msg msg;
- s32 ret = -1;
- s32 retries = 0;
- u8 buf[2] = {0};
-
- if(!decoder)
- return -ENODEV;
-
- client = decoder->client;
- buf[0] = regaddr;
- buf[1] = regval;
- msg.flags = 0;
- msg.addr = client->addr;
- msg.len = 2;
- msg.buf = buf;
- while(retries < 5)
- {
- ret = i2c_transfer(client->adapter, &msg, 1);
- if (ret == 1)
- break;
- retries++;
- }
- if((retries >= 5))
- {
- printk("ERR: %s failure\n",__FUNCTION__);
- return -EBUSY;
- }
- return 0;
- }
- static int rn6752_read_byte(struct rn6752 *decoder,unsigned char regaddr)
- {
- struct i2c_client *client;
- struct i2c_msg read_msgs[2];
- s32 ret = -1;
- s32 retries = 0;
- u8 regValue = 0x00;
- if(!decoder)
- return -ENODEV;
-
- client = decoder->client;
- read_msgs[0].flags = !I2C_M_RD;
- read_msgs[0].addr = client->addr;
- read_msgs[0].len = 1;
- read_msgs[0].buf = ®addr;
- read_msgs[1].flags = I2C_M_RD;
- read_msgs[1].addr = client->addr;
- read_msgs[1].len = 1;
- read_msgs[1].buf = ®Value;//low byte
- while(retries < 5)
- {
- ret = i2c_transfer(client->adapter, read_msgs, 2);
- if(ret == 2)
- break;
- retries++;
- }
-
- if(ret != 2)
- {
- printk("ERR: %s reg:0x%x failure\n",__FUNCTION__, regaddr);
- return -EBUSY;
- }
- return regValue;
- }
- static void rn6752_write_reg(struct rn6752 *decoder,const char *buf, int len)
- {
- int i;
- for(i=0; i<len; i++)
- rn6752_write_byte(decoder,buf[2*i],buf[2*i+1]);
- }
- static void rn6752_read_reg(struct rn6752 *decoder,const char *buf, int len)
- {
- int i;
- int regval;
- for(i=0; i<len; i++){
- regval = rn6752_read_byte(decoder,buf[2*i]);
- printk(KERN_ALERT "++++++reg_addr:0x%x , reg_val:0x%x\n", buf[2*i],regval);
- }
- }
- static void rn6752m_pre_init(struct rn6752 *decoder)
- {
- int rom_byte1, rom_byte2, rom_byte3, rom_byte4, rom_byte5, rom_byte6;
- rn6752_write_byte(decoder,0xE1, 0x80);
- rn6752_write_byte(decoder,0xFA, 0x81);
- rom_byte1 = rn6752_read_byte(decoder,0xFB);
- rom_byte2 = rn6752_read_byte(decoder,0xFB);
- rom_byte3 = rn6752_read_byte(decoder,0xFB);
- rom_byte4 = rn6752_read_byte(decoder,0xFB);
- rom_byte5 = rn6752_read_byte(decoder,0xFB);
- rom_byte6 = rn6752_read_byte(decoder,0xFB);
- // config. decoder accroding to rom_byte5 and rom_byte6
- if((rom_byte6 == 0x00) && (rom_byte5 == 0x00))
- {
- rn6752_write_byte(decoder,0xEF, 0xAA);
- rn6752_write_byte(decoder,0xE7, 0xFF);
- rn6752_write_byte(decoder,0xFF, 0x09);
- rn6752_write_byte(decoder,0x03, 0x0C);
- rn6752_write_byte(decoder,0xFF, 0x0B);
- rn6752_write_byte(decoder,0x03, 0x0C);
- }
- else if(((rom_byte6 == 0x34) && (rom_byte5 == 0xA9)) || ((rom_byte6 == 0x2C) && (rom_byte5 == 0xA8)))
- {
- rn6752_write_byte(decoder,0xEF, 0xAA);
- rn6752_write_byte(decoder,0xE7, 0xFF);
- rn6752_write_byte(decoder,0xFC, 0x60);
- rn6752_write_byte(decoder,0xFF, 0x09);
- rn6752_write_byte(decoder,0x03, 0x18);
- rn6752_write_byte(decoder,0xFF, 0x0B);
- rn6752_write_byte(decoder,0x03, 0x18);
- }
- else
- {
- rn6752_write_byte(decoder,0xEF, 0xAA);
- rn6752_write_byte(decoder,0xFC, 0x60);
- rn6752_write_byte(decoder,0xFF, 0x09);
- rn6752_write_byte(decoder,0x03, 0x18);
- rn6752_write_byte(decoder,0xFF, 0x0B);
- rn6752_write_byte(decoder,0x03, 0x18);
- }
- }
- static int rn6752v1_input_signal_check(struct rn6752 *decoder)
- {
- int count_bit4 = 0, check_sig = 0, check_bit4 = 0;
- int rn6752v1_signal_format, i;
- int signal_detect = 0;
- rn6752_write_byte(decoder,0x49,0x81);
- rn6752_write_byte(decoder,0x19,0x0a);
- for (i=0; i <= 4; i++ )
- {
- check_bit4 = rn6752_read_byte(decoder,0x00)>>4;
- //printk(KERN_ALERT "check_bit4 = 0x%02x\n",check_bit4);
- if (( check_bit4 & 0x1 ) == 0x0)
- {
- if(count_bit4++ >= 4)
- {
- check_sig = 1;
- //printk(KERN_ALERT "RN6752 check signal ok,i = %d\r\n",i);
- break;
- }
- }
- else
- {
- count_bit4 = 0;
- }
- msleep(50);//50
- }
- if(check_sig)
- {
- rn6752v1_signal_format = rn6752_read_byte(decoder,0x00) & 0xf1;
- switch (rn6752v1_signal_format)
- {
- case 0x00:
- case 0x80:
- signal_detect = RN6752_MODE_CVBS_PAL;
- break;
- case 0x01:
- case 0x81:
- signal_detect = RN6752_MODE_CVBS_NTSC;
- break;
- case 0x20:
- case 0xA0:
- signal_detect = RN6752_MODE_720P_25FPS;
- break;
- case 0x21:
- case 0xA1:
- signal_detect = RN6752_MODE_720P_30FPS;
- break;
- case 0x40:
- case 0xC0:
- signal_detect = RN6752_MODE_1080P_25FPS;
- break;
- case 0x41:
- case 0xC1:
- signal_detect = RN6752_MODE_1080P_30FPS;
- break;
- default:
- break;
- }
- }
- return signal_detect;
- }
- static int rn6752v1_detect_signal(struct rn6752 *decoder)
- {
- int count_bit4 = 0, check_sig = 0, check_bit4 = 0;
- int rn6752v1_signal_format, i;
- int signal_detect = 0;
- rn6752_write_byte(decoder,0x49,0x81);
- rn6752_write_byte(decoder,0x19,0x0a);
- for (i=0; i <= 1; i++ )
- {
- check_bit4 = rn6752_read_byte(decoder,0x00)>>4;
- if (( check_bit4 & 0x1 ) == 0x0)
- {
- signal_detect = 0;
- }
- else
- {
- signal_detect = 1;
- }
- }
- //printk(KERN_ALERT "signal_detect = %d\n",signal_detect);
- return signal_detect;
- }
- static int rn6752m_signal_check(struct rn6752 *decoder)
- {
- int status, i;
- static int prestatus = 0;
- int count = 0;
- int resolutuon_detect = 0;
-
- for(i=0; i<50; i++) //default:50 msn_6752v1:15
- {
- status = (rn6752_read_byte(decoder,0x00) & 0x7F);
- if(status < 0)
- {
- msleep(1);
- continue;
- }
- msleep(15);//default:25 msn_6752v1:15
- if(status == prestatus)
- {
- count++;
- if(count >= 20)// \C1\AC\D0\F8\B6\C110\B4\CE״ֵ̬\B6\BCһ\D1\F9\B2\C5\C8\CFΪ״ֵ̬\CAǿɿ\BF\B5\C4 //default:20 msn_6752v1:15
- {
- break;
- }
- }
- else
- {
- count = 0;
- prestatus = status;
- }
- msleep(1);
- }
- //printk(KERN_ALERT "### COUNT:%d, status:0x%x\n", count , status);
- if(status & (1<<4))
- {
- resolutuon_detect = RN6752_MODE_NONE;
- }
- else
- {
- switch (status&0x71)
- {
- case 0X20:
- //720P 25
- resolutuon_detect = RN6752_MODE_720P_25FPS;
- break;
- case 0x21:
- //720P 30
- resolutuon_detect = RN6752_MODE_720P_30FPS;
- break;
- case 0X40:
- //1080P 25
- resolutuon_detect = RN6752_MODE_1080P_25FPS;
- break;
- case 0x41:
- //1080P 30
- resolutuon_detect = RN6752_MODE_1080P_30FPS;
- break;
- case 0x00:
- //PAL
- resolutuon_detect = RN6752_MODE_CVBS_PAL;
- break;
- case 0x01:
- //NTSC
- resolutuon_detect = RN6752_MODE_CVBS_NTSC;
- break;
- break;
- default:
- break;
- }
- }
- return resolutuon_detect;
- }
- static int rn6752_signal_check(struct rn6752 *decoder)
- {
- u8 signal_cnt = 0;
- u8 nosignal_cnt=0;
- u8 reg_0x75,reg_0x77, reg_0x78, reg_0x79;
- u16 counter1 = 0, counter2 = 0, counter3 = 0;
- u16 PAL_MIN_COUNT = 320;//330 310
- int i;
- int ret;
- static int counter_deviation = 10;
- for(i=0; i<30; i++)
- {
- ret = rn6752_read_byte(decoder,0x00);
- //printk(">>>>>>>>>>>>>>>>>>reg 0x00 :%x\r\n", ret);
- if((ret >= 0) && ((ret&0x10) == 0x00))
- {
- signal_cnt++;
- }
- else
- {
- nosignal_cnt++;
- }
- if(signal_cnt >= 15)
- {
- //printk(KERN_ALERT "### >i:%d\r\n", i);
- reg_0x77 = rn6752_read_byte(decoder,0x77);
- reg_0x78 = rn6752_read_byte(decoder,0x78);
- reg_0x79 = rn6752_read_byte(decoder,0x79);
- reg_0x75 = rn6752_read_byte(decoder,0x75);
- //counter1 = 0;
- counter1 = reg_0x77&0x03;
- counter1 <<= 8;
- counter1 |= reg_0x78;
- //counter2 = 0;
- counter2 = reg_0x77&0xc;
- counter2 >>= 2;
- counter2 <<= 8;
- counter2 |= reg_0x79;
- counter3 = reg_0x75;
- break;
- }
- if(nosignal_cnt >= 20)
- {
- return RN6752_MODE_NONE;
- }
- msleep(1);
- }
- if(signal_cnt < 15)
- return RN6752_MODE_NONE;
-
- printk("counter1 = %d , counter2 = %d\n",counter1,counter2);
- if( (counter1 > 700) ||(counter2 > 700))
- {
- //720p pal
- if(counter3 > 0x8c)
- return RN6752_MODE_720P_25FPS;
- else
- return RN6752_MODE_720P_30FPS;
- }
- else if(((counter1>PAL_MIN_COUNT) && (counter1<550)) || ((counter2>PAL_MIN_COUNT) && (counter2<550)))
- {
- #ifdef RN6752_CVBS_PAL_CHECK_ERR
- rn6752_cvbs_pal_flag = true;
- #endif
- //cvbs pal
- return RN6752_MODE_CVBS_PAL;
- }
- //else if( (counter1<330) && (counter2<330) )
- else if((counter1<PAL_MIN_COUNT) && (counter2<PAL_MIN_COUNT))
- {
- #ifdef RN6752_CVBS_PAL_CHECK_ERR
- if(rn6752_cvbs_pal_flag)
- goto err;
- rn6752_cvbs_pal_flag = false;
- #endif
- //cvbs ntsc
- return RN6752_MODE_CVBS_NTSC;
- }
- #ifdef RN6752_CVBS_PAL_CHECK_ERR
- err:
- if(((counter1+counter_deviation>PAL_MIN_COUNT) && (counter1+counter_deviation<550)) || ((counter2+counter_deviation>PAL_MIN_COUNT) && (counter2+10<550)))
- {
- //printk("counter1 + counter_deviation = %d , counter2 + counter_deviation = %d\n",counter1+counter_deviation,counter2+counter_deviation);
- //cvbs pal
- return RN6752_MODE_CVBS_PAL;
- }
- rn6752_cvbs_pal_flag = false;
- #endif
- return RN6752_MODE_NONE ;
- }
- static char * rn6752_get_mode_string (int mode)
- {
- if(mode == RN6752_MODE_NONE)
- {
- return "NONE";
- }
- else if(mode == RN6752_MODE_CVBS_PAL)
- {
- return "CVBS_PAL";
- }
- else if(mode == RN6752_MODE_CVBS_NTSC)
- {
- return "CVBS_NTSC";
- }
- else if(mode == RN6752_MODE_720P_25FPS)
- {
- return "720_PAL";
- }
- else if(mode == RN6752_MODE_720P_30FPS)
- {
- return "720_NTSC";
- }
- else if(mode == RN6752_MODE_1080P_25FPS)
- {
- return "1080P_25FPS";
- }
- else if(mode == RN6752_MODE_1080P_30FPS)
- {
- return "1080P_30FPS";
- }
- return "NONE";
- }
- static void rn6752_test_and_dvr_restart(struct rn6752 *decoder,int mode)
- {
- int progressive = dvr_get_pragressive();
- int restart = 0;
- switch(mode)
- {
- case RN6752_MODE_CVBS_PAL:
- #ifdef RN6752V1_CVBS_PAL_PROGRESSIVE
- if(progressive == 0)
- restart = 1;
- #else
- if(progressive == 1)
- restart = 1;
- #endif
- break;
- case RN6752_MODE_CVBS_NTSC:
- if(progressive == 1)
- restart = 1;
- break;
- case RN6752_MODE_720P_25FPS:
- case RN6752_MODE_720P_30FPS:
- case RN6752_MODE_1080P_25FPS:
- case RN6752_MODE_1080P_30FPS:
- if(progressive == 0)
- restart = 1;
- break;
- default:
- break;
- }
- if(restart)
- {
- int source = decoder->enter_carback ? DVR_SOURCE_CAMERA : DVR_SOURCE_AUX;
- if(rn6752_dbg) {
- printk(KERN_ALERT "### mode(%s) does not match progressive(%d), itu656 dvr_restart(%d)\n",
- rn6752_get_mode_string(mode), progressive, source);
- }
- dvr_restart();
- }
- }
- static int rn6752_init_reg_cfg(struct rn6752 *decoder,int curr_cfg)
- {
- static int mode_cfg = RN6752_MODE_NONE;
-
- if(decoder)
- {
- if(decoder->camera_mode > 0){
- if(decoder->id == RN675X_ID_RN6752){
- }
- else if(decoder->id == RN675X_ID_RN6752M){
- rn6752m_pre_init(decoder);
- }
- else if(decoder->id == RN675X_ID_RN6752V1){
- rn6752m_pre_init(decoder);
- }
- }
-
- switch(curr_cfg)
- {
- case CARBACK_CAMERA_MODE_CVBS_PAL:
- {
- //printk(KERN_ALERT "++++++++++++++CARBACK_CAMERA_MODE_CVBS_PAL\n");
- if(decoder->id == RN675X_ID_RN6752)
- rn6752_write_reg(decoder,rn6752_itu656_cvbs_pal, sizeof(rn6752_itu656_cvbs_pal)/2);//new add
- else if(decoder->id == RN675X_ID_RN6752M)
- rn6752_write_reg(decoder,rn6752m_itu656_cvbs_pal, sizeof(rn6752m_itu656_cvbs_pal)/2);
- else if(decoder->id == RN675X_ID_RN6752V1)
- rn6752_write_reg(decoder,rn6752v1_itu656_cvbs_pal, sizeof(rn6752v1_itu656_cvbs_pal)/2);
- mode_cfg = RN6752_MODE_CVBS_PAL;
- #ifdef RN6752V1_CVBS_PAL_PROGRESSIVE
- decoder->progressive = 1;//only for msn (1:progressive scanning 0:interlaced scanning)
- #else
- decoder->progressive = 0;
- #endif
- }
- break;
- case CARBACK_CAMERA_MODE_CVBS_NTST:
- {
- //printk(KERN_ALERT "++++++++++++++CARBACK_CAMERA_MODE_CVBS_NTST\n");
- if(decoder->id == RN675X_ID_RN6752)
- rn6752_write_reg(decoder,rn6752_itu656_cvbs_ntsc, sizeof(rn6752_itu656_cvbs_ntsc)/2);//new add
- else if(decoder->id == RN675X_ID_RN6752M)
- rn6752_write_reg(decoder,rn6752m_itu656_cvbs_ntsc, sizeof(rn6752m_itu656_cvbs_ntsc)/2);
- else if(decoder->id == RN675X_ID_RN6752V1)
- rn6752_write_reg(decoder,rn6752v1_itu656_cvbs_ntsc, sizeof(rn6752v1_itu656_cvbs_ntsc)/2);
- mode_cfg = RN6752_MODE_CVBS_NTSC;
- decoder->progressive = 0;
- }
- break;
- case CARBACK_CAMERA_MODE_720P25:
- {
- //printk(KERN_ALERT "++++++++++++++CARBACK_CAMERA_MODE_720P25\n");
- if(decoder->id == RN675X_ID_RN6752){
- rn6752_write_reg(decoder,rn6752_itu656_720p_pal, sizeof(rn6752_itu656_720p_pal)/2);//add 20211104
- }
- else if(decoder->id == RN675X_ID_RN6752M){
- rn6752_write_reg(decoder,rn6752m_itu656_720p_25fps, sizeof(rn6752m_itu656_720p_25fps)/2);}
- else if(decoder->id == RN675X_ID_RN6752V1){
- //printk(KERN_ALERT "++++++++++++++write rn6752v1_itu656_720p_25fps\n");
- rn6752_write_reg(decoder,rn6752v1_itu656_720p_25fps, sizeof(rn6752v1_itu656_720p_25fps)/2);
- }
- mode_cfg = RN6752_MODE_720P_25FPS;
- decoder->progressive = 1;
- }
- break;
- case CARBACK_CAMERA_MODE_720P30:
- {
- //printk(KERN_ALERT "++++++++++++++CARBACK_CAMERA_MODE_720P30\n");
- if(decoder->id == RN675X_ID_RN6752)
- rn6752_write_reg(decoder,rn6752_itu656_720p_ntsc, sizeof(rn6752_itu656_720p_ntsc)/2);//add 20211104
- else if(decoder->id == RN675X_ID_RN6752M){
- rn6752_write_reg(decoder,rn6752m_itu656_720p_30fps, sizeof(rn6752m_itu656_720p_30fps)/2);}
- else if(decoder->id == RN675X_ID_RN6752V1){
- rn6752_write_reg(decoder,rn6752m_itu656_720p_30fps, sizeof(rn6752m_itu656_720p_30fps)/2);}
- mode_cfg = RN6752_MODE_720P_30FPS;
- decoder->progressive = 1;
- }
- break;
- case CARBACK_CAMERA_MODE_1080P25:
- {
- //printk(KERN_ALERT "++++++++++++++CARBACK_CAMERA_MODE_1080P25\n");
- if(decoder->id == RN675X_ID_RN6752V1)
- rn6752_write_reg(decoder,rn6752m_itu656_1080p_25fps, sizeof(rn6752m_itu656_1080p_25fps)/2);
- mode_cfg = RN6752_MODE_1080P_25FPS;
- decoder->progressive = 1;
- }
- break;
- case CARBACK_CAMERA_MODE_1080P30:
- {
- //printk(KERN_ALERT "++++++++++++++CARBACK_CAMERA_MODE_1080P30\n");
- if(decoder->id == RN675X_ID_RN6752V1)
- rn6752_write_reg(decoder,rn6752m_itu656_1080p_30fps, sizeof(rn6752m_itu656_1080p_30fps)/2);
- mode_cfg = RN6752_MODE_1080P_30FPS;
- decoder->progressive = 1;
- }
- break;
- case RN6752_MODE_NONE:
- default:
- {
- //printk(KERN_ALERT "++++++++++++++RN6752_MODE_NONE\n");
- if(decoder->id == RN675X_ID_RN6752)
- rn6752_write_reg(decoder,rn6752_itu656_720p_ntsc, sizeof(rn6752_itu656_720p_ntsc)/2);
- else if(decoder->id == RN675X_ID_RN6752M)
- rn6752_write_reg(decoder,rn6752m_itu656_720p_25fps, sizeof(rn6752m_itu656_720p_25fps)/2);
- else if(decoder->id == RN675X_ID_RN6752V1)
- rn6752_write_reg(decoder,rn6752v1_itu656_720p_25fps, sizeof(rn6752v1_itu656_720p_25fps)/2);
- mode_cfg = RN6752_MODE_720P_30FPS;
- decoder->progressive = 1;
- }
- break;
- }
- }
- return mode_cfg;
- }
- static void rn6752_eq_work(struct work_struct *work)
- {
- struct rn6752 *decoder = container_of(work, struct rn6752, eq_work);
- static int mode_cfg = RN6752_MODE_NONE;
- static int curr_cfg = RN6752_MODE_NONE;
- static int check_count = 0;
- if(!decoder)
- goto end;
- decoder->enter_eq_work = 1;
-
- if(mode_cfg == RN6752_MODE_NONE)
- {
- if(decoder->camera_mode > 0){
- mode_cfg = rn6752_init_reg_cfg(decoder,decoder->camera_mode);
- curr_cfg = mode_cfg;
- if(mode_cfg)
- goto end_1;
- }
- #if 0
- if(rn6752_dbg)
- printk(KERN_ALERT "### rn6752_eq_work rn6752x reset\n");
- //reset
- rn6752_reset(dvr_rn6752->gpio_reset);
- //check id
- if(rn6752_check_id(dvr_rn6752))
- goto end;
- #endif
- //printk("----------------->rn6752 Dynamic detect mode<-----------------\n");
- //720p cfg: before auto match, we must config 720p mode, because the default clk config is based on 720P
- if(decoder->id == RN675X_ID_RN6752)
- {
- //rn6752_write_reg(decoder,rxchip_rn6752_720p_pal, sizeof(rxchip_rn6752_720p_pal)/2);
- rn6752_write_reg(decoder,rn6752_itu656_720p_ntsc, sizeof(rn6752_itu656_720p_ntsc)/2);
- }
- else if(decoder->id == RN675X_ID_RN6752M)
- {
- rn6752m_pre_init(decoder);
- rn6752_write_reg(decoder,rn6752m_itu656_720p_25fps, sizeof(rn6752m_itu656_720p_25fps)/2);
- }
- else if(decoder->id == RN675X_ID_RN6752V1)
- {
- rn6752m_pre_init(decoder);
- rn6752_write_reg(decoder,rn6752v1_itu656_720p_25fps, sizeof(rn6752v1_itu656_720p_25fps)/2);
- }
- mode_cfg = RN6752_MODE_720P_30FPS;
- decoder->progressive = 1;
- #ifdef CONFIG_RN6752_LOW_POWER_MODE
- if(!decoder->enter_carback && !decoder->enter_auxin)
- {
- rn6752_power_off();
- }
- #endif
- goto end;
- }
- if(decoder->id == RN675X_ID_RN6752)
- {
- curr_cfg = rn6752v1_input_signal_check(decoder);
- }
- else if(decoder->id == RN675X_ID_RN6752M)
- {
- curr_cfg = rn6752m_signal_check(decoder);
- if(curr_cfg == RN6752_MODE_NONE)
- {
- msleep(10);
- curr_cfg = rn6752m_signal_check(decoder);
- }
- }
- else if(decoder->id == RN675X_ID_RN6752V1)
- {
- curr_cfg = rn6752v1_input_signal_check(decoder);
- }
- if(!decoder->enter_carback)
- {
- exit:
- #ifdef CONFIG_RN6752_LOW_POWER_MODE
- rn6752_power_off();
- #endif
- if(rn6752_dbg)
- printk(KERN_ALERT "### %s exit without in carback or auxin\n", __FUNCTION__);
- //avoid recognize a wrong format, so default format should be 720P.
- //if(dvr_rn6752->last_source != DVR_SOURCE_CAMERA)
- {
- if(mode_cfg != RN6752_MODE_720P_30FPS)
- {
- if(decoder->id == RN675X_ID_RN6752){
- rn6752_write_reg(decoder,rn6752_itu656_720p_ntsc, sizeof(rn6752_itu656_720p_ntsc)/2);
- }
- else if(decoder->id == RN675X_ID_RN6752M){
- rn6752_write_reg(decoder,rn6752m_itu656_720p_25fps, sizeof(rn6752m_itu656_720p_25fps)/2);}
- else if(decoder->id == RN675X_ID_RN6752V1){
- rn6752_write_reg(decoder,rn6752v1_itu656_720p_25fps, sizeof(rn6752v1_itu656_720p_25fps)/2);
- }
- mode_cfg = RN6752_MODE_720P_30FPS;
- decoder->progressive = 1;
- }
- decoder->mode = RN6752_MODE_NONE;
- }
- goto end;
- }
- if(rn6752_dbg)
- printk(KERN_ALERT "rn6752%s mode:%s, mode_cfg:%s\n", (decoder->id==RN675X_ID_RN6752M)?"m":"v1", rn6752_get_mode_string(curr_cfg), rn6752_get_mode_string(mode_cfg));
- //printk("mode_cfg = %d,curr_cfg = %d\n",mode_cfg,curr_cfg);
- if((curr_cfg == RN6752_MODE_NONE) || (mode_cfg != curr_cfg))
- {
- if(rn6752_dbg)
- printk(KERN_ALERT "### rn6752 change mode to (%s)\n", rn6752_get_mode_string(curr_cfg));
- mode_cfg = rn6752_init_reg_cfg(decoder,curr_cfg);
- }
- end_1:
- rn6752_test_and_dvr_restart(decoder,mode_cfg);
- eixt_1:
- decoder->mode = curr_cfg;
- end:
- decoder->enter_eq_work = 0;
- }
- static int rn6752_check_id(struct rn6752 *decoder)
- {
- int id = -1;
- int ret;
- if(!decoder)
- goto err_check_id;
- ret = rn6752_read_byte(decoder,0xfe);
- if(ret < 0)
- goto err_check_id;
- id = (ret<<8);
- ret = rn6752_read_byte(decoder,0xfd);
- if(ret < 0)
- goto err_check_id;
- id |= ret;
- if(id == 0x401) {
- decoder->id = RN675X_ID_RN6752;
- printk(KERN_ALERT "AHD IC: RN6752\n");
- } else if(id == 0x501) {
- decoder->id = RN675X_ID_RN6752M;
- printk(KERN_ALERT "AHD IC: RN6752M\n");
- }else if(id == 0x2601) {
- decoder->id = RN675X_ID_RN6752V1;//RN675X_ID_RN6752M
- printk(KERN_ALERT "AHD IC: RN6752V1\n");
- }
- return 0;
- err_check_id:
- printk(KERN_ERR "***ERR: %s failed, id:%d, ret:%d\n", __FUNCTION__, id, ret);
- decoder->id = RN675X_ID_UNKNOWN;
- return -ENODEV;
- }
- static void rn6752_reset(struct rn6752 *decoder)
- {
- //sw reset
- rn6752_write_byte(decoder,0x80, 0x31); //soft reset
- msleep(100);
- rn6752_write_byte(decoder,0x80, 0x30); //reset complete
-
- if(decoder && (decoder->curr_channel >= 0))
- rn6752_write_byte(decoder,0xD3, decoder->curr_channel);
- rn6752_write_byte(decoder,0x1A, 0x83); //disable blue screen
- }
- static void rn6752_work_timer(struct timer_list *t)
- {
- struct rn6752 *decoder = from_timer(decoder, t, work_timer);
- static int flag_signal = 0;
- static int count_signal = 0;
- static int flag_no_signal = 0;
- static int count_no_signal = 0;
- if(!decoder->signal){
- if(!flag_signal){
- if(!decoder->enter_eq_work){
- queue_work(decoder->eq_queue, &decoder->eq_work);
- }
- count_signal ++;
- if(count_signal == 20){
- flag_signal = 1;
- }
- }
- flag_no_signal = 0;
- count_no_signal = 0;
- }
- if(decoder->signal == V4L2_IN_ST_NO_SIGNAL){
- if(!flag_no_signal){
- if(!decoder->enter_eq_work){
- queue_work(decoder->eq_queue, &decoder->eq_work);
- }
- count_no_signal ++;
- if(count_no_signal == 20){
- flag_no_signal = 1;
- }
- }
- flag_signal = 0;
- count_signal = 0;
- }
-
- mod_timer(&decoder->work_timer, jiffies + msecs_to_jiffies(100));
- }
- static void rn6752_timeout_timer(struct timer_list *t)
- {
- //printk(KERN_ALERT "rn6752_timeout_timer entry\n");
- struct rn6752 *decoder = from_timer(decoder, t, timer);
- if(decoder)
- {
- if(!decoder->enter_eq_work)
- queue_work(decoder->eq_queue, &decoder->eq_work);
- if(decoder->timer_timeout > 0)
- {
- decoder->timer_timeout --;
- mod_timer(&decoder->timer, jiffies + msecs_to_jiffies(100));
- }
- else
- {
- decoder->timer_start = false;
- }
- }
- }
- static void rn6752_start_timer(struct rn6752 *decoder,int timeout_100ms)
- {
- //speed video recognise
- if(decoder)
- {
- decoder->timer_timeout = timeout_100ms;
- if(!decoder->timer_start)
- {
- decoder->timer_start = true;
- mod_timer(&decoder->timer, jiffies + msecs_to_jiffies(1));
- }
- }
- }
- /* ----------------------------------------------------------------------- */
- static int _rn6752_init(struct rn6752 *decoder)
- {
- rn6752_reset(decoder);
- rn6752_check_id(decoder);
- return 0;
- }
- static int rn6752_s_ctrl(struct v4l2_ctrl *ctrl)
- {
- struct v4l2_subdev *sd = to_sd(ctrl);
- struct rn6752 *decoder = to_rn6752(sd);
- switch (ctrl->id) {
- case V4L2_CID_BRIGHTNESS:
- ctrl->val &= 0xFF;
- rn6752_write_byte(decoder,RN6752_BRIGHTNESS_ADDR, ctrl->val);
- return 0;
- case V4L2_CID_CONTRAST:
- ctrl->val &= 0xFF;
- rn6752_write_byte(decoder,RN6752_CONTRAST_ADDR, ctrl->val);
- return 0;
- case V4L2_CID_SATURATION:
- ctrl->val &= 0xFF;
- rn6752_write_byte(decoder,RN6752_SATURATION_ADDR, ctrl->val);
- return 0;
- case V4L2_CID_HUE:
- ctrl->val &= 0xFF;
- rn6752_write_byte(decoder,RN6752_HUE_ADDR, ctrl->val);
- return 0;
- }
- return -EINVAL;
- }
- static int rn6752_g_input_status(struct v4l2_subdev *sd, u32 *status)
- {
- struct rn6752 *decoder = to_rn6752(sd);
- static int curr_cfg = RN6752_MODE_NONE;
- int ret;
- if(rn6752_dbg)
- printk(KERN_ALERT "### rn6752_detect_signal\n");
- if(decoder)
- {
- if (status) {
- *status = 0;
- if(decoder->id == RN675X_ID_RN6752)
- {
- //return ((g_dvr_rn6752->mode != RN6752_MODE_NONE) ? 1 : 0);
- if(decoder->mode != RN6752_MODE_NONE)
- {
- ret = rn6752_read_byte(decoder,0x00);
- if(ret >= 0)
- {
- if((ret & 0x10) == 0)
- {
- *status |= V4L2_IN_ST_NO_SIGNAL;
- }
- }
- }
- }
- else if(decoder->id == RN675X_ID_RN6752M)
- {
- return ((decoder->mode != RN6752_MODE_NONE) ? 1 : 0);
- }
- else if(decoder->id == RN675X_ID_RN6752V1)
- {
- if (rn6752v1_detect_signal(decoder))
- *status |= V4L2_IN_ST_NO_SIGNAL;
- }
- }
- }
- decoder->signal = *status;
- return 0;
- }
- static int rn6752_select_input(struct rn6752 *decoder, u32 input)
- {
- int ret;
- if(rn6752_dbg)
- printk(KERN_ALERT "### rn6752_select_channel ch:%d\n", input);
- if((input >= 0) && (input <= 1))
- {
- if(decoder) {
- decoder->mode = RN6752_MODE_NONE;
-
- ret = rn6752_read_byte(decoder,0xD3);
- if(ret >= 0)
- {
- if(ret == input)
- {
- if(rn6752_dbg)
- printk(KERN_ALERT "### %s, same ch:%d, ignore\n", __FUNCTION__, input);
- return 0;
- }
- }
- if(rn6752_write_byte(decoder,0xD3, input) == 0)
- decoder->curr_channel = input;
- }
- }
- return 0;
- }
- static int rn6752_s_routing(struct v4l2_subdev *sd, u32 input,
- u32 output, u32 config)
- {
- struct rn6752 *decoder = to_rn6752(sd);
- //printk(KERN_ALERT "rn6752_select_channel %d \n",input);
- rn6752_select_input(decoder, input);
- decoder->input = input;
- return 0;
- }
- static int rn6752_init(struct v4l2_subdev *sd, u32 val)
- {
- struct rn6752 *decoder = to_rn6752(sd);
- int ret;
- ret=_rn6752_init(decoder);
- if(ret){
- printk(KERN_ALERT "_rn6752_init error.\n");
- }
- return ret;
- }
- static long rn6752_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
- {
- struct rn6752 *decoder = to_rn6752(sd);
- int ret = 0;
- switch (cmd) {
- case VIDIOC_GET_RESOLUTION:
- {
- int* temp = (int *)arg;
- *temp = TYPE_1080P;
- break;
- }
- case VIDIOC_GET_PROGRESSIVE:
- {
- int* temp = (int *)arg;
- int progressive = 1;
- if(rn6752_dbg)
- printk(KERN_ALERT "### itu656 get rn6752 progressive:%d\n", progressive);
- *temp = decoder->progressive;
- break;
- }
- case VIDIOC_GET_CHIPINFO:
- {
- int* temp = (int *)arg;
- *temp = TYPE_RN6752;
- break;
- }
- case VIDIOC_ENTER_CARBACK:
- {
- rn6752_start_timer(decoder,20);
- decoder->enter_carback = 1;
- break;
- }
- case VIDIOC_EXIT_CARBACK:
- {
- decoder->enter_carback = 0;
- rn6752_start_timer(decoder,20);
- break;
- }
- case VIDIOC_GET_ITU601_ENABLE:
- {
- int* temp = (int *)arg;
- *temp = 0;
- break;
- }
- case VIDIOC_SET_AVIN_MODE:
- {
- rn6752_reset(decoder);
- break;
- }
- case VIDIOC_ENABLE_TIME:
- {
- mod_timer(&decoder->work_timer, jiffies + msecs_to_jiffies(1));
- break;
- }
- default:
- return -ENOIOCTLCMD;
- }
- return ret;
- }
- /* ----------------------------------------------------------------------- */
- static const struct v4l2_ctrl_ops rn6752_ctrl_ops = {
- .s_ctrl = rn6752_s_ctrl,
- };
- static const struct v4l2_subdev_video_ops rn6752_video_ops = {
- .g_input_status = rn6752_g_input_status,
- .s_routing = rn6752_s_routing,
- };
- static const struct v4l2_subdev_core_ops rn6752_core_ops = {
- .init = rn6752_init,
- .ioctl = rn6752_ioctl,
- };
- static const struct v4l2_subdev_ops rn6752_ops = {
- .core = &rn6752_core_ops,
- .video = &rn6752_video_ops,
- };
- static int rn6752_parse_dt(struct rn6752 *decoder, struct device_node *np)
- {
- int ret = 0;
- int value;
- if(!of_property_read_u32(np, "default-channel", &value)) {
- decoder->curr_channel = value;
- } else {
- decoder->curr_channel = 0;
- }
- if(!of_property_read_u32(np, "camera-format", &value)) {
- decoder->camera_mode = value;
- } else {
- decoder->camera_mode = RN6752_MODE_NONE;
- }
-
- if(!of_property_read_u32(np, "itu601in", &value)) {
- decoder->itu601in = value;
- } else {
- decoder->itu601in = 0;
- }
-
- return ret;
- }
- static void rn6752_set_display_effect_default(struct rn6752 *decoder)
- {
- rn6752_write_byte(decoder,RN6752_BRIGHTNESS_ADDR, (0x80 & 0xFF));
- rn6752_write_byte(decoder,RN6752_CONTRAST_ADDR, (0x80 & 0xFF));
- rn6752_write_byte(decoder,RN6752_SATURATION_ADDR, (0x00 & 0xFF));
- rn6752_write_byte(decoder,RN6752_HUE_ADDR, (0x00 & 0xFF));
- //amt_write_reg(decoder,RN6752_SHARPNESS_ADDR, ((rn6752_effect.carback_sharpness | 0x80) & 0xFF));
- }
- static int rn6752_probe(struct i2c_client *client,
- const struct i2c_device_id *id)
- {
- struct rn6752 *decoder;
- struct v4l2_subdev *sd;
- struct device_node *np = client->dev.of_node;
- int res;
- /* Check if the adapter supports the needed features */
- if (!i2c_check_functionality(client->adapter,
- I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
- return -EIO;
- decoder = devm_kzalloc(&client->dev, sizeof(*decoder), GFP_KERNEL);
- if (!decoder)
- return -ENOMEM;
- decoder->client = client;
- decoder->default_addr = client->addr;
- decoder->mode = RN6752_MODE_NONE;
- decoder->camera_mode = 0;
- decoder->signal = V4L2_IN_ST_NO_SIGNAL;
- decoder->curr_channel = 0;
- sd = &decoder->sd;
- //decoder->reset_gpio = devm_gpiod_get_optional(&client->dev, "reset",
- // GPIOD_OUT_HIGH);
- //if (IS_ERR(decoder->reset_gpio)) {
- // res = PTR_ERR(decoder->reset_gpio);
- // v4l_err(client, "request for reset pin failed: %d\n", res);
- // return res;
- // }
-
- decoder->eq_queue = create_singlethread_workqueue("rn6752_eq_queue");
- if(decoder->eq_queue)
- {
- INIT_WORK(&decoder->eq_work, rn6752_eq_work);
- }
- v4l2_i2c_subdev_init(sd, client, &rn6752_ops);
- res = rn6752_parse_dt(decoder, np);
- if (res) {
- dev_err(sd->dev, "DT parsing error: %d\n", res);
- return res;
- }
-
- #if 0
- decoder->eq_queue = create_singlethread_workqueue("rn6752_eq_queue");
- if(decoder->eq_queue)
- {
- INIT_WORK(&decoder->eq_work, rn6752_eq_work);
- }
- queue_work(decoder->eq_queue, &decoder->eq_work);
- #endif
- decoder->timer_start = false;
- timer_setup(&decoder->timer, rn6752_timeout_timer,0);
- timer_setup(&decoder->work_timer, rn6752_work_timer,0);
-
- sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
- v4l2_ctrl_handler_init(&decoder->hdl, 4);
- v4l2_ctrl_new_std(&decoder->hdl, &rn6752_ctrl_ops,
- V4L2_CID_BRIGHTNESS, 0, 255, 1, 128);
- v4l2_ctrl_new_std(&decoder->hdl, &rn6752_ctrl_ops,
- V4L2_CID_CONTRAST, 0, 255, 1, 128);
- v4l2_ctrl_new_std(&decoder->hdl, &rn6752_ctrl_ops,
- V4L2_CID_SATURATION, 0, 255, 1, 128);
- v4l2_ctrl_new_std(&decoder->hdl, &rn6752_ctrl_ops,
- V4L2_CID_HUE, -128, 127, 1, 0);
- sd->ctrl_handler = &decoder->hdl;
- if (decoder->hdl.error) {
- res = decoder->hdl.error;
- goto err;
- }
- res = v4l2_async_register_subdev(sd);
- if (res < 0)
- goto err;
-
- return 0;
- err:
- v4l2_ctrl_handler_free(&decoder->hdl);
- return res;
-
- return 0;
- }
- static int rn6752_remove(struct i2c_client *client)
- {
- struct v4l2_subdev *sd = i2c_get_clientdata(client);
- struct rn6752 *decoder = to_rn6752(sd);
- dev_dbg(sd->dev,
- "rn6752.c: removing rn6752 adapter on address 0x%x\n",
- client->addr << 1);
-
- del_timer(&decoder->timer);
- del_timer(&decoder->work_timer);
- if(decoder->eq_queue)
- destroy_workqueue(decoder->eq_queue);
- v4l2_async_unregister_subdev(sd);
- v4l2_ctrl_handler_free(&decoder->hdl);
- return 0;
- }
- /* ----------------------------------------------------------------------- */
- /* the length of name must less than 20 */
- static const struct i2c_device_id rn6752_id[] = {
- { "rn6752_ark1668e", },
- { }
- };
- MODULE_DEVICE_TABLE(i2c, rn6752_id);
- #if IS_ENABLED(CONFIG_OF)
- static const struct of_device_id rn6752_of_match[] = {
- { .compatible = "arkmicro,ark1668e_rn6752", },
- { /* sentinel */ },
- };
- MODULE_DEVICE_TABLE(of, rn6752_of_match);
- #endif
- static struct i2c_driver rn6752_driver = {
- .driver = {
- .of_match_table = of_match_ptr(rn6752_of_match),
- .name = "rn6752",
- },
- .probe = rn6752_probe,
- .remove = rn6752_remove,
- .id_table = rn6752_id,
- };
- static int __init rn_6752_init(void)
- {
- return i2c_add_driver(&rn6752_driver);
- }
- static void __exit rn_6752_exit(void)
- {
- i2c_del_driver(&rn6752_driver);
- }
- device_initcall(rn_6752_init);
- MODULE_AUTHOR("arkmicro");
- MODULE_DESCRIPTION("arkmicro rn6752 decoder driver for v4l2");
- MODULE_LICENSE("GPL v2");
|