From 58103040234ab0ddbdddf69a8f293d3f0553d9e9 Mon Sep 17 00:00:00 2001 From: iabdalkader Date: Fri, 14 May 2021 01:29:56 +0200 Subject: [PATCH] Add basic GC2145 driver --- src/omv/Makefile | 1 + src/omv/boards/BORMIO/omv_boardconfig.h | 1 + src/omv/common/sensor.h | 3 + src/omv/ports/nrf/sensor.c | 15 + src/omv/ports/stm32/omv_portconfig.mk | 4 +- src/omv/ports/stm32/sensor.c | 34 + src/omv/sensors/gc2145.c | 816 ++++++++++++++++++++++++ src/omv/sensors/gc2145.h | 14 + src/omv/sensors/gc2145_regs.h | 14 + 9 files changed, 901 insertions(+), 1 deletion(-) create mode 100644 src/omv/sensors/gc2145.c create mode 100644 src/omv/sensors/gc2145.h create mode 100644 src/omv/sensors/gc2145_regs.h diff --git a/src/omv/Makefile b/src/omv/Makefile index fe8094b84..9831bdfea 100644 --- a/src/omv/Makefile +++ b/src/omv/Makefile @@ -36,6 +36,7 @@ SRCS += $(addprefix sensors/, \ mt9m114.c \ lepton.c \ hm01b0.c \ + gc2145.c \ ) SRCS += $(addprefix modules/, \ diff --git a/src/omv/boards/BORMIO/omv_boardconfig.h b/src/omv/boards/BORMIO/omv_boardconfig.h index 60783cddd..7f62d758e 100644 --- a/src/omv/boards/BORMIO/omv_boardconfig.h +++ b/src/omv/boards/BORMIO/omv_boardconfig.h @@ -54,6 +54,7 @@ #define OMV_ENABLE_MT9M114 (1) #define OMV_ENABLE_LEPTON (0) #define OMV_ENABLE_HM01B0 (0) +#define OMV_ENABLE_GC2145 (1) // Enable sensor features #define OMV_ENABLE_OV5640_AF (0) diff --git a/src/omv/common/sensor.h b/src/omv/common/sensor.h index f02787538..a3f0695bd 100644 --- a/src/omv/common/sensor.h +++ b/src/omv/common/sensor.h @@ -21,12 +21,14 @@ #define MT9M114_SLV_ADDR (0x90) #define LEPTON_SLV_ADDR (0x54) #define HM01B0_SLV_ADDR (0x48) +#define GC2145_SLV_ADDR (0x78) // Chip ID Registers #define OV5640_CHIP_ID (0x300A) #define OV_CHIP_ID (0x0A) #define ON_CHIP_ID (0x00) #define HIMAX_CHIP_ID (0x0001) +#define GC_CHIP_ID (0xF0) // Chip ID Values #define OV2640_ID (0x26) @@ -39,6 +41,7 @@ #define MT9M114_ID (0x81) #define LEPTON_ID (0x54) #define HM01B0_ID (0xB0) +#define GC2145_ID (0x21) typedef enum { FRAMESIZE_INVALID = 0, diff --git a/src/omv/ports/nrf/sensor.c b/src/omv/ports/nrf/sensor.c index c13e9019a..5982959ca 100644 --- a/src/omv/ports/nrf/sensor.c +++ b/src/omv/ports/nrf/sensor.c @@ -268,6 +268,12 @@ int sensor_init() break; #endif //(OMV_ENABLE_MT9V034 == 1) + #if (OMV_ENABLE_MT9M114 == 1) + case MT9M114_SLV_ADDR: + cambus_readw2(&sensor.bus, sensor.slv_addr, ON_CHIP_ID, &sensor.chip_id_w); + break; + #endif // (OMV_ENABLE_MT9M114 == 1) + #if (OMV_ENABLE_LEPTON == 1) case LEPTON_SLV_ADDR: sensor.chip_id = LEPTON_ID; @@ -342,6 +348,15 @@ int sensor_init() break; #endif //(OMV_ENABLE_MT9V034 == 1) + #if (OMV_ENABLE_MT9M114 == 1) + case MT9M114_ID: + if (extclk_config(MT9M114_XCLK_FREQ) != 0) { + return -3; + } + init_ret = mt9m114_init(&sensor); + break; + #endif //(OMV_ENABLE_MT9M114 == 1) + #if (OMV_ENABLE_LEPTON == 1) case LEPTON_ID: if (extclk_config(LEPTON_XCLK_FREQ) != 0) { diff --git a/src/omv/ports/stm32/omv_portconfig.mk b/src/omv/ports/stm32/omv_portconfig.mk index b01f9559a..49a3be337 100644 --- a/src/omv/ports/stm32/omv_portconfig.mk +++ b/src/omv/ports/stm32/omv_portconfig.mk @@ -149,6 +149,7 @@ FIRM_OBJ += $(addprefix $(BUILD)/$(OMV_DIR)/sensors/, \ mt9m114.o \ lepton.o \ hm01b0.o \ + gc2145.o \ ) FIRM_OBJ += $(addprefix $(BUILD)/$(OMV_DIR)/modules/, \ @@ -509,9 +510,10 @@ UVC_OBJ += $(addprefix $(BUILD)/$(OMV_DIR)/sensors/, \ ov7725.o \ ov9650.o \ mt9v034.o \ - mt9m114.o \ + mt9m114.o \ lepton.o \ hm01b0.o \ + gc2145.o \ ) UVC_OBJ += $(addprefix $(BUILD)/$(OMV_DIR)/imlib/,\ diff --git a/src/omv/ports/stm32/sensor.c b/src/omv/ports/stm32/sensor.c index ec0804fb2..5449e81c1 100644 --- a/src/omv/ports/stm32/sensor.c +++ b/src/omv/ports/stm32/sensor.c @@ -25,6 +25,7 @@ #include "mt9m114.h" #include "lepton.h" #include "hm01b0.h" +#include "gc2145.h" #include "systick.h" #include "framebuffer.h" #include "omv_boardconfig.h" @@ -360,27 +361,54 @@ int sensor_init() sensor.snapshot = sensor_snapshot; switch (sensor.slv_addr) { + #if (OMV_ENABLE_OV2640 == 1) case OV2640_SLV_ADDR: // Or OV9650. cambus_readb(&sensor.bus, sensor.slv_addr, OV_CHIP_ID, &sensor.chip_id); break; + #endif // (OMV_ENABLE_OV2640 == 1) + + #if (OMV_ENABLE_OV5640 == 1) case OV5640_SLV_ADDR: cambus_readb2(&sensor.bus, sensor.slv_addr, OV5640_CHIP_ID, &sensor.chip_id); break; + #endif // (OMV_ENABLE_OV5640 == 1) + + #if (OMV_ENABLE_OV7725 == 1) || (OMV_ENABLE_OV7670 == 1) || (OMV_ENABLE_OV7690 == 1) case OV7725_SLV_ADDR: // Or OV7690 or OV7670. cambus_readb(&sensor.bus, sensor.slv_addr, OV_CHIP_ID, &sensor.chip_id); break; + #endif //(OMV_ENABLE_OV7725 == 1) || (OMV_ENABLE_OV7670 == 1) || (OMV_ENABLE_OV7690 == 1) + + #if (OMV_ENABLE_MT9V034 == 1) case MT9V034_SLV_ADDR: cambus_readb(&sensor.bus, sensor.slv_addr, ON_CHIP_ID, &sensor.chip_id); break; + #endif //(OMV_ENABLE_MT9V034 == 1) + + #if (OMV_ENABLE_MT9M114 == 1) case MT9M114_SLV_ADDR: cambus_readw2(&sensor.bus, sensor.slv_addr, ON_CHIP_ID, &sensor.chip_id_w); break; + #endif // (OMV_ENABLE_MT9M114 == 1) + + #if (OMV_ENABLE_LEPTON == 1) case LEPTON_SLV_ADDR: sensor.chip_id = LEPTON_ID; break; + #endif // (OMV_ENABLE_LEPTON == 1) + + #if (OMV_ENABLE_HM01B0 == 1) case HM01B0_SLV_ADDR: cambus_readb2(&sensor.bus, sensor.slv_addr, HIMAX_CHIP_ID, &sensor.chip_id); break; + #endif //(OMV_ENABLE_HM01B0 == 1) + + #if (OMV_ENABLE_GC2145 == 1) + case GC2145_SLV_ADDR: + cambus_readb(&sensor.bus, sensor.slv_addr, GC_CHIP_ID, &sensor.chip_id); + break; + #endif //(OMV_ENABLE_GC2145 == 1) + default: return -3; break; @@ -468,6 +496,12 @@ int sensor_init() break; #endif //(OMV_ENABLE_HM01B0 == 1) + #if (OMV_ENABLE_GC2145 == 1) + case GC2145_ID: + init_ret = gc2145_init(&sensor); + break; + #endif //(OMV_ENABLE_GC2145 == 1) + default: return -3; break; diff --git a/src/omv/sensors/gc2145.c b/src/omv/sensors/gc2145.c new file mode 100644 index 000000000..fda96ce5d --- /dev/null +++ b/src/omv/sensors/gc2145.c @@ -0,0 +1,816 @@ +/* + * This file is part of the OpenMV project. + * + * Copyright (c) 2013-2021 Ibrahim Abdelkader + * Copyright (c) 2013-2021 Kwabena W. Agyeman + * + * This work is licensed under the MIT license, see the file LICENSE for details. + * + * GC2145 driver. + */ +#include "omv_boardconfig.h" +#if (OMV_ENABLE_GC2145 == 1) + +#include +#include +#include + +#include "cambus.h" +#include "sensor.h" +#include "gc2145.h" +#include "gc2145_regs.h" +#include "py/mphal.h" + +// SLAVE ADDR 0x78 +static const uint8_t default_regs[][2] = { + {0xfe, 0xf0}, + {0xfe, 0xf0}, + {0xfe, 0xf0}, + {0xfc, 0x06}, + {0xf6, 0x00}, + {0xf7, 0x1d}, + {0xf8, 0x84}, + {0xfa, 0x00}, + {0xf9, 0xfe}, + {0xf2, 0x00}, + ///////////////////////////////////////////////// + //////////////////ISP reg////////////////////// + //////////////////////////////////////////////////// + {0xfe, 0x00}, + {0x03, 0x04}, + {0x04, 0xe2}, + {0x09, 0x00}, + {0x0a, 0x00}, + {0x0b, 0x00}, + {0x0c, 0x00}, + {0x0d, 0x04}, + {0x0e, 0xc0}, + {0x0f, 0x06}, + {0x10, 0x52}, + {0x12, 0x2e}, + {0x17, 0x14}, //mirror + {0x18, 0x22}, + {0x19, 0x0e}, + {0x1a, 0x01}, + {0x1b, 0x4b}, + {0x1c, 0x07}, + {0x1d, 0x10}, + {0x1e, 0x88}, + {0x1f, 0x78}, + {0x20, 0x03}, + {0x21, 0x40}, + {0x22, 0xa0}, + {0x24, 0x16}, + {0x25, 0x01}, + {0x26, 0x10}, + {0x2d, 0x60}, + {0x30, 0x01}, + {0x31, 0x90}, + {0x33, 0x06}, + {0x34, 0x01}, + ///////////////////////////////////////////////// + //////////////////ISP reg//////////////////// + ///////////////////////////////////////////////// + {0xfe, 0x00}, + {0x80, 0x7f}, + {0x81, 0x26}, + {0x82, 0xfa}, + {0x83, 0x00}, + {0x84, 0x06}, //RGB565 + {0x86, 0x03}, + {0x88, 0x03}, + {0x89, 0x03}, + {0x85, 0x08}, + {0x8a, 0x00}, + {0x8b, 0x00}, + {0xb0, 0x55}, + {0xc3, 0x00}, + {0xc4, 0x80}, + {0xc5, 0x90}, + {0xc6, 0x3b}, + {0xc7, 0x46}, + {0xec, 0x06}, + {0xed, 0x04}, + {0xee, 0x60}, + {0xef, 0x90}, + {0xb6, 0x01}, + {0x90, 0x01}, + {0x91, 0x00}, + {0x92, 0x00}, + {0x93, 0x00}, + {0x94, 0x00}, + // VGA 640*480 + {0x95, 0x01}, + {0x96, 0xE0}, + {0x97, 0x02}, + {0x98, 0x80}, + ///////////////////////////////////////// + /////////// BLK //////////////////////// + ///////////////////////////////////////// + {0xfe, 0x00}, + {0x40, 0x42}, + {0x41, 0x00}, + {0x43, 0x5b}, + {0x5e, 0x00}, + {0x5f, 0x00}, + {0x60, 0x00}, + {0x61, 0x00}, + {0x62, 0x00}, + {0x63, 0x00}, + {0x64, 0x00}, + {0x65, 0x00}, + {0x66, 0x20}, + {0x67, 0x20}, + {0x68, 0x20}, + {0x69, 0x20}, + {0x76, 0x00}, + {0x6a, 0x08}, + {0x6b, 0x08}, + {0x6c, 0x08}, + {0x6d, 0x08}, + {0x6e, 0x08}, + {0x6f, 0x08}, + {0x70, 0x08}, + {0x71, 0x08}, + {0x76, 0x00}, + {0x72, 0xf0}, + {0x7e, 0x3c}, + {0x7f, 0x00}, + {0xfe, 0x02}, + {0x48, 0x15}, + {0x49, 0x00}, + {0x4b, 0x0b}, + {0xfe, 0x00}, + //////////////////////////////////////// + /////////// AEC //////////////////////// + //////////////////////////////////////// + {0xfe, 0x01}, + {0x01, 0x04}, + {0x02, 0xc0}, + {0x03, 0x04}, + {0x04, 0x90}, + {0x05, 0x30}, + {0x06, 0x90}, + {0x07, 0x30}, + {0x08, 0x80}, + {0x09, 0x00}, + {0x0a, 0x82}, + {0x0b, 0x11}, + {0x0c, 0x10}, + {0x11, 0x10}, + {0x13, 0x68}, //7b->68 bob + {0x17, 0x00}, + {0x1c, 0x11}, + {0x1e, 0x61}, + {0x1f, 0x35}, + {0x20, 0x40}, + {0x22, 0x40}, + {0x23, 0x20}, + {0xfe, 0x02}, + {0x0f, 0x04}, + {0xfe, 0x01}, + {0x12, 0x30}, //35 + {0x15, 0xb0}, + {0x10, 0x31}, + {0x3e, 0x28}, + {0x3f, 0xb0}, + {0x40, 0x90}, + {0x41, 0x0f}, + ///////////////////////////// + //////// INTPEE ///////////// + ///////////////////////////// + {0xfe, 0x02}, + {0x90, 0x6c}, + {0x91, 0x03}, + {0x92, 0xcb}, + {0x94, 0x33}, + {0x95, 0x84}, + {0x97, 0x65}, // 54->65 bob + {0xa2, 0x11}, + {0xfe, 0x00}, + ///////////////////////////// + //////// DNDD/////////////// + ///////////////////////////// + {0xfe, 0x02}, + {0x80, 0xc1}, + {0x81, 0x08}, + {0x82, 0x05}, //05 + {0x83, 0x08}, //08 + {0x84, 0x0a}, + {0x86, 0xf0}, + {0x87, 0x50}, + {0x88, 0x15}, + {0x89, 0xb0}, + {0x8a, 0x30}, + {0x8b, 0x10}, + ///////////////////////////////////////// + /////////// ASDE //////////////////////// + ///////////////////////////////////////// + {0xfe, 0x01}, + {0x21, 0x04}, + {0xfe, 0x02}, + {0xa3, 0x50}, + {0xa4, 0x20}, + {0xa5, 0x40}, + {0xa6, 0x80}, + {0xab, 0x40}, + {0xae, 0x0c}, + {0xb3, 0x46}, + {0xb4, 0x64}, + {0xb6, 0x38}, + {0xb7, 0x01}, //01 + {0xb9, 0x2b}, //2b + {0x3c, 0x04}, //04 + {0x3d, 0x15}, //15 + {0x4b, 0x06}, //06 + {0x4c, 0x20}, + {0xfe, 0x00}, + ///////////////////////////////////////// + /////////// GAMMA //////////////////////// + ///////////////////////////////////////// + ///////////////////gamma1//////////////////// + {0xfe, 0x02}, + {0x10, 0x09}, + {0x11, 0x0d}, + {0x12, 0x13}, + {0x13, 0x19}, + {0x14, 0x27}, + {0x15, 0x37}, + {0x16, 0x45}, + {0x17, 0x53}, + {0x18, 0x69}, + {0x19, 0x7d}, + {0x1a, 0x8f}, + {0x1b, 0x9d}, + {0x1c, 0xa9}, + {0x1d, 0xbd}, + {0x1e, 0xcd}, + {0x1f, 0xd9}, + {0x20, 0xe3}, + {0x21, 0xea}, + {0x22, 0xef}, + {0x23, 0xf5}, + {0x24, 0xf9}, + {0x25, 0xff}, + {0xfe, 0x00}, + {0xc6, 0x20}, + {0xc7, 0x2b}, + ///////////////////gamma2//////////////////// + {0xfe, 0x02}, + {0x26, 0x0f}, + {0x27, 0x14}, + {0x28, 0x19}, + {0x29, 0x1e}, + {0x2a, 0x27}, + {0x2b, 0x33}, + {0x2c, 0x3b}, + {0x2d, 0x45}, + {0x2e, 0x59}, + {0x2f, 0x69}, + {0x30, 0x7c}, + {0x31, 0x89}, + {0x32, 0x98}, + {0x33, 0xae}, + {0x34, 0xc0}, + {0x35, 0xcf}, + {0x36, 0xda}, + {0x37, 0xe2}, + {0x38, 0xe9}, + {0x39, 0xf3}, + {0x3a, 0xf9}, + {0x3b, 0xff}, + /////////////////////////////////////////////// + ///////////YCP /////////////////////// + /////////////////////////////////////////////// + {0xfe, 0x02}, + {0xd1, 0x32}, //32->2d + {0xd2, 0x32}, //32->2d bob + {0xd3, 0x40}, + {0xd6, 0xf0}, + {0xd7, 0x10}, + {0xd8, 0xda}, + {0xdd, 0x14}, + {0xde, 0x86}, + {0xed, 0x80}, //80 + {0xee, 0x00}, //00 + {0xef, 0x3f}, + {0xd8, 0xd8}, + ///////////////////abs///////////////// + {0xfe, 0x01}, + {0x9f, 0x40}, + ///////////////////////////////////////////// + //////////////////////// LSC /////////////// + ////////////////////////////////////////// + {0xfe, 0x01}, + {0xc2, 0x14}, + {0xc3, 0x0d}, + {0xc4, 0x0c}, + {0xc8, 0x15}, + {0xc9, 0x0d}, + {0xca, 0x0a}, + {0xbc, 0x24}, + {0xbd, 0x10}, + {0xbe, 0x0b}, + {0xb6, 0x25}, + {0xb7, 0x16}, + {0xb8, 0x15}, + {0xc5, 0x00}, + {0xc6, 0x00}, + {0xc7, 0x00}, + {0xcb, 0x00}, + {0xcc, 0x00}, + {0xcd, 0x00}, + {0xbf, 0x07}, + {0xc0, 0x00}, + {0xc1, 0x00}, + {0xb9, 0x00}, + {0xba, 0x00}, + {0xbb, 0x00}, + {0xaa, 0x01}, + {0xab, 0x01}, + {0xac, 0x00}, + {0xad, 0x05}, + {0xae, 0x06}, + {0xaf, 0x0e}, + {0xb0, 0x0b}, + {0xb1, 0x07}, + {0xb2, 0x06}, + {0xb3, 0x17}, + {0xb4, 0x0e}, + {0xb5, 0x0e}, + {0xd0, 0x09}, + {0xd1, 0x00}, + {0xd2, 0x00}, + {0xd6, 0x08}, + {0xd7, 0x00}, + {0xd8, 0x00}, + {0xd9, 0x00}, + {0xda, 0x00}, + {0xdb, 0x00}, + {0xd3, 0x0a}, + {0xd4, 0x00}, + {0xd5, 0x00}, + {0xa4, 0x00}, + {0xa5, 0x00}, + {0xa6, 0x77}, + {0xa7, 0x77}, + {0xa8, 0x77}, + {0xa9, 0x77}, + {0xa1, 0x80}, + {0xa2, 0x80}, + + {0xfe, 0x01}, + {0xdf, 0x0d}, + {0xdc, 0x25}, + {0xdd, 0x30}, + {0xe0, 0x77}, + {0xe1, 0x80}, + {0xe2, 0x77}, + {0xe3, 0x90}, + {0xe6, 0x90}, + {0xe7, 0xa0}, + {0xe8, 0x90}, + {0xe9, 0xa0}, + {0xfe, 0x00}, + /////////////////////////////////////////////// + /////////// AWB//////////////////////// + /////////////////////////////////////////////// + {0xfe, 0x01}, + {0x4f, 0x00}, + {0x4f, 0x00}, + {0x4b, 0x01}, + {0x4f, 0x00}, + + {0x4c, 0x01}, // D75 + {0x4d, 0x71}, + {0x4e, 0x01}, + {0x4c, 0x01}, + {0x4d, 0x91}, + {0x4e, 0x01}, + {0x4c, 0x01}, + {0x4d, 0x70}, + {0x4e, 0x01}, + {0x4c, 0x01}, // D65 + {0x4d, 0x90}, + {0x4e, 0x02}, + {0x4c, 0x01}, + {0x4d, 0xb0}, + {0x4e, 0x02}, + {0x4c, 0x01}, + {0x4d, 0x8f}, + {0x4e, 0x02}, + {0x4c, 0x01}, + {0x4d, 0x6f}, + {0x4e, 0x02}, + {0x4c, 0x01}, + {0x4d, 0xaf}, + {0x4e, 0x02}, + {0x4c, 0x01}, + {0x4d, 0xd0}, + {0x4e, 0x02}, + {0x4c, 0x01}, + {0x4d, 0xf0}, + {0x4e, 0x02}, + {0x4c, 0x01}, + {0x4d, 0xcf}, + {0x4e, 0x02}, + {0x4c, 0x01}, + {0x4d, 0xef}, + {0x4e, 0x02}, + {0x4c, 0x01}, //D50 + {0x4d, 0x6e}, + {0x4e, 0x03}, + {0x4c, 0x01}, + {0x4d, 0x8e}, + {0x4e, 0x03}, + {0x4c, 0x01}, + {0x4d, 0xae}, + {0x4e, 0x03}, + {0x4c, 0x01}, + {0x4d, 0xce}, + {0x4e, 0x03}, + {0x4c, 0x01}, + {0x4d, 0x4d}, + {0x4e, 0x03}, + {0x4c, 0x01}, + {0x4d, 0x6d}, + {0x4e, 0x03}, + {0x4c, 0x01}, + {0x4d, 0x8d}, + {0x4e, 0x03}, + {0x4c, 0x01}, + {0x4d, 0xad}, + {0x4e, 0x03}, + {0x4c, 0x01}, + {0x4d, 0xcd}, + {0x4e, 0x03}, + {0x4c, 0x01}, + {0x4d, 0x4c}, + {0x4e, 0x03}, + {0x4c, 0x01}, + {0x4d, 0x6c}, + {0x4e, 0x03}, + {0x4c, 0x01}, + {0x4d, 0x8c}, + {0x4e, 0x03}, + {0x4c, 0x01}, + {0x4d, 0xac}, + {0x4e, 0x03}, + {0x4c, 0x01}, + {0x4d, 0xcc}, + {0x4e, 0x03}, + {0x4c, 0x01}, + {0x4d, 0xcb}, + {0x4e, 0x03}, + {0x4c, 0x01}, + {0x4d, 0x4b}, + {0x4e, 0x03}, + {0x4c, 0x01}, + {0x4d, 0x6b}, + {0x4e, 0x03}, + {0x4c, 0x01}, + {0x4d, 0x8b}, + {0x4e, 0x03}, + {0x4c, 0x01}, + {0x4d, 0xab}, + {0x4e, 0x03}, + {0x4c, 0x01}, //CWF + {0x4d, 0x8a}, + {0x4e, 0x04}, + {0x4c, 0x01}, + {0x4d, 0xaa}, + {0x4e, 0x04}, + {0x4c, 0x01}, + {0x4d, 0xca}, + {0x4e, 0x04}, + {0x4c, 0x01}, + {0x4d, 0xca}, + {0x4e, 0x04}, + {0x4c, 0x01}, + {0x4d, 0xc9}, + {0x4e, 0x04}, + {0x4c, 0x01}, + {0x4d, 0x8a}, + {0x4e, 0x04}, + {0x4c, 0x01}, + {0x4d, 0x89}, + {0x4e, 0x04}, + {0x4c, 0x01}, + {0x4d, 0xa9}, + {0x4e, 0x04}, + {0x4c, 0x02}, //tl84 + {0x4d, 0x0b}, + {0x4e, 0x05}, + {0x4c, 0x02}, + {0x4d, 0x0a}, + {0x4e, 0x05}, + {0x4c, 0x01}, + {0x4d, 0xeb}, + {0x4e, 0x05}, + {0x4c, 0x01}, + {0x4d, 0xea}, + {0x4e, 0x05}, + {0x4c, 0x02}, + {0x4d, 0x09}, + {0x4e, 0x05}, + {0x4c, 0x02}, + {0x4d, 0x29}, + {0x4e, 0x05}, + {0x4c, 0x02}, + {0x4d, 0x2a}, + {0x4e, 0x05}, + {0x4c, 0x02}, + {0x4d, 0x4a}, + {0x4e, 0x05}, + //{0x4c , 0x02}, //A + //{0x4d , 0x6a}, + //{0x4e , 0x06}, + {0x4c, 0x02}, + {0x4d, 0x8a}, + {0x4e, 0x06}, + {0x4c, 0x02}, + {0x4d, 0x49}, + {0x4e, 0x06}, + {0x4c, 0x02}, + {0x4d, 0x69}, + {0x4e, 0x06}, + {0x4c, 0x02}, + {0x4d, 0x89}, + {0x4e, 0x06}, + {0x4c, 0x02}, + {0x4d, 0xa9}, + {0x4e, 0x06}, + {0x4c, 0x02}, + {0x4d, 0x48}, + {0x4e, 0x06}, + {0x4c, 0x02}, + {0x4d, 0x68}, + {0x4e, 0x06}, + {0x4c, 0x02}, + {0x4d, 0x69}, + {0x4e, 0x06}, + {0x4c, 0x02}, //H + {0x4d, 0xca}, + {0x4e, 0x07}, + {0x4c, 0x02}, + {0x4d, 0xc9}, + {0x4e, 0x07}, + {0x4c, 0x02}, + {0x4d, 0xe9}, + {0x4e, 0x07}, + {0x4c, 0x03}, + {0x4d, 0x09}, + {0x4e, 0x07}, + {0x4c, 0x02}, + {0x4d, 0xc8}, + {0x4e, 0x07}, + {0x4c, 0x02}, + {0x4d, 0xe8}, + {0x4e, 0x07}, + {0x4c, 0x02}, + {0x4d, 0xa7}, + {0x4e, 0x07}, + {0x4c, 0x02}, + {0x4d, 0xc7}, + {0x4e, 0x07}, + {0x4c, 0x02}, + {0x4d, 0xe7}, + {0x4e, 0x07}, + {0x4c, 0x03}, + {0x4d, 0x07}, + {0x4e, 0x07}, + + {0x4f, 0x01}, + {0x50, 0x80}, + {0x51, 0xa8}, + {0x52, 0x47}, + {0x53, 0x38}, + {0x54, 0xc7}, + {0x56, 0x0e}, + {0x58, 0x08}, + {0x5b, 0x00}, + {0x5c, 0x74}, + {0x5d, 0x8b}, + {0x61, 0xdb}, + {0x62, 0xb8}, + {0x63, 0x86}, + {0x64, 0xc0}, + {0x65, 0x04}, + {0x67, 0xa8}, + {0x68, 0xb0}, + {0x69, 0x00}, + {0x6a, 0xa8}, + {0x6b, 0xb0}, + {0x6c, 0xaf}, + {0x6d, 0x8b}, + {0x6e, 0x50}, + {0x6f, 0x18}, + {0x73, 0xf0}, + {0x70, 0x0d}, + {0x71, 0x60}, + {0x72, 0x80}, + {0x74, 0x01}, + {0x75, 0x01}, + {0x7f, 0x0c}, + {0x76, 0x70}, + {0x77, 0x58}, + {0x78, 0xa0}, + {0x79, 0x5e}, + {0x7a, 0x54}, + {0x7b, 0x58}, + {0xfe, 0x00}, + ////////////////////////////////////////// + ///////////CC//////////////////////// + ////////////////////////////////////////// + {0xfe, 0x02}, + {0xc0, 0x01}, + {0xc1, 0x44}, + {0xc2, 0xfd}, + {0xc3, 0x04}, + {0xc4, 0xF0}, + {0xc5, 0x48}, + {0xc6, 0xfd}, + {0xc7, 0x46}, + {0xc8, 0xfd}, + {0xc9, 0x02}, + {0xca, 0xe0}, + {0xcb, 0x45}, + {0xcc, 0xec}, + {0xcd, 0x48}, + {0xce, 0xf0}, + {0xcf, 0xf0}, + {0xe3, 0x0c}, + {0xe4, 0x4b}, + {0xe5, 0xe0}, + ////////////////////////////////////////// + ///////////ABS //////////////////// + ////////////////////////////////////////// + {0xfe, 0x01}, + {0x9f, 0x40}, + {0xfe, 0x00}, + ////////////////////////////////////// + /////////// OUTPUT //////////////// + ////////////////////////////////////// + {0xfe, 0x00}, + {0xf2, 0x0f}, + ///////////////dark sun//////////////////// + {0xfe, 0x02}, + {0x40, 0xbf}, + {0x46, 0xcf}, + {0xfe, 0x00}, + //////////////frame rate 50Hz///////// + {0xfe, 0x00}, + {0x05, 0x01}, //156 + {0x06, 0x56}, + {0x07, 0x00}, //32 + {0x08, 0x32}, + {0xfe, 0x01}, + {0x25, 0x00}, //fa + {0x26, 0xfa}, + {0x27, 0x04}, + {0x28, 0xe2}, //20fps 4e2 + {0x29, 0x06}, + {0x2a, 0xd6}, //14fps 6d6 + {0x2b, 0x07}, + {0x2c, 0xd0}, //12fps 7d0 + {0x2d, 0x0b}, + {0x2e, 0xb8}, //8fps bb8 + {0xfe, 0x00}, + + {0x00, 0x00}, +}; + +static const uint8_t qvga_regs[][2] = { + {0xfe, 0x00}, + {0x05, 0x02}, //0x02 + {0x06, 0x20}, //0x20 + {0x07, 0x03}, + {0x08, 0x80}, + {0xb6, 0x01}, + {0xfd, 0x03}, + {0xfa, 0x00}, + {0x18, 0x42}, + /*crop window*/ + {0xfe, 0x00}, + {0x90, 0x01}, + {0x91, 0x00}, + {0x92, 0x00}, + {0x93, 0x00}, + {0x94, 0x00}, + {0x95, 0x02}, //0x02 00 0x01 height + {0x96, 0x58}, //0x58 f0 0x2c + {0x97, 0x03}, //0x03 01 0x01 width + {0x98, 0x20}, //0x20 40 0x90 + {0x99, 0x11}, + {0x9a, 0x06}, + /*AWB*/ + {0xfe, 0x00}, + {0xec, 0x02}, + {0xed, 0x02}, + {0xee, 0x30}, + {0xef, 0x48}, + {0xfe, 0x02}, + {0x9d, 0x08}, + {0xfe, 0x01}, + {0x74, 0x00}, + /*AEC*/ + {0xfe, 0x01}, + {0x01, 0x04}, + {0x02, 0x60}, + {0x03, 0x02}, + {0x04, 0x48}, + {0x05, 0x18}, + {0x06, 0x50}, + {0x07, 0x10}, + {0x08, 0x38}, + {0x0a, 0x80}, + {0x21, 0x04}, + {0xfe, 0x00}, + {0x20, 0x03}, + {0xfe, 0x00}, + + {0x00, 0x00}, +}; + +static int reset(sensor_t *sensor) +{ + // Reset all registers + int ret = cambus_writeb(&sensor->bus, sensor->slv_addr, 0xFE, 0xF0); + + // Delay 10 ms + mp_hal_delay_ms(10); + + // Write default regsiters + for (int i = 0; default_regs[i][0]; i++) { + ret |= cambus_writeb(&sensor->bus, sensor->slv_addr, default_regs[i][0], default_regs[i][1]); + } + + // Delay 100 ms + mp_hal_delay_ms(10); + + return ret; +} + +static int read_reg(sensor_t *sensor, uint16_t reg_addr) +{ + uint8_t reg_data; + if (cambus_readb(&sensor->bus, sensor->slv_addr, reg_addr, ®_data) != 0) { + return -1; + } + return reg_data; +} + +static int write_reg(sensor_t *sensor, uint16_t reg_addr, uint16_t reg_data) +{ + return cambus_writeb(&sensor->bus, sensor->slv_addr, reg_addr, reg_data); +} + +static int set_pixformat(sensor_t *sensor, pixformat_t pixformat) +{ + return 0; +} + +static int set_framesize(sensor_t *sensor, framesize_t framesize) +{ + int ret = 0; + const uint8_t (*regs)[2]; + + switch (framesize) { + case FRAMESIZE_VGA: + case FRAMESIZE_QVGA: + case FRAMESIZE_QQVGA: + regs = qvga_regs; + break; + default: + return -1; + } + + // Write pixel format registers + for (int i=0; regs[i][0] != 0xFF; i++) { + ret |= cambus_writeb(&sensor->bus, sensor->slv_addr, regs[i][0], regs[i][1]); + } + return ret; + +} + +int gc2145_init(sensor_t *sensor) +{ + // Initialize sensor structure. + sensor->gs_bpp = 2; + sensor->reset = reset; + sensor->read_reg = read_reg; + sensor->write_reg = write_reg; + sensor->set_pixformat = set_pixformat; + sensor->set_framesize = set_framesize; + + // Set sensor flags + SENSOR_HW_FLAGS_SET(sensor, SENSOR_HW_FLAGS_VSYNC, 0); + SENSOR_HW_FLAGS_SET(sensor, SENSOR_HW_FLAGS_HSYNC, 0); + SENSOR_HW_FLAGS_SET(sensor, SENSOR_HW_FLAGS_PIXCK, 1); + SENSOR_HW_FLAGS_SET(sensor, SENSOR_HW_FLAGS_FSYNC, 0); + SENSOR_HW_FLAGS_SET(sensor, SENSOR_HW_FLAGS_JPEGE, 0); + SENSOR_HW_FLAGS_SET(sensor, SWNSOR_HW_FLAGS_RGB565_REV, 1); + + return 0; +} +#endif // (OMV_ENABLE_GC2145 == 1) diff --git a/src/omv/sensors/gc2145.h b/src/omv/sensors/gc2145.h new file mode 100644 index 000000000..dfcf0dd1c --- /dev/null +++ b/src/omv/sensors/gc2145.h @@ -0,0 +1,14 @@ +/* + * This file is part of the OpenMV project. + * + * Copyright (c) 2013-2021 Ibrahim Abdelkader + * Copyright (c) 2013-2021 Kwabena W. Agyeman + * + * This work is licensed under the MIT license, see the file LICENSE for details. + * + * GC2145 driver. + */ +#ifndef __GC2145_H__ +#define __GC2145_H__ +int gc2145_init(sensor_t *sensor); +#endif // __GC2145_H__ diff --git a/src/omv/sensors/gc2145_regs.h b/src/omv/sensors/gc2145_regs.h new file mode 100644 index 000000000..9b343aa36 --- /dev/null +++ b/src/omv/sensors/gc2145_regs.h @@ -0,0 +1,14 @@ +/* + * This file is part of the OpenMV project. + * + * Copyright (c) 2013-2021 Ibrahim Abdelkader + * Copyright (c) 2013-2021 Kwabena W. Agyeman + * + * This work is licensed under the MIT license, see the file LICENSE for details. + * + * GC2145 register definitions. + */ +#ifndef __GC2145_REGS_H__ +#define __GC2145_REGS_H__ + +#endif //__GC2145_REGS_H__