IMX334.c 69 KB

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