Skip to content

Commit 1d24e8d

Browse files
authored
Merge branch 'master' into grayscale_fixes
2 parents 73ed44b + 2ae2623 commit 1d24e8d

File tree

7 files changed

+96
-43
lines changed

7 files changed

+96
-43
lines changed

.github/workflows/build.yml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,25 @@ jobs:
2222
target: ${{ matrix.idf_target }}
2323
path: 'examples'
2424

25+
build-release-v5_0:
26+
name: Build for ${{ matrix.idf_target }} on ${{ matrix.idf_ver }}
27+
runs-on: ubuntu-latest
28+
strategy:
29+
matrix:
30+
idf_ver: ["release-v5.0"]
31+
idf_target: ["esp32", "esp32s2", "esp32s3"]
32+
steps:
33+
- name: Checkout repo
34+
uses: actions/checkout@v2
35+
with:
36+
submodules: 'recursive'
37+
- name: esp-idf build
38+
uses: espressif/esp-idf-ci-action@main
39+
with:
40+
esp_idf_version: ${{ matrix.idf_ver }}
41+
target: ${{ matrix.idf_target }}
42+
path: 'examples'
43+
2544
build-release-v4_4:
2645
name: Build for ${{ matrix.idf_target }} on ${{ matrix.idf_ver }}
2746
runs-on: ubuntu-latest

Kconfig

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,12 @@ menu "Camera configuration"
142142
bool "Subsample Mode"
143143
endchoice
144144

145+
config CAMERA_TASK_STACK_SIZE
146+
int "CAM task stack size"
147+
default 2048
148+
help
149+
Camera task stack size
150+
145151
choice CAMERA_TASK_PINNED_TO_CORE
146152
bool "Camera task pinned to core"
147153
default CAMERA_CORE0
@@ -163,8 +169,8 @@ menu "Camera configuration"
163169
default 32768
164170
help
165171
Maximum value of DMA buffer
166-
Larger values may fail to allocate due to insufficient contiguous memory blocks, and smaller value may cause DMA interrupt to be too frequent
167-
172+
Larger values may fail to allocate due to insufficient contiguous memory blocks, and smaller value may cause DMA interrupt to be too frequent.
173+
168174
config CAMERA_CONVERTER_ENABLED
169175
bool "Enable camera RGB/YUV converter"
170176
depends on IDF_TARGET_ESP32S3
@@ -184,4 +190,16 @@ menu "Camera configuration"
184190
config LCD_CAM_CONV_BT709_ENABLED
185191
bool "BT709"
186192
endchoice
193+
194+
config LCD_CAM_CONV_FULL_RANGE_ENABLED
195+
bool "Camera converter full range mode"
196+
depends on CAMERA_CONVERTER_ENABLED
197+
default y
198+
help
199+
Supports format conversion under both full color range mode and limited color range mode.
200+
If full color range mode is selected, the color range of RGB or YUV is 0~255.
201+
If limited color range mode is selected, the color range of RGB is 16~240, and the color range of YUV is Y[16~240], UV[16~235].
202+
Full color range mode has a wider color range, so details in the image show more clearly.
203+
Please confirm the color range mode of the current camera sensor, incorrect color range mode may cause color difference in the final converted image.
204+
Full range mode is used by default. If this option is not selected, the format conversion function will be done using the limited range mode.
187205
endmenu

driver/cam_hal.c

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@
3232
#endif // ESP_IDF_VERSION_MAJOR
3333
#define ESP_CAMERA_ETS_PRINTF ets_printf
3434

35+
#if CONFIG_CAM_TASK_STACK_SIZE
36+
#define CAM_TASK_STACK CONFIG_CAM_TASK_STACK_SIZE
37+
#else
38+
#define CAM_TASK_STACK (2*1024)
39+
#endif
40+
3541
static const char *TAG = "cam_hal";
3642
static cam_obj_t *cam_obj = NULL;
3743

