camera.c 42 KB

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