camera.c 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520
  1. // Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #include "time.h"
  18. #include "sys/time.h"
  19. #include "freertos/FreeRTOS.h"
  20. #include "freertos/task.h"
  21. #include "freertos/semphr.h"
  22. #include "soc/soc.h"
  23. #include "soc/gpio_sig_map.h"
  24. #include "soc/i2s_reg.h"
  25. #include "soc/i2s_struct.h"
  26. #include "soc/io_mux_reg.h"
  27. #include "driver/gpio.h"
  28. #include "driver/rtc_io.h"
  29. #include "driver/periph_ctrl.h"
  30. #include "esp_intr_alloc.h"
  31. #include "esp_system.h"
  32. #include "nvs_flash.h"
  33. #include "nvs.h"
  34. #include "sensor.h"
  35. #include "sccb.h"
  36. #include "esp_camera.h"
  37. #include "camera_common.h"
  38. #include "xclk.h"
  39. #define CONFIG_OV2640_SUPPORT 1
  40. //#define CONFIG_OV7725_SUPPORT 1
  41. //#define CONFIG_OV7725_SUPPORT 1
  42. //#define CONFIG_OV3660_SUPPORT 1
  43. //#define CONFIG_OV5640_SUPPORT 1
  44. #if CONFIG_OV2640_SUPPORT
  45. #include "ov2640.h"
  46. #endif
  47. #if CONFIG_OV7725_SUPPORT
  48. #include "ov7725.h"
  49. #endif
  50. #if CONFIG_OV3660_SUPPORT
  51. #include "ov3660.h"
  52. #endif
  53. #if CONFIG_OV5640_SUPPORT
  54. #include "ov5640.h"
  55. #endif
  56. typedef enum {
  57. CAMERA_NONE = 0,
  58. CAMERA_UNKNOWN = 1,
  59. CAMERA_OV7725 = 7725,
  60. CAMERA_OV2640 = 2640,
  61. CAMERA_OV3660 = 3660,
  62. CAMERA_OV5640 = 5640,
  63. } camera_model_t;
  64. #define REG_PID 0x0A
  65. #define REG_VER 0x0B
  66. #define REG_MIDH 0x1C
  67. #define REG_MIDL 0x1D
  68. #define REG16_CHIDH 0x300A
  69. #define REG16_CHIDL 0x300B
  70. #if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_ARDUHAL_ESP_LOG)
  71. #include "esp32-hal-log.h"
  72. #define TAG ""
  73. #else
  74. #include "esp_log.h"
  75. static const char* TAG = "camera";
  76. #endif
  77. static const char* CAMERA_SENSOR_NVS_KEY = "sensor";
  78. static const char* CAMERA_PIXFORMAT_NVS_KEY = "pixformat";
  79. typedef void (*dma_filter_t)(const dma_elem_t* src, lldesc_t* dma_desc, uint8_t* dst);
  80. typedef struct camera_fb_s {
  81. uint8_t * buf;
  82. size_t len;
  83. size_t width;
  84. size_t height;
  85. pixformat_t format;
  86. struct timeval timestamp;
  87. size_t size;
  88. uint8_t ref;
  89. uint8_t bad;
  90. struct camera_fb_s * next;
  91. } camera_fb_int_t;
  92. typedef struct fb_s {
  93. uint8_t * buf;
  94. size_t len;
  95. struct fb_s * next;
  96. } fb_item_t;
  97. typedef struct {
  98. camera_config_t config;
  99. sensor_t sensor;
  100. camera_fb_int_t *fb;
  101. size_t fb_size;
  102. size_t data_size;
  103. size_t width;
  104. size_t height;
  105. size_t in_bytes_per_pixel;
  106. size_t fb_bytes_per_pixel;
  107. size_t dma_received_count;
  108. size_t dma_filtered_count;
  109. size_t dma_per_line;
  110. size_t dma_buf_width;
  111. size_t dma_sample_count;
  112. lldesc_t *dma_desc;
  113. dma_elem_t **dma_buf;
  114. size_t dma_desc_count;
  115. size_t dma_desc_cur;
  116. i2s_sampling_mode_t sampling_mode;
  117. dma_filter_t dma_filter;
  118. intr_handle_t i2s_intr_handle;
  119. QueueHandle_t data_ready;
  120. QueueHandle_t fb_in;
  121. QueueHandle_t fb_out;
  122. SemaphoreHandle_t frame_ready;
  123. TaskHandle_t dma_filter_task;
  124. } camera_state_t;
  125. camera_state_t* s_state = NULL;
  126. static void i2s_init();
  127. static int i2s_run();
  128. static void IRAM_ATTR vsync_isr(void* arg);
  129. static void IRAM_ATTR i2s_isr(void* arg);
  130. static esp_err_t dma_desc_init();
  131. static void dma_desc_deinit();
  132. static void dma_filter_task(void *pvParameters);
  133. static void dma_filter_grayscale(const dma_elem_t* src, lldesc_t* dma_desc, uint8_t* dst);
  134. static void dma_filter_grayscale_highspeed(const dma_elem_t* src, lldesc_t* dma_desc, uint8_t* dst);
  135. static void dma_filter_yuyv(const dma_elem_t* src, lldesc_t* dma_desc, uint8_t* dst);
  136. static void dma_filter_yuyv_highspeed(const dma_elem_t* src, lldesc_t* dma_desc, uint8_t* dst);
  137. static void dma_filter_jpeg(const dma_elem_t* src, lldesc_t* dma_desc, uint8_t* dst);
  138. static void i2s_stop(bool* need_yield);
  139. static bool is_hs_mode()
  140. {
  141. return s_state->config.xclk_freq_hz > 10000000;
  142. }
  143. static size_t i2s_bytes_per_sample(i2s_sampling_mode_t mode)
  144. {
  145. switch(mode) {
  146. case SM_0A00_0B00:
  147. return 4;
  148. case SM_0A0B_0B0C:
  149. return 4;
  150. case SM_0A0B_0C0D:
  151. return 2;
  152. default:
  153. assert(0 && "invalid sampling mode");
  154. return 0;
  155. }
  156. }
  157. static int IRAM_ATTR _gpio_get_level(gpio_num_t gpio_num)
  158. {
  159. if (gpio_num < 32) {
  160. return (GPIO.in >> gpio_num) & 0x1;
  161. } else {
  162. return (GPIO.in1.data >> (gpio_num - 32)) & 0x1;
  163. }
  164. }
  165. static void IRAM_ATTR vsync_intr_disable()
  166. {
  167. gpio_set_intr_type(s_state->config.pin_vsync, GPIO_INTR_DISABLE);
  168. }
  169. static void vsync_intr_enable()
  170. {
  171. gpio_set_intr_type(s_state->config.pin_vsync, GPIO_INTR_NEGEDGE);
  172. }
  173. static int skip_frame()
  174. {
  175. if (s_state == NULL) {
  176. return -1;
  177. }
  178. int64_t st_t = esp_timer_get_time();
  179. while (_gpio_get_level(s_state->config.pin_vsync) == 0) {
  180. if((esp_timer_get_time() - st_t) > 1000000LL){
  181. goto timeout;
  182. }
  183. }
  184. while (_gpio_get_level(s_state->config.pin_vsync) != 0) {
  185. if((esp_timer_get_time() - st_t) > 1000000LL){
  186. goto timeout;
  187. }
  188. }
  189. while (_gpio_get_level(s_state->config.pin_vsync) == 0) {
  190. if((esp_timer_get_time() - st_t) > 1000000LL){
  191. goto timeout;
  192. }
  193. }
  194. return 0;
  195. timeout:
  196. ESP_LOGE(TAG, "Timeout waiting for VSYNC");
  197. return -1;
  198. }
  199. static void camera_fb_deinit()
  200. {
  201. camera_fb_int_t * _fb1 = s_state->fb, * _fb2 = NULL;
  202. while(s_state->fb) {
  203. _fb2 = s_state->fb;
  204. s_state->fb = _fb2->next;
  205. if(_fb2->next == _fb1) {
  206. s_state->fb = NULL;
  207. }
  208. free(_fb2->buf);
  209. free(_fb2);
  210. }
  211. }
  212. static esp_err_t camera_fb_init(size_t count)
  213. {
  214. if(!count) {
  215. return ESP_ERR_INVALID_ARG;
  216. }
  217. camera_fb_deinit();
  218. ESP_LOGI(TAG, "Allocating %u frame buffers (%d KB total)", count, (s_state->fb_size * count) / 1024);
  219. camera_fb_int_t * _fb = NULL, * _fb1 = NULL, * _fb2 = NULL;
  220. for(size_t i = 0; i < count; i++) {
  221. _fb2 = (camera_fb_int_t *)malloc(sizeof(camera_fb_int_t));
  222. if(!_fb2) {
  223. goto fail;
  224. }
  225. memset(_fb2, 0, sizeof(camera_fb_int_t));
  226. _fb2->size = s_state->fb_size;
  227. _fb2->buf = (uint8_t*) calloc(_fb2->size, 1);
  228. if(!_fb2->buf) {
  229. ESP_LOGI(TAG, "Allocating %d KB frame buffer in PSRAM", s_state->fb_size/1024);
  230. _fb2->buf = (uint8_t*) heap_caps_calloc(_fb2->size, 1, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
  231. } else {
  232. ESP_LOGI(TAG, "Allocating %d KB frame buffer in OnBoard RAM", s_state->fb_size/1024);
  233. }
  234. if(!_fb2->buf) {
  235. free(_fb2);
  236. ESP_LOGE(TAG, "Allocating %d KB frame buffer Failed", s_state->fb_size/1024);
  237. goto fail;
  238. }
  239. memset(_fb2->buf, 0, _fb2->size);
  240. _fb2->next = _fb;
  241. _fb = _fb2;
  242. if(!i) {
  243. _fb1 = _fb2;
  244. }
  245. }
  246. if(_fb1) {
  247. _fb1->next = _fb;
  248. }
  249. s_state->fb = _fb;//load first buffer
  250. return ESP_OK;
  251. fail:
  252. while(_fb) {
  253. _fb2 = _fb;
  254. _fb = _fb->next;
  255. free(_fb2->buf);
  256. free(_fb2);
  257. }
  258. return ESP_ERR_NO_MEM;
  259. }
  260. static esp_err_t dma_desc_init()
  261. {
  262. assert(s_state->width % 4 == 0);
  263. size_t line_size = s_state->width * s_state->in_bytes_per_pixel *
  264. i2s_bytes_per_sample(s_state->sampling_mode);
  265. ESP_LOGD(TAG, "Line width (for DMA): %d bytes", line_size);
  266. size_t dma_per_line = 1;
  267. size_t buf_size = line_size;
  268. while (buf_size >= 4096) {
  269. buf_size /= 2;
  270. dma_per_line *= 2;
  271. }
  272. size_t dma_desc_count = dma_per_line * 4;
  273. s_state->dma_buf_width = line_size;
  274. s_state->dma_per_line = dma_per_line;
  275. s_state->dma_desc_count = dma_desc_count;
  276. ESP_LOGD(TAG, "DMA buffer size: %d, DMA buffers per line: %d", buf_size, dma_per_line);
  277. ESP_LOGD(TAG, "DMA buffer count: %d", dma_desc_count);
  278. ESP_LOGD(TAG, "DMA buffer total: %d bytes", buf_size * dma_desc_count);
  279. s_state->dma_buf = (dma_elem_t**) malloc(sizeof(dma_elem_t*) * dma_desc_count);
  280. if (s_state->dma_buf == NULL) {
  281. return ESP_ERR_NO_MEM;
  282. }
  283. s_state->dma_desc = (lldesc_t*) malloc(sizeof(lldesc_t) * dma_desc_count);
  284. if (s_state->dma_desc == NULL) {
  285. return ESP_ERR_NO_MEM;
  286. }
  287. size_t dma_sample_count = 0;
  288. for (int i = 0; i < dma_desc_count; ++i) {
  289. ESP_LOGD(TAG, "Allocating DMA buffer #%d, size=%d", i, buf_size);
  290. dma_elem_t* buf = (dma_elem_t*) malloc(buf_size);
  291. if (buf == NULL) {
  292. return ESP_ERR_NO_MEM;
  293. }
  294. s_state->dma_buf[i] = buf;
  295. ESP_LOGV(TAG, "dma_buf[%d]=%p", i, buf);
  296. lldesc_t* pd = &s_state->dma_desc[i];
  297. pd->length = buf_size;
  298. if (s_state->sampling_mode == SM_0A0B_0B0C &&
  299. (i + 1) % dma_per_line == 0) {
  300. pd->length -= 4;
  301. }
  302. dma_sample_count += pd->length / 4;
  303. pd->size = pd->length;
  304. pd->owner = 1;
  305. pd->sosf = 1;
  306. pd->buf = (uint8_t*) buf;
  307. pd->offset = 0;
  308. pd->empty = 0;
  309. pd->eof = 1;
  310. pd->qe.stqe_next = &s_state->dma_desc[(i + 1) % dma_desc_count];
  311. }
  312. s_state->dma_sample_count = dma_sample_count;
  313. return ESP_OK;
  314. }
  315. static void dma_desc_deinit()
  316. {
  317. if (s_state->dma_buf) {
  318. for (int i = 0; i < s_state->dma_desc_count; ++i) {
  319. free(s_state->dma_buf[i]);
  320. }
  321. }
  322. free(s_state->dma_buf);
  323. free(s_state->dma_desc);
  324. }
  325. static inline void IRAM_ATTR i2s_conf_reset()
  326. {
  327. const uint32_t lc_conf_reset_flags = I2S_IN_RST_M | I2S_AHBM_RST_M
  328. | I2S_AHBM_FIFO_RST_M;
  329. I2S0.lc_conf.val |= lc_conf_reset_flags;
  330. I2S0.lc_conf.val &= ~lc_conf_reset_flags;
  331. const uint32_t conf_reset_flags = I2S_RX_RESET_M | I2S_RX_FIFO_RESET_M
  332. | I2S_TX_RESET_M | I2S_TX_FIFO_RESET_M;
  333. I2S0.conf.val |= conf_reset_flags;
  334. I2S0.conf.val &= ~conf_reset_flags;
  335. while (I2S0.state.rx_fifo_reset_back) {
  336. ;
  337. }
  338. }
  339. static void i2s_init()
  340. {
  341. camera_config_t* config = &s_state->config;
  342. // Configure input GPIOs
  343. gpio_num_t pins[] = {
  344. config->pin_d7,
  345. config->pin_d6,
  346. config->pin_d5,
  347. config->pin_d4,
  348. config->pin_d3,
  349. config->pin_d2,
  350. config->pin_d1,
  351. config->pin_d0,
  352. config->pin_vsync,
  353. config->pin_href,
  354. config->pin_pclk
  355. };
  356. gpio_config_t conf = {
  357. .mode = GPIO_MODE_INPUT,
  358. .pull_up_en = GPIO_PULLUP_ENABLE,
  359. .pull_down_en = GPIO_PULLDOWN_DISABLE,
  360. .intr_type = GPIO_INTR_DISABLE
  361. };
  362. for (int i = 0; i < sizeof(pins) / sizeof(gpio_num_t); ++i) {
  363. if (rtc_gpio_is_valid_gpio(pins[i])) {
  364. rtc_gpio_deinit(pins[i]);
  365. }
  366. conf.pin_bit_mask = 1LL << pins[i];
  367. gpio_config(&conf);
  368. }
  369. // Route input GPIOs to I2S peripheral using GPIO matrix
  370. gpio_matrix_in(config->pin_d0, I2S0I_DATA_IN0_IDX, false);
  371. gpio_matrix_in(config->pin_d1, I2S0I_DATA_IN1_IDX, false);
  372. gpio_matrix_in(config->pin_d2, I2S0I_DATA_IN2_IDX, false);
  373. gpio_matrix_in(config->pin_d3, I2S0I_DATA_IN3_IDX, false);
  374. gpio_matrix_in(config->pin_d4, I2S0I_DATA_IN4_IDX, false);
  375. gpio_matrix_in(config->pin_d5, I2S0I_DATA_IN5_IDX, false);
  376. gpio_matrix_in(config->pin_d6, I2S0I_DATA_IN6_IDX, false);
  377. gpio_matrix_in(config->pin_d7, I2S0I_DATA_IN7_IDX, false);
  378. gpio_matrix_in(config->pin_vsync, I2S0I_V_SYNC_IDX, false);
  379. gpio_matrix_in(0x38, I2S0I_H_SYNC_IDX, false);
  380. gpio_matrix_in(config->pin_href, I2S0I_H_ENABLE_IDX, false);
  381. gpio_matrix_in(config->pin_pclk, I2S0I_WS_IN_IDX, false);
  382. // Enable and configure I2S peripheral
  383. periph_module_enable(PERIPH_I2S0_MODULE);
  384. // Toggle some reset bits in LC_CONF register
  385. // Toggle some reset bits in CONF register
  386. i2s_conf_reset();
  387. // Enable slave mode (sampling clock is external)
  388. I2S0.conf.rx_slave_mod = 1;
  389. // Enable parallel mode
  390. I2S0.conf2.lcd_en = 1;
  391. // Use HSYNC/VSYNC/HREF to control sampling
  392. I2S0.conf2.camera_en = 1;
  393. // Configure clock divider
  394. I2S0.clkm_conf.clkm_div_a = 1;
  395. I2S0.clkm_conf.clkm_div_b = 0;
  396. I2S0.clkm_conf.clkm_div_num = 2;
  397. // FIFO will sink data to DMA
  398. I2S0.fifo_conf.dscr_en = 1;
  399. // FIFO configuration
  400. I2S0.fifo_conf.rx_fifo_mod = s_state->sampling_mode;
  401. I2S0.fifo_conf.rx_fifo_mod_force_en = 1;
  402. I2S0.conf_chan.rx_chan_mod = 1;
  403. // Clear flags which are used in I2S serial mode
  404. I2S0.sample_rate_conf.rx_bits_mod = 0;
  405. I2S0.conf.rx_right_first = 0;
  406. I2S0.conf.rx_msb_right = 0;
  407. I2S0.conf.rx_msb_shift = 0;
  408. I2S0.conf.rx_mono = 0;
  409. I2S0.conf.rx_short_sync = 0;
  410. I2S0.timing.val = 0;
  411. I2S0.timing.rx_dsync_sw = 1;
  412. // Allocate I2S interrupt, keep it disabled
  413. ESP_ERROR_CHECK(esp_intr_alloc(ETS_I2S0_INTR_SOURCE,
  414. ESP_INTR_FLAG_INTRDISABLED | ESP_INTR_FLAG_LOWMED | ESP_INTR_FLAG_IRAM,
  415. &i2s_isr, NULL, &s_state->i2s_intr_handle));
  416. }
  417. static void IRAM_ATTR i2s_start_bus()
  418. {
  419. s_state->dma_desc_cur = 0;
  420. s_state->dma_received_count = 0;
  421. //s_state->dma_filtered_count = 0;
  422. esp_intr_disable(s_state->i2s_intr_handle);
  423. i2s_conf_reset();
  424. I2S0.rx_eof_num = s_state->dma_sample_count;
  425. I2S0.in_link.addr = (uint32_t) &s_state->dma_desc[0];
  426. I2S0.in_link.start = 1;
  427. I2S0.int_clr.val = I2S0.int_raw.val;
  428. I2S0.int_ena.val = 0;
  429. I2S0.int_ena.in_done = 1;
  430. esp_intr_enable(s_state->i2s_intr_handle);
  431. I2S0.conf.rx_start = 1;
  432. if (s_state->config.pixel_format == PIXFORMAT_JPEG) {
  433. vsync_intr_enable();
  434. }
  435. }
  436. static int i2s_run()
  437. {
  438. for (int i = 0; i < s_state->dma_desc_count; ++i) {
  439. lldesc_t* d = &s_state->dma_desc[i];
  440. ESP_LOGV(TAG, "DMA desc %2d: %u %u %u %u %u %u %p %p",
  441. i, d->length, d->size, d->offset, d->eof, d->sosf, d->owner, d->buf, d->qe.stqe_next);
  442. memset(s_state->dma_buf[i], 0, d->length);
  443. }
  444. // wait for frame
  445. camera_fb_int_t * fb = s_state->fb;
  446. while(s_state->config.fb_count > 1) {
  447. while(s_state->fb->ref && s_state->fb->next != fb) {
  448. s_state->fb = s_state->fb->next;
  449. }
  450. if(s_state->fb->ref == 0) {
  451. break;
  452. }
  453. vTaskDelay(2);
  454. }
  455. //todo: wait for vsync
  456. ESP_LOGV(TAG, "Waiting for negative edge on VSYNC");
  457. int64_t st_t = esp_timer_get_time();
  458. while (_gpio_get_level(s_state->config.pin_vsync) != 0) {
  459. if((esp_timer_get_time() - st_t) > 1000000LL){
  460. ESP_LOGE(TAG, "Timeout waiting for VSYNC");
  461. return -1;
  462. }
  463. }
  464. ESP_LOGV(TAG, "Got VSYNC");
  465. i2s_start_bus();
  466. return 0;
  467. }
  468. static void IRAM_ATTR i2s_stop_bus()
  469. {
  470. esp_intr_disable(s_state->i2s_intr_handle);
  471. vsync_intr_disable();
  472. i2s_conf_reset();
  473. I2S0.conf.rx_start = 0;
  474. }
  475. static void IRAM_ATTR i2s_stop(bool* need_yield)
  476. {
  477. if(s_state->config.fb_count == 1 && !s_state->fb->bad) {
  478. i2s_stop_bus();
  479. } else {
  480. s_state->dma_received_count = 0;
  481. }
  482. size_t val = SIZE_MAX;
  483. BaseType_t higher_priority_task_woken;
  484. BaseType_t ret = xQueueSendFromISR(s_state->data_ready, &val, &higher_priority_task_woken);
  485. if(need_yield && !*need_yield) {
  486. *need_yield = (ret == pdTRUE && higher_priority_task_woken == pdTRUE);
  487. }
  488. }
  489. static void IRAM_ATTR signal_dma_buf_received(bool* need_yield)
  490. {
  491. size_t dma_desc_filled = s_state->dma_desc_cur;
  492. s_state->dma_desc_cur = (dma_desc_filled + 1) % s_state->dma_desc_count;
  493. s_state->dma_received_count++;
  494. if(!s_state->fb->ref && s_state->fb->bad){
  495. *need_yield = false;
  496. return;
  497. }
  498. BaseType_t higher_priority_task_woken;
  499. BaseType_t ret = xQueueSendFromISR(s_state->data_ready, &dma_desc_filled, &higher_priority_task_woken);
  500. if (ret != pdTRUE) {
  501. if(!s_state->fb->ref) {
  502. s_state->fb->bad = 1;
  503. }
  504. //ESP_EARLY_LOGW(TAG, "qsf:%d", s_state->dma_received_count);
  505. //ets_printf("qsf:%d\n", s_state->dma_received_count);
  506. //ets_printf("qovf\n");
  507. }
  508. *need_yield = (ret == pdTRUE && higher_priority_task_woken == pdTRUE);
  509. }
  510. static void IRAM_ATTR i2s_isr(void* arg)
  511. {
  512. I2S0.int_clr.val = I2S0.int_raw.val;
  513. bool need_yield = false;
  514. signal_dma_buf_received(&need_yield);
  515. if (s_state->config.pixel_format != PIXFORMAT_JPEG
  516. && s_state->dma_received_count == s_state->height * s_state->dma_per_line) {
  517. i2s_stop(&need_yield);
  518. }
  519. if (need_yield) {
  520. portYIELD_FROM_ISR();
  521. }
  522. }
  523. static void IRAM_ATTR vsync_isr(void* arg)
  524. {
  525. GPIO.status1_w1tc.val = GPIO.status1.val;
  526. GPIO.status_w1tc = GPIO.status;
  527. bool need_yield = false;
  528. //if vsync is low and we have received some data, frame is done
  529. if (_gpio_get_level(s_state->config.pin_vsync) == 0) {
  530. if(s_state->dma_received_count > 0) {
  531. signal_dma_buf_received(&need_yield);
  532. //ets_printf("end_vsync\n");
  533. if(s_state->dma_filtered_count > 1 || s_state->fb->bad || s_state->config.fb_count > 1) {
  534. i2s_stop(&need_yield);
  535. }
  536. //ets_printf("vs\n");
  537. }
  538. if(s_state->config.fb_count > 1 || s_state->dma_filtered_count < 2) {
  539. I2S0.conf.rx_start = 0;
  540. I2S0.in_link.start = 0;
  541. I2S0.int_clr.val = I2S0.int_raw.val;
  542. i2s_conf_reset();
  543. s_state->dma_desc_cur = (s_state->dma_desc_cur + 1) % s_state->dma_desc_count;
  544. //I2S0.rx_eof_num = s_state->dma_sample_count;
  545. I2S0.in_link.addr = (uint32_t) &s_state->dma_desc[s_state->dma_desc_cur];
  546. I2S0.in_link.start = 1;
  547. I2S0.conf.rx_start = 1;
  548. s_state->dma_received_count = 0;
  549. }
  550. }
  551. if (need_yield) {
  552. portYIELD_FROM_ISR();
  553. }
  554. }
  555. static void IRAM_ATTR camera_fb_done()
  556. {
  557. camera_fb_int_t * fb = NULL, * fb2 = NULL;
  558. BaseType_t taskAwoken = 0;
  559. if(s_state->config.fb_count == 1) {
  560. xSemaphoreGive(s_state->frame_ready);
  561. return;
  562. }
  563. fb = s_state->fb;
  564. if(!fb->ref && fb->len) {
  565. //add reference
  566. fb->ref = 1;
  567. //check if the queue is full
  568. if(xQueueIsQueueFullFromISR(s_state->fb_out) == pdTRUE) {
  569. //pop frame buffer from the queue
  570. if(xQueueReceiveFromISR(s_state->fb_out, &fb2, &taskAwoken) == pdTRUE) {
  571. //free the popped buffer
  572. fb2->ref = 0;
  573. fb2->len = 0;
  574. //push the new frame to the end of the queue
  575. xQueueSendFromISR(s_state->fb_out, &fb, &taskAwoken);
  576. } else {
  577. //queue is full and we could not pop a frame from it
  578. }
  579. } else {
  580. //push the new frame to the end of the queue
  581. xQueueSendFromISR(s_state->fb_out, &fb, &taskAwoken);
  582. }
  583. } else {
  584. //frame was referenced or empty
  585. }
  586. //return buffers to be filled
  587. while(xQueueReceiveFromISR(s_state->fb_in, &fb2, &taskAwoken) == pdTRUE) {
  588. fb2->ref = 0;
  589. fb2->len = 0;
  590. }
  591. //advance frame buffer only if the current one has data
  592. if(s_state->fb->len) {
  593. s_state->fb = s_state->fb->next;
  594. }
  595. //try to find the next free frame buffer
  596. while(s_state->fb->ref && s_state->fb->next != fb) {
  597. s_state->fb = s_state->fb->next;
  598. }
  599. //is the found frame buffer free?
  600. if(!s_state->fb->ref) {
  601. //buffer found. make sure it's empty
  602. s_state->fb->len = 0;
  603. *((uint32_t *)s_state->fb->buf) = 0;
  604. } else {
  605. //stay at the previous buffer
  606. s_state->fb = fb;
  607. }
  608. }
  609. static void IRAM_ATTR dma_finish_frame()
  610. {
  611. size_t buf_len = s_state->width * s_state->fb_bytes_per_pixel / s_state->dma_per_line;
  612. if(!s_state->fb->ref) {
  613. // is the frame bad?
  614. if(s_state->fb->bad){
  615. s_state->fb->bad = 0;
  616. s_state->fb->len = 0;
  617. *((uint32_t *)s_state->fb->buf) = 0;
  618. if(s_state->config.fb_count == 1) {
  619. i2s_start_bus();
  620. }
  621. //ets_printf("bad\n");
  622. } else {
  623. s_state->fb->len = s_state->dma_filtered_count * buf_len;
  624. if(s_state->fb->len) {
  625. //find the end marker for JPEG. Data after that can be discarded
  626. if(s_state->fb->format == PIXFORMAT_JPEG){
  627. uint8_t * dptr = &s_state->fb->buf[s_state->fb->len - 1];
  628. while(dptr > s_state->fb->buf){
  629. if(dptr[0] == 0xFF && dptr[1] == 0xD9 && dptr[2] == 0x00 && dptr[3] == 0x00){
  630. dptr += 2;
  631. s_state->fb->len = dptr - s_state->fb->buf;
  632. if((s_state->fb->len & 0x1FF) == 0){
  633. s_state->fb->len += 1;
  634. }
  635. if((s_state->fb->len % 100) == 0){
  636. s_state->fb->len += 1;
  637. }
  638. break;
  639. }
  640. dptr--;
  641. }
  642. }
  643. //send out the frame
  644. camera_fb_done();
  645. } else if(s_state->config.fb_count == 1){
  646. //frame was empty?
  647. i2s_start_bus();
  648. } else {
  649. //ets_printf("empty\n");
  650. }
  651. }
  652. } else if(s_state->fb->len) {
  653. camera_fb_done();
  654. }
  655. s_state->dma_filtered_count = 0;
  656. }
  657. static void IRAM_ATTR dma_filter_buffer(size_t buf_idx)
  658. {
  659. //no need to process the data if frame is in use or is bad
  660. if(s_state->fb->ref || s_state->fb->bad) {
  661. return;
  662. }
  663. //check if there is enough space in the frame buffer for the new data
  664. size_t buf_len = s_state->width * s_state->fb_bytes_per_pixel / s_state->dma_per_line;
  665. size_t fb_pos = s_state->dma_filtered_count * buf_len;
  666. if(fb_pos > s_state->fb_size - buf_len) {
  667. //size_t processed = s_state->dma_received_count * buf_len;
  668. //ets_printf("[%s:%u] ovf pos: %u, processed: %u\n", __FUNCTION__, __LINE__, fb_pos, processed);
  669. return;
  670. }
  671. //convert I2S DMA buffer to pixel data
  672. (*s_state->dma_filter)(s_state->dma_buf[buf_idx], &s_state->dma_desc[buf_idx], s_state->fb->buf + fb_pos);
  673. //first frame buffer
  674. if(!s_state->dma_filtered_count) {
  675. //check for correct JPEG header
  676. if(s_state->sensor.pixformat == PIXFORMAT_JPEG) {
  677. uint32_t sig = *((uint32_t *)s_state->fb->buf) & 0xFFFFFF;
  678. if(sig != 0xffd8ff) {
  679. ets_printf("bh 0x%08x\n", sig);
  680. s_state->fb->bad = 1;
  681. return;
  682. }
  683. }
  684. //set the frame properties
  685. s_state->fb->width = resolution[s_state->sensor.status.framesize].width;
  686. s_state->fb->height = resolution[s_state->sensor.status.framesize].height;
  687. s_state->fb->format = s_state->sensor.pixformat;
  688. uint64_t us = (uint64_t)esp_timer_get_time();
  689. s_state->fb->timestamp.tv_sec = us / 1000000UL;
  690. s_state->fb->timestamp.tv_usec = us % 1000000UL;
  691. }
  692. s_state->dma_filtered_count++;
  693. }
  694. static void IRAM_ATTR dma_filter_task(void *pvParameters)
  695. {
  696. s_state->dma_filtered_count = 0;
  697. while (true) {
  698. size_t buf_idx;
  699. if(xQueueReceive(s_state->data_ready, &buf_idx, portMAX_DELAY) == pdTRUE) {
  700. if (buf_idx == SIZE_MAX) {
  701. //this is the end of the frame
  702. dma_finish_frame();
  703. } else {
  704. dma_filter_buffer(buf_idx);
  705. }
  706. }
  707. }
  708. }
  709. static void IRAM_ATTR dma_filter_jpeg(const dma_elem_t* src, lldesc_t* dma_desc, uint8_t* dst)
  710. {
  711. size_t end = dma_desc->length / sizeof(dma_elem_t) / 4;
  712. // manually unrolling 4 iterations of the loop here
  713. for (size_t i = 0; i < end; ++i) {
  714. dst[0] = src[0].sample1;
  715. dst[1] = src[1].sample1;
  716. dst[2] = src[2].sample1;
  717. dst[3] = src[3].sample1;
  718. src += 4;
  719. dst += 4;
  720. }
  721. }
  722. static void IRAM_ATTR dma_filter_grayscale(const dma_elem_t* src, lldesc_t* dma_desc, uint8_t* dst)
  723. {
  724. size_t end = dma_desc->length / sizeof(dma_elem_t) / 4;
  725. for (size_t i = 0; i < end; ++i) {
  726. // manually unrolling 4 iterations of the loop here
  727. dst[0] = src[0].sample1;
  728. dst[1] = src[1].sample1;
  729. dst[2] = src[2].sample1;
  730. dst[3] = src[3].sample1;
  731. src += 4;
  732. dst += 4;
  733. }
  734. }
  735. static void IRAM_ATTR dma_filter_grayscale_highspeed(const dma_elem_t* src, lldesc_t* dma_desc, uint8_t* dst)
  736. {
  737. size_t end = dma_desc->length / sizeof(dma_elem_t) / 8;
  738. for (size_t i = 0; i < end; ++i) {
  739. // manually unrolling 4 iterations of the loop here
  740. dst[0] = src[0].sample1;
  741. dst[1] = src[2].sample1;
  742. dst[2] = src[4].sample1;
  743. dst[3] = src[6].sample1;
  744. src += 8;
  745. dst += 4;
  746. }
  747. // the final sample of a line in SM_0A0B_0B0C sampling mode needs special handling
  748. if ((dma_desc->length & 0x7) != 0) {
  749. dst[0] = src[0].sample1;
  750. dst[1] = src[2].sample1;
  751. }
  752. }
  753. static void IRAM_ATTR dma_filter_yuyv(const dma_elem_t* src, lldesc_t* dma_desc, uint8_t* dst)
  754. {
  755. size_t end = dma_desc->length / sizeof(dma_elem_t) / 4;
  756. for (size_t i = 0; i < end; ++i) {
  757. dst[0] = src[0].sample1;//y0
  758. dst[1] = src[0].sample2;//u
  759. dst[2] = src[1].sample1;//y1
  760. dst[3] = src[1].sample2;//v
  761. dst[4] = src[2].sample1;//y0
  762. dst[5] = src[2].sample2;//u
  763. dst[6] = src[3].sample1;//y1
  764. dst[7] = src[3].sample2;//v
  765. src += 4;
  766. dst += 8;
  767. }
  768. }
  769. static void IRAM_ATTR dma_filter_yuyv_highspeed(const dma_elem_t* src, lldesc_t* dma_desc, uint8_t* dst)
  770. {
  771. size_t end = dma_desc->length / sizeof(dma_elem_t) / 8;
  772. for (size_t i = 0; i < end; ++i) {
  773. dst[0] = src[0].sample1;//y0
  774. dst[1] = src[1].sample1;//u
  775. dst[2] = src[2].sample1;//y1
  776. dst[3] = src[3].sample1;//v
  777. dst[4] = src[4].sample1;//y0
  778. dst[5] = src[5].sample1;//u
  779. dst[6] = src[6].sample1;//y1
  780. dst[7] = src[7].sample1;//v
  781. src += 8;
  782. dst += 8;
  783. }
  784. if ((dma_desc->length & 0x7) != 0) {
  785. dst[0] = src[0].sample1;//y0
  786. dst[1] = src[1].sample1;//u
  787. dst[2] = src[2].sample1;//y1
  788. dst[3] = src[2].sample2;//v
  789. }
  790. }
  791. static void IRAM_ATTR dma_filter_rgb888(const dma_elem_t* src, lldesc_t* dma_desc, uint8_t* dst)
  792. {
  793. size_t end = dma_desc->length / sizeof(dma_elem_t) / 4;
  794. uint8_t lb, hb;
  795. for (size_t i = 0; i < end; ++i) {
  796. hb = src[0].sample1;
  797. lb = src[0].sample2;
  798. dst[0] = (lb & 0x1F) << 3;
  799. dst[1] = (hb & 0x07) << 5 | (lb & 0xE0) >> 3;
  800. dst[2] = hb & 0xF8;
  801. hb = src[1].sample1;
  802. lb = src[1].sample2;
  803. dst[3] = (lb & 0x1F) << 3;
  804. dst[4] = (hb & 0x07) << 5 | (lb & 0xE0) >> 3;
  805. dst[5] = hb & 0xF8;
  806. hb = src[2].sample1;
  807. lb = src[2].sample2;
  808. dst[6] = (lb & 0x1F) << 3;
  809. dst[7] = (hb & 0x07) << 5 | (lb & 0xE0) >> 3;
  810. dst[8] = hb & 0xF8;
  811. hb = src[3].sample1;
  812. lb = src[3].sample2;
  813. dst[9] = (lb & 0x1F) << 3;
  814. dst[10] = (hb & 0x07) << 5 | (lb & 0xE0) >> 3;
  815. dst[11] = hb & 0xF8;
  816. src += 4;
  817. dst += 12;
  818. }
  819. }
  820. static void IRAM_ATTR dma_filter_rgb888_highspeed(const dma_elem_t* src, lldesc_t* dma_desc, uint8_t* dst)
  821. {
  822. size_t end = dma_desc->length / sizeof(dma_elem_t) / 8;
  823. uint8_t lb, hb;
  824. for (size_t i = 0; i < end; ++i) {
  825. hb = src[0].sample1;
  826. lb = src[1].sample1;
  827. dst[0] = (lb & 0x1F) << 3;
  828. dst[1] = (hb & 0x07) << 5 | (lb & 0xE0) >> 3;
  829. dst[2] = hb & 0xF8;
  830. hb = src[2].sample1;
  831. lb = src[3].sample1;
  832. dst[3] = (lb & 0x1F) << 3;
  833. dst[4] = (hb & 0x07) << 5 | (lb & 0xE0) >> 3;
  834. dst[5] = hb & 0xF8;
  835. hb = src[4].sample1;
  836. lb = src[5].sample1;
  837. dst[6] = (lb & 0x1F) << 3;
  838. dst[7] = (hb & 0x07) << 5 | (lb & 0xE0) >> 3;
  839. dst[8] = hb & 0xF8;
  840. hb = src[6].sample1;
  841. lb = src[7].sample1;
  842. dst[9] = (lb & 0x1F) << 3;
  843. dst[10] = (hb & 0x07) << 5 | (lb & 0xE0) >> 3;
  844. dst[11] = hb & 0xF8;
  845. src += 8;
  846. dst += 12;
  847. }
  848. if ((dma_desc->length & 0x7) != 0) {
  849. hb = src[0].sample1;
  850. lb = src[1].sample1;
  851. dst[0] = (lb & 0x1F) << 3;
  852. dst[1] = (hb & 0x07) << 5 | (lb & 0xE0) >> 3;
  853. dst[2] = hb & 0xF8;
  854. hb = src[2].sample1;
  855. lb = src[2].sample2;
  856. dst[3] = (lb & 0x1F) << 3;
  857. dst[4] = (hb & 0x07) << 5 | (lb & 0xE0) >> 3;
  858. dst[5] = hb & 0xF8;
  859. }
  860. }
  861. /*
  862. * Public Methods
  863. * */
  864. esp_err_t camera_probe(const camera_config_t* config, camera_model_t* out_camera_model)
  865. {
  866. if (s_state != NULL) {
  867. return ESP_ERR_INVALID_STATE;
  868. }
  869. s_state = (camera_state_t*) calloc(sizeof(*s_state), 1);
  870. if (!s_state) {
  871. return ESP_ERR_NO_MEM;
  872. }
  873. ESP_LOGD(TAG, "Enabling XCLK output");
  874. camera_enable_out_clock(config);
  875. ESP_LOGD(TAG, "Initializing SSCB");
  876. SCCB_Init(config->pin_sscb_sda, config->pin_sscb_scl);
  877. if(config->pin_pwdn >= 0) {
  878. ESP_LOGD(TAG, "Resetting camera by power down line");
  879. gpio_config_t conf = { 0 };
  880. conf.pin_bit_mask = 1LL << config->pin_pwdn;
  881. conf.mode = GPIO_MODE_OUTPUT;
  882. gpio_config(&conf);
  883. // carefull, logic is inverted compared to reset pin
  884. gpio_set_level(config->pin_pwdn, 1);
  885. vTaskDelay(10 / portTICK_PERIOD_MS);
  886. gpio_set_level(config->pin_pwdn, 0);
  887. vTaskDelay(10 / portTICK_PERIOD_MS);
  888. }
  889. if(config->pin_reset >= 0) {
  890. ESP_LOGD(TAG, "Resetting camera");
  891. gpio_config_t conf = { 0 };
  892. conf.pin_bit_mask = 1LL << config->pin_reset;
  893. conf.mode = GPIO_MODE_OUTPUT;
  894. gpio_config(&conf);
  895. gpio_set_level(config->pin_reset, 0);
  896. vTaskDelay(10 / portTICK_PERIOD_MS);
  897. gpio_set_level(config->pin_reset, 1);
  898. vTaskDelay(10 / portTICK_PERIOD_MS);
  899. }
  900. ESP_LOGD(TAG, "Searching for camera address");
  901. vTaskDelay(10 / portTICK_PERIOD_MS);
  902. uint8_t slv_addr = SCCB_Probe();
  903. if (slv_addr == 0) {
  904. *out_camera_model = CAMERA_NONE;
  905. camera_disable_out_clock();
  906. return ESP_ERR_CAMERA_NOT_DETECTED;
  907. }
  908. //slv_addr = 0x30;
  909. ESP_LOGD(TAG, "Detected camera at address=0x%02x", slv_addr);
  910. sensor_id_t* id = &s_state->sensor.id;
  911. #if CONFIG_OV2640_SUPPORT
  912. if (slv_addr == 0x30) {
  913. ESP_LOGD(TAG, "Resetting OV2640");
  914. //camera might be OV2640. try to reset it
  915. SCCB_Write(0x30, 0xFF, 0x01);//bank sensor
  916. SCCB_Write(0x30, 0x12, 0x80);//reset
  917. vTaskDelay(10 / portTICK_PERIOD_MS);
  918. slv_addr = SCCB_Probe();
  919. }
  920. #endif
  921. s_state->sensor.slv_addr = slv_addr;
  922. s_state->sensor.xclk_freq_hz = config->xclk_freq_hz;
  923. #if (CONFIG_OV3660_SUPPORT || CONFIG_OV5640_SUPPORT)
  924. if(s_state->sensor.slv_addr == 0x3c){
  925. id->PID = SCCB_Read16(s_state->sensor.slv_addr, REG16_CHIDH);
  926. id->VER = SCCB_Read16(s_state->sensor.slv_addr, REG16_CHIDL);
  927. vTaskDelay(10 / portTICK_PERIOD_MS);
  928. ESP_LOGD(TAG, "Camera PID=0x%02x VER=0x%02x", id->PID, id->VER);
  929. } else {
  930. #endif
  931. id->PID = SCCB_Read(s_state->sensor.slv_addr, REG_PID);
  932. id->VER = SCCB_Read(s_state->sensor.slv_addr, REG_VER);
  933. id->MIDL = SCCB_Read(s_state->sensor.slv_addr, REG_MIDL);
  934. id->MIDH = SCCB_Read(s_state->sensor.slv_addr, REG_MIDH);
  935. vTaskDelay(10 / portTICK_PERIOD_MS);
  936. ESP_LOGD(TAG, "Camera PID=0x%02x VER=0x%02x MIDL=0x%02x MIDH=0x%02x",
  937. id->PID, id->VER, id->MIDH, id->MIDL);
  938. #if (CONFIG_OV3660_SUPPORT || CONFIG_OV5640_SUPPORT)
  939. }
  940. #endif
  941. switch (id->PID) {
  942. #if CONFIG_OV2640_SUPPORT
  943. case OV2640_PID:
  944. *out_camera_model = CAMERA_OV2640;
  945. ov2640_init(&s_state->sensor);
  946. break;
  947. #endif
  948. #if CONFIG_OV7725_SUPPORT
  949. case OV7725_PID:
  950. *out_camera_model = CAMERA_OV7725;
  951. ov7725_init(&s_state->sensor);
  952. break;
  953. #endif
  954. #if CONFIG_OV3660_SUPPORT
  955. case OV3660_PID:
  956. *out_camera_model = CAMERA_OV3660;
  957. ov3660_init(&s_state->sensor);
  958. break;
  959. #endif
  960. #if CONFIG_OV5640_SUPPORT
  961. case OV5640_PID:
  962. *out_camera_model = CAMERA_OV5640;
  963. ov5640_init(&s_state->sensor);
  964. break;
  965. #endif
  966. default:
  967. id->PID = 0;
  968. *out_camera_model = CAMERA_UNKNOWN;
  969. camera_disable_out_clock();
  970. ESP_LOGE(TAG, "Detected camera not supported.");
  971. return ESP_ERR_CAMERA_NOT_SUPPORTED;
  972. }
  973. ESP_LOGD(TAG, "Doing SW reset of sensor");
  974. s_state->sensor.reset(&s_state->sensor);
  975. return ESP_OK;
  976. }
  977. esp_err_t camera_init(const camera_config_t* config)
  978. {
  979. if (!s_state) {
  980. return ESP_ERR_INVALID_STATE;
  981. }
  982. if (s_state->sensor.id.PID == 0) {
  983. return ESP_ERR_CAMERA_NOT_SUPPORTED;
  984. }
  985. memcpy(&s_state->config, config, sizeof(*config));
  986. esp_err_t err = ESP_OK;
  987. framesize_t frame_size = (framesize_t) config->frame_size;
  988. pixformat_t pix_format = (pixformat_t) config->pixel_format;
  989. switch (s_state->sensor.id.PID) {
  990. #if CONFIG_OV2640_SUPPORT
  991. case OV2640_PID:
  992. if (frame_size > FRAMESIZE_UXGA) {
  993. frame_size = FRAMESIZE_UXGA;
  994. }
  995. break;
  996. #endif
  997. #if CONFIG_OV7725_SUPPORT
  998. case OV7725_PID:
  999. if (frame_size > FRAMESIZE_VGA) {
  1000. frame_size = FRAMESIZE_VGA;
  1001. }
  1002. break;
  1003. #endif
  1004. #if CONFIG_OV3660_SUPPORT
  1005. case OV3660_PID:
  1006. if (frame_size > FRAMESIZE_QXGA) {
  1007. frame_size = FRAMESIZE_QXGA;
  1008. }
  1009. break;
  1010. #endif
  1011. #if CONFIG_OV5640_SUPPORT
  1012. case OV5640_PID:
  1013. if (frame_size > FRAMESIZE_QSXGA) {
  1014. frame_size = FRAMESIZE_QSXGA;
  1015. }
  1016. break;
  1017. #endif
  1018. default:
  1019. return ESP_ERR_CAMERA_NOT_SUPPORTED;
  1020. }
  1021. s_state->width = resolution[frame_size].width;
  1022. s_state->height = resolution[frame_size].height;
  1023. if (pix_format == PIXFORMAT_GRAYSCALE) {
  1024. s_state->fb_size = s_state->width * s_state->height;
  1025. if (s_state->sensor.id.PID == OV3660_PID || s_state->sensor.id.PID == OV5640_PID) {
  1026. if (is_hs_mode()) {
  1027. s_state->sampling_mode = SM_0A00_0B00;
  1028. s_state->dma_filter = &dma_filter_yuyv_highspeed;
  1029. } else {
  1030. s_state->sampling_mode = SM_0A0B_0C0D;
  1031. s_state->dma_filter = &dma_filter_yuyv;
  1032. }
  1033. s_state->in_bytes_per_pixel = 1; // camera sends Y8
  1034. } else {
  1035. if (is_hs_mode() && s_state->sensor.id.PID != OV7725_PID) {
  1036. s_state->sampling_mode = SM_0A00_0B00;
  1037. s_state->dma_filter = &dma_filter_grayscale_highspeed;
  1038. } else {
  1039. s_state->sampling_mode = SM_0A0B_0C0D;
  1040. s_state->dma_filter = &dma_filter_grayscale;
  1041. }
  1042. s_state->in_bytes_per_pixel = 2; // camera sends YU/YV
  1043. }
  1044. s_state->fb_bytes_per_pixel = 1; // frame buffer stores Y8
  1045. } else if (pix_format == PIXFORMAT_YUV422 || pix_format == PIXFORMAT_RGB565) {
  1046. s_state->fb_size = s_state->width * s_state->height * 2;
  1047. if (is_hs_mode() && s_state->sensor.id.PID != OV7725_PID) {
  1048. s_state->sampling_mode = SM_0A00_0B00;
  1049. s_state->dma_filter = &dma_filter_yuyv_highspeed;
  1050. } else {
  1051. s_state->sampling_mode = SM_0A0B_0C0D;
  1052. s_state->dma_filter = &dma_filter_yuyv;
  1053. }
  1054. s_state->in_bytes_per_pixel = 2; // camera sends YU/YV
  1055. s_state->fb_bytes_per_pixel = 2; // frame buffer stores YU/YV/RGB565
  1056. } else if (pix_format == PIXFORMAT_RGB888) {
  1057. s_state->fb_size = s_state->width * s_state->height * 3;
  1058. if (is_hs_mode()) {
  1059. s_state->sampling_mode = SM_0A00_0B00;
  1060. s_state->dma_filter = &dma_filter_rgb888_highspeed;
  1061. } else {
  1062. s_state->sampling_mode = SM_0A0B_0C0D;
  1063. s_state->dma_filter = &dma_filter_rgb888;
  1064. }
  1065. s_state->in_bytes_per_pixel = 2; // camera sends RGB565
  1066. s_state->fb_bytes_per_pixel = 3; // frame buffer stores RGB888
  1067. } else if (pix_format == PIXFORMAT_JPEG) {
  1068. if (s_state->sensor.id.PID != OV2640_PID && s_state->sensor.id.PID != OV3660_PID && s_state->sensor.id.PID != OV5640_PID) {
  1069. ESP_LOGE(TAG, "JPEG format is only supported for ov2640, ov3660 and ov5640");
  1070. err = ESP_ERR_NOT_SUPPORTED;
  1071. goto fail;
  1072. }
  1073. int qp = config->jpeg_quality;
  1074. int compression_ratio_bound = 1;
  1075. if (qp > 10) {
  1076. compression_ratio_bound = 16;
  1077. } else if (qp > 5) {
  1078. compression_ratio_bound = 10;
  1079. } else {
  1080. compression_ratio_bound = 4;
  1081. }
  1082. (*s_state->sensor.set_quality)(&s_state->sensor, qp);
  1083. s_state->in_bytes_per_pixel = 2;
  1084. s_state->fb_bytes_per_pixel = 2;
  1085. s_state->fb_size = (s_state->width * s_state->height * s_state->fb_bytes_per_pixel) / compression_ratio_bound;
  1086. s_state->dma_filter = &dma_filter_jpeg;
  1087. s_state->sampling_mode = SM_0A00_0B00;
  1088. } else {
  1089. ESP_LOGE(TAG, "Requested format is not supported");
  1090. err = ESP_ERR_NOT_SUPPORTED;
  1091. goto fail;
  1092. }
  1093. ESP_LOGD(TAG, "in_bpp: %d, fb_bpp: %d, fb_size: %d, mode: %d, width: %d height: %d",
  1094. s_state->in_bytes_per_pixel, s_state->fb_bytes_per_pixel,
  1095. s_state->fb_size, s_state->sampling_mode,
  1096. s_state->width, s_state->height);
  1097. i2s_init();
  1098. err = dma_desc_init();
  1099. if (err != ESP_OK) {
  1100. ESP_LOGE(TAG, "Failed to initialize I2S and DMA");
  1101. goto fail;
  1102. }
  1103. //s_state->fb_size = 75 * 1024;
  1104. err = camera_fb_init(s_state->config.fb_count);
  1105. if (err != ESP_OK) {
  1106. ESP_LOGE(TAG, "Failed to allocate frame buffer");
  1107. goto fail;
  1108. }
  1109. s_state->data_ready = xQueueCreate(16, sizeof(size_t));
  1110. if (s_state->data_ready == NULL) {
  1111. ESP_LOGE(TAG, "Failed to dma queue");
  1112. err = ESP_ERR_NO_MEM;
  1113. goto fail;
  1114. }
  1115. if(s_state->config.fb_count == 1) {
  1116. s_state->frame_ready = xSemaphoreCreateBinary();
  1117. if (s_state->frame_ready == NULL) {
  1118. ESP_LOGE(TAG, "Failed to create semaphore");
  1119. err = ESP_ERR_NO_MEM;
  1120. goto fail;
  1121. }
  1122. } else {
  1123. s_state->fb_in = xQueueCreate(s_state->config.fb_count, sizeof(camera_fb_t *));
  1124. s_state->fb_out = xQueueCreate(1, sizeof(camera_fb_t *));
  1125. if (s_state->fb_in == NULL || s_state->fb_out == NULL) {
  1126. ESP_LOGE(TAG, "Failed to fb queues");
  1127. err = ESP_ERR_NO_MEM;
  1128. goto fail;
  1129. }
  1130. }
  1131. //ToDo: core affinity?
  1132. #if CONFIG_CAMERA_CORE0
  1133. if (!xTaskCreatePinnedToCore(&dma_filter_task, "dma_filter", 4096, NULL, 10, &s_state->dma_filter_task, 0))
  1134. #elif CONFIG_CAMERA_CORE1
  1135. if (!xTaskCreatePinnedToCore(&dma_filter_task, "dma_filter", 4096, NULL, 10, &s_state->dma_filter_task, 1))
  1136. #else
  1137. if (!xTaskCreate(&dma_filter_task, "dma_filter", 4096, NULL, 10, &s_state->dma_filter_task))
  1138. #endif
  1139. {
  1140. ESP_LOGE(TAG, "Failed to create DMA filter task");
  1141. err = ESP_ERR_NO_MEM;
  1142. goto fail;
  1143. }
  1144. vsync_intr_disable();
  1145. err = gpio_install_isr_service(ESP_INTR_FLAG_LEVEL1 | ESP_INTR_FLAG_IRAM);
  1146. if (err != ESP_OK) {
  1147. ESP_LOGE(TAG, "gpio_install_isr_service failed (%x)", err);
  1148. goto fail;
  1149. }
  1150. err = gpio_isr_handler_add(s_state->config.pin_vsync, &vsync_isr, NULL);
  1151. if (err != ESP_OK) {
  1152. ESP_LOGE(TAG, "vsync_isr_handler_add failed (%x)", err);
  1153. goto fail;
  1154. }
  1155. s_state->sensor.status.framesize = frame_size;
  1156. s_state->sensor.pixformat = pix_format;
  1157. ESP_LOGD(TAG, "Setting frame size to %dx%d", s_state->width, s_state->height);
  1158. if (s_state->sensor.set_framesize(&s_state->sensor, frame_size) != 0) {
  1159. ESP_LOGE(TAG, "Failed to set frame size");
  1160. err = ESP_ERR_CAMERA_FAILED_TO_SET_FRAME_SIZE;
  1161. goto fail;
  1162. }
  1163. s_state->sensor.set_pixformat(&s_state->sensor, pix_format);
  1164. if (s_state->sensor.id.PID == OV2640_PID) {
  1165. s_state->sensor.set_gainceiling(&s_state->sensor, GAINCEILING_2X);
  1166. s_state->sensor.set_bpc(&s_state->sensor, false);
  1167. s_state->sensor.set_wpc(&s_state->sensor, true);
  1168. s_state->sensor.set_lenc(&s_state->sensor, true);
  1169. }
  1170. if (skip_frame()) {
  1171. err = ESP_ERR_CAMERA_FAILED_TO_SET_OUT_FORMAT;
  1172. goto fail;
  1173. }
  1174. //todo: for some reason the first set of the quality does not work.
  1175. if (pix_format == PIXFORMAT_JPEG) {
  1176. (*s_state->sensor.set_quality)(&s_state->sensor, config->jpeg_quality);
  1177. }
  1178. s_state->sensor.init_status(&s_state->sensor);
  1179. return ESP_OK;
  1180. fail:
  1181. esp_camera_deinit();
  1182. return err;
  1183. }
  1184. esp_err_t esp_camera_init(const camera_config_t* config)
  1185. {
  1186. camera_model_t camera_model = CAMERA_NONE;
  1187. esp_err_t err = camera_probe(config, &camera_model);
  1188. if (err != ESP_OK) {
  1189. ESP_LOGE(TAG, "Camera probe failed with error 0x%x", err);
  1190. goto fail;
  1191. }
  1192. if (camera_model == CAMERA_OV7725) {
  1193. ESP_LOGI(TAG, "Detected OV7725 camera");
  1194. if(config->pixel_format == PIXFORMAT_JPEG) {
  1195. ESP_LOGE(TAG, "Camera does not support JPEG");
  1196. err = ESP_ERR_CAMERA_NOT_SUPPORTED;
  1197. goto fail;
  1198. }
  1199. } else if (camera_model == CAMERA_OV2640) {
  1200. ESP_LOGI(TAG, "Detected OV2640 camera");
  1201. } else if (camera_model == CAMERA_OV3660) {
  1202. ESP_LOGI(TAG, "Detected OV3660 camera");
  1203. } else if (camera_model == CAMERA_OV5640) {
  1204. ESP_LOGI(TAG, "Detected OV5640 camera");
  1205. } else {
  1206. ESP_LOGI(TAG, "Camera not supported");
  1207. err = ESP_ERR_CAMERA_NOT_SUPPORTED;
  1208. goto fail;
  1209. }
  1210. err = camera_init(config);
  1211. if (err != ESP_OK) {
  1212. ESP_LOGE(TAG, "Camera init failed with error 0x%x", err);
  1213. return err;
  1214. }
  1215. return ESP_OK;
  1216. fail:
  1217. free(s_state);
  1218. s_state = NULL;
  1219. camera_disable_out_clock();
  1220. return err;
  1221. }
  1222. esp_err_t esp_camera_deinit()
  1223. {
  1224. if (s_state == NULL) {
  1225. return ESP_ERR_INVALID_STATE;
  1226. }
  1227. if (s_state->dma_filter_task) {
  1228. vTaskDelete(s_state->dma_filter_task);
  1229. }
  1230. if (s_state->data_ready) {
  1231. vQueueDelete(s_state->data_ready);
  1232. }
  1233. if (s_state->fb_in) {
  1234. vQueueDelete(s_state->fb_in);
  1235. }
  1236. if (s_state->fb_out) {
  1237. vQueueDelete(s_state->fb_out);
  1238. }
  1239. if (s_state->frame_ready) {
  1240. vSemaphoreDelete(s_state->frame_ready);
  1241. }
  1242. gpio_isr_handler_remove(s_state->config.pin_vsync);
  1243. if (s_state->i2s_intr_handle) {
  1244. esp_intr_disable(s_state->i2s_intr_handle);
  1245. esp_intr_free(s_state->i2s_intr_handle);
  1246. }
  1247. dma_desc_deinit();
  1248. camera_fb_deinit();
  1249. free(s_state);
  1250. s_state = NULL;
  1251. camera_disable_out_clock();
  1252. periph_module_disable(PERIPH_I2S0_MODULE);
  1253. return ESP_OK;
  1254. }
  1255. #define FB_GET_TIMEOUT (4000 / portTICK_PERIOD_MS)
  1256. camera_fb_t* esp_camera_fb_get()
  1257. {
  1258. if (s_state == NULL) {
  1259. return NULL;
  1260. }
  1261. if(!I2S0.conf.rx_start) {
  1262. if(s_state->config.fb_count > 1) {
  1263. ESP_LOGD(TAG, "i2s_run");
  1264. }
  1265. if (i2s_run() != 0) {
  1266. return NULL;
  1267. }
  1268. }
  1269. bool need_yield = false;
  1270. if (s_state->config.fb_count == 1) {
  1271. if (xSemaphoreTake(s_state->frame_ready, FB_GET_TIMEOUT) != pdTRUE){
  1272. i2s_stop(&need_yield);
  1273. ESP_LOGE(TAG, "Failed to get the frame on time!");
  1274. return NULL;
  1275. }
  1276. return (camera_fb_t*)s_state->fb;
  1277. }
  1278. camera_fb_int_t * fb = NULL;
  1279. if(s_state->fb_out) {
  1280. if (xQueueReceive(s_state->fb_out, &fb, FB_GET_TIMEOUT) != pdTRUE) {
  1281. i2s_stop(&need_yield);
  1282. ESP_LOGE(TAG, "Failed to get the frame on time!");
  1283. return NULL;
  1284. }
  1285. }
  1286. return (camera_fb_t*)fb;
  1287. }
  1288. void esp_camera_fb_return(camera_fb_t * fb)
  1289. {
  1290. if(fb == NULL || s_state == NULL || s_state->config.fb_count == 1 || s_state->fb_in == NULL) {
  1291. return;
  1292. }
  1293. xQueueSend(s_state->fb_in, &fb, portMAX_DELAY);
  1294. }
  1295. sensor_t * esp_camera_sensor_get()
  1296. {
  1297. if (s_state == NULL) {
  1298. return NULL;
  1299. }
  1300. return &s_state->sensor;
  1301. }
  1302. esp_err_t esp_camera_save_to_nvs(const char *key)
  1303. {
  1304. #if ESP_IDF_VERSION_MAJOR > 3
  1305. nvs_handle_t handle;
  1306. #else
  1307. nvs_handle handle;
  1308. #endif
  1309. esp_err_t ret = nvs_open(key,NVS_READWRITE,&handle);
  1310. if (ret == ESP_OK) {
  1311. sensor_t *s = esp_camera_sensor_get();
  1312. if (s != NULL) {
  1313. ret = nvs_set_blob(handle,CAMERA_SENSOR_NVS_KEY,&s->status,sizeof(camera_status_t));
  1314. if (ret == ESP_OK) {
  1315. uint8_t pf = s->pixformat;
  1316. ret = nvs_set_u8(handle,CAMERA_PIXFORMAT_NVS_KEY,pf);
  1317. }
  1318. return ret;
  1319. } else {
  1320. return ESP_ERR_CAMERA_NOT_DETECTED;
  1321. }
  1322. nvs_close(handle);
  1323. return ret;
  1324. } else {
  1325. return ret;
  1326. }
  1327. }
  1328. esp_err_t esp_camera_load_from_nvs(const char *key)
  1329. {
  1330. #if ESP_IDF_VERSION_MAJOR > 3
  1331. nvs_handle_t handle;
  1332. #else
  1333. nvs_handle handle;
  1334. #endif
  1335. uint8_t pf;
  1336. esp_err_t ret = nvs_open(key,NVS_READWRITE,&handle);
  1337. if (ret == ESP_OK) {
  1338. sensor_t *s = esp_camera_sensor_get();
  1339. camera_status_t st;
  1340. if (s != NULL) {
  1341. size_t size = sizeof(camera_status_t);
  1342. ret = nvs_get_blob(handle,CAMERA_SENSOR_NVS_KEY,&st,&size);
  1343. if (ret == ESP_OK) {
  1344. s->set_ae_level(s,st.ae_level);
  1345. s->set_aec2(s,st.aec2);
  1346. s->set_aec_value(s,st.aec_value);
  1347. s->set_agc_gain(s,st.agc_gain);
  1348. s->set_awb_gain(s,st.awb_gain);
  1349. s->set_bpc(s,st.bpc);
  1350. s->set_brightness(s,st.brightness);
  1351. s->set_colorbar(s,st.colorbar);
  1352. s->set_contrast(s,st.contrast);
  1353. s->set_dcw(s,st.dcw);
  1354. s->set_denoise(s,st.denoise);
  1355. s->set_exposure_ctrl(s,st.aec);
  1356. s->set_framesize(s,st.framesize);
  1357. s->set_gain_ctrl(s,st.agc);
  1358. s->set_gainceiling(s,st.gainceiling);
  1359. s->set_hmirror(s,st.hmirror);
  1360. s->set_lenc(s,st.lenc);
  1361. s->set_quality(s,st.quality);
  1362. s->set_raw_gma(s,st.raw_gma);
  1363. s->set_saturation(s,st.saturation);
  1364. s->set_sharpness(s,st.sharpness);
  1365. s->set_special_effect(s,st.special_effect);
  1366. s->set_vflip(s,st.vflip);
  1367. s->set_wb_mode(s,st.wb_mode);
  1368. s->set_whitebal(s,st.awb);
  1369. s->set_wpc(s,st.wpc);
  1370. }
  1371. ret = nvs_get_u8(handle,CAMERA_PIXFORMAT_NVS_KEY,&pf);
  1372. if (ret == ESP_OK) {
  1373. s->set_pixformat(s,pf);
  1374. }
  1375. } else {
  1376. return ESP_ERR_CAMERA_NOT_DETECTED;
  1377. }
  1378. nvs_close(handle);
  1379. return ret;
  1380. } else {
  1381. ESP_LOGW(TAG,"Error (%d) opening nvs key \"%s\"",ret,key);
  1382. return ret;
  1383. }
  1384. }