parent
6fb37b3558
commit
bb26370e2f
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the OpenMV project.
|
||||||
|
* Copyright (c) 2013/2014 Ibrahim Abdelkader <i.abdalkader@gmail.com>
|
||||||
|
* This work is licensed under the MIT license, see the file LICENSE for details.
|
||||||
|
*
|
||||||
|
* NT99141 driver.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __NT99141_H__
|
||||||
|
#define __NT99141_H__
|
||||||
|
|
||||||
|
#include "sensor.h"
|
||||||
|
|
||||||
|
int NT99141_init(sensor_t *sensor);
|
||||||
|
|
||||||
|
#endif // __NT99141_H__
|
@ -0,0 +1,825 @@
|
|||||||
|
#ifndef _NT99141_SETTINGS_H_
|
||||||
|
#define _NT99141_SETTINGS_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "esp_attr.h"
|
||||||
|
#include "nt99141_regs.h"
|
||||||
|
|
||||||
|
static const ratio_settings_t ratio_table[] = {
|
||||||
|
// mw, mh, sx, sy, ex, ey, ox, oy, tx, ty
|
||||||
|
{ 1280, 720, 0, 4, 1283, 723, 0, 4, 1660, 963 },
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#define REG_DLY 0xffff
|
||||||
|
#define REGLIST_TAIL 0x0000
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_default_regs[][2] = {
|
||||||
|
//initial
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x3109, 0x04},
|
||||||
|
{0x3040, 0x04},
|
||||||
|
{0x3041, 0x02},
|
||||||
|
{0x3042, 0xFF},
|
||||||
|
{0x3043, 0x08},
|
||||||
|
{0x3052, 0xE0},
|
||||||
|
{0x305F, 0x33},
|
||||||
|
{0x3100, 0x07},
|
||||||
|
{0x3106, 0x03},
|
||||||
|
{0x3105, 0x01},
|
||||||
|
{0x3108, 0x05},
|
||||||
|
{0x3110, 0x22},
|
||||||
|
{0x3111, 0x57},
|
||||||
|
{0x3112, 0x22},
|
||||||
|
{0x3113, 0x55},
|
||||||
|
{0x3114, 0x05},
|
||||||
|
{0x3135, 0x00},
|
||||||
|
{0x32F0, 0x01},
|
||||||
|
{0x3290, 0x01},
|
||||||
|
{0x3291, 0x80},
|
||||||
|
{0x3296, 0x01},
|
||||||
|
{0x3297, 0x73},
|
||||||
|
{0x3250, 0x80},
|
||||||
|
{0x3251, 0x03},
|
||||||
|
{0x3252, 0xFF},
|
||||||
|
{0x3253, 0x00},
|
||||||
|
{0x3254, 0x03},
|
||||||
|
{0x3255, 0xFF},
|
||||||
|
{0x3256, 0x00},
|
||||||
|
{0x3257, 0x50},
|
||||||
|
{0x3270, 0x00},
|
||||||
|
{0x3271, 0x0C},
|
||||||
|
{0x3272, 0x18},
|
||||||
|
{0x3273, 0x32},
|
||||||
|
{0x3274, 0x44},
|
||||||
|
{0x3275, 0x54},
|
||||||
|
{0x3276, 0x70},
|
||||||
|
{0x3277, 0x88},
|
||||||
|
{0x3278, 0x9D},
|
||||||
|
{0x3279, 0xB0},
|
||||||
|
{0x327A, 0xCF},
|
||||||
|
{0x327B, 0xE2},
|
||||||
|
{0x327C, 0xEF},
|
||||||
|
{0x327D, 0xF7},
|
||||||
|
{0x327E, 0xFF},
|
||||||
|
{0x3302, 0x00},
|
||||||
|
{0x3303, 0x40},
|
||||||
|
{0x3304, 0x00},
|
||||||
|
{0x3305, 0x96},
|
||||||
|
{0x3306, 0x00},
|
||||||
|
{0x3307, 0x29},
|
||||||
|
{0x3308, 0x07},
|
||||||
|
{0x3309, 0xBA},
|
||||||
|
{0x330A, 0x06},
|
||||||
|
{0x330B, 0xF5},
|
||||||
|
{0x330C, 0x01},
|
||||||
|
{0x330D, 0x51},
|
||||||
|
{0x330E, 0x01},
|
||||||
|
{0x330F, 0x30},
|
||||||
|
{0x3310, 0x07},
|
||||||
|
{0x3311, 0x16},
|
||||||
|
{0x3312, 0x07},
|
||||||
|
{0x3313, 0xBA},
|
||||||
|
{0x3326, 0x02},
|
||||||
|
{0x32F6, 0x0F},
|
||||||
|
{0x32F9, 0x42},
|
||||||
|
{0x32FA, 0x24},
|
||||||
|
{0x3325, 0x4A},
|
||||||
|
{0x3330, 0x00},
|
||||||
|
{0x3331, 0x0A},
|
||||||
|
{0x3332, 0xFF},
|
||||||
|
{0x3338, 0x30},
|
||||||
|
{0x3339, 0x84},
|
||||||
|
{0x333A, 0x48},
|
||||||
|
{0x333F, 0x07},
|
||||||
|
{0x3360, 0x10},
|
||||||
|
{0x3361, 0x18},
|
||||||
|
{0x3362, 0x1f},
|
||||||
|
{0x3363, 0x37},
|
||||||
|
{0x3364, 0x80},
|
||||||
|
{0x3365, 0x80},
|
||||||
|
{0x3366, 0x68},
|
||||||
|
{0x3367, 0x60},
|
||||||
|
{0x3368, 0x30},
|
||||||
|
{0x3369, 0x28},
|
||||||
|
{0x336A, 0x20},
|
||||||
|
{0x336B, 0x10},
|
||||||
|
{0x336C, 0x00},
|
||||||
|
{0x336D, 0x20},
|
||||||
|
{0x336E, 0x1C},
|
||||||
|
{0x336F, 0x18},
|
||||||
|
{0x3370, 0x10},
|
||||||
|
{0x3371, 0x38},
|
||||||
|
{0x3372, 0x3C},
|
||||||
|
{0x3373, 0x3F},
|
||||||
|
{0x3374, 0x3F},
|
||||||
|
{0x338A, 0x34},
|
||||||
|
{0x338B, 0x7F},
|
||||||
|
{0x338C, 0x10},
|
||||||
|
{0x338D, 0x23},
|
||||||
|
{0x338E, 0x7F},
|
||||||
|
{0x338F, 0x14},
|
||||||
|
{0x3375, 0x08},
|
||||||
|
{0x3376, 0x0C},
|
||||||
|
{0x3377, 0x18},
|
||||||
|
{0x3378, 0x20},
|
||||||
|
{0x3012, 0x02},
|
||||||
|
{0x3013, 0xD0},
|
||||||
|
{0x3025, 0x02}, //colorbar
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_fmt_jpeg[][2] = {
|
||||||
|
{0x32F0, 0x70}, // YUV422
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_fmt_raw[][2] = {
|
||||||
|
{0x32F0, 0x50}, // RAW
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_fmt_grayscale[][2] = {
|
||||||
|
{0x32F1, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_fmt_yuv422[][2] = {
|
||||||
|
{0x32F0, 0x00}, // YUV422
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_fmt_rgb565[][2] = {
|
||||||
|
{0x32F0, 0x01}, // RGB
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint8_t sensor_saturation_levels[9][1] = {
|
||||||
|
{0x60},//-4
|
||||||
|
{0x68},//-3
|
||||||
|
{0x70},//-2
|
||||||
|
{0x78},//-1
|
||||||
|
{0x80},//0
|
||||||
|
{0x88},//+1
|
||||||
|
{0x90},//+2
|
||||||
|
{0x98},//+3
|
||||||
|
{0xA0},//+4
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint8_t sensor_special_effects[7][4] = {
|
||||||
|
{0x00, 0x80, 0x80, 0x01},//Normal
|
||||||
|
{0x03, 0x80, 0x80, 0x01},//Negative
|
||||||
|
{0x01, 0x80, 0x80, 0x01},//Grayscale
|
||||||
|
{0x05, 0x2A, 0xF0, 0x01},//Red Tint
|
||||||
|
{0x05, 0x60, 0x20, 0x01},//Green Tint
|
||||||
|
{0x05, 0xF0, 0x80, 0x01},//Blue Tint
|
||||||
|
{0x02, 0x80, 0x80, 0x01},//Sepia
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// AE LEVEL
|
||||||
|
static const DRAM_ATTR uint16_t sensor_ae_level[][2] = {
|
||||||
|
|
||||||
|
// 1. [AE_Target : 0x24]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x29 },
|
||||||
|
{0x32B9, 0x1F },
|
||||||
|
{0x32BC, 0x24 },
|
||||||
|
{0x32BD, 0x27 },
|
||||||
|
{0x32BE, 0x21 },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 2. [AE_Target : 0x28]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x2D },
|
||||||
|
{0x32B9, 0x23 },
|
||||||
|
{0x32BC, 0x28 },
|
||||||
|
{0x32BD, 0x2B },
|
||||||
|
{0x32BE, 0x25 },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 3. [AE_Target : 0x2C]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x32 },
|
||||||
|
{0x32B9, 0x26 },
|
||||||
|
{0x32BC, 0x2C },
|
||||||
|
{0x32BD, 0x2F },
|
||||||
|
{0x32BE, 0x29 },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 4, [AE_Target : 0x30]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x36 },
|
||||||
|
{0x32B9, 0x2A },
|
||||||
|
{0x32BC, 0x30 },
|
||||||
|
{0x32BD, 0x33 },
|
||||||
|
{0x32BE, 0x2D },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 5. [AE_Target : 0x34]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x3B },
|
||||||
|
{0x32B9, 0x2D },
|
||||||
|
{0x32BC, 0x34 },
|
||||||
|
{0x32BD, 0x38 },
|
||||||
|
{0x32BE, 0x30 },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 6. [AE_Target : 0x38]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x3F },
|
||||||
|
{0x32B9, 0x31 },
|
||||||
|
{0x32BC, 0x38 },
|
||||||
|
{0x32BD, 0x3C },
|
||||||
|
{0x32BE, 0x34 },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 7. [AE_Target : 0x3D]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x44 },
|
||||||
|
{0x32B9, 0x34 },
|
||||||
|
{0x32BC, 0x3C },
|
||||||
|
{0x32BD, 0x40 },
|
||||||
|
{0x32BE, 0x38 },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 8. [AE_Target : 0x40]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x48 },
|
||||||
|
{0x32B9, 0x38 },
|
||||||
|
{0x32BC, 0x40 },
|
||||||
|
{0x32BD, 0x44 },
|
||||||
|
{0x32BE, 0x3C },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 9. [AE_Target : 0x44]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x4D },
|
||||||
|
{0x32B9, 0x3B },
|
||||||
|
{0x32BC, 0x44 },
|
||||||
|
{0x32BD, 0x49 },
|
||||||
|
{0x32BE, 0x3F },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_HD[][2] = {
|
||||||
|
//[JPEG_1280x720_8.18_8.18_Fps]
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x3C},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x5E},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x24},
|
||||||
|
{0x3002, 0x00},
|
||||||
|
{0x3003, 0x04},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x04},
|
||||||
|
{0x3006, 0x05},
|
||||||
|
{0x3007, 0x03},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0xD3},
|
||||||
|
{0x300A, 0x06},
|
||||||
|
{0x300B, 0x7C},
|
||||||
|
{0x300C, 0x02},
|
||||||
|
{0x300D, 0xE0},
|
||||||
|
{0x300E, 0x05},
|
||||||
|
{0x300F, 0x00},
|
||||||
|
{0x3010, 0x02},
|
||||||
|
{0x3011, 0xD0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x3F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_VGA[][2] = {
|
||||||
|
//[JPEG_640x480_10.14_10.14_Fps]
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x4B},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x62},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x32E0, 0x02},
|
||||||
|
{0x32E1, 0x80},
|
||||||
|
{0x32E2, 0x01},
|
||||||
|
{0x32E3, 0xE0},
|
||||||
|
{0x32E4, 0x00},
|
||||||
|
{0x32E5, 0x80},
|
||||||
|
{0x32E6, 0x00},
|
||||||
|
{0x32E7, 0x80},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x24},
|
||||||
|
{0x3002, 0x00},
|
||||||
|
{0x3003, 0xA4},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x04},
|
||||||
|
{0x3006, 0x04},
|
||||||
|
{0x3007, 0x63},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0xD3},
|
||||||
|
{0x300A, 0x05},
|
||||||
|
{0x300B, 0x3C},
|
||||||
|
{0x300C, 0x02},
|
||||||
|
{0x300D, 0xE0},
|
||||||
|
{0x300E, 0x03},
|
||||||
|
{0x300F, 0xC0},
|
||||||
|
{0x3010, 0x02},
|
||||||
|
{0x3011, 0xD0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x7F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_QVGA[][2] = {
|
||||||
|
//[JPEG_320x240_10.14_10.14_Fps]
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x4B},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x62},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x32E0, 0x01},
|
||||||
|
{0x32E1, 0x40},
|
||||||
|
{0x32E2, 0x00},
|
||||||
|
{0x32E3, 0xF0},
|
||||||
|
{0x32E4, 0x02},
|
||||||
|
{0x32E5, 0x02},
|
||||||
|
{0x32E6, 0x02},
|
||||||
|
{0x32E7, 0x03},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x24},
|
||||||
|
{0x3002, 0x00},
|
||||||
|
{0x3003, 0xA4},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x04},
|
||||||
|
{0x3006, 0x04},
|
||||||
|
{0x3007, 0x63},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0xD3},
|
||||||
|
{0x300A, 0x05},
|
||||||
|
{0x300B, 0x3C},
|
||||||
|
{0x300C, 0x02},
|
||||||
|
{0x300D, 0xE0},
|
||||||
|
{0x300E, 0x03},
|
||||||
|
{0x300F, 0xC0},
|
||||||
|
{0x3010, 0x02},
|
||||||
|
{0x3011, 0xD0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x7F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_VGA_xyskip[][2] = {
|
||||||
|
// [JPEG_640x360_20.00_25.01_Fps_XY_Skip]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60 },
|
||||||
|
{0x320A, 0xB2 },
|
||||||
|
{0x32C0, 0x64 },
|
||||||
|
{0x32C1, 0x64 },
|
||||||
|
{0x32C2, 0x64 },
|
||||||
|
{0x32C3, 0x00 },
|
||||||
|
{0x32C4, 0x20 },
|
||||||
|
{0x32C5, 0x20 },
|
||||||
|
{0x32C6, 0x20 },
|
||||||
|
{0x32C7, 0x00 },
|
||||||
|
{0x32C8, 0x62 },
|
||||||
|
{0x32C9, 0x64 },
|
||||||
|
{0x32CA, 0x84 },
|
||||||
|
{0x32CB, 0x84 },
|
||||||
|
{0x32CC, 0x84 },
|
||||||
|
{0x32CD, 0x84 },
|
||||||
|
{0x32DB, 0x68 },
|
||||||
|
{0x32F0, 0x70 },
|
||||||
|
{0x3400, 0x08 },
|
||||||
|
{0x3400, 0x00 },
|
||||||
|
{0x3401, 0x4E },
|
||||||
|
{0x3404, 0x00 },
|
||||||
|
{0x3405, 0x00 },
|
||||||
|
{0x3410, 0x00 },
|
||||||
|
{0x3200, 0x3E },
|
||||||
|
{0x3201, 0x0F },
|
||||||
|
{0x3028, 0x0F },
|
||||||
|
{0x3029, 0x00 },
|
||||||
|
{0x302A, 0x08 },
|
||||||
|
{0x3022, 0x24 },
|
||||||
|
{0x3023, 0x6C },
|
||||||
|
{0x3002, 0x00 },
|
||||||
|
{0x3003, 0x04 },
|
||||||
|
{0x3004, 0x00 },
|
||||||
|
{0x3005, 0x04 },
|
||||||
|
{0x3006, 0x05 },
|
||||||
|
{0x3007, 0x03 },
|
||||||
|
{0x3008, 0x02 },
|
||||||
|
{0x3009, 0xD3 },
|
||||||
|
{0x300A, 0x03 },
|
||||||
|
{0x300B, 0xFC },
|
||||||
|
{0x300C, 0x01 },
|
||||||
|
{0x300D, 0x88 },
|
||||||
|
{0x300E, 0x02 },
|
||||||
|
{0x300F, 0x80 },
|
||||||
|
{0x3010, 0x01 },
|
||||||
|
{0x3011, 0x68 },
|
||||||
|
{0x32B8, 0x3F },
|
||||||
|
{0x32B9, 0x31 },
|
||||||
|
{0x32BB, 0x87 },
|
||||||
|
{0x32BC, 0x38 },
|
||||||
|
{0x32BD, 0x3C },
|
||||||
|
{0x32BE, 0x34 },
|
||||||
|
{0x3201, 0x3F },
|
||||||
|
{0x3025, 0x00 }, //normal
|
||||||
|
{0x3021, 0x06 },
|
||||||
|
{0x3400, 0x01 },
|
||||||
|
{0x3060, 0x01 },
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_VGA_xskip[][2] = {
|
||||||
|
//[JPEG_640x480_Xskip_13.32_13.32_Fps]
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x62},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x68},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x32E0, 0x02},
|
||||||
|
{0x32E1, 0x80},
|
||||||
|
{0x32E2, 0x01},
|
||||||
|
{0x32E3, 0xE0},
|
||||||
|
{0x32E4, 0x00},
|
||||||
|
{0x32E5, 0x00},
|
||||||
|
{0x32E6, 0x00},
|
||||||
|
{0x32E7, 0x80},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x2C},
|
||||||
|
{0x3002, 0x00},
|
||||||
|
{0x3003, 0x04},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x04},
|
||||||
|
{0x3006, 0x05},
|
||||||
|
{0x3007, 0x03},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0xD3},
|
||||||
|
{0x300A, 0x03},
|
||||||
|
{0x300B, 0xFC},
|
||||||
|
{0x300C, 0x02},
|
||||||
|
{0x300D, 0xE0},
|
||||||
|
{0x300E, 0x02},
|
||||||
|
{0x300F, 0x80},
|
||||||
|
{0x3010, 0x02},
|
||||||
|
{0x3011, 0xD0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x7F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_QVGA_xskip[][2] = {
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
//[JPEG_320x240_Xskip_13.32_13.32_Fps]
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x62},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x68},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x32E0, 0x01},
|
||||||
|
{0x32E1, 0x40},
|
||||||
|
{0x32E2, 0x00},
|
||||||
|
{0x32E3, 0xF0},
|
||||||
|
{0x32E4, 0x01},
|
||||||
|
{0x32E5, 0x01},
|
||||||
|
{0x32E6, 0x02},
|
||||||
|
{0x32E7, 0x03},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x2C},
|
||||||
|
{0x3002, 0x00},
|
||||||
|
{0x3003, 0x04},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x04},
|
||||||
|
{0x3006, 0x05},
|
||||||
|
{0x3007, 0x03},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0xD3},
|
||||||
|
{0x300A, 0x03},
|
||||||
|
{0x300B, 0xFC},
|
||||||
|
{0x300C, 0x02},
|
||||||
|
{0x300D, 0xE0},
|
||||||
|
{0x300E, 0x02},
|
||||||
|
{0x300F, 0x80},
|
||||||
|
{0x3010, 0x02},
|
||||||
|
{0x3011, 0xD0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x7F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_VGA_crop[][2] = {
|
||||||
|
//[JPEG_640x480_Crop_19.77_19.77_Fps]
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x62},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x68},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x24},
|
||||||
|
{0x3002, 0x01},
|
||||||
|
{0x3003, 0x44},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x7C},
|
||||||
|
{0x3006, 0x03},
|
||||||
|
{0x3007, 0xC3},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0x5B},
|
||||||
|
{0x300A, 0x03},
|
||||||
|
{0x300B, 0xFC},
|
||||||
|
{0x300C, 0x01},
|
||||||
|
{0x300D, 0xF0},
|
||||||
|
{0x300E, 0x02},
|
||||||
|
{0x300F, 0x80},
|
||||||
|
{0x3010, 0x01},
|
||||||
|
{0x3011, 0xE0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x3F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_QVGA_crop[][2] = {
|
||||||
|
//[JPEG_320x240_Crop_19.77_19.77_Fps]
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x62},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x68},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x32E0, 0x01},
|
||||||
|
{0x32E1, 0x40},
|
||||||
|
{0x32E2, 0x00},
|
||||||
|
{0x32E3, 0xF0},
|
||||||
|
{0x32E4, 0x01},
|
||||||
|
{0x32E5, 0x01},
|
||||||
|
{0x32E6, 0x01},
|
||||||
|
{0x32E7, 0x02},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x24},
|
||||||
|
{0x3002, 0x01},
|
||||||
|
{0x3003, 0x44},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x7C},
|
||||||
|
{0x3006, 0x03},
|
||||||
|
{0x3007, 0xC3},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0x5B},
|
||||||
|
{0x300A, 0x03},
|
||||||
|
{0x300B, 0xFC},
|
||||||
|
{0x300C, 0x01},
|
||||||
|
{0x300D, 0xF0},
|
||||||
|
{0x300E, 0x02},
|
||||||
|
{0x300F, 0x80},
|
||||||
|
{0x3010, 0x01},
|
||||||
|
{0x3011, 0xE0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x7F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
@ -0,0 +1,439 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the OpenMV project.
|
||||||
|
* author: Juan Schiavoni <juanjoseschiavoni@hotmail.com>
|
||||||
|
* This work is licensed under the MIT license, see the file LICENSE for details.
|
||||||
|
*
|
||||||
|
* OV7725 driver.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "sccb.h"
|
||||||
|
#include "ov7670.h"
|
||||||
|
#include "ov7670_regs.h"
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/task.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_ARDUHAL_ESP_LOG)
|
||||||
|
#include "esp32-hal-log.h"
|
||||||
|
#else
|
||||||
|
#include "esp_log.h"
|
||||||
|
static const char* TAG = "ov7760";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int ov7670_clkrc = 0x01;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The default register settings, as obtained from OmniVision. There
|
||||||
|
* is really no making sense of most of these - lots of "reserved" values
|
||||||
|
* and such.
|
||||||
|
*
|
||||||
|
* These settings give VGA YUYV.
|
||||||
|
*/
|
||||||
|
struct regval_list {
|
||||||
|
uint8_t reg_num;
|
||||||
|
uint8_t value;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regval_list ov7670_default_regs[] = {
|
||||||
|
/* Sensor automatically sets output window when resolution changes. */
|
||||||
|
{TSLB, 0x04},
|
||||||
|
|
||||||
|
/* Frame rate 30 fps at 12 Mhz clock */
|
||||||
|
{CLKRC, 0x00},
|
||||||
|
{DBLV, 0x4A},
|
||||||
|
|
||||||
|
{COM10, COM10_VSYNC_NEG | COM10_PCLK_MASK},
|
||||||
|
|
||||||
|
/* Improve white balance */
|
||||||
|
{COM4, 0x40},
|
||||||
|
|
||||||
|
/* Improve color */
|
||||||
|
{RSVD_B0, 0x84},
|
||||||
|
|
||||||
|
/* Enable 50/60 Hz auto detection */
|
||||||
|
{COM11, COM11_EXP|COM11_HZAUTO},
|
||||||
|
|
||||||
|
/* Disable some delays */
|
||||||
|
{HSYST, 0},
|
||||||
|
{HSYEN, 0},
|
||||||
|
|
||||||
|
{MVFP, MVFP_SUN},
|
||||||
|
|
||||||
|
/* More reserved magic, some of which tweaks white balance */
|
||||||
|
{AWBC1, 0x0a},
|
||||||
|
{AWBC2, 0xf0},
|
||||||
|
{AWBC3, 0x34},
|
||||||
|
{AWBC4, 0x58},
|
||||||
|
{AWBC5, 0x28},
|
||||||
|
{AWBC6, 0x3a},
|
||||||
|
|
||||||
|
{AWBCTR3, 0x0a},
|
||||||
|
{AWBCTR2, 0x55},
|
||||||
|
{AWBCTR1, 0x11},
|
||||||
|
{AWBCTR0, 0x9e},
|
||||||
|
|
||||||
|
{COM8, COM8_FAST_AUTO|COM8_STEP_UNLIMIT|COM8_AGC_EN|COM8_AEC_EN|COM8_AWB_EN},
|
||||||
|
|
||||||
|
/* End marker is FF because in ov7670 the address of GAIN 0 and default value too. */
|
||||||
|
{0xFF, 0xFF},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regval_list ov7670_fmt_yuv422[] = {
|
||||||
|
{ COM7, 0x0 }, /* Selects YUV mode */
|
||||||
|
{ RGB444, 0 }, /* No RGB444 please */
|
||||||
|
{ COM1, 0 }, /* CCIR601 */
|
||||||
|
{ COM15, COM15_R00FF },
|
||||||
|
{ MVFP, MVFP_SUN },
|
||||||
|
{ COM9, 0x6A }, /* 128x gain ceiling; 0x8 is reserved bit */
|
||||||
|
{ MTX1, 0x80 }, /* "matrix coefficient 1" */
|
||||||
|
{ MTX2, 0x80 }, /* "matrix coefficient 2" */
|
||||||
|
{ MTX3, 0 }, /* vb */
|
||||||
|
{ MTX4, 0x22 }, /* "matrix coefficient 4" */
|
||||||
|
{ MTX5, 0x5e }, /* "matrix coefficient 5" */
|
||||||
|
{ MTX6, 0x80 }, /* "matrix coefficient 6" */
|
||||||
|
{ COM13, COM13_UVSAT },
|
||||||
|
{ 0xff, 0xff }, /* END MARKER */
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regval_list ov7670_fmt_rgb565[] = {
|
||||||
|
{ COM7, COM7_FMT_RGB565 }, /* Selects RGB mode */
|
||||||
|
{ RGB444, 0 }, /* No RGB444 please */
|
||||||
|
{ COM1, 0x0 }, /* CCIR601 */
|
||||||
|
{ COM15, COM15_RGB565 |COM15_R00FF },
|
||||||
|
{ MVFP, MVFP_SUN },
|
||||||
|
{ COM9, 0x6A }, /* 128x gain ceiling; 0x8 is reserved bit */
|
||||||
|
{ MTX1, 0xb3 }, /* "matrix coefficient 1" */
|
||||||
|
{ MTX2, 0xb3 }, /* "matrix coefficient 2" */
|
||||||
|
{ MTX3, 0 }, /* vb */
|
||||||
|
{ MTX4, 0x3d }, /* "matrix coefficient 4" */
|
||||||
|
{ MTX5, 0xa7 }, /* "matrix coefficient 5" */
|
||||||
|
{ MTX6, 0xe4 }, /* "matrix coefficient 6" */
|
||||||
|
{ COM13, COM13_UVSAT },
|
||||||
|
{ 0xff, 0xff }, /* END MARKER */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static struct regval_list ov7670_vga[] = {
|
||||||
|
{ COM3, 0x00 },
|
||||||
|
{ COM14, 0x00 },
|
||||||
|
{ SCALING_XSC, 0x3A },
|
||||||
|
{ SCALING_YSC, 0x35 },
|
||||||
|
{ SCALING_DCWCTR, 0x11 },
|
||||||
|
{ SCALING_PCLK_DIV, 0xF0 },
|
||||||
|
{ SCALING_PCLK_DELAY, 0x02 },
|
||||||
|
{ 0xff, 0xff },
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regval_list ov7670_qvga[] = {
|
||||||
|
{ COM3, 0x04 },
|
||||||
|
{ COM14, 0x19 },
|
||||||
|
{ SCALING_XSC, 0x3A },
|
||||||
|
{ SCALING_YSC, 0x35 },
|
||||||
|
{ SCALING_DCWCTR, 0x11 },
|
||||||
|
{ SCALING_PCLK_DIV, 0xF1 },
|
||||||
|
{ SCALING_PCLK_DELAY, 0x02 },
|
||||||
|
{ 0xff, 0xff },
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regval_list ov7670_qqvga[] = {
|
||||||
|
{ COM3, 0x04 }, //DCW enable
|
||||||
|
{ COM14, 0x1a }, //pixel clock divided by 4, manual scaling enable, DCW and PCLK controlled by register
|
||||||
|
{ SCALING_XSC, 0x3a },
|
||||||
|
{ SCALING_YSC, 0x35 },
|
||||||
|
{ SCALING_DCWCTR, 0x22 }, //downsample by 4
|
||||||
|
{ SCALING_PCLK_DIV, 0xf2 }, //pixel clock divided by 4
|
||||||
|
{ SCALING_PCLK_DELAY, 0x02 },
|
||||||
|
{ 0xff, 0xff },
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write a list of register settings; ff/ff stops the process.
|
||||||
|
*/
|
||||||
|
static int ov7670_write_array(sensor_t *sensor, struct regval_list *vals)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
while ( (vals->reg_num != 0xff || vals->value != 0xff) && (ret == 0) ) {
|
||||||
|
ret = SCCB_Write(sensor->slv_addr, vals->reg_num, vals->value);
|
||||||
|
|
||||||
|
ESP_LOGD(TAG, "reset reg %02X, W(%02X) R(%02X)", vals->reg_num,
|
||||||
|
vals->value, SCCB_Read(sensor->slv_addr, vals->reg_num) );
|
||||||
|
|
||||||
|
vals++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Calculate the frame control registers.
|
||||||
|
*/
|
||||||
|
static int ov7670_frame_control(sensor_t *sensor, int hstart, int hstop, int vstart, int vstop)
|
||||||
|
{
|
||||||
|
struct regval_list frame[7];
|
||||||
|
|
||||||
|
frame[0].reg_num = HSTART;
|
||||||
|
frame[0].value = (hstart >> 3);
|
||||||
|
|
||||||
|
frame[1].reg_num = HSTOP;
|
||||||
|
frame[1].value = (hstop >> 3);
|
||||||
|
|
||||||
|
frame[2].reg_num = HREF;
|
||||||
|
frame[2].value = (((hstop & 0x07) << 3) | (hstart & 0x07));
|
||||||
|
|
||||||
|
frame[3].reg_num = VSTART;
|
||||||
|
frame[3].value = (vstart >> 2);
|
||||||
|
|
||||||
|
frame[4].reg_num = VSTOP;
|
||||||
|
frame[4].value = (vstop >> 2);
|
||||||
|
|
||||||
|
frame[5].reg_num = VREF;
|
||||||
|
frame[5].value = (((vstop & 0x02) << 2) | (vstart & 0x02));
|
||||||
|
|
||||||
|
/* End mark */
|
||||||
|
frame[5].reg_num = 0xFF;
|
||||||
|
frame[5].value = 0xFF;
|
||||||
|
|
||||||
|
return ov7670_write_array(sensor, frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int reset(sensor_t *sensor)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
// Reset all registers
|
||||||
|
SCCB_Write(sensor->slv_addr, COM7, COM7_RESET);
|
||||||
|
|
||||||
|
// Delay 10 ms
|
||||||
|
vTaskDelay(10 / portTICK_PERIOD_MS);
|
||||||
|
|
||||||
|
ret = ov7670_write_array(sensor, ov7670_default_regs);
|
||||||
|
|
||||||
|
// Delay
|
||||||
|
vTaskDelay(30 / portTICK_PERIOD_MS);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_pixformat(sensor_t *sensor, pixformat_t pixformat)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
switch (pixformat) {
|
||||||
|
case PIXFORMAT_RGB565:
|
||||||
|
case PIXFORMAT_RGB888:
|
||||||
|
ret = ov7670_write_array(sensor, ov7670_fmt_rgb565);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PIXFORMAT_YUV422:
|
||||||
|
case PIXFORMAT_GRAYSCALE:
|
||||||
|
default:
|
||||||
|
ret = ov7670_write_array(sensor, ov7670_fmt_yuv422);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
vTaskDelay(30 / portTICK_PERIOD_MS);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we're running RGB565, we must rewrite clkrc after setting
|
||||||
|
* the other parameters or the image looks poor. If we're *not*
|
||||||
|
* doing RGB565, we must not rewrite clkrc or the image looks
|
||||||
|
* *really* poor.
|
||||||
|
*
|
||||||
|
* (Update) Now that we retain clkrc state, we should be able
|
||||||
|
* to write it unconditionally, and that will make the frame
|
||||||
|
* rate persistent too.
|
||||||
|
*/
|
||||||
|
if (pixformat == PIXFORMAT_RGB565) {
|
||||||
|
ret = SCCB_Write(sensor->slv_addr, CLKRC, ov7670_clkrc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_framesize(sensor_t *sensor, framesize_t framesize)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
// store clkrc before changing window settings...
|
||||||
|
ov7670_clkrc = SCCB_Read(sensor->slv_addr, CLKRC);
|
||||||
|
|
||||||
|
switch (framesize){
|
||||||
|
case FRAMESIZE_VGA:
|
||||||
|
if( (ret = ov7670_write_array(sensor, ov7670_vga)) == 0 ) {
|
||||||
|
/* These values from Omnivision */
|
||||||
|
ret = ov7670_frame_control(sensor, 158, 14, 10, 490);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case FRAMESIZE_QVGA:
|
||||||
|
if( (ret = ov7670_write_array(sensor, ov7670_qvga)) == 0 ) {
|
||||||
|
/* These values from Omnivision */
|
||||||
|
ret = ov7670_frame_control(sensor, 158, 14, 10, 490);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case FRAMESIZE_QQVGA:
|
||||||
|
if( (ret = ov7670_write_array(sensor, ov7670_qqvga)) == 0 ) {
|
||||||
|
/* These values from Omnivision */
|
||||||
|
ret = ov7670_frame_control(sensor, 158, 14, 10, 490);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
vTaskDelay(30 / portTICK_PERIOD_MS);
|
||||||
|
|
||||||
|
if (ret == 0) {
|
||||||
|
sensor->status.framesize = framesize;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_colorbar(sensor_t *sensor, int enable)
|
||||||
|
{
|
||||||
|
uint8_t ret = 0;
|
||||||
|
// Read register scaling_xsc
|
||||||
|
uint8_t reg = SCCB_Read(sensor->slv_addr, SCALING_XSC);
|
||||||
|
|
||||||
|
// Pattern to set color bar bit[0]=0 in every case
|
||||||
|
reg = SCALING_XSC_CBAR(reg);
|
||||||
|
|
||||||
|
// Write pattern to SCALING_XSC
|
||||||
|
ret = SCCB_Write(sensor->slv_addr, SCALING_XSC, reg);
|
||||||
|
|
||||||
|
// Read register scaling_ysc
|
||||||
|
reg = SCCB_Read(sensor->slv_addr, SCALING_YSC);
|
||||||
|
|
||||||
|
// Pattern to set color bar bit[0]=0 in every case
|
||||||
|
reg = SCALING_YSC_CBAR(reg, enable);
|
||||||
|
|
||||||
|
// Write pattern to SCALING_YSC
|
||||||
|
ret = ret | SCCB_Write(sensor->slv_addr, SCALING_YSC, reg);
|
||||||
|
|
||||||
|
// return 0 or 0xFF
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_whitebal(sensor_t *sensor, int enable)
|
||||||
|
{
|
||||||
|
// Read register COM8
|
||||||
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8);
|
||||||
|
|
||||||
|
// Set white bal on/off
|
||||||
|
reg = COM8_SET_AWB(reg, enable);
|
||||||
|
|
||||||
|
// Write back register COM8
|
||||||
|
return SCCB_Write(sensor->slv_addr, COM8, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_gain_ctrl(sensor_t *sensor, int enable)
|
||||||
|
{
|
||||||
|
// Read register COM8
|
||||||
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8);
|
||||||
|
|
||||||
|
// Set white bal on/off
|
||||||
|
reg = COM8_SET_AGC(reg, enable);
|
||||||
|
|
||||||
|
// Write back register COM8
|
||||||
|
return SCCB_Write(sensor->slv_addr, COM8, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_exposure_ctrl(sensor_t *sensor, int enable)
|
||||||
|
{
|
||||||
|
// Read register COM8
|
||||||
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8);
|
||||||
|
|
||||||
|
// Set white bal on/off
|
||||||
|
reg = COM8_SET_AEC(reg, enable);
|
||||||
|
|
||||||
|
// Write back register COM8
|
||||||
|
return SCCB_Write(sensor->slv_addr, COM8, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_hmirror(sensor_t *sensor, int enable)
|
||||||
|
{
|
||||||
|
// Read register MVFP
|
||||||
|
uint8_t reg = SCCB_Read(sensor->slv_addr, MVFP);
|
||||||
|
|
||||||
|
// Set mirror on/off
|
||||||
|
reg = MVFP_SET_MIRROR(reg, enable);
|
||||||
|
|
||||||
|
// Write back register MVFP
|
||||||
|
return SCCB_Write(sensor->slv_addr, MVFP, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_vflip(sensor_t *sensor, int enable)
|
||||||
|
{
|
||||||
|
// Read register MVFP
|
||||||
|
uint8_t reg = SCCB_Read(sensor->slv_addr, MVFP);
|
||||||
|
|
||||||
|
// Set mirror on/off
|
||||||
|
reg = MVFP_SET_FLIP(reg, enable);
|
||||||
|
|
||||||
|
// Write back register MVFP
|
||||||
|
return SCCB_Write(sensor->slv_addr, MVFP, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int init_status(sensor_t *sensor)
|
||||||
|
{
|
||||||
|
sensor->status.awb = 0;
|
||||||
|
sensor->status.aec = 0;
|
||||||
|
sensor->status.agc = 0;
|
||||||
|
sensor->status.hmirror = 0;
|
||||||
|
sensor->status.vflip = 0;
|
||||||
|
sensor->status.colorbar = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_dummy(sensor_t *sensor, int val){ return -1; }
|
||||||
|
static int set_gainceiling_dummy(sensor_t *sensor, gainceiling_t val){ return -1; }
|
||||||
|
|
||||||
|
int ov7670_init(sensor_t *sensor)
|
||||||
|
{
|
||||||
|
// Set function pointers
|
||||||
|
sensor->reset = reset;
|
||||||
|
sensor->init_status = init_status;
|
||||||
|
sensor->set_pixformat = set_pixformat;
|
||||||
|
sensor->set_framesize = set_framesize;
|
||||||
|
sensor->set_colorbar = set_colorbar;
|
||||||
|
sensor->set_whitebal = set_whitebal;
|
||||||
|
sensor->set_gain_ctrl = set_gain_ctrl;
|
||||||
|
sensor->set_exposure_ctrl = set_exposure_ctrl;
|
||||||
|
sensor->set_hmirror = set_hmirror;
|
||||||
|
sensor->set_vflip = set_vflip;
|
||||||
|
|
||||||
|
//not supported
|
||||||
|
sensor->set_brightness= set_dummy;
|
||||||
|
sensor->set_saturation= set_dummy;
|
||||||
|
sensor->set_quality = set_dummy;
|
||||||
|
sensor->set_gainceiling = set_gainceiling_dummy;
|
||||||
|
sensor->set_aec2 = set_dummy;
|
||||||
|
sensor->set_aec_value = set_dummy;
|
||||||
|
sensor->set_special_effect = set_dummy;
|
||||||
|
sensor->set_wb_mode = set_dummy;
|
||||||
|
sensor->set_ae_level = set_dummy;
|
||||||
|
sensor->set_dcw = set_dummy;
|
||||||
|
sensor->set_bpc = set_dummy;
|
||||||
|
sensor->set_wpc = set_dummy;
|
||||||
|
sensor->set_awb_gain = set_dummy;
|
||||||
|
sensor->set_agc_gain = set_dummy;
|
||||||
|
sensor->set_raw_gma = set_dummy;
|
||||||
|
sensor->set_lenc = set_dummy;
|
||||||
|
sensor->set_sharpness = set_dummy;
|
||||||
|
sensor->set_denoise = set_dummy;
|
||||||
|
|
||||||
|
// Retrieve sensor's signature
|
||||||
|
sensor->id.MIDH = SCCB_Read(sensor->slv_addr, REG_MIDH);
|
||||||
|
sensor->id.MIDL = SCCB_Read(sensor->slv_addr, REG_MIDL);
|
||||||
|
sensor->id.PID = SCCB_Read(sensor->slv_addr, REG_PID);
|
||||||
|
sensor->id.VER = SCCB_Read(sensor->slv_addr, REG_VER);
|
||||||
|
|
||||||
|
ESP_LOGD(TAG, "OV7670 Attached");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the OpenMV project.
|
||||||
|
* author: Juan Schiavoni <juanjoseschiavoni@hotmail.com>
|
||||||
|
* This work is licensed under the MIT license, see the file LICENSE for details.
|
||||||
|
*
|
||||||
|
* OV7670 driver.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __OV7670_H__
|
||||||
|
#define __OV7670_H__
|
||||||
|
#include "sensor.h"
|
||||||
|
|
||||||
|
int ov7670_init(sensor_t *sensor);
|
||||||
|
#endif // __OV7670_H__
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the OpenMV project.
|
||||||
|
* Copyright (c) 2013/2014 Ibrahim Abdelkader <i.abdalkader@gmail.com>
|
||||||
|
* This work is licensed under the MIT license, see the file LICENSE for details.
|
||||||
|
*
|
||||||
|
* NT99141 driver.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __NT99141_H__
|
||||||
|
#define __NT99141_H__
|
||||||
|
|
||||||
|
#include "sensor.h"
|
||||||
|
|
||||||
|
int NT99141_init(sensor_t *sensor);
|
||||||
|
|
||||||
|
#endif // __NT99141_H__
|
@ -0,0 +1,825 @@
|
|||||||
|
#ifndef _NT99141_SETTINGS_H_
|
||||||
|
#define _NT99141_SETTINGS_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "esp_attr.h"
|
||||||
|
#include "nt99141_regs.h"
|
||||||
|
|
||||||
|
static const ratio_settings_t ratio_table[] = {
|
||||||
|
// mw, mh, sx, sy, ex, ey, ox, oy, tx, ty
|
||||||
|
{ 1280, 720, 0, 4, 1283, 723, 0, 4, 1660, 963 },
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#define REG_DLY 0xffff
|
||||||
|
#define REGLIST_TAIL 0x0000
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_default_regs[][2] = {
|
||||||
|
//initial
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x3109, 0x04},
|
||||||
|
{0x3040, 0x04},
|
||||||
|
{0x3041, 0x02},
|
||||||
|
{0x3042, 0xFF},
|
||||||
|
{0x3043, 0x08},
|
||||||
|
{0x3052, 0xE0},
|
||||||
|
{0x305F, 0x33},
|
||||||
|
{0x3100, 0x07},
|
||||||
|
{0x3106, 0x03},
|
||||||
|
{0x3105, 0x01},
|
||||||
|
{0x3108, 0x05},
|
||||||
|
{0x3110, 0x22},
|
||||||
|
{0x3111, 0x57},
|
||||||
|
{0x3112, 0x22},
|
||||||
|
{0x3113, 0x55},
|
||||||
|
{0x3114, 0x05},
|
||||||
|
{0x3135, 0x00},
|
||||||
|
{0x32F0, 0x01},
|
||||||
|
{0x3290, 0x01},
|
||||||
|
{0x3291, 0x80},
|
||||||
|
{0x3296, 0x01},
|
||||||
|
{0x3297, 0x73},
|
||||||
|
{0x3250, 0x80},
|
||||||
|
{0x3251, 0x03},
|
||||||
|
{0x3252, 0xFF},
|
||||||
|
{0x3253, 0x00},
|
||||||
|
{0x3254, 0x03},
|
||||||
|
{0x3255, 0xFF},
|
||||||
|
{0x3256, 0x00},
|
||||||
|
{0x3257, 0x50},
|
||||||
|
{0x3270, 0x00},
|
||||||
|
{0x3271, 0x0C},
|
||||||
|
{0x3272, 0x18},
|
||||||
|
{0x3273, 0x32},
|
||||||
|
{0x3274, 0x44},
|
||||||
|
{0x3275, 0x54},
|
||||||
|
{0x3276, 0x70},
|
||||||
|
{0x3277, 0x88},
|
||||||
|
{0x3278, 0x9D},
|
||||||
|
{0x3279, 0xB0},
|
||||||
|
{0x327A, 0xCF},
|
||||||
|
{0x327B, 0xE2},
|
||||||
|
{0x327C, 0xEF},
|
||||||
|
{0x327D, 0xF7},
|
||||||
|
{0x327E, 0xFF},
|
||||||
|
{0x3302, 0x00},
|
||||||
|
{0x3303, 0x40},
|
||||||
|
{0x3304, 0x00},
|
||||||
|
{0x3305, 0x96},
|
||||||
|
{0x3306, 0x00},
|
||||||
|
{0x3307, 0x29},
|
||||||
|
{0x3308, 0x07},
|
||||||
|
{0x3309, 0xBA},
|
||||||
|
{0x330A, 0x06},
|
||||||
|
{0x330B, 0xF5},
|
||||||
|
{0x330C, 0x01},
|
||||||
|
{0x330D, 0x51},
|
||||||
|
{0x330E, 0x01},
|
||||||
|
{0x330F, 0x30},
|
||||||
|
{0x3310, 0x07},
|
||||||
|
{0x3311, 0x16},
|
||||||
|
{0x3312, 0x07},
|
||||||
|
{0x3313, 0xBA},
|
||||||
|
{0x3326, 0x02},
|
||||||
|
{0x32F6, 0x0F},
|
||||||
|
{0x32F9, 0x42},
|
||||||
|
{0x32FA, 0x24},
|
||||||
|
{0x3325, 0x4A},
|
||||||
|
{0x3330, 0x00},
|
||||||
|
{0x3331, 0x0A},
|
||||||
|
{0x3332, 0xFF},
|
||||||
|
{0x3338, 0x30},
|
||||||
|
{0x3339, 0x84},
|
||||||
|
{0x333A, 0x48},
|
||||||
|
{0x333F, 0x07},
|
||||||
|
{0x3360, 0x10},
|
||||||
|
{0x3361, 0x18},
|
||||||
|
{0x3362, 0x1f},
|
||||||
|
{0x3363, 0x37},
|
||||||
|
{0x3364, 0x80},
|
||||||
|
{0x3365, 0x80},
|
||||||
|
{0x3366, 0x68},
|
||||||
|
{0x3367, 0x60},
|
||||||
|
{0x3368, 0x30},
|
||||||
|
{0x3369, 0x28},
|
||||||
|
{0x336A, 0x20},
|
||||||
|
{0x336B, 0x10},
|
||||||
|
{0x336C, 0x00},
|
||||||
|
{0x336D, 0x20},
|
||||||
|
{0x336E, 0x1C},
|
||||||
|
{0x336F, 0x18},
|
||||||
|
{0x3370, 0x10},
|
||||||
|
{0x3371, 0x38},
|
||||||
|
{0x3372, 0x3C},
|
||||||
|
{0x3373, 0x3F},
|
||||||
|
{0x3374, 0x3F},
|
||||||
|
{0x338A, 0x34},
|
||||||
|
{0x338B, 0x7F},
|
||||||
|
{0x338C, 0x10},
|
||||||
|
{0x338D, 0x23},
|
||||||
|
{0x338E, 0x7F},
|
||||||
|
{0x338F, 0x14},
|
||||||
|
{0x3375, 0x08},
|
||||||
|
{0x3376, 0x0C},
|
||||||
|
{0x3377, 0x18},
|
||||||
|
{0x3378, 0x20},
|
||||||
|
{0x3012, 0x02},
|
||||||
|
{0x3013, 0xD0},
|
||||||
|
{0x3025, 0x02}, //colorbar
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_fmt_jpeg[][2] = {
|
||||||
|
{0x32F0, 0x70}, // YUV422
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_fmt_raw[][2] = {
|
||||||
|
{0x32F0, 0x50}, // RAW
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_fmt_grayscale[][2] = {
|
||||||
|
{0x32F1, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_fmt_yuv422[][2] = {
|
||||||
|
{0x32F0, 0x00}, // YUV422
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_fmt_rgb565[][2] = {
|
||||||
|
{0x32F0, 0x01}, // RGB
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint8_t sensor_saturation_levels[9][1] = {
|
||||||
|
{0x60},//-4
|
||||||
|
{0x68},//-3
|
||||||
|
{0x70},//-2
|
||||||
|
{0x78},//-1
|
||||||
|
{0x80},//0
|
||||||
|
{0x88},//+1
|
||||||
|
{0x90},//+2
|
||||||
|
{0x98},//+3
|
||||||
|
{0xA0},//+4
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint8_t sensor_special_effects[7][4] = {
|
||||||
|
{0x00, 0x80, 0x80, 0x01},//Normal
|
||||||
|
{0x03, 0x80, 0x80, 0x01},//Negative
|
||||||
|
{0x01, 0x80, 0x80, 0x01},//Grayscale
|
||||||
|
{0x05, 0x2A, 0xF0, 0x01},//Red Tint
|
||||||
|
{0x05, 0x60, 0x20, 0x01},//Green Tint
|
||||||
|
{0x05, 0xF0, 0x80, 0x01},//Blue Tint
|
||||||
|
{0x02, 0x80, 0x80, 0x01},//Sepia
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// AE LEVEL
|
||||||
|
static const DRAM_ATTR uint16_t sensor_ae_level[][2] = {
|
||||||
|
|
||||||
|
// 1. [AE_Target : 0x24]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x29 },
|
||||||
|
{0x32B9, 0x1F },
|
||||||
|
{0x32BC, 0x24 },
|
||||||
|
{0x32BD, 0x27 },
|
||||||
|
{0x32BE, 0x21 },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 2. [AE_Target : 0x28]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x2D },
|
||||||
|
{0x32B9, 0x23 },
|
||||||
|
{0x32BC, 0x28 },
|
||||||
|
{0x32BD, 0x2B },
|
||||||
|
{0x32BE, 0x25 },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 3. [AE_Target : 0x2C]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x32 },
|
||||||
|
{0x32B9, 0x26 },
|
||||||
|
{0x32BC, 0x2C },
|
||||||
|
{0x32BD, 0x2F },
|
||||||
|
{0x32BE, 0x29 },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 4, [AE_Target : 0x30]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x36 },
|
||||||
|
{0x32B9, 0x2A },
|
||||||
|
{0x32BC, 0x30 },
|
||||||
|
{0x32BD, 0x33 },
|
||||||
|
{0x32BE, 0x2D },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 5. [AE_Target : 0x34]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x3B },
|
||||||
|
{0x32B9, 0x2D },
|
||||||
|
{0x32BC, 0x34 },
|
||||||
|
{0x32BD, 0x38 },
|
||||||
|
{0x32BE, 0x30 },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 6. [AE_Target : 0x38]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x3F },
|
||||||
|
{0x32B9, 0x31 },
|
||||||
|
{0x32BC, 0x38 },
|
||||||
|
{0x32BD, 0x3C },
|
||||||
|
{0x32BE, 0x34 },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 7. [AE_Target : 0x3D]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x44 },
|
||||||
|
{0x32B9, 0x34 },
|
||||||
|
{0x32BC, 0x3C },
|
||||||
|
{0x32BD, 0x40 },
|
||||||
|
{0x32BE, 0x38 },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 8. [AE_Target : 0x40]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x48 },
|
||||||
|
{0x32B9, 0x38 },
|
||||||
|
{0x32BC, 0x40 },
|
||||||
|
{0x32BD, 0x44 },
|
||||||
|
{0x32BE, 0x3C },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 9. [AE_Target : 0x44]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x4D },
|
||||||
|
{0x32B9, 0x3B },
|
||||||
|
{0x32BC, 0x44 },
|
||||||
|
{0x32BD, 0x49 },
|
||||||
|
{0x32BE, 0x3F },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_HD[][2] = {
|
||||||
|
//[JPEG_1280x720_8.18_8.18_Fps]
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x3C},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x5E},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x24},
|
||||||
|
{0x3002, 0x00},
|
||||||
|
{0x3003, 0x04},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x04},
|
||||||
|
{0x3006, 0x05},
|
||||||
|
{0x3007, 0x03},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0xD3},
|
||||||
|
{0x300A, 0x06},
|
||||||
|
{0x300B, 0x7C},
|
||||||
|
{0x300C, 0x02},
|
||||||
|
{0x300D, 0xE0},
|
||||||
|
{0x300E, 0x05},
|
||||||
|
{0x300F, 0x00},
|
||||||
|
{0x3010, 0x02},
|
||||||
|
{0x3011, 0xD0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x3F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_VGA[][2] = {
|
||||||
|
//[JPEG_640x480_10.14_10.14_Fps]
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x4B},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x62},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x32E0, 0x02},
|
||||||
|
{0x32E1, 0x80},
|
||||||
|
{0x32E2, 0x01},
|
||||||
|
{0x32E3, 0xE0},
|
||||||
|
{0x32E4, 0x00},
|
||||||
|
{0x32E5, 0x80},
|
||||||
|
{0x32E6, 0x00},
|
||||||
|
{0x32E7, 0x80},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x24},
|
||||||
|
{0x3002, 0x00},
|
||||||
|
{0x3003, 0xA4},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x04},
|
||||||
|
{0x3006, 0x04},
|
||||||
|
{0x3007, 0x63},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0xD3},
|
||||||
|
{0x300A, 0x05},
|
||||||
|
{0x300B, 0x3C},
|
||||||
|
{0x300C, 0x02},
|
||||||
|
{0x300D, 0xE0},
|
||||||
|
{0x300E, 0x03},
|
||||||
|
{0x300F, 0xC0},
|
||||||
|
{0x3010, 0x02},
|
||||||
|
{0x3011, 0xD0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x7F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_QVGA[][2] = {
|
||||||
|
//[JPEG_320x240_10.14_10.14_Fps]
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x4B},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x62},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x32E0, 0x01},
|
||||||
|
{0x32E1, 0x40},
|
||||||
|
{0x32E2, 0x00},
|
||||||
|
{0x32E3, 0xF0},
|
||||||
|
{0x32E4, 0x02},
|
||||||
|
{0x32E5, 0x02},
|
||||||
|
{0x32E6, 0x02},
|
||||||
|
{0x32E7, 0x03},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x24},
|
||||||
|
{0x3002, 0x00},
|
||||||
|
{0x3003, 0xA4},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x04},
|
||||||
|
{0x3006, 0x04},
|
||||||
|
{0x3007, 0x63},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0xD3},
|
||||||
|
{0x300A, 0x05},
|
||||||
|
{0x300B, 0x3C},
|
||||||
|
{0x300C, 0x02},
|
||||||
|
{0x300D, 0xE0},
|
||||||
|
{0x300E, 0x03},
|
||||||
|
{0x300F, 0xC0},
|
||||||
|
{0x3010, 0x02},
|
||||||
|
{0x3011, 0xD0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x7F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_VGA_xyskip[][2] = {
|
||||||
|
// [JPEG_640x360_20.00_25.01_Fps_XY_Skip]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60 },
|
||||||
|
{0x320A, 0xB2 },
|
||||||
|
{0x32C0, 0x64 },
|
||||||
|
{0x32C1, 0x64 },
|
||||||
|
{0x32C2, 0x64 },
|
||||||
|
{0x32C3, 0x00 },
|
||||||
|
{0x32C4, 0x20 },
|
||||||
|
{0x32C5, 0x20 },
|
||||||
|
{0x32C6, 0x20 },
|
||||||
|
{0x32C7, 0x00 },
|
||||||
|
{0x32C8, 0x62 },
|
||||||
|
{0x32C9, 0x64 },
|
||||||
|
{0x32CA, 0x84 },
|
||||||
|
{0x32CB, 0x84 },
|
||||||
|
{0x32CC, 0x84 },
|
||||||
|
{0x32CD, 0x84 },
|
||||||
|
{0x32DB, 0x68 },
|
||||||
|
{0x32F0, 0x70 },
|
||||||
|
{0x3400, 0x08 },
|
||||||
|
{0x3400, 0x00 },
|
||||||
|
{0x3401, 0x4E },
|
||||||
|
{0x3404, 0x00 },
|
||||||
|
{0x3405, 0x00 },
|
||||||
|
{0x3410, 0x00 },
|
||||||
|
{0x3200, 0x3E },
|
||||||
|
{0x3201, 0x0F },
|
||||||
|
{0x3028, 0x0F },
|
||||||
|
{0x3029, 0x00 },
|
||||||
|
{0x302A, 0x08 },
|
||||||
|
{0x3022, 0x24 },
|
||||||
|
{0x3023, 0x6C },
|
||||||
|
{0x3002, 0x00 },
|
||||||
|
{0x3003, 0x04 },
|
||||||
|
{0x3004, 0x00 },
|
||||||
|
{0x3005, 0x04 },
|
||||||
|
{0x3006, 0x05 },
|
||||||
|
{0x3007, 0x03 },
|
||||||
|
{0x3008, 0x02 },
|
||||||
|
{0x3009, 0xD3 },
|
||||||
|
{0x300A, 0x03 },
|
||||||
|
{0x300B, 0xFC },
|
||||||
|
{0x300C, 0x01 },
|
||||||
|
{0x300D, 0x88 },
|
||||||
|
{0x300E, 0x02 },
|
||||||
|
{0x300F, 0x80 },
|
||||||
|
{0x3010, 0x01 },
|
||||||
|
{0x3011, 0x68 },
|
||||||
|
{0x32B8, 0x3F },
|
||||||
|
{0x32B9, 0x31 },
|
||||||
|
{0x32BB, 0x87 },
|
||||||
|
{0x32BC, 0x38 },
|
||||||
|
{0x32BD, 0x3C },
|
||||||
|
{0x32BE, 0x34 },
|
||||||
|
{0x3201, 0x3F },
|
||||||
|
{0x3025, 0x00 }, //normal
|
||||||
|
{0x3021, 0x06 },
|
||||||
|
{0x3400, 0x01 },
|
||||||
|
{0x3060, 0x01 },
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_VGA_xskip[][2] = {
|
||||||
|
//[JPEG_640x480_Xskip_13.32_13.32_Fps]
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x62},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x68},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x32E0, 0x02},
|
||||||
|
{0x32E1, 0x80},
|
||||||
|
{0x32E2, 0x01},
|
||||||
|
{0x32E3, 0xE0},
|
||||||
|
{0x32E4, 0x00},
|
||||||
|
{0x32E5, 0x00},
|
||||||
|
{0x32E6, 0x00},
|
||||||
|
{0x32E7, 0x80},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x2C},
|
||||||
|
{0x3002, 0x00},
|
||||||
|
{0x3003, 0x04},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x04},
|
||||||
|
{0x3006, 0x05},
|
||||||
|
{0x3007, 0x03},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0xD3},
|
||||||
|
{0x300A, 0x03},
|
||||||
|
{0x300B, 0xFC},
|
||||||
|
{0x300C, 0x02},
|
||||||
|
{0x300D, 0xE0},
|
||||||
|
{0x300E, 0x02},
|
||||||
|
{0x300F, 0x80},
|
||||||
|
{0x3010, 0x02},
|
||||||
|
{0x3011, 0xD0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x7F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_QVGA_xskip[][2] = {
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
//[JPEG_320x240_Xskip_13.32_13.32_Fps]
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x62},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x68},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x32E0, 0x01},
|
||||||
|
{0x32E1, 0x40},
|
||||||
|
{0x32E2, 0x00},
|
||||||
|
{0x32E3, 0xF0},
|
||||||
|
{0x32E4, 0x01},
|
||||||
|
{0x32E5, 0x01},
|
||||||
|
{0x32E6, 0x02},
|
||||||
|
{0x32E7, 0x03},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x2C},
|
||||||
|
{0x3002, 0x00},
|
||||||
|
{0x3003, 0x04},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x04},
|
||||||
|
{0x3006, 0x05},
|
||||||
|
{0x3007, 0x03},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0xD3},
|
||||||
|
{0x300A, 0x03},
|
||||||
|
{0x300B, 0xFC},
|
||||||
|
{0x300C, 0x02},
|
||||||
|
{0x300D, 0xE0},
|
||||||
|
{0x300E, 0x02},
|
||||||
|
{0x300F, 0x80},
|
||||||
|
{0x3010, 0x02},
|
||||||
|
{0x3011, 0xD0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x7F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_VGA_crop[][2] = {
|
||||||
|
//[JPEG_640x480_Crop_19.77_19.77_Fps]
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x62},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x68},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x24},
|
||||||
|
{0x3002, 0x01},
|
||||||
|
{0x3003, 0x44},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x7C},
|
||||||
|
{0x3006, 0x03},
|
||||||
|
{0x3007, 0xC3},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0x5B},
|
||||||
|
{0x300A, 0x03},
|
||||||
|
{0x300B, 0xFC},
|
||||||
|
{0x300C, 0x01},
|
||||||
|
{0x300D, 0xF0},
|
||||||
|
{0x300E, 0x02},
|
||||||
|
{0x300F, 0x80},
|
||||||
|
{0x3010, 0x01},
|
||||||
|
{0x3011, 0xE0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x3F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_QVGA_crop[][2] = {
|
||||||
|
//[JPEG_320x240_Crop_19.77_19.77_Fps]
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x62},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x68},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x32E0, 0x01},
|
||||||
|
{0x32E1, 0x40},
|
||||||
|
{0x32E2, 0x00},
|
||||||
|
{0x32E3, 0xF0},
|
||||||
|
{0x32E4, 0x01},
|
||||||
|
{0x32E5, 0x01},
|
||||||
|
{0x32E6, 0x01},
|
||||||
|
{0x32E7, 0x02},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x24},
|
||||||
|
{0x3002, 0x01},
|
||||||
|
{0x3003, 0x44},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x7C},
|
||||||
|
{0x3006, 0x03},
|
||||||
|
{0x3007, 0xC3},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0x5B},
|
||||||
|
{0x300A, 0x03},
|
||||||
|
{0x300B, 0xFC},
|
||||||
|
{0x300C, 0x01},
|
||||||
|
{0x300D, 0xF0},
|
||||||
|
{0x300E, 0x02},
|
||||||
|
{0x300F, 0x80},
|
||||||
|
{0x3010, 0x01},
|
||||||
|
{0x3011, 0xE0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x7F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
@ -0,0 +1,439 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the OpenMV project.
|
||||||
|
* author: Juan Schiavoni <juanjoseschiavoni@hotmail.com>
|
||||||
|
* This work is licensed under the MIT license, see the file LICENSE for details.
|
||||||
|
*
|
||||||
|
* OV7725 driver.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "sccb.h"
|
||||||
|
#include "ov7670.h"
|
||||||
|
#include "ov7670_regs.h"
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/task.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_ARDUHAL_ESP_LOG)
|
||||||
|
#include "esp32-hal-log.h"
|
||||||
|
#else
|
||||||
|
#include "esp_log.h"
|
||||||
|
static const char* TAG = "ov7760";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int ov7670_clkrc = 0x01;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The default register settings, as obtained from OmniVision. There
|
||||||
|
* is really no making sense of most of these - lots of "reserved" values
|
||||||
|
* and such.
|
||||||
|
*
|
||||||
|
* These settings give VGA YUYV.
|
||||||
|
*/
|
||||||
|
struct regval_list {
|
||||||
|
uint8_t reg_num;
|
||||||
|
uint8_t value;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regval_list ov7670_default_regs[] = {
|
||||||
|
/* Sensor automatically sets output window when resolution changes. */
|
||||||
|
{TSLB, 0x04},
|
||||||
|
|
||||||
|
/* Frame rate 30 fps at 12 Mhz clock */
|
||||||
|
{CLKRC, 0x00},
|
||||||
|
{DBLV, 0x4A},
|
||||||
|
|
||||||
|
{COM10, COM10_VSYNC_NEG | COM10_PCLK_MASK},
|
||||||
|
|
||||||
|
/* Improve white balance */
|
||||||
|
{COM4, 0x40},
|
||||||
|
|
||||||
|
/* Improve color */
|
||||||
|
{RSVD_B0, 0x84},
|
||||||
|
|
||||||
|
/* Enable 50/60 Hz auto detection */
|
||||||
|
{COM11, COM11_EXP|COM11_HZAUTO},
|
||||||
|
|
||||||
|
/* Disable some delays */
|
||||||
|
{HSYST, 0},
|
||||||
|
{HSYEN, 0},
|
||||||
|
|
||||||
|
{MVFP, MVFP_SUN},
|
||||||
|
|
||||||
|
/* More reserved magic, some of which tweaks white balance */
|
||||||
|
{AWBC1, 0x0a},
|
||||||
|
{AWBC2, 0xf0},
|
||||||
|
{AWBC3, 0x34},
|
||||||
|
{AWBC4, 0x58},
|
||||||
|
{AWBC5, 0x28},
|
||||||
|
{AWBC6, 0x3a},
|
||||||
|
|
||||||
|
{AWBCTR3, 0x0a},
|
||||||
|
{AWBCTR2, 0x55},
|
||||||
|
{AWBCTR1, 0x11},
|
||||||
|
{AWBCTR0, 0x9e},
|
||||||
|
|
||||||
|
{COM8, COM8_FAST_AUTO|COM8_STEP_UNLIMIT|COM8_AGC_EN|COM8_AEC_EN|COM8_AWB_EN},
|
||||||
|
|
||||||
|
/* End marker is FF because in ov7670 the address of GAIN 0 and default value too. */
|
||||||
|
{0xFF, 0xFF},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regval_list ov7670_fmt_yuv422[] = {
|
||||||
|
{ COM7, 0x0 }, /* Selects YUV mode */
|
||||||
|
{ RGB444, 0 }, /* No RGB444 please */
|
||||||
|
{ COM1, 0 }, /* CCIR601 */
|
||||||
|
{ COM15, COM15_R00FF },
|
||||||
|
{ MVFP, MVFP_SUN },
|
||||||
|
{ COM9, 0x6A }, /* 128x gain ceiling; 0x8 is reserved bit */
|
||||||
|
{ MTX1, 0x80 }, /* "matrix coefficient 1" */
|
||||||
|
{ MTX2, 0x80 }, /* "matrix coefficient 2" */
|
||||||
|
{ MTX3, 0 }, /* vb */
|
||||||
|
{ MTX4, 0x22 }, /* "matrix coefficient 4" */
|
||||||
|
{ MTX5, 0x5e }, /* "matrix coefficient 5" */
|
||||||
|
{ MTX6, 0x80 }, /* "matrix coefficient 6" */
|
||||||
|
{ COM13, COM13_UVSAT },
|
||||||
|
{ 0xff, 0xff }, /* END MARKER */
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regval_list ov7670_fmt_rgb565[] = {
|
||||||
|
{ COM7, COM7_FMT_RGB565 }, /* Selects RGB mode */
|
||||||
|
{ RGB444, 0 }, /* No RGB444 please */
|
||||||
|
{ COM1, 0x0 }, /* CCIR601 */
|
||||||
|
{ COM15, COM15_RGB565 |COM15_R00FF },
|
||||||
|
{ MVFP, MVFP_SUN },
|
||||||
|
{ COM9, 0x6A }, /* 128x gain ceiling; 0x8 is reserved bit */
|
||||||
|
{ MTX1, 0xb3 }, /* "matrix coefficient 1" */
|
||||||
|
{ MTX2, 0xb3 }, /* "matrix coefficient 2" */
|
||||||
|
{ MTX3, 0 }, /* vb */
|
||||||
|
{ MTX4, 0x3d }, /* "matrix coefficient 4" */
|
||||||
|
{ MTX5, 0xa7 }, /* "matrix coefficient 5" */
|
||||||
|
{ MTX6, 0xe4 }, /* "matrix coefficient 6" */
|
||||||
|
{ COM13, COM13_UVSAT },
|
||||||
|
{ 0xff, 0xff }, /* END MARKER */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static struct regval_list ov7670_vga[] = {
|
||||||
|
{ COM3, 0x00 },
|
||||||
|
{ COM14, 0x00 },
|
||||||
|
{ SCALING_XSC, 0x3A },
|
||||||
|
{ SCALING_YSC, 0x35 },
|
||||||
|
{ SCALING_DCWCTR, 0x11 },
|
||||||
|
{ SCALING_PCLK_DIV, 0xF0 },
|
||||||
|
{ SCALING_PCLK_DELAY, 0x02 },
|
||||||
|
{ 0xff, 0xff },
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regval_list ov7670_qvga[] = {
|
||||||
|
{ COM3, 0x04 },
|
||||||
|
{ COM14, 0x19 },
|
||||||
|
{ SCALING_XSC, 0x3A },
|
||||||
|
{ SCALING_YSC, 0x35 },
|
||||||
|
{ SCALING_DCWCTR, 0x11 },
|
||||||
|
{ SCALING_PCLK_DIV, 0xF1 },
|
||||||
|
{ SCALING_PCLK_DELAY, 0x02 },
|
||||||
|
{ 0xff, 0xff },
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regval_list ov7670_qqvga[] = {
|
||||||
|
{ COM3, 0x04 }, //DCW enable
|
||||||
|
{ COM14, 0x1a }, //pixel clock divided by 4, manual scaling enable, DCW and PCLK controlled by register
|
||||||
|
{ SCALING_XSC, 0x3a },
|
||||||
|
{ SCALING_YSC, 0x35 },
|
||||||
|
{ SCALING_DCWCTR, 0x22 }, //downsample by 4
|
||||||
|
{ SCALING_PCLK_DIV, 0xf2 }, //pixel clock divided by 4
|
||||||
|
{ SCALING_PCLK_DELAY, 0x02 },
|
||||||
|
{ 0xff, 0xff },
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write a list of register settings; ff/ff stops the process.
|
||||||
|
*/
|
||||||
|
static int ov7670_write_array(sensor_t *sensor, struct regval_list *vals)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
while ( (vals->reg_num != 0xff || vals->value != 0xff) && (ret == 0) ) {
|
||||||
|
ret = SCCB_Write(sensor->slv_addr, vals->reg_num, vals->value);
|
||||||
|
|
||||||
|
ESP_LOGD(TAG, "reset reg %02X, W(%02X) R(%02X)", vals->reg_num,
|
||||||
|
vals->value, SCCB_Read(sensor->slv_addr, vals->reg_num) );
|
||||||
|
|
||||||
|
vals++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Calculate the frame control registers.
|
||||||
|
*/
|
||||||
|
static int ov7670_frame_control(sensor_t *sensor, int hstart, int hstop, int vstart, int vstop)
|
||||||
|
{
|
||||||
|
struct regval_list frame[7];
|
||||||
|
|
||||||
|
frame[0].reg_num = HSTART;
|
||||||
|
frame[0].value = (hstart >> 3);
|
||||||
|
|
||||||
|
frame[1].reg_num = HSTOP;
|
||||||
|
frame[1].value = (hstop >> 3);
|
||||||
|
|
||||||
|
frame[2].reg_num = HREF;
|
||||||
|
frame[2].value = (((hstop & 0x07) << 3) | (hstart & 0x07));
|
||||||
|
|
||||||
|
frame[3].reg_num = VSTART;
|
||||||
|
frame[3].value = (vstart >> 2);
|
||||||
|
|
||||||
|
frame[4].reg_num = VSTOP;
|
||||||
|
frame[4].value = (vstop >> 2);
|
||||||
|
|
||||||
|
frame[5].reg_num = VREF;
|
||||||
|
frame[5].value = (((vstop & 0x02) << 2) | (vstart & 0x02));
|
||||||
|
|
||||||
|
/* End mark */
|
||||||
|
frame[5].reg_num = 0xFF;
|
||||||
|
frame[5].value = 0xFF;
|
||||||
|
|
||||||
|
return ov7670_write_array(sensor, frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int reset(sensor_t *sensor)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
// Reset all registers
|
||||||
|
SCCB_Write(sensor->slv_addr, COM7, COM7_RESET);
|
||||||
|
|
||||||
|
// Delay 10 ms
|
||||||
|
vTaskDelay(10 / portTICK_PERIOD_MS);
|
||||||
|
|
||||||
|
ret = ov7670_write_array(sensor, ov7670_default_regs);
|
||||||
|
|
||||||
|
// Delay
|
||||||
|
vTaskDelay(30 / portTICK_PERIOD_MS);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_pixformat(sensor_t *sensor, pixformat_t pixformat)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
switch (pixformat) {
|
||||||
|
case PIXFORMAT_RGB565:
|
||||||
|
case PIXFORMAT_RGB888:
|
||||||
|
ret = ov7670_write_array(sensor, ov7670_fmt_rgb565);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PIXFORMAT_YUV422:
|
||||||
|
case PIXFORMAT_GRAYSCALE:
|
||||||
|
default:
|
||||||
|
ret = ov7670_write_array(sensor, ov7670_fmt_yuv422);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
vTaskDelay(30 / portTICK_PERIOD_MS);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we're running RGB565, we must rewrite clkrc after setting
|
||||||
|
* the other parameters or the image looks poor. If we're *not*
|
||||||
|
* doing RGB565, we must not rewrite clkrc or the image looks
|
||||||
|
* *really* poor.
|
||||||
|
*
|
||||||
|
* (Update) Now that we retain clkrc state, we should be able
|
||||||
|
* to write it unconditionally, and that will make the frame
|
||||||
|
* rate persistent too.
|
||||||
|
*/
|
||||||
|
if (pixformat == PIXFORMAT_RGB565) {
|
||||||
|
ret = SCCB_Write(sensor->slv_addr, CLKRC, ov7670_clkrc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_framesize(sensor_t *sensor, framesize_t framesize)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
// store clkrc before changing window settings...
|
||||||
|
ov7670_clkrc = SCCB_Read(sensor->slv_addr, CLKRC);
|
||||||
|
|
||||||
|
switch (framesize){
|
||||||
|
case FRAMESIZE_VGA:
|
||||||
|
if( (ret = ov7670_write_array(sensor, ov7670_vga)) == 0 ) {
|
||||||
|
/* These values from Omnivision */
|
||||||
|
ret = ov7670_frame_control(sensor, 158, 14, 10, 490);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case FRAMESIZE_QVGA:
|
||||||
|
if( (ret = ov7670_write_array(sensor, ov7670_qvga)) == 0 ) {
|
||||||
|
/* These values from Omnivision */
|
||||||
|
ret = ov7670_frame_control(sensor, 158, 14, 10, 490);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case FRAMESIZE_QQVGA:
|
||||||
|
if( (ret = ov7670_write_array(sensor, ov7670_qqvga)) == 0 ) {
|
||||||
|
/* These values from Omnivision */
|
||||||
|
ret = ov7670_frame_control(sensor, 158, 14, 10, 490);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
vTaskDelay(30 / portTICK_PERIOD_MS);
|
||||||
|
|
||||||
|
if (ret == 0) {
|
||||||
|
sensor->status.framesize = framesize;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_colorbar(sensor_t *sensor, int enable)
|
||||||
|
{
|
||||||
|
uint8_t ret = 0;
|
||||||
|
// Read register scaling_xsc
|
||||||
|
uint8_t reg = SCCB_Read(sensor->slv_addr, SCALING_XSC);
|
||||||
|
|
||||||
|
// Pattern to set color bar bit[0]=0 in every case
|
||||||
|
reg = SCALING_XSC_CBAR(reg);
|
||||||
|
|
||||||
|
// Write pattern to SCALING_XSC
|
||||||
|
ret = SCCB_Write(sensor->slv_addr, SCALING_XSC, reg);
|
||||||
|
|
||||||
|
// Read register scaling_ysc
|
||||||
|
reg = SCCB_Read(sensor->slv_addr, SCALING_YSC);
|
||||||
|
|
||||||
|
// Pattern to set color bar bit[0]=0 in every case
|
||||||
|
reg = SCALING_YSC_CBAR(reg, enable);
|
||||||
|
|
||||||
|
// Write pattern to SCALING_YSC
|
||||||
|
ret = ret | SCCB_Write(sensor->slv_addr, SCALING_YSC, reg);
|
||||||
|
|
||||||
|
// return 0 or 0xFF
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_whitebal(sensor_t *sensor, int enable)
|
||||||
|
{
|
||||||
|
// Read register COM8
|
||||||
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8);
|
||||||
|
|
||||||
|
// Set white bal on/off
|
||||||
|
reg = COM8_SET_AWB(reg, enable);
|
||||||
|
|
||||||
|
// Write back register COM8
|
||||||
|
return SCCB_Write(sensor->slv_addr, COM8, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_gain_ctrl(sensor_t *sensor, int enable)
|
||||||
|
{
|
||||||
|
// Read register COM8
|
||||||
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8);
|
||||||
|
|
||||||
|
// Set white bal on/off
|
||||||
|
reg = COM8_SET_AGC(reg, enable);
|
||||||
|
|
||||||
|
// Write back register COM8
|
||||||
|
return SCCB_Write(sensor->slv_addr, COM8, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_exposure_ctrl(sensor_t *sensor, int enable)
|
||||||
|
{
|
||||||
|
// Read register COM8
|
||||||
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8);
|
||||||
|
|
||||||
|
// Set white bal on/off
|
||||||
|
reg = COM8_SET_AEC(reg, enable);
|
||||||
|
|
||||||
|
// Write back register COM8
|
||||||
|
return SCCB_Write(sensor->slv_addr, COM8, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_hmirror(sensor_t *sensor, int enable)
|
||||||
|
{
|
||||||
|
// Read register MVFP
|
||||||
|
uint8_t reg = SCCB_Read(sensor->slv_addr, MVFP);
|
||||||
|
|
||||||
|
// Set mirror on/off
|
||||||
|
reg = MVFP_SET_MIRROR(reg, enable);
|
||||||
|
|
||||||
|
// Write back register MVFP
|
||||||
|
return SCCB_Write(sensor->slv_addr, MVFP, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_vflip(sensor_t *sensor, int enable)
|
||||||
|
{
|
||||||
|
// Read register MVFP
|
||||||
|
uint8_t reg = SCCB_Read(sensor->slv_addr, MVFP);
|
||||||
|
|
||||||
|
// Set mirror on/off
|
||||||
|
reg = MVFP_SET_FLIP(reg, enable);
|
||||||
|
|
||||||
|
// Write back register MVFP
|
||||||
|
return SCCB_Write(sensor->slv_addr, MVFP, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int init_status(sensor_t *sensor)
|
||||||
|
{
|
||||||
|
sensor->status.awb = 0;
|
||||||
|
sensor->status.aec = 0;
|
||||||
|
sensor->status.agc = 0;
|
||||||
|
sensor->status.hmirror = 0;
|
||||||
|
sensor->status.vflip = 0;
|
||||||
|
sensor->status.colorbar = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_dummy(sensor_t *sensor, int val){ return -1; }
|
||||||
|
static int set_gainceiling_dummy(sensor_t *sensor, gainceiling_t val){ return -1; }
|
||||||
|
|
||||||
|
int ov7670_init(sensor_t *sensor)
|
||||||
|
{
|
||||||
|
// Set function pointers
|
||||||
|
sensor->reset = reset;
|
||||||
|
sensor->init_status = init_status;
|
||||||
|
sensor->set_pixformat = set_pixformat;
|
||||||
|
sensor->set_framesize = set_framesize;
|
||||||
|
sensor->set_colorbar = set_colorbar;
|
||||||
|
sensor->set_whitebal = set_whitebal;
|
||||||
|
sensor->set_gain_ctrl = set_gain_ctrl;
|
||||||
|
sensor->set_exposure_ctrl = set_exposure_ctrl;
|
||||||
|
sensor->set_hmirror = set_hmirror;
|
||||||
|
sensor->set_vflip = set_vflip;
|
||||||
|
|
||||||
|
//not supported
|
||||||
|
sensor->set_brightness= set_dummy;
|
||||||
|
sensor->set_saturation= set_dummy;
|
||||||
|
sensor->set_quality = set_dummy;
|
||||||
|
sensor->set_gainceiling = set_gainceiling_dummy;
|
||||||
|
sensor->set_aec2 = set_dummy;
|
||||||
|
sensor->set_aec_value = set_dummy;
|
||||||
|
sensor->set_special_effect = set_dummy;
|
||||||
|
sensor->set_wb_mode = set_dummy;
|
||||||
|
sensor->set_ae_level = set_dummy;
|
||||||
|
sensor->set_dcw = set_dummy;
|
||||||
|
sensor->set_bpc = set_dummy;
|
||||||
|
sensor->set_wpc = set_dummy;
|
||||||
|
sensor->set_awb_gain = set_dummy;
|
||||||
|
sensor->set_agc_gain = set_dummy;
|
||||||
|
sensor->set_raw_gma = set_dummy;
|
||||||
|
sensor->set_lenc = set_dummy;
|
||||||
|
sensor->set_sharpness = set_dummy;
|
||||||
|
sensor->set_denoise = set_dummy;
|
||||||
|
|
||||||
|
// Retrieve sensor's signature
|
||||||
|
sensor->id.MIDH = SCCB_Read(sensor->slv_addr, REG_MIDH);
|
||||||
|
sensor->id.MIDL = SCCB_Read(sensor->slv_addr, REG_MIDL);
|
||||||
|
sensor->id.PID = SCCB_Read(sensor->slv_addr, REG_PID);
|
||||||
|
sensor->id.VER = SCCB_Read(sensor->slv_addr, REG_VER);
|
||||||
|
|
||||||
|
ESP_LOGD(TAG, "OV7670 Attached");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the OpenMV project.
|
||||||
|
* author: Juan Schiavoni <juanjoseschiavoni@hotmail.com>
|
||||||
|
* This work is licensed under the MIT license, see the file LICENSE for details.
|
||||||
|
*
|
||||||
|
* OV7670 driver.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __OV7670_H__
|
||||||
|
#define __OV7670_H__
|
||||||
|
#include "sensor.h"
|
||||||
|
|
||||||
|
int ov7670_init(sensor_t *sensor);
|
||||||
|
#endif // __OV7670_H__
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the OpenMV project.
|
||||||
|
* Copyright (c) 2013/2014 Ibrahim Abdelkader <i.abdalkader@gmail.com>
|
||||||
|
* This work is licensed under the MIT license, see the file LICENSE for details.
|
||||||
|
*
|
||||||
|
* NT99141 driver.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __NT99141_H__
|
||||||
|
#define __NT99141_H__
|
||||||
|
|
||||||
|
#include "sensor.h"
|
||||||
|
|
||||||
|
int NT99141_init(sensor_t *sensor);
|
||||||
|
|
||||||
|
#endif // __NT99141_H__
|
@ -0,0 +1,825 @@
|
|||||||
|
#ifndef _NT99141_SETTINGS_H_
|
||||||
|
#define _NT99141_SETTINGS_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include "esp_attr.h"
|
||||||
|
#include "nt99141_regs.h"
|
||||||
|
|
||||||
|
static const ratio_settings_t ratio_table[] = {
|
||||||
|
// mw, mh, sx, sy, ex, ey, ox, oy, tx, ty
|
||||||
|
{ 1280, 720, 0, 4, 1283, 723, 0, 4, 1660, 963 },
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#define REG_DLY 0xffff
|
||||||
|
#define REGLIST_TAIL 0x0000
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_default_regs[][2] = {
|
||||||
|
//initial
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x3109, 0x04},
|
||||||
|
{0x3040, 0x04},
|
||||||
|
{0x3041, 0x02},
|
||||||
|
{0x3042, 0xFF},
|
||||||
|
{0x3043, 0x08},
|
||||||
|
{0x3052, 0xE0},
|
||||||
|
{0x305F, 0x33},
|
||||||
|
{0x3100, 0x07},
|
||||||
|
{0x3106, 0x03},
|
||||||
|
{0x3105, 0x01},
|
||||||
|
{0x3108, 0x05},
|
||||||
|
{0x3110, 0x22},
|
||||||
|
{0x3111, 0x57},
|
||||||
|
{0x3112, 0x22},
|
||||||
|
{0x3113, 0x55},
|
||||||
|
{0x3114, 0x05},
|
||||||
|
{0x3135, 0x00},
|
||||||
|
{0x32F0, 0x01},
|
||||||
|
{0x3290, 0x01},
|
||||||
|
{0x3291, 0x80},
|
||||||
|
{0x3296, 0x01},
|
||||||
|
{0x3297, 0x73},
|
||||||
|
{0x3250, 0x80},
|
||||||
|
{0x3251, 0x03},
|
||||||
|
{0x3252, 0xFF},
|
||||||
|
{0x3253, 0x00},
|
||||||
|
{0x3254, 0x03},
|
||||||
|
{0x3255, 0xFF},
|
||||||
|
{0x3256, 0x00},
|
||||||
|
{0x3257, 0x50},
|
||||||
|
{0x3270, 0x00},
|
||||||
|
{0x3271, 0x0C},
|
||||||
|
{0x3272, 0x18},
|
||||||
|
{0x3273, 0x32},
|
||||||
|
{0x3274, 0x44},
|
||||||
|
{0x3275, 0x54},
|
||||||
|
{0x3276, 0x70},
|
||||||
|
{0x3277, 0x88},
|
||||||
|
{0x3278, 0x9D},
|
||||||
|
{0x3279, 0xB0},
|
||||||
|
{0x327A, 0xCF},
|
||||||
|
{0x327B, 0xE2},
|
||||||
|
{0x327C, 0xEF},
|
||||||
|
{0x327D, 0xF7},
|
||||||
|
{0x327E, 0xFF},
|
||||||
|
{0x3302, 0x00},
|
||||||
|
{0x3303, 0x40},
|
||||||
|
{0x3304, 0x00},
|
||||||
|
{0x3305, 0x96},
|
||||||
|
{0x3306, 0x00},
|
||||||
|
{0x3307, 0x29},
|
||||||
|
{0x3308, 0x07},
|
||||||
|
{0x3309, 0xBA},
|
||||||
|
{0x330A, 0x06},
|
||||||
|
{0x330B, 0xF5},
|
||||||
|
{0x330C, 0x01},
|
||||||
|
{0x330D, 0x51},
|
||||||
|
{0x330E, 0x01},
|
||||||
|
{0x330F, 0x30},
|
||||||
|
{0x3310, 0x07},
|
||||||
|
{0x3311, 0x16},
|
||||||
|
{0x3312, 0x07},
|
||||||
|
{0x3313, 0xBA},
|
||||||
|
{0x3326, 0x02},
|
||||||
|
{0x32F6, 0x0F},
|
||||||
|
{0x32F9, 0x42},
|
||||||
|
{0x32FA, 0x24},
|
||||||
|
{0x3325, 0x4A},
|
||||||
|
{0x3330, 0x00},
|
||||||
|
{0x3331, 0x0A},
|
||||||
|
{0x3332, 0xFF},
|
||||||
|
{0x3338, 0x30},
|
||||||
|
{0x3339, 0x84},
|
||||||
|
{0x333A, 0x48},
|
||||||
|
{0x333F, 0x07},
|
||||||
|
{0x3360, 0x10},
|
||||||
|
{0x3361, 0x18},
|
||||||
|
{0x3362, 0x1f},
|
||||||
|
{0x3363, 0x37},
|
||||||
|
{0x3364, 0x80},
|
||||||
|
{0x3365, 0x80},
|
||||||
|
{0x3366, 0x68},
|
||||||
|
{0x3367, 0x60},
|
||||||
|
{0x3368, 0x30},
|
||||||
|
{0x3369, 0x28},
|
||||||
|
{0x336A, 0x20},
|
||||||
|
{0x336B, 0x10},
|
||||||
|
{0x336C, 0x00},
|
||||||
|
{0x336D, 0x20},
|
||||||
|
{0x336E, 0x1C},
|
||||||
|
{0x336F, 0x18},
|
||||||
|
{0x3370, 0x10},
|
||||||
|
{0x3371, 0x38},
|
||||||
|
{0x3372, 0x3C},
|
||||||
|
{0x3373, 0x3F},
|
||||||
|
{0x3374, 0x3F},
|
||||||
|
{0x338A, 0x34},
|
||||||
|
{0x338B, 0x7F},
|
||||||
|
{0x338C, 0x10},
|
||||||
|
{0x338D, 0x23},
|
||||||
|
{0x338E, 0x7F},
|
||||||
|
{0x338F, 0x14},
|
||||||
|
{0x3375, 0x08},
|
||||||
|
{0x3376, 0x0C},
|
||||||
|
{0x3377, 0x18},
|
||||||
|
{0x3378, 0x20},
|
||||||
|
{0x3012, 0x02},
|
||||||
|
{0x3013, 0xD0},
|
||||||
|
{0x3025, 0x02}, //colorbar
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_fmt_jpeg[][2] = {
|
||||||
|
{0x32F0, 0x70}, // YUV422
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_fmt_raw[][2] = {
|
||||||
|
{0x32F0, 0x50}, // RAW
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_fmt_grayscale[][2] = {
|
||||||
|
{0x32F1, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_fmt_yuv422[][2] = {
|
||||||
|
{0x32F0, 0x00}, // YUV422
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_fmt_rgb565[][2] = {
|
||||||
|
{0x32F0, 0x01}, // RGB
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint8_t sensor_saturation_levels[9][1] = {
|
||||||
|
{0x60},//-4
|
||||||
|
{0x68},//-3
|
||||||
|
{0x70},//-2
|
||||||
|
{0x78},//-1
|
||||||
|
{0x80},//0
|
||||||
|
{0x88},//+1
|
||||||
|
{0x90},//+2
|
||||||
|
{0x98},//+3
|
||||||
|
{0xA0},//+4
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint8_t sensor_special_effects[7][4] = {
|
||||||
|
{0x00, 0x80, 0x80, 0x01},//Normal
|
||||||
|
{0x03, 0x80, 0x80, 0x01},//Negative
|
||||||
|
{0x01, 0x80, 0x80, 0x01},//Grayscale
|
||||||
|
{0x05, 0x2A, 0xF0, 0x01},//Red Tint
|
||||||
|
{0x05, 0x60, 0x20, 0x01},//Green Tint
|
||||||
|
{0x05, 0xF0, 0x80, 0x01},//Blue Tint
|
||||||
|
{0x02, 0x80, 0x80, 0x01},//Sepia
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// AE LEVEL
|
||||||
|
static const DRAM_ATTR uint16_t sensor_ae_level[][2] = {
|
||||||
|
|
||||||
|
// 1. [AE_Target : 0x24]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x29 },
|
||||||
|
{0x32B9, 0x1F },
|
||||||
|
{0x32BC, 0x24 },
|
||||||
|
{0x32BD, 0x27 },
|
||||||
|
{0x32BE, 0x21 },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 2. [AE_Target : 0x28]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x2D },
|
||||||
|
{0x32B9, 0x23 },
|
||||||
|
{0x32BC, 0x28 },
|
||||||
|
{0x32BD, 0x2B },
|
||||||
|
{0x32BE, 0x25 },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 3. [AE_Target : 0x2C]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x32 },
|
||||||
|
{0x32B9, 0x26 },
|
||||||
|
{0x32BC, 0x2C },
|
||||||
|
{0x32BD, 0x2F },
|
||||||
|
{0x32BE, 0x29 },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 4, [AE_Target : 0x30]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x36 },
|
||||||
|
{0x32B9, 0x2A },
|
||||||
|
{0x32BC, 0x30 },
|
||||||
|
{0x32BD, 0x33 },
|
||||||
|
{0x32BE, 0x2D },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 5. [AE_Target : 0x34]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x3B },
|
||||||
|
{0x32B9, 0x2D },
|
||||||
|
{0x32BC, 0x34 },
|
||||||
|
{0x32BD, 0x38 },
|
||||||
|
{0x32BE, 0x30 },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 6. [AE_Target : 0x38]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x3F },
|
||||||
|
{0x32B9, 0x31 },
|
||||||
|
{0x32BC, 0x38 },
|
||||||
|
{0x32BD, 0x3C },
|
||||||
|
{0x32BE, 0x34 },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 7. [AE_Target : 0x3D]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x44 },
|
||||||
|
{0x32B9, 0x34 },
|
||||||
|
{0x32BC, 0x3C },
|
||||||
|
{0x32BD, 0x40 },
|
||||||
|
{0x32BE, 0x38 },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 8. [AE_Target : 0x40]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x48 },
|
||||||
|
{0x32B9, 0x38 },
|
||||||
|
{0x32BC, 0x40 },
|
||||||
|
{0x32BD, 0x44 },
|
||||||
|
{0x32BE, 0x3C },
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
// 9. [AE_Target : 0x44]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x32B8, 0x4D },
|
||||||
|
{0x32B9, 0x3B },
|
||||||
|
{0x32BC, 0x44 },
|
||||||
|
{0x32BD, 0x49 },
|
||||||
|
{0x32BE, 0x3F },
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_HD[][2] = {
|
||||||
|
//[JPEG_1280x720_8.18_8.18_Fps]
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x3C},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x5E},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x24},
|
||||||
|
{0x3002, 0x00},
|
||||||
|
{0x3003, 0x04},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x04},
|
||||||
|
{0x3006, 0x05},
|
||||||
|
{0x3007, 0x03},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0xD3},
|
||||||
|
{0x300A, 0x06},
|
||||||
|
{0x300B, 0x7C},
|
||||||
|
{0x300C, 0x02},
|
||||||
|
{0x300D, 0xE0},
|
||||||
|
{0x300E, 0x05},
|
||||||
|
{0x300F, 0x00},
|
||||||
|
{0x3010, 0x02},
|
||||||
|
{0x3011, 0xD0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x3F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_VGA[][2] = {
|
||||||
|
//[JPEG_640x480_10.14_10.14_Fps]
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x4B},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x62},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x32E0, 0x02},
|
||||||
|
{0x32E1, 0x80},
|
||||||
|
{0x32E2, 0x01},
|
||||||
|
{0x32E3, 0xE0},
|
||||||
|
{0x32E4, 0x00},
|
||||||
|
{0x32E5, 0x80},
|
||||||
|
{0x32E6, 0x00},
|
||||||
|
{0x32E7, 0x80},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x24},
|
||||||
|
{0x3002, 0x00},
|
||||||
|
{0x3003, 0xA4},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x04},
|
||||||
|
{0x3006, 0x04},
|
||||||
|
{0x3007, 0x63},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0xD3},
|
||||||
|
{0x300A, 0x05},
|
||||||
|
{0x300B, 0x3C},
|
||||||
|
{0x300C, 0x02},
|
||||||
|
{0x300D, 0xE0},
|
||||||
|
{0x300E, 0x03},
|
||||||
|
{0x300F, 0xC0},
|
||||||
|
{0x3010, 0x02},
|
||||||
|
{0x3011, 0xD0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x7F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_QVGA[][2] = {
|
||||||
|
//[JPEG_320x240_10.14_10.14_Fps]
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x4B},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x62},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x32E0, 0x01},
|
||||||
|
{0x32E1, 0x40},
|
||||||
|
{0x32E2, 0x00},
|
||||||
|
{0x32E3, 0xF0},
|
||||||
|
{0x32E4, 0x02},
|
||||||
|
{0x32E5, 0x02},
|
||||||
|
{0x32E6, 0x02},
|
||||||
|
{0x32E7, 0x03},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x24},
|
||||||
|
{0x3002, 0x00},
|
||||||
|
{0x3003, 0xA4},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x04},
|
||||||
|
{0x3006, 0x04},
|
||||||
|
{0x3007, 0x63},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0xD3},
|
||||||
|
{0x300A, 0x05},
|
||||||
|
{0x300B, 0x3C},
|
||||||
|
{0x300C, 0x02},
|
||||||
|
{0x300D, 0xE0},
|
||||||
|
{0x300E, 0x03},
|
||||||
|
{0x300F, 0xC0},
|
||||||
|
{0x3010, 0x02},
|
||||||
|
{0x3011, 0xD0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x7F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_VGA_xyskip[][2] = {
|
||||||
|
// [JPEG_640x360_20.00_25.01_Fps_XY_Skip]
|
||||||
|
// Set_Device_Format = FORMAT_16_8
|
||||||
|
// SET_Device_Addr = 0x54
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60 },
|
||||||
|
{0x320A, 0xB2 },
|
||||||
|
{0x32C0, 0x64 },
|
||||||
|
{0x32C1, 0x64 },
|
||||||
|
{0x32C2, 0x64 },
|
||||||
|
{0x32C3, 0x00 },
|
||||||
|
{0x32C4, 0x20 },
|
||||||
|
{0x32C5, 0x20 },
|
||||||
|
{0x32C6, 0x20 },
|
||||||
|
{0x32C7, 0x00 },
|
||||||
|
{0x32C8, 0x62 },
|
||||||
|
{0x32C9, 0x64 },
|
||||||
|
{0x32CA, 0x84 },
|
||||||
|
{0x32CB, 0x84 },
|
||||||
|
{0x32CC, 0x84 },
|
||||||
|
{0x32CD, 0x84 },
|
||||||
|
{0x32DB, 0x68 },
|
||||||
|
{0x32F0, 0x70 },
|
||||||
|
{0x3400, 0x08 },
|
||||||
|
{0x3400, 0x00 },
|
||||||
|
{0x3401, 0x4E },
|
||||||
|
{0x3404, 0x00 },
|
||||||
|
{0x3405, 0x00 },
|
||||||
|
{0x3410, 0x00 },
|
||||||
|
{0x3200, 0x3E },
|
||||||
|
{0x3201, 0x0F },
|
||||||
|
{0x3028, 0x0F },
|
||||||
|
{0x3029, 0x00 },
|
||||||
|
{0x302A, 0x08 },
|
||||||
|
{0x3022, 0x24 },
|
||||||
|
{0x3023, 0x6C },
|
||||||
|
{0x3002, 0x00 },
|
||||||
|
{0x3003, 0x04 },
|
||||||
|
{0x3004, 0x00 },
|
||||||
|
{0x3005, 0x04 },
|
||||||
|
{0x3006, 0x05 },
|
||||||
|
{0x3007, 0x03 },
|
||||||
|
{0x3008, 0x02 },
|
||||||
|
{0x3009, 0xD3 },
|
||||||
|
{0x300A, 0x03 },
|
||||||
|
{0x300B, 0xFC },
|
||||||
|
{0x300C, 0x01 },
|
||||||
|
{0x300D, 0x88 },
|
||||||
|
{0x300E, 0x02 },
|
||||||
|
{0x300F, 0x80 },
|
||||||
|
{0x3010, 0x01 },
|
||||||
|
{0x3011, 0x68 },
|
||||||
|
{0x32B8, 0x3F },
|
||||||
|
{0x32B9, 0x31 },
|
||||||
|
{0x32BB, 0x87 },
|
||||||
|
{0x32BC, 0x38 },
|
||||||
|
{0x32BD, 0x3C },
|
||||||
|
{0x32BE, 0x34 },
|
||||||
|
{0x3201, 0x3F },
|
||||||
|
{0x3025, 0x00 }, //normal
|
||||||
|
{0x3021, 0x06 },
|
||||||
|
{0x3400, 0x01 },
|
||||||
|
{0x3060, 0x01 },
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_VGA_xskip[][2] = {
|
||||||
|
//[JPEG_640x480_Xskip_13.32_13.32_Fps]
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x62},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x68},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x32E0, 0x02},
|
||||||
|
{0x32E1, 0x80},
|
||||||
|
{0x32E2, 0x01},
|
||||||
|
{0x32E3, 0xE0},
|
||||||
|
{0x32E4, 0x00},
|
||||||
|
{0x32E5, 0x00},
|
||||||
|
{0x32E6, 0x00},
|
||||||
|
{0x32E7, 0x80},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x2C},
|
||||||
|
{0x3002, 0x00},
|
||||||
|
{0x3003, 0x04},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x04},
|
||||||
|
{0x3006, 0x05},
|
||||||
|
{0x3007, 0x03},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0xD3},
|
||||||
|
{0x300A, 0x03},
|
||||||
|
{0x300B, 0xFC},
|
||||||
|
{0x300C, 0x02},
|
||||||
|
{0x300D, 0xE0},
|
||||||
|
{0x300E, 0x02},
|
||||||
|
{0x300F, 0x80},
|
||||||
|
{0x3010, 0x02},
|
||||||
|
{0x3011, 0xD0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x7F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_QVGA_xskip[][2] = {
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
//[JPEG_320x240_Xskip_13.32_13.32_Fps]
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x62},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x68},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x32E0, 0x01},
|
||||||
|
{0x32E1, 0x40},
|
||||||
|
{0x32E2, 0x00},
|
||||||
|
{0x32E3, 0xF0},
|
||||||
|
{0x32E4, 0x01},
|
||||||
|
{0x32E5, 0x01},
|
||||||
|
{0x32E6, 0x02},
|
||||||
|
{0x32E7, 0x03},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x2C},
|
||||||
|
{0x3002, 0x00},
|
||||||
|
{0x3003, 0x04},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x04},
|
||||||
|
{0x3006, 0x05},
|
||||||
|
{0x3007, 0x03},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0xD3},
|
||||||
|
{0x300A, 0x03},
|
||||||
|
{0x300B, 0xFC},
|
||||||
|
{0x300C, 0x02},
|
||||||
|
{0x300D, 0xE0},
|
||||||
|
{0x300E, 0x02},
|
||||||
|
{0x300F, 0x80},
|
||||||
|
{0x3010, 0x02},
|
||||||
|
{0x3011, 0xD0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x7F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_VGA_crop[][2] = {
|
||||||
|
//[JPEG_640x480_Crop_19.77_19.77_Fps]
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x62},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x68},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x24},
|
||||||
|
{0x3002, 0x01},
|
||||||
|
{0x3003, 0x44},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x7C},
|
||||||
|
{0x3006, 0x03},
|
||||||
|
{0x3007, 0xC3},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0x5B},
|
||||||
|
{0x300A, 0x03},
|
||||||
|
{0x300B, 0xFC},
|
||||||
|
{0x300C, 0x01},
|
||||||
|
{0x300D, 0xF0},
|
||||||
|
{0x300E, 0x02},
|
||||||
|
{0x300F, 0x80},
|
||||||
|
{0x3010, 0x01},
|
||||||
|
{0x3011, 0xE0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x3F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
static const DRAM_ATTR uint16_t sensor_framesize_QVGA_crop[][2] = {
|
||||||
|
//[JPEG_320x240_Crop_19.77_19.77_Fps]
|
||||||
|
{0x3021, 0x00},
|
||||||
|
{REG_DLY, 100}, // delay 100ms
|
||||||
|
{0x32BF, 0x60},
|
||||||
|
{0x32C0, 0x5A},
|
||||||
|
{0x32C1, 0x5A},
|
||||||
|
{0x32C2, 0x5A},
|
||||||
|
{0x32C3, 0x00},
|
||||||
|
{0x32C4, 0x20},
|
||||||
|
{0x32C5, 0x20},
|
||||||
|
{0x32C6, 0x20},
|
||||||
|
{0x32C7, 0x00},
|
||||||
|
{0x32C8, 0x62},
|
||||||
|
{0x32C9, 0x5A},
|
||||||
|
{0x32CA, 0x7A},
|
||||||
|
{0x32CB, 0x7A},
|
||||||
|
{0x32CC, 0x7A},
|
||||||
|
{0x32CD, 0x7A},
|
||||||
|
{0x32DB, 0x68},
|
||||||
|
{0x32F0, 0x70},
|
||||||
|
{0x3400, 0x08},
|
||||||
|
{0x3400, 0x00},
|
||||||
|
{0x3401, 0x4E},
|
||||||
|
{0x3404, 0x00},
|
||||||
|
{0x3405, 0x00},
|
||||||
|
{0x3410, 0x00},
|
||||||
|
{0x32E0, 0x01},
|
||||||
|
{0x32E1, 0x40},
|
||||||
|
{0x32E2, 0x00},
|
||||||
|
{0x32E3, 0xF0},
|
||||||
|
{0x32E4, 0x01},
|
||||||
|
{0x32E5, 0x01},
|
||||||
|
{0x32E6, 0x01},
|
||||||
|
{0x32E7, 0x02},
|
||||||
|
{0x3200, 0x3E},
|
||||||
|
{0x3201, 0x0F},
|
||||||
|
{0x3028, 0x0F},
|
||||||
|
{0x3029, 0x00},
|
||||||
|
{0x302A, 0x08},
|
||||||
|
{0x3022, 0x24},
|
||||||
|
{0x3023, 0x24},
|
||||||
|
{0x3002, 0x01},
|
||||||
|
{0x3003, 0x44},
|
||||||
|
{0x3004, 0x00},
|
||||||
|
{0x3005, 0x7C},
|
||||||
|
{0x3006, 0x03},
|
||||||
|
{0x3007, 0xC3},
|
||||||
|
{0x3008, 0x02},
|
||||||
|
{0x3009, 0x5B},
|
||||||
|
{0x300A, 0x03},
|
||||||
|
{0x300B, 0xFC},
|
||||||
|
{0x300C, 0x01},
|
||||||
|
{0x300D, 0xF0},
|
||||||
|
{0x300E, 0x02},
|
||||||
|
{0x300F, 0x80},
|
||||||
|
{0x3010, 0x01},
|
||||||
|
{0x3011, 0xE0},
|
||||||
|
{0x32B8, 0x3F},
|
||||||
|
{0x32B9, 0x31},
|
||||||
|
{0x32BB, 0x87},
|
||||||
|
{0x32BC, 0x38},
|
||||||
|
{0x32BD, 0x3C},
|
||||||
|
{0x32BE, 0x34},
|
||||||
|
{0x3201, 0x7F},
|
||||||
|
{0x3021, 0x06},
|
||||||
|
{0x3025, 0x00}, //normal
|
||||||
|
{0x3400, 0x01},
|
||||||
|
{0x3060, 0x01},
|
||||||
|
{REGLIST_TAIL, 0x00}, // tail
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
@ -0,0 +1,439 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the OpenMV project.
|
||||||
|
* author: Juan Schiavoni <juanjoseschiavoni@hotmail.com>
|
||||||
|
* This work is licensed under the MIT license, see the file LICENSE for details.
|
||||||
|
*
|
||||||
|
* OV7725 driver.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include "sccb.h"
|
||||||
|
#include "ov7670.h"
|
||||||
|
#include "ov7670_regs.h"
|
||||||
|
#include "freertos/FreeRTOS.h"
|
||||||
|
#include "freertos/task.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#if defined(ARDUINO_ARCH_ESP32) && defined(CONFIG_ARDUHAL_ESP_LOG)
|
||||||
|
#include "esp32-hal-log.h"
|
||||||
|
#else
|
||||||
|
#include "esp_log.h"
|
||||||
|
static const char* TAG = "ov7760";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int ov7670_clkrc = 0x01;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The default register settings, as obtained from OmniVision. There
|
||||||
|
* is really no making sense of most of these - lots of "reserved" values
|
||||||
|
* and such.
|
||||||
|
*
|
||||||
|
* These settings give VGA YUYV.
|
||||||
|
*/
|
||||||
|
struct regval_list {
|
||||||
|
uint8_t reg_num;
|
||||||
|
uint8_t value;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regval_list ov7670_default_regs[] = {
|
||||||
|
/* Sensor automatically sets output window when resolution changes. */
|
||||||
|
{TSLB, 0x04},
|
||||||
|
|
||||||
|
/* Frame rate 30 fps at 12 Mhz clock */
|
||||||
|
{CLKRC, 0x00},
|
||||||
|
{DBLV, 0x4A},
|
||||||
|
|
||||||
|
{COM10, COM10_VSYNC_NEG | COM10_PCLK_MASK},
|
||||||
|
|
||||||
|
/* Improve white balance */
|
||||||
|
{COM4, 0x40},
|
||||||
|
|
||||||
|
/* Improve color */
|
||||||
|
{RSVD_B0, 0x84},
|
||||||
|
|
||||||
|
/* Enable 50/60 Hz auto detection */
|
||||||
|
{COM11, COM11_EXP|COM11_HZAUTO},
|
||||||
|
|
||||||
|
/* Disable some delays */
|
||||||
|
{HSYST, 0},
|
||||||
|
{HSYEN, 0},
|
||||||
|
|
||||||
|
{MVFP, MVFP_SUN},
|
||||||
|
|
||||||
|
/* More reserved magic, some of which tweaks white balance */
|
||||||
|
{AWBC1, 0x0a},
|
||||||
|
{AWBC2, 0xf0},
|
||||||
|
{AWBC3, 0x34},
|
||||||
|
{AWBC4, 0x58},
|
||||||
|
{AWBC5, 0x28},
|
||||||
|
{AWBC6, 0x3a},
|
||||||
|
|
||||||
|
{AWBCTR3, 0x0a},
|
||||||
|
{AWBCTR2, 0x55},
|
||||||
|
{AWBCTR1, 0x11},
|
||||||
|
{AWBCTR0, 0x9e},
|
||||||
|
|
||||||
|
{COM8, COM8_FAST_AUTO|COM8_STEP_UNLIMIT|COM8_AGC_EN|COM8_AEC_EN|COM8_AWB_EN},
|
||||||
|
|
||||||
|
/* End marker is FF because in ov7670 the address of GAIN 0 and default value too. */
|
||||||
|
{0xFF, 0xFF},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regval_list ov7670_fmt_yuv422[] = {
|
||||||
|
{ COM7, 0x0 }, /* Selects YUV mode */
|
||||||
|
{ RGB444, 0 }, /* No RGB444 please */
|
||||||
|
{ COM1, 0 }, /* CCIR601 */
|
||||||
|
{ COM15, COM15_R00FF },
|
||||||
|
{ MVFP, MVFP_SUN },
|
||||||
|
{ COM9, 0x6A }, /* 128x gain ceiling; 0x8 is reserved bit */
|
||||||
|
{ MTX1, 0x80 }, /* "matrix coefficient 1" */
|
||||||
|
{ MTX2, 0x80 }, /* "matrix coefficient 2" */
|
||||||
|
{ MTX3, 0 }, /* vb */
|
||||||
|
{ MTX4, 0x22 }, /* "matrix coefficient 4" */
|
||||||
|
{ MTX5, 0x5e }, /* "matrix coefficient 5" */
|
||||||
|
{ MTX6, 0x80 }, /* "matrix coefficient 6" */
|
||||||
|
{ COM13, COM13_UVSAT },
|
||||||
|
{ 0xff, 0xff }, /* END MARKER */
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regval_list ov7670_fmt_rgb565[] = {
|
||||||
|
{ COM7, COM7_FMT_RGB565 }, /* Selects RGB mode */
|
||||||
|
{ RGB444, 0 }, /* No RGB444 please */
|
||||||
|
{ COM1, 0x0 }, /* CCIR601 */
|
||||||
|
{ COM15, COM15_RGB565 |COM15_R00FF },
|
||||||
|
{ MVFP, MVFP_SUN },
|
||||||
|
{ COM9, 0x6A }, /* 128x gain ceiling; 0x8 is reserved bit */
|
||||||
|
{ MTX1, 0xb3 }, /* "matrix coefficient 1" */
|
||||||
|
{ MTX2, 0xb3 }, /* "matrix coefficient 2" */
|
||||||
|
{ MTX3, 0 }, /* vb */
|
||||||
|
{ MTX4, 0x3d }, /* "matrix coefficient 4" */
|
||||||
|
{ MTX5, 0xa7 }, /* "matrix coefficient 5" */
|
||||||
|
{ MTX6, 0xe4 }, /* "matrix coefficient 6" */
|
||||||
|
{ COM13, COM13_UVSAT },
|
||||||
|
{ 0xff, 0xff }, /* END MARKER */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static struct regval_list ov7670_vga[] = {
|
||||||
|
{ COM3, 0x00 },
|
||||||
|
{ COM14, 0x00 },
|
||||||
|
{ SCALING_XSC, 0x3A },
|
||||||
|
{ SCALING_YSC, 0x35 },
|
||||||
|
{ SCALING_DCWCTR, 0x11 },
|
||||||
|
{ SCALING_PCLK_DIV, 0xF0 },
|
||||||
|
{ SCALING_PCLK_DELAY, 0x02 },
|
||||||
|
{ 0xff, 0xff },
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regval_list ov7670_qvga[] = {
|
||||||
|
{ COM3, 0x04 },
|
||||||
|
{ COM14, 0x19 },
|
||||||
|
{ SCALING_XSC, 0x3A },
|
||||||
|
{ SCALING_YSC, 0x35 },
|
||||||
|
{ SCALING_DCWCTR, 0x11 },
|
||||||
|
{ SCALING_PCLK_DIV, 0xF1 },
|
||||||
|
{ SCALING_PCLK_DELAY, 0x02 },
|
||||||
|
{ 0xff, 0xff },
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct regval_list ov7670_qqvga[] = {
|
||||||
|
{ COM3, 0x04 }, //DCW enable
|
||||||
|
{ COM14, 0x1a }, //pixel clock divided by 4, manual scaling enable, DCW and PCLK controlled by register
|
||||||
|
{ SCALING_XSC, 0x3a },
|
||||||
|
{ SCALING_YSC, 0x35 },
|
||||||
|
{ SCALING_DCWCTR, 0x22 }, //downsample by 4
|
||||||
|
{ SCALING_PCLK_DIV, 0xf2 }, //pixel clock divided by 4
|
||||||
|
{ SCALING_PCLK_DELAY, 0x02 },
|
||||||
|
{ 0xff, 0xff },
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write a list of register settings; ff/ff stops the process.
|
||||||
|
*/
|
||||||
|
static int ov7670_write_array(sensor_t *sensor, struct regval_list *vals)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
while ( (vals->reg_num != 0xff || vals->value != 0xff) && (ret == 0) ) {
|
||||||
|
ret = SCCB_Write(sensor->slv_addr, vals->reg_num, vals->value);
|
||||||
|
|
||||||
|
ESP_LOGD(TAG, "reset reg %02X, W(%02X) R(%02X)", vals->reg_num,
|
||||||
|
vals->value, SCCB_Read(sensor->slv_addr, vals->reg_num) );
|
||||||
|
|
||||||
|
vals++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Calculate the frame control registers.
|
||||||
|
*/
|
||||||
|
static int ov7670_frame_control(sensor_t *sensor, int hstart, int hstop, int vstart, int vstop)
|
||||||
|
{
|
||||||
|
struct regval_list frame[7];
|
||||||
|
|
||||||
|
frame[0].reg_num = HSTART;
|
||||||
|
frame[0].value = (hstart >> 3);
|
||||||
|
|
||||||
|
frame[1].reg_num = HSTOP;
|
||||||
|
frame[1].value = (hstop >> 3);
|
||||||
|
|
||||||
|
frame[2].reg_num = HREF;
|
||||||
|
frame[2].value = (((hstop & 0x07) << 3) | (hstart & 0x07));
|
||||||
|
|
||||||
|
frame[3].reg_num = VSTART;
|
||||||
|
frame[3].value = (vstart >> 2);
|
||||||
|
|
||||||
|
frame[4].reg_num = VSTOP;
|
||||||
|
frame[4].value = (vstop >> 2);
|
||||||
|
|
||||||
|
frame[5].reg_num = VREF;
|
||||||
|
frame[5].value = (((vstop & 0x02) << 2) | (vstart & 0x02));
|
||||||
|
|
||||||
|
/* End mark */
|
||||||
|
frame[5].reg_num = 0xFF;
|
||||||
|
frame[5].value = 0xFF;
|
||||||
|
|
||||||
|
return ov7670_write_array(sensor, frame);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int reset(sensor_t *sensor)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
// Reset all registers
|
||||||
|
SCCB_Write(sensor->slv_addr, COM7, COM7_RESET);
|
||||||
|
|
||||||
|
// Delay 10 ms
|
||||||
|
vTaskDelay(10 / portTICK_PERIOD_MS);
|
||||||
|
|
||||||
|
ret = ov7670_write_array(sensor, ov7670_default_regs);
|
||||||
|
|
||||||
|
// Delay
|
||||||
|
vTaskDelay(30 / portTICK_PERIOD_MS);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_pixformat(sensor_t *sensor, pixformat_t pixformat)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
switch (pixformat) {
|
||||||
|
case PIXFORMAT_RGB565:
|
||||||
|
case PIXFORMAT_RGB888:
|
||||||
|
ret = ov7670_write_array(sensor, ov7670_fmt_rgb565);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PIXFORMAT_YUV422:
|
||||||
|
case PIXFORMAT_GRAYSCALE:
|
||||||
|
default:
|
||||||
|
ret = ov7670_write_array(sensor, ov7670_fmt_yuv422);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
vTaskDelay(30 / portTICK_PERIOD_MS);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we're running RGB565, we must rewrite clkrc after setting
|
||||||
|
* the other parameters or the image looks poor. If we're *not*
|
||||||
|
* doing RGB565, we must not rewrite clkrc or the image looks
|
||||||
|
* *really* poor.
|
||||||
|
*
|
||||||
|
* (Update) Now that we retain clkrc state, we should be able
|
||||||
|
* to write it unconditionally, and that will make the frame
|
||||||
|
* rate persistent too.
|
||||||
|
*/
|
||||||
|
if (pixformat == PIXFORMAT_RGB565) {
|
||||||
|
ret = SCCB_Write(sensor->slv_addr, CLKRC, ov7670_clkrc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_framesize(sensor_t *sensor, framesize_t framesize)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
// store clkrc before changing window settings...
|
||||||
|
ov7670_clkrc = SCCB_Read(sensor->slv_addr, CLKRC);
|
||||||
|
|
||||||
|
switch (framesize){
|
||||||
|
case FRAMESIZE_VGA:
|
||||||
|
if( (ret = ov7670_write_array(sensor, ov7670_vga)) == 0 ) {
|
||||||
|
/* These values from Omnivision */
|
||||||
|
ret = ov7670_frame_control(sensor, 158, 14, 10, 490);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case FRAMESIZE_QVGA:
|
||||||
|
if( (ret = ov7670_write_array(sensor, ov7670_qvga)) == 0 ) {
|
||||||
|
/* These values from Omnivision */
|
||||||
|
ret = ov7670_frame_control(sensor, 158, 14, 10, 490);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case FRAMESIZE_QQVGA:
|
||||||
|
if( (ret = ov7670_write_array(sensor, ov7670_qqvga)) == 0 ) {
|
||||||
|
/* These values from Omnivision */
|
||||||
|
ret = ov7670_frame_control(sensor, 158, 14, 10, 490);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
vTaskDelay(30 / portTICK_PERIOD_MS);
|
||||||
|
|
||||||
|
if (ret == 0) {
|
||||||
|
sensor->status.framesize = framesize;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_colorbar(sensor_t *sensor, int enable)
|
||||||
|
{
|
||||||
|
uint8_t ret = 0;
|
||||||
|
// Read register scaling_xsc
|
||||||
|
uint8_t reg = SCCB_Read(sensor->slv_addr, SCALING_XSC);
|
||||||
|
|
||||||
|
// Pattern to set color bar bit[0]=0 in every case
|
||||||
|
reg = SCALING_XSC_CBAR(reg);
|
||||||
|
|
||||||
|
// Write pattern to SCALING_XSC
|
||||||
|
ret = SCCB_Write(sensor->slv_addr, SCALING_XSC, reg);
|
||||||
|
|
||||||
|
// Read register scaling_ysc
|
||||||
|
reg = SCCB_Read(sensor->slv_addr, SCALING_YSC);
|
||||||
|
|
||||||
|
// Pattern to set color bar bit[0]=0 in every case
|
||||||
|
reg = SCALING_YSC_CBAR(reg, enable);
|
||||||
|
|
||||||
|
// Write pattern to SCALING_YSC
|
||||||
|
ret = ret | SCCB_Write(sensor->slv_addr, SCALING_YSC, reg);
|
||||||
|
|
||||||
|
// return 0 or 0xFF
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_whitebal(sensor_t *sensor, int enable)
|
||||||
|
{
|
||||||
|
// Read register COM8
|
||||||
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8);
|
||||||
|
|
||||||
|
// Set white bal on/off
|
||||||
|
reg = COM8_SET_AWB(reg, enable);
|
||||||
|
|
||||||
|
// Write back register COM8
|
||||||
|
return SCCB_Write(sensor->slv_addr, COM8, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_gain_ctrl(sensor_t *sensor, int enable)
|
||||||
|
{
|
||||||
|
// Read register COM8
|
||||||
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8);
|
||||||
|
|
||||||
|
// Set white bal on/off
|
||||||
|
reg = COM8_SET_AGC(reg, enable);
|
||||||
|
|
||||||
|
// Write back register COM8
|
||||||
|
return SCCB_Write(sensor->slv_addr, COM8, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_exposure_ctrl(sensor_t *sensor, int enable)
|
||||||
|
{
|
||||||
|
// Read register COM8
|
||||||
|
uint8_t reg = SCCB_Read(sensor->slv_addr, COM8);
|
||||||
|
|
||||||
|
// Set white bal on/off
|
||||||
|
reg = COM8_SET_AEC(reg, enable);
|
||||||
|
|
||||||
|
// Write back register COM8
|
||||||
|
return SCCB_Write(sensor->slv_addr, COM8, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_hmirror(sensor_t *sensor, int enable)
|
||||||
|
{
|
||||||
|
// Read register MVFP
|
||||||
|
uint8_t reg = SCCB_Read(sensor->slv_addr, MVFP);
|
||||||
|
|
||||||
|
// Set mirror on/off
|
||||||
|
reg = MVFP_SET_MIRROR(reg, enable);
|
||||||
|
|
||||||
|
// Write back register MVFP
|
||||||
|
return SCCB_Write(sensor->slv_addr, MVFP, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_vflip(sensor_t *sensor, int enable)
|
||||||
|
{
|
||||||
|
// Read register MVFP
|
||||||
|
uint8_t reg = SCCB_Read(sensor->slv_addr, MVFP);
|
||||||
|
|
||||||
|
// Set mirror on/off
|
||||||
|
reg = MVFP_SET_FLIP(reg, enable);
|
||||||
|
|
||||||
|
// Write back register MVFP
|
||||||
|
return SCCB_Write(sensor->slv_addr, MVFP, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int init_status(sensor_t *sensor)
|
||||||
|
{
|
||||||
|
sensor->status.awb = 0;
|
||||||
|
sensor->status.aec = 0;
|
||||||
|
sensor->status.agc = 0;
|
||||||
|
sensor->status.hmirror = 0;
|
||||||
|
sensor->status.vflip = 0;
|
||||||
|
sensor->status.colorbar = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int set_dummy(sensor_t *sensor, int val){ return -1; }
|
||||||
|
static int set_gainceiling_dummy(sensor_t *sensor, gainceiling_t val){ return -1; }
|
||||||
|
|
||||||
|
int ov7670_init(sensor_t *sensor)
|
||||||
|
{
|
||||||
|
// Set function pointers
|
||||||
|
sensor->reset = reset;
|
||||||
|
sensor->init_status = init_status;
|
||||||
|
sensor->set_pixformat = set_pixformat;
|
||||||
|
sensor->set_framesize = set_framesize;
|
||||||
|
sensor->set_colorbar = set_colorbar;
|
||||||
|
sensor->set_whitebal = set_whitebal;
|
||||||
|
sensor->set_gain_ctrl = set_gain_ctrl;
|
||||||
|
sensor->set_exposure_ctrl = set_exposure_ctrl;
|
||||||
|
sensor->set_hmirror = set_hmirror;
|
||||||
|
sensor->set_vflip = set_vflip;
|
||||||
|
|
||||||
|
//not supported
|
||||||
|
sensor->set_brightness= set_dummy;
|
||||||
|
sensor->set_saturation= set_dummy;
|
||||||
|
sensor->set_quality = set_dummy;
|
||||||
|
sensor->set_gainceiling = set_gainceiling_dummy;
|
||||||
|
sensor->set_aec2 = set_dummy;
|
||||||
|
sensor->set_aec_value = set_dummy;
|
||||||
|
sensor->set_special_effect = set_dummy;
|
||||||
|
sensor->set_wb_mode = set_dummy;
|
||||||
|
sensor->set_ae_level = set_dummy;
|
||||||
|
sensor->set_dcw = set_dummy;
|
||||||
|
sensor->set_bpc = set_dummy;
|
||||||
|
sensor->set_wpc = set_dummy;
|
||||||
|
sensor->set_awb_gain = set_dummy;
|
||||||
|
sensor->set_agc_gain = set_dummy;
|
||||||
|
sensor->set_raw_gma = set_dummy;
|
||||||
|
sensor->set_lenc = set_dummy;
|
||||||
|
sensor->set_sharpness = set_dummy;
|
||||||
|
sensor->set_denoise = set_dummy;
|
||||||
|
|
||||||
|
// Retrieve sensor's signature
|
||||||
|
sensor->id.MIDH = SCCB_Read(sensor->slv_addr, REG_MIDH);
|
||||||
|
sensor->id.MIDL = SCCB_Read(sensor->slv_addr, REG_MIDL);
|
||||||
|
sensor->id.PID = SCCB_Read(sensor->slv_addr, REG_PID);
|
||||||
|
sensor->id.VER = SCCB_Read(sensor->slv_addr, REG_VER);
|
||||||
|
|
||||||
|
ESP_LOGD(TAG, "OV7670 Attached");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the OpenMV project.
|
||||||
|
* author: Juan Schiavoni <juanjoseschiavoni@hotmail.com>
|
||||||
|
* This work is licensed under the MIT license, see the file LICENSE for details.
|
||||||
|
*
|
||||||
|
* OV7670 driver.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef __OV7670_H__
|
||||||
|
#define __OV7670_H__
|
||||||
|
#include "sensor.h"
|
||||||
|
|
||||||
|
int ov7670_init(sensor_t *sensor);
|
||||||
|
#endif // __OV7670_H__
|
Loading…
Reference in new issue