rn6752.c 74 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700
  1. /*
  2. * rn6752 - Arkmicro rn6752 video decoder driver
  3. *
  4. * Copyright (c) 2020,2021 Arkmicro, Inc.
  5. * This code is placed under the terms of the GNU General Public License v2
  6. */
  7. #include <linux/module.h>
  8. #include <linux/init.h>
  9. #include <linux/errno.h>
  10. #include <linux/kernel.h>
  11. #include <linux/interrupt.h>
  12. #include <linux/i2c.h>
  13. #include <linux/slab.h>
  14. #include <linux/of.h>
  15. #include <linux/gpio/consumer.h>
  16. #include <linux/videodev2.h>
  17. #include <media/v4l2-ioctl.h>
  18. #include <media/v4l2-event.h>
  19. #include <media/v4l2-device.h>
  20. #include <media/v4l2-ctrls.h>
  21. #include <linux/mutex.h>
  22. #include <linux/delay.h>
  23. extern int dvr_get_pragressive(void);
  24. extern void dvr_restart(void);
  25. //#define RN6752_CVBS_PAL_CHECK_ERR //rn6752 signal check error
  26. #define RN6752V1_CVBS_PAL_PROGRESSIVE
  27. struct rn6752 {
  28. struct v4l2_ctrl_handler hdl;
  29. struct v4l2_subdev sd;
  30. struct gpio_desc *reset_gpio;
  31. struct workqueue_struct *eq_queue;
  32. struct work_struct eq_work;
  33. struct i2c_client *client;
  34. struct timer_list timer;
  35. volatile bool timer_start;
  36. volatile int timer_timeout;
  37. struct timer_list work_timer;
  38. int mode;
  39. int itu601in;
  40. int camera_mode;
  41. int progressive;
  42. int curr_channel;
  43. int signal;
  44. int id;
  45. volatile int enter_eq_work;
  46. int enter_auxin;
  47. int dvr_start;
  48. int enter_carback;
  49. int last_source;
  50. u32 input;
  51. u8 brightness;
  52. u8 contrast;
  53. u8 saturation;
  54. u8 hue;
  55. unsigned short default_addr;
  56. };
  57. static bool rn6752_dbg = false;
  58. #define VIDIOC_GET_RESOLUTION _IOWR('V', BASE_VIDIOC_PRIVATE + 1, int)
  59. #define VIDIOC_GET_PROGRESSIVE _IOWR('V', BASE_VIDIOC_PRIVATE + 2, int)
  60. #define VIDIOC_GET_CHIPINFO _IOWR('V', BASE_VIDIOC_PRIVATE + 3, int)
  61. #define VIDIOC_ENTER_CARBACK _IOWR('V', BASE_VIDIOC_PRIVATE + 4, int)
  62. #define VIDIOC_EXIT_CARBACK _IOWR('V', BASE_VIDIOC_PRIVATE + 5, int)
  63. #define VIDIOC_GET_ITU601_ENABLE _IOWR('V', BASE_VIDIOC_PRIVATE + 6, int)
  64. #define VIDIOC_SET_AVIN_MODE _IOWR('V', BASE_VIDIOC_PRIVATE + 7, int)
  65. #define VIDIOC_ENABLE_TIME _IOWR('V', BASE_VIDIOC_PRIVATE + 8, int)
  66. #define ARK_DVR_BRIGHTNESS_MASK (1<<0)
  67. #define ARK_DVR_CONTRAST_MASK (1<<1)
  68. #define ARK_DVR_SATURATION_MASK (1<<2)
  69. #define ARK_DVR_HUE_MASK (1<<3)
  70. #define ARK_DVR_SHARPNESS_MASK (1<<4)
  71. #define RN6752_STATUS 0x26
  72. #define RN6752_BUS_STATUS 0xaf
  73. #define RN6752_CONTRAST_CTL 0xd3
  74. #define RN6752_BRIGHT_CTL 0xd4
  75. #define RN6752_HUE_CTL 0xd5
  76. #define RN6752_SATURATION_CTL 0xd6
  77. #define RN6752_INPUT_CTL 0xdc
  78. enum {
  79. RN6752_MODE_NONE,
  80. //CVBS mode
  81. RN6752_MODE_CVBS_PAL,
  82. RN6752_MODE_CVBS_NTSC,
  83. //add other mode
  84. //720P mode
  85. RN6752_MODE_720P_25FPS,
  86. RN6752_MODE_720P_30FPS,
  87. RN6752_MODE_1080P_25FPS,
  88. RN6752_MODE_1080P_30FPS,
  89. RN6752_MODE_END,
  90. };
  91. enum {
  92. RN6752_BRIGHTNESS_ADDR = 0x01,
  93. RN6752_CONTRAST_ADDR = 0x02,
  94. RN6752_SATURATION_ADDR = 0x03,
  95. RN6752_HUE_ADDR = 0x04,
  96. RN6752_SHARPNESS_ADDR = 0x05
  97. };
  98. enum {
  99. RN675X_ID_UNKNOWN,
  100. RN675X_ID_RN6752,
  101. RN675X_ID_RN6752M,
  102. RN675X_ID_RN6752V1,
  103. RN675X_ID_END
  104. };
  105. enum dvr_source {
  106. DVR_SOURCE_CAMERA,
  107. DVR_SOURCE_AUX,
  108. DVR_SOURCE_DVD,
  109. };
  110. enum {
  111. TYPE_UNKNOWN = -1,
  112. TYPE_CVBS = 0,
  113. TYPE_720P,
  114. TYPE_1080P,
  115. };
  116. enum carback_camera_mode {
  117. CARBACK_CAMERA_MODE_DYNAMIC,
  118. CARBACK_CAMERA_MODE_CVBS_PAL,
  119. CARBACK_CAMERA_MODE_CVBS_NTST,
  120. CARBACK_CAMERA_MODE_720P25,
  121. CARBACK_CAMERA_MODE_720P30,
  122. CARBACK_CAMERA_MODE_1080P25,
  123. CARBACK_CAMERA_MODE_1080P30,
  124. //add others mode.
  125. CARBACK_CAMERA_MODE_END
  126. };
  127. enum {
  128. TYPE_UNDEF = -1,
  129. TYPE_ARK7116 = 0,
  130. TYPE_ARK7116H,
  131. TYPE_RN6752,
  132. TYPE_PR2000,
  133. };
  134. const char rxchip_rn6752_cvbs_pal[] = {
  135. // 720H@50, 27MHz, BT656 output
  136. // Slave address is 0x58
  137. // Register, data
  138. // if clock source(Xin) of RN675x is 26MHz, please add these procedures marked first
  139. //0xD2, 0x85, // disable auto clock detect
  140. //0xD6, 0x37, // 27MHz default
  141. //0xD8, 0x18, // switch to 26MHz clock
  142. //delay(100), // delay 100ms
  143. 0x81, 0x01, // turn on video decoder
  144. 0xA3, 0x00, // enable 72MHz sampling
  145. 0xDB, 0x8F, // internal use*
  146. 0xFF, 0x00, // switch to ch0 (default; optional)
  147. 0x2C, 0x30, // select sync slice points
  148. 0x50, 0x00, // 720H resolution select for BT.601
  149. 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
  150. 0x63, 0x09, // filter control
  151. 0x59, 0x00, // extended register access
  152. 0x5A, 0x00, // data for extended register
  153. 0x58, 0x01, // enable extended register write
  154. 0x07, 0x22, // PAL format
  155. 0x2F, 0x14, // internal use
  156. 0x5E, 0x03, // disable H-scaling control
  157. 0x5B, 0x00, //
  158. 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
  159. 0x3E, 0x32, // AVID & VBLK out for BT.601
  160. 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
  161. 0x46, 0x23, // AVID & VBLK out for BT.601
  162. 0x28, 0x92, // cropping //old:0x92
  163. 0x00, 0x00, // internal use*
  164. 0x2D, 0xF2, // cagc adjust
  165. 0x0D, 0x20, // cagc initial value
  166. // 0x05, 0x00, // sharpness
  167. // 0x04, 0x80, // hue
  168. 0x11, 0x03,
  169. 0x37, 0x33,
  170. 0x61, 0x6C,
  171. 0xDF, 0xFF, // enable 720H format
  172. 0x8E, 0x00, // single channel output for VP
  173. 0x8F, 0x00, // 720H mode for VP
  174. 0x8D, 0x31, // enable VP out
  175. 0x89, 0x00, // select 27MHz for SCLK
  176. 0x88, 0xC1, // enable SCLK out
  177. 0x81, 0x01, // turn on video decoder
  178. 0x96, 0x00, // select AVID & VBLK as status indicator
  179. 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
  180. 0x98, 0x00, // video timing pin status
  181. 0x9A, 0x40, // select AVID & VBLK as status indicator
  182. 0x9B, 0xE1, // enable status indicator out on HSYNC
  183. 0x9C, 0x00, // video timing pin status
  184. };
  185. const char rxchip_rn6752_cvbs_ntsc[] = {
  186. // 720H@60, 27MHz, BT656 output
  187. // Slave address is 0x58
  188. // Register, data
  189. // if clock source(Xin) of RN675x is 26MHz, please add these procedures marked first
  190. //0xD2, 0x85, // disable auto clock detect
  191. //0xD6, 0x37, // 27MHz default
  192. //0xD8, 0x18, // switch to 26MHz clock
  193. //delay(100), // delay 100ms
  194. 0x81, 0x01, // turn on video decoder
  195. 0xA3, 0x00, // enable 72MHz sampling
  196. 0xDB, 0x8F, // internal use*
  197. 0xFF, 0x00, // switch to ch0 (default; optional)
  198. 0x2C, 0x30, // select sync slice points
  199. 0x50, 0x00, // 720H resolution select for BT.601
  200. 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
  201. 0x63, 0x09, // filter control
  202. 0x59, 0x00, // extended register access
  203. 0x5A, 0x00, // data for extended register
  204. 0x58, 0x01, // enable extended register write
  205. 0x07, 0x23, // NTSC format
  206. 0x2F, 0x14, // internal use
  207. 0x5E, 0x03, // disable H-scaling control
  208. 0x5B, 0x00, //
  209. 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
  210. 0x3E, 0x32, // AVID & VBLK out for BT.601
  211. 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
  212. 0x46, 0x23, // AVID & VBLK out for BT.601
  213. 0x28, 0x92, // cropping
  214. 0x00, 0x00, // internal use*
  215. 0x2D, 0xF2, // cagc adjust
  216. 0x0D, 0x20, // cagc initial value
  217. // 0x05, 0x00, // sharpness
  218. // 0x04, 0x80, // hue
  219. 0x11, 0x03,
  220. 0x37, 0x33,
  221. 0x61, 0x6C,
  222. 0xDF, 0xFF, // enable 720H format
  223. 0x8E, 0x00, // single channel output for VP
  224. 0x8F, 0x00, // 720H mode for VP
  225. 0x8D, 0x31, // enable VP out
  226. 0x89, 0x00, // select 27MHz for SCLK
  227. 0x88, 0xC1, // enable SCLK out
  228. 0x81, 0x01, // turn on video decoder
  229. 0x96, 0x00, // select AVID & VBLK as status indicator
  230. 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
  231. 0x98, 0x00, // video timing pin status
  232. 0x9A, 0x40, // select AVID & VBLK as status indicator
  233. 0x9B, 0xE1, // enable status indicator out on HSYNC
  234. 0x9C, 0x00, // video timing pin status
  235. };
  236. const char rxchip_rn6752_720p_pal[]=
  237. {
  238. // 720P@25, 72MHz, BT656 output
  239. // Slave address is 0x58
  240. // Register, data
  241. // if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
  242. //0xD2, 0x85, // disable auto clock detect
  243. //0xD6, 0x37, // 27MHz default
  244. //0xD8, 0x18, // switch to 26MHz clock
  245. //delay(100), // delay 100ms
  246. 0x81, 0x01, // turn on video decoder
  247. 0xA3, 0x04, // enable 72MHz sampling
  248. 0xDB, 0x8F, // internal use*
  249. 0xFF, 0x00, // switch to ch0 (default; optional)
  250. 0x2C, 0x30, // select sync slice points
  251. 0x50, 0x02, // 720p resolution select for BT.601
  252. 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
  253. 0x63, 0xBD, // filter control
  254. 0x59, 0x00, // extended register access
  255. 0x5A, 0x02, // data for extended register :Pal
  256. 0x58, 0x01, // enable extended register write
  257. 0x07, 0x23, // 720p format
  258. 0x2F, 0x04, // internal use*
  259. 0x5E, 0x0B, // enable H-scaling control
  260. 0x51, 0x44, // scale factor1
  261. 0x52, 0x86, // scale factor2
  262. 0x53, 0x22, // scale factor3
  263. 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
  264. 0x3E, 0x32, // AVID & VBLK out for BT.601
  265. 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
  266. 0x46, 0x23, // AVID & VBLK out for BT.601
  267. 0x28, 0x92, // cropping
  268. 0x00, 0x20, // internal use*
  269. 0x2D, 0xF2, // cagc adjust
  270. 0x0D, 0x20, // cagc initial value
  271. // 0x05, 0x00, // sharpness
  272. // 0x04, 0x80, // hue
  273. 0x11, 0x84,
  274. 0x37, 0x33,
  275. 0x61, 0x6C,
  276. 0xDF, 0xFE, // enable 720p format
  277. 0x8E, 0x00, // single channel output for VP
  278. 0x8F, 0x80, // 720p mode for VP
  279. 0x8D, 0x31, // enable VP out
  280. 0x89, 0x09, // select 72MHz for SCLK
  281. 0x88, 0xC1, // enable SCLK out
  282. 0x81, 0x01, // turn on video decoder
  283. 0x96, 0x00, // select AVID & VBLK as status indicator
  284. 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
  285. 0x98, 0x00, // video timing pin status
  286. 0x9A, 0x40, // select AVID & VBLK as status indicator
  287. 0x9B, 0xE1, // enable status indicator out on HSYNC
  288. 0x9C, 0x00, // video timing pin status
  289. };
  290. const char rxchip_rn6752_720p_ntsc[] = {
  291. // 720P@30, 72MHz, BT656 output
  292. // Slave address is 0x58
  293. // Register, data
  294. // if clock source(Xin) of RN675x is 26MHz, please add these procedures marked first
  295. //0xD2, 0x85, // disable auto clock detect
  296. //0xD6, 0x37, // 27MHz default
  297. //0xD8, 0x18, // switch to 26MHz clock
  298. //delay(100), // delay 100ms
  299. 0x81, 0x01, // turn on video decoder
  300. 0xA3, 0x04, // enable 72MHz sampling
  301. 0xDB, 0x8F, // internal use*
  302. 0xFF, 0x00, // switch to ch0 (default; optional)
  303. 0x2C, 0x30, // select sync slice points
  304. 0x50, 0x02, // 720p resolution select for BT.601
  305. 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
  306. 0x63, 0xBD, // filter control
  307. 0x59, 0x00, // extended register access
  308. 0x5A, 0x04, // data for extended register
  309. 0x58, 0x01, // enable extended register write
  310. 0x07, 0x23, // 720p format
  311. 0x2F, 0x04, // internal use*
  312. 0x5E, 0x0B, // enable H-scaling control
  313. 0x51, 0x44, // scale factor1
  314. 0x52, 0x86, // scale factor2
  315. 0x53, 0x22, // scale factor3
  316. 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
  317. 0x3E, 0x32, // AVID & VBLK out for BT.601
  318. 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
  319. 0x46, 0x23, // AVID & VBLK out for BT.601
  320. 0x28, 0x92, // cropping
  321. 0x00, 0x20, // internal use*
  322. 0x2D, 0xF2, // cagc adjust
  323. 0x0D, 0x20, // cagc initial value
  324. // 0x05, 0x00, // sharpness
  325. // 0x04, 0x80, // hue
  326. 0x11, 0x84,
  327. 0x37, 0x33,
  328. 0x61, 0x6C,
  329. 0xDF, 0xFE, // enable 720p format
  330. 0x8E, 0x00, // single channel output for VP
  331. 0x8F, 0x80, // 720p mode for VP
  332. 0x8D, 0x31, // enable VP out
  333. 0x89, 0x09, // select 72MHz for SCLK
  334. 0x88, 0xC1, // enable SCLK out
  335. 0x81, 0x01, // turn on video decoder
  336. 0x96, 0x00, // select AVID & VBLK as status indicator
  337. 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
  338. 0x98, 0x00, // video timing pin status
  339. 0x9A, 0x40, // select AVID & VBLK as status indicator
  340. 0x9B, 0xE1, // enable status indicator out on HSYNC
  341. 0x9C, 0x00, // video timing pin status
  342. };
  343. static const char rn6752_itu656_cvbs_pal[]=
  344. {
  345. #if 1
  346. //\B5\A5\B3\A1\CA\E4\B3\F6\C5\E4\D6\C3(itu656)
  347. // 720H@50, 27MHz, BT601 output
  348. // Slave address is 0x58
  349. // Register, data
  350. // if clock source(Xin) of RN675x is 26MHz, please add these procedures marked first
  351. //0xD2, 0x85, // disable auto clock detect
  352. //0xD6, 0x37, // 27MHz default
  353. //0xD8, 0x18, // switch to 26MHz clock
  354. //delay(100), // delay 100ms
  355. 0x81, 0x01, // turn on video decoder
  356. 0xA3, 0x00, // enable 72MHz sampling
  357. 0xDB, 0x8F, // internal use*
  358. 0xFF, 0x00, // switch to ch0 (default; optional)
  359. 0x2C, 0x30, // select sync slice points
  360. 0x50, 0x00, // 720H resolution select for BT.601
  361. 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
  362. 0x63, 0x09, // filter control
  363. 0x59, 0x00, // extended register access
  364. 0x5A, 0x00, // data for extended register
  365. 0x58, 0x01, // enable extended register write
  366. 0x07, 0x22, // PAL format
  367. 0x2F, 0x14, // internal use
  368. 0x5E, 0x03, // disable H-scaling control
  369. 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
  370. 0x3E, 0x32, // AVID & VBLK out for BT.601
  371. 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
  372. 0x46, 0x23, // AVID & VBLK out for BT.601
  373. 0x47, 0xC3, // for customer project
  374. 0x41, 0x00,
  375. 0x42, 0x00,
  376. 0x20, 0x24,
  377. 0x21, 0x46,
  378. 0x22, 0xAF,
  379. 0x23, 0X17,
  380. 0x24, 0X37,
  381. 0x25, 0X17,
  382. 0x26, 0X00,
  383. 0x28, 0xE2, // cropping
  384. 0x00, 0x00, // internal use*
  385. 0x2D, 0xF2, // cagc adjust
  386. 0x0D, 0x20, // cagc initial value
  387. 0x05, 0x00, // sharpness
  388. 0x04, 0x80, // hue
  389. 0x11, 0x03,
  390. 0x37, 0x33,
  391. 0x61, 0x6C,
  392. 0xDF, 0xFF, // enable 720H format
  393. 0x8E, 0x00, // single channel output for VP
  394. 0x8F, 0x00, // 720H mode for VP
  395. 0x8D, 0x31, // enable VP out
  396. 0x89, 0x00, // select 27MHz for SCLK
  397. 0x88, 0xC1, // enable SCLK out
  398. 0x81, 0x01, // turn on video decoder
  399. 0x96, 0x00, // select AVID & VBLK as status indicator
  400. 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
  401. 0x98, 0x00, // video timing pin status
  402. 0x9A, 0x40, // select AVID & VBLK as status indicator
  403. 0x9B, 0xE1, // enable status indicator out on HSYNC
  404. 0x9C, 0x00, // video timing pin status
  405. #else
  406. //\u02eb\B3\A1\CA\E4\B3\F6\C5\E4\D6\C3(itu656)
  407. // 720H@50, 27MHz, BT656 output
  408. // Slave address is 0x58
  409. // Register, data
  410. // if clock source(Xin) of RN675x is 26MHz, please add these procedures marked first
  411. //0xD2, 0x85, // disable auto clock detect
  412. //0xD6, 0x37, // 27MHz default
  413. //0xD8, 0x18, // switch to 26MHz clock
  414. //delay(100), // delay 100ms
  415. 0x81, 0x01, // turn on video decoder
  416. 0xA3, 0x00, // enable 72MHz sampling
  417. 0xDB, 0x8F, // internal use*
  418. 0xFF, 0x00, // switch to ch0 (default; optional)
  419. 0x2C, 0x30, // select sync slice points
  420. 0x50, 0x00, // 720H resolution select for BT.601
  421. 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
  422. 0x63, 0x09, // filter control
  423. 0x59, 0x00, // extended register access
  424. 0x5A, 0x00, // data for extended register
  425. 0x58, 0x01, // enable extended register write
  426. 0x07, 0x22, // PAL format
  427. 0x2F, 0x14, // internal use
  428. 0x5E, 0x03, // disable H-scaling control
  429. 0x5B, 0x00, //
  430. 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
  431. 0x3E, 0x32, // AVID & VBLK out for BT.601
  432. 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
  433. 0x46, 0x23, // AVID & VBLK out for BT.601
  434. 0x28, 0x92, // cropping
  435. 0x00, 0x00, // internal use*
  436. 0x2D, 0xF2, // cagc adjust
  437. 0x0D, 0x20, // cagc initial value
  438. 0x05, 0x00, // sharpness
  439. 0x04, 0x80, // hue
  440. 0x11, 0x03,
  441. 0x37, 0x33,
  442. 0x61, 0x6C,
  443. 0xDF, 0xFF, // enable 720H format
  444. 0x8E, 0x00, // single channel output for VP
  445. 0x8F, 0x00, // 720H mode for VP
  446. 0x8D, 0x31, // enable VP out
  447. 0x89, 0x00, // select 27MHz for SCLK
  448. 0x88, 0xC1, // enable SCLK out
  449. 0x81, 0x01, // turn on video decoder
  450. 0x96, 0x00, // select AVID & VBLK as status indicator
  451. 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
  452. 0x98, 0x00, // video timing pin status
  453. 0x9A, 0x40, // select AVID & VBLK as status indicator
  454. 0x9B, 0xE1, // enable status indicator out on HSYNC
  455. 0x9C, 0x00, // video timing pin status
  456. #endif
  457. };
  458. static const char rn6752_itu656_cvbs_ntsc[]=
  459. {
  460. #if 0
  461. //\B5\A5\B3\A1\CA\E4\B3\F6\C5\E4\D6\C3(itu656)
  462. // 720H@60, 27MHz, BT601 output
  463. // Slave address is 0x58
  464. // Register, data
  465. // if clock source(Xin) of RN675x is 26MHz, please add these procedures marked first
  466. //0xD2, 0x85, // disable auto clock detect
  467. //0xD6, 0x37, // 27MHz default
  468. //0xD8, 0x18, // switch to 26MHz clock
  469. //delay(100), // delay 100ms
  470. 0x81, 0x01, // turn on video decoder
  471. 0xA3, 0x00, // enable 72MHz sampling
  472. 0xDB, 0x8F, // internal use*
  473. 0xFF, 0x00, // switch to ch0 (default; optional)
  474. 0x2C, 0x30, // select sync slice points
  475. 0x50, 0x00, // 720H resolution select for BT.601
  476. 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
  477. 0x63, 0x09, // filter control
  478. 0x59, 0x00, // extended register access
  479. 0x5A, 0x00, // data for extended register
  480. 0x58, 0x01, // enable extended register write
  481. 0x07, 0x23, // NTSC format
  482. 0x2F, 0x14, // internal use
  483. 0x5E, 0x03, // disable H-scaling control
  484. 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
  485. 0x3E, 0x32, // AVID & VBLK out for BT.601
  486. 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
  487. 0x46, 0x23, // AVID & VBLK out for BT.601
  488. 0x47, 0xC3, // for customer project
  489. 0x41, 0x00,
  490. 0x42, 0x00,
  491. 0x20, 0x24,
  492. 0x21, 0x43,
  493. 0x22, 0xAC,
  494. 0x23, 0X11,
  495. 0x24, 0X01,
  496. 0x25, 0X11,
  497. 0x26, 0X01,
  498. 0x28, 0xE2, // cropping
  499. 0x00, 0x00, // internal use*
  500. 0x2D, 0xF2, // cagc adjust
  501. 0x0D, 0x20, // cagc initial value
  502. 0x05, 0x00, // sharpness
  503. 0x04, 0x80, // hue
  504. 0x11, 0x03,
  505. 0x37, 0x33,
  506. 0x61, 0x6C,
  507. 0xDF, 0xFF, // enable 720H format
  508. 0x8E, 0x00, // single channel output for VP
  509. 0x8F, 0x00, // 720H mode for VP
  510. 0x8D, 0x31, // enable VP out
  511. 0x89, 0x00, // select 27MHz for SCLK
  512. 0x88, 0xC1, // enable SCLK out
  513. 0x81, 0x01, // turn on video decoder
  514. 0x96, 0x00, // select AVID & VBLK as status indicator
  515. 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
  516. 0x98, 0x00, // video timing pin status
  517. 0x9A, 0x40, // select AVID & VBLK as status indicator
  518. 0x9B, 0xE1, // enable status indicator out on HSYNC
  519. 0x9C, 0x00, // video timing pin status
  520. #else
  521. //\u02eb\B3\A1\CA\E4\B3\F6\C5\E4\D6\C3(itu656)
  522. // 720H@60, 27MHz, BT656 output
  523. // Slave address is 0x58
  524. // Register, data
  525. // if clock source(Xin) of RN675x is 26MHz, please add these procedures marked first
  526. //0xD2, 0x85, // disable auto clock detect
  527. //0xD6, 0x37, // 27MHz default
  528. //0xD8, 0x18, // switch to 26MHz clock
  529. //delay(100), // delay 100ms
  530. 0x81, 0x01, // turn on video decoder
  531. 0xA3, 0x00, // enable 72MHz sampling
  532. 0xDB, 0x8F, // internal use*
  533. 0xFF, 0x00, // switch to ch0 (default; optional)
  534. 0x2C, 0x30, // select sync slice points
  535. 0x50, 0x00, // 720H resolution select for BT.601
  536. 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
  537. 0x63, 0x09, // filter control
  538. 0x59, 0x00, // extended register access
  539. 0x5A, 0x00, // data for extended register
  540. 0x58, 0x01, // enable extended register write
  541. 0x07, 0x23, // NTSC format
  542. 0x2F, 0x14, // internal use
  543. 0x5E, 0x03, // disable H-scaling control
  544. 0x5B, 0x00, //
  545. 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
  546. 0x3E, 0x32, // AVID & VBLK out for BT.601
  547. 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
  548. 0x46, 0x23, // AVID & VBLK out for BT.601
  549. 0x28, 0x92, // cropping
  550. 0x00, 0x00, // internal use*
  551. 0x2D, 0xF2, // cagc adjust
  552. 0x0D, 0x20, // cagc initial value
  553. 0x05, 0x00, // sharpness
  554. 0x04, 0x80, // hue
  555. 0x11, 0x03,
  556. 0x37, 0x33,
  557. 0x61, 0x6C,
  558. 0xDF, 0xFF, // enable 720H format
  559. 0x8E, 0x00, // single channel output for VP
  560. 0x8F, 0x00, // 720H mode for VP
  561. 0x8D, 0x31, // enable VP out
  562. 0x89, 0x00, // select 27MHz for SCLK
  563. 0x88, 0xC1, // enable SCLK out
  564. 0x81, 0x01, // turn on video decoder
  565. 0x96, 0x00, // select AVID & VBLK as status indicator
  566. 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
  567. 0x98, 0x00, // video timing pin status
  568. 0x9A, 0x40, // select AVID & VBLK as status indicator
  569. 0x9B, 0xE1, // enable status indicator out on HSYNC
  570. 0x9C, 0x00, // video timing pin status
  571. #endif
  572. };
  573. static const char rn6752_itu656_720p_pal[]=
  574. {
  575. #if 0
  576. // 720P@25, 72MHz, BT656 output
  577. // Slave address is 0x58
  578. // Register, data
  579. // if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
  580. //0xD2, 0x85, // disable auto clock detect
  581. //0xD6, 0x37, // 27MHz default
  582. //0xD8, 0x18, // switch to 26MHz clock
  583. //delay(100), // delay 100ms
  584. 0x81, 0x01, // turn on video decoder
  585. 0xA3, 0x04, // enable 72MHz sampling
  586. 0xDB, 0x8F, // internal use*
  587. 0xFF, 0x00, // switch to ch0 (default; optional)
  588. 0x2C, 0x30, // select sync slice points
  589. 0x50, 0x02, // 720p resolution select for BT.601
  590. 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
  591. 0x63, 0xBD, // filter control
  592. 0x59, 0x00, // extended register access
  593. 0x5A, 0x02, // data for extended register
  594. 0x58, 0x01, // enable extended register write
  595. 0x07, 0x23, // 720p format
  596. 0x2F, 0x04, // internal use*
  597. 0x5E, 0x0B, // enable H-scaling control
  598. 0x51, 0x44, // scale factor1
  599. 0x52, 0x86, // scale factor2
  600. 0x53, 0x22, // scale factor3
  601. 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
  602. 0x3E, 0x32, // AVID & VBLK out for BT.601
  603. 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
  604. 0x46, 0x23, // AVID & VBLK out for BT.601
  605. 0x28, 0x92, // cropping
  606. 0x00, 0x20, // internal use*
  607. 0x2D, 0xF2, // cagc adjust
  608. 0x0D, 0x20, // cagc initial value
  609. 0x05, 0x00, // sharpness
  610. 0x04, 0x80, // hue
  611. 0x37, 0x33,
  612. 0x61, 0x6C,
  613. 0xDF, 0xFE, // enable 720p format
  614. 0x8E, 0x00, // single channel output for VP
  615. 0x8F, 0x80, // 720p mode for VP
  616. 0x8D, 0x31, // enable VP out
  617. 0x89, 0x09, // select 72MHz for SCLK
  618. 0x88, 0xC1, // enable SCLK out
  619. 0x81, 0x01, // turn on video decoder
  620. 0x96, 0x00, // select AVID & VBLK as status indicator
  621. 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
  622. 0x98, 0x00, // video timing pin status
  623. 0x9A, 0x40, // select AVID & VBLK as status indicator
  624. 0x9B, 0xE1, // enable status indicator out on HSYNC
  625. 0x9C, 0x00, // video timing pin status
  626. #else
  627. //add 20211104
  628. // 720P@25, 72MHz, BT656 output
  629. // Slave address is 0x58
  630. // Register, data
  631. // if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
  632. //0xD2, 0x85, // disable auto clock detect
  633. //0xD6, 0x37, // 27MHz default
  634. //0xD8, 0x18, // switch to 26MHz clock
  635. //delay(100), // delay 100ms
  636. 0x81, 0x01, // turn on video decoder
  637. 0xA3, 0x04, // enable 72MHz sampling
  638. 0xDB, 0x8F, // internal use*
  639. 0xFF, 0x00, // switch to ch0 (default; optional)
  640. 0x2C, 0x30, // select sync slice points
  641. 0x50, 0x02, // 720p resolution select for BT.601
  642. 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
  643. 0x63, 0xBD, // filter control
  644. 0x59, 0x00, // extended register access
  645. 0x5A, 0x02, // data for extended register
  646. 0x58, 0x01, // enable extended register write
  647. 0x07, 0x23, // 720p format
  648. 0x2F, 0x04, // internal use*
  649. 0x5E, 0x0B, // enable H-scaling control
  650. 0x51, 0x44, // scale factor1
  651. 0x52, 0x86, // scale factor2
  652. 0x53, 0x22, // scale factor3
  653. 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
  654. 0x3E, 0x32, // AVID & VBLK out for BT.601
  655. 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
  656. 0x46, 0x23, // AVID & VBLK out for BT.601
  657. 0x28, 0x92, // cropping
  658. 0x00, 0x20, // internal use*
  659. 0x2D, 0xF2, // cagc adjust
  660. 0x0D, 0x20, // cagc initial value
  661. 0x05, 0x00, // sharpness
  662. 0x04, 0x80, // hue
  663. 0x37, 0x33,
  664. 0x61, 0x6C,
  665. 0xDF, 0xFE, // enable 720p format
  666. 0x8E, 0x00, // single channel output for VP
  667. 0x8F, 0x80, // 720p mode for VP
  668. 0x8D, 0x31, // enable VP out
  669. 0x89, 0x09, // select 72MHz for SCLK
  670. 0x88, 0xC1, // enable SCLK out
  671. 0x81, 0x01, // turn on video decoder
  672. 0x96, 0x00, // select AVID & VBLK as status indicator
  673. 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
  674. 0x98, 0x00, // video timing pin status
  675. 0x9A, 0x40, // select AVID & VBLK as status indicator
  676. 0x9B, 0xE1, // enable status indicator out on HSYNC
  677. 0x9C, 0x00, // video timing pin status
  678. #endif
  679. };
  680. static const char rn6752_itu656_720p_ntsc[]=
  681. {
  682. #if 0
  683. // 720P@30, 72MHz, BT656 output
  684. // Slave address is 0x58
  685. // Register, data
  686. // if clock source(Xin) of RN675x is 26MHz, please add these procedures marked first
  687. //0xD2, 0x85, // disable auto clock detect
  688. //0xD6, 0x37, // 27MHz default
  689. //0xD8, 0x18, // switch to 26MHz clock
  690. //delay(100), // delay 100ms
  691. 0x81, 0x01, // turn on video decoder
  692. 0xA3, 0x04, // enable 72MHz sampling
  693. 0xDB, 0x8F, // internal use*
  694. 0xFF, 0x00, // switch to ch0 (default; optional)
  695. 0x2C, 0x30, // select sync slice points
  696. 0x50, 0x02, // 720p resolution select for BT.601
  697. 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
  698. 0x63, 0xBD, // filter control
  699. 0x59, 0x00, // extended register access
  700. 0x5A, 0x04, // data for extended register
  701. 0x58, 0x01, // enable extended register write
  702. 0x07, 0x23, // 720p format
  703. 0x2F, 0x04, // internal use*
  704. 0x5E, 0x0B, // enable H-scaling control
  705. 0x51, 0x44, // scale factor1
  706. 0x52, 0x86, // scale factor2
  707. 0x53, 0x22, // scale factor3
  708. 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
  709. 0x3E, 0x32, // AVID & VBLK out for BT.601
  710. 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
  711. 0x46, 0x23, // AVID & VBLK out for BT.601
  712. 0x28, 0x92, // cropping
  713. 0x00, 0x20, // internal use*
  714. 0x2D, 0xF2, // cagc adjust
  715. 0x0D, 0x20, // cagc initial value
  716. 0x05, 0x00, // sharpness
  717. 0x04, 0x80, // hue
  718. 0x37, 0x33,
  719. 0x61, 0x6C,
  720. 0xDF, 0xFE, // enable 720p format
  721. 0x8E, 0x00, // single channel output for VP
  722. 0x8F, 0x80, // 720p mode for VP
  723. 0x8D, 0x31, // enable VP out
  724. 0x89, 0x09, // select 72MHz for SCLK
  725. 0x88, 0xC1, // enable SCLK out
  726. 0x81, 0x01, // turn on video decoder
  727. 0x96, 0x00, // select AVID & VBLK as status indicator
  728. 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
  729. 0x98, 0x00, // video timing pin status
  730. 0x9A, 0x40, // select AVID & VBLK as status indicator
  731. 0x9B, 0xE1, // enable status indicator out on HSYNC
  732. 0x9C, 0x00, // video timing pin status
  733. #else
  734. //add 20211104
  735. // 720P@30, 72MHz, BT656 output
  736. // Slave address is 0x58
  737. // Register, data
  738. // if clock source(Xin) of RN675x is 26MHz, please add these procedures marked first
  739. //0xD2, 0x85, // disable auto clock detect
  740. //0xD6, 0x37, // 27MHz default
  741. //0xD8, 0x18, // switch to 26MHz clock
  742. //delay(100), // delay 100ms
  743. 0x81, 0x01, // turn on video decoder
  744. 0xA3, 0x04, // enable 72MHz sampling
  745. 0xDB, 0x8F, // internal use*
  746. 0xFF, 0x00, // switch to ch0 (default; optional)
  747. 0x2C, 0x30, // select sync slice points
  748. 0x50, 0x02, // 720p resolution select for BT.601
  749. 0x56, 0x00, // disable SAV & EAV for BT601; 0x00 enable SAV & EAV for BT656
  750. 0x63, 0xBD, // filter control
  751. 0x59, 0x00, // extended register access
  752. 0x5A, 0x04, // data for extended register
  753. 0x58, 0x01, // enable extended register write
  754. 0x07, 0x23, // 720p format
  755. 0x2F, 0x04, // internal use*
  756. 0x5E, 0x0B, // enable H-scaling control
  757. 0x51, 0x44, // scale factor1
  758. 0x52, 0x86, // scale factor2
  759. 0x53, 0x22, // scale factor3
  760. 0x3A, 0x04, // no channel information insertion; invert VBLK for frame valid
  761. 0x3E, 0x32, // AVID & VBLK out for BT.601
  762. 0x40, 0x04, // no channel information insertion; invert VBLK for frame valid
  763. 0x46, 0x23, // AVID & VBLK out for BT.601
  764. 0x28, 0x92, // cropping
  765. 0x00, 0x20, // internal use*
  766. 0x2D, 0xF2, // cagc adjust
  767. 0x0D, 0x20, // cagc initial value
  768. 0x05, 0x00, // sharpness
  769. 0x04, 0x80, // hue
  770. 0x37, 0x33,
  771. 0x61, 0x6C,
  772. 0xDF, 0xFE, // enable 720p format
  773. 0x8E, 0x00, // single channel output for VP
  774. 0x8F, 0x80, // 720p mode for VP
  775. 0x8D, 0x31, // enable VP out
  776. 0x89, 0x09, // select 72MHz for SCLK
  777. 0x88, 0xC1, // enable SCLK out
  778. 0x81, 0x01, // turn on video decoder
  779. 0x96, 0x00, // select AVID & VBLK as status indicator
  780. 0x97, 0x0B, // enable status indicator out on AVID,VBLK & VSYNC
  781. 0x98, 0x00, // video timing pin status
  782. 0x9A, 0x40, // select AVID & VBLK as status indicator
  783. 0x9B, 0xE1, // enable status indicator out on HSYNC
  784. 0x9C, 0x00, // video timing pin status
  785. #endif
  786. };
  787. static const char rn6752m_itu656_cvbs_pal[]=
  788. {
  789. 0x81, 0x01, // turn on video decoder
  790. 0xA3, 0x04,
  791. 0xDF, 0x0F, // enable CVBS format
  792. // ch0
  793. 0xFF, 0x00, // switch to ch0 (default; optional)
  794. 0x00, 0x00, // internal use*
  795. 0x06, 0x08, // internal use*
  796. 0x07, 0x62, // HD format
  797. 0x2A, 0x81, // filter control
  798. 0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
  799. 0x3F, 0x10, // channel ID
  800. 0x4C, 0x37, // equalizer
  801. 0x4F, 0x00, // sync control
  802. 0x50, 0x00, // 720p resolution
  803. 0x56, 0x01, // 72M mode and BT656 mode
  804. 0x5F, 0x00, // blank level
  805. 0x63, 0x75, // filter control
  806. 0x59, 0x00, // extended register access
  807. 0x5A, 0x00, // data for extended register
  808. 0x58, 0x01, // enable extended register write
  809. 0x59, 0x33, // extended register access
  810. 0x5A, 0x02, // data for extended register
  811. 0x58, 0x01, // enable extended register write
  812. 0x5B, 0x00, // H-scaling control
  813. 0x5E, 0x01, // enable H-scaling control
  814. 0x6A, 0x00, // H-scaling control
  815. 0x28, 0xB2, // cropping
  816. 0x20, 0x24,
  817. 0x23, 0x17,
  818. 0x24, 0x37,
  819. 0x25, 0x17,
  820. 0x26, 0x00,
  821. 0x42, 0x00,
  822. 0x03, 0x80, // saturation
  823. 0x04, 0x80, // hue
  824. 0x05, 0x03, // sharpness
  825. 0x57, 0x20, // black/white stretch
  826. 0x68, 0x32, // coring
  827. 0x37, 0x33,
  828. 0x61, 0x6C,
  829. 0x8E, 0x00, // single channel output for VP
  830. 0x8F, 0x80, // 720p mode for VP
  831. 0x8D, 0x31, // enable VP out
  832. 0x89, 0x09, // select 72MHz for SCLK
  833. 0x88, 0x41, // enable SCLK out
  834. };
  835. static const char rn6752m_itu656_cvbs_ntsc[] = {
  836. 0x81, 0x01, // turn on video decoder
  837. 0xA3, 0x04,
  838. 0xDF, 0x0F, // enable CVBS format
  839. // ch0
  840. 0xFF, 0x00, // switch to ch0 (default; optional)
  841. 0x00, 0x00, // internal use*
  842. 0x06, 0x08, // internal use*
  843. 0x07, 0x63, // HD format
  844. 0x2A, 0x81, // filter control
  845. 0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
  846. 0x3F, 0x10, // channel ID
  847. 0x4C, 0x37, // equalizer
  848. 0x4F, 0x00, // sync control
  849. 0x50, 0x00, // 720p resolution
  850. 0x56, 0x01, // 72M mode and BT656 mode
  851. 0x5F, 0x00, // blank level
  852. 0x63, 0x75, // filter control
  853. 0x59, 0x00, // extended register access
  854. 0x5A, 0x00, // data for extended register
  855. 0x58, 0x01, // enable extended register write
  856. 0x59, 0x33, // extended register access
  857. 0x5A, 0x02, // data for extended register
  858. 0x58, 0x01, // enable extended register write
  859. 0x5B, 0x00, // H-scaling control
  860. 0x5E, 0x01, // enable H-scaling control
  861. 0x6A, 0x00, // H-scaling control
  862. // 0x28, 0xB2, // cropping // rn6752M default:0xB2 //add by helen
  863. 0x28, 0x92, // cropping // rn6752V1 default:0x92
  864. 0x20, 0x24,
  865. 0x23, 0x11,
  866. 0x24, 0x05,
  867. 0x25, 0x11,
  868. 0x26, 0x00,
  869. 0x42, 0x00,
  870. 0x03, 0x80, // saturation
  871. 0x04, 0x80, // hue
  872. 0x05, 0x03, // sharpness
  873. 0x57, 0x20, // black/white stretch
  874. 0x68, 0x32, // coring
  875. 0x37, 0x33,
  876. 0x61, 0x6C,
  877. 0x8E, 0x00, // single channel output for VP
  878. 0x8F, 0x80, // 720p mode for VP
  879. 0x8D, 0x31, // enable VP out
  880. 0x89, 0x09, // select 72MHz for SCLK
  881. 0x88, 0x41, // enable SCLK out
  882. };
  883. const char rn6752m_itu656_720p_25fps[] = {
  884. // 720P@25 BT656
  885. // Slave address is 0x58
  886. // Register, data
  887. // if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
  888. //0xD2, 0x85, // disable auto clock detect
  889. //0xD6, 0x37, // 27MHz default
  890. //0xD8, 0x18, // switch to 26MHz clock
  891. //delay(100), // delay 100ms
  892. 0x81, 0x01, // turn on video decoder
  893. 0xA3, 0x04, // enable 72MHz sampling
  894. 0xDF, 0xFE, // enable HD format
  895. 0x88, 0x40, // disable SCLK0B out
  896. 0xF6, 0x40, // disable SCLK3A out
  897. // ch0
  898. 0xFF, 0x00, // switch to ch0 (default; optional)
  899. 0x00, 0x20, // internal use*
  900. 0x06, 0x08, // internal use*
  901. 0x07, 0x63, // HD format
  902. 0x2A, 0x01, // filter control
  903. 0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
  904. 0x3F, 0x10, // channel ID
  905. 0x4C, 0x37, // equalizer
  906. 0x4F, 0x03, // sync control
  907. 0x50, 0x02, // 720p resolution
  908. 0x56, 0x01, // BT 72M mode
  909. 0x5F, 0x40, // blank level
  910. 0x63, 0xF5, // filter control
  911. 0x59, 0x00, // extended register access
  912. 0x5A, 0x42, // data for extended register
  913. 0x58, 0x01, // enable extended register write
  914. 0x59, 0x33, // extended register access
  915. 0x5A, 0x23, // data for extended register
  916. 0x58, 0x01, // enable extended register write
  917. 0x51, 0xE1, // scale factor1
  918. 0x52, 0x88, // scale factor2
  919. 0x53, 0x12, // scale factor3
  920. 0x5B, 0x07, // H-scaling control
  921. 0x5E, 0x08, // enable H-scaling control
  922. 0x6A, 0x82, // H-scaling control
  923. 0x28, 0x92, // cropping
  924. 0x03, 0x80, // saturation
  925. 0x04, 0x80, // hue
  926. 0x05, 0x00, // sharpness
  927. 0x57, 0x23, // black/white stretch
  928. 0x68, 0x32, // coring
  929. 0x37, 0x33,
  930. 0x61, 0x6C,
  931. // VP1
  932. 0x8E, 0x00, // single channel output for VP1
  933. 0x8F, 0x80, // 720p mode for VP1
  934. 0x8D, 0x31, // enable VP1 out
  935. 0x89, 0x09, // select 72MHz for SCLK
  936. 0x88, 0x41, // enable SCLK out
  937. };
  938. static const char rn6752v1_itu656_cvbs_pal[]=
  939. {
  940. // D1@50 with mipi 2 data lanes + 1 clock lane out
  941. // pin24/23 data lane0, pin18/17 data lane3
  942. // pin16/15 data lane2, pin12/11 data lane1
  943. // pin14/13 clock lane
  944. // Slave address is 0x58
  945. // Register, data
  946. // if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
  947. //0xD2, 0x85, // disable auto clock detect
  948. //0xD6, 0x37, // 27MHz default
  949. //0xD8, 0x18, // switch to 26MHz clock
  950. //delay(100), // delay 100ms
  951. 0x81, 0x01, // turn on video decoder
  952. 0xA3, 0x04,
  953. 0xDF, 0x0F, // enable CVBS format
  954. 0x88, 0x00,
  955. 0xF6, 0x00,
  956. // ch0
  957. 0xFF, 0x00, // switch to ch0 (default; optional)
  958. 0x00, 0x00, // internal use*
  959. 0x06, 0x08, // internal use*
  960. 0x07, 0x62, // HD format
  961. 0x2A, 0x81, // filter control
  962. 0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
  963. 0x3F, 0x10, // channel ID
  964. 0x4C, 0x37, // equalizer
  965. 0x4F, 0x00, // sync control
  966. 0x50, 0x00, // 720p resolution
  967. 0x56, 0x01, // 72M mode and BT656 mode
  968. 0x5F, 0x00, // blank level
  969. 0x63, 0x75, // filter control
  970. 0x59, 0x00, // extended register access
  971. 0x5A, 0x00, // data for extended register
  972. 0x58, 0x01, // enable extended register write
  973. 0x59, 0x33, // extended register access
  974. 0x5A, 0x02, // data for extended register
  975. 0x58, 0x01, // enable extended register write
  976. 0x5B, 0x00, // H-scaling control
  977. 0x5E, 0x01, // enable H-scaling control
  978. 0x6A, 0x00, // H-scaling control
  979. 0x28, 0xB2, // cropping //\B5\A5\B3\A1\CA\E4\B3\F6:0xB2 \u02eb\B3\A1\CA\E4\B3\F6:0x92 //only for msn
  980. 0x20, 0x24,
  981. 0x23, 0x17,
  982. 0x24, 0x37,
  983. 0x25, 0x17,
  984. 0x26, 0x00,
  985. 0x42, 0x00,
  986. 0x03, 0x80, // saturation
  987. 0x04, 0x80, // hue
  988. 0x05, 0x03, // sharpness
  989. 0x57, 0x20, // black/white stretch
  990. 0x68, 0x32, // coring
  991. 0x37, 0x33,
  992. 0x61, 0x6C,
  993. 0x8E, 0x00, // single channel output for VP
  994. 0x8F, 0x80, // 720p mode for VP
  995. 0x8D, 0x31, // enable VP out
  996. 0x89, 0x09, // select 72MHz for SCLK
  997. 0x88, 0x41, // enable SCLK out
  998. };
  999. static const char rn6752v1_itu656_cvbs_ntsc[] = {
  1000. 0x81, 0x01, // turn on video decoder
  1001. 0xA3, 0x04,
  1002. 0xDF, 0x0F, // enable CVBS format
  1003. // ch0
  1004. 0xFF, 0x00, // switch to ch0 (default; optional)
  1005. 0x00, 0x00, // internal use*
  1006. 0x06, 0x08, // internal use*
  1007. 0x07, 0x63, // HD format
  1008. 0x2A, 0x81, // filter control
  1009. 0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
  1010. 0x3F, 0x10, // channel ID
  1011. 0x4C, 0x37, // equalizer
  1012. 0x4F, 0x00, // sync control
  1013. 0x50, 0x00, // 720p resolution
  1014. 0x56, 0x01, // 72M mode and BT656 mode
  1015. 0x5F, 0x00, // blank level
  1016. 0x63, 0x75, // filter control
  1017. 0x59, 0x00, // extended register access
  1018. 0x5A, 0x00, // data for extended register
  1019. 0x58, 0x01, // enable extended register write
  1020. 0x59, 0x33, // extended register access
  1021. 0x5A, 0x02, // data for extended register
  1022. 0x58, 0x01, // enable extended register write
  1023. 0x5B, 0x00, // H-scaling control
  1024. 0x5E, 0x01, // enable H-scaling control
  1025. 0x6A, 0x00, // H-scaling control
  1026. 0x28, 0xB2, // cropping
  1027. 0x20, 0x24,
  1028. 0x23, 0x11,
  1029. 0x24, 0x05,
  1030. 0x25, 0x11,
  1031. 0x26, 0x00,
  1032. 0x42, 0x00,
  1033. 0x03, 0x80, // saturation
  1034. 0x04, 0x80, // hue
  1035. 0x05, 0x03, // sharpness
  1036. 0x57, 0x20, // black/white stretch
  1037. 0x68, 0x32, // coring
  1038. 0x37, 0x33,
  1039. 0x61, 0x6C,
  1040. 0x8E, 0x00, // single channel output for VP
  1041. 0x8F, 0x80, // 720p mode for VP
  1042. 0x8D, 0x31, // enable VP out
  1043. 0x89, 0x09, // select 72MHz for SCLK
  1044. 0x88, 0x41, // enable SCLK out
  1045. };
  1046. static const char rn6752v1_itu656_720p_25fps[] = {
  1047. // 720P@25 BT656
  1048. // Slave address is 0x58
  1049. // Register, data
  1050. // if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
  1051. //0xD2, 0x85, // disable auto clock detect
  1052. //0xD6, 0x37, // 27MHz default
  1053. //0xD8, 0x18, // switch to 26MHz clock
  1054. //delay(100), // delay 100ms
  1055. 0xF0, 0x1F,
  1056. 0x81, 0x01, // turn on video decoder
  1057. 0xA3, 0x04, // enable 72MHz sampling
  1058. 0xDF, 0xFE, // enable HD format
  1059. 0x88, 0x40, // disable SCLK0B out
  1060. 0xF6, 0x40, // disable SCLK3A out
  1061. // ch0
  1062. //0xff,0x00;0x00,0x60 //rn6752v1_video_Test:color bars test pattern output
  1063. 0xFF, 0x00, // switch to ch0 (default; optional)
  1064. 0x00, 0x20, // internal use*
  1065. 0x06, 0x08, // internal use*
  1066. 0x07, 0x63, // HD format
  1067. 0x2A, 0x01, // filter control
  1068. 0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
  1069. 0x3F, 0x10, // channel ID
  1070. 0x4C, 0x37, // equalizer
  1071. 0x4F, 0x03, // sync control
  1072. 0x50, 0x02, // 720p resolution
  1073. 0x56, 0x01, // BT 72M mode
  1074. 0x5F, 0x40, // blank level
  1075. 0x63, 0xF5, // filter control
  1076. 0x59, 0x00, // extended register access
  1077. 0x5A, 0x42, // data for extended register
  1078. 0x58, 0x01, // enable extended register write
  1079. 0x59, 0x33, // extended register access
  1080. 0x5A, 0x23, // data for extended register
  1081. 0x58, 0x01, // enable extended register write
  1082. 0x51, 0xE1, // scale factor1
  1083. 0x52, 0x88, // scale factor2
  1084. 0x53, 0x12, // scale factor3
  1085. 0x5B, 0x07, // H-scaling control
  1086. 0x5E, 0x08, // enable H-scaling control
  1087. 0x6A, 0x82, // H-scaling control
  1088. 0x28, 0x92, // cropping
  1089. 0x03, 0x80, // saturation
  1090. 0x04, 0x80, // hue
  1091. 0x05, 0x00, // sharpness
  1092. 0x57, 0x23, // black/white stretch
  1093. 0x68, 0x32, // coring
  1094. 0x37, 0x33,
  1095. 0x61, 0x6C,
  1096. // VP1
  1097. 0x8E, 0x00, // single channel output for VP1
  1098. 0x8F, 0x80, // 720p mode for VP1
  1099. 0x8D, 0x31, // enable VP1 out
  1100. 0x89, 0x09, // select 72MHz for SCLK
  1101. 0x88, 0x41, // enable SCLK out
  1102. };
  1103. static const char rn6752m_itu656_720p_30fps[] = {
  1104. // 720P@30 BT656
  1105. // Slave address is 0x58
  1106. // Register, data
  1107. // if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
  1108. //0xD2, 0x85, // disable auto clock detect
  1109. //0xD6, 0x37, // 27MHz default
  1110. //0xD8, 0x18, // switch to 26MHz clock
  1111. //delay(100), // delay 100ms
  1112. 0x81, 0x01, // turn on video decoder
  1113. 0xA3, 0x04, // enable 72MHz sampling
  1114. 0xDF, 0xFE, // enable HD format
  1115. 0x88, 0x40, // disable SCLK0B out
  1116. 0xF6, 0x40, // disable SCLK3A out
  1117. // ch0
  1118. 0xFF, 0x00, // switch to ch0 (default; optional)
  1119. 0x00, 0x20, // internal use*
  1120. 0x06, 0x08, // internal use*
  1121. 0x07, 0x63, // HD format
  1122. 0x2A, 0x01, // filter control
  1123. 0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
  1124. 0x3F, 0x10, // channel ID
  1125. 0x4C, 0x37, // equalizer
  1126. 0x4F, 0x03, // sync control
  1127. 0x50, 0x02, // 720p resolution
  1128. 0x56, 0x01, // 72M mode and BT656 mode
  1129. 0x5F, 0x40, // blank level
  1130. 0x63, 0xF5, // filter control
  1131. 0x59, 0x00, // extended register access
  1132. 0x5A, 0x44, // data for extended register
  1133. 0x58, 0x01, // enable extended register write
  1134. 0x59, 0x33, // extended register access
  1135. 0x5A, 0x23, // data for extended register
  1136. 0x58, 0x01, // enable extended register write
  1137. 0x51, 0x4E, // scale factor1
  1138. 0x52, 0x87, // scale factor2
  1139. 0x53, 0x12, // scale factor3
  1140. 0x5B, 0x07, // H-scaling control
  1141. 0x5E, 0x08, // enable H-scaling control
  1142. 0x6A, 0x82, // H-scaling control
  1143. 0x28, 0x92, // cropping
  1144. 0x03, 0x80, // saturation
  1145. 0x04, 0x80, // hue
  1146. 0x05, 0x00, // sharpness
  1147. 0x57, 0x23, // black/white stretch
  1148. 0x68, 0x32, // coring
  1149. 0x37, 0x33,
  1150. 0x61, 0x6C,
  1151. // VP1
  1152. 0x8E, 0x00, // single channel output for VP1
  1153. 0x8F, 0x80, // 720p mode for VP1
  1154. 0x8D, 0x31, // enable VP1 out
  1155. 0x89, 0x09, // select 72MHz for SCLK
  1156. 0x88, 0x41, // enable SCLK out
  1157. };
  1158. static const char rn6752m_itu656_1080p_25fps[] = {
  1159. // 1080P@25 BT656
  1160. // Slave address is 0x58
  1161. // Register, data
  1162. // if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
  1163. //0xD2, 0x85, // disable auto clock detect
  1164. //0xD6, 0x37, // 27MHz default
  1165. //0xD8, 0x18, // switch to 26MHz clock
  1166. //delay(100), // delay 100ms
  1167. 0x81, 0x01, // turn on video decoder
  1168. 0xA3, 0x04, //
  1169. 0xDF, 0xFE, // enable HD format
  1170. 0xF0, 0xC0,
  1171. 0x88, 0x40, // disable SCLK0B out
  1172. 0xF6, 0x40, // disable SCLK3A out
  1173. // ch0
  1174. //0xff,0x00;0x00,0x60 //rn6752v1_video_Test:color bars test pattern output
  1175. 0xFF, 0x00, // switch to ch0 (default; optional)
  1176. 0x00, 0x20, //0x20 internal use*
  1177. 0x06, 0x08, // internal use*
  1178. 0x07, 0x63, // HD format
  1179. 0x2A, 0x01, // filter control
  1180. 0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
  1181. 0x3F, 0x10, // channel ID
  1182. 0x4C, 0x37, // equalizer
  1183. 0x4F, 0x03, // sync control
  1184. 0x50, 0x03, // 1080p resolution
  1185. 0x56, 0x02, // 144M and BT656 mode
  1186. 0x5F, 0x44, // blank level
  1187. 0x63, 0xF8, // filter control
  1188. 0x59, 0x00, // extended register access
  1189. 0x5A, 0x48, // data for extended register
  1190. 0x58, 0x01, // enable extended register write
  1191. 0x59, 0x33, // extended register access
  1192. 0x5A, 0x23, // data for extended register
  1193. 0x58, 0x01, // enable extended register write
  1194. 0x51, 0xF4, // scale factor1
  1195. 0x52, 0x29, // scale factor2
  1196. 0x53, 0x15, // scale factor3
  1197. 0x5B, 0x01, // H-scaling control
  1198. 0x5E, 0x08, // enable H-scaling control
  1199. 0x6A, 0x87, // H-scaling control
  1200. 0x28, 0x92, // cropping
  1201. 0x03, 0x80, // saturation
  1202. 0x04, 0x80, // hue
  1203. 0x05, 0x04, // sharpness
  1204. 0x57, 0x23, // black/white stretch
  1205. 0x68, 0x00, // coring
  1206. 0x37, 0x33,
  1207. 0x61, 0x6C,
  1208. 0x8E, 0x00, // single channel output for VP
  1209. 0x8F, 0x80, // 1080p mode for VP
  1210. 0x8D, 0x31, // enable VP out
  1211. 0x89, 0x0A, // select 144MHz for SCLK
  1212. 0x88, 0x41, // enable SCLK out
  1213. };
  1214. static const char rn6752m_itu656_1080p_30fps[] = {
  1215. // 1080P@30 BT656
  1216. // Slave address is 0x58
  1217. // Register, data
  1218. // if clock source(Xin) of RN6752 is 26MHz, please add these procedures marked first
  1219. //0xD2, 0x85, // disable auto clock detect
  1220. //0xD6, 0x37, // 27MHz default
  1221. //0xD8, 0x18, // switch to 26MHz clock
  1222. //delay(100), // delay 100ms
  1223. 0x81, 0x01, // turn on video decoder
  1224. 0xA3, 0x04, //
  1225. 0xDF, 0xFE, // enable HD format
  1226. 0xF0, 0xC0,
  1227. 0x88, 0x40, // disable SCLK0B out
  1228. 0xF6, 0x40, // disable SCLK3A out
  1229. // ch0
  1230. //0xff,0x00;0x00,0x60 //rn6752v1_video_Test:color bars test pattern output
  1231. 0xFF, 0x00, // switch to ch0 (default; optional)
  1232. 0x00, 0x20, // internal use*
  1233. 0x06, 0x08, // internal use*
  1234. 0x07, 0x63, // HD format
  1235. 0x2A, 0x01, // filter control
  1236. 0x3A, 0x00, // No Insert Channel ID in SAV/EAV code
  1237. 0x3F, 0x10, // channel ID
  1238. 0x4C, 0x37, // equalizer
  1239. 0x4F, 0x03, // sync control
  1240. 0x50, 0x03, // 1080p resolution
  1241. 0x56, 0x02, // 144M and BT656 mode
  1242. 0x5F, 0x44, // blank level
  1243. 0x63, 0xF8, // filter control
  1244. 0x59, 0x00, // extended register access
  1245. 0x5A, 0x49, // data for extended register
  1246. 0x58, 0x01, // enable extended register write
  1247. 0x59, 0x33, // extended register access
  1248. 0x5A, 0x23, // data for extended register
  1249. 0x58, 0x01, // enable extended register write
  1250. 0x51, 0xF4, // scale factor1
  1251. 0x52, 0x29, // scale factor2
  1252. 0x53, 0x15, // scale factor3
  1253. 0x5B, 0x01, // H-scaling control
  1254. 0x5E, 0x08, // enable H-scaling control
  1255. 0x6A, 0x87, // H-scaling control
  1256. 0x28, 0x92, // cropping
  1257. 0x03, 0x80, // saturation
  1258. 0x04, 0x80, // hue
  1259. 0x05, 0x04, // sharpness
  1260. 0x57, 0x23, // black/white stretch
  1261. 0x68, 0x00, // coring
  1262. 0x37, 0x33,
  1263. 0x61, 0x6C,
  1264. 0x8E, 0x00, // single channel output for VP
  1265. 0x8F, 0x80, // 1080p mode for VP
  1266. 0x8D, 0x31, // enable VP out
  1267. 0x89, 0x0A, // select 144MHz for SCLK
  1268. 0x88, 0x43, // enable SCLK out //default:0x41 clock_Invert:0x43 add:2021-11-15
  1269. };
  1270. static inline struct rn6752 *to_rn6752(struct v4l2_subdev *sd)
  1271. {
  1272. return container_of(sd, struct rn6752, sd);
  1273. }
  1274. static inline struct v4l2_subdev *to_sd(struct v4l2_ctrl *ctrl)
  1275. {
  1276. return &container_of(ctrl->handler, struct rn6752, hdl)->sd;
  1277. }
  1278. #if 0
  1279. static int rn6752_read(struct v4l2_subdev *sd, unsigned char addr)
  1280. {
  1281. struct i2c_client *client = v4l2_get_subdevdata(sd);
  1282. int rc;
  1283. rc = i2c_smbus_read_byte_data(client, addr);
  1284. if (rc < 0) {
  1285. dev_err(sd->dev, "i2c i/o error: rc == %d\n", rc);
  1286. return rc;
  1287. }
  1288. dev_dbg(sd->dev, "rn6752: read 0x%02x = %02x\n", addr, rc);
  1289. return rc;
  1290. }
  1291. static int rn6752_write(struct v4l2_subdev *sd, unsigned char addr,
  1292. unsigned char value)
  1293. {
  1294. struct i2c_client *client = v4l2_get_subdevdata(sd);
  1295. int rc;
  1296. dev_dbg(sd->dev, "rn6752: writing %02x %02x\n", addr, value);
  1297. rc = i2c_smbus_write_byte_data(client, addr, value);
  1298. if (rc < 0)
  1299. dev_err(sd->dev, "i2c i/o error: rc == %d\n", rc);
  1300. return rc;
  1301. }
  1302. static unsigned char amt_read_reg(struct rn6752 *decoder, unsigned int reg)
  1303. {
  1304. struct v4l2_subdev *sd = &decoder->sd;
  1305. struct i2c_client *client = v4l2_get_subdevdata(sd);
  1306. int rc;
  1307. rc = i2c_smbus_read_byte_data(client, reg & 0xff);
  1308. client->addr = decoder->default_addr;
  1309. if (rc < 0) {
  1310. dev_err(sd->dev, "i2c i/o error: rc == %d\n", rc);
  1311. return rc;
  1312. }
  1313. dev_dbg(sd->dev, "rn6752: read 0x%04x = %02x\n", reg, rc);
  1314. return rc;
  1315. }
  1316. static int amt_write_reg(struct rn6752 *decoder, unsigned int reg, unsigned char value)
  1317. {
  1318. struct v4l2_subdev *sd = &decoder->sd;
  1319. struct i2c_client *client = v4l2_get_subdevdata(sd);
  1320. int rc;
  1321. dev_dbg(sd->dev, "rn6752: writing %04x %02x\n", reg, value);
  1322. rc = i2c_smbus_write_byte_data(client, reg & 0xff, value);
  1323. client->addr = decoder->default_addr;
  1324. if (rc < 0)
  1325. dev_err(sd->dev, "i2c i/o error: rc == %d\n", rc);
  1326. return rc;
  1327. }
  1328. #endif
  1329. /******************************************************************************************************/
  1330. static int rn6752_write_byte(struct rn6752 *decoder,unsigned char regaddr, unsigned char regval)
  1331. {
  1332. struct i2c_client *client;
  1333. struct i2c_msg msg;
  1334. s32 ret = -1;
  1335. s32 retries = 0;
  1336. u8 buf[2] = {0};
  1337. if(!decoder)
  1338. return -ENODEV;
  1339. client = decoder->client;
  1340. buf[0] = regaddr;
  1341. buf[1] = regval;
  1342. msg.flags = 0;
  1343. msg.addr = client->addr;
  1344. msg.len = 2;
  1345. msg.buf = buf;
  1346. while(retries < 5)
  1347. {
  1348. ret = i2c_transfer(client->adapter, &msg, 1);
  1349. if (ret == 1)
  1350. break;
  1351. retries++;
  1352. }
  1353. if((retries >= 5))
  1354. {
  1355. printk("ERR: %s failure\n",__FUNCTION__);
  1356. return -EBUSY;
  1357. }
  1358. return 0;
  1359. }
  1360. static int rn6752_read_byte(struct rn6752 *decoder,unsigned char regaddr)
  1361. {
  1362. struct i2c_client *client;
  1363. struct i2c_msg read_msgs[2];
  1364. s32 ret = -1;
  1365. s32 retries = 0;
  1366. u8 regValue = 0x00;
  1367. if(!decoder)
  1368. return -ENODEV;
  1369. client = decoder->client;
  1370. read_msgs[0].flags = !I2C_M_RD;
  1371. read_msgs[0].addr = client->addr;
  1372. read_msgs[0].len = 1;
  1373. read_msgs[0].buf = &regaddr;
  1374. read_msgs[1].flags = I2C_M_RD;
  1375. read_msgs[1].addr = client->addr;
  1376. read_msgs[1].len = 1;
  1377. read_msgs[1].buf = &regValue;//low byte
  1378. while(retries < 5)
  1379. {
  1380. ret = i2c_transfer(client->adapter, read_msgs, 2);
  1381. if(ret == 2)
  1382. break;
  1383. retries++;
  1384. }
  1385. if(ret != 2)
  1386. {
  1387. printk("ERR: %s reg:0x%x failure\n",__FUNCTION__, regaddr);
  1388. return -EBUSY;
  1389. }
  1390. return regValue;
  1391. }
  1392. static void rn6752_write_reg(struct rn6752 *decoder,const char *buf, int len)
  1393. {
  1394. int i;
  1395. for(i=0; i<len; i++)
  1396. rn6752_write_byte(decoder,buf[2*i],buf[2*i+1]);
  1397. }
  1398. static void rn6752_read_reg(struct rn6752 *decoder,const char *buf, int len)
  1399. {
  1400. int i;
  1401. int regval;
  1402. for(i=0; i<len; i++){
  1403. regval = rn6752_read_byte(decoder,buf[2*i]);
  1404. printk(KERN_ALERT "++++++reg_addr:0x%x , reg_val:0x%x\n", buf[2*i],regval);
  1405. }
  1406. }
  1407. static void rn6752m_pre_init(struct rn6752 *decoder)
  1408. {
  1409. int rom_byte1, rom_byte2, rom_byte3, rom_byte4, rom_byte5, rom_byte6;
  1410. rn6752_write_byte(decoder,0xE1, 0x80);
  1411. rn6752_write_byte(decoder,0xFA, 0x81);
  1412. rom_byte1 = rn6752_read_byte(decoder,0xFB);
  1413. rom_byte2 = rn6752_read_byte(decoder,0xFB);
  1414. rom_byte3 = rn6752_read_byte(decoder,0xFB);
  1415. rom_byte4 = rn6752_read_byte(decoder,0xFB);
  1416. rom_byte5 = rn6752_read_byte(decoder,0xFB);
  1417. rom_byte6 = rn6752_read_byte(decoder,0xFB);
  1418. // config. decoder accroding to rom_byte5 and rom_byte6
  1419. if((rom_byte6 == 0x00) && (rom_byte5 == 0x00))
  1420. {
  1421. rn6752_write_byte(decoder,0xEF, 0xAA);
  1422. rn6752_write_byte(decoder,0xE7, 0xFF);
  1423. rn6752_write_byte(decoder,0xFF, 0x09);
  1424. rn6752_write_byte(decoder,0x03, 0x0C);
  1425. rn6752_write_byte(decoder,0xFF, 0x0B);
  1426. rn6752_write_byte(decoder,0x03, 0x0C);
  1427. }
  1428. else if(((rom_byte6 == 0x34) && (rom_byte5 == 0xA9)) || ((rom_byte6 == 0x2C) && (rom_byte5 == 0xA8)))
  1429. {
  1430. rn6752_write_byte(decoder,0xEF, 0xAA);
  1431. rn6752_write_byte(decoder,0xE7, 0xFF);
  1432. rn6752_write_byte(decoder,0xFC, 0x60);
  1433. rn6752_write_byte(decoder,0xFF, 0x09);
  1434. rn6752_write_byte(decoder,0x03, 0x18);
  1435. rn6752_write_byte(decoder,0xFF, 0x0B);
  1436. rn6752_write_byte(decoder,0x03, 0x18);
  1437. }
  1438. else
  1439. {
  1440. rn6752_write_byte(decoder,0xEF, 0xAA);
  1441. rn6752_write_byte(decoder,0xFC, 0x60);
  1442. rn6752_write_byte(decoder,0xFF, 0x09);
  1443. rn6752_write_byte(decoder,0x03, 0x18);
  1444. rn6752_write_byte(decoder,0xFF, 0x0B);
  1445. rn6752_write_byte(decoder,0x03, 0x18);
  1446. }
  1447. }
  1448. static int rn6752v1_input_signal_check(struct rn6752 *decoder)
  1449. {
  1450. int count_bit4 = 0, check_sig = 0, check_bit4 = 0;
  1451. int rn6752v1_signal_format, i;
  1452. int signal_detect = 0;
  1453. rn6752_write_byte(decoder,0x49,0x81);
  1454. rn6752_write_byte(decoder,0x19,0x0a);
  1455. for (i=0; i <= 4; i++ )
  1456. {
  1457. check_bit4 = rn6752_read_byte(decoder,0x00)>>4;
  1458. //printk(KERN_ALERT "check_bit4 = 0x%02x\n",check_bit4);
  1459. if (( check_bit4 & 0x1 ) == 0x0)
  1460. {
  1461. if(count_bit4++ >= 4)
  1462. {
  1463. check_sig = 1;
  1464. //printk(KERN_ALERT "RN6752 check signal ok,i = %d\r\n",i);
  1465. break;
  1466. }
  1467. }
  1468. else
  1469. {
  1470. count_bit4 = 0;
  1471. }
  1472. msleep(50);//50
  1473. }
  1474. if(check_sig)
  1475. {
  1476. rn6752v1_signal_format = rn6752_read_byte(decoder,0x00) & 0xf1;
  1477. switch (rn6752v1_signal_format)
  1478. {
  1479. case 0x00:
  1480. case 0x80:
  1481. signal_detect = RN6752_MODE_CVBS_PAL;
  1482. break;
  1483. case 0x01:
  1484. case 0x81:
  1485. signal_detect = RN6752_MODE_CVBS_NTSC;
  1486. break;
  1487. case 0x20:
  1488. case 0xA0:
  1489. signal_detect = RN6752_MODE_720P_25FPS;
  1490. break;
  1491. case 0x21:
  1492. case 0xA1:
  1493. signal_detect = RN6752_MODE_720P_30FPS;
  1494. break;
  1495. case 0x40:
  1496. case 0xC0:
  1497. signal_detect = RN6752_MODE_1080P_25FPS;
  1498. break;
  1499. case 0x41:
  1500. case 0xC1:
  1501. signal_detect = RN6752_MODE_1080P_30FPS;
  1502. break;
  1503. default:
  1504. break;
  1505. }
  1506. }
  1507. return signal_detect;
  1508. }
  1509. static int rn6752v1_detect_signal(struct rn6752 *decoder)
  1510. {
  1511. int count_bit4 = 0, check_sig = 0, check_bit4 = 0;
  1512. int rn6752v1_signal_format, i;
  1513. int signal_detect = 0;
  1514. rn6752_write_byte(decoder,0x49,0x81);
  1515. rn6752_write_byte(decoder,0x19,0x0a);
  1516. for (i=0; i <= 1; i++ )
  1517. {
  1518. check_bit4 = rn6752_read_byte(decoder,0x00)>>4;
  1519. if (( check_bit4 & 0x1 ) == 0x0)
  1520. {
  1521. signal_detect = 0;
  1522. }
  1523. else
  1524. {
  1525. signal_detect = 1;
  1526. }
  1527. }
  1528. //printk(KERN_ALERT "signal_detect = %d\n",signal_detect);
  1529. return signal_detect;
  1530. }
  1531. static int rn6752m_signal_check(struct rn6752 *decoder)
  1532. {
  1533. int status, i;
  1534. static int prestatus = 0;
  1535. int count = 0;
  1536. int resolutuon_detect = 0;
  1537. for(i=0; i<50; i++) //default:50 msn_6752v1:15
  1538. {
  1539. status = (rn6752_read_byte(decoder,0x00) & 0x7F);
  1540. if(status < 0)
  1541. {
  1542. msleep(1);
  1543. continue;
  1544. }
  1545. msleep(15);//default:25 msn_6752v1:15
  1546. if(status == prestatus)
  1547. {
  1548. count++;
  1549. 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
  1550. {
  1551. break;
  1552. }
  1553. }
  1554. else
  1555. {
  1556. count = 0;
  1557. prestatus = status;
  1558. }
  1559. msleep(1);
  1560. }
  1561. //printk(KERN_ALERT "### COUNT:%d, status:0x%x\n", count , status);
  1562. if(status & (1<<4))
  1563. {
  1564. resolutuon_detect = RN6752_MODE_NONE;
  1565. }
  1566. else
  1567. {
  1568. switch (status&0x71)
  1569. {
  1570. case 0X20:
  1571. //720P 25
  1572. resolutuon_detect = RN6752_MODE_720P_25FPS;
  1573. break;
  1574. case 0x21:
  1575. //720P 30
  1576. resolutuon_detect = RN6752_MODE_720P_30FPS;
  1577. break;
  1578. case 0X40:
  1579. //1080P 25
  1580. resolutuon_detect = RN6752_MODE_1080P_25FPS;
  1581. break;
  1582. case 0x41:
  1583. //1080P 30
  1584. resolutuon_detect = RN6752_MODE_1080P_30FPS;
  1585. break;
  1586. case 0x00:
  1587. //PAL
  1588. resolutuon_detect = RN6752_MODE_CVBS_PAL;
  1589. break;
  1590. case 0x01:
  1591. //NTSC
  1592. resolutuon_detect = RN6752_MODE_CVBS_NTSC;
  1593. break;
  1594. break;
  1595. default:
  1596. break;
  1597. }
  1598. }
  1599. return resolutuon_detect;
  1600. }
  1601. static int rn6752_signal_check(struct rn6752 *decoder)
  1602. {
  1603. u8 signal_cnt = 0;
  1604. u8 nosignal_cnt=0;
  1605. u8 reg_0x75,reg_0x77, reg_0x78, reg_0x79;
  1606. u16 counter1 = 0, counter2 = 0, counter3 = 0;
  1607. u16 PAL_MIN_COUNT = 320;//330 310
  1608. int i;
  1609. int ret;
  1610. static int counter_deviation = 10;
  1611. for(i=0; i<30; i++)
  1612. {
  1613. ret = rn6752_read_byte(decoder,0x00);
  1614. //printk(">>>>>>>>>>>>>>>>>>reg 0x00 :%x\r\n", ret);
  1615. if((ret >= 0) && ((ret&0x10) == 0x00))
  1616. {
  1617. signal_cnt++;
  1618. }
  1619. else
  1620. {
  1621. nosignal_cnt++;
  1622. }
  1623. if(signal_cnt >= 15)
  1624. {
  1625. //printk(KERN_ALERT "### >i:%d\r\n", i);
  1626. reg_0x77 = rn6752_read_byte(decoder,0x77);
  1627. reg_0x78 = rn6752_read_byte(decoder,0x78);
  1628. reg_0x79 = rn6752_read_byte(decoder,0x79);
  1629. reg_0x75 = rn6752_read_byte(decoder,0x75);
  1630. //counter1 = 0;
  1631. counter1 = reg_0x77&0x03;
  1632. counter1 <<= 8;
  1633. counter1 |= reg_0x78;
  1634. //counter2 = 0;
  1635. counter2 = reg_0x77&0xc;
  1636. counter2 >>= 2;
  1637. counter2 <<= 8;
  1638. counter2 |= reg_0x79;
  1639. counter3 = reg_0x75;
  1640. break;
  1641. }
  1642. if(nosignal_cnt >= 20)
  1643. {
  1644. return RN6752_MODE_NONE;
  1645. }
  1646. msleep(1);
  1647. }
  1648. if(signal_cnt < 15)
  1649. return RN6752_MODE_NONE;
  1650. printk("counter1 = %d , counter2 = %d\n",counter1,counter2);
  1651. if( (counter1 > 700) ||(counter2 > 700))
  1652. {
  1653. //720p pal
  1654. if(counter3 > 0x8c)
  1655. return RN6752_MODE_720P_25FPS;
  1656. else
  1657. return RN6752_MODE_720P_30FPS;
  1658. }
  1659. else if(((counter1>PAL_MIN_COUNT) && (counter1<550)) || ((counter2>PAL_MIN_COUNT) && (counter2<550)))
  1660. {
  1661. #ifdef RN6752_CVBS_PAL_CHECK_ERR
  1662. rn6752_cvbs_pal_flag = true;
  1663. #endif
  1664. //cvbs pal
  1665. return RN6752_MODE_CVBS_PAL;
  1666. }
  1667. //else if( (counter1<330) && (counter2<330) )
  1668. else if((counter1<PAL_MIN_COUNT) && (counter2<PAL_MIN_COUNT))
  1669. {
  1670. #ifdef RN6752_CVBS_PAL_CHECK_ERR
  1671. if(rn6752_cvbs_pal_flag)
  1672. goto err;
  1673. rn6752_cvbs_pal_flag = false;
  1674. #endif
  1675. //cvbs ntsc
  1676. return RN6752_MODE_CVBS_NTSC;
  1677. }
  1678. #ifdef RN6752_CVBS_PAL_CHECK_ERR
  1679. err:
  1680. if(((counter1+counter_deviation>PAL_MIN_COUNT) && (counter1+counter_deviation<550)) || ((counter2+counter_deviation>PAL_MIN_COUNT) && (counter2+10<550)))
  1681. {
  1682. //printk("counter1 + counter_deviation = %d , counter2 + counter_deviation = %d\n",counter1+counter_deviation,counter2+counter_deviation);
  1683. //cvbs pal
  1684. return RN6752_MODE_CVBS_PAL;
  1685. }
  1686. rn6752_cvbs_pal_flag = false;
  1687. #endif
  1688. return RN6752_MODE_NONE ;
  1689. }
  1690. static char * rn6752_get_mode_string (int mode)
  1691. {
  1692. if(mode == RN6752_MODE_NONE)
  1693. {
  1694. return "NONE";
  1695. }
  1696. else if(mode == RN6752_MODE_CVBS_PAL)
  1697. {
  1698. return "CVBS_PAL";
  1699. }
  1700. else if(mode == RN6752_MODE_CVBS_NTSC)
  1701. {
  1702. return "CVBS_NTSC";
  1703. }
  1704. else if(mode == RN6752_MODE_720P_25FPS)
  1705. {
  1706. return "720_PAL";
  1707. }
  1708. else if(mode == RN6752_MODE_720P_30FPS)
  1709. {
  1710. return "720_NTSC";
  1711. }
  1712. else if(mode == RN6752_MODE_1080P_25FPS)
  1713. {
  1714. return "1080P_25FPS";
  1715. }
  1716. else if(mode == RN6752_MODE_1080P_30FPS)
  1717. {
  1718. return "1080P_30FPS";
  1719. }
  1720. return "NONE";
  1721. }
  1722. static void rn6752_test_and_dvr_restart(struct rn6752 *decoder,int mode)
  1723. {
  1724. int progressive = dvr_get_pragressive();
  1725. int restart = 0;
  1726. switch(mode)
  1727. {
  1728. case RN6752_MODE_CVBS_PAL:
  1729. #ifdef RN6752V1_CVBS_PAL_PROGRESSIVE
  1730. if(progressive == 0)
  1731. restart = 1;
  1732. #else
  1733. if(progressive == 1)
  1734. restart = 1;
  1735. #endif
  1736. break;
  1737. case RN6752_MODE_CVBS_NTSC:
  1738. if(progressive == 1)
  1739. restart = 1;
  1740. break;
  1741. case RN6752_MODE_720P_25FPS:
  1742. case RN6752_MODE_720P_30FPS:
  1743. case RN6752_MODE_1080P_25FPS:
  1744. case RN6752_MODE_1080P_30FPS:
  1745. if(progressive == 0)
  1746. restart = 1;
  1747. break;
  1748. default:
  1749. break;
  1750. }
  1751. if(restart)
  1752. {
  1753. int source = decoder->enter_carback ? DVR_SOURCE_CAMERA : DVR_SOURCE_AUX;
  1754. if(rn6752_dbg) {
  1755. printk(KERN_ALERT "### mode(%s) does not match progressive(%d), itu656 dvr_restart(%d)\n",
  1756. rn6752_get_mode_string(mode), progressive, source);
  1757. }
  1758. dvr_restart();
  1759. }
  1760. }
  1761. static int rn6752_init_reg_cfg(struct rn6752 *decoder,int curr_cfg)
  1762. {
  1763. static int mode_cfg = RN6752_MODE_NONE;
  1764. if(decoder)
  1765. {
  1766. if(decoder->camera_mode > 0){
  1767. if(decoder->id == RN675X_ID_RN6752){
  1768. }
  1769. else if(decoder->id == RN675X_ID_RN6752M){
  1770. rn6752m_pre_init(decoder);
  1771. }
  1772. else if(decoder->id == RN675X_ID_RN6752V1){
  1773. rn6752m_pre_init(decoder);
  1774. }
  1775. }
  1776. switch(curr_cfg)
  1777. {
  1778. case CARBACK_CAMERA_MODE_CVBS_PAL:
  1779. {
  1780. //printk(KERN_ALERT "++++++++++++++CARBACK_CAMERA_MODE_CVBS_PAL\n");
  1781. if(decoder->id == RN675X_ID_RN6752)
  1782. rn6752_write_reg(decoder,rn6752_itu656_cvbs_pal, sizeof(rn6752_itu656_cvbs_pal)/2);//new add
  1783. else if(decoder->id == RN675X_ID_RN6752M)
  1784. rn6752_write_reg(decoder,rn6752m_itu656_cvbs_pal, sizeof(rn6752m_itu656_cvbs_pal)/2);
  1785. else if(decoder->id == RN675X_ID_RN6752V1)
  1786. rn6752_write_reg(decoder,rn6752v1_itu656_cvbs_pal, sizeof(rn6752v1_itu656_cvbs_pal)/2);
  1787. mode_cfg = RN6752_MODE_CVBS_PAL;
  1788. #ifdef RN6752V1_CVBS_PAL_PROGRESSIVE
  1789. decoder->progressive = 1;//only for msn (1:progressive scanning 0:interlaced scanning)
  1790. #else
  1791. decoder->progressive = 0;
  1792. #endif
  1793. }
  1794. break;
  1795. case CARBACK_CAMERA_MODE_CVBS_NTST:
  1796. {
  1797. //printk(KERN_ALERT "++++++++++++++CARBACK_CAMERA_MODE_CVBS_NTST\n");
  1798. if(decoder->id == RN675X_ID_RN6752)
  1799. rn6752_write_reg(decoder,rn6752_itu656_cvbs_ntsc, sizeof(rn6752_itu656_cvbs_ntsc)/2);//new add
  1800. else if(decoder->id == RN675X_ID_RN6752M)
  1801. rn6752_write_reg(decoder,rn6752m_itu656_cvbs_ntsc, sizeof(rn6752m_itu656_cvbs_ntsc)/2);
  1802. else if(decoder->id == RN675X_ID_RN6752V1)
  1803. rn6752_write_reg(decoder,rn6752v1_itu656_cvbs_ntsc, sizeof(rn6752v1_itu656_cvbs_ntsc)/2);
  1804. mode_cfg = RN6752_MODE_CVBS_NTSC;
  1805. decoder->progressive = 0;
  1806. }
  1807. break;
  1808. case CARBACK_CAMERA_MODE_720P25:
  1809. {
  1810. //printk(KERN_ALERT "++++++++++++++CARBACK_CAMERA_MODE_720P25\n");
  1811. if(decoder->id == RN675X_ID_RN6752){
  1812. rn6752_write_reg(decoder,rn6752_itu656_720p_pal, sizeof(rn6752_itu656_720p_pal)/2);//add 20211104
  1813. }
  1814. else if(decoder->id == RN675X_ID_RN6752M){
  1815. rn6752_write_reg(decoder,rn6752m_itu656_720p_25fps, sizeof(rn6752m_itu656_720p_25fps)/2);}
  1816. else if(decoder->id == RN675X_ID_RN6752V1){
  1817. //printk(KERN_ALERT "++++++++++++++write rn6752v1_itu656_720p_25fps\n");
  1818. rn6752_write_reg(decoder,rn6752v1_itu656_720p_25fps, sizeof(rn6752v1_itu656_720p_25fps)/2);
  1819. }
  1820. mode_cfg = RN6752_MODE_720P_25FPS;
  1821. decoder->progressive = 1;
  1822. }
  1823. break;
  1824. case CARBACK_CAMERA_MODE_720P30:
  1825. {
  1826. //printk(KERN_ALERT "++++++++++++++CARBACK_CAMERA_MODE_720P30\n");
  1827. if(decoder->id == RN675X_ID_RN6752)
  1828. rn6752_write_reg(decoder,rn6752_itu656_720p_ntsc, sizeof(rn6752_itu656_720p_ntsc)/2);//add 20211104
  1829. else if(decoder->id == RN675X_ID_RN6752M){
  1830. rn6752_write_reg(decoder,rn6752m_itu656_720p_30fps, sizeof(rn6752m_itu656_720p_30fps)/2);}
  1831. else if(decoder->id == RN675X_ID_RN6752V1){
  1832. rn6752_write_reg(decoder,rn6752m_itu656_720p_30fps, sizeof(rn6752m_itu656_720p_30fps)/2);}
  1833. mode_cfg = RN6752_MODE_720P_30FPS;
  1834. decoder->progressive = 1;
  1835. }
  1836. break;
  1837. case CARBACK_CAMERA_MODE_1080P25:
  1838. {
  1839. //printk(KERN_ALERT "++++++++++++++CARBACK_CAMERA_MODE_1080P25\n");
  1840. if(decoder->id == RN675X_ID_RN6752V1)
  1841. rn6752_write_reg(decoder,rn6752m_itu656_1080p_25fps, sizeof(rn6752m_itu656_1080p_25fps)/2);
  1842. mode_cfg = RN6752_MODE_1080P_25FPS;
  1843. decoder->progressive = 1;
  1844. }
  1845. break;
  1846. case CARBACK_CAMERA_MODE_1080P30:
  1847. {
  1848. //printk(KERN_ALERT "++++++++++++++CARBACK_CAMERA_MODE_1080P30\n");
  1849. if(decoder->id == RN675X_ID_RN6752V1)
  1850. rn6752_write_reg(decoder,rn6752m_itu656_1080p_30fps, sizeof(rn6752m_itu656_1080p_30fps)/2);
  1851. mode_cfg = RN6752_MODE_1080P_30FPS;
  1852. decoder->progressive = 1;
  1853. }
  1854. break;
  1855. case RN6752_MODE_NONE:
  1856. default:
  1857. {
  1858. //printk(KERN_ALERT "++++++++++++++RN6752_MODE_NONE\n");
  1859. if(decoder->id == RN675X_ID_RN6752)
  1860. rn6752_write_reg(decoder,rn6752_itu656_720p_ntsc, sizeof(rn6752_itu656_720p_ntsc)/2);
  1861. else if(decoder->id == RN675X_ID_RN6752M)
  1862. rn6752_write_reg(decoder,rn6752m_itu656_720p_25fps, sizeof(rn6752m_itu656_720p_25fps)/2);
  1863. else if(decoder->id == RN675X_ID_RN6752V1)
  1864. rn6752_write_reg(decoder,rn6752v1_itu656_720p_25fps, sizeof(rn6752v1_itu656_720p_25fps)/2);
  1865. mode_cfg = RN6752_MODE_720P_30FPS;
  1866. decoder->progressive = 1;
  1867. }
  1868. break;
  1869. }
  1870. }
  1871. return mode_cfg;
  1872. }
  1873. static void rn6752_eq_work(struct work_struct *work)
  1874. {
  1875. struct rn6752 *decoder = container_of(work, struct rn6752, eq_work);
  1876. static int mode_cfg = RN6752_MODE_NONE;
  1877. static int curr_cfg = RN6752_MODE_NONE;
  1878. static int check_count = 0;
  1879. if(!decoder)
  1880. goto end;
  1881. decoder->enter_eq_work = 1;
  1882. if(mode_cfg == RN6752_MODE_NONE)
  1883. {
  1884. if(decoder->camera_mode > 0){
  1885. mode_cfg = rn6752_init_reg_cfg(decoder,decoder->camera_mode);
  1886. curr_cfg = mode_cfg;
  1887. if(mode_cfg)
  1888. goto end_1;
  1889. }
  1890. #if 0
  1891. if(rn6752_dbg)
  1892. printk(KERN_ALERT "### rn6752_eq_work rn6752x reset\n");
  1893. //reset
  1894. rn6752_reset(dvr_rn6752->gpio_reset);
  1895. //check id
  1896. if(rn6752_check_id(dvr_rn6752))
  1897. goto end;
  1898. #endif
  1899. //printk("----------------->rn6752 Dynamic detect mode<-----------------\n");
  1900. //720p cfg: before auto match, we must config 720p mode, because the default clk config is based on 720P
  1901. if(decoder->id == RN675X_ID_RN6752)
  1902. {
  1903. //rn6752_write_reg(decoder,rxchip_rn6752_720p_pal, sizeof(rxchip_rn6752_720p_pal)/2);
  1904. rn6752_write_reg(decoder,rn6752_itu656_720p_ntsc, sizeof(rn6752_itu656_720p_ntsc)/2);
  1905. }
  1906. else if(decoder->id == RN675X_ID_RN6752M)
  1907. {
  1908. rn6752m_pre_init(decoder);
  1909. rn6752_write_reg(decoder,rn6752m_itu656_720p_25fps, sizeof(rn6752m_itu656_720p_25fps)/2);
  1910. }
  1911. else if(decoder->id == RN675X_ID_RN6752V1)
  1912. {
  1913. rn6752m_pre_init(decoder);
  1914. rn6752_write_reg(decoder,rn6752v1_itu656_720p_25fps, sizeof(rn6752v1_itu656_720p_25fps)/2);
  1915. }
  1916. mode_cfg = RN6752_MODE_720P_30FPS;
  1917. decoder->progressive = 1;
  1918. #ifdef CONFIG_RN6752_LOW_POWER_MODE
  1919. if(!decoder->enter_carback && !decoder->enter_auxin)
  1920. {
  1921. rn6752_power_off();
  1922. }
  1923. #endif
  1924. goto end;
  1925. }
  1926. if(decoder->id == RN675X_ID_RN6752)
  1927. {
  1928. curr_cfg = rn6752v1_input_signal_check(decoder);
  1929. }
  1930. else if(decoder->id == RN675X_ID_RN6752M)
  1931. {
  1932. curr_cfg = rn6752m_signal_check(decoder);
  1933. if(curr_cfg == RN6752_MODE_NONE)
  1934. {
  1935. msleep(10);
  1936. curr_cfg = rn6752m_signal_check(decoder);
  1937. }
  1938. }
  1939. else if(decoder->id == RN675X_ID_RN6752V1)
  1940. {
  1941. curr_cfg = rn6752v1_input_signal_check(decoder);
  1942. }
  1943. if(!decoder->enter_carback)
  1944. {
  1945. exit:
  1946. #ifdef CONFIG_RN6752_LOW_POWER_MODE
  1947. rn6752_power_off();
  1948. #endif
  1949. if(rn6752_dbg)
  1950. printk(KERN_ALERT "### %s exit without in carback or auxin\n", __FUNCTION__);
  1951. //avoid recognize a wrong format, so default format should be 720P.
  1952. //if(dvr_rn6752->last_source != DVR_SOURCE_CAMERA)
  1953. {
  1954. if(mode_cfg != RN6752_MODE_720P_30FPS)
  1955. {
  1956. if(decoder->id == RN675X_ID_RN6752){
  1957. rn6752_write_reg(decoder,rn6752_itu656_720p_ntsc, sizeof(rn6752_itu656_720p_ntsc)/2);
  1958. }
  1959. else if(decoder->id == RN675X_ID_RN6752M){
  1960. rn6752_write_reg(decoder,rn6752m_itu656_720p_25fps, sizeof(rn6752m_itu656_720p_25fps)/2);}
  1961. else if(decoder->id == RN675X_ID_RN6752V1){
  1962. rn6752_write_reg(decoder,rn6752v1_itu656_720p_25fps, sizeof(rn6752v1_itu656_720p_25fps)/2);
  1963. }
  1964. mode_cfg = RN6752_MODE_720P_30FPS;
  1965. decoder->progressive = 1;
  1966. }
  1967. decoder->mode = RN6752_MODE_NONE;
  1968. }
  1969. goto end;
  1970. }
  1971. if(rn6752_dbg)
  1972. 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));
  1973. //printk("mode_cfg = %d,curr_cfg = %d\n",mode_cfg,curr_cfg);
  1974. if((curr_cfg == RN6752_MODE_NONE) || (mode_cfg != curr_cfg))
  1975. {
  1976. if(rn6752_dbg)
  1977. printk(KERN_ALERT "### rn6752 change mode to (%s)\n", rn6752_get_mode_string(curr_cfg));
  1978. mode_cfg = rn6752_init_reg_cfg(decoder,curr_cfg);
  1979. }
  1980. end_1:
  1981. rn6752_test_and_dvr_restart(decoder,mode_cfg);
  1982. eixt_1:
  1983. decoder->mode = curr_cfg;
  1984. end:
  1985. decoder->enter_eq_work = 0;
  1986. }
  1987. static int rn6752_check_id(struct rn6752 *decoder)
  1988. {
  1989. int id = -1;
  1990. int ret;
  1991. if(!decoder)
  1992. goto err_check_id;
  1993. ret = rn6752_read_byte(decoder,0xfe);
  1994. if(ret < 0)
  1995. goto err_check_id;
  1996. id = (ret<<8);
  1997. ret = rn6752_read_byte(decoder,0xfd);
  1998. if(ret < 0)
  1999. goto err_check_id;
  2000. id |= ret;
  2001. if(id == 0x401) {
  2002. decoder->id = RN675X_ID_RN6752;
  2003. printk(KERN_ALERT "AHD IC: RN6752\n");
  2004. } else if(id == 0x501) {
  2005. decoder->id = RN675X_ID_RN6752M;
  2006. printk(KERN_ALERT "AHD IC: RN6752M\n");
  2007. }else if(id == 0x2601) {
  2008. decoder->id = RN675X_ID_RN6752V1;//RN675X_ID_RN6752M
  2009. printk(KERN_ALERT "AHD IC: RN6752V1\n");
  2010. }
  2011. return 0;
  2012. err_check_id:
  2013. printk(KERN_ERR "***ERR: %s failed, id:%d, ret:%d\n", __FUNCTION__, id, ret);
  2014. decoder->id = RN675X_ID_UNKNOWN;
  2015. return -ENODEV;
  2016. }
  2017. static void rn6752_reset(struct rn6752 *decoder)
  2018. {
  2019. //sw reset
  2020. rn6752_write_byte(decoder,0x80, 0x31); //soft reset
  2021. msleep(100);
  2022. rn6752_write_byte(decoder,0x80, 0x30); //reset complete
  2023. if(decoder && (decoder->curr_channel >= 0))
  2024. rn6752_write_byte(decoder,0xD3, decoder->curr_channel);
  2025. rn6752_write_byte(decoder,0x1A, 0x83); //disable blue screen
  2026. }
  2027. static void rn6752_work_timer(struct timer_list *t)
  2028. {
  2029. struct rn6752 *decoder = from_timer(decoder, t, work_timer);
  2030. static int flag_signal = 0;
  2031. static int count_signal = 0;
  2032. static int flag_no_signal = 0;
  2033. static int count_no_signal = 0;
  2034. if(!decoder->signal){
  2035. if(!flag_signal){
  2036. if(!decoder->enter_eq_work){
  2037. queue_work(decoder->eq_queue, &decoder->eq_work);
  2038. }
  2039. count_signal ++;
  2040. if(count_signal == 20){
  2041. flag_signal = 1;
  2042. }
  2043. }
  2044. flag_no_signal = 0;
  2045. count_no_signal = 0;
  2046. }
  2047. if(decoder->signal == V4L2_IN_ST_NO_SIGNAL){
  2048. if(!flag_no_signal){
  2049. if(!decoder->enter_eq_work){
  2050. queue_work(decoder->eq_queue, &decoder->eq_work);
  2051. }
  2052. count_no_signal ++;
  2053. if(count_no_signal == 20){
  2054. flag_no_signal = 1;
  2055. }
  2056. }
  2057. flag_signal = 0;
  2058. count_signal = 0;
  2059. }
  2060. mod_timer(&decoder->work_timer, jiffies + msecs_to_jiffies(100));
  2061. }
  2062. static void rn6752_timeout_timer(struct timer_list *t)
  2063. {
  2064. //printk(KERN_ALERT "rn6752_timeout_timer entry\n");
  2065. struct rn6752 *decoder = from_timer(decoder, t, timer);
  2066. if(decoder)
  2067. {
  2068. if(!decoder->enter_eq_work)
  2069. queue_work(decoder->eq_queue, &decoder->eq_work);
  2070. if(decoder->timer_timeout > 0)
  2071. {
  2072. decoder->timer_timeout --;
  2073. mod_timer(&decoder->timer, jiffies + msecs_to_jiffies(100));
  2074. }
  2075. else
  2076. {
  2077. decoder->timer_start = false;
  2078. }
  2079. }
  2080. }
  2081. static void rn6752_start_timer(struct rn6752 *decoder,int timeout_100ms)
  2082. {
  2083. //speed video recognise
  2084. if(decoder)
  2085. {
  2086. decoder->timer_timeout = timeout_100ms;
  2087. if(!decoder->timer_start)
  2088. {
  2089. decoder->timer_start = true;
  2090. mod_timer(&decoder->timer, jiffies + msecs_to_jiffies(1));
  2091. }
  2092. }
  2093. }
  2094. /* ----------------------------------------------------------------------- */
  2095. static int _rn6752_init(struct rn6752 *decoder)
  2096. {
  2097. rn6752_reset(decoder);
  2098. rn6752_check_id(decoder);
  2099. return 0;
  2100. }
  2101. static int rn6752_s_ctrl(struct v4l2_ctrl *ctrl)
  2102. {
  2103. struct v4l2_subdev *sd = to_sd(ctrl);
  2104. struct rn6752 *decoder = to_rn6752(sd);
  2105. switch (ctrl->id) {
  2106. case V4L2_CID_BRIGHTNESS:
  2107. ctrl->val &= 0xFF;
  2108. rn6752_write_byte(decoder,RN6752_BRIGHTNESS_ADDR, ctrl->val);
  2109. return 0;
  2110. case V4L2_CID_CONTRAST:
  2111. ctrl->val &= 0xFF;
  2112. rn6752_write_byte(decoder,RN6752_CONTRAST_ADDR, ctrl->val);
  2113. return 0;
  2114. case V4L2_CID_SATURATION:
  2115. ctrl->val &= 0xFF;
  2116. rn6752_write_byte(decoder,RN6752_SATURATION_ADDR, ctrl->val);
  2117. return 0;
  2118. case V4L2_CID_HUE:
  2119. ctrl->val &= 0xFF;
  2120. rn6752_write_byte(decoder,RN6752_HUE_ADDR, ctrl->val);
  2121. return 0;
  2122. }
  2123. return -EINVAL;
  2124. }
  2125. static int rn6752_g_input_status(struct v4l2_subdev *sd, u32 *status)
  2126. {
  2127. struct rn6752 *decoder = to_rn6752(sd);
  2128. static int curr_cfg = RN6752_MODE_NONE;
  2129. int ret;
  2130. if(rn6752_dbg)
  2131. printk(KERN_ALERT "### rn6752_detect_signal\n");
  2132. if(decoder)
  2133. {
  2134. if (status) {
  2135. *status = 0;
  2136. if(decoder->id == RN675X_ID_RN6752)
  2137. {
  2138. //return ((g_dvr_rn6752->mode != RN6752_MODE_NONE) ? 1 : 0);
  2139. if(decoder->mode != RN6752_MODE_NONE)
  2140. {
  2141. ret = rn6752_read_byte(decoder,0x00);
  2142. if(ret >= 0)
  2143. {
  2144. if((ret & 0x10) == 0)
  2145. {
  2146. *status |= V4L2_IN_ST_NO_SIGNAL;
  2147. }
  2148. }
  2149. }
  2150. }
  2151. else if(decoder->id == RN675X_ID_RN6752M)
  2152. {
  2153. return ((decoder->mode != RN6752_MODE_NONE) ? 1 : 0);
  2154. }
  2155. else if(decoder->id == RN675X_ID_RN6752V1)
  2156. {
  2157. if (rn6752v1_detect_signal(decoder))
  2158. *status |= V4L2_IN_ST_NO_SIGNAL;
  2159. }
  2160. }
  2161. }
  2162. decoder->signal = *status;
  2163. return 0;
  2164. }
  2165. static int rn6752_select_input(struct rn6752 *decoder, u32 input)
  2166. {
  2167. int ret;
  2168. if(rn6752_dbg)
  2169. printk(KERN_ALERT "### rn6752_select_channel ch:%d\n", input);
  2170. if((input >= 0) && (input <= 1))
  2171. {
  2172. if(decoder) {
  2173. decoder->mode = RN6752_MODE_NONE;
  2174. ret = rn6752_read_byte(decoder,0xD3);
  2175. if(ret >= 0)
  2176. {
  2177. if(ret == input)
  2178. {
  2179. if(rn6752_dbg)
  2180. printk(KERN_ALERT "### %s, same ch:%d, ignore\n", __FUNCTION__, input);
  2181. return 0;
  2182. }
  2183. }
  2184. if(rn6752_write_byte(decoder,0xD3, input) == 0)
  2185. decoder->curr_channel = input;
  2186. }
  2187. }
  2188. return 0;
  2189. }
  2190. static int rn6752_s_routing(struct v4l2_subdev *sd, u32 input,
  2191. u32 output, u32 config)
  2192. {
  2193. struct rn6752 *decoder = to_rn6752(sd);
  2194. //printk(KERN_ALERT "rn6752_select_channel %d \n",input);
  2195. rn6752_select_input(decoder, input);
  2196. decoder->input = input;
  2197. return 0;
  2198. }
  2199. static int rn6752_init(struct v4l2_subdev *sd, u32 val)
  2200. {
  2201. struct rn6752 *decoder = to_rn6752(sd);
  2202. int ret;
  2203. ret=_rn6752_init(decoder);
  2204. if(ret){
  2205. printk(KERN_ALERT "_rn6752_init error.\n");
  2206. }
  2207. return ret;
  2208. }
  2209. static long rn6752_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
  2210. {
  2211. struct rn6752 *decoder = to_rn6752(sd);
  2212. int ret = 0;
  2213. switch (cmd) {
  2214. case VIDIOC_GET_RESOLUTION:
  2215. {
  2216. int* temp = (int *)arg;
  2217. *temp = TYPE_1080P;
  2218. break;
  2219. }
  2220. case VIDIOC_GET_PROGRESSIVE:
  2221. {
  2222. int* temp = (int *)arg;
  2223. int progressive = 1;
  2224. if(rn6752_dbg)
  2225. printk(KERN_ALERT "### itu656 get rn6752 progressive:%d\n", progressive);
  2226. *temp = decoder->progressive;
  2227. break;
  2228. }
  2229. case VIDIOC_GET_CHIPINFO:
  2230. {
  2231. int* temp = (int *)arg;
  2232. *temp = TYPE_RN6752;
  2233. break;
  2234. }
  2235. case VIDIOC_ENTER_CARBACK:
  2236. {
  2237. rn6752_start_timer(decoder,20);
  2238. decoder->enter_carback = 1;
  2239. break;
  2240. }
  2241. case VIDIOC_EXIT_CARBACK:
  2242. {
  2243. decoder->enter_carback = 0;
  2244. rn6752_start_timer(decoder,20);
  2245. break;
  2246. }
  2247. case VIDIOC_GET_ITU601_ENABLE:
  2248. {
  2249. int* temp = (int *)arg;
  2250. *temp = 0;
  2251. break;
  2252. }
  2253. case VIDIOC_SET_AVIN_MODE:
  2254. {
  2255. rn6752_reset(decoder);
  2256. break;
  2257. }
  2258. case VIDIOC_ENABLE_TIME:
  2259. {
  2260. mod_timer(&decoder->work_timer, jiffies + msecs_to_jiffies(1));
  2261. break;
  2262. }
  2263. default:
  2264. return -ENOIOCTLCMD;
  2265. }
  2266. return ret;
  2267. }
  2268. /* ----------------------------------------------------------------------- */
  2269. static const struct v4l2_ctrl_ops rn6752_ctrl_ops = {
  2270. .s_ctrl = rn6752_s_ctrl,
  2271. };
  2272. static const struct v4l2_subdev_video_ops rn6752_video_ops = {
  2273. .g_input_status = rn6752_g_input_status,
  2274. .s_routing = rn6752_s_routing,
  2275. };
  2276. static const struct v4l2_subdev_core_ops rn6752_core_ops = {
  2277. .init = rn6752_init,
  2278. .ioctl = rn6752_ioctl,
  2279. };
  2280. static const struct v4l2_subdev_ops rn6752_ops = {
  2281. .core = &rn6752_core_ops,
  2282. .video = &rn6752_video_ops,
  2283. };
  2284. static int rn6752_parse_dt(struct rn6752 *decoder, struct device_node *np)
  2285. {
  2286. int ret = 0;
  2287. int value;
  2288. if(!of_property_read_u32(np, "default-channel", &value)) {
  2289. decoder->curr_channel = value;
  2290. } else {
  2291. decoder->curr_channel = 0;
  2292. }
  2293. if(!of_property_read_u32(np, "camera-format", &value)) {
  2294. decoder->camera_mode = value;
  2295. } else {
  2296. decoder->camera_mode = RN6752_MODE_NONE;
  2297. }
  2298. if(!of_property_read_u32(np, "itu601in", &value)) {
  2299. decoder->itu601in = value;
  2300. } else {
  2301. decoder->itu601in = 0;
  2302. }
  2303. return ret;
  2304. }
  2305. static void rn6752_set_display_effect_default(struct rn6752 *decoder)
  2306. {
  2307. rn6752_write_byte(decoder,RN6752_BRIGHTNESS_ADDR, (0x80 & 0xFF));
  2308. rn6752_write_byte(decoder,RN6752_CONTRAST_ADDR, (0x80 & 0xFF));
  2309. rn6752_write_byte(decoder,RN6752_SATURATION_ADDR, (0x00 & 0xFF));
  2310. rn6752_write_byte(decoder,RN6752_HUE_ADDR, (0x00 & 0xFF));
  2311. //amt_write_reg(decoder,RN6752_SHARPNESS_ADDR, ((rn6752_effect.carback_sharpness | 0x80) & 0xFF));
  2312. }
  2313. static int rn6752_probe(struct i2c_client *client,
  2314. const struct i2c_device_id *id)
  2315. {
  2316. struct rn6752 *decoder;
  2317. struct v4l2_subdev *sd;
  2318. struct device_node *np = client->dev.of_node;
  2319. int res;
  2320. /* Check if the adapter supports the needed features */
  2321. if (!i2c_check_functionality(client->adapter,
  2322. I2C_FUNC_SMBUS_READ_BYTE | I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
  2323. return -EIO;
  2324. decoder = devm_kzalloc(&client->dev, sizeof(*decoder), GFP_KERNEL);
  2325. if (!decoder)
  2326. return -ENOMEM;
  2327. decoder->client = client;
  2328. decoder->default_addr = client->addr;
  2329. decoder->mode = RN6752_MODE_NONE;
  2330. decoder->camera_mode = 0;
  2331. decoder->signal = V4L2_IN_ST_NO_SIGNAL;
  2332. decoder->curr_channel = 0;
  2333. sd = &decoder->sd;
  2334. //decoder->reset_gpio = devm_gpiod_get_optional(&client->dev, "reset",
  2335. // GPIOD_OUT_HIGH);
  2336. //if (IS_ERR(decoder->reset_gpio)) {
  2337. // res = PTR_ERR(decoder->reset_gpio);
  2338. // v4l_err(client, "request for reset pin failed: %d\n", res);
  2339. // return res;
  2340. // }
  2341. decoder->eq_queue = create_singlethread_workqueue("rn6752_eq_queue");
  2342. if(decoder->eq_queue)
  2343. {
  2344. INIT_WORK(&decoder->eq_work, rn6752_eq_work);
  2345. }
  2346. v4l2_i2c_subdev_init(sd, client, &rn6752_ops);
  2347. res = rn6752_parse_dt(decoder, np);
  2348. if (res) {
  2349. dev_err(sd->dev, "DT parsing error: %d\n", res);
  2350. return res;
  2351. }
  2352. #if 0
  2353. decoder->eq_queue = create_singlethread_workqueue("rn6752_eq_queue");
  2354. if(decoder->eq_queue)
  2355. {
  2356. INIT_WORK(&decoder->eq_work, rn6752_eq_work);
  2357. }
  2358. queue_work(decoder->eq_queue, &decoder->eq_work);
  2359. #endif
  2360. decoder->timer_start = false;
  2361. timer_setup(&decoder->timer, rn6752_timeout_timer,0);
  2362. timer_setup(&decoder->work_timer, rn6752_work_timer,0);
  2363. sd->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
  2364. v4l2_ctrl_handler_init(&decoder->hdl, 4);
  2365. v4l2_ctrl_new_std(&decoder->hdl, &rn6752_ctrl_ops,
  2366. V4L2_CID_BRIGHTNESS, 0, 255, 1, 128);
  2367. v4l2_ctrl_new_std(&decoder->hdl, &rn6752_ctrl_ops,
  2368. V4L2_CID_CONTRAST, 0, 255, 1, 128);
  2369. v4l2_ctrl_new_std(&decoder->hdl, &rn6752_ctrl_ops,
  2370. V4L2_CID_SATURATION, 0, 255, 1, 128);
  2371. v4l2_ctrl_new_std(&decoder->hdl, &rn6752_ctrl_ops,
  2372. V4L2_CID_HUE, -128, 127, 1, 0);
  2373. sd->ctrl_handler = &decoder->hdl;
  2374. if (decoder->hdl.error) {
  2375. res = decoder->hdl.error;
  2376. goto err;
  2377. }
  2378. res = v4l2_async_register_subdev(sd);
  2379. if (res < 0)
  2380. goto err;
  2381. return 0;
  2382. err:
  2383. v4l2_ctrl_handler_free(&decoder->hdl);
  2384. return res;
  2385. return 0;
  2386. }
  2387. static int rn6752_remove(struct i2c_client *client)
  2388. {
  2389. struct v4l2_subdev *sd = i2c_get_clientdata(client);
  2390. struct rn6752 *decoder = to_rn6752(sd);
  2391. dev_dbg(sd->dev,
  2392. "rn6752.c: removing rn6752 adapter on address 0x%x\n",
  2393. client->addr << 1);
  2394. del_timer(&decoder->timer);
  2395. del_timer(&decoder->work_timer);
  2396. if(decoder->eq_queue)
  2397. destroy_workqueue(decoder->eq_queue);
  2398. v4l2_async_unregister_subdev(sd);
  2399. v4l2_ctrl_handler_free(&decoder->hdl);
  2400. return 0;
  2401. }
  2402. /* ----------------------------------------------------------------------- */
  2403. /* the length of name must less than 20 */
  2404. static const struct i2c_device_id rn6752_id[] = {
  2405. { "rn6752_ark1668e", },
  2406. { }
  2407. };
  2408. MODULE_DEVICE_TABLE(i2c, rn6752_id);
  2409. #if IS_ENABLED(CONFIG_OF)
  2410. static const struct of_device_id rn6752_of_match[] = {
  2411. { .compatible = "arkmicro,ark1668e_rn6752", },
  2412. { /* sentinel */ },
  2413. };
  2414. MODULE_DEVICE_TABLE(of, rn6752_of_match);
  2415. #endif
  2416. static struct i2c_driver rn6752_driver = {
  2417. .driver = {
  2418. .of_match_table = of_match_ptr(rn6752_of_match),
  2419. .name = "rn6752",
  2420. },
  2421. .probe = rn6752_probe,
  2422. .remove = rn6752_remove,
  2423. .id_table = rn6752_id,
  2424. };
  2425. static int __init rn_6752_init(void)
  2426. {
  2427. return i2c_add_driver(&rn6752_driver);
  2428. }
  2429. static void __exit rn_6752_exit(void)
  2430. {
  2431. i2c_del_driver(&rn6752_driver);
  2432. }
  2433. device_initcall(rn_6752_init);
  2434. MODULE_AUTHOR("arkmicro");
  2435. MODULE_DESCRIPTION("arkmicro rn6752 decoder driver for v4l2");
  2436. MODULE_LICENSE("GPL v2");