@@ -45,7 +51,7 @@ static int cam_verify_jpeg_soi(const uint8_t *inbuf, uint32_t length)
4551
for (uint32_t i = 0; i < length; i++) {
4652
sig = *((uint32_t *)(&inbuf[i])) & 0xFFFFFF;
4753
if (sig == JPEG_SOI_MARKER) {
48-
ESP_LOGW(TAG, "SOI: %d", i);
54+
ESP_LOGW(TAG, "SOI: %d", (int) i);
4955
return i;
5056
}
5157
}
@@ -117,7 +123,7 @@ static void cam_task(void *arg)
117123
int frame_pos = 0;
118124
cam_obj->state = CAM_STATE_IDLE;
119125
cam_event_t cam_event = 0;
120-
126+
121127
xQueueReset(cam_obj->event_queue);
122128

123129
while (1) {
@@ -140,7 +146,7 @@ static void cam_task(void *arg)
140146
case CAM_STATE_READ_BUF: {
141147
camera_fb_t * frame_buffer_event = &cam_obj->frames[frame_pos].fb;
142148
size_t pixels_per_dma = (cam_obj->dma_half_buffer_size * cam_obj->fb_bytes_per_pixel) / (cam_obj->dma_bytes_per_item * cam_obj->in_bytes_per_pixel);
143-
149+
144150
if (cam_event == CAM_IN_SUC_EOF_EVENT) {
145151
if(!cam_obj->psram_mode){
146152
if (cam_obj->fb_size < (frame_buffer_event->len + pixels_per_dma)) {
@@ -150,8 +156,8 @@ static void cam_task(void *arg)
150156
continue;
151157
}
152158
frame_buffer_event->len += ll_cam_memcpy(cam_obj,
153-
&frame_buffer_event->buf[frame_buffer_event->len],
154-
&cam_obj->dma_buffer[(cnt % cam_obj->dma_half_buffer_cnt) * cam_obj->dma_half_buffer_size],
159+
&frame_buffer_event->buf[frame_buffer_event->len],
160+
&cam_obj->dma_buffer[(cnt % cam_obj->dma_half_buffer_cnt) * cam_obj->dma_half_buffer_size],
155161
cam_obj->dma_half_buffer_size);
156162
}
157163
//Check for JPEG SOI in the first buffer. stop if not found
@@ -173,8 +179,8 @@ static void cam_task(void *arg)
173179
cnt--;
174180
} else {
175181
frame_buffer_event->len += ll_cam_memcpy(cam_obj,
176-
&frame_buffer_event->buf[frame_buffer_event->len],
177-
&cam_obj->dma_buffer[(cnt % cam_obj->dma_half_buffer_cnt) * cam_obj->dma_half_buffer_size],
182+
&frame_buffer_event->buf[frame_buffer_event->len],
183+
&cam_obj->dma_buffer[(cnt % cam_obj->dma_half_buffer_cnt) * cam_obj->dma_half_buffer_size],
178184
cam_obj->dma_half_buffer_size);
179185
}
180186
}
@@ -192,7 +198,7 @@ static void cam_task(void *arg)
192198
} else if (!cam_obj->jpeg_mode) {
193199
if (frame_buffer_event->len != cam_obj->fb_size) {
194200
cam_obj->frames[frame_pos].en = 1;
195-
ESP_LOGE(TAG, "FB-SIZE: %u != %u", frame_buffer_event->len, cam_obj->fb_size);
201+
ESP_LOGE(TAG, "FB-SIZE: %u != %u", frame_buffer_event->len, (unsigned) cam_obj->fb_size);
196202
}
197203
}
198204
//send frame
@@ -258,8 +264,9 @@ static esp_err_t cam_dma_config(const camera_config_t *config)
258264
cam_obj->dma_node_cnt = (cam_obj->dma_buffer_size) / cam_obj->dma_node_buffer_size; // Number of DMA nodes
259265
cam_obj->frame_copy_cnt = cam_obj->recv_size / cam_obj->dma_half_buffer_size; // Number of interrupted copies, ping-pong copy
260266

