ov5640.c 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105
  1. /*
  2. * This file is part of the OpenMV project.
  3. * Copyright (c) 2013/2014 Ibrahim Abdelkader <i.abdalkader@gmail.com>
  4. * This work is licensed under the MIT license, see the file LICENSE for details.
  5. *
  6. * OV3660 driver.
  7. *
  8. */
  9. #include <stdint.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include "sccb.h"
  13. #include "ov5640.h"
  14. #include "ov5640_regs.h"
  15. #include "ov5640_settings.h"
  16. #include "freertos/FreeRTOS.h"
  17. #include "freertos/task.h"
  18. #if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_ARDUHAL_ESP_LOG)
  19. #include "esp32-hal-log.h"
  20. #else
  21. #include "esp_log.h"
  22. static const char *TAG = "ov5640";
  23. #endif
  24. //#define REG_DEBUG_ON
  25. static int read_reg(uint8_t slv_addr, const uint16_t reg){
  26. int ret = SCCB_Read16(slv_addr, reg);
  27. #ifdef REG_DEBUG_ON
  28. if (ret < 0) {
  29. ESP_LOGE(TAG, "READ REG 0x%04x FAILED: %d", reg, ret);
  30. }
  31. #endif
  32. return ret;
  33. }
  34. static int check_reg_mask(uint8_t slv_addr, uint16_t reg, uint8_t mask){
  35. return (read_reg(slv_addr, reg) & mask) == mask;
  36. }
  37. static int read_reg16(uint8_t slv_addr, const uint16_t reg){
  38. int ret = 0, ret2 = 0;
  39. ret = read_reg(slv_addr, reg);
  40. if (ret >= 0) {
  41. ret = (ret & 0xFF) << 8;
  42. ret2 = read_reg(slv_addr, reg+1);
  43. if (ret2 < 0) {
  44. ret = ret2;
  45. } else {
  46. ret |= ret2 & 0xFF;
  47. }
  48. }
  49. return ret;
  50. }
  51. //static void dump_reg(sensor_t *sensor, const uint16_t reg){
  52. // int v = SCCB_Read16(sensor->slv_addr, reg);
  53. // if(v < 0){
  54. // ets_printf(" 0x%04x: FAIL[%d]\n", reg, v);
  55. // } else {
  56. // ets_printf(" 0x%04x: 0x%02X\n", reg, v);
  57. // }
  58. //}
  59. //
  60. //static void dump_range(sensor_t *sensor, const char * name, const uint16_t start_reg, const uint16_t end_reg){
  61. // ets_printf("%s: 0x%04x - 0x%04X\n", name, start_reg, end_reg);
  62. // for(uint16_t reg = start_reg; reg <= end_reg; reg++){
  63. // dump_reg(sensor, reg);
  64. // }
  65. //}
  66. //
  67. //static void dump_regs(sensor_t *sensor){
  68. //// dump_range(sensor, "All Regs", 0x3000, 0x6100);
  69. //// dump_range(sensor, "system and IO pad control", 0x3000, 0x3052);
  70. //// dump_range(sensor, "SCCB control", 0x3100, 0x3108);
  71. //// dump_range(sensor, "SRB control", 0x3200, 0x3211);
  72. //// dump_range(sensor, "AWB gain control", 0x3400, 0x3406);
  73. //// dump_range(sensor, "AEC/AGC control", 0x3500, 0x350D);
  74. //// dump_range(sensor, "VCM control", 0x3600, 0x3606);
  75. //// dump_range(sensor, "timing control", 0x3800, 0x3821);
  76. //// dump_range(sensor, "AEC/AGC power down domain control", 0x3A00, 0x3A25);
  77. //// dump_range(sensor, "strobe control", 0x3B00, 0x3B0C);
  78. //// dump_range(sensor, "50/60Hz detector control", 0x3C00, 0x3C1E);
  79. //// dump_range(sensor, "OTP control", 0x3D00, 0x3D21);
  80. //// dump_range(sensor, "MC control", 0x3F00, 0x3F0D);
  81. //// dump_range(sensor, "BLC control", 0x4000, 0x4033);
  82. //// dump_range(sensor, "frame control", 0x4201, 0x4202);
  83. //// dump_range(sensor, "format control", 0x4300, 0x430D);
  84. //// dump_range(sensor, "JPEG control", 0x4400, 0x4431);
  85. //// dump_range(sensor, "VFIFO control", 0x4600, 0x460D);
  86. //// dump_range(sensor, "DVP control", 0x4709, 0x4745);
  87. //// dump_range(sensor, "MIPI control", 0x4800, 0x4837);
  88. //// dump_range(sensor, "ISP frame control", 0x4901, 0x4902);
  89. //// dump_range(sensor, "ISP top control", 0x5000, 0x5063);
  90. //// dump_range(sensor, "AWB control", 0x5180, 0x51D0);
  91. //// dump_range(sensor, "CIP control", 0x5300, 0x530F);
  92. //// dump_range(sensor, "CMX control", 0x5380, 0x538B);
  93. //// dump_range(sensor, "gamma control", 0x5480, 0x5490);
  94. //// dump_range(sensor, "SDE control", 0x5580, 0x558C);
  95. //// dump_range(sensor, "scale control", 0x5600, 0x5606);
  96. //// dump_range(sensor, "AVG control", 0x5680, 0x56A2);
  97. //// dump_range(sensor, "LENC control", 0x5800, 0x5849);
  98. //// dump_range(sensor, "AFC control", 0x6000, 0x603F);
  99. //}
  100. static int write_reg(uint8_t slv_addr, const uint16_t reg, uint8_t value){
  101. int ret = 0;
  102. #ifndef REG_DEBUG_ON
  103. ret = SCCB_Write16(slv_addr, reg, value);
  104. #else
  105. int old_value = read_reg(slv_addr, reg);
  106. if (old_value < 0) {
  107. return old_value;
  108. }
  109. if ((uint8_t)old_value != value) {
  110. ESP_LOGI(TAG, "NEW REG 0x%04x: 0x%02x to 0x%02x", reg, (uint8_t)old_value, value);
  111. ret = SCCB_Write16(slv_addr, reg, value);
  112. } else {
  113. ESP_LOGD(TAG, "OLD REG 0x%04x: 0x%02x", reg, (uint8_t)old_value);
  114. ret = SCCB_Write16(slv_addr, reg, value);//maybe not?
  115. }
  116. if (ret < 0) {
  117. ESP_LOGE(TAG, "WRITE REG 0x%04x FAILED: %d", reg, ret);
  118. }
  119. #endif
  120. return ret;
  121. }
  122. static int set_reg_bits(uint8_t slv_addr, uint16_t reg, uint8_t offset, uint8_t mask, uint8_t value)
  123. {
  124. int ret = 0;
  125. uint8_t c_value, new_value;
  126. ret = read_reg(slv_addr, reg);
  127. if(ret < 0) {
  128. return ret;
  129. }
  130. c_value = ret;
  131. new_value = (c_value & ~(mask << offset)) | ((value & mask) << offset);
  132. ret = write_reg(slv_addr, reg, new_value);
  133. return ret;
  134. }
  135. static int write_regs(uint8_t slv_addr, const uint16_t (*regs)[2])
  136. {
  137. int i = 0, ret = 0;
  138. while (!ret && regs[i][0] != REGLIST_TAIL) {
  139. if (regs[i][0] == REG_DLY) {
  140. vTaskDelay(regs[i][1] / portTICK_PERIOD_MS);
  141. } else {
  142. ret = write_reg(slv_addr, regs[i][0], regs[i][1]);
  143. }
  144. i++;
  145. }
  146. return ret;
  147. }
  148. static int write_reg16(uint8_t slv_addr, const uint16_t reg, uint16_t value)
  149. {
  150. if (write_reg(slv_addr, reg, value >> 8) || write_reg(slv_addr, reg + 1, value)) {
  151. return -1;
  152. }
  153. return 0;
  154. }
  155. static int write_addr_reg(uint8_t slv_addr, const uint16_t reg, uint16_t x_value, uint16_t y_value)
  156. {
  157. if (write_reg16(slv_addr, reg, x_value) || write_reg16(slv_addr, reg + 2, y_value)) {
  158. return -1;
  159. }
  160. return 0;
  161. }
  162. #define write_reg_bits(slv_addr, reg, mask, enable) set_reg_bits(slv_addr, reg, 0, mask, (enable)?(mask):0)
  163. static int calc_sysclk(int xclk, bool pll_bypass, int pll_multiplier, int pll_sys_div, int pre_div, bool root_2x, int pclk_root_div, bool pclk_manual, int pclk_div)
  164. {
  165. const float pll_pre_div2x_map[] = { 1, 1, 2, 3, 4, 1.5, 6, 2.5, 8};
  166. const int pll_pclk_root_div_map[] = { 1, 2, 4, 8 };
  167. if(!pll_sys_div) {
  168. pll_sys_div = 1;
  169. }
  170. float pll_pre_div = pll_pre_div2x_map[pre_div];
  171. unsigned int root_2x_div = root_2x?2:1;
  172. unsigned int pll_pclk_root_div = pll_pclk_root_div_map[pclk_root_div];
  173. unsigned int REFIN = xclk / pll_pre_div;
  174. unsigned int VCO = REFIN * pll_multiplier / root_2x_div;
  175. unsigned int PLL_CLK = pll_bypass?(xclk):(VCO / pll_sys_div * 2 / 5);//5 here is 10bit mode / 2, for 8bit it should be 4 (reg 0x3034)
  176. unsigned int PCLK = PLL_CLK / pll_pclk_root_div / ((pclk_manual && pclk_div)?pclk_div:2);
  177. unsigned int SYSCLK = PLL_CLK / 4;
  178. ESP_LOGD(TAG, "Calculated XVCLK: %d Hz, REFIN: %u Hz, VCO: %u Hz, PLL_CLK: %u Hz, SYSCLK: %u Hz, PCLK: %u Hz", xclk, REFIN, VCO, PLL_CLK, SYSCLK, PCLK);
  179. return SYSCLK;
  180. }
  181. static int set_pll(sensor_t *sensor, bool bypass, uint8_t multiplier, uint8_t sys_div, uint8_t pre_div, bool root_2x, uint8_t pclk_root_div, bool pclk_manual, uint8_t pclk_div){
  182. int ret = 0;
  183. if(multiplier > 252 || multiplier < 4 || sys_div > 15 || pre_div > 8 || pclk_div > 31 || pclk_root_div > 3){
  184. ESP_LOGE(TAG, "Invalid arguments");
  185. return -1;
  186. }
  187. if(multiplier > 127){
  188. multiplier &= 0xFE;//only even integers above 127
  189. }
  190. calc_sysclk(sensor->xclk_freq_hz, bypass, multiplier, sys_div, pre_div, root_2x, pclk_root_div, pclk_manual, pclk_div);
  191. ret = write_reg(sensor->slv_addr, 0x3039, bypass?0x80:0x00);
  192. if (ret == 0) {
  193. ret = write_reg(sensor->slv_addr, 0x3034, 0x1A);//10bit mode
  194. }
  195. if (ret == 0) {
  196. ret = write_reg(sensor->slv_addr, 0x3035, 0x01 | ((sys_div & 0x0f) << 4));
  197. }
  198. if (ret == 0) {
  199. ret = write_reg(sensor->slv_addr, 0x3036, multiplier & 0xff);
  200. }
  201. if (ret == 0) {
  202. ret = write_reg(sensor->slv_addr, 0x3037, (pre_div & 0xf) | (root_2x?0x10:0x00));
  203. }
  204. if (ret == 0) {
  205. ret = write_reg(sensor->slv_addr, 0x3108, (pclk_root_div & 0x3) << 4 | 0x06);
  206. }
  207. if (ret == 0) {
  208. ret = write_reg(sensor->slv_addr, 0x3824, pclk_div & 0x1f);
  209. }
  210. if (ret == 0) {
  211. ret = write_reg(sensor->slv_addr, 0x460C, pclk_manual?0x22:0x20);
  212. }
  213. if (ret == 0) {
  214. ret = write_reg(sensor->slv_addr, 0x3103, 0x13);// system clock from pll, bit[1]
  215. }
  216. if(ret){
  217. ESP_LOGE(TAG, "set_sensor_pll FAILED!");
  218. }
  219. return ret;
  220. }
  221. static int set_ae_level(sensor_t *sensor, int level);
  222. static int reset(sensor_t *sensor)
  223. {
  224. //dump_regs(sensor);
  225. vTaskDelay(100 / portTICK_PERIOD_MS);
  226. int ret = 0;
  227. // Software Reset: clear all registers and reset them to their default values
  228. ret = write_reg(sensor->slv_addr, SYSTEM_CTROL0, 0x82);
  229. if(ret){
  230. ESP_LOGE(TAG, "Software Reset FAILED!");
  231. return ret;
  232. }
  233. vTaskDelay(100 / portTICK_PERIOD_MS);
  234. ret = write_regs(sensor->slv_addr, sensor_default_regs);
  235. if (ret == 0) {
  236. ESP_LOGD(TAG, "Camera defaults loaded");
  237. vTaskDelay(100 / portTICK_PERIOD_MS);
  238. //write_regs(sensor->slv_addr, sensor_regs_awb0);
  239. //write_regs(sensor->slv_addr, sensor_regs_gamma1);
  240. }
  241. return ret;
  242. }
  243. static int set_pixformat(sensor_t *sensor, pixformat_t pixformat)
  244. {
  245. int ret = 0;
  246. const uint16_t (*regs)[2];
  247. switch (pixformat) {
  248. case PIXFORMAT_YUV422:
  249. regs = sensor_fmt_yuv422;
  250. break;
  251. case PIXFORMAT_GRAYSCALE:
  252. regs = sensor_fmt_grayscale;
  253. break;
  254. case PIXFORMAT_RGB565:
  255. case PIXFORMAT_RGB888:
  256. regs = sensor_fmt_rgb565;
  257. break;
  258. case PIXFORMAT_JPEG:
  259. regs = sensor_fmt_jpeg;
  260. break;
  261. case PIXFORMAT_RAW:
  262. regs = sensor_fmt_raw;
  263. break;
  264. default:
  265. ESP_LOGE(TAG, "Unsupported pixformat: %u", pixformat);
  266. return -1;
  267. }
  268. ret = write_regs(sensor->slv_addr, regs);
  269. if(ret == 0) {
  270. sensor->pixformat = pixformat;
  271. ESP_LOGD(TAG, "Set pixformat to: %u", pixformat);
  272. }
  273. return ret;
  274. }
  275. static int set_image_options(sensor_t *sensor)
  276. {
  277. int ret = 0;
  278. uint8_t reg20 = 0;
  279. uint8_t reg21 = 0;
  280. uint8_t reg4514 = 0;
  281. uint8_t reg4514_test = 0;
  282. // compression
  283. if (sensor->pixformat == PIXFORMAT_JPEG) {
  284. reg21 |= 0x20;
  285. }
  286. // binning
  287. if (!sensor->status.binning) {
  288. reg20 |= 0x40;
  289. } else {
  290. reg20 |= 0x01;
  291. reg21 |= 0x01;
  292. reg4514_test |= 4;
  293. }
  294. // V-Flip
  295. if (sensor->status.vflip) {
  296. reg20 |= 0x06;
  297. reg4514_test |= 1;
  298. }
  299. // H-Mirror
  300. if (sensor->status.hmirror) {
  301. reg21 |= 0x06;
  302. reg4514_test |= 2;
  303. }
  304. switch (reg4514_test) {
  305. //no binning
  306. case 0: reg4514 = 0x88; break;//normal
  307. case 1: reg4514 = 0x00; break;//v-flip
  308. case 2: reg4514 = 0xbb; break;//h-mirror
  309. case 3: reg4514 = 0x00; break;//v-flip+h-mirror
  310. //binning
  311. case 4: reg4514 = 0xaa; break;//normal
  312. case 5: reg4514 = 0xbb; break;//v-flip
  313. case 6: reg4514 = 0xbb; break;//h-mirror
  314. case 7: reg4514 = 0xaa; break;//v-flip+h-mirror
  315. }
  316. if(write_reg(sensor->slv_addr, TIMING_TC_REG20, reg20)
  317. || write_reg(sensor->slv_addr, TIMING_TC_REG21, reg21)
  318. || write_reg(sensor->slv_addr, 0x4514, reg4514)){
  319. ESP_LOGE(TAG, "Setting Image Options Failed");
  320. return -1;
  321. }
  322. if (!sensor->status.binning) {
  323. ret = write_reg(sensor->slv_addr, 0x4520, 0x10)
  324. || write_reg(sensor->slv_addr, X_INCREMENT, 0x11)//odd:1, even: 1
  325. || write_reg(sensor->slv_addr, Y_INCREMENT, 0x11);//odd:1, even: 1
  326. } else {
  327. ret = write_reg(sensor->slv_addr, 0x4520, 0x0b)
  328. || write_reg(sensor->slv_addr, X_INCREMENT, 0x31)//odd:3, even: 1
  329. || write_reg(sensor->slv_addr, Y_INCREMENT, 0x31);//odd:3, even: 1
  330. }
  331. ESP_LOGD(TAG, "Set Image Options: Compression: %u, Binning: %u, V-Flip: %u, H-Mirror: %u, Reg-4514: 0x%02x",
  332. sensor->pixformat == PIXFORMAT_JPEG, sensor->status.binning, sensor->status.vflip, sensor->status.hmirror, reg4514);
  333. return ret;
  334. }
  335. static int set_framesize(sensor_t *sensor, framesize_t framesize)
  336. {
  337. int ret = 0;
  338. framesize_t old_framesize = sensor->status.framesize;
  339. sensor->status.framesize = framesize;
  340. if(framesize > FRAMESIZE_QSXGA){
  341. ESP_LOGE(TAG, "Invalid framesize: %u", framesize);
  342. return -1;
  343. }
  344. uint16_t w = resolution[framesize].width;
  345. uint16_t h = resolution[framesize].height;
  346. aspect_ratio_t ratio = resolution[framesize].aspect_ratio;
  347. ratio_settings_t settings = ratio_table[ratio];
  348. sensor->status.binning = (w <= (settings.max_width / 2) && h <= (settings.max_height / 2));
  349. sensor->status.scale = !((w == settings.max_width && h == settings.max_height)
  350. || (w == (settings.max_width / 2) && h == (settings.max_height / 2)));
  351. ret = write_addr_reg(sensor->slv_addr, X_ADDR_ST_H, settings.start_x, settings.start_y)
  352. || write_addr_reg(sensor->slv_addr, X_ADDR_END_H, settings.end_x, settings.end_y)
  353. || write_addr_reg(sensor->slv_addr, X_OUTPUT_SIZE_H, w, h);
  354. if (ret) {
  355. goto fail;
  356. }
  357. if (!sensor->status.binning) {
  358. ret = write_addr_reg(sensor->slv_addr, X_TOTAL_SIZE_H, settings.total_x, settings.total_y)
  359. || write_addr_reg(sensor->slv_addr, X_OFFSET_H, settings.offset_x, settings.offset_y);
  360. } else {
  361. if (w > 920) {
  362. ret = write_addr_reg(sensor->slv_addr, X_TOTAL_SIZE_H, settings.total_x - 200, settings.total_y / 2);
  363. } else {
  364. ret = write_addr_reg(sensor->slv_addr, X_TOTAL_SIZE_H, 2060, settings.total_y / 2);
  365. }
  366. if (ret == 0) {
  367. ret = write_addr_reg(sensor->slv_addr, X_OFFSET_H, settings.offset_x / 2, settings.offset_y / 2);
  368. }
  369. }
  370. if (ret == 0) {
  371. ret = write_reg_bits(sensor->slv_addr, ISP_CONTROL_01, 0x20, sensor->status.scale);
  372. }
  373. if (ret == 0) {
  374. ret = set_image_options(sensor);
  375. }
  376. if (ret) {
  377. goto fail;
  378. }
  379. if (sensor->pixformat == PIXFORMAT_JPEG) {
  380. //10MHz PCLK
  381. uint8_t sys_mul = 200;
  382. if(framesize < FRAMESIZE_QVGA){
  383. sys_mul = 160;
  384. } else if(framesize < FRAMESIZE_XGA){
  385. sys_mul = 180;
  386. }
  387. ret = set_pll(sensor, false, sys_mul, 4, 2, false, 2, true, 4);
  388. } else {
  389. ret = set_pll(sensor, false, 10, 1, 1, false, 1, true, 4);
  390. }
  391. if (ret == 0) {
  392. ESP_LOGD(TAG, "Set framesize to: %ux%u", w, h);
  393. }
  394. return ret;
  395. fail:
  396. sensor->status.framesize = old_framesize;
  397. ESP_LOGE(TAG, "Setting framesize to: %ux%u failed", w, h);
  398. return ret;
  399. }
  400. static int set_hmirror(sensor_t *sensor, int enable)
  401. {
  402. int ret = 0;
  403. sensor->status.hmirror = enable;
  404. ret = set_image_options(sensor);
  405. if (ret == 0) {
  406. ESP_LOGD(TAG, "Set h-mirror to: %d", enable);
  407. }
  408. return ret;
  409. }
  410. static int set_vflip(sensor_t *sensor, int enable)
  411. {
  412. int ret = 0;
  413. sensor->status.vflip = enable;
  414. ret = set_image_options(sensor);
  415. if (ret == 0) {
  416. ESP_LOGD(TAG, "Set v-flip to: %d", enable);
  417. }
  418. return ret;
  419. }
  420. static int set_quality(sensor_t *sensor, int qs)
  421. {
  422. int ret = 0;
  423. ret = write_reg(sensor->slv_addr, COMPRESSION_CTRL07, qs & 0x3f);
  424. if (ret == 0) {
  425. sensor->status.quality = qs;
  426. ESP_LOGD(TAG, "Set quality to: %d", qs);
  427. }
  428. return ret;
  429. }
  430. static int set_colorbar(sensor_t *sensor, int enable)
  431. {
  432. int ret = 0;
  433. ret = write_reg_bits(sensor->slv_addr, PRE_ISP_TEST_SETTING_1, TEST_COLOR_BAR, enable);
  434. if (ret == 0) {
  435. sensor->status.colorbar = enable;
  436. ESP_LOGD(TAG, "Set colorbar to: %d", enable);
  437. }
  438. return ret;
  439. }
  440. static int set_gain_ctrl(sensor_t *sensor, int enable)
  441. {
  442. int ret = 0;
  443. ret = write_reg_bits(sensor->slv_addr, AEC_PK_MANUAL, AEC_PK_MANUAL_AGC_MANUALEN, !enable);
  444. if (ret == 0) {
  445. ESP_LOGD(TAG, "Set gain_ctrl to: %d", enable);
  446. sensor->status.agc = enable;
  447. }
  448. return ret;
  449. }
  450. static int set_exposure_ctrl(sensor_t *sensor, int enable)
  451. {
  452. int ret = 0;
  453. ret = write_reg_bits(sensor->slv_addr, AEC_PK_MANUAL, AEC_PK_MANUAL_AEC_MANUALEN, !enable);
  454. if (ret == 0) {
  455. ESP_LOGD(TAG, "Set exposure_ctrl to: %d", enable);
  456. sensor->status.aec = enable;
  457. }
  458. return ret;
  459. }
  460. static int set_whitebal(sensor_t *sensor, int enable)
  461. {
  462. int ret = 0;
  463. ret = write_reg_bits(sensor->slv_addr, ISP_CONTROL_01, 0x01, enable);
  464. if (ret == 0) {
  465. ESP_LOGD(TAG, "Set awb to: %d", enable);
  466. sensor->status.awb = enable;
  467. }
  468. return ret;
  469. }
  470. //Advanced AWB
  471. static int set_dcw_dsp(sensor_t *sensor, int enable)
  472. {
  473. int ret = 0;
  474. ret = write_reg_bits(sensor->slv_addr, 0x5183, 0x80, !enable);
  475. if (ret == 0) {
  476. ESP_LOGD(TAG, "Set dcw to: %d", enable);
  477. sensor->status.dcw = enable;
  478. }
  479. return ret;
  480. }
  481. //night mode enable
  482. static int set_aec2(sensor_t *sensor, int enable)
  483. {
  484. int ret = 0;
  485. ret = write_reg_bits(sensor->slv_addr, 0x3a00, 0x04, enable);
  486. if (ret == 0) {
  487. ESP_LOGD(TAG, "Set aec2 to: %d", enable);
  488. sensor->status.aec2 = enable;
  489. }
  490. return ret;
  491. }
  492. static int set_bpc_dsp(sensor_t *sensor, int enable)
  493. {
  494. int ret = 0;
  495. ret = write_reg_bits(sensor->slv_addr, 0x5000, 0x04, enable);
  496. if (ret == 0) {
  497. ESP_LOGD(TAG, "Set bpc to: %d", enable);
  498. sensor->status.bpc = enable;
  499. }
  500. return ret;
  501. }
  502. static int set_wpc_dsp(sensor_t *sensor, int enable)
  503. {
  504. int ret = 0;
  505. ret = write_reg_bits(sensor->slv_addr, 0x5000, 0x02, enable);
  506. if (ret == 0) {
  507. ESP_LOGD(TAG, "Set wpc to: %d", enable);
  508. sensor->status.wpc = enable;
  509. }
  510. return ret;
  511. }
  512. //Gamma enable
  513. static int set_raw_gma_dsp(sensor_t *sensor, int enable)
  514. {
  515. int ret = 0;
  516. ret = write_reg_bits(sensor->slv_addr, 0x5000, 0x20, enable);
  517. if (ret == 0) {
  518. ESP_LOGD(TAG, "Set raw_gma to: %d", enable);
  519. sensor->status.raw_gma = enable;
  520. }
  521. return ret;
  522. }
  523. static int set_lenc_dsp(sensor_t *sensor, int enable)
  524. {
  525. int ret = 0;
  526. ret = write_reg_bits(sensor->slv_addr, 0x5000, 0x80, enable);
  527. if (ret == 0) {
  528. ESP_LOGD(TAG, "Set lenc to: %d", enable);
  529. sensor->status.lenc = enable;
  530. }
  531. return ret;
  532. }
  533. static int get_agc_gain(sensor_t *sensor)
  534. {
  535. int ra = read_reg(sensor->slv_addr, 0x350a);
  536. if (ra < 0) {
  537. return 0;
  538. }
  539. int rb = read_reg(sensor->slv_addr, 0x350b);
  540. if (rb < 0) {
  541. return 0;
  542. }
  543. int res = (rb & 0xF0) >> 4 | (ra & 0x03) << 4;
  544. if (rb & 0x0F) {
  545. res += 1;
  546. }
  547. return res;
  548. }
  549. //real gain
  550. static int set_agc_gain(sensor_t *sensor, int gain)
  551. {
  552. int ret = 0;
  553. if(gain < 0) {
  554. gain = 0;
  555. } else if(gain > 64) {
  556. gain = 64;
  557. }
  558. //gain value is 6.4 bits float
  559. //in order to use the max range, we deduct 1/16
  560. int gainv = gain << 4;
  561. if(gainv){
  562. gainv -= 1;
  563. }
  564. ret = write_reg(sensor->slv_addr, 0x350a, gainv >> 8) || write_reg(sensor->slv_addr, 0x350b, gainv & 0xff);
  565. if (ret == 0) {
  566. ESP_LOGD(TAG, "Set agc_gain to: %d", gain);
  567. sensor->status.agc_gain = gain;
  568. }
  569. return ret;
  570. }
  571. static int get_aec_value(sensor_t *sensor)
  572. {
  573. int ra = read_reg(sensor->slv_addr, 0x3500);
  574. if (ra < 0) {
  575. return 0;
  576. }
  577. int rb = read_reg(sensor->slv_addr, 0x3501);
  578. if (rb < 0) {
  579. return 0;
  580. }
  581. int rc = read_reg(sensor->slv_addr, 0x3502);
  582. if (rc < 0) {
  583. return 0;
  584. }
  585. int res = (ra & 0x0F) << 12 | (rb & 0xFF) << 4 | (rc & 0xF0) >> 4;
  586. return res;
  587. }
  588. static int set_aec_value(sensor_t *sensor, int value)
  589. {
  590. int ret = 0, max_val = 0;
  591. max_val = read_reg16(sensor->slv_addr, 0x380e);
  592. if (max_val < 0) {
  593. ESP_LOGE(TAG, "Could not read max aec_value");
  594. return -1;
  595. }
  596. if (value > max_val) {
  597. value =max_val;
  598. }
  599. ret = write_reg(sensor->slv_addr, 0x3500, (value >> 12) & 0x0F)
  600. || write_reg(sensor->slv_addr, 0x3501, (value >> 4) & 0xFF)
  601. || write_reg(sensor->slv_addr, 0x3502, (value << 4) & 0xF0);
  602. if (ret == 0) {
  603. ESP_LOGD(TAG, "Set aec_value to: %d / %d", value, max_val);
  604. sensor->status.aec_value = value;
  605. }
  606. return ret;
  607. }
  608. static int set_ae_level(sensor_t *sensor, int level)
  609. {
  610. int ret = 0;
  611. if (level < -5 || level > 5) {
  612. return -1;
  613. }
  614. //good targets are between 5 and 115
  615. int target_level = ((level + 5) * 10) + 5;
  616. int level_high, level_low;
  617. int fast_high, fast_low;
  618. level_low = target_level * 23 / 25; //0.92 (0.46)
  619. level_high = target_level * 27 / 25; //1.08 (2.08)
  620. fast_low = level_low >> 1;
  621. fast_high = level_high << 1;
  622. if(fast_high>255) {
  623. fast_high = 255;
  624. }
  625. ret = write_reg(sensor->slv_addr, 0x3a0f, level_high)
  626. || write_reg(sensor->slv_addr, 0x3a10, level_low)
  627. || write_reg(sensor->slv_addr, 0x3a1b, level_high)
  628. || write_reg(sensor->slv_addr, 0x3a1e, level_low)
  629. || write_reg(sensor->slv_addr, 0x3a11, fast_high)
  630. || write_reg(sensor->slv_addr, 0x3a1f, fast_low);
  631. if (ret == 0) {
  632. ESP_LOGD(TAG, "Set ae_level to: %d", level);
  633. sensor->status.ae_level = level;
  634. }
  635. return ret;
  636. }
  637. static int set_wb_mode(sensor_t *sensor, int mode)
  638. {
  639. int ret = 0;
  640. if (mode < 0 || mode > 4) {
  641. return -1;
  642. }
  643. ret = write_reg(sensor->slv_addr, 0x3406, (mode != 0));
  644. if (ret) {
  645. return ret;
  646. }
  647. switch (mode) {
  648. case 1://Sunny
  649. ret = write_reg16(sensor->slv_addr, 0x3400, 0x5e0) //AWB R GAIN
  650. || write_reg16(sensor->slv_addr, 0x3402, 0x410) //AWB G GAIN
  651. || write_reg16(sensor->slv_addr, 0x3404, 0x540);//AWB B GAIN
  652. break;
  653. case 2://Cloudy
  654. ret = write_reg16(sensor->slv_addr, 0x3400, 0x650) //AWB R GAIN
  655. || write_reg16(sensor->slv_addr, 0x3402, 0x410) //AWB G GAIN
  656. || write_reg16(sensor->slv_addr, 0x3404, 0x4f0);//AWB B GAIN
  657. break;
  658. case 3://Office
  659. ret = write_reg16(sensor->slv_addr, 0x3400, 0x520) //AWB R GAIN
  660. || write_reg16(sensor->slv_addr, 0x3402, 0x410) //AWB G GAIN
  661. || write_reg16(sensor->slv_addr, 0x3404, 0x660);//AWB B GAIN
  662. break;
  663. case 4://HOME
  664. ret = write_reg16(sensor->slv_addr, 0x3400, 0x420) //AWB R GAIN
  665. || write_reg16(sensor->slv_addr, 0x3402, 0x3f0) //AWB G GAIN
  666. || write_reg16(sensor->slv_addr, 0x3404, 0x710);//AWB B GAIN
  667. break;
  668. default://AUTO
  669. break;
  670. }
  671. if (ret == 0) {
  672. ESP_LOGD(TAG, "Set wb_mode to: %d", mode);
  673. sensor->status.wb_mode = mode;
  674. }
  675. return ret;
  676. }
  677. static int set_awb_gain_dsp(sensor_t *sensor, int enable)
  678. {
  679. int ret = 0;
  680. int old_mode = sensor->status.wb_mode;
  681. int mode = enable?old_mode:0;
  682. ret = set_wb_mode(sensor, mode);
  683. if (ret == 0) {
  684. sensor->status.wb_mode = old_mode;
  685. ESP_LOGD(TAG, "Set awb_gain to: %d", enable);
  686. sensor->status.awb_gain = enable;
  687. }
  688. return ret;
  689. }
  690. static int set_special_effect(sensor_t *sensor, int effect)
  691. {
  692. int ret=0;
  693. if (effect < 0 || effect > 6) {
  694. return -1;
  695. }
  696. uint8_t * regs = (uint8_t *)sensor_special_effects[effect];
  697. ret = write_reg(sensor->slv_addr, 0x5580, regs[0])
  698. || write_reg(sensor->slv_addr, 0x5583, regs[1])
  699. || write_reg(sensor->slv_addr, 0x5584, regs[2])
  700. || write_reg(sensor->slv_addr, 0x5003, regs[3]);
  701. if (ret == 0) {
  702. ESP_LOGD(TAG, "Set special_effect to: %d", effect);
  703. sensor->status.special_effect = effect;
  704. }
  705. return ret;
  706. }
  707. static int set_brightness(sensor_t *sensor, int level)
  708. {
  709. int ret = 0;
  710. uint8_t value = 0;
  711. bool negative = false;
  712. switch (level) {
  713. case 3:
  714. value = 0x30;
  715. break;
  716. case 2:
  717. value = 0x20;
  718. break;
  719. case 1:
  720. value = 0x10;
  721. break;
  722. case -1:
  723. value = 0x10;
  724. negative = true;
  725. break;
  726. case -2:
  727. value = 0x20;
  728. negative = true;
  729. break;
  730. case -3:
  731. value = 0x30;
  732. negative = true;
  733. break;
  734. default: // 0
  735. break;
  736. }
  737. ret = write_reg(sensor->slv_addr, 0x5587, value);
  738. if (ret == 0) {
  739. ret = write_reg_bits(sensor->slv_addr, 0x5588, 0x08, negative);
  740. }
  741. if (ret == 0) {
  742. ESP_LOGD(TAG, "Set brightness to: %d", level);
  743. sensor->status.brightness = level;
  744. }
  745. return ret;
  746. }
  747. static int set_contrast(sensor_t *sensor, int level)
  748. {
  749. int ret = 0;
  750. if(level > 3 || level < -3) {
  751. return -1;
  752. }
  753. ret = write_reg(sensor->slv_addr, 0x5586, (level + 4) << 3);
  754. if (ret == 0) {
  755. ESP_LOGD(TAG, "Set contrast to: %d", level);
  756. sensor->status.contrast = level;
  757. }
  758. return ret;
  759. }
  760. static int set_saturation(sensor_t *sensor, int level)
  761. {
  762. int ret = 0;
  763. if(level > 4 || level < -4) {
  764. return -1;
  765. }
  766. uint8_t * regs = (uint8_t *)sensor_saturation_levels[level+4];
  767. for(int i=0; i<11; i++) {
  768. ret = write_reg(sensor->slv_addr, 0x5381 + i, regs[i]);
  769. if (ret) {
  770. break;
  771. }
  772. }
  773. if (ret == 0) {
  774. ESP_LOGD(TAG, "Set saturation to: %d", level);
  775. sensor->status.saturation = level;
  776. }
  777. return ret;
  778. }
  779. static int set_sharpness(sensor_t *sensor, int level)
  780. {
  781. int ret = 0;
  782. if(level > 3 || level < -3) {
  783. return -1;
  784. }
  785. uint8_t mt_offset_2 = (level + 3) * 8;
  786. uint8_t mt_offset_1 = mt_offset_2 + 1;
  787. ret = write_reg_bits(sensor->slv_addr, 0x5308, 0x40, false)//0x40 means auto
  788. || write_reg(sensor->slv_addr, 0x5300, 0x10)
  789. || write_reg(sensor->slv_addr, 0x5301, 0x10)
  790. || write_reg(sensor->slv_addr, 0x5302, mt_offset_1)
  791. || write_reg(sensor->slv_addr, 0x5303, mt_offset_2)
  792. || write_reg(sensor->slv_addr, 0x5309, 0x10)
  793. || write_reg(sensor->slv_addr, 0x530a, 0x10)
  794. || write_reg(sensor->slv_addr, 0x530b, 0x04)
  795. || write_reg(sensor->slv_addr, 0x530c, 0x06);
  796. if (ret == 0) {
  797. ESP_LOGD(TAG, "Set sharpness to: %d", level);
  798. sensor->status.sharpness = level;
  799. }
  800. return ret;
  801. }
  802. static int set_gainceiling(sensor_t *sensor, gainceiling_t level)
  803. {
  804. int ret = 0, l = (int)level;
  805. ret = write_reg(sensor->slv_addr, 0x3A18, (l >> 8) & 3)
  806. || write_reg(sensor->slv_addr, 0x3A19, l & 0xFF);
  807. if (ret == 0) {
  808. ESP_LOGD(TAG, "Set gainceiling to: %d", l);
  809. sensor->status.gainceiling = l;
  810. }
  811. return ret;
  812. }
  813. static int get_denoise(sensor_t *sensor)
  814. {
  815. if (!check_reg_mask(sensor->slv_addr, 0x5308, 0x10)) {
  816. return 0;
  817. }
  818. return (read_reg(sensor->slv_addr, 0x5306) / 4) + 1;
  819. }
  820. static int set_denoise(sensor_t *sensor, int level)
  821. {
  822. int ret = 0;
  823. if (level < 0 || level > 8) {
  824. return -1;
  825. }
  826. ret = write_reg_bits(sensor->slv_addr, 0x5308, 0x10, level > 0);
  827. if (ret == 0 && level > 0) {
  828. ret = write_reg(sensor->slv_addr, 0x5306, (level - 1) * 4);
  829. }
  830. if (ret == 0) {
  831. ESP_LOGD(TAG, "Set denoise to: %d", level);
  832. sensor->status.denoise = level;
  833. }
  834. return ret;
  835. }
  836. static int get_reg(sensor_t *sensor, int reg, int mask)
  837. {
  838. int ret = 0, ret2 = 0;
  839. if(mask > 0xFF){
  840. ret = read_reg16(sensor->slv_addr, reg);
  841. if(ret >= 0 && mask > 0xFFFF){
  842. ret2 = read_reg(sensor->slv_addr, reg+2);
  843. if(ret2 >= 0){
  844. ret = (ret << 8) | ret2 ;
  845. } else {
  846. ret = ret2;
  847. }
  848. }
  849. } else {
  850. ret = read_reg(sensor->slv_addr, reg);
  851. }
  852. if(ret > 0){
  853. ret &= mask;
  854. }
  855. return ret;
  856. }
  857. static int set_reg(sensor_t *sensor, int reg, int mask, int value)
  858. {
  859. int ret = 0, ret2 = 0;
  860. if(mask > 0xFF){
  861. ret = read_reg16(sensor->slv_addr, reg);
  862. if(ret >= 0 && mask > 0xFFFF){
  863. ret2 = read_reg(sensor->slv_addr, reg+2);
  864. if(ret2 >= 0){
  865. ret = (ret << 8) | ret2 ;
  866. } else {
  867. ret = ret2;
  868. }
  869. }
  870. } else {
  871. ret = read_reg(sensor->slv_addr, reg);
  872. }
  873. if(ret < 0){
  874. return ret;
  875. }
  876. value = (ret & ~mask) | (value & mask);
  877. if(mask > 0xFFFF){
  878. ret = write_reg16(sensor->slv_addr, reg, value >> 8);
  879. if(ret >= 0){
  880. ret = write_reg(sensor->slv_addr, reg+2, value & 0xFF);
  881. }
  882. } else if(mask > 0xFF){
  883. ret = write_reg16(sensor->slv_addr, reg, value);
  884. } else {
  885. ret = write_reg(sensor->slv_addr, reg, value);
  886. }
  887. return ret;
  888. }
  889. static int set_res_raw(sensor_t *sensor, int startX, int startY, int endX, int endY, int offsetX, int offsetY, int totalX, int totalY, int outputX, int outputY, bool scale, bool binning)
  890. {
  891. int ret = 0;
  892. ret = write_addr_reg(sensor->slv_addr, X_ADDR_ST_H, startX, startY)
  893. || write_addr_reg(sensor->slv_addr, X_ADDR_END_H, endX, endY)
  894. || write_addr_reg(sensor->slv_addr, X_OFFSET_H, offsetX, offsetY)
  895. || write_addr_reg(sensor->slv_addr, X_TOTAL_SIZE_H, totalX, totalY)
  896. || write_addr_reg(sensor->slv_addr, X_OUTPUT_SIZE_H, outputX, outputY)
  897. || write_reg_bits(sensor->slv_addr, ISP_CONTROL_01, 0x20, scale);
  898. if(!ret){
  899. sensor->status.scale = scale;
  900. sensor->status.binning = binning;
  901. ret = set_image_options(sensor);
  902. }
  903. return ret;
  904. }
  905. static int _set_pll(sensor_t *sensor, int bypass, int multiplier, int sys_div, int root_2x, int pre_div, int seld5, int pclk_manual, int pclk_div)
  906. {
  907. int ret = 0;
  908. ret = set_pll(sensor, bypass > 0, multiplier, sys_div, pre_div, root_2x > 0, seld5, pclk_manual > 0, pclk_div);
  909. return ret;
  910. }
  911. esp_err_t xclk_timer_conf(int ledc_timer, int xclk_freq_hz);
  912. static int set_xclk(sensor_t *sensor, int timer, int xclk)
  913. {
  914. int ret = 0;
  915. sensor->xclk_freq_hz = xclk * 1000000U;
  916. ret = xclk_timer_conf(timer, sensor->xclk_freq_hz);
  917. return ret;
  918. }
  919. static int init_status(sensor_t *sensor)
  920. {
  921. sensor->status.brightness = 0;
  922. sensor->status.contrast = 0;
  923. sensor->status.saturation = 0;
  924. sensor->status.sharpness = (read_reg(sensor->slv_addr, 0x5303) / 8) - 3;
  925. sensor->status.denoise = get_denoise(sensor);
  926. sensor->status.ae_level = 0;
  927. sensor->status.gainceiling = read_reg16(sensor->slv_addr, 0x3A18) & 0x3FF;
  928. sensor->status.awb = check_reg_mask(sensor->slv_addr, ISP_CONTROL_01, 0x01);
  929. sensor->status.dcw = !check_reg_mask(sensor->slv_addr, 0x5183, 0x80);
  930. sensor->status.agc = !check_reg_mask(sensor->slv_addr, AEC_PK_MANUAL, AEC_PK_MANUAL_AGC_MANUALEN);
  931. sensor->status.aec = !check_reg_mask(sensor->slv_addr, AEC_PK_MANUAL, AEC_PK_MANUAL_AEC_MANUALEN);
  932. sensor->status.hmirror = check_reg_mask(sensor->slv_addr, TIMING_TC_REG21, TIMING_TC_REG21_HMIRROR);
  933. sensor->status.vflip = check_reg_mask(sensor->slv_addr, TIMING_TC_REG20, TIMING_TC_REG20_VFLIP);
  934. sensor->status.colorbar = check_reg_mask(sensor->slv_addr, PRE_ISP_TEST_SETTING_1, TEST_COLOR_BAR);
  935. sensor->status.bpc = check_reg_mask(sensor->slv_addr, 0x5000, 0x04);
  936. sensor->status.wpc = check_reg_mask(sensor->slv_addr, 0x5000, 0x02);
  937. sensor->status.raw_gma = check_reg_mask(sensor->slv_addr, 0x5000, 0x20);
  938. sensor->status.lenc = check_reg_mask(sensor->slv_addr, 0x5000, 0x80);
  939. sensor->status.quality = read_reg(sensor->slv_addr, COMPRESSION_CTRL07) & 0x3f;
  940. sensor->status.special_effect = 0;
  941. sensor->status.wb_mode = 0;
  942. sensor->status.awb_gain = check_reg_mask(sensor->slv_addr, 0x3406, 0x01);
  943. sensor->status.agc_gain = get_agc_gain(sensor);
  944. sensor->status.aec_value = get_aec_value(sensor);
  945. sensor->status.aec2 = check_reg_mask(sensor->slv_addr, 0x3a00, 0x04);
  946. return 0;
  947. }
  948. int ov5640_init(sensor_t *sensor)
  949. {
  950. sensor->reset = reset;
  951. sensor->set_pixformat = set_pixformat;
  952. sensor->set_framesize = set_framesize;
  953. sensor->set_contrast = set_contrast;
  954. sensor->set_brightness = set_brightness;
  955. sensor->set_saturation = set_saturation;
  956. sensor->set_sharpness = set_sharpness;
  957. sensor->set_gainceiling = set_gainceiling;
  958. sensor->set_quality = set_quality;
  959. sensor->set_colorbar = set_colorbar;
  960. sensor->set_gain_ctrl = set_gain_ctrl;
  961. sensor->set_exposure_ctrl = set_exposure_ctrl;
  962. sensor->set_whitebal = set_whitebal;
  963. sensor->set_hmirror = set_hmirror;
  964. sensor->set_vflip = set_vflip;
  965. sensor->init_status = init_status;
  966. sensor->set_aec2 = set_aec2;
  967. sensor->set_aec_value = set_aec_value;
  968. sensor->set_special_effect = set_special_effect;
  969. sensor->set_wb_mode = set_wb_mode;
  970. sensor->set_ae_level = set_ae_level;
  971. sensor->set_dcw = set_dcw_dsp;
  972. sensor->set_bpc = set_bpc_dsp;
  973. sensor->set_wpc = set_wpc_dsp;
  974. sensor->set_awb_gain = set_awb_gain_dsp;
  975. sensor->set_agc_gain = set_agc_gain;
  976. sensor->set_raw_gma = set_raw_gma_dsp;
  977. sensor->set_lenc = set_lenc_dsp;
  978. sensor->set_denoise = set_denoise;
  979. sensor->get_reg = get_reg;
  980. sensor->set_reg = set_reg;
  981. sensor->set_res_raw = set_res_raw;
  982. sensor->set_pll = _set_pll;
  983. sensor->set_xclk = set_xclk;
  984. return 0;
  985. }