IMX334.c 69 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046
  1. /******************************************************************************\
  2. |* Copyright (c) 2020 by VeriSilicon Holdings Co., Ltd. ("VeriSilicon") *|
  3. |* All Rights Reserved. *|
  4. |* *|
  5. |* The material in this file is confidential and contains trade secrets of *|
  6. |* of VeriSilicon. This is proprietary information owned or licensed by *|
  7. |* VeriSilicon. No part of this work may be disclosed, reproduced, copied, *|
  8. |* transmitted, or used in any way for any purpose, without the express *|
  9. |* written permission of VeriSilicon. *|
  10. |* *|
  11. \******************************************************************************/
  12. #include <ebase/types.h>
  13. #include <ebase/trace.h>
  14. #include <ebase/builtins.h>
  15. #include <common/return_codes.h>
  16. #include <common/misc.h>
  17. #include <sys/ioctl.h>
  18. #include <fcntl.h>
  19. #include <math.h>
  20. #include <isi/isi.h>
  21. #include <isi/isi_iss.h>
  22. #include <isi/isi_priv.h>
  23. #include <vvsensor.h>
  24. #include "IMX334_priv.h"
  25. CREATE_TRACER( IMX334_INFO , "IMX334: ", INFO, 1);
  26. CREATE_TRACER( IMX334_WARN , "IMX334: ", WARNING, 1);
  27. CREATE_TRACER( IMX334_ERROR, "IMX334: ", ERROR, 1);
  28. CREATE_TRACER( IMX334_DEBUG, "IMX334: ", INFO, 1);
  29. CREATE_TRACER( IMX334_REG_INFO , "IMX334: ", INFO, 1);
  30. CREATE_TRACER( IMX334_REG_DEBUG, "IMX334: ", INFO, 1);
  31. #ifdef SUBDEV_V4L2
  32. #include <sys/ioctl.h>
  33. #include <sys/mman.h>
  34. #include <fcntl.h>
  35. #include <linux/videodev2.h>
  36. #include <linux/v4l2-subdev.h>
  37. #undef TRACE
  38. #define TRACE(x, ...)
  39. #endif
  40. #define IMX334_MIN_GAIN_STEP ( 1.0f/16.0f ) /**< min gain step size used by GUI (hardware min = 1/16; 1/16..32/16 depending on actual gain ) */
  41. #define IMX334_MAX_GAIN_AEC ( 32.0f ) /**< max. gain used by the AEC (arbitrarily chosen, hardware limit = 62.0, driver limit = 32.0 ) */
  42. #define IMX334_PLL_PCLK 74250000
  43. #define IMX334_HMAX 0xaec
  44. #define IMX334_VMAX 0xac4
  45. extern const IsiRegDescription_t IMX334_g_aRegDescription[];
  46. //const IsiSensorCaps_t IMX334_g_IsiSensorDefaultConfig;
  47. /*****************************************************************************
  48. *Sensor Info
  49. *****************************************************************************/
  50. static const char SensorName[16] = "IMX334";
  51. static struct vvcam_mode_info pIMX334_mode_info[] = {
  52. {
  53. .index = 0,
  54. .width = 3864,
  55. .height = 2180,
  56. .fps = 30,
  57. .hdr_mode = SENSOR_MODE_LINEAR,
  58. .bit_width = 12,
  59. .bayer_pattern = 3,
  60. .mipi_phy_freq = 800, //mbps
  61. .mipi_line_num = 4,
  62. .config_file_3a = "IMX334_3864x2180_raw12", //3aconfig_IMX334_3864x2180_raw12.json
  63. .preg_data = (void *)"imx334 3864x2180",
  64. },
  65. /*
  66. {
  67. .index = 0,
  68. .width = 3840,
  69. .height = 2160,
  70. .fps = 30,
  71. .hdr_mode = SENSOR_MODE_LINEAR,
  72. .bit_width = 12,
  73. .bayer_pattern = 3,
  74. .mipi_phy_freq = 900, //mbps
  75. .mipi_line_num = 4,
  76. .preg_data = (void *)"imx334 3840x2160",
  77. },
  78. */
  79. /*
  80. {
  81. .index = 1,
  82. .width = 3840,
  83. .height = 2160,
  84. .fps = 30,
  85. .hdr_mode = SENSOR_MODE_HDR_STITCH,
  86. .stitching_mode = SENSOR_STITCHING_3DOL,
  87. .bit_width = 12,
  88. .bayer_pattern = BAYER_GBRG,
  89. .mipi_phy_freq = 800, //mbps
  90. .mipi_line_num = 4,
  91. .preg_data = (void *)"imx334 3840x2160",
  92. },
  93. {
  94. .index = 2,
  95. .width = 1280,
  96. .height = 720,
  97. .fps = 60,
  98. .hdr_mode = SENSOR_MODE_LINEAR,
  99. .bit_width = 10,
  100. .bayer_pattern = BAYER_GBRG,
  101. .mipi_phy_freq = 600, //mbps
  102. .mipi_line_num = 4,
  103. .preg_data = (void *)"imx334 1920x1080",
  104. }
  105. */
  106. };
  107. /*
  108. static const uint32_t SensorDrvSupportResoluton[] = {
  109. ISI_RES_TV720P,
  110. ISI_RES_TV1080P
  111. };
  112. */
  113. static RESULT IMX334_IsiSensorSetPowerIss(IsiSensorHandle_t handle, bool_t on) {
  114. RESULT result = RET_SUCCESS;
  115. int ret = 0;
  116. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  117. if (pIMX334Ctx == NULL || pIMX334Ctx->IsiCtx.HalHandle == NULL) {
  118. return RET_NULL_POINTER;
  119. }
  120. HalContext_t *pHalCtx = (HalContext_t *) pIMX334Ctx->IsiCtx.HalHandle;
  121. TRACE(IMX334_INFO, "%s (enter)\n", __func__);
  122. int32_t enable = on;
  123. ret = ioctl(pHalCtx->sensor_fd, VVSENSORIOC_S_POWER, &enable);
  124. if (ret != 0) {
  125. TRACE(IMX334_ERROR, "%s: sensor set power error!\n", __func__);
  126. return (RET_FAILURE);
  127. }
  128. TRACE(IMX334_INFO, "%s (exit)\n", __func__);
  129. return (result);
  130. }
  131. static RESULT IMX334_IsiResetSensorIss(IsiSensorHandle_t handle) {
  132. RESULT result = RET_SUCCESS;
  133. int ret = 0;
  134. TRACE(IMX334_INFO, "%s (enter)\n", __func__);
  135. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  136. if (pIMX334Ctx == NULL || pIMX334Ctx->IsiCtx.HalHandle == NULL) {
  137. return RET_NULL_POINTER;
  138. }
  139. HalContext_t *pHalCtx = (HalContext_t *) pIMX334Ctx->IsiCtx.HalHandle;
  140. ret = ioctl(pHalCtx->sensor_fd, VVSENSORIOC_RESET, NULL);
  141. if (ret != 0) {
  142. TRACE(IMX334_ERROR, "%s: sensor reset error!\n", __func__);
  143. return (RET_FAILURE);
  144. }
  145. sleep(0.01);
  146. TRACE(IMX334_INFO, "%s (exit)\n", __func__);
  147. return (result);
  148. }
  149. #ifdef SUBDEV_CHAR
  150. static RESULT IMX334_IsiSensorSetClkIss(IsiSensorHandle_t handle, uint32_t clk) {
  151. RESULT result = RET_SUCCESS;
  152. int32_t ret = 0;
  153. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  154. if (pIMX334Ctx == NULL || pIMX334Ctx->IsiCtx.HalHandle == NULL) {
  155. return RET_NULL_POINTER;
  156. }
  157. HalContext_t *pHalCtx = (HalContext_t *) pIMX334Ctx->IsiCtx.HalHandle;
  158. TRACE(IMX334_INFO, "%s (enter)\n", __func__);
  159. ret = ioctl(pHalCtx->sensor_fd, VVSENSORIOC_S_CLK, &clk);
  160. if (ret != 0) {
  161. TRACE(IMX334_ERROR, "%s: sensor set clk error!\n", __func__);
  162. return (RET_FAILURE);
  163. }
  164. TRACE(IMX334_INFO, "%s (exit)\n", __func__);
  165. return (result);
  166. }
  167. static RESULT IMX334_IsiSensorGetClkIss(IsiSensorHandle_t handle, uint32_t * pclk) {
  168. RESULT result = RET_SUCCESS;
  169. int ret = 0;
  170. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  171. if (pIMX334Ctx == NULL || pIMX334Ctx->IsiCtx.HalHandle == NULL) {
  172. return RET_NULL_POINTER;
  173. }
  174. HalContext_t *pHalCtx = (HalContext_t *) pIMX334Ctx->IsiCtx.HalHandle;
  175. TRACE(IMX334_INFO, "%s (enter)\n", __func__);
  176. ret = ioctl(pHalCtx->sensor_fd, VVSENSORIOC_G_CLK, pclk);
  177. if (ret != 0) {
  178. TRACE(IMX334_ERROR, "%s: sensor get clk error!\n", __func__);
  179. return (RET_FAILURE);
  180. }
  181. TRACE(IMX334_INFO, "%s (exit)\n", __func__);
  182. return (result);
  183. }
  184. static RESULT IMX334_IsiConfigSensorSCCBIss(IsiSensorHandle_t handle)
  185. {
  186. RESULT result = RET_SUCCESS;
  187. return result;
  188. int ret = 0;
  189. TRACE(IMX334_INFO, "%s (enter)\n", __func__);
  190. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  191. if (pIMX334Ctx == NULL || pIMX334Ctx->IsiCtx.HalHandle == NULL) {
  192. return RET_NULL_POINTER;
  193. }
  194. HalContext_t *pHalCtx = (HalContext_t *) pIMX334Ctx->IsiCtx.HalHandle;
  195. static const IsiSccbInfo_t SensorSccbInfo = {
  196. .slave_addr = (0x34 >> 1),
  197. .addr_byte = 2,
  198. .data_byte = 1,
  199. };
  200. struct vvcam_sccb_cfg_s sensor_sccb_config;
  201. sensor_sccb_config.slave_addr = SensorSccbInfo.slave_addr;
  202. sensor_sccb_config.addr_byte = SensorSccbInfo.addr_byte;
  203. sensor_sccb_config.data_byte = SensorSccbInfo.data_byte;
  204. ret =
  205. ioctl(pHalCtx->sensor_fd, VVSENSORIOC_SENSOR_SCCB_CFG,
  206. &sensor_sccb_config);
  207. if (ret != 0) {
  208. TRACE(IMX334_ERROR, "%s: sensor config sccb info error!\n",
  209. __func__);
  210. return (RET_FAILURE);
  211. }
  212. TRACE(IMX334_INFO, "%s (exit) result = %d\n", __func__, result);
  213. return (result);
  214. }
  215. #endif
  216. static RESULT IMX334_IsiRegisterReadIss (IsiSensorHandle_t handle, const uint32_t address, uint32_t * p_value) {
  217. RESULT result = RET_SUCCESS;
  218. int32_t ret = 0;
  219. TRACE(IMX334_INFO, "%s (enter)\n", __func__);
  220. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  221. if (pIMX334Ctx == NULL || pIMX334Ctx->IsiCtx.HalHandle == NULL) {
  222. return RET_NULL_POINTER;
  223. }
  224. HalContext_t *pHalCtx = (HalContext_t *) pIMX334Ctx->IsiCtx.HalHandle;
  225. struct vvcam_sccb_data sccb_data;
  226. sccb_data.addr = address;
  227. sccb_data.data = 0;
  228. ret = ioctl(pHalCtx->sensor_fd, VVSENSORIOC_READ_REG, &sccb_data);
  229. if (ret != 0) {
  230. TRACE(IMX334_ERROR, "%s: read sensor register error!\n",
  231. __func__);
  232. return (RET_FAILURE);
  233. }
  234. *p_value = sccb_data.data;
  235. TRACE(IMX334_INFO, "%s (exit) result = %d\n", __func__, result);
  236. return (result);
  237. }
  238. static RESULT IMX334_IsiRegisterWriteIss(IsiSensorHandle_t handle, const uint32_t address, const uint32_t value) {
  239. RESULT result = RET_SUCCESS;
  240. int ret = 0;
  241. TRACE(IMX334_INFO, "%s (enter)\n", __func__);
  242. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  243. if (pIMX334Ctx == NULL || pIMX334Ctx->IsiCtx.HalHandle == NULL) {
  244. return RET_NULL_POINTER;
  245. }
  246. HalContext_t *pHalCtx = (HalContext_t *) pIMX334Ctx->IsiCtx.HalHandle;
  247. struct vvcam_sccb_data sccb_data;
  248. sccb_data.addr = address;
  249. sccb_data.data = value;
  250. ret = ioctl(pHalCtx->sensor_fd, VVSENSORIOC_WRITE_REG, &sccb_data);
  251. if (ret != 0) {
  252. TRACE(IMX334_ERROR, "%s: write sensor register error!\n",
  253. __func__);
  254. return (RET_FAILURE);
  255. }
  256. TRACE(IMX334_INFO, "%s (exit) result = %d\n", __func__, result);
  257. return (result);
  258. }
  259. static RESULT IMX334_IsiQuerySensorSupportIss(HalHandle_t HalHandle, vvcam_mode_info_array_t *pSensorSupportInfo)
  260. {
  261. int ret = 0;
  262. struct vvcam_mode_info_array *psensor_mode_info_arry;
  263. HalContext_t *pHalCtx = HalHandle;
  264. if ( pHalCtx == NULL ) {
  265. return RET_NULL_POINTER;
  266. }
  267. psensor_mode_info_arry = pSensorSupportInfo;
  268. psensor_mode_info_arry->count = sizeof(pIMX334_mode_info) / sizeof(struct vvcam_mode_info);
  269. memcpy(psensor_mode_info_arry->modes, pIMX334_mode_info, sizeof(pIMX334_mode_info));
  270. TRACE(IMX334_INFO, "SensorQuery:\n");
  271. TRACE(IMX334_INFO, "*********************************\n");
  272. for(int i=0; i<psensor_mode_info_arry->count; i++)
  273. {
  274. TRACE( IMX334_INFO, "Current Sensor Mode:\n");
  275. TRACE( IMX334_INFO, "Mode Index: %d \n",psensor_mode_info_arry->modes[i].index);
  276. TRACE( IMX334_INFO, "Resolution: %d * %d\n",psensor_mode_info_arry->modes[i].width,psensor_mode_info_arry->modes[i].height);
  277. TRACE( IMX334_INFO, "fps: %d \n",psensor_mode_info_arry->modes[i].fps);
  278. TRACE( IMX334_INFO, "hdr_mode: %d \n",psensor_mode_info_arry->modes[i].hdr_mode);
  279. TRACE( IMX334_INFO, "stitching_mode: %d \n",psensor_mode_info_arry->modes[i].stitching_mode);
  280. TRACE( IMX334_INFO, "bit_width: %d \n",psensor_mode_info_arry->modes[i].bit_width);
  281. TRACE( IMX334_INFO, "bayer_pattern: %d \n",psensor_mode_info_arry->modes[i].bayer_pattern);
  282. TRACE( IMX334_INFO, "---------------------------------\n");
  283. }
  284. TRACE(IMX334_INFO, "*********************************\n");
  285. return RET_SUCCESS;
  286. }
  287. static RESULT IMX334_IsiQuerySensorIss(IsiSensorHandle_t handle, vvcam_mode_info_array_t *pSensorInfo)
  288. {
  289. RESULT result = RET_SUCCESS;
  290. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  291. if (pIMX334Ctx == NULL || pIMX334Ctx->IsiCtx.HalHandle == NULL) {
  292. return RET_NULL_POINTER;
  293. }
  294. HalContext_t *pHalCtx = (HalContext_t *) pIMX334Ctx->IsiCtx.HalHandle;
  295. IMX334_IsiQuerySensorSupportIss(pHalCtx,pSensorInfo);
  296. return result;
  297. }
  298. static RESULT IMX334_IsiGetSensorModeIss(IsiSensorHandle_t handle,void *mode)
  299. {
  300. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  301. if (pIMX334Ctx == NULL) {
  302. return (RET_WRONG_HANDLE);
  303. }
  304. memcpy(mode,&(pIMX334Ctx->SensorMode), sizeof(pIMX334Ctx->SensorMode));
  305. return ( RET_SUCCESS );
  306. }
  307. static RESULT IMX334_IsiCreateSensorIss(IsiSensorInstanceConfig_t * pConfig) {
  308. RESULT result = RET_SUCCESS;
  309. IMX334_Context_t *pIMX334Ctx;
  310. TRACE(IMX334_INFO, "%s (enter)\n", __func__);
  311. if (!pConfig || !pConfig->pSensor)
  312. return (RET_NULL_POINTER);
  313. pIMX334Ctx = (IMX334_Context_t *) malloc(sizeof(IMX334_Context_t));
  314. if (!pIMX334Ctx) {
  315. TRACE(IMX334_ERROR, "%s: Can't allocate IMX334 context\n",
  316. __func__);
  317. return (RET_OUTOFMEM);
  318. }
  319. MEMSET(pIMX334Ctx, 0, sizeof(IMX334_Context_t));
  320. result = HalAddRef(pConfig->HalHandle);
  321. if (result != RET_SUCCESS) {
  322. free(pIMX334Ctx);
  323. return (result);
  324. }
  325. pIMX334Ctx->IsiCtx.HalHandle = pConfig->HalHandle;
  326. pIMX334Ctx->IsiCtx.pSensor = pConfig->pSensor;
  327. pIMX334Ctx->GroupHold = BOOL_FALSE;
  328. pIMX334Ctx->OldGain = 1.0;
  329. pIMX334Ctx->OldIntegrationTime = 0.01;
  330. pIMX334Ctx->Configured = BOOL_FALSE;
  331. pIMX334Ctx->Streaming = BOOL_FALSE;
  332. pIMX334Ctx->TestPattern = BOOL_FALSE;
  333. pIMX334Ctx->isAfpsRun = BOOL_FALSE;
  334. pIMX334Ctx->SensorMode.index = pConfig->SensorModeIndex;
  335. pConfig->hSensor = (IsiSensorHandle_t) pIMX334Ctx;
  336. #ifdef SUBDEV_CHAR
  337. struct vvcam_mode_info *SensorDefaultMode = NULL;
  338. for (int i=0; i < sizeof(pIMX334_mode_info)/ sizeof(struct vvcam_mode_info); i++)
  339. {
  340. if (pIMX334_mode_info[i].index == pIMX334Ctx->SensorMode.index)
  341. {
  342. SensorDefaultMode = &(pIMX334_mode_info[i]);
  343. break;
  344. }
  345. }
  346. if (SensorDefaultMode != NULL)
  347. {
  348. strcpy(pIMX334Ctx->SensorRegCfgFile, get_vi_config_path());
  349. switch(SensorDefaultMode->index)
  350. {
  351. case 0:
  352. strcat(pIMX334Ctx->SensorRegCfgFile,
  353. "IMX334_mipi4lane_3864_2180_raw12_800mbps_init.txt");
  354. break;
  355. /*
  356. case 1: //3Dol mode
  357. strcat(pIMX334Ctx->SensorRegCfgFile,
  358. "IMX334_mipi4lane_3840_2160_raw12_800mbps_3dol_init.txt");
  359. break;
  360. */
  361. default:
  362. break;
  363. }
  364. if (access(pIMX334Ctx->SensorRegCfgFile, F_OK) == 0) {
  365. pIMX334Ctx->KernelDriverFlag = 0;
  366. memcpy(&(pIMX334Ctx->SensorMode),SensorDefaultMode,sizeof(struct vvcam_mode_info));
  367. } else {
  368. TRACE(IMX334_ERROR, "%s, %d, load %s: error\n", __func__, __LINE__, pIMX334Ctx->SensorRegCfgFile);
  369. return -1;
  370. }
  371. }else
  372. {
  373. pIMX334Ctx->KernelDriverFlag = 1;
  374. }
  375. result = IMX334_IsiSensorSetPowerIss(pIMX334Ctx, BOOL_TRUE);
  376. RETURN_RESULT_IF_DIFFERENT(RET_SUCCESS, result);
  377. uint32_t SensorClkIn;
  378. if (pIMX334Ctx->KernelDriverFlag) {
  379. result = IMX334_IsiSensorGetClkIss(pIMX334Ctx, &SensorClkIn);
  380. RETURN_RESULT_IF_DIFFERENT(RET_SUCCESS, result);
  381. }
  382. result = IMX334_IsiSensorSetClkIss(pIMX334Ctx, SensorClkIn);
  383. RETURN_RESULT_IF_DIFFERENT(RET_SUCCESS, result);
  384. result = IMX334_IsiResetSensorIss(pIMX334Ctx);
  385. RETURN_RESULT_IF_DIFFERENT(RET_SUCCESS, result);
  386. if (!pIMX334Ctx->KernelDriverFlag) {
  387. result = IMX334_IsiConfigSensorSCCBIss(pIMX334Ctx);
  388. RETURN_RESULT_IF_DIFFERENT(RET_SUCCESS, result);
  389. }
  390. pIMX334Ctx->pattern = 3;
  391. #endif
  392. #ifdef SUBDEV_V4L2
  393. pIMX334Ctx->pattern = 3;
  394. pIMX334Ctx->subdev = HalGetFdHandle(pConfig->HalHandle, HAL_MODULE_SENSOR);
  395. pIMX334Ctx->KernelDriverFlag = 1;
  396. #endif
  397. TRACE(IMX334_INFO, "%s (exit)\n", __func__);
  398. return (result);
  399. }
  400. static RESULT IMX334_IsiGetRegCfgIss(const char *registerFileName,
  401. struct vvcam_sccb_array *arry)
  402. {
  403. if (NULL == registerFileName) {
  404. TRACE(IMX334_ERROR, "%s:registerFileName is NULL\n", __func__);
  405. return (RET_NULL_POINTER);
  406. }
  407. #ifdef SUBDEV_CHAR
  408. FILE *fp = NULL;
  409. fp = fopen(registerFileName, "rb");
  410. if (!fp) {
  411. TRACE(IMX334_ERROR, "%s:load register file %s error!\n",
  412. __func__, registerFileName);
  413. return (RET_FAILURE);
  414. }
  415. char LineBuf[512];
  416. uint32_t FileTotalLine = 0;
  417. while (!feof(fp)) {
  418. fgets(LineBuf, 512, fp);
  419. FileTotalLine++;
  420. }
  421. arry->sccb_data =
  422. malloc(FileTotalLine * sizeof(struct vvcam_sccb_data));
  423. if (arry->sccb_data == NULL) {
  424. TRACE(IMX334_ERROR, "%s:malloc failed NULL Point!\n", __func__,
  425. registerFileName);
  426. return (RET_FAILURE);
  427. }
  428. rewind(fp);
  429. arry->count = 0;
  430. while (!feof(fp)) {
  431. memset(LineBuf, 0, sizeof(LineBuf));
  432. fgets(LineBuf, 512, fp);
  433. int result =
  434. sscanf(LineBuf, "0x%x 0x%x",
  435. &(arry->sccb_data[arry->count].addr),
  436. &(arry->sccb_data[arry->count].data));
  437. if (result != 2)
  438. continue;
  439. arry->count++;
  440. }
  441. #endif
  442. return 0;
  443. }
  444. #if 0
  445. static RESULT IMX334_IsiGetPicSize(uint32_t Resolution, uint32_t * pwidth,
  446. uint32_t * pheight)
  447. {
  448. switch (Resolution) {
  449. case ISI_RES_TV1080P:
  450. {
  451. *pwidth = 1920;
  452. *pheight = 1080;
  453. break;
  454. }
  455. case ISI_RES_TV720P:
  456. {
  457. *pwidth = 1280;
  458. *pheight = 720;
  459. break;
  460. }
  461. default:
  462. {
  463. return (RET_NOTSUPP);
  464. }
  465. }
  466. return (RET_SUCCESS);
  467. }
  468. #endif
  469. static RESULT IMX334_IsiInitSensorIss(IsiSensorHandle_t handle) {
  470. RESULT result = RET_SUCCESS;
  471. int ret = 0;
  472. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  473. HalContext_t *pHalCtx = (HalContext_t *) pIMX334Ctx->IsiCtx.HalHandle;
  474. TRACE(IMX334_INFO, "%s (enter)\n", __func__);
  475. if (pIMX334Ctx == NULL) {
  476. return (RET_WRONG_HANDLE);
  477. }
  478. if (pIMX334Ctx->KernelDriverFlag) {
  479. #ifdef SUBDEV_CHAR
  480. ret = ioctl(pHalCtx->sensor_fd, VVSENSORIOC_S_INIT, &(pIMX334Ctx->SensorMode));
  481. if (ret != 0) {
  482. TRACE(IMX334_ERROR, "%s:sensor init error!\n",
  483. __func__);
  484. return (RET_FAILURE);
  485. }
  486. ret = ioctl(pHalCtx->sensor_fd, VVSENSORIOC_G_SENSOR_MODE, &(pIMX334Ctx->SensorMode));
  487. if (ret != 0) {
  488. TRACE(IMX334_ERROR, "%s:sensor get mode info error!\n",
  489. __func__);
  490. return (RET_FAILURE);
  491. }
  492. struct vvcam_ae_info_s ae_info;
  493. ret = ioctl(pHalCtx->sensor_fd, VVSENSORIOC_G_AE_INFO, &ae_info);
  494. if (ret != 0) {
  495. TRACE(IMX334_ERROR, "%s:sensor get ae info error!\n",
  496. __func__);
  497. return (RET_FAILURE);
  498. }
  499. pIMX334Ctx->one_line_exp_time = IMX334_HMAX/IMX334_PLL_PCLK;
  500. pIMX334Ctx->MaxIntegrationLine = ae_info.max_integration_time;
  501. pIMX334Ctx->MinIntegrationLine = ae_info.min_integration_time;
  502. pIMX334Ctx->gain_accuracy = ae_info.gain_accuracy;
  503. pIMX334Ctx->AecMinGain = 1.0;
  504. pIMX334Ctx->AecMaxGain = 36;
  505. pIMX334Ctx->MaxFps = pIMX334Ctx->SensorMode.fps;
  506. pIMX334Ctx->MinFps = 1;
  507. pIMX334Ctx->CurrFps = pIMX334Ctx->MaxFps;
  508. #endif
  509. #ifdef SUBDEV_V4L2
  510. ret = ioctl(pHalCtx->sensor_fd, VVSENSORIOC_G_SENSOR_MODE, &(pIMX334Ctx->SensorMode));
  511. if (ret != 0) {
  512. TRACE(IMX334_ERROR, "%s:sensor get mode info error!\n",
  513. __func__);
  514. return (RET_FAILURE);
  515. }
  516. pIMX334Ctx->one_line_exp_time = IMX334_HMAX/IMX334_PLL_PCLK;
  517. pIMX334Ctx->FrameLengthLines = 0xac4;
  518. pIMX334Ctx->CurFrameLengthLines = pIMX334Ctx->FrameLengthLines;
  519. pIMX334Ctx->MaxIntegrationLine = pIMX334Ctx->CurFrameLengthLines - 3;
  520. pIMX334Ctx->MinIntegrationLine = 1;
  521. pIMX334Ctx->AecMaxGain = 24;
  522. pIMX334Ctx->AecMinGain = 3;
  523. pIMX334Ctx->CurrFps = pIMX334Ctx->MaxFps;
  524. pIMX334Ctx->gain_accuracy = 1024;
  525. if (pIMX334Ctx->SensorMode.hdr_mode != SENSOR_MODE_LINEAR)
  526. {
  527. pIMX334Ctx->enableHdr = 1;
  528. }
  529. #endif
  530. } else {
  531. struct vvcam_sccb_array arry;
  532. result = IMX334_IsiGetRegCfgIss(pIMX334Ctx->SensorRegCfgFile, &arry);
  533. if (result != 0) {
  534. TRACE(IMX334_ERROR,
  535. "%s:IMX334_IsiGetRegCfgIss error!\n", __func__);
  536. return (RET_FAILURE);
  537. }
  538. ret = ioctl(pHalCtx->sensor_fd, VVSENSORIOC_WRITE_ARRAY, &arry);
  539. if (ret != 0) {
  540. TRACE(IMX334_ERROR, "%s:Sensor Write Reg arry error!\n",
  541. __func__);
  542. return (RET_FAILURE);
  543. }
  544. switch(pIMX334Ctx->SensorMode.index)
  545. {
  546. case 0:
  547. pIMX334Ctx->one_line_exp_time = IMX334_HMAX/IMX334_PLL_PCLK;
  548. pIMX334Ctx->FrameLengthLines = 0xac4;
  549. pIMX334Ctx->CurFrameLengthLines = pIMX334Ctx->FrameLengthLines;
  550. pIMX334Ctx->MaxIntegrationLine = pIMX334Ctx->CurFrameLengthLines - 3;
  551. pIMX334Ctx->MinIntegrationLine = 1;
  552. pIMX334Ctx->AecMaxGain = 24;
  553. pIMX334Ctx->AecMinGain = 3;
  554. break;
  555. case 1:
  556. pIMX334Ctx->one_line_exp_time = IMX334_HMAX/IMX334_PLL_PCLK;
  557. pIMX334Ctx->FrameLengthLines = 0xac4;
  558. pIMX334Ctx->CurFrameLengthLines = pIMX334Ctx->FrameLengthLines;
  559. pIMX334Ctx->MaxIntegrationLine = pIMX334Ctx->CurFrameLengthLines - 3;
  560. pIMX334Ctx->MinIntegrationLine = 1;
  561. pIMX334Ctx->AecMaxGain = 21;
  562. pIMX334Ctx->AecMinGain = 3;
  563. break;
  564. default:
  565. return ( RET_NOTAVAILABLE );
  566. break;
  567. }
  568. pIMX334Ctx->MaxFps = pIMX334Ctx->SensorMode.fps;
  569. pIMX334Ctx->MinFps = 1;
  570. pIMX334Ctx->CurrFps = pIMX334Ctx->MaxFps;
  571. }
  572. TRACE(IMX334_INFO, "%s (exit)\n", __func__);
  573. return (result);
  574. }
  575. static RESULT IMX334_IsiReleaseSensorIss(IsiSensorHandle_t handle) {
  576. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  577. RESULT result = RET_SUCCESS;
  578. TRACE(IMX334_INFO, "%s (enter)\n", __func__);
  579. if (pIMX334Ctx == NULL)
  580. return (RET_WRONG_HANDLE);
  581. (void)IMX334_IsiSensorSetStreamingIss(pIMX334Ctx, BOOL_FALSE);
  582. (void)IMX334_IsiSensorSetPowerIss(pIMX334Ctx, BOOL_FALSE);
  583. (void)HalDelRef(pIMX334Ctx->IsiCtx.HalHandle);
  584. MEMSET(pIMX334Ctx, 0, sizeof(IMX334_Context_t));
  585. free(pIMX334Ctx);
  586. TRACE(IMX334_INFO, "%s (exit)\n", __func__);
  587. return (result);
  588. }
  589. static RESULT IMX334_IsiGetCapsIss
  590. (IsiSensorHandle_t handle, IsiSensorCaps_t * pIsiSensorCaps) {
  591. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  592. RESULT result = RET_SUCCESS;
  593. TRACE(IMX334_INFO, "%s (enter)\n", __func__);
  594. if (pIMX334Ctx == NULL)
  595. return (RET_WRONG_HANDLE);
  596. if (pIsiSensorCaps == NULL) {
  597. return (RET_NULL_POINTER);
  598. } else {
  599. pIsiSensorCaps->BusWidth = 12;//ISI_BUSWIDTH_12BIT;
  600. pIsiSensorCaps->Mode = ISI_MODE_BAYER;
  601. pIsiSensorCaps->FieldSelection = ISI_FIELDSEL_BOTH;
  602. pIsiSensorCaps->YCSequence = ISI_YCSEQ_YCBYCR; // ISI_YCSEQ_YCRYCB;//ISI_YCSEQ_YCBYCR; /**< only Bayer supported, will not be evaluated */
  603. pIsiSensorCaps->Conv422 = ISI_CONV422_NOCOSITED; //ISI_CONV422_INTER;//ISI_CONV422_NOCOSITED;
  604. pIsiSensorCaps->BPat = pIMX334Ctx->pattern;
  605. pIsiSensorCaps->HPol = ISI_HPOL_REFPOS;
  606. pIsiSensorCaps->VPol = ISI_VPOL_NEG; //ISI_VPOL_POS;//ISI_VPOL_NEG;
  607. pIsiSensorCaps->Edge = ISI_EDGE_RISING; //ISI_EDGE_FALLING;//ISI_EDGE_RISING;
  608. //pIsiSensorCaps->Bls = ISI_BLS_OFF;
  609. //pIsiSensorCaps->Gamma = ISI_GAMMA_OFF;
  610. //pIsiSensorCaps->CConv = ISI_CCONV_OFF;
  611. pIsiSensorCaps->Resolution = pIMX334Ctx->Resolution; //( ISI_RES_TV1080P24 | ISI_RES_TV1080P20 | ISI_RES_TV1080P15 | ISI_RES_TV1080P6
  612. //pIsiSensorCaps->BLC = (ISI_BLC_AUTO | ISI_BLC_OFF);
  613. //pIsiSensorCaps->AGC = ISI_AGC_OFF; // ( ISI_AGC_AUTO | ISI_AGC_OFF );
  614. //pIsiSensorCaps->AWB = ISI_AWB_OFF; // ( ISI_AWB_AUTO | ISI_AWB_OFF );
  615. //pIsiSensorCaps->AEC = (ISI_AEC_OFF); // ISI_AEC_AUTO | ISI_AEC_OFF );
  616. //pIsiSensorCaps->DPCC = (ISI_DPCC_AUTO | ISI_DPCC_OFF);
  617. //pIsiSensorCaps->DwnSz = ISI_DWNSZ_SUBSMPL;
  618. /*
  619. pIsiSensorCaps->CieProfile = (ISI_CIEPROF_A
  620. | ISI_CIEPROF_D50
  621. | ISI_CIEPROF_D65
  622. | ISI_CIEPROF_D75
  623. | ISI_CIEPROF_F2
  624. | ISI_CIEPROF_F11);
  625. */
  626. pIsiSensorCaps->SmiaMode = ISI_SMIA_OFF;
  627. pIsiSensorCaps->MipiMode = ISI_MIPI_OFF; //= ISI_MIPI_MODE_RAW_10;
  628. pIsiSensorCaps->MipiLanes = ISI_MIPI_4LANES;
  629. //pIsiSensorCaps->AfpsResolutions = ISI_AFPS_NOTSUPP; //(ISI_RES_TV1080P15); //ISI_AFPS_NOTSUPP; //( ISI_RES_TV1080P24 | ISI_RES_TV1080P20 | ISI_RES_TV1080P15 | ISI_RES_TV1080P6);
  630. //pIsiSensorCaps->enableHdr = pIMX334Ctx->enableHdr;
  631. }
  632. TRACE(IMX334_INFO, "%s (exit)\n", __func__);
  633. return (result);
  634. }
  635. /*
  636. const IsiSensorCaps_t IMX334_g_IsiSensorDefaultConfig = {
  637. ISI_BUSWIDTH_12BIT, // BusWidth
  638. ISI_MODE_BAYER, // Mode
  639. ISI_FIELDSEL_BOTH, // FieldSel
  640. ISI_YCSEQ_YCBYCR, //ISI_YCSEQ_YCRYCB, //ISI_YCSEQ_YCBYCR, // YCSeq
  641. ISI_CONV422_NOCOSITED, //ISI_CONV422_INTER, //ISI_CONV422_NOCOSITED, // Conv422
  642. ISI_BPAT_BGBGGRGR,
  643. ISI_HPOL_REFPOS, // HPol
  644. ISI_VPOL_NEG, //ISI_VPOL_POS, //ISI_VPOL_NEG, // VPol
  645. ISI_EDGE_RISING, //ISI_EDGE_FALLING, //ISI_EDGE_RISING, // Edge
  646. ISI_BLS_OFF, // Bls
  647. ISI_GAMMA_OFF, // Gamma
  648. ISI_CCONV_OFF, // CConv
  649. ISI_RES_TV1080P, //ISI_RES_TV1080P24, // Res
  650. ISI_DWNSZ_SUBSMPL, // DwnSz
  651. ISI_BLC_AUTO, // BLC
  652. ISI_AGC_OFF, //ISI_AGC_OFF, // AGC
  653. ISI_AWB_OFF, //ISI_AWB_OFF, // AWB
  654. ISI_AEC_OFF, //ISI_AEC_OFF, // AEC
  655. ISI_DPCC_OFF, // DPCC
  656. ISI_CIEPROF_F11, // CieProfile, this is also used as start profile for AWB (if not altered by menu settings)
  657. ISI_SMIA_OFF, // SmiaMode
  658. ISI_MIPI_OFF, //ISI_MIPI_MODE_RAW_10, // MipiMode
  659. ISI_MIPI_4LANES,
  660. ISI_AFPS_NOTSUPP, //ISI_RES_TV1080P15, // ISI_AFPS_NOTSUPP(ISI_AFPS_NOTSUPP | ISI_RES_TV1080P6)
  661. //( ISI_AFPS_NOTSUPP | ISI_RES_TV1080P24 | ISI_RES_TV1080P20 | ISI_RES_TV1080P15 ) // AfpsResolutions
  662. 0,
  663. };
  664. */
  665. static RESULT IMX334_AecSetModeParameters
  666. (IMX334_Context_t * pIMX334Ctx, const IsiSensorConfig_t * pConfig) {
  667. RESULT result = RET_SUCCESS;
  668. TRACE(IMX334_INFO, "%s%s: (enter)\n", __func__,
  669. pIMX334Ctx->isAfpsRun ? "(AFPS)" : "");
  670. pIMX334Ctx->AecIntegrationTimeIncrement = pIMX334Ctx->one_line_exp_time;
  671. pIMX334Ctx->AecMinIntegrationTime = 0.001;
  672. pIMX334Ctx->AecMaxIntegrationTime = 0.033;
  673. TRACE(IMX334_DEBUG, "%s%s: AecMaxIntegrationTime = %f \n", __func__,
  674. pIMX334Ctx->isAfpsRun ? "(AFPS)" : "",
  675. pIMX334Ctx->AecMaxIntegrationTime);
  676. pIMX334Ctx->AecGainIncrement = IMX334_MIN_GAIN_STEP;
  677. //reflects the state of the sensor registers, must equal default settings
  678. pIMX334Ctx->AecCurGain = pIMX334Ctx->AecMinGain;
  679. pIMX334Ctx->AecCurIntegrationTime = 0.0f;
  680. pIMX334Ctx->OldGain = 0;
  681. pIMX334Ctx->OldIntegrationTime = 0;
  682. TRACE(IMX334_INFO, "%s%s: (exit)\n", __func__,
  683. pIMX334Ctx->isAfpsRun ? "(AFPS)" : "");
  684. return (result);
  685. }
  686. #ifdef SUBDEV_V4L2
  687. RESULT IMX334_Private_SetFormat(IsiSensorHandle_t handle, int width, int height, bool hdrEnable)
  688. {
  689. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  690. TRACE(IMX334_INFO, "%s: %d %d %d\n", __func__, width, height, hdrEnable);
  691. ioctl(pIMX334Ctx->subdev, VVSENSORIOC_S_HDR_MODE, &hdrEnable);
  692. struct v4l2_subdev_format format;
  693. format.format.width = width;
  694. format.format.height = height;
  695. format.which = V4L2_SUBDEV_FORMAT_ACTIVE;
  696. format.pad = 0;
  697. int rc = ioctl(pIMX334Ctx->subdev, VIDIOC_SUBDEV_S_FMT, &format);
  698. return rc == 0 ? RET_SUCCESS : RET_FAILURE;
  699. }
  700. #endif
  701. static RESULT IMX334_IsiSetupSensorIss
  702. (IsiSensorHandle_t handle, const IsiSensorConfig_t * pConfig) {
  703. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  704. RESULT result = RET_SUCCESS;
  705. TRACE(IMX334_INFO, "%s (enter)\n", __func__);
  706. if (!pIMX334Ctx) {
  707. TRACE(IMX334_ERROR,
  708. "%s: Invalid sensor handle (NULL pointer detected)\n",
  709. __func__);
  710. return (RET_WRONG_HANDLE);
  711. }
  712. if (!pConfig) {
  713. TRACE(IMX334_ERROR,
  714. "%s: Invalid configuration (NULL pointer detected)\n",
  715. __func__);
  716. return (RET_NULL_POINTER);
  717. }
  718. if (pIMX334Ctx->Streaming != BOOL_FALSE) {
  719. return RET_WRONG_STATE;
  720. }
  721. memcpy(&pIMX334Ctx->Config, pConfig, sizeof(IsiSensorConfig_t));
  722. /* 1.) SW reset of image sensor (via I2C register interface) be careful, bits 6..0 are reserved, reset bit is not sticky */
  723. TRACE(IMX334_DEBUG, "%s: IMX334 System-Reset executed\n", __func__);
  724. osSleep(100);
  725. result = IMX334_AecSetModeParameters(pIMX334Ctx, pConfig);
  726. if (result != RET_SUCCESS) {
  727. TRACE(IMX334_ERROR, "%s: SetupOutputWindow failed.\n",
  728. __func__);
  729. return (result);
  730. }
  731. #ifdef SUBDEV_V4L2
  732. IMX334_Private_SetFormat(pIMX334Ctx,
  733. pIMX334Ctx->SensorMode.width,
  734. pIMX334Ctx->SensorMode.height,
  735. pIMX334Ctx->SensorMode.hdr_mode);
  736. #endif
  737. pIMX334Ctx->Configured = BOOL_TRUE;
  738. TRACE(IMX334_INFO, "%s: (exit)\n", __func__);
  739. return 0;
  740. }
  741. /*
  742. static RESULT IMX334_IsiGetSupportResolutionIss
  743. (IsiSensorHandle_t handle, IsiResolutionArry_t * pResolutinArry) {
  744. RESULT result = RET_SUCCESS;
  745. TRACE(IMX334_INFO, "%s (enter)\n", __func__);
  746. if (handle == NULL) {
  747. TRACE(IMX334_ERROR,
  748. "%s: Invalid sensor handle (NULL pointer detected)\n",
  749. __func__);
  750. return (RET_WRONG_HANDLE);
  751. }
  752. pResolutinArry->count =
  753. sizeof(SensorDrvSupportResoluton) / sizeof(uint32_t);
  754. memcpy(pResolutinArry->ResolutionArry, SensorDrvSupportResoluton,
  755. sizeof(SensorDrvSupportResoluton));
  756. TRACE(IMX334_INFO, "%s: (exit)\n", __func__);
  757. return (result);
  758. }
  759. static RESULT IMX334_IsiChangeSensorResolutionIss
  760. (IsiSensorHandle_t handle,
  761. uint32_t Resolution, uint8_t * pNumberOfFramesToSkip) {
  762. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  763. RESULT result = RET_SUCCESS;
  764. float hdr_ratio[2] = { 1.0f, 1.0f };
  765. TRACE(IMX334_INFO, "%s (enter)\n", __func__);
  766. if (!pIMX334Ctx)
  767. return (RET_WRONG_HANDLE);
  768. if (!pNumberOfFramesToSkip)
  769. return (RET_NULL_POINTER);
  770. if ((pIMX334Ctx->Configured != BOOL_TRUE)
  771. || (pIMX334Ctx->Streaming != BOOL_FALSE))
  772. return RET_WRONG_STATE;
  773. IsiSensorCaps_t Caps;
  774. result = IMX334_IsiGetCapsIss(handle, &Caps);
  775. if (RET_SUCCESS != result)
  776. return result;
  777. if ((Resolution & Caps.Resolution) == 0)
  778. return RET_OUTOFRANGE;
  779. if (Resolution == pIMX334Ctx->Config.Resolution) {
  780. // well, no need to worry
  781. *pNumberOfFramesToSkip = 0;
  782. } else {
  783. // change resolution
  784. char *szResName = NULL;
  785. result = IsiGetResolutionName(Resolution, &szResName);
  786. TRACE(IMX334_DEBUG, "%s: NewRes=0x%08x (%s)\n", __func__,
  787. Resolution, szResName);
  788. // update resolution in copy of config in context
  789. pIMX334Ctx->Config.Resolution = Resolution;
  790. // tell sensor about that
  791. // remember old exposure values
  792. float OldGain = pIMX334Ctx->AecCurGain;
  793. float OldIntegrationTime = pIMX334Ctx->AecCurIntegrationTime;
  794. // update limits & stuff (reset current & old settings)
  795. result =
  796. IMX334_AecSetModeParameters(pIMX334Ctx,
  797. &pIMX334Ctx->Config);
  798. if (result != RET_SUCCESS) {
  799. TRACE(IMX334_ERROR,
  800. "%s: AecSetModeParameters failed.\n", __func__);
  801. return (result);
  802. }
  803. // restore old exposure values (at least within new exposure values' limits)
  804. uint8_t NumberOfFramesToSkip;
  805. float DummySetGain;
  806. float DummySetIntegrationTime;
  807. result = IMX334_IsiExposureControlIss(handle, OldGain,
  808. OldIntegrationTime,
  809. &NumberOfFramesToSkip,
  810. &DummySetGain,
  811. &DummySetIntegrationTime,
  812. hdr_ratio);
  813. if (result != RET_SUCCESS) {
  814. TRACE(IMX334_ERROR,
  815. "%s: IMX334_IsiExposureControlIss failed.\n",
  816. __func__);
  817. return (result);
  818. }
  819. // return number of frames that aren't exposed correctly
  820. *pNumberOfFramesToSkip = NumberOfFramesToSkip + 1;
  821. }
  822. TRACE(IMX334_INFO, "%s (exit)\n", __func__);
  823. return (result);
  824. }
  825. */
  826. static RESULT IMX334_IsiChangeSensorResolutionIss(IsiSensorHandle_t handle, uint16_t width, uint16_t height)
  827. {
  828. RESULT result = RET_SUCCESS;
  829. return (result);
  830. #if 0
  831. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  832. RESULT result = RET_SUCCESS;
  833. float hdr_ratio[2] = { 1.0f, 1.0f };
  834. TRACE(IMX334_INFO, "%s (enter)\n", __func__);
  835. if (!pIMX334Ctx)
  836. return (RET_WRONG_HANDLE);
  837. if ((pIMX334Ctx->Configured != BOOL_TRUE)
  838. || (pIMX334Ctx->Streaming != BOOL_FALSE))
  839. return RET_WRONG_STATE;
  840. IsiSensorCaps_t Caps;
  841. result = IMX334_IsiGetCapsIss(handle, &Caps);
  842. if (RET_SUCCESS != result)
  843. return result;
  844. if (Caps.Resolution.width != width || Caps.Resolution.height != height)
  845. return RET_OUTOFRANGE;
  846. if (width == pIMX334Ctx->Config.Resolution.width
  847. && height == pIMX334Ctx->Config.Resolution.height) {
  848. // well, no need to worry
  849. } else {
  850. // change resolution
  851. char *szResName = NULL;
  852. result = IsiGetResolutionName(Resolution, &szResName);
  853. TRACE(IMX334_DEBUG, "%s: NewRes=0x%08x (%s)\n", __func__,
  854. Resolution, szResName);
  855. // update resolution in copy of config in context
  856. pIMX334Ctx->Config.Resolution = Resolution;
  857. // tell sensor about that
  858. // remember old exposure values
  859. float OldGain = pIMX334Ctx->AecCurGain;
  860. float OldIntegrationTime = pIMX334Ctx->AecCurIntegrationTime;
  861. // update limits & stuff (reset current & old settings)
  862. result =
  863. IMX334_AecSetModeParameters(pIMX334Ctx,
  864. &pIMX334Ctx->Config);
  865. if (result != RET_SUCCESS) {
  866. TRACE(IMX334_ERROR,
  867. "%s: AecSetModeParameters failed.\n", __func__);
  868. return (result);
  869. }
  870. // restore old exposure values (at least within new exposure values' limits)
  871. uint8_t NumberOfFramesToSkip;
  872. float DummySetGain;
  873. float DummySetIntegrationTime;
  874. result = IMX334_IsiExposureControlIss(handle, OldGain,
  875. OldIntegrationTime,
  876. &NumberOfFramesToSkip,
  877. &DummySetGain,
  878. &DummySetIntegrationTime,
  879. hdr_ratio);
  880. if (result != RET_SUCCESS) {
  881. TRACE(IMX334_ERROR,
  882. "%s: IMX334_IsiExposureControlIss failed.\n",
  883. __func__);
  884. return (result);
  885. }
  886. // return number of frames that aren't exposed correctly
  887. *pNumberOfFramesToSkip = NumberOfFramesToSkip + 1;
  888. }
  889. TRACE(IMX334_INFO, "%s (exit)\n", __func__);
  890. return (result);
  891. #endif
  892. }
  893. static RESULT IMX334_IsiSensorSetStreamingIss
  894. (IsiSensorHandle_t handle, bool_t on) {
  895. RESULT result = RET_SUCCESS;
  896. int ret = 0;
  897. TRACE(IMX334_INFO, "%s (enter)\n", __func__);
  898. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  899. if (pIMX334Ctx == NULL || pIMX334Ctx->IsiCtx.HalHandle == NULL) {
  900. return RET_NULL_POINTER;
  901. }
  902. HalContext_t *pHalCtx = (HalContext_t *) pIMX334Ctx->IsiCtx.HalHandle;
  903. if (pIMX334Ctx->Configured != BOOL_TRUE)
  904. return RET_WRONG_STATE;
  905. if (on) {
  906. ret |= IMX334_IsiRegisterWriteIss(handle, 0x3000, 0x00);
  907. ret |= IMX334_IsiRegisterWriteIss(handle, 0x3002, 0x00);
  908. } else {
  909. ret |= IMX334_IsiRegisterWriteIss(handle, 0x3000, 0x01);
  910. ret |= IMX334_IsiRegisterWriteIss(handle, 0x3002, 0x01);
  911. }
  912. if (ret != 0) {
  913. return (RET_FAILURE);
  914. }
  915. pIMX334Ctx->Streaming = on;
  916. TRACE(IMX334_INFO, "%s (exit)\n", __func__);
  917. return (result);
  918. }
  919. static RESULT IMX334_IsiCheckSensorConnectionIss(IsiSensorHandle_t handle) {
  920. RESULT result = RET_SUCCESS;
  921. int ret = 0;
  922. uint32_t correct_id = 0x9012;
  923. uint32_t sensor_id = 0;
  924. TRACE(IMX334_INFO, "%s (enter)\n", __func__);
  925. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  926. if (pIMX334Ctx == NULL || pIMX334Ctx->IsiCtx.HalHandle == NULL) {
  927. return RET_NULL_POINTER;
  928. }
  929. HalContext_t *pHalCtx = (HalContext_t *) pIMX334Ctx->IsiCtx.HalHandle;
  930. if (pIMX334Ctx->KernelDriverFlag) {
  931. ret = ioctl(pHalCtx->sensor_fd, VVSENSORIOC_G_RESERVE_ID,
  932. &correct_id);
  933. if (ret != 0) {
  934. TRACE(IMX334_ERROR,
  935. "%s: Read Sensor correct ID Error! \n", __func__);
  936. return (RET_FAILURE);
  937. }
  938. ret = ioctl(pHalCtx->sensor_fd, VVSENSORIOC_G_CHIP_ID,
  939. &sensor_id);
  940. if (ret != 0) {
  941. TRACE(IMX334_ERROR,
  942. "%s: Read Sensor chip ID Error! \n", __func__);
  943. return (RET_FAILURE);
  944. }
  945. } else {
  946. result = IMX334_IsiGetSensorRevisionIss(handle, &sensor_id);
  947. if (result != RET_SUCCESS) {
  948. TRACE(IMX334_ERROR, "%s: Read Sensor ID Error! \n",
  949. __func__);
  950. return (RET_FAILURE);
  951. }
  952. }
  953. if (correct_id != sensor_id) {
  954. TRACE(IMX334_ERROR, "%s:ChipID =0x%x sensor_id=%x error! \n",
  955. __func__, correct_id, sensor_id);
  956. return (RET_FAILURE);
  957. }
  958. TRACE(IMX334_INFO,
  959. "%s ChipID = 0x%08x, sensor_id = 0x%08x, success! \n", __func__,
  960. correct_id, sensor_id);
  961. TRACE(IMX334_INFO, "%s (exit)\n", __func__);
  962. return (result);
  963. }
  964. static RESULT IMX334_IsiGetSensorRevisionIss
  965. (IsiSensorHandle_t handle, uint32_t * p_value) {
  966. RESULT result = RET_SUCCESS;
  967. int ret = 0;
  968. uint32_t reg_val;
  969. uint32_t sensor_id;
  970. TRACE(IMX334_INFO, "%s (enter)\n", __func__);
  971. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  972. if (pIMX334Ctx == NULL || pIMX334Ctx->IsiCtx.HalHandle == NULL) {
  973. return RET_NULL_POINTER;
  974. }
  975. HalContext_t *pHalCtx = (HalContext_t *) pIMX334Ctx->IsiCtx.HalHandle;
  976. if (!p_value)
  977. return (RET_NULL_POINTER);
  978. if (pIMX334Ctx->KernelDriverFlag) {
  979. ret = ioctl(pHalCtx->sensor_fd, VVSENSORIOC_G_CHIP_ID,
  980. &sensor_id);
  981. if (ret != 0) {
  982. TRACE(IMX334_ERROR, "%s: Read Sensor ID Error! \n",
  983. __func__);
  984. return (RET_FAILURE);
  985. }
  986. } else {
  987. reg_val = 0;
  988. result = IMX334_IsiRegisterReadIss(handle, 0x3a04, &reg_val);
  989. sensor_id = (reg_val & 0xff) << 8;
  990. reg_val = 0;
  991. result |= IMX334_IsiRegisterReadIss(handle, 0x3a05, &reg_val);
  992. sensor_id |= (reg_val & 0xff);
  993. }
  994. *p_value = sensor_id;
  995. TRACE(IMX334_INFO, "%s (exit)\n", __func__);
  996. return (result);
  997. }
  998. static RESULT IMX334_IsiGetGainLimitsIss
  999. (IsiSensorHandle_t handle, float *pMinGain, float *pMaxGain) {
  1000. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1001. RESULT result = RET_SUCCESS;
  1002. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1003. if (pIMX334Ctx == NULL) {
  1004. TRACE(IMX334_ERROR,
  1005. "%s: Invalid sensor handle (NULL pointer detected)\n",
  1006. __func__);
  1007. return (RET_WRONG_HANDLE);
  1008. }
  1009. if ((pMinGain == NULL) || (pMaxGain == NULL)) {
  1010. TRACE(IMX334_ERROR, "%s: NULL pointer received!!\n");
  1011. return (RET_NULL_POINTER);
  1012. }
  1013. *pMinGain = pIMX334Ctx->AecMinGain;
  1014. *pMaxGain = pIMX334Ctx->AecMaxGain;
  1015. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1016. return (result);
  1017. }
  1018. static RESULT IMX334_IsiGetIntegrationTimeLimitsIss
  1019. (IsiSensorHandle_t handle,
  1020. float *pMinIntegrationTime, float *pMaxIntegrationTime) {
  1021. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1022. RESULT result = RET_SUCCESS;
  1023. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1024. if (pIMX334Ctx == NULL) {
  1025. TRACE(IMX334_ERROR,
  1026. "%s: Invalid sensor handle (NULL pointer detected)\n",
  1027. __func__);
  1028. return (RET_WRONG_HANDLE);
  1029. }
  1030. if ((pMinIntegrationTime == NULL) || (pMaxIntegrationTime == NULL)) {
  1031. TRACE(IMX334_ERROR, "%s: NULL pointer received!!\n");
  1032. return (RET_NULL_POINTER);
  1033. }
  1034. *pMinIntegrationTime = pIMX334Ctx->AecMinIntegrationTime;
  1035. *pMaxIntegrationTime = pIMX334Ctx->AecMaxIntegrationTime;
  1036. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1037. return (result);
  1038. }
  1039. RESULT IMX334_IsiGetGainIss(IsiSensorHandle_t handle, float *pSetGain) {
  1040. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1041. RESULT result = RET_SUCCESS;
  1042. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1043. if (pIMX334Ctx == NULL) {
  1044. TRACE(IMX334_ERROR,
  1045. "%s: Invalid sensor handle (NULL pointer detected)\n",
  1046. __func__);
  1047. return (RET_WRONG_HANDLE);
  1048. }
  1049. if (pSetGain == NULL) {
  1050. return (RET_NULL_POINTER);
  1051. }
  1052. *pSetGain = pIMX334Ctx->AecCurGain;
  1053. TRACE(IMX334_INFO, "%s: (exit)\n", __func__);
  1054. return (result);
  1055. }
  1056. RESULT IMX334_IsiGetSEF1GainIss(IsiSensorHandle_t handle, float *pSetGain) {
  1057. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1058. RESULT result = RET_SUCCESS;
  1059. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1060. if (pIMX334Ctx == NULL) {
  1061. TRACE(IMX334_ERROR,
  1062. "%s: Invalid sensor handle (NULL pointer detected)\n",
  1063. __func__);
  1064. return (RET_WRONG_HANDLE);
  1065. }
  1066. if (pSetGain == NULL) {
  1067. return (RET_NULL_POINTER);
  1068. }
  1069. *pSetGain = pIMX334Ctx->AecCurGainSEF1;
  1070. TRACE(IMX334_INFO, "%s: (exit)\n", __func__);
  1071. return (result);
  1072. }
  1073. RESULT IMX334_IsiGetGainIncrementIss(IsiSensorHandle_t handle, float *pIncr) {
  1074. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1075. RESULT result = RET_SUCCESS;
  1076. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1077. if (pIMX334Ctx == NULL) {
  1078. TRACE(IMX334_ERROR,
  1079. "%s: Invalid sensor handle (NULL pointer detected)\n",
  1080. __func__);
  1081. return (RET_WRONG_HANDLE);
  1082. }
  1083. if (pIncr == NULL)
  1084. return (RET_NULL_POINTER);
  1085. *pIncr = pIMX334Ctx->AecGainIncrement;
  1086. TRACE(IMX334_INFO, "%s: (exit)\n", __func__);
  1087. return (result);
  1088. }
  1089. RESULT IMX334_IsiSetGainIss
  1090. (IsiSensorHandle_t handle,
  1091. float NewGain, float *pSetGain, float *hdr_ratio) {
  1092. RESULT result = RET_SUCCESS;
  1093. return result;
  1094. int32_t ret = 0;
  1095. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1096. if (pIMX334Ctx == NULL || pIMX334Ctx->IsiCtx.HalHandle == NULL) {
  1097. return RET_NULL_POINTER;
  1098. }
  1099. HalContext_t *pHalCtx = (HalContext_t *) pIMX334Ctx->IsiCtx.HalHandle;
  1100. if (pIMX334Ctx->KernelDriverFlag) {
  1101. uint32_t SensorGain = 0;
  1102. SensorGain = NewGain * pIMX334Ctx->gain_accuracy;
  1103. #ifdef SUBDEV_CHAR
  1104. if (pIMX334Ctx->enableHdr == true) {
  1105. uint32_t SensorHdrRatio = (uint32_t)*hdr_ratio;
  1106. ret = ioctl(pHalCtx->sensor_fd, VVSENSORIOC_S_HDR_RADIO, &SensorHdrRatio);
  1107. }
  1108. #endif
  1109. ret |= ioctl(pHalCtx->sensor_fd, VVSENSORIOC_S_GAIN, &SensorGain);
  1110. if (ret != 0) {
  1111. TRACE(IMX334_ERROR, "%s: set sensor gain error\n",
  1112. __func__);
  1113. return RET_FAILURE;
  1114. }
  1115. } else {
  1116. uint32_t Gain = 0;
  1117. Gain = (uint32_t)(20*log10(NewGain)*(10/3)) ;
  1118. result = IMX334_IsiRegisterWriteIss(handle, 0x3001, 0x01);
  1119. result =IMX334_IsiRegisterWriteIss(handle, 0x30e8,(Gain & 0x00ff));
  1120. result =IMX334_IsiRegisterWriteIss(handle, 0x30e9,(Gain & 0x0700)>>8);
  1121. result = IMX334_IsiRegisterWriteIss(handle, 0x3001, 0x00);
  1122. pIMX334Ctx->OldGain = NewGain;
  1123. }
  1124. pIMX334Ctx->AecCurGain = ((float)(NewGain));
  1125. *pSetGain = pIMX334Ctx->AecCurGain;
  1126. TRACE(IMX334_DEBUG, "%s: g=%f\n", __func__, *pSetGain);
  1127. return (result);
  1128. }
  1129. RESULT IMX334_IsiSetSEF1GainIss(IsiSensorHandle_t handle,float NewIntegrationTime,float NewGain, float *pSetGain, float *hdr_ratio) {
  1130. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1131. RESULT result = RET_SUCCESS;
  1132. HalContext_t *pHalCtx = (HalContext_t *) pIMX334Ctx->IsiCtx.HalHandle;
  1133. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1134. if (!pIMX334Ctx) {
  1135. TRACE(IMX334_ERROR,
  1136. "%s: Invalid sensor handle (NULL pointer detected)\n",
  1137. __func__);
  1138. return (RET_WRONG_HANDLE);
  1139. }
  1140. if (!pSetGain || !hdr_ratio)
  1141. return (RET_NULL_POINTER);
  1142. if (pIMX334Ctx->KernelDriverFlag) {
  1143. uint32_t SensorGain = 0;
  1144. SensorGain = NewGain * pIMX334Ctx->gain_accuracy;
  1145. ioctl(pHalCtx->sensor_fd, VVSENSORIOC_S_VSGAIN, &SensorGain);
  1146. } else {
  1147. uint32_t Gain = 0;
  1148. Gain = (uint32_t)(20*log10(NewGain)*(10/3)) ;
  1149. result = IMX334_IsiRegisterWriteIss(handle, 0x3001, 0x01);
  1150. result =IMX334_IsiRegisterWriteIss(handle, 0x30EA, (Gain & 0x00FF));
  1151. result =IMX334_IsiRegisterWriteIss(handle, 0x30EB, (Gain & 0x0700)>>8);
  1152. result = IMX334_IsiRegisterWriteIss(handle, 0x3001, 0x00);
  1153. pIMX334Ctx->OldGainSEF1 = NewGain;
  1154. }
  1155. pIMX334Ctx->AecCurGainSEF1 = NewGain;
  1156. *pSetGain = pIMX334Ctx->AecCurGainSEF1;
  1157. TRACE(IMX334_INFO, "%s: (exit)\n", __func__);
  1158. return (result);
  1159. }
  1160. RESULT IMX334_IsiSetBayerPattern(IsiSensorHandle_t handle, uint8_t pattern)
  1161. {
  1162. RESULT result = RET_SUCCESS;
  1163. uint8_t h_shift = 0, v_shift = 0;
  1164. uint32_t val_h = 0, val_l = 0;
  1165. uint16_t val = 0;
  1166. uint8_t Start_p = 0;
  1167. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1168. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1169. if (pIMX334Ctx == NULL || pIMX334Ctx->IsiCtx.HalHandle == NULL) {
  1170. return RET_NULL_POINTER;
  1171. }
  1172. // pattern 0:B 1:GB 2:GR 3:R
  1173. result = IMX334_IsiSensorSetStreamingIss(handle, 0);
  1174. switch (pattern) {
  1175. case BAYER_BGGR:
  1176. Start_p = 0;
  1177. break;
  1178. case BAYER_GBRG:
  1179. Start_p = 1;
  1180. break;
  1181. case BAYER_GRBG:
  1182. Start_p = 2;
  1183. break;
  1184. case BAYER_RGGB:
  1185. Start_p = 3;
  1186. break;
  1187. }
  1188. h_shift = Start_p % 2;
  1189. v_shift = Start_p / 2;
  1190. IMX334_IsiRegisterReadIss(handle, 0x30a0, &val_h);
  1191. IMX334_IsiRegisterReadIss(handle, 0x30a1, &val_l);
  1192. val = (((val_h << 8) & 0xff00) | (val_l & 0x00ff)) + h_shift;
  1193. val_h = (val >> 8) & 0xff;
  1194. val_l = val & 0xff;
  1195. IMX334_IsiRegisterWriteIss(handle, 0x30a0, (uint8_t)val_h);
  1196. IMX334_IsiRegisterWriteIss(handle, 0x30a1, (uint8_t)val_l);
  1197. IMX334_IsiRegisterReadIss(handle, 0x30a2, &val_h);
  1198. IMX334_IsiRegisterReadIss(handle, 0x30a3, &val_l);
  1199. val = (((val_h << 8) & 0xff00) | (val_l & 0x00ff)) + v_shift;
  1200. val_h = (val >> 8) & 0xff;
  1201. val_l = val & 0xff;
  1202. IMX334_IsiRegisterWriteIss(handle, 0x30a2, (uint8_t)val_h);
  1203. IMX334_IsiRegisterWriteIss(handle, 0x30a3, (uint8_t)val_l);
  1204. IMX334_IsiRegisterReadIss(handle, 0x30a4, &val_h);
  1205. IMX334_IsiRegisterReadIss(handle, 0x30a5, &val_l);
  1206. val = (((val_h << 8) & 0xff00) | (val_l & 0x00ff)) + h_shift;
  1207. val_h = (val >> 8) & 0xff;
  1208. val_l = val & 0xff;
  1209. IMX334_IsiRegisterWriteIss(handle, 0x30a4, (uint8_t)val_h);
  1210. IMX334_IsiRegisterWriteIss(handle, 0x30a5, (uint8_t)val_l);
  1211. IMX334_IsiRegisterReadIss(handle, 0x30a6, &val_h);
  1212. IMX334_IsiRegisterReadIss(handle, 0x30a7, &val_l);
  1213. val = (((val_h << 8) & 0xff00) | (val_l & 0x00ff)) + v_shift;
  1214. val_h = (val >> 8) & 0xff;
  1215. val_l = val & 0xff;
  1216. IMX334_IsiRegisterWriteIss(handle, 0x30a6, (uint8_t)val_h);
  1217. IMX334_IsiRegisterWriteIss(handle, 0x30a7, (uint8_t)val_l);
  1218. pIMX334Ctx->pattern = 3;
  1219. result = IMX334_IsiSensorSetStreamingIss(handle, pIMX334Ctx->Streaming);
  1220. return (result);
  1221. }
  1222. RESULT IMX334_IsiGetIntegrationTimeIss
  1223. (IsiSensorHandle_t handle, float *pSetIntegrationTime)
  1224. {
  1225. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1226. RESULT result = RET_SUCCESS;
  1227. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1228. if (!pIMX334Ctx) {
  1229. TRACE(IMX334_ERROR,
  1230. "%s: Invalid sensor handle (NULL pointer detected)\n",
  1231. __func__);
  1232. return (RET_WRONG_HANDLE);
  1233. }
  1234. if (!pSetIntegrationTime)
  1235. return (RET_NULL_POINTER);
  1236. *pSetIntegrationTime = pIMX334Ctx->AecCurIntegrationTime;
  1237. TRACE(IMX334_INFO, "%s: (exit)\n", __func__);
  1238. return (result);
  1239. }
  1240. RESULT IMX334_IsiGetSEF1IntegrationTimeIss
  1241. (IsiSensorHandle_t handle, float *pSetIntegrationTime)
  1242. {
  1243. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1244. RESULT result = RET_SUCCESS;
  1245. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1246. if (!pIMX334Ctx) {
  1247. TRACE(IMX334_ERROR,
  1248. "%s: Invalid sensor handle (NULL pointer detected)\n",
  1249. __func__);
  1250. return (RET_WRONG_HANDLE);
  1251. }
  1252. if (!pSetIntegrationTime)
  1253. return (RET_NULL_POINTER);
  1254. *pSetIntegrationTime = pIMX334Ctx->AecCurIntegrationTimeSEF1;
  1255. TRACE(IMX334_INFO, "%s: (exit)\n", __func__);
  1256. return (result);
  1257. }
  1258. RESULT IMX334_IsiGetIntegrationTimeIncrementIss
  1259. (IsiSensorHandle_t handle, float *pIncr)
  1260. {
  1261. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1262. RESULT result = RET_SUCCESS;
  1263. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1264. if (!pIMX334Ctx) {
  1265. TRACE(IMX334_ERROR,
  1266. "%s: Invalid sensor handle (NULL pointer detected)\n",
  1267. __func__);
  1268. return (RET_WRONG_HANDLE);
  1269. }
  1270. if (!pIncr)
  1271. return (RET_NULL_POINTER);
  1272. //_smallest_ increment the sensor/driver can handle (e.g. used for sliders in the application)
  1273. *pIncr = pIMX334Ctx->AecIntegrationTimeIncrement;
  1274. TRACE(IMX334_INFO, "%s: (exit)\n", __func__);
  1275. return (result);
  1276. }
  1277. RESULT IMX334_IsiSetIntegrationTimeIss
  1278. (IsiSensorHandle_t handle,
  1279. float NewIntegrationTime,
  1280. float *pSetIntegrationTime,
  1281. uint8_t * pNumberOfFramesToSkip, float *hdr_ratio)
  1282. {
  1283. RESULT result = RET_SUCCESS;
  1284. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1285. HalContext_t *pHalCtx = (HalContext_t *) pIMX334Ctx->IsiCtx.HalHandle;
  1286. uint32_t exp = 0;
  1287. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1288. if (!pIMX334Ctx) {
  1289. TRACE(IMX334_ERROR,"%s: Invalid sensor handle (NULL pointer detected)\n",
  1290. __func__);
  1291. return (RET_WRONG_HANDLE);
  1292. }
  1293. if (!pSetIntegrationTime || !pNumberOfFramesToSkip) {
  1294. TRACE(IMX334_ERROR, "%s: Invalid parameter (NULL pointer detected)\n",
  1295. __func__);
  1296. return (RET_NULL_POINTER);
  1297. }
  1298. exp = NewIntegrationTime / pIMX334Ctx->one_line_exp_time;
  1299. TRACE(IMX334_DEBUG, "%s: set AEC_PK_EXPO=0x%05x\n", __func__, exp);
  1300. if (NewIntegrationTime != pIMX334Ctx->OldIntegrationTime) {
  1301. if (pIMX334Ctx->KernelDriverFlag) {
  1302. ioctl(pHalCtx->sensor_fd, VVSENSORIOC_S_EXP, &exp);
  1303. } else {
  1304. exp = 2200 - exp +1;
  1305. exp = exp > 5?exp:5;
  1306. exp = exp <IMX334_VMAX - 1 ? exp:IMX334_VMAX - 1;
  1307. result = IMX334_IsiRegisterWriteIss(handle, 0x3001, 0x01);
  1308. result = IMX334_IsiRegisterWriteIss(handle, 0x3058, (exp & 0x0000FF));
  1309. result = IMX334_IsiRegisterWriteIss(handle, 0x3059, (exp & 0x00FF00)>>8);
  1310. result = IMX334_IsiRegisterWriteIss(handle, 0x305a, (exp & 0x070000)>>16);
  1311. result = IMX334_IsiRegisterWriteIss(handle, 0x3001, 0x00);
  1312. }
  1313. pIMX334Ctx->OldIntegrationTime = NewIntegrationTime ;
  1314. pIMX334Ctx->AecCurIntegrationTime = NewIntegrationTime;
  1315. *pNumberOfFramesToSkip = 1U;
  1316. } else {
  1317. *pNumberOfFramesToSkip = 0U; //no frame skip
  1318. }
  1319. *pSetIntegrationTime = pIMX334Ctx->AecCurIntegrationTime;
  1320. TRACE(IMX334_DEBUG, "%s: Ti=%f\n", __func__, *pSetIntegrationTime);
  1321. TRACE(IMX334_INFO, "%s: (exit)\n", __func__);
  1322. return (result);
  1323. }
  1324. RESULT IMX334_IsiSetSEF1IntegrationTimeIss(IsiSensorHandle_t handle, float NewIntegrationTime,float *pSetIntegrationTimeSEF1, uint8_t * pNumberOfFramesToSkip, float *hdr_ratio)
  1325. {
  1326. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1327. HalContext_t *pHalCtx = (HalContext_t *) pIMX334Ctx->IsiCtx.HalHandle;
  1328. RESULT result = RET_SUCCESS;
  1329. uint32_t exp = 0;
  1330. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1331. if (!pIMX334Ctx) {
  1332. TRACE(IMX334_ERROR,"%s: Invalid sensor handle (NULL pointer detected)\n",
  1333. __func__);
  1334. return (RET_WRONG_HANDLE);
  1335. }
  1336. if (!pSetIntegrationTimeSEF1 || !pNumberOfFramesToSkip) {
  1337. TRACE(IMX334_ERROR,"%s: Invalid parameter (NULL pointer detected)\n",
  1338. __func__);
  1339. return (RET_NULL_POINTER);
  1340. }
  1341. TRACE(IMX334_INFO,"%s: maxIntegrationTime-=%f minIntegrationTime = %f\n", __func__,
  1342. pIMX334Ctx->AecMaxIntegrationTime, pIMX334Ctx->AecMinIntegrationTime);
  1343. exp = NewIntegrationTime / pIMX334Ctx->one_line_exp_time;
  1344. if (NewIntegrationTime != pIMX334Ctx->OldIntegrationTimeSEF1) {
  1345. if (pIMX334Ctx->KernelDriverFlag) {
  1346. ioctl(pHalCtx->sensor_fd, VVSENSORIOC_S_VSEXP, &exp);
  1347. } else {
  1348. exp = 2200- exp +1;
  1349. exp = exp > 5 ? exp : 5;
  1350. exp = exp < IMX334_VMAX - 1 ? exp : IMX334_VMAX - 1;
  1351. result = IMX334_IsiRegisterWriteIss(handle, 0x3001, 0x01);
  1352. result = IMX334_IsiRegisterWriteIss(handle, 0x305c,(exp & 0x0000ff));
  1353. result = IMX334_IsiRegisterWriteIss(handle, 0x305D,(exp & 0x00ff00)>>8);
  1354. result = IMX334_IsiRegisterWriteIss(handle, 0x305e,(exp & 0x070000)>>16);
  1355. result = IMX334_IsiRegisterWriteIss(handle, 0x3001, 0x00);
  1356. }
  1357. pIMX334Ctx->OldIntegrationTimeSEF1 = NewIntegrationTime;
  1358. pIMX334Ctx->AecCurIntegrationTimeSEF1 = NewIntegrationTime;
  1359. *pNumberOfFramesToSkip = 1U;
  1360. } else {
  1361. *pNumberOfFramesToSkip = 0U;
  1362. }
  1363. *pSetIntegrationTimeSEF1 = pIMX334Ctx->AecCurIntegrationTimeSEF1;
  1364. TRACE(IMX334_DEBUG, "%s: NewIntegrationTime=%f\n", __func__,
  1365. NewIntegrationTime);
  1366. TRACE(IMX334_INFO, "%s: (exit)\n", __func__);
  1367. return (result);
  1368. }
  1369. RESULT IMX334_IsiExposureControlIss(IsiSensorHandle_t handle,float NewGain,float NewIntegrationTime,
  1370. uint8_t * pNumberOfFramesToSkip,float *pSetGain, float *pSetIntegrationTime, float *hdr_ratio)
  1371. {
  1372. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1373. RESULT result = RET_SUCCESS;
  1374. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1375. return result;
  1376. if (pIMX334Ctx == NULL) {
  1377. TRACE(IMX334_ERROR,
  1378. "%s: Invalid sensor handle (NULL pointer detected)\n",
  1379. __func__);
  1380. return (RET_WRONG_HANDLE);
  1381. }
  1382. if ((pNumberOfFramesToSkip == NULL) || (pSetGain == NULL)
  1383. || (pSetIntegrationTime == NULL)) {
  1384. TRACE(IMX334_ERROR,
  1385. "%s: Invalid parameter (NULL pointer detected)\n",
  1386. __func__);
  1387. return (RET_NULL_POINTER);
  1388. }
  1389. if (pIMX334Ctx->enableHdr)
  1390. {
  1391. result = IMX334_IsiSetSEF1IntegrationTimeIss(handle, NewIntegrationTime,pSetIntegrationTime,pNumberOfFramesToSkip,hdr_ratio);
  1392. result = IMX334_IsiSetSEF1GainIss(handle, NewIntegrationTime, NewGain,pSetGain, hdr_ratio);
  1393. }
  1394. result = IMX334_IsiSetIntegrationTimeIss(handle, NewIntegrationTime,pSetIntegrationTime,pNumberOfFramesToSkip, hdr_ratio);
  1395. result = IMX334_IsiSetGainIss(handle, NewGain, pSetGain, hdr_ratio);
  1396. TRACE(IMX334_INFO, "%s: (exit)\n", __func__);
  1397. return result;
  1398. }
  1399. RESULT IMX334_IsiGetCurrentExposureIss
  1400. (IsiSensorHandle_t handle, float *pSetGain, float *pSetIntegrationTime, float *hdr_ratio) {
  1401. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1402. RESULT result = RET_SUCCESS;
  1403. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1404. if (pIMX334Ctx == NULL) {
  1405. TRACE(IMX334_ERROR,
  1406. "%s: Invalid sensor handle (NULL pointer detected)\n",
  1407. __func__);
  1408. return (RET_WRONG_HANDLE);
  1409. }
  1410. if ((pSetGain == NULL) || (pSetIntegrationTime == NULL))
  1411. return (RET_NULL_POINTER);
  1412. *pSetGain = pIMX334Ctx->AecCurGain;
  1413. *pSetIntegrationTime = pIMX334Ctx->AecCurIntegrationTime;
  1414. *hdr_ratio = pIMX334Ctx->CurHdrRatio;
  1415. TRACE(IMX334_INFO, "%s: (exit)\n", __func__);
  1416. return (result);
  1417. }
  1418. RESULT IMX334_IsiGetResolutionIss
  1419. (IsiSensorHandle_t handle, uint16_t *pwidth, uint16_t *pheight) {
  1420. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1421. RESULT result = RET_SUCCESS;
  1422. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1423. if (pIMX334Ctx == NULL) {
  1424. TRACE(IMX334_ERROR,
  1425. "%s: Invalid sensor handle (NULL pointer detected)\n",
  1426. __func__);
  1427. return (RET_WRONG_HANDLE);
  1428. }
  1429. *pwidth = pIMX334Ctx->Config.Resolution.width;
  1430. *pheight = pIMX334Ctx->Config.Resolution.height;
  1431. TRACE(IMX334_INFO, "%s: (exit)\n", __func__);
  1432. return (result);
  1433. }
  1434. RESULT IMX334_IsiGetSensorFpsIss(IsiSensorHandle_t handle, uint32_t * pfps)
  1435. {
  1436. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1437. RESULT result = RET_SUCCESS;
  1438. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1439. if (pIMX334Ctx == NULL) {
  1440. TRACE(IMX334_ERROR,
  1441. "%s: Invalid sensor handle (NULL pointer detected)\n",
  1442. __func__);
  1443. return (RET_WRONG_HANDLE);
  1444. }
  1445. HalContext_t *pHalCtx = (HalContext_t *) pIMX334Ctx->IsiCtx.HalHandle;
  1446. if (pIMX334Ctx->KernelDriverFlag) {
  1447. ioctl(pHalCtx->sensor_fd, VVSENSORIOC_G_FPS, pfps);
  1448. pIMX334Ctx->CurrFps = *pfps;
  1449. }
  1450. *pfps = pIMX334Ctx->CurrFps;
  1451. TRACE(IMX334_INFO, "%s: (exit)\n", __func__);
  1452. return (result);
  1453. }
  1454. RESULT IMX334_IsiSetSensorFpsIss(IsiSensorHandle_t handle, uint32_t fps)
  1455. {
  1456. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1457. RESULT result = RET_SUCCESS;
  1458. int32_t ret = 0;
  1459. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1460. return 0;
  1461. if (pIMX334Ctx == NULL) {
  1462. TRACE(IMX334_ERROR,
  1463. "%s: Invalid sensor handle (NULL pointer detected)\n",
  1464. __func__);
  1465. return (RET_WRONG_HANDLE);
  1466. }
  1467. HalContext_t *pHalCtx = (HalContext_t *) pIMX334Ctx->IsiCtx.HalHandle;
  1468. if (fps > pIMX334Ctx->MaxFps) {
  1469. TRACE(IMX334_ERROR,
  1470. "%s: set fps(%d) out of range, correct to %d (%d, %d)\n",
  1471. __func__, fps, pIMX334Ctx->MaxFps, pIMX334Ctx->MinFps,
  1472. pIMX334Ctx->MaxFps);
  1473. fps = pIMX334Ctx->MaxFps;
  1474. }
  1475. if (fps < pIMX334Ctx->MinFps) {
  1476. TRACE(IMX334_ERROR,
  1477. "%s: set fps(%d) out of range, correct to %d (%d, %d)\n",
  1478. __func__, fps, pIMX334Ctx->MinFps, pIMX334Ctx->MinFps,
  1479. pIMX334Ctx->MaxFps);
  1480. fps = pIMX334Ctx->MinFps;
  1481. }
  1482. if (pIMX334Ctx->KernelDriverFlag) {
  1483. ret = ioctl(pHalCtx->sensor_fd, VVSENSORIOC_S_FPS, &fps);
  1484. if (ret != 0) {
  1485. TRACE(IMX334_ERROR, "%s: set sensor fps=%d error\n",
  1486. __func__);
  1487. return (RET_FAILURE);
  1488. }
  1489. #ifdef SUBDEV_CHAR
  1490. struct vvcam_ae_info_s ae_info;
  1491. ret =
  1492. ioctl(pHalCtx->sensor_fd, VVSENSORIOC_G_AE_INFO, &ae_info);
  1493. if (ret != 0) {
  1494. TRACE(IMX334_ERROR, "%s:sensor get ae info error!\n",
  1495. __func__);
  1496. return (RET_FAILURE);
  1497. }
  1498. pIMX334Ctx->one_line_exp_time =
  1499. (float)ae_info.one_line_exp_time_ns / 1000000000;
  1500. pIMX334Ctx->MaxIntegrationLine = ae_info.max_integration_time;
  1501. pIMX334Ctx->AecMaxIntegrationTime =
  1502. pIMX334Ctx->MaxIntegrationLine *
  1503. pIMX334Ctx->one_line_exp_time;
  1504. #endif
  1505. } else {
  1506. uint16_t FrameLengthLines;
  1507. FrameLengthLines =
  1508. pIMX334Ctx->FrameLengthLines * pIMX334Ctx->MaxFps / fps;
  1509. result =
  1510. IMX334_IsiRegisterWriteIss(handle, 0x30b2,
  1511. (FrameLengthLines >> 8) & 0xff);
  1512. result |=
  1513. IMX334_IsiRegisterWriteIss(handle, 0x30b3,
  1514. FrameLengthLines & 0xff);
  1515. if (result != RET_SUCCESS) {
  1516. TRACE(IMX334_ERROR,
  1517. "%s: Invalid sensor handle (NULL pointer detected)\n",
  1518. __func__);
  1519. return (RET_FAILURE);
  1520. }
  1521. pIMX334Ctx->CurrFps = fps;
  1522. pIMX334Ctx->CurFrameLengthLines = FrameLengthLines;
  1523. pIMX334Ctx->MaxIntegrationLine =
  1524. pIMX334Ctx->CurFrameLengthLines - 3;
  1525. pIMX334Ctx->AecMaxIntegrationTime =
  1526. pIMX334Ctx->MaxIntegrationLine *
  1527. pIMX334Ctx->one_line_exp_time;
  1528. }
  1529. TRACE(IMX334_INFO, "%s: set sensor fps = %d\n", __func__,
  1530. pIMX334Ctx->CurrFps);
  1531. TRACE(IMX334_INFO, "%s: (exit)\n", __func__);
  1532. return (result);
  1533. }
  1534. /*
  1535. RESULT IMX334_IsiGetAfpsInfoIss(IsiSensorHandle_t handle,
  1536. uint32_t Resolution, IsiAfpsInfo_t * pAfpsInfo)
  1537. {
  1538. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1539. RESULT result = RET_SUCCESS;
  1540. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1541. if (pIMX334Ctx == NULL) {
  1542. TRACE(IMX334_ERROR,
  1543. "%s: Invalid sensor handle (NULL pointer detected)\n",
  1544. __func__);
  1545. return (RET_WRONG_HANDLE);
  1546. }
  1547. if (pAfpsInfo == NULL)
  1548. return (RET_NULL_POINTER);
  1549. // set current resolution data in info struct
  1550. pAfpsInfo->AecMaxGain = pIMX334Ctx->AecMaxGain;
  1551. pAfpsInfo->AecMinGain = pIMX334Ctx->AecMinGain;
  1552. pAfpsInfo->AecMaxIntTime = pIMX334Ctx->AecMinIntegrationTime;
  1553. pAfpsInfo->AecMaxIntTime = pIMX334Ctx->AecMaxIntegrationTime;
  1554. pAfpsInfo->AecSlowestResolution = pIMX334Ctx->Resolution;
  1555. pAfpsInfo->CurrResolution = pIMX334Ctx->Resolution;
  1556. pAfpsInfo->CurrMaxIntTime = pIMX334Ctx->AecMaxIntegrationTime;
  1557. pAfpsInfo->CurrMinIntTime = pIMX334Ctx->AecMinIntegrationTime;
  1558. pAfpsInfo->Stage[0].MaxIntTime = pIMX334Ctx->AecMaxIntegrationTime;
  1559. pAfpsInfo->Stage[0].Resolution = pIMX334Ctx->Resolution;
  1560. TRACE(IMX334_INFO, "%s: (exit)\n", __func__);
  1561. return (result);
  1562. }
  1563. */
  1564. static RESULT IMX334_IsiActivateTestPattern(IsiSensorHandle_t handle,
  1565. const bool_t enable)
  1566. {
  1567. RESULT result = RET_SUCCESS;
  1568. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1569. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1570. if (pIMX334Ctx == NULL || pIMX334Ctx->IsiCtx.HalHandle == NULL) {
  1571. return RET_NULL_POINTER;
  1572. }
  1573. if (pIMX334Ctx->Configured != BOOL_TRUE)
  1574. return RET_WRONG_STATE;
  1575. if (BOOL_TRUE == enable) {
  1576. result = IMX334_IsiRegisterWriteIss(handle, 0x3253, 0x80);
  1577. } else {
  1578. result = IMX334_IsiRegisterWriteIss(handle, 0x3253, 0x00);
  1579. }
  1580. pIMX334Ctx->TestPattern = enable;
  1581. TRACE(IMX334_INFO, "%s: (exit)\n", __func__);
  1582. return (result);
  1583. }
  1584. /*
  1585. static RESULT IMX334_IsiEnableHdr(IsiSensorHandle_t handle, const bool_t enable)
  1586. {
  1587. RESULT result = RET_SUCCESS;
  1588. int32_t ret = 0;
  1589. TRACE(IMX334_INFO, "%s: (enter)\n", __func__);
  1590. IMX334_Context_t *pIMX334Ctx = (IMX334_Context_t *) handle;
  1591. if (pIMX334Ctx == NULL || pIMX334Ctx->IsiCtx.HalHandle == NULL) {
  1592. return RET_NULL_POINTER;
  1593. }
  1594. #ifdef SUBDEV_CHAR
  1595. HalContext_t *pHalCtx = (HalContext_t *) pIMX334Ctx->IsiCtx.HalHandle;
  1596. result = IMX334_IsiSensorSetStreamingIss(handle, 0);
  1597. if (pIMX334Ctx->KernelDriverFlag) {
  1598. uint32_t hdr_mode;
  1599. if (enable == 0) {
  1600. hdr_mode = SENSOR_MODE_LINEAR;
  1601. } else {
  1602. hdr_mode = SENSOR_MODE_HDR_STITCH;
  1603. }
  1604. ret =
  1605. ioctl(pHalCtx->sensor_fd, VVSENSORIOC_S_HDR_MODE,
  1606. &hdr_mode);
  1607. } else {
  1608. result |=
  1609. IMX334_IsiRegisterWriteIss(handle, 0x3190,
  1610. enable ? 0x05 : 0x08);
  1611. }
  1612. result |=
  1613. IMX334_IsiSensorSetStreamingIss(handle, pIMX334Ctx->Streaming);
  1614. #endif
  1615. if (result != 0 || ret != 0) {
  1616. TRACE(IMX334_ERROR, "%s: change hdr status error\n", __func__);
  1617. return RET_FAILURE;
  1618. }
  1619. pIMX334Ctx->enableHdr = enable;
  1620. TRACE(IMX334_INFO, "%s: (exit)\n", __func__);
  1621. return RET_SUCCESS;
  1622. }
  1623. */
  1624. RESULT IMX334_IsiGetSensorIss(IsiSensor_t *pIsiSensor)
  1625. {
  1626. RESULT result = RET_SUCCESS;
  1627. TRACE( IMX334_INFO, "%s (enter)\n", __func__);
  1628. if ( pIsiSensor != NULL ) {
  1629. pIsiSensor->pszName = SensorName;
  1630. pIsiSensor->pIsiCreateSensorIss = IMX334_IsiCreateSensorIss;
  1631. pIsiSensor->pIsiInitSensorIss = IMX334_IsiInitSensorIss;
  1632. pIsiSensor->pIsiGetSensorModeIss = IMX334_IsiGetSensorModeIss;
  1633. pIsiSensor->pIsiResetSensorIss = IMX334_IsiResetSensorIss;
  1634. pIsiSensor->pIsiReleaseSensorIss = IMX334_IsiReleaseSensorIss;
  1635. pIsiSensor->pIsiGetCapsIss = IMX334_IsiGetCapsIss;
  1636. pIsiSensor->pIsiSetupSensorIss = IMX334_IsiSetupSensorIss;
  1637. pIsiSensor->pIsiChangeSensorResolutionIss = IMX334_IsiChangeSensorResolutionIss;
  1638. pIsiSensor->pIsiSensorSetStreamingIss = IMX334_IsiSensorSetStreamingIss;
  1639. pIsiSensor->pIsiSensorSetPowerIss = IMX334_IsiSensorSetPowerIss;
  1640. pIsiSensor->pIsiCheckSensorConnectionIss = IMX334_IsiCheckSensorConnectionIss;
  1641. pIsiSensor->pIsiGetSensorRevisionIss = IMX334_IsiGetSensorRevisionIss;
  1642. pIsiSensor->pIsiRegisterReadIss = IMX334_IsiRegisterReadIss;
  1643. pIsiSensor->pIsiRegisterWriteIss = IMX334_IsiRegisterWriteIss;
  1644. /* AEC functions */
  1645. pIsiSensor->pIsiExposureControlIss = IMX334_IsiExposureControlIss;
  1646. pIsiSensor->pIsiGetGainLimitsIss = IMX334_IsiGetGainLimitsIss;
  1647. pIsiSensor->pIsiGetIntegrationTimeLimitsIss = IMX334_IsiGetIntegrationTimeLimitsIss;
  1648. pIsiSensor->pIsiGetCurrentExposureIss = IMX334_IsiGetCurrentExposureIss;
  1649. pIsiSensor->pIsiGetVSGainIss = IMX334_IsiGetSEF1GainIss;
  1650. pIsiSensor->pIsiGetGainIss = IMX334_IsiGetGainIss;
  1651. pIsiSensor->pIsiGetGainIncrementIss = IMX334_IsiGetGainIncrementIss;
  1652. pIsiSensor->pIsiSetGainIss = IMX334_IsiSetGainIss;
  1653. pIsiSensor->pIsiGetIntegrationTimeIss = IMX334_IsiGetIntegrationTimeIss;
  1654. pIsiSensor->pIsiGetVSIntegrationTimeIss = IMX334_IsiGetSEF1IntegrationTimeIss;
  1655. pIsiSensor->pIsiGetIntegrationTimeIncrementIss = IMX334_IsiGetIntegrationTimeIncrementIss;
  1656. pIsiSensor->pIsiSetIntegrationTimeIss = IMX334_IsiSetIntegrationTimeIss;
  1657. pIsiSensor->pIsiQuerySensorIss = IMX334_IsiQuerySensorIss;
  1658. pIsiSensor->pIsiGetResolutionIss = IMX334_IsiGetResolutionIss;
  1659. pIsiSensor->pIsiGetSensorFpsIss = IMX334_IsiGetSensorFpsIss;
  1660. pIsiSensor->pIsiSetSensorFpsIss = IMX334_IsiSetSensorFpsIss;
  1661. /* AWB specific functions */
  1662. /* Testpattern */
  1663. pIsiSensor->pIsiActivateTestPattern = IMX334_IsiActivateTestPattern;
  1664. pIsiSensor->pIsiSetBayerPattern = IMX334_IsiSetBayerPattern;
  1665. } else {
  1666. result = RET_NULL_POINTER;
  1667. }
  1668. TRACE( IMX334_INFO, "%s (exit)\n", __func__);
  1669. return ( result );
  1670. }
  1671. /*****************************************************************************
  1672. * each sensor driver need declare this struct for isi load
  1673. *****************************************************************************/
  1674. IsiCamDrvConfig_t IMX334_IsiCamDrvConfig = {
  1675. 0,
  1676. IMX334_IsiQuerySensorSupportIss,
  1677. IMX334_IsiGetSensorIss,
  1678. {
  1679. SensorName, /**< IsiSensor_t.pszName */
  1680. 0, /**< IsiSensor_t.pIsiInitIss>*/
  1681. 0, /**< IsiSensor_t.pIsiResetSensorIss>*/
  1682. 0, /**< IsiSensor_t.pRegisterTable */
  1683. 0, /**< IsiSensor_t.pIsiSensorCaps */
  1684. 0, /**< IsiSensor_t.pIsiCreateSensorIss */
  1685. 0, /**< IsiSensor_t.pIsiReleaseSensorIss */
  1686. 0, /**< IsiSensor_t.pIsiGetCapsIss */
  1687. 0, /**< IsiSensor_t.pIsiSetupSensorIss */
  1688. 0, /**< IsiSensor_t.pIsiChangeSensorResolutionIss */
  1689. 0, /**< IsiSensor_t.pIsiSensorSetStreamingIss */
  1690. 0, /**< IsiSensor_t.pIsiSensorSetPowerIss */
  1691. 0, /**< IsiSensor_t.pIsiCheckSensorConnectionIss */
  1692. 0, /**< IsiSensor_t.pIsiGetSensorRevisionIss */
  1693. 0, /**< IsiSensor_t.pIsiRegisterReadIss */
  1694. 0, /**< IsiSensor_t.pIsiRegisterWriteIss */
  1695. 0, /**< IsiSensor_t.pIsiExposureControlIss */
  1696. 0, /**< IsiSensor_t.pIsiGetGainLimitsIss */
  1697. 0, /**< IsiSensor_t.pIsiGetIntegrationTimeLimitsIss */
  1698. 0, /**< IsiSensor_t.pIsiGetCurrentExposureIss */
  1699. 0, /**< IsiSensor_t.pIsiGetGainIss */
  1700. 0, /**< IsiSensor_t.pIsiGetVSGainIss */
  1701. 0, /**< IsiSensor_t.pIsiGetGainIncrementIss */
  1702. 0, /**< IsiSensor_t.pIsiGetGainIncrementIss */
  1703. 0, /**< IsiSensor_t.pIsiSetGainIss */
  1704. 0, /**< IsiSensor_t.pIsiGetIntegrationTimeIss */
  1705. 0, /**< IsiSensor_t.pIsiGetIntegrationTimeIncrementIss */
  1706. 0, /**< IsiSensor_t.pIsiSetIntegrationTimeIss */
  1707. 0, /**< IsiSensor_t.pIsiGetResolutionIss */
  1708. 0, /**< IsiSensor_t.pIsiGetAfpsInfoIss */
  1709. 0, /**< IsiSensor_t.pIsiMdiInitMotoDriveMds */
  1710. 0, /**< IsiSensor_t.pIsiMdiSetupMotoDrive */
  1711. 0, /**< IsiSensor_t.pIsiMdiFocusSet */
  1712. 0, /**< IsiSensor_t.pIsiMdiFocusGet */
  1713. 0, /**< IsiSensor_t.pIsiMdiFocusCalibrate */
  1714. 0, /**< IsiSensor_t.pIsiGetSensorMipiInfoIss */
  1715. 0, /**< IsiSensor_t.pIsiActivateTestPattern */
  1716. 0, /**< IsiSensor_t.pIsiEnableHdr */
  1717. 0, /**< IsiSensor_t.pIsiSetBayerPattern */
  1718. }
  1719. };