261-
ESP_LOGI(TAG, "buffer_size: %d, half_buffer_size: %d, node_buffer_size: %d, node_cnt: %d, total_cnt: %d",
262-
cam_obj->dma_buffer_size, cam_obj->dma_half_buffer_size, cam_obj->dma_node_buffer_size, cam_obj->dma_node_cnt, cam_obj->frame_copy_cnt);
267+
ESP_LOGI(TAG, "buffer_size: %d, half_buffer_size: %d, node_buffer_size: %d, node_cnt: %d, total_cnt: %d",
268+
(int) cam_obj->dma_buffer_size, (int) cam_obj->dma_half_buffer_size, (int) cam_obj->dma_node_buffer_size,
269+
(int) cam_obj->dma_node_cnt, (int) cam_obj->frame_copy_cnt);
263270

264271
cam_obj->dma_buffer = NULL;
265272
cam_obj->dma = NULL;
@@ -295,7 +302,7 @@ static esp_err_t cam_dma_config(const camera_config_t *config)
295302
//align PSRAM buffer. TODO: save the offset so proper address can be freed later
296303
cam_obj->frames[x].fb_offset = dma_align - ((uint32_t)cam_obj->frames[x].fb.buf & (dma_align - 1));
297304
cam_obj->frames[x].fb.buf += cam_obj->frames[x].fb_offset;
298-
ESP_LOGI(TAG, "Frame[%d]: Offset: %u, Addr: 0x%08X", x, cam_obj->frames[x].fb_offset, (uint32_t)cam_obj->frames[x].fb.buf);
305+
ESP_LOGI(TAG, "Frame[%d]: Offset: %u, Addr: 0x%08X", x, cam_obj->frames[x].fb_offset, (unsigned) cam_obj->frames[x].fb.buf);
299306
cam_obj->frames[x].dma = allocate_dma_descriptors(cam_obj->dma_node_cnt, cam_obj->dma_node_buffer_size, cam_obj->frames[x].fb.buf);
300307
CAM_CHECK(cam_obj->frames[x].dma != NULL, "frame dma malloc failed", ESP_FAIL);
301308
}
@@ -305,8 +312,8 @@ static esp_err_t cam_dma_config(const camera_config_t *config)
305312
if (!cam_obj->psram_mode) {
306313
cam_obj->dma_buffer = (uint8_t *)heap_caps_malloc(cam_obj->dma_buffer_size * sizeof(uint8_t), MALLOC_CAP_DMA);
307314
if(NULL == cam_obj->dma_buffer) {
308-
ESP_LOGE(TAG,"%s(%d): DMA buffer %d Byte malloc failed, the current largest free block:%d Byte", __FUNCTION__, __LINE__,
309-
cam_obj->dma_buffer_size, heap_caps_get_largest_free_block(MALLOC_CAP_DMA));
315+
ESP_LOGE(TAG,"%s(%d): DMA buffer %d Byte malloc failed, the current largest free block:%d Byte", __FUNCTION__, __LINE__,
316+
(int) cam_obj->dma_buffer_size, (int) heap_caps_get_largest_free_block(MALLOC_CAP_DMA));
310317
return ESP_FAIL;
311318
}
312319

@@ -372,7 +379,7 @@ esp_err_t cam_config(const camera_config_t *config, framesize_t frame_size, uint
372379
cam_obj->recv_size = cam_obj->width * cam_obj->height * cam_obj->in_bytes_per_pixel;
373380
cam_obj->fb_size = cam_obj->width * cam_obj->height * cam_obj->fb_bytes_per_pixel;
374381
}
375-
382+
376383
ret = cam_dma_config(config);
377384
CAM_CHECK_GOTO(ret == ESP_OK, "cam_dma_config failed", err);
378385

@@ -389,13 +396,13 @@ esp_err_t cam_config(const camera_config_t *config, framesize_t frame_size, uint
389396
ret = ll_cam_init_isr(cam_obj);
390397
CAM_CHECK_GOTO(ret == ESP_OK, "cam intr alloc failed", err);
391398

392-
399+
393400
#if CONFIG_CAMERA_CORE0
394-
xTaskCreatePinnedToCore(cam_task, "cam_task", 2048, NULL, configMAX_PRIORITIES - 2, &cam_obj->task_handle, 0);
401+
xTaskCreatePinnedToCore(cam_task, "cam_task", CAM_TASK_STACK, NULL, configMAX_PRIORITIES - 2, &cam_obj->task_handle, 0);
395402
#elif CONFIG_CAMERA_CORE1
396-
xTaskCreatePinnedToCore(cam_task, "cam_task", 2048, NULL, configMAX_PRIORITIES - 2, &cam_obj->task_handle, 1);
403+
xTaskCreatePinnedToCore(cam_task, "cam_task", CAM_TASK_STACK, NULL, configMAX_PRIORITIES - 2, &cam_obj->task_handle, 1);
397404
#else
398-
xTaskCreate(cam_task, "cam_task", 2048, NULL, configMAX_PRIORITIES - 2, &cam_obj->task_handle);
405+
xTaskCreate(cam_task, "cam_task", CAM_TASK_STACK, NULL, configMAX_PRIORITIES - 2, &cam_obj->task_handle);
399406
#endif
400407

401408
ESP_LOGI(TAG, "cam config ok");

target/esp32/ll_cam.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ esp_err_t ll_cam_config(cam_obj_t *cam, const camera_config_t *config)
312312
I2S0.clkm_conf.clkm_div_a = 0;
313313
I2S0.clkm_conf.clkm_div_b = 0;
314314
I2S0.clkm_conf.clkm_div_num = 2;
315-
315+
316316
I2S0.fifo_conf.dscr_en = 1;
317317
I2S0.fifo_conf.rx_fifo_mod = sampling_mode;
318318
I2S0.fifo_conf.rx_fifo_mod_force_en = 1;
@@ -446,9 +446,12 @@ static bool ll_cam_calc_rgb_dma(cam_obj_t *cam){
446446
}
447447
// Calculate DMA size
448448
dma_buffer_size =(dma_buffer_max / dma_half_buffer) * dma_half_buffer;
449-
450-
ESP_LOGI(TAG, "node_size: %4u, nodes_per_line: %u, lines_per_node: %u, dma_half_buffer_min: %5u, dma_half_buffer: %5u, lines_per_half_buffer: %2u, dma_buffer_size: %5u, image_size: %u",
451-
node_size * cam->dma_bytes_per_item, nodes_per_line, lines_per_node, dma_half_buffer_min * cam->dma_bytes_per_item, dma_half_buffer * cam->dma_bytes_per_item, lines_per_half_buffer, dma_buffer_size * cam->dma_bytes_per_item, image_size);
449+
450+
ESP_LOGI(TAG, "node_size: %4u, nodes_per_line: %u, lines_per_node: %u, dma_half_buffer_min: %5u, dma_half_buffer: %5u,"
451+
"lines_per_half_buffer: %2u, dma_buffer_size: %5u, image_size: %u",
452+
(unsigned) (node_size * cam->dma_bytes_per_item), (unsigned) nodes_per_line, (unsigned) lines_per_node,
453+
(unsigned) (dma_half_buffer_min * cam->dma_bytes_per_item), (unsigned) (dma_half_buffer * cam->dma_bytes_per_item),
454+
(unsigned) (lines_per_half_buffer), (unsigned) (dma_buffer_size * cam->dma_bytes_per_item), (unsigned) image_size);
452455

453456
cam->dma_buffer_size = dma_buffer_size * cam->dma_bytes_per_item;
454457
cam->dma_half_buffer_size = dma_half_buffer * cam->dma_bytes_per_item;

target/esp32s2/ll_cam.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ bool ll_cam_start(cam_obj_t *cam, int frame_pos)
124124
} else {
125125
I2S0.in_link.addr = ((uint32_t)&cam->frames[frame_pos].dma[0]) & 0xfffff;
126126
}
127-
127+
128128
I2S0.in_link.start = 1;
129129
I2S0.conf.rx_start = 1;
130130
return true;
@@ -304,8 +304,8 @@ static bool ll_cam_calc_rgb_dma(cam_obj_t *cam){
304304
}
305305
}
306306

