Add RGB888 support and adjust PLL for RGB and YUV
This commit is contained in:
@@ -842,6 +842,86 @@ static void IRAM_ATTR dma_filter_yuyv_highspeed(const dma_elem_t* src, lldesc_t*
|
||||
}
|
||||
}
|
||||
|
||||
static void IRAM_ATTR dma_filter_rgb888(const dma_elem_t* src, lldesc_t* dma_desc, uint8_t* dst)
|
||||
{
|
||||
size_t end = dma_desc->length / sizeof(dma_elem_t) / 4;
|
||||
uint8_t lb, hb;
|
||||
for (size_t i = 0; i < end; ++i) {
|
||||
hb = src[0].sample1;
|
||||
lb = src[0].sample2;
|
||||
dst[0] = (lb & 0x1F) << 3;
|
||||
dst[1] = (hb & 0x07) << 5 | (lb & 0xE0) >> 3;
|
||||
dst[2] = hb & 0xF8;
|
||||
|
||||
hb = src[1].sample1;
|
||||
lb = src[1].sample2;
|
||||
dst[3] = (lb & 0x1F) << 3;
|
||||
dst[4] = (hb & 0x07) << 5 | (lb & 0xE0) >> 3;
|
||||
dst[5] = hb & 0xF8;
|
||||
|
||||
hb = src[2].sample1;
|
||||
lb = src[2].sample2;
|
||||
dst[6] = (lb & 0x1F) << 3;
|
||||
dst[7] = (hb & 0x07) << 5 | (lb & 0xE0) >> 3;
|
||||
dst[8] = hb & 0xF8;
|
||||
|
||||
hb = src[3].sample1;
|
||||
lb = src[3].sample2;
|
||||
dst[9] = (lb & 0x1F) << 3;
|
||||
dst[10] = (hb & 0x07) << 5 | (lb & 0xE0) >> 3;
|
||||
dst[11] = hb & 0xF8;
|
||||
src += 4;
|
||||
dst += 12;
|
||||
}
|
||||
}
|
||||
|
||||
static void IRAM_ATTR dma_filter_rgb888_highspeed(const dma_elem_t* src, lldesc_t* dma_desc, uint8_t* dst)
|
||||
{
|
||||
size_t end = dma_desc->length / sizeof(dma_elem_t) / 8;
|
||||
uint8_t lb, hb;
|
||||
for (size_t i = 0; i < end; ++i) {
|
||||
hb = src[0].sample1;
|
||||
lb = src[1].sample1;
|
||||
dst[0] = (lb & 0x1F) << 3;
|
||||
dst[1] = (hb & 0x07) << 5 | (lb & 0xE0) >> 3;
|
||||
dst[2] = hb & 0xF8;
|
||||
|
||||
hb = src[2].sample1;
|
||||
lb = src[3].sample1;
|
||||
dst[3] = (lb & 0x1F) << 3;
|
||||
dst[4] = (hb & 0x07) << 5 | (lb & 0xE0) >> 3;
|
||||
dst[5] = hb & 0xF8;
|
||||
|
||||
hb = src[4].sample1;
|
||||
lb = src[5].sample1;
|
||||
dst[6] = (lb & 0x1F) << 3;
|
||||
dst[7] = (hb & 0x07) << 5 | (lb & 0xE0) >> 3;
|
||||
dst[8] = hb & 0xF8;
|
||||
|
||||
hb = src[6].sample1;
|
||||
lb = src[7].sample1;
|
||||
dst[9] = (lb & 0x1F) << 3;
|
||||
dst[10] = (hb & 0x07) << 5 | (lb & 0xE0) >> 3;
|
||||
dst[11] = hb & 0xF8;
|
||||
|
||||
src += 8;
|
||||
dst += 12;
|
||||
}
|
||||
if ((dma_desc->length & 0x7) != 0) {
|
||||
hb = src[0].sample1;
|
||||
lb = src[1].sample1;
|
||||
dst[0] = (lb & 0x1F) << 3;
|
||||
dst[1] = (hb & 0x07) << 5 | (lb & 0xE0) >> 3;
|
||||
dst[2] = hb & 0xF8;
|
||||
|
||||
hb = src[2].sample1;
|
||||
lb = src[2].sample2;
|
||||
dst[3] = (lb & 0x1F) << 3;
|
||||
dst[4] = (hb & 0x07) << 5 | (lb & 0xE0) >> 3;
|
||||
dst[5] = hb & 0xF8;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Public Methods
|
||||
* */
|
||||
@@ -1013,6 +1093,17 @@ esp_err_t camera_init(const camera_config_t* config)
|
||||
}
|
||||
s_state->in_bytes_per_pixel = 2; // camera sends YU/YV
|
||||
s_state->fb_bytes_per_pixel = 2; // frame buffer stores YU/YV/RGB565
|
||||
} else if (pix_format == PIXFORMAT_RGB888) {
|
||||
s_state->fb_size = s_state->width * s_state->height * 3;
|
||||
if (is_hs_mode()) {
|
||||
s_state->sampling_mode = SM_0A00_0B00;
|
||||
s_state->dma_filter = &dma_filter_rgb888_highspeed;
|
||||
} else {
|
||||
s_state->sampling_mode = SM_0A0B_0C0D;
|
||||
s_state->dma_filter = &dma_filter_rgb888;
|
||||
}
|
||||
s_state->in_bytes_per_pixel = 2; // camera sends RGB565
|
||||
s_state->fb_bytes_per_pixel = 3; // frame buffer stores RGB888
|
||||
} else if (pix_format == PIXFORMAT_JPEG) {
|
||||
if (s_state->sensor.id.PID != OV2640_PID && s_state->sensor.id.PID != OV3660_PID) {
|
||||
ESP_LOGE(TAG, "JPEG format is only supported for ov2640 and ov3660");
|
||||
|
||||
@@ -130,9 +130,6 @@ typedef struct _sensor {
|
||||
|
||||
int (*set_raw_gma) (sensor_t *sensor, int enable);
|
||||
int (*set_lenc) (sensor_t *sensor, int enable);
|
||||
|
||||
// Advanced functions
|
||||
int (*set_reg) (sensor_t *sensor, int reg, int mask, int value);
|
||||
} sensor_t;
|
||||
|
||||
// Resolution table (in camera.c)
|
||||
|
||||
Reference in New Issue
Block a user