rn6752.c 75 KB

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