307-
ESP_LOGI(TAG, "node_size: %4u, nodes_per_line: %u, lines_per_node: %u",
308-
node_size * cam->dma_bytes_per_item, nodes_per_line, lines_per_node);
307+
ESP_LOGI(TAG, "node_size: %4u, nodes_per_line: %u, lines_per_node: %u",
308+
(unsigned) (node_size * cam->dma_bytes_per_item), nodes_per_line, lines_per_node);
309309

310310
cam->dma_node_buffer_size = node_size * cam->dma_bytes_per_item;
311311

@@ -337,9 +337,10 @@ static bool ll_cam_calc_rgb_dma(cam_obj_t *cam){
337337
size_t dma_buffer_max = 2 * dma_half_buffer_max;
338338
size_t dma_buffer_size = dma_buffer_max;
339339
dma_buffer_size =(dma_buffer_max / dma_half_buffer) * dma_half_buffer;
340-
341-
ESP_LOGI(TAG, "dma_half_buffer_min: %5u, dma_half_buffer: %5u, lines_per_half_buffer: %2u, dma_buffer_size: %5u",
342-
dma_half_buffer_min * cam->dma_bytes_per_item, dma_half_buffer * cam->dma_bytes_per_item, lines_per_half_buffer, dma_buffer_size * cam->dma_bytes_per_item);
340+
341+
ESP_LOGI(TAG, "dma_half_buffer_min: %5u, dma_half_buffer: %5u, lines_per_half_buffer: %2u, dma_buffer_size: %5u",
342+
(unsigned) (dma_half_buffer_min * cam->dma_bytes_per_item), (unsigned) (dma_half_buffer * cam->dma_bytes_per_item),
343+
(unsigned) lines_per_half_buffer, (unsigned) (dma_buffer_size * cam->dma_bytes_per_item));
343344

344345
cam->dma_buffer_size = dma_buffer_size * cam->dma_bytes_per_item;
345346
cam->dma_half_buffer_size = dma_half_buffer * cam->dma_bytes_per_item;

target/esp32s3/ll_cam.c

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,13 @@ static esp_err_t ll_cam_converter_config(cam_obj_t *cam, const camera_config_t *
218218
#else
219219
LCD_CAM.cam_rgb_yuv.cam_conv_protocol_mode = 0;
220220
#endif
221+
#if CONFIG_LCD_CAM_CONV_FULL_RANGE_ENABLED
222+
LCD_CAM.cam_rgb_yuv.cam_conv_data_out_mode = 1;
223+
LCD_CAM.cam_rgb_yuv.cam_conv_data_in_mode = 1;
224+
#else
221225
LCD_CAM.cam_rgb_yuv.cam_conv_data_out_mode = 0;
222226
LCD_CAM.cam_rgb_yuv.cam_conv_data_in_mode = 0;
227+
#endif
223228
LCD_CAM.cam_rgb_yuv.cam_conv_mode_8bits_on = 1;
224229
LCD_CAM.cam_rgb_yuv.cam_conv_bypass = 1;
225230
cam->conv_mode = config->conv_mode;
@@ -238,7 +243,7 @@ esp_err_t ll_cam_config(cam_obj_t *cam, const camera_config_t *config)
238243
}
239244

240245
LCD_CAM.cam_ctrl.val = 0;
241-
246+
242247
LCD_CAM.cam_ctrl.cam_clkm_div_b = 0;
243248
LCD_CAM.cam_ctrl.cam_clkm_div_a = 0;
244249
LCD_CAM.cam_ctrl.cam_clkm_div_num = 160000000 / config->xclk_freq_hz;
@@ -278,7 +283,7 @@ esp_err_t ll_cam_config(cam_obj_t *cam, const camera_config_t *config)
278283
LCD_CAM.cam_ctrl1.cam_start = 1;
279284

280285
ret = ll_cam_dma_init(cam);
281-
286+
282287
return ret;
283288
}
284289

@@ -394,8 +399,8 @@ static bool ll_cam_calc_rgb_dma(cam_obj_t *cam){
394399
}
395400
}
396401

397-
ESP_LOGI(TAG, "node_size: %4u, nodes_per_line: %u, lines_per_node: %u",
398-
node_size * cam->dma_bytes_per_item, nodes_per_line, lines_per_node);
402+
ESP_LOGI(TAG, "node_size: %4u, nodes_per_line: %u, lines_per_node: %u",
403+
(unsigned) (node_size * cam->dma_bytes_per_item), (unsigned) nodes_per_line, (unsigned) lines_per_node);
399404

400405
cam->dma_node_buffer_size = node_size * cam->dma_bytes_per_item;
401406

@@ -427,9 +432,10 @@ static bool ll_cam_calc_rgb_dma(cam_obj_t *cam){
427432
if (!cam->psram_mode) {
428433
dma_buffer_size =(dma_buffer_max / dma_half_buffer) * dma_half_buffer;
429434
}
430-
431-
ESP_LOGI(TAG, "dma_half_buffer_min: %5u, dma_half_buffer: %5u, lines_per_half_buffer: %2u, dma_buffer_size: %5u",
432-
dma_half_buffer_min * cam->dma_bytes_per_item, dma_half_buffer * cam->dma_bytes_per_item, lines_per_half_buffer, dma_buffer_size * cam->dma_bytes_per_item);
435+
436+
ESP_LOGI(TAG, "dma_half_buffer_min: %5u, dma_half_buffer: %5u, lines_per_half_buffer: %2u, dma_buffer_size: %5u",
437+
(unsigned) (dma_half_buffer_min * cam->dma_bytes_per_item), (unsigned) (dma_half_buffer * cam->dma_bytes_per_item),
438+
(unsigned) lines_per_half_buffer, (unsigned) (dma_buffer_size * cam->dma_bytes_per_item));
433439

434440
cam->dma_buffer_size = dma_buffer_size * cam->dma_bytes_per_item;
435441
cam->dma_half_buffer_size = dma_half_buffer * cam->dma_bytes_per_item;
@@ -438,7 +444,7 @@ static bool ll_cam_calc_rgb_dma(cam_obj_t *cam){
438444
}
439445

440446
bool ll_cam_dma_sizes(cam_obj_t *cam)
441-
{
447+
{
442448
cam->dma_bytes_per_item = 1;
443449
if (cam->jpeg_mode) {
444450
if (cam->psram_mode) {
@@ -473,7 +479,6 @@ size_t IRAM_ATTR ll_cam_memcpy(cam_obj_t *cam, uint8_t *out, const uint8_t *in,
473479
}
474480
return len / 2;
475481
}
476-
477482

478483
// just memcpy
479484
memcpy(out, in, len);
@@ -502,7 +507,7 @@ esp_err_t ll_cam_set_sample_mode(cam_obj_t *cam, pixformat_t pix_format, uint32_
502507
cam->fb_bytes_per_pixel = 2; // frame buffer stores YU/YV/RGB565
503508
break;
504509
}
505-
#else
510+
#else
506511
cam->in_bytes_per_pixel = 2; // for DMA receive
507512
cam->fb_bytes_per_pixel = 2; // frame buffer stores YU/YV/RGB565
508513
#endif

target/private_include/ll_cam.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ typedef struct {
101101
QueueHandle_t frame_buffer_queue;
102102
TaskHandle_t task_handle;
103103
intr_handle_t cam_intr_handle;
104-
104+
105105
uint8_t dma_num;//ESP32-S3
106106
intr_handle_t dma_intr_handle;//ESP32-S3
107107

@@ -120,7 +120,7 @@ typedef struct {
120120
float in_bytes_per_pixel;
121121
float fb_bytes_per_pixel;
122122
camera_conv_mode_t conv_mode;
123-
#else
123+
#else
124124
uint8_t in_bytes_per_pixel;
125125
uint8_t fb_bytes_per_pixel;
126126
#endif
@@ -140,7 +140,7 @@ esp_err_t ll_cam_init_isr(cam_obj_t *cam);
140140
void ll_cam_do_vsync(cam_obj_t *cam);
141141
uint8_t ll_cam_get_dma_align(cam_obj_t *cam);
142142
bool ll_cam_dma_sizes(cam_obj_t *cam);
143-
size_t IRAM_ATTR ll_cam_memcpy(cam_obj_t *cam, uint8_t *out, const uint8_t *in, size_t len);
143+
size_t ll_cam_memcpy(cam_obj_t *cam, uint8_t *out, const uint8_t *in, size_t len);
144144
esp_err_t ll_cam_set_sample_mode(cam_obj_t *cam, pixformat_t pix_format, uint32_t xclk_freq_hz, uint16_t sensor_pid);
145145

146146
// implemented in cam_hal

0 commit comments

Comments
 